n8n 2.14.2 → 2.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abstract-server.js +1 -1
- package/dist/abstract-server.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/commands/base-command.d.ts +1 -0
- package/dist/commands/base-command.js +8 -6
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/execute-batch.js +2 -0
- package/dist/commands/execute-batch.js.map +1 -1
- package/dist/commands/execute.js +2 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/start.js +1 -0
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/webhook.js +1 -0
- package/dist/commands/webhook.js.map +1 -1
- package/dist/commands/worker.js +1 -0
- package/dist/commands/worker.js.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/controllers/ai.controller.js +1 -1
- package/dist/controllers/ai.controller.js.map +1 -1
- package/dist/controllers/binary-data.controller.js +1 -1
- package/dist/controllers/binary-data.controller.js.map +1 -1
- package/dist/controllers/me.controller.d.ts +3 -1
- package/dist/controllers/me.controller.js +6 -3
- package/dist/controllers/me.controller.js.map +1 -1
- package/dist/controllers/project.controller.d.ts +2 -0
- package/dist/credentials/credentials.service.js +1 -1
- package/dist/credentials/credentials.service.js.map +1 -1
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js +9 -8
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
- package/dist/executions/execution-persistence.d.ts +4 -1
- package/dist/executions/execution-persistence.js +16 -2
- package/dist/executions/execution-persistence.js.map +1 -1
- package/dist/executions/executions.controller.d.ts +3 -5
- package/dist/executions/executions.controller.js +17 -9
- package/dist/executions/executions.controller.js.map +1 -1
- package/dist/modules/community-packages/community-packages.controller.d.ts +6 -19
- package/dist/modules/community-packages/community-packages.controller.js +8 -231
- package/dist/modules/community-packages/community-packages.controller.js.map +1 -1
- package/dist/modules/community-packages/community-packages.lifecycle.service.d.ts +32 -0
- package/dist/modules/community-packages/community-packages.lifecycle.service.js +282 -0
- package/dist/modules/community-packages/community-packages.lifecycle.service.js.map +1 -0
- package/dist/modules/community-packages/community-packages.service.js +8 -8
- package/dist/modules/community-packages/community-packages.service.js.map +1 -1
- package/dist/modules/community-packages/npm-utils.d.ts +4 -0
- package/dist/modules/community-packages/npm-utils.js +4 -0
- package/dist/modules/community-packages/npm-utils.js.map +1 -1
- package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/index.d.ts +1 -0
- package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/index.js +1 -0
- package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/index.js.map +1 -1
- package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/slack-signature-extractor.d.ts +11 -0
- package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/slack-signature-extractor.js +88 -0
- package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/slack-signature-extractor.js.map +1 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/identifiers/slack-signature-identifier.d.ts +28 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/identifiers/slack-signature-identifier.js +158 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/identifiers/slack-signature-identifier.js.map +1 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/index.d.ts +1 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/index.js +1 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/index.js.map +1 -1
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.d.ts +50 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.js +118 -0
- package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.js.map +1 -0
- package/dist/modules/instance-registry/storage/memory-storage.d.ts +15 -0
- package/dist/modules/instance-registry/storage/memory-storage.js +41 -0
- package/dist/modules/instance-registry/storage/memory-storage.js.map +1 -0
- package/dist/modules/mcp/mcp-oauth-service.d.ts +1 -1
- package/dist/modules/mcp/mcp-oauth-service.js +5 -1
- package/dist/modules/mcp/mcp-oauth-service.js.map +1 -1
- package/dist/modules/mcp/mcp.errors.js +1 -1
- package/dist/modules/mcp/mcp.oauth-clients.controller.js +1 -1
- package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +3 -1
- package/dist/modules/mcp/mcp.service.js +13 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/mcp.types.d.ts +1 -1
- package/dist/modules/mcp/tools/execute-workflow.tool.js +8 -44
- package/dist/modules/mcp/tools/execute-workflow.tool.js.map +1 -1
- package/dist/modules/mcp/tools/execution-utils.d.ts +5 -0
- package/dist/modules/mcp/tools/execution-utils.js +45 -0
- package/dist/modules/mcp/tools/execution-utils.js.map +1 -0
- package/dist/modules/mcp/tools/prepare-workflow-pin-data.tool.d.ts +31 -0
- package/dist/modules/mcp/tools/prepare-workflow-pin-data.tool.js +165 -0
- package/dist/modules/mcp/tools/prepare-workflow-pin-data.tool.js.map +1 -0
- package/dist/modules/mcp/tools/test-workflow.tool.d.ts +31 -0
- package/dist/modules/mcp/tools/test-workflow.tool.js +178 -0
- package/dist/modules/mcp/tools/test-workflow.tool.js.map +1 -0
- package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js +1 -0
- package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/credentials-auto-assign.d.ts +2 -1
- package/dist/modules/mcp/tools/workflow-builder/credentials-auto-assign.js +15 -0
- package/dist/modules/mcp/tools/workflow-builder/credentials-auto-assign.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js +1 -0
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js.map +1 -1
- package/dist/modules/otel/handlers/interfaces.d.ts +5 -0
- package/dist/modules/otel/handlers/interfaces.js +3 -0
- package/dist/modules/otel/handlers/interfaces.js.map +1 -0
- package/dist/modules/otel/handlers/workflow-end.handler.d.ts +7 -0
- package/dist/modules/otel/handlers/workflow-end.handler.js +65 -0
- package/dist/modules/otel/handlers/workflow-end.handler.js.map +1 -0
- package/dist/modules/otel/handlers/workflow-start.handler.d.ts +7 -0
- package/dist/modules/otel/handlers/workflow-start.handler.js +29 -0
- package/dist/modules/otel/handlers/workflow-start.handler.js.map +1 -0
- package/dist/modules/otel/n8n-instrumentation.d.ts +15 -0
- package/dist/modules/otel/n8n-instrumentation.js +72 -0
- package/dist/modules/otel/n8n-instrumentation.js.map +1 -0
- package/dist/modules/otel/otel.config.d.ts +9 -0
- package/dist/modules/otel/otel.config.js +57 -0
- package/dist/modules/otel/otel.config.js.map +1 -0
- package/dist/modules/otel/otel.constants.d.ts +15 -0
- package/dist/modules/otel/otel.constants.js +20 -0
- package/dist/modules/otel/otel.constants.js.map +1 -0
- package/dist/modules/otel/otel.module.d.ts +5 -0
- package/dist/modules/otel/otel.module.js +80 -0
- package/dist/modules/otel/otel.module.js.map +1 -0
- package/dist/modules/otel/otel.service.d.ts +18 -0
- package/dist/modules/otel/otel.service.js +123 -0
- package/dist/modules/otel/otel.service.js.map +1 -0
- package/dist/modules/otel/span-registry.d.ts +13 -0
- package/dist/modules/otel/span-registry.js +47 -0
- package/dist/modules/otel/span-registry.js.map +1 -0
- package/dist/modules/provisioning.ee/provisioning.module.js +1 -0
- package/dist/modules/provisioning.ee/provisioning.module.js.map +1 -1
- package/dist/modules/provisioning.ee/role-mapping-rule.controller.ee.d.ts +18 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.controller.ee.js +105 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.controller.ee.js.map +1 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.d.ts +34 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js +221 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js.map +1 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.validation.d.ts +3 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.validation.js +29 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.validation.js.map +1 -0
- package/dist/modules/source-control.ee/source-control-import.service.ee.js +6 -0
- package/dist/modules/source-control.ee/source-control-import.service.ee.js.map +1 -1
- package/dist/modules/source-control.ee/types/source-control-preferences.js +3 -0
- package/dist/modules/source-control.ee/types/source-control-preferences.js.map +1 -1
- package/dist/modules/workflow-builder/workflow-builder-session.entity.d.ts +4 -0
- package/dist/modules/workflow-builder/workflow-builder-session.entity.js +8 -0
- package/dist/modules/workflow-builder/workflow-builder-session.entity.js.map +1 -1
- package/dist/modules/workflow-builder/workflow-builder-session.repository.js +14 -2
- package/dist/modules/workflow-builder/workflow-builder-session.repository.js.map +1 -1
- package/dist/modules/workflow-index/workflow-dependency-query.service.js +26 -3
- package/dist/modules/workflow-index/workflow-dependency-query.service.js.map +1 -1
- package/dist/modules/workflow-index/workflow-index.service.d.ts +1 -0
- package/dist/modules/workflow-index/workflow-index.service.js +15 -3
- package/dist/modules/workflow-index/workflow-index.service.js.map +1 -1
- package/dist/posthog/index.d.ts +1 -0
- package/dist/posthog/index.js +32 -8
- package/dist/posthog/index.js.map +1 -1
- package/dist/public-api/v1/handlers/credentials/credentials.handler.js +6 -5
- package/dist/public-api/v1/handlers/credentials/credentials.handler.js.map +1 -1
- package/dist/public-api/v1/handlers/credentials/credentials.service.d.ts +2 -2
- package/dist/public-api/v1/handlers/credentials/credentials.service.js +3 -6
- package/dist/public-api/v1/handlers/credentials/credentials.service.js.map +1 -1
- package/dist/public-api/v1/handlers/workflows/workflows.handler.d.ts +8 -0
- package/dist/public-api/v1/handlers/workflows/workflows.handler.js +44 -0
- package/dist/public-api/v1/handlers/workflows/workflows.handler.js.map +1 -1
- package/dist/public-api/v1/openapi.yml +54 -1
- package/dist/scaling/job-processor.js +3 -0
- package/dist/scaling/job-processor.js.map +1 -1
- package/dist/scaling/scaling.service.js +1 -2
- package/dist/scaling/scaling.service.js.map +1 -1
- package/dist/scaling/worker-server.js +1 -1
- package/dist/scaling/worker-server.js.map +1 -1
- package/dist/services/ai-workflow-builder.service.d.ts +1 -1
- package/dist/services/ai-workflow-builder.service.js +3 -6
- package/dist/services/ai-workflow-builder.service.js.map +1 -1
- package/dist/services/frontend.service.js +2 -1
- package/dist/services/frontend.service.js.map +1 -1
- package/dist/utils/health-endpoint.util.d.ts +2 -1
- package/dist/utils/health-endpoint.util.js +11 -3
- package/dist/utils/health-endpoint.util.js.map +1 -1
- package/dist/webhooks/waiting-forms.js +3 -1
- package/dist/webhooks/waiting-forms.js.map +1 -1
- package/dist/webhooks/webhook-request-handler.js +1 -1
- package/dist/webhooks/webhook-request-handler.js.map +1 -1
- package/dist/workflows/workflow.service.d.ts +6 -1
- package/dist/workflows/workflow.service.js +22 -6
- package/dist/workflows/workflow.service.js.map +1 -1
- package/package.json +30 -23
|
@@ -10,245 +10,26 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.CommunityPackagesController = void 0;
|
|
13
|
-
exports.isNpmError = isNpmError;
|
|
14
13
|
const decorators_1 = require("@n8n/decorators");
|
|
15
|
-
const
|
|
16
|
-
const constants_1 = require("../../constants");
|
|
17
|
-
const bad_request_error_1 = require("../../errors/response-errors/bad-request.error");
|
|
18
|
-
const internal_server_error_1 = require("../../errors/response-errors/internal-server.error");
|
|
19
|
-
const event_service_1 = require("../../events/event.service");
|
|
20
|
-
const push_1 = require("../../push");
|
|
21
|
-
const community_node_types_service_1 = require("./community-node-types.service");
|
|
22
|
-
const community_packages_service_1 = require("./community-packages.service");
|
|
23
|
-
const npm_utils_1 = require("./npm-utils");
|
|
24
|
-
const n8n_core_1 = require("n8n-core");
|
|
25
|
-
const { PACKAGE_NOT_INSTALLED, PACKAGE_NAME_NOT_PROVIDED, PACKAGE_VERSION_NOT_FOUND, PACKAGE_DOES_NOT_CONTAIN_NODES, PACKAGE_NOT_FOUND, } = constants_1.RESPONSE_ERROR_MESSAGES;
|
|
26
|
-
const isClientError = (error) => [PACKAGE_VERSION_NOT_FOUND, PACKAGE_DOES_NOT_CONTAIN_NODES, PACKAGE_NOT_FOUND].some((msg) => typeof error.message === 'string' && error.message.includes(msg));
|
|
27
|
-
function isNpmError(error) {
|
|
28
|
-
return typeof error === 'object' && error !== null && 'code' in error && 'stdout' in error;
|
|
29
|
-
}
|
|
14
|
+
const community_packages_lifecycle_service_1 = require("./community-packages.lifecycle.service");
|
|
30
15
|
let CommunityPackagesController = class CommunityPackagesController {
|
|
31
|
-
constructor(
|
|
32
|
-
this.
|
|
33
|
-
this.communityPackagesService = communityPackagesService;
|
|
34
|
-
this.eventService = eventService;
|
|
35
|
-
this.communityNodeTypesService = communityNodeTypesService;
|
|
36
|
-
this.instanceSettings = instanceSettings;
|
|
16
|
+
constructor(communityPackagesLifecycle) {
|
|
17
|
+
this.communityPackagesLifecycle = communityPackagesLifecycle;
|
|
37
18
|
}
|
|
38
19
|
async installPackage(req) {
|
|
39
20
|
const { name, verify, version } = req.body;
|
|
40
|
-
|
|
41
|
-
throw new bad_request_error_1.BadRequestError(PACKAGE_NAME_NOT_PROVIDED);
|
|
42
|
-
}
|
|
43
|
-
if (version && !(0, semver_1.valid)(version)) {
|
|
44
|
-
throw new bad_request_error_1.BadRequestError(`Invalid version: ${version}`);
|
|
45
|
-
}
|
|
46
|
-
let checksum = undefined;
|
|
47
|
-
if (verify) {
|
|
48
|
-
checksum = this.communityNodeTypesService.findVetted(name)?.checksum;
|
|
49
|
-
if (!checksum) {
|
|
50
|
-
throw new bad_request_error_1.BadRequestError(`Package ${name} is not vetted for installation`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
let parsed;
|
|
54
|
-
try {
|
|
55
|
-
parsed = this.communityPackagesService.parseNpmPackageName(name);
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
throw new bad_request_error_1.BadRequestError(error instanceof Error ? error.message : 'Failed to parse package name');
|
|
59
|
-
}
|
|
60
|
-
if (parsed.packageName === constants_1.STARTER_TEMPLATE_NAME) {
|
|
61
|
-
throw new bad_request_error_1.BadRequestError([
|
|
62
|
-
`Package "${parsed.packageName}" is only a template`,
|
|
63
|
-
'Please enter an actual package to install',
|
|
64
|
-
].join('.'));
|
|
65
|
-
}
|
|
66
|
-
const isInstalled = await this.communityPackagesService.isPackageInstalled(parsed.packageName);
|
|
67
|
-
const hasLoaded = this.communityPackagesService.hasPackageLoaded(name);
|
|
68
|
-
if (isInstalled && hasLoaded) {
|
|
69
|
-
throw new bad_request_error_1.BadRequestError([
|
|
70
|
-
`Package "${parsed.packageName}" is already installed`,
|
|
71
|
-
'To update it, click the corresponding button in the UI',
|
|
72
|
-
].join('.'));
|
|
73
|
-
}
|
|
74
|
-
const packageStatus = await this.communityPackagesService.checkNpmPackageStatus(name);
|
|
75
|
-
if (packageStatus.status !== 'OK') {
|
|
76
|
-
throw new bad_request_error_1.BadRequestError(`Package "${name}" is banned so it cannot be installed`);
|
|
77
|
-
}
|
|
78
|
-
const packageVersion = version ?? parsed.version;
|
|
79
|
-
let installedPackage;
|
|
80
|
-
try {
|
|
81
|
-
installedPackage = await this.communityPackagesService.installPackage(parsed.packageName, packageVersion, checksum);
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
const errorMessage = error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON;
|
|
85
|
-
this.eventService.emit('community-package-installed', {
|
|
86
|
-
user: req.user,
|
|
87
|
-
inputString: name,
|
|
88
|
-
packageName: parsed.packageName,
|
|
89
|
-
success: false,
|
|
90
|
-
packageVersion,
|
|
91
|
-
failureReason: errorMessage,
|
|
92
|
-
});
|
|
93
|
-
let message = [`Error loading package "${name}" `, errorMessage].join(':');
|
|
94
|
-
if (error instanceof Error && error.cause instanceof Error) {
|
|
95
|
-
message += `\nCause: ${error.cause.message}`;
|
|
96
|
-
}
|
|
97
|
-
const clientError = error instanceof Error ? isClientError(error) : false;
|
|
98
|
-
throw new (clientError ? bad_request_error_1.BadRequestError : internal_server_error_1.InternalServerError)(message);
|
|
99
|
-
}
|
|
100
|
-
if (!hasLoaded)
|
|
101
|
-
this.communityPackagesService.removePackageFromMissingList(name);
|
|
102
|
-
installedPackage.installedNodes.forEach((node) => {
|
|
103
|
-
this.push.broadcast({
|
|
104
|
-
type: 'reloadNodeType',
|
|
105
|
-
data: {
|
|
106
|
-
name: node.type,
|
|
107
|
-
version: node.latestVersion,
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
this.eventService.emit('community-package-installed', {
|
|
112
|
-
user: req.user,
|
|
113
|
-
inputString: name,
|
|
114
|
-
packageName: parsed.packageName,
|
|
115
|
-
success: true,
|
|
116
|
-
packageVersion,
|
|
117
|
-
packageNodeNames: installedPackage.installedNodes.map((node) => node.name),
|
|
118
|
-
packageAuthor: installedPackage.authorName,
|
|
119
|
-
packageAuthorEmail: installedPackage.authorEmail,
|
|
120
|
-
});
|
|
121
|
-
return installedPackage;
|
|
21
|
+
return await this.communityPackagesLifecycle.install({ name, verify, version }, req.user, 'ui');
|
|
122
22
|
}
|
|
123
23
|
async getInstalledPackages() {
|
|
124
|
-
|
|
125
|
-
if (installedPackages.length === 0)
|
|
126
|
-
return [];
|
|
127
|
-
let pendingUpdates;
|
|
128
|
-
try {
|
|
129
|
-
await (0, npm_utils_1.executeNpmCommand)(['outdated', '--json'], {
|
|
130
|
-
doNotHandleError: true,
|
|
131
|
-
cwd: this.instanceSettings.nodesDownloadDir,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
if (isNpmError(error) && error.code === 1) {
|
|
136
|
-
pendingUpdates = JSON.parse(error.stdout);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
let hydratedPackages = this.communityPackagesService.matchPackagesWithUpdates(installedPackages, pendingUpdates);
|
|
140
|
-
try {
|
|
141
|
-
if (this.communityPackagesService.hasMissingPackages) {
|
|
142
|
-
hydratedPackages = this.communityPackagesService.matchMissingPackages(hydratedPackages);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
}
|
|
147
|
-
return hydratedPackages;
|
|
24
|
+
return await this.communityPackagesLifecycle.listInstalledPackages();
|
|
148
25
|
}
|
|
149
26
|
async uninstallPackage(req) {
|
|
150
27
|
const { name } = req.query;
|
|
151
|
-
|
|
152
|
-
throw new bad_request_error_1.BadRequestError(PACKAGE_NAME_NOT_PROVIDED);
|
|
153
|
-
}
|
|
154
|
-
try {
|
|
155
|
-
this.communityPackagesService.parseNpmPackageName(name);
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
const message = error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON;
|
|
159
|
-
throw new bad_request_error_1.BadRequestError(message);
|
|
160
|
-
}
|
|
161
|
-
const installedPackage = await this.communityPackagesService.findInstalledPackage(name);
|
|
162
|
-
if (!installedPackage) {
|
|
163
|
-
throw new bad_request_error_1.BadRequestError(PACKAGE_NOT_INSTALLED);
|
|
164
|
-
}
|
|
165
|
-
try {
|
|
166
|
-
await this.communityPackagesService.removePackage(name, installedPackage);
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
const message = [
|
|
170
|
-
`Error removing package "${name}"`,
|
|
171
|
-
error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON,
|
|
172
|
-
].join(':');
|
|
173
|
-
throw new internal_server_error_1.InternalServerError(message, error);
|
|
174
|
-
}
|
|
175
|
-
installedPackage.installedNodes.forEach((node) => {
|
|
176
|
-
this.push.broadcast({
|
|
177
|
-
type: 'removeNodeType',
|
|
178
|
-
data: {
|
|
179
|
-
name: node.type,
|
|
180
|
-
version: node.latestVersion,
|
|
181
|
-
},
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
this.eventService.emit('community-package-deleted', {
|
|
185
|
-
user: req.user,
|
|
186
|
-
packageName: name,
|
|
187
|
-
packageVersion: installedPackage.installedVersion,
|
|
188
|
-
packageNodeNames: installedPackage.installedNodes.map((node) => node.name),
|
|
189
|
-
packageAuthor: installedPackage.authorName,
|
|
190
|
-
packageAuthorEmail: installedPackage.authorEmail,
|
|
191
|
-
});
|
|
28
|
+
await this.communityPackagesLifecycle.uninstall(name, req.user, 'badRequest');
|
|
192
29
|
}
|
|
193
30
|
async updatePackage(req) {
|
|
194
31
|
const { name, version, checksum } = req.body;
|
|
195
|
-
|
|
196
|
-
throw new bad_request_error_1.BadRequestError(PACKAGE_NAME_NOT_PROVIDED);
|
|
197
|
-
}
|
|
198
|
-
if (version && !(0, semver_1.valid)(version)) {
|
|
199
|
-
throw new bad_request_error_1.BadRequestError(`Invalid version: ${version}`);
|
|
200
|
-
}
|
|
201
|
-
const previouslyInstalledPackage = await this.communityPackagesService.findInstalledPackage(name);
|
|
202
|
-
if (!previouslyInstalledPackage) {
|
|
203
|
-
throw new bad_request_error_1.BadRequestError(PACKAGE_NOT_INSTALLED);
|
|
204
|
-
}
|
|
205
|
-
try {
|
|
206
|
-
const newInstalledPackage = await this.communityPackagesService.updatePackage(this.communityPackagesService.parseNpmPackageName(name).packageName, previouslyInstalledPackage, version, checksum);
|
|
207
|
-
previouslyInstalledPackage.installedNodes.forEach((node) => {
|
|
208
|
-
this.push.broadcast({
|
|
209
|
-
type: 'removeNodeType',
|
|
210
|
-
data: {
|
|
211
|
-
name: node.type,
|
|
212
|
-
version: node.latestVersion,
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
newInstalledPackage.installedNodes.forEach((node) => {
|
|
217
|
-
this.push.broadcast({
|
|
218
|
-
type: 'reloadNodeType',
|
|
219
|
-
data: {
|
|
220
|
-
name: node.type,
|
|
221
|
-
version: node.latestVersion,
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
this.eventService.emit('community-package-updated', {
|
|
226
|
-
user: req.user,
|
|
227
|
-
packageName: name,
|
|
228
|
-
packageVersionCurrent: previouslyInstalledPackage.installedVersion,
|
|
229
|
-
packageVersionNew: newInstalledPackage.installedVersion,
|
|
230
|
-
packageNodeNames: newInstalledPackage.installedNodes.map((n) => n.name),
|
|
231
|
-
packageAuthor: newInstalledPackage.authorName,
|
|
232
|
-
packageAuthorEmail: newInstalledPackage.authorEmail,
|
|
233
|
-
});
|
|
234
|
-
return newInstalledPackage;
|
|
235
|
-
}
|
|
236
|
-
catch (error) {
|
|
237
|
-
previouslyInstalledPackage.installedNodes.forEach((node) => {
|
|
238
|
-
this.push.broadcast({
|
|
239
|
-
type: 'removeNodeType',
|
|
240
|
-
data: {
|
|
241
|
-
name: node.type,
|
|
242
|
-
version: node.latestVersion,
|
|
243
|
-
},
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
const message = [
|
|
247
|
-
`Error removing package "${name}"`,
|
|
248
|
-
error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON,
|
|
249
|
-
].join(':');
|
|
250
|
-
throw new internal_server_error_1.InternalServerError(message, error);
|
|
251
|
-
}
|
|
32
|
+
return await this.communityPackagesLifecycle.update({ name, version, checksum }, req.user, 'badRequest');
|
|
252
33
|
}
|
|
253
34
|
};
|
|
254
35
|
exports.CommunityPackagesController = CommunityPackagesController;
|
|
@@ -282,10 +63,6 @@ __decorate([
|
|
|
282
63
|
], CommunityPackagesController.prototype, "updatePackage", null);
|
|
283
64
|
exports.CommunityPackagesController = CommunityPackagesController = __decorate([
|
|
284
65
|
(0, decorators_1.RestController)('/community-packages'),
|
|
285
|
-
__metadata("design:paramtypes", [
|
|
286
|
-
community_packages_service_1.CommunityPackagesService,
|
|
287
|
-
event_service_1.EventService,
|
|
288
|
-
community_node_types_service_1.CommunityNodeTypesService,
|
|
289
|
-
n8n_core_1.InstanceSettings])
|
|
66
|
+
__metadata("design:paramtypes", [community_packages_lifecycle_service_1.CommunityPackagesLifecycleService])
|
|
290
67
|
], CommunityPackagesController);
|
|
291
68
|
//# sourceMappingURL=community-packages.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"community-packages.controller.js","sourceRoot":"","sources":["../../../src/modules/community-packages/community-packages.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"community-packages.controller.js","sourceRoot":"","sources":["../../../src/modules/community-packages/community-packages.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gDAAwF;AAIxF,iGAA2F;AAGpF,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACvC,YAA6B,0BAA6D;QAA7D,+BAA0B,GAA1B,0BAA0B,CAAmC;IAAG,CAAC;IAIxF,AAAN,KAAK,CAAC,cAAc,CAAC,GAAqB;QACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAE3C,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjG,CAAC;IAIK,AAAN,KAAK,CAAC,oBAAoB;QACzB,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,EAAE,CAAC;IACtE,CAAC;IAIK,AAAN,KAAK,CAAC,gBAAgB,CAAC,GAAuB;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAE3B,MAAM,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC/E,CAAC;IAIK,AAAN,KAAK,CAAC,aAAa,CAAC,GAAuB;QAC1C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAE7C,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAClD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAC3B,GAAG,CAAC,IAAI,EACR,YAAY,CACZ,CAAC;IACH,CAAC;CACD,CAAA;AApCY,kEAA2B;AAKjC;IAFL,IAAA,iBAAI,EAAC,GAAG,CAAC;IACT,IAAA,wBAAW,EAAC,0BAA0B,CAAC;;;;iEAKvC;AAIK;IAFL,IAAA,gBAAG,EAAC,GAAG,CAAC;IACR,IAAA,wBAAW,EAAC,uBAAuB,CAAC;;;;uEAGpC;AAIK;IAFL,IAAA,mBAAM,EAAC,GAAG,CAAC;IACX,IAAA,wBAAW,EAAC,4BAA4B,CAAC;;;;mEAKzC;AAIK;IAFL,IAAA,kBAAK,EAAC,GAAG,CAAC;IACV,IAAA,wBAAW,EAAC,yBAAyB,CAAC;;;;gEAStC;sCAnCW,2BAA2B;IADvC,IAAA,2BAAc,EAAC,qBAAqB,CAAC;qCAEoB,wEAAiC;GAD9E,2BAA2B,CAoCvC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Logger } from '@n8n/backend-common';
|
|
2
|
+
import type { UserLike } from '../../events/maps/relay.event-map';
|
|
3
|
+
import { EventService } from '../../events/event.service';
|
|
4
|
+
import { Push } from '../../push';
|
|
5
|
+
import { InstanceSettings } from 'n8n-core';
|
|
6
|
+
import { type PublicInstalledPackage } from 'n8n-workflow';
|
|
7
|
+
import { CommunityNodeTypesService } from './community-node-types.service';
|
|
8
|
+
import { CommunityPackagesService } from './community-packages.service';
|
|
9
|
+
import type { InstalledPackages } from './installed-packages.entity';
|
|
10
|
+
export type CommunityPackageInstallPresentation = 'ui' | 'publicApi';
|
|
11
|
+
export type MissingInstalledPackageBehavior = 'badRequest' | 'notFound';
|
|
12
|
+
export declare class CommunityPackagesLifecycleService {
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private readonly push;
|
|
15
|
+
private readonly communityPackagesService;
|
|
16
|
+
private readonly eventService;
|
|
17
|
+
private readonly communityNodeTypesService;
|
|
18
|
+
private readonly instanceSettings;
|
|
19
|
+
constructor(logger: Logger, push: Push, communityPackagesService: CommunityPackagesService, eventService: EventService, communityNodeTypesService: CommunityNodeTypesService, instanceSettings: InstanceSettings);
|
|
20
|
+
listInstalledPackages(): Promise<PublicInstalledPackage[] | InstalledPackages[]>;
|
|
21
|
+
install(args: {
|
|
22
|
+
name: string | undefined;
|
|
23
|
+
version?: string;
|
|
24
|
+
verify?: boolean;
|
|
25
|
+
}, user: UserLike, presentation: CommunityPackageInstallPresentation): Promise<InstalledPackages>;
|
|
26
|
+
update(args: {
|
|
27
|
+
name: string | undefined;
|
|
28
|
+
version?: string;
|
|
29
|
+
checksum?: string;
|
|
30
|
+
}, user: UserLike, whenMissing: MissingInstalledPackageBehavior): Promise<InstalledPackages>;
|
|
31
|
+
uninstall(packageName: string | undefined, user: UserLike, whenMissing: MissingInstalledPackageBehavior): Promise<void>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CommunityPackagesLifecycleService = void 0;
|
|
13
|
+
const backend_common_1 = require("@n8n/backend-common");
|
|
14
|
+
const di_1 = require("@n8n/di");
|
|
15
|
+
const constants_1 = require("../../constants");
|
|
16
|
+
const event_service_1 = require("../../events/event.service");
|
|
17
|
+
const bad_request_error_1 = require("../../errors/response-errors/bad-request.error");
|
|
18
|
+
const internal_server_error_1 = require("../../errors/response-errors/internal-server.error");
|
|
19
|
+
const not_found_error_1 = require("../../errors/response-errors/not-found.error");
|
|
20
|
+
const push_1 = require("../../push");
|
|
21
|
+
const n8n_core_1 = require("n8n-core");
|
|
22
|
+
const semver_1 = require("semver");
|
|
23
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
24
|
+
const community_node_types_service_1 = require("./community-node-types.service");
|
|
25
|
+
const community_packages_service_1 = require("./community-packages.service");
|
|
26
|
+
const npm_utils_1 = require("./npm-utils");
|
|
27
|
+
const { PACKAGE_NOT_INSTALLED, PACKAGE_NAME_NOT_PROVIDED, PACKAGE_VERSION_NOT_FOUND, PACKAGE_DOES_NOT_CONTAIN_NODES, PACKAGE_NOT_FOUND, } = constants_1.RESPONSE_ERROR_MESSAGES;
|
|
28
|
+
const isCommunityPackageInstallClientError = (error) => [PACKAGE_VERSION_NOT_FOUND, PACKAGE_DOES_NOT_CONTAIN_NODES, PACKAGE_NOT_FOUND].some((msg) => typeof error.message === 'string' && error.message.includes(msg));
|
|
29
|
+
let CommunityPackagesLifecycleService = class CommunityPackagesLifecycleService {
|
|
30
|
+
constructor(logger, push, communityPackagesService, eventService, communityNodeTypesService, instanceSettings) {
|
|
31
|
+
this.logger = logger;
|
|
32
|
+
this.push = push;
|
|
33
|
+
this.communityPackagesService = communityPackagesService;
|
|
34
|
+
this.eventService = eventService;
|
|
35
|
+
this.communityNodeTypesService = communityNodeTypesService;
|
|
36
|
+
this.instanceSettings = instanceSettings;
|
|
37
|
+
}
|
|
38
|
+
async listInstalledPackages() {
|
|
39
|
+
const installedPackages = await this.communityPackagesService.getAllInstalledPackages();
|
|
40
|
+
if (installedPackages.length === 0)
|
|
41
|
+
return [];
|
|
42
|
+
let pendingUpdates;
|
|
43
|
+
try {
|
|
44
|
+
await (0, npm_utils_1.executeNpmCommand)(['outdated', '--json'], {
|
|
45
|
+
doNotHandleError: true,
|
|
46
|
+
cwd: this.instanceSettings.nodesDownloadDir,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if ((0, npm_utils_1.isNpmExecErrorWithStdout)(error) && error.code === 1) {
|
|
51
|
+
try {
|
|
52
|
+
pendingUpdates = (0, n8n_workflow_1.jsonParse)(error.stdout.trim());
|
|
53
|
+
}
|
|
54
|
+
catch (parseError) {
|
|
55
|
+
this.logger.warn('Failed to parse npm outdated output', {
|
|
56
|
+
error: (0, n8n_workflow_1.ensureError)(parseError),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
let packages = this.communityPackagesService.matchPackagesWithUpdates(installedPackages, pendingUpdates);
|
|
62
|
+
try {
|
|
63
|
+
if (this.communityPackagesService.hasMissingPackages) {
|
|
64
|
+
packages = this.communityPackagesService.matchMissingPackages(packages);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
}
|
|
69
|
+
return packages;
|
|
70
|
+
}
|
|
71
|
+
async install(args, user, presentation) {
|
|
72
|
+
const { name, verify, version } = args;
|
|
73
|
+
if (!name) {
|
|
74
|
+
throw new bad_request_error_1.BadRequestError(PACKAGE_NAME_NOT_PROVIDED);
|
|
75
|
+
}
|
|
76
|
+
if (version && !(0, semver_1.valid)(version)) {
|
|
77
|
+
throw new bad_request_error_1.BadRequestError(`Invalid version: ${version}`);
|
|
78
|
+
}
|
|
79
|
+
let checksum;
|
|
80
|
+
if (verify) {
|
|
81
|
+
checksum = this.communityNodeTypesService.findVetted(name)?.checksum;
|
|
82
|
+
if (!checksum) {
|
|
83
|
+
throw new bad_request_error_1.BadRequestError(`Package ${name} is not vetted for installation`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = this.communityPackagesService.parseNpmPackageName(name);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new bad_request_error_1.BadRequestError(error instanceof Error ? error.message : 'Failed to parse package name');
|
|
92
|
+
}
|
|
93
|
+
if (parsed.packageName === constants_1.STARTER_TEMPLATE_NAME) {
|
|
94
|
+
const templateMessage = presentation === 'ui'
|
|
95
|
+
? [
|
|
96
|
+
`Package "${parsed.packageName}" is only a template`,
|
|
97
|
+
'Please enter an actual package to install',
|
|
98
|
+
].join('.')
|
|
99
|
+
: `Package "${parsed.packageName}" is only a template. Please enter an actual package to install`;
|
|
100
|
+
throw new bad_request_error_1.BadRequestError(templateMessage);
|
|
101
|
+
}
|
|
102
|
+
const isInstalled = await this.communityPackagesService.isPackageInstalled(parsed.packageName);
|
|
103
|
+
const hasLoaded = this.communityPackagesService.hasPackageLoaded(name);
|
|
104
|
+
if (isInstalled && hasLoaded) {
|
|
105
|
+
const alreadyMessage = presentation === 'ui'
|
|
106
|
+
? [
|
|
107
|
+
`Package "${parsed.packageName}" is already installed`,
|
|
108
|
+
'To update it, click the corresponding button in the UI',
|
|
109
|
+
].join('.')
|
|
110
|
+
: `Package "${parsed.packageName}" is already installed`;
|
|
111
|
+
throw new bad_request_error_1.BadRequestError(alreadyMessage);
|
|
112
|
+
}
|
|
113
|
+
const packageStatus = await this.communityPackagesService.checkNpmPackageStatus(name);
|
|
114
|
+
if (packageStatus.status !== 'OK') {
|
|
115
|
+
throw new bad_request_error_1.BadRequestError(`Package "${name}" is banned so it cannot be installed`);
|
|
116
|
+
}
|
|
117
|
+
const packageVersion = version ?? parsed.version;
|
|
118
|
+
let installedPackage;
|
|
119
|
+
try {
|
|
120
|
+
installedPackage = await this.communityPackagesService.installPackage(parsed.packageName, packageVersion, checksum);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const errorMessage = error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON;
|
|
124
|
+
this.eventService.emit('community-package-installed', {
|
|
125
|
+
user,
|
|
126
|
+
inputString: name,
|
|
127
|
+
packageName: parsed.packageName,
|
|
128
|
+
success: false,
|
|
129
|
+
packageVersion,
|
|
130
|
+
failureReason: errorMessage,
|
|
131
|
+
});
|
|
132
|
+
let message = [`Error loading package "${name}" `, errorMessage].join(':');
|
|
133
|
+
if (error instanceof Error && error.cause instanceof Error) {
|
|
134
|
+
message += `\nCause: ${error.cause.message}`;
|
|
135
|
+
}
|
|
136
|
+
const clientError = error instanceof Error ? isCommunityPackageInstallClientError(error) : false;
|
|
137
|
+
throw new (clientError ? bad_request_error_1.BadRequestError : internal_server_error_1.InternalServerError)(message);
|
|
138
|
+
}
|
|
139
|
+
if (!hasLoaded)
|
|
140
|
+
this.communityPackagesService.removePackageFromMissingList(name);
|
|
141
|
+
installedPackage.installedNodes.forEach((node) => {
|
|
142
|
+
this.push.broadcast({
|
|
143
|
+
type: 'reloadNodeType',
|
|
144
|
+
data: {
|
|
145
|
+
name: node.type,
|
|
146
|
+
version: node.latestVersion,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
this.eventService.emit('community-package-installed', {
|
|
151
|
+
user,
|
|
152
|
+
inputString: name,
|
|
153
|
+
packageName: parsed.packageName,
|
|
154
|
+
success: true,
|
|
155
|
+
packageVersion,
|
|
156
|
+
packageNodeNames: installedPackage.installedNodes.map((node) => node.name),
|
|
157
|
+
packageAuthor: installedPackage.authorName,
|
|
158
|
+
packageAuthorEmail: installedPackage.authorEmail,
|
|
159
|
+
});
|
|
160
|
+
return installedPackage;
|
|
161
|
+
}
|
|
162
|
+
async update(args, user, whenMissing) {
|
|
163
|
+
const { name, version, checksum } = args;
|
|
164
|
+
if (!name) {
|
|
165
|
+
throw new bad_request_error_1.BadRequestError(PACKAGE_NAME_NOT_PROVIDED);
|
|
166
|
+
}
|
|
167
|
+
if (version && !(0, semver_1.valid)(version)) {
|
|
168
|
+
throw new bad_request_error_1.BadRequestError(`Invalid version: ${version}`);
|
|
169
|
+
}
|
|
170
|
+
const previouslyInstalledPackage = await this.communityPackagesService.findInstalledPackage(name);
|
|
171
|
+
if (!previouslyInstalledPackage) {
|
|
172
|
+
if (whenMissing === 'notFound') {
|
|
173
|
+
throw new not_found_error_1.NotFoundError(PACKAGE_NOT_INSTALLED);
|
|
174
|
+
}
|
|
175
|
+
throw new bad_request_error_1.BadRequestError(PACKAGE_NOT_INSTALLED);
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const newInstalledPackage = await this.communityPackagesService.updatePackage(this.communityPackagesService.parseNpmPackageName(name).packageName, previouslyInstalledPackage, version, checksum);
|
|
179
|
+
previouslyInstalledPackage.installedNodes.forEach((node) => {
|
|
180
|
+
this.push.broadcast({
|
|
181
|
+
type: 'removeNodeType',
|
|
182
|
+
data: {
|
|
183
|
+
name: node.type,
|
|
184
|
+
version: node.latestVersion,
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
newInstalledPackage.installedNodes.forEach((node) => {
|
|
189
|
+
this.push.broadcast({
|
|
190
|
+
type: 'reloadNodeType',
|
|
191
|
+
data: {
|
|
192
|
+
name: node.type,
|
|
193
|
+
version: node.latestVersion,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
this.eventService.emit('community-package-updated', {
|
|
198
|
+
user,
|
|
199
|
+
packageName: name,
|
|
200
|
+
packageVersionCurrent: previouslyInstalledPackage.installedVersion,
|
|
201
|
+
packageVersionNew: newInstalledPackage.installedVersion,
|
|
202
|
+
packageNodeNames: newInstalledPackage.installedNodes.map((n) => n.name),
|
|
203
|
+
packageAuthor: newInstalledPackage.authorName,
|
|
204
|
+
packageAuthorEmail: newInstalledPackage.authorEmail,
|
|
205
|
+
});
|
|
206
|
+
return newInstalledPackage;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
previouslyInstalledPackage.installedNodes.forEach((node) => {
|
|
210
|
+
this.push.broadcast({
|
|
211
|
+
type: 'removeNodeType',
|
|
212
|
+
data: {
|
|
213
|
+
name: node.type,
|
|
214
|
+
version: node.latestVersion,
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
const message = [
|
|
219
|
+
`Error updating package "${name}"`,
|
|
220
|
+
error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON,
|
|
221
|
+
].join(':');
|
|
222
|
+
throw new internal_server_error_1.InternalServerError(message, error);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async uninstall(packageName, user, whenMissing) {
|
|
226
|
+
if (!packageName) {
|
|
227
|
+
throw new bad_request_error_1.BadRequestError(PACKAGE_NAME_NOT_PROVIDED);
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
this.communityPackagesService.parseNpmPackageName(packageName);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const message = error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON;
|
|
234
|
+
throw new bad_request_error_1.BadRequestError(message);
|
|
235
|
+
}
|
|
236
|
+
const installedPackage = await this.communityPackagesService.findInstalledPackage(packageName);
|
|
237
|
+
if (!installedPackage) {
|
|
238
|
+
if (whenMissing === 'notFound') {
|
|
239
|
+
throw new not_found_error_1.NotFoundError(PACKAGE_NOT_INSTALLED);
|
|
240
|
+
}
|
|
241
|
+
throw new bad_request_error_1.BadRequestError(PACKAGE_NOT_INSTALLED);
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
await this.communityPackagesService.removePackage(packageName, installedPackage);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
const message = [
|
|
248
|
+
`Error removing package "${packageName}"`,
|
|
249
|
+
error instanceof Error ? error.message : constants_1.UNKNOWN_FAILURE_REASON,
|
|
250
|
+
].join(':');
|
|
251
|
+
throw new internal_server_error_1.InternalServerError(message, error);
|
|
252
|
+
}
|
|
253
|
+
installedPackage.installedNodes.forEach((node) => {
|
|
254
|
+
this.push.broadcast({
|
|
255
|
+
type: 'removeNodeType',
|
|
256
|
+
data: {
|
|
257
|
+
name: node.type,
|
|
258
|
+
version: node.latestVersion,
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
this.eventService.emit('community-package-deleted', {
|
|
263
|
+
user,
|
|
264
|
+
packageName,
|
|
265
|
+
packageVersion: installedPackage.installedVersion,
|
|
266
|
+
packageNodeNames: installedPackage.installedNodes.map((node) => node.name),
|
|
267
|
+
packageAuthor: installedPackage.authorName,
|
|
268
|
+
packageAuthorEmail: installedPackage.authorEmail,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
exports.CommunityPackagesLifecycleService = CommunityPackagesLifecycleService;
|
|
273
|
+
exports.CommunityPackagesLifecycleService = CommunityPackagesLifecycleService = __decorate([
|
|
274
|
+
(0, di_1.Service)(),
|
|
275
|
+
__metadata("design:paramtypes", [backend_common_1.Logger,
|
|
276
|
+
push_1.Push,
|
|
277
|
+
community_packages_service_1.CommunityPackagesService,
|
|
278
|
+
event_service_1.EventService,
|
|
279
|
+
community_node_types_service_1.CommunityNodeTypesService,
|
|
280
|
+
n8n_core_1.InstanceSettings])
|
|
281
|
+
], CommunityPackagesLifecycleService);
|
|
282
|
+
//# sourceMappingURL=community-packages.lifecycle.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community-packages.lifecycle.service.js","sourceRoot":"","sources":["../../../src/modules/community-packages/community-packages.lifecycle.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -138,15 +138,15 @@ let CommunityPackagesService = class CommunityPackagesService {
|
|
|
138
138
|
}
|
|
139
139
|
})
|
|
140
140
|
.filter((i) => i !== undefined);
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
const
|
|
144
|
-
if (missingPackagesList.includes(
|
|
145
|
-
|
|
141
|
+
const packages = [];
|
|
142
|
+
for (const installedPackage of installedPackages) {
|
|
143
|
+
const pkg = { ...installedPackage };
|
|
144
|
+
if (missingPackagesList.includes(pkg.packageName)) {
|
|
145
|
+
pkg.failedLoading = true;
|
|
146
146
|
}
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
return
|
|
147
|
+
packages.push(pkg);
|
|
148
|
+
}
|
|
149
|
+
return packages;
|
|
150
150
|
}
|
|
151
151
|
async checkNpmPackageStatus(packageName) {
|
|
152
152
|
const N8N_BACKEND_SERVICE_URL = 'https://api.n8n.io/api/package';
|