@solar-taro/planets 1.0.0 → 1.0.2
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/CHANGELOG.md +3 -0
- package/earth/index.js +3 -0
- package/earth/index.js.map +1 -0
- package/earth/object-storage.service.d.ts +15 -0
- package/earth/object-storage.service.js +29 -0
- package/earth/object-storage.service.js.map +1 -0
- package/earth/service.d.ts +51 -0
- package/earth/service.js +87 -0
- package/earth/service.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -0
- package/mercury/auth.interceptor.d.ts +3 -0
- package/mercury/auth.interceptor.js +46 -0
- package/mercury/auth.interceptor.js.map +1 -0
- package/mercury/index.js +3 -0
- package/mercury/index.js.map +1 -0
- package/mercury/model.d.ts +9 -0
- package/mercury/model.js +2 -0
- package/mercury/model.js.map +1 -0
- package/mercury/service.d.ts +19 -0
- package/mercury/service.js +43 -0
- package/mercury/service.js.map +1 -0
- package/package.json +17 -2
- package/eslint.config.cjs +0 -22
- package/project.json +0 -47
- package/src/earth/object-storage.service.ts +0 -37
- package/src/earth/service.ts +0 -105
- package/src/index.ts +0 -1
- package/src/mercury/auth.interceptor.ts +0 -67
- package/src/mercury/model.ts +0 -9
- package/src/mercury/service.ts +0 -75
- package/tsconfig.json +0 -21
- package/tsconfig.lib.json +0 -24
- package/tsconfig.spec.json +0 -28
- package/typedoc.json +0 -7
- package/vite.config.ts +0 -24
- /package/{src/earth/index.ts → earth/index.d.ts} +0 -0
- /package/{src/mercury/index.ts → mercury/index.d.ts} +0 -0
package/CHANGELOG.md
ADDED
package/earth/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/planets/src/earth/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UploadKeys } from '@solar-kit/planets/earth';
|
|
2
|
+
export declare class ObjectStorageService {
|
|
3
|
+
private readonly http;
|
|
4
|
+
/**
|
|
5
|
+
* 目前只支持了 qiniu oss
|
|
6
|
+
* @param filePath
|
|
7
|
+
* @param options
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
upload(filePath: string, key: string, options: Pick<UploadKeys, 'host' | 'token'>): import("rxjs").Observable<{
|
|
11
|
+
hash: string;
|
|
12
|
+
key: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare const oss: () => ObjectStorageService;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { HttpClient, HttpContext } from '@ngify/http';
|
|
2
|
+
import { WX_UPLOAD_FILE_TOKEN } from '@ngify/http-wx';
|
|
3
|
+
import { once, overlay, vibrator } from '@solar-taro/core';
|
|
4
|
+
import { catchError } from 'rxjs';
|
|
5
|
+
export class ObjectStorageService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.http = new HttpClient();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 目前只支持了 qiniu oss
|
|
11
|
+
* @param filePath
|
|
12
|
+
* @param options
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
upload(filePath, key, options) {
|
|
16
|
+
return this.http.post(`https://${options.host}`, { key: key, token: options.token }, {
|
|
17
|
+
context: new HttpContext().set(WX_UPLOAD_FILE_TOKEN, {
|
|
18
|
+
filePath,
|
|
19
|
+
fileName: 'file'
|
|
20
|
+
})
|
|
21
|
+
}).pipe(catchError((error) => {
|
|
22
|
+
vibrator.short();
|
|
23
|
+
overlay.tips('操作失败,状态码:' + error.status || '未知');
|
|
24
|
+
throw error;
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const oss = once(() => new ObjectStorageService());
|
|
29
|
+
//# sourceMappingURL=object-storage.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-storage.service.js","sourceRoot":"","sources":["../../../../packages/planets/src/earth/object-storage.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,MAAM,OAAO,oBAAoB;IAAjC;QACmB,SAAI,GAAG,IAAI,UAAU,EAAE,CAAC;IA2B3C,CAAC;IAzBC;;;;;OAKG;IACH,MAAM,CAAC,QAAgB,EAAE,GAAW,EAAE,OAA2C;QAC/E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,WAAW,OAAO,CAAC,IAAI,EAAE,EACzB,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAClC;YACE,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE;gBACnD,QAAQ;gBACR,QAAQ,EAAE,MAAM;aACjB,CAAC;SACH,CACF,CAAC,IAAI,CACJ,UAAU,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC1C,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;YAEjD,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { HttpClient } from '@ngify/http';
|
|
2
|
+
import { Category, Channel, Origin, UploadKeys } from '@solar-kit/planets/earth';
|
|
3
|
+
import { Result } from '@solar-kit/planets/sun';
|
|
4
|
+
export interface EarthConfig {
|
|
5
|
+
/** earth service host */
|
|
6
|
+
url: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const setupEarth: (config: EarthConfig) => void, earthService: () => EarthService;
|
|
9
|
+
export declare class EarthService {
|
|
10
|
+
readonly config: EarthConfig;
|
|
11
|
+
readonly http: HttpClient;
|
|
12
|
+
constructor(config: EarthConfig);
|
|
13
|
+
/**
|
|
14
|
+
* 发送短信验证码
|
|
15
|
+
* @param cellphone
|
|
16
|
+
* @deprecated 使用小程序来获取手机号
|
|
17
|
+
*/
|
|
18
|
+
sendSmsCode(cellphone: string | number): import("rxjs").Observable<Result<null>>;
|
|
19
|
+
/**
|
|
20
|
+
* 获得信道
|
|
21
|
+
* @param origin
|
|
22
|
+
*/
|
|
23
|
+
channels(origin: Origin): import("rxjs").Observable<Result<Channel[]>>;
|
|
24
|
+
/**
|
|
25
|
+
* 获得品类
|
|
26
|
+
* @param origin
|
|
27
|
+
*/
|
|
28
|
+
categories(origin: Origin): import("rxjs").Observable<Result<Category[]>>;
|
|
29
|
+
/**
|
|
30
|
+
* 加载单位
|
|
31
|
+
*/
|
|
32
|
+
unitCategories(): import("rxjs").Observable<Result<Category[]>>;
|
|
33
|
+
/**
|
|
34
|
+
* 加载单位
|
|
35
|
+
*/
|
|
36
|
+
unitChannels(): import("rxjs").Observable<Result<Channel[]>>;
|
|
37
|
+
/**
|
|
38
|
+
* 获取 qiniu token
|
|
39
|
+
* @param bucket
|
|
40
|
+
* @deprecated {@link mediaUploadKeys}
|
|
41
|
+
*/
|
|
42
|
+
qiniuToken(bucket: 0 | 1): import("rxjs").Observable<Result<string>>;
|
|
43
|
+
/**
|
|
44
|
+
* 获取上传头像的文件名(key)
|
|
45
|
+
* @deprecated {@link avatarUploadKey}
|
|
46
|
+
*/
|
|
47
|
+
avatarKey(): import("rxjs").Observable<Result<string>>;
|
|
48
|
+
avatarUploadKey(): import("rxjs").Observable<Result<UploadKeys>>;
|
|
49
|
+
mediaUploadKeys(keySize?: number): import("rxjs").Observable<Result<UploadKeys>>;
|
|
50
|
+
licenseUploadKeys(keySize?: number): import("rxjs").Observable<Result<UploadKeys>>;
|
|
51
|
+
}
|
package/earth/service.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { HttpClient, HttpContext, withInterceptors } from '@ngify/http';
|
|
2
|
+
import { defineService, overlay } from '@solar-taro/core';
|
|
3
|
+
import { CACHEABLE_TOKEN, useApiInterceptor, useCacheInterceptor } from '@solar-taro/http';
|
|
4
|
+
import { tap } from 'rxjs';
|
|
5
|
+
import { useAuthInterceptor } from '../mercury/index.js';
|
|
6
|
+
export const [setupEarth, earthService] = defineService((config) => new EarthService(config));
|
|
7
|
+
export class EarthService {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.http = new HttpClient(withInterceptors([
|
|
11
|
+
useApiInterceptor(),
|
|
12
|
+
useCacheInterceptor(),
|
|
13
|
+
useAuthInterceptor(),
|
|
14
|
+
]));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 发送短信验证码
|
|
18
|
+
* @param cellphone
|
|
19
|
+
* @deprecated 使用小程序来获取手机号
|
|
20
|
+
*/
|
|
21
|
+
sendSmsCode(cellphone) {
|
|
22
|
+
return this.http.get(`${this.config.url}/sms/code/${cellphone}`).pipe(tap(({ code }) => code === 0 && overlay.success('发送成功')));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 获得信道
|
|
26
|
+
* @param origin
|
|
27
|
+
*/
|
|
28
|
+
channels(origin) {
|
|
29
|
+
return this.http.get(`${this.config.url}/channel/${origin}`, {
|
|
30
|
+
context: new HttpContext().set(CACHEABLE_TOKEN, true)
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获得品类
|
|
35
|
+
* @param origin
|
|
36
|
+
*/
|
|
37
|
+
categories(origin) {
|
|
38
|
+
return this.http.get(`${this.config.url}/category/${origin}`, {
|
|
39
|
+
context: new HttpContext().set(CACHEABLE_TOKEN, true)
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 加载单位
|
|
44
|
+
*/
|
|
45
|
+
unitCategories() {
|
|
46
|
+
return this.categories(13 /* Origin.Unit */);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 加载单位
|
|
50
|
+
*/
|
|
51
|
+
unitChannels() {
|
|
52
|
+
return this.channels(13 /* Origin.Unit */);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 获取 qiniu token
|
|
56
|
+
* @param bucket
|
|
57
|
+
* @deprecated {@link mediaUploadKeys}
|
|
58
|
+
*/
|
|
59
|
+
qiniuToken(bucket) {
|
|
60
|
+
const url = {
|
|
61
|
+
[0]: `${this.config.url}/res/upload-token`,
|
|
62
|
+
[1]: `${this.config.url}/media/upload-token`,
|
|
63
|
+
}[bucket];
|
|
64
|
+
return this.http.get(url);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 获取上传头像的文件名(key)
|
|
68
|
+
* @deprecated {@link avatarUploadKey}
|
|
69
|
+
*/
|
|
70
|
+
avatarKey() {
|
|
71
|
+
return this.http.get(`${this.config.url}/avatar/upload-key`);
|
|
72
|
+
}
|
|
73
|
+
avatarUploadKey() {
|
|
74
|
+
return this.http.get(`${this.config.url}/qiniu/avatar/upload-key`);
|
|
75
|
+
}
|
|
76
|
+
mediaUploadKeys(keySize = 1) {
|
|
77
|
+
return this.http.get(`${this.config.url}/qiniu/media/upload-keys`, {
|
|
78
|
+
params: { keySize }
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
licenseUploadKeys(keySize = 1) {
|
|
82
|
+
return this.http.get(`${this.config.url}/qiniu/license/upload-keys`, {
|
|
83
|
+
params: { keySize }
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../packages/planets/src/earth/service.ts"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
package/index.js
ADDED
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/planets/src/index.ts"],"names":[],"mappings":"AAAA,eAAe,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { HttpStatusCode } from '@ngify/http';
|
|
2
|
+
import { catchError, finalize, share, switchMap } from 'rxjs';
|
|
3
|
+
import { mercuryService } from './service.js';
|
|
4
|
+
/** 负责基础业务接口的认证 */
|
|
5
|
+
export function useAuthInterceptor() {
|
|
6
|
+
/** 令牌刷新器 */
|
|
7
|
+
let refresher = null;
|
|
8
|
+
/**
|
|
9
|
+
* 获取访问令牌
|
|
10
|
+
*/
|
|
11
|
+
function updateToken() {
|
|
12
|
+
refresher = mercuryService().auth().pipe(finalize(() => refresher = null), share());
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 等待令牌后再发送请求
|
|
16
|
+
* @param request
|
|
17
|
+
* @param next
|
|
18
|
+
*/
|
|
19
|
+
function waitToken(request, next) {
|
|
20
|
+
return refresher.pipe(switchMap(({ data }) => (next(request.clone({
|
|
21
|
+
headers: request.headers.set('Authorization', 'Bearer ' + data.token.access_token)
|
|
22
|
+
})))));
|
|
23
|
+
}
|
|
24
|
+
return (request, next) => {
|
|
25
|
+
const tokens = mercuryService().tokens;
|
|
26
|
+
if (!(tokens === null || tokens === void 0 ? void 0 : tokens.accessToken) && !refresher) {
|
|
27
|
+
updateToken();
|
|
28
|
+
}
|
|
29
|
+
if (refresher) {
|
|
30
|
+
return waitToken(request, next);
|
|
31
|
+
}
|
|
32
|
+
request = request.clone({
|
|
33
|
+
headers: request.headers.set('Authorization', 'Bearer ' + tokens.accessToken)
|
|
34
|
+
});
|
|
35
|
+
return next(request).pipe(catchError((error) => {
|
|
36
|
+
if (error.status === HttpStatusCode.Unauthorized) {
|
|
37
|
+
if (!refresher) {
|
|
38
|
+
updateToken();
|
|
39
|
+
}
|
|
40
|
+
return waitToken(request, next);
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}));
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=auth.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.interceptor.js","sourceRoot":"","sources":["../../../../packages/planets/src/mercury/auth.interceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAc,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,kBAAkB;AAClB,MAAM,UAAU,kBAAkB;IAChC,YAAY;IACZ,IAAI,SAAS,GAAsC,IAAI,CAAC;IAExD;;OAEG;IACH,SAAS,WAAW;QAClB,SAAS,GAAG,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CACtC,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,EAChC,KAAK,EAAE,CACR,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,SAAS,CAAC,OAA6B,EAAE,IAAmB;QACnE,OAAO,SAAU,CAAC,IAAI,CACpB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;SACnF,CAAC,CAAC,CACJ,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAA6B,EAAE,IAAmB,EAAkC,EAAE;QAC5F,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC;QAEvC,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,CAAA,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,WAAW,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC;SAC9E,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACvB,UAAU,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,CAAC,YAAY,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,WAAW,EAAE,CAAC;gBAChB,CAAC;gBAED,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAA;AACH,CAAC"}
|
package/mercury/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/planets/src/mercury/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC"}
|
package/mercury/model.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../packages/planets/src/mercury/model.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { HttpClient } from '@ngify/http';
|
|
2
|
+
import { Fan } from '@solar-kit/planets/earth';
|
|
3
|
+
import { AuthTokens, Result } from '@solar-kit/planets/sun';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
import { WxAuth } from './model';
|
|
6
|
+
export interface MercuryConfig {
|
|
7
|
+
/** mercury service host */
|
|
8
|
+
url: string;
|
|
9
|
+
app: string;
|
|
10
|
+
fan: Fan;
|
|
11
|
+
}
|
|
12
|
+
export declare const setupMercury: (config: MercuryConfig) => void, mercuryService: () => MercuryService;
|
|
13
|
+
export declare class MercuryService {
|
|
14
|
+
protected readonly config: MercuryConfig;
|
|
15
|
+
protected http: HttpClient;
|
|
16
|
+
tokens: AuthTokens;
|
|
17
|
+
constructor(config: MercuryConfig);
|
|
18
|
+
auth(relogin?: boolean): Observable<Result<WxAuth>>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { HttpClient, HttpStatusCode, withInterceptors } from '@ngify/http';
|
|
2
|
+
import { defineService } from '@solar-taro/core';
|
|
3
|
+
import { useApiInterceptor } from '@solar-taro/http';
|
|
4
|
+
import { checkSession, getStorageSync, getUserInfo, login, setStorage } from '@tarojs/taro';
|
|
5
|
+
import { catchError, defer, from, map, switchMap, tap } from 'rxjs';
|
|
6
|
+
const TOKEN_STORAGE_KEY = 'auth-token';
|
|
7
|
+
export const [setupMercury, mercuryService] = defineService((config) => new MercuryService(config));
|
|
8
|
+
export class MercuryService {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.http = new HttpClient(withInterceptors([
|
|
12
|
+
useApiInterceptor()
|
|
13
|
+
]));
|
|
14
|
+
this.tokens = getStorageSync(TOKEN_STORAGE_KEY) || {};
|
|
15
|
+
}
|
|
16
|
+
auth(relogin = false) {
|
|
17
|
+
return defer(() => relogin
|
|
18
|
+
? login()
|
|
19
|
+
: from(checkSession()).pipe(map(() => ({ code: null })), catchError(() => login()))).pipe(switchMap(({ code }) => from(getUserInfo()).pipe(map(({ encryptedData, iv }) => ({ code, encryptedData, iv })))), switchMap(({ code, encryptedData, iv }) => {
|
|
20
|
+
return this.http.post(`${this.config.url}/oaa/wx/auth`, null, {
|
|
21
|
+
headers: {
|
|
22
|
+
["X-WX-Code" /* WxHeader.Code */]: code || '',
|
|
23
|
+
["X-WX-Encrypted-Data" /* WxHeader.EncryptedData */]: encryptedData,
|
|
24
|
+
["X-WX-IV" /* WxHeader.Iv */]: iv,
|
|
25
|
+
["X-WX-APP" /* WxHeader.App */]: this.config.app,
|
|
26
|
+
["X-WX-OPEN-ID" /* WxHeader.OpenId */]: this.config.fan.openId || '',
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}), tap(({ data }) => {
|
|
30
|
+
this.tokens = { accessToken: data.token.access_token };
|
|
31
|
+
setStorage({
|
|
32
|
+
key: TOKEN_STORAGE_KEY,
|
|
33
|
+
data: this.tokens
|
|
34
|
+
});
|
|
35
|
+
}), catchError((error) => {
|
|
36
|
+
if (error.status === HttpStatusCode.Unauthorized) {
|
|
37
|
+
return this.auth(true);
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../packages/planets/src/mercury/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solar-taro/planets",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"tslib": "^2.3.0"
|
|
10
|
-
}
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
"./package.json": "./package.json",
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./index.d.ts",
|
|
15
|
+
"import": "./index.js"
|
|
16
|
+
},
|
|
17
|
+
"./earth": "./earth/index.js",
|
|
18
|
+
"./earth/index": "./earth/index.js",
|
|
19
|
+
"./mercury": "./mercury/index.js",
|
|
20
|
+
"./mercury/index": "./mercury/index.js"
|
|
21
|
+
},
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"module": "./index.js",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./index.js"
|
|
11
26
|
}
|
package/eslint.config.cjs
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const baseConfig = require('../../eslint.config.cjs');
|
|
2
|
-
|
|
3
|
-
module.exports = [
|
|
4
|
-
...baseConfig,
|
|
5
|
-
{
|
|
6
|
-
files: ['**/*.json'],
|
|
7
|
-
rules: {
|
|
8
|
-
'@nx/dependency-checks': [
|
|
9
|
-
'error',
|
|
10
|
-
{
|
|
11
|
-
ignoredFiles: [
|
|
12
|
-
'{projectRoot}/eslint.config.{js,cjs,mjs}',
|
|
13
|
-
'{projectRoot}/vite.config.{js,ts,mjs,mts}',
|
|
14
|
-
],
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
},
|
|
18
|
-
languageOptions: {
|
|
19
|
-
parser: require('jsonc-eslint-parser'),
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
];
|
package/project.json
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "planets",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "packages/planets/src",
|
|
5
|
-
"projectType": "library",
|
|
6
|
-
"tags": [],
|
|
7
|
-
"targets": {
|
|
8
|
-
"build": {
|
|
9
|
-
"executor": "@nx/js:tsc",
|
|
10
|
-
"outputs": [
|
|
11
|
-
"{options.outputPath}"
|
|
12
|
-
],
|
|
13
|
-
"options": {
|
|
14
|
-
"outputPath": "dist/planets",
|
|
15
|
-
"main": "packages/planets/src/index.ts",
|
|
16
|
-
"tsConfig": "packages/planets/tsconfig.lib.json",
|
|
17
|
-
"assets": [
|
|
18
|
-
"packages/planets/*.md"
|
|
19
|
-
],
|
|
20
|
-
"additionalEntryPoints": [
|
|
21
|
-
"packages/planets/src/earth/index.ts",
|
|
22
|
-
"packages/planets/src/mercury/index.ts"
|
|
23
|
-
],
|
|
24
|
-
"generateExportsField": true
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"postbuild": {
|
|
28
|
-
"executor": "nx:run-commands",
|
|
29
|
-
"dependsOn": [
|
|
30
|
-
"build"
|
|
31
|
-
],
|
|
32
|
-
"options": {
|
|
33
|
-
"commands": [
|
|
34
|
-
"node scripts/postbuild.js planets"
|
|
35
|
-
]
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
"release:dev": {
|
|
39
|
-
"executor": "nx:run-commands",
|
|
40
|
-
"options": {
|
|
41
|
-
"commands": [
|
|
42
|
-
"yalc publish dist/planets"
|
|
43
|
-
]
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpContext, HttpResponse } from '@ngify/http';
|
|
2
|
-
import { WX_UPLOAD_FILE_TOKEN } from '@ngify/http-wx';
|
|
3
|
-
import { UploadKeys } from '@solar-kit/planets/earth';
|
|
4
|
-
import { once, overlay, vibrator } from '@solar-taro/core';
|
|
5
|
-
import { catchError } from 'rxjs';
|
|
6
|
-
|
|
7
|
-
export class ObjectStorageService {
|
|
8
|
-
private readonly http = new HttpClient();
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 目前只支持了 qiniu oss
|
|
12
|
-
* @param filePath
|
|
13
|
-
* @param options
|
|
14
|
-
* @returns
|
|
15
|
-
*/
|
|
16
|
-
upload(filePath: string, key: string, options: Pick<UploadKeys, 'host' | 'token'>) {
|
|
17
|
-
return this.http.post<{ hash: string, key: string }>(
|
|
18
|
-
`https://${options.host}`,
|
|
19
|
-
{ key: key, token: options.token },
|
|
20
|
-
{
|
|
21
|
-
context: new HttpContext().set(WX_UPLOAD_FILE_TOKEN, {
|
|
22
|
-
filePath,
|
|
23
|
-
fileName: 'file'
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
).pipe(
|
|
27
|
-
catchError((error: HttpResponse<unknown>) => {
|
|
28
|
-
vibrator.short();
|
|
29
|
-
overlay.tips('操作失败,状态码:' + error.status || '未知');
|
|
30
|
-
|
|
31
|
-
throw error;
|
|
32
|
-
})
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export const oss = once(() => new ObjectStorageService());
|
package/src/earth/service.ts
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpContext, withInterceptors } from '@ngify/http';
|
|
2
|
-
import { Category, Channel, Origin, UploadKeys } from '@solar-kit/planets/earth';
|
|
3
|
-
import { Result } from '@solar-kit/planets/sun';
|
|
4
|
-
import { defineService, overlay } from '@solar-taro/core';
|
|
5
|
-
import { CACHEABLE_TOKEN, useApiInterceptor, useCacheInterceptor } from '@solar-taro/http';
|
|
6
|
-
import { tap } from 'rxjs';
|
|
7
|
-
import { useAuthInterceptor } from '../mercury';
|
|
8
|
-
|
|
9
|
-
export interface EarthConfig {
|
|
10
|
-
/** earth service host */
|
|
11
|
-
url: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const [setupEarth, earthService] = defineService((config: EarthConfig) => new EarthService(config));
|
|
15
|
-
|
|
16
|
-
export class EarthService {
|
|
17
|
-
readonly http = new HttpClient(
|
|
18
|
-
withInterceptors([
|
|
19
|
-
useApiInterceptor(),
|
|
20
|
-
useCacheInterceptor(),
|
|
21
|
-
useAuthInterceptor(),
|
|
22
|
-
])
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
constructor(
|
|
26
|
-
public readonly config: EarthConfig
|
|
27
|
-
) { }
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* 发送短信验证码
|
|
31
|
-
* @param cellphone
|
|
32
|
-
* @deprecated 使用小程序来获取手机号
|
|
33
|
-
*/
|
|
34
|
-
sendSmsCode(cellphone: string | number) {
|
|
35
|
-
return this.http.get<Result>(`${this.config.url}/sms/code/${cellphone}`).pipe(
|
|
36
|
-
tap(({ code }) => code === 0 && overlay.success('发送成功'))
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* 获得信道
|
|
42
|
-
* @param origin
|
|
43
|
-
*/
|
|
44
|
-
channels(origin: Origin) {
|
|
45
|
-
return this.http.get<Result<Channel[]>>(`${this.config.url}/channel/${origin}`, {
|
|
46
|
-
context: new HttpContext().set(CACHEABLE_TOKEN, true)
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* 获得品类
|
|
52
|
-
* @param origin
|
|
53
|
-
*/
|
|
54
|
-
categories(origin: Origin) {
|
|
55
|
-
return this.http.get<Result<Category[]>>(`${this.config.url}/category/${origin}`, {
|
|
56
|
-
context: new HttpContext().set(CACHEABLE_TOKEN, true)
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 加载单位
|
|
62
|
-
*/
|
|
63
|
-
unitCategories() {
|
|
64
|
-
return this.categories(Origin.Unit);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 加载单位
|
|
69
|
-
*/
|
|
70
|
-
unitChannels() {
|
|
71
|
-
return this.channels(Origin.Unit);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* 获取 qiniu token
|
|
76
|
-
* @param bucket
|
|
77
|
-
* @deprecated {@link mediaUploadKeys}
|
|
78
|
-
*/
|
|
79
|
-
qiniuToken(bucket: 0 | 1) {
|
|
80
|
-
const url = {
|
|
81
|
-
[0]: `${this.config.url}/res/upload-token`,
|
|
82
|
-
[1]: `${this.config.url}/media/upload-token`,
|
|
83
|
-
}[bucket];
|
|
84
|
-
|
|
85
|
-
return this.http.get<Result<string>>(url);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* 获取上传头像的文件名(key)
|
|
90
|
-
* @deprecated {@link avatarUploadKey}
|
|
91
|
-
*/
|
|
92
|
-
avatarKey() {
|
|
93
|
-
return this.http.get<Result<string>>(`${this.config.url}/avatar/upload-key`);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
avatarUploadKey() {
|
|
97
|
-
return this.http.get<Result<UploadKeys>>(`${this.config.url}/qiniu/avatar/upload-key`);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
mediaUploadKeys(keySize = 1) {
|
|
101
|
-
return this.http.get<Result<UploadKeys>>(`${this.config.url}/qiniu/media/upload-keys`, {
|
|
102
|
-
params: { keySize }
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default void 0;
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@ngify/http';
|
|
2
|
-
import { HttpStatusCode } from '@ngify/http';
|
|
3
|
-
import { Result } from '@solar-kit/planets/sun';
|
|
4
|
-
import { catchError, finalize, Observable, share, switchMap } from 'rxjs';
|
|
5
|
-
import { WxAuth } from './model';
|
|
6
|
-
import { mercuryService } from './service';
|
|
7
|
-
|
|
8
|
-
/** 负责基础业务接口的认证 */
|
|
9
|
-
export function useAuthInterceptor(): HttpInterceptorFn {
|
|
10
|
-
/** 令牌刷新器 */
|
|
11
|
-
let refresher: Observable<Result<WxAuth>> | null = null;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* 获取访问令牌
|
|
15
|
-
*/
|
|
16
|
-
function updateToken() {
|
|
17
|
-
refresher = mercuryService().auth().pipe(
|
|
18
|
-
finalize(() => refresher = null),
|
|
19
|
-
share(),
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* 等待令牌后再发送请求
|
|
25
|
-
* @param request
|
|
26
|
-
* @param next
|
|
27
|
-
*/
|
|
28
|
-
function waitToken(request: HttpRequest<unknown>, next: HttpHandlerFn) {
|
|
29
|
-
return refresher!.pipe(
|
|
30
|
-
switchMap(({ data }) => (
|
|
31
|
-
next(request.clone({
|
|
32
|
-
headers: request.headers.set('Authorization', 'Bearer ' + data.token.access_token)
|
|
33
|
-
}))
|
|
34
|
-
))
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {
|
|
39
|
-
const tokens = mercuryService().tokens;
|
|
40
|
-
|
|
41
|
-
if (!tokens?.accessToken && !refresher) {
|
|
42
|
-
updateToken();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (refresher) {
|
|
46
|
-
return waitToken(request, next);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
request = request.clone({
|
|
50
|
-
headers: request.headers.set('Authorization', 'Bearer ' + tokens.accessToken)
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
return next(request).pipe(
|
|
54
|
-
catchError((error: HttpResponse<unknown>) => {
|
|
55
|
-
if (error.status === HttpStatusCode.Unauthorized) {
|
|
56
|
-
if (!refresher) {
|
|
57
|
-
updateToken();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return waitToken(request, next);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
throw error;
|
|
64
|
-
})
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
}
|
package/src/mercury/model.ts
DELETED
package/src/mercury/service.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpResponse, HttpStatusCode, withInterceptors } from '@ngify/http';
|
|
2
|
-
import { Fan } from '@solar-kit/planets/earth';
|
|
3
|
-
import { AuthTokens, Result } from '@solar-kit/planets/sun';
|
|
4
|
-
import { defineService } from '@solar-taro/core';
|
|
5
|
-
import { useApiInterceptor, WxHeader } from '@solar-taro/http';
|
|
6
|
-
import { checkSession, getStorageSync, getUserInfo, login, setStorage } from '@tarojs/taro';
|
|
7
|
-
import { catchError, defer, from, map, Observable, switchMap, tap } from 'rxjs';
|
|
8
|
-
import { WxAuth } from './model';
|
|
9
|
-
|
|
10
|
-
export interface MercuryConfig {
|
|
11
|
-
/** mercury service host */
|
|
12
|
-
url: string;
|
|
13
|
-
app: string;
|
|
14
|
-
fan: Fan;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const TOKEN_STORAGE_KEY = 'auth-token';
|
|
18
|
-
|
|
19
|
-
export const [setupMercury, mercuryService] = defineService((config: MercuryConfig) => new MercuryService(config));
|
|
20
|
-
|
|
21
|
-
export class MercuryService {
|
|
22
|
-
protected http = new HttpClient(
|
|
23
|
-
withInterceptors([
|
|
24
|
-
useApiInterceptor()
|
|
25
|
-
])
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
tokens: AuthTokens = getStorageSync<AuthTokens>(TOKEN_STORAGE_KEY) || {};
|
|
29
|
-
|
|
30
|
-
constructor(
|
|
31
|
-
protected readonly config: MercuryConfig
|
|
32
|
-
) { }
|
|
33
|
-
|
|
34
|
-
auth(relogin = false): Observable<Result<WxAuth>> {
|
|
35
|
-
return defer(() =>
|
|
36
|
-
relogin
|
|
37
|
-
? login()
|
|
38
|
-
: from(checkSession()).pipe(
|
|
39
|
-
map(() => ({ code: null })),
|
|
40
|
-
catchError(() => login()),
|
|
41
|
-
)
|
|
42
|
-
).pipe(
|
|
43
|
-
switchMap(({ code }) =>
|
|
44
|
-
from(getUserInfo()).pipe(
|
|
45
|
-
map(({ encryptedData, iv }) => ({ code, encryptedData, iv }))
|
|
46
|
-
)
|
|
47
|
-
),
|
|
48
|
-
switchMap(({ code, encryptedData, iv }) => {
|
|
49
|
-
return this.http.post<Result<WxAuth>>(`${this.config.url}/oaa/wx/auth`, null, {
|
|
50
|
-
headers: {
|
|
51
|
-
[WxHeader.Code]: code || '',
|
|
52
|
-
[WxHeader.EncryptedData]: encryptedData,
|
|
53
|
-
[WxHeader.Iv]: iv,
|
|
54
|
-
[WxHeader.App]: this.config.app,
|
|
55
|
-
[WxHeader.OpenId]: this.config.fan.openId || '',
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}),
|
|
59
|
-
tap(({ data }) => {
|
|
60
|
-
this.tokens = { accessToken: data.token.access_token };
|
|
61
|
-
setStorage({
|
|
62
|
-
key: TOKEN_STORAGE_KEY,
|
|
63
|
-
data: this.tokens
|
|
64
|
-
});
|
|
65
|
-
}),
|
|
66
|
-
catchError((error: HttpResponse<unknown>) => {
|
|
67
|
-
if (error.status === HttpStatusCode.Unauthorized) {
|
|
68
|
-
return this.auth(true);
|
|
69
|
-
}
|
|
70
|
-
throw error;
|
|
71
|
-
})
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"forceConsistentCasingInFileNames": true,
|
|
5
|
-
"strict": true,
|
|
6
|
-
"noImplicitOverride": true,
|
|
7
|
-
"noImplicitReturns": true,
|
|
8
|
-
"noFallthroughCasesInSwitch": true,
|
|
9
|
-
"noPropertyAccessFromIndexSignature": true
|
|
10
|
-
},
|
|
11
|
-
"files": [],
|
|
12
|
-
"include": [],
|
|
13
|
-
"references": [
|
|
14
|
-
{
|
|
15
|
-
"path": "./tsconfig.lib.json"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"path": "./tsconfig.spec.json"
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
}
|
package/tsconfig.lib.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"declaration": true
|
|
6
|
-
},
|
|
7
|
-
"include": [
|
|
8
|
-
"src/**/*.ts"
|
|
9
|
-
],
|
|
10
|
-
"exclude": [
|
|
11
|
-
"vite.config.ts",
|
|
12
|
-
"vite.config.mts",
|
|
13
|
-
"vitest.config.ts",
|
|
14
|
-
"vitest.config.mts",
|
|
15
|
-
"src/**/*.test.ts",
|
|
16
|
-
"src/**/*.spec.ts",
|
|
17
|
-
"src/**/*.test.tsx",
|
|
18
|
-
"src/**/*.spec.tsx",
|
|
19
|
-
"src/**/*.test.js",
|
|
20
|
-
"src/**/*.spec.js",
|
|
21
|
-
"src/**/*.test.jsx",
|
|
22
|
-
"src/**/*.spec.jsx"
|
|
23
|
-
]
|
|
24
|
-
}
|
package/tsconfig.spec.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"outDir": "../../dist/out-tsc",
|
|
5
|
-
"types": [
|
|
6
|
-
"vitest/globals",
|
|
7
|
-
"vitest/importMeta",
|
|
8
|
-
"vite/client",
|
|
9
|
-
"node",
|
|
10
|
-
"vitest"
|
|
11
|
-
]
|
|
12
|
-
},
|
|
13
|
-
"include": [
|
|
14
|
-
"vite.config.ts",
|
|
15
|
-
"vite.config.mts",
|
|
16
|
-
"vitest.config.ts",
|
|
17
|
-
"vitest.config.mts",
|
|
18
|
-
"src/**/*.test.ts",
|
|
19
|
-
"src/**/*.spec.ts",
|
|
20
|
-
"src/**/*.test.tsx",
|
|
21
|
-
"src/**/*.spec.tsx",
|
|
22
|
-
"src/**/*.test.js",
|
|
23
|
-
"src/**/*.spec.js",
|
|
24
|
-
"src/**/*.test.jsx",
|
|
25
|
-
"src/**/*.spec.jsx",
|
|
26
|
-
"src/**/*.d.ts"
|
|
27
|
-
]
|
|
28
|
-
}
|
package/typedoc.json
DELETED
package/vite.config.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin';
|
|
2
|
-
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
|
|
3
|
-
import { defineConfig } from 'vite';
|
|
4
|
-
|
|
5
|
-
export default defineConfig({
|
|
6
|
-
root: __dirname,
|
|
7
|
-
cacheDir: '../../node_modules/.vite/planets',
|
|
8
|
-
plugins: [nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])],
|
|
9
|
-
// Uncomment this if you are using workers.
|
|
10
|
-
// worker: {
|
|
11
|
-
// plugins: [ nxViteTsPaths() ],
|
|
12
|
-
// },
|
|
13
|
-
test: {
|
|
14
|
-
watch: false,
|
|
15
|
-
globals: true,
|
|
16
|
-
environment: 'node',
|
|
17
|
-
include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
|
|
18
|
-
reporters: ['default'],
|
|
19
|
-
coverage: {
|
|
20
|
-
reportsDirectory: '../../coverage/planets',
|
|
21
|
-
provider: 'v8',
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
});
|
|
File without changes
|
|
File without changes
|