n8n 0.167.0 → 0.168.2

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 (258) hide show
  1. package/dist/commands/execute.js +3 -0
  2. package/dist/commands/execute.js.map +1 -1
  3. package/dist/commands/executeBatch.d.ts +2 -0
  4. package/dist/commands/executeBatch.js +3 -0
  5. package/dist/commands/executeBatch.js.map +1 -1
  6. package/dist/commands/import/credentials.d.ts +10 -0
  7. package/dist/commands/import/credentials.js +87 -26
  8. package/dist/commands/import/credentials.js.map +1 -1
  9. package/dist/commands/import/workflow.d.ts +11 -1
  10. package/dist/commands/import/workflow.js +109 -48
  11. package/dist/commands/import/workflow.js.map +1 -1
  12. package/dist/commands/start.js +25 -0
  13. package/dist/commands/start.js.map +1 -1
  14. package/dist/commands/user-management/reset.d.ts +7 -0
  15. package/dist/commands/user-management/reset.js +66 -0
  16. package/dist/commands/user-management/reset.js.map +1 -0
  17. package/dist/commands/worker.js +4 -1
  18. package/dist/commands/worker.js.map +1 -1
  19. package/dist/config/index.d.ts +23 -0
  20. package/dist/config/index.js +92 -4
  21. package/dist/config/index.js.map +1 -1
  22. package/dist/src/ActiveWorkflowRunner.d.ts +2 -1
  23. package/dist/src/ActiveWorkflowRunner.js +44 -24
  24. package/dist/src/ActiveWorkflowRunner.js.map +1 -1
  25. package/dist/src/CredentialsHelper.d.ts +10 -2
  26. package/dist/src/CredentialsHelper.js +40 -11
  27. package/dist/src/CredentialsHelper.js.map +1 -1
  28. package/dist/src/Db.d.ts +4 -1
  29. package/dist/src/Db.js +90 -66
  30. package/dist/src/Db.js.map +1 -1
  31. package/dist/src/GenericHelpers.d.ts +6 -0
  32. package/dist/src/GenericHelpers.js +18 -1
  33. package/dist/src/GenericHelpers.js.map +1 -1
  34. package/dist/src/Interfaces.d.ts +74 -9
  35. package/dist/src/InternalHooks.d.ts +42 -6
  36. package/dist/src/InternalHooks.js +54 -13
  37. package/dist/src/InternalHooks.js.map +1 -1
  38. package/dist/src/ResponseHelper.js +5 -0
  39. package/dist/src/ResponseHelper.js.map +1 -1
  40. package/dist/src/Server.d.ts +2 -0
  41. package/dist/src/Server.js +584 -458
  42. package/dist/src/Server.js.map +1 -1
  43. package/dist/src/TagHelpers.d.ts +3 -3
  44. package/dist/src/TagHelpers.js +5 -24
  45. package/dist/src/TagHelpers.js.map +1 -1
  46. package/dist/src/UserManagement/Interfaces.d.ts +34 -0
  47. package/dist/src/UserManagement/Interfaces.js +3 -0
  48. package/dist/src/UserManagement/Interfaces.js.map +1 -0
  49. package/dist/src/UserManagement/UserManagementHelper.d.ts +17 -0
  50. package/dist/src/UserManagement/UserManagementHelper.js +158 -0
  51. package/dist/src/UserManagement/UserManagementHelper.js.map +1 -0
  52. package/dist/src/UserManagement/auth/jwt.d.ts +7 -0
  53. package/dist/src/UserManagement/auth/jwt.js +57 -0
  54. package/dist/src/UserManagement/auth/jwt.js.map +1 -0
  55. package/dist/src/UserManagement/email/Interfaces.d.ts +29 -0
  56. package/dist/src/UserManagement/email/Interfaces.js +3 -0
  57. package/dist/src/UserManagement/email/Interfaces.js.map +1 -0
  58. package/dist/src/UserManagement/email/NodeMailer.d.ts +7 -0
  59. package/dist/src/UserManagement/email/NodeMailer.js +67 -0
  60. package/dist/src/UserManagement/email/NodeMailer.js.map +1 -0
  61. package/dist/src/UserManagement/email/UserManagementMailer.d.ts +9 -0
  62. package/dist/src/UserManagement/email/UserManagementMailer.js +77 -0
  63. package/dist/src/UserManagement/email/UserManagementMailer.js.map +1 -0
  64. package/dist/src/UserManagement/email/index.d.ts +2 -0
  65. package/dist/src/UserManagement/email/index.js +7 -0
  66. package/dist/src/UserManagement/email/index.js.map +1 -0
  67. package/dist/src/UserManagement/email/templates/instanceSetup.html +5 -0
  68. package/dist/src/UserManagement/email/templates/invite.html +4 -0
  69. package/dist/src/UserManagement/email/templates/passwordReset.html +5 -0
  70. package/dist/src/UserManagement/index.d.ts +4 -0
  71. package/dist/src/UserManagement/index.js +6 -0
  72. package/dist/src/UserManagement/index.js.map +1 -0
  73. package/dist/src/UserManagement/routes/auth.d.ts +2 -0
  74. package/dist/src/UserManagement/routes/auth.js +74 -0
  75. package/dist/src/UserManagement/routes/auth.js.map +1 -0
  76. package/dist/src/UserManagement/routes/index.d.ts +2 -0
  77. package/dist/src/UserManagement/routes/index.js +100 -0
  78. package/dist/src/UserManagement/routes/index.js.map +1 -0
  79. package/dist/src/UserManagement/routes/me.d.ts +2 -0
  80. package/dist/src/UserManagement/routes/me.js +85 -0
  81. package/dist/src/UserManagement/routes/me.js.map +1 -0
  82. package/dist/src/UserManagement/routes/owner.d.ts +2 -0
  83. package/dist/src/UserManagement/routes/owner.js +68 -0
  84. package/dist/src/UserManagement/routes/owner.js.map +1 -0
  85. package/dist/src/UserManagement/routes/passwordReset.d.ts +2 -0
  86. package/dist/src/UserManagement/routes/passwordReset.js +129 -0
  87. package/dist/src/UserManagement/routes/passwordReset.js.map +1 -0
  88. package/dist/src/UserManagement/routes/users.d.ts +2 -0
  89. package/dist/src/UserManagement/routes/users.js +334 -0
  90. package/dist/src/UserManagement/routes/users.js.map +1 -0
  91. package/dist/src/WaitTracker.js +6 -0
  92. package/dist/src/WaitTracker.js.map +1 -1
  93. package/dist/src/WaitingWebhooks.js +9 -1
  94. package/dist/src/WaitingWebhooks.js.map +1 -1
  95. package/dist/src/WebhookHelpers.js +17 -1
  96. package/dist/src/WebhookHelpers.js.map +1 -1
  97. package/dist/src/WorkflowExecuteAdditionalData.d.ts +3 -3
  98. package/dist/src/WorkflowExecuteAdditionalData.js +41 -13
  99. package/dist/src/WorkflowExecuteAdditionalData.js.map +1 -1
  100. package/dist/src/WorkflowHelpers.d.ts +9 -10
  101. package/dist/src/WorkflowHelpers.js +48 -17
  102. package/dist/src/WorkflowHelpers.js.map +1 -1
  103. package/dist/src/WorkflowRunner.js +4 -2
  104. package/dist/src/WorkflowRunner.js.map +1 -1
  105. package/dist/src/WorkflowRunnerProcess.js +7 -4
  106. package/dist/src/WorkflowRunnerProcess.js.map +1 -1
  107. package/dist/src/api/credentials.api.d.ts +1 -0
  108. package/dist/src/api/credentials.api.js +222 -0
  109. package/dist/src/api/credentials.api.js.map +1 -0
  110. package/dist/src/constants.d.ts +5 -0
  111. package/dist/src/constants.js +9 -0
  112. package/dist/src/constants.js.map +1 -0
  113. package/dist/src/databases/entities/CredentialsEntity.d.ts +2 -0
  114. package/dist/src/databases/entities/CredentialsEntity.js +13 -2
  115. package/dist/src/databases/entities/CredentialsEntity.js.map +1 -1
  116. package/dist/src/databases/entities/Role.d.ts +16 -0
  117. package/dist/src/databases/entities/Role.js +87 -0
  118. package/dist/src/databases/entities/Role.js.map +1 -0
  119. package/dist/src/databases/entities/Settings.d.ts +6 -0
  120. package/dist/src/databases/entities/Settings.js +32 -0
  121. package/dist/src/databases/entities/Settings.js.map +1 -0
  122. package/dist/src/databases/entities/SharedCredentials.d.ts +13 -0
  123. package/dist/src/databases/entities/SharedCredentials.js +83 -0
  124. package/dist/src/databases/entities/SharedCredentials.js.map +1 -0
  125. package/dist/src/databases/entities/SharedWorkflow.d.ts +13 -0
  126. package/dist/src/databases/entities/SharedWorkflow.js +83 -0
  127. package/dist/src/databases/entities/SharedWorkflow.js.map +1 -0
  128. package/dist/src/databases/entities/TagEntity.js +6 -2
  129. package/dist/src/databases/entities/TagEntity.js.map +1 -1
  130. package/dist/src/databases/entities/User.d.ts +24 -0
  131. package/dist/src/databases/entities/User.js +145 -0
  132. package/dist/src/databases/entities/User.js.map +1 -0
  133. package/dist/src/databases/entities/WorkflowEntity.d.ts +2 -0
  134. package/dist/src/databases/entities/WorkflowEntity.js +8 -1
  135. package/dist/src/databases/entities/WorkflowEntity.js.map +1 -1
  136. package/dist/src/databases/entities/index.d.ts +10 -0
  137. package/dist/src/databases/entities/index.js +10 -0
  138. package/dist/src/databases/entities/index.js.map +1 -1
  139. package/dist/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.js +0 -1
  140. package/dist/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.js.map +1 -1
  141. package/dist/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.js +0 -3
  142. package/dist/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.js.map +1 -1
  143. package/dist/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.js +21 -8
  144. package/dist/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.js.map +1 -1
  145. package/dist/src/databases/mysqldb/migrations/1646992772331-CreateUserManagement.d.ts +6 -0
  146. package/dist/src/databases/mysqldb/migrations/1646992772331-CreateUserManagement.js +100 -0
  147. package/dist/src/databases/mysqldb/migrations/1646992772331-CreateUserManagement.js.map +1 -0
  148. package/dist/src/databases/mysqldb/migrations/index.js +2 -0
  149. package/dist/src/databases/mysqldb/migrations/index.js.map +1 -1
  150. package/dist/src/databases/postgresdb/migrations/1620824779533-UniqueWorkflowNames.d.ts +1 -1
  151. package/dist/src/databases/postgresdb/migrations/1620824779533-UniqueWorkflowNames.js +1 -1
  152. package/dist/src/databases/postgresdb/migrations/1620824779533-UniqueWorkflowNames.js.map +1 -1
  153. package/dist/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.js +0 -1
  154. package/dist/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.js.map +1 -1
  155. package/dist/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.js +0 -3
  156. package/dist/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.js.map +1 -1
  157. package/dist/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.js +16 -17
  158. package/dist/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.js.map +1 -1
  159. package/dist/src/databases/postgresdb/migrations/1646992772331-CreateUserManagement.d.ts +6 -0
  160. package/dist/src/databases/postgresdb/migrations/1646992772331-CreateUserManagement.js +106 -0
  161. package/dist/src/databases/postgresdb/migrations/1646992772331-CreateUserManagement.js.map +1 -0
  162. package/dist/src/databases/postgresdb/migrations/index.js +2 -0
  163. package/dist/src/databases/postgresdb/migrations/index.js.map +1 -1
  164. package/dist/src/databases/sqlite/migrations/1588102412422-InitialMigration.js +3 -0
  165. package/dist/src/databases/sqlite/migrations/1588102412422-InitialMigration.js.map +1 -1
  166. package/dist/src/databases/sqlite/migrations/1592445003908-WebhookModel.js +3 -0
  167. package/dist/src/databases/sqlite/migrations/1592445003908-WebhookModel.js.map +1 -1
  168. package/dist/src/databases/sqlite/migrations/1594825041918-CreateIndexStoppedAt.d.ts +1 -1
  169. package/dist/src/databases/sqlite/migrations/1594825041918-CreateIndexStoppedAt.js +3 -0
  170. package/dist/src/databases/sqlite/migrations/1594825041918-CreateIndexStoppedAt.js.map +1 -1
  171. package/dist/src/databases/sqlite/migrations/1607431743769-MakeStoppedAtNullable.d.ts +2 -1
  172. package/dist/src/databases/sqlite/migrations/1607431743769-MakeStoppedAtNullable.js +6 -0
  173. package/dist/src/databases/sqlite/migrations/1607431743769-MakeStoppedAtNullable.js.map +1 -1
  174. package/dist/src/databases/sqlite/migrations/1611071044839-AddWebhookId.d.ts +1 -1
  175. package/dist/src/databases/sqlite/migrations/1611071044839-AddWebhookId.js +3 -0
  176. package/dist/src/databases/sqlite/migrations/1611071044839-AddWebhookId.js.map +1 -1
  177. package/dist/src/databases/sqlite/migrations/1617213344594-CreateTagEntity.d.ts +1 -1
  178. package/dist/src/databases/sqlite/migrations/1617213344594-CreateTagEntity.js +3 -0
  179. package/dist/src/databases/sqlite/migrations/1617213344594-CreateTagEntity.js.map +1 -1
  180. package/dist/src/databases/sqlite/migrations/1620821879465-UniqueWorkflowNames.d.ts +1 -1
  181. package/dist/src/databases/sqlite/migrations/1620821879465-UniqueWorkflowNames.js +3 -0
  182. package/dist/src/databases/sqlite/migrations/1620821879465-UniqueWorkflowNames.js.map +1 -1
  183. package/dist/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.js +3 -1
  184. package/dist/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.js.map +1 -1
  185. package/dist/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.js +3 -3
  186. package/dist/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.js.map +1 -1
  187. package/dist/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.js +17 -13
  188. package/dist/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.js.map +1 -1
  189. package/dist/src/databases/sqlite/migrations/1646992772331-CreateUserManagement.d.ts +6 -0
  190. package/dist/src/databases/sqlite/migrations/1646992772331-CreateUserManagement.js +73 -0
  191. package/dist/src/databases/sqlite/migrations/1646992772331-CreateUserManagement.js.map +1 -0
  192. package/dist/src/databases/sqlite/migrations/index.d.ts +3 -2
  193. package/dist/src/databases/sqlite/migrations/index.js +4 -1
  194. package/dist/src/databases/sqlite/migrations/index.js.map +1 -1
  195. package/dist/src/databases/utils/customValidators.d.ts +1 -0
  196. package/dist/src/databases/utils/customValidators.js +22 -0
  197. package/dist/src/databases/utils/customValidators.js.map +1 -0
  198. package/dist/src/databases/utils/migrationHelpers.d.ts +3 -0
  199. package/dist/src/databases/utils/migrationHelpers.js +60 -0
  200. package/dist/src/databases/utils/migrationHelpers.js.map +1 -0
  201. package/dist/src/databases/utils/transformers.d.ts +9 -0
  202. package/dist/src/databases/utils/transformers.js +16 -0
  203. package/dist/src/databases/utils/transformers.js.map +1 -0
  204. package/dist/src/telemetry/index.d.ts +4 -1
  205. package/dist/src/telemetry/index.js +4 -2
  206. package/dist/src/telemetry/index.js.map +1 -1
  207. package/dist/test/{CredentialsHelper.test.d.ts → integration/auth.endpoints.test.d.ts} +0 -0
  208. package/dist/test/integration/auth.endpoints.test.js +99 -0
  209. package/dist/test/integration/auth.endpoints.test.js.map +1 -0
  210. package/dist/test/integration/auth.middleware.test.d.ts +1 -0
  211. package/dist/test/integration/auth.middleware.test.js +46 -0
  212. package/dist/test/integration/auth.middleware.test.js.map +1 -0
  213. package/dist/test/integration/credentials.api.test.d.ts +1 -0
  214. package/dist/test/integration/credentials.api.test.js +401 -0
  215. package/dist/test/integration/credentials.api.test.js.map +1 -0
  216. package/dist/test/integration/me.endpoints.test.d.ts +1 -0
  217. package/dist/test/integration/me.endpoints.test.js +383 -0
  218. package/dist/test/integration/me.endpoints.test.js.map +1 -0
  219. package/dist/test/integration/owner.endpoints.test.d.ts +1 -0
  220. package/dist/test/integration/owner.endpoints.test.js +125 -0
  221. package/dist/test/integration/owner.endpoints.test.js.map +1 -0
  222. package/dist/test/integration/passwordReset.endpoints.test.d.ts +1 -0
  223. package/dist/test/integration/passwordReset.endpoints.test.js +221 -0
  224. package/dist/test/integration/passwordReset.endpoints.test.js.map +1 -0
  225. package/dist/test/integration/shared/constants.d.ts +16 -0
  226. package/dist/test/integration/shared/constants.js +41 -0
  227. package/dist/test/integration/shared/constants.js.map +1 -0
  228. package/dist/test/integration/shared/random.d.ts +5 -0
  229. package/dist/test/integration/shared/random.js +34 -0
  230. package/dist/test/integration/shared/random.js.map +1 -0
  231. package/dist/test/integration/shared/testDb.d.ts +47 -0
  232. package/dist/test/integration/shared/testDb.js +280 -0
  233. package/dist/test/integration/shared/testDb.js.map +1 -0
  234. package/dist/test/integration/shared/utils.d.ts +20 -0
  235. package/dist/test/integration/shared/utils.js +132 -0
  236. package/dist/test/integration/shared/utils.js.map +1 -0
  237. package/dist/test/integration/users.endpoints.test.d.ts +1 -0
  238. package/dist/test/integration/users.endpoints.test.js +420 -0
  239. package/dist/test/integration/users.endpoints.test.js.map +1 -0
  240. package/dist/test/setup.d.ts +1 -0
  241. package/dist/test/setup.js +27 -0
  242. package/dist/test/setup.js.map +1 -0
  243. package/dist/test/teardown.d.ts +2 -0
  244. package/dist/test/teardown.js +33 -0
  245. package/dist/test/teardown.js.map +1 -0
  246. package/dist/test/unit/CredentialsHelper.test.d.ts +1 -0
  247. package/dist/test/{CredentialsHelper.test.js → unit/CredentialsHelper.test.js} +1 -1
  248. package/dist/test/unit/CredentialsHelper.test.js.map +1 -0
  249. package/dist/test/{Helpers.d.ts → unit/Helpers.d.ts} +0 -0
  250. package/dist/test/{Helpers.js → unit/Helpers.js} +0 -0
  251. package/dist/test/unit/Helpers.js.map +1 -0
  252. package/oclif.manifest.json +1 -1
  253. package/package.json +30 -29
  254. package/dist/src/PersonalizationSurvey.d.ts +0 -3
  255. package/dist/src/PersonalizationSurvey.js +0 -48
  256. package/dist/src/PersonalizationSurvey.js.map +0 -1
  257. package/dist/test/CredentialsHelper.test.js.map +0 -1
  258. package/dist/test/Helpers.js.map +0 -1
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.getMySqlOptions = exports.getBootstrapMySqlOptions = exports.getPostgresOptions = exports.getBootstrapPostgresOptions = exports.getSqliteOptions = exports.getAllRoles = exports.getCredentialOwnerRole = exports.getWorkflowOwnerRole = exports.getGlobalMemberRole = exports.getGlobalOwnerRole = exports.createMemberShell = exports.createOwnerShell = exports.createUser = exports.saveCredential = exports.truncate = exports.terminate = exports.init = void 0;
15
+ const typeorm_1 = require("typeorm");
16
+ const n8n_core_1 = require("n8n-core");
17
+ const config = require("../../../config");
18
+ const constants_1 = require("./constants");
19
+ const src_1 = require("../../../src");
20
+ const random_1 = require("./random");
21
+ const CredentialsEntity_1 = require("../../../src/databases/entities/CredentialsEntity");
22
+ const constants_2 = require("../../../src/constants");
23
+ const entities_1 = require("../../../src/databases/entities");
24
+ const migrations_1 = require("../../../src/databases/mysqldb/migrations");
25
+ const migrations_2 = require("../../../src/databases/postgresdb/migrations");
26
+ const migrations_3 = require("../../../src/databases/sqlite/migrations");
27
+ async function init() {
28
+ const dbType = config.get('database.type');
29
+ if (dbType === 'sqlite') {
30
+ const testDbName = `n8n_test_sqlite_${random_1.randomString(6, 10)}_${Date.now()}`;
31
+ await src_1.Db.init(exports.getSqliteOptions({ name: testDbName }));
32
+ await typeorm_1.getConnection(testDbName).runMigrations({ transaction: 'none' });
33
+ return { testDbName };
34
+ }
35
+ if (dbType === 'postgresdb') {
36
+ let bootstrapPostgres;
37
+ const bootstrapPostgresOptions = exports.getBootstrapPostgresOptions();
38
+ try {
39
+ bootstrapPostgres = await typeorm_1.createConnection(bootstrapPostgresOptions);
40
+ }
41
+ catch (error) {
42
+ const { username, password, host, port, schema } = bootstrapPostgresOptions;
43
+ console.error(`ERROR: Failed to connect to Postgres default DB 'postgres'.\nPlease review your Postgres connection options:\n\thost: "${host}"\n\tusername: "${username}"\n\tpassword: "${password}"\n\tport: "${port}"\n\tschema: "${schema}"\nFix by setting correct values via environment variables:\n\texport DB_POSTGRESDB_HOST=value\n\texport DB_POSTGRESDB_USER=value\n\texport DB_POSTGRESDB_PASSWORD=value\n\texport DB_POSTGRESDB_PORT=value\n\texport DB_POSTGRESDB_SCHEMA=value`);
44
+ process.exit(1);
45
+ }
46
+ const testDbName = `pg_${random_1.randomString(6, 10)}_${Date.now()}_n8n_test`;
47
+ await bootstrapPostgres.query(`CREATE DATABASE ${testDbName};`);
48
+ await src_1.Db.init(exports.getPostgresOptions({ name: testDbName }));
49
+ return { testDbName };
50
+ }
51
+ if (dbType === 'mysqldb') {
52
+ const bootstrapMysql = await typeorm_1.createConnection(exports.getBootstrapMySqlOptions());
53
+ const testDbName = `mysql_${random_1.randomString(6, 10)}_${Date.now()}_n8n_test`;
54
+ await bootstrapMysql.query(`CREATE DATABASE ${testDbName};`);
55
+ await src_1.Db.init(exports.getMySqlOptions({ name: testDbName }));
56
+ return { testDbName };
57
+ }
58
+ throw new Error(`Unrecognized DB type: ${dbType}`);
59
+ }
60
+ exports.init = init;
61
+ async function terminate(testDbName) {
62
+ const dbType = config.get('database.type');
63
+ if (dbType === 'sqlite') {
64
+ await typeorm_1.getConnection(testDbName).close();
65
+ }
66
+ if (dbType === 'postgresdb') {
67
+ await typeorm_1.getConnection(testDbName).close();
68
+ const bootstrapPostgres = typeorm_1.getConnection(constants_1.BOOTSTRAP_POSTGRES_CONNECTION_NAME);
69
+ await bootstrapPostgres.query(`DROP DATABASE ${testDbName}`);
70
+ await bootstrapPostgres.close();
71
+ }
72
+ if (dbType === 'mysqldb') {
73
+ await typeorm_1.getConnection(testDbName).close();
74
+ const bootstrapMySql = typeorm_1.getConnection(constants_1.BOOTSTRAP_MYSQL_CONNECTION_NAME);
75
+ await bootstrapMySql.query(`DROP DATABASE ${testDbName}`);
76
+ await bootstrapMySql.close();
77
+ }
78
+ }
79
+ exports.terminate = terminate;
80
+ async function truncate(entities, testDbName) {
81
+ const dbType = config.get('database.type');
82
+ if (dbType === 'sqlite') {
83
+ const testDb = typeorm_1.getConnection(testDbName);
84
+ await testDb.query('PRAGMA foreign_keys=OFF');
85
+ await Promise.all(entities.map((entity) => src_1.Db.collections[entity].clear()));
86
+ return testDb.query('PRAGMA foreign_keys=ON');
87
+ }
88
+ const map = {
89
+ Credentials: 'credentials_entity',
90
+ Workflow: 'workflow_entity',
91
+ Execution: 'execution_entity',
92
+ Tag: 'tag_entity',
93
+ Webhook: 'webhook_entity',
94
+ Role: 'role',
95
+ User: 'user',
96
+ SharedCredentials: 'shared_credentials',
97
+ SharedWorkflow: 'shared_workflow',
98
+ Settings: 'settings',
99
+ };
100
+ if (dbType === 'postgresdb') {
101
+ return Promise.all(entities.map((entity) => typeorm_1.getConnection(testDbName).query(`TRUNCATE TABLE "${map[entity]}" RESTART IDENTITY CASCADE;`)));
102
+ }
103
+ if (dbType === 'mysqldb') {
104
+ await Promise.all(entities.map(async (entity) => {
105
+ await src_1.Db.collections[entity].delete({});
106
+ await typeorm_1.getConnection(testDbName).query(`ALTER TABLE ${map[entity]} AUTO_INCREMENT = 1;`);
107
+ }));
108
+ }
109
+ }
110
+ exports.truncate = truncate;
111
+ async function saveCredential(credentialPayload, { user, role }) {
112
+ const newCredential = new CredentialsEntity_1.CredentialsEntity();
113
+ Object.assign(newCredential, credentialPayload);
114
+ const encryptedData = await encryptCredentialData(newCredential);
115
+ Object.assign(newCredential, encryptedData);
116
+ const savedCredential = await src_1.Db.collections.Credentials.save(newCredential);
117
+ savedCredential.data = newCredential.data;
118
+ await src_1.Db.collections.SharedCredentials.save({
119
+ user,
120
+ credentials: savedCredential,
121
+ role,
122
+ });
123
+ return savedCredential;
124
+ }
125
+ exports.saveCredential = saveCredential;
126
+ async function createUser(attributes = {}) {
127
+ const { email, password, firstName, lastName, globalRole } = attributes, rest = __rest(attributes, ["email", "password", "firstName", "lastName", "globalRole"]);
128
+ const user = Object.assign({ email: email !== null && email !== void 0 ? email : random_1.randomEmail(), password: password !== null && password !== void 0 ? password : random_1.randomValidPassword(), firstName: firstName !== null && firstName !== void 0 ? firstName : random_1.randomName(), lastName: lastName !== null && lastName !== void 0 ? lastName : random_1.randomName(), globalRole: globalRole !== null && globalRole !== void 0 ? globalRole : (await getGlobalMemberRole()) }, rest);
129
+ return src_1.Db.collections.User.save(user);
130
+ }
131
+ exports.createUser = createUser;
132
+ async function createOwnerShell() {
133
+ const globalRole = await getGlobalOwnerRole();
134
+ return src_1.Db.collections.User.save({ globalRole });
135
+ }
136
+ exports.createOwnerShell = createOwnerShell;
137
+ async function createMemberShell() {
138
+ const globalRole = await getGlobalMemberRole();
139
+ return src_1.Db.collections.User.save({ globalRole });
140
+ }
141
+ exports.createMemberShell = createMemberShell;
142
+ async function getGlobalOwnerRole() {
143
+ return await src_1.Db.collections.Role.findOneOrFail({
144
+ name: 'owner',
145
+ scope: 'global',
146
+ });
147
+ }
148
+ exports.getGlobalOwnerRole = getGlobalOwnerRole;
149
+ async function getGlobalMemberRole() {
150
+ return await src_1.Db.collections.Role.findOneOrFail({
151
+ name: 'member',
152
+ scope: 'global',
153
+ });
154
+ }
155
+ exports.getGlobalMemberRole = getGlobalMemberRole;
156
+ async function getWorkflowOwnerRole() {
157
+ return await src_1.Db.collections.Role.findOneOrFail({
158
+ name: 'owner',
159
+ scope: 'workflow',
160
+ });
161
+ }
162
+ exports.getWorkflowOwnerRole = getWorkflowOwnerRole;
163
+ async function getCredentialOwnerRole() {
164
+ return await src_1.Db.collections.Role.findOneOrFail({
165
+ name: 'owner',
166
+ scope: 'credential',
167
+ });
168
+ }
169
+ exports.getCredentialOwnerRole = getCredentialOwnerRole;
170
+ function getAllRoles() {
171
+ return Promise.all([
172
+ getGlobalOwnerRole(),
173
+ getGlobalMemberRole(),
174
+ getWorkflowOwnerRole(),
175
+ getCredentialOwnerRole(),
176
+ ]);
177
+ }
178
+ exports.getAllRoles = getAllRoles;
179
+ const getSqliteOptions = ({ name }) => {
180
+ return {
181
+ name,
182
+ type: 'sqlite',
183
+ database: ':memory:',
184
+ entityPrefix: '',
185
+ dropSchema: true,
186
+ migrations: migrations_3.sqliteMigrations,
187
+ migrationsTableName: 'migrations',
188
+ migrationsRun: false,
189
+ };
190
+ };
191
+ exports.getSqliteOptions = getSqliteOptions;
192
+ const getBootstrapPostgresOptions = () => {
193
+ const username = config.get('database.postgresdb.user');
194
+ const password = config.get('database.postgresdb.password');
195
+ const host = config.get('database.postgresdb.host');
196
+ const port = config.get('database.postgresdb.port');
197
+ const schema = config.get('database.postgresdb.schema');
198
+ return {
199
+ name: constants_1.BOOTSTRAP_POSTGRES_CONNECTION_NAME,
200
+ type: 'postgres',
201
+ database: 'postgres',
202
+ host,
203
+ port,
204
+ username,
205
+ password,
206
+ schema,
207
+ };
208
+ };
209
+ exports.getBootstrapPostgresOptions = getBootstrapPostgresOptions;
210
+ const getPostgresOptions = ({ name }) => {
211
+ const username = config.get('database.postgresdb.user');
212
+ const password = config.get('database.postgresdb.password');
213
+ const host = config.get('database.postgresdb.host');
214
+ const port = config.get('database.postgresdb.port');
215
+ const schema = config.get('database.postgresdb.schema');
216
+ return {
217
+ name,
218
+ type: 'postgres',
219
+ database: name,
220
+ host,
221
+ port,
222
+ username,
223
+ password,
224
+ entityPrefix: '',
225
+ schema,
226
+ dropSchema: true,
227
+ migrations: migrations_2.postgresMigrations,
228
+ migrationsRun: true,
229
+ migrationsTableName: 'migrations',
230
+ entities: Object.values(entities_1.entities),
231
+ synchronize: false,
232
+ logging: false,
233
+ };
234
+ };
235
+ exports.getPostgresOptions = getPostgresOptions;
236
+ const getBootstrapMySqlOptions = () => {
237
+ const username = config.get('database.mysqldb.user');
238
+ const password = config.get('database.mysqldb.password');
239
+ const host = config.get('database.mysqldb.host');
240
+ const port = config.get('database.mysqldb.port');
241
+ return {
242
+ name: constants_1.BOOTSTRAP_MYSQL_CONNECTION_NAME,
243
+ database: constants_1.BOOTSTRAP_MYSQL_CONNECTION_NAME,
244
+ type: 'mysql',
245
+ host,
246
+ port,
247
+ username,
248
+ password,
249
+ };
250
+ };
251
+ exports.getBootstrapMySqlOptions = getBootstrapMySqlOptions;
252
+ const getMySqlOptions = ({ name }) => {
253
+ const username = config.get('database.mysqldb.user');
254
+ const password = config.get('database.mysqldb.password');
255
+ const host = config.get('database.mysqldb.host');
256
+ const port = config.get('database.mysqldb.port');
257
+ return {
258
+ name,
259
+ database: name,
260
+ type: 'mysql',
261
+ host,
262
+ port,
263
+ username,
264
+ password,
265
+ migrations: migrations_1.mysqlMigrations,
266
+ migrationsTableName: 'migrations',
267
+ migrationsRun: true,
268
+ };
269
+ };
270
+ exports.getMySqlOptions = getMySqlOptions;
271
+ async function encryptCredentialData(credential) {
272
+ const encryptionKey = await n8n_core_1.UserSettings.getEncryptionKey();
273
+ if (!encryptionKey) {
274
+ throw new Error(constants_2.RESPONSE_ERROR_MESSAGES.NO_ENCRYPTION_KEY);
275
+ }
276
+ const coreCredential = new n8n_core_1.Credentials({ id: null, name: credential.name }, credential.type, credential.nodesAccess);
277
+ coreCredential.setData(credential.data, encryptionKey);
278
+ return coreCredential.getDataToSave();
279
+ }
280
+ //# sourceMappingURL=testDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testDb.js","sourceRoot":"","sources":["../../../../test/integration/shared/testDb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import express = require('express');
2
+ import * as superagent from 'superagent';
3
+ import * as request from 'supertest';
4
+ import type { User } from '../../../src/databases/entities/User';
5
+ import type { EndpointGroup, SmtpTestAccount } from './types';
6
+ export declare function initTestServer({ applyAuth, endpointGroups, }: {
7
+ applyAuth: boolean;
8
+ endpointGroups?: EndpointGroup[];
9
+ }): import("express-serve-static-core").Express;
10
+ export declare function initTestTelemetry(): void;
11
+ export declare function initTestLogger(): void;
12
+ export declare function initConfigFile(): void;
13
+ export declare function createAgent(app: express.Application, options?: {
14
+ auth: true;
15
+ user: User;
16
+ }): request.SuperAgentTest;
17
+ export declare function prefix(pathSegment: string): (request: superagent.SuperAgentRequest) => superagent.SuperAgentRequest;
18
+ export declare function getAuthToken(response: request.Response, authCookieName?: string): string | undefined;
19
+ export declare function isInstanceOwnerSetUp(): Promise<boolean>;
20
+ export declare const getSmtpTestAccount: () => Promise<SmtpTestAccount>;
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSmtpTestAccount = exports.isInstanceOwnerSetUp = exports.getAuthToken = exports.prefix = exports.createAgent = exports.initConfigFile = exports.initTestLogger = exports.initTestTelemetry = exports.initTestServer = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const fs_1 = require("fs");
6
+ const express = require("express");
7
+ const request = require("supertest");
8
+ const url_1 = require("url");
9
+ const bodyParser = require("body-parser");
10
+ const util = require("util");
11
+ const nodemailer_1 = require("nodemailer");
12
+ const n8n_workflow_1 = require("n8n-workflow");
13
+ const n8n_core_1 = require("n8n-core");
14
+ const config = require("../../../config");
15
+ const constants_1 = require("./constants");
16
+ const constants_2 = require("../../../src/constants");
17
+ const routes_1 = require("../../../src/UserManagement/routes");
18
+ const src_1 = require("../../../src");
19
+ const me_1 = require("../../../src/UserManagement/routes/me");
20
+ const users_1 = require("../../../src/UserManagement/routes/users");
21
+ const auth_1 = require("../../../src/UserManagement/routes/auth");
22
+ const owner_1 = require("../../../src/UserManagement/routes/owner");
23
+ const passwordReset_1 = require("../../../src/UserManagement/routes/passwordReset");
24
+ const jwt_1 = require("../../../src/UserManagement/auth/jwt");
25
+ const Logger_1 = require("../../../src/Logger");
26
+ const credentials_api_1 = require("../../../src/api/credentials.api");
27
+ const telemetry_1 = require("../../../src/telemetry");
28
+ function initTestServer({ applyAuth, endpointGroups, }) {
29
+ const testServer = Object.assign({ app: express(), restEndpoint: constants_1.REST_PATH_SEGMENT }, ((endpointGroups === null || endpointGroups === void 0 ? void 0 : endpointGroups.includes('credentials')) ? { externalHooks: src_1.ExternalHooks() } : {}));
30
+ testServer.app.use(bodyParser.json());
31
+ testServer.app.use(bodyParser.urlencoded({ extended: true }));
32
+ config.set('userManagement.jwtSecret', 'My JWT secret');
33
+ config.set('userManagement.isInstanceOwnerSetUp', false);
34
+ if (applyAuth) {
35
+ routes_1.addRoutes.apply(testServer, [constants_1.AUTHLESS_ENDPOINTS, constants_1.REST_PATH_SEGMENT]);
36
+ }
37
+ if (!endpointGroups)
38
+ return testServer.app;
39
+ const [routerEndpoints, functionEndpoints] = classifyEndpointGroups(endpointGroups);
40
+ if (routerEndpoints.length) {
41
+ const map = {
42
+ credentials: credentials_api_1.credentialsController,
43
+ };
44
+ for (const group of routerEndpoints) {
45
+ testServer.app.use(`/${testServer.restEndpoint}/${group}`, map[group]);
46
+ }
47
+ }
48
+ if (functionEndpoints.length) {
49
+ const map = {
50
+ me: me_1.meNamespace,
51
+ users: users_1.usersNamespace,
52
+ auth: auth_1.authenticationMethods,
53
+ owner: owner_1.ownerNamespace,
54
+ passwordReset: passwordReset_1.passwordResetNamespace,
55
+ };
56
+ for (const group of functionEndpoints) {
57
+ map[group].apply(testServer);
58
+ }
59
+ }
60
+ return testServer.app;
61
+ }
62
+ exports.initTestServer = initTestServer;
63
+ function initTestTelemetry() {
64
+ const mockNodeTypes = { nodeTypes: {} };
65
+ void src_1.InternalHooksManager.init('test-instance-id', 'test-version', mockNodeTypes);
66
+ jest.spyOn(telemetry_1.Telemetry.prototype, 'track').mockResolvedValue();
67
+ }
68
+ exports.initTestTelemetry = initTestTelemetry;
69
+ const classifyEndpointGroups = (endpointGroups) => {
70
+ const routerEndpoints = [];
71
+ const functionEndpoints = [];
72
+ endpointGroups.forEach((group) => (group === 'credentials' ? routerEndpoints : functionEndpoints).push(group));
73
+ return [routerEndpoints, functionEndpoints];
74
+ };
75
+ function initTestLogger() {
76
+ config.set('logs.output', 'file');
77
+ n8n_workflow_1.LoggerProxy.init(Logger_1.getLogger());
78
+ }
79
+ exports.initTestLogger = initTestLogger;
80
+ function initConfigFile() {
81
+ const settingsPath = n8n_core_1.UserSettings.getUserSettingsPath();
82
+ if (!fs_1.existsSync(settingsPath)) {
83
+ const userSettings = { encryptionKey: crypto_1.randomBytes(24).toString('base64') };
84
+ n8n_core_1.UserSettings.writeUserSettings(userSettings, settingsPath);
85
+ }
86
+ }
87
+ exports.initConfigFile = initConfigFile;
88
+ function createAgent(app, options) {
89
+ const agent = request.agent(app);
90
+ agent.use(prefix(constants_1.REST_PATH_SEGMENT));
91
+ if ((options === null || options === void 0 ? void 0 : options.auth) && (options === null || options === void 0 ? void 0 : options.user)) {
92
+ const { token } = jwt_1.issueJWT(options.user);
93
+ agent.jar.setCookie(`${constants_2.AUTH_COOKIE_NAME}=${token}`);
94
+ }
95
+ return agent;
96
+ }
97
+ exports.createAgent = createAgent;
98
+ function prefix(pathSegment) {
99
+ return function (request) {
100
+ const url = new url_1.URL(request.url);
101
+ if (url.pathname[0] !== '/') {
102
+ throw new Error('Pathname must start with a forward slash');
103
+ }
104
+ url.pathname = pathSegment + url.pathname;
105
+ request.url = url.toString();
106
+ return request;
107
+ };
108
+ }
109
+ exports.prefix = prefix;
110
+ function getAuthToken(response, authCookieName = constants_2.AUTH_COOKIE_NAME) {
111
+ const cookies = response.headers['set-cookie'];
112
+ if (!cookies) {
113
+ throw new Error("No 'set-cookie' header found in response");
114
+ }
115
+ const authCookie = cookies.find((c) => c.startsWith(`${authCookieName}=`));
116
+ if (!authCookie)
117
+ return undefined;
118
+ const match = authCookie.match(new RegExp(`(^| )${authCookieName}=(?<token>[^;]+)`));
119
+ if (!match || !match.groups)
120
+ return undefined;
121
+ return match.groups.token;
122
+ }
123
+ exports.getAuthToken = getAuthToken;
124
+ async function isInstanceOwnerSetUp() {
125
+ const { value } = await src_1.Db.collections.Settings.findOneOrFail({
126
+ key: 'userManagement.isInstanceOwnerSetUp',
127
+ });
128
+ return Boolean(value);
129
+ }
130
+ exports.isInstanceOwnerSetUp = isInstanceOwnerSetUp;
131
+ exports.getSmtpTestAccount = util.promisify(nodemailer_1.createTestAccount);
132
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../test/integration/shared/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};