@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
JavaScript
;
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;