@das-fed/utils 7.1.0-dev.30 → 7.1.0-dev.31
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/api-services/modules/app-manage/index.js +800 -782
- package/api-services/modules/app-manage/index.js.gz +0 -0
- package/api-services/modules/duty-manage/index.js +782 -800
- package/api-services/modules/duty-manage/index.js.gz +0 -0
- package/api-services/modules/index.js +970 -952
- package/api-services/modules/index.js.gz +0 -0
- package/api-services/modules/iot/index.js +1054 -1036
- package/api-services/modules/iot/index.js.gz +0 -0
- package/api-services/modules/permission/index.js +782 -800
- package/api-services/modules/permission/index.js.gz +0 -0
- package/api-services/modules/supplier/index.js +802 -784
- package/api-services/modules/supplier/index.js.gz +0 -0
- package/create-api-service/index.js +781 -799
- package/create-api-service/index.js.gz +0 -0
- package/create-api-service/sso/index.d.ts +3 -16
- package/create-api-service/sso/index.js +524 -517
- package/create-api-service/sso/index.js.gz +0 -0
- package/create-api-service/sso/utils.d.ts +6 -0
- package/create-api-service/thirdLogout/index.js +390 -368
- package/create-api-service/thirdLogout/index.js.gz +0 -0
- package/create-api-service/thirdLogout/sso/utils.d.ts +8 -0
- package/create-api-service/thirdLogout/{index.d.ts → thirdLogout/index.d.ts} +1 -1
- package/curring-http/type.d.ts +93 -93
- package/esm-map.json +3 -1
- package/package.json +4 -4
- package/token-tools/index.d.ts +35 -0
- package/token-tools/index.js +59 -25
- package/token-tools/index.js.gz +0 -0
|
Binary file
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const getQuery: (name: string) => any;
|
|
2
|
+
/**
|
|
3
|
+
* 获取当前登录类型。
|
|
4
|
+
* 优先读取 URL 参数并同步到 localStorage,避免首屏 401 早于路由监听时读不到 loginType。
|
|
5
|
+
* @returns 当前登录类型
|
|
6
|
+
*/
|
|
7
|
+
export declare const getLoginType: () => any;
|
|
8
|
+
export declare const removeQueryParams: (paramsToRemove: any[]) => void;
|
package/curring-http/type.d.ts
CHANGED
|
@@ -1,95 +1,95 @@
|
|
|
1
1
|
import { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';
|
|
2
2
|
import { Ref } from 'vue';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/** 请求工具配置项 */
|
|
6
|
-
export type CurringConfig = AxiosRequestConfig & {
|
|
7
|
-
/** 请求实例 */
|
|
8
|
-
axiosInstance?: AxiosInstance
|
|
9
|
-
|
|
10
|
-
/** 请求方法 */
|
|
11
|
-
method?: Method
|
|
12
|
-
|
|
13
|
-
/** 请求的body数据 */
|
|
14
|
-
data?: any
|
|
15
|
-
|
|
16
|
-
/** 请求的query数据 */
|
|
17
|
-
params?: any
|
|
18
|
-
|
|
19
|
-
/** 接口地址前缀 */
|
|
20
|
-
urlPrefix?: string
|
|
21
|
-
|
|
22
|
-
/** 标记为公共接口,不需要鉴权,默认为false */
|
|
23
|
-
public?: boolean
|
|
24
|
-
|
|
25
|
-
/** 请求成功执行的回调 */
|
|
26
|
-
onSuccess?: (res: any, config: CurringConfig) => Promise<any>
|
|
27
|
-
|
|
28
|
-
/** 请求失败执行的回调 */
|
|
29
|
-
onError?: (error: any, config: CurringConfig) => Promise<any>
|
|
30
|
-
|
|
31
|
-
/** 自定义处理请求失败执行的回调 */
|
|
32
|
-
onCustomError?: (error: any, config: CurringConfig) => Promise<any>
|
|
33
|
-
|
|
34
|
-
/** 不管请求成功或失败都会执行的回调 */
|
|
35
|
-
finally?: (config: CurringConfig) => any
|
|
36
|
-
|
|
37
|
-
/** 每次请求之前都会执行的函数 */
|
|
38
|
-
beforeRun?: (config: CurringConfig) => Promise<CurringConfig>
|
|
39
|
-
|
|
40
|
-
/** 自定义错误信息 */
|
|
41
|
-
customErrorMessage?: (
|
|
42
|
-
/** 原始错误信息 */
|
|
43
|
-
message: string,
|
|
44
|
-
|
|
45
|
-
/** 原始错误对象 */
|
|
46
|
-
error: any,
|
|
47
|
-
) => string | null | undefined
|
|
48
|
-
|
|
49
|
-
/** 忽略错误提示 */
|
|
50
|
-
ignoreErrorMessage?: boolean
|
|
51
|
-
|
|
52
|
-
/** 接口401是否重定向到登录页 */
|
|
53
|
-
noRedireLogin?: boolean
|
|
54
|
-
|
|
55
|
-
/** 是否跳过项目注册的401恢复逻辑 */
|
|
56
|
-
skipUnauthorizedRecovery?: boolean
|
|
57
|
-
|
|
58
|
-
/** 标记当前请求已完成一次401恢复重试,防止重复续签 */
|
|
59
|
-
_unauthorizedRecoveryRetried?: boolean
|
|
60
|
-
|
|
61
|
-
/** 开启CSRF安全选项 */
|
|
62
|
-
csrf?: boolean
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export type Method = 'get' | 'post' | 'put' | 'delete' | 'patch'
|
|
66
|
-
|
|
67
|
-
export type CurringConfigFun = (config: CurringConfig) => CurringConfig | Promise<CurringConfig>
|
|
68
|
-
|
|
69
|
-
export type CurringRes = {
|
|
70
|
-
/** 请求时返回的接口数据 */
|
|
71
|
-
data: Ref<any>
|
|
72
|
-
|
|
73
|
-
/** 请求时的错误信息 */
|
|
74
|
-
error: Ref<any>
|
|
75
|
-
|
|
76
|
-
/** 请求时的loading */
|
|
77
|
-
loading: Ref<boolean>
|
|
78
|
-
|
|
79
|
-
/** 发起请求 返回格式 [ error, data ] */
|
|
80
|
-
run: (payload?: any, config?: CurringConfig) => CurringRunRes
|
|
81
|
-
|
|
82
|
-
/** 取消请求控制器 */
|
|
83
|
-
abortController: Ref<AbortController | null>
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** 返回为数组 [error, data], 请求成功error为null,请求失败data为null */
|
|
87
|
-
export type CurringRunRes = Promise<
|
|
88
|
-
[
|
|
89
|
-
/** 请求返回的错误信息,请求成功时为null,请求失败时为错误信息 */
|
|
90
|
-
error: { code: string | number; msg: string; error: AxiosError } | null,
|
|
91
|
-
|
|
92
|
-
/** 请求返回的接口数据,请求成功时为后端数据,请求失败时为null */
|
|
93
|
-
data: any | null,
|
|
94
|
-
]
|
|
95
|
-
>
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/** 请求工具配置项 */
|
|
6
|
+
export type CurringConfig = AxiosRequestConfig & {
|
|
7
|
+
/** 请求实例 */
|
|
8
|
+
axiosInstance?: AxiosInstance
|
|
9
|
+
|
|
10
|
+
/** 请求方法 */
|
|
11
|
+
method?: Method
|
|
12
|
+
|
|
13
|
+
/** 请求的body数据 */
|
|
14
|
+
data?: any
|
|
15
|
+
|
|
16
|
+
/** 请求的query数据 */
|
|
17
|
+
params?: any
|
|
18
|
+
|
|
19
|
+
/** 接口地址前缀 */
|
|
20
|
+
urlPrefix?: string
|
|
21
|
+
|
|
22
|
+
/** 标记为公共接口,不需要鉴权,默认为false */
|
|
23
|
+
public?: boolean
|
|
24
|
+
|
|
25
|
+
/** 请求成功执行的回调 */
|
|
26
|
+
onSuccess?: (res: any, config: CurringConfig) => Promise<any>
|
|
27
|
+
|
|
28
|
+
/** 请求失败执行的回调 */
|
|
29
|
+
onError?: (error: any, config: CurringConfig) => Promise<any>
|
|
30
|
+
|
|
31
|
+
/** 自定义处理请求失败执行的回调 */
|
|
32
|
+
onCustomError?: (error: any, config: CurringConfig) => Promise<any>
|
|
33
|
+
|
|
34
|
+
/** 不管请求成功或失败都会执行的回调 */
|
|
35
|
+
finally?: (config: CurringConfig) => any
|
|
36
|
+
|
|
37
|
+
/** 每次请求之前都会执行的函数 */
|
|
38
|
+
beforeRun?: (config: CurringConfig) => Promise<CurringConfig>
|
|
39
|
+
|
|
40
|
+
/** 自定义错误信息 */
|
|
41
|
+
customErrorMessage?: (
|
|
42
|
+
/** 原始错误信息 */
|
|
43
|
+
message: string,
|
|
44
|
+
|
|
45
|
+
/** 原始错误对象 */
|
|
46
|
+
error: any,
|
|
47
|
+
) => string | null | undefined
|
|
48
|
+
|
|
49
|
+
/** 忽略错误提示 */
|
|
50
|
+
ignoreErrorMessage?: boolean
|
|
51
|
+
|
|
52
|
+
/** 接口401是否重定向到登录页 */
|
|
53
|
+
noRedireLogin?: boolean
|
|
54
|
+
|
|
55
|
+
/** 是否跳过项目注册的401恢复逻辑 */
|
|
56
|
+
skipUnauthorizedRecovery?: boolean
|
|
57
|
+
|
|
58
|
+
/** 标记当前请求已完成一次401恢复重试,防止重复续签 */
|
|
59
|
+
_unauthorizedRecoveryRetried?: boolean
|
|
60
|
+
|
|
61
|
+
/** 开启CSRF安全选项 */
|
|
62
|
+
csrf?: boolean
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type Method = 'get' | 'post' | 'put' | 'delete' | 'patch'
|
|
66
|
+
|
|
67
|
+
export type CurringConfigFun = (config: CurringConfig) => CurringConfig | Promise<CurringConfig>
|
|
68
|
+
|
|
69
|
+
export type CurringRes = {
|
|
70
|
+
/** 请求时返回的接口数据 */
|
|
71
|
+
data: Ref<any>
|
|
72
|
+
|
|
73
|
+
/** 请求时的错误信息 */
|
|
74
|
+
error: Ref<any>
|
|
75
|
+
|
|
76
|
+
/** 请求时的loading */
|
|
77
|
+
loading: Ref<boolean>
|
|
78
|
+
|
|
79
|
+
/** 发起请求 返回格式 [ error, data ] */
|
|
80
|
+
run: (payload?: any, config?: CurringConfig) => CurringRunRes
|
|
81
|
+
|
|
82
|
+
/** 取消请求控制器 */
|
|
83
|
+
abortController: Ref<AbortController | null>
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** 返回为数组 [error, data], 请求成功error为null,请求失败data为null */
|
|
87
|
+
export type CurringRunRes = Promise<
|
|
88
|
+
[
|
|
89
|
+
/** 请求返回的错误信息,请求成功时为null,请求失败时为错误信息 */
|
|
90
|
+
error: { code: string | number; msg: string; error: AxiosError } | null,
|
|
91
|
+
|
|
92
|
+
/** 请求返回的接口数据,请求成功时为后端数据,请求失败时为null */
|
|
93
|
+
data: any | null,
|
|
94
|
+
]
|
|
95
|
+
>
|
package/esm-map.json
CHANGED
|
@@ -124,6 +124,7 @@
|
|
|
124
124
|
"getTokenParams": "/create-api-service/sso/index",
|
|
125
125
|
"getTokenFromCode": "/create-api-service/sso/index",
|
|
126
126
|
"real_uri": "/create-api-service/sso/index",
|
|
127
|
+
"getLoginType": "/create-api-service/sso/index",
|
|
127
128
|
"getQuery": "/create-api-service/sso/index",
|
|
128
129
|
"tokenStorage": "/create-api-service/sso/index",
|
|
129
130
|
"login": "/create-api-service/sso/index",
|
|
@@ -152,5 +153,6 @@
|
|
|
152
153
|
"jmcLogout": "/create-api-service/thirdLogout/index",
|
|
153
154
|
"registerUnauthorizedRecovery": "/create-api-service/unauthorized-recovery/index",
|
|
154
155
|
"recoverUnauthorized": "/create-api-service/unauthorized-recovery/index",
|
|
155
|
-
"hasUnauthorizedRecovery": "/create-api-service/unauthorized-recovery/index"
|
|
156
|
+
"hasUnauthorizedRecovery": "/create-api-service/unauthorized-recovery/index",
|
|
157
|
+
"clearPlatformAuthStorage": "/token-tools/index"
|
|
156
158
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@das-fed/utils",
|
|
3
|
-
"version": "7.1.0-dev.
|
|
3
|
+
"version": "7.1.0-dev.31",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"license": "ISC",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@antv/x6": "^2.18.1",
|
|
12
|
-
"@das-fed/utils": "7.1.0-dev.
|
|
12
|
+
"@das-fed/utils": "7.1.0-dev.31",
|
|
13
13
|
"@vue/shared": "^3.4.21",
|
|
14
14
|
"@vueuse/core": "^9.6.0",
|
|
15
15
|
"axios": "^1.6.7",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"vue": "^3.4.21"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@das-fed/cli": "7.1.0-dev.
|
|
25
|
-
"@das-fed/web": "7.1.0-dev.
|
|
24
|
+
"@das-fed/cli": "7.1.0-dev.31",
|
|
25
|
+
"@das-fed/web": "7.1.0-dev.31",
|
|
26
26
|
"@types/js-cookie": "^3.0.6",
|
|
27
27
|
"@types/lodash-es": "^4.17.12",
|
|
28
28
|
"@types/qs": "^6.9.15",
|
package/token-tools/index.d.ts
CHANGED
|
@@ -19,4 +19,39 @@ export declare const getAccessTokenInfo: (key: TokenInfoKey) => any;
|
|
|
19
19
|
*/
|
|
20
20
|
export declare const setAccessToken: (token: string, info?: any) => void;
|
|
21
21
|
export declare const removeAccessToken: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* 获取、保存和清理平台 token 相关数据。
|
|
24
|
+
* 统一放在 token-tools 中,便于 SSO 与业务模块复用同一套 token 存储规则。
|
|
25
|
+
* @returns token 存储操作集合
|
|
26
|
+
*/
|
|
27
|
+
export declare const tokenStorage: () => {
|
|
28
|
+
/**
|
|
29
|
+
* 获取当前平台 token 数据。
|
|
30
|
+
* @returns token、过期时间和 refresh token
|
|
31
|
+
*/
|
|
32
|
+
getData: () => {
|
|
33
|
+
accessToken: string;
|
|
34
|
+
accessTokenExpiredAt: any;
|
|
35
|
+
refreshToken: any;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* 保存平台 token 数据。
|
|
39
|
+
* @param data token 信息
|
|
40
|
+
*/
|
|
41
|
+
save: (data: {
|
|
42
|
+
accessToken: string | null;
|
|
43
|
+
accessTokenExpiredAt: number;
|
|
44
|
+
refreshToken: string | null;
|
|
45
|
+
info: any;
|
|
46
|
+
}) => void;
|
|
47
|
+
/**
|
|
48
|
+
* 清理平台 token 数据。
|
|
49
|
+
*/
|
|
50
|
+
remove: () => void;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* 清理平台退出相关的本地认证数据。
|
|
54
|
+
* 统一封装退出清理动作,避免各退出入口遗漏 idelTime、sessionStorage 或流程引擎 token。
|
|
55
|
+
*/
|
|
56
|
+
export declare const clearPlatformAuthStorage: () => void;
|
|
22
57
|
export {};
|
package/token-tools/index.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { removeProcessEngineToken as I, setProcessEngineToken as h } from "@das-fed/utils/process-engine-info";
|
|
1
2
|
/*! js-cookie v3.0.5 | MIT */
|
|
2
3
|
function l(e) {
|
|
3
|
-
for (var
|
|
4
|
-
var
|
|
5
|
-
for (var g in
|
|
6
|
-
e[g] =
|
|
4
|
+
for (var n = 1; n < arguments.length; n++) {
|
|
5
|
+
var t = arguments[n];
|
|
6
|
+
for (var g in t)
|
|
7
|
+
e[g] = t[g];
|
|
7
8
|
}
|
|
8
9
|
return e;
|
|
9
10
|
}
|
|
10
|
-
var
|
|
11
|
+
var S = {
|
|
11
12
|
read: function(e) {
|
|
12
13
|
return e[0] === '"' && (e = e.slice(1, -1)), e.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
|
|
13
14
|
},
|
|
@@ -18,10 +19,10 @@ var k = {
|
|
|
18
19
|
);
|
|
19
20
|
}
|
|
20
21
|
};
|
|
21
|
-
function
|
|
22
|
-
function
|
|
22
|
+
function m(e, n) {
|
|
23
|
+
function t(r, i, o) {
|
|
23
24
|
if (!(typeof document > "u")) {
|
|
24
|
-
o = l({},
|
|
25
|
+
o = l({}, n, o), typeof o.expires == "number" && (o.expires = new Date(Date.now() + o.expires * 864e5)), o.expires && (o.expires = o.expires.toUTCString()), r = encodeURIComponent(r).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/[()]/g, escape);
|
|
25
26
|
var c = "";
|
|
26
27
|
for (var s in o)
|
|
27
28
|
o[s] && (c += "; " + s, o[s] !== !0 && (c += "=" + o[s].split(";")[0]));
|
|
@@ -31,10 +32,10 @@ function d(e, t) {
|
|
|
31
32
|
function g(r) {
|
|
32
33
|
if (!(typeof document > "u" || arguments.length && !r)) {
|
|
33
34
|
for (var i = document.cookie ? document.cookie.split("; ") : [], o = {}, c = 0; c < i.length; c++) {
|
|
34
|
-
var s = i[c].split("="),
|
|
35
|
+
var s = i[c].split("="), u = s.slice(1).join("=");
|
|
35
36
|
try {
|
|
36
37
|
var f = decodeURIComponent(s[0]);
|
|
37
|
-
if (o[f] = e.read(
|
|
38
|
+
if (o[f] = e.read(u, f), r === f)
|
|
38
39
|
break;
|
|
39
40
|
} catch {
|
|
40
41
|
}
|
|
@@ -44,10 +45,10 @@ function d(e, t) {
|
|
|
44
45
|
}
|
|
45
46
|
return Object.create(
|
|
46
47
|
{
|
|
47
|
-
set:
|
|
48
|
+
set: t,
|
|
48
49
|
get: g,
|
|
49
50
|
remove: function(r, i) {
|
|
50
|
-
|
|
51
|
+
t(
|
|
51
52
|
r,
|
|
52
53
|
"",
|
|
53
54
|
l({}, i, {
|
|
@@ -56,28 +57,61 @@ function d(e, t) {
|
|
|
56
57
|
);
|
|
57
58
|
},
|
|
58
59
|
withAttributes: function(r) {
|
|
59
|
-
return
|
|
60
|
+
return m(this.converter, l({}, this.attributes, r));
|
|
60
61
|
},
|
|
61
62
|
withConverter: function(r) {
|
|
62
|
-
return
|
|
63
|
+
return m(l({}, this.converter, r), this.attributes);
|
|
63
64
|
}
|
|
64
65
|
},
|
|
65
66
|
{
|
|
66
|
-
attributes: { value: Object.freeze(
|
|
67
|
+
attributes: { value: Object.freeze(n) },
|
|
67
68
|
converter: { value: Object.freeze(e) }
|
|
68
69
|
}
|
|
69
70
|
);
|
|
70
71
|
}
|
|
71
|
-
var
|
|
72
|
-
const a = "accessToken",
|
|
73
|
-
var
|
|
74
|
-
(
|
|
75
|
-
},
|
|
76
|
-
localStorage.removeItem(a), localStorage.removeItem(
|
|
72
|
+
var d = m(S, { path: "/" });
|
|
73
|
+
const a = "accessToken", k = "accessTokenExpiredAt", T = "refreshToken", v = "redirectUri", x = "csrf-token", A = () => localStorage.getItem(a) ?? d.get(a) ?? sessionStorage.getItem(a) ?? "", p = (e) => localStorage.getItem(e) ?? d.get(e) ?? sessionStorage.getItem(e) ?? "", C = (e, n = {}) => {
|
|
74
|
+
var t;
|
|
75
|
+
(t = window.webConfig) != null && t.disableSaveToken || (localStorage.setItem(a, e), localStorage.setItem(k, n.accessTokenExpiredAt ?? 0), localStorage.setItem(T, n.refreshToken ?? 0), n.redirectUri && localStorage.setItem(v, n.redirectUri));
|
|
76
|
+
}, E = () => {
|
|
77
|
+
localStorage.removeItem(a), localStorage.removeItem(k), localStorage.removeItem(T), localStorage.removeItem(v), localStorage.removeItem(x);
|
|
78
|
+
}, U = () => ({
|
|
79
|
+
/**
|
|
80
|
+
* 获取当前平台 token 数据。
|
|
81
|
+
* @returns token、过期时间和 refresh token
|
|
82
|
+
*/
|
|
83
|
+
getData: () => {
|
|
84
|
+
const e = p("accessTokenExpiredAt");
|
|
85
|
+
return {
|
|
86
|
+
accessToken: A(),
|
|
87
|
+
accessTokenExpiredAt: e ? Number(e) : 0,
|
|
88
|
+
refreshToken: p("refreshToken")
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* 保存平台 token 数据。
|
|
93
|
+
* @param data token 信息
|
|
94
|
+
*/
|
|
95
|
+
save: (e) => {
|
|
96
|
+
C(e.accessToken ?? "", {
|
|
97
|
+
accessTokenExpiredAt: e.accessTokenExpiredAt,
|
|
98
|
+
refreshToken: e.refreshToken
|
|
99
|
+
}), h(e);
|
|
100
|
+
},
|
|
101
|
+
/**
|
|
102
|
+
* 清理平台 token 数据。
|
|
103
|
+
*/
|
|
104
|
+
remove: () => {
|
|
105
|
+
E(), I();
|
|
106
|
+
}
|
|
107
|
+
}), R = () => {
|
|
108
|
+
localStorage.removeItem("idelTime"), sessionStorage.clear(), U().remove();
|
|
77
109
|
};
|
|
78
110
|
export {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
111
|
+
R as clearPlatformAuthStorage,
|
|
112
|
+
A as getAccessToken,
|
|
113
|
+
p as getAccessTokenInfo,
|
|
114
|
+
E as removeAccessToken,
|
|
115
|
+
C as setAccessToken,
|
|
116
|
+
U as tokenStorage
|
|
83
117
|
};
|
package/token-tools/index.js.gz
CHANGED
|
Binary file
|