n8n
Version:
n8n Workflow Automation Tool
217 lines • 9.46 kB
JavaScript
;
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