@atom8n/n8n 2.4.7 → 2.5.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.
Files changed (231) hide show
  1. package/dist/build.tsbuildinfo +1 -1
  2. package/dist/chat/chat-service.types.d.ts +6 -6
  3. package/dist/commands/execute-batch.d.ts +2 -2
  4. package/dist/commands/execute.js +0 -0
  5. package/dist/commands/import/credentials.d.ts +2 -2
  6. package/dist/commands/import/credentials.js +0 -0
  7. package/dist/commands/import/workflow.d.ts +2 -2
  8. package/dist/commands/ldap/reset.d.ts +2 -2
  9. package/dist/commands/mcp.d.ts +23 -0
  10. package/dist/commands/mcp.js +315 -0
  11. package/dist/commands/run.d.ts +23 -0
  12. package/dist/commands/run.js +162 -0
  13. package/dist/controllers/annotation-tags.controller.ee.d.ts +1 -1
  14. package/dist/controllers/cli.controller.d.ts +26 -0
  15. package/dist/controllers/cli.controller.js +334 -0
  16. package/dist/controllers/orchestration.controller.js +0 -0
  17. package/dist/controllers/users.controller.d.ts +1 -1
  18. package/dist/environments.ee/source-control/source-control-status.service.ee.d.ts +2 -2
  19. package/dist/environments.ee/source-control/source-control.controller.ee.d.ts +4 -4
  20. package/dist/environments.ee/source-control/source-control.service.ee.d.ts +2 -2
  21. package/dist/environments.ee/source-control/types/source-control-set-branch.js +0 -0
  22. package/dist/eventbus/event-message-classes/index.js +0 -0
  23. package/dist/events/relays/workflow-failure-notification.event-relay.d.ts +13 -0
  24. package/dist/events/relays/workflow-failure-notification.event-relay.js +77 -0
  25. package/dist/executions/execution-data/types.d.ts +17 -0
  26. package/dist/executions/execution-data/types.js +2 -0
  27. package/dist/executions/failed-run-factory.d.ts +4 -0
  28. package/dist/executions/failed-run-factory.js +71 -0
  29. package/dist/index.d.ts +2 -1
  30. package/dist/index.js +8 -0
  31. package/dist/interfaces.d.ts +1 -1
  32. package/dist/license.js +1 -1
  33. package/dist/middlewares/webview-frame-options.d.ts +2 -0
  34. package/dist/middlewares/webview-frame-options.js +22 -0
  35. package/dist/modules/chat-hub/chat-hub-extractor.d.ts +22 -0
  36. package/dist/modules/chat-hub/chat-hub-extractor.js +63 -0
  37. package/dist/modules/dynamic-credentials.ee/credential-resolvers/storage/dynamic-credential-user-entry-storage.d.ts +11 -0
  38. package/dist/modules/dynamic-credentials.ee/credential-resolvers/storage/dynamic-credential-user-entry-storage.js +58 -0
  39. package/dist/modules/dynamic-credentials.ee/database/entities/dynamic-credential-user-entry.d.ts +12 -0
  40. package/dist/modules/dynamic-credentials.ee/database/entities/dynamic-credential-user-entry.js +64 -0
  41. package/dist/modules/dynamic-credentials.ee/database/repositories/dynamic-credential-user-entry.repository.d.ts +5 -0
  42. package/dist/modules/dynamic-credentials.ee/database/repositories/dynamic-credential-user-entry.repository.js +25 -0
  43. package/dist/modules/dynamic-credentials.ee/dynamic-credentials.config.d.ts +5 -0
  44. package/dist/modules/dynamic-credentials.ee/dynamic-credentials.config.js +36 -0
  45. package/dist/modules/dynamic-credentials.ee/services/dynamic-credential-cors.service.d.ts +12 -0
  46. package/dist/modules/dynamic-credentials.ee/services/dynamic-credential-cors.service.js +69 -0
  47. package/dist/modules/dynamic-credentials.ee/services/resolver-config-expression.service.d.ts +7 -0
  48. package/dist/modules/dynamic-credentials.ee/services/resolver-config-expression.service.js +46 -0
  49. package/dist/modules/insights/database/entities/insights-metadata.js +1 -1
  50. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js +4 -1
  51. package/dist/modules/insights/database/repositories/insights-by-period.repository.d.ts +1 -1
  52. package/dist/modules/insights/insights.module.d.ts +1 -1
  53. package/dist/modules/insights/insights.service.d.ts +1 -1
  54. package/dist/modules/log-streaming.ee/database/entities/event-destination.entity.d.ts +6 -0
  55. package/dist/modules/log-streaming.ee/database/entities/event-destination.entity.js +28 -0
  56. package/dist/modules/log-streaming.ee/database/entities/index.d.ts +1 -0
  57. package/dist/modules/log-streaming.ee/database/entities/index.js +5 -0
  58. package/dist/modules/log-streaming.ee/database/repositories/event-destination.repository.d.ts +5 -0
  59. package/dist/modules/log-streaming.ee/database/repositories/event-destination.repository.js +25 -0
  60. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-from-db.d.ts +4 -0
  61. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-from-db.js +24 -0
  62. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-sentry.ee.d.ts +17 -0
  63. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-sentry.ee.js +131 -0
  64. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-syslog.ee.d.ts +22 -0
  65. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-syslog.ee.js +116 -0
  66. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-webhook.ee.d.ts +35 -0
  67. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination-webhook.ee.js +328 -0
  68. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination.ee.d.ts +28 -0
  69. package/dist/modules/log-streaming.ee/destinations/message-event-bus-destination.ee.js +74 -0
  70. package/dist/modules/log-streaming.ee/log-streaming-destination.service.d.ts +32 -0
  71. package/dist/modules/log-streaming.ee/log-streaming-destination.service.js +175 -0
  72. package/dist/modules/log-streaming.ee/log-streaming.controller.d.ts +15 -0
  73. package/dist/modules/log-streaming.ee/log-streaming.controller.js +149 -0
  74. package/dist/modules/log-streaming.ee/log-streaming.module.d.ts +5 -0
  75. package/dist/modules/log-streaming.ee/log-streaming.module.js +66 -0
  76. package/dist/modules/mcp/mcp-oauth.helpers.js +0 -0
  77. package/dist/modules/mcp/mcp.oauth-clients.controller.js +0 -0
  78. package/dist/modules/mcp/tools/execute-workflow.tool.d.ts +10 -10
  79. package/dist/modules/mcp/tools/schemas.d.ts +10 -10
  80. package/dist/modules/source-control.ee/constants.d.ts +17 -0
  81. package/dist/modules/source-control.ee/constants.js +22 -0
  82. package/dist/modules/source-control.ee/middleware/source-control-enabled-middleware.ee.d.ts +2 -0
  83. package/dist/modules/source-control.ee/middleware/source-control-enabled-middleware.ee.js +18 -0
  84. package/dist/modules/source-control.ee/source-control-export.service.ee.d.ts +37 -0
  85. package/dist/modules/source-control.ee/source-control-export.service.ee.js +426 -0
  86. package/dist/modules/source-control.ee/source-control-git.service.ee.d.ts +59 -0
  87. package/dist/modules/source-control.ee/source-control-git.service.ee.js +427 -0
  88. package/dist/modules/source-control.ee/source-control-helper.ee.d.ts +49 -0
  89. package/dist/modules/source-control.ee/source-control-helper.ee.js +241 -0
  90. package/dist/modules/source-control.ee/source-control-import.service.ee.d.ts +110 -0
  91. package/dist/modules/source-control.ee/source-control-import.service.ee.js +957 -0
  92. package/dist/modules/source-control.ee/source-control-preferences.service.ee.d.ts +46 -0
  93. package/dist/modules/source-control.ee/source-control-preferences.service.ee.js +309 -0
  94. package/dist/modules/source-control.ee/source-control-resource-helper.d.ts +4 -0
  95. package/dist/modules/source-control.ee/source-control-resource-helper.js +20 -0
  96. package/dist/modules/source-control.ee/source-control-scoped.service.d.ts +17 -0
  97. package/dist/modules/source-control.ee/source-control-scoped.service.js +134 -0
  98. package/dist/modules/source-control.ee/source-control-status.service.ee.d.ts +90 -0
  99. package/dist/modules/source-control.ee/source-control-status.service.ee.js +596 -0
  100. package/dist/modules/source-control.ee/source-control.config.d.ts +3 -0
  101. package/dist/modules/source-control.ee/source-control.config.js +26 -0
  102. package/dist/modules/source-control.ee/source-control.controller.ee.d.ts +157 -0
  103. package/dist/modules/source-control.ee/source-control.controller.ee.js +347 -0
  104. package/dist/modules/source-control.ee/source-control.module.d.ts +4 -0
  105. package/dist/modules/source-control.ee/source-control.module.js +59 -0
  106. package/dist/modules/source-control.ee/source-control.service.ee.d.ts +125 -0
  107. package/dist/modules/source-control.ee/source-control.service.ee.js +466 -0
  108. package/dist/modules/source-control.ee/types/export-result.d.ts +10 -0
  109. package/dist/modules/source-control.ee/types/export-result.js +2 -0
  110. package/dist/modules/source-control.ee/types/exportable-credential.d.ts +14 -0
  111. package/dist/modules/source-control.ee/types/exportable-credential.js +2 -0
  112. package/dist/modules/source-control.ee/types/exportable-folders.d.ts +11 -0
  113. package/dist/modules/source-control.ee/types/exportable-folders.js +2 -0
  114. package/dist/modules/source-control.ee/types/exportable-project.d.ts +17 -0
  115. package/dist/modules/source-control.ee/types/exportable-project.js +2 -0
  116. package/dist/modules/source-control.ee/types/exportable-tags.d.ts +5 -0
  117. package/dist/modules/source-control.ee/types/exportable-tags.js +2 -0
  118. package/dist/modules/source-control.ee/types/exportable-variable.d.ts +7 -0
  119. package/dist/modules/source-control.ee/types/exportable-variable.js +2 -0
  120. package/dist/modules/source-control.ee/types/exportable-workflow.d.ts +14 -0
  121. package/dist/modules/source-control.ee/types/exportable-workflow.js +2 -0
  122. package/dist/modules/source-control.ee/types/import-result.d.ts +20 -0
  123. package/dist/modules/source-control.ee/types/import-result.js +2 -0
  124. package/dist/modules/source-control.ee/types/key-pair-type.d.ts +1 -0
  125. package/dist/modules/source-control.ee/types/key-pair-type.js +2 -0
  126. package/dist/modules/source-control.ee/types/key-pair.d.ts +4 -0
  127. package/dist/modules/source-control.ee/types/key-pair.js +2 -0
  128. package/dist/modules/source-control.ee/types/requests.d.ts +21 -0
  129. package/dist/modules/source-control.ee/types/requests.js +2 -0
  130. package/dist/modules/source-control.ee/types/resource-owner.d.ts +17 -0
  131. package/dist/modules/source-control.ee/types/resource-owner.js +2 -0
  132. package/dist/modules/source-control.ee/types/source-control-commit.d.ts +3 -0
  133. package/dist/modules/source-control.ee/types/source-control-commit.js +20 -0
  134. package/dist/modules/source-control.ee/types/source-control-context.d.ts +7 -0
  135. package/dist/modules/source-control.ee/types/source-control-context.js +16 -0
  136. package/dist/modules/source-control.ee/types/source-control-disconnect.d.ts +3 -0
  137. package/dist/modules/source-control.ee/types/source-control-disconnect.js +21 -0
  138. package/dist/modules/source-control.ee/types/source-control-generate-key-pair.d.ts +4 -0
  139. package/dist/modules/source-control.ee/types/source-control-generate-key-pair.js +21 -0
  140. package/dist/modules/source-control.ee/types/source-control-get-status.d.ts +10 -0
  141. package/dist/modules/source-control.ee/types/source-control-get-status.js +42 -0
  142. package/dist/modules/source-control.ee/types/source-control-preferences.d.ts +17 -0
  143. package/dist/modules/source-control.ee/types/source-control-preferences.js +88 -0
  144. package/dist/modules/source-control.ee/types/source-control-push.d.ts +3 -0
  145. package/dist/modules/source-control.ee/types/source-control-push.js +21 -0
  146. package/dist/modules/source-control.ee/types/source-control-set-branch.d.ts +3 -0
  147. package/dist/modules/source-control.ee/types/source-control-set-branch.js +20 -0
  148. package/dist/modules/source-control.ee/types/source-control-set-read-only.d.ts +3 -0
  149. package/dist/modules/source-control.ee/types/source-control-set-read-only.js +20 -0
  150. package/dist/modules/source-control.ee/types/source-control-stage.d.ts +5 -0
  151. package/dist/modules/source-control.ee/types/source-control-stage.js +31 -0
  152. package/dist/modules/source-control.ee/types/source-control-workflow-version-id.d.ts +12 -0
  153. package/dist/modules/source-control.ee/types/source-control-workflow-version-id.js +2 -0
  154. package/dist/modules/sso-oidc/constants.d.ts +3 -0
  155. package/dist/modules/sso-oidc/constants.js +6 -0
  156. package/dist/modules/sso-oidc/oidc.controller.ee.d.ts +23 -0
  157. package/dist/modules/sso-oidc/oidc.controller.ee.js +123 -0
  158. package/dist/modules/sso-oidc/oidc.service.ee.d.ts +56 -0
  159. package/dist/modules/sso-oidc/oidc.service.ee.js +468 -0
  160. package/dist/modules/sso-oidc/sso-oidc.module.d.ts +4 -0
  161. package/dist/modules/sso-oidc/sso-oidc.module.js +55 -0
  162. package/dist/modules/sso-saml/constants.d.ts +3 -0
  163. package/dist/modules/sso-saml/constants.js +6 -0
  164. package/dist/modules/sso-saml/errors/invalid-saml-metadata-url.error.d.ts +4 -0
  165. package/dist/modules/sso-saml/errors/invalid-saml-metadata-url.error.js +10 -0
  166. package/dist/modules/sso-saml/errors/invalid-saml-metadata.error.d.ts +4 -0
  167. package/dist/modules/sso-saml/errors/invalid-saml-metadata.error.js +10 -0
  168. package/dist/modules/sso-saml/middleware/saml-enabled-middleware.d.ts +3 -0
  169. package/dist/modules/sso-saml/middleware/saml-enabled-middleware.js +22 -0
  170. package/dist/modules/sso-saml/saml-helpers.d.ts +19 -0
  171. package/dist/modules/sso-saml/saml-helpers.js +129 -0
  172. package/dist/modules/sso-saml/saml-validator.d.ts +16 -0
  173. package/dist/modules/sso-saml/saml-validator.js +129 -0
  174. package/dist/modules/sso-saml/saml.controller.ee.d.ts +50 -0
  175. package/dist/modules/sso-saml/saml.controller.ee.js +227 -0
  176. package/dist/modules/sso-saml/saml.service.ee.d.ts +52 -0
  177. package/dist/modules/sso-saml/saml.service.ee.js +462 -0
  178. package/dist/modules/sso-saml/schema/metadata-exchange.xsd.d.ts +2 -0
  179. package/dist/modules/sso-saml/schema/metadata-exchange.xsd.js +118 -0
  180. package/dist/modules/sso-saml/schema/oasis-200401-wss-wssecurity-secext-1.0.xsd.d.ts +2 -0
  181. package/dist/modules/sso-saml/schema/oasis-200401-wss-wssecurity-secext-1.0.xsd.js +201 -0
  182. package/dist/modules/sso-saml/schema/oasis-200401-wss-wssecurity-utility-1.0.xsd.d.ts +2 -0
  183. package/dist/modules/sso-saml/schema/oasis-200401-wss-wssecurity-utility-1.0.xsd.js +114 -0
  184. package/dist/modules/sso-saml/schema/saml-schema-assertion-2.0.xsd.d.ts +2 -0
  185. package/dist/modules/sso-saml/schema/saml-schema-assertion-2.0.xsd.js +289 -0
  186. package/dist/modules/sso-saml/schema/saml-schema-metadata-2.0.xsd.d.ts +2 -0
  187. package/dist/modules/sso-saml/schema/saml-schema-metadata-2.0.xsd.js +344 -0
  188. package/dist/modules/sso-saml/schema/saml-schema-protocol-2.0.xsd.d.ts +2 -0
  189. package/dist/modules/sso-saml/schema/saml-schema-protocol-2.0.xsd.js +308 -0
  190. package/dist/modules/sso-saml/schema/ws-addr.xsd.d.ts +2 -0
  191. package/dist/modules/sso-saml/schema/ws-addr.xsd.js +143 -0
  192. package/dist/modules/sso-saml/schema/ws-authorization.xsd.d.ts +2 -0
  193. package/dist/modules/sso-saml/schema/ws-authorization.xsd.js +151 -0
  194. package/dist/modules/sso-saml/schema/ws-federation.xsd.d.ts +2 -0
  195. package/dist/modules/sso-saml/schema/ws-federation.xsd.js +476 -0
  196. package/dist/modules/sso-saml/schema/ws-securitypolicy-1.2.xsd.d.ts +2 -0
  197. package/dist/modules/sso-saml/schema/ws-securitypolicy-1.2.xsd.js +1211 -0
  198. package/dist/modules/sso-saml/schema/xenc-schema.xsd.d.ts +2 -0
  199. package/dist/modules/sso-saml/schema/xenc-schema.xsd.js +151 -0
  200. package/dist/modules/sso-saml/schema/xml.xsd.d.ts +2 -0
  201. package/dist/modules/sso-saml/schema/xml.xsd.js +123 -0
  202. package/dist/modules/sso-saml/schema/xmldsig-core-schema.xsd.d.ts +2 -0
  203. package/dist/modules/sso-saml/schema/xmldsig-core-schema.xsd.js +324 -0
  204. package/dist/modules/sso-saml/service-provider.ee.d.ts +6 -0
  205. package/dist/modules/sso-saml/service-provider.ee.js +44 -0
  206. package/dist/modules/sso-saml/sso-saml.module.d.ts +4 -0
  207. package/dist/modules/sso-saml/sso-saml.module.js +55 -0
  208. package/dist/modules/sso-saml/types.d.ts +4 -0
  209. package/dist/modules/sso-saml/types.js +2 -0
  210. package/dist/modules/sso-saml/views/init-sso-post.d.ts +2 -0
  211. package/dist/modules/sso-saml/views/init-sso-post.js +16 -0
  212. package/dist/node-lib.d.ts +10 -0
  213. package/dist/node-lib.js +137 -0
  214. package/dist/push/index.d.ts +1 -1
  215. package/dist/server.d.ts +1 -0
  216. package/dist/server.js +1 -0
  217. package/dist/services/cors-service.d.ts +7 -0
  218. package/dist/services/cors-service.js +50 -0
  219. package/dist/services/static-auth-service.d.ts +4 -0
  220. package/dist/services/static-auth-service.js +29 -0
  221. package/dist/sso.ee/saml/schema/metadata-exchange.xsd.js +0 -0
  222. package/dist/task-runners/task-broker/errors/task-runner-accept-timeout.error.js +0 -0
  223. package/dist/typecheck.tsbuildinfo +1 -0
  224. package/dist/user-management/email/templates/workflow-failure.handlebars +211 -0
  225. package/dist/utils/cors.util.d.ts +2 -0
  226. package/dist/utils/cors.util.js +17 -0
  227. package/dist/webhooks/waiting-forms.js +3 -3
  228. package/dist/webhooks/waiting-webhooks.js +2 -0
  229. package/dist/workflows/workflow.service.d.ts +2 -2
  230. package/dist/workflows/workflows.controller.d.ts +6 -6
  231. package/package.json +22 -21
@@ -0,0 +1,125 @@
1
+ import type { PullWorkFolderRequestDto, PushWorkFolderRequestDto, SourceControlledFile } from '@n8n/api-types';
2
+ import { Logger } from '@n8n/backend-common';
3
+ import { type User } from '@n8n/db';
4
+ import type { PushResult } from 'simple-git';
5
+ import { SourceControlExportService } from './source-control-export.service.ee';
6
+ import { SourceControlGitService } from './source-control-git.service.ee';
7
+ import { SourceControlImportService } from './source-control-import.service.ee';
8
+ import { SourceControlPreferencesService } from './source-control-preferences.service.ee';
9
+ import { SourceControlScopedService } from './source-control-scoped.service';
10
+ import { SourceControlStatusService } from './source-control-status.service.ee';
11
+ import type { ImportResult } from './types/import-result';
12
+ import type { SourceControlGetStatus } from './types/source-control-get-status';
13
+ import type { SourceControlPreferences } from './types/source-control-preferences';
14
+ import { EventService } from '../../events/event.service';
15
+ import { IWorkflowToImport } from '../../interfaces';
16
+ export declare class SourceControlService {
17
+ private readonly logger;
18
+ private gitService;
19
+ private sourceControlPreferencesService;
20
+ private sourceControlExportService;
21
+ private sourceControlImportService;
22
+ private sourceControlScopedService;
23
+ private readonly eventService;
24
+ private readonly sourceControlStatusService;
25
+ private sshKeyName;
26
+ private sshFolder;
27
+ private gitFolder;
28
+ private isReloading;
29
+ constructor(logger: Logger, gitService: SourceControlGitService, sourceControlPreferencesService: SourceControlPreferencesService, sourceControlExportService: SourceControlExportService, sourceControlImportService: SourceControlImportService, sourceControlScopedService: SourceControlScopedService, eventService: EventService, sourceControlStatusService: SourceControlStatusService);
30
+ start(): Promise<void>;
31
+ private isHostKeyVerificationError;
32
+ private refreshServiceState;
33
+ reloadConfiguration(): Promise<void>;
34
+ private initGitService;
35
+ sanityCheck(): Promise<void>;
36
+ disconnect(options?: {
37
+ keepKeyPair?: boolean;
38
+ }): Promise<SourceControlPreferences>;
39
+ initializeRepository(preferences: SourceControlPreferences, user: User): Promise<{
40
+ branches: string[];
41
+ currentBranch: string;
42
+ }>;
43
+ getBranches(): Promise<{
44
+ branches: string[];
45
+ currentBranch: string;
46
+ }>;
47
+ setBranch(branch: string): Promise<{
48
+ branches: string[];
49
+ currentBranch: string;
50
+ }>;
51
+ resetWorkfolder(): Promise<ImportResult | undefined>;
52
+ pushWorkfolder(user: User, options: PushWorkFolderRequestDto): Promise<{
53
+ statusCode: number;
54
+ pushResult: PushResult | undefined;
55
+ statusResult: SourceControlledFile[];
56
+ }>;
57
+ pullWorkfolder(user: User, options: PullWorkFolderRequestDto): Promise<{
58
+ statusCode: number;
59
+ statusResult: SourceControlledFile[];
60
+ }>;
61
+ getStatus(user: User, options: SourceControlGetStatus): Promise<{
62
+ status: "unknown" | "new" | "modified" | "deleted" | "created" | "renamed" | "conflicted" | "ignored" | "staged";
63
+ type: "tags" | "project" | "credential" | "file" | "workflow" | "variables" | "folders";
64
+ id: string;
65
+ name: string;
66
+ updatedAt: string;
67
+ file: string;
68
+ location: "local" | "remote";
69
+ conflict: boolean;
70
+ pushed?: boolean | undefined;
71
+ owner?: {
72
+ type: "personal" | "team";
73
+ projectId: string;
74
+ projectName: string;
75
+ } | undefined;
76
+ }[] | {
77
+ wfRemoteVersionIds: import("./types/source-control-workflow-version-id").SourceControlWorkflowVersionId[];
78
+ wfLocalVersionIds: import("./types/source-control-workflow-version-id").SourceControlWorkflowVersionId[];
79
+ wfMissingInLocal: import("./types/source-control-workflow-version-id").SourceControlWorkflowVersionId[];
80
+ wfMissingInRemote: import("./types/source-control-workflow-version-id").SourceControlWorkflowVersionId[];
81
+ wfModifiedInEither: import("./types/source-control-workflow-version-id").SourceControlWorkflowVersionId[];
82
+ credMissingInLocal: import("./types/exportable-credential").StatusExportableCredential[];
83
+ credMissingInRemote: import("./types/exportable-credential").StatusExportableCredential[];
84
+ credModifiedInEither: import("./types/exportable-credential").StatusExportableCredential[];
85
+ varMissingInLocal: import("./types/exportable-variable").ExportableVariable[];
86
+ varMissingInRemote: import("@n8n/db").Variables[];
87
+ varModifiedInEither: import("./types/exportable-variable").ExportableVariable[];
88
+ tagsMissingInLocal: import("@n8n/db").TagEntity[];
89
+ tagsMissingInRemote: import("@n8n/db").TagEntity[];
90
+ tagsModifiedInEither: import("@n8n/db").TagEntity[];
91
+ mappingsMissingInLocal: import("@n8n/db").WorkflowTagMapping[];
92
+ mappingsMissingInRemote: import("@n8n/db").WorkflowTagMapping[];
93
+ foldersMissingInLocal: import("./types/exportable-folders").ExportableFolder[];
94
+ foldersMissingInRemote: import("./types/exportable-folders").ExportableFolder[];
95
+ foldersModifiedInEither: import("./types/exportable-folders").ExportableFolder[];
96
+ projectsRemote: import("./types/exportable-project").ExportableProjectWithFileName[];
97
+ projectsLocal: import("./types/exportable-project").ExportableProjectWithFileName[];
98
+ projectsMissingInLocal: import("./types/exportable-project").ExportableProjectWithFileName[];
99
+ projectsMissingInRemote: import("./types/exportable-project").ExportableProjectWithFileName[];
100
+ projectsModifiedInEither: import("./types/exportable-project").ExportableProjectWithFileName[];
101
+ sourceControlledFiles: {
102
+ status: "unknown" | "new" | "modified" | "deleted" | "created" | "renamed" | "conflicted" | "ignored" | "staged";
103
+ type: "tags" | "project" | "credential" | "file" | "workflow" | "variables" | "folders";
104
+ id: string;
105
+ name: string;
106
+ updatedAt: string;
107
+ file: string;
108
+ location: "local" | "remote";
109
+ conflict: boolean;
110
+ pushed?: boolean | undefined;
111
+ owner?: {
112
+ type: "personal" | "team";
113
+ projectId: string;
114
+ projectName: string;
115
+ } | undefined;
116
+ }[];
117
+ }>;
118
+ setGitUserDetails(name?: string, email?: string): Promise<void>;
119
+ getRemoteFileEntity({ user, type, id, commit, }: {
120
+ user: User;
121
+ type: SourceControlledFile['type'];
122
+ id?: string;
123
+ commit?: string;
124
+ }): Promise<IWorkflowToImport>;
125
+ }
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.SourceControlService = void 0;
46
+ const backend_common_1 = require("@n8n/backend-common");
47
+ const decorators_1 = require("@n8n/decorators");
48
+ const di_1 = require("@n8n/di");
49
+ const fs_1 = require("fs");
50
+ const n8n_workflow_1 = require("n8n-workflow");
51
+ const path = __importStar(require("path"));
52
+ const constants_1 = require("./constants");
53
+ const source_control_export_service_ee_1 = require("./source-control-export.service.ee");
54
+ const source_control_git_service_ee_1 = require("./source-control-git.service.ee");
55
+ const source_control_helper_ee_1 = require("./source-control-helper.ee");
56
+ const source_control_import_service_ee_1 = require("./source-control-import.service.ee");
57
+ const source_control_preferences_service_ee_1 = require("./source-control-preferences.service.ee");
58
+ const source_control_resource_helper_1 = require("./source-control-resource-helper");
59
+ const source_control_scoped_service_1 = require("./source-control-scoped.service");
60
+ const source_control_status_service_ee_1 = require("./source-control-status.service.ee");
61
+ const source_control_context_1 = require("./types/source-control-context");
62
+ const bad_request_error_1 = require("../../errors/response-errors/bad-request.error");
63
+ const forbidden_error_1 = require("../../errors/response-errors/forbidden.error");
64
+ const event_service_1 = require("../../events/event.service");
65
+ let SourceControlService = class SourceControlService {
66
+ constructor(logger, gitService, sourceControlPreferencesService, sourceControlExportService, sourceControlImportService, sourceControlScopedService, eventService, sourceControlStatusService) {
67
+ this.logger = logger;
68
+ this.gitService = gitService;
69
+ this.sourceControlPreferencesService = sourceControlPreferencesService;
70
+ this.sourceControlExportService = sourceControlExportService;
71
+ this.sourceControlImportService = sourceControlImportService;
72
+ this.sourceControlScopedService = sourceControlScopedService;
73
+ this.eventService = eventService;
74
+ this.sourceControlStatusService = sourceControlStatusService;
75
+ this.isReloading = false;
76
+ const { gitFolder, sshFolder, sshKeyName } = sourceControlPreferencesService;
77
+ this.gitFolder = gitFolder;
78
+ this.sshFolder = sshFolder;
79
+ this.sshKeyName = sshKeyName;
80
+ }
81
+ async start() {
82
+ await this.refreshServiceState();
83
+ }
84
+ isHostKeyVerificationError(error) {
85
+ const message = error.message.toLowerCase();
86
+ return (message.includes('host key verification failed') ||
87
+ message.includes('host identification has changed') ||
88
+ message.includes('offending key'));
89
+ }
90
+ async refreshServiceState() {
91
+ this.gitService.resetService();
92
+ (0, source_control_helper_ee_1.sourceControlFoldersExistCheck)([this.gitFolder, this.sshFolder]);
93
+ await this.sourceControlPreferencesService.loadFromDbAndApplySourceControlPreferences();
94
+ if (this.sourceControlPreferencesService.isSourceControlLicensedAndEnabled()) {
95
+ await this.initGitService();
96
+ }
97
+ }
98
+ async reloadConfiguration() {
99
+ if (this.isReloading) {
100
+ this.logger.warn('Source control configuration reload already in progress');
101
+ return;
102
+ }
103
+ this.isReloading = true;
104
+ try {
105
+ this.logger.debug('Source control configuration changed, reloading from database');
106
+ const wasConnected = this.sourceControlPreferencesService.isSourceControlConnected();
107
+ await this.refreshServiceState();
108
+ const isNowConnected = this.sourceControlPreferencesService.isSourceControlConnected();
109
+ if (wasConnected && !isNowConnected) {
110
+ await this.sourceControlExportService.deleteRepositoryFolder();
111
+ this.logger.info('Cleaned up git repository folder after source control disconnect');
112
+ }
113
+ }
114
+ finally {
115
+ this.isReloading = false;
116
+ }
117
+ }
118
+ async initGitService() {
119
+ await this.gitService.initService({
120
+ sourceControlPreferences: this.sourceControlPreferencesService.getPreferences(),
121
+ gitFolder: this.gitFolder,
122
+ sshKeyName: this.sshKeyName,
123
+ sshFolder: this.sshFolder,
124
+ });
125
+ }
126
+ async sanityCheck() {
127
+ try {
128
+ const foldersExisted = (0, source_control_helper_ee_1.sourceControlFoldersExistCheck)([this.gitFolder, this.sshFolder], false);
129
+ if (!foldersExisted) {
130
+ throw new n8n_workflow_1.UserError('No folders exist');
131
+ }
132
+ if (!this.gitService.git) {
133
+ await this.initGitService();
134
+ }
135
+ const branches = await this.gitService.getCurrentBranch();
136
+ if (branches.current === '' ||
137
+ branches.current !==
138
+ this.sourceControlPreferencesService.sourceControlPreferences.branchName) {
139
+ throw new n8n_workflow_1.UserError('Branch is not set up correctly');
140
+ }
141
+ }
142
+ catch (error) {
143
+ throw new bad_request_error_1.BadRequestError('Source control is not properly set up, please disconnect and reconnect.');
144
+ }
145
+ }
146
+ async disconnect(options = {}) {
147
+ try {
148
+ const preferences = this.sourceControlPreferencesService.getPreferences();
149
+ await this.sourceControlPreferencesService.setPreferences({
150
+ connected: false,
151
+ branchName: '',
152
+ repositoryUrl: '',
153
+ connectionType: preferences.connectionType,
154
+ });
155
+ await this.sourceControlExportService.deleteRepositoryFolder();
156
+ if (preferences.connectionType === 'https') {
157
+ await this.sourceControlPreferencesService.deleteHttpsCredentials();
158
+ }
159
+ else if (!options.keepKeyPair) {
160
+ await this.sourceControlPreferencesService.deleteKeyPair();
161
+ }
162
+ await this.sourceControlPreferencesService.resetKnownHosts();
163
+ this.gitService.resetService();
164
+ return this.sourceControlPreferencesService.sourceControlPreferences;
165
+ }
166
+ catch (error) {
167
+ throw new n8n_workflow_1.UnexpectedError('Failed to disconnect from source control', { cause: error });
168
+ }
169
+ }
170
+ async initializeRepository(preferences, user) {
171
+ if (!this.gitService.git) {
172
+ await this.initGitService();
173
+ }
174
+ this.logger.debug('Initializing repository...');
175
+ await this.gitService.initRepository(preferences, user);
176
+ let getBranchesResult;
177
+ try {
178
+ getBranchesResult = await this.getBranches();
179
+ }
180
+ catch (error) {
181
+ if (error.message.includes('Warning: Permanently added')) {
182
+ this.logger.debug('Added repository host to the list of known hosts. Retrying...');
183
+ getBranchesResult = await this.getBranches();
184
+ }
185
+ else if (this.isHostKeyVerificationError(error)) {
186
+ throw new n8n_workflow_1.UserError("SSH host key verification failed. The remote server's key may have changed. " +
187
+ 'If this is expected (e.g., server migration), disconnect and reconnect from Source Control settings to reset the known hosts.');
188
+ }
189
+ else {
190
+ throw error;
191
+ }
192
+ }
193
+ if (getBranchesResult.branches.includes(preferences.branchName)) {
194
+ await this.gitService.setBranch(preferences.branchName);
195
+ }
196
+ else {
197
+ if (getBranchesResult.branches?.length === 0) {
198
+ try {
199
+ (0, fs_1.writeFileSync)(path.join(this.gitFolder, '/README.md'), constants_1.SOURCE_CONTROL_README);
200
+ await this.gitService.stage(new Set(['README.md']));
201
+ await this.gitService.commit('Initial commit');
202
+ await this.gitService.push({
203
+ branch: preferences.branchName,
204
+ force: true,
205
+ });
206
+ getBranchesResult = await this.getBranches();
207
+ await this.gitService.setBranch(preferences.branchName);
208
+ }
209
+ catch (fileError) {
210
+ this.logger.error(`Failed to create initial commit: ${fileError.message}`);
211
+ }
212
+ }
213
+ }
214
+ await this.sourceControlPreferencesService.setPreferences({
215
+ branchName: getBranchesResult.currentBranch,
216
+ connected: true,
217
+ });
218
+ return getBranchesResult;
219
+ }
220
+ async getBranches() {
221
+ if (!this.gitService.git) {
222
+ await this.initGitService();
223
+ }
224
+ await this.gitService.fetch();
225
+ return await this.gitService.getBranches();
226
+ }
227
+ async setBranch(branch) {
228
+ if (!this.gitService.git) {
229
+ await this.initGitService();
230
+ }
231
+ await this.sourceControlPreferencesService.setPreferences({
232
+ branchName: branch,
233
+ connected: branch?.length > 0,
234
+ });
235
+ return await this.gitService.setBranch(branch);
236
+ }
237
+ async resetWorkfolder() {
238
+ if (!this.gitService.git) {
239
+ await this.initGitService();
240
+ }
241
+ try {
242
+ await this.gitService.resetBranch();
243
+ await this.gitService.pull();
244
+ }
245
+ catch (error) {
246
+ this.logger.error(`Failed to reset workfolder: ${error.message}`);
247
+ throw new n8n_workflow_1.UserError('Unable to fetch updates from git - your folder might be out of sync. Try reconnecting from the Source Control settings page.');
248
+ }
249
+ return;
250
+ }
251
+ async pushWorkfolder(user, options) {
252
+ await this.sanityCheck();
253
+ if (this.sourceControlPreferencesService.isBranchReadOnly()) {
254
+ throw new bad_request_error_1.BadRequestError('Cannot push onto read-only branch.');
255
+ }
256
+ const context = new source_control_context_1.SourceControlContext(user);
257
+ let filesToPush = options.fileNames.map((file) => {
258
+ const normalizedPath = (0, source_control_helper_ee_1.normalizeAndValidateSourceControlledFilePath)(this.gitFolder, file.file);
259
+ return {
260
+ ...file,
261
+ file: normalizedPath,
262
+ };
263
+ });
264
+ const allowedResources = (await this.sourceControlStatusService.getStatus(user, {
265
+ direction: 'push',
266
+ verbose: false,
267
+ preferLocalVersion: true,
268
+ }));
269
+ if (!filesToPush.length) {
270
+ filesToPush = allowedResources;
271
+ }
272
+ if (filesToPush !== allowedResources &&
273
+ filesToPush.some((file) => !allowedResources.some((allowed) => {
274
+ return allowed.id === file.id && allowed.type === file.type;
275
+ }))) {
276
+ throw new forbidden_error_1.ForbiddenError('You are not allowed to push these changes');
277
+ }
278
+ let statusResult = filesToPush;
279
+ if (!options.force) {
280
+ const possibleConflicts = filesToPush?.filter((file) => file.conflict);
281
+ if (possibleConflicts?.length > 0) {
282
+ return {
283
+ statusCode: 409,
284
+ pushResult: undefined,
285
+ statusResult: filesToPush,
286
+ };
287
+ }
288
+ }
289
+ try {
290
+ const filesToBePushed = new Set();
291
+ const filesToBeDeleted = new Set();
292
+ filesToPush
293
+ .filter((f) => ['workflow', 'credential', 'project'].includes(f.type))
294
+ .forEach((e) => {
295
+ if (e.status !== 'deleted') {
296
+ filesToBePushed.add(e.file);
297
+ }
298
+ else {
299
+ filesToBeDeleted.add(e.file);
300
+ }
301
+ });
302
+ this.sourceControlExportService.rmFilesFromExportFolder(filesToBeDeleted);
303
+ const workflowsToBeExported = (0, source_control_resource_helper_1.getNonDeletedResources)(filesToPush, 'workflow');
304
+ await this.sourceControlExportService.exportWorkflowsToWorkFolder(workflowsToBeExported);
305
+ const credentialsToBeExported = (0, source_control_resource_helper_1.getNonDeletedResources)(filesToPush, 'credential');
306
+ const credentialExportResult = await this.sourceControlExportService.exportCredentialsToWorkFolder(credentialsToBeExported);
307
+ if (credentialExportResult.missingIds && credentialExportResult.missingIds.length > 0) {
308
+ credentialExportResult.missingIds.forEach((id) => {
309
+ filesToBePushed.delete(this.sourceControlExportService.getCredentialsPath(id));
310
+ statusResult = statusResult.filter((e) => e.file !== this.sourceControlExportService.getCredentialsPath(id));
311
+ });
312
+ }
313
+ const projectsToBeExported = (0, source_control_resource_helper_1.getNonDeletedResources)(filesToPush, 'project');
314
+ await this.sourceControlExportService.exportTeamProjectsToWorkFolder(projectsToBeExported);
315
+ filesToBePushed.add((0, source_control_helper_ee_1.getTagsPath)(this.gitFolder));
316
+ await this.sourceControlExportService.exportTagsToWorkFolder(context);
317
+ const folderChanges = (0, source_control_resource_helper_1.filterByType)(filesToPush, 'folders')[0];
318
+ if (folderChanges) {
319
+ filesToBePushed.add(folderChanges.file);
320
+ await this.sourceControlExportService.exportFoldersToWorkFolder(context);
321
+ }
322
+ const variablesChanges = (0, source_control_resource_helper_1.filterByType)(filesToPush, 'variables')[0];
323
+ if (variablesChanges) {
324
+ filesToBePushed.add(variablesChanges.file);
325
+ await this.sourceControlExportService.exportGlobalVariablesToWorkFolder();
326
+ }
327
+ await this.gitService.stage(filesToBePushed, filesToBeDeleted);
328
+ await this.gitService.commit(options.commitMessage ?? 'Updated Workfolder');
329
+ }
330
+ catch (error) {
331
+ this.logger.error('Failed to export or commit changes', { error });
332
+ try {
333
+ await this.gitService.resetBranch({ hard: true, target: 'HEAD' });
334
+ }
335
+ catch (resetError) {
336
+ this.logger.error('Failed to reset branch after export/commit error', {
337
+ error: resetError,
338
+ });
339
+ }
340
+ throw error;
341
+ }
342
+ const branchName = this.sourceControlPreferencesService.getBranchName();
343
+ let pushResult;
344
+ try {
345
+ pushResult = await this.gitService.push({
346
+ branch: branchName,
347
+ force: options.force ?? false,
348
+ });
349
+ statusResult.forEach((result) => (result.pushed = true));
350
+ }
351
+ catch (error) {
352
+ this.logger.error('Failed to push changes', { error });
353
+ try {
354
+ await this.gitService.resetBranch({ hard: true, target: `origin/${branchName}` });
355
+ }
356
+ catch (resetError) {
357
+ this.logger.error('Failed to reset branch after push error', { error: resetError });
358
+ }
359
+ throw error;
360
+ }
361
+ this.eventService.emit('source-control-user-finished-push-ui', (0, source_control_helper_ee_1.getTrackingInformationFromPostPushResult)(user.id, statusResult));
362
+ return {
363
+ statusCode: 200,
364
+ pushResult,
365
+ statusResult,
366
+ };
367
+ }
368
+ async pullWorkfolder(user, options) {
369
+ await this.sanityCheck();
370
+ const statusResult = (await this.sourceControlStatusService.getStatus(user, {
371
+ direction: 'pull',
372
+ verbose: false,
373
+ preferLocalVersion: false,
374
+ }));
375
+ if (options.force !== true) {
376
+ const possibleConflicts = statusResult.filter((file) => file.conflict || file.status === 'modified');
377
+ if (possibleConflicts?.length > 0) {
378
+ await this.gitService.resetBranch();
379
+ return {
380
+ statusCode: 409,
381
+ statusResult,
382
+ };
383
+ }
384
+ }
385
+ const projectsToBeImported = (0, source_control_resource_helper_1.getNonDeletedResources)(statusResult, 'project');
386
+ await this.sourceControlImportService.importTeamProjectsFromWorkFolder(projectsToBeImported, user.id);
387
+ const foldersToBeImported = (0, source_control_resource_helper_1.getNonDeletedResources)(statusResult, 'folders')[0];
388
+ if (foldersToBeImported) {
389
+ await this.sourceControlImportService.importFoldersFromWorkFolder(user, foldersToBeImported);
390
+ }
391
+ const workflowsToBeImported = (0, source_control_resource_helper_1.getNonDeletedResources)(statusResult, 'workflow');
392
+ await this.sourceControlImportService.importWorkflowFromWorkFolder(workflowsToBeImported, user.id);
393
+ const workflowsToBeDeleted = (0, source_control_resource_helper_1.getDeletedResources)(statusResult, 'workflow');
394
+ await this.sourceControlImportService.deleteWorkflowsNotInWorkfolder(user, workflowsToBeDeleted);
395
+ const credentialsToBeImported = (0, source_control_resource_helper_1.getNonDeletedResources)(statusResult, 'credential');
396
+ await this.sourceControlImportService.importCredentialsFromWorkFolder(credentialsToBeImported, user.id);
397
+ const credentialsToBeDeleted = (0, source_control_resource_helper_1.getDeletedResources)(statusResult, 'credential');
398
+ await this.sourceControlImportService.deleteCredentialsNotInWorkfolder(user, credentialsToBeDeleted);
399
+ const tagsToBeImported = (0, source_control_resource_helper_1.getNonDeletedResources)(statusResult, 'tags')[0];
400
+ if (tagsToBeImported) {
401
+ await this.sourceControlImportService.importTagsFromWorkFolder(tagsToBeImported);
402
+ }
403
+ const tagsToBeDeleted = (0, source_control_resource_helper_1.getDeletedResources)(statusResult, 'tags');
404
+ await this.sourceControlImportService.deleteTagsNotInWorkfolder(tagsToBeDeleted);
405
+ const variablesToBeImported = (0, source_control_resource_helper_1.getNonDeletedResources)(statusResult, 'variables')[0];
406
+ if (variablesToBeImported) {
407
+ await this.sourceControlImportService.importVariablesFromWorkFolder(variablesToBeImported);
408
+ }
409
+ const variablesToBeDeleted = (0, source_control_resource_helper_1.getDeletedResources)(statusResult, 'variables');
410
+ await this.sourceControlImportService.deleteVariablesNotInWorkfolder(variablesToBeDeleted);
411
+ const foldersToBeDeleted = (0, source_control_resource_helper_1.getDeletedResources)(statusResult, 'folders');
412
+ await this.sourceControlImportService.deleteFoldersNotInWorkfolder(foldersToBeDeleted);
413
+ const projectsToBeDeleted = (0, source_control_resource_helper_1.getDeletedResources)(statusResult, 'project');
414
+ await this.sourceControlImportService.deleteTeamProjectsNotInWorkfolder(projectsToBeDeleted);
415
+ this.eventService.emit('source-control-user-finished-pull-ui', (0, source_control_helper_ee_1.getTrackingInformationFromPullResult)(user.id, statusResult));
416
+ return {
417
+ statusCode: 200,
418
+ statusResult,
419
+ };
420
+ }
421
+ async getStatus(user, options) {
422
+ await this.sanityCheck();
423
+ return await this.sourceControlStatusService.getStatus(user, options);
424
+ }
425
+ async setGitUserDetails(name = constants_1.SOURCE_CONTROL_DEFAULT_NAME, email = constants_1.SOURCE_CONTROL_DEFAULT_EMAIL) {
426
+ await this.sanityCheck();
427
+ await this.gitService.setGitUserDetails(name, email);
428
+ }
429
+ async getRemoteFileEntity({ user, type, id, commit = 'HEAD', }) {
430
+ await this.sanityCheck();
431
+ const context = new source_control_context_1.SourceControlContext(user);
432
+ switch (type) {
433
+ case 'workflow': {
434
+ if (typeof id === 'undefined') {
435
+ throw new bad_request_error_1.BadRequestError('Workflow ID is required to fetch workflow content');
436
+ }
437
+ const authorizedWorkflows = await this.sourceControlScopedService.getWorkflowsInAdminProjectsFromContext(context, id);
438
+ if (authorizedWorkflows && authorizedWorkflows.length === 0) {
439
+ throw new forbidden_error_1.ForbiddenError(`You are not allowed to access workflow with id ${id}`);
440
+ }
441
+ const content = await this.gitService.getFileContent(`${constants_1.SOURCE_CONTROL_WORKFLOW_EXPORT_FOLDER}/${id}.json`, commit);
442
+ return (0, n8n_workflow_1.jsonParse)(content);
443
+ }
444
+ default:
445
+ throw new bad_request_error_1.BadRequestError(`Unsupported file type: ${type}`);
446
+ }
447
+ }
448
+ };
449
+ exports.SourceControlService = SourceControlService;
450
+ __decorate([
451
+ (0, decorators_1.OnPubSubEvent)('reload-source-control-config', { instanceType: 'main' }),
452
+ __metadata("design:type", Function),
453
+ __metadata("design:paramtypes", []),
454
+ __metadata("design:returntype", Promise)
455
+ ], SourceControlService.prototype, "reloadConfiguration", null);
456
+ exports.SourceControlService = SourceControlService = __decorate([
457
+ (0, di_1.Service)(),
458
+ __metadata("design:paramtypes", [backend_common_1.Logger,
459
+ source_control_git_service_ee_1.SourceControlGitService,
460
+ source_control_preferences_service_ee_1.SourceControlPreferencesService,
461
+ source_control_export_service_ee_1.SourceControlExportService,
462
+ source_control_import_service_ee_1.SourceControlImportService,
463
+ source_control_scoped_service_1.SourceControlScopedService,
464
+ event_service_1.EventService,
465
+ source_control_status_service_ee_1.SourceControlStatusService])
466
+ ], SourceControlService);
@@ -0,0 +1,10 @@
1
+ export interface ExportResult {
2
+ count: number;
3
+ folder: string;
4
+ files: Array<{
5
+ id: string;
6
+ name: string;
7
+ }>;
8
+ removedFiles?: string[];
9
+ missingIds?: string[];
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,14 @@
1
+ import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
2
+ import type { RemoteResourceOwner, StatusResourceOwner } from './resource-owner';
3
+ export interface ExportableCredential {
4
+ id: string;
5
+ name: string;
6
+ type: string;
7
+ data: ICredentialDataDecryptedObject;
8
+ ownedBy: RemoteResourceOwner | null;
9
+ isGlobal?: boolean;
10
+ }
11
+ export type StatusExportableCredential = ExportableCredential & {
12
+ filename: string;
13
+ ownedBy?: StatusResourceOwner;
14
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ export type ExportableFolder = {
2
+ id: string;
3
+ name: string;
4
+ parentFolderId: string | null;
5
+ homeProjectId: string;
6
+ createdAt: string;
7
+ updatedAt: string;
8
+ };
9
+ export type ExportedFolders = {
10
+ folders: ExportableFolder[];
11
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ import type { ExportableVariable } from './exportable-variable';
2
+ import type { TeamResourceOwner } from './resource-owner';
3
+ export interface ExportableProject {
4
+ id: string;
5
+ name: string;
6
+ icon: {
7
+ type: 'emoji' | 'icon';
8
+ value: string;
9
+ } | null;
10
+ description: string | null;
11
+ type: 'team';
12
+ owner: TeamResourceOwner;
13
+ variableStubs?: ExportableVariable[];
14
+ }
15
+ export type ExportableProjectWithFileName = ExportableProject & {
16
+ filename: string;
17
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });