@crowdin/app-project-module 0.95.3 → 0.96.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.
@@ -31,6 +31,7 @@ export declare const crowdinFiles: {
31
31
  exportOptions?: SourceFilesModel.ExportOptions | undefined;
32
32
  excludedTargetLanguages?: string[] | undefined;
33
33
  attachLabelIds?: number[] | undefined;
34
+ fields?: Record<string, any> | undefined;
34
35
  };
35
36
  };
36
37
  };
@@ -74,6 +74,17 @@ function handle(config, integration) {
74
74
  job,
75
75
  excludedTargetLanguages: req.query.languages ? excludedTargetLanguages : undefined,
76
76
  });
77
+ const currentJob = yield job.get();
78
+ if (currentJob && (currentJob === null || currentJob === void 0 ? void 0 : currentJob.errors)) {
79
+ const errors = JSON.parse(currentJob.errors);
80
+ yield (0, logger_1.handleUserError)({
81
+ action: 'Sync files to Crowdin',
82
+ error: errors,
83
+ crowdinId: req.crowdinContext.crowdinId,
84
+ clientId: req.crowdinContext.clientId,
85
+ });
86
+ throw errors.toString();
87
+ }
77
88
  try {
78
89
  yield (0, files_1.updateSyncedData)(req.crowdinContext.clientId, req.crowdinContext.crowdinId, payload, types_2.Provider.INTEGRATION);
79
90
  }
@@ -46,11 +46,26 @@ function expandFilesTree(nodes, req, integration, job) {
46
46
  const files = nodes.filter((file) => file.nodeType === undefined || file.nodeType === '1');
47
47
  const folders = nodes.filter((folder) => folder.nodeType === '0' && !nodes.find((node) => node.parentId === folder.id));
48
48
  for (const { id } of folders) {
49
- const integrationData = yield integration.getIntegrationFiles(req.integrationCredentials, req.integrationSettings, id);
49
+ let integrationData = [];
50
+ try {
51
+ integrationData = yield integration.getIntegrationFiles(req.integrationCredentials, req.integrationSettings, id);
52
+ }
53
+ catch (e) {
54
+ if (job) {
55
+ const currentJob = yield job.get();
56
+ const errorMessage = e instanceof Error ? e.message : String(e);
57
+ const currentErrors = (currentJob === null || currentJob === void 0 ? void 0 : currentJob.errors) ? JSON.parse(currentJob.errors) : [];
58
+ const newErrors = [...currentErrors, errorMessage];
59
+ yield job.update({ errors: newErrors });
60
+ }
61
+ continue;
62
+ }
50
63
  const integrationTreeItems = isExtendedResultType(integrationData)
51
64
  ? integrationData.data
52
65
  : integrationData;
53
- const checkNodes = integrationTreeItems.map((item) => (Object.assign(Object.assign({}, item), { nodeType: item.nodeType || ('type' in item ? '1' : '0') })));
66
+ const checkNodes = integrationTreeItems
67
+ .filter((item) => item.id !== id)
68
+ .map((item) => (Object.assign(Object.assign({}, item), { nodeType: item.nodeType || ('type' in item ? '1' : '0') })));
54
69
  const expandedResult = yield expandFilesTree(checkNodes, req, integration, job);
55
70
  files.push(...expandedResult);
56
71
  }
@@ -85,7 +85,7 @@ function runAsJob({ integrationId, crowdinId, type, title, payload, res, project
85
85
  return yield storage.getJob({ id: jobId });
86
86
  });
87
87
  },
88
- update: function updateProgress({ progress, status, info, data, attempt }) {
88
+ update: function updateProgress({ progress, status, info, data, attempt, errors, }) {
89
89
  return __awaiter(this, void 0, void 0, function* () {
90
90
  const prevData = yield this.get();
91
91
  if ((prevData === null || prevData === void 0 ? void 0 : prevData.status) === types_1.JobStatus.CANCELED) {
@@ -98,6 +98,7 @@ function runAsJob({ integrationId, crowdinId, type, title, payload, res, project
98
98
  info,
99
99
  data: JSON.stringify(data),
100
100
  attempt,
101
+ errors,
101
102
  });
102
103
  return { isCanceled: false };
103
104
  });
@@ -40,6 +40,7 @@ export interface Job {
40
40
  eta?: number;
41
41
  info?: string;
42
42
  attempt?: number;
43
+ errors?: string;
43
44
  }
44
45
  export type GetJobParams = Pick<Job, 'id'>;
45
46
  export type GetActiveJobsParams = Pick<Job, 'integrationId' | 'crowdinId'>;
@@ -51,6 +52,7 @@ export type UpdateJobParams = {
51
52
  info?: string;
52
53
  data?: string;
53
54
  attempt?: number;
55
+ errors?: string[];
54
56
  };
55
57
  export type JobClient = {
56
58
  get: () => Promise<Job | undefined>;
@@ -61,7 +63,7 @@ export type JobClient = {
61
63
  markFilesAsUnsynced: MarkUnsyncedFiles;
62
64
  unmarkFilesAsUnsynced: UnmarkUnsyncedFiles;
63
65
  };
64
- export type UpdateJobProgress = ({ progress, status, info, data, attempt, }: Omit<UpdateJobParams, 'id'>) => Promise<{
66
+ export type UpdateJobProgress = ({ progress, status, info, data, attempt, errors, }: Omit<UpdateJobParams, 'id'>) => Promise<{
65
67
  isCanceled: boolean;
66
68
  }>;
67
69
  export interface GetAllNewFilesArgs {