@solar-angular/planets 1.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.
Files changed (46) hide show
  1. package/README.md +7 -0
  2. package/earth/earth.pipe.d.ts +19 -0
  3. package/earth/earth.resolver.d.ts +4 -0
  4. package/earth/earth.service.d.ts +32 -0
  5. package/earth/guards/auth.guard.d.ts +12 -0
  6. package/earth/guards/index.d.ts +3 -0
  7. package/earth/guards/permission.guard.d.ts +6 -0
  8. package/earth/guards/unauth.guard.d.ts +6 -0
  9. package/earth/index.d.ts +6 -0
  10. package/earth/menu.service.d.ts +14 -0
  11. package/earth/object-storage.service.d.ts +21 -0
  12. package/esm2022/earth/earth.pipe.mjs +51 -0
  13. package/esm2022/earth/earth.resolver.mjs +10 -0
  14. package/esm2022/earth/earth.service.mjs +134 -0
  15. package/esm2022/earth/guards/auth.guard.mjs +30 -0
  16. package/esm2022/earth/guards/index.mjs +4 -0
  17. package/esm2022/earth/guards/permission.guard.mjs +16 -0
  18. package/esm2022/earth/guards/unauth.guard.mjs +16 -0
  19. package/esm2022/earth/index.mjs +7 -0
  20. package/esm2022/earth/menu.service.mjs +37 -0
  21. package/esm2022/earth/object-storage.service.mjs +44 -0
  22. package/esm2022/earth/solar-angular-planets-earth.mjs +5 -0
  23. package/esm2022/index.mjs +2 -0
  24. package/esm2022/mercury/auth.interceptor.mjs +53 -0
  25. package/esm2022/mercury/index.mjs +3 -0
  26. package/esm2022/mercury/mercury.service.mjs +68 -0
  27. package/esm2022/mercury/solar-angular-planets-mercury.mjs +5 -0
  28. package/esm2022/solar-angular-planets.mjs +5 -0
  29. package/esm2022/sun/gender.pipe.mjs +20 -0
  30. package/esm2022/sun/index.mjs +2 -0
  31. package/esm2022/sun/solar-angular-planets-sun.mjs +5 -0
  32. package/fesm2022/solar-angular-planets-earth.mjs +318 -0
  33. package/fesm2022/solar-angular-planets-earth.mjs.map +1 -0
  34. package/fesm2022/solar-angular-planets-mercury.mjs +123 -0
  35. package/fesm2022/solar-angular-planets-mercury.mjs.map +1 -0
  36. package/fesm2022/solar-angular-planets-sun.mjs +27 -0
  37. package/fesm2022/solar-angular-planets-sun.mjs.map +1 -0
  38. package/fesm2022/solar-angular-planets.mjs +6 -0
  39. package/fesm2022/solar-angular-planets.mjs.map +1 -0
  40. package/index.d.ts +2 -0
  41. package/mercury/auth.interceptor.d.ts +8 -0
  42. package/mercury/index.d.ts +2 -0
  43. package/mercury/mercury.service.d.ts +17 -0
  44. package/package.json +48 -0
  45. package/sun/gender.pipe.d.ts +8 -0
  46. package/sun/index.d.ts +1 -0
@@ -0,0 +1,53 @@
1
+ import { HttpStatusCode } from '@angular/common/http';
2
+ import { inject, Injector, runInInjectionContext } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import { AUTH_REDIRECT_TOKEN, AUTH_TOKEN, CacheManager, CATCH_HTTP_ERROR_TOKEN } from '@solar-angular/http';
5
+ import { catchError, finalize, map, retry, share, switchMap } from 'rxjs';
6
+ import { MercuryService } from './mercury.service';
7
+ /**
8
+ * Mercury 认证拦截器
9
+ * - 使用 {@link AUTH_TOKEN} 跳过该拦截器
10
+ * - 使用 {@link AUTH_REDIRECT_TOKEN} 关闭认证失败自动跳转到 `/login`
11
+ * @returns
12
+ */
13
+ export function useAuthInterceptor(onUnauth) {
14
+ /** 令牌刷新器 */
15
+ let refreshToken$ = null;
16
+ return (request, next) => {
17
+ const router = inject(Router);
18
+ const cacheManager = inject(CacheManager);
19
+ const mercuryService = inject(MercuryService);
20
+ const injector = inject(Injector);
21
+ if (!request.context.get(AUTH_TOKEN)) {
22
+ return next(request);
23
+ }
24
+ if (refreshToken$) {
25
+ return refreshToken$.pipe(switchMap(() => next(request)));
26
+ }
27
+ return next(request).pipe(retry({
28
+ count: 1,
29
+ delay: (error) => {
30
+ if (error.status !== HttpStatusCode.Unauthorized) {
31
+ throw error;
32
+ }
33
+ refreshToken$ ||= mercuryService.refreshCertificate().pipe(map(result => {
34
+ if (result?.code !== 0) {
35
+ throw result;
36
+ }
37
+ return result;
38
+ }), catchError(error => {
39
+ // 如果刷新令牌都出错了,则这些等待刷新令牌的请求也不需要捕获 HTTP 错误了
40
+ request.context.set(CATCH_HTTP_ERROR_TOKEN, false);
41
+ if (request.context.get(AUTH_REDIRECT_TOKEN)) {
42
+ runInInjectionContext(injector, () => onUnauth());
43
+ router.navigate(['/login', { redirect: router.url }]);
44
+ }
45
+ cacheManager.revokeAll();
46
+ throw error;
47
+ }), finalize(() => refreshToken$ = null), share());
48
+ return refreshToken$;
49
+ }
50
+ }));
51
+ };
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYW5ldHMvbWVyY3VyeS9hdXRoLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0UsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkksT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFNUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxRQUFvQjtJQUNyRCxZQUFZO0lBQ1osSUFBSSxhQUFhLEdBQThCLElBQUksQ0FBQztJQUVwRCxPQUFPLENBQUMsT0FBNkIsRUFBRSxJQUFtQixFQUFrQyxFQUFFO1FBQzVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQ3ZCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FDL0IsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3ZCLEtBQUssQ0FBQztZQUNKLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLENBQUMsS0FBd0IsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNqRCxNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUVELGFBQWEsS0FBSyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQ3hELEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDWCxJQUFJLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sTUFBTSxDQUFDO29CQUNmLENBQUM7b0JBRUQsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDakIseUNBQXlDO29CQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFFbkQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7d0JBQzdDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO3dCQUNqRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELENBQUM7b0JBRUQsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUV6QixNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUNwQyxLQUFLLEVBQUUsQ0FDUixDQUFDO2dCQUVGLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7U0FDRixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwSGFuZGxlckZuLCBIdHRwSW50ZXJjZXB0b3JGbiwgSHR0cFJlcXVlc3QsIEh0dHBTdGF0dXNDb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RvciwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQVVUSF9SRURJUkVDVF9UT0tFTiwgQVVUSF9UT0tFTiwgQ2FjaGVNYW5hZ2VyLCBDQVRDSF9IVFRQX0VSUk9SX1RPS0VOIH0gZnJvbSAnQHNvbGFyLWFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tICdAc29sYXIta2l0L3BsYW5ldHMvc3VuJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAsIE9ic2VydmFibGUsIHJldHJ5LCBzaGFyZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNZXJjdXJ5U2VydmljZSB9IGZyb20gJy4vbWVyY3VyeS5zZXJ2aWNlJztcblxuLyoqXG4gKiBNZXJjdXJ5IOiupOivgeaLpuaIquWZqFxuICogLSDkvb/nlKgge0BsaW5rIEFVVEhfVE9LRU59IOi3s+i/h+ivpeaLpuaIquWZqFxuICogLSDkvb/nlKgge0BsaW5rIEFVVEhfUkVESVJFQ1RfVE9LRU59IOWFs+mXreiupOivgeWksei0peiHquWKqOi3s+i9rOWIsCBgL2xvZ2luYFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dGhJbnRlcmNlcHRvcihvblVuYXV0aDogKCkgPT4gdm9pZCk6IEh0dHBJbnRlcmNlcHRvckZuIHtcbiAgLyoqIOS7pOeJjOWIt+aWsOWZqCAqL1xuICBsZXQgcmVmcmVzaFRva2VuJDogT2JzZXJ2YWJsZTxSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcmV0dXJuIChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXJGbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiA9PiB7XG4gICAgY29uc3Qgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgY29uc3QgY2FjaGVNYW5hZ2VyID0gaW5qZWN0KENhY2hlTWFuYWdlcik7XG4gICAgY29uc3QgbWVyY3VyeVNlcnZpY2UgPSBpbmplY3QoTWVyY3VyeVNlcnZpY2UpO1xuICAgIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAgIGlmICghcmVxdWVzdC5jb250ZXh0LmdldChBVVRIX1RPS0VOKSkge1xuICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgfVxuXG4gICAgaWYgKHJlZnJlc2hUb2tlbiQpIHtcbiAgICAgIHJldHVybiByZWZyZXNoVG9rZW4kLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBuZXh0KHJlcXVlc3QpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dChyZXF1ZXN0KS5waXBlKFxuICAgICAgcmV0cnkoe1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgZGVsYXk6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzICE9PSBIdHRwU3RhdHVzQ29kZS5VbmF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlZnJlc2hUb2tlbiQgfHw9IG1lcmN1cnlTZXJ2aWNlLnJlZnJlc2hDZXJ0aWZpY2F0ZSgpLnBpcGUoXG4gICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAvLyDlpoLmnpzliLfmlrDku6TniYzpg73lh7rplJnkuobvvIzliJnov5nkupvnrYnlvoXliLfmlrDku6TniYznmoTor7fmsYLkuZ/kuI3pnIDopoHmjZXojrcgSFRUUCDplJnor6/kuoZcbiAgICAgICAgICAgICAgcmVxdWVzdC5jb250ZXh0LnNldChDQVRDSF9IVFRQX0VSUk9SX1RPS0VOLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuY29udGV4dC5nZXQoQVVUSF9SRURJUkVDVF9UT0tFTikpIHtcbiAgICAgICAgICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IG9uVW5hdXRoKCkpXG4gICAgICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJywgeyByZWRpcmVjdDogcm91dGVyLnVybCB9XSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYWNoZU1hbmFnZXIucmV2b2tlQWxsKCk7XG5cbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHJlZnJlc2hUb2tlbiQgPSBudWxsKSxcbiAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHJlZnJlc2hUb2tlbiQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './auth.interceptor';
2
+ export * from './mercury.service';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGFuZXRzL21lcmN1cnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hdXRoLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vbWVyY3VyeS5zZXJ2aWNlJztcbiJdfQ==
@@ -0,0 +1,68 @@
1
+ import { HttpClient, HttpContext, HttpParams } from '@angular/common/http';
2
+ import { Injectable, inject } from '@angular/core';
3
+ import { SOLAR_CONFIG } from '@solar-angular/core';
4
+ import { AUTH_TOKEN, CATCH_HTTP_ERROR_TOKEN, CATCH_RESULT_ERROR_TOKEN, CacheManager } from '@solar-angular/http';
5
+ import { tap } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ export class MercuryService {
8
+ constructor() {
9
+ this.config = inject(SOLAR_CONFIG);
10
+ this.http = inject(HttpClient);
11
+ this.cacheManager = inject(CacheManager);
12
+ }
13
+ auth(username, password, remember, options) {
14
+ return this.http.post(`${this.config.mercuryUrl}/auth`, new HttpParams({
15
+ fromObject: {
16
+ username,
17
+ password,
18
+ remember,
19
+ grant_type: 'password',
20
+ client_id: this.config.clientId,
21
+ captcha: encodeURIComponent(options.captcha)
22
+ }
23
+ }).toString(), {
24
+ headers: {
25
+ 'X-Requested-With': 'XMLHttpRequest',
26
+ 'Content-type': 'application/x-www-form-urlencoded; charset=utf-8',
27
+ Authorization: 'Basic ' + btoa(`${this.config.clientId}:${options.clientSecret}`)
28
+ },
29
+ context: new HttpContext()
30
+ .set(AUTH_TOKEN, false)
31
+ .set(CATCH_RESULT_ERROR_TOKEN, false)
32
+ .set(CATCH_HTTP_ERROR_TOKEN, false)
33
+ });
34
+ }
35
+ refreshCertificate() {
36
+ return this.http.post(`${this.config.mercuryUrl}/auth`, null, {
37
+ headers: {
38
+ 'X-Requested-With': 'XMLHttpRequest',
39
+ Authorization: 'Basic ' + btoa(`${this.config.clientId}:refresh`)
40
+ },
41
+ params: {
42
+ client_id: this.config.clientId,
43
+ grant_type: 'refresh_token',
44
+ },
45
+ context: new HttpContext()
46
+ .set(AUTH_TOKEN, false)
47
+ .set(CATCH_RESULT_ERROR_TOKEN, false)
48
+ .set(CATCH_HTTP_ERROR_TOKEN, false)
49
+ });
50
+ }
51
+ leave() {
52
+ return this.http.post(`${this.config.mercuryUrl}/leave`, null, {
53
+ context: new HttpContext()
54
+ .set(AUTH_TOKEN, false)
55
+ .set(CATCH_RESULT_ERROR_TOKEN, false)
56
+ .set(CATCH_HTTP_ERROR_TOKEN, false)
57
+ }).pipe(tap(({ code }) => code === 0 && this.cacheManager.revokeAll()));
58
+ }
59
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MercuryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
60
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MercuryService, providedIn: 'root' }); }
61
+ }
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MercuryService, decorators: [{
63
+ type: Injectable,
64
+ args: [{
65
+ providedIn: 'root'
66
+ }]
67
+ }] });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyY3VyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhbmV0cy9tZXJjdXJ5L21lcmN1cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUszQixNQUFNLE9BQU8sY0FBYztJQUgzQjtRQUlxQixXQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlCLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7S0F3RHhEO0lBdERDLElBQUksQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsUUFBaUIsRUFBRSxPQUFrRDtRQUM1RyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLE9BQU8sRUFDNUQsSUFBSSxVQUFVLENBQUM7WUFDYixVQUFVLEVBQUU7Z0JBQ1YsUUFBUTtnQkFDUixRQUFRO2dCQUNSLFFBQVE7Z0JBQ1IsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQy9CLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2FBQzdDO1NBQ0YsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUNiO1lBQ0UsT0FBTyxFQUFFO2dCQUNQLGtCQUFrQixFQUFFLGdCQUFnQjtnQkFDcEMsY0FBYyxFQUFFLGtEQUFrRDtnQkFDbEUsYUFBYSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDbEY7WUFDRCxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUU7aUJBQ3ZCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO2lCQUN0QixHQUFHLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDO2lCQUNwQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO1NBQ3RDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxPQUFPLEVBQUUsSUFBSSxFQUFFO1lBQ3BFLE9BQU8sRUFBRTtnQkFDUCxrQkFBa0IsRUFBRSxnQkFBZ0I7Z0JBQ3BDLGFBQWEsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLFVBQVUsQ0FBQzthQUNsRTtZQUNELE1BQU0sRUFBRTtnQkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2dCQUMvQixVQUFVLEVBQUUsZUFBZTthQUM1QjtZQUNELE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRTtpQkFDdkIsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7aUJBQ3RCLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUM7aUJBQ3BDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUM7U0FDdEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDckUsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFO2lCQUN2QixHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQztpQkFDdEIsR0FBRyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQztpQkFDcEMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUMvRCxDQUFDO0lBQ0osQ0FBQzsrR0F6RFUsY0FBYzttSEFBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwQ29udGV4dCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU09MQVJfQ09ORklHIH0gZnJvbSAnQHNvbGFyLWFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBVVRIX1RPS0VOLCBDQVRDSF9IVFRQX0VSUk9SX1RPS0VOLCBDQVRDSF9SRVNVTFRfRVJST1JfVE9LRU4sIENhY2hlTWFuYWdlciB9IGZyb20gJ0Bzb2xhci1hbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSAnQHNvbGFyLWtpdC9wbGFuZXRzL3N1bic7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTWVyY3VyeVNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFNPTEFSX0NPTkZJRyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FjaGVNYW5hZ2VyID0gaW5qZWN0KENhY2hlTWFuYWdlcik7XG5cbiAgYXV0aCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCByZW1lbWJlcjogYm9vbGVhbiwgb3B0aW9uczogeyBjbGllbnRTZWNyZXQ6IHN0cmluZywgY2FwdGNoYTogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8UmVzdWx0PihgJHt0aGlzLmNvbmZpZy5tZXJjdXJ5VXJsfS9hdXRoYCxcbiAgICAgIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHJlbWVtYmVyLFxuICAgICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICBjYXB0Y2hhOiBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5jYXB0Y2hhKVxuICAgICAgICB9XG4gICAgICB9KS50b1N0cmluZygpLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLFxuICAgICAgICAgICdDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiAnQmFzaWMgJyArIGJ0b2EoYCR7dGhpcy5jb25maWcuY2xpZW50SWR9OiR7b3B0aW9ucy5jbGllbnRTZWNyZXR9YClcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KClcbiAgICAgICAgICAuc2V0KEFVVEhfVE9LRU4sIGZhbHNlKVxuICAgICAgICAgIC5zZXQoQ0FUQ0hfUkVTVUxUX0VSUk9SX1RPS0VOLCBmYWxzZSlcbiAgICAgICAgICAuc2V0KENBVENIX0hUVFBfRVJST1JfVE9LRU4sIGZhbHNlKVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZWZyZXNoQ2VydGlmaWNhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFJlc3VsdD4oYCR7dGhpcy5jb25maWcubWVyY3VyeVVybH0vYXV0aGAsIG51bGwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLFxuICAgICAgICBBdXRob3JpemF0aW9uOiAnQmFzaWMgJyArIGJ0b2EoYCR7dGhpcy5jb25maWcuY2xpZW50SWR9OnJlZnJlc2hgKVxuICAgICAgfSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICB9LFxuICAgICAgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KClcbiAgICAgICAgLnNldChBVVRIX1RPS0VOLCBmYWxzZSlcbiAgICAgICAgLnNldChDQVRDSF9SRVNVTFRfRVJST1JfVE9LRU4sIGZhbHNlKVxuICAgICAgICAuc2V0KENBVENIX0hUVFBfRVJST1JfVE9LRU4sIGZhbHNlKVxuICAgIH0pO1xuICB9XG5cbiAgbGVhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFJlc3VsdD4oYCR7dGhpcy5jb25maWcubWVyY3VyeVVybH0vbGVhdmVgLCBudWxsLCB7XG4gICAgICBjb250ZXh0OiBuZXcgSHR0cENvbnRleHQoKVxuICAgICAgICAuc2V0KEFVVEhfVE9LRU4sIGZhbHNlKVxuICAgICAgICAuc2V0KENBVENIX1JFU1VMVF9FUlJPUl9UT0tFTiwgZmFsc2UpXG4gICAgICAgIC5zZXQoQ0FUQ0hfSFRUUF9FUlJPUl9UT0tFTiwgZmFsc2UpXG4gICAgfSkucGlwZShcbiAgICAgIHRhcCgoeyBjb2RlIH0pID0+IGNvZGUgPT09IDAgJiYgdGhpcy5jYWNoZU1hbmFnZXIucmV2b2tlQWxsKCkpXG4gICAgKTtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci1wbGFuZXRzLW1lcmN1cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGFuZXRzL21lcmN1cnkvc29sYXItYW5ndWxhci1wbGFuZXRzLW1lcmN1cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci1wbGFuZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvcGxhbmV0cy9zb2xhci1hbmd1bGFyLXBsYW5ldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class GenderPipe {
4
+ transform(value) {
5
+ return {
6
+ [0 /* Gender.Woman */]: '女',
7
+ [1 /* Gender.Man */]: '男',
8
+ }[value];
9
+ }
10
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GenderPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
11
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: GenderPipe, isStandalone: true, name: "gender" }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GenderPipe, decorators: [{
14
+ type: Pipe,
15
+ args: [{
16
+ name: 'gender',
17
+ standalone: true
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGFuZXRzL3N1bi9nZW5kZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFPcEQsTUFBTSxPQUFPLFVBQVU7SUFFckIsU0FBUyxDQUFDLEtBQWE7UUFDckIsT0FBTztZQUNMLHNCQUFjLEVBQUUsR0FBRztZQUNuQixvQkFBWSxFQUFFLEdBQUc7U0FDbEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNYLENBQUM7K0dBUFUsVUFBVTs2R0FBVixVQUFVOzs0RkFBVixVQUFVO2tCQUp0QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdlbmRlciB9IGZyb20gJ0Bzb2xhci1raXQvcGxhbmV0cy9zdW4nO1xuXG5AUGlwZSh7XG4gIG5hbWU6ICdnZW5kZXInLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEdlbmRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICB0cmFuc2Zvcm0odmFsdWU6IEdlbmRlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtHZW5kZXIuV29tYW5dOiAn5aWzJyxcbiAgICAgIFtHZW5kZXIuTWFuXTogJ+eUtycsXG4gICAgfVt2YWx1ZV07XG4gIH1cblxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './gender.pipe';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGFuZXRzL3N1bi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZ2VuZGVyLnBpcGUnO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci1wbGFuZXRzLXN1bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYW5ldHMvc3VuL3NvbGFyLWFuZ3VsYXItcGxhbmV0cy1zdW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,318 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable, ChangeDetectorRef, Pipe } from '@angular/core';
3
+ import { filterResult, unpackResult } from '@solar-kit/planets/sun';
4
+ import { HttpClient, HttpContext } from '@angular/common/http';
5
+ import { SOLAR_CONFIG, tree2list } from '@solar-angular/core';
6
+ import { CacheManager, CACHEABLE_TOKEN, AUTH_REDIRECT_TOKEN, CATCH_HTTP_ERROR_TOKEN, API_TOKEN } from '@solar-angular/http';
7
+ import { map, catchError, of, tap } from 'rxjs';
8
+ import { Router } from '@angular/router';
9
+
10
+ function normalizeMenus(menus) {
11
+ const dashboard = {
12
+ id: 0,
13
+ fullName: 'Dashboard',
14
+ icon: 'dashboard',
15
+ seq: 0,
16
+ url: 'dashboard',
17
+ };
18
+ menus = menus.concat(dashboard);
19
+ menus.forEach(o => {
20
+ o.level = 1;
21
+ o.children = menus.filter(child => child.pid === o.id).sort((a, b) => a.seq - b.seq);
22
+ o.children.forEach(child => child.parent = o);
23
+ });
24
+ // 设置 level
25
+ menus.forEach(o => {
26
+ let menu = o;
27
+ while (menu?.parent) { // 如果有上一级,就自增一
28
+ o.level++;
29
+ menu = menu.parent;
30
+ }
31
+ });
32
+ // 设置末端子节点的 path
33
+ menus.filter(o => o.children?.length === 0).forEach(o => {
34
+ let segment = '', menu = o;
35
+ while (menu) {
36
+ segment = '/' + menu.url + segment;
37
+ menu = menu.parent;
38
+ }
39
+ o.path = segment;
40
+ });
41
+ menus.sort((a, b) => a.seq - b.seq);
42
+ return menus;
43
+ }
44
+ class EarthService {
45
+ constructor() {
46
+ this.config = inject(SOLAR_CONFIG);
47
+ this.http = inject(HttpClient);
48
+ this.cacheManager = inject(CacheManager);
49
+ }
50
+ checkAuth() {
51
+ // 这里直接用 menus API 来判断是否已认证
52
+ return this.http.get(`${this.config.earthUrl}/api/role-menus/${this.config.clientId}`, {
53
+ context: new HttpContext()
54
+ .set(CACHEABLE_TOKEN, true)
55
+ .set(AUTH_REDIRECT_TOKEN, false)
56
+ .set(CATCH_HTTP_ERROR_TOKEN, false)
57
+ }).pipe(map(() => true), catchError(() => of(false)));
58
+ }
59
+ checkPermission(segments) {
60
+ return this.http.get(`${this.config.earthUrl}/api/role-menus/${this.config.clientId}`, {
61
+ context: new HttpContext()
62
+ .set(CACHEABLE_TOKEN, true)
63
+ .set(AUTH_REDIRECT_TOKEN, false)
64
+ .set(CATCH_HTTP_ERROR_TOKEN, false)
65
+ }).pipe(map(({ data }) => {
66
+ const tree = normalizeMenus(data);
67
+ const list = tree2list(tree);
68
+ // 我们的权限菜单只有两级,我们只判断前两个 path 片段
69
+ const path = '/' + segments
70
+ .filter((_, index) => index <= 1)
71
+ .map(o => o.path.replace(/;.+$/, '')) // path 中可能有参数,我们只取前面的部分:/a;id=1 => /a
72
+ .join('/');
73
+ return list.some(menu => menu.path === path);
74
+ }), catchError(() => of(false)));
75
+ }
76
+ account() {
77
+ return this.http.get(`${this.config.earthUrl}/api/acc/info`, {
78
+ context: new HttpContext().set(CACHEABLE_TOKEN, true)
79
+ });
80
+ }
81
+ user() {
82
+ return this.http.get(`${this.config.earthUrl}/api/usr/info`, {
83
+ context: new HttpContext().set(CACHEABLE_TOKEN, true)
84
+ });
85
+ }
86
+ menus() {
87
+ return this.http.get(`${this.config.earthUrl}/api/role-menus/${this.config.clientId}`, {
88
+ context: new HttpContext().set(CACHEABLE_TOKEN, true)
89
+ }).pipe(filterResult(), map(({ data }) => normalizeMenus(data)));
90
+ }
91
+ /**
92
+ * 变更密码
93
+ * @param o
94
+ * @returns
95
+ */
96
+ changePassword(o) {
97
+ return this.http.post(`${this.config.earthUrl}/api/user/psw`, o).pipe(tap(({ code }) => {
98
+ if (code === 0) {
99
+ this.cacheManager.revokeAll();
100
+ }
101
+ }));
102
+ }
103
+ channels(origin) {
104
+ return this.http.get(`${this.config.earthUrl}/api/channel/${origin}`, {
105
+ context: new HttpContext().set(CACHEABLE_TOKEN, true)
106
+ });
107
+ }
108
+ categories(origin) {
109
+ return this.http.get(`${this.config.earthUrl}/api/category/${origin}`, {
110
+ context: new HttpContext().set(CACHEABLE_TOKEN, true)
111
+ });
112
+ }
113
+ address(pid) {
114
+ return this.http.get(`${this.config.earthUrl}/api/addrs`, {
115
+ params: pid ? { pid } : undefined,
116
+ context: new HttpContext().set(CACHEABLE_TOKEN, true)
117
+ });
118
+ }
119
+ avatarUploadKey() {
120
+ return this.http.get(`${this.config.earthUrl}/api/qiniu/avatar/upload-key`);
121
+ }
122
+ mediaUploadKeys(keySize = 1) {
123
+ return this.http.get(`${this.config.earthUrl}/api/qiniu/media/upload-keys`, {
124
+ params: { keySize }
125
+ });
126
+ }
127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EarthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
128
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EarthService, providedIn: 'root' }); }
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EarthService, decorators: [{
131
+ type: Injectable,
132
+ args: [{
133
+ providedIn: 'root'
134
+ }]
135
+ }] });
136
+
137
+ class CategoryPipe {
138
+ constructor() {
139
+ this.latestId = null;
140
+ this.latestOrigin = null;
141
+ this.latestValue = null;
142
+ this.service = inject(EarthService);
143
+ this.cdr = inject(ChangeDetectorRef);
144
+ }
145
+ transform(id, origin) {
146
+ if (id !== this.latestId || origin !== this.latestOrigin) {
147
+ this.latestId = id;
148
+ this.latestOrigin = origin;
149
+ // 这个 API 是带缓存的,不用担心重复执行
150
+ this.service.categories(origin).pipe(filterResult()).subscribe(({ data }) => {
151
+ this.latestValue = data.find(o => o.id === id) ?? null;
152
+ this.cdr.markForCheck();
153
+ });
154
+ }
155
+ return this.latestValue;
156
+ }
157
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CategoryPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
158
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: CategoryPipe, isStandalone: true, name: "category", pure: false }); }
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CategoryPipe, decorators: [{
161
+ type: Pipe,
162
+ args: [{
163
+ name: 'category',
164
+ pure: false,
165
+ standalone: true
166
+ }]
167
+ }] });
168
+ class UnitCategoryPipe extends CategoryPipe {
169
+ transform(value) {
170
+ return super.transform(value, 13 /* Origin.Unit */);
171
+ }
172
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UnitCategoryPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
173
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UnitCategoryPipe, isStandalone: true, name: "unit", pure: false }); }
174
+ }
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UnitCategoryPipe, decorators: [{
176
+ type: Pipe,
177
+ args: [{
178
+ name: 'unit',
179
+ pure: false,
180
+ standalone: true
181
+ }]
182
+ }] });
183
+
184
+ function channelResolver(origin) {
185
+ return () => inject(EarthService).channels(origin).pipe(unpackResult());
186
+ }
187
+ function categoryResolver(origin) {
188
+ return () => inject(EarthService).categories(origin).pipe(unpackResult());
189
+ }
190
+
191
+ /**
192
+ * 认证路由守卫
193
+ * 认证后才允许进入,否则将导航到登录页(/login)
194
+ * @param options
195
+ */
196
+ function authMatchGuard(options) {
197
+ return (_route, segments) => {
198
+ const router = inject(Router);
199
+ const earthService = inject(EarthService);
200
+ const redirectUrl = {
201
+ redirect: router.createUrlTree(['/' + segments.join('/')], {
202
+ queryParams: Object.fromEntries(new URLSearchParams(location.search))
203
+ }).toString()
204
+ };
205
+ return earthService.checkAuth().pipe(map(bool => {
206
+ if (!bool) {
207
+ return router.createUrlTree([
208
+ '/login',
209
+ options?.redirect === undefined || options.redirect ? redirectUrl : {}
210
+ ]);
211
+ }
212
+ return bool;
213
+ }));
214
+ };
215
+ }
216
+
217
+ /**
218
+ * 权限路由守卫
219
+ * 有权限才允许进入,否则导航到无权限页(/forbidden)
220
+ */
221
+ function permissionMatchGuard() {
222
+ return (_route, segments) => {
223
+ const router = inject(Router);
224
+ const earthService = inject(EarthService);
225
+ return earthService.checkPermission(segments).pipe(map(bool => bool || router.parseUrl('/forbidden')));
226
+ };
227
+ }
228
+
229
+ /**
230
+ * 未认证路由守卫
231
+ * 未认证才允许进入,否则将导航到首页
232
+ */
233
+ function unauthMatchGuard() {
234
+ return (_route, _segments) => {
235
+ const router = inject(Router);
236
+ const earthService = inject(EarthService);
237
+ return earthService.checkAuth().pipe(map(bool => bool ? router.parseUrl('/') : true));
238
+ };
239
+ }
240
+
241
+ class MenuService {
242
+ constructor() {
243
+ this.earthService = inject(EarthService);
244
+ this.router = inject(Router);
245
+ /**
246
+ * 当前的菜单数组
247
+ */
248
+ this.menus$ = this.earthService.menus().pipe(map(data => {
249
+ const menus = [];
250
+ const url = this.pureUrl;
251
+ let end = data.find(o => o.url === url);
252
+ while (end) {
253
+ menus.unshift(end);
254
+ end = end.parent;
255
+ }
256
+ return menus;
257
+ }));
258
+ }
259
+ get pureUrl() {
260
+ // 只取最后一段 /m/staff;a=b?c=d => staff
261
+ return this.router.url.replace(/(^.+\/)|((;|\?).+$)/g, '');
262
+ }
263
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
264
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuService, providedIn: 'root' }); }
265
+ }
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuService, decorators: [{
267
+ type: Injectable,
268
+ args: [{
269
+ providedIn: 'root'
270
+ }]
271
+ }] });
272
+
273
+ class ObjectStorageService {
274
+ constructor() {
275
+ this.http = inject(HttpClient);
276
+ }
277
+ /**
278
+ * 目前只支持了 qiniu oss
279
+ * @param filePath
280
+ * @param options
281
+ * @returns
282
+ */
283
+ upload(file, key, options) {
284
+ const formData = new FormData();
285
+ formData.set('key', key);
286
+ formData.set('file', file);
287
+ formData.set('token', options.token);
288
+ return this.http.post(`https://${options.host}`, formData, {
289
+ context: new HttpContext().set(API_TOKEN, false)
290
+ });
291
+ }
292
+ uploadWithEvents(file, key, options) {
293
+ const formData = new FormData();
294
+ formData.set('key', key);
295
+ formData.set('file', file);
296
+ formData.set('token', options.token);
297
+ return this.http.post(`https://${options.host}`, formData, {
298
+ context: new HttpContext().set(API_TOKEN, false),
299
+ observe: 'events',
300
+ reportProgress: true,
301
+ });
302
+ }
303
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
304
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectStorageService, providedIn: 'root' }); }
305
+ }
306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectStorageService, decorators: [{
307
+ type: Injectable,
308
+ args: [{
309
+ providedIn: 'root'
310
+ }]
311
+ }] });
312
+
313
+ /**
314
+ * Generated bundle index. Do not edit.
315
+ */
316
+
317
+ export { CategoryPipe, EarthService, MenuService, ObjectStorageService, UnitCategoryPipe, authMatchGuard, categoryResolver, channelResolver, permissionMatchGuard, unauthMatchGuard };
318
+ //# sourceMappingURL=solar-angular-planets-earth.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-angular-planets-earth.mjs","sources":["../../../packages/planets/earth/earth.service.ts","../../../packages/planets/earth/earth.pipe.ts","../../../packages/planets/earth/earth.resolver.ts","../../../packages/planets/earth/guards/auth.guard.ts","../../../packages/planets/earth/guards/permission.guard.ts","../../../packages/planets/earth/guards/unauth.guard.ts","../../../packages/planets/earth/menu.service.ts","../../../packages/planets/earth/object-storage.service.ts","../../../packages/planets/earth/solar-angular-planets-earth.ts"],"sourcesContent":["import { HttpClient, HttpContext } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { UrlSegment } from '@angular/router';\nimport { SOLAR_CONFIG, tree2list } from '@solar-angular/core';\nimport { AUTH_REDIRECT_TOKEN, CACHEABLE_TOKEN, CacheManager, CATCH_HTTP_ERROR_TOKEN } from '@solar-angular/http';\nimport { AccountName, Address, Category, Channel, Menu, Origin, UploadKeys, UserInfo } from '@solar-kit/planets/earth';\nimport { filterResult, Result } from '@solar-kit/planets/sun';\nimport { catchError, map, of, tap } from 'rxjs';\n\nfunction normalizeMenus(menus: Menu[]) {\n const dashboard = {\n id: 0,\n fullName: 'Dashboard',\n icon: 'dashboard',\n seq: 0,\n url: 'dashboard',\n } as Menu;\n\n menus = menus.concat(dashboard);\n\n menus.forEach(o => {\n o.level = 1;\n o.children = menus.filter(child => child.pid === o.id).sort((a, b) => a.seq - b.seq);\n o.children!.forEach(child => child.parent = o);\n });\n\n // 设置 level\n menus.forEach(o => {\n let menu = o;\n while (menu?.parent) { // 如果有上一级,就自增一\n o.level!++;\n menu = menu.parent;\n }\n });\n\n // 设置末端子节点的 path\n menus.filter(o => o.children?.length === 0).forEach(o => {\n let segment = '', menu: Menu | undefined = o;\n\n while (menu) {\n segment = '/' + menu.url + segment;\n menu = menu.parent;\n }\n\n o.path = segment;\n });\n\n menus.sort((a, b) => a.seq - b.seq);\n\n return menus;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EarthService {\n readonly config = inject(SOLAR_CONFIG);\n readonly http = inject(HttpClient);\n readonly cacheManager = inject(CacheManager);\n\n checkAuth() {\n // 这里直接用 menus API 来判断是否已认证\n return this.http.get<Result<Menu[]>>(`${this.config.earthUrl}/api/role-menus/${this.config.clientId}`, {\n context: new HttpContext()\n .set(CACHEABLE_TOKEN, true)\n .set(AUTH_REDIRECT_TOKEN, false)\n .set(CATCH_HTTP_ERROR_TOKEN, false)\n }).pipe(\n map(() => true),\n catchError(() => of(false))\n );\n }\n\n checkPermission(segments: UrlSegment[]) {\n return this.http.get<Result<Menu[]>>(`${this.config.earthUrl}/api/role-menus/${this.config.clientId}`, {\n context: new HttpContext()\n .set(CACHEABLE_TOKEN, true)\n .set(AUTH_REDIRECT_TOKEN, false)\n .set(CATCH_HTTP_ERROR_TOKEN, false)\n }).pipe(\n map(({ data }) => {\n const tree = normalizeMenus(data);\n const list = tree2list(tree);\n // 我们的权限菜单只有两级,我们只判断前两个 path 片段\n const path = '/' + segments\n .filter((_, index) => index <= 1)\n .map(o => o.path.replace(/;.+$/, '')) // path 中可能有参数,我们只取前面的部分:/a;id=1 => /a\n .join('/');\n return list.some(menu => menu.path === path);\n }),\n catchError(() => of(false))\n );\n }\n\n account() {\n return this.http.get<Result<AccountName>>(`${this.config.earthUrl}/api/acc/info`, {\n context: new HttpContext().set(CACHEABLE_TOKEN, true)\n });\n }\n\n user() {\n return this.http.get<Result<UserInfo>>(`${this.config.earthUrl}/api/usr/info`, {\n context: new HttpContext().set(CACHEABLE_TOKEN, true)\n });\n }\n\n menus() {\n return this.http.get<Result<Menu[]>>(`${this.config.earthUrl}/api/role-menus/${this.config.clientId}`, {\n context: new HttpContext().set(CACHEABLE_TOKEN, true)\n }).pipe(\n filterResult(),\n map(({ data }) => normalizeMenus(data))\n );\n }\n\n /**\n * 变更密码\n * @param o\n * @returns\n */\n changePassword(o: { oldPsw: string, newPsw: string }) {\n return this.http.post<Result>(`${this.config.earthUrl}/api/user/psw`, o).pipe(\n tap(({ code }) => {\n if (code === 0) {\n this.cacheManager.revokeAll();\n }\n })\n );\n }\n\n channels(origin: Origin) {\n return this.http.get<Result<Channel[]>>(`${this.config.earthUrl}/api/channel/${origin}`, {\n context: new HttpContext().set(CACHEABLE_TOKEN, true)\n });\n }\n\n categories(origin: Origin) {\n return this.http.get<Result<Category[]>>(`${this.config.earthUrl}/api/category/${origin}`, {\n context: new HttpContext().set(CACHEABLE_TOKEN, true)\n });\n }\n\n address(pid?: number) {\n return this.http.get<Result<Address[]>>(`${this.config.earthUrl}/api/addrs`, {\n params: pid ? { pid } : undefined,\n context: new HttpContext().set(CACHEABLE_TOKEN, true)\n });\n }\n\n avatarUploadKey() {\n return this.http.get<Result<UploadKeys>>(`${this.config.earthUrl}/api/qiniu/avatar/upload-key`);\n }\n\n mediaUploadKeys(keySize = 1) {\n return this.http.get<Result<UploadKeys>>(`${this.config.earthUrl}/api/qiniu/media/upload-keys`, {\n params: { keySize }\n });\n }\n}\n","import { ChangeDetectorRef, inject, Pipe, PipeTransform } from '@angular/core';\nimport { Category, Origin } from '@solar-kit/planets/earth';\nimport { filterResult } from '@solar-kit/planets/sun';\nimport { EarthService } from './earth.service';\n\n@Pipe({\n name: 'category',\n pure: false,\n standalone: true\n})\nexport class CategoryPipe implements PipeTransform {\n protected latestId: Category['id'] | null = null;\n protected latestOrigin: Origin | null = null;\n protected latestValue: Category | null = null;\n protected readonly service = inject(EarthService);\n protected readonly cdr = inject(ChangeDetectorRef);\n\n transform(id: Category['id'], origin: Origin) {\n if (id !== this.latestId || origin !== this.latestOrigin) {\n this.latestId = id;\n this.latestOrigin = origin;\n\n // 这个 API 是带缓存的,不用担心重复执行\n this.service.categories(origin).pipe(\n filterResult()\n ).subscribe(({ data }) => {\n this.latestValue = data.find(o => o.id === id) ?? null;\n this.cdr.markForCheck();\n });\n }\n\n return this.latestValue;\n }\n\n}\n\n@Pipe({\n name: 'unit',\n pure: false,\n standalone: true\n})\nexport class UnitCategoryPipe extends CategoryPipe implements PipeTransform {\n override transform(value: Category['id']) {\n return super.transform(value, Origin.Unit);\n }\n}\n","import { inject } from '@angular/core';\nimport { ResolveFn } from '@angular/router';\nimport { Category, Channel, Origin } from '@solar-kit/planets/earth';\nimport { unpackResult } from '@solar-kit/planets/sun';\nimport { EarthService } from './earth.service';\n\nexport function channelResolver(origin: Origin): ResolveFn<Channel[]> {\n return () => inject(EarthService).channels(origin).pipe(unpackResult());\n}\n\nexport function categoryResolver(origin: Origin): ResolveFn<Category[]> {\n return () => inject(EarthService).categories(origin).pipe(unpackResult());\n}\n","import { inject } from '@angular/core';\nimport { CanMatchFn, Route, Router, UrlSegment, UrlTree } from '@angular/router';\nimport { Observable, map } from 'rxjs';\nimport { EarthService } from '../earth.service';\n\ninterface AuthMatchGuardOptions {\n /** 是否在登陆后重定向回当前页 */\n redirect?: boolean;\n}\n\n/**\n * 认证路由守卫\n * 认证后才允许进入,否则将导航到登录页(/login)\n * @param options\n */\nexport function authMatchGuard(options?: AuthMatchGuardOptions): CanMatchFn {\n return (_route: Route, segments: UrlSegment[]): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree => {\n const router = inject(Router);\n const earthService = inject(EarthService);\n\n const redirectUrl = {\n redirect: router.createUrlTree(\n ['/' + segments.join('/')],\n {\n queryParams: Object.fromEntries(new URLSearchParams(location.search))\n }\n ).toString()\n };\n\n return earthService.checkAuth().pipe(\n map(bool => {\n if (!bool) {\n return router.createUrlTree([\n '/login',\n options?.redirect === undefined || options.redirect ? redirectUrl : {}\n ]);\n }\n\n return bool;\n })\n );\n };\n}\n","import { inject } from '@angular/core';\nimport { CanMatchFn, Route, Router, UrlSegment, UrlTree } from '@angular/router';\nimport { Observable, map } from 'rxjs';\nimport { EarthService } from '../earth.service';\n\n/**\n * 权限路由守卫\n * 有权限才允许进入,否则导航到无权限页(/forbidden)\n */\nexport function permissionMatchGuard(): CanMatchFn {\n return (_route: Route, segments: UrlSegment[]): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree => {\n const router = inject(Router);\n const earthService = inject(EarthService);\n\n return earthService.checkPermission(segments).pipe(\n map(bool =>\n bool || router.parseUrl('/forbidden')\n )\n );\n };\n}\n","import { inject } from '@angular/core';\nimport { CanMatchFn, Route, Router, UrlSegment, UrlTree } from '@angular/router';\nimport { Observable, map } from 'rxjs';\nimport { EarthService } from '../earth.service';\n\n/**\n * 未认证路由守卫\n * 未认证才允许进入,否则将导航到首页\n */\nexport function unauthMatchGuard(): CanMatchFn {\n return (_route: Route, _segments: UrlSegment[]): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree => {\n const router = inject(Router);\n const earthService = inject(EarthService);\n\n return earthService.checkAuth().pipe(\n map(bool => bool ? router.parseUrl('/') : true),\n );\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Menu } from '@solar-kit/planets/earth';\nimport { map, Observable } from 'rxjs';\nimport { EarthService } from './earth.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MenuService {\n private readonly earthService = inject(EarthService);\n private readonly router = inject(Router);\n\n private get pureUrl() {\n // 只取最后一段 /m/staff;a=b?c=d => staff\n return this.router.url.replace(/(^.+\\/)|((;|\\?).+$)/g, '');\n }\n\n /**\n * 当前的菜单数组\n */\n readonly menus$: Observable<Menu[]> = this.earthService.menus().pipe(\n map(data => {\n const menus: Menu[] = [];\n const url = this.pureUrl;\n let end = data.find(o => o.url === url);\n\n while (end) {\n menus.unshift(end);\n end = end.parent;\n }\n\n return menus;\n })\n );\n}\n","import { HttpClient, HttpContext } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { API_TOKEN } from '@solar-angular/http';\nimport { UploadKeys } from '@solar-kit/planets/earth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ObjectStorageService {\n private readonly http = inject(HttpClient);\n\n /**\n * 目前只支持了 qiniu oss\n * @param filePath\n * @param options\n * @returns\n */\n upload(file: Blob, key: string, options: Pick<UploadKeys, 'host' | 'token'>) {\n const formData = new FormData();\n formData.set('key', key);\n formData.set('file', file);\n formData.set('token', options.token);\n\n return this.http.post<{ hash: string, key: string }>(`https://${options.host}`, formData, {\n context: new HttpContext().set(API_TOKEN, false)\n });\n }\n\n uploadWithEvents(file: Blob, key: string, options: Pick<UploadKeys, 'host' | 'token'>) {\n const formData = new FormData();\n formData.set('key', key);\n formData.set('file', file);\n formData.set('token', options.token);\n\n return this.http.post<{ hash: string, key: string }>(`https://${options.host}`, formData, {\n context: new HttpContext().set(API_TOKEN, false),\n observe: 'events',\n reportProgress: true,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}