@kaokei/use-vue-service 1.1.0 → 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/README.md +7 -65
- package/dist/index.cjs.js +14 -8
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +2 -2
- package/dist/index.cjs.min.js.map +1 -1
- package/dist/index.cjs.runtime.js +14 -8
- package/dist/index.cjs.runtime.js.map +1 -1
- package/dist/index.cjs.runtime.min.js +2 -2
- package/dist/index.cjs.runtime.min.js.map +1 -1
- package/dist/index.esm.js +14 -8
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +2 -2
- package/dist/index.esm.min.js.map +1 -1
- package/dist/index.esm.runtime.js +14 -8
- package/dist/index.esm.runtime.js.map +1 -1
- package/dist/index.esm.runtime.min.js +2 -2
- package/dist/index.esm.runtime.min.js.map +1 -1
- package/dist/index.iife.js +14 -8
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +2 -2
- package/dist/index.iife.min.js.map +1 -1
- package/dist/src/declareProviders.d.ts +6 -0
- package/dist/src/declareProviders.d.ts.map +1 -1
- package/dist/src/defaultInjector.d.ts.map +1 -1
- package/dist/src/fakeInject.d.ts +1 -0
- package/dist/src/fakeInject.d.ts.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/useService.d.ts +2 -1
- package/dist/src/useService.d.ts.map +1 -1
- package/dist/src/utils.d.ts +1 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/package.json +2 -2
- package/CHANGELOG.md +0 -72
package/README.md
CHANGED
|
@@ -5,53 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
</div>
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
- [documentation](https://kaokei.com/project/use-vue-service/)
|
|
9
|
+
- [online playground](https://kaokei.com/project/use-vue-service/)
|
|
10
|
+
- [online demo](https://use-vue-service.vercel.app/)
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- package.json 中的 homepage,bugs-url,repository-url 这些外部链接。
|
|
14
|
-
- README.md 中的 github 地址。
|
|
15
|
-
|
|
16
|
-
## github 地址
|
|
17
|
-
|
|
18
|
-
- [github](https://github.com/kaokei/use-vue-service)
|
|
19
|
-
|
|
20
|
-
## 解决了什么问题?
|
|
21
|
-
|
|
22
|
-
## 整体方案以及使用方式
|
|
23
|
-
|
|
24
|
-
## 特性
|
|
25
|
-
|
|
26
|
-
使用 typescript,并且类型定义统一在 types 文件夹中,建议使用 module 来管理类型,而不是 script 来创建全局的类型。
|
|
27
|
-
`tsconfig.json`作为编辑器的默认配置文件,方便编辑器识别。实际构建时使用`tsconfig.app.json`文件
|
|
28
|
-
|
|
29
|
-
使用 esm 模块化规范
|
|
30
|
-
|
|
31
|
-
使用 npm 作为包管理
|
|
32
|
-
|
|
33
|
-
使用 git 作为代码版本工具。
|
|
34
|
-
|
|
35
|
-
编码规范使用 eslint+prettier+editorconfig
|
|
36
|
-
|
|
37
|
-
git commit message 采用 angular 规范,以及使用 commitlint 校验
|
|
38
|
-
|
|
39
|
-
使用 yorkie 自动化校验并格式化代码,自动化校验 commit message
|
|
40
|
-
|
|
41
|
-
使用 jest 作为单元测试,统一放在`tests`文件夹中。
|
|
42
|
-
|
|
43
|
-
可以在 playground 中进行代码实验,使用 vscode 配置.vscode/launch.json 可以调试 nodejs
|
|
44
|
-
|
|
45
|
-
使用 rollup 作为打包工具,同时打包出多个版本的 bundle。支持压缩/未压缩、使用 runtime/不使用 runtime、commonjs/esm、浏览器版本总共 10 个版本。
|
|
46
|
-
|
|
47
|
-
npm run release:first 第一次发布,会自动创建 CHANGELOG.md 文件
|
|
48
|
-
npm run release patch 发布新版本
|
|
49
|
-
|
|
50
|
-
使用 MIT 作为开源协议
|
|
51
|
-
|
|
52
|
-
# 官网
|
|
53
|
-
|
|
54
|
-
- [documentation](https://use-vue-service-demo.vercel.app/)
|
|
12
|
+
```bash
|
|
13
|
+
npm install @kaokei/use-vue-service @kaokei/di reflect-metadata
|
|
14
|
+
```
|
|
55
15
|
|
|
56
16
|
## 简介
|
|
57
17
|
|
|
@@ -79,22 +39,4 @@ npm run release patch 发布新版本
|
|
|
79
39
|
- 使用 eslint 配合 husky 以及 lint-stage 自动格式化提交的代码,保证 git 仓库代码的规范性
|
|
80
40
|
- 使用 rollup 打包源码
|
|
81
41
|
|
|
82
|
-
##
|
|
83
|
-
|
|
84
|
-
1. 本来是想实现@Skip 可以指定跳过的次数,后来废弃了这个特性,只是实现了@Skip。
|
|
85
|
-
|
|
86
|
-
理由是不建议通过@Skip 来实现复杂命名空间的作用,我们可以利用 useClass 指向同一个 Service,但是提供不同的 provide 来实现多个服务。
|
|
87
|
-
|
|
88
|
-
2. 服务可能是有状态的
|
|
89
|
-
|
|
90
|
-
如果服务的状态可以直接设置初始值,那么是比较方便的。
|
|
91
|
-
|
|
92
|
-
如果服务的状态需要从服务器端获取,那么就会存在异步的问题,比如父子组件共享一个服务,在服务的状态还没有初始化完毕时,子组件就已经触发了某个动作去修改服务的状态,显然就会导致状态错乱。解决方案有两种。
|
|
93
|
-
第一种:使用 rxjs 的 observable 把状态变成流,不确定是否和 reactive 有冲突
|
|
94
|
-
第二种:就在在父组件中判断服务的状态是否已经 ready,如果 ready 了才显示子组件,否则展示 loading
|
|
95
|
-
|
|
96
|
-
3. 本库的 inject 和 vue 提供的 inject 不一样,本库的 inject 是从当前组件开始寻找数据的
|
|
97
|
-
|
|
98
|
-
因为 vue3 自带的 inject 依赖了原型链,并且子组件的 provides 属性默认就是父组件的 provides,从而导致虽然是从当前组件的 provides 开始寻找的服务。但是实际上这个服务有可能是从父组件的 Injector 中获取的。
|
|
99
|
-
|
|
100
|
-
关于这一点并不打算修复,主要是因为@Self 并不是特别常用的一个方法,如果我们使用@Self,那么我们应该自己明确调用了 declareProviders。另一个原因就是为了解决这个问题会引入不必要的复杂性。比如可以通过对比组件的 uid 和 Injector 的 uid 是否一致来解决问题。
|
|
42
|
+
## MIT LICENSE
|
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
|
|
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
|
|
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 =
|
|
59
|
+
var DEFAULT_INJECTOR = createInjector();
|
|
60
60
|
/**
|
|
61
61
|
* 从当前组件开始查找provider
|
|
62
|
+
* 注意到vue本身的inject是默认从父级组件开始查找
|
|
62
63
|
*
|
|
63
64
|
* @export
|
|
64
65
|
* @param {*} key
|
|
@@ -105,18 +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
|
|
109
|
+
throw new Error('declareProviders can only be called once.');
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
var currentInjector =
|
|
112
|
+
var currentInjector = createInjector(providers, parentInjector);
|
|
112
113
|
currentInjector.uid = instance.uid;
|
|
113
114
|
vue.onUnmounted(function () {
|
|
114
115
|
currentInjector.dispose();
|
|
115
116
|
});
|
|
116
|
-
console.log('declareProviders after onUnmounted');
|
|
117
|
-
console.log(INJECTOR_KEY, providers, currentInjector, currentInjector.parent);
|
|
118
117
|
vue.provide(INJECTOR_KEY, currentInjector);
|
|
119
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* 实际上所有Injectable的Class都是兜底到root injector中
|
|
121
|
+
* 不需要特意调用declareRootProviders声明
|
|
122
|
+
* 这个方法是用于声明不是Injectable的Class的其他类型的Provider
|
|
123
|
+
* @param providers
|
|
124
|
+
*/
|
|
125
|
+
|
|
120
126
|
|
|
121
127
|
function declareRootProviders(providers) {
|
|
122
128
|
DEFAULT_INJECTOR.addProviders(providers);
|
|
@@ -133,9 +139,9 @@ function useRootService(token, options) {
|
|
|
133
139
|
|
|
134
140
|
exports.DEFAULT_INJECTOR = DEFAULT_INJECTOR;
|
|
135
141
|
exports.INJECTOR_KEY = INJECTOR_KEY;
|
|
142
|
+
exports.createInjector = createInjector;
|
|
136
143
|
exports.declareProviders = declareProviders;
|
|
137
144
|
exports.declareRootProviders = declareRootProviders;
|
|
138
|
-
exports.getInjector = getInjector;
|
|
139
145
|
exports.getServiceFromInjector = getServiceFromInjector;
|
|
140
146
|
exports.inject = inject;
|
|
141
147
|
exports.useRootService = useRootService;
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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
|
|
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":";;;;;;;;;;;;;;;;;;;;;IAAaA,YAAY,GAAG;;ACG5B,SAASC,yBAAT,CAAmCC,OAAnC;AACE,MAAIA,OAAO,IAAI,QAAOA,OAAP,MAAmB,QAAlC,EAA4C;AAC1C,WAAOC,YAAAA,CAASD,OAATC,CAAP;AACD,GAFD,MAEO;AACL,WAAOC,OAAAA,CAAIF,OAAJE,CAAP;AACD;AACF;;AAED,SAASC,2BAAT,CAAqCC,MAArC,EAAkDC,MAAlD;AACE,OAAK,IAAMC,GAAX,IAAkBD,MAAlB,EAA0B;AACxB,QAAIE,MAAAA,CAAIF,MAAJE,EAAYD,GAAZC,CAAJ,EAAsB;AACpBH,MAAAA,MAAM,CAACE,GAAD,CAAN,GAAcE,aAAAA,CAAUH,MAAM,CAACC,GAAD,CAAhBE,CAAd;AACD;AACF;;AACD,SAAOJ,MAAP;AACD;;SAEeK,eACdC,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,WAAJ,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,cAAc;ACA9C;;;;;;;;;;SASgBgB,OAAOnB,KAAUoB;AAC/B,MAAMC,QAAQ,GAAQC,sBAAAA,EAAtB;;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;;ACbH;;;;;;;;;;;;;;;;;;;SAiBgBC,iBAAiBC;AAC/B,MAAML,QAAQ,GAAGC,sBAAAA,EAAjB;;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,2CAAV,CAAN;AACD;;AACD,MAAME,eAAe,GAAG1B,cAAc,CAACuB,SAAD,EAAYrB,cAAZ,CAAtC;AACMwB,EAAAA,eAAgB,CAACD,GAAjB,GAAuBP,QAAQ,CAACO,GAAhC;AAENE,EAAAA,eAAAA,CAAY;AACVD,IAAAA,eAAe,CAACE,OAAhB;AACD,GAFDD;AAIAE,EAAAA,WAAAA,CAAQxC,YAARwC,EAAsBH,eAAtBG;AACD;AAED;;;;;;;;SAMgBC,qBAAqBP;AACnCR,EAAAA,gBAAgB,CAACgB,YAAjB,CAA8BR,SAA9B;;;SCxBcS,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;;;;;;;;;;;;;;;"}
|
package/dist/index.cjs.min.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @kaokei/use-vue-service
|
|
3
3
|
* Use angular service in vue.
|
|
4
4
|
*
|
|
5
|
-
* @version
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
59
|
+
var DEFAULT_INJECTOR = createInjector();
|
|
60
60
|
/**
|
|
61
61
|
* 从当前组件开始查找provider
|
|
62
|
+
* 注意到vue本身的inject是默认从父级组件开始查找
|
|
62
63
|
*
|
|
63
64
|
* @export
|
|
64
65
|
* @param {*} key
|
|
@@ -105,18 +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
|
|
109
|
+
throw new Error('declareProviders can only be called once.');
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
var currentInjector =
|
|
112
|
+
var currentInjector = createInjector(providers, parentInjector);
|
|
112
113
|
currentInjector.uid = instance.uid;
|
|
113
114
|
vue.onUnmounted(function () {
|
|
114
115
|
currentInjector.dispose();
|
|
115
116
|
});
|
|
116
|
-
console.log('declareProviders after onUnmounted');
|
|
117
|
-
console.log(INJECTOR_KEY, providers, currentInjector, currentInjector.parent);
|
|
118
117
|
vue.provide(INJECTOR_KEY, currentInjector);
|
|
119
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* 实际上所有Injectable的Class都是兜底到root injector中
|
|
121
|
+
* 不需要特意调用declareRootProviders声明
|
|
122
|
+
* 这个方法是用于声明不是Injectable的Class的其他类型的Provider
|
|
123
|
+
* @param providers
|
|
124
|
+
*/
|
|
125
|
+
|
|
120
126
|
|
|
121
127
|
function declareRootProviders(providers) {
|
|
122
128
|
DEFAULT_INJECTOR.addProviders(providers);
|
|
@@ -133,9 +139,9 @@ function useRootService(token, options) {
|
|
|
133
139
|
|
|
134
140
|
exports.DEFAULT_INJECTOR = DEFAULT_INJECTOR;
|
|
135
141
|
exports.INJECTOR_KEY = INJECTOR_KEY;
|
|
142
|
+
exports.createInjector = createInjector;
|
|
136
143
|
exports.declareProviders = declareProviders;
|
|
137
144
|
exports.declareRootProviders = declareRootProviders;
|
|
138
|
-
exports.getInjector = getInjector;
|
|
139
145
|
exports.getServiceFromInjector = getServiceFromInjector;
|
|
140
146
|
exports.inject = inject;
|
|
141
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
|
|
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
|
|
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"),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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
52
|
+
var DEFAULT_INJECTOR = createInjector();
|
|
53
53
|
/**
|
|
54
54
|
* 从当前组件开始查找provider
|
|
55
|
+
* 注意到vue本身的inject是默认从父级组件开始查找
|
|
55
56
|
*
|
|
56
57
|
* @export
|
|
57
58
|
* @param {*} key
|
|
@@ -98,18 +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
|
|
102
|
+
throw new Error('declareProviders can only be called once.');
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
var currentInjector =
|
|
105
|
+
var currentInjector = createInjector(providers, parentInjector);
|
|
105
106
|
currentInjector.uid = instance.uid;
|
|
106
107
|
onUnmounted(function () {
|
|
107
108
|
currentInjector.dispose();
|
|
108
109
|
});
|
|
109
|
-
console.log('declareProviders after onUnmounted');
|
|
110
|
-
console.log(INJECTOR_KEY, providers, currentInjector, currentInjector.parent);
|
|
111
110
|
provide(INJECTOR_KEY, currentInjector);
|
|
112
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* 实际上所有Injectable的Class都是兜底到root injector中
|
|
114
|
+
* 不需要特意调用declareRootProviders声明
|
|
115
|
+
* 这个方法是用于声明不是Injectable的Class的其他类型的Provider
|
|
116
|
+
* @param providers
|
|
117
|
+
*/
|
|
118
|
+
|
|
113
119
|
|
|
114
120
|
function declareRootProviders(providers) {
|
|
115
121
|
DEFAULT_INJECTOR.addProviders(providers);
|
|
@@ -124,5 +130,5 @@ function useRootService(token, options) {
|
|
|
124
130
|
return getServiceFromInjector(DEFAULT_INJECTOR, token, options);
|
|
125
131
|
}
|
|
126
132
|
|
|
127
|
-
export { DEFAULT_INJECTOR, INJECTOR_KEY, declareProviders, declareRootProviders,
|
|
133
|
+
export { DEFAULT_INJECTOR, INJECTOR_KEY, createInjector, declareProviders, declareRootProviders, getServiceFromInjector, inject, useRootService, useService };
|
|
128
134
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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
|
|
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":";;;;;;;;;;;;;;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,eACdC,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,cAAc;ACA9C;;;;;;;;;;SASgBgB,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;;ACbH;;;;;;;;;;;;;;;;;;;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,2CAAV,CAAN;AACD;;AACD,MAAME,eAAe,GAAG1B,cAAc,CAACuB,SAAD,EAAYrB,cAAZ,CAAtC;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;AAED;;;;;;;;SAMgBI,qBAAqBP;AACnCR,EAAAA,gBAAgB,CAACgB,YAAjB,CAA8BR,SAA9B;;;SCxBcS,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;;;"}
|
package/dist/index.esm.min.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
52
|
+
var DEFAULT_INJECTOR = createInjector();
|
|
53
53
|
/**
|
|
54
54
|
* 从当前组件开始查找provider
|
|
55
|
+
* 注意到vue本身的inject是默认从父级组件开始查找
|
|
55
56
|
*
|
|
56
57
|
* @export
|
|
57
58
|
* @param {*} key
|
|
@@ -98,18 +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
|
|
102
|
+
throw new Error('declareProviders can only be called once.');
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
var currentInjector =
|
|
105
|
+
var currentInjector = createInjector(providers, parentInjector);
|
|
105
106
|
currentInjector.uid = instance.uid;
|
|
106
107
|
onUnmounted(function () {
|
|
107
108
|
currentInjector.dispose();
|
|
108
109
|
});
|
|
109
|
-
console.log('declareProviders after onUnmounted');
|
|
110
|
-
console.log(INJECTOR_KEY, providers, currentInjector, currentInjector.parent);
|
|
111
110
|
provide(INJECTOR_KEY, currentInjector);
|
|
112
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* 实际上所有Injectable的Class都是兜底到root injector中
|
|
114
|
+
* 不需要特意调用declareRootProviders声明
|
|
115
|
+
* 这个方法是用于声明不是Injectable的Class的其他类型的Provider
|
|
116
|
+
* @param providers
|
|
117
|
+
*/
|
|
118
|
+
|
|
113
119
|
|
|
114
120
|
function declareRootProviders(providers) {
|
|
115
121
|
DEFAULT_INJECTOR.addProviders(providers);
|
|
@@ -124,5 +130,5 @@ function useRootService(token, options) {
|
|
|
124
130
|
return getServiceFromInjector(DEFAULT_INJECTOR, token, options);
|
|
125
131
|
}
|
|
126
132
|
|
|
127
|
-
export { DEFAULT_INJECTOR, INJECTOR_KEY, declareProviders, declareRootProviders,
|
|
133
|
+
export { DEFAULT_INJECTOR, INJECTOR_KEY, createInjector, declareProviders, declareRootProviders, getServiceFromInjector, inject, useRootService, useService };
|
|
128
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
|
|
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
|
|
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
|
|
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
|
|
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"}
|
package/dist/index.iife.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
|
|
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
|
|
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 =
|
|
52
|
+
var DEFAULT_INJECTOR = createInjector();
|
|
53
53
|
/**
|
|
54
54
|
* 从当前组件开始查找provider
|
|
55
|
+
* 注意到vue本身的inject是默认从父级组件开始查找
|
|
55
56
|
*
|
|
56
57
|
* @export
|
|
57
58
|
* @param {*} key
|
|
@@ -98,18 +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
|
|
102
|
+
throw new Error('declareProviders can only be called once.');
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
var currentInjector =
|
|
105
|
+
var currentInjector = createInjector(providers, parentInjector);
|
|
105
106
|
currentInjector.uid = instance.uid;
|
|
106
107
|
vue.onUnmounted(function () {
|
|
107
108
|
currentInjector.dispose();
|
|
108
109
|
});
|
|
109
|
-
console.log('declareProviders after onUnmounted');
|
|
110
|
-
console.log(INJECTOR_KEY, providers, currentInjector, currentInjector.parent);
|
|
111
110
|
vue.provide(INJECTOR_KEY, currentInjector);
|
|
112
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* 实际上所有Injectable的Class都是兜底到root injector中
|
|
114
|
+
* 不需要特意调用declareRootProviders声明
|
|
115
|
+
* 这个方法是用于声明不是Injectable的Class的其他类型的Provider
|
|
116
|
+
* @param providers
|
|
117
|
+
*/
|
|
118
|
+
|
|
113
119
|
|
|
114
120
|
function declareRootProviders(providers) {
|
|
115
121
|
DEFAULT_INJECTOR.addProviders(providers);
|
|
@@ -126,9 +132,9 @@ var UseVueService = function (exports, di, vue) {
|
|
|
126
132
|
|
|
127
133
|
exports.DEFAULT_INJECTOR = DEFAULT_INJECTOR;
|
|
128
134
|
exports.INJECTOR_KEY = INJECTOR_KEY;
|
|
135
|
+
exports.createInjector = createInjector;
|
|
129
136
|
exports.declareProviders = declareProviders;
|
|
130
137
|
exports.declareRootProviders = declareRootProviders;
|
|
131
|
-
exports.getInjector = getInjector;
|
|
132
138
|
exports.getServiceFromInjector = getServiceFromInjector;
|
|
133
139
|
exports.inject = inject;
|
|
134
140
|
exports.useRootService = useRootService;
|
package/dist/index.iife.js.map
CHANGED
|
@@ -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
|
|
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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"}
|
package/dist/index.iife.min.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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,
|
|
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,+
|
|
1
|
+
{"version":3,"file":"defaultInjector.d.ts","sourceRoot":"","sources":["defaultInjector.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,+BAAmB,CAAC"}
|
package/dist/src/fakeInject.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fakeInject.d.ts","sourceRoot":"","sources":["fakeInject.ts"],"names":[],"mappings":"AAEA
|
|
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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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 {
|
|
7
|
+
export { createInjector, getServiceFromInjector } from './utils';
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/src/useService.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Ref
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
import { InjectionKey } from '@kaokei/di';
|
|
2
3
|
declare type Ret<T> = T extends new (...args: any) => infer S ? S : T extends InjectionKey<infer M> ? Ret<M> : T extends string | number | boolean ? Ref<T> : T extends Array<any> ? {
|
|
3
4
|
[P in keyof T]: Ret<T[P]>;
|
|
4
5
|
} : T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useService.d.ts","sourceRoot":"","sources":["useService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useService.d.ts","sourceRoot":"","sources":["useService.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,aAAK,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,GACjD,CAAC,GACD,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAC/B,GAAG,CAAC,CAAC,CAAC,GACN,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GACnC,GAAG,CAAC,CAAC,CAAC,GACN,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,GACpB;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC7B,CAAC,CAAC;AAEN,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,EACvC,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAMjC,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,EAC3C,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,GAAG,GACZ,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Injector } from '@kaokei/di';
|
|
2
|
-
export declare function
|
|
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
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -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,
|
|
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": "
|
|
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": "^
|
|
51
|
+
"@kaokei/di": "^2.0.0"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
54
|
"reflect-metadata": "^0.1.13",
|
package/CHANGELOG.md
DELETED
|
@@ -1,72 +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.0](https://github.com/kaokei/use-vue-service/compare/v1.0.18...v1.1.0) (2022-02-16)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
### Features
|
|
9
|
-
|
|
10
|
-
* **bootstrap:** 删除bootstrap功能 ([de43690](https://github.com/kaokei/use-vue-service/commit/de43690c532209859b94f53652e248a455a56eb1))
|
|
11
|
-
* **di:** 基于新版di重新重构了一般,并完善了单元测试用例 ([845c8f9](https://github.com/kaokei/use-vue-service/commit/845c8f9e2df5de19f7cef2b7035770a8070870be))
|
|
12
|
-
|
|
13
|
-
### [1.0.18](https://github.com/kaokei/use-vue-service/compare/v1.0.17...v1.0.18) (2021-11-24)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
### Features
|
|
17
|
-
|
|
18
|
-
* **bootstrap:** 增加bootstrap启动vue应用的入口 ([d7f1fca](https://github.com/kaokei/use-vue-service/commit/d7f1fca7711a7c22e599bdf68278cdc8a66fdad5))
|
|
19
|
-
* **bootstrap:** 重构了bootstrap逻辑 ([9cb1cae](https://github.com/kaokei/use-vue-service/commit/9cb1cae170352ddb26e2451e0b97a2a2015c1b4b))
|
|
20
|
-
|
|
21
|
-
### [1.0.17](https://github.com/kaokei/use-vue-service/compare/v1.0.16...v1.0.17) (2021-10-12)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
### Features
|
|
25
|
-
|
|
26
|
-
* **useservice:** 直接获取根injector中的服务 ([92f1d0d](https://github.com/kaokei/use-vue-service/commit/92f1d0d77661c582ed89cecc55bede01252330d0))
|
|
27
|
-
|
|
28
|
-
### [1.0.16](https://github.com/kaokei/use-vue-service/compare/v1.0.15...v1.0.16) (2021-10-07)
|
|
29
|
-
|
|
30
|
-
### [1.0.15](https://github.com/kaokei/use-vue-service/compare/v1.0.14...v1.0.15) (2021-08-22)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
### Features
|
|
34
|
-
|
|
35
|
-
* **update:** 升级@kaokei/di ([6064c4e](https://github.com/kaokei/use-vue-service/commit/6064c4e1b7fcd102f287bea03a1984c1621d2884))
|
|
36
|
-
|
|
37
|
-
### [1.0.14](https://github.com/kaokei/use-vue-service/compare/v1.0.13...v1.0.14) (2021-08-06)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
### Features
|
|
41
|
-
|
|
42
|
-
* **dispose:** 删除了vue-class-component,并支持了服务的dispose功能 ([cad0454](https://github.com/kaokei/use-vue-service/commit/cad045461b6fd617a85456cc98a45ecf42406341))
|
|
43
|
-
* **example:** 增加__DEV__ ([757b7ef](https://github.com/kaokei/use-vue-service/commit/757b7ef6866ad16d3a77b2d3ec4e0648bcba7369))
|
|
44
|
-
* **plugin:** 支持vue plugin ([a4cee12](https://github.com/kaokei/use-vue-service/commit/a4cee12f1607dbee81dae5f0cf55efdbcae29be1))
|
|
45
|
-
|
|
46
|
-
### [1.0.13](https://github.com/kaokei/use-vue-service/compare/v1.0.12...v1.0.13) (2021-06-30)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
### Bug Fixes
|
|
50
|
-
|
|
51
|
-
* **ci:** add globals ([49b3d34](https://github.com/kaokei/use-vue-service/commit/49b3d3408d2caeaa767195551e7c152cd97cbff6))
|
|
52
|
-
|
|
53
|
-
### [1.0.12](https://github.com/kaokei/use-vue-service/compare/v1.0.11...v1.0.12) (2021-06-30)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
### Bug Fixes
|
|
57
|
-
|
|
58
|
-
* **ci:** inline @kaokei/di ([7ced072](https://github.com/kaokei/use-vue-service/commit/7ced07291f45cd380f26da96a650a8581c9e6c8e))
|
|
59
|
-
|
|
60
|
-
### 1.0.11 (2021-06-30)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
### Features
|
|
64
|
-
|
|
65
|
-
* **di:** use @kaokei/di to support di ([e937cba](https://github.com/kaokei/use-vue-service/commit/e937cba4379ec87a3b139a6132509b5216409c09))
|
|
66
|
-
|
|
67
|
-
### 1.0.3 (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))
|