@kaokei/use-vue-service 1.1.1 → 2.0.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.
package/dist/index.cjs.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @kaokei/use-vue-service
3
3
  * Use angular service in vue.
4
4
  *
5
- * @version 1.1.1
5
+ * @version 2.0.0
6
6
  * @author kaokei
7
7
  * @license MIT
8
8
  * @link https://github.com/kaokei/use-vue-service
@@ -39,7 +39,7 @@ function DEFAULT_MERGE_PROPERTY_HOOK(target, source) {
39
39
  return target;
40
40
  }
41
41
 
42
- function getInjector(provides, parentInjector) {
42
+ function createInjector(provides, parentInjector) {
43
43
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
44
44
  options.beforeCacheHook = options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;
45
45
  options.mergePropertyHook = options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;
@@ -56,9 +56,10 @@ function getServiceFromInjector(injector, token, options) {
56
56
  return injector.get(token, options);
57
57
  }
58
58
 
59
- var DEFAULT_INJECTOR = getInjector();
59
+ var DEFAULT_INJECTOR = createInjector();
60
60
  /**
61
61
  * 从当前组件开始查找provider
62
+ * 注意到vue本身的inject是默认从父级组件开始查找
62
63
  *
63
64
  * @export
64
65
  * @param {*} key
@@ -105,16 +106,23 @@ function declareProviders(providers) {
105
106
  var parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);
106
107
 
107
108
  if (parentInjector.uid === instance.uid) {
108
- throw new Error('declareProviders repeatedly call.');
109
+ throw new Error('declareProviders can only be called once.');
109
110
  }
110
111
 
111
- var currentInjector = getInjector(providers, parentInjector);
112
+ var currentInjector = createInjector(providers, parentInjector);
112
113
  currentInjector.uid = instance.uid;
113
114
  vue.onUnmounted(function () {
114
115
  currentInjector.dispose();
115
116
  });
116
117
  vue.provide(INJECTOR_KEY, currentInjector);
117
118
  }
119
+ /**
120
+ * 实际上所有Injectable的Class都是兜底到root injector中
121
+ * 不需要特意调用declareRootProviders声明
122
+ * 这个方法是用于声明不是Injectable的Class的其他类型的Provider
123
+ * @param providers
124
+ */
125
+
118
126
 
119
127
  function declareRootProviders(providers) {
120
128
  DEFAULT_INJECTOR.addProviders(providers);
@@ -131,9 +139,9 @@ function useRootService(token, options) {
131
139
 
132
140
  exports.DEFAULT_INJECTOR = DEFAULT_INJECTOR;
133
141
  exports.INJECTOR_KEY = INJECTOR_KEY;
142
+ exports.createInjector = createInjector;
134
143
  exports.declareProviders = declareProviders;
135
144
  exports.declareRootProviders = declareRootProviders;
136
- exports.getInjector = getInjector;
137
145
  exports.getServiceFromInjector = getServiceFromInjector;
138
146
  exports.inject = inject;
139
147
  exports.useRootService = useRootService;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
@@ -2,10 +2,10 @@
2
2
  * @kaokei/use-vue-service
3
3
  * Use angular service in vue.
4
4
  *
5
- * @version 1.1.1
5
+ * @version 2.0.0
6
6
  * @author kaokei
7
7
  * @license MIT
8
8
  * @link https://github.com/kaokei/use-vue-service
9
9
  */
10
- "use strict";function e(r){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(r)}Object.defineProperty(exports,"__esModule",{value:!0});var r=require("@kaokei/di"),o=require("vue"),t="USE_VUE_SERVICE_INJECTOR_KEY";function n(r){return r&&"object"===e(r)?o.reactive(r):o.ref(r)}function i(e,t){for(var n in t)r.has(t,n)&&(e[n]=o.proxyRefs(t[n]));return e}function u(e,o){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.beforeCacheHook=t.beforeCacheHook||n,t.mergePropertyHook=t.mergePropertyHook||i,new r.Injector(e,o,t)}function c(e,r,o){return Array.isArray(r)?r.map((function(r){return e.get(r,o)})):e.get(r,o)}var s=u();function a(e,r){var t=o.getCurrentInstance();if(t)return t.provides[e]||r;console.warn("inject() can only be used inside setup() or functional components.")}for(var f in exports.DEFAULT_INJECTOR=s,exports.INJECTOR_KEY=t,exports.declareProviders=function(e){var r=o.getCurrentInstance();if(!r)throw new Error("declareProviders can only be used inside setup function.");var n=a(t,s);if(n.uid===r.uid)throw new Error("declareProviders repeatedly call.");var i=u(e,n);i.uid=r.uid,o.onUnmounted((function(){i.dispose()})),o.provide(t,i)},exports.declareRootProviders=function(e){s.addProviders(e)},exports.getInjector=u,exports.getServiceFromInjector=c,exports.inject=a,exports.useRootService=function(e,r){return c(s,e,r)},exports.useService=function(e,r){return c(a(t,s),e,r)},r)"default"===f||exports.hasOwnProperty(f)||(exports[f]=r[f]);
10
+ "use strict";function e(r){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(r)}Object.defineProperty(exports,"__esModule",{value:!0});var r=require("@kaokei/di"),o=require("vue"),t="USE_VUE_SERVICE_INJECTOR_KEY";function n(r){return r&&"object"===e(r)?o.reactive(r):o.ref(r)}function i(e,t){for(var n in t)r.has(t,n)&&(e[n]=o.proxyRefs(t[n]));return e}function u(e,o){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.beforeCacheHook=t.beforeCacheHook||n,t.mergePropertyHook=t.mergePropertyHook||i,new r.Injector(e,o,t)}function c(e,r,o){return Array.isArray(r)?r.map((function(r){return e.get(r,o)})):e.get(r,o)}var s=u();function a(e,r){var t=o.getCurrentInstance();if(t)return t.provides[e]||r;console.warn("inject() can only be used inside setup() or functional components.")}for(var f in exports.DEFAULT_INJECTOR=s,exports.INJECTOR_KEY=t,exports.createInjector=u,exports.declareProviders=function(e){var r=o.getCurrentInstance();if(!r)throw new Error("declareProviders can only be used inside setup function.");var n=a(t,s);if(n.uid===r.uid)throw new Error("declareProviders can only be called once.");var i=u(e,n);i.uid=r.uid,o.onUnmounted((function(){i.dispose()})),o.provide(t,i)},exports.declareRootProviders=function(e){s.addProviders(e)},exports.getServiceFromInjector=c,exports.inject=a,exports.useRootService=function(e,r){return c(s,e,r)},exports.useService=function(e,r){return c(a(t,s),e,r)},r)"default"===f||exports.hasOwnProperty(f)||(exports[f]=r[f]);
11
11
  //# sourceMappingURL=index.cjs.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","addProviders"],"mappings":";;;;;;;;;uVAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,WAASF,GAETG,MAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,MAAIF,EAAQC,KACdF,EAAOE,GAAOE,YAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,WAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCQhBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,0BAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,4KCQqBC,OACzBJ,EAAWC,2BACZD,QACG,IAAIK,MAAM,gEAEZrB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAesB,MAAQN,EAASM,UAC5B,IAAID,MAAM,yCAEZE,EAAkBzB,EAAYsB,EAAWpB,GACzCuB,EAAiBD,IAAMN,EAASM,IAEtCE,eAAY,WACVD,EAAgBE,aAGlBC,UAAQxC,EAAcqC,0CAGaH,GACnCP,EAAiBc,aAAaP,4GCTDb,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON,gCAV9BM,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON"}
1
+ {"version":3,"file":"index.cjs.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","addProviders"],"mappings":";;;;;;;;;uVAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,WAASF,GAETG,MAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,MAAIF,EAAQC,KACdF,EAAOE,GAAOE,YAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,WAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCShBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,0BAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,qMCOqBC,OACzBJ,EAAWC,2BACZD,QACG,IAAIK,MAAM,gEAEZrB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAesB,MAAQN,EAASM,UAC5B,IAAID,MAAM,iDAEZE,EAAkBzB,EAAesB,EAAWpB,GAC5CuB,EAAiBD,IAAMN,EAASM,IAEtCE,eAAY,WACVD,EAAgBE,aAGlBC,UAAQxC,EAAcqC,0CASaH,GACnCP,EAAiBc,aAAaP,sFCfDb,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON,gCAV9BM,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON"}
@@ -2,7 +2,7 @@
2
2
  * @kaokei/use-vue-service
3
3
  * Use angular service in vue.
4
4
  *
5
- * @version 1.1.1
5
+ * @version 2.0.0
6
6
  * @author kaokei
7
7
  * @license MIT
8
8
  * @link https://github.com/kaokei/use-vue-service
@@ -39,7 +39,7 @@ function DEFAULT_MERGE_PROPERTY_HOOK(target, source) {
39
39
  return target;
40
40
  }
41
41
 
42
- function getInjector(provides, parentInjector) {
42
+ function createInjector(provides, parentInjector) {
43
43
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
44
44
  options.beforeCacheHook = options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;
45
45
  options.mergePropertyHook = options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;
@@ -56,9 +56,10 @@ function getServiceFromInjector(injector, token, options) {
56
56
  return injector.get(token, options);
57
57
  }
58
58
 
59
- var DEFAULT_INJECTOR = getInjector();
59
+ var DEFAULT_INJECTOR = createInjector();
60
60
  /**
61
61
  * 从当前组件开始查找provider
62
+ * 注意到vue本身的inject是默认从父级组件开始查找
62
63
  *
63
64
  * @export
64
65
  * @param {*} key
@@ -105,16 +106,23 @@ function declareProviders(providers) {
105
106
  var parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);
106
107
 
107
108
  if (parentInjector.uid === instance.uid) {
108
- throw new Error('declareProviders repeatedly call.');
109
+ throw new Error('declareProviders can only be called once.');
109
110
  }
110
111
 
111
- var currentInjector = getInjector(providers, parentInjector);
112
+ var currentInjector = createInjector(providers, parentInjector);
112
113
  currentInjector.uid = instance.uid;
113
114
  vue.onUnmounted(function () {
114
115
  currentInjector.dispose();
115
116
  });
116
117
  vue.provide(INJECTOR_KEY, currentInjector);
117
118
  }
119
+ /**
120
+ * 实际上所有Injectable的Class都是兜底到root injector中
121
+ * 不需要特意调用declareRootProviders声明
122
+ * 这个方法是用于声明不是Injectable的Class的其他类型的Provider
123
+ * @param providers
124
+ */
125
+
118
126
 
119
127
  function declareRootProviders(providers) {
120
128
  DEFAULT_INJECTOR.addProviders(providers);
@@ -131,9 +139,9 @@ function useRootService(token, options) {
131
139
 
132
140
  exports.DEFAULT_INJECTOR = DEFAULT_INJECTOR;
133
141
  exports.INJECTOR_KEY = INJECTOR_KEY;
142
+ exports.createInjector = createInjector;
134
143
  exports.declareProviders = declareProviders;
135
144
  exports.declareRootProviders = declareRootProviders;
136
- exports.getInjector = getInjector;
137
145
  exports.getServiceFromInjector = getServiceFromInjector;
138
146
  exports.inject = inject;
139
147
  exports.useRootService = useRootService;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.runtime.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.runtime.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
@@ -2,10 +2,10 @@
2
2
  * @kaokei/use-vue-service
3
3
  * Use angular service in vue.
4
4
  *
5
- * @version 1.1.1
5
+ * @version 2.0.0
6
6
  * @author kaokei
7
7
  * @license MIT
8
8
  * @link https://github.com/kaokei/use-vue-service
9
9
  */
10
- "use strict";var e=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:!0});var r=require("@kaokei/di"),o=require("vue"),t="USE_VUE_SERVICE_INJECTOR_KEY";function n(r){return r&&"object"===e(r)?o.reactive(r):o.ref(r)}function i(e,t){for(var n in t)r.has(t,n)&&(e[n]=o.proxyRefs(t[n]));return e}function u(e,o){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.beforeCacheHook=t.beforeCacheHook||n,t.mergePropertyHook=t.mergePropertyHook||i,new r.Injector(e,o,t)}function s(e,r,o){return Array.isArray(r)?r.map((function(r){return e.get(r,o)})):e.get(r,o)}var c=u();function a(e,r){var t=o.getCurrentInstance();if(t)return t.provides[e]||r;console.warn("inject() can only be used inside setup() or functional components.")}for(var d in exports.DEFAULT_INJECTOR=c,exports.INJECTOR_KEY=t,exports.declareProviders=function(e){var r=o.getCurrentInstance();if(!r)throw new Error("declareProviders can only be used inside setup function.");var n=a(t,c);if(n.uid===r.uid)throw new Error("declareProviders repeatedly call.");var i=u(e,n);i.uid=r.uid,o.onUnmounted((function(){i.dispose()})),o.provide(t,i)},exports.declareRootProviders=function(e){c.addProviders(e)},exports.getInjector=u,exports.getServiceFromInjector=s,exports.inject=a,exports.useRootService=function(e,r){return s(c,e,r)},exports.useService=function(e,r){return s(a(t,c),e,r)},r)"default"===d||exports.hasOwnProperty(d)||(exports[d]=r[d]);
10
+ "use strict";var e=require("@babel/runtime/helpers/typeof");Object.defineProperty(exports,"__esModule",{value:!0});var r=require("@kaokei/di"),o=require("vue"),n="USE_VUE_SERVICE_INJECTOR_KEY";function t(r){return r&&"object"===e(r)?o.reactive(r):o.ref(r)}function i(e,n){for(var t in n)r.has(n,t)&&(e[t]=o.proxyRefs(n[t]));return e}function u(e,o){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.beforeCacheHook=n.beforeCacheHook||t,n.mergePropertyHook=n.mergePropertyHook||i,new r.Injector(e,o,n)}function c(e,r,o){return Array.isArray(r)?r.map((function(r){return e.get(r,o)})):e.get(r,o)}var s=u();function a(e,r){var n=o.getCurrentInstance();if(n)return n.provides[e]||r;console.warn("inject() can only be used inside setup() or functional components.")}for(var d in exports.DEFAULT_INJECTOR=s,exports.INJECTOR_KEY=n,exports.createInjector=u,exports.declareProviders=function(e){var r=o.getCurrentInstance();if(!r)throw new Error("declareProviders can only be used inside setup function.");var t=a(n,s);if(t.uid===r.uid)throw new Error("declareProviders can only be called once.");var i=u(e,t);i.uid=r.uid,o.onUnmounted((function(){i.dispose()})),o.provide(n,i)},exports.declareRootProviders=function(e){s.addProviders(e)},exports.getServiceFromInjector=c,exports.inject=a,exports.useRootService=function(e,r){return c(s,e,r)},exports.useService=function(e,r){return c(a(n,s),e,r)},r)"default"===d||exports.hasOwnProperty(d)||(exports[d]=r[d]);
11
11
  //# sourceMappingURL=index.cjs.runtime.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.runtime.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","addProviders"],"mappings":";;;;;;;;;gKAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,WAASF,GAETG,MAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,MAAIF,EAAQC,KACdF,EAAOE,GAAOE,YAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,WAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCQhBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,0BAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,4KCQqBC,OACzBJ,EAAWC,2BACZD,QACG,IAAIK,MAAM,gEAEZrB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAesB,MAAQN,EAASM,UAC5B,IAAID,MAAM,yCAEZE,EAAkBzB,EAAYsB,EAAWpB,GACzCuB,EAAiBD,IAAMN,EAASM,IAEtCE,eAAY,WACVD,EAAgBE,aAGlBC,UAAQxC,EAAcqC,0CAGaH,GACnCP,EAAiBc,aAAaP,4GCTDb,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON,gCAV9BM,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON"}
1
+ {"version":3,"file":"index.cjs.runtime.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","addProviders"],"mappings":";;;;;;;;;gKAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,WAASF,GAETG,MAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,MAAIF,EAAQC,KACdF,EAAOE,GAAOE,YAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,WAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCShBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,0BAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,qMCOqBC,OACzBJ,EAAWC,2BACZD,QACG,IAAIK,MAAM,gEAEZrB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAesB,MAAQN,EAASM,UAC5B,IAAID,MAAM,iDAEZE,EAAkBzB,EAAesB,EAAWpB,GAC5CuB,EAAiBD,IAAMN,EAASM,IAEtCE,eAAY,WACVD,EAAgBE,aAGlBC,UAAQxC,EAAcqC,0CASaH,GACnCP,EAAiBc,aAAaP,sFCfDb,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON,gCAV9BM,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON"}
package/dist/index.esm.js CHANGED
@@ -4,7 +4,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
4
4
  * @kaokei/use-vue-service
5
5
  * Use angular service in vue.
6
6
  *
7
- * @version 1.1.1
7
+ * @version 2.0.0
8
8
  * @author kaokei
9
9
  * @license MIT
10
10
  * @link https://github.com/kaokei/use-vue-service
@@ -32,7 +32,7 @@ function DEFAULT_MERGE_PROPERTY_HOOK(target, source) {
32
32
  return target;
33
33
  }
34
34
 
35
- function getInjector(provides, parentInjector) {
35
+ function createInjector(provides, parentInjector) {
36
36
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
37
37
  options.beforeCacheHook = options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;
38
38
  options.mergePropertyHook = options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;
@@ -49,9 +49,10 @@ function getServiceFromInjector(injector, token, options) {
49
49
  return injector.get(token, options);
50
50
  }
51
51
 
52
- var DEFAULT_INJECTOR = getInjector();
52
+ var DEFAULT_INJECTOR = createInjector();
53
53
  /**
54
54
  * 从当前组件开始查找provider
55
+ * 注意到vue本身的inject是默认从父级组件开始查找
55
56
  *
56
57
  * @export
57
58
  * @param {*} key
@@ -98,16 +99,23 @@ function declareProviders(providers) {
98
99
  var parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);
99
100
 
100
101
  if (parentInjector.uid === instance.uid) {
101
- throw new Error('declareProviders repeatedly call.');
102
+ throw new Error('declareProviders can only be called once.');
102
103
  }
103
104
 
104
- var currentInjector = getInjector(providers, parentInjector);
105
+ var currentInjector = createInjector(providers, parentInjector);
105
106
  currentInjector.uid = instance.uid;
106
107
  onUnmounted(function () {
107
108
  currentInjector.dispose();
108
109
  });
109
110
  provide(INJECTOR_KEY, currentInjector);
110
111
  }
112
+ /**
113
+ * 实际上所有Injectable的Class都是兜底到root injector中
114
+ * 不需要特意调用declareRootProviders声明
115
+ * 这个方法是用于声明不是Injectable的Class的其他类型的Provider
116
+ * @param providers
117
+ */
118
+
111
119
 
112
120
  function declareRootProviders(providers) {
113
121
  DEFAULT_INJECTOR.addProviders(providers);
@@ -122,5 +130,5 @@ function useRootService(token, options) {
122
130
  return getServiceFromInjector(DEFAULT_INJECTOR, token, options);
123
131
  }
124
132
 
125
- export { DEFAULT_INJECTOR, INJECTOR_KEY, declareProviders, declareRootProviders, getInjector, getServiceFromInjector, inject, useRootService, useService };
133
+ export { DEFAULT_INJECTOR, INJECTOR_KEY, createInjector, declareProviders, declareRootProviders, getServiceFromInjector, inject, useRootService, useService };
126
134
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":";;;;;;;;;;;;;;IAAaA,YAAY,GAAG;;ACG5B,SAASC,yBAAT,CAAmCC,OAAnC;AACE,MAAIA,OAAO,IAAI,QAAOA,OAAP,MAAmB,QAAlC,EAA4C;AAC1C,WAAOC,QAAQ,CAACD,OAAD,CAAf;AACD,GAFD,MAEO;AACL,WAAOE,GAAG,CAACF,OAAD,CAAV;AACD;AACF;;AAED,SAASG,2BAAT,CAAqCC,MAArC,EAAkDC,MAAlD;AACE,OAAK,IAAMC,GAAX,IAAkBD,MAAlB,EAA0B;AACxB,QAAIE,GAAG,CAACF,MAAD,EAASC,GAAT,CAAP,EAAsB;AACpBF,MAAAA,MAAM,CAACE,GAAD,CAAN,GAAcE,SAAS,CAACH,MAAM,CAACC,GAAD,CAAP,CAAvB;AACD;AACF;;AACD,SAAOF,MAAP;AACD;;SAEeK,YACdC,UACAC;MACAC,8EAAe;AAEfA,EAAAA,OAAO,CAACC,eAAR,GACED,OAAO,CAACC,eAAR,IAA2Bd,yBAD7B;AAEAa,EAAAA,OAAO,CAACE,iBAAR,GACEF,OAAO,CAACE,iBAAR,IAA6BX,2BAD/B;AAEA,SAAO,IAAIY,QAAJ,CAAaL,QAAb,EAAuBC,cAAvB,EAAuCC,OAAvC,CAAP;AACD;;SAEeI,uBACdC,UACAC,OACAN;AAEA,MAAIO,KAAK,CAACC,OAAN,CAAcF,KAAd,CAAJ,EAA0B;AACxB,WAAOA,KAAK,CAACG,GAAN,CAAU,UAAAC,CAAC;AAAA,aAAIL,QAAQ,CAACM,GAAT,CAAaD,CAAb,EAAgBV,OAAhB,CAAJ;AAAA,KAAX,CAAP;AACD;;AACD,SAAOK,QAAQ,CAACM,GAAT,CAAaL,KAAb,EAAoBN,OAApB,CAAP;;;ICtCWY,gBAAgB,GAAGf,WAAW;ACA3C;;;;;;;;;SAQgBgB,OAAOnB,KAAUoB;AAC/B,MAAMC,QAAQ,GAAQC,kBAAkB,EAAxC;;AACA,MAAID,QAAJ,EAAc;AACZ,QAAMjB,QAAQ,GAAGiB,QAAQ,CAACjB,QAA1B;AACA,WAAOA,QAAQ,CAACJ,GAAD,CAAR,IAAiBoB,YAAxB;AACD,GAHD,MAGO;AACLG,IAAAA,OAAO,CAACC,IAAR;AAGD;;ACZH;;;;;;;;;;;;;;;;;;;SAiBgBC,iBAAiBC;AAC/B,MAAML,QAAQ,GAAGC,kBAAkB,EAAnC;;AACA,MAAI,CAACD,QAAL,EAAe;AACb,UAAM,IAAIM,KAAJ,CAAU,0DAAV,CAAN;AACD;;AACD,MAAMtB,cAAc,GAAGc,MAAM,CAAC3B,YAAD,EAAe0B,gBAAf,CAA7B;;AACA,MAAIb,cAAc,CAACuB,GAAf,KAAuBP,QAAQ,CAACO,GAApC,EAAyC;AACvC,UAAM,IAAID,KAAJ,CAAU,mCAAV,CAAN;AACD;;AACD,MAAME,eAAe,GAAG1B,WAAW,CAACuB,SAAD,EAAYrB,cAAZ,CAAnC;AACMwB,EAAAA,eAAgB,CAACD,GAAjB,GAAuBP,QAAQ,CAACO,GAAhC;AAENE,EAAAA,WAAW,CAAC;AACVD,IAAAA,eAAe,CAACE,OAAhB;AACD,GAFU,CAAX;AAIAC,EAAAA,OAAO,CAACxC,YAAD,EAAeqC,eAAf,CAAP;AACD;;SAEeI,qBAAqBP;AACnCR,EAAAA,gBAAgB,CAACgB,YAAjB,CAA8BR,SAA9B;;;SClBcS,WAAWvB,OAAYN;AACrC,MAAMuB,eAAe,GAAGV,MAAM,CAAC3B,YAAD,EAAe0B,gBAAf,CAA9B;AACA,SAAOR,sBAAsB,CAACmB,eAAD,EAAkBjB,KAAlB,EAAyBN,OAAzB,CAA7B;AACD;;SAMe8B,eAAexB,OAAYN;AACzC,SAAOI,sBAAsB,CAACQ,gBAAD,EAAmBN,KAAnB,EAA0BN,OAA1B,CAA7B;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
@@ -3,9 +3,9 @@ function o(r){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterat
3
3
  * @kaokei/use-vue-service
4
4
  * Use angular service in vue.
5
5
  *
6
- * @version 1.1.1
6
+ * @version 2.0.0
7
7
  * @author kaokei
8
8
  * @license MIT
9
9
  * @link https://github.com/kaokei/use-vue-service
10
- */}import{Injector as r,has as e}from"@kaokei/di";export*from"@kaokei/di";import{reactive as n,ref as t,proxyRefs as i,getCurrentInstance as u,onUnmounted as f,provide as c}from"vue";var a="USE_VUE_SERVICE_INJECTOR_KEY";function d(r){return r&&"object"===o(r)?n(r):t(r)}function p(o,r){for(var n in r)e(r,n)&&(o[n]=i(r[n]));return o}function y(o,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.beforeCacheHook=n.beforeCacheHook||d,n.mergePropertyHook=n.mergePropertyHook||p,new r(o,e,n)}function s(o,r,e){return Array.isArray(r)?r.map((function(r){return o.get(r,e)})):o.get(r,e)}var l=y();function m(o,r){var e=u();if(e)return e.provides[o]||r;console.warn("inject() can only be used inside setup() or functional components.")}function v(o){var r=u();if(!r)throw new Error("declareProviders can only be used inside setup function.");var e=m(a,l);if(e.uid===r.uid)throw new Error("declareProviders repeatedly call.");var n=y(o,e);n.uid=r.uid,f((function(){n.dispose()})),c(a,n)}function b(o){l.addProviders(o)}function k(o,r){return s(m(a,l),o,r)}function E(o,r){return s(l,o,r)}export{l as DEFAULT_INJECTOR,a as INJECTOR_KEY,v as declareProviders,b as declareRootProviders,y as getInjector,s as getServiceFromInjector,m as inject,E as useRootService,k as useService};
10
+ */}import{Injector as r,has as n}from"@kaokei/di";export*from"@kaokei/di";import{reactive as e,ref as t,proxyRefs as i,getCurrentInstance as u,onUnmounted as c,provide as f}from"vue";var a="USE_VUE_SERVICE_INJECTOR_KEY";function d(r){return r&&"object"===o(r)?e(r):t(r)}function y(o,r){for(var e in r)n(r,e)&&(o[e]=i(r[e]));return o}function p(o,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e.beforeCacheHook=e.beforeCacheHook||d,e.mergePropertyHook=e.mergePropertyHook||y,new r(o,n,e)}function s(o,r,n){return Array.isArray(r)?r.map((function(r){return o.get(r,n)})):o.get(r,n)}var l=p();function m(o,r){var n=u();if(n)return n.provides[o]||r;console.warn("inject() can only be used inside setup() or functional components.")}function v(o){var r=u();if(!r)throw new Error("declareProviders can only be used inside setup function.");var n=m(a,l);if(n.uid===r.uid)throw new Error("declareProviders can only be called once.");var e=p(o,n);e.uid=r.uid,c((function(){e.dispose()})),f(a,e)}function b(o){l.addProviders(o)}function k(o,r){return s(m(a,l),o,r)}function E(o,r){return s(l,o,r)}export{l as DEFAULT_INJECTOR,a as INJECTOR_KEY,p as createInjector,v as declareProviders,b as declareRootProviders,s as getServiceFromInjector,m as inject,E as useRootService,k as useService};
11
11
  //# sourceMappingURL=index.esm.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":";;;;;;;;;4LAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,EAASF,GAETG,EAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,EAAIF,EAAQC,KACdF,EAAOE,GAAOE,EAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,EAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCQhBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,OAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,oFCQIC,EAAiBC,OACzBL,EAAWC,QACZD,QACG,IAAIM,MAAM,gEAEZtB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAeuB,MAAQP,EAASO,UAC5B,IAAID,MAAM,yCAEZE,EAAkB1B,EAAYuB,EAAWrB,GACzCwB,EAAiBD,IAAMP,EAASO,IAEtCE,GAAY,WACVD,EAAgBE,aAGlBC,EAAQzC,EAAcsC,YAGRI,EAAqBP,GACnCR,EAAiBgB,aAAaR,YClBhBS,EAAWvB,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON,YAOxC8B,EAAexB,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":";;;;;;;;;4LAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,EAASF,GAETG,EAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,EAAIF,EAAQC,KACdF,EAAOE,GAAOE,EAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,EAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCShBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,OAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,oFCOIC,EAAiBC,OACzBL,EAAWC,QACZD,QACG,IAAIM,MAAM,gEAEZtB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAeuB,MAAQP,EAASO,UAC5B,IAAID,MAAM,iDAEZE,EAAkB1B,EAAeuB,EAAWrB,GAC5CwB,EAAiBD,IAAMP,EAASO,IAEtCE,GAAY,WACVD,EAAgBE,aAGlBC,EAAQzC,EAAcsC,YASRI,EAAqBP,GACnCR,EAAiBgB,aAAaR,YCxBhBS,EAAWvB,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON,YAOxC8B,EAAexB,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON"}
@@ -4,7 +4,7 @@ import _typeof from "@babel/runtime/helpers/esm/typeof";
4
4
  * @kaokei/use-vue-service
5
5
  * Use angular service in vue.
6
6
  *
7
- * @version 1.1.1
7
+ * @version 2.0.0
8
8
  * @author kaokei
9
9
  * @license MIT
10
10
  * @link https://github.com/kaokei/use-vue-service
@@ -32,7 +32,7 @@ function DEFAULT_MERGE_PROPERTY_HOOK(target, source) {
32
32
  return target;
33
33
  }
34
34
 
35
- function getInjector(provides, parentInjector) {
35
+ function createInjector(provides, parentInjector) {
36
36
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
37
37
  options.beforeCacheHook = options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;
38
38
  options.mergePropertyHook = options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;
@@ -49,9 +49,10 @@ function getServiceFromInjector(injector, token, options) {
49
49
  return injector.get(token, options);
50
50
  }
51
51
 
52
- var DEFAULT_INJECTOR = getInjector();
52
+ var DEFAULT_INJECTOR = createInjector();
53
53
  /**
54
54
  * 从当前组件开始查找provider
55
+ * 注意到vue本身的inject是默认从父级组件开始查找
55
56
  *
56
57
  * @export
57
58
  * @param {*} key
@@ -98,16 +99,23 @@ function declareProviders(providers) {
98
99
  var parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);
99
100
 
100
101
  if (parentInjector.uid === instance.uid) {
101
- throw new Error('declareProviders repeatedly call.');
102
+ throw new Error('declareProviders can only be called once.');
102
103
  }
103
104
 
104
- var currentInjector = getInjector(providers, parentInjector);
105
+ var currentInjector = createInjector(providers, parentInjector);
105
106
  currentInjector.uid = instance.uid;
106
107
  onUnmounted(function () {
107
108
  currentInjector.dispose();
108
109
  });
109
110
  provide(INJECTOR_KEY, currentInjector);
110
111
  }
112
+ /**
113
+ * 实际上所有Injectable的Class都是兜底到root injector中
114
+ * 不需要特意调用declareRootProviders声明
115
+ * 这个方法是用于声明不是Injectable的Class的其他类型的Provider
116
+ * @param providers
117
+ */
118
+
111
119
 
112
120
  function declareRootProviders(providers) {
113
121
  DEFAULT_INJECTOR.addProviders(providers);
@@ -122,5 +130,5 @@ function useRootService(token, options) {
122
130
  return getServiceFromInjector(DEFAULT_INJECTOR, token, options);
123
131
  }
124
132
 
125
- export { DEFAULT_INJECTOR, INJECTOR_KEY, declareProviders, declareRootProviders, getInjector, getServiceFromInjector, inject, useRootService, useService };
133
+ export { DEFAULT_INJECTOR, INJECTOR_KEY, createInjector, declareProviders, declareRootProviders, getServiceFromInjector, inject, useRootService, useService };
126
134
  //# sourceMappingURL=index.esm.runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.runtime.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.runtime.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
@@ -3,9 +3,9 @@ import r from"@babel/runtime/helpers/esm/typeof";
3
3
  * @kaokei/use-vue-service
4
4
  * Use angular service in vue.
5
5
  *
6
- * @version 1.1.1
6
+ * @version 2.0.0
7
7
  * @author kaokei
8
8
  * @license MIT
9
9
  * @link https://github.com/kaokei/use-vue-service
10
- */import{Injector as e,has as o}from"@kaokei/di";export*from"@kaokei/di";import{reactive as n,ref as i,proxyRefs as t,getCurrentInstance as u,onUnmounted as a,provide as c}from"vue";var f="USE_VUE_SERVICE_INJECTOR_KEY";function d(e){return e&&"object"===r(e)?n(e):i(e)}function s(r,e){for(var n in e)o(e,n)&&(r[n]=t(e[n]));return r}function p(r,o){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.beforeCacheHook=n.beforeCacheHook||d,n.mergePropertyHook=n.mergePropertyHook||s,new e(r,o,n)}function v(r,e,o){return Array.isArray(e)?e.map((function(e){return r.get(e,o)})):r.get(e,o)}var m=p();function l(r,e){var o=u();if(o)return o.provides[r]||e;console.warn("inject() can only be used inside setup() or functional components.")}function k(r){var e=u();if(!e)throw new Error("declareProviders can only be used inside setup function.");var o=l(f,m);if(o.uid===e.uid)throw new Error("declareProviders repeatedly call.");var n=p(r,o);n.uid=e.uid,a((function(){n.dispose()})),c(f,n)}function y(r){m.addProviders(r)}function E(r,e){return v(l(f,m),r,e)}function b(r,e){return v(m,r,e)}export{m as DEFAULT_INJECTOR,f as INJECTOR_KEY,k as declareProviders,y as declareRootProviders,p as getInjector,v as getServiceFromInjector,l as inject,b as useRootService,E as useService};
10
+ */import{Injector as e,has as o}from"@kaokei/di";export*from"@kaokei/di";import{reactive as n,ref as i,proxyRefs as t,getCurrentInstance as u,onUnmounted as c,provide as a}from"vue";var f="USE_VUE_SERVICE_INJECTOR_KEY";function d(e){return e&&"object"===r(e)?n(e):i(e)}function s(r,e){for(var n in e)o(e,n)&&(r[n]=t(e[n]));return r}function p(r,o){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.beforeCacheHook=n.beforeCacheHook||d,n.mergePropertyHook=n.mergePropertyHook||s,new e(r,o,n)}function v(r,e,o){return Array.isArray(e)?e.map((function(e){return r.get(e,o)})):r.get(e,o)}var m=p();function l(r,e){var o=u();if(o)return o.provides[r]||e;console.warn("inject() can only be used inside setup() or functional components.")}function b(r){var e=u();if(!e)throw new Error("declareProviders can only be used inside setup function.");var o=l(f,m);if(o.uid===e.uid)throw new Error("declareProviders can only be called once.");var n=p(r,o);n.uid=e.uid,c((function(){n.dispose()})),a(f,n)}function k(r){m.addProviders(r)}function y(r,e){return v(l(f,m),r,e)}function E(r,e){return v(m,r,e)}export{m as DEFAULT_INJECTOR,f as INJECTOR_KEY,p as createInjector,b as declareProviders,k as declareRootProviders,v as getServiceFromInjector,l as inject,E as useRootService,y as useService};
11
11
  //# sourceMappingURL=index.esm.runtime.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.runtime.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":";;;;;;;;;2LAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,EAASF,GAETG,EAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,EAAIF,EAAQC,KACdF,EAAOE,GAAOE,EAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,EAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCQhBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,OAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,oFCQIC,EAAiBC,OACzBL,EAAWC,QACZD,QACG,IAAIM,MAAM,gEAEZtB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAeuB,MAAQP,EAASO,UAC5B,IAAID,MAAM,yCAEZE,EAAkB1B,EAAYuB,EAAWrB,GACzCwB,EAAiBD,IAAMP,EAASO,IAEtCE,GAAY,WACVD,EAAgBE,aAGlBC,EAAQzC,EAAcsC,YAGRI,EAAqBP,GACnCR,EAAiBgB,aAAaR,YClBhBS,EAAWvB,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON,YAOxC8B,EAAexB,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON"}
1
+ {"version":3,"file":"index.esm.runtime.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":";;;;;;;;;2LAAaA,EAAe,+BCG5B,SAASC,EAA0BC,UAC7BA,GAA8B,WAAnBC,EAAOD,GACbE,EAASF,GAETG,EAAIH,GAIf,SAASI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,EAAIF,EAAQC,KACdF,EAAOE,GAAOE,EAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,EAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCShBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,OAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,oFCOIC,EAAiBC,OACzBL,EAAWC,QACZD,QACG,IAAIM,MAAM,gEAEZtB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAeuB,MAAQP,EAASO,UAC5B,IAAID,MAAM,iDAEZE,EAAkB1B,EAAeuB,EAAWrB,GAC5CwB,EAAiBD,IAAMP,EAASO,IAEtCE,GAAY,WACVD,EAAgBE,aAGlBC,EAAQzC,EAAcsC,YASRI,EAAqBP,GACnCR,EAAiBgB,aAAaR,YCxBhBS,EAAWvB,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON,YAOxC8B,EAAexB,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON"}
@@ -4,7 +4,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
4
4
  * @kaokei/use-vue-service
5
5
  * Use angular service in vue.
6
6
  *
7
- * @version 1.1.1
7
+ * @version 2.0.0
8
8
  * @author kaokei
9
9
  * @license MIT
10
10
  * @link https://github.com/kaokei/use-vue-service
@@ -32,7 +32,7 @@ var UseVueService = function (exports, di, vue) {
32
32
  return target;
33
33
  }
34
34
 
35
- function getInjector(provides, parentInjector) {
35
+ function createInjector(provides, parentInjector) {
36
36
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
37
37
  options.beforeCacheHook = options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;
38
38
  options.mergePropertyHook = options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;
@@ -49,9 +49,10 @@ var UseVueService = function (exports, di, vue) {
49
49
  return injector.get(token, options);
50
50
  }
51
51
 
52
- var DEFAULT_INJECTOR = getInjector();
52
+ var DEFAULT_INJECTOR = createInjector();
53
53
  /**
54
54
  * 从当前组件开始查找provider
55
+ * 注意到vue本身的inject是默认从父级组件开始查找
55
56
  *
56
57
  * @export
57
58
  * @param {*} key
@@ -98,16 +99,23 @@ var UseVueService = function (exports, di, vue) {
98
99
  var parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);
99
100
 
100
101
  if (parentInjector.uid === instance.uid) {
101
- throw new Error('declareProviders repeatedly call.');
102
+ throw new Error('declareProviders can only be called once.');
102
103
  }
103
104
 
104
- var currentInjector = getInjector(providers, parentInjector);
105
+ var currentInjector = createInjector(providers, parentInjector);
105
106
  currentInjector.uid = instance.uid;
106
107
  vue.onUnmounted(function () {
107
108
  currentInjector.dispose();
108
109
  });
109
110
  vue.provide(INJECTOR_KEY, currentInjector);
110
111
  }
112
+ /**
113
+ * 实际上所有Injectable的Class都是兜底到root injector中
114
+ * 不需要特意调用declareRootProviders声明
115
+ * 这个方法是用于声明不是Injectable的Class的其他类型的Provider
116
+ * @param providers
117
+ */
118
+
111
119
 
112
120
  function declareRootProviders(providers) {
113
121
  DEFAULT_INJECTOR.addProviders(providers);
@@ -124,9 +132,9 @@ var UseVueService = function (exports, di, vue) {
124
132
 
125
133
  exports.DEFAULT_INJECTOR = DEFAULT_INJECTOR;
126
134
  exports.INJECTOR_KEY = INJECTOR_KEY;
135
+ exports.createInjector = createInjector;
127
136
  exports.declareProviders = declareProviders;
128
137
  exports.declareRootProviders = declareRootProviders;
129
- exports.getInjector = getInjector;
130
138
  exports.getServiceFromInjector = getServiceFromInjector;
131
139
  exports.inject = inject;
132
140
  exports.useRootService = useRootService;
@@ -1 +1 @@
1
- {"version":3,"file":"index.iife.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":";;;;;;;;;;;;;;MAAaA,YAAY,GAAG;;ACG5B,WAASC,yBAAT,CAAmCC,OAAnC;AACE,QAAIA,OAAO,IAAI,QAAOA,OAAP,MAAmB,QAAlC,EAA4C;AAC1C,aAAOC,YAAAA,CAASD,OAATC,CAAP;AACD,KAFD,MAEO;AACL,aAAOC,OAAAA,CAAIF,OAAJE,CAAP;AACD;AACF;;AAED,WAASC,2BAAT,CAAqCC,MAArC,EAAkDC,MAAlD;AACE,SAAK,IAAMC,GAAX,IAAkBD,MAAlB,EAA0B;AACxB,UAAIE,MAAAA,CAAIF,MAAJE,EAAYD,GAAZC,CAAJ,EAAsB;AACpBH,QAAAA,MAAM,CAACE,GAAD,CAAN,GAAcE,aAAAA,CAAUH,MAAM,CAACC,GAAD,CAAhBE,CAAd;AACD;AACF;;AACD,WAAOJ,MAAP;AACD;;WAEeK,YACdC,UACAC;QACAC,8EAAe;AAEfA,IAAAA,OAAO,CAACC,eAAR,GACED,OAAO,CAACC,eAAR,IAA2Bd,yBAD7B;AAEAa,IAAAA,OAAO,CAACE,iBAAR,GACEF,OAAO,CAACE,iBAAR,IAA6BX,2BAD/B;AAEA,WAAO,IAAIY,WAAJ,CAAaL,QAAb,EAAuBC,cAAvB,EAAuCC,OAAvC,CAAP;AACD;;WAEeI,uBACdC,UACAC,OACAN;AAEA,QAAIO,KAAK,CAACC,OAAN,CAAcF,KAAd,CAAJ,EAA0B;AACxB,aAAOA,KAAK,CAACG,GAAN,CAAU,UAAAC,CAAC;AAAA,eAAIL,QAAQ,CAACM,GAAT,CAAaD,CAAb,EAAgBV,OAAhB,CAAJ;AAAA,OAAX,CAAP;AACD;;AACD,WAAOK,QAAQ,CAACM,GAAT,CAAaL,KAAb,EAAoBN,OAApB,CAAP;;;MCtCWY,gBAAgB,GAAGf,WAAW;ACA3C;;;;;;;;;WAQgBgB,OAAOnB,KAAUoB;AAC/B,QAAMC,QAAQ,GAAQC,sBAAAA,EAAtB;;AACA,QAAID,QAAJ,EAAc;AACZ,UAAMjB,QAAQ,GAAGiB,QAAQ,CAACjB,QAA1B;AACA,aAAOA,QAAQ,CAACJ,GAAD,CAAR,IAAiBoB,YAAxB;AACD,KAHD,MAGO;AACLG,MAAAA,OAAO,CAACC,IAAR;AAGD;;ACZH;;;;;;;;;;;;;;;;;;;WAiBgBC,iBAAiBC;AAC/B,QAAML,QAAQ,GAAGC,sBAAAA,EAAjB;;AACA,QAAI,CAACD,QAAL,EAAe;AACb,YAAM,IAAIM,KAAJ,CAAU,0DAAV,CAAN;AACD;;AACD,QAAMtB,cAAc,GAAGc,MAAM,CAAC3B,YAAD,EAAe0B,gBAAf,CAA7B;;AACA,QAAIb,cAAc,CAACuB,GAAf,KAAuBP,QAAQ,CAACO,GAApC,EAAyC;AACvC,YAAM,IAAID,KAAJ,CAAU,mCAAV,CAAN;AACD;;AACD,QAAME,eAAe,GAAG1B,WAAW,CAACuB,SAAD,EAAYrB,cAAZ,CAAnC;AACMwB,IAAAA,eAAgB,CAACD,GAAjB,GAAuBP,QAAQ,CAACO,GAAhC;AAENE,IAAAA,eAAAA,CAAY;AACVD,MAAAA,eAAe,CAACE,OAAhB;AACD,KAFDD;AAIAE,IAAAA,WAAAA,CAAQxC,YAARwC,EAAsBH,eAAtBG;AACD;;WAEeC,qBAAqBP;AACnCR,IAAAA,gBAAgB,CAACgB,YAAjB,CAA8BR,SAA9B;;;WClBcS,WAAWvB,OAAYN;AACrC,QAAMuB,eAAe,GAAGV,MAAM,CAAC3B,YAAD,EAAe0B,gBAAf,CAA9B;AACA,WAAOR,sBAAsB,CAACmB,eAAD,EAAkBjB,KAAlB,EAAyBN,OAAzB,CAA7B;AACD;;WAMe8B,eAAexB,OAAYN;AACzC,WAAOI,sBAAsB,CAACQ,gBAAD,EAAmBN,KAAnB,EAA0BN,OAA1B,CAA7B;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.iife.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","declareProviders","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","declareRootProviders","addProviders","useService","useRootService"],"mappings":"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"}
@@ -3,9 +3,9 @@ function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof S
3
3
  * @kaokei/use-vue-service
4
4
  * Use angular service in vue.
5
5
  *
6
- * @version 1.1.1
6
+ * @version 2.0.0
7
7
  * @author kaokei
8
8
  * @license MIT
9
9
  * @link https://github.com/kaokei/use-vue-service
10
- */}var UseVueService=function(e,r,o){"use strict";var n="USE_VUE_SERVICE_INJECTOR_KEY";function t(e){return e&&"object"===_typeof(e)?o.reactive(e):o.ref(e)}function i(e,n){for(var t in n)r.has(n,t)&&(e[t]=o.proxyRefs(n[t]));return e}function u(e,o){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.beforeCacheHook=n.beforeCacheHook||t,n.mergePropertyHook=n.mergePropertyHook||i,new r.Injector(e,o,n)}function c(e,r,o){return Array.isArray(r)?r.map((function(r){return e.get(r,o)})):e.get(r,o)}var f=u();function a(e,r){var n=o.getCurrentInstance();if(n)return n.provides[e]||r;console.warn("inject() can only be used inside setup() or functional components.")}for(var s in e.DEFAULT_INJECTOR=f,e.INJECTOR_KEY=n,e.declareProviders=function(e){var r=o.getCurrentInstance();if(!r)throw new Error("declareProviders can only be used inside setup function.");var t=a(n,f);if(t.uid===r.uid)throw new Error("declareProviders repeatedly call.");var i=u(e,t);i.uid=r.uid,o.onUnmounted((function(){i.dispose()})),o.provide(n,i)},e.declareRootProviders=function(e){f.addProviders(e)},e.getInjector=u,e.getServiceFromInjector=c,e.inject=a,e.useRootService=function(e,r){return c(f,e,r)},e.useService=function(e,r){return c(a(n,f),e,r)},r)"default"===s||e.hasOwnProperty(s)||(e[s]=r[s]);return Object.defineProperty(e,"__esModule",{value:!0}),e}({},DI,Vue);
10
+ */}var UseVueService=function(e,r,o){"use strict";var n="USE_VUE_SERVICE_INJECTOR_KEY";function t(e){return e&&"object"===_typeof(e)?o.reactive(e):o.ref(e)}function i(e,n){for(var t in n)r.has(n,t)&&(e[t]=o.proxyRefs(n[t]));return e}function u(e,o){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.beforeCacheHook=n.beforeCacheHook||t,n.mergePropertyHook=n.mergePropertyHook||i,new r.Injector(e,o,n)}function c(e,r,o){return Array.isArray(r)?r.map((function(r){return e.get(r,o)})):e.get(r,o)}var f=u();function a(e,r){var n=o.getCurrentInstance();if(n)return n.provides[e]||r;console.warn("inject() can only be used inside setup() or functional components.")}for(var s in e.DEFAULT_INJECTOR=f,e.INJECTOR_KEY=n,e.createInjector=u,e.declareProviders=function(e){var r=o.getCurrentInstance();if(!r)throw new Error("declareProviders can only be used inside setup function.");var t=a(n,f);if(t.uid===r.uid)throw new Error("declareProviders can only be called once.");var i=u(e,t);i.uid=r.uid,o.onUnmounted((function(){i.dispose()})),o.provide(n,i)},e.declareRootProviders=function(e){f.addProviders(e)},e.getServiceFromInjector=c,e.inject=a,e.useRootService=function(e,r){return c(f,e,r)},e.useService=function(e,r){return c(a(n,f),e,r)},r)"default"===s||e.hasOwnProperty(s)||(e[s]=r[s]);return Object.defineProperty(e,"__esModule",{value:!0}),e}({},DI,Vue);
11
11
  //# sourceMappingURL=index.iife.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.iife.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function getInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { getInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = getInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { getInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders repeatedly call.');\n }\n const currentInjector = getInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","getInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","addProviders"],"mappings":";;;;;;;;;uDAAaA,EAAe,wCCGnBC,EAA0BC,UAC7BA,GAA8B,WAAnBC,QAAOD,GACbE,WAASF,GAETG,MAAIH,YAINI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,MAAIF,EAAQC,KACdF,EAAOE,GAAOE,YAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,WAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCQhBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,0BAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,0JCQqBC,OACzBJ,EAAWC,2BACZD,QACG,IAAIK,MAAM,gEAEZrB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAesB,MAAQN,EAASM,UAC5B,IAAID,MAAM,yCAEZE,EAAkBzB,EAAYsB,EAAWpB,GACzCuB,EAAiBD,IAAMN,EAASM,IAEtCE,eAAY,WACVD,EAAgBE,aAGlBC,UAAQxC,EAAcqC,oCAGaH,GACnCP,EAAiBc,aAAaP,oFCTDb,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON,0BAV9BM,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON"}
1
+ {"version":3,"file":"index.iife.min.js","sources":["../src/constants.ts","../src/utils.ts","../src/defaultInjector.ts","../src/fakeInject.ts","../src/declareProviders.ts","../src/useService.ts"],"sourcesContent":["export const INJECTOR_KEY = 'USE_VUE_SERVICE_INJECTOR_KEY';\n","import { reactive, ref, proxyRefs } from 'vue';\nimport { Injector, has } from '@kaokei/di';\n\nfunction DEFAULT_BEFORE_CACHE_HOOK(service: any) {\n if (service && typeof service === 'object') {\n return reactive(service);\n } else {\n return ref(service);\n }\n}\n\nfunction DEFAULT_MERGE_PROPERTY_HOOK(target: any, source: any) {\n for (const key in source) {\n if (has(source, key)) {\n target[key] = proxyRefs(source[key]);\n }\n }\n return target;\n}\n\nexport function createInjector(\n provides?: any[],\n parentInjector?: Injector,\n options: any = {}\n) {\n options.beforeCacheHook =\n options.beforeCacheHook || DEFAULT_BEFORE_CACHE_HOOK;\n options.mergePropertyHook =\n options.mergePropertyHook || DEFAULT_MERGE_PROPERTY_HOOK;\n return new Injector(provides, parentInjector, options);\n}\n\nexport function getServiceFromInjector(\n injector: Injector,\n token: any,\n options?: any\n) {\n if (Array.isArray(token)) {\n return token.map(t => injector.get(t, options));\n }\n return injector.get(token, options);\n}\n","import { createInjector } from './utils';\n\nexport const DEFAULT_INJECTOR = createInjector();\n","import { getCurrentInstance } from 'vue';\n\n/**\n * 从当前组件开始查找provider\n * 注意到vue本身的inject是默认从父级组件开始查找\n *\n * @export\n * @param {*} key\n * @param {*} defaultValue\n * @return {*}\n */\nexport function inject(key: any, defaultValue: any) {\n const instance: any = getCurrentInstance();\n if (instance) {\n const provides = instance.provides;\n return provides[key] || defaultValue;\n } else {\n console.warn(\n `inject() can only be used inside setup() or functional components.`\n );\n }\n}\n","import { provide, getCurrentInstance, onUnmounted } from 'vue';\nimport { INJECTOR_KEY } from './constants';\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { inject } from './fakeInject';\nimport { createInjector } from './utils';\n\n/**\n * 类组件可以通过装饰器声明providers,内部实际上也是调用的declareProviders方法\n * 但是options组件或者defineComponent组件则必须在setup函数中手动调用declareProviders方法\n * 我有考虑过增加一个option,比如providers,就像vue-rx增加了subscriptions属性一样。\n * 最终没有实现,是因为一方面实现成本有点高(我不会。。。)\n * 还有一种思路就是包装defineComponent,代理setup函数,把providers属性转为declareProviders函数调用。\n * 这种做法的成本是最低的,但是有两点限制,第一用户可以不使用defineComponent来定义组件,第二用户得转变使用习惯,从我的包里面导入defineComponent\n * 还考虑到官网的示例代码中也是直接在setup函数中调用provide函数,而且vue2.x版本中就是采用的provide/inject属性来配置。vue3中已经转为函数了\n * 我觉得我也没有必要一定为了追求声明式代码,强制实现声明式功能\n *\n * 1. 需要解决重复调用的问题\n * 2. 不能直接利用原型来索引,因为provide不仅仅是string|symbol,还可能是类\n * 从这个角度来看,我的declareProviders可以看作是原生vue的provide的升级版本\n *\n * @export\n * @param {any[]} providers\n */\nexport function declareProviders(providers: any[]) {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('declareProviders can only be used inside setup function.');\n }\n const parentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n if (parentInjector.uid === instance.uid) {\n throw new Error('declareProviders can only be called once.');\n }\n const currentInjector = createInjector(providers, parentInjector);\n (<any>currentInjector).uid = instance.uid;\n\n onUnmounted(() => {\n currentInjector.dispose();\n });\n\n provide(INJECTOR_KEY, currentInjector);\n}\n\n/**\n * 实际上所有Injectable的Class都是兜底到root injector中\n * 不需要特意调用declareRootProviders声明\n * 这个方法是用于声明不是Injectable的Class的其他类型的Provider\n * @param providers\n */\nexport function declareRootProviders(providers: any[]) {\n DEFAULT_INJECTOR.addProviders(providers);\n}\n","import { inject } from './fakeInject';\n\nimport { INJECTOR_KEY } from './constants';\n\nimport { DEFAULT_INJECTOR } from './defaultInjector';\n\nimport { getServiceFromInjector } from './utils';\n\nimport { Ref } from 'vue';\n\nimport { InjectionKey } from '@kaokei/di';\n\ntype Ret<T> = T extends new (...args: any) => infer S\n ? S\n : T extends InjectionKey<infer M>\n ? Ret<M>\n : T extends string | number | boolean\n ? Ref<T>\n : T extends Array<any>\n ? { [P in keyof T]: Ret<T[P]> }\n : T;\n\nexport function useService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useService(token: any, options?: any) {\n const currentInjector = inject(INJECTOR_KEY, DEFAULT_INJECTOR);\n return getServiceFromInjector(currentInjector, token, options);\n}\n\nexport function useRootService<R, T = unknown>(\n token: T,\n options?: any\n): T extends R ? Ret<T> : Ret<R>;\nexport function useRootService(token: any, options?: any) {\n return getServiceFromInjector(DEFAULT_INJECTOR, token, options);\n}\n"],"names":["INJECTOR_KEY","DEFAULT_BEFORE_CACHE_HOOK","service","_typeof","reactive","ref","DEFAULT_MERGE_PROPERTY_HOOK","target","source","key","has","proxyRefs","createInjector","provides","parentInjector","options","beforeCacheHook","mergePropertyHook","Injector","getServiceFromInjector","injector","token","Array","isArray","map","t","get","DEFAULT_INJECTOR","inject","defaultValue","instance","getCurrentInstance","console","warn","providers","Error","uid","currentInjector","onUnmounted","dispose","provide","addProviders"],"mappings":";;;;;;;;;uDAAaA,EAAe,wCCGnBC,EAA0BC,UAC7BA,GAA8B,WAAnBC,QAAOD,GACbE,WAASF,GAETG,MAAIH,YAINI,EAA4BC,EAAaC,OAC3C,IAAMC,KAAOD,EACZE,MAAIF,EAAQC,KACdF,EAAOE,GAAOE,YAAUH,EAAOC,YAG5BF,WAGOK,EACdC,EACAC,OACAC,yDAAe,UAEfA,EAAQC,gBACND,EAAQC,iBAAmBf,EAC7Bc,EAAQE,kBACNF,EAAQE,mBAAqBX,EACxB,IAAIY,WAASL,EAAUC,EAAgBC,YAGhCI,EACdC,EACAC,EACAN,UAEIO,MAAMC,QAAQF,GACTA,EAAMG,KAAI,SAAAC,UAAKL,EAASM,IAAID,EAAGV,MAEjCK,EAASM,IAAIL,EAAON,OCtChBY,EAAmBf,aCShBgB,EAAOnB,EAAUoB,OACzBC,EAAgBC,0BAClBD,SACeA,EAASjB,SACVJ,IAAQoB,EAExBG,QAAQC,6KCOqBC,OACzBJ,EAAWC,2BACZD,QACG,IAAIK,MAAM,gEAEZrB,EAAiBc,EAAO5B,EAAc2B,MACxCb,EAAesB,MAAQN,EAASM,UAC5B,IAAID,MAAM,iDAEZE,EAAkBzB,EAAesB,EAAWpB,GAC5CuB,EAAiBD,IAAMN,EAASM,IAEtCE,eAAY,WACVD,EAAgBE,aAGlBC,UAAQxC,EAAcqC,oCASaH,GACnCP,EAAiBc,aAAaP,oECfDb,EAAYN,UAClCI,EAAuBQ,EAAkBN,EAAON,0BAV9BM,EAAYN,UAE9BI,EADiBS,EAAO5B,EAAc2B,GACEN,EAAON"}
@@ -16,5 +16,11 @@
16
16
  * @param {any[]} providers
17
17
  */
18
18
  export declare function declareProviders(providers: any[]): void;
19
+ /**
20
+ * 实际上所有Injectable的Class都是兜底到root injector中
21
+ * 不需要特意调用declareRootProviders声明
22
+ * 这个方法是用于声明不是Injectable的Class的其他类型的Provider
23
+ * @param providers
24
+ */
19
25
  export declare function declareRootProviders(providers: any[]): void;
20
26
  //# sourceMappingURL=declareProviders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"declareProviders.d.ts","sourceRoot":"","sources":["declareProviders.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,QAiBhD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,QAEpD"}
1
+ {"version":3,"file":"declareProviders.d.ts","sourceRoot":"","sources":["declareProviders.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,QAiBhD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,QAEpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"defaultInjector.d.ts","sourceRoot":"","sources":["defaultInjector.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,+BAAgB,CAAC"}
1
+ {"version":3,"file":"defaultInjector.d.ts","sourceRoot":"","sources":["defaultInjector.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,+BAAmB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * 从当前组件开始查找provider
3
+ * 注意到vue本身的inject是默认从父级组件开始查找
3
4
  *
4
5
  * @export
5
6
  * @param {*} key
@@ -1 +1 @@
1
- {"version":3,"file":"fakeInject.d.ts","sourceRoot":"","sources":["fakeInject.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,OAUjD"}
1
+ {"version":3,"file":"fakeInject.d.ts","sourceRoot":"","sources":["fakeInject.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,OAUjD"}
@@ -4,5 +4,5 @@ export { useService, useRootService } from './useService';
4
4
  export { INJECTOR_KEY } from './constants';
5
5
  export { DEFAULT_INJECTOR } from './defaultInjector';
6
6
  export { inject } from './fakeInject';
7
- export { getInjector, getServiceFromInjector } from './utils';
7
+ export { createInjector, getServiceFromInjector } from './utils';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { Injector } from '@kaokei/di';
2
- export declare function getInjector(provides?: any[], parentInjector?: Injector, options?: any): Injector;
2
+ export declare function createInjector(provides?: any[], parentInjector?: Injector, options?: any): Injector;
3
3
  export declare function getServiceFromInjector(injector: Injector, token: any, options?: any): any;
4
4
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAO,MAAM,YAAY,CAAC;AAmB3C,wBAAgB,WAAW,CACzB,QAAQ,CAAC,EAAE,GAAG,EAAE,EAChB,cAAc,CAAC,EAAE,QAAQ,EACzB,OAAO,GAAE,GAAQ,YAOlB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,GAAG,OAMd"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAO,MAAM,YAAY,CAAC;AAmB3C,wBAAgB,cAAc,CAC5B,QAAQ,CAAC,EAAE,GAAG,EAAE,EAChB,cAAc,CAAC,EAAE,QAAQ,EACzB,OAAO,GAAE,GAAQ,YAOlB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,GAAG,OAMd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaokei/use-vue-service",
3
- "version": "1.1.1",
3
+ "version": "2.0.0",
4
4
  "description": "Use angular service in vue.",
5
5
  "main": "./dist/index.cjs.runtime.min.js",
6
6
  "module": "./dist/index.esm.runtime.min.js",
@@ -48,7 +48,7 @@
48
48
  "commit": "git-cz"
49
49
  },
50
50
  "dependencies": {
51
- "@kaokei/di": "^1.1.0"
51
+ "@kaokei/di": "^2.0.0"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "reflect-metadata": "^0.1.13",
package/CHANGELOG.md DELETED
@@ -1,79 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
-
5
- ### [1.1.1](https://github.com/kaokei/use-vue-service/compare/v1.1.0...v1.1.1) (2022-03-30)
6
-
7
-
8
- ### Bug Fixes
9
-
10
- * **useservice:** 支持InjectionKey ([17313cd](https://github.com/kaokei/use-vue-service/commit/17313cd116176b8e4a45aaf05e4901514c3125b8))
11
-
12
- ## [1.1.0](https://github.com/kaokei/use-vue-service/compare/v1.0.18...v1.1.0) (2022-02-16)
13
-
14
-
15
- ### Features
16
-
17
- * **bootstrap:** 删除bootstrap功能 ([de43690](https://github.com/kaokei/use-vue-service/commit/de43690c532209859b94f53652e248a455a56eb1))
18
- * **di:** 基于新版di重新重构了一般,并完善了单元测试用例 ([845c8f9](https://github.com/kaokei/use-vue-service/commit/845c8f9e2df5de19f7cef2b7035770a8070870be))
19
-
20
- ### [1.0.18](https://github.com/kaokei/use-vue-service/compare/v1.0.17...v1.0.18) (2021-11-24)
21
-
22
-
23
- ### Features
24
-
25
- * **bootstrap:** 增加bootstrap启动vue应用的入口 ([d7f1fca](https://github.com/kaokei/use-vue-service/commit/d7f1fca7711a7c22e599bdf68278cdc8a66fdad5))
26
- * **bootstrap:** 重构了bootstrap逻辑 ([9cb1cae](https://github.com/kaokei/use-vue-service/commit/9cb1cae170352ddb26e2451e0b97a2a2015c1b4b))
27
-
28
- ### [1.0.17](https://github.com/kaokei/use-vue-service/compare/v1.0.16...v1.0.17) (2021-10-12)
29
-
30
-
31
- ### Features
32
-
33
- * **useservice:** 直接获取根injector中的服务 ([92f1d0d](https://github.com/kaokei/use-vue-service/commit/92f1d0d77661c582ed89cecc55bede01252330d0))
34
-
35
- ### [1.0.16](https://github.com/kaokei/use-vue-service/compare/v1.0.15...v1.0.16) (2021-10-07)
36
-
37
- ### [1.0.15](https://github.com/kaokei/use-vue-service/compare/v1.0.14...v1.0.15) (2021-08-22)
38
-
39
-
40
- ### Features
41
-
42
- * **update:** 升级@kaokei/di ([6064c4e](https://github.com/kaokei/use-vue-service/commit/6064c4e1b7fcd102f287bea03a1984c1621d2884))
43
-
44
- ### [1.0.14](https://github.com/kaokei/use-vue-service/compare/v1.0.13...v1.0.14) (2021-08-06)
45
-
46
-
47
- ### Features
48
-
49
- * **dispose:** 删除了vue-class-component,并支持了服务的dispose功能 ([cad0454](https://github.com/kaokei/use-vue-service/commit/cad045461b6fd617a85456cc98a45ecf42406341))
50
- * **example:** 增加__DEV__ ([757b7ef](https://github.com/kaokei/use-vue-service/commit/757b7ef6866ad16d3a77b2d3ec4e0648bcba7369))
51
- * **plugin:** 支持vue plugin ([a4cee12](https://github.com/kaokei/use-vue-service/commit/a4cee12f1607dbee81dae5f0cf55efdbcae29be1))
52
-
53
- ### [1.0.13](https://github.com/kaokei/use-vue-service/compare/v1.0.12...v1.0.13) (2021-06-30)
54
-
55
-
56
- ### Bug Fixes
57
-
58
- * **ci:** add globals ([49b3d34](https://github.com/kaokei/use-vue-service/commit/49b3d3408d2caeaa767195551e7c152cd97cbff6))
59
-
60
- ### [1.0.12](https://github.com/kaokei/use-vue-service/compare/v1.0.11...v1.0.12) (2021-06-30)
61
-
62
-
63
- ### Bug Fixes
64
-
65
- * **ci:** inline @kaokei/di ([7ced072](https://github.com/kaokei/use-vue-service/commit/7ced07291f45cd380f26da96a650a8581c9e6c8e))
66
-
67
- ### 1.0.11 (2021-06-30)
68
-
69
-
70
- ### Features
71
-
72
- * **di:** use @kaokei/di to support di ([e937cba](https://github.com/kaokei/use-vue-service/commit/e937cba4379ec87a3b139a6132509b5216409c09))
73
-
74
- ### 1.0.3 (2021-06-30)
75
-
76
-
77
- ### Features
78
-
79
- * **di:** use @kaokei/di to support di ([e937cba](https://github.com/kaokei/use-vue-service/commit/e937cba4379ec87a3b139a6132509b5216409c09))