@crowdin/app-project-module 0.68.1 → 0.70.0

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 (46) hide show
  1. package/out/index.js +21 -3
  2. package/out/modules/ai-provider/handlers/chat-completions.js +20 -21
  3. package/out/modules/ai-provider/handlers/get-model-list.js +3 -2
  4. package/out/modules/ai-provider/types.d.ts +112 -7
  5. package/out/modules/ai-provider/util/index.d.ts +5 -0
  6. package/out/modules/ai-provider/util/index.js +72 -1
  7. package/out/modules/api/api.js +4 -4
  8. package/out/modules/file-processing/handlers/pre-post-process.js +6 -0
  9. package/out/modules/file-processing/types.d.ts +16 -8
  10. package/out/modules/integration/util/cron.js +8 -5
  11. package/out/modules/integration/util/webhooks.js +5 -4
  12. package/out/modules/manifest.js +46 -0
  13. package/out/modules/organization-settings-menu/index.d.ts +6 -0
  14. package/out/modules/organization-settings-menu/index.js +18 -0
  15. package/out/modules/profile-settings-menu/index.d.ts +6 -0
  16. package/out/modules/profile-settings-menu/index.js +18 -0
  17. package/out/modules/webhooks/handlers/webhook-handler.d.ts +5 -0
  18. package/out/modules/webhooks/handlers/webhook-handler.js +78 -0
  19. package/out/modules/webhooks/index.d.ts +6 -0
  20. package/out/modules/webhooks/index.js +18 -0
  21. package/out/modules/webhooks/types.d.ts +294 -0
  22. package/out/modules/webhooks/types.js +2 -0
  23. package/out/modules/workflow-step-type/handlers/delete-step.d.ts +5 -0
  24. package/out/modules/workflow-step-type/handlers/delete-step.js +70 -0
  25. package/out/modules/workflow-step-type/handlers/step-settings-save.d.ts +5 -0
  26. package/out/modules/workflow-step-type/handlers/step-settings-save.js +80 -0
  27. package/out/modules/workflow-step-type/index.d.ts +6 -0
  28. package/out/modules/workflow-step-type/index.js +36 -0
  29. package/out/modules/workflow-step-type/types.d.ts +57 -0
  30. package/out/modules/workflow-step-type/types.js +2 -0
  31. package/out/modules/workflow-step-type/util/index.d.ts +3 -0
  32. package/out/modules/workflow-step-type/util/index.js +16 -0
  33. package/out/static/js/form.js +32 -32
  34. package/out/static/js/main.js +2 -2
  35. package/out/storage/index.d.ts +1 -0
  36. package/out/storage/mysql.d.ts +1 -0
  37. package/out/storage/mysql.js +9 -0
  38. package/out/storage/postgre.d.ts +1 -0
  39. package/out/storage/postgre.js +9 -0
  40. package/out/storage/sqlite.d.ts +1 -0
  41. package/out/storage/sqlite.js +3 -0
  42. package/out/types.d.ts +19 -1
  43. package/out/util/logger.d.ts +5 -2
  44. package/out/util/logger.js +26 -10
  45. package/out/views/main.handlebars +48 -24
  46. package/package.json +16 -8
@@ -50,7 +50,7 @@ function catchRejection(e, message) {
50
50
  //payment required
51
51
  if (e.code && e.code === 402 && subscriptionModal) {
52
52
  subscriptionLink = e.message || message;
53
- subscriptionModal.open();
53
+ openModal(subscriptionModal);
54
54
  return;
55
55
  }
56
56
  showToast(e.message || message);
@@ -68,7 +68,7 @@ function checkResponse(response) {
68
68
  reject(res);
69
69
  } else {
70
70
  if (res.message) {
71
- showToast(res.message);
71
+ setTimeout(() => showToast(res.message), 100);
72
72
  }
73
73
  resolve(res);
74
74
  }
@@ -18,6 +18,7 @@ export interface Storage {
18
18
  saveMetadata(id: string, metadata: any, crowdinId?: string): Promise<void>;
19
19
  updateMetadata(id: string, metadata: any, crowdinId?: string): Promise<void>;
20
20
  getMetadata(id: string): Promise<any | undefined>;
21
+ getAllMetadata(): Promise<any[] | undefined>;
21
22
  deleteMetadata(id: string): Promise<void>;
22
23
  getSyncSettingsByProvider(integrationId: string, provider: Provider): Promise<IntegrationSyncSettings | undefined>;
23
24
  getAllSyncSettingsByType(type: string): Promise<IntegrationSyncSettings[]>;
@@ -35,6 +35,7 @@ export declare class MySQLStorage implements Storage {
35
35
  saveMetadata(id: string, metadata: any, crowdinId: string): Promise<void>;
36
36
  updateMetadata(id: string, metadata: any, crowdinId?: string): Promise<void>;
37
37
  getMetadata(id: string): Promise<any>;
38
+ getAllMetadata(): Promise<any[]>;
38
39
  deleteMetadata(id: string): Promise<void>;
39
40
  getSyncSettingsByProvider(integrationId: string, provider: string): Promise<IntegrationSyncSettings | undefined>;
40
41
  getAllSyncSettingsByType(type: string): Promise<IntegrationSyncSettings[]>;
@@ -340,6 +340,15 @@ class MySQLStorage {
340
340
  }));
341
341
  });
342
342
  }
343
+ getAllMetadata() {
344
+ return __awaiter(this, void 0, void 0, function* () {
345
+ yield this.dbPromise;
346
+ return this.executeQuery((connection) => __awaiter(this, void 0, void 0, function* () {
347
+ const [rows] = yield connection.execute('SELECT * FROM app_metadata');
348
+ return rows || [];
349
+ }));
350
+ });
351
+ }
343
352
  deleteMetadata(id) {
344
353
  return __awaiter(this, void 0, void 0, function* () {
345
354
  yield this.dbPromise;
@@ -42,6 +42,7 @@ export declare class PostgreStorage implements Storage {
42
42
  saveMetadata(id: string, metadata: any, crowdinId: string): Promise<void>;
43
43
  updateMetadata(id: string, metadata: any, crowdinId?: string): Promise<void>;
44
44
  getMetadata(id: string): Promise<any>;
45
+ getAllMetadata(): Promise<any[]>;
45
46
  deleteMetadata(id: string): Promise<void>;
46
47
  getSyncSettingsByProvider(integrationId: string, provider: string): Promise<IntegrationSyncSettings | undefined>;
47
48
  getAllSyncSettingsByType(type: string): Promise<IntegrationSyncSettings[]>;
@@ -367,6 +367,15 @@ class PostgreStorage {
367
367
  }));
368
368
  });
369
369
  }
370
+ getAllMetadata() {
371
+ return __awaiter(this, void 0, void 0, function* () {
372
+ yield this.dbPromise;
373
+ return this.executeQuery((client) => __awaiter(this, void 0, void 0, function* () {
374
+ const res = yield client.query('SELECT * FROM app_metadata');
375
+ return (res === null || res === void 0 ? void 0 : res.rows) || [];
376
+ }));
377
+ });
378
+ }
370
379
  deleteMetadata(id) {
371
380
  return __awaiter(this, void 0, void 0, function* () {
372
381
  yield this.dbPromise;
@@ -37,6 +37,7 @@ export declare class SQLiteStorage implements Storage {
37
37
  saveMetadata(id: string, metadata: any, crowdinId?: string): Promise<void>;
38
38
  updateMetadata(id: string, metadata: any, crowdinId?: string): Promise<void>;
39
39
  getMetadata(id: string): Promise<any>;
40
+ getAllMetadata(): Promise<any[]>;
40
41
  deleteMetadata(id: string): Promise<void>;
41
42
  getSyncSettingsByProvider(integrationId: string, provider: string): Promise<IntegrationSyncSettings | undefined>;
42
43
  getAllSyncSettingsByType(type: string): Promise<IntegrationSyncSettings[]>;
@@ -405,6 +405,9 @@ class SQLiteStorage {
405
405
  }
406
406
  });
407
407
  }
408
+ getAllMetadata() {
409
+ return this.each('SELECT * FROM app_metadata', []);
410
+ }
408
411
  deleteMetadata(id) {
409
412
  return __awaiter(this, void 0, void 0, function* () {
410
413
  yield this.run('DELETE FROM app_metadata where id = ?', [id]);
package/out/types.d.ts CHANGED
@@ -15,6 +15,8 @@ import { AiProviderModule } from './modules/ai-provider/types';
15
15
  import { AiPromptProviderModule } from './modules/ai-prompt-provider/types';
16
16
  import { AiTool, AiToolWidget } from './modules/ai-tools/types';
17
17
  import { ExternalQaCheckModule } from './modules/external-qa-check/types';
18
+ import { Webhook } from './modules/webhooks/types';
19
+ import { WorkflowStepTypeModule } from './modules/workflow-step-type/types';
18
20
  export interface ClientConfig extends ImagePath {
19
21
  /**
20
22
  * Authentication Crowdin App type: "authorization_code", "crowdin_app", "crowdin_agent". Default: "crowdin_app"
@@ -104,10 +106,18 @@ export interface ClientConfig extends ImagePath {
104
106
  * resources module
105
107
  */
106
108
  profileResourcesMenu?: UiModule & ImagePath & Environments;
109
+ /**
110
+ * profile-settings-menu module
111
+ */
112
+ profileSettingsMenu?: UiModule & ImagePath & Environments;
107
113
  /**
108
114
  * organization-menu module
109
115
  */
110
116
  organizationMenu?: UiModule & ImagePath;
117
+ /**
118
+ * organization-settings-menu module
119
+ */
120
+ organizationSettingsMenu?: UiModule & ImagePath;
111
121
  /**
112
122
  * editor-right-panel module
113
123
  */
@@ -206,6 +216,14 @@ export interface ClientConfig extends ImagePath {
206
216
  * qa check module
207
217
  */
208
218
  externalQaCheck?: ExternalQaCheckModule & ImagePath;
219
+ /**
220
+ * webhook modules
221
+ */
222
+ webhooks?: Webhook | Webhook[];
223
+ /**
224
+ * workflow step modules
225
+ */
226
+ workflowStepType?: WorkflowStepTypeModule | WorkflowStepTypeModule[];
209
227
  }
210
228
  export interface Environments {
211
229
  environments?: Environment | Environment[];
@@ -326,7 +344,7 @@ export interface CrowdinAppUtilities extends CrowdinMetadataStore {
326
344
  crowdinId: string;
327
345
  extra: Record<string, any>;
328
346
  }) => string;
329
- dencryptCrowdinConnection: (hash: string) => Promise<{
347
+ dencryptCrowdinConnection: (hash: string, autoRenew?: boolean) => Promise<{
330
348
  client: Crowdin;
331
349
  extra: Record<string, any>;
332
350
  }>;
@@ -26,9 +26,12 @@ export declare class AppModuleError extends Error {
26
26
  isAxiosError: boolean;
27
27
  constructor(error: CustomAxiosError | Error | string, data?: any);
28
28
  }
29
+ export declare class AppUserModuleError extends AppModuleError {
30
+ constructor(error: CustomAxiosError | Error | string, data?: any);
31
+ }
29
32
  export declare class AppModuleAggregateError extends Error {
30
- errors: Error[] | AppModuleError[];
31
- constructor(errors: Error[] | AppModuleError[], message: string);
33
+ errors: Error[] | AppModuleError[] | AppUserModuleError[];
34
+ constructor(errors: Error[] | AppModuleError[] | AppUserModuleError[], message: string);
32
35
  }
33
36
  export declare function handleUserError({ action, error, crowdinId, clientId, }: {
34
37
  action: string;
@@ -32,7 +32,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
32
32
  });
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.temporaryErrorDebug = exports.handleUserError = exports.AppModuleAggregateError = exports.AppModuleError = exports.getErrorMessage = exports.isAxiosError = exports.logError = exports.log = exports.withContextError = exports.withContext = exports.prepareContext = exports.initialize = void 0;
35
+ exports.temporaryErrorDebug = exports.handleUserError = exports.AppModuleAggregateError = exports.AppUserModuleError = exports.AppModuleError = exports.getErrorMessage = exports.isAxiosError = exports.logError = exports.log = exports.withContextError = exports.withContext = exports.prepareContext = exports.initialize = void 0;
36
36
  const logsFormatter = __importStar(require("@crowdin/logs-formatter"));
37
37
  const storage_1 = require("../storage");
38
38
  let logConfig;
@@ -138,6 +138,9 @@ function logError(e, context) {
138
138
  exports.logError = logError;
139
139
  function errorOutputByType(error) {
140
140
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
141
+ if (error instanceof AppUserModuleError) {
142
+ return;
143
+ }
141
144
  const message = error.message || error;
142
145
  if (isAxiosError(error)) {
143
146
  const request = (error === null || error === void 0 ? void 0 : error.config) || ((_a = error.data) === null || _a === void 0 ? void 0 : _a.config)
@@ -193,6 +196,13 @@ class AppModuleError extends Error {
193
196
  }
194
197
  }
195
198
  exports.AppModuleError = AppModuleError;
199
+ class AppUserModuleError extends AppModuleError {
200
+ constructor(error, data) {
201
+ super(error, data);
202
+ this.name = 'AppUserModuleError';
203
+ }
204
+ }
205
+ exports.AppUserModuleError = AppUserModuleError;
196
206
  class AppModuleAggregateError extends Error {
197
207
  constructor(errors, message) {
198
208
  super(message);
@@ -218,7 +228,7 @@ function storeUserError({ action, error, crowdinId, clientId, }) {
218
228
  statusText: ((_u = error === null || error === void 0 ? void 0 : error.response) === null || _u === void 0 ? void 0 : _u.statusText) || ((_w = (_v = error === null || error === void 0 ? void 0 : error.data) === null || _v === void 0 ? void 0 : _v.response) === null || _w === void 0 ? void 0 : _w.statusText),
219
229
  };
220
230
  }
221
- if (error instanceof AppModuleError && error.appData) {
231
+ if ((error instanceof AppModuleError || error instanceof AppUserModuleError) && error.appData) {
222
232
  data.appData = error.appData;
223
233
  }
224
234
  yield (0, storage_1.getStorage)().saveUserError(action, (error === null || error === void 0 ? void 0 : error.message) || JSON.stringify(error, null, 2), JSON.stringify(data), `${Date.now()}`, crowdinId, clientId);
@@ -226,28 +236,34 @@ function storeUserError({ action, error, crowdinId, clientId, }) {
226
236
  }
227
237
  function mergeAppModuleAggregateErrors(errors) {
228
238
  const result = [];
229
- const mergedData = {};
239
+ const mergedData = {
240
+ AppModuleError: {},
241
+ AppUserModuleError: {},
242
+ };
230
243
  for (const errorItem of errors) {
231
- if (errorItem instanceof AppModuleError) {
244
+ if (errorItem instanceof AppModuleError || errorItem instanceof AppUserModuleError) {
232
245
  if (typeof errorItem.appData === 'object' &&
233
246
  errorItem.appData !== null &&
234
247
  !Array.isArray(errorItem.appData)) {
235
- if (!mergedData[errorItem.message]) {
236
- mergedData[errorItem.message] = {};
248
+ if (!mergedData[errorItem.name][errorItem.message]) {
249
+ mergedData[errorItem.name][errorItem.message] = {};
237
250
  }
238
251
  for (const key in errorItem.appData) {
239
- mergedData[errorItem.message][key] = (mergedData[errorItem.message][key] || []).concat(errorItem.appData[key]);
252
+ mergedData[errorItem.name][errorItem.message][key] = (mergedData[errorItem.name][errorItem.message][key] || []).concat(errorItem.appData[key]);
240
253
  }
241
254
  }
242
255
  else if (errorItem.appData) {
243
- mergedData[errorItem.message] = (mergedData[errorItem.message] || []).concat(errorItem.appData);
256
+ mergedData[errorItem.name][errorItem.message] = (mergedData[errorItem.name][errorItem.message] || []).concat(errorItem.appData);
244
257
  }
245
258
  continue;
246
259
  }
247
260
  result.push(errorItem);
248
261
  }
249
- for (const key in mergedData) {
250
- result.push(new AppModuleError(key, mergedData[key]));
262
+ for (const key in mergedData.AppModuleError) {
263
+ result.push(new AppModuleError(key, mergedData.AppModuleError[key]));
264
+ }
265
+ for (const key in mergedData.AppUserModuleError) {
266
+ result.push(new AppUserModuleError(key, mergedData.AppUserModuleError[key]));
251
267
  }
252
268
  return result;
253
269
  }
@@ -37,10 +37,10 @@
37
37
  <crowdin-button id="show-integration-btn" class="hidden" icon-before="arrow_back" onclick="showIntegration();">Integration</crowdin-button>
38
38
  <crowdin-button id="show-error-logs-btn" icon-before="list" onclick="showErrorLogs();">Error logs</crowdin-button>
39
39
  {{#if infoModal}}
40
- <crowdin-button icon-before="info" onclick="infoModal.open();">{{infoModal.title}}</crowdin-button>
40
+ <crowdin-button icon-before="info" onclick="openModal(infoModal);">{{infoModal.title}}</crowdin-button>
41
41
  {{/if}}
42
42
  {{#if configurationFields}}
43
- <crowdin-button icon-before="settings" onclick="settingsModal.open();fillSettingsForm();">Settings</crowdin-button>
43
+ <crowdin-button icon-before="settings" onclick="openModal(settingsModal);fillSettingsForm();">Settings</crowdin-button>
44
44
  {{/if}}
45
45
  <crowdin-button icon-before="account_circle" onclick="integrationLogout()">Log out</crowdin-button>
46
46
  </div>
@@ -93,7 +93,12 @@
93
93
  <crowdin-async-progress
94
94
  cancelAsyncAction=""
95
95
  ></crowdin-async-progress>
96
- <crowdin-modal id="subscription-modal" modal-width="50" close-button="false">
96
+ <crowdin-modal
97
+ style="display: none;"
98
+ id="subscription-modal"
99
+ modal-width="50"
100
+ close-button="false"
101
+ >
97
102
  <div>
98
103
  <crowdin-alert type="warning">Subscribe to continue using the {{name}} app.</crowdin-alert>
99
104
  </div>
@@ -104,7 +109,13 @@
104
109
  </div>
105
110
  </crowdin-modal>
106
111
  {{#if infoModal}}
107
- <crowdin-modal id="info-modal" modal-width="50" modal-title="{{infoModal.title}}" close-button-title="Close">
112
+ <crowdin-modal
113
+ style="display: none;"
114
+ id="info-modal"
115
+ modal-width="50"
116
+ modal-title="{{infoModal.title}}"
117
+ close-button-title="Close"
118
+ >
108
119
  <div>
109
120
  {{{infoModal.content}}}
110
121
  </div>
@@ -112,11 +123,12 @@
112
123
  {{/if}}
113
124
  {{#if configurationFields}}
114
125
  <crowdin-modal
115
- id="settings-modal"
116
- body-overflow-unset="{{#checkLength configurationFields 3}}false{{else}}true{{/checkLength}}"
117
- modal-width="65"
118
- modal-title="Settings"
119
- close-button-title="Close"
126
+ style="display: none;"
127
+ id="settings-modal"
128
+ body-overflow-unset="{{#checkLength configurationFields 3}}false{{else}}true{{/checkLength}}"
129
+ modal-width="65"
130
+ modal-title="Settings"
131
+ close-button-title="Close"
120
132
  >
121
133
  <div class="loader hidden">
122
134
  <crowdin-progress-indicator></crowdin-progress-indicator>
@@ -268,12 +280,13 @@
268
280
  {{/if}}
269
281
  {{#or syncNewElements.crowdin syncNewElements.integration}}
270
282
  <crowdin-modal
271
- id="confirm-schedule-modal"
272
- modal-width="50"
273
- modal-title="Synchronization options"
274
- close-button-title="Close"
275
- close-button="true"
276
- body-overflow-unset
283
+ style="display: none;"
284
+ id="confirm-schedule-modal"
285
+ modal-width="50"
286
+ modal-title="Synchronization options"
287
+ close-button-title="Close"
288
+ close-button="true"
289
+ body-overflow-unset
277
290
  >
278
291
  <crowdin-checkbox
279
292
  id="selected-files"
@@ -298,9 +311,10 @@
298
311
  {{/or}}
299
312
 
300
313
  <crowdin-modal
301
- id="user-error-detail"
302
- close-button-title="Close"
303
- close-button="true"
314
+ style="display: none;"
315
+ id="user-error-detail"
316
+ close-button-title="Close"
317
+ close-button="true"
304
318
  >
305
319
  </crowdin-modal>
306
320
  </body>
@@ -801,7 +815,7 @@
801
815
  .finally(() => {
802
816
  unsetLoader();
803
817
  settingsSaveBtn.removeAttribute('disabled');
804
- settingsModal.close();
818
+ closeModal(settingsModal);
805
819
  {{#if reloadOnConfigSave}}
806
820
  getIntegrationData(true);
807
821
  getCrowdinData();
@@ -834,10 +848,10 @@
834
848
  if (event.keyCode == 27) {
835
849
 
836
850
  if (infoModal) {
837
- infoModal.close();
851
+ closeModal(infoModal);
838
852
  }
839
853
  if (settingsModal) {
840
- settingsModal.close();
854
+ closeModal(settingsModal);
841
855
  }
842
856
  }
843
857
  });
@@ -896,7 +910,7 @@
896
910
  {{/if}}
897
911
  }
898
912
 
899
- scheduleModal.close();
913
+ closeModal(scheduleModal);
900
914
  }
901
915
 
902
916
  async function openScheduleModal(type) {
@@ -945,7 +959,7 @@
945
959
  selectedFiles.value = true;
946
960
  scheduleModal.querySelector('#save-schedule-sync').setAttribute('disabled', false);
947
961
  scheduleModal.setAttribute('data-type', type);
948
- scheduleModal.open();
962
+ openModal(scheduleModal);
949
963
  }
950
964
 
951
965
  function onChangeAutoSynchronizationOptions() {
@@ -1128,7 +1142,7 @@
1128
1142
 
1129
1143
  const clickRow = (field, index, item) => {
1130
1144
  const modal = document.getElementById('user-error-detail');
1131
- modal.open();
1145
+ openModal(modal);
1132
1146
  modal.innerHTML = getUserErrorDetail(item);
1133
1147
  };
1134
1148
 
@@ -1225,6 +1239,16 @@
1225
1239
  tempDiv.textContent = str;
1226
1240
  return tempDiv.innerHTML;
1227
1241
  }
1242
+
1243
+ function openModal(modal) {
1244
+ modal.style.display = 'block';
1245
+ modal.open()
1246
+ }
1247
+
1248
+ function closeModal(modal) {
1249
+ modal.style.display = 'none';
1250
+ modal.close()
1251
+ }
1228
1252
  </script>
1229
1253
 
1230
1254
  </html>
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@crowdin/app-project-module",
3
- "version": "0.68.1",
3
+ "version": "0.70.0",
4
4
  "description": "Module that generates for you all common endpoints for serving standalone Crowdin App",
5
5
  "main": "out/index.js",
6
6
  "types": "out/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc -p ./ && cp -R views out && cp -R static out && cp logo.png out && rollup -c rollup.config.mjs",
9
9
  "build-main": "tsc -p ./ && cp -R views out && cp -R static out && cp logo.png out",
10
+ "build-form": "tsc -p ./ && cp -R static/js/form out/static/js && rollup -c rollup.config.mjs",
10
11
  "watch-main": "tsc --watch -p ./ && cp -R views out && cp -R static out && cp logo.png out",
11
12
  "lint": "eslint --fix \"{src,tests}/**/*.{js,ts}\"",
12
13
  "prettier": "prettier --config .prettierrc src/**/*.ts --write",
@@ -19,17 +20,20 @@
19
20
  ],
20
21
  "dependencies": {
21
22
  "@aws-sdk/client-s3": "^3.606.0",
22
- "@aws-sdk/s3-request-presigner": "^3.598.0",
23
+ "@aws-sdk/s3-request-presigner": "^3.682.0",
23
24
  "@crowdin/crowdin-apps-functions": "0.9.0",
24
25
  "@crowdin/logs-formatter": "^2.1.6",
25
26
  "@godaddy/terminus": "^4.12.1",
27
+ "@monaco-editor/react": "^4.6.0",
26
28
  "amqplib": "^0.10.4",
27
29
  "crypto-js": "^4.2.0",
28
30
  "express": "^4.21.0",
29
31
  "express-handlebars": "^5.3.5",
30
32
  "lodash.get": "^4.4.2",
33
+ "lodash.isstring": "^4.0.1",
34
+ "lodash.snakecase": "^4.1.1",
31
35
  "lodash.uniqby": "^4.7.0",
32
- "mysql2": "^3.10.2",
36
+ "mysql2": "^3.11.3",
33
37
  "node-cron": "^3.0.3",
34
38
  "pg": "^8.13.0",
35
39
  "redoc-express": "^2.1.0",
@@ -39,17 +43,18 @@
39
43
  },
40
44
  "devDependencies": {
41
45
  "@babel/preset-react": "^7.24.7",
42
- "@emotion/react": "^11.13.0",
46
+ "@emotion/react": "^11.13.3",
43
47
  "@emotion/styled": "^11.11.5",
44
48
  "@mui/icons-material": "^5.16.7",
45
49
  "@mui/material": "^5.16.7",
46
- "@rjsf/core": "^5.21.1",
47
- "@rjsf/mui": "^5.21.1",
50
+ "@rjsf/core": "^5.22.3",
51
+ "@rjsf/mui": "^5.22.3",
48
52
  "@rjsf/utils": "^5.21.1",
49
- "@rjsf/validator-ajv8": "^5.21.1",
53
+ "@rjsf/validator-ajv8": "^5.22.3",
50
54
  "@rollup/plugin-babel": "^6.0.4",
51
55
  "@rollup/plugin-commonjs": "^24.1.0",
52
56
  "@rollup/plugin-json": "^6.1.0",
57
+ "@rollup/plugin-multi-entry": "^6.0.1",
53
58
  "@rollup/plugin-node-resolve": "^15.3.0",
54
59
  "@rollup/plugin-replace": "^5.0.7",
55
60
  "@rollup/plugin-terser": "^0.4.3",
@@ -59,6 +64,8 @@
59
64
  "@types/express-handlebars": "^5.3.1",
60
65
  "@types/jest": "^29.5.12",
61
66
  "@types/lodash.get": "^4.4.9",
67
+ "@types/lodash.isstring": "^4.0.9",
68
+ "@types/lodash.snakecase": "^4.1.9",
62
69
  "@types/lodash.uniqby": "^4.7.9",
63
70
  "@types/node": "^16.18.112",
64
71
  "@types/node-cron": "^3.0.11",
@@ -77,7 +84,8 @@
77
84
  "react": "^18.3.1",
78
85
  "react-dom": "^18.3.1",
79
86
  "rollup": "^3.29.4",
80
- "ts-jest": "^29.2.4",
87
+ "rollup-plugin-delete": "^2.1.0",
88
+ "ts-jest": "^29.2.5",
81
89
  "typescript": "^4.9.5"
82
90
  },
83
91
  "repository": {