diff --git a/README.md b/README.md index 4b6822b..b9513b6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # Vuec ## Vue container - a simple IoC container for Vue 2 +**UNMAINTAINED WARNING** I don't use Vuec myself anymore, and I hardly have time to maintain Vuec. +If you are interested in taking over the project feel free to contact me. + ### Installation Install using `yarn add vue-container` or `npm install --save vue-container` @@ -62,11 +65,23 @@ Using dependency injection you could just swap out the binding for your HTTP ser Simply put, in your code you could have: ```javascript +import Axios from 'axios'; + Vue.$ioc.register('$http', Axios); + +function convertCurrency() {} + +Vue.$ioc.register(convertCurrency); // will be registered as 'convertCurrency' + +class PostService {} + +Vue.$ioc.register(new PostService()); // will be registered as 'PostService' ``` And for your unit tests you could overwrite the binding ```javascript Vue.$ioc.register('$http', AxiosDummyModule); +Vue.$ioc.register('convertCurrency', DummyFunc); +Vue.$ioc.register('PostService', DummyService); ``` Your components however remain entirely unchanged. @@ -85,6 +100,17 @@ Vue.$ioc.register('Axios', Axios); // Or inside a Vue component: this.$ioc.register('Axios', Axios); ``` +Also you can pass dependencies map to container when register plugin +```javascript +import Vuec from 'vue-container'; + +Vue.use(Vuec, { + register: { + $http: Axios + } +}); +``` + You can also manually resolve from the container using the `resolve` function: ```javascript Vue.$ioc.resolve('Axios'); diff --git a/dist/vuec.js b/dist/vuec.js index 826b762..fac292e 100644 --- a/dist/vuec.js +++ b/dist/vuec.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.vuec=t():e.vuec=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=2)}([function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:null,n=this.parameters(e);return e.bind.apply(e,[t].concat(r(n)))}}]),e}();t.default=u},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0){var i=n.parameters(r[r.length-1]),u=r[r.length-1];r[r.length-1]=function(){u.call.apply(u,[this].concat(o(i)))}}},c=function(e,t){void 0!==e.$options.services&&e.$options.services.forEach(function(n){e.$services[n]=t.resolve(n)})},f=new u.default;t.default={production:1,install:function(e){e.prototype.$services=[],e.prototype.$ioc=f,e.$ioc=f,e.mixin({beforeCreate:function(){c(this,f),a(this,"created",f),a(this,"beforeMount",f),a(this,"mounted",f),a(this,"beforeUpdate",f),a(this,"updated",f),a(this,"beforeDestroy",f),a(this,"destroyed",f)}})}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Container=void 0;var o=n(0);Object.defineProperty(t,"Container",{enumerable:!0,get:function(){return r(o).default}});var i=n(1),u=r(i);t.default=u.default}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.vuec=t():e.vuec=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=2)}([function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:null;return c(e)&&a(e.name)?{key:e.name,value:e}:f(e)&&c(e.constructor)&&a(e.constructor.name)?{key:e.constructor.name,value:e}:{key:e,value:t}}},{key:"toEntries",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).map(function(t){return[t,e[t]]})}},{key:"parameters",value:function(e){var t=e.toString().match(/^(function)?\s*[^(]*\(\s*([^)]*)\)?/m);return null===t?(console.warn("Extraction failed for "+e.name),e.bind(self)):("function"===t[1]||void 0===t[1]?t[2]:t[1]).replace(/ /g,"").split(",").filter(function(e){return""!==e}).map(this.resolve.bind(this))}},{key:"prepare",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=this.parameters(e);return e.bind.apply(e,[t].concat(r(n)))}}]),e}();t.default=s},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0){var i=n.parameters(r[r.length-1]),u=r[r.length-1];r[r.length-1]=function(){u.call.apply(u,[this].concat(o(i)))}}},a=function(e,t){void 0!==e.$options.services&&e.$options.services.forEach(function(n){e.$services[n]=t.resolve(n)})},f=void 0;t.default={production:1,install:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};f=new u.default(t.register),e.prototype.$services=[],e.prototype.$ioc=f,e.$ioc=f,e.mixin({beforeCreate:function(){a(this,f),c(this,"created",f),c(this,"beforeMount",f),c(this,"mounted",f),c(this,"beforeUpdate",f),c(this,"updated",f),c(this,"beforeDestroy",f),c(this,"destroyed",f)}})}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Container=void 0;var o=n(0);Object.defineProperty(t,"Container",{enumerable:!0,get:function(){return r(o).default}});var i=n(1),u=r(i);t.default=u.default}])}); //# sourceMappingURL=vuec.js.map \ No newline at end of file diff --git a/dist/vuec.js.map b/dist/vuec.js.map index a65acfb..0b969bd 100644 --- a/dist/vuec.js.map +++ b/dist/vuec.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///vuec.js","webpack:///webpack/bootstrap eff007853d09751e7ab6","webpack:///./src/Container.js","webpack:///./src/Vue.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","_toConsumableArray","arr","Array","isArray","arr2","length","from","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","descriptor","writable","key","protoProps","staticProps","Container","$cache","Map","production","Boolean","set","has","delete","entries","Error","func","extracted","toString","match","console","warn","bind","self","undefined","replace","split","filter","dep","map","resolve","arguments","params","parameters","apply","concat","default","_interopRequireDefault","obj","_Container","_Container2","patchHook","$vm","hookName","container","hooks","$options","hook","injectServices","services","forEach","service","$services","install","Vue","$ioc","mixin","beforeCreate","_Vue","_Vue2"],"mappings":"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","file":"vuec.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuec\"] = factory();\n\telse\n\t\troot[\"vuec\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuec\"] = factory();\n\telse\n\t\troot[\"vuec\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Container = function () {\n\tfunction Container() {\n\t\t_classCallCheck(this, Container);\n\n\t\tthis.$cache = new Map();\n\t\tthis.production = Boolean(\"production\" === 'production');\n\t}\n\n\t_createClass(Container, [{\n\t\tkey: 'register',\n\t\tvalue: function register(name, value) {\n\t\t\tthis.$cache.set(name, value);\n\t\t}\n\t}, {\n\t\tkey: 'unregister',\n\t\tvalue: function unregister(name) {\n\t\t\tif (this.$cache.has(name)) {\n\t\t\t\tthis.$cache.delete(name);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'has',\n\t\tvalue: function has(name) {\n\t\t\treturn this.$cache.has(name);\n\t\t}\n\t}, {\n\t\tkey: 'bindings',\n\t\tvalue: function bindings() {\n\t\t\treturn this.$cache.entries();\n\t\t}\n\t}, {\n\t\tkey: 'resolve',\n\t\tvalue: function resolve(name) {\n\t\t\tif (this.$cache.has(name)) {\n\t\t\t\treturn this.$cache.get(name);\n\t\t\t}\n\n\t\t\tif (this.production) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tthrow new Error('Unknown dependency \"' + name + '\"');\n\t\t}\n\t}, {\n\t\tkey: 'parameters',\n\t\tvalue: function parameters(func) {\n\t\t\tvar extracted = func.toString().match(/^(function)?\\s*[^(]*\\(\\s*([^)]*)\\)?/m);\n\t\t\tif (extracted === null) {\n\t\t\t\tconsole.warn('Extraction failed for ' + func.name);\n\t\t\t\treturn func.bind(self);\n\t\t\t}\n\n\t\t\tvar es6Mode = extracted[1] === 'function' || extracted[1] === undefined;\n\n\t\t\treturn (es6Mode ? extracted[2] : extracted[1]).replace(/ /g, '').split(',').filter(function (dep) {\n\t\t\t\treturn dep !== '';\n\t\t\t}).map(this.resolve.bind(this));\n\t\t}\n\t}, {\n\t\tkey: 'prepare',\n\t\tvalue: function prepare(func) {\n\t\t\tvar self = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t\t\tvar params = this.parameters(func);\n\n\t\t\treturn func.bind.apply(func, [self].concat(_toConsumableArray(params)));\n\t\t}\n\t}]);\n\n\treturn Container;\n}();\n\nexports.default = Container;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _Container = __webpack_require__(0);\n\nvar _Container2 = _interopRequireDefault(_Container);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar patchHook = function patchHook($vm, hookName, container) {\n\tvar hooks = $vm.$options[hookName];\n\tif (hooks && hooks.length > 0) {\n\t\tvar params = container.parameters(hooks[hooks.length - 1]);\n\t\tvar hook = hooks[hooks.length - 1];\n\t\thooks[hooks.length - 1] = function () {\n\t\t\thook.call.apply(hook, [this].concat(_toConsumableArray(params)));\n\t\t};\n\t}\n};\n\nvar injectServices = function injectServices($vm, container) {\n\tif ($vm.$options.services !== undefined) {\n\t\t$vm.$options.services.forEach(function (service) {\n\t\t\t$vm.$services[service] = container.resolve(service);\n\t\t});\n\t}\n};\n\nvar container = new _Container2.default(); // eslint-disable-line\nexports.default = {\n\tproduction: \"production\" === 'production',\n\tinstall: function install(Vue) {\n\t\tVue.prototype.$services = [];\n\t\tVue.prototype.$ioc = container;\n\t\tVue.$ioc = container;\n\t\tVue.mixin({\n\t\t\tbeforeCreate: function beforeCreate() {\n\t\t\t\tinjectServices(this, container);\n\t\t\t\tpatchHook(this, 'created', container);\n\t\t\t\tpatchHook(this, 'beforeMount', container);\n\t\t\t\tpatchHook(this, 'mounted', container);\n\t\t\t\tpatchHook(this, 'beforeUpdate', container);\n\t\t\t\tpatchHook(this, 'updated', container);\n\t\t\t\tpatchHook(this, 'beforeDestroy', container);\n\t\t\t\tpatchHook(this, 'destroyed', container);\n\t\t\t}\n\t\t});\n\t}\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Container = undefined;\n\nvar _Container = __webpack_require__(0);\n\nObject.defineProperty(exports, 'Container', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_Container).default;\n }\n});\n\nvar _Vue = __webpack_require__(1);\n\nvar _Vue2 = _interopRequireDefault(_Vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _Vue2.default;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// vuec.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap eff007853d09751e7ab6","export default class Container {\n\tconstructor() {\n\t\tthis.$cache = new Map();\n\t\tthis.production = Boolean(process.env.NODE_ENV === 'production');\n\t}\n\n\tregister(name, value) {\n\t\tthis.$cache.set(name, value);\n\t}\n\n\tunregister(name) {\n\t\tif (this.$cache.has(name)) {\n\t\t\tthis.$cache.delete(name);\n\t\t}\n\t}\n\n\thas(name) {\n\t\treturn this.$cache.has(name);\n\t}\n\n\tbindings() {\n\t\treturn this.$cache.entries();\n\t}\n\n\tresolve(name) {\n\t\tif (this.$cache.has(name)) {\n\t\t\treturn this.$cache.get(name);\n\t\t}\n\n\t\tif (this.production) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthrow new Error(`Unknown dependency \"${name}\"`);\n\t}\n\n\tparameters(func) {\n\t\tconst extracted = func.toString().match(/^(function)?\\s*[^(]*\\(\\s*([^)]*)\\)?/m);\n\t\tif (extracted === null) {\n\t\t\tconsole.warn(`Extraction failed for ${func.name}`);\n\t\t\treturn func.bind(self);\n\t\t}\n\n\t\tconst es6Mode = extracted[1] === 'function' || extracted[1] === undefined;\n\n\t\treturn (es6Mode ? extracted[2] : extracted[1])\n\t\t\t.replace(/ /g, '')\n\t\t\t.split(',')\n\t\t\t.filter(dep => dep !== '')\n\t\t\t.map(this.resolve.bind(this));\n\t}\n\n\tprepare(func, self = null) {\n\t\tconst params = this.parameters(func);\n\n\t\treturn func.bind(self, ...params);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/Container.js","import Container from './Container';\n\nconst patchHook = ($vm, hookName, container) => {\n\tconst hooks = $vm.$options[hookName];\n\tif (hooks && hooks.length > 0) {\n\t\tconst params = container.parameters(hooks[hooks.length - 1]);\n\t\tconst hook = hooks[hooks.length - 1];\n\t\thooks[hooks.length - 1] = function () {\n\t\t\thook.call(this, ...params);\n\t\t};\n\t}\n};\n\nconst injectServices = ($vm, container) => {\n\tif ($vm.$options.services !== undefined) {\n\t\t$vm.$options.services.forEach(service => {\n\t\t\t$vm.$services[service] = container.resolve(service);\n\t\t});\n\t}\n};\n\nconst container = new Container; // eslint-disable-line\nexport default {\n\tproduction: process.env.NODE_ENV === 'production',\n\tinstall(Vue) {\n\t\tVue.prototype.$services = [];\n\t\tVue.prototype.$ioc = container;\n\t\tVue.$ioc = container;\n\t\tVue.mixin({\n\t\t\tbeforeCreate() {\n\t\t\t\tinjectServices(this, container);\n\t\t\t\tpatchHook(this, 'created', container);\n\t\t\t\tpatchHook(this, 'beforeMount', container);\n\t\t\t\tpatchHook(this, 'mounted', container);\n\t\t\t\tpatchHook(this, 'beforeUpdate', container);\n\t\t\t\tpatchHook(this, 'updated', container);\n\t\t\t\tpatchHook(this, 'beforeDestroy', container);\n\t\t\t\tpatchHook(this, 'destroyed', container);\n\t\t\t},\n\t\t});\n\t},\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/Vue.js","import Vuebindings from './Vue';\nexport { default as Container } from './Container';\n\nexport default Vuebindings;\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///vuec.js","webpack:///webpack/bootstrap 38b3d23ebdc36d663f00","webpack:///./src/Container.js","webpack:///./src/Vue.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","_toConsumableArray","arr","Array","isArray","arr2","length","from","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","descriptor","writable","key","protoProps","staticProps","_typeof","Symbol","iterator","obj","constructor","isFunc","val","isString","isObject","Container","map","$cache","Map","toEntries","production","Boolean","dependency","_extractDep","extractDep","set","_extractDep2","has","delete","_extractDep3","entries","_extractDep4","console","warn","Error","arguments","undefined","keys","func","extracted","toString","match","bind","self","replace","split","filter","dep","resolve","params","parameters","apply","concat","default","_interopRequireDefault","_Container","_Container2","patchHook","$vm","hookName","container","hooks","$options","hook","injectServices","services","forEach","service","$services","install","Vue","options","register","$ioc","mixin","beforeCreate","_Vue","_Vue2"],"mappings":"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","file":"vuec.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuec\"] = factory();\n\telse\n\t\troot[\"vuec\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuec\"] = factory();\n\telse\n\t\troot[\"vuec\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar isFunc = function isFunc(val) {\n\treturn typeof val === 'function';\n};\nvar isString = function isString(val) {\n\treturn typeof val === 'string';\n};\nvar isObject = function isObject(val) {\n\treturn (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object';\n};\n\nvar Container = function () {\n\tfunction Container(map) {\n\t\t_classCallCheck(this, Container);\n\n\t\tthis.$cache = new Map(this.toEntries(map));\n\t\tthis.production = Boolean(\"production\" === 'production');\n\t}\n\n\t/**\n * Register dependency in container by given name or by function name\n * @param name {Function|Object|String}\n * @param dependency {any}\n * @returns {Container}\n */\n\n\n\t_createClass(Container, [{\n\t\tkey: 'register',\n\t\tvalue: function register(name, dependency) {\n\t\t\tvar _extractDep = this.extractDep(name, dependency),\n\t\t\t key = _extractDep.key,\n\t\t\t value = _extractDep.value;\n\n\t\t\tthis.$cache.set(key, value);\n\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n * Removes dependency from container by given name or by function name\n * @param name {Function|String}\n * @returns {Container}\n */\n\n\t}, {\n\t\tkey: 'unregister',\n\t\tvalue: function unregister(name) {\n\t\t\tvar _extractDep2 = this.extractDep(name),\n\t\t\t key = _extractDep2.key;\n\n\t\t\tif (this.$cache.has(key)) {\n\t\t\t\tthis.$cache.delete(key);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n * Check if dependency exists in container\n * @param name {String}\n * @returns {boolean}\n */\n\n\t}, {\n\t\tkey: 'has',\n\t\tvalue: function has(name) {\n\t\t\tvar _extractDep3 = this.extractDep(name),\n\t\t\t key = _extractDep3.key;\n\n\t\t\treturn this.$cache.has(key);\n\t\t}\n\n\t\t/**\n * Returns iterator of values as [key, dependency]\n * @returns {Iterator.<*>}\n */\n\n\t}, {\n\t\tkey: 'bindings',\n\t\tvalue: function bindings() {\n\t\t\treturn this.$cache.entries();\n\t\t}\n\n\t\t/**\n * Resolves dependency only by string name\n * @param name {String}\n * @returns {any}\n */\n\n\t}, {\n\t\tkey: 'resolve',\n\t\tvalue: function resolve(name) {\n\t\t\tif (isFunc(name) || isObject(name)) {\n\t\t\t\tvar _extractDep4 = this.extractDep(name),\n\t\t\t\t key = _extractDep4.key;\n\n\t\t\t\tconsole.warn('Don\\'t try to resolve dependency \"' + key + '\" by dependency itself');\n\t\t\t}\n\n\t\t\tif (this.$cache.has(name)) {\n\t\t\t\treturn this.$cache.get(name);\n\t\t\t}\n\n\t\t\tif (this.production) {\n\t\t\t\treturn void 0;\n\t\t\t}\n\n\t\t\tthrow new Error('Unknown dependency \"' + name + '\"');\n\t\t}\n\n\t\t/**\n * Extract dependency name from key and return as {key, value} pair\n * @param key {Function|Object|String|any}\n * @param value {any}\n * @returns {{key:string, value:any}}\n * @protected\n */\n\n\t}, {\n\t\tkey: 'extractDep',\n\t\tvalue: function extractDep(key) {\n\t\t\tvar value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t\t\tif (isFunc(key) && isString(key.name)) {\n\t\t\t\treturn { key: key.name, value: key }; // jus a function or class\n\t\t\t}\n\n\t\t\tif (isObject(key) && isFunc(key.constructor) && isString(key.constructor.name)) {\n\t\t\t\treturn { key: key.constructor.name, value: key }; // instance of class or function\n\t\t\t}\n\n\t\t\treturn { key: key, value: value };\n\t\t}\n\n\t\t/**\n * Converts object to [key, value] array\n * @param map {Object}\n * @returns {Array}\n * @protected\n */\n\n\t}, {\n\t\tkey: 'toEntries',\n\t\tvalue: function toEntries() {\n\t\t\tvar map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\t\treturn Object.keys(map).map(function (key) {\n\t\t\t\treturn [key, map[key]];\n\t\t\t});\n\t\t}\n\n\t\t/**\n * Extracts all dependencies names from given function\n * @param func {Function}\n * @returns {Array}\n * @protected\n */\n\n\t}, {\n\t\tkey: 'parameters',\n\t\tvalue: function parameters(func) {\n\t\t\tvar extracted = func.toString().match(/^(function)?\\s*[^(]*\\(\\s*([^)]*)\\)?/m);\n\n\t\t\tif (extracted === null) {\n\t\t\t\tconsole.warn('Extraction failed for ' + func.name);\n\t\t\t\treturn func.bind(self);\n\t\t\t}\n\n\t\t\tvar es6Mode = extracted[1] === 'function' || extracted[1] === undefined;\n\n\t\t\treturn (es6Mode ? extracted[2] : extracted[1]).replace(/ /g, '').split(',').filter(function (dep) {\n\t\t\t\treturn dep !== '';\n\t\t\t}).map(this.resolve.bind(this));\n\t\t}\n\n\t\t/**\n * Injects dependencies into the function by arguments\n * @param func\n * @param self\n */\n\n\t}, {\n\t\tkey: 'prepare',\n\t\tvalue: function prepare(func) {\n\t\t\tvar self = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t\t\tvar params = this.parameters(func);\n\n\t\t\treturn func.bind.apply(func, [self].concat(_toConsumableArray(params)));\n\t\t}\n\t}]);\n\n\treturn Container;\n}();\n\nexports.default = Container;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _Container = __webpack_require__(0);\n\nvar _Container2 = _interopRequireDefault(_Container);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar patchHook = function patchHook($vm, hookName, container) {\n\tvar hooks = $vm.$options[hookName];\n\tif (hooks && hooks.length > 0) {\n\t\tvar params = container.parameters(hooks[hooks.length - 1]);\n\t\tvar hook = hooks[hooks.length - 1];\n\t\thooks[hooks.length - 1] = function () {\n\t\t\thook.call.apply(hook, [this].concat(_toConsumableArray(params)));\n\t\t};\n\t}\n};\n\nvar injectServices = function injectServices($vm, container) {\n\tif ($vm.$options.services !== undefined) {\n\t\t$vm.$options.services.forEach(function (service) {\n\t\t\t$vm.$services[service] = container.resolve(service);\n\t\t});\n\t}\n};\n\nvar container = void 0;\nexports.default = {\n\tproduction: \"production\" === 'production',\n\tinstall: function install(Vue) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tcontainer = new _Container2.default(options.register);\n\n\t\tVue.prototype.$services = [];\n\t\tVue.prototype.$ioc = container;\n\t\tVue.$ioc = container;\n\t\tVue.mixin({\n\t\t\tbeforeCreate: function beforeCreate() {\n\t\t\t\tinjectServices(this, container);\n\t\t\t\tpatchHook(this, 'created', container);\n\t\t\t\tpatchHook(this, 'beforeMount', container);\n\t\t\t\tpatchHook(this, 'mounted', container);\n\t\t\t\tpatchHook(this, 'beforeUpdate', container);\n\t\t\t\tpatchHook(this, 'updated', container);\n\t\t\t\tpatchHook(this, 'beforeDestroy', container);\n\t\t\t\tpatchHook(this, 'destroyed', container);\n\t\t\t}\n\t\t});\n\t}\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Container = undefined;\n\nvar _Container = __webpack_require__(0);\n\nObject.defineProperty(exports, 'Container', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_Container).default;\n }\n});\n\nvar _Vue = __webpack_require__(1);\n\nvar _Vue2 = _interopRequireDefault(_Vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _Vue2.default;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// vuec.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 38b3d23ebdc36d663f00","const isFunc = (val) => typeof val === 'function';\nconst isString = (val) => typeof val === 'string';\nconst isObject = (val) => typeof val === 'object';\n\nexport default class Container {\n\n\tconstructor(map) {\n\t\tthis.$cache = new Map(this.toEntries(map));\n\t\tthis.production = Boolean(process.env.NODE_ENV === 'production');\n\t}\n\n /**\n * Register dependency in container by given name or by function name\n * @param name {Function|Object|String}\n * @param dependency {any}\n * @returns {Container}\n */\n\tregister(name, dependency) {\n\t\tconst {key, value} = this.extractDep(name, dependency);\n\n this.$cache.set(key, value);\n\n\t\treturn this;\n\t}\n\n /**\n * Removes dependency from container by given name or by function name\n * @param name {Function|String}\n * @returns {Container}\n */\n\tunregister(name) {\n\t\tconst {key} = this.extractDep(name);\n\n\t\tif (this.$cache.has(key)) {\n\t\t\tthis.$cache.delete(key);\n\t\t}\n\n\t\treturn this;\n\t}\n\n /**\n * Check if dependency exists in container\n * @param name {String}\n * @returns {boolean}\n */\n\thas(name) {\n\t\tconst {key} = this.extractDep(name);\n\n\t\treturn this.$cache.has(key);\n\t}\n\n /**\n * Returns iterator of values as [key, dependency]\n * @returns {Iterator.<*>}\n */\n\tbindings() {\n\t\treturn this.$cache.entries();\n\t}\n\n /**\n * Resolves dependency only by string name\n * @param name {String}\n * @returns {any}\n */\n\tresolve(name) {\n\t\tif (isFunc(name) || isObject(name)) {\n\t\t\tconst {key} = this.extractDep(name);\n\t\t\tconsole.warn(`Don't try to resolve dependency \"${key}\" by dependency itself`)\n\t\t}\n\n\t\tif (this.$cache.has(name)) {\n\t\t\treturn this.$cache.get(name);\n\t\t}\n\n\t\tif (this.production) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\tthrow new Error(`Unknown dependency \"${name}\"`);\n\t}\n\n /**\n * Extract dependency name from key and return as {key, value} pair\n * @param key {Function|Object|String|any}\n * @param value {any}\n * @returns {{key:string, value:any}}\n * @protected\n */\n\textractDep(key, value = null) {\n if (isFunc(key) && isString(key.name)) {\n \treturn {key: key.name, value: key}; // jus a function or class\n\t\t}\n\n if (isObject(key) && isFunc(key.constructor) && isString(key.constructor.name)) {\n return {key: key.constructor.name, value: key};// instance of class or function\n }\n\n\t\treturn {key, value};\n\t}\n\n /**\n * Converts object to [key, value] array\n * @param map {Object}\n * @returns {Array}\n * @protected\n */\n\ttoEntries(map = {}) {\n\t\treturn Object.keys(map).map((key) => {\n\t\t\treturn [key, map[key]]\n\t\t});\n\t}\n\n /**\n * Extracts all dependencies names from given function\n * @param func {Function}\n * @returns {Array}\n * @protected\n */\n\tparameters(func) {\n\t\tconst extracted = func.toString().match(/^(function)?\\s*[^(]*\\(\\s*([^)]*)\\)?/m);\n\n\t\tif (extracted === null) {\n\t\t\tconsole.warn(`Extraction failed for ${func.name}`);\n\t\t\treturn func.bind(self);\n\t\t}\n\n\t\tconst es6Mode = extracted[1] === 'function' || extracted[1] === undefined;\n\n\t\treturn (es6Mode ? extracted[2] : extracted[1])\n\t\t\t.replace(/ /g, '')\n\t\t\t.split(',')\n\t\t\t.filter(dep => dep !== '')\n\t\t\t.map(this.resolve.bind(this));\n\t}\n\n /**\n * Injects dependencies into the function by arguments\n * @param func\n * @param self\n */\n\tprepare(func, self = null) {\n\t\tconst params = this.parameters(func);\n\n\t\treturn func.bind(self, ...params);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/Container.js","import Container from './Container';\n\nconst patchHook = ($vm, hookName, container) => {\n\tconst hooks = $vm.$options[hookName];\n\tif (hooks && hooks.length > 0) {\n\t\tconst params = container.parameters(hooks[hooks.length - 1]);\n\t\tconst hook = hooks[hooks.length - 1];\n\t\thooks[hooks.length - 1] = function () {\n\t\t\thook.call(this, ...params);\n\t\t};\n\t}\n};\n\nconst injectServices = ($vm, container) => {\n\tif ($vm.$options.services !== undefined) {\n\t\t$vm.$options.services.forEach(service => {\n\t\t\t$vm.$services[service] = container.resolve(service);\n\t\t});\n\t}\n};\n\nlet container;\nexport default {\n\tproduction: process.env.NODE_ENV === 'production',\n\tinstall(Vue, options = {}) {\n\t\tcontainer = new Container(options.register);\n\n\t\tVue.prototype.$services = [];\n\t\tVue.prototype.$ioc = container;\n\t\tVue.$ioc = container;\n\t\tVue.mixin({\n\t\t\tbeforeCreate() {\n\t\t\t\tinjectServices(this, container);\n\t\t\t\tpatchHook(this, 'created', container);\n\t\t\t\tpatchHook(this, 'beforeMount', container);\n\t\t\t\tpatchHook(this, 'mounted', container);\n\t\t\t\tpatchHook(this, 'beforeUpdate', container);\n\t\t\t\tpatchHook(this, 'updated', container);\n\t\t\t\tpatchHook(this, 'beforeDestroy', container);\n\t\t\t\tpatchHook(this, 'destroyed', container);\n\t\t\t},\n\t\t});\n\t},\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/Vue.js","import Vuebindings from './Vue';\nexport { default as Container } from './Container';\n\nexport default Vuebindings;\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/src/Container.js b/src/Container.js index 3e2ad9d..8bc5f2d 100644 --- a/src/Container.js +++ b/src/Container.js @@ -1,41 +1,128 @@ +const isFunc = (val) => typeof val === 'function'; +const isString = (val) => typeof val === 'string'; +const isObject = (val) => typeof val === 'object'; + export default class Container { - constructor() { - this.$cache = new Map(); + + /** + * Constructs dependency Container with dependencies map + * @param map {Object} + */ + constructor(map) { + this.$cache = new Map(this.toEntries(map)); this.production = Boolean(process.env.NODE_ENV === 'production'); } - register(name, value) { - this.$cache.set(name, value); + /** + * Register dependency in container by given name or by function name + * @param name {Function|Object|String} + * @param dependency {*} + * @returns {Container} + */ + register(name, dependency) { + const {key, value} = this.extractDep(name, dependency); + + this.$cache.set(key, value); + + return this; } + /** + * Removes dependency from container by given name or by function name + * @param name {Function|String} + * @returns {Container} + */ unregister(name) { - if (this.$cache.has(name)) { - this.$cache.delete(name); + const {key} = this.extractDep(name); + + if (this.$cache.has(key)) { + this.$cache.delete(key); } + + return this; } + /** + * Check if dependency exists in container + * @param name {String} + * @returns {boolean} + */ has(name) { - return this.$cache.has(name); + const {key} = this.extractDep(name); + + return this.$cache.has(key); } + /** + * Returns iterator of values as [key, dependency] + * @returns {Iterator.<*>} + */ bindings() { return this.$cache.entries(); } + /** + * Resolves dependency only by string name + * @param name {String} + * @returns {*} + */ resolve(name) { + if (isFunc(name) || isObject(name)) { + const {key} = this.extractDep(name); + console.warn(`Don't try to resolve dependency "${key}" by dependency itself`) + } + if (this.$cache.has(name)) { return this.$cache.get(name); } if (this.production) { - return undefined; + return void 0; } throw new Error(`Unknown dependency "${name}"`); } + /** + * Extract dependency name from key and return as {key, value} pair + * @param key {Function|Object|String|*} + * @param value {*} + * @returns {{key:string, value:*}} + * @protected + */ + extractDep(key, value = null) { + if (isFunc(key) && isString(key.name)) { + return {key: key.name, value: key}; // jus a function or class + } + + if (isObject(key) && isFunc(key.constructor) && isString(key.constructor.name)) { + return {key: key.constructor.name, value: key};// instance of class or function + } + + return {key, value}; + } + + /** + * Converts object to [key, value] array + * @param map {Object} + * @returns {Array} + * @protected + */ + toEntries(map = {}) { + return Object.keys(map).map((key) => { + return [key, map[key]] + }); + } + + /** + * Extracts all dependencies names from given function + * @param func {Function} + * @returns {Array} + * @protected + */ parameters(func) { const extracted = func.toString().match(/^(function)?\s*[^(]*\(\s*([^)]*)\)?/m); + if (extracted === null) { console.warn(`Extraction failed for ${func.name}`); return func.bind(self); @@ -50,6 +137,11 @@ export default class Container { .map(this.resolve.bind(this)); } + /** + * Injects dependencies into the function by arguments + * @param func + * @param self + */ prepare(func, self = null) { const params = this.parameters(func); diff --git a/src/Vue.js b/src/Vue.js index 1224841..3533fb9 100644 --- a/src/Vue.js +++ b/src/Vue.js @@ -19,10 +19,12 @@ const injectServices = ($vm, container) => { } }; -const container = new Container; // eslint-disable-line +let container; export default { production: process.env.NODE_ENV === 'production', - install(Vue) { + install(Vue, options = {}) { + container = new Container(options.register); + Vue.prototype.$services = []; Vue.prototype.$ioc = container; Vue.$ioc = container; diff --git a/tests/container.js b/tests/container.js index 7a6016d..36cf69c 100644 --- a/tests/container.js +++ b/tests/container.js @@ -22,6 +22,43 @@ describe('Container', function() { assert.isFunction(resolved); assert.equal(resolved(), 'Hello world'); }); + it('Should register function by its name', function() { + function fooBaz() { + return 'bar'; + } + + const container = new vuec.Container(); + container.register(fooBaz); + const resolved = container.$cache.get('fooBaz'); + assert.isFunction(fooBaz); + assert.equal(resolved(), 'bar'); + }); + it('Should register class by its name', function() { + class Foo { + bar() { + return 'baz' + } + } + + const container = new vuec.Container(); + container.register(Foo); + const resolvedClass = container.$cache.get('Foo'); + assert.isFunction(resolvedClass); + assert.equal(resolvedClass, Foo); + }); + it('Should register instance of class by its name', function() { + class FooBaz { + bar() { + return 'baz' + } + } + + const container = new vuec.Container(); + const instance = new FooBaz(); + container.register(instance); + const resolvedClass = container.$cache.get('FooBaz'); + assert.instanceOf(resolvedClass, FooBaz); + }); }); describe('#resolve()', function() { it('Should resolve integers', function() { @@ -47,6 +84,21 @@ describe('Container', function() { assert.equal(container.resolve('function'), fnc); assert.equal(container.resolve('function')(), 12345); }); + it('Should resolve class', function() { + class FooBazBar {} + + const container = new vuec.Container(); + container.register(FooBazBar); + assert.equal(container.resolve('FooBazBar'), FooBazBar); + }); + it('Should resolve instance of class', function() { + class FooBazBar2 {} + const instance = new FooBazBar2(); + const container = new vuec.Container(); + container.register(instance); + assert.equal(container.resolve('FooBazBar2'), instance); + assert.instanceOf(container.resolve('FooBazBar2'), FooBazBar2); + }); it('Should throw when target doesn\'t exist (development)', function() { const container = new vuec.Container(); if (container.production === true) return;