n8n 1.119.0 → 1.120.0

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 (148) hide show
  1. package/dist/auth/auth.service.js +1 -0
  2. package/dist/auth/auth.service.js.map +1 -1
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/controller.registry.d.ts +1 -0
  5. package/dist/controller.registry.js +37 -12
  6. package/dist/controller.registry.js.map +1 -1
  7. package/dist/controllers/auth.controller.js +3 -1
  8. package/dist/controllers/auth.controller.js.map +1 -1
  9. package/dist/events/maps/relay.event-map.d.ts +1 -1
  10. package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -1
  11. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +1 -1
  12. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
  13. package/dist/middlewares/list-query/dtos/workflow.select.dto.js +1 -0
  14. package/dist/middlewares/list-query/dtos/workflow.select.dto.js.map +1 -1
  15. package/dist/modules/breaking-changes/breaking-changes.controller.d.ts +7 -3
  16. package/dist/modules/breaking-changes/breaking-changes.controller.js +39 -6
  17. package/dist/modules/breaking-changes/breaking-changes.controller.js.map +1 -1
  18. package/dist/modules/breaking-changes/breaking-changes.service.d.ts +9 -6
  19. package/dist/modules/breaking-changes/breaking-changes.service.js +67 -38
  20. package/dist/modules/breaking-changes/breaking-changes.service.js.map +1 -1
  21. package/dist/modules/breaking-changes/rules/v2/file-access.rule.d.ts +5 -4
  22. package/dist/modules/breaking-changes/rules/v2/file-access.rule.js +4 -3
  23. package/dist/modules/breaking-changes/rules/v2/file-access.rule.js.map +1 -1
  24. package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.d.ts +5 -4
  25. package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js +11 -13
  26. package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js.map +1 -1
  27. package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.d.ts +5 -4
  28. package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js +4 -3
  29. package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js.map +1 -1
  30. package/dist/modules/breaking-changes/types/detection.types.d.ts +9 -10
  31. package/dist/modules/breaking-changes/types/rule.types.d.ts +9 -48
  32. package/dist/modules/breaking-changes/types/rule.types.js +1 -14
  33. package/dist/modules/breaking-changes/types/rule.types.js.map +1 -1
  34. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.d.ts +9 -2
  35. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js +28 -64
  36. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js.map +1 -1
  37. package/dist/modules/insights/insights.controller.js +1 -1
  38. package/dist/modules/mcp/database/entities/oauth-access-token.entity.d.ts +9 -0
  39. package/dist/modules/mcp/database/entities/oauth-access-token.entity.js +44 -0
  40. package/dist/modules/mcp/database/entities/oauth-access-token.entity.js.map +1 -0
  41. package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.d.ts +15 -0
  42. package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js +69 -0
  43. package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js.map +1 -0
  44. package/dist/modules/mcp/database/entities/oauth-client.entity.d.ts +18 -0
  45. package/dist/modules/mcp/database/entities/oauth-client.entity.js +65 -0
  46. package/dist/modules/mcp/database/entities/oauth-client.entity.js.map +1 -0
  47. package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.d.ts +10 -0
  48. package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js +49 -0
  49. package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js.map +1 -0
  50. package/dist/modules/mcp/database/entities/oauth-user-consent.entity.d.ts +10 -0
  51. package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js +49 -0
  52. package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js.map +1 -0
  53. package/dist/modules/mcp/database/repositories/oauth-access-token.repository.d.ts +5 -0
  54. package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js +26 -0
  55. package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js.map +1 -0
  56. package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.d.ts +5 -0
  57. package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js +26 -0
  58. package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js.map +1 -0
  59. package/dist/modules/mcp/database/repositories/oauth-client.repository.d.ts +5 -0
  60. package/dist/modules/mcp/database/repositories/oauth-client.repository.js +26 -0
  61. package/dist/modules/mcp/database/repositories/oauth-client.repository.js.map +1 -0
  62. package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.d.ts +5 -0
  63. package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js +26 -0
  64. package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js.map +1 -0
  65. package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.d.ts +6 -0
  66. package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js +33 -0
  67. package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js.map +1 -0
  68. package/dist/modules/mcp/dto/approve-consent-request.dto.d.ts +8 -0
  69. package/dist/modules/mcp/dto/approve-consent-request.dto.js +11 -0
  70. package/dist/modules/mcp/dto/approve-consent-request.dto.js.map +1 -0
  71. package/dist/modules/mcp/mcp-api-key.service.d.ts +6 -9
  72. package/dist/modules/mcp/mcp-api-key.service.js +32 -61
  73. package/dist/modules/mcp/mcp-api-key.service.js.map +1 -1
  74. package/dist/modules/mcp/mcp-oauth-authorization-code.service.d.ts +11 -0
  75. package/dist/modules/mcp/mcp-oauth-authorization-code.service.js +76 -0
  76. package/dist/modules/mcp/mcp-oauth-authorization-code.service.js.map +1 -0
  77. package/dist/modules/mcp/mcp-oauth-consent.service.d.ts +20 -0
  78. package/dist/modules/mcp/mcp-oauth-consent.service.js +87 -0
  79. package/dist/modules/mcp/mcp-oauth-consent.service.js.map +1 -0
  80. package/dist/modules/mcp/mcp-oauth-service.d.ts +31 -0
  81. package/dist/modules/mcp/mcp-oauth-service.js +164 -0
  82. package/dist/modules/mcp/mcp-oauth-service.js.map +1 -0
  83. package/dist/modules/mcp/mcp-oauth-token.service.d.ts +28 -0
  84. package/dist/modules/mcp/mcp-oauth-token.service.js +182 -0
  85. package/dist/modules/mcp/mcp-oauth-token.service.js.map +1 -0
  86. package/dist/modules/mcp/mcp-oauth.helpers.d.ts +4 -0
  87. package/dist/modules/mcp/mcp-oauth.helpers.js +24 -0
  88. package/dist/modules/mcp/mcp-oauth.helpers.js.map +1 -0
  89. package/dist/modules/mcp/mcp-server-middleware.service.d.ts +18 -0
  90. package/dist/modules/mcp/mcp-server-middleware.service.js +94 -0
  91. package/dist/modules/mcp/mcp-server-middleware.service.js.map +1 -0
  92. package/dist/modules/mcp/mcp.auth.consent.controller.d.ts +17 -0
  93. package/dist/modules/mcp/mcp.auth.consent.controller.js +120 -0
  94. package/dist/modules/mcp/mcp.auth.consent.controller.js.map +1 -0
  95. package/dist/modules/mcp/mcp.controller.d.ts +2 -1
  96. package/dist/modules/mcp/mcp.controller.js +11 -3
  97. package/dist/modules/mcp/mcp.controller.js.map +1 -1
  98. package/dist/modules/mcp/mcp.module.d.ts +1 -0
  99. package/dist/modules/mcp/mcp.module.js +11 -0
  100. package/dist/modules/mcp/mcp.module.js.map +1 -1
  101. package/dist/modules/mcp/mcp.oauth-clients.controller.d.ts +12 -0
  102. package/dist/modules/mcp/mcp.oauth-clients.controller.js +93 -0
  103. package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +1 -0
  104. package/dist/modules/mcp/mcp.oauth.controller.d.ts +13 -0
  105. package/dist/modules/mcp/mcp.oauth.controller.js +124 -0
  106. package/dist/modules/mcp/mcp.oauth.controller.js.map +1 -0
  107. package/dist/modules/mcp/mcp.types.d.ts +1 -2
  108. package/dist/modules/mcp/oauth-session.service.d.ts +16 -0
  109. package/dist/modules/mcp/oauth-session.service.js +48 -0
  110. package/dist/modules/mcp/oauth-session.service.js.map +1 -0
  111. package/dist/modules/mcp/tools/search-workflows.tool.d.ts +2 -3
  112. package/dist/modules/mcp/tools/search-workflows.tool.js +11 -10
  113. package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -1
  114. package/dist/modules/provisioning.ee/provisioning.service.ee.d.ts +4 -2
  115. package/dist/modules/provisioning.ee/provisioning.service.ee.js +20 -1
  116. package/dist/modules/provisioning.ee/provisioning.service.ee.js.map +1 -1
  117. package/dist/public-api/v1/handlers/users/users.service.ee.d.ts +6 -2
  118. package/dist/public-api/v1/handlers/users/users.service.ee.js +10 -3
  119. package/dist/public-api/v1/handlers/users/users.service.ee.js.map +1 -1
  120. package/dist/public-api/v1/openapi.yml +1 -1
  121. package/dist/services/import.service.js +0 -5
  122. package/dist/services/import.service.js.map +1 -1
  123. package/dist/services/jwt.service.d.ts +1 -1
  124. package/dist/services/jwt.service.js.map +1 -1
  125. package/dist/sso.ee/oidc/oidc.service.ee.js +6 -4
  126. package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
  127. package/dist/sso.ee/saml/routes/saml.controller.ee.d.ts +2 -10
  128. package/dist/sso.ee/saml/routes/saml.controller.ee.js +2 -9
  129. package/dist/sso.ee/saml/routes/saml.controller.ee.js.map +1 -1
  130. package/dist/sso.ee/saml/saml-helpers.d.ts +4 -1
  131. package/dist/sso.ee/saml/saml-helpers.js +10 -3
  132. package/dist/sso.ee/saml/saml-helpers.js.map +1 -1
  133. package/dist/sso.ee/saml/saml.service.ee.d.ts +4 -1
  134. package/dist/sso.ee/saml/saml.service.ee.js +20 -12
  135. package/dist/sso.ee/saml/saml.service.ee.js.map +1 -1
  136. package/dist/sso.ee/saml/types.d.ts +2 -2
  137. package/dist/telemetry/index.js +17 -3
  138. package/dist/telemetry/index.js.map +1 -1
  139. package/dist/utils/validate-database-type.d.ts +3 -1
  140. package/dist/utils/validate-database-type.js +26 -4
  141. package/dist/utils/validate-database-type.js.map +1 -1
  142. package/dist/workflows/workflow-finder.service.d.ts +1 -0
  143. package/dist/workflows/workflow.request.d.ts +1 -0
  144. package/dist/workflows/workflow.service.d.ts +2 -1
  145. package/dist/workflows/workflow.service.js +1 -0
  146. package/dist/workflows/workflow.service.js.map +1 -1
  147. package/dist/workflows/workflows.controller.d.ts +4 -0
  148. package/package.json +25 -25
@@ -1,9 +1,10 @@
1
+ import { BreakingChangeRecommendation } from '@n8n/api-types';
1
2
  import { WorkflowEntity } from '@n8n/db';
2
3
  import { INode } from 'n8n-workflow';
3
- import type { BreakingChangeMetadata, IBreakingChangeWorkflowRule, Recommendation, WorkflowDetectionResult } from '../../types';
4
+ import type { BreakingChangeRuleMetadata, IBreakingChangeWorkflowRule, WorkflowDetectionReport } from '../../types';
4
5
  export declare class ProcessEnvAccessRule implements IBreakingChangeWorkflowRule {
5
6
  id: string;
6
- getMetadata(): BreakingChangeMetadata;
7
- detectWorkflow(workflow: WorkflowEntity, _nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionResult>;
8
- getRecommendations(): Promise<Recommendation[]>;
7
+ getMetadata(): BreakingChangeRuleMetadata;
8
+ detectWorkflow(workflow: WorkflowEntity, _nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionReport>;
9
+ getRecommendations(): Promise<BreakingChangeRecommendation[]>;
9
10
  }
@@ -18,7 +18,7 @@ let ProcessEnvAccessRule = class ProcessEnvAccessRule {
18
18
  title: 'Block process.env Access in Expressions and Code nodes',
19
19
  description: 'Direct access to process.env is blocked by default for security',
20
20
  category: "workflow",
21
- severity: "high",
21
+ severity: 'high',
22
22
  };
23
23
  }
24
24
  async detectWorkflow(workflow, _nodesGroupedByType) {
@@ -28,27 +28,25 @@ let ProcessEnvAccessRule = class ProcessEnvAccessRule {
28
28
  if (node.type === 'n8n-nodes-base.code') {
29
29
  const code = typeof node.parameters?.code === 'string' ? node.parameters.code : undefined;
30
30
  if (code && processEnvPattern.test(code)) {
31
- affectedNodes.push(node.name);
31
+ affectedNodes.push({ nodeId: node.id, nodeName: node.name });
32
32
  }
33
33
  }
34
34
  else {
35
35
  const nodeJson = JSON.stringify(node.parameters);
36
- if (processEnvPattern.test(nodeJson) && !affectedNodes.includes(node.name)) {
37
- affectedNodes.push(node.name);
36
+ if (processEnvPattern.test(nodeJson) && !affectedNodes.some((n) => n.nodeId === node.id)) {
37
+ affectedNodes.push({ nodeId: node.id, nodeName: node.name });
38
38
  }
39
39
  }
40
40
  });
41
41
  return {
42
42
  isAffected: affectedNodes.length > 0,
43
- issues: affectedNodes.length > 0
44
- ? [
45
- {
46
- title: 'process.env access detected',
47
- description: `The following nodes contain process.env access: '${affectedNodes.join(', ')}'. This will be blocked by default in v2.0.0.`,
48
- level: "error",
49
- },
50
- ]
51
- : [],
43
+ issues: affectedNodes.map((n) => ({
44
+ title: 'process.env access detected',
45
+ description: `Node with name '${n.nodeName}' accesses process.env which is blocked by default for security reasons.`,
46
+ level: 'error',
47
+ nodeId: n.nodeId,
48
+ nodeName: n.nodeName,
49
+ })) || [],
52
50
  };
53
51
  }
54
52
  async getRecommendations() {
@@ -1 +1 @@
1
- {"version":3,"file":"process-env-access.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/process-env-access.rule.ts"],"names":[],"mappings":";;;;;;;;;AACA,gCAAkC;AAY3B,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QACN,OAAE,GAAW,uBAAuB,CAAC;IAiEtC,CAAC;IAhEA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,wDAAwD;YAC/D,WAAW,EAAE,iEAAiE;YAC9E,QAAQ,YAAiC;YACzC,QAAQ,QAA6B;SACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,QAAwB,EACxB,mBAAyC;QAKzC,MAAM,iBAAiB,GAAG,kDAAkD,CAAC;QAE7E,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAE/B,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1F,IAAI,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACF,CAAC;iBAAM,CAAC;gBAEP,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjD,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5E,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO;YACN,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC;YACpC,MAAM,EACL,aAAa,CAAC,MAAM,GAAG,CAAC;gBACvB,CAAC,CAAC;oBACA;wBACC,KAAK,EAAE,6BAA6B;wBACpC,WAAW,EAAE,oDAAoD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C;wBACxI,KAAK,SAAkB;qBACvB;iBACD;gBACF,CAAC,CAAC,EAAE;SACN,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACvB,OAAO;YACN;gBACC,MAAM,EAAE,0BAA0B;gBAClC,WAAW,EAAE,kEAAkE;aAC/E;YACD;gBACC,MAAM,EAAE,2BAA2B;gBACnC,WAAW,EAAE,wDAAwD;aACrE;SACD,CAAC;IACH,CAAC;CACD,CAAA;AAlEY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,YAAO,GAAE;GACG,oBAAoB,CAkEhC"}
1
+ {"version":3,"file":"process-env-access.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/process-env-access.rule.ts"],"names":[],"mappings":";;;;;;;;;AAEA,gCAAkC;AAW3B,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QACN,OAAE,GAAW,uBAAuB,CAAC;IA+DtC,CAAC;IA9DA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,wDAAwD;YAC/D,WAAW,EAAE,iEAAiE;YAC9E,QAAQ,YAAiC;YACzC,QAAQ,EAAE,MAAM;SAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,QAAwB,EACxB,mBAAyC;QAKzC,MAAM,iBAAiB,GAAG,kDAAkD,CAAC;QAE7E,MAAM,aAAa,GAAgD,EAAE,CAAC;QAEtE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAE/B,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1F,IAAI,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACF,CAAC;iBAAM,CAAC;gBAEP,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjD,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC1F,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO;YACN,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC;YACpC,MAAM,EACL,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,KAAK,EAAE,6BAA6B;gBACpC,WAAW,EAAE,mBAAmB,CAAC,CAAC,QAAQ,0EAA0E;gBACpH,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACpB,CAAC,CAAC,IAAI,EAAE;SACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACvB,OAAO;YACN;gBACC,MAAM,EAAE,0BAA0B;gBAClC,WAAW,EAAE,kEAAkE;aAC/E;YACD;gBACC,MAAM,EAAE,2BAA2B;gBACnC,WAAW,EAAE,wDAAwD;aACrE;SACD,CAAC;IACH,CAAC;CACD,CAAA;AAhEY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,YAAO,GAAE;GACG,oBAAoB,CAgEhC"}
@@ -1,10 +1,11 @@
1
+ import { BreakingChangeRecommendation } from '@n8n/api-types';
1
2
  import type { WorkflowEntity } from '@n8n/db';
2
3
  import { INode } from 'n8n-workflow';
3
- import type { BreakingChangeMetadata, WorkflowDetectionResult, Recommendation, IBreakingChangeWorkflowRule } from '../../types';
4
+ import type { BreakingChangeRuleMetadata, IBreakingChangeWorkflowRule, WorkflowDetectionReport } from '../../types';
4
5
  export declare class RemovedNodesRule implements IBreakingChangeWorkflowRule {
5
6
  private readonly REMOVED_NODES;
6
7
  id: string;
7
- getMetadata(): BreakingChangeMetadata;
8
- getRecommendations(): Promise<Recommendation[]>;
9
- detectWorkflow(_workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionResult>;
8
+ getMetadata(): BreakingChangeRuleMetadata;
9
+ getRecommendations(): Promise<BreakingChangeRecommendation[]>;
10
+ detectWorkflow(_workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionReport>;
10
11
  }
@@ -23,7 +23,7 @@ let RemovedNodesRule = class RemovedNodesRule {
23
23
  title: 'Removed Deprecated Nodes',
24
24
  description: 'Several deprecated nodes have been removed and will no longer work',
25
25
  category: "workflow",
26
- severity: "critical",
26
+ severity: 'critical',
27
27
  };
28
28
  }
29
29
  async getRecommendations() {
@@ -31,7 +31,6 @@ let RemovedNodesRule = class RemovedNodesRule {
31
31
  {
32
32
  action: 'Update affected workflows',
33
33
  description: 'Replace removed nodes with their updated versions or alternatives',
34
- documentationUrl: this.getMetadata().documentationUrl,
35
34
  },
36
35
  ];
37
36
  }
@@ -44,7 +43,9 @@ let RemovedNodesRule = class RemovedNodesRule {
44
43
  issues: removedNodes.map((node) => ({
45
44
  title: `Node '${node.type}' with name '${node.name}' has been removed`,
46
45
  description: `The node type '${node.type}' is no longer available. Please replace it with an alternative.`,
47
- level: "error",
46
+ level: 'error',
47
+ nodeId: node.id,
48
+ nodeName: node.name,
48
49
  })),
49
50
  };
50
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"removed-nodes.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/removed-nodes.rule.ts"],"names":[],"mappings":";;;;;;;;;AACA,gCAAkC;AAY3B,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QACW,kBAAa,GAAG;YAChC,wBAAwB;YACxB,yBAAyB;YACzB,0BAA0B;SAC1B,CAAC;QAEF,OAAE,GAAW,kBAAkB,CAAC;IAsCjC,CAAC;IApCA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,oEAAoE;YACjF,QAAQ,YAAiC;YACzC,QAAQ,YAAiC;SACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACvB,OAAO;YACN;gBACC,MAAM,EAAE,2BAA2B;gBACnC,WAAW,EAAE,mEAAmE;gBAChF,gBAAgB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,gBAAgB;aACrD;SACD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,SAAyB,EACzB,kBAAwC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9F,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAExE,OAAO;YACN,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACnC,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,oBAAoB;gBACtE,WAAW,EAAE,kBAAkB,IAAI,CAAC,IAAI,kEAAkE;gBAC1G,KAAK,SAAkB;aACvB,CAAC,CAAC;SACH,CAAC;IACH,CAAC;CACD,CAAA;AA7CY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,YAAO,GAAE;GACG,gBAAgB,CA6C5B"}
1
+ {"version":3,"file":"removed-nodes.rule.js","sourceRoot":"","sources":["../../../../../src/modules/breaking-changes/rules/v2/removed-nodes.rule.ts"],"names":[],"mappings":";;;;;;;;;AAEA,gCAAkC;AAW3B,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QACW,kBAAa,GAAG;YAChC,wBAAwB;YACxB,yBAAyB;YACzB,0BAA0B;SAC1B,CAAC;QAEF,OAAE,GAAW,kBAAkB,CAAC;IAuCjC,CAAC;IArCA,WAAW;QACV,OAAO;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,oEAAoE;YACjF,QAAQ,YAAiC;YACzC,QAAQ,EAAE,UAAU;SACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACvB,OAAO;YACN;gBACC,MAAM,EAAE,2BAA2B;gBACnC,WAAW,EAAE,mEAAmE;aAChF;SACD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,SAAyB,EACzB,kBAAwC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9F,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAExE,OAAO;YACN,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACnC,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,oBAAoB;gBACtE,WAAW,EAAE,kBAAkB,IAAI,CAAC,IAAI,kEAAkE;gBAC1G,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;aACnB,CAAC,CAAC;SACH,CAAC;IACH,CAAC;CACD,CAAA;AA9CY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,YAAO,GAAE;GACG,gBAAgB,CA8C5B"}
@@ -1,11 +1,10 @@
1
- import type { DetectionResult } from './rule.types';
2
- export interface DetectionReport {
3
- generatedAt: Date;
4
- targetVersion: string;
5
- currentVersion: string;
6
- summary: {
7
- totalIssues: number;
8
- criticalIssues: number;
9
- };
10
- results: DetectionResult[];
1
+ import type { BreakingChangeInstanceIssue, BreakingChangeRecommendation, BreakingChangeWorkflowIssue } from '@n8n/api-types';
2
+ export interface WorkflowDetectionReport {
3
+ isAffected: boolean;
4
+ issues: BreakingChangeWorkflowIssue[];
5
+ }
6
+ export interface InstanceDetectionReport {
7
+ isAffected: boolean;
8
+ instanceIssues: BreakingChangeInstanceIssue[];
9
+ recommendations: BreakingChangeRecommendation[];
11
10
  }
@@ -1,11 +1,7 @@
1
+ import type { BreakingChangeAffectedWorkflow, BreakingChangeRecommendation, BreakingChangeRuleSeverity } from '@n8n/api-types';
1
2
  import type { WorkflowEntity } from '@n8n/db';
2
3
  import type { INode } from 'n8n-workflow';
3
- export declare const enum BreakingChangeSeverity {
4
- critical = "critical",
5
- high = "high",
6
- medium = "medium",
7
- low = "low"
8
- }
4
+ import type { InstanceDetectionReport, WorkflowDetectionReport } from './detection.types';
9
5
  export declare const enum BreakingChangeCategory {
10
6
  workflow = "workflow",
11
7
  instance = "instance",
@@ -13,59 +9,24 @@ export declare const enum BreakingChangeCategory {
13
9
  database = "database",
14
10
  infrastructure = "infrastructure"
15
11
  }
16
- export declare const enum IssueLevel {
17
- error = "error",
18
- warning = "warning",
19
- info = "info"
20
- }
21
12
  export type BreakingChangeVersion = 'v2';
22
- export interface BreakingChangeMetadata {
13
+ export interface BreakingChangeRuleMetadata {
23
14
  version: BreakingChangeVersion;
24
15
  title: string;
25
16
  description: string;
26
17
  category: BreakingChangeCategory;
27
- severity: BreakingChangeSeverity;
28
- documentationUrl?: string;
29
- }
30
- export interface WorkflowDetectionResult {
31
- isAffected: boolean;
32
- issues: DetectionIssue[];
33
- }
34
- export interface InstanceDetectionResult {
35
- isAffected: boolean;
36
- instanceIssues: DetectionIssue[];
37
- recommendations: Recommendation[];
38
- }
39
- export type AffectedWorkflow = Omit<WorkflowDetectionResult, 'isAffected'> & {
40
- id: string;
41
- name: string;
42
- active: boolean;
43
- };
44
- export interface DetectionResult {
45
- ruleId: string;
46
- affectedWorkflows: AffectedWorkflow[];
47
- instanceIssues: DetectionIssue[];
48
- recommendations: Recommendation[];
49
- }
50
- export interface DetectionIssue {
51
- title: string;
52
- description: string;
53
- level: IssueLevel;
54
- }
55
- export interface Recommendation {
56
- action: string;
57
- description: string;
18
+ severity: BreakingChangeRuleSeverity;
58
19
  documentationUrl?: string;
59
20
  }
60
21
  export interface IBreakingChangeInstanceRule {
61
22
  id: string;
62
- getMetadata(): BreakingChangeMetadata;
63
- detect(): Promise<InstanceDetectionResult>;
23
+ getMetadata(): BreakingChangeRuleMetadata;
24
+ detect(): Promise<InstanceDetectionReport>;
64
25
  }
65
26
  export interface IBreakingChangeWorkflowRule {
66
27
  id: string;
67
- getMetadata(): BreakingChangeMetadata;
68
- getRecommendations(workflowResults: AffectedWorkflow[]): Promise<Recommendation[]>;
69
- detectWorkflow(workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionResult>;
28
+ getMetadata(): BreakingChangeRuleMetadata;
29
+ getRecommendations(workflowResults: BreakingChangeAffectedWorkflow[]): Promise<BreakingChangeRecommendation[]>;
30
+ detectWorkflow(workflow: WorkflowEntity, nodesGroupedByType: Map<string, INode[]>): Promise<WorkflowDetectionReport>;
70
31
  }
71
32
  export type IBreakingChangeRule = IBreakingChangeInstanceRule | IBreakingChangeWorkflowRule;
@@ -1,13 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IssueLevel = exports.BreakingChangeCategory = exports.BreakingChangeSeverity = void 0;
4
- var BreakingChangeSeverity;
5
- (function (BreakingChangeSeverity) {
6
- BreakingChangeSeverity["critical"] = "critical";
7
- BreakingChangeSeverity["high"] = "high";
8
- BreakingChangeSeverity["medium"] = "medium";
9
- BreakingChangeSeverity["low"] = "low";
10
- })(BreakingChangeSeverity || (exports.BreakingChangeSeverity = BreakingChangeSeverity = {}));
3
+ exports.BreakingChangeCategory = void 0;
11
4
  var BreakingChangeCategory;
12
5
  (function (BreakingChangeCategory) {
13
6
  BreakingChangeCategory["workflow"] = "workflow";
@@ -16,10 +9,4 @@ var BreakingChangeCategory;
16
9
  BreakingChangeCategory["database"] = "database";
17
10
  BreakingChangeCategory["infrastructure"] = "infrastructure";
18
11
  })(BreakingChangeCategory || (exports.BreakingChangeCategory = BreakingChangeCategory = {}));
19
- var IssueLevel;
20
- (function (IssueLevel) {
21
- IssueLevel["error"] = "error";
22
- IssueLevel["warning"] = "warning";
23
- IssueLevel["info"] = "info";
24
- })(IssueLevel || (exports.IssueLevel = IssueLevel = {}));
25
12
  //# sourceMappingURL=rule.types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule.types.js","sourceRoot":"","sources":["../../../../src/modules/breaking-changes/types/rule.types.ts"],"names":[],"mappings":";;;AAGA,IAAkB,sBAKjB;AALD,WAAkB,sBAAsB;IACvC,+CAAqB,CAAA;IACrB,uCAAa,CAAA;IACb,2CAAiB,CAAA;IACjB,qCAAW,CAAA;AACZ,CAAC,EALiB,sBAAsB,sCAAtB,sBAAsB,QAKvC;AAED,IAAkB,sBAMjB;AAND,WAAkB,sBAAsB;IACvC,+CAAqB,CAAA;IACrB,+CAAqB,CAAA;IACrB,qDAA2B,CAAA;IAC3B,+CAAqB,CAAA;IACrB,2DAAiC,CAAA;AAClC,CAAC,EANiB,sBAAsB,sCAAtB,sBAAsB,QAMvC;AAED,IAAkB,UAIjB;AAJD,WAAkB,UAAU;IAC3B,6BAAe,CAAA;IACf,iCAAmB,CAAA;IACnB,2BAAa,CAAA;AACd,CAAC,EAJiB,UAAU,0BAAV,UAAU,QAI3B"}
1
+ {"version":3,"file":"rule.types.js","sourceRoot":"","sources":["../../../../src/modules/breaking-changes/types/rule.types.ts"],"names":[],"mappings":";;;AAUA,IAAkB,sBAMjB;AAND,WAAkB,sBAAsB;IACvC,+CAAqB,CAAA;IACrB,+CAAqB,CAAA;IACrB,qDAA2B,CAAA;IAC3B,+CAAqB,CAAA;IACrB,2DAAiC,CAAA;AAClC,CAAC,EANiB,sBAAsB,sCAAtB,sBAAsB,QAMvC"}
@@ -1,6 +1,13 @@
1
1
  import type { DatabaseConfig } from '@n8n/config';
2
- export declare const getDateRangesCommonTableExpressionQuery: ({ dbType, startDate, endDate, }: {
3
- dbType: DatabaseConfig["type"];
2
+ import { DateTime } from 'luxon';
3
+ export declare const getDateRangesCommonTableExpressionQuery: ({ startDate, endDate, dbType, }: {
4
4
  startDate: Date;
5
5
  endDate: Date;
6
+ dbType: DatabaseConfig["type"];
6
7
  }) => string;
8
+ export declare function getDateRangesSelectQuery({ dbType, prevStartDateTime, startDateTime, endDateTime, }: {
9
+ dbType: DatabaseConfig['type'];
10
+ prevStartDateTime: DateTime;
11
+ startDateTime: DateTime;
12
+ endDateTime: DateTime;
13
+ }): string;
@@ -1,76 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDateRangesCommonTableExpressionQuery = void 0;
4
+ exports.getDateRangesSelectQuery = getDateRangesSelectQuery;
4
5
  const db_1 = require("@n8n/db");
5
6
  const luxon_1 = require("luxon");
6
- const getDatetimeSql = ({ dbType, daysFromToday, useStartOfDay = false, }) => {
7
- if (daysFromToday === 0 && !useStartOfDay) {
8
- return dbType === 'sqlite' ? "datetime('now')" : 'NOW()';
7
+ const getDateRangesCommonTableExpressionQuery = ({ startDate, endDate, dbType, }) => {
8
+ let startDateTime = luxon_1.DateTime.fromJSDate(startDate).toUTC();
9
+ let endDateTime = luxon_1.DateTime.fromJSDate(endDate).toUTC();
10
+ const today = luxon_1.DateTime.now().toUTC();
11
+ const isEndDateToday = endDateTime.hasSame(today, 'day');
12
+ if (!isEndDateToday) {
13
+ startDateTime = startDateTime.startOf('day');
14
+ endDateTime = endDateTime.plus({ days: 1 }).startOf('day');
9
15
  }
10
- if (dbType === 'sqlite') {
11
- if (daysFromToday === 0 && useStartOfDay) {
12
- return "datetime('now', 'start of day')";
13
- }
14
- if (useStartOfDay) {
15
- return `datetime('now', '-${daysFromToday} days', 'start of day')`;
16
- }
17
- return `datetime('now', '-${daysFromToday} days')`;
16
+ if (isEndDateToday && startDateTime.hasSame(endDateTime, 'day')) {
17
+ startDateTime = startDateTime.startOf('day');
18
18
  }
19
- if (dbType === 'postgresdb') {
20
- if (daysFromToday === 0 && useStartOfDay) {
21
- return "DATE_TRUNC('day', NOW())";
22
- }
23
- if (useStartOfDay) {
24
- return `DATE_TRUNC('day', NOW() - INTERVAL '${daysFromToday} days')`;
25
- }
26
- return `NOW() - INTERVAL '${daysFromToday} days'`;
27
- }
28
- if (daysFromToday === 0 && useStartOfDay) {
29
- return 'DATE(NOW())';
30
- }
31
- if (useStartOfDay) {
32
- return `DATE(DATE_SUB(NOW(), INTERVAL ${daysFromToday} DAY))`;
33
- }
34
- return `DATE_SUB(NOW(), INTERVAL ${daysFromToday} DAY)`;
19
+ const prevStartDateTime = startDateTime.minus(endDateTime.diff(startDateTime));
20
+ return getDateRangesSelectQuery({ dbType, prevStartDateTime, startDateTime, endDateTime });
35
21
  };
36
- const getDateRangesCommonTableExpressionQuery = ({ dbType, startDate, endDate, }) => {
37
- const today = luxon_1.DateTime.now().startOf('day');
38
- const startDateStartOfDay = luxon_1.DateTime.fromJSDate(startDate).startOf('day');
39
- const endDateStartOfDay = luxon_1.DateTime.fromJSDate(endDate).startOf('day');
40
- const daysFromEndDateToToday = Math.floor(today.diff(endDateStartOfDay, 'days').days);
41
- const daysDiff = Math.floor(endDateStartOfDay.diff(startDateStartOfDay, 'days').days);
42
- const isEndDateToday = daysFromEndDateToToday === 0;
43
- let prevStartDateSql;
44
- let startDateSql;
45
- let endDateSql;
46
- if (daysDiff === 0 && isEndDateToday) {
47
- prevStartDateSql = getDatetimeSql({ dbType, daysFromToday: 2, useStartOfDay: false });
48
- startDateSql = getDatetimeSql({ dbType, daysFromToday: 1, useStartOfDay: false });
49
- endDateSql = getDatetimeSql({ dbType, daysFromToday: 0, useStartOfDay: false });
50
- }
51
- else {
52
- const dateRangeInDays = daysDiff + 1;
53
- const daysFromStartDateToToday = Math.floor(today.diff(startDateStartOfDay, 'days').days);
54
- const prevStartDaysFromToday = daysFromStartDateToToday + dateRangeInDays;
55
- prevStartDateSql = getDatetimeSql({
56
- dbType,
57
- daysFromToday: prevStartDaysFromToday,
58
- useStartOfDay: true,
59
- });
60
- startDateSql = getDatetimeSql({
61
- dbType,
62
- daysFromToday: daysFromStartDateToToday,
63
- useStartOfDay: true,
64
- });
65
- endDateSql = isEndDateToday
66
- ? getDatetimeSql({ dbType, daysFromToday: 0, useStartOfDay: false })
67
- : getDatetimeSql({ dbType, daysFromToday: daysFromEndDateToToday - 1, useStartOfDay: true });
22
+ exports.getDateRangesCommonTableExpressionQuery = getDateRangesCommonTableExpressionQuery;
23
+ function getDateRangesSelectQuery({ dbType, prevStartDateTime, startDateTime, endDateTime, }) {
24
+ const prevStartStr = prevStartDateTime.toSQL({ includeZone: false, includeOffset: false });
25
+ const startStr = startDateTime.toSQL({ includeZone: false, includeOffset: false });
26
+ const endStr = endDateTime.toSQL({ includeZone: false, includeOffset: false });
27
+ if (dbType === 'postgresdb') {
28
+ return (0, db_1.sql) `SELECT
29
+ CAST('${prevStartStr}' AS TIMESTAMP) AS prev_start_date,
30
+ CAST('${startStr}' AS TIMESTAMP) AS start_date,
31
+ CAST('${endStr}' AS TIMESTAMP) AS end_date
32
+ `;
68
33
  }
69
34
  return (0, db_1.sql) `SELECT
70
- ${prevStartDateSql} AS prev_start_date,
71
- ${startDateSql} AS start_date,
72
- ${endDateSql} AS end_date
35
+ '${prevStartStr}' AS prev_start_date,
36
+ '${startStr}' AS start_date,
37
+ '${endStr}' AS end_date
73
38
  `;
74
- };
75
- exports.getDateRangesCommonTableExpressionQuery = getDateRangesCommonTableExpressionQuery;
39
+ }
76
40
  //# sourceMappingURL=insights-by-period-query.helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"insights-by-period-query.helper.js","sourceRoot":"","sources":["../../../../../src/modules/insights/database/repositories/insights-by-period-query.helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"insights-by-period-query.helper.js","sourceRoot":"","sources":["../../../../../src/modules/insights/database/repositories/insights-by-period-query.helper.ts"],"names":[],"mappings":";;;AAoDA,4DA+BC;AAlFD,gCAA8B;AAC9B,iCAAiC;AAmB1B,MAAM,uCAAuC,GAAG,CAAC,EACvD,SAAS,EACT,OAAO,EACP,MAAM,GAKN,EAAE,EAAE;IACJ,IAAI,aAAa,GAAG,gBAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,IAAI,WAAW,GAAG,gBAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvD,MAAM,KAAK,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACrC,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAGzD,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAGD,IAAI,cAAc,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QACjE,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,iBAAiB,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAE/E,OAAO,wBAAwB,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;AAC5F,CAAC,CAAC;AA7BW,QAAA,uCAAuC,2CA6BlD;AAEF,SAAgB,wBAAwB,CAAC,EACxC,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,WAAW,GAMX;IACA,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAK/E,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,IAAA,QAAG,EAAA;WACD,YAAY;WACZ,QAAQ;WACR,MAAM;GACd,CAAC;IACH,CAAC;IAED,OAAO,IAAA,QAAG,EAAA;MACL,YAAY;MACZ,QAAQ;MACR,MAAM;EACV,CAAC;AACH,CAAC"}
@@ -97,7 +97,7 @@ let InsightsController = class InsightsController {
97
97
  const today = new Date();
98
98
  if (!query.startDate) {
99
99
  return {
100
- startDate: luxon_1.DateTime.now().minus({ days: 6 }).toJSDate(),
100
+ startDate: luxon_1.DateTime.now().minus({ days: 7 }).toJSDate(),
101
101
  endDate: today,
102
102
  };
103
103
  }
@@ -0,0 +1,9 @@
1
+ import { User } from '@n8n/db';
2
+ import { OAuthClient } from './oauth-client.entity';
3
+ export declare class AccessToken {
4
+ token: string;
5
+ client: OAuthClient;
6
+ clientId: string;
7
+ user: User;
8
+ userId: string;
9
+ }
@@ -0,0 +1,44 @@
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.AccessToken = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_client_entity_1 = require("./oauth-client.entity");
16
+ let AccessToken = class AccessToken {
17
+ };
18
+ exports.AccessToken = AccessToken;
19
+ __decorate([
20
+ (0, typeorm_1.Column)({ type: 'varchar', primary: true }),
21
+ __metadata("design:type", String)
22
+ ], AccessToken.prototype, "token", void 0);
23
+ __decorate([
24
+ (0, typeorm_1.ManyToOne)(() => oauth_client_entity_1.OAuthClient, (client) => client.accessTokens, { onDelete: 'CASCADE' }),
25
+ __metadata("design:type", oauth_client_entity_1.OAuthClient)
26
+ ], AccessToken.prototype, "client", void 0);
27
+ __decorate([
28
+ (0, typeorm_1.Index)(),
29
+ (0, typeorm_1.Column)({ type: String }),
30
+ __metadata("design:type", String)
31
+ ], AccessToken.prototype, "clientId", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.ManyToOne)(() => db_1.User, { onDelete: 'CASCADE' }),
34
+ __metadata("design:type", db_1.User)
35
+ ], AccessToken.prototype, "user", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Index)(),
38
+ (0, typeorm_1.Column)({ type: String }),
39
+ __metadata("design:type", String)
40
+ ], AccessToken.prototype, "userId", void 0);
41
+ exports.AccessToken = AccessToken = __decorate([
42
+ (0, typeorm_1.Entity)('oauth_access_tokens')
43
+ ], AccessToken);
44
+ //# sourceMappingURL=oauth-access-token.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-access-token.entity.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/entities/oauth-access-token.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAA+B;AAC/B,0CAAgE;AAEhE,+DAAoD;AAG7C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAqBvB,CAAA;AArBY,kCAAW;AAEvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CAC7B;AAOd;IALC,IAAA,mBAAS,EACT,GAAG,EAAE,CAAC,iCAAW,EACjB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAC/B,EAAE,QAAQ,EAAE,SAAS,EAAE,CACvB;8BACO,iCAAW;2CAAC;AAIpB;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACR;AAGjB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,SAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;8BACzC,SAAI;yCAAC;AAIX;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2CACV;sBApBH,WAAW;IADvB,IAAA,gBAAM,EAAC,qBAAqB,CAAC;GACjB,WAAW,CAqBvB"}
@@ -0,0 +1,15 @@
1
+ import { User, WithTimestamps } from '@n8n/db';
2
+ import { OAuthClient } from './oauth-client.entity';
3
+ export declare class AuthorizationCode extends WithTimestamps {
4
+ code: string;
5
+ client: OAuthClient;
6
+ clientId: string;
7
+ user: User;
8
+ userId: string;
9
+ redirectUri: string;
10
+ codeChallenge: string;
11
+ codeChallengeMethod: string;
12
+ state: string | null;
13
+ expiresAt: number;
14
+ used: boolean;
15
+ }
@@ -0,0 +1,69 @@
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.AuthorizationCode = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_client_entity_1 = require("./oauth-client.entity");
16
+ let AuthorizationCode = class AuthorizationCode extends db_1.WithTimestamps {
17
+ };
18
+ exports.AuthorizationCode = AuthorizationCode;
19
+ __decorate([
20
+ (0, typeorm_1.Column)({ type: 'varchar', primary: true }),
21
+ __metadata("design:type", String)
22
+ ], AuthorizationCode.prototype, "code", void 0);
23
+ __decorate([
24
+ (0, typeorm_1.ManyToOne)(() => oauth_client_entity_1.OAuthClient, (client) => client.authorizationCodes, { onDelete: 'CASCADE' }),
25
+ __metadata("design:type", oauth_client_entity_1.OAuthClient)
26
+ ], AuthorizationCode.prototype, "client", void 0);
27
+ __decorate([
28
+ (0, typeorm_1.Index)(),
29
+ (0, typeorm_1.Column)({ type: String }),
30
+ __metadata("design:type", String)
31
+ ], AuthorizationCode.prototype, "clientId", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.ManyToOne)(() => db_1.User, { onDelete: 'CASCADE' }),
34
+ __metadata("design:type", db_1.User)
35
+ ], AuthorizationCode.prototype, "user", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Index)(),
38
+ (0, typeorm_1.Column)({ type: String }),
39
+ __metadata("design:type", String)
40
+ ], AuthorizationCode.prototype, "userId", void 0);
41
+ __decorate([
42
+ (0, typeorm_1.Column)({ type: String }),
43
+ __metadata("design:type", String)
44
+ ], AuthorizationCode.prototype, "redirectUri", void 0);
45
+ __decorate([
46
+ (0, typeorm_1.Column)({ type: String }),
47
+ __metadata("design:type", String)
48
+ ], AuthorizationCode.prototype, "codeChallenge", void 0);
49
+ __decorate([
50
+ (0, typeorm_1.Column)({ type: String }),
51
+ __metadata("design:type", String)
52
+ ], AuthorizationCode.prototype, "codeChallengeMethod", void 0);
53
+ __decorate([
54
+ (0, typeorm_1.Column)({ type: String, nullable: true }),
55
+ __metadata("design:type", Object)
56
+ ], AuthorizationCode.prototype, "state", void 0);
57
+ __decorate([
58
+ (0, typeorm_1.Index)(),
59
+ (0, typeorm_1.Column)({ type: 'int' }),
60
+ __metadata("design:type", Number)
61
+ ], AuthorizationCode.prototype, "expiresAt", void 0);
62
+ __decorate([
63
+ (0, typeorm_1.Column)({ type: Boolean, default: false }),
64
+ __metadata("design:type", Boolean)
65
+ ], AuthorizationCode.prototype, "used", void 0);
66
+ exports.AuthorizationCode = AuthorizationCode = __decorate([
67
+ (0, typeorm_1.Entity)('oauth_authorization_codes')
68
+ ], AuthorizationCode);
69
+ //# sourceMappingURL=oauth-authorization-code.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-authorization-code.entity.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/entities/oauth-authorization-code.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAA+C;AAC/C,0CAAgE;AAEhE,+DAAoD;AAG7C,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,mBAAc;CAwCpD,CAAA;AAxCY,8CAAiB;AAE7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CAC9B;AAOb;IALC,IAAA,mBAAS,EACT,GAAG,EAAE,CAAC,iCAAW,EACjB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,EACrC,EAAE,QAAQ,EAAE,SAAS,EAAE,CACvB;8BACO,iCAAW;iDAAC;AAIpB;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDACR;AAGjB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,SAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;8BACzC,SAAI;+CAAC;AAIX;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;iDACV;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDACL;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;wDACH;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8DACG;AAG5B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACpB;AAIrB;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;oDACN;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;+CAC5B;4BAvCF,iBAAiB;IAD7B,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,iBAAiB,CAwC7B"}
@@ -0,0 +1,18 @@
1
+ import { WithTimestamps } from '@n8n/db';
2
+ import type { AccessToken } from './oauth-access-token.entity';
3
+ import type { AuthorizationCode } from './oauth-authorization-code.entity';
4
+ import type { RefreshToken } from './oauth-refresh-token.entity';
5
+ import type { UserConsent } from './oauth-user-consent.entity';
6
+ export declare class OAuthClient extends WithTimestamps {
7
+ id: string;
8
+ name: string;
9
+ redirectUris: string[];
10
+ grantTypes: string[];
11
+ tokenEndpointAuthMethod: string;
12
+ authorizationCodes: AuthorizationCode[];
13
+ accessTokens: AccessToken[];
14
+ refreshTokens: RefreshToken[];
15
+ userConsents: UserConsent[];
16
+ clientSecret: string | null;
17
+ clientSecretExpiresAt: number | null;
18
+ }