@puninar-logistics/pds-sdk 0.0.1
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 +128 -0
- package/dist/chunk-6NBFV4YQ.js +441 -0
- package/dist/chunk-6NBFV4YQ.js.map +1 -0
- package/dist/chunk-LCT4PDW4.js +403 -0
- package/dist/chunk-LCT4PDW4.js.map +1 -0
- package/dist/chunk-NTC4K7PW.js +379 -0
- package/dist/chunk-NTC4K7PW.js.map +1 -0
- package/dist/chunk-NTC7P4ZY.js +440 -0
- package/dist/chunk-NTC7P4ZY.js.map +1 -0
- package/dist/chunk-OCHH4OB7.js +486 -0
- package/dist/chunk-OCHH4OB7.js.map +1 -0
- package/dist/chunk-VFUBVERU.js +440 -0
- package/dist/chunk-VFUBVERU.js.map +1 -0
- package/dist/chunk-YL5EXHSB.js +462 -0
- package/dist/chunk-YL5EXHSB.js.map +1 -0
- package/dist/custom.css +111 -0
- package/dist/global.css +142 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +334 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +80 -0
- package/dist/utils/index.js +61 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +55 -0
package/dist/global.css
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
|
|
4
|
+
@custom-variant dark (&:is(.dark *));
|
|
5
|
+
|
|
6
|
+
@theme inline {
|
|
7
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
8
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
9
|
+
--radius-lg: var(--radius);
|
|
10
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
11
|
+
--color-background: var(--background);
|
|
12
|
+
--color-foreground: var(--foreground);
|
|
13
|
+
--color-card: var(--card);
|
|
14
|
+
--color-card-foreground: var(--card-foreground);
|
|
15
|
+
--color-popover: var(--popover);
|
|
16
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
17
|
+
--color-primary: var(--primary);
|
|
18
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
19
|
+
--color-secondary: var(--secondary);
|
|
20
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
21
|
+
--color-muted: var(--muted);
|
|
22
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
23
|
+
--color-accent: var(--accent);
|
|
24
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
25
|
+
--color-destructive: var(--destructive);
|
|
26
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
27
|
+
--color-info: var(--info);
|
|
28
|
+
--color-info-foreground: var(--info-foreground);
|
|
29
|
+
--color-success: var(--success);
|
|
30
|
+
--color-success-foreground: var(--success-foreground);
|
|
31
|
+
--color-warning: var(--warning);
|
|
32
|
+
--color-warning-foreground: var(--warning-foreground);
|
|
33
|
+
--color-link-action: var(--link-action);
|
|
34
|
+
--color-border: var(--border);
|
|
35
|
+
--color-input: var(--input);
|
|
36
|
+
--color-ring: var(--ring);
|
|
37
|
+
--color-chart-1: var(--chart-1);
|
|
38
|
+
--color-chart-2: var(--chart-2);
|
|
39
|
+
--color-chart-3: var(--chart-3);
|
|
40
|
+
--color-chart-4: var(--chart-4);
|
|
41
|
+
--color-chart-5: var(--chart-5);
|
|
42
|
+
--color-sidebar: var(--sidebar);
|
|
43
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
44
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
45
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
46
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
47
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
48
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
49
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:root {
|
|
53
|
+
--radius: 0.625rem;
|
|
54
|
+
--background: oklch(1 0 0);
|
|
55
|
+
--foreground: oklch(0.145 0 0);
|
|
56
|
+
--card: oklch(1 0 0);
|
|
57
|
+
--card-foreground: oklch(0.145 0 0);
|
|
58
|
+
--popover: oklch(1 0 0);
|
|
59
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
60
|
+
--primary: oklch(0.3790 0.1460 265.5220);
|
|
61
|
+
--primary-foreground: oklch(0.9700 0.0140 254.6040);
|
|
62
|
+
--secondary: oklch(0.97 0 0);
|
|
63
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
64
|
+
--muted: oklch(0.97 0 0);
|
|
65
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
66
|
+
--accent: oklch(0.97 0 0);
|
|
67
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
68
|
+
--destructive: oklch(0.5770 0.2450 27.3250);
|
|
69
|
+
--destructive-foreground: oklch(0.9710 0.0130 17.3800);
|
|
70
|
+
--info: oklch(0.623 0.214 259.815);
|
|
71
|
+
--info-foreground: oklch(0.97 0.014 254.604);
|
|
72
|
+
--success: oklch(0.627 0.194 149.214);
|
|
73
|
+
--success-foreground: oklch(0.982 0.018 155.826);
|
|
74
|
+
--warning: oklch(0.769 0.188 70.08);
|
|
75
|
+
--warning-foreground: oklch(0.987 0.022 95.277);
|
|
76
|
+
--link-action: oklch(0.546 0.245 262.881);
|
|
77
|
+
--border: oklch(0.922 0 0);
|
|
78
|
+
--input: oklch(0.922 0 0);
|
|
79
|
+
--ring: oklch(0.708 0 0);
|
|
80
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
81
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
82
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
83
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
84
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
85
|
+
--sidebar: oklch(0.985 0 0);
|
|
86
|
+
--sidebar: oklch(0.9784 0.0011 197.1387);
|
|
87
|
+
--sidebar-foreground: oklch(0.1884 0.0128 248.5103);
|
|
88
|
+
--sidebar-primary: oklch(0.3791 0.1378 265.5200);
|
|
89
|
+
--sidebar-primary-foreground: oklch(1.0000 0 0);
|
|
90
|
+
--sidebar-accent: oklch(0.9392 0.0166 250.8453);
|
|
91
|
+
--sidebar-accent-foreground: oklch(0.3791 0.1378 265.5200);
|
|
92
|
+
--sidebar-border: oklch(0.9271 0.0101 238.5177);
|
|
93
|
+
--sidebar-ring: oklch(0.3791 0.1378 265.5200);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.dark {
|
|
97
|
+
--background: oklch(0.145 0 0);
|
|
98
|
+
--foreground: oklch(0.985 0 0);
|
|
99
|
+
--card: oklch(0.205 0 0);
|
|
100
|
+
--card-foreground: oklch(0.985 0 0);
|
|
101
|
+
--popover: oklch(0.205 0 0);
|
|
102
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
103
|
+
--primary: oklch(0.932 0.032 255.585);
|
|
104
|
+
--primary-foreground: oklch(0.282 0.091 267.935);
|
|
105
|
+
--secondary: oklch(0.269 0 0);
|
|
106
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
107
|
+
--muted: oklch(0.269 0 0);
|
|
108
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
109
|
+
--accent: oklch(0.269 0 0);
|
|
110
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
111
|
+
--destructive: oklch(0.808 0.114 19.571);
|
|
112
|
+
--destructive-foreground: oklch(0.258 0.092 26.042);
|
|
113
|
+
--info: oklch(0.707 0.165 254.624);
|
|
114
|
+
--info-foreground: oklch(0.282 0.091 267.935);
|
|
115
|
+
--success: oklch(0.845 0.143 164.978);
|
|
116
|
+
--success-foreground: oklch(0.262 0.051 172.552);
|
|
117
|
+
--warning: oklch(0.828 0.189 84.429);
|
|
118
|
+
--warning-foreground: oklch(0.279 0.077 45.635);
|
|
119
|
+
--link-action: oklch(0.882 0.059 254.128);
|
|
120
|
+
--border: oklch(1 0 0 / 10%);
|
|
121
|
+
--input: oklch(1 0 0 / 15%);
|
|
122
|
+
--ring: oklch(0.556 0 0);
|
|
123
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
124
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
125
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
126
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
127
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
128
|
+
--sidebar: oklch(0.205 0 0);
|
|
129
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
130
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
131
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
132
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
133
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
134
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
135
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@layer base {
|
|
139
|
+
* {
|
|
140
|
+
@apply border-border outline-ring/50;
|
|
141
|
+
}
|
|
142
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Method, AxiosRequestConfig } from 'axios';
|
|
2
|
+
|
|
3
|
+
type ApiCallOptions = AxiosRequestConfig;
|
|
4
|
+
type ApiCallParams = {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
method?: Method;
|
|
7
|
+
params?: Record<string, any> | FormData;
|
|
8
|
+
options?: ApiCallOptions;
|
|
9
|
+
};
|
|
10
|
+
declare function apiCall<T = any>({ endpoint, method, params, options, }: ApiCallParams): Promise<T>;
|
|
11
|
+
|
|
12
|
+
type PuninarSDKConfig = {
|
|
13
|
+
base_path: string;
|
|
14
|
+
key_module: string;
|
|
15
|
+
user: string;
|
|
16
|
+
module: string;
|
|
17
|
+
url_check_general_service: string;
|
|
18
|
+
token_check_general_service: string;
|
|
19
|
+
url_single_sign_on: string;
|
|
20
|
+
url_back_to_lobby: string;
|
|
21
|
+
api_key: string;
|
|
22
|
+
api_key_static: string;
|
|
23
|
+
base_url: string;
|
|
24
|
+
};
|
|
25
|
+
declare class PuninarSDK {
|
|
26
|
+
constructor(config: PuninarSDKConfig);
|
|
27
|
+
apiCall<T = any>(params: ApiCallParams): Promise<T>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface DecodedUser {
|
|
31
|
+
username: string;
|
|
32
|
+
session_token: string;
|
|
33
|
+
[key: string]: any;
|
|
34
|
+
}
|
|
35
|
+
interface DecodedModule {
|
|
36
|
+
module: string;
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}
|
|
39
|
+
type LoginFn = (user: DecodedUser, module: DecodedModule) => void;
|
|
40
|
+
declare const handleLogout: () => Promise<void>;
|
|
41
|
+
declare const checkSession: (location: Location, login: LoginFn) => Promise<boolean | undefined>;
|
|
42
|
+
|
|
43
|
+
export { type ApiCallOptions, type ApiCallParams, PuninarSDK, apiCall, checkSession, handleLogout };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import {
|
|
2
|
+
base64DecodeWithSecret,
|
|
3
|
+
generateHeaders
|
|
4
|
+
} from "./chunk-OCHH4OB7.js";
|
|
5
|
+
|
|
6
|
+
// src/api/interceptor.ts
|
|
7
|
+
import axios from "axios";
|
|
8
|
+
|
|
9
|
+
// src/api/apiKeyStore.ts
|
|
10
|
+
var CONFIG = {
|
|
11
|
+
base_path: "",
|
|
12
|
+
key_module: "",
|
|
13
|
+
user: "",
|
|
14
|
+
module: "",
|
|
15
|
+
url_check_general_service: "",
|
|
16
|
+
token_check_general_service: "",
|
|
17
|
+
url_single_sign_on: "",
|
|
18
|
+
url_back_to_lobby: "",
|
|
19
|
+
api_key: "",
|
|
20
|
+
api_key_static: "",
|
|
21
|
+
base_url: ""
|
|
22
|
+
};
|
|
23
|
+
var setConfig = ({
|
|
24
|
+
base_path,
|
|
25
|
+
key_module,
|
|
26
|
+
user,
|
|
27
|
+
module,
|
|
28
|
+
url_check_general_service,
|
|
29
|
+
token_check_general_service,
|
|
30
|
+
url_single_sign_on,
|
|
31
|
+
url_back_to_lobby,
|
|
32
|
+
api_key,
|
|
33
|
+
api_key_static,
|
|
34
|
+
base_url
|
|
35
|
+
}) => {
|
|
36
|
+
CONFIG.base_path = base_path;
|
|
37
|
+
CONFIG.key_module = key_module;
|
|
38
|
+
CONFIG.user = user;
|
|
39
|
+
CONFIG.module = module;
|
|
40
|
+
CONFIG.url_check_general_service = url_check_general_service;
|
|
41
|
+
CONFIG.token_check_general_service = token_check_general_service;
|
|
42
|
+
CONFIG.url_single_sign_on = url_single_sign_on;
|
|
43
|
+
CONFIG.url_back_to_lobby = url_back_to_lobby;
|
|
44
|
+
CONFIG.api_key = api_key;
|
|
45
|
+
CONFIG.api_key_static = api_key_static;
|
|
46
|
+
CONFIG.base_url = base_url;
|
|
47
|
+
};
|
|
48
|
+
var getConfig = () => CONFIG;
|
|
49
|
+
|
|
50
|
+
// src/api/interceptor.ts
|
|
51
|
+
var apiService = axios.create({
|
|
52
|
+
timeout: 15e3
|
|
53
|
+
});
|
|
54
|
+
apiService.interceptors.request.use(
|
|
55
|
+
(config) => {
|
|
56
|
+
const { api_key, base_url } = getConfig();
|
|
57
|
+
console.log(api_key, base_url);
|
|
58
|
+
if (base_url) {
|
|
59
|
+
config.baseURL = base_url;
|
|
60
|
+
}
|
|
61
|
+
const headers = generateHeaders(api_key);
|
|
62
|
+
if (api_key) {
|
|
63
|
+
}
|
|
64
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
65
|
+
if (value !== void 0) {
|
|
66
|
+
config.headers.set(key, value);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return config;
|
|
70
|
+
},
|
|
71
|
+
(error) => Promise.reject(error)
|
|
72
|
+
);
|
|
73
|
+
apiService.interceptors.response.use(
|
|
74
|
+
(response) => response,
|
|
75
|
+
(error) => {
|
|
76
|
+
if (error.response) {
|
|
77
|
+
console.error(
|
|
78
|
+
"API Error:",
|
|
79
|
+
error.response.status,
|
|
80
|
+
error.response.data
|
|
81
|
+
);
|
|
82
|
+
} else {
|
|
83
|
+
console.error("API Error:", error.message);
|
|
84
|
+
}
|
|
85
|
+
return Promise.reject(error);
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
var interceptor_default = apiService;
|
|
89
|
+
|
|
90
|
+
// src/api/apiService.ts
|
|
91
|
+
async function apiCall({
|
|
92
|
+
endpoint,
|
|
93
|
+
method = "POST",
|
|
94
|
+
params = {},
|
|
95
|
+
options = {}
|
|
96
|
+
}) {
|
|
97
|
+
const isAbsoluteUrl = /^https?:\/\//i.test(endpoint);
|
|
98
|
+
const isFormData = typeof FormData !== "undefined" && params instanceof FormData;
|
|
99
|
+
const config = {
|
|
100
|
+
url: endpoint,
|
|
101
|
+
method,
|
|
102
|
+
...options,
|
|
103
|
+
headers: {
|
|
104
|
+
...options.headers || {}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
if (["POST", "PUT", "PATCH"].includes(method)) {
|
|
108
|
+
config.data = params;
|
|
109
|
+
if (isFormData) {
|
|
110
|
+
delete config.headers?.["Content-Type"];
|
|
111
|
+
delete config.headers?.["content-type"];
|
|
112
|
+
} else if (!isAbsoluteUrl || !config.headers?.["Content-Type"]) {
|
|
113
|
+
config.headers = {
|
|
114
|
+
...config.headers,
|
|
115
|
+
"Content-Type": config.headers?.["Content-Type"] || "application/json"
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
config.params = params;
|
|
120
|
+
}
|
|
121
|
+
const response = await interceptor_default(config);
|
|
122
|
+
return response.data;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/client/sdk-client.ts
|
|
126
|
+
var assertRequired = (value, fieldName) => {
|
|
127
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
128
|
+
throw new Error(`[PuninarSDK] Config "${fieldName}" is required`);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
var validateConfig = (config) => {
|
|
132
|
+
const requiredFields = [
|
|
133
|
+
"base_path",
|
|
134
|
+
"key_module",
|
|
135
|
+
"user",
|
|
136
|
+
"module",
|
|
137
|
+
"url_check_general_service",
|
|
138
|
+
"token_check_general_service",
|
|
139
|
+
"url_single_sign_on",
|
|
140
|
+
"url_back_to_lobby",
|
|
141
|
+
"api_key",
|
|
142
|
+
"api_key_static",
|
|
143
|
+
"base_url"
|
|
144
|
+
];
|
|
145
|
+
requiredFields.forEach((field) => {
|
|
146
|
+
assertRequired(config[field], field);
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
var PuninarSDK = class {
|
|
150
|
+
constructor(config) {
|
|
151
|
+
if (!config) {
|
|
152
|
+
throw new Error("[PuninarSDK] Config object is required");
|
|
153
|
+
}
|
|
154
|
+
validateConfig(config);
|
|
155
|
+
setConfig({
|
|
156
|
+
base_path: config.base_path,
|
|
157
|
+
key_module: config.key_module,
|
|
158
|
+
user: config.user,
|
|
159
|
+
module: config.module,
|
|
160
|
+
url_check_general_service: config.url_check_general_service,
|
|
161
|
+
token_check_general_service: config.token_check_general_service,
|
|
162
|
+
url_single_sign_on: config.url_single_sign_on,
|
|
163
|
+
url_back_to_lobby: config.url_back_to_lobby,
|
|
164
|
+
api_key: config.api_key,
|
|
165
|
+
api_key_static: config.api_key_static,
|
|
166
|
+
base_url: config.base_url
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
apiCall(params) {
|
|
170
|
+
if (!params) {
|
|
171
|
+
throw new Error("[PuninarSDK] apiCall params is required");
|
|
172
|
+
}
|
|
173
|
+
return apiCall(params);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// src/api/sessionService.ts
|
|
178
|
+
import axios2 from "axios";
|
|
179
|
+
import Swal from "sweetalert2";
|
|
180
|
+
import SHA256 from "crypto-js/sha256";
|
|
181
|
+
import Hex from "crypto-js/enc-hex";
|
|
182
|
+
var formatTimestamp = (date) => {
|
|
183
|
+
const options = {
|
|
184
|
+
year: "numeric",
|
|
185
|
+
month: "2-digit",
|
|
186
|
+
day: "2-digit",
|
|
187
|
+
hour: "2-digit",
|
|
188
|
+
minute: "2-digit",
|
|
189
|
+
second: "2-digit",
|
|
190
|
+
hour12: false
|
|
191
|
+
};
|
|
192
|
+
const formatter = new Intl.DateTimeFormat("en-GB", options);
|
|
193
|
+
const parts = formatter.formatToParts(date);
|
|
194
|
+
const year = parts.find((part) => part.type === "year").value;
|
|
195
|
+
const month = parts.find((part) => part.type === "month").value;
|
|
196
|
+
const day = parts.find((part) => part.type === "day").value;
|
|
197
|
+
const hour = parts.find((part) => part.type === "hour").value;
|
|
198
|
+
const minute = parts.find((part) => part.type === "minute").value;
|
|
199
|
+
const second = parts.find((part) => part.type === "second").value;
|
|
200
|
+
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
|
|
201
|
+
};
|
|
202
|
+
var handleSessionError = () => {
|
|
203
|
+
const { url_back_to_lobby } = getConfig();
|
|
204
|
+
const urlLobby = url_back_to_lobby;
|
|
205
|
+
Swal.fire({
|
|
206
|
+
title: "Akses anda tidak aktif",
|
|
207
|
+
icon: "warning",
|
|
208
|
+
confirmButtonText: "OK"
|
|
209
|
+
}).then((result) => {
|
|
210
|
+
if (result.isConfirmed) {
|
|
211
|
+
window.location.href = urlLobby;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
var validateSession = async (decodedUser, decodedModule, login) => {
|
|
216
|
+
const {
|
|
217
|
+
url_check_general_service,
|
|
218
|
+
token_check_general_service,
|
|
219
|
+
api_key
|
|
220
|
+
} = getConfig();
|
|
221
|
+
const timestamp = formatTimestamp(/* @__PURE__ */ new Date());
|
|
222
|
+
const keySsoPuninar = api_key;
|
|
223
|
+
const keyPun = SHA256(`${keySsoPuninar}${timestamp}`).toString(Hex);
|
|
224
|
+
try {
|
|
225
|
+
const response = await axios2.post(
|
|
226
|
+
url_check_general_service,
|
|
227
|
+
{
|
|
228
|
+
username: decodedUser.username,
|
|
229
|
+
session_token: decodedUser.session_token,
|
|
230
|
+
param: {
|
|
231
|
+
module: decodedModule.module,
|
|
232
|
+
key_module: token_check_general_service
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
headers: {
|
|
237
|
+
"Content-Type": "application/json",
|
|
238
|
+
"key-puninar": keyPun,
|
|
239
|
+
timestamp
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
if (!response.data.success) {
|
|
244
|
+
throw new Error("Session invalid");
|
|
245
|
+
}
|
|
246
|
+
localStorage.setItem("user_module", JSON.stringify(decodedUser));
|
|
247
|
+
localStorage.setItem("modules", JSON.stringify(decodedModule));
|
|
248
|
+
login(decodedUser, decodedModule);
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.log(error, "error 78");
|
|
251
|
+
handleSessionError();
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
var handleLogout = async () => {
|
|
255
|
+
let storedUser = localStorage.getItem("user_module");
|
|
256
|
+
if (storedUser) {
|
|
257
|
+
storedUser = JSON.parse(storedUser);
|
|
258
|
+
} else {
|
|
259
|
+
console.log("No user found in localStorage");
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const {
|
|
263
|
+
url_single_sign_on,
|
|
264
|
+
api_key
|
|
265
|
+
} = getConfig();
|
|
266
|
+
const keySsoPuninar = api_key;
|
|
267
|
+
const timestamp = formatTimestamp(/* @__PURE__ */ new Date());
|
|
268
|
+
const encryptionKey = `${keySsoPuninar}${timestamp}`;
|
|
269
|
+
const keyPun = SHA256(encryptionKey).toString(Hex);
|
|
270
|
+
const body = {
|
|
271
|
+
username: storedUser.username,
|
|
272
|
+
session_token: storedUser.session_token
|
|
273
|
+
};
|
|
274
|
+
const response = await axios2.post(
|
|
275
|
+
url_single_sign_on + "auth/logout",
|
|
276
|
+
JSON.stringify(body),
|
|
277
|
+
{
|
|
278
|
+
headers: {
|
|
279
|
+
"Content-Type": "application/json",
|
|
280
|
+
"key-puninar": keyPun,
|
|
281
|
+
timestamp
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
);
|
|
285
|
+
localStorage.clear();
|
|
286
|
+
if (response.status === 200) {
|
|
287
|
+
const { url_back_to_lobby } = getConfig();
|
|
288
|
+
window.location.href = url_back_to_lobby;
|
|
289
|
+
} else {
|
|
290
|
+
console.log(response);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
var checkSession = async (location, login) => {
|
|
294
|
+
if (location.pathname.startsWith("/public")) return true;
|
|
295
|
+
const { api_key_static } = getConfig();
|
|
296
|
+
const params = new URLSearchParams(window.location.search);
|
|
297
|
+
const secretKey = api_key_static;
|
|
298
|
+
const userParam = params.get("user");
|
|
299
|
+
const moduleParam = params.get("module");
|
|
300
|
+
const storedUser = localStorage.getItem("user_module");
|
|
301
|
+
const storedModules = localStorage.getItem("modules");
|
|
302
|
+
if (storedUser && storedModules) {
|
|
303
|
+
if (params.size === 0) return false;
|
|
304
|
+
try {
|
|
305
|
+
if (!userParam || !moduleParam) return false;
|
|
306
|
+
const decodedUser = base64DecodeWithSecret(userParam, secretKey);
|
|
307
|
+
const decodedModule = base64DecodeWithSecret(moduleParam, secretKey);
|
|
308
|
+
if (decodedUser.username === JSON.parse(storedUser).username && decodedModule.module === JSON.parse(storedModules).module) {
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
await validateSession(decodedUser, decodedModule, login);
|
|
312
|
+
} catch (error) {
|
|
313
|
+
console.log(error, "error 141");
|
|
314
|
+
handleSessionError();
|
|
315
|
+
}
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
if (!userParam || !moduleParam) return false;
|
|
320
|
+
const decodedUser = base64DecodeWithSecret(userParam, secretKey);
|
|
321
|
+
const decodedModule = base64DecodeWithSecret(moduleParam, secretKey);
|
|
322
|
+
await validateSession(decodedUser, decodedModule, login);
|
|
323
|
+
} catch (error) {
|
|
324
|
+
console.log(error, "error 153");
|
|
325
|
+
handleSessionError();
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
export {
|
|
329
|
+
PuninarSDK,
|
|
330
|
+
apiCall,
|
|
331
|
+
checkSession,
|
|
332
|
+
handleLogout
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/interceptor.ts","../src/api/apiKeyStore.ts","../src/api/apiService.ts","../src/client/sdk-client.ts","../src/api/sessionService.ts"],"sourcesContent":["import { generateHeaders } from \"@/utils\";\r\nimport axios, {\r\n AxiosError,\r\n type AxiosResponse,\r\n type InternalAxiosRequestConfig,\r\n} from \"axios\";\r\nimport { getConfig } from \"@/api/apiKeyStore\";\r\n\r\nconst apiService = axios.create({\r\n timeout: 15000,\r\n});\r\n\r\napiService.interceptors.request.use(\r\n (config: InternalAxiosRequestConfig) => {\r\n const { api_key, base_url } = getConfig();\r\n\r\n console.log(api_key, base_url);\r\n \r\n\r\n // SET BASE URL DI SINI (runtime)\r\n if (base_url) {\r\n config.baseURL = base_url;\r\n }\r\n\r\n const headers = generateHeaders(api_key);\r\n\r\n if (api_key) {\r\n // headers[\"x-api-key\"] = api_key;\r\n }\r\n\r\n Object.entries(headers).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n config.headers.set(key, value);\r\n }\r\n });\r\n\r\n return config;\r\n },\r\n (error: AxiosError) => Promise.reject(error)\r\n);\r\n\r\napiService.interceptors.response.use(\r\n (response: AxiosResponse) => response,\r\n (error: AxiosError) => {\r\n if (error.response) {\r\n console.error(\r\n \"API Error:\",\r\n error.response.status,\r\n error.response.data\r\n );\r\n } else {\r\n console.error(\"API Error:\", error.message);\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport default apiService;\r\n","// ==============================\r\n// types\r\n// ==============================\r\ninterface AppConfig {\r\n base_path: string;\r\n key_module: string;\r\n user: string;\r\n module: string;\r\n\r\n url_check_general_service: string;\r\n token_check_general_service: string;\r\n url_single_sign_on: string;\r\n url_back_to_lobby: string;\r\n\r\n api_key: string;\r\n api_key_static: string;\r\n base_url: string;\r\n}\r\n\r\n// ==============================\r\n// state\r\n// ==============================\r\nconst CONFIG: AppConfig = {\r\n base_path: \"\",\r\n key_module: \"\",\r\n user: \"\",\r\n module: \"\",\r\n\r\n url_check_general_service: \"\",\r\n token_check_general_service: \"\",\r\n url_single_sign_on: \"\",\r\n url_back_to_lobby: \"\",\r\n\r\n api_key: \"\",\r\n api_key_static: \"\",\r\n base_url: \"\",\r\n};\r\n\r\n// ==============================\r\n// setter\r\n// ==============================\r\nexport const setConfig = ({\r\n base_path,\r\n key_module,\r\n user,\r\n module,\r\n\r\n url_check_general_service,\r\n token_check_general_service,\r\n url_single_sign_on,\r\n url_back_to_lobby,\r\n\r\n api_key,\r\n api_key_static,\r\n base_url,\r\n}: AppConfig): void => {\r\n CONFIG.base_path = base_path;\r\n CONFIG.key_module = key_module;\r\n CONFIG.user = user;\r\n CONFIG.module = module;\r\n\r\n CONFIG.url_check_general_service = url_check_general_service;\r\n CONFIG.token_check_general_service = token_check_general_service;\r\n CONFIG.url_single_sign_on = url_single_sign_on;\r\n CONFIG.url_back_to_lobby = url_back_to_lobby;\r\n\r\n CONFIG.api_key = api_key;\r\n CONFIG.api_key_static = api_key_static;\r\n CONFIG.base_url = base_url;\r\n};\r\n\r\n// ==============================\r\n// getter\r\n// ==============================\r\nexport const getConfig = (): AppConfig => CONFIG;\r\n","import apiService from \"@/api/interceptor\";\r\nimport type { AxiosRequestConfig, Method } from \"axios\";\r\n\r\nexport type ApiCallOptions = AxiosRequestConfig;\r\n\r\nexport type ApiCallParams = {\r\n endpoint: string;\r\n method?: Method;\r\n params?: Record<string, any> | FormData;\r\n options?: ApiCallOptions;\r\n};\r\n\r\nexport async function apiCall<T = any>({\r\n endpoint,\r\n method = \"POST\",\r\n params = {},\r\n options = {},\r\n}: ApiCallParams): Promise<T> {\r\n const isAbsoluteUrl = /^https?:\\/\\//i.test(endpoint);\r\n const isFormData =\r\n typeof FormData !== \"undefined\" && params instanceof FormData;\r\n\r\n const config: AxiosRequestConfig = {\r\n url: endpoint,\r\n method,\r\n ...options,\r\n headers: {\r\n ...(options.headers || {}),\r\n },\r\n };\r\n\r\n // ===============================\r\n // BODY vs QUERY HANDLING\r\n // ===============================\r\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method)) {\r\n config.data = params;\r\n\r\n if (isFormData) {\r\n // biarkan browser set boundary\r\n delete config.headers?.[\"Content-Type\"];\r\n delete config.headers?.[\"content-type\"];\r\n } else if (!isAbsoluteUrl || !config.headers?.[\"Content-Type\"]) {\r\n config.headers = {\r\n ...config.headers,\r\n \"Content-Type\":\r\n config.headers?.[\"Content-Type\"] || \"application/json\",\r\n };\r\n }\r\n } else {\r\n config.params = params;\r\n }\r\n\r\n const response = await apiService<T>(config);\r\n return response.data;\r\n}","import { apiCall, type ApiCallParams } from \"@/api/apiService\";\r\nimport { setConfig } from \"@/api/apiKeyStore\";\r\n\r\nexport type PuninarSDKConfig = {\r\n base_path: string;\r\n key_module: string; // url params\r\n user: string; // url params\r\n module: string; // url params\r\n\r\n url_check_general_service: string;\r\n token_check_general_service: string;\r\n url_single_sign_on: string;\r\n url_back_to_lobby: string;\r\n\r\n api_key: string;\r\n api_key_static: string;\r\n base_url: string;\r\n};\r\n\r\n/* ===============================\r\n * Internal helpers\r\n * =============================== */\r\n\r\nconst assertRequired: (\r\n value: unknown,\r\n fieldName: keyof PuninarSDKConfig\r\n) => asserts value is string = (value, fieldName) => {\r\n if (typeof value !== \"string\" || value.trim() === \"\") {\r\n throw new Error(`[PuninarSDK] Config \"${fieldName}\" is required`);\r\n }\r\n};\r\n\r\n\r\nconst validateConfig = (config: PuninarSDKConfig) => {\r\n const requiredFields: (keyof PuninarSDKConfig)[] = [\r\n \"base_path\",\r\n \"key_module\",\r\n \"user\",\r\n \"module\",\r\n \"url_check_general_service\",\r\n \"token_check_general_service\",\r\n \"url_single_sign_on\",\r\n \"url_back_to_lobby\",\r\n \"api_key\",\r\n \"api_key_static\",\r\n \"base_url\",\r\n ];\r\n\r\n requiredFields.forEach((field) => {\r\n assertRequired(config[field], field);\r\n });\r\n};\r\n\r\n/* ===============================\r\n * SDK\r\n * =============================== */\r\n\r\nexport class PuninarSDK {\r\n constructor(config: PuninarSDKConfig) {\r\n if (!config) {\r\n throw new Error(\"[PuninarSDK] Config object is required\");\r\n }\r\n\r\n validateConfig(config);\r\n\r\n // inject ke interceptor layer\r\n setConfig({\r\n base_path: config.base_path,\r\n key_module: config.key_module,\r\n user: config.user,\r\n module: config.module,\r\n\r\n url_check_general_service: config.url_check_general_service,\r\n token_check_general_service: config.token_check_general_service,\r\n url_single_sign_on: config.url_single_sign_on,\r\n url_back_to_lobby: config.url_back_to_lobby,\r\n\r\n api_key: config.api_key,\r\n api_key_static: config.api_key_static,\r\n base_url: config.base_url,\r\n });\r\n }\r\n\r\n apiCall<T = any>(params: ApiCallParams): Promise<T> {\r\n if (!params) {\r\n throw new Error(\"[PuninarSDK] apiCall params is required\");\r\n }\r\n\r\n return apiCall<T>(params);\r\n }\r\n}\r\n","import axios, { type AxiosResponse } from \"axios\";\r\nimport Swal from \"sweetalert2\";\r\nimport SHA256 from \"crypto-js/sha256\";\r\nimport Hex from \"crypto-js/enc-hex\";\r\nimport { base64DecodeWithSecret } from \"@/utils/base64DecodeWithSecret\";\r\nimport { getConfig } from \"@/api/apiKeyStore\";\r\n\r\ninterface DecodedUser {\r\n username: string;\r\n session_token: string;\r\n [key: string]: any;\r\n}\r\n\r\ninterface DecodedModule {\r\n module: string;\r\n [key: string]: any;\r\n}\r\n\r\ntype LoginFn = (user: DecodedUser, module: DecodedModule) => void;\r\n\r\nconst formatTimestamp = (date: Date): string => {\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hour12: false,\r\n };\r\n\r\n const formatter = new Intl.DateTimeFormat(\"en-GB\", options);\r\n const parts = formatter.formatToParts(date);\r\n\r\n const year = parts.find((part) => part.type === \"year\")!.value;\r\n const month = parts.find((part) => part.type === \"month\")!.value;\r\n const day = parts.find((part) => part.type === \"day\")!.value;\r\n const hour = parts.find((part) => part.type === \"hour\")!.value;\r\n const minute = parts.find((part) => part.type === \"minute\")!.value;\r\n const second = parts.find((part) => part.type === \"second\")!.value;\r\n\r\n return `${year}-${month}-${day} ${hour}:${minute}:${second}`;\r\n};\r\n\r\nconst handleSessionError = (): void => {\r\n const { url_back_to_lobby } = getConfig();\r\n const urlLobby = url_back_to_lobby;\r\n Swal.fire({\r\n title: \"Akses anda tidak aktif\",\r\n icon: \"warning\",\r\n confirmButtonText: \"OK\",\r\n }).then((result) => {\r\n if (result.isConfirmed) {\r\n window.location.href = urlLobby;\r\n }\r\n });\r\n};\r\n\r\nconst validateSession = async (\r\n decodedUser: DecodedUser,\r\n decodedModule: DecodedModule,\r\n login: LoginFn\r\n): Promise<void> => {\r\n const {\r\n url_check_general_service,\r\n token_check_general_service,\r\n api_key\r\n } = getConfig();\r\n const timestamp = formatTimestamp(new Date());\r\n const keySsoPuninar = api_key;\r\n const keyPun = SHA256(`${keySsoPuninar}${timestamp}`).toString(Hex);\r\n\r\n try {\r\n const response: AxiosResponse<any> = await axios.post(\r\n url_check_general_service,\r\n {\r\n username: decodedUser.username,\r\n session_token: decodedUser.session_token,\r\n param: {\r\n module: decodedModule.module,\r\n key_module: token_check_general_service,\r\n },\r\n },\r\n {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"key-puninar\": keyPun,\r\n timestamp,\r\n },\r\n }\r\n );\r\n\r\n if (!response.data.success) {\r\n throw new Error(\"Session invalid\");\r\n }\r\n\r\n localStorage.setItem(\"user_module\", JSON.stringify(decodedUser));\r\n localStorage.setItem(\"modules\", JSON.stringify(decodedModule));\r\n login(decodedUser, decodedModule);\r\n } catch (error) {\r\n console.log(error, \"error 78\");\r\n handleSessionError();\r\n }\r\n};\r\n\r\nexport const handleLogout = async (): Promise<void> => {\r\n let storedUser: string | null = localStorage.getItem(\"user_module\");\r\n\r\n if (storedUser) {\r\n storedUser = JSON.parse(storedUser);\r\n } else {\r\n console.log(\"No user found in localStorage\");\r\n return;\r\n }\r\n\r\n const {\r\n url_single_sign_on,\r\n api_key,\r\n } = getConfig();\r\n const keySsoPuninar = api_key;\r\n const timestamp = formatTimestamp(new Date());\r\n\r\n const encryptionKey = `${keySsoPuninar}${timestamp}`;\r\n const keyPun = SHA256(encryptionKey).toString(Hex);\r\n\r\n const body = {\r\n username: (storedUser as any).username,\r\n session_token: (storedUser as any).session_token,\r\n };\r\n\r\n const response = await axios.post(\r\n (url_single_sign_on) + \"auth/logout\",\r\n JSON.stringify(body),\r\n {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"key-puninar\": keyPun,\r\n timestamp: timestamp,\r\n },\r\n }\r\n );\r\n\r\n localStorage.clear();\r\n\r\n if (response.status === 200) {\r\n const { url_back_to_lobby } = getConfig();\r\n window.location.href = url_back_to_lobby;\r\n } else {\r\n console.log(response);\r\n }\r\n};\r\n\r\nexport const checkSession = async (\r\n location: Location,\r\n login: LoginFn\r\n): Promise<boolean | undefined> => {\r\n if (location.pathname.startsWith(\"/public\")) return true;\r\n\r\n const { api_key_static } = getConfig();\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n const secretKey = api_key_static;\r\n const userParam = params.get(\"user\");\r\n const moduleParam = params.get(\"module\");\r\n\r\n const storedUser = localStorage.getItem(\"user_module\");\r\n const storedModules = localStorage.getItem(\"modules\");\r\n\r\n if (storedUser && storedModules) {\r\n if (params.size === 0) return false;\r\n\r\n try {\r\n if (!userParam || !moduleParam) return false;\r\n const decodedUser = base64DecodeWithSecret(userParam, secretKey) as DecodedUser;\r\n const decodedModule = base64DecodeWithSecret(moduleParam, secretKey) as DecodedModule;\r\n\r\n if (\r\n decodedUser.username === JSON.parse(storedUser).username &&\r\n decodedModule.module === JSON.parse(storedModules).module\r\n ) {\r\n return true;\r\n }\r\n\r\n await validateSession(decodedUser, decodedModule, login);\r\n } catch (error) {\r\n console.log(error, \"error 141\");\r\n handleSessionError();\r\n }\r\n return false;\r\n }\r\n\r\n try {\r\n // console.log(userParam, moduleParam);\r\n if (!userParam || !moduleParam) return false;\r\n const decodedUser = base64DecodeWithSecret(userParam, secretKey) as DecodedUser;\r\n const decodedModule = base64DecodeWithSecret(moduleParam, secretKey) as DecodedModule;\r\n await validateSession(decodedUser, decodedModule, login);\r\n } catch (error) {\r\n console.log(error, \"error 153\");\r\n handleSessionError();\r\n }\r\n};"],"mappings":"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","names":["axios","axios"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cek otorisasi akses berdasarkan path dan list akses user.
|
|
3
|
+
*/
|
|
4
|
+
declare const accessCheck: (keyPath: string, requiredAccess: string | string[]) => boolean;
|
|
5
|
+
|
|
6
|
+
type BundlingTypeArchive = 'TRUCKING_ONLY' | 'CUSTOMS_CLEARANCE';
|
|
7
|
+
declare const aliasBundlingTypeArchive: (bundlingTypeArchive: BundlingTypeArchive | undefined) => string;
|
|
8
|
+
|
|
9
|
+
declare function base64DecodeWithSecret<T = unknown>(encodedData: string, secretKey: string): T;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Convert an array of pipe-separated strings into an array of objects.
|
|
13
|
+
* If field names are provided, they will be used instead of generic field1, field2, etc.
|
|
14
|
+
* Example:
|
|
15
|
+
* convertToArrayOfObject(["1|01|PUJA|PUNINAR JAYA"], ["id","code","short_name","full_name"])
|
|
16
|
+
* → [{ id: "1", code: "01", short_name: "PUJA", full_name: "PUNINAR JAYA" }]
|
|
17
|
+
*/
|
|
18
|
+
declare function convertToArrayOfObject(arr?: string[] | null, fields?: string[]): Record<string, string>[];
|
|
19
|
+
|
|
20
|
+
declare function decodeFlateBase64<T = any>(encoded: string): T;
|
|
21
|
+
declare function encodeFlateBase64<T>(data: T): string;
|
|
22
|
+
|
|
23
|
+
declare function encodeShort<T>(data: T): string;
|
|
24
|
+
declare function decodeShort<T>(encoded: string): T;
|
|
25
|
+
|
|
26
|
+
declare function encodeData(data: unknown): string;
|
|
27
|
+
declare function decodeData<T = unknown>(encoded: string): T | string | number | null;
|
|
28
|
+
|
|
29
|
+
declare function formatCurrency(value: number | string, decimals?: number, withLabel?: boolean): string;
|
|
30
|
+
|
|
31
|
+
declare function generateHeaders(api_key: string): Record<string, string>;
|
|
32
|
+
|
|
33
|
+
declare const generateUUID: () => string;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Generate initials from a name
|
|
37
|
+
* @param name - Full name
|
|
38
|
+
* @returns Initials (first and last letter)
|
|
39
|
+
*/
|
|
40
|
+
declare function getInitials(name?: string): string;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Simpan data ke localStorage dengan aman.
|
|
44
|
+
*/
|
|
45
|
+
declare const setLocalStorage: (key: string, value: unknown) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Ambil data dari localStorage dengan aman (auto-parse JSON jika valid).
|
|
48
|
+
* Generic <T> agar hasil bisa ditentukan tipenya.
|
|
49
|
+
*/
|
|
50
|
+
declare const getLocalStorage: <T = unknown>(key: string, defaultValue?: T | null) => T | string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Hapus data dari localStorage.
|
|
53
|
+
*/
|
|
54
|
+
declare const removeLocalStorage: (key: string) => void;
|
|
55
|
+
/**
|
|
56
|
+
* Hapus seluruh localStorage.
|
|
57
|
+
*/
|
|
58
|
+
declare const clearLocalStorage: () => void;
|
|
59
|
+
|
|
60
|
+
declare const formatRupiah: (value: number | string | null | undefined) => string;
|
|
61
|
+
declare const transformThousands: (value: string | number | null | undefined, mode?: "format" | "parse") => string | number;
|
|
62
|
+
|
|
63
|
+
declare const formatDate: (value?: string | Date | null, format?: string) => string;
|
|
64
|
+
|
|
65
|
+
declare function formatDateTime(date: Date): string;
|
|
66
|
+
|
|
67
|
+
declare function applyEFakturMask(raw: string): string;
|
|
68
|
+
declare function applyCoretaxMask(raw: string): string;
|
|
69
|
+
|
|
70
|
+
declare const pphFormat: (str: string) => string | null;
|
|
71
|
+
|
|
72
|
+
type MatchMode = "exact" | "startsWith" | "includes" | "regex";
|
|
73
|
+
declare function matchRole(selectedRole: string | undefined, comparator: string | string[], mode?: MatchMode): boolean;
|
|
74
|
+
|
|
75
|
+
declare function terbilang(input: number | string): string;
|
|
76
|
+
|
|
77
|
+
type Role = "ADMIN" | "VENDOR" | "FINANCE";
|
|
78
|
+
declare function visibleTable(columns: any[], role?: Role): any[];
|
|
79
|
+
|
|
80
|
+
export { accessCheck, aliasBundlingTypeArchive, applyCoretaxMask, applyEFakturMask, base64DecodeWithSecret, clearLocalStorage, convertToArrayOfObject, decodeData, decodeFlateBase64, decodeShort, encodeData, encodeFlateBase64, encodeShort, formatCurrency, formatDate, formatDateTime, formatRupiah, generateHeaders, generateUUID, getInitials, getLocalStorage, matchRole, pphFormat, removeLocalStorage, setLocalStorage, terbilang, transformThousands, visibleTable };
|