@reskin/core 0.0.21 → 0.1.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 (45) hide show
  1. package/bundles/reskin-core-directives.umd.js +303 -163
  2. package/bundles/reskin-core-directives.umd.js.map +1 -1
  3. package/bundles/reskin-core-guards.umd.js +119 -32
  4. package/bundles/reskin-core-guards.umd.js.map +1 -1
  5. package/bundles/reskin-core-interceptors.umd.js +310 -92
  6. package/bundles/reskin-core-interceptors.umd.js.map +1 -1
  7. package/bundles/reskin-core-utils.umd.js +220 -77
  8. package/bundles/reskin-core-utils.umd.js.map +1 -1
  9. package/directives/auth.directive.d.ts +56 -9
  10. package/directives/load.styles.directive.d.ts +45 -5
  11. package/directives/string.template.outlet.directive.d.ts +68 -11
  12. package/esm2015/directives/auth.directive.js +71 -30
  13. package/esm2015/directives/load.styles.directive.js +84 -15
  14. package/esm2015/directives/string.template.outlet.directive.js +118 -60
  15. package/esm2015/guards/auth.guard.js +117 -30
  16. package/esm2015/interceptors/blob.interceptor.js +67 -28
  17. package/esm2015/interceptors/cache.interceptor.js +46 -14
  18. package/esm2015/interceptors/error.interceptor.js +104 -12
  19. package/esm2015/interceptors/public-api.js +2 -1
  20. package/esm2015/interceptors/token.interceptor.js +86 -42
  21. package/esm2015/interceptors/types.js +5 -0
  22. package/esm2015/utils/array.js +42 -22
  23. package/esm2015/utils/dom.js +29 -11
  24. package/esm2015/utils/form.js +44 -13
  25. package/esm2015/utils/store.js +101 -26
  26. package/fesm2015/reskin-core-directives.js +269 -103
  27. package/fesm2015/reskin-core-directives.js.map +1 -1
  28. package/fesm2015/reskin-core-guards.js +116 -29
  29. package/fesm2015/reskin-core-guards.js.map +1 -1
  30. package/fesm2015/reskin-core-interceptors.js +302 -91
  31. package/fesm2015/reskin-core-interceptors.js.map +1 -1
  32. package/fesm2015/reskin-core-utils.js +212 -68
  33. package/fesm2015/reskin-core-utils.js.map +1 -1
  34. package/guards/auth.guard.d.ts +85 -5
  35. package/interceptors/blob.interceptor.d.ts +30 -3
  36. package/interceptors/cache.interceptor.d.ts +28 -4
  37. package/interceptors/error.interceptor.d.ts +43 -2
  38. package/interceptors/public-api.d.ts +1 -0
  39. package/interceptors/token.interceptor.d.ts +41 -12
  40. package/interceptors/types.d.ts +68 -0
  41. package/package.json +1 -1
  42. package/utils/array.d.ts +8 -1
  43. package/utils/dom.d.ts +32 -5
  44. package/utils/form.d.ts +37 -2
  45. package/utils/store.d.ts +56 -15
@@ -1,19 +1,60 @@
1
1
  import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
2
2
  import { Observable } from 'rxjs';
3
3
  import { Router } from '@angular/router';
4
+ import { ErrorInterceptorConfig } from './types';
4
5
  import * as i0 from "@angular/core";
6
+ /**
7
+ * HTTP 错误拦截器
8
+ * 统一处理 HTTP 请求错误,包括 401 未授权错误的自动跳转
9
+ */
5
10
  export declare class ErrorInterceptor implements HttpInterceptor {
6
11
  private router;
12
+ private config;
7
13
  constructor(router: Router);
14
+ /**
15
+ * 设置拦截器配置
16
+ * @param config 配置对象
17
+ */
18
+ setConfig(config: ErrorInterceptorConfig): void;
19
+ /**
20
+ * 拦截 HTTP 请求,处理错误响应
21
+ * @param request HTTP 请求对象
22
+ * @param next 下一个拦截器处理器
23
+ * @returns Observable<HttpEvent<unknown>>
24
+ */
8
25
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
26
+ /**
27
+ * 处理 401 未授权错误
28
+ */
29
+ private handleUnauthorizedError;
30
+ /**
31
+ * 提取错误信息
32
+ * @param error HTTP 错误响应
33
+ * @returns 错误信息字符串
34
+ */
35
+ private extractErrorMessage;
9
36
  static ɵfac: i0.ɵɵFactoryDeclaration<ErrorInterceptor, never>;
10
37
  static ɵprov: i0.ɵɵInjectableDeclaration<ErrorInterceptor>;
11
38
  }
12
39
  /**
13
- * 请求错误拦截器
40
+ * 提供 HTTP 错误拦截器
41
+ * @param config 可选的配置对象
42
+ * @returns Provider 配置对象
43
+ * @example
44
+ * providers: [
45
+ * providerHttpError({ unauthorizedPath: '/login', enableLogging: true })
46
+ * ]
14
47
  */
15
- export declare function providerHttpError(): {
48
+ export declare function providerHttpError(config?: ErrorInterceptorConfig): {
49
+ provide: import("@angular/core").InjectionToken<HttpInterceptor[]>;
50
+ useFactory: (router: Router) => ErrorInterceptor;
51
+ deps: (typeof Router)[];
52
+ multi: boolean;
53
+ useClass?: undefined;
54
+ } | {
16
55
  provide: import("@angular/core").InjectionToken<HttpInterceptor[]>;
17
56
  useClass: typeof ErrorInterceptor;
18
57
  multi: boolean;
58
+ useFactory?: undefined;
59
+ deps?: undefined;
19
60
  };
@@ -1,3 +1,4 @@
1
+ export * from './types';
1
2
  export * from './token.interceptor';
2
3
  export * from './error.interceptor';
3
4
  export * from './cache.interceptor';
@@ -2,15 +2,26 @@ import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders } fro
2
2
  import { Observable } from 'rxjs';
3
3
  import { RkAuthService } from '@reskin/core/services';
4
4
  import * as i0 from "@angular/core";
5
+ /**
6
+ * Token 拦截器
7
+ * 自动为 HTTP 请求添加认证 Token
8
+ */
5
9
  export declare class TokenInterceptor implements HttpInterceptor {
6
- private service;
7
- constructor(service: RkAuthService);
10
+ private authService;
11
+ constructor(authService: RkAuthService);
12
+ /**
13
+ * 拦截 HTTP 请求,添加 Token 认证信息
14
+ * @param request HTTP 请求对象
15
+ * @param next 下一个拦截器处理器
16
+ * @returns Observable<HttpEvent<unknown>>
17
+ */
8
18
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
9
19
  static ɵfac: i0.ɵɵFactoryDeclaration<TokenInterceptor, never>;
10
20
  static ɵprov: i0.ɵɵInjectableDeclaration<TokenInterceptor>;
11
21
  }
12
22
  /**
13
- * 请求头增加token验证拦截器
23
+ * 提供 Token 拦截器
24
+ * @returns Provider 配置对象
14
25
  */
15
26
  export declare function providerAuthToken(): {
16
27
  provide: import("@angular/core").InjectionToken<HttpInterceptor[]>;
@@ -18,20 +29,38 @@ export declare function providerAuthToken(): {
18
29
  multi: boolean;
19
30
  };
20
31
  /**
21
- * 不带token验证信息请求
22
- * @param urls 地址
23
- * @param params 参数
24
- * @constructor
32
+ * 创建不带 Token 的请求配置
33
+ * @param urls 模板字符串数组
34
+ * @param params 模板参数
35
+ * @returns [url, options] 元组
36
+ * @example
37
+ * this.http.get(...NoAuthTokenTemplate`/api/public/data`).subscribe();
25
38
  */
26
39
  export declare function NoAuthTokenTemplate(urls: TemplateStringsArray, ...params: any[]): [string, {
27
40
  headers: HttpHeaders;
28
41
  }];
29
42
  /**
30
- * 使用自定义token的请求(模板字符串版本)
31
- * @param urls 地址
32
- * @param params 参数,第一个参数必须是token值
33
- * @constructor
43
+ * 创建使用自定义 Token 的请求配置
44
+ * @param token 自定义 Token 值
45
+ * @param urls 模板字符串数组
46
+ * @param params 模板参数
47
+ * @returns [url, options] 元组
48
+ * @example
49
+ * this.http.get(...CustomTokenTemplate('my-token', `/api/data`)).subscribe();
50
+ */
51
+ export declare function CustomTokenTemplate(token: string, urls: TemplateStringsArray, ...params: any[]): [string, {
52
+ headers: HttpHeaders;
53
+ }];
54
+ /**
55
+ * 创建使用自定义 Token 和自定义 Header 名称的请求配置
56
+ * @param token 自定义 Token 值
57
+ * @param headerName 自定义 Header 名称
58
+ * @param urls 模板字符串数组
59
+ * @param params 模板参数
60
+ * @returns [url, options] 元组
61
+ * @example
62
+ * this.http.get(...CustomTokenWithHeaderTemplate('my-token', 'X-API-Key', `/api/data`)).subscribe();
34
63
  */
35
- export declare function CustomTokenTemplate(urls: TemplateStringsArray, ...params: any[]): [string, {
64
+ export declare function CustomTokenWithHeaderTemplate(token: string, headerName: string, urls: TemplateStringsArray, ...params: any[]): [string, {
36
65
  headers: HttpHeaders;
37
66
  }];
@@ -0,0 +1,68 @@
1
+ /**
2
+ * HTTP 拦截器相关类型定义
3
+ */
4
+ /**
5
+ * Token 拦截器配置
6
+ */
7
+ export interface TokenInterceptorConfig {
8
+ /**
9
+ * 默认的 Token Header 名称
10
+ * @default 'Authorization'
11
+ */
12
+ tokenHeaderName?: string;
13
+ /**
14
+ * 认证 ID Header 名称
15
+ * @default 'X-Auth-Id'
16
+ */
17
+ authIdHeaderName?: string;
18
+ }
19
+ /**
20
+ * 错误拦截器配置
21
+ */
22
+ export interface ErrorInterceptorConfig {
23
+ /**
24
+ * 401 错误跳转路径
25
+ * @default '/errors/401'
26
+ */
27
+ unauthorizedPath?: string;
28
+ /**
29
+ * 是否启用错误日志
30
+ * @default false
31
+ */
32
+ enableLogging?: boolean;
33
+ /**
34
+ * 自定义错误处理函数
35
+ */
36
+ customErrorHandler?: (error: any) => void;
37
+ }
38
+ /**
39
+ * 缓存拦截器配置
40
+ */
41
+ export interface CacheInterceptorConfig {
42
+ /**
43
+ * 缓存最大数量
44
+ * @default 100
45
+ */
46
+ maxCacheSize?: number;
47
+ /**
48
+ * 缓存过期时间(毫秒)
49
+ * @default undefined (永不过期)
50
+ */
51
+ cacheExpiration?: number;
52
+ }
53
+ /**
54
+ * HTTP 请求选项扩展
55
+ */
56
+ export interface HttpRequestOptions {
57
+ headers?: {
58
+ [name: string]: string | string[];
59
+ };
60
+ }
61
+ /**
62
+ * Token 控制类型
63
+ */
64
+ export declare type TokenControl = 'no-token' | 'custom-token';
65
+ /**
66
+ * 缓存策略类型
67
+ */
68
+ export declare type CacheStrategy = 'Storage' | 'Memory';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reskin/core",
3
- "version": "0.0.21",
3
+ "version": "0.1.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
package/utils/array.d.ts CHANGED
@@ -1,9 +1,16 @@
1
1
  /**
2
2
  * 深克隆一个对象或数组
3
3
  *
4
- * 该函数通过递归方式深克隆输入的对象或数组,确保与原对象或数组隔离,不会相互影响
4
+ * 该函数通过递归方式深克隆输入的对象或数组,确保与原对象或数组隔离,不会相互影响。
5
+ * 支持克隆:普通对象、数组、Date、Map、Set、RegExp 等类型。
5
6
  *
6
7
  * @param source 需要克隆的源对象或数组
7
8
  * @returns 返回克隆后的对象或数组
9
+ *
10
+ * @example
11
+ * const obj = { a: 1, b: { c: 2 } };
12
+ * const cloned = deepClone(obj);
13
+ * cloned.b.c = 3;
14
+ * console.log(obj.b.c); // 输出: 2
8
15
  */
9
16
  export declare function deepClone<T>(source: T): T;
package/utils/dom.d.ts CHANGED
@@ -1,11 +1,38 @@
1
1
  import { Observable } from 'rxjs';
2
+ /**
3
+ * 监听元素大小变化的配置选项
4
+ */
5
+ export interface ObserveResizeOptions {
6
+ /**
7
+ * 防抖延迟时间(毫秒)
8
+ * 设置后会对频繁的大小变化事件进行防抖处理
9
+ * @default undefined (不防抖)
10
+ */
11
+ debounce?: number;
12
+ }
2
13
  /**
3
14
  * 监听元素的大小变化
4
15
  *
5
- * 此函数创建了一个Observable,用于观察给定HTMLElement元素的大小变化它使用了ResizeObserver API来实现
6
- * 当元素的大小发生变化时,会发出一个包含变化记录的数组
16
+ * 此函数创建了一个 Observable,用于观察给定 HTMLElement 元素的大小变化。
17
+ * 它使用了 ResizeObserver API 来实现,当元素的大小发生变化时,会发出一个包含变化记录的数组。
18
+ *
19
+ * @param element 需要观察大小变化的 HTMLElement 元素
20
+ * @param options 配置选项
21
+ * @returns 返回一个 Observable,其中包含 ResizeObserverEntry 的数组,用于记录每次大小变化的信息
22
+ *
23
+ * @example
24
+ * // 基础用法
25
+ * const element = document.querySelector('.container');
26
+ * observeResize(element).subscribe(entries => {
27
+ * const { width, height } = entries[0].contentRect;
28
+ * console.log(`元素尺寸: ${width}x${height}`);
29
+ * });
7
30
  *
8
- * @param element 需要观察大小变化的HTMLElement元素
9
- * @returns 返回一个Observable,其中包含ResizeObserverEntry的数组,用于记录每次大小变化的信息
31
+ * @example
32
+ * // 使用防抖优化性能
33
+ * observeResize(element, { debounce: 300 }).subscribe(entries => {
34
+ * // 300ms 内的多次变化只会触发一次
35
+ * console.log('元素大小已稳定');
36
+ * });
10
37
  */
11
- export declare function observeResize(element: HTMLElement): Observable<ResizeObserverEntry[]>;
38
+ export declare function observeResize(element: HTMLElement, options?: ObserveResizeOptions): Observable<ResizeObserverEntry[]>;
package/utils/form.d.ts CHANGED
@@ -1,6 +1,41 @@
1
1
  import { FormGroup } from '@angular/forms';
2
+ /**
3
+ * 表单验证配置
4
+ */
5
+ export interface FormVerifyOptions {
6
+ /**
7
+ * 是否在控制台输出错误信息
8
+ * @default true
9
+ */
10
+ logError?: boolean;
11
+ /**
12
+ * 自定义错误处理函数
13
+ */
14
+ onError?: (invalidFields: string[]) => void;
15
+ }
2
16
  /**
3
17
  * 表单验证
4
- * @param form
18
+ *
19
+ * 遍历表单所有控件,标记为脏状态并触发验证。
20
+ * 如果表单验证通过,返回表单的原始值;否则返回 false。
21
+ *
22
+ * @param form Angular 表单组对象
23
+ * @param options 验证配置选项
24
+ * @returns 验证通过返回表单值,验证失败返回 false
25
+ *
26
+ * @example
27
+ * const result = formVerify(this.form);
28
+ * if (result) {
29
+ * console.log('表单数据:', result);
30
+ * }
31
+ *
32
+ * @example
33
+ * // 自定义错误处理
34
+ * formVerify(this.form, {
35
+ * logError: false,
36
+ * onError: (fields) => {
37
+ * this.message.error(`以下字段验证失败: ${fields.join(', ')}`);
38
+ * }
39
+ * });
5
40
  */
6
- export declare function formVerify<T = Record<string, any>>(form: FormGroup): false | T;
41
+ export declare function formVerify<T = Record<string, any>>(form: FormGroup, options?: FormVerifyOptions): false | T;
package/utils/store.d.ts CHANGED
@@ -4,10 +4,12 @@
4
4
  export interface StoreOptions {
5
5
  /**
6
6
  * 缓存存储方式
7
+ * @default sessionStorage
7
8
  */
8
9
  storageEngine?: Storage;
9
10
  /**
10
- * 过期时间(毫秒)
11
+ * 过期时间(毫秒)
12
+ * @default undefined (永不过期)
11
13
  */
12
14
  expires?: number;
13
15
  }
@@ -15,40 +17,79 @@ export interface StoreOptions {
15
17
  * 设置存储前缀
16
18
  *
17
19
  * 该函数用于更改全局存储前缀,影响后续所有存储操作的键名前缀。
18
- * 存储前缀的更改可能会影响已存储的数据被正确识别和访问。
20
+ * 注意:更改前缀后,之前使用旧前缀存储的数据将无法访问。
19
21
  *
20
22
  * @param newPrefix 新的存储前缀字符串
23
+ *
24
+ * @example
25
+ * setStorePrefix('MY_APP_');
21
26
  */
22
27
  export declare function setStorePrefix(newPrefix: string): void;
23
28
  /**
24
- * 提供了一个用于缓存值的类,值可以被存储在浏览器的localStorage或sessionStorage中。
25
- * 如果提供了过期时间,存储的值会在过期后自动移除。
29
+ * 提供了一个用于缓存值的类,值可以被存储在浏览器的 localStorage sessionStorage 中。
30
+ * 支持过期时间设置,过期后数据会自动移除。
31
+ *
32
+ * @template T 存储数据的类型
33
+ *
34
+ * @example
35
+ * // 基础用法
36
+ * const userStore = new Store<User>('user', { name: '', age: 0 });
37
+ * userStore.set({ name: '张三', age: 25 });
38
+ * console.log(userStore.get()); // { name: '张三', age: 25 }
39
+ *
40
+ * @example
41
+ * // 使用 localStorage 并设置过期时间
42
+ * const tokenStore = new Store<string>('token', '', {
43
+ * storageEngine: localStorage,
44
+ * expires: 3600000 // 1小时后过期
45
+ * });
26
46
  */
27
47
  export declare class Store<T> {
28
48
  private value;
29
49
  private readonly storage;
30
50
  private readonly expires?;
31
- private readonly storageKey;
51
+ private readonly key;
32
52
  /**
33
- * 初始化Store类的实例。
34
- * @param key 缓存值的键名。
35
- * @param defaultValue 初始值,默认值会被存储并返回直到设置新的值。
36
- * @param options 配置选项,包括存储引擎和过期时间。
53
+ * 初始化 Store 类的实例
54
+ * @param key 缓存值的键名
55
+ * @param defaultValue 初始值,默认值会被存储并返回直到设置新的值
56
+ * @param options 配置选项,包括存储引擎和过期时间
37
57
  */
38
58
  constructor(key: string, defaultValue: T, options?: StoreOptions);
39
59
  /**
40
- * 获取当前缓存的值。
41
- * @returns 缓存的值。
60
+ * 生成存储键名
61
+ */
62
+ private getStorageKey;
63
+ /**
64
+ * 从存储中加载数据
65
+ */
66
+ private loadFromStorage;
67
+ /**
68
+ * 获取当前缓存的值
69
+ * @returns 缓存的值
42
70
  */
43
71
  get(): T;
44
72
  /**
45
- * 设置新的缓存值。
46
- * @param newValue 新的值。
73
+ * 设置新的缓存值
74
+ * @param newValue 新的值
47
75
  */
48
76
  set(newValue: T): void;
49
77
  /**
50
- * 使用提供的函数更新缓存的值。
51
- * @param updateFn 一个接受当前值并返回新值的函数。
78
+ * 使用提供的函数更新缓存的值
79
+ * @param updateFn 一个接受当前值并返回新值的函数
80
+ *
81
+ * @example
82
+ * const countStore = new Store<number>('count', 0);
83
+ * countStore.update(count => count + 1);
52
84
  */
53
85
  update(updateFn: (currentValue: T) => T): void;
86
+ /**
87
+ * 清除缓存数据
88
+ */
89
+ clear(): void;
90
+ /**
91
+ * 检查缓存是否存在且未过期
92
+ * @returns 如果缓存存在且未过期返回 true,否则返回 false
93
+ */
94
+ has(): boolean;
54
95
  }