UNPKG

n8n

Version:

n8n Workflow Automation Tool

217 lines • 9.46 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); 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 __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); 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.N8nPackageParser = void 0; const db_1 = require("@n8n/db"); const di_1 = require("@n8n/di"); const n8n_workflow_1 = require("n8n-workflow"); const zod_1 = require("zod"); const bad_request_error_1 = require("../../../errors/response-errors/bad-request.error"); const WorkflowHelpers = __importStar(require("../../../workflow-helpers")); const package_layout_1 = require("./package-layout"); const workflow_serializer_1 = require("../entities/workflow/workflow.serializer"); const manifest_schema_1 = require("../spec/manifest.schema"); const data_table_schema_1 = require("../spec/serialized/data-table.schema"); const folder_schema_1 = require("../spec/serialized/folder.schema"); const project_schema_1 = require("../spec/serialized/project.schema"); let N8nPackageParser = class N8nPackageParser { constructor(workflowSerializer) { this.workflowSerializer = workflowSerializer; } async getManifest(reader) { try { return manifest_schema_1.packageManifestSchema.parse(await reader.readManifest()); } catch (error) { if (error instanceof bad_request_error_1.BadRequestError) throw error; if (error instanceof zod_1.ZodError) throw new bad_request_error_1.BadRequestError('Package manifest failed validation'); throw new bad_request_error_1.BadRequestError('Failed to read package manifest'); } } async getWorkflows(reader, basePrefix = '') { const manifest = await this.getManifest(reader); const folderTargetToId = new Map((manifest.folders ?? []).map((f) => [f.target, f.id])); const workflows = []; for (const entry of (0, package_layout_1.workflowsInScope)(manifest.workflows, basePrefix)) { const parentFolderId = (0, package_layout_1.deriveParentFolderId)(entry.target, folderTargetToId); workflows.push(await this.readWorkflow(reader, entry, parentFolderId)); } return workflows; } async getFolders(reader, basePrefix = '') { const manifest = await this.getManifest(reader); const folders = []; for (const entry of (0, package_layout_1.foldersInScope)(manifest.folders, basePrefix)) { folders.push(await this.readFolder(reader, entry)); } return folders; } async getDataTables(reader) { const manifest = await this.getManifest(reader); const dataTables = []; for (const entry of manifest.dataTables ?? []) { dataTables.push(await this.readDataTable(reader, entry)); } return dataTables; } async getProjects(reader) { const manifest = await this.getManifest(reader); const projects = []; for (const entry of manifest.projects ?? []) { projects.push(await this.readProject(reader, entry)); } return projects; } async readWorkflow(reader, entry, parentFolderId) { const path = `${entry.target}/workflow.json`; const wire = await this.readJson(reader, path, 'workflow'); let entity; try { const partial = this.workflowSerializer.deserialize(wire); entity = Object.assign(new db_1.WorkflowEntity(), partial); } catch (cause) { if (cause instanceof zod_1.ZodError) { throw new n8n_workflow_1.UserError(`Package workflow file at ${path} failed schema validation.`, { cause, }); } throw cause; } WorkflowHelpers.validateWorkflowStructure(entity); return { entity, sourceWorkflowId: entry.id, sourcePublished: wire.isPublished, parentFolderId, }; } async readFolder(reader, entry) { const path = `${entry.target}/folder.json`; const wire = await this.readJson(reader, path, 'folder'); let folder; try { folder = folder_schema_1.serializedFolderSchema.parse(wire); } catch (cause) { if (cause instanceof zod_1.ZodError) { throw new n8n_workflow_1.UserError(`Package folder file at ${path} failed schema validation.`, { cause }); } throw cause; } if (folder.id !== entry.id) { throw new n8n_workflow_1.UserError(`Package folder at ${path} declares id "${folder.id}" but the manifest lists it as "${entry.id}".`); } return { sourceFolderId: folder.id, name: folder.name, parentFolderId: folder.parentFolderId, }; } async readDataTable(reader, entry) { const path = `${entry.target}/data-table.json`; const wire = await this.readJson(reader, path, 'data table'); let dataTable; try { dataTable = data_table_schema_1.serializedDataTableSchema.parse(wire); } catch (cause) { if (cause instanceof zod_1.ZodError) { throw new n8n_workflow_1.UserError(`Package data table file at ${path} failed schema validation.`, { cause, }); } throw cause; } if (dataTable.id !== entry.id) { throw new n8n_workflow_1.UserError(`Package data table at ${path} declares id "${dataTable.id}" but the manifest lists it as "${entry.id}".`); } return dataTable; } async readProject(reader, entry) { const path = `${entry.target}/project.json`; const wire = await this.readJson(reader, path, 'project'); let project; try { project = project_schema_1.serializedProjectSchema.parse(wire); } catch (cause) { if (cause instanceof zod_1.ZodError) { throw new n8n_workflow_1.UserError(`Package project file at ${path} failed schema validation.`, { cause }); } throw cause; } if (project.id !== entry.id) { throw new n8n_workflow_1.UserError(`Package project at ${path} declares id "${project.id}" but the manifest lists it as "${entry.id}".`); } return { sourceProjectId: project.id, name: project.name, ...(project.description !== undefined ? { description: project.description } : {}), ...(project.icon !== undefined ? { icon: project.icon } : {}), }; } async readJson(reader, path, label) { let content; try { content = await reader.readFile(path); } catch (cause) { throw new n8n_workflow_1.UserError(`Package manifest references a missing ${label} file at ${path}.`, { cause, }); } return (0, n8n_workflow_1.jsonParse)(content.toString('utf-8'), { errorMessage: `Package ${label} file at ${path} is not valid JSON.`, }); } }; exports.N8nPackageParser = N8nPackageParser; exports.N8nPackageParser = N8nPackageParser = __decorate([ (0, di_1.Service)(), __metadata("design:paramtypes", [workflow_serializer_1.WorkflowSerializer]) ], N8nPackageParser); //# sourceMappingURL=n8n-package-parser.js.map