lupine.api 1.0.41

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 (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/admin/admin-about.tsx +16 -0
  4. package/admin/admin-config.tsx +44 -0
  5. package/admin/admin-css.tsx +3 -0
  6. package/admin/admin-db.tsx +74 -0
  7. package/admin/admin-frame-props.tsx +9 -0
  8. package/admin/admin-frame.tsx +466 -0
  9. package/admin/admin-index.tsx +66 -0
  10. package/admin/admin-login.tsx +99 -0
  11. package/admin/admin-menu-edit.tsx +637 -0
  12. package/admin/admin-menu-list.tsx +87 -0
  13. package/admin/admin-page-edit.tsx +564 -0
  14. package/admin/admin-page-list.tsx +83 -0
  15. package/admin/admin-performance.tsx +28 -0
  16. package/admin/admin-release.tsx +320 -0
  17. package/admin/admin-resources.tsx +385 -0
  18. package/admin/admin-shell.tsx +89 -0
  19. package/admin/admin-table-data.tsx +146 -0
  20. package/admin/admin-table-list.tsx +231 -0
  21. package/admin/admin-test-animations.tsx +379 -0
  22. package/admin/admin-test-component.tsx +808 -0
  23. package/admin/admin-test-edit.tsx +319 -0
  24. package/admin/admin-test-themes.tsx +56 -0
  25. package/admin/admin-tokens.tsx +338 -0
  26. package/admin/design/admin-design.tsx +174 -0
  27. package/admin/design/block-grid.tsx +36 -0
  28. package/admin/design/block-grid1.tsx +21 -0
  29. package/admin/design/block-paragraph.tsx +19 -0
  30. package/admin/design/block-title.tsx +19 -0
  31. package/admin/design/design-block-box.tsx +140 -0
  32. package/admin/design/drag-data.tsx +24 -0
  33. package/admin/index.ts +6 -0
  34. package/admin/package.json +15 -0
  35. package/admin/tsconfig.json +127 -0
  36. package/dev/copy-folder.js +32 -0
  37. package/dev/cp-index-html.js +69 -0
  38. package/dev/file-utils.js +12 -0
  39. package/dev/index.js +19 -0
  40. package/dev/package.json +12 -0
  41. package/dev/plugin-gen-versions.js +20 -0
  42. package/dev/plugin-ifelse.js +155 -0
  43. package/dev/plugin-ifelse.test.js +37 -0
  44. package/dev/run-cmd.js +14 -0
  45. package/dev/send-request.js +12 -0
  46. package/package.json +55 -0
  47. package/src/admin-api/admin-api.ts +59 -0
  48. package/src/admin-api/admin-auth.ts +87 -0
  49. package/src/admin-api/admin-config.ts +93 -0
  50. package/src/admin-api/admin-csv.ts +81 -0
  51. package/src/admin-api/admin-db.ts +269 -0
  52. package/src/admin-api/admin-helper.ts +111 -0
  53. package/src/admin-api/admin-menu.ts +135 -0
  54. package/src/admin-api/admin-page.ts +135 -0
  55. package/src/admin-api/admin-performance.ts +128 -0
  56. package/src/admin-api/admin-release.ts +498 -0
  57. package/src/admin-api/admin-resources.ts +318 -0
  58. package/src/admin-api/admin-token-helper.ts +79 -0
  59. package/src/admin-api/admin-tokens.ts +90 -0
  60. package/src/admin-api/index.ts +2 -0
  61. package/src/api/api-cache.ts +103 -0
  62. package/src/api/api-helper.ts +44 -0
  63. package/src/api/api-module.ts +60 -0
  64. package/src/api/api-router.ts +177 -0
  65. package/src/api/api-shared-storage.ts +64 -0
  66. package/src/api/async-storage.ts +5 -0
  67. package/src/api/debug-service.ts +56 -0
  68. package/src/api/encode-html.ts +27 -0
  69. package/src/api/handle-status.ts +71 -0
  70. package/src/api/index.ts +16 -0
  71. package/src/api/mini-web-socket.ts +270 -0
  72. package/src/api/server-content-type.ts +82 -0
  73. package/src/api/server-render.ts +216 -0
  74. package/src/api/shell-service.ts +66 -0
  75. package/src/api/simple-storage.ts +80 -0
  76. package/src/api/static-server.ts +125 -0
  77. package/src/api/to-client-delivery.ts +26 -0
  78. package/src/app/app-cache.ts +55 -0
  79. package/src/app/app-loader.ts +62 -0
  80. package/src/app/app-message.ts +60 -0
  81. package/src/app/app-shared-storage.ts +317 -0
  82. package/src/app/app-start.ts +117 -0
  83. package/src/app/cleanup-exit.ts +12 -0
  84. package/src/app/host-to-path.ts +38 -0
  85. package/src/app/index.ts +11 -0
  86. package/src/app/process-dev-requests.ts +90 -0
  87. package/src/app/web-listener.ts +230 -0
  88. package/src/app/web-processor.ts +42 -0
  89. package/src/app/web-server.ts +86 -0
  90. package/src/common-js/web-env.js +104 -0
  91. package/src/index.ts +7 -0
  92. package/src/lang/api-lang-en.ts +27 -0
  93. package/src/lang/api-lang-zh-cn.ts +28 -0
  94. package/src/lang/index.ts +2 -0
  95. package/src/lang/lang-helper.ts +76 -0
  96. package/src/lang/lang-props.ts +6 -0
  97. package/src/lib/db/db-helper.ts +23 -0
  98. package/src/lib/db/db-mysql.ts +250 -0
  99. package/src/lib/db/db-sqlite.ts +101 -0
  100. package/src/lib/db/db.spec.ts +28 -0
  101. package/src/lib/db/db.ts +304 -0
  102. package/src/lib/db/index.ts +5 -0
  103. package/src/lib/index.ts +3 -0
  104. package/src/lib/logger.spec.ts +214 -0
  105. package/src/lib/logger.ts +274 -0
  106. package/src/lib/runtime-require.ts +37 -0
  107. package/src/lib/utils/cookie-util.ts +34 -0
  108. package/src/lib/utils/crypto.ts +58 -0
  109. package/src/lib/utils/date-utils.ts +317 -0
  110. package/src/lib/utils/deep-merge.ts +37 -0
  111. package/src/lib/utils/delay.ts +12 -0
  112. package/src/lib/utils/file-setting.ts +55 -0
  113. package/src/lib/utils/format-bytes.ts +11 -0
  114. package/src/lib/utils/fs-utils.ts +144 -0
  115. package/src/lib/utils/get-env.ts +27 -0
  116. package/src/lib/utils/index.ts +12 -0
  117. package/src/lib/utils/is-type.ts +48 -0
  118. package/src/lib/utils/load-env.ts +14 -0
  119. package/src/lib/utils/pad.ts +6 -0
  120. package/src/models/api-base.ts +5 -0
  121. package/src/models/api-module-props.ts +11 -0
  122. package/src/models/api-router-props.ts +26 -0
  123. package/src/models/app-cache-props.ts +33 -0
  124. package/src/models/app-data-props.ts +10 -0
  125. package/src/models/app-loader-props.ts +6 -0
  126. package/src/models/app-shared-storage-props.ts +37 -0
  127. package/src/models/app-start-props.ts +18 -0
  128. package/src/models/async-storage-props.ts +13 -0
  129. package/src/models/db-config.ts +30 -0
  130. package/src/models/host-to-path-props.ts +12 -0
  131. package/src/models/index.ts +16 -0
  132. package/src/models/json-object.ts +8 -0
  133. package/src/models/locals-props.ts +36 -0
  134. package/src/models/logger-props.ts +84 -0
  135. package/src/models/simple-storage-props.ts +14 -0
  136. package/src/models/to-client-delivery-props.ts +6 -0
  137. package/tsconfig.json +115 -0
@@ -0,0 +1,317 @@
1
+ export class DateUtils {
2
+ /*
3
+ * returns the number of milliseconds elapsed since January 1, 1970 00:00:00 UTC.
4
+ */
5
+ static now(): number {
6
+ return Date.now();
7
+ }
8
+
9
+ // Date time string format: YYYY-MM-DDTHH:mm:ss.sssZ
10
+ // The string that you want to parse into a Date should match this format or a portion of this format.
11
+ // The “T” character separates the date from the time portion of the string. The “Z” character is the UTC offset representation.
12
+ static toDate(str: string): Date {
13
+ return new Date(Date.parse(str));
14
+ }
15
+
16
+ static clone(dt: Date): Date {
17
+ return new Date(dt.valueOf());
18
+ }
19
+
20
+ static isLeapYear(year: number): boolean {
21
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
22
+ }
23
+
24
+ static daysInMonth(year: number, month: number) {
25
+ return month === 1 ? (DateUtils.isLeapYear(year) ? 29 : 28) : 31 - ((month % 7) % 2);
26
+ }
27
+
28
+ static createDate(
29
+ year: number,
30
+ monthIndex: number,
31
+ date?: number,
32
+ hours?: number,
33
+ minutes?: number,
34
+ seconds?: number,
35
+ ms?: number
36
+ ): Date {
37
+ const dt = new Date(year, monthIndex, date, hours, minutes, seconds, ms);
38
+ return dt;
39
+ }
40
+
41
+ // It returns the number of milliseconds since January 1, 1970, 00:00:00 UTC instead of local (regardless of which time zone you are in).
42
+ static createUTCDate(
43
+ year: number,
44
+ monthIndex?: number,
45
+ date?: number,
46
+ hours?: number,
47
+ minutes?: number,
48
+ seconds?: number,
49
+ ms?: number
50
+ ): Date {
51
+ const dt = new Date(Date.UTC.apply(null, [year, monthIndex, date, hours, minutes, seconds, ms]));
52
+ return dt;
53
+ }
54
+
55
+ static set(
56
+ dt: Date,
57
+ year?: number,
58
+ monthIndex?: number,
59
+ date?: number,
60
+ hours?: number,
61
+ minutes?: number,
62
+ seconds?: number,
63
+ ms?: number
64
+ ): Date {
65
+ if (!dt) {
66
+ dt = new Date(DateUtils.now());
67
+ }
68
+ if (typeof year === 'number') {
69
+ dt.setFullYear(year);
70
+ }
71
+ if (typeof monthIndex === 'number') {
72
+ dt.setMonth(monthIndex);
73
+ }
74
+ if (typeof date === 'number') {
75
+ dt.setDate(date);
76
+ }
77
+ if (typeof hours === 'number') {
78
+ dt.setHours(hours);
79
+ }
80
+ if (typeof minutes === 'number') {
81
+ dt.setMinutes(minutes);
82
+ }
83
+ if (typeof seconds === 'number') {
84
+ dt.setSeconds(seconds);
85
+ }
86
+ if (typeof ms === 'number') {
87
+ dt.setMilliseconds(ms);
88
+ }
89
+ return dt;
90
+ }
91
+
92
+ static add(
93
+ dt: Date,
94
+ year?: number,
95
+ monthCount?: number,
96
+ date?: number,
97
+ hours?: number,
98
+ minutes?: number,
99
+ seconds?: number,
100
+ ms?: number
101
+ ): Date {
102
+ if (!dt) {
103
+ dt = new Date(DateUtils.now());
104
+ }
105
+ if (typeof year === 'number') {
106
+ dt.setFullYear(dt.getFullYear() + year);
107
+ }
108
+ if (typeof monthCount === 'number') {
109
+ dt.setMonth(dt.getMonth() + monthCount);
110
+ }
111
+ if (typeof date === 'number') {
112
+ dt.setDate(dt.getDate() + date);
113
+ }
114
+ if (typeof hours === 'number') {
115
+ dt.setHours(dt.getHours() + hours);
116
+ }
117
+ if (typeof minutes === 'number') {
118
+ dt.setMinutes(dt.getMinutes() + minutes);
119
+ }
120
+ if (typeof seconds === 'number') {
121
+ dt.setSeconds(dt.getSeconds() + seconds);
122
+ }
123
+ if (typeof ms === 'number') {
124
+ dt.setMilliseconds(dt.getMilliseconds() + ms);
125
+ }
126
+ return dt;
127
+ }
128
+
129
+ // returns a difference object from two dates
130
+ static diff(endDate: Date, startDate: Date): DiffDate {
131
+ const startYear = startDate.getFullYear();
132
+ let yearDiff = endDate.getFullYear() - startYear;
133
+ let monthDiff = endDate.getMonth() - startDate.getMonth();
134
+ if (monthDiff < 0) {
135
+ yearDiff--;
136
+ monthDiff += 12;
137
+ }
138
+ let dayDiff = endDate.getDate() - startDate.getDate();
139
+ if (dayDiff < 0) {
140
+ if (monthDiff > 0) {
141
+ monthDiff--;
142
+ } else {
143
+ yearDiff--;
144
+ monthDiff = 11;
145
+ }
146
+ dayDiff += DateUtils.daysInMonth(startYear, startDate.getMonth());
147
+ }
148
+ const msTotal = endDate.valueOf() - startDate.valueOf(); // milliseconds
149
+ const secondTotal = Math.floor(msTotal / 1000); // milliseconds -> seconds
150
+ const hourDiff = Math.floor(secondTotal / (60 * 60)) % 24;
151
+ const minuteDiff = Math.floor(secondTotal / 60) % 60;
152
+ const secondDiff = secondTotal % 60;
153
+ const msDiff = msTotal % 1000;
154
+ return new DiffDate(yearDiff, monthDiff, dayDiff, hourDiff, minuteDiff, secondDiff, msDiff);
155
+ }
156
+
157
+ // returns a time difference string from two dates
158
+ static diffString(endDate: Date, startDate: Date, printMS = false): string {
159
+ const diff = DateUtils.diff(endDate, startDate);
160
+ let ret = '';
161
+ if (diff.years !== 0) {
162
+ ret = ret + diff.years + ' years(s), ';
163
+ }
164
+ if (diff.years !== 0 || diff.months !== 0) {
165
+ ret = ret + diff.months + ' month(s), ';
166
+ }
167
+ if (diff.years !== 0 || diff.months !== 0 || diff.days !== 0) {
168
+ ret = ret + diff.days + ' day(s), ';
169
+ }
170
+ if (diff.years !== 0 || diff.months !== 0 || diff.days !== 0 || diff.hours !== 0) {
171
+ ret = ret + diff.hours + ' hour(s), ';
172
+ }
173
+ if (diff.years !== 0 || diff.months !== 0 || diff.days !== 0 || diff.hours !== 0 || diff.minutes !== 0) {
174
+ ret = ret + diff.minutes + ' minute(s), ';
175
+ }
176
+ if (
177
+ diff.years !== 0 ||
178
+ diff.months !== 0 ||
179
+ diff.days !== 0 ||
180
+ diff.hours !== 0 ||
181
+ diff.minutes !== 0 ||
182
+ diff.seconds !== 0 ||
183
+ !printMS
184
+ ) {
185
+ ret = ret + diff.seconds + ' second(s)';
186
+ if (printMS) {
187
+ ret += ', ';
188
+ }
189
+ }
190
+ if (printMS) {
191
+ ret = ret + diff.milliseconds + ' ms';
192
+ }
193
+ return ret;
194
+ }
195
+
196
+ // returns a YYYYMMDD format string
197
+ static toYMD(dt: Date, separator: string) {
198
+ separator = typeof separator === 'undefined' ? '-' : separator;
199
+ return (
200
+ dt.getFullYear() +
201
+ separator +
202
+ ('0' + (dt.getMonth() + 1)).toString().slice(-2) +
203
+ separator +
204
+ ('0' + dt.getDate()).toString().slice(-2)
205
+ );
206
+ }
207
+ static toYmdHms(dt: Date, separator: string) {
208
+ separator = typeof separator === 'undefined' ? '-' : separator;
209
+ return (
210
+ dt.getFullYear() +
211
+ separator +
212
+ ('0' + (dt.getMonth() + 1)).toString().slice(-2) +
213
+ separator +
214
+ ('0' + dt.getDate()).toString().slice(-2) +
215
+ ' ' +
216
+ ('0' + dt.getHours()).toString().slice(-2) +
217
+ ':' +
218
+ ('0' + dt.getMinutes()).toString().slice(-2) +
219
+ ':' +
220
+ ('0' + dt.getSeconds()).toString().slice(-2)
221
+ );
222
+ }
223
+
224
+ static toJSONString(dt: Date) {
225
+ // return dt.getUTCFullYear() + '-' + ('0' + (dt.getUTCMonth() + 1)).toString().slice(-2) +
226
+ // '-' + ('0' + dt.getUTCDate()).toString().slice(-2) + ' ' + ('0' + dt.getUTCHours()).toString().slice(-2) +
227
+ // ':' + ('0' + dt.getUTCMinutes()).toString().slice(-2) + ':' + ('0' + dt.getUTCSeconds()).toString().slice(-2) + 'Z';
228
+ return dt.toJSON();
229
+ }
230
+
231
+ static showJSONString(dt: string, separator = '-') {
232
+ return DateUtils.toYmdHms(DateUtils.toDate(dt), separator);
233
+ }
234
+
235
+ static fromJSONString(dt: string) {
236
+ return DateUtils.toDate(dt);
237
+ }
238
+
239
+ static clearTime(dt: Date) {
240
+ dt.setHours(0);
241
+ dt.setMinutes(0);
242
+ dt.setSeconds(0);
243
+ dt.setMilliseconds(0);
244
+ return dt;
245
+ }
246
+
247
+ static clearUTCTime(dt: Date) {
248
+ dt.setUTCHours(0);
249
+ dt.setUTCMinutes(0);
250
+ dt.setUTCSeconds(0);
251
+ dt.setUTCMilliseconds(0);
252
+ return dt;
253
+ }
254
+
255
+ static format(dt: Date, fmt: string) {
256
+ if (!fmt) {
257
+ fmt = 'YYYY-MM-DD';
258
+ }
259
+ if (!dt) {
260
+ dt = new Date();
261
+ }
262
+
263
+ const parts: { [key: string]: string } = {
264
+ YYYY: dt.getFullYear().toString(),
265
+ YY: ('00' + (dt.getFullYear() - 100)).toString().slice(-2),
266
+ MM: ('0' + (dt.getMonth() + 1)).toString().slice(-2),
267
+ M: (dt.getMonth() + 1).toString(),
268
+ DD: ('0' + dt.getDate()).toString().slice(-2),
269
+ D: dt.getDate().toString(),
270
+ hh: ('0' + dt.getHours()).toString().slice(-2),
271
+ h: dt.getHours().toString(),
272
+ mm: ('0' + dt.getMinutes()).toString().slice(-2),
273
+ ss: ('0' + dt.getSeconds()).toString().slice(-2),
274
+ SSS: ('00' + dt.getMilliseconds()).toString().slice(-3),
275
+ S: Math.floor(dt.getMilliseconds() / 100)
276
+ .toString()
277
+ .slice(-1),
278
+ };
279
+
280
+ const array = fmt.match(/(\[[^\[]*\])|(\\)?(YYYY|YY|MM?|DD?|hh?|mm?|ss?|SSS|S|.)/g) as string[];
281
+ for (let i = 0, length = array.length; i < length; i++) {
282
+ if (parts[array[i]]) {
283
+ array[i] = parts[array[i]];
284
+ }
285
+ }
286
+ const ret = array.join('');
287
+ return ret;
288
+ }
289
+ }
290
+
291
+ export class DiffDate {
292
+ years: number;
293
+ months: number;
294
+ days: number;
295
+ hours: number;
296
+ minutes: number;
297
+ seconds: number;
298
+ milliseconds: number;
299
+
300
+ constructor(
301
+ years: number,
302
+ months: number,
303
+ days: number,
304
+ hours: number,
305
+ minutes: number,
306
+ seconds: number,
307
+ milliseconds: number
308
+ ) {
309
+ this.years = years;
310
+ this.months = months;
311
+ this.days = days;
312
+ this.hours = hours;
313
+ this.minutes = minutes;
314
+ this.seconds = seconds;
315
+ this.milliseconds = milliseconds;
316
+ }
317
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Simple object check.
3
+ * @param item
4
+ * @returns {boolean}
5
+ */
6
+ const needMerge = (item: any) => {
7
+ return item && typeof item === 'object' && !Array.isArray(item);
8
+ };
9
+
10
+ /**
11
+ * Deep merge two objects.
12
+ * target must be a object, and array will be replaced
13
+ * @param target
14
+ * @param ...sources
15
+ */
16
+ export const deepMerge = (target: any, ...sources: any[]): any => {
17
+ if (!sources.length) return target;
18
+ const source = sources.shift();
19
+
20
+ if (needMerge(target) && needMerge(source)) {
21
+ for (const key in source) {
22
+ if (needMerge(source[key])) {
23
+ if (!target[key]) Object.assign(target, { [key]: {} });
24
+ deepMerge(target[key], source[key]);
25
+ } else {
26
+ Object.assign(target, { [key]: source[key] });
27
+ }
28
+ }
29
+ }
30
+
31
+ return deepMerge(target, ...sources);
32
+ };
33
+
34
+ // Clone data object only
35
+ export const cloneJson = (json: any) => {
36
+ return JSON.parse(JSON.stringify(json));
37
+ };
@@ -0,0 +1,12 @@
1
+ /*
2
+ delay(3000).then(() => alert('runs after 3 seconds'));
3
+ or
4
+ await delay(3000);
5
+ */
6
+ export const delay = (ms: number) => {
7
+ return new Promise<void>((resolve, reject) => {
8
+ setTimeout(() => {
9
+ resolve();
10
+ }, ms);
11
+ });
12
+ };
@@ -0,0 +1,55 @@
1
+ import { Logger } from '../logger';
2
+ import { FsUtils } from './fs-utils';
3
+
4
+ const logger = new Logger('setting-file');
5
+
6
+ export type FileSettingProps = {
7
+ [key: string]: string | number | boolean | object;
8
+ };
9
+
10
+ /**
11
+ * A simple settings/config class for storing key/value pairs with persistence.
12
+ */
13
+ export class FileSetting {
14
+ private settings: FileSettingProps = {};
15
+
16
+ constructor() {}
17
+
18
+ async load(path: string) {
19
+ let json;
20
+ if ((json = await FsUtils.readFile(path))) {
21
+ try {
22
+ const jsonObject = JSON.parse(json);
23
+ Object.assign(this.settings, jsonObject);
24
+ } catch (e: any) {
25
+ logger.error('Loading json file failed', e.message);
26
+ }
27
+ }
28
+ }
29
+
30
+ async save(path: string) {
31
+ await FsUtils.writeFile(path, JSON.stringify(this.settings));
32
+ }
33
+
34
+ set(key: string, value: string | number | boolean | object | undefined) {
35
+ if (value === undefined) {
36
+ delete this.settings[key];
37
+ } else {
38
+ this.settings[key] = value;
39
+ }
40
+ }
41
+
42
+ setAll(values: FileSettingProps) {
43
+ for (let k in values) {
44
+ this.settings[k] = values[k];
45
+ }
46
+ }
47
+
48
+ get(key: string, defaultValue: string | number | boolean | object): string | number | boolean | object {
49
+ return key in this.settings ? this.settings[key] : defaultValue;
50
+ }
51
+
52
+ get getAll(): FileSettingProps {
53
+ return this.settings;
54
+ }
55
+ }
@@ -0,0 +1,11 @@
1
+ export const formatBytes = (bytes: number, decimals = 2) => {
2
+ if (!+bytes) return '0 Bytes';
3
+
4
+ const k = 1024;
5
+ const dm = decimals < 0 ? 0 : decimals;
6
+ const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
7
+
8
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
9
+
10
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
11
+ };
@@ -0,0 +1,144 @@
1
+ import { Dirent } from 'fs';
2
+ import * as fs from 'fs/promises';
3
+
4
+ export type FileInfoProps = {
5
+ size: number;
6
+ mtime: number;
7
+ isFile: boolean;
8
+ isDir: boolean;
9
+ };
10
+ export class FsUtils {
11
+ static readFile = async (filePath: string): Promise<string | undefined> => {
12
+ try {
13
+ const text = await fs.readFile(filePath, 'utf-8');
14
+ return text;
15
+ } catch (e) {
16
+ console.log('writeFile failed', e);
17
+ return undefined;
18
+ }
19
+ };
20
+
21
+ static fileInfo = async (filePath: string): Promise<FileInfoProps | undefined> => {
22
+ try {
23
+ const stats = await fs.stat(filePath);
24
+ return { size: stats.size, mtime: stats.mtime.getTime(), isFile: stats.isFile(), isDir: stats.isDirectory() };
25
+ } catch {
26
+ return undefined;
27
+ }
28
+ };
29
+
30
+ static writeFile = async (
31
+ filePath: string,
32
+ content:
33
+ | string
34
+ | NodeJS.ArrayBufferView
35
+ | Iterable<string | NodeJS.ArrayBufferView>
36
+ | AsyncIterable<string | NodeJS.ArrayBufferView>
37
+ ): Promise<boolean> => {
38
+ try {
39
+ await fs.writeFile(filePath, content, 'utf-8');
40
+ return true;
41
+ } catch (e) {
42
+ console.log('writeFile failed', e);
43
+ return false;
44
+ }
45
+ };
46
+
47
+ static appendFile = async (filePath: string, content: string | Uint8Array): Promise<boolean> => {
48
+ try {
49
+ await fs.appendFile(filePath, content, 'utf-8');
50
+ return true;
51
+ } catch (e) {
52
+ console.log('appendFile failed', e);
53
+ return false;
54
+ }
55
+ };
56
+
57
+ static pathExist = async (filePath: string) => {
58
+ try {
59
+ await fs.access(filePath);
60
+ return true;
61
+ } catch {
62
+ return false;
63
+ }
64
+ };
65
+
66
+ static mkdir = async (dirPath: string) => {
67
+ try {
68
+ await fs.mkdir(dirPath, { recursive: true });
69
+ return true;
70
+ } catch {
71
+ return false;
72
+ }
73
+ };
74
+
75
+ static unlinkFile = async (filePath: string) => {
76
+ try {
77
+ await fs.unlink(filePath);
78
+ return true;
79
+ } catch {
80
+ return false;
81
+ }
82
+ };
83
+
84
+ static unlinkFolderEmpty = async (filePath: string) => {
85
+ try {
86
+ await fs.rmdir(filePath);
87
+ return true;
88
+ } catch {
89
+ return false;
90
+ }
91
+ };
92
+
93
+ static unlinkFolderForce = async (filePath: string, recursive: boolean, force: boolean) => {
94
+ try {
95
+ await fs.rm(filePath, { recursive: recursive, force: force });
96
+ return true;
97
+ } catch {
98
+ return false;
99
+ }
100
+ };
101
+
102
+ static rename = async (filePath: string, newPath: string) => {
103
+ try {
104
+ await fs.rename(filePath, newPath);
105
+ return true;
106
+ } catch {
107
+ return false;
108
+ }
109
+ };
110
+
111
+ static getDirAndFiles = async (dirPath: string): Promise<string[]> => {
112
+ try {
113
+ const files = await fs.readdir(dirPath, { recursive: false });
114
+ return files;
115
+ } catch {
116
+ return [];
117
+ }
118
+ };
119
+
120
+ // return with fullpath list of Dirent
121
+ static getDirsFullpath = async (dirPath: string): Promise<Dirent[]> => {
122
+ try {
123
+ const files = await fs.readdir(dirPath, {
124
+ recursive: false,
125
+ withFileTypes: true,
126
+ });
127
+ return files;
128
+ } catch {
129
+ return [];
130
+ }
131
+ };
132
+
133
+ static async readPartOfFile(path: string, start: number, length: number) {
134
+ try {
135
+ const fileHandle = await fs.open(path, 'r');
136
+ const buffer = Buffer.alloc(length);
137
+ const { bytesRead } = await fileHandle.read(buffer, 0, length, start);
138
+ await fileHandle.close();
139
+ return buffer.slice(0, bytesRead);
140
+ } catch {
141
+ return null;
142
+ }
143
+ }
144
+ }
@@ -0,0 +1,27 @@
1
+ function getEnv(key: string, defaultValue: number): number;
2
+ function getEnv(key: string, defaultValue: string): string;
3
+ function getEnv(key: string, defaultValue: boolean): boolean;
4
+ function getEnv(key: string, defaultValue: object): object;
5
+ function getEnv(key: string, defaultValue: any): any {
6
+ if (typeof process.env[key] === 'undefined') {
7
+ return defaultValue;
8
+ }
9
+
10
+ if (typeof defaultValue === 'number') {
11
+ return Number.parseInt(process.env[key]!);
12
+ }
13
+ if (typeof defaultValue === 'boolean') {
14
+ return process.env[key]!.toLocaleLowerCase() === 'true' || process.env[key] === '1';
15
+ }
16
+ if (typeof defaultValue === 'object') {
17
+ try {
18
+ return JSON.parse(process.env[key]!);
19
+ } catch (error) {}
20
+ return defaultValue;
21
+ }
22
+ // if (typeof defaultValue === 'string') {
23
+ // return process.env[key];
24
+ // }
25
+ return process.env[key];
26
+ }
27
+ export { getEnv };
@@ -0,0 +1,12 @@
1
+ export * from './crypto';
2
+ export * from './date-utils';
3
+ export * from './deep-merge';
4
+ export * from './delay';
5
+ export * from './file-setting';
6
+ export * from './format-bytes';
7
+ export * from './get-env';
8
+ export * from './is-type';
9
+ export * from './load-env';
10
+ export * from './pad';
11
+ export * from './cookie-util';
12
+ export * from './fs-utils';
@@ -0,0 +1,48 @@
1
+ export class IsType {
2
+ static getType(obj: any) {
3
+ var type = typeof obj;
4
+ if (type === 'undefined') return 'undefined';
5
+ else if (type === 'string' || obj instanceof String) return 'string';
6
+ else if (type === 'number' || obj instanceof Number) return 'number';
7
+ else if (type === 'function' || obj instanceof Function) return 'function';
8
+ else if (!!obj && obj.constructor === Array) return 'array';
9
+ else if (obj && obj.nodeType === 1) return 'element';
10
+ else if (type === 'object') return 'object';
11
+ else return 'unknown';
12
+ }
13
+
14
+ static isArray(input: any) {
15
+ return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
16
+ }
17
+
18
+ static isObject(input: any) {
19
+ // null is not object
20
+ return input != null && Object.prototype.toString.call(input) === '[object Object]';
21
+ }
22
+
23
+ static isObjectEmpty(obj: any) {
24
+ if (Object.getOwnPropertyNames) {
25
+ return Object.getOwnPropertyNames(obj).length === 0;
26
+ } else {
27
+ var k;
28
+ for (k in obj) {
29
+ if (obj.hasOwnProperty(k)) {
30
+ return false;
31
+ }
32
+ }
33
+ return true;
34
+ }
35
+ }
36
+
37
+ static isUndefined(input: any) {
38
+ return input === void 0;
39
+ }
40
+
41
+ static isNumber(input: any) {
42
+ return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
43
+ }
44
+
45
+ static isDate(input: any) {
46
+ return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
47
+ }
48
+ }
@@ -0,0 +1,14 @@
1
+ import * as webEnv from '../../common-js/web-env.js';
2
+
3
+ export const loadEnv = async (envFile: string, overrideEnv: boolean = false) => {
4
+ return webEnv.loadEnv(envFile, overrideEnv);
5
+ };
6
+
7
+ export const getWebEnv = (appName: string): { [k: string]: string } => {
8
+ return webEnv.getWebEnv(appName) as { [k: string]: string };
9
+ };
10
+
11
+ // // Replace <!--META-ENV-START-->...<!--META-ENV-END--> for mobile app and replace it again for web app
12
+ // export const replaceWebEnv = (html: string, appName: string, addMetaTag: boolean) => {
13
+ // return webEnv.replaceWebEnv(html, appName, addMetaTag);
14
+ // }
@@ -0,0 +1,6 @@
1
+ export const padRight = (str: string, length: number, fillString: string) => {
2
+ return str.padEnd(length, fillString);
3
+ };
4
+ export const padLeft = (str: string, length: number, fillString: string) => {
5
+ return str.padStart(length, fillString);
6
+ };
@@ -0,0 +1,5 @@
1
+ import { IApiRouter } from './api-router-props';
2
+
3
+ export interface IApiBase {
4
+ getRouter(): IApiRouter;
5
+ }