@jnrs/shared 1.1.4 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -41,6 +41,8 @@ import { uuidv4 } from '@jnrs/shared/uuid'
41
41
  - Fullscreen
42
42
 
43
43
  函数
44
+ - hasPermissionWithSuffix 判断用户是否拥有指定后缀类型的权限(如 '*', ':view', ':edit')
45
+ - objectToFormData 普通对象转 FormData 对象
44
46
  - setDefaultLocale
45
47
  - formatDateTime
46
48
  - formatWeekday
package/dist/index.js CHANGED
@@ -1,7 +1,10 @@
1
+ export { blobToUrl } from './utils/index.js';
1
2
  export { getDictColor, getDictLabel, getDictValue, getOneDictList } from './utils/dict.js';
2
3
  export { formatDateTime, formatWeekday, setDefaultLocale } from './utils/date.js';
3
4
  export { Fullscreen } from './utils/fullscreen.js';
4
- export { hasPermission } from './utils/permission.js';
5
+ export { hasPermissionWithSuffix } from './utils/permissions.js';
6
+ export { objectToFormData } from './utils/objectToFormData.js';
7
+ export { downloadFile } from './utils/file.js';
5
8
 
6
9
  console.log('%c✨ 欢迎使用 @jnrs/shared', 'background: #8061BF; color: #f2f2f2; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;');
7
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAGA,OAAO,CAAC,GAAG,CACT,uBAAuB,EACvB,0IAA0I,CAC3I"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;AAGA,OAAO,CAAC,GAAG,CACT,uBAAuB,EACvB,0IAA0I,CAC3I"}
@@ -2,51 +2,62 @@
2
2
  * 主题样式
3
3
  */
4
4
 
5
- // 系统自动适配 - 浅色模式
6
- @media (prefers-color-scheme: light) {
7
- :root {
8
- --jnrs-font-primary: oklch(0.3 0.01 264);
9
- --jnrs-card-primary: oklch(1 0 0);
10
- --jnrs-background-primary: oklch(0.96 0 0);
11
- }
12
- }
5
+ // // 系统自动适配 - 浅色模式
6
+ // @media (prefers-color-scheme: light) {
7
+ // :root {
8
+ // --jnrs-font-primary: oklch(0.3 0.01 264);
9
+ // --jnrs-card-primary: oklch(1 0 0);
10
+ // --jnrs-background-primary: oklch(0.96 0 0);
11
+ // }
12
+ // }
13
13
 
14
- // 系统自动适配 - 深色模式
15
- @media (prefers-color-scheme: dark) {
16
- :root {
17
- --jnrs-font-primary: oklch(0.9 0 265);
18
- --jnrs-card-primary: oklch(0.24 0 0);
19
- --jnrs-background-primary: oklch(0 0 0);
20
- }
21
- }
14
+ // // 系统自动适配 - 深色模式
15
+ // @media (prefers-color-scheme: dark) {
16
+ // :root {
17
+ // --jnrs-font-primary: oklch(0.9 0 265);
18
+ // --jnrs-card-primary: oklch(0.24 0 0);
19
+ // --jnrs-background-primary: oklch(0 0 0);
20
+ // }
21
+ // }
22
22
 
23
- // 手动切换 - 浅色模式
23
+ // 手动切换 - 浅色模式(所有内容需与 @media (prefers-color-scheme: light) 保持一致)
24
24
  .light {
25
25
  --jnrs-font-primary: oklch(0.3 0.01 264);
26
26
  --jnrs-card-primary: oklch(1 0 0);
27
27
  --jnrs-background-primary: oklch(0.96 0 0);
28
+ --jnrs-background-head: oklch(0.94 0 0);
28
29
  }
29
30
 
30
- // 手动切换 - 深色模式
31
+ // 手动切换 - 深色模式(所有内容需与 @media (prefers-color-scheme: dark) 保持一致)
31
32
  .dark {
32
33
  --jnrs-font-primary: oklch(0.9 0 265);
33
- --jnrs-background-primary: oklch(0 0 0);
34
+ --jnrs-card-primary: oklch(0.24 0 0);
35
+ --jnrs-background-head: oklch(0 0 0);
34
36
  }
35
37
 
36
38
  /**
37
39
  * 基础样式
38
40
  */
39
41
  :root {
40
- // 业务相关
42
+ // 业务相关(可动态修改)
41
43
  --jnrs-color-primary: oklch(0.6 0.19 41); // jnrs 橙
44
+ --jnrs-color-primary-03: oklch(from var(--jnrs-color-primary) l c h / 0.3);
42
45
  --jnrs-color-primary-06: oklch(from var(--jnrs-color-primary) l c h / 0.6);
43
46
  --jnrs-color-primary-light: oklch(from var(--jnrs-color-primary) calc(l + 0.1) c h);
44
47
 
45
48
  // 状态相关
46
49
  --jnrs-color-success: oklch(0.8 0.17 147);
47
50
  --jnrs-color-error: oklch(0.65 0.24 33);
51
+ --jnrs-color-warning: oklch(0.8 0.17 33);
48
52
 
49
- // 主题样式衍生
53
+ /* 主题样式衍生 */
54
+
55
+ // 字体
50
56
  --jnrs-font-primary-03: oklch(from var(--jnrs-font-primary) l c h / 0.3);
51
57
  --jnrs-font-primary-06: oklch(from var(--jnrs-font-primary) l c h / 0.6);
58
+
59
+ // 背景
60
+ --jnrs-card-primary-03: oklch(from var(--jnrs-background-primary) l c h / 0.3);
61
+ --jnrs-background-primary-06: oklch(from var(--jnrs-background-primary) l c h / 0.6);
62
+ --jnrs-background-primary-light: oklch(from var(--jnrs-background-primary) calc(l + 0.1) c h);
52
63
  }
@@ -35,6 +35,15 @@ export interface DictItem {
35
35
  export interface Dict {
36
36
  [key: string]: DictItem[];
37
37
  }
38
+ /**
39
+ * 角色
40
+ */
41
+ export interface Role {
42
+ label: string;
43
+ value: string | number;
44
+ permissions?: string[];
45
+ [key: string]: unknown;
46
+ }
38
47
  /**
39
48
  * 语言
40
49
  */
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/types/base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;AAElC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/types/base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;AAElC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 根据文件下载接口返回的二进制数据进行下载
3
+ * @param blob 二进制数据
4
+ * @param filename 文件名
5
+ */
6
+ export declare const downloadFile: (blob: Blob, filename: string) => Promise<void>;
7
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,MAAM,IAAI,EAAE,UAAU,MAAM,kBAO9D,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 根据文件下载接口返回的二进制数据进行下载
3
+ * @param blob 二进制数据
4
+ * @param filename 文件名
5
+ */
6
+ const downloadFile = async (blob, filename) => {
7
+ const blobUrl = URL.createObjectURL(blob);
8
+ const a = document.createElement('a');
9
+ a.href = blobUrl;
10
+ a.download = filename;
11
+ a.click();
12
+ URL.revokeObjectURL(blobUrl);
13
+ };
14
+
15
+ export { downloadFile };
16
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sources":["../../src/utils/file.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;AAIG;AACI,MAAM,YAAY,GAAG,OAAO,IAAU,EAAE,QAAgB,KAAI;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,IAAA,CAAC,CAAC,IAAI,GAAG,OAAO;AAChB,IAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ;IACrB,CAAC,CAAC,KAAK,EAAE;AACT,IAAA,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;AAC9B;;;;"}
@@ -1,5 +1,17 @@
1
1
  export * from './dict';
2
2
  export * from './date';
3
3
  export * from './fullscreen';
4
- export * from './permission';
4
+ export * from './permissions';
5
+ export * from './objectToFormData';
6
+ export * from './file';
7
+ /**
8
+ * Blob 转为 URL,有副作用
9
+ * @param blob Blob 对象
10
+ * @returns url:URL 对象
11
+ * @returns revoke:URL 对象清理函数
12
+ */
13
+ export declare const blobToUrl: (blob: Blob) => {
14
+ url: string;
15
+ revoke: () => void;
16
+ };
5
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,QAAQ,CAAA;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,IAAI;;;CAInC,CAAA"}
@@ -0,0 +1,17 @@
1
+ export { formatDateTime, formatWeekday, setDefaultLocale } from './date.js';
2
+ import '../locales/i18next.js';
3
+
4
+ /**
5
+ * Blob 转为 URL,有副作用
6
+ * @param blob Blob 对象
7
+ * @returns url:URL 对象
8
+ * @returns revoke:URL 对象清理函数
9
+ */
10
+ const blobToUrl = (blob) => {
11
+ const url = URL.createObjectURL(blob);
12
+ const revoke = () => URL.revokeObjectURL(url);
13
+ return { url, revoke };
14
+ };
15
+
16
+ export { blobToUrl };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/utils/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAOA;;;;;AAKG;AACI,MAAM,SAAS,GAAG,CAAC,IAAU,KAAI;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;AAC7C,IAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE;AACxB;;;;"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 对象转 FormData
3
+ * @param obj
4
+ * @param mapConfig 字段映射关系
5
+ * - key: 映射字段
6
+ * - finallyKey: 最终字段名
7
+ * - valueKey: 映射字段对应的值
8
+ * @returns FormData
9
+ * @example
10
+ * objectToFormData(obj, {
11
+ * newField: { finallyKey: 'originField', valueKey: 'uniqueFileName' }
12
+ * })
13
+ */
14
+ export declare const objectToFormData: (obj: Record<string, unknown>, mapConfig: Record<string, {
15
+ finallyKey: string;
16
+ valueKey: string;
17
+ }>) => FormData;
18
+ //# sourceMappingURL=objectToFormData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectToFormData.d.ts","sourceRoot":"","sources":["../../src/utils/objectToFormData.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,MAAM,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,KAClE,QA2BF,CAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 对象转 FormData
3
+ * @param obj
4
+ * @param mapConfig 字段映射关系
5
+ * - key: 映射字段
6
+ * - finallyKey: 最终字段名
7
+ * - valueKey: 映射字段对应的值
8
+ * @returns FormData
9
+ * @example
10
+ * objectToFormData(obj, {
11
+ * newField: { finallyKey: 'originField', valueKey: 'uniqueFileName' }
12
+ * })
13
+ */
14
+ const objectToFormData = (obj, mapConfig) => {
15
+ const formData = new FormData();
16
+ for (const key in obj) {
17
+ if (!Object.hasOwn(obj, key))
18
+ continue;
19
+ const value = obj[key];
20
+ if (Array.isArray(value)) {
21
+ if (value.every((v) => v instanceof File)) {
22
+ value.forEach((file) => formData.append(key, file));
23
+ }
24
+ else if (key in mapConfig) {
25
+ const { finallyKey, valueKey } = mapConfig[key];
26
+ value.forEach((item) => formData.append(finallyKey, item[valueKey]));
27
+ }
28
+ else {
29
+ formData.append(key, JSON.stringify(value));
30
+ }
31
+ }
32
+ else if (value instanceof File) {
33
+ formData.append(key, value);
34
+ }
35
+ else if (typeof value === 'string') {
36
+ formData.append(key, value.trim());
37
+ }
38
+ else {
39
+ formData.append(key, JSON.stringify(value));
40
+ }
41
+ }
42
+ return formData;
43
+ };
44
+
45
+ export { objectToFormData };
46
+ //# sourceMappingURL=objectToFormData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectToFormData.js","sources":["../../src/utils/objectToFormData.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;AAYG;MACU,gBAAgB,GAAG,CAC9B,GAA4B,EAC5B,SAAmE,KACvD;AACZ,IAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAE/B,IAAA,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE;AAE9B,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;AAEtB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE;AACzC,gBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrD;AAAO,iBAAA,IAAI,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC;gBAC/C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE;iBAAO;AACL,gBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7C;QACF;AAAO,aAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AAChC,YAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;QAC7B;AAAO,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC;aAAO;AACL,YAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7C;IACF;AAEA,IAAA,OAAO,QAAQ;AACjB;;;;"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 判断用户是否拥有指定后缀类型的权限(如 ':view', ':edit',支持通配符 '*':若用户权限含 '*',则拥有全部权限)
3
+ * @param requiredPerms 菜单/路由/按钮/声明的所需权限数组
4
+ * @param userPerms 用户拥有的权限数组
5
+ * @param filterSuffix 筛选要匹配的权限类型后缀,例如 ':view' → 匹配 'user:view'
6
+ * @param matchMode 匹配模式:'some'(任一满足,默认)或 'every'(全部满足)
7
+ */
8
+ export declare function hasPermissionWithSuffix(requiredPerms: string[] | undefined, userPerms: string[], filterSuffix?: string, matchMode?: 'some' | 'every'): boolean;
9
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/utils/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EAAE,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,GAAE,MAAW,EACzB,SAAS,GAAE,MAAM,GAAG,OAAgB,GACnC,OAAO,CAuBT"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 判断用户是否拥有指定后缀类型的权限(如 ':view', ':edit',支持通配符 '*':若用户权限含 '*',则拥有全部权限)
3
+ * @param requiredPerms 菜单/路由/按钮/声明的所需权限数组
4
+ * @param userPerms 用户拥有的权限数组
5
+ * @param filterSuffix 筛选要匹配的权限类型后缀,例如 ':view' → 匹配 'user:view'
6
+ * @param matchMode 匹配模式:'some'(任一满足,默认)或 'every'(全部满足)
7
+ */
8
+ function hasPermissionWithSuffix(requiredPerms, userPerms, filterSuffix = '', matchMode = 'some') {
9
+ const userPermSet = new Set(userPerms);
10
+ // 若用户权限含 '*',则拥有全部权限
11
+ if (userPermSet.has('*')) {
12
+ return true;
13
+ }
14
+ // 无权限要求,视为公开
15
+ if (!requiredPerms || requiredPerms.length === 0) {
16
+ return true;
17
+ }
18
+ const targetPerms = requiredPerms.filter((p) => p.endsWith(`${filterSuffix}`));
19
+ // 如果没有以指定后缀结尾的权限要求,则视为公开
20
+ if (targetPerms.length === 0) {
21
+ return true;
22
+ }
23
+ return matchMode === 'every'
24
+ ? targetPerms.every((p) => userPermSet.has(p))
25
+ : targetPerms.some((p) => userPermSet.has(p));
26
+ }
27
+
28
+ export { hasPermissionWithSuffix };
29
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sources":["../../src/utils/permissions.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;AAMG;AACG,SAAU,uBAAuB,CACrC,aAAmC,EACnC,SAAmB,EACnB,YAAA,GAAuB,EAAE,EACzB,SAAA,GAA8B,MAAM,EAAA;AAEpC,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC;;AAGtC,IAAA,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACxB,QAAA,OAAO,IAAI;IACb;;IAGA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAChD,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAA,EAAG,YAAY,CAAA,CAAE,CAAC,CAAC;;AAG9E,IAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,SAAS,KAAK;AACnB,UAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,UAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjD;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jnrs/shared",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "巨能前端工程化开发,通用工具包,与框架无关的纯逻辑、类型、常量、工具函数,完全不依赖任何 UI 框架或运行时环境。",
5
5
  "keywords": [
6
6
  "jnrs",
@@ -1,2 +0,0 @@
1
- export declare function hasPermission(required: string | string[], permissions: string | string[]): boolean;
2
- //# sourceMappingURL=permission.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../src/utils/permission.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAmBlG"}
@@ -1,20 +0,0 @@
1
- function hasPermission(required, permissions) {
2
- const userPerms = new Set(permissions || []);
3
- // 字符串(单权限 或 OR 策略)
4
- if (typeof required === 'string') {
5
- // OR 策略
6
- if (required.includes('|')) {
7
- return required.split('|').some((p) => userPerms.has(p.trim()));
8
- }
9
- // 单权限
10
- return userPerms.has(required);
11
- }
12
- // 数组(AND 策略)
13
- if (Array.isArray(required)) {
14
- return required.every((p) => userPerms.has(p));
15
- }
16
- return false;
17
- }
18
-
19
- export { hasPermission };
20
- //# sourceMappingURL=permission.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission.js","sources":["../../src/utils/permission.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAM,SAAU,aAAa,CAAC,QAA2B,EAAE,WAA8B,EAAA;IACvF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;;AAG5C,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;;AAEhC,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE;;AAEA,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;IAChC;;AAGA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD;AAEA,IAAA,OAAO,KAAK;AACd;;;;"}