@ruiapp/rapid-core 0.11.5 → 0.11.7

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 (204) hide show
  1. package/CHANGELOG.md +11 -11
  2. package/dist/core/pluginManager.d.ts +2 -0
  3. package/dist/core/server.d.ts +3 -0
  4. package/dist/dataAccess/entityManager.d.ts +3 -3
  5. package/dist/index.js +118 -41
  6. package/dist/server.d.ts +1 -0
  7. package/dist/types.d.ts +2 -0
  8. package/package.json +1 -1
  9. package/rollup.config.js +16 -16
  10. package/src/bootstrapApplicationConfig.ts +904 -904
  11. package/src/core/ExpressionInterpreter.ts +45 -45
  12. package/src/core/actionHandler.ts +24 -24
  13. package/src/core/actionHandlers/ifActionHandler.ts +27 -27
  14. package/src/core/eventManager.ts +20 -20
  15. package/src/core/facility.ts +7 -7
  16. package/src/core/http/formDataParser.ts +87 -87
  17. package/src/core/http-types.ts +4 -4
  18. package/src/core/pluginManager.ts +202 -193
  19. package/src/core/providers/runtimeProvider.ts +5 -5
  20. package/src/core/request.ts +96 -96
  21. package/src/core/response.ts +84 -84
  22. package/src/core/routeContext.ts +127 -127
  23. package/src/core/routes/healthz.ts +20 -20
  24. package/src/core/routes/index.ts +3 -3
  25. package/src/core/routesBuilder.ts +129 -122
  26. package/src/core/server.ts +161 -158
  27. package/src/dataAccess/columnTypeMapper.ts +22 -22
  28. package/src/dataAccess/dataAccessTypes.ts +165 -165
  29. package/src/dataAccess/dataAccessor.ts +135 -135
  30. package/src/dataAccess/entityManager.ts +2031 -1986
  31. package/src/dataAccess/entityMapper.ts +111 -111
  32. package/src/dataAccess/entityValidator.ts +33 -33
  33. package/src/dataAccess/propertyMapper.ts +28 -28
  34. package/src/deno-std/assert/assert.ts +9 -9
  35. package/src/deno-std/assert/assertion_error.ts +7 -7
  36. package/src/deno-std/datetime/to_imf.ts +32 -32
  37. package/src/deno-std/encoding/base64.ts +141 -141
  38. package/src/deno-std/http/cookie.ts +372 -372
  39. package/src/facilities/cache/CacheFacilityTypes.ts +29 -29
  40. package/src/facilities/cache/CacheFactory.ts +31 -31
  41. package/src/facilities/cache/MemoryCache.ts +58 -58
  42. package/src/facilities/cache/MemoryCacheProvider.ts +15 -15
  43. package/src/facilities/log/LogFacility.ts +35 -35
  44. package/src/helpers/dbTransactionHelper.ts +42 -42
  45. package/src/helpers/entityHelper.ts +89 -89
  46. package/src/helpers/filterHelper.ts +148 -148
  47. package/src/helpers/inputHelper.ts +11 -11
  48. package/src/helpers/licenseHelper.ts +29 -29
  49. package/src/helpers/metaHelper.ts +111 -111
  50. package/src/helpers/runCollectionEntityActionHandler.ts +58 -58
  51. package/src/index.ts +85 -85
  52. package/src/plugins/auth/AuthPlugin.ts +107 -107
  53. package/src/plugins/auth/AuthPluginTypes.ts +11 -11
  54. package/src/plugins/auth/actionHandlers/changePassword.ts +61 -61
  55. package/src/plugins/auth/actionHandlers/createSession.ts +68 -68
  56. package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
  57. package/src/plugins/auth/actionHandlers/getMyProfile.ts +28 -28
  58. package/src/plugins/auth/actionHandlers/index.ts +8 -8
  59. package/src/plugins/auth/actionHandlers/resetPassword.ts +45 -45
  60. package/src/plugins/auth/models/AccessToken.ts +56 -56
  61. package/src/plugins/auth/models/index.ts +3 -3
  62. package/src/plugins/auth/routes/changePassword.ts +15 -15
  63. package/src/plugins/auth/routes/getMyProfile.ts +15 -15
  64. package/src/plugins/auth/routes/index.ts +7 -7
  65. package/src/plugins/auth/routes/resetPassword.ts +15 -15
  66. package/src/plugins/auth/routes/signin.ts +15 -15
  67. package/src/plugins/auth/routes/signout.ts +15 -15
  68. package/src/plugins/auth/services/AuthService.ts +66 -66
  69. package/src/plugins/cronJob/CronJobPlugin.ts +104 -104
  70. package/src/plugins/cronJob/CronJobPluginTypes.ts +44 -44
  71. package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
  72. package/src/plugins/cronJob/actionHandlers/runCronJob.ts +32 -32
  73. package/src/plugins/cronJob/entityWatchers/cronJobEntityWatchers.ts +24 -24
  74. package/src/plugins/cronJob/entityWatchers/index.ts +4 -4
  75. package/src/plugins/cronJob/models/CronJob.ts +129 -129
  76. package/src/plugins/cronJob/models/index.ts +3 -3
  77. package/src/plugins/cronJob/routes/index.ts +3 -3
  78. package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
  79. package/src/plugins/cronJob/services/CronJobService.ts +255 -255
  80. package/src/plugins/dataManage/DataManagePlugin.ts +165 -165
  81. package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +15 -15
  82. package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +17 -17
  83. package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +81 -81
  84. package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +20 -20
  85. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntities.ts +47 -45
  86. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntityById.ts +20 -20
  87. package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +27 -27
  88. package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +30 -30
  89. package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
  90. package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +15 -15
  91. package/src/plugins/dataManage/actionHandlers/saveEntity.ts +46 -46
  92. package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +38 -38
  93. package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
  94. package/src/plugins/fileManage/FileManagePlugin.ts +52 -52
  95. package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +65 -65
  96. package/src/plugins/fileManage/actionHandlers/downloadFile.ts +44 -44
  97. package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
  98. package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
  99. package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
  100. package/src/plugins/fileManage/routes/index.ts +5 -5
  101. package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
  102. package/src/plugins/license/LicensePlugin.ts +79 -79
  103. package/src/plugins/license/LicensePluginTypes.ts +95 -95
  104. package/src/plugins/license/LicenseService.ts +141 -141
  105. package/src/plugins/license/actionHandlers/getLicense.ts +18 -18
  106. package/src/plugins/license/actionHandlers/index.ts +5 -5
  107. package/src/plugins/license/actionHandlers/updateLicense.ts +24 -24
  108. package/src/plugins/license/helpers/certHelper.ts +21 -21
  109. package/src/plugins/license/helpers/cryptoHelper.ts +47 -47
  110. package/src/plugins/license/models/index.ts +1 -1
  111. package/src/plugins/license/routes/getLicense.ts +15 -15
  112. package/src/plugins/license/routes/index.ts +4 -4
  113. package/src/plugins/license/routes/updateLicense.ts +15 -15
  114. package/src/plugins/mail/MailPlugin.ts +74 -74
  115. package/src/plugins/mail/MailPluginTypes.ts +27 -27
  116. package/src/plugins/mail/MailService.ts +38 -38
  117. package/src/plugins/mail/actionHandlers/index.ts +3 -3
  118. package/src/plugins/mail/models/index.ts +1 -1
  119. package/src/plugins/mail/routes/index.ts +1 -1
  120. package/src/plugins/metaManage/MetaManagePlugin.ts +198 -198
  121. package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
  122. package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +10 -10
  123. package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +10 -10
  124. package/src/plugins/metaManage/services/MetaService.ts +376 -376
  125. package/src/plugins/notification/NotificationPlugin.ts +68 -68
  126. package/src/plugins/notification/NotificationPluginTypes.ts +13 -13
  127. package/src/plugins/notification/NotificationService.ts +25 -25
  128. package/src/plugins/notification/actionHandlers/index.ts +3 -3
  129. package/src/plugins/notification/models/Notification.ts +60 -60
  130. package/src/plugins/notification/models/index.ts +3 -3
  131. package/src/plugins/notification/routes/index.ts +1 -1
  132. package/src/plugins/routeManage/RouteManagePlugin.ts +64 -64
  133. package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
  134. package/src/plugins/routeManage/actionHandlers/mock.ts +28 -28
  135. package/src/plugins/sequence/SequencePlugin.ts +146 -146
  136. package/src/plugins/sequence/SequencePluginTypes.ts +69 -69
  137. package/src/plugins/sequence/SequenceService.ts +92 -92
  138. package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
  139. package/src/plugins/sequence/actionHandlers/index.ts +4 -4
  140. package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
  141. package/src/plugins/sequence/models/SequenceRule.ts +42 -42
  142. package/src/plugins/sequence/models/index.ts +4 -4
  143. package/src/plugins/sequence/routes/generateSn.ts +15 -15
  144. package/src/plugins/sequence/routes/index.ts +3 -3
  145. package/src/plugins/sequence/segment-utility.ts +11 -11
  146. package/src/plugins/sequence/segments/autoIncrement.ts +90 -90
  147. package/src/plugins/sequence/segments/dayOfMonth.ts +19 -19
  148. package/src/plugins/sequence/segments/index.ts +9 -9
  149. package/src/plugins/sequence/segments/literal.ts +16 -16
  150. package/src/plugins/sequence/segments/month.ts +19 -19
  151. package/src/plugins/sequence/segments/parameter.ts +20 -20
  152. package/src/plugins/sequence/segments/year.ts +19 -19
  153. package/src/plugins/serverOperation/ServerOperationPlugin.ts +93 -93
  154. package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +25 -25
  155. package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
  156. package/src/plugins/serverOperation/actionHandlers/runServerOperation.ts +20 -20
  157. package/src/plugins/setting/SettingPlugin.ts +68 -68
  158. package/src/plugins/setting/SettingPluginTypes.ts +37 -37
  159. package/src/plugins/setting/SettingService.ts +222 -222
  160. package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
  161. package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
  162. package/src/plugins/setting/actionHandlers/index.ts +6 -6
  163. package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
  164. package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
  165. package/src/plugins/setting/models/SystemSettingItem.ts +48 -48
  166. package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
  167. package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
  168. package/src/plugins/setting/models/UserSettingItem.ts +55 -55
  169. package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
  170. package/src/plugins/setting/models/index.ts +8 -8
  171. package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
  172. package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
  173. package/src/plugins/setting/routes/index.ts +5 -5
  174. package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
  175. package/src/plugins/stateMachine/StateMachinePlugin.ts +196 -196
  176. package/src/plugins/stateMachine/StateMachinePluginTypes.ts +48 -48
  177. package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
  178. package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +54 -54
  179. package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
  180. package/src/plugins/stateMachine/models/index.ts +3 -3
  181. package/src/plugins/stateMachine/routes/index.ts +3 -3
  182. package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
  183. package/src/plugins/stateMachine/stateMachineHelper.ts +36 -36
  184. package/src/plugins/webhooks/WebhooksPlugin.ts +148 -148
  185. package/src/plugins/webhooks/pluginConfig.ts +75 -75
  186. package/src/polyfill.ts +5 -5
  187. package/src/proxy/mod.ts +38 -38
  188. package/src/proxy/types.ts +21 -21
  189. package/src/queryBuilder/index.ts +1 -1
  190. package/src/queryBuilder/queryBuilder.ts +755 -755
  191. package/src/server.ts +567 -556
  192. package/src/types/cron-job-types.ts +71 -71
  193. package/src/types.ts +884 -882
  194. package/src/utilities/accessControlUtility.ts +33 -33
  195. package/src/utilities/entityUtility.ts +18 -18
  196. package/src/utilities/errorUtility.ts +15 -15
  197. package/src/utilities/fsUtility.ts +137 -137
  198. package/src/utilities/httpUtility.ts +19 -19
  199. package/src/utilities/jwtUtility.ts +26 -26
  200. package/src/utilities/passwordUtility.ts +26 -26
  201. package/src/utilities/pathUtility.ts +14 -14
  202. package/src/utilities/timeUtility.ts +17 -17
  203. package/src/utilities/typeUtility.ts +15 -15
  204. package/tsconfig.json +19 -19
@@ -1,33 +1,33 @@
1
- import { find } from "lodash";
2
-
3
- export type PermissionCheckPolicy = {
4
- any?: string[];
5
- all?: string[];
6
- };
7
-
8
- export function isAccessAllowed(policy: PermissionCheckPolicy, allowedActions: string[]): boolean {
9
- let isAnyCheckPassed = true;
10
- let isAllCheckPassed = true;
11
-
12
- if (policy.any) {
13
- isAnyCheckPassed = false;
14
- for (const action of policy.any) {
15
- if (find(allowedActions, (item) => item === action) != null) {
16
- isAnyCheckPassed = true;
17
- break;
18
- }
19
- }
20
- }
21
-
22
- if (policy.all) {
23
- isAllCheckPassed = true;
24
- for (const action of policy.all) {
25
- if (find(allowedActions, (item) => item === action) == null) {
26
- isAnyCheckPassed = false;
27
- break;
28
- }
29
- }
30
- }
31
-
32
- return isAnyCheckPassed && isAllCheckPassed;
33
- }
1
+ import { find } from "lodash";
2
+
3
+ export type PermissionCheckPolicy = {
4
+ any?: string[];
5
+ all?: string[];
6
+ };
7
+
8
+ export function isAccessAllowed(policy: PermissionCheckPolicy, allowedActions: string[]): boolean {
9
+ let isAnyCheckPassed = true;
10
+ let isAllCheckPassed = true;
11
+
12
+ if (policy.any) {
13
+ isAnyCheckPassed = false;
14
+ for (const action of policy.any) {
15
+ if (find(allowedActions, (item) => item === action) != null) {
16
+ isAnyCheckPassed = true;
17
+ break;
18
+ }
19
+ }
20
+ }
21
+
22
+ if (policy.all) {
23
+ isAllCheckPassed = true;
24
+ for (const action of policy.all) {
25
+ if (find(allowedActions, (item) => item === action) == null) {
26
+ isAnyCheckPassed = false;
27
+ break;
28
+ }
29
+ }
30
+ }
31
+
32
+ return isAnyCheckPassed && isAllCheckPassed;
33
+ }
@@ -1,18 +1,18 @@
1
- import { isObject } from "lodash";
2
-
3
- export function getEntityRelationTargetId(entity: Record<string, any>, propName: string, targetColumnName?: string) {
4
- if (!entity) {
5
- throw new Error(`"entity" parameter is required.`);
6
- }
7
-
8
- let targetId: number | { id?: number } = entity[propName];
9
- if (!targetId && targetColumnName) {
10
- targetId = entity[targetColumnName];
11
- }
12
-
13
- if (isObject(targetId)) {
14
- return targetId.id;
15
- } else {
16
- return targetId;
17
- }
18
- }
1
+ import { isObject } from "lodash";
2
+
3
+ export function getEntityRelationTargetId(entity: Record<string, any>, propName: string, targetColumnName?: string) {
4
+ if (!entity) {
5
+ throw new Error(`"entity" parameter is required.`);
6
+ }
7
+
8
+ let targetId: number | { id?: number } = entity[propName];
9
+ if (!targetId && targetColumnName) {
10
+ targetId = entity[targetColumnName];
11
+ }
12
+
13
+ if (isObject(targetId)) {
14
+ return targetId.id;
15
+ } else {
16
+ return targetId;
17
+ }
18
+ }
@@ -1,15 +1,15 @@
1
- export function newError(type: string, message?: string, cause?: any) {
2
- const error = new Error(message, {
3
- cause,
4
- });
5
- error.name = type;
6
- return error;
7
- }
8
-
9
- export function newDatabaseError(message?: string, cause?: any) {
10
- return newError("DatabaseError", message, cause);
11
- }
12
-
13
- export function newEntityOperationError(message?: string, cause?: any) {
14
- return newError("EntityOperationError", message, cause);
15
- }
1
+ export function newError(type: string, message?: string, cause?: any) {
2
+ const error = new Error(message, {
3
+ cause,
4
+ });
5
+ error.name = type;
6
+ return error;
7
+ }
8
+
9
+ export function newDatabaseError(message?: string, cause?: any) {
10
+ return newError("DatabaseError", message, cause);
11
+ }
12
+
13
+ export function newEntityOperationError(message?: string, cause?: any) {
14
+ return newError("EntityOperationError", message, cause);
15
+ }
@@ -1,137 +1,137 @@
1
- import fs from "fs";
2
- import path from "path";
3
-
4
- export async function readFile(path: string): Promise<Buffer> {
5
- return new Promise((resolve, reject) => {
6
- fs.readFile(path, null, (err, data) => {
7
- if (err) {
8
- reject(err);
9
- } else {
10
- resolve(data);
11
- }
12
- });
13
- });
14
- }
15
-
16
- export async function copyFile(fromPath: string, toPath: string): Promise<void> {
17
- return new Promise((resolve, reject) => {
18
- fs.copyFile(fromPath, toPath, (err) => {
19
- if (err) {
20
- reject(err);
21
- } else {
22
- resolve();
23
- }
24
- });
25
- });
26
- }
27
-
28
- export async function removeFile(path: string): Promise<void> {
29
- return new Promise((resolve, reject) => {
30
- fs.rm(path, (err) => {
31
- if (err) {
32
- reject(err);
33
- } else {
34
- resolve();
35
- }
36
- });
37
- });
38
- }
39
-
40
- export async function moveFile(fromPath: string, toPath: string): Promise<void> {
41
- return new Promise((resolve, reject) => {
42
- fs.rename(fromPath, toPath, (err) => {
43
- if (err) {
44
- reject(err);
45
- } else {
46
- resolve();
47
- }
48
- });
49
- });
50
- }
51
-
52
- export async function appendFile(path: string, data: ArrayBuffer): Promise<void> {
53
- return new Promise((resolve, reject) => {
54
- fs.appendFile(path, Buffer.from(data), (err) => {
55
- if (err) {
56
- reject(err);
57
- } else {
58
- resolve();
59
- }
60
- });
61
- });
62
- }
63
-
64
- export async function writeFile(path: string, data: ArrayBuffer): Promise<void> {
65
- return new Promise((resolve, reject) => {
66
- fs.writeFile(path, Buffer.from(data), (err) => {
67
- if (err) {
68
- reject(err);
69
- } else {
70
- resolve();
71
- }
72
- });
73
- });
74
- }
75
-
76
- export function ensureDirectoryExists(dirPath: string) {
77
- if (!fs.existsSync(dirPath)) {
78
- const parentDirPath = path.dirname(dirPath);
79
- if (parentDirPath == dirPath) {
80
- return;
81
- }
82
- ensureDirectoryExists(parentDirPath);
83
-
84
- fs.mkdirSync(dirPath);
85
- }
86
- }
87
-
88
- export type EnumFileBaseNamesOptions = {
89
- dirPath: string;
90
- prefix?: string;
91
- fileNameFilter?: (fileName: string) => boolean;
92
- };
93
-
94
- export function enumFileBaseNamesInDirectory(options: EnumFileBaseNamesOptions): string[] {
95
- const { dirPath, prefix, fileNameFilter } = options;
96
- let fileNames = [];
97
-
98
- let resolvedDirPath = dirPath;
99
- const isRelative = dirPath.startsWith(".") || dirPath.startsWith("..");
100
- if (isRelative) {
101
- resolvedDirPath = path.join(process.cwd(), dirPath);
102
- }
103
-
104
- if (!fs.existsSync(resolvedDirPath)) {
105
- console.warn(`Directory '${resolvedDirPath}' not found.`);
106
- return [];
107
- }
108
-
109
- const files = fs.readdirSync(resolvedDirPath);
110
- for (const fileName of files) {
111
- const filePathName = path.join(resolvedDirPath, fileName);
112
- const fileStat = fs.statSync(filePathName);
113
- if (fileStat.isDirectory()) {
114
- fileNames = fileNames.concat(
115
- enumFileBaseNamesInDirectory({
116
- dirPath: filePathName,
117
- prefix: prefix ? `${prefix}/${fileName}` : fileName,
118
- fileNameFilter,
119
- }),
120
- );
121
- } else if (fileStat.isFile()) {
122
- if (fileNameFilter && !fileNameFilter(fileName)) {
123
- continue;
124
- }
125
-
126
- const baseName = path.parse(fileName).name;
127
- if (prefix) {
128
- fileNames.push(`${prefix}/${baseName}`);
129
- } else {
130
- fileNames.push(baseName);
131
- }
132
- }
133
- }
134
-
135
- fileNames.sort();
136
- return fileNames;
137
- }
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ export async function readFile(path: string): Promise<Buffer> {
5
+ return new Promise((resolve, reject) => {
6
+ fs.readFile(path, null, (err, data) => {
7
+ if (err) {
8
+ reject(err);
9
+ } else {
10
+ resolve(data);
11
+ }
12
+ });
13
+ });
14
+ }
15
+
16
+ export async function copyFile(fromPath: string, toPath: string): Promise<void> {
17
+ return new Promise((resolve, reject) => {
18
+ fs.copyFile(fromPath, toPath, (err) => {
19
+ if (err) {
20
+ reject(err);
21
+ } else {
22
+ resolve();
23
+ }
24
+ });
25
+ });
26
+ }
27
+
28
+ export async function removeFile(path: string): Promise<void> {
29
+ return new Promise((resolve, reject) => {
30
+ fs.rm(path, (err) => {
31
+ if (err) {
32
+ reject(err);
33
+ } else {
34
+ resolve();
35
+ }
36
+ });
37
+ });
38
+ }
39
+
40
+ export async function moveFile(fromPath: string, toPath: string): Promise<void> {
41
+ return new Promise((resolve, reject) => {
42
+ fs.rename(fromPath, toPath, (err) => {
43
+ if (err) {
44
+ reject(err);
45
+ } else {
46
+ resolve();
47
+ }
48
+ });
49
+ });
50
+ }
51
+
52
+ export async function appendFile(path: string, data: ArrayBuffer): Promise<void> {
53
+ return new Promise((resolve, reject) => {
54
+ fs.appendFile(path, Buffer.from(data), (err) => {
55
+ if (err) {
56
+ reject(err);
57
+ } else {
58
+ resolve();
59
+ }
60
+ });
61
+ });
62
+ }
63
+
64
+ export async function writeFile(path: string, data: ArrayBuffer): Promise<void> {
65
+ return new Promise((resolve, reject) => {
66
+ fs.writeFile(path, Buffer.from(data), (err) => {
67
+ if (err) {
68
+ reject(err);
69
+ } else {
70
+ resolve();
71
+ }
72
+ });
73
+ });
74
+ }
75
+
76
+ export function ensureDirectoryExists(dirPath: string) {
77
+ if (!fs.existsSync(dirPath)) {
78
+ const parentDirPath = path.dirname(dirPath);
79
+ if (parentDirPath == dirPath) {
80
+ return;
81
+ }
82
+ ensureDirectoryExists(parentDirPath);
83
+
84
+ fs.mkdirSync(dirPath);
85
+ }
86
+ }
87
+
88
+ export type EnumFileBaseNamesOptions = {
89
+ dirPath: string;
90
+ prefix?: string;
91
+ fileNameFilter?: (fileName: string) => boolean;
92
+ };
93
+
94
+ export function enumFileBaseNamesInDirectory(options: EnumFileBaseNamesOptions): string[] {
95
+ const { dirPath, prefix, fileNameFilter } = options;
96
+ let fileNames = [];
97
+
98
+ let resolvedDirPath = dirPath;
99
+ const isRelative = dirPath.startsWith(".") || dirPath.startsWith("..");
100
+ if (isRelative) {
101
+ resolvedDirPath = path.join(process.cwd(), dirPath);
102
+ }
103
+
104
+ if (!fs.existsSync(resolvedDirPath)) {
105
+ console.warn(`Directory '${resolvedDirPath}' not found.`);
106
+ return [];
107
+ }
108
+
109
+ const files = fs.readdirSync(resolvedDirPath);
110
+ for (const fileName of files) {
111
+ const filePathName = path.join(resolvedDirPath, fileName);
112
+ const fileStat = fs.statSync(filePathName);
113
+ if (fileStat.isDirectory()) {
114
+ fileNames = fileNames.concat(
115
+ enumFileBaseNamesInDirectory({
116
+ dirPath: filePathName,
117
+ prefix: prefix ? `${prefix}/${fileName}` : fileName,
118
+ fileNameFilter,
119
+ }),
120
+ );
121
+ } else if (fileStat.isFile()) {
122
+ if (fileNameFilter && !fileNameFilter(fileName)) {
123
+ continue;
124
+ }
125
+
126
+ const baseName = path.parse(fileName).name;
127
+ if (prefix) {
128
+ fileNames.push(`${prefix}/${baseName}`);
129
+ } else {
130
+ fileNames.push(baseName);
131
+ }
132
+ }
133
+ }
134
+
135
+ fileNames.sort();
136
+ return fileNames;
137
+ }
@@ -1,19 +1,19 @@
1
- export async function fetchWithTimeout(url: string, reqInit: RequestInit, timeout?: number): Promise<Response> {
2
- if (!timeout) {
3
- return await fetch(url, reqInit);
4
- }
5
-
6
- let timer: any;
7
- const [res] = await Promise.all([
8
- fetch(url, reqInit).then((res) => {
9
- clearTimeout(timer);
10
- return res;
11
- }),
12
- new Promise((_, reject) => {
13
- timer = setTimeout(() => {
14
- reject(new Error(`Request to "${url}" was timeout.`));
15
- }, timeout);
16
- }),
17
- ]);
18
- return res;
19
- }
1
+ export async function fetchWithTimeout(url: string, reqInit: RequestInit, timeout?: number): Promise<Response> {
2
+ if (!timeout) {
3
+ return await fetch(url, reqInit);
4
+ }
5
+
6
+ let timer: any;
7
+ const [res] = await Promise.all([
8
+ fetch(url, reqInit).then((res) => {
9
+ clearTimeout(timer);
10
+ return res;
11
+ }),
12
+ new Promise((_, reject) => {
13
+ timer = setTimeout(() => {
14
+ reject(new Error(`Request to "${url}" was timeout.`));
15
+ }, timeout);
16
+ }),
17
+ ]);
18
+ return res;
19
+ }
@@ -1,26 +1,26 @@
1
- import { sign, verify, decode, Secret, JwtPayload } from "jsonwebtoken";
2
- import { encode as base64Encode } from "~/deno-std/encoding/base64";
3
- import crypto from "crypto";
4
-
5
- export function createJwt(payload: Record<string, any>, secret: Secret) {
6
- return sign(payload, secret, {
7
- algorithm: "HS512",
8
- });
9
- }
10
-
11
- export function verifyJwt(token: string, secret: Secret): JwtPayload {
12
- return verify(token, secret, {
13
- algorithms: ["HS512"],
14
- }) as JwtPayload;
15
- }
16
-
17
- export function decodeJwt(token: string) {
18
- return decode(token, { complete: true });
19
- }
20
-
21
- export async function generateJwtSecretKey() {
22
- const key = await crypto.subtle.generateKey({ name: "HMAC", hash: "SHA-512" }, true, ["sign", "verify"]);
23
-
24
- const exportedKey = await crypto.subtle.exportKey("raw", key);
25
- return base64Encode(exportedKey);
26
- }
1
+ import { sign, verify, decode, Secret, JwtPayload } from "jsonwebtoken";
2
+ import { encode as base64Encode } from "~/deno-std/encoding/base64";
3
+ import crypto from "crypto";
4
+
5
+ export function createJwt(payload: Record<string, any>, secret: Secret) {
6
+ return sign(payload, secret, {
7
+ algorithm: "HS512",
8
+ });
9
+ }
10
+
11
+ export function verifyJwt(token: string, secret: Secret): JwtPayload {
12
+ return verify(token, secret, {
13
+ algorithms: ["HS512"],
14
+ }) as JwtPayload;
15
+ }
16
+
17
+ export function decodeJwt(token: string) {
18
+ return decode(token, { complete: true });
19
+ }
20
+
21
+ export async function generateJwtSecretKey() {
22
+ const key = await crypto.subtle.generateKey({ name: "HMAC", hash: "SHA-512" }, true, ["sign", "verify"]);
23
+
24
+ const exportedKey = await crypto.subtle.exportKey("raw", key);
25
+ return base64Encode(exportedKey);
26
+ }
@@ -1,26 +1,26 @@
1
- import bcrypt from "bcryptjs";
2
-
3
- /**
4
- * Generates password hash.
5
- * @param password
6
- * @param salt
7
- * @returns
8
- */
9
- export async function generatePasswordHash(password: string, salt?: number | string): Promise<string> {
10
- if (!salt) {
11
- salt = 10;
12
- }
13
- const passwordHash = await bcrypt.hash(password, salt);
14
- return passwordHash;
15
- }
16
-
17
- /**
18
- * Validates the password against the hash.
19
- * @param password
20
- * @param passwordHash
21
- * @returns
22
- */
23
- export async function validatePassword(password: string, passwordHash: string): Promise<boolean> {
24
- const isMatch = await bcrypt.compare(password || "", passwordHash || "");
25
- return isMatch;
26
- }
1
+ import bcrypt from "bcryptjs";
2
+
3
+ /**
4
+ * Generates password hash.
5
+ * @param password
6
+ * @param salt
7
+ * @returns
8
+ */
9
+ export async function generatePasswordHash(password: string, salt?: number | string): Promise<string> {
10
+ if (!salt) {
11
+ salt = 10;
12
+ }
13
+ const passwordHash = await bcrypt.hash(password, salt);
14
+ return passwordHash;
15
+ }
16
+
17
+ /**
18
+ * Validates the password against the hash.
19
+ * @param password
20
+ * @param passwordHash
21
+ * @returns
22
+ */
23
+ export async function validatePassword(password: string, passwordHash: string): Promise<boolean> {
24
+ const isMatch = await bcrypt.compare(password || "", passwordHash || "");
25
+ return isMatch;
26
+ }
@@ -1,14 +1,14 @@
1
- import path from "path";
2
-
3
- export function getFileExtensionName(pathname: string) {
4
- return path.extname(pathname);
5
- }
6
-
7
- export function getFileName(pathname: string) {
8
- return path.basename(pathname);
9
- }
10
-
11
- export function getFileBaseName(pathname: string) {
12
- const extName = path.extname(pathname);
13
- return path.basename(pathname, extName);
14
- }
1
+ import path from "path";
2
+
3
+ export function getFileExtensionName(pathname: string) {
4
+ return path.extname(pathname);
5
+ }
6
+
7
+ export function getFileName(pathname: string) {
8
+ return path.basename(pathname);
9
+ }
10
+
11
+ export function getFileBaseName(pathname: string) {
12
+ const extName = path.extname(pathname);
13
+ return path.basename(pathname, extName);
14
+ }
@@ -1,17 +1,17 @@
1
- import dayjs from "dayjs";
2
-
3
- export function getNowString() {
4
- return dayjs().format("YYYY-MM-DD HH:mm:ss.SSS");
5
- }
6
-
7
- export function getNowStringWithTimezone() {
8
- return dayjs().format("YYYY-MM-DD HH:mm:ss.SSSZ");
9
- }
10
-
11
- export function getDateString(timeString) {
12
- return dayjs(timeString).format("YYYY-MM-DD");
13
- }
14
-
15
- export function formatDateTimeWithTimezone(source: any) {
16
- return dayjs(source).format("YYYY-MM-DD HH:mm:ss.SSSZ");
17
- }
1
+ import dayjs from "dayjs";
2
+
3
+ export function getNowString() {
4
+ return dayjs().format("YYYY-MM-DD HH:mm:ss.SSS");
5
+ }
6
+
7
+ export function getNowStringWithTimezone() {
8
+ return dayjs().format("YYYY-MM-DD HH:mm:ss.SSSZ");
9
+ }
10
+
11
+ export function getDateString(timeString) {
12
+ return dayjs(timeString).format("YYYY-MM-DD");
13
+ }
14
+
15
+ export function formatDateTimeWithTimezone(source: any) {
16
+ return dayjs(source).format("YYYY-MM-DD HH:mm:ss.SSSZ");
17
+ }
@@ -1,15 +1,15 @@
1
- export function isUndefined(val: any) {
2
- return typeof val === "undefined";
3
- }
4
-
5
- export function isNull(val: any) {
6
- return val === null;
7
- }
8
-
9
- export function isNullOrUndefined(val: any) {
10
- return isNull(val) || isUndefined(val);
11
- }
12
-
13
- export function isNullOrUndefinedOrEmpty(val: any) {
14
- return isNull(val) || isUndefined(val) || val === "";
15
- }
1
+ export function isUndefined(val: any) {
2
+ return typeof val === "undefined";
3
+ }
4
+
5
+ export function isNull(val: any) {
6
+ return val === null;
7
+ }
8
+
9
+ export function isNullOrUndefined(val: any) {
10
+ return isNull(val) || isUndefined(val);
11
+ }
12
+
13
+ export function isNullOrUndefinedOrEmpty(val: any) {
14
+ return isNull(val) || isUndefined(val) || val === "";
15
+ }