UNPKG

n8n

Version:

n8n Workflow Automation Tool

117 lines 6.3 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FolderExporter = void 0; const di_1 = require("@n8n/di"); const folder_finder_service_1 = require("../../../../services/folder-finder.service"); const workflow_finder_service_1 = require("../../../../workflows/workflow-finder.service"); const folder_serializer_1 = require("./folder.serializer"); const unique_filename_allocator_1 = require("../../io/unique-filename-allocator"); const package_export_errors_1 = require("../package-export.errors"); const requirements_types_1 = require("../requirements.types"); const workflow_exporter_1 = require("../workflow/workflow.exporter"); let FolderExporter = class FolderExporter { constructor(folderFinder, folderSerializer, workflowFinder, workflowExporter) { this.folderFinder = folderFinder; this.folderSerializer = folderSerializer; this.workflowFinder = workflowFinder; this.workflowExporter = workflowExporter; } async export(request) { const folders = await this.folderFinder.findFolderSubtreesForUser(request.folderIds, request.user, ['folder:read']); await (0, package_export_errors_1.assertEveryRequestedEntityAccessible)('folder', request.folderIds, folders, async (ids) => await this.folderFinder.findExistingFolderIds(ids)); const { roots, childrenByParent } = this.buildForest(folders); const workflowIdsByFolder = await this.workflowFinder.findWorkflowIdsByFolder(folders.map((folder) => folder.id)); const foldersDir = request.basePrefix ? `${request.basePrefix}/folders` : 'folders'; return await this.exportLevel(roots, foldersDir, null, { childrenByParent, workflowIdsByFolder, request, }); } buildForest(folders) { const idsInSet = new Set(folders.map((folder) => folder.id)); const roots = []; const childrenByParent = new Map(); for (const folder of folders) { const parentId = folder.parentFolderId; if (parentId && idsInSet.has(parentId)) { const siblings = childrenByParent.get(parentId) ?? []; siblings.push(folder); childrenByParent.set(parentId, siblings); } else { roots.push(folder); } } return { roots, childrenByParent }; } async exportLevel(siblings, parentDir, effectiveParentId, context, reservedName) { const allocator = new unique_filename_allocator_1.UniqueFilenameAllocator(parentDir, 'folder'); if (reservedName) allocator.reserve(reservedName); const results = []; for (const folder of this.orderedByCreation(siblings)) { const target = allocator.allocate(folder.name); results.push(await this.exportFolder(folder, target, effectiveParentId, context)); } return this.mergeFolderExportResults(results); } async exportFolder(folder, target, effectiveParentId, context) { const { childrenByParent, workflowIdsByFolder, request } = context; this.exportFolderShell(folder, target, effectiveParentId, request.writer); const workflowIds = workflowIdsByFolder.get(folder.id) ?? []; const contained = await this.exportContainedWorkflows(workflowIds, target, request); const descendants = await this.exportLevel(childrenByParent.get(folder.id) ?? [], target, folder.id, context, workflowIds.length > 0 ? 'workflows' : undefined); const own = { entries: [{ id: folder.id, name: folder.name, target }], workflowEntries: contained.entries, requirements: contained.requirements, }; return this.mergeFolderExportResults([own, descendants]); } exportFolderShell(folder, target, effectiveParentId, writer) { const serialized = this.folderSerializer.serialize(folder, effectiveParentId); writer.writeDirectory(target); writer.writeFile(`${target}/folder.json`, JSON.stringify(serialized, null, '\t')); } async exportContainedWorkflows(workflowIds, basePrefix, request) { if (workflowIds.length === 0) { return { entries: [], requirements: (0, requirements_types_1.mergeRequirements)() }; } return await this.workflowExporter.export({ user: request.user, writer: request.writer, workflowIds, includeTags: request.includeTags, basePrefix, }); } mergeFolderExportResults(results) { return { entries: results.flatMap((result) => result.entries), workflowEntries: results.flatMap((result) => result.workflowEntries), requirements: (0, requirements_types_1.mergeRequirements)(...results.map((result) => result.requirements)), }; } orderedByCreation(folders) { return [...folders].sort((a, b) => { const byCreatedAt = a.createdAt.getTime() - b.createdAt.getTime(); return byCreatedAt !== 0 ? byCreatedAt : a.id.localeCompare(b.id); }); } }; exports.FolderExporter = FolderExporter; exports.FolderExporter = FolderExporter = __decorate([ (0, di_1.Service)(), __metadata("design:paramtypes", [folder_finder_service_1.FolderFinderService, folder_serializer_1.FolderSerializer, workflow_finder_service_1.WorkflowFinderService, workflow_exporter_1.WorkflowExporter]) ], FolderExporter); //# sourceMappingURL=folder.exporter.js.map