UNPKG

@crowdin/app-project-module

Version:

Module that generates for you all common endpoints for serving standalone Crowdin App

124 lines (123 loc) 6.27 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.filterLanguages = exports.getExcludedTargetLanguages = exports.markUnsyncedFiles = exports.isExtendedResultType = exports.expandFilesTree = exports.skipFilesByRegex = void 0; const types_1 = require("./types"); const storage_1 = require("../../../storage"); const util_1 = require("../../../util"); function skipFilesByRegex(files, skipIntegrationNodes) { if (!Array.isArray(files)) { return []; } if (skipIntegrationNodes) { files = files.filter((file) => file); if (skipIntegrationNodes.fileNamePattern) { const regex = new RegExp(skipIntegrationNodes.fileNamePattern); files = files.filter((file) => !('type' in file) || !regex.test(file.name)); } if (skipIntegrationNodes.folderNamePattern) { const regex = new RegExp(skipIntegrationNodes.folderNamePattern); files = files.filter((file) => 'type' in file || !regex.test(file.name)); } } return files; } exports.skipFilesByRegex = skipFilesByRegex; function expandFilesTree(nodes, req, integration, job) { var _a; return __awaiter(this, void 0, void 0, function* () { if (job && types_1.JobStatus.CANCELED === ((_a = (yield job.get())) === null || _a === void 0 ? void 0 : _a.status)) { throw new Error('Job canceled'); } const files = nodes.filter((file) => file.nodeType === undefined || file.nodeType === '1'); const folders = nodes.filter((folder) => folder.nodeType === '0' && !nodes.find((node) => node.parentId === folder.id)); for (const { id } of folders) { const integrationData = yield integration.getIntegrationFiles(req.integrationCredentials, req.integrationSettings, id); const integrationTreeItems = isExtendedResultType(integrationData) ? integrationData.data : integrationData; const checkNodes = integrationTreeItems.map((item) => (Object.assign(Object.assign({}, item), { nodeType: item.nodeType || ('type' in item ? '1' : '0') }))); const expandedResult = yield expandFilesTree(checkNodes, req, integration, job); files.push(...expandedResult); } return files; }); } exports.expandFilesTree = expandFilesTree; function isExtendedResultType(data) { const dataTyped = data; return !!dataTyped && !Array.isArray(dataTyped); } exports.isExtendedResultType = isExtendedResultType; function isFileLeaf(file) { return file.nodeType === '1' || !!file.type; } function markUnsyncedFiles({ integrationId, crowdinId, client, files, }) { return __awaiter(this, void 0, void 0, function* () { if (!Array.isArray(files)) { return []; } const unsyncedFilesData = yield (0, storage_1.getStorage)().getUnsyncedFiles({ integrationId, crowdinId }); let unsyncedFiles = (unsyncedFilesData === null || unsyncedFilesData === void 0 ? void 0 : unsyncedFilesData.files) ? JSON.parse(unsyncedFilesData === null || unsyncedFilesData === void 0 ? void 0 : unsyncedFilesData.files) : []; const fileIds = files.filter((file) => isFileLeaf(file)).map((file) => `${file.id}`); const idsToRemove = unsyncedFiles.filter((file) => !fileIds.includes(file.id)).map((file) => file.id); unsyncedFiles = unsyncedFiles.filter((file) => !idsToRemove.includes(file.id)); const userTimezone = (yield client.usersApi.getAuthenticatedUser()).data.timezone; yield (0, storage_1.getStorage)().updateUnsyncedFiles({ integrationId, crowdinId, files: JSON.stringify(unsyncedFiles), }); files = files.map((file) => { const unsynced = unsyncedFiles.find((unsyncedFile) => unsyncedFile.id === file.id); if (unsynced && isFileLeaf(file)) { const formattedDate = (0, util_1.getFormattedDate)({ date: new Date(+unsynced.updatedAt), userTimezone }); file.labels = [ { text: `Sync failed ${formattedDate}`, type: 'warning', tooltip: unsynced === null || unsynced === void 0 ? void 0 : unsynced.message, }, ...(file.labels ? file.labels : []), ]; file.failed = true; } return file; }); return files; }); } exports.markUnsyncedFiles = markUnsyncedFiles; function getExcludedTargetLanguages({ client, projectId, languages, }) { return __awaiter(this, void 0, void 0, function* () { const projectData = yield client.projectsGroupsApi.getProject(projectId); const targetLanguages = projectData.data.targetLanguageIds; return targetLanguages.filter((language) => !languages.includes(language)); }); } exports.getExcludedTargetLanguages = getExcludedTargetLanguages; function filterLanguages(request, files) { const result = {}; for (const fileId in request) { const file = files.find((f) => f.id === parseInt(fileId, 10)); if (file) { const excludedLanguages = new Set((file === null || file === void 0 ? void 0 : file.excludedTargetLanguages) || []); result[fileId] = request[fileId].filter((lang) => !excludedLanguages.has(lang)); } else { result[fileId] = request[fileId]; } } return result; } exports.filterLanguages = filterLanguages;