n8n 1.120.4 → 1.121.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.d.ts +1 -1
- package/dist/abstract-server.js +4 -4
- package/dist/abstract-server.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/chat/utils.js +5 -3
- package/dist/chat/utils.js.map +1 -1
- package/dist/commands/base-command.js +2 -2
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/execute-batch.d.ts +1 -1
- package/dist/commands/execute.d.ts +2 -2
- package/dist/commands/export/credentials.d.ts +2 -2
- package/dist/commands/export/entities.d.ts +3 -0
- package/dist/commands/export/entities.js +9 -2
- package/dist/commands/export/entities.js.map +1 -1
- package/dist/commands/export/workflow.d.ts +2 -2
- package/dist/commands/import/credentials.d.ts +2 -2
- package/dist/commands/import/entities.d.ts +3 -0
- package/dist/commands/import/entities.js +10 -2
- package/dist/commands/import/entities.js.map +1 -1
- package/dist/commands/import/workflow.d.ts +2 -2
- package/dist/commands/ttwf/generate.d.ts +3 -3
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/controllers/auth.controller.js +4 -0
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/e2e.controller.js +0 -1
- package/dist/controllers/e2e.controller.js.map +1 -1
- package/dist/controllers/invitation.controller.js +8 -4
- package/dist/controllers/invitation.controller.js.map +1 -1
- package/dist/credentials/credentials.service.d.ts +2 -0
- package/dist/credentials/credentials.service.js +33 -10
- package/dist/credentials/credentials.service.js.map +1 -1
- package/dist/evaluation.ee/test-runner/test-runner.service.ee.js +11 -23
- package/dist/evaluation.ee/test-runner/test-runner.service.ee.js.map +1 -1
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-sentry.ee.js +1 -0
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-sentry.ee.js.map +1 -1
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-syslog.ee.js +1 -0
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-syslog.ee.js.map +1 -1
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-webhook.ee.d.ts +4 -2
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-webhook.ee.js +55 -29
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination-webhook.ee.js.map +1 -1
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination.ee.d.ts +2 -0
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination.ee.js +23 -1
- package/dist/eventbus/message-event-bus-destination/message-event-bus-destination.ee.js.map +1 -1
- package/dist/execution-lifecycle/execute-error-workflow.js +1 -0
- package/dist/execution-lifecycle/execute-error-workflow.js.map +1 -1
- package/dist/execution-lifecycle/save-execution-progress.d.ts +1 -1
- package/dist/execution-lifecycle/save-execution-progress.js +2 -13
- package/dist/execution-lifecycle/save-execution-progress.js.map +1 -1
- package/dist/executions/execution.service.js +1 -45
- package/dist/executions/execution.service.js.map +1 -1
- package/dist/interfaces.d.ts +2 -1
- package/dist/ldap.ee/constants.d.ts +3 -0
- package/dist/ldap.ee/constants.js +4 -0
- package/dist/ldap.ee/constants.js.map +1 -1
- package/dist/ldap.ee/ldap.service.ee.d.ts +1 -0
- package/dist/ldap.ee/ldap.service.ee.js +26 -0
- package/dist/ldap.ee/ldap.service.ee.js.map +1 -1
- package/dist/license.d.ts +0 -1
- package/dist/license.js +2 -4
- package/dist/license.js.map +1 -1
- package/dist/manual-execution.service.js +6 -5
- package/dist/manual-execution.service.js.map +1 -1
- package/dist/modules/breaking-changes/breaking-changes.controller.d.ts +1 -2
- package/dist/modules/breaking-changes/breaking-changes.controller.js +1 -1
- package/dist/modules/breaking-changes/breaking-changes.controller.js.map +1 -1
- package/dist/modules/breaking-changes/breaking-changes.service.d.ts +3 -3
- package/dist/modules/breaking-changes/breaking-changes.service.js +16 -11
- package/dist/modules/breaking-changes/breaking-changes.service.js.map +1 -1
- package/dist/modules/breaking-changes/rules/index.d.ts +1 -1
- package/dist/modules/breaking-changes/rules/v2/binary-data-storage.rule.d.ts +9 -0
- package/dist/modules/breaking-changes/rules/v2/binary-data-storage.rule.js +70 -0
- package/dist/modules/breaking-changes/rules/v2/binary-data-storage.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/cli-activate-all-workflows.rule.d.ts +6 -0
- package/dist/modules/breaking-changes/rules/v2/cli-activate-all-workflows.rule.js +53 -0
- package/dist/modules/breaking-changes/rules/v2/cli-activate-all-workflows.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/disabled-nodes.rule.d.ts +11 -0
- package/dist/modules/breaking-changes/rules/v2/disabled-nodes.rule.js +64 -0
- package/dist/modules/breaking-changes/rules/v2/disabled-nodes.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/dotenv-upgrade.rule.d.ts +7 -0
- package/dist/modules/breaking-changes/rules/v2/dotenv-upgrade.rule.js +74 -0
- package/dist/modules/breaking-changes/rules/v2/dotenv-upgrade.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/file-access.rule.d.ts +4 -4
- package/dist/modules/breaking-changes/rules/v2/file-access.rule.js +3 -2
- package/dist/modules/breaking-changes/rules/v2/file-access.rule.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/git-node-bare-repos.rule.d.ts +10 -0
- package/dist/modules/breaking-changes/rules/v2/git-node-bare-repos.rule.js +66 -0
- package/dist/modules/breaking-changes/rules/v2/git-node-bare-repos.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/index.d.ts +8 -2
- package/dist/modules/breaking-changes/rules/v2/index.js +35 -1
- package/dist/modules/breaking-changes/rules/v2/index.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/oauth-callback-auth.rule.d.ts +6 -0
- package/dist/modules/breaking-changes/rules/v2/oauth-callback-auth.rule.js +51 -0
- package/dist/modules/breaking-changes/rules/v2/oauth-callback-auth.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js +8 -1
- package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/pyodide-removed.rule.d.ts +10 -0
- package/dist/modules/breaking-changes/rules/v2/pyodide-removed.rule.js +65 -0
- package/dist/modules/breaking-changes/rules/v2/pyodide-removed.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/queue-worker-max-stalled-count.rule.d.ts +6 -0
- package/dist/modules/breaking-changes/rules/v2/queue-worker-max-stalled-count.rule.js +51 -0
- package/dist/modules/breaking-changes/rules/v2/queue-worker-max-stalled-count.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/removed-database-types.rule.d.ts +9 -0
- package/dist/modules/breaking-changes/rules/v2/removed-database-types.rule.js +57 -0
- package/dist/modules/breaking-changes/rules/v2/removed-database-types.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.d.ts +3 -3
- package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js +3 -2
- package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/settings-file-permissions.rule.d.ts +9 -0
- package/dist/modules/breaking-changes/rules/v2/settings-file-permissions.rule.js +70 -0
- package/dist/modules/breaking-changes/rules/v2/settings-file-permissions.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/sqlite-legacy-driver.rule.d.ts +9 -0
- package/dist/modules/breaking-changes/rules/v2/sqlite-legacy-driver.rule.js +75 -0
- package/dist/modules/breaking-changes/rules/v2/sqlite-legacy-driver.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/task-runner-docker-image.rule.d.ts +6 -0
- package/dist/modules/breaking-changes/rules/v2/task-runner-docker-image.rule.js +57 -0
- package/dist/modules/breaking-changes/rules/v2/task-runner-docker-image.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/task-runners.rule.d.ts +9 -0
- package/dist/modules/breaking-changes/rules/v2/task-runners.rule.js +64 -0
- package/dist/modules/breaking-changes/rules/v2/task-runners.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/tunnel-option.rule.d.ts +6 -0
- package/dist/modules/breaking-changes/rules/v2/tunnel-option.rule.js +44 -0
- package/dist/modules/breaking-changes/rules/v2/tunnel-option.rule.js.map +1 -0
- package/dist/modules/breaking-changes/rules/v2/wait-node-subworkflow.rule.d.ts +12 -0
- package/dist/modules/breaking-changes/rules/v2/wait-node-subworkflow.rule.js +112 -0
- package/dist/modules/breaking-changes/rules/v2/wait-node-subworkflow.rule.js.map +1 -0
- package/dist/modules/breaking-changes/types/rule.types.d.ts +1 -2
- package/dist/modules/breaking-changes/types/rule.types.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub-agent.entity.d.ts +2 -0
- package/dist/modules/chat-hub/chat-hub-agent.entity.js +4 -0
- package/dist/modules/chat-hub/chat-hub-agent.entity.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub-agent.service.d.ts +3 -0
- package/dist/modules/chat-hub/chat-hub-agent.service.js +3 -0
- package/dist/modules/chat-hub/chat-hub-agent.service.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub-session.entity.d.ts +2 -0
- package/dist/modules/chat-hub/chat-hub-session.entity.js +4 -0
- package/dist/modules/chat-hub/chat-hub-session.entity.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub-workflow.service.d.ts +3 -2
- package/dist/modules/chat-hub/chat-hub-workflow.service.js +64 -30
- package/dist/modules/chat-hub/chat-hub-workflow.service.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub.controller.d.ts +1 -1
- package/dist/modules/chat-hub/chat-hub.controller.js +2 -2
- package/dist/modules/chat-hub/chat-hub.controller.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub.service.d.ts +8 -7
- package/dist/modules/chat-hub/chat-hub.service.js +65 -70
- package/dist/modules/chat-hub/chat-hub.service.js.map +1 -1
- package/dist/modules/chat-hub/chat-hub.types.d.ts +3 -10
- package/dist/modules/data-table/data-table-rows.repository.d.ts +2 -1
- package/dist/modules/data-table/data-table-rows.repository.js +38 -3
- package/dist/modules/data-table/data-table-rows.repository.js.map +1 -1
- package/dist/modules/data-table/data-table.service.d.ts +1 -1
- package/dist/modules/data-table/data-table.service.js +2 -2
- package/dist/modules/data-table/data-table.service.js.map +1 -1
- package/dist/modules/mcp/mcp.constants.d.ts +6 -0
- package/dist/modules/mcp/mcp.constants.js +8 -1
- package/dist/modules/mcp/mcp.constants.js.map +1 -1
- package/dist/modules/mcp/mcp.errors.d.ts +6 -0
- package/dist/modules/mcp/mcp.errors.js +16 -0
- package/dist/modules/mcp/mcp.errors.js.map +1 -0
- package/dist/modules/mcp/mcp.service.d.ts +5 -1
- package/dist/modules/mcp/mcp.service.js +11 -2
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/mcp.settings.controller.js +5 -4
- package/dist/modules/mcp/mcp.settings.controller.js.map +1 -1
- package/dist/modules/mcp/mcp.types.d.ts +18 -0
- package/dist/modules/mcp/mcp.utils.d.ts +3 -1
- package/dist/modules/mcp/mcp.utils.js +7 -1
- package/dist/modules/mcp/mcp.utils.js.map +1 -1
- package/dist/modules/mcp/tools/execute-workflow.tool.d.ts +107 -0
- package/dist/modules/mcp/tools/execute-workflow.tool.js +308 -0
- package/dist/modules/mcp/tools/execute-workflow.tool.js.map +1 -0
- package/dist/modules/mcp/tools/get-workflow-details.tool.js +11 -5
- package/dist/modules/mcp/tools/get-workflow-details.tool.js.map +1 -1
- package/dist/modules/mcp/tools/schemas.d.ts +5 -0
- package/dist/modules/mcp/tools/schemas.js +1 -0
- package/dist/modules/mcp/tools/schemas.js.map +1 -1
- package/dist/modules/mcp/tools/search-workflows.tool.js +24 -8
- package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -1
- package/dist/modules/mcp/tools/webhook-utils.d.ts +2 -1
- package/dist/modules/mcp/tools/webhook-utils.js +68 -4
- package/dist/modules/mcp/tools/webhook-utils.js.map +1 -1
- package/dist/public-api/v1/handlers/workflows/workflows.handler.js +3 -3
- package/dist/public-api/v1/handlers/workflows/workflows.handler.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/services/credentials-tester.service.js +1 -5
- package/dist/services/credentials-tester.service.js.map +1 -1
- package/dist/services/dynamic-node-parameters.service.js +1 -1
- package/dist/services/dynamic-node-parameters.service.js.map +1 -1
- package/dist/services/export.service.d.ts +1 -1
- package/dist/services/export.service.js +16 -5
- package/dist/services/export.service.js.map +1 -1
- package/dist/services/frontend.service.js +3 -11
- package/dist/services/frontend.service.js.map +1 -1
- package/dist/services/import.service.d.ts +4 -4
- package/dist/services/import.service.js +20 -9
- package/dist/services/import.service.js.map +1 -1
- package/dist/sso.ee/oidc/oidc.service.ee.d.ts +1 -1
- package/dist/sso.ee/oidc/oidc.service.ee.js +5 -0
- package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.d.ts +1 -1
- package/dist/sso.ee/sso-helpers.d.ts +1 -0
- package/dist/sso.ee/sso-helpers.js +6 -0
- package/dist/sso.ee/sso-helpers.js.map +1 -1
- package/dist/task-runners/errors/task-request-timeout.error.d.ts +8 -0
- package/dist/task-runners/errors/task-request-timeout.error.js +19 -0
- package/dist/task-runners/errors/task-request-timeout.error.js.map +1 -0
- package/dist/task-runners/task-broker/task-broker.service.d.ts +3 -0
- package/dist/task-runners/task-broker/task-broker.service.js +22 -0
- package/dist/task-runners/task-broker/task-broker.service.js.map +1 -1
- package/dist/task-runners/task-managers/local-task-requester.d.ts +3 -1
- package/dist/task-runners/task-managers/local-task-requester.js +9 -3
- package/dist/task-runners/task-managers/local-task-requester.js.map +1 -1
- package/dist/task-runners/task-managers/task-requester.d.ts +8 -2
- package/dist/task-runners/task-managers/task-requester.js +34 -2
- package/dist/task-runners/task-managers/task-requester.js.map +1 -1
- package/dist/utils/circuit-breaker.d.ts +36 -0
- package/dist/utils/circuit-breaker.js +118 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/sliding-window.d.ts +13 -0
- package/dist/utils/sliding-window.js +27 -0
- package/dist/utils/sliding-window.js.map +1 -0
- package/dist/webhooks/webhook-helpers.js +5 -17
- package/dist/webhooks/webhook-helpers.js.map +1 -1
- package/dist/webhooks/webhook.service.js +26 -3
- package/dist/webhooks/webhook.service.js.map +1 -1
- package/dist/workflow-execute-additional-data.d.ts +1 -1
- package/dist/workflow-execute-additional-data.js +4 -13
- package/dist/workflow-execute-additional-data.js.map +1 -1
- package/dist/workflows/workflow-execution.service.js +12 -25
- package/dist/workflows/workflow-execution.service.js.map +1 -1
- package/dist/workflows/{workflow-history.ee/workflow-history-helper.ee.d.ts → workflow-history/workflow-history-helper.d.ts} +0 -2
- package/dist/workflows/{workflow-history.ee/workflow-history-helper.ee.js → workflow-history/workflow-history-helper.js} +1 -10
- package/dist/workflows/workflow-history/workflow-history-helper.js.map +1 -0
- package/dist/workflows/{workflow-history.ee/workflow-history-manager.ee.js → workflow-history/workflow-history-manager.js} +4 -7
- package/dist/workflows/workflow-history/workflow-history-manager.js.map +1 -0
- package/dist/workflows/{workflow-history.ee/workflow-history.controller.ee.d.ts → workflow-history/workflow-history.controller.d.ts} +1 -4
- package/dist/workflows/{workflow-history.ee/workflow-history.controller.ee.js → workflow-history/workflow-history.controller.js} +4 -33
- package/dist/workflows/workflow-history/workflow-history.controller.js.map +1 -0
- package/dist/workflows/{workflow-history.ee/workflow-history.service.ee.js → workflow-history/workflow-history.service.js} +18 -18
- package/dist/workflows/workflow-history/workflow-history.service.js.map +1 -0
- package/dist/workflows/workflow.service.d.ts +1 -1
- package/dist/workflows/workflow.service.js +15 -8
- package/dist/workflows/workflow.service.js.map +1 -1
- package/dist/workflows/workflows.controller.d.ts +1 -1
- package/dist/workflows/workflows.controller.js +2 -2
- package/dist/workflows/workflows.controller.js.map +1 -1
- package/package.json +16 -16
- package/templates/form-trigger.handlebars +2 -3
- package/dist/workflows/workflow-history.ee/workflow-history-helper.ee.js.map +0 -1
- package/dist/workflows/workflow-history.ee/workflow-history-manager.ee.js.map +0 -1
- package/dist/workflows/workflow-history.ee/workflow-history.controller.ee.js.map +0 -1
- package/dist/workflows/workflow-history.ee/workflow-history.service.ee.js.map +0 -1
- /package/dist/workflows/{workflow-history.ee/workflow-history-manager.ee.d.ts → workflow-history/workflow-history-manager.d.ts} +0 -0
- /package/dist/workflows/{workflow-history.ee/workflow-history.service.ee.d.ts → workflow-history/workflow-history.service.d.ts} +0 -0
|
@@ -16,10 +16,10 @@ const constants_1 = require("@n8n/constants");
|
|
|
16
16
|
const db_1 = require("@n8n/db");
|
|
17
17
|
const di_1 = require("@n8n/di");
|
|
18
18
|
const n8n_core_1 = require("n8n-core");
|
|
19
|
-
const cache_service_1 = require("../../services/cache/cache.service");
|
|
20
19
|
const breaking_changes_rule_registry_service_1 = require("./breaking-changes.rule-registry.service");
|
|
21
20
|
const rules_1 = require("./rules");
|
|
22
21
|
const constants_2 = require("../../constants");
|
|
22
|
+
const cache_service_1 = require("../../services/cache/cache.service");
|
|
23
23
|
let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeService {
|
|
24
24
|
constructor(ruleRegistry, workflowRepository, cacheService, logger, errorReporter) {
|
|
25
25
|
this.ruleRegistry = ruleRegistry;
|
|
@@ -41,7 +41,6 @@ let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeServic
|
|
|
41
41
|
for (const rule of instanceLevelRules) {
|
|
42
42
|
try {
|
|
43
43
|
const ruleResult = await rule.detect();
|
|
44
|
-
console.log('ruleResult', ruleResult);
|
|
45
44
|
if (ruleResult.isAffected) {
|
|
46
45
|
instanceLevelResults.push({
|
|
47
46
|
ruleId: rule.id,
|
|
@@ -61,11 +60,10 @@ let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeServic
|
|
|
61
60
|
}
|
|
62
61
|
return instanceLevelResults;
|
|
63
62
|
}
|
|
64
|
-
async getAllWorkflowRulesResults(workflowLevelRules) {
|
|
65
|
-
const totalWorkflows = await this.workflowRepository.count();
|
|
63
|
+
async getAllWorkflowRulesResults(workflowLevelRules, totalWorkflows) {
|
|
66
64
|
const allAffectedWorkflowsByRule = new Map();
|
|
67
65
|
const allResults = [];
|
|
68
|
-
this.logger.
|
|
66
|
+
this.logger.debug('Processing workflows in batches', {
|
|
69
67
|
totalWorkflows,
|
|
70
68
|
batchSize: this.batchSize,
|
|
71
69
|
});
|
|
@@ -122,6 +120,7 @@ let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeServic
|
|
|
122
120
|
ruleTitle: rule.getMetadata().title,
|
|
123
121
|
ruleDescription: rule.getMetadata().description,
|
|
124
122
|
ruleSeverity: rule.getMetadata().severity,
|
|
123
|
+
ruleDocumentationUrl: rule.getMetadata().documentationUrl,
|
|
125
124
|
affectedWorkflows: workflowResults,
|
|
126
125
|
recommendations: await rule.getRecommendations(workflowResults),
|
|
127
126
|
});
|
|
@@ -144,7 +143,7 @@ let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeServic
|
|
|
144
143
|
void (async () => {
|
|
145
144
|
const cachedResult = await this.cacheService.get(cacheKey);
|
|
146
145
|
if (cachedResult) {
|
|
147
|
-
this.logger.
|
|
146
|
+
this.logger.debug('Using cached breaking change detection results', {
|
|
148
147
|
targetVersion,
|
|
149
148
|
});
|
|
150
149
|
return resolve(cachedResult);
|
|
@@ -170,20 +169,25 @@ let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeServic
|
|
|
170
169
|
}
|
|
171
170
|
async detect(targetVersion) {
|
|
172
171
|
const startTime = Date.now();
|
|
173
|
-
this.logger.
|
|
172
|
+
this.logger.debug('Starting breaking change detection', { targetVersion });
|
|
174
173
|
const rules = this.ruleRegistry.getRules(targetVersion);
|
|
175
174
|
const workflowLevelRules = rules.filter((rule) => 'detectWorkflow' in rule);
|
|
176
175
|
const instanceLevelRules = rules.filter((rule) => 'detect' in rule);
|
|
176
|
+
const totalWorkflows = await this.workflowRepository.count();
|
|
177
177
|
const [instanceLevelResults, workflowLevelResults] = await Promise.all([
|
|
178
178
|
this.getAllInstanceRulesResults(instanceLevelRules),
|
|
179
|
-
this.getAllWorkflowRulesResults(workflowLevelRules),
|
|
179
|
+
this.getAllWorkflowRulesResults(workflowLevelRules, totalWorkflows),
|
|
180
180
|
]);
|
|
181
181
|
const report = this.createDetectionReport(targetVersion, instanceLevelResults, workflowLevelResults);
|
|
182
182
|
const duration = Date.now() - startTime;
|
|
183
|
-
this.logger.
|
|
183
|
+
this.logger.debug('Breaking change detection completed', {
|
|
184
184
|
duration,
|
|
185
185
|
});
|
|
186
|
-
return {
|
|
186
|
+
return {
|
|
187
|
+
report,
|
|
188
|
+
totalWorkflows,
|
|
189
|
+
shouldCache: this.shouldCacheDetection(duration),
|
|
190
|
+
};
|
|
187
191
|
}
|
|
188
192
|
async getDetectionReportForRule(ruleId) {
|
|
189
193
|
const rule = this.ruleRegistry.getRule(ruleId);
|
|
@@ -191,7 +195,8 @@ let BreakingChangeService = BreakingChangeService_1 = class BreakingChangeServic
|
|
|
191
195
|
return undefined;
|
|
192
196
|
}
|
|
193
197
|
if ('detectWorkflow' in rule) {
|
|
194
|
-
|
|
198
|
+
const totalWorkflows = await this.workflowRepository.count();
|
|
199
|
+
return (await this.getAllWorkflowRulesResults([rule], totalWorkflows))[0];
|
|
195
200
|
}
|
|
196
201
|
return (await this.getAllInstanceRulesResults([rule]))[0];
|
|
197
202
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breaking-changes.service.js","sourceRoot":"","sources":["../../../src/modules/breaking-changes/breaking-changes.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"breaking-changes.service.js","sourceRoot":"","sources":["../../../src/modules/breaking-changes/breaking-changes.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const allRules: typeof import("./v2/
|
|
1
|
+
declare const allRules: (typeof import("./v2/binary-data-storage.rule").BinaryDataStorageRule | typeof import("./v2/cli-activate-all-workflows.rule").CliActivateAllWorkflowsRule | typeof import("./v2/git-node-bare-repos.rule").GitNodeBareReposRule | typeof import("./v2/removed-database-types.rule").RemovedDatabaseTypesRule | typeof import("./v2/settings-file-permissions.rule").SettingsFilePermissionsRule | typeof import("./v2/sqlite-legacy-driver.rule").SqliteLegacyDriverRule | typeof import("./v2/task-runners.rule").TaskRunnersRule)[];
|
|
2
2
|
type RuleConstructors = (typeof allRules)[number];
|
|
3
3
|
type RuleInstances = InstanceType<RuleConstructors>;
|
|
4
4
|
export { allRules, type RuleInstances };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BinaryDataConfig } from 'n8n-core';
|
|
2
|
+
import type { BreakingChangeRuleMetadata, IBreakingChangeInstanceRule, InstanceDetectionReport } from '../../types';
|
|
3
|
+
export declare class BinaryDataStorageRule implements IBreakingChangeInstanceRule {
|
|
4
|
+
private readonly config;
|
|
5
|
+
constructor(config: BinaryDataConfig);
|
|
6
|
+
id: string;
|
|
7
|
+
getMetadata(): BreakingChangeRuleMetadata;
|
|
8
|
+
detect(): Promise<InstanceDetectionReport>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
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.BinaryDataStorageRule = void 0;
|
|
13
|
+
const di_1 = require("@n8n/di");
|
|
14
|
+
const n8n_core_1 = require("n8n-core");
|
|
15
|
+
let BinaryDataStorageRule = class BinaryDataStorageRule {
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.id = 'binary-data-storage-v2';
|
|
19
|
+
}
|
|
20
|
+
getMetadata() {
|
|
21
|
+
return {
|
|
22
|
+
version: 'v2',
|
|
23
|
+
title: 'Disable binary data in-memory mode by default',
|
|
24
|
+
description: 'Binary files are now stored on disk by default instead of in memory, removing the 512MB file size limit',
|
|
25
|
+
category: "infrastructure",
|
|
26
|
+
severity: 'low',
|
|
27
|
+
documentationUrl: 'https://docs.n8n.io/2-0-breaking-changes/#remove-in-memory-binary-data-mode',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async detect() {
|
|
31
|
+
if (this.config.mode !== 'default') {
|
|
32
|
+
return {
|
|
33
|
+
isAffected: false,
|
|
34
|
+
instanceIssues: [],
|
|
35
|
+
recommendations: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const result = {
|
|
39
|
+
isAffected: true,
|
|
40
|
+
instanceIssues: [
|
|
41
|
+
{
|
|
42
|
+
title: 'Binary data storage mode changed',
|
|
43
|
+
description: `Binary files are now stored in ${this.config.localStoragePath} directory by default instead of in memory. This removes the previous 512MB file size limit but increases disk usage.`,
|
|
44
|
+
level: 'info',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
recommendations: [
|
|
48
|
+
{
|
|
49
|
+
action: 'Ensure adequate disk space',
|
|
50
|
+
description: `Verify sufficient disk space is available for binary file storage in the ${this.config.localStoragePath} directory`,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
action: 'Configure persistent storage',
|
|
54
|
+
description: 'If using containers, ensure the binary data directory is mounted on a persistent volume',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
action: 'Include in backups',
|
|
58
|
+
description: 'Add the binary data folder to your backup procedures',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.BinaryDataStorageRule = BinaryDataStorageRule;
|
|
66
|
+
exports.BinaryDataStorageRule = BinaryDataStorageRule = __decorate([
|
|
67
|
+
(0, di_1.Service)(),
|
|
68
|
+
__metadata("design:paramtypes", [n8n_core_1.BinaryDataConfig])
|
|
69
|
+
], BinaryDataStorageRule);
|
|
70
|
+
//# sourceMappingURL=binary-data-storage.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary-data-storage.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/binary-data-storage.rule.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,uCAA4C;AAUrC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACjC,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;QAErD,OAAE,GAAW,wBAAwB,CAAC;IAFkB,CAAC;IAIzD,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,+CAA+C;YACtD,WAAW,EACV,yGAAyG;YAC1G,QAAQ,kBAAuC;YAC/C,QAAQ,EAAE,KAAK;YACf,gBAAgB,EACf,6EAA6E;SAC9E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACX,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;gBACN,UAAU,EAAE,KAAK;gBACjB,cAAc,EAAE,EAAE;gBAClB,eAAe,EAAE,EAAE;aACnB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAA4B;YACvC,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE;gBACf;oBACC,KAAK,EAAE,kCAAkC;oBACzC,WAAW,EAAE,kCAAkC,IAAI,CAAC,MAAM,CAAC,gBAAgB,uHAAuH;oBAClM,KAAK,EAAE,MAAM;iBACb;aACD;YACD,eAAe,EAAE;gBAChB;oBACC,MAAM,EAAE,4BAA4B;oBACpC,WAAW,EAAE,4EAA4E,IAAI,CAAC,MAAM,CAAC,gBAAgB,YAAY;iBACjI;gBACD;oBACC,MAAM,EAAE,8BAA8B;oBACtC,WAAW,EACV,yFAAyF;iBAC1F;gBACD;oBACC,MAAM,EAAE,oBAAoB;oBAC5B,WAAW,EAAE,sDAAsD;iBACnE;aACD;SACD,CAAC;QAEF,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAA;AAvDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,YAAO,GAAE;qCAE4B,2BAAgB;GADzC,qBAAqB,CAuDjC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BreakingChangeRuleMetadata, IBreakingChangeInstanceRule, InstanceDetectionReport } from '../../types';
|
|
2
|
+
export declare class CliActivateAllWorkflowsRule implements IBreakingChangeInstanceRule {
|
|
3
|
+
id: string;
|
|
4
|
+
getMetadata(): BreakingChangeRuleMetadata;
|
|
5
|
+
detect(): Promise<InstanceDetectionReport>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CliActivateAllWorkflowsRule = void 0;
|
|
10
|
+
const di_1 = require("@n8n/di");
|
|
11
|
+
let CliActivateAllWorkflowsRule = class CliActivateAllWorkflowsRule {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.id = 'cli-activate-all-workflows-v2';
|
|
14
|
+
}
|
|
15
|
+
getMetadata() {
|
|
16
|
+
return {
|
|
17
|
+
version: 'v2',
|
|
18
|
+
title: 'Remove CLI command operation to activate all workflows',
|
|
19
|
+
description: 'The CLI command to activate all workflows has been removed for simplification',
|
|
20
|
+
category: "instance",
|
|
21
|
+
severity: 'low',
|
|
22
|
+
documentationUrl: 'https://docs.n8n.io/2-0-breaking-changes/#remove-cli-command-operation-to-activate-all-workflows',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async detect() {
|
|
26
|
+
const result = {
|
|
27
|
+
isAffected: true,
|
|
28
|
+
instanceIssues: [
|
|
29
|
+
{
|
|
30
|
+
title: 'CLI command to activate all workflows removed',
|
|
31
|
+
description: 'The CLI command to activate all workflows in bulk has been removed. If you were using this command in scripts or automation, you will need to update your approach.',
|
|
32
|
+
level: 'info',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
recommendations: [
|
|
36
|
+
{
|
|
37
|
+
action: 'Use the API to activate workflows',
|
|
38
|
+
description: 'Update automation scripts to use the public API to activate workflows individually instead of the CLI command',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
action: 'Review deployment scripts',
|
|
42
|
+
description: 'Check any deployment or automation scripts that may have used the CLI command to activate all workflows and update them accordingly',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.CliActivateAllWorkflowsRule = CliActivateAllWorkflowsRule;
|
|
50
|
+
exports.CliActivateAllWorkflowsRule = CliActivateAllWorkflowsRule = __decorate([
|
|
51
|
+
(0, di_1.Service)()
|
|
52
|
+
], CliActivateAllWorkflowsRule);
|
|
53
|
+
//# sourceMappingURL=cli-activate-all-workflows.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-activate-all-workflows.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/cli-activate-all-workflows.rule.ts"],"names":[],"mappings":";;;;;;;;;AAAA,gCAAkC;AAU3B,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAAjC;QACN,OAAE,GAAW,+BAA+B,CAAC;IAyC9C,CAAC;IAvCA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,wDAAwD;YAC/D,WAAW,EAAE,+EAA+E;YAC5F,QAAQ,YAAiC;YACzC,QAAQ,EAAE,KAAK;YACf,gBAAgB,EACf,kGAAkG;SACnG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,MAAM,GAA4B;YACvC,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE;gBACf;oBACC,KAAK,EAAE,+CAA+C;oBACtD,WAAW,EACV,qKAAqK;oBACtK,KAAK,EAAE,MAAM;iBACb;aACD;YACD,eAAe,EAAE;gBAChB;oBACC,MAAM,EAAE,mCAAmC;oBAC3C,WAAW,EACV,+GAA+G;iBAChH;gBACD;oBACC,MAAM,EAAE,2BAA2B;oBACnC,WAAW,EACV,qIAAqI;iBACtI;aACD;SACD,CAAC;QAEF,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAA;AA1CY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,YAAO,GAAE;GACG,2BAA2B,CA0CvC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BreakingChangeAffectedWorkflow, BreakingChangeRecommendation } from '@n8n/api-types';
|
|
2
|
+
import type { WorkflowEntity } from '@n8n/db';
|
|
3
|
+
import type { INode } from 'n8n-workflow';
|
|
4
|
+
import type { BreakingChangeRuleMetadata, IBreakingChangeWorkflowRule, WorkflowDetectionReport } from '../../types';
|
|
5
|
+
export declare class DisabledNodesRule implements IBreakingChangeWorkflowRule {
|
|
6
|
+
private readonly DISABLED_NODES;
|
|
7
|
+
id: string;
|
|
8
|
+
getMetadata(): BreakingChangeRuleMetadata;
|
|
9
|
+
getRecommendations(_workflowResults: BreakingChangeAffectedWorkflow[]): Promise<BreakingChangeRecommendation[]>;
|
|
10
|
+
detectWorkflow(_workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionReport>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DisabledNodesRule = void 0;
|
|
10
|
+
const di_1 = require("@n8n/di");
|
|
11
|
+
let DisabledNodesRule = class DisabledNodesRule {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.DISABLED_NODES = [
|
|
14
|
+
'n8n-nodes-base.executeCommand',
|
|
15
|
+
'n8n-nodes-base.localFileTrigger',
|
|
16
|
+
];
|
|
17
|
+
this.id = 'disabled-nodes-v2';
|
|
18
|
+
}
|
|
19
|
+
getMetadata() {
|
|
20
|
+
return {
|
|
21
|
+
version: 'v2',
|
|
22
|
+
title: 'Disable ExecuteCommand and LocalFileTrigger nodes by default',
|
|
23
|
+
description: 'ExecuteCommand and LocalFileTrigger nodes are now disabled by default for security reasons',
|
|
24
|
+
category: "workflow",
|
|
25
|
+
severity: 'medium',
|
|
26
|
+
documentationUrl: 'https://docs.n8n.io/2-0-breaking-changes/#disable-executecommand-and-localfiletrigger-nodes-by-default',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async getRecommendations(_workflowResults) {
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
action: 'Enable nodes if required',
|
|
33
|
+
description: 'Set the appropriate environment variables or settings to enable these nodes if they are required for your workflows',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
action: 'Replace with alternatives',
|
|
37
|
+
description: 'Consider replacing these nodes with safer alternatives that achieve the same functionality',
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
async detectWorkflow(_workflow, nodesGroupedByType) {
|
|
42
|
+
if (process.env.NODES_EXCLUDE) {
|
|
43
|
+
return { isAffected: false, issues: [] };
|
|
44
|
+
}
|
|
45
|
+
const disabledNodes = this.DISABLED_NODES.flatMap((type) => nodesGroupedByType.get(type) ?? []);
|
|
46
|
+
if (disabledNodes.length === 0)
|
|
47
|
+
return { isAffected: false, issues: [] };
|
|
48
|
+
return {
|
|
49
|
+
isAffected: true,
|
|
50
|
+
issues: disabledNodes.map((node) => ({
|
|
51
|
+
title: `Node '${node.type}' with name '${node.name}' will be disabled`,
|
|
52
|
+
description: `This node is disabled by default in v2. If you want to keep using ${node.type} node, you can configure NODES_EXCLUDE=[].`,
|
|
53
|
+
level: 'error',
|
|
54
|
+
nodeId: node.id,
|
|
55
|
+
nodeName: node.name,
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.DisabledNodesRule = DisabledNodesRule;
|
|
61
|
+
exports.DisabledNodesRule = DisabledNodesRule = __decorate([
|
|
62
|
+
(0, di_1.Service)()
|
|
63
|
+
], DisabledNodesRule);
|
|
64
|
+
//# sourceMappingURL=disabled-nodes.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disabled-nodes.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/disabled-nodes.rule.ts"],"names":[],"mappings":";;;;;;;;;AAEA,gCAAkC;AAW3B,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAAvB;QACW,mBAAc,GAAG;YACjC,+BAA+B;YAC/B,iCAAiC;SACjC,CAAC;QAEF,OAAE,GAAW,mBAAmB,CAAC;IAsDlC,CAAC;IApDA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,8DAA8D;YACrE,WAAW,EACV,4FAA4F;YAC7F,QAAQ,YAAiC;YACzC,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EACf,wGAAwG;SACzG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,gBAAkD;QAElD,OAAO;YACN;gBACC,MAAM,EAAE,0BAA0B;gBAClC,WAAW,EACV,qHAAqH;aACtH;YACD;gBACC,MAAM,EAAE,2BAA2B;gBACnC,WAAW,EACV,4FAA4F;aAC7F;SACD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,SAAyB,EACzB,kBAAwC;QAExC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChG,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAEzE,OAAO;YACN,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpC,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,oBAAoB;gBACtE,WAAW,EAAE,qEAAqE,IAAI,CAAC,IAAI,4CAA4C;gBACvI,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;aACnB,CAAC,CAAC;SACH,CAAC;IACH,CAAC;CACD,CAAA;AA5DY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,YAAO,GAAE;GACG,iBAAiB,CA4D7B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BreakingChangeRuleMetadata, IBreakingChangeInstanceRule, InstanceDetectionReport } from '../../types';
|
|
2
|
+
export declare class DotenvUpgradeRule implements IBreakingChangeInstanceRule {
|
|
3
|
+
id: string;
|
|
4
|
+
getMetadata(): BreakingChangeRuleMetadata;
|
|
5
|
+
private fileExists;
|
|
6
|
+
detect(): Promise<InstanceDetectionReport>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DotenvUpgradeRule = void 0;
|
|
10
|
+
const di_1 = require("@n8n/di");
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const promises_1 = require("node:fs/promises");
|
|
13
|
+
const node_path_1 = require("node:path");
|
|
14
|
+
let DotenvUpgradeRule = class DotenvUpgradeRule {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.id = 'dotenv-upgrade-v2';
|
|
17
|
+
}
|
|
18
|
+
getMetadata() {
|
|
19
|
+
return {
|
|
20
|
+
version: 'v2',
|
|
21
|
+
title: 'Upgrade dotenv',
|
|
22
|
+
description: 'The dotenv library has been upgraded, which may affect how .env files are parsed',
|
|
23
|
+
category: "environment",
|
|
24
|
+
severity: 'low',
|
|
25
|
+
documentationUrl: 'https://docs.n8n.io/2-0-breaking-changes/#upgrade-dotenv',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async fileExists(path) {
|
|
29
|
+
try {
|
|
30
|
+
await (0, promises_1.access)(path, node_fs_1.constants.F_OK);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async detect() {
|
|
38
|
+
const result = {
|
|
39
|
+
isAffected: false,
|
|
40
|
+
instanceIssues: [],
|
|
41
|
+
recommendations: [],
|
|
42
|
+
};
|
|
43
|
+
const possibleEnvPaths = [
|
|
44
|
+
(0, node_path_1.join)(process.cwd(), '.env'),
|
|
45
|
+
(0, node_path_1.join)(process.cwd(), '.env.local'),
|
|
46
|
+
(0, node_path_1.join)(process.cwd(), '.env.development'),
|
|
47
|
+
(0, node_path_1.join)(process.cwd(), '.env.production'),
|
|
48
|
+
];
|
|
49
|
+
const existsChecks = await Promise.all(possibleEnvPaths.map(async (path) => ({
|
|
50
|
+
path,
|
|
51
|
+
exists: await this.fileExists(path),
|
|
52
|
+
})));
|
|
53
|
+
const existingEnvFiles = existsChecks.filter((check) => check.exists);
|
|
54
|
+
if (existingEnvFiles.length === 0) {
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
result.isAffected = true;
|
|
58
|
+
result.instanceIssues.push({
|
|
59
|
+
title: 'dotenv library upgrade detected',
|
|
60
|
+
description: 'The dotenv library has been upgraded, which changes how values containing # or newlines are parsed. This may affect .env file parsing.',
|
|
61
|
+
level: 'warning',
|
|
62
|
+
});
|
|
63
|
+
result.recommendations.push({
|
|
64
|
+
action: 'Review .env files',
|
|
65
|
+
description: 'Ensure any values containing # or newlines are quoted appropriately. Avoid ambiguous unquoted usages that might now be interpreted differently.',
|
|
66
|
+
});
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
exports.DotenvUpgradeRule = DotenvUpgradeRule;
|
|
71
|
+
exports.DotenvUpgradeRule = DotenvUpgradeRule = __decorate([
|
|
72
|
+
(0, di_1.Service)()
|
|
73
|
+
], DotenvUpgradeRule);
|
|
74
|
+
//# sourceMappingURL=dotenv-upgrade.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotenv-upgrade.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/dotenv-upgrade.rule.ts"],"names":[],"mappings":";;;;;;;;;AAAA,gCAAkC;AAClC,qCAAoC;AACpC,+CAA0C;AAC1C,yCAAiC;AAU1B,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAAvB;QACN,OAAE,GAAW,mBAAmB,CAAC;IAoElC,CAAC;IAnEA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,gBAAgB;YACvB,WAAW,EACV,kFAAkF;YACnF,QAAQ,eAAoC;YAC5C,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,0DAA0D;SAC5E,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAY;QACpC,IAAI,CAAC;YACJ,MAAM,IAAA,iBAAM,EAAC,IAAI,EAAE,mBAAS,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,MAAM,GAA4B;YACvC,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,EAAE;YAClB,eAAe,EAAE,EAAE;SACnB,CAAC;QAGF,MAAM,gBAAgB,GAAG;YACxB,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;YAC3B,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;YACjC,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC;YACvC,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC;SACtC,CAAC;QAGF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;SACnC,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAGtE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,MAAM,CAAC;QACf,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,iCAAiC;YACxC,WAAW,EACV,wIAAwI;YACzI,KAAK,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,mBAAmB;YAC3B,WAAW,EACV,iJAAiJ;SAClJ,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAA;AArEY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,YAAO,GAAE;GACG,iBAAiB,CAqE7B"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { BreakingChangeRecommendation } from '@n8n/api-types';
|
|
2
|
-
import { WorkflowEntity } from '@n8n/db';
|
|
3
|
-
import { INode } from 'n8n-workflow';
|
|
1
|
+
import type { BreakingChangeAffectedWorkflow, BreakingChangeRecommendation } from '@n8n/api-types';
|
|
2
|
+
import type { WorkflowEntity } from '@n8n/db';
|
|
3
|
+
import type { INode } from 'n8n-workflow';
|
|
4
4
|
import type { BreakingChangeRuleMetadata, IBreakingChangeWorkflowRule, WorkflowDetectionReport } from '../../types';
|
|
5
5
|
export declare class FileAccessRule implements IBreakingChangeWorkflowRule {
|
|
6
6
|
private readonly FILE_NODES;
|
|
7
7
|
id: string;
|
|
8
8
|
getMetadata(): BreakingChangeRuleMetadata;
|
|
9
|
-
getRecommendations(): Promise<BreakingChangeRecommendation[]>;
|
|
9
|
+
getRecommendations(_workflowResults: BreakingChangeAffectedWorkflow[]): Promise<BreakingChangeRecommendation[]>;
|
|
10
10
|
detectWorkflow(_workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionReport>;
|
|
11
11
|
}
|
|
@@ -19,10 +19,11 @@ let FileAccessRule = class FileAccessRule {
|
|
|
19
19
|
title: 'File Access Restrictions',
|
|
20
20
|
description: 'File access is now restricted to a default directory for security purposes',
|
|
21
21
|
category: "workflow",
|
|
22
|
-
severity: '
|
|
22
|
+
severity: 'medium',
|
|
23
|
+
documentationUrl: 'https://docs.n8n.io/2-0-breaking-changes/#set-default-value-for-n8n_restrict_file_access_to',
|
|
23
24
|
};
|
|
24
25
|
}
|
|
25
|
-
async getRecommendations() {
|
|
26
|
+
async getRecommendations(_workflowResults) {
|
|
26
27
|
return [
|
|
27
28
|
{
|
|
28
29
|
action: 'Configure file access paths',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-access.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/file-access.rule.ts"],"names":[],"mappings":";;;;;;;;;AAEA,gCAAkC;AAW3B,IAAM,cAAc,GAApB,MAAM,cAAc;IAApB;QACW,eAAU,GAAG,CAAC,8BAA8B,EAAE,gCAAgC,CAAC,CAAC;QAEjG,OAAE,GAAW,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-access.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/file-access.rule.ts"],"names":[],"mappings":";;;;;;;;;AAEA,gCAAkC;AAW3B,IAAM,cAAc,GAApB,MAAM,cAAc;IAApB;QACW,eAAU,GAAG,CAAC,8BAA8B,EAAE,gCAAgC,CAAC,CAAC;QAEjG,OAAE,GAAW,4BAA4B,CAAC;IA4C3C,CAAC;IA1CA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,4EAA4E;YACzF,QAAQ,YAAiC;YACzC,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EACf,6FAA6F;SAC9F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,gBAAkD;QAElD,OAAO;YACN;gBACC,MAAM,EAAE,6BAA6B;gBACrC,WAAW,EACV,gJAAgJ;aACjJ;SACD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,SAAyB,EACzB,kBAAwC;QAExC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAChG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAErE,OAAO;YACN,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChC,KAAK,EAAE,qBAAqB,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,YAAY;gBAC1E,WAAW,EAAE,wEAAwE;gBACrF,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;aACnB,CAAC,CAAC;SACH,CAAC;IACH,CAAC;CACD,CAAA;AA/CY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,YAAO,GAAE;GACG,cAAc,CA+C1B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BreakingChangeAffectedWorkflow, BreakingChangeRecommendation } from '@n8n/api-types';
|
|
2
|
+
import type { WorkflowEntity } from '@n8n/db';
|
|
3
|
+
import type { INode } from 'n8n-workflow';
|
|
4
|
+
import type { BreakingChangeRuleMetadata, IBreakingChangeWorkflowRule, WorkflowDetectionReport } from '../../types';
|
|
5
|
+
export declare class GitNodeBareReposRule implements IBreakingChangeWorkflowRule {
|
|
6
|
+
id: string;
|
|
7
|
+
getMetadata(): BreakingChangeRuleMetadata;
|
|
8
|
+
getRecommendations(_workflowResults: BreakingChangeAffectedWorkflow[]): Promise<BreakingChangeRecommendation[]>;
|
|
9
|
+
detectWorkflow(_workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionReport>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.GitNodeBareReposRule = void 0;
|
|
10
|
+
const di_1 = require("@n8n/di");
|
|
11
|
+
let GitNodeBareReposRule = class GitNodeBareReposRule {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.id = 'git-node-bare-repos-v2';
|
|
14
|
+
}
|
|
15
|
+
getMetadata() {
|
|
16
|
+
return {
|
|
17
|
+
version: 'v2',
|
|
18
|
+
title: 'Git node bare repositories disabled by default',
|
|
19
|
+
description: 'N8N_GIT_NODE_DISABLE_BARE_REPOS now defaults to true for security. Bare repositories are disabled to prevent RCE attacks via Git hooks',
|
|
20
|
+
category: "workflow",
|
|
21
|
+
severity: 'medium',
|
|
22
|
+
documentationUrl: 'https://docs.n8n.io/2-0-breaking-changes/#change-the-default-value-of-n8n_git_node_disable_bare_repos-to-true',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async getRecommendations(_workflowResults) {
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
action: 'Review Git node usage',
|
|
29
|
+
description: 'Check if any Git nodes in your workflows use bare repositories. Bare repositories are now disabled by default for security reasons.',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
action: 'Migrate away from bare repositories',
|
|
33
|
+
description: 'If possible, update your workflows to use regular Git repositories instead of bare repositories.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
action: 'Enable bare repositories if required (not recommended)',
|
|
37
|
+
description: 'If you absolutely need bare repository support and understand the security risks, set N8N_GIT_NODE_DISABLE_BARE_REPOS=false. This is not recommended as it exposes your instance to potential RCE attacks via Git hooks.',
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
async detectWorkflow(_workflow, nodesGroupedByType) {
|
|
42
|
+
const disableBareRepos = process.env.N8N_GIT_NODE_DISABLE_BARE_REPOS;
|
|
43
|
+
if (disableBareRepos === 'false') {
|
|
44
|
+
return { isAffected: false, issues: [] };
|
|
45
|
+
}
|
|
46
|
+
const gitNodes = nodesGroupedByType.get('n8n-nodes-base.git') ?? [];
|
|
47
|
+
if (gitNodes.length === 0) {
|
|
48
|
+
return { isAffected: false, issues: [] };
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
isAffected: true,
|
|
52
|
+
issues: gitNodes.map((node) => ({
|
|
53
|
+
title: `Git node '${node.name}' may be affected by bare repository restrictions`,
|
|
54
|
+
description: 'This workflow contains a Git node. Bare repositories are now disabled by default for security reasons. If this node uses bare repositories, it may fail. Review your Git node configuration and migrate to regular repositories if needed, or set N8N_GIT_NODE_DISABLE_BARE_REPOS=false (not recommended) to re-enable bare repository support.',
|
|
55
|
+
level: 'warning',
|
|
56
|
+
nodeId: node.id,
|
|
57
|
+
nodeName: node.name,
|
|
58
|
+
})),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
exports.GitNodeBareReposRule = GitNodeBareReposRule;
|
|
63
|
+
exports.GitNodeBareReposRule = GitNodeBareReposRule = __decorate([
|
|
64
|
+
(0, di_1.Service)()
|
|
65
|
+
], GitNodeBareReposRule);
|
|
66
|
+
//# sourceMappingURL=git-node-bare-repos.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-node-bare-repos.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/git-node-bare-repos.rule.ts"],"names":[],"mappings":";;;;;;;;;AAEA,gCAAkC;AAW3B,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QACN,OAAE,GAAW,wBAAwB,CAAC;IAsEvC,CAAC;IApEA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,gDAAgD;YACvD,WAAW,EACV,wIAAwI;YACzI,QAAQ,YAAiC;YACzC,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EACf,+GAA+G;SAChH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,gBAAkD;QAElD,OAAO;YACN;gBACC,MAAM,EAAE,uBAAuB;gBAC/B,WAAW,EACV,qIAAqI;aACtI;YACD;gBACC,MAAM,EAAE,qCAAqC;gBAC7C,WAAW,EACV,kGAAkG;aACnG;YACD;gBACC,MAAM,EAAE,wDAAwD;gBAChE,WAAW,EACV,0NAA0N;aAC3N;SACD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,SAAyB,EACzB,kBAAwC;QAIxC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;QACrE,IAAI,gBAAgB,KAAK,OAAO,EAAE,CAAC;YAElC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1C,CAAC;QAGD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;QAEpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1C,CAAC;QAID,OAAO;YACN,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/B,KAAK,EAAE,aAAa,IAAI,CAAC,IAAI,mDAAmD;gBAChF,WAAW,EACV,iVAAiV;gBAClV,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;aACnB,CAAC,CAAC;SACH,CAAC;IACH,CAAC;CACD,CAAA;AAvEY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,YAAO,GAAE;GACG,oBAAoB,CAuEhC"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { BinaryDataStorageRule } from './binary-data-storage.rule';
|
|
2
|
+
import { CliActivateAllWorkflowsRule } from './cli-activate-all-workflows.rule';
|
|
3
|
+
import { GitNodeBareReposRule } from './git-node-bare-repos.rule';
|
|
4
|
+
import { RemovedDatabaseTypesRule } from './removed-database-types.rule';
|
|
5
|
+
import { SettingsFilePermissionsRule } from './settings-file-permissions.rule';
|
|
6
|
+
import { SqliteLegacyDriverRule } from './sqlite-legacy-driver.rule';
|
|
7
|
+
import { TaskRunnersRule } from './task-runners.rule';
|
|
8
|
+
declare const v2Rules: (typeof BinaryDataStorageRule | typeof CliActivateAllWorkflowsRule | typeof GitNodeBareReposRule | typeof RemovedDatabaseTypesRule | typeof SettingsFilePermissionsRule | typeof SqliteLegacyDriverRule | typeof TaskRunnersRule)[];
|
|
3
9
|
export { v2Rules };
|