UNPKG

14.8 kBJavaScriptView Raw
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.iniettore=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
4var mod$5 = _dereq_('./signals');var ACQUIRE = mod$5.ACQUIRE;var RELEASE = mod$5.RELEASE;var DISPOSE = mod$5.DISPOSE;
5var mod$6 = _dereq_('./constants');var CONTAINER_ALIAS = mod$6.CONTAINER_ALIAS;var CONTEXT_ALIAS = mod$6.CONTEXT_ALIAS;
6var VALUE = _dereq_('./options').VALUE;
7var mod$7 = _dereq_('./utils');var generateMask = mod$7.generateMask;var noop = mod$7.noop;var isEagerSingleton = mod$7.isEagerSingleton;
8var resolvers = _dereq_('./resolvers');
9var createContext = _dereq_('./createContext');
10
11
12
13 function Container(conf, logger, mappings, signalRelease) {
14 var context
15
16 if (typeof conf !== 'function') {
17 throw new Error('Invalid container creation, missing contribution function')
18 }
19
20 this.$Container0 = mappings || {}
21 this.$Container1 = resolvers
22 this.$Container2 = logger
23 this.$Container3 = {}
24 this.$Container4 = []
25 this.$Container5 = {}
26 this.$Container6 = signalRelease || noop
27
28 this.$Container7(CONTAINER_ALIAS, this, VALUE, [])
29 context = this.$Container8 = createContext(this.$Container7.bind(this))
30 this.$Container7(CONTEXT_ALIAS, context, VALUE, [])
31 conf(context)
32 context.flush()
33 this.$Container9(CONTEXT_ALIAS)
34 }
35
36 Container.prototype.get=function(alias, transients) {
37 return this.$Container2.log(("resolving '" + alias + "'"), function() {
38 if (this.$Container3[alias]) { throw new Error(("Circular dependency detected while resolving '" + alias + "'")) }
39 if (!(alias in this.$Container0)) { throw new Error(("'" + alias + "' is not available. Has it ever been registered?.")) }
40
41 this.$Container3[alias] = true
42 try {
43 return this.$Container0[alias](ACQUIRE)
44 } catch(err) {
45 err.message = ("Failed while resolving '" + alias + "' due to:\n\t" + err.message)
46 throw err
47 } finally {
48 this.$Container3[alias] = false
49 }
50 }.bind(this))
51 };
52
53 Container.prototype.using=function(transientsDeps) {
54 return {
55 get: function(alias) {
56 var context = this.$Container8
57 var dep
58
59 for (dep in transientsDeps) {
60 context.map(dep).to(transientsDeps[dep]).as(VALUE)
61 }
62 context.flush()
63 this.get(alias)
64 for (dep in transientsDeps) {
65 this.$Container9(dep)
66 }
67 }.bind(this)
68 }
69 };
70
71 Container.prototype.release=function(alias) {
72 try {
73 this.$Container0[alias](RELEASE)
74 } catch(err) {
75 err.message = ("Failed while releasing '" + alias + "' due to:\n\t" + err.message)
76 throw err
77 }
78 };
79
80 Container.prototype.createChild=function(conf) {
81 var id = Object.keys(this.$Container5).length + 1
82 var child = new Container(conf, this.$Container2, Object.create(this.$Container0), this.$Containera.bind(this, id))
83
84 this.$Container5[id] = child
85 return child
86 };
87
88 Container.prototype.dispose=function() {
89 this.$Containerb()
90 this.$Containerc()
91 this.$Container6()
92 this.$Container6 = noop
93 };
94
95 Container.prototype.$Containerd=function(alias) {
96
97 };
98
99 Container.prototype.$Containerb=function() {
100 var children = this.$Container5
101 var id
102
103 for (id in children) {
104 /* istanbul ignore else */
105 if (children.hasOwnProperty(id)) {
106 children[id].dispose()
107 this.$Containera(id)
108 }
109 }
110 };
111
112 Container.prototype.$Containera=function(id) {
113 delete this.$Container5[id]
114 };
115
116 Container.prototype.$Containerc=function() {
117 var mappings = this.$Container0
118 var alias
119
120 for (alias in mappings) {
121 /* istanbul ignore else */
122 if (mappings.hasOwnProperty(alias)) {
123 try {
124 mappings[alias](DISPOSE)
125 } catch(err) {
126 err.message = ("Failed while disposing '" + alias + "' due to:\n\t" + err.message)
127 throw err
128 }
129 delete mappings[alias]
130 }
131 }
132 };
133
134 Container.prototype.$Container7=function(alias, value, type, deps) {
135 if ( !(type in this.$Container1) ) {
136 throw new Error('Invalid flags combination. See documentation for valid flags combinations.')
137 }
138 this.$Container0[alias] = this.$Container1[type].call(null, value, this.$Containere.bind(this, deps), this.$Containerf.bind(this, deps))
139 if (isEagerSingleton(type)) {
140 this.get(alias)
141 }
142 };
143
144 Container.prototype.$Container9=function(alias) {
145 this.$Container0[alias](DISPOSE)
146 delete this.$Container0[alias]
147 };
148
149 Container.prototype.$Containerf=function(deps) {
150 return deps.forEach(function(dep) {
151 this.release(dep)
152 }.bind(this))
153 };
154
155 Container.prototype.$Containere=function(deps) {
156 return deps.map(function(dep) {
157 return this.get(dep)
158 }.bind(this))
159 };
160
161
162module.exports = Container
163
164},{"./constants":3,"./createContext":4,"./options":7,"./resolvers":8,"./signals":9,"./utils":11}],2:[function(_dereq_,module,exports){
165'use strict'
166
167
168 function Logger(options) {
169 this.$Logger0 = options
170 this.$Logger1 = 0
171 this.$Logger2 = {}
172 }
173
174 Logger.prototype.log=function(message, func) {
175 var result
176
177 if ("production" !== 'production' && this.$Logger0.debug) {
178 this.$Logger3(message)
179 result = func()
180 this.$Logger4(message)
181 return result
182 }
183 return func()
184 };
185
186 Logger.prototype.$Logger3=function(message) {
187 var indentation = this.$Logger5()
188 var now = new Date()
189
190 this.$Logger2[message] = now
191
192 console.log(("[" + now.toISOString() + "] " + indentation + "Starting " + message + "..."))
193 };
194
195 Logger.prototype.$Logger4=function(message) {
196 var indentation = this.$Logger6()
197 var now = new Date()
198 var elapsed = now - this.$Logger2[message]
199
200 console.log(("[" + now.toISOString() + "] " + indentation + "Finished " + message + " after " + elapsed + " ms"))
201 };
202
203 Logger.prototype.$Logger5=function() {
204 return Array(++this.$Logger1).join(' ')
205 };
206
207 Logger.prototype.$Logger6=function() {
208 return Array(this.$Logger1--).join(' ')
209 };
210
211
212module.exports = Logger
213
214},{}],3:[function(_dereq_,module,exports){
215'use strict'
216
217var CONTAINER_ALIAS = '$container'
218var CONTEXT_ALIAS = '$context'
219
220module.exports.CONTAINER_ALIAS = CONTAINER_ALIAS;module.exports.CONTEXT_ALIAS = CONTEXT_ALIAS;
221
222},{}],4:[function(_dereq_,module,exports){
223'use strict';
224
225var generateMask = _dereq_('./utils').generateMask;
226var mod$14 = _dereq_('./options');var BLUEPRINT = mod$14.BLUEPRINT;var PROVIDER = mod$14.PROVIDER;
227var mod$15 = _dereq_('./constants');var CONTAINER_ALIAS = mod$15.CONTAINER_ALIAS;var CONTEXT_ALIAS = mod$15.CONTEXT_ALIAS;
228
229var ALIAS_IDX = 0
230var VALUE_IDX = 1
231var TYPE_IDX = 2
232var DEPS_IDX = 3
233
234function createChildContainerFactory(conf) {
235 return function (container) {
236 return container.createChild(conf)
237 }
238}
239
240function createExporter(containerFactory, exportAlias) {
241 return function (container) {
242 return containerFactory(container).get(exportAlias)
243 }
244}
245
246module.exports = function createContext(contribute) {
247
248 var pending = []
249 var context = {
250
251 map: function(alias) {
252 context.flush()
253 pending.push(alias)
254
255 return {
256 to: function(value) {
257
258 pending.push(value)
259
260 return {
261 as: function() {var flags=Array.prototype.slice.call(arguments,0);
262 var mask = generateMask(flags)
263
264 if (mask === BLUEPRINT) {
265 // test if VALUE is a function
266 flags = [PROVIDER]
267 pending[VALUE_IDX] = createChildContainerFactory(pending[VALUE_IDX])
268 pending.push(generateMask(flags))
269 pending.push([CONTAINER_ALIAS])
270
271 return {
272 exports: function(alias) {
273 pending[VALUE_IDX] = createExporter(pending[VALUE_IDX], alias)
274 return {
275 map: context.map
276 }
277 },
278 map: context.map
279 }
280 }
281
282 pending.push(mask)
283
284 return {
285 map: context.map,
286
287 injecting: function() {var deps=Array.prototype.slice.call(arguments,0);
288 pending.push(deps)
289
290 return {
291 map: context.map
292 }
293 }
294 }
295 }
296 }
297 }
298 }
299 },
300
301 flush: function() {
302 var deps = pending[DEPS_IDX] || []
303
304 if (pending.length > 2) {
305 contribute(pending[ALIAS_IDX], pending[VALUE_IDX], pending[TYPE_IDX], deps)
306 pending = []
307 }
308 }
309 }
310
311 return context
312}
313
314},{"./constants":3,"./options":7,"./utils":11}],5:[function(_dereq_,module,exports){
315'use strict'
316
317var Container = _dereq_('./Container');
318var Logger = _dereq_('./Logger');
319
320function create(conf, options) {
321 var logger
322
323 options = options || {}
324 logger = new Logger(options)
325
326 return new Container(conf, logger)
327} module.exports.create = create;
328
329},{"./Container":1,"./Logger":2}],6:[function(_dereq_,module,exports){
330'use strict'
331
332module.exports = function instanciate(Ctor, deps) {
333 var Surrogate, instance
334
335 Surrogate = function () {}
336 Surrogate.prototype = Ctor.prototype
337
338 instance = new Surrogate()
339
340 Ctor.apply(instance, deps)
341
342 return instance
343}
344
345},{}],7:[function(_dereq_,module,exports){
346'use strict'
347
348module.exports = [
349 'VALUE',
350 'PROVIDER',
351 'CONSTRUCTOR',
352 'SINGLETON',
353 'FUNCTION',
354 'INSTANCE',
355 'PERSISTENT',
356 'TRANSIENT',
357 'BLUEPRINT',
358 'EAGER'
359].reduce(function (options, flag, idx) {
360 options[flag] = Math.pow(2, idx)
361 return options
362}, {})
363
364},{}],8:[function(_dereq_,module,exports){
365'use strict'
366
367var mod$11 = _dereq_('./utils');
368var leftCurryTwice = mod$11.leftCurryTwice;
369var identity = mod$11.identity;
370var compose = mod$11.compose;
371var partial = mod$11.partial;
372
373var resolveDeps = mod$11.resolveDeps;
374var invoke = mod$11.invoke;
375
376var instanciate = mod$11.instanciate;
377var singletonify = mod$11.singletonify;
378
379var generateMask = mod$11.generateMask;
380
381
382var mod$12 = _dereq_('./options');
383var VALUE = mod$12.VALUE;
384var PROVIDER = mod$12.PROVIDER;
385var CONSTRUCTOR = mod$12.CONSTRUCTOR;
386var SINGLETON = mod$12.SINGLETON;
387var FUNCTION = mod$12.FUNCTION;
388var INSTANCE = mod$12.INSTANCE;
389var TRANSIENT = mod$12.TRANSIENT;
390var PERSISTENT = mod$12.PERSISTENT;
391var EAGER = mod$12.EAGER;
392
393
394var resolvers = {}
395
396resolvers[ generateMask([VALUE]) ] = compose(leftCurryTwice, resolveDeps)(identity)
397resolvers[ generateMask([FUNCTION]) ] = compose(leftCurryTwice, resolveDeps)(partial)
398resolvers[ generateMask([CONSTRUCTOR]) ] = compose(leftCurryTwice, resolveDeps)(instanciate)
399resolvers[ generateMask([TRANSIENT, CONSTRUCTOR, SINGLETON]) ] = singletonify(instanciate)
400resolvers[ generateMask([PERSISTENT, CONSTRUCTOR, SINGLETON]) ] = singletonify(instanciate, true)
401resolvers[ generateMask([PROVIDER]) ] = compose(leftCurryTwice, resolveDeps)(invoke)
402resolvers[ generateMask([TRANSIENT, SINGLETON, PROVIDER]) ] = singletonify(invoke)
403resolvers[ generateMask([PERSISTENT, SINGLETON, PROVIDER]) ] = singletonify(invoke, true)
404
405resolvers[ generateMask([EAGER, SINGLETON, PROVIDER])] = singletonify(invoke, true)
406resolvers[ generateMask([EAGER, CONSTRUCTOR, SINGLETON]) ] = singletonify(instanciate, true)
407
408// aliases
409resolvers[ generateMask([INSTANCE]) ] = resolvers[ generateMask([VALUE]) ]
410
411module.exports = resolvers
412
413},{"./options":7,"./utils":11}],9:[function(_dereq_,module,exports){
414'use strict'
415
416module.exports = {
417 ACQUIRE: 'ACQUIRE',
418 RELEASE: 'RELEASE',
419 DISPOSE: 'DISPOSE'
420}
421
422},{}],10:[function(_dereq_,module,exports){
423'use strict'
424
425var mod$17 = _dereq_('./signals');var ACQUIRE = mod$17.ACQUIRE;var RELEASE = mod$17.RELEASE;var DISPOSE = mod$17.DISPOSE;
426
427module.exports = function singletonify(create, persistent) {
428
429 persistent = persistent || false
430
431 return function (value, resolveDeps, releaseDeps) {
432
433 var handlers = {}
434 var count = 0
435 var instance
436
437 function dispose() {
438 if (typeof instance.dispose === 'function') {
439 instance.dispose()
440 }
441 instance = undefined
442 count = 0
443 }
444
445 handlers[ACQUIRE] = function (value) {
446 if (typeof instance === 'undefined') {
447 instance = create.call(this, value, resolveDeps())
448 }
449 count++
450 return instance
451 }
452
453 handlers[RELEASE] = function (value) {
454 count--
455 if (count == 0 && !persistent) {
456 releaseDeps()
457 dispose()
458 }
459 }
460
461 handlers[DISPOSE] = function (value) {
462 if (instance) {
463 releaseDeps()
464 dispose()
465 }
466 }
467
468 return function (signal) {
469 return handlers[signal].call(this, value)
470 }
471 }
472}
473
474},{"./signals":9}],11:[function(_dereq_,module,exports){
475'use strict'
476
477var instanciate = _dereq_('./instanciate');
478var singletonify = _dereq_('./singletonify');
479var mod$10 = _dereq_('./options');var EAGER = mod$10.EAGER;var SINGLETON = mod$10.SINGLETON;var PROVIDER = mod$10.PROVIDER;var CONSTRUCTOR = mod$10.CONSTRUCTOR;
480
481var EAGER_SINGLETON_PROVIDER = generateMask([EAGER, SINGLETON, PROVIDER])
482var EAGER_SINGLETON_CONSTRUCTOR = generateMask([EAGER, SINGLETON, CONSTRUCTOR])
483
484function identity(value) { return value } module.exports.identity = identity;
485
486function leftCurryTwice(fn) {
487 return function firstCurry() {var firstArgs=Array.prototype.slice.call(arguments,0);
488 return function secondCurry() {var secondArgs=Array.prototype.slice.call(arguments,0);
489 return fn.apply(null, firstArgs.concat(secondArgs))
490 }
491 }
492} module.exports.leftCurryTwice = leftCurryTwice;
493
494function compose() {var funcs=Array.prototype.slice.call(arguments,0);
495 return function () {var args=Array.prototype.slice.call(arguments,0);
496
497 var i
498
499 for (i = funcs.length - 1; i >= 0; i--) {
500 args = [funcs[i].apply(this, args)]
501 }
502 return args[0]
503 }
504} module.exports.compose = compose;
505
506function resolveDeps(fn) {
507 return function (value, resolve, release, signal) {
508 return fn.call(this, value, resolve())
509 }
510} module.exports.resolveDeps = resolveDeps;
511
512function invoke(fn, deps) {
513 return fn.apply(null, deps)
514} module.exports.invoke = invoke;
515
516function partial(func, boundArgs) {
517 return function () {var args=Array.prototype.slice.call(arguments,0);
518 return func.apply(this, boundArgs.concat(args))
519 }
520} module.exports.partial = partial;
521
522function generateMask(flags) {
523 return flags.reduce(function(prev, curr) {return prev | curr;}, 0)
524} module.exports.generateMask = generateMask;
525
526function isEagerSingleton(type) {
527 return [EAGER_SINGLETON_PROVIDER, EAGER_SINGLETON_CONSTRUCTOR].indexOf(type) > -1
528} module.exports.isEagerSingleton = isEagerSingleton;
529
530function noop() {} module.exports.noop = noop;
531
532module.exports.instanciate = instanciate;module.exports.singletonify = singletonify;
533
534},{"./instanciate":6,"./options":7,"./singletonify":10}]},{},[5])
535(5)
536});
\No newline at end of file