Skip to content

Commit 889cc52

Browse files
authored
Merge pull request #105 from young-steveo/release-v1.7.0
Release v1.7.0
2 parents a9d1964 + 071ef5e commit 889cc52

7 files changed

Lines changed: 77 additions & 49 deletions

File tree

README.md

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -420,22 +420,15 @@ Param | Type | Details
420420
Used to register a service factory function. Works exactly like `factory` except the factory arguments will be injected instead of receiving the `container`. This is useful when implementing the Module Pattern or adding dependencies to your Higher Order Functions.
421421

422422
```js
423-
function createApiActions(axios) {
423+
function packageKeg(Barrel, Beer, Love) {
424+
Barrel.add(Beer, Love);
424425
return {
425-
createUser: function(user) {
426-
return axios.post('/users', user);
426+
tap : function() {
427+
return Barrel.dispense();
427428
}
428429
};
429430
}
430-
431-
var bottle = new Bottle();
432-
433-
bottle.serviceFactory('api', createApiActions, 'axios');
434-
bottle.factory('axios', function() {
435-
return axios.create({baseURL: 'http://api.mydomain'});
436-
});
437-
438-
bottle.container.api.createUser({name: "BottleJS"});
431+
bottle.serviceFactory('Keg', packageKeg, 'Barrel', 'Beer', 'Love');
439432
```
440433

441434
If `Bottle.config.strict` is set to `true`, this method will throw an error if an injected dependency is `undefined`.
@@ -444,7 +437,7 @@ Param | Type | Details
444437
:--------------------------------|:-----------|:--------
445438
**name** | *String* | The name of the service. Must be unique to each Bottle instance.
446439
**serviceFactory** | *Function* | A function that will be invoked to create the service object/value.
447-
**dependency**<br />*(optional)* | *String* | An optional name for a dependency to be passed to the service function. A dependency will be passed to the service function for each name passed to `Bottle#serviceFn` in the order they are listed.
440+
**dependency**<br />*(optional)* | *String* | An optional name for a dependency to be passed to the service function. A dependency will be passed to the service function for each name passed to `Bottle#serviceFactory` in the order they are listed.
448441

449442
#### value(name, val)
450443

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bottlejs",
3-
"version": "1.6.3",
3+
"version": "1.7.0",
44
"description": "A powerful dependency injection micro container",
55
"main": "dist/bottle.min.js",
66
"license": "MIT",

dist/bottle.js

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
;(function(undefined) {
22
'use strict';
33
/**
4-
* BottleJS v1.6.3 - 2017-12-06
4+
* BottleJS v1.7.0 - 2018-01-29
55
* A powerful dependency injection micro container
66
*
7-
* Copyright (c) 2017 Stephen Young
7+
* Copyright (c) 2018 Stephen Young
88
* Licensed MIT
99
*/
10+
/**
11+
* String constants
12+
*/
13+
var DELIMITER = '.';
14+
var FUNCTION_TYPE = 'function';
15+
var STRING_TYPE = 'string';
16+
var GLOBAL_NAME = '__global__';
17+
var PROVIDER_SUFFIX = 'Provider';
1018

1119
/**
1220
* Unique id counter;
@@ -66,7 +74,7 @@
6674
* @return Service
6775
*/
6876
var getNestedService = function getNestedService(fullname) {
69-
return fullname.split('.').reduce(getNested, this);
77+
return fullname.split(DELIMITER).reduce(getNested, this);
7078
};
7179

7280
/**
@@ -77,7 +85,7 @@
7785
* @return Bottle
7886
*/
7987
var constant = function constant(name, value) {
80-
var parts = name.split('.');
88+
var parts = name.split(DELIMITER);
8189
name = parts.pop();
8290
defineConstant.call(parts.reduce(setValueObject, this.container), name, value);
8391
return this;
@@ -101,15 +109,15 @@
101109
*/
102110
var decorator = function decorator(fullname, func) {
103111
var parts, name;
104-
if (typeof fullname === 'function') {
112+
if (typeof fullname === FUNCTION_TYPE) {
105113
func = fullname;
106-
fullname = '__global__';
114+
fullname = GLOBAL_NAME;
107115
}
108116

109-
parts = fullname.split('.');
117+
parts = fullname.split(DELIMITER);
110118
name = parts.shift();
111119
if (parts.length) {
112-
getNestedBottle.call(this, name).decorator(parts.join('.'), func);
120+
getNestedBottle.call(this, name).decorator(parts.join(DELIMITER), func);
113121
} else {
114122
if (!this.decorators[name]) {
115123
this.decorators[name] = [];
@@ -234,15 +242,15 @@
234242
*/
235243
var middleware = function middleware(fullname, func) {
236244
var parts, name;
237-
if (typeof fullname === 'function') {
245+
if (typeof fullname === FUNCTION_TYPE) {
238246
func = fullname;
239-
fullname = '__global__';
247+
fullname = GLOBAL_NAME;
240248
}
241249

242-
parts = fullname.split('.');
250+
parts = fullname.split(DELIMITER);
243251
name = parts.shift();
244252
if (parts.length) {
245-
getNestedBottle.call(this, name).middleware(parts.join('.'), func);
253+
getNestedBottle.call(this, name).middleware(parts.join(DELIMITER), func);
246254
} else {
247255
if (!this.middlewares[name]) {
248256
this.middlewares[name] = [];
@@ -270,7 +278,7 @@
270278
*/
271279
var pop = function pop(name) {
272280
var instance;
273-
if (typeof name === 'string') {
281+
if (typeof name === STRING_TYPE) {
274282
instance = bottles[name];
275283
if (!instance) {
276284
bottles[name] = instance = new Bottle();
@@ -285,7 +293,7 @@
285293
* Clear all named bottles.
286294
*/
287295
var clear = function clear(name) {
288-
if (typeof name === 'string') {
296+
if (typeof name === STRING_TYPE) {
289297
delete bottles[name];
290298
} else {
291299
bottles = {};
@@ -312,8 +320,8 @@
312320
*/
313321
var provider = function provider(fullname, Provider) {
314322
var parts, name;
315-
parts = fullname.split('.');
316-
if (this.providerMap[fullname] && parts.length === 1 && !this.container[fullname + 'Provider']) {
323+
parts = fullname.split(DELIMITER);
324+
if (this.providerMap[fullname] && parts.length === 1 && !this.container[fullname + PROVIDER_SUFFIX]) {
317325
return console.error(fullname + ' provider already instantiated.');
318326
}
319327
this.originalProviders[fullname] = Provider;
@@ -322,7 +330,7 @@
322330
name = parts.shift();
323331

324332
if (parts.length) {
325-
getNestedBottle.call(this, name).provider(parts.join('.'), Provider);
333+
getNestedBottle.call(this, name).provider(parts.join(DELIMITER), Provider);
326334
return this;
327335
}
328336
return createProvider.call(this, name, Provider);
@@ -351,7 +359,7 @@
351359
container = this.container;
352360
decorators = this.decorators;
353361
middlewares = this.middlewares;
354-
providerName = name + 'Provider';
362+
providerName = name + PROVIDER_SUFFIX;
355363

356364
properties = Object.create(null);
357365
properties[providerName] = {
@@ -416,7 +424,7 @@
416424
var removeProviderMap = function resetProvider(name) {
417425
delete this.providerMap[name];
418426
delete this.container[name];
419-
delete this.container[name + 'Provider'];
427+
delete this.container[name + PROVIDER_SUFFIX];
420428
};
421429

422430
/**
@@ -427,7 +435,7 @@
427435
var resetProviders = function resetProviders() {
428436
var providers = this.originalProviders;
429437
Object.keys(this.originalProviders).forEach(function resetPrvider(provider) {
430-
var parts = provider.split('.');
438+
var parts = provider.split(DELIMITER);
431439
if (parts.length > 1) {
432440
parts.forEach(removeProviderMap, getNestedBottle.call(this, parts[0]));
433441
}
@@ -452,23 +460,41 @@
452460
};
453461

454462
/**
455-
* Register a service inside a generic factory.
463+
* Register a function service
464+
*/
465+
var serviceFactory = function serviceFactory(name, factoryService) {
466+
return createService.apply(this, [name, factoryService, false].concat(slice.call(arguments, 2)));
467+
};
468+
469+
/**
470+
* Register a class service
456471
*
457472
* @param String name
458473
* @param Function Service
459474
* @return Bottle
460475
*/
461476
var service = function service(name, Service) {
462-
var deps = arguments.length > 2 ? slice.call(arguments, 2) : null;
477+
return createService.apply(this, [name, Service, true].concat(slice.call(arguments, 2)));
478+
};
479+
480+
/**
481+
* Private helper for creating service and service factories.
482+
*
483+
* @param String name
484+
* @param Function Service
485+
* @return Bottle
486+
*/
487+
var createService = function createService(name, Service, isClass) {
488+
var deps = arguments.length > 3 ? slice.call(arguments, 3) : [];
463489
var bottle = this;
464490
return factory.call(this, name, function GenericFactory() {
465-
var ServiceCopy = Service;
466-
if (deps) {
467-
var args = deps.map(getNestedService, bottle.container);
468-
args.unshift(Service);
469-
ServiceCopy = Service.bind.apply(Service, args);
491+
var serviceFactory = Service; // alias for jshint
492+
var args = deps.map(getNestedService, bottle.container);
493+
494+
if (!isClass) {
495+
return serviceFactory.apply(null, args);
470496
}
471-
return new ServiceCopy();
497+
return new (Service.bind.apply(Service, [null].concat(args)))();
472498
});
473499
};
474500

@@ -481,7 +507,7 @@
481507
*/
482508
var value = function value(name, val) {
483509
var parts;
484-
parts = name.split('.');
510+
parts = name.split(DELIMITER);
485511
name = parts.pop();
486512
defineValue.call(parts.reduce(setValueObject, this.container), name, val);
487513
return this;
@@ -562,6 +588,7 @@
562588
register : register,
563589
resolve : resolve,
564590
service : service,
591+
serviceFactory : serviceFactory,
565592
value : value
566593
};
567594

@@ -631,7 +658,7 @@
631658
/**
632659
* Export
633660
*/
634-
if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
661+
if (typeof define === FUNCTION_TYPE && typeof define.amd === 'object' && define.amd) {
635662
root.Bottle = Bottle;
636663
define(function() { return Bottle; });
637664
} else if (freeExports && freeModule) {

dist/bottle.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)