@budibase/server 1.3.13 → 1.3.15-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/{index.e50bda9f.css → index.ecdac070.css} +2 -2
  3. package/builder/assets/index.ed9ae6a1.js +995 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +377 -313
  6. package/coverage/coverage-final.json +22 -22
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +8 -5
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +82 -13
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +32 -32
  16. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +204 -12
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +12 -12
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +24 -24
  79. package/coverage/lcov-report/automations/index.js.html +18 -9
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +126 -24
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +18 -18
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +56 -20
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +48 -48
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  128. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  129. package/coverage/lcov-report/middleware/index.html +1 -1
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  136. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +16 -16
  139. package/coverage/lcov-report/utilities/index.html +19 -19
  140. package/coverage/lcov-report/utilities/index.js.html +66 -42
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  142. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +5 -5
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +6 -3
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  156. package/coverage/lcov.info +692 -564
  157. package/dist/api/controllers/application.js +6 -9
  158. package/dist/api/controllers/backup.js +2 -1
  159. package/dist/api/controllers/component.js +18 -1
  160. package/dist/api/controllers/datasource.js +4 -4
  161. package/dist/api/controllers/deploy/index.js +17 -2
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/plugin/file.js +24 -0
  164. package/dist/api/controllers/plugin/github.js +69 -0
  165. package/dist/api/controllers/plugin/index.js +189 -0
  166. package/dist/api/controllers/plugin/npm.js +58 -0
  167. package/dist/api/controllers/plugin/uploaders.js +11 -0
  168. package/dist/api/controllers/plugin/url.js +24 -0
  169. package/dist/api/controllers/plugin/utils.js +26 -0
  170. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  171. package/dist/api/controllers/screen.js +51 -2
  172. package/dist/api/controllers/static/index.js +1 -0
  173. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  174. package/dist/api/controllers/static/templates/preview.hbs +3 -1
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/api/routes/plugin.js +39 -0
  177. package/dist/app.js +9 -0
  178. package/dist/automations/index.js +10 -5
  179. package/dist/automations/triggers.js +39 -5
  180. package/dist/automations/utils.js +16 -7
  181. package/dist/db/utils.js +10 -1
  182. package/dist/environment.js +1 -0
  183. package/dist/integrations/airtable.js +126 -129
  184. package/dist/integrations/arangodb.js +86 -89
  185. package/dist/integrations/base/query.js +2 -2
  186. package/dist/integrations/couchdb.js +80 -83
  187. package/dist/integrations/dynamodb.js +161 -164
  188. package/dist/integrations/elasticsearch.js +135 -138
  189. package/dist/integrations/firebase.js +154 -157
  190. package/dist/integrations/googlesheets.js +323 -327
  191. package/dist/integrations/index.js +93 -51
  192. package/dist/integrations/microsoftSqlServer.js +240 -243
  193. package/dist/integrations/mongodb.js +239 -242
  194. package/dist/integrations/mysql.js +215 -219
  195. package/dist/integrations/oracle.js +318 -322
  196. package/dist/integrations/postgres.js +262 -265
  197. package/dist/integrations/redis.js +134 -139
  198. package/dist/integrations/rest.js +293 -281
  199. package/dist/integrations/s3.js +61 -64
  200. package/dist/integrations/snowflake.js +83 -86
  201. package/dist/package.json +8 -6
  202. package/dist/threads/automation.js +6 -0
  203. package/dist/threads/query.js +2 -2
  204. package/dist/tsconfig.build.tsbuildinfo +1 -1
  205. package/dist/utilities/fileSystem/index.js +116 -7
  206. package/dist/utilities/index.js +8 -0
  207. package/dist/utilities/rowProcessor/utils.js +1 -1
  208. package/dist/utilities/usageQuota/rows.js +2 -1
  209. package/dist/watch.js +77 -0
  210. package/package.json +9 -7
  211. package/scripts/dev/manage.js +1 -0
  212. package/src/api/controllers/application.ts +2 -6
  213. package/src/api/controllers/backup.js +2 -1
  214. package/src/api/controllers/component.js +25 -2
  215. package/src/api/controllers/datasource.js +4 -4
  216. package/src/api/controllers/deploy/index.ts +17 -4
  217. package/src/api/controllers/integration.js +4 -4
  218. package/src/api/controllers/plugin/file.ts +15 -0
  219. package/src/api/controllers/plugin/github.ts +75 -0
  220. package/src/api/controllers/plugin/index.ts +202 -0
  221. package/src/api/controllers/plugin/npm.ts +56 -0
  222. package/src/api/controllers/plugin/uploaders.ts +4 -0
  223. package/src/api/controllers/plugin/url.ts +12 -0
  224. package/src/api/controllers/plugin/utils.ts +19 -0
  225. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  226. package/src/api/controllers/screen.js +65 -1
  227. package/src/api/controllers/static/index.ts +1 -0
  228. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  229. package/src/api/controllers/static/templates/preview.hbs +3 -1
  230. package/src/api/routes/index.ts +2 -0
  231. package/src/api/routes/plugin.ts +14 -0
  232. package/src/api/routes/tests/query.spec.js +11 -28
  233. package/src/app.ts +12 -0
  234. package/src/automations/index.js +6 -3
  235. package/src/automations/triggers.js +44 -10
  236. package/src/automations/utils.ts +21 -9
  237. package/src/db/utils.js +12 -0
  238. package/src/definitions/datasource.ts +1 -0
  239. package/src/environment.js +1 -0
  240. package/src/integrations/airtable.ts +116 -118
  241. package/src/integrations/arangodb.ts +87 -89
  242. package/src/integrations/base/query.ts +2 -2
  243. package/src/integrations/couchdb.ts +83 -89
  244. package/src/integrations/dynamodb.ts +173 -175
  245. package/src/integrations/elasticsearch.ts +120 -122
  246. package/src/integrations/firebase.ts +157 -159
  247. package/src/integrations/googlesheets.ts +328 -338
  248. package/src/integrations/index.ts +59 -21
  249. package/src/integrations/microsoftSqlServer.ts +249 -251
  250. package/src/integrations/mongodb.ts +261 -258
  251. package/src/integrations/mysql.ts +229 -234
  252. package/src/integrations/oracle.ts +373 -380
  253. package/src/integrations/postgres.ts +264 -268
  254. package/src/integrations/redis.ts +128 -132
  255. package/src/integrations/rest.ts +325 -317
  256. package/src/integrations/s3.ts +68 -71
  257. package/src/integrations/snowflake.ts +80 -82
  258. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  259. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  260. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  261. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  262. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  263. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  264. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  265. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  266. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  267. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  268. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  269. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  270. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +57 -14
  271. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  272. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  273. package/src/module.d.ts +2 -0
  274. package/src/threads/automation.ts +6 -0
  275. package/src/threads/query.ts +2 -2
  276. package/src/utilities/fileSystem/index.js +135 -6
  277. package/src/utilities/index.js +8 -0
  278. package/src/utilities/rowProcessor/utils.js +1 -1
  279. package/src/utilities/usageQuota/rows.js +2 -1
  280. package/src/watch.ts +38 -0
  281. package/builder/assets/index.fb22f106.js +0 -875
  282. package/builder/assets/vendor.5e1fe644.css +0 -1
  283. package/builder/assets/vendor.67dbd8fa.js +0 -248
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.sync = exports.destroy = exports.revertClient = exports.updateClient = exports.update = exports.create = exports.fetchAppPackage = exports.fetchAppDefinition = exports.fetch = exports.getAppUrl = void 0;
15
+ exports.updateAppPackage = exports.sync = exports.destroy = exports.revertClient = exports.updateClient = exports.update = exports.create = exports.fetchAppPackage = exports.fetchAppDefinition = exports.fetch = exports.getAppUrl = void 0;
16
16
  const environment_1 = __importDefault(require("../../environment"));
17
17
  const package_json_1 = __importDefault(require("../../../package.json"));
18
18
  const staticViews_1 = require("../../db/views/staticViews");
@@ -353,7 +353,7 @@ const update = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
353
353
  checkAppUrl(ctx, apps, url, ctx.params.appId);
354
354
  ctx.request.body.url = url;
355
355
  }
356
- const app = yield updateAppPackage(ctx.request.body, ctx.params.appId);
356
+ const app = yield (0, exports.updateAppPackage)(ctx.request.body, ctx.params.appId);
357
357
  yield backend_core_2.events.app.updated(app);
358
358
  ctx.status = 200;
359
359
  ctx.body = app;
@@ -375,7 +375,7 @@ const updateClient = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
375
375
  version: updatedToVersion,
376
376
  revertableVersion: currentVersion,
377
377
  };
378
- const app = yield updateAppPackage(appPackageUpdates, ctx.params.appId);
378
+ const app = yield (0, exports.updateAppPackage)(appPackageUpdates, ctx.params.appId);
379
379
  yield backend_core_2.events.app.versionUpdated(app, currentVersion, updatedToVersion);
380
380
  ctx.status = 200;
381
381
  ctx.body = app;
@@ -399,7 +399,7 @@ const revertClient = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
399
399
  version: revertedToVersion,
400
400
  revertableVersion: null,
401
401
  };
402
- const app = yield updateAppPackage(appPackageUpdates, ctx.params.appId);
402
+ const app = yield (0, exports.updateAppPackage)(appPackageUpdates, ctx.params.appId);
403
403
  yield backend_core_2.events.app.versionReverted(app, currentVersion, revertedToVersion);
404
404
  ctx.status = 200;
405
405
  ctx.body = app;
@@ -490,11 +490,7 @@ const sync = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
490
490
  });
491
491
  let error;
492
492
  try {
493
- yield replication.replicate({
494
- filter: function (doc) {
495
- return doc._id !== utils_1.DocumentType.APP_METADATA;
496
- },
497
- });
493
+ yield replication.replicate(replication.appReplicateOpts());
498
494
  }
499
495
  catch (err) {
500
496
  error = err;
@@ -531,6 +527,7 @@ const updateAppPackage = (appPackage, appId) => __awaiter(void 0, void 0, void 0
531
527
  return newAppPackage;
532
528
  }));
533
529
  });
530
+ exports.updateAppPackage = updateAppPackage;
534
531
  const migrateAppNavigation = () => __awaiter(void 0, void 0, void 0, function* () {
535
532
  const db = backend_core_1.context.getAppDB();
536
533
  const existing = yield db.get(utils_1.DocumentType.APP_METADATA);
@@ -11,11 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const { streamBackup } = require("../../utilities/fileSystem");
12
12
  const { events, context } = require("@budibase/backend-core");
13
13
  const { DocumentType } = require("../../db/utils");
14
+ const { isQsTrue } = require("../../utilities");
14
15
  exports.exportAppDump = function (ctx) {
15
16
  return __awaiter(this, void 0, void 0, function* () {
16
17
  let { appId, excludeRows } = ctx.query;
17
18
  const appName = decodeURI(ctx.query.appname);
18
- excludeRows = excludeRows === "true";
19
+ excludeRows = isQsTrue(excludeRows);
19
20
  const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`;
20
21
  ctx.attachment(backupIdentifier);
21
22
  ctx.body = yield streamBackup(appId, excludeRows);
@@ -8,9 +8,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const { DocumentType } = require("../../db/utils");
11
+ const { DocumentType, getPluginParams } = require("../../db/utils");
12
12
  const { getComponentLibraryManifest } = require("../../utilities/fileSystem");
13
13
  const { getAppDB } = require("@budibase/backend-core/context");
14
+ const { getGlobalDB } = require("@budibase/backend-core/tenancy");
15
+ const env = require("../../environment");
14
16
  exports.fetchAppComponentDefinitions = function (ctx) {
15
17
  return __awaiter(this, void 0, void 0, function* () {
16
18
  try {
@@ -35,6 +37,21 @@ exports.fetchAppComponentDefinitions = function (ctx) {
35
37
  }
36
38
  }
37
39
  }
40
+ // for now custom components only supported in self-host
41
+ if (env.SELF_HOSTED) {
42
+ // Add custom components
43
+ const globalDB = getGlobalDB();
44
+ const response = yield globalDB.allDocs(getPluginParams(null, {
45
+ include_docs: true,
46
+ }));
47
+ response.rows
48
+ .map(row => row.doc)
49
+ .filter(plugin => plugin.schema.type === "component")
50
+ .forEach(plugin => {
51
+ const fullComponentName = `plugin/${plugin.name}`;
52
+ definitions[fullComponentName] = Object.assign({ component: fullComponentName }, plugin.schema.schema);
53
+ });
54
+ }
38
55
  ctx.body = definitions;
39
56
  }
40
57
  catch (err) {
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const { generateDatasourceID, getDatasourceParams, getQueryParams, DocumentType, BudibaseInternalDB, getTableParams, } = require("../../db/utils");
12
12
  const { BuildSchemaErrors, InvalidColumns } = require("../../constants");
13
- const { integrations } = require("../../integrations");
13
+ const { getIntegration } = require("../../integrations");
14
14
  const { getDatasourceAndQuery } = require("./row/utils");
15
15
  const { invalidateDynamicVariables } = require("../../threads/utils");
16
16
  const { getAppDB } = require("@budibase/backend-core/context");
@@ -96,7 +96,7 @@ exports.update = function (ctx) {
96
96
  datasource._rev = response.rev;
97
97
  // Drain connection pools when configuration is changed
98
98
  if (datasource.source) {
99
- const source = integrations[datasource.source];
99
+ const source = yield getIntegration(datasource.source);
100
100
  if (source && source.pool) {
101
101
  yield source.pool.end();
102
102
  }
@@ -123,7 +123,7 @@ exports.save = function (ctx) {
123
123
  datasource._rev = dbResp.rev;
124
124
  // Drain connection pools when configuration is changed
125
125
  if (datasource.source) {
126
- const source = integrations[datasource.source];
126
+ const source = yield getIntegration(datasource.source);
127
127
  if (source && source.pool) {
128
128
  yield source.pool.end();
129
129
  }
@@ -188,7 +188,7 @@ function updateError(error, newError, tables) {
188
188
  return error;
189
189
  }
190
190
  const buildSchemaHelper = (datasource) => __awaiter(void 0, void 0, void 0, function* () {
191
- const Connector = integrations[datasource.source];
191
+ const Connector = yield getIntegration(datasource.source);
192
192
  // Connect to the DB and build the schema
193
193
  const connector = new Connector(datasource.config);
194
194
  yield connector.buildSchema(datasource._id, datasource.entities);
@@ -100,14 +100,29 @@ function deployApp(deployment) {
100
100
  target: productionAppId,
101
101
  };
102
102
  replication = new db_1.Replication(config);
103
+ const devDb = (0, context_1.getDevAppDB)();
104
+ console.log("Compacting development DB");
105
+ yield devDb.compact();
103
106
  console.log("Replication object created");
104
- yield replication.replicate();
107
+ yield replication.replicate(replication.appReplicateOpts());
105
108
  console.log("replication complete.. replacing app meta doc");
109
+ // app metadata is excluded as it is likely to be in conflict
110
+ // replicate the app metadata document manually
106
111
  const db = (0, context_1.getProdAppDB)();
107
- const appDoc = yield db.get(utils_1.DocumentType.APP_METADATA);
112
+ const appDoc = yield devDb.get(utils_1.DocumentType.APP_METADATA);
113
+ try {
114
+ const prodAppDoc = yield db.get(utils_1.DocumentType.APP_METADATA);
115
+ appDoc._rev = prodAppDoc._rev;
116
+ }
117
+ catch (err) {
118
+ delete appDoc._rev;
119
+ }
120
+ // switch to production app ID
108
121
  deployment.appUrl = appDoc.url;
109
122
  appDoc.appId = productionAppId;
110
123
  appDoc.instance._id = productionAppId;
124
+ // remove automation errors if they exist
125
+ delete appDoc.automationErrors;
111
126
  yield db.put(appDoc);
112
127
  yield cache_1.app.invalidateAppMetadata(productionAppId);
113
128
  console.log("New app doc written successfully.");
@@ -8,15 +8,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const { cloneDeep } = require("lodash");
12
- const { definitions } = require("../../integrations");
11
+ const { getDefinitions } = require("../../integrations");
13
12
  const { SourceName } = require("@budibase/types");
14
13
  const googlesheets = require("../../integrations/googlesheets");
15
14
  const { featureFlags } = require("@budibase/backend-core");
16
15
  exports.fetch = function (ctx) {
17
16
  return __awaiter(this, void 0, void 0, function* () {
18
17
  ctx.status = 200;
19
- const defs = cloneDeep(definitions);
18
+ const defs = yield getDefinitions();
20
19
  // for google sheets integration google verification
21
20
  if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
22
21
  defs[SourceName.GOOGLE_SHEETS] = googlesheets.schema;
@@ -26,7 +25,8 @@ exports.fetch = function (ctx) {
26
25
  };
27
26
  exports.find = function (ctx) {
28
27
  return __awaiter(this, void 0, void 0, function* () {
28
+ const defs = yield getDefinitions();
29
29
  ctx.status = 200;
30
- ctx.body = definitions[ctx.params.type];
30
+ ctx.body = defs[ctx.params.type];
31
31
  });
32
32
  };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.fileUpload = void 0;
13
+ const fileSystem_1 = require("../../../utilities/fileSystem");
14
+ function fileUpload(file) {
15
+ return __awaiter(this, void 0, void 0, function* () {
16
+ if (!file.name.endsWith(".tar.gz")) {
17
+ throw new Error("Plugin must be compressed into a gzipped tarball.");
18
+ }
19
+ const path = (0, fileSystem_1.createTempFolder)(file.name.split(".tar.gz")[0]);
20
+ yield (0, fileSystem_1.extractTarball)(file.path, path);
21
+ return yield (0, fileSystem_1.getPluginMetadata)(path);
22
+ });
23
+ }
24
+ exports.fileUpload = fileUpload;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.githubUpload = exports.request = void 0;
16
+ const fileSystem_1 = require("../../../utilities/fileSystem");
17
+ const node_fetch_1 = __importDefault(require("node-fetch"));
18
+ const utils_1 = require("./utils");
19
+ function request(url, headers, err) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ const response = yield (0, node_fetch_1.default)(url, { headers });
22
+ if (response.status >= 300) {
23
+ const respErr = yield response.text();
24
+ throw new Error(`Error: ${err} - ${respErr}`);
25
+ }
26
+ return response.json();
27
+ });
28
+ }
29
+ exports.request = request;
30
+ function githubUpload(url, name = "", token = "") {
31
+ var _a;
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ let githubUrl = url;
34
+ if (!githubUrl.includes("https://github.com/")) {
35
+ throw new Error("The plugin origin must be from Github");
36
+ }
37
+ if (url.includes(".git")) {
38
+ githubUrl = url.replace(".git", "");
39
+ }
40
+ const githubApiUrl = githubUrl.replace("https://github.com/", "https://api.github.com/repos/");
41
+ const headers = token ? { Authorization: `Bearer ${token}` } : {};
42
+ const pluginDetails = yield request(githubApiUrl, headers, "Repository not found");
43
+ const pluginName = pluginDetails.name || name;
44
+ const pluginLatestReleaseUrl = (pluginDetails === null || pluginDetails === void 0 ? void 0 : pluginDetails["releases_url"])
45
+ ? pluginDetails === null || pluginDetails === void 0 ? void 0 : pluginDetails["releases_url"].replace("{/id}", "/latest")
46
+ : undefined;
47
+ if (!pluginLatestReleaseUrl) {
48
+ throw new Error("Github release not found");
49
+ }
50
+ const pluginReleaseDetails = yield request(pluginLatestReleaseUrl, headers, "Github latest release not found");
51
+ const pluginReleaseTarballAsset = (_a = pluginReleaseDetails === null || pluginReleaseDetails === void 0 ? void 0 : pluginReleaseDetails.assets) === null || _a === void 0 ? void 0 : _a.find((x) => (x === null || x === void 0 ? void 0 : x["content_type"]) === "application/gzip");
52
+ const pluginLastReleaseTarballUrl = pluginReleaseTarballAsset === null || pluginReleaseTarballAsset === void 0 ? void 0 : pluginReleaseTarballAsset["browser_download_url"];
53
+ if (!pluginLastReleaseTarballUrl) {
54
+ throw new Error("Github latest release url not found");
55
+ }
56
+ try {
57
+ const path = yield (0, utils_1.downloadUnzipTarball)(pluginLastReleaseTarballUrl, pluginName, headers);
58
+ return yield (0, fileSystem_1.getPluginMetadata)(path);
59
+ }
60
+ catch (err) {
61
+ let errMsg = (err === null || err === void 0 ? void 0 : err.message) || err;
62
+ if (errMsg === "unexpected response Not Found") {
63
+ errMsg = "Github release tarball not found";
64
+ }
65
+ throw new Error(errMsg);
66
+ }
67
+ });
68
+ }
69
+ exports.githubUpload = githubUpload;
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.processPlugin = exports.storePlugin = exports.destroy = exports.fetch = exports.create = exports.upload = exports.getPlugins = void 0;
16
+ const constants_1 = require("../../../constants");
17
+ const fileSystem_1 = require("../../../utilities/fileSystem");
18
+ const uploaders_1 = require("./uploaders");
19
+ const tenancy_1 = require("@budibase/backend-core/tenancy");
20
+ const plugins_1 = require("@budibase/backend-core/plugins");
21
+ const utils_1 = require("../../../db/utils");
22
+ const objectStore_1 = require("@budibase/backend-core/objectStore");
23
+ const types_1 = require("@budibase/types");
24
+ const environment_1 = __importDefault(require("../../../environment"));
25
+ function getPlugins(type) {
26
+ return __awaiter(this, void 0, void 0, function* () {
27
+ const db = (0, tenancy_1.getGlobalDB)();
28
+ const response = yield db.allDocs((0, utils_1.getPluginParams)(null, {
29
+ include_docs: true,
30
+ }));
31
+ const plugins = response.rows.map((row) => row.doc);
32
+ if (type) {
33
+ return plugins.filter((plugin) => { var _a; return ((_a = plugin.schema) === null || _a === void 0 ? void 0 : _a.type) === type; });
34
+ }
35
+ else {
36
+ return plugins;
37
+ }
38
+ });
39
+ }
40
+ exports.getPlugins = getPlugins;
41
+ function upload(ctx) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const plugins = ctx.request.files.file.length > 1
44
+ ? Array.from(ctx.request.files.file)
45
+ : [ctx.request.files.file];
46
+ try {
47
+ let docs = [];
48
+ // can do single or multiple plugins
49
+ for (let plugin of plugins) {
50
+ const doc = yield processPlugin(plugin, types_1.PluginSource.FILE);
51
+ docs.push(doc);
52
+ }
53
+ ctx.body = {
54
+ message: "Plugin(s) uploaded successfully",
55
+ plugins: docs,
56
+ };
57
+ }
58
+ catch (err) {
59
+ const errMsg = (err === null || err === void 0 ? void 0 : err.message) ? err === null || err === void 0 ? void 0 : err.message : err;
60
+ ctx.throw(400, `Failed to import plugin: ${errMsg}`);
61
+ }
62
+ });
63
+ }
64
+ exports.upload = upload;
65
+ function create(ctx) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const { source, url, headers, githubToken } = ctx.request.body;
68
+ if (!environment_1.default.SELF_HOSTED) {
69
+ ctx.throw(400, "Plugins not supported outside of self-host.");
70
+ }
71
+ try {
72
+ let metadata;
73
+ let directory;
74
+ // Generating random name as a backup and needed for url
75
+ let name = "PLUGIN_" + Math.floor(100000 + Math.random() * 900000);
76
+ switch (source) {
77
+ case types_1.PluginSource.NPM:
78
+ const { metadata: metadataNpm, directory: directoryNpm } = yield (0, uploaders_1.npmUpload)(url, name);
79
+ metadata = metadataNpm;
80
+ directory = directoryNpm;
81
+ break;
82
+ case types_1.PluginSource.GITHUB:
83
+ const { metadata: metadataGithub, directory: directoryGithub } = yield (0, uploaders_1.githubUpload)(url, name, githubToken);
84
+ metadata = metadataGithub;
85
+ directory = directoryGithub;
86
+ break;
87
+ case types_1.PluginSource.URL:
88
+ const headersObj = headers || {};
89
+ const { metadata: metadataUrl, directory: directoryUrl } = yield (0, uploaders_1.urlUpload)(url, name, headersObj);
90
+ metadata = metadataUrl;
91
+ directory = directoryUrl;
92
+ break;
93
+ }
94
+ (0, plugins_1.validate)(metadata === null || metadata === void 0 ? void 0 : metadata.schema);
95
+ const doc = yield storePlugin(metadata, directory, source);
96
+ ctx.body = {
97
+ message: "Plugin uploaded successfully",
98
+ plugins: [doc],
99
+ };
100
+ }
101
+ catch (err) {
102
+ const errMsg = (err === null || err === void 0 ? void 0 : err.message) ? err === null || err === void 0 ? void 0 : err.message : err;
103
+ ctx.throw(400, `Failed to import plugin: ${errMsg}`);
104
+ }
105
+ ctx.status = 200;
106
+ });
107
+ }
108
+ exports.create = create;
109
+ function fetch(ctx) {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ ctx.body = yield getPlugins();
112
+ });
113
+ }
114
+ exports.fetch = fetch;
115
+ function destroy(ctx) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ const db = (0, tenancy_1.getGlobalDB)();
118
+ const { pluginId } = ctx.params;
119
+ try {
120
+ const plugin = yield db.get(pluginId);
121
+ const bucketPath = `${plugin.name}/`;
122
+ yield (0, objectStore_1.deleteFolder)(constants_1.ObjectStoreBuckets.PLUGINS, bucketPath);
123
+ yield db.remove(pluginId, plugin._rev);
124
+ }
125
+ catch (err) {
126
+ const errMsg = (err === null || err === void 0 ? void 0 : err.message) ? err === null || err === void 0 ? void 0 : err.message : err;
127
+ ctx.throw(400, `Failed to delete plugin: ${errMsg}`);
128
+ }
129
+ ctx.message = `Plugin ${ctx.params.pluginId} deleted.`;
130
+ ctx.status = 200;
131
+ });
132
+ }
133
+ exports.destroy = destroy;
134
+ function storePlugin(metadata, directory, source) {
135
+ return __awaiter(this, void 0, void 0, function* () {
136
+ const db = (0, tenancy_1.getGlobalDB)();
137
+ const version = metadata.package.version, name = metadata.package.name, description = metadata.package.description;
138
+ // first open the tarball into tmp directory
139
+ const bucketPath = `${name}/`;
140
+ const files = yield (0, objectStore_1.uploadDirectory)(constants_1.ObjectStoreBuckets.PLUGINS, directory, bucketPath);
141
+ const jsFile = files.find((file) => file.name.endsWith(".js"));
142
+ if (!jsFile) {
143
+ throw new Error(`Plugin missing .js file.`);
144
+ }
145
+ // validate the JS for a datasource
146
+ if (metadata.schema.type === types_1.PluginType.DATASOURCE) {
147
+ const js = (0, fileSystem_1.loadJSFile)(directory, jsFile.name);
148
+ // TODO: this isn't safe - but we need full node environment
149
+ // in future we should do this in a thread for safety
150
+ try {
151
+ eval(js);
152
+ }
153
+ catch (err) {
154
+ const message = (err === null || err === void 0 ? void 0 : err.message) ? err.message : JSON.stringify(err);
155
+ throw new Error(`JS invalid: ${message}`);
156
+ }
157
+ }
158
+ const jsFileName = jsFile.name;
159
+ const pluginId = (0, utils_1.generatePluginID)(name);
160
+ // overwrite existing docs entirely if they exist
161
+ let rev;
162
+ try {
163
+ const existing = yield db.get(pluginId);
164
+ rev = existing._rev;
165
+ }
166
+ catch (err) {
167
+ rev = undefined;
168
+ }
169
+ let doc = Object.assign(Object.assign({ _id: pluginId, _rev: rev }, metadata), { name,
170
+ version,
171
+ description, jsUrl: `${bucketPath}${jsFileName}` });
172
+ if (source) {
173
+ doc = Object.assign(Object.assign({}, doc), { source });
174
+ }
175
+ const response = yield db.put(doc);
176
+ return Object.assign(Object.assign({}, doc), { _rev: response.rev });
177
+ });
178
+ }
179
+ exports.storePlugin = storePlugin;
180
+ function processPlugin(plugin, source) {
181
+ return __awaiter(this, void 0, void 0, function* () {
182
+ if (!environment_1.default.SELF_HOSTED) {
183
+ throw new Error("Plugins not supported outside of self-host.");
184
+ }
185
+ const { metadata, directory } = yield (0, uploaders_1.fileUpload)(plugin);
186
+ return yield storePlugin(metadata, directory, source);
187
+ });
188
+ }
189
+ exports.processPlugin = processPlugin;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.npmUpload = void 0;
16
+ const fileSystem_1 = require("../../../utilities/fileSystem");
17
+ const node_fetch_1 = __importDefault(require("node-fetch"));
18
+ const path_1 = require("path");
19
+ const utils_1 = require("./utils");
20
+ function npmUpload(url, name, headers = {}) {
21
+ var _a, _b, _c;
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ let npmTarballUrl = url;
24
+ let pluginName = name;
25
+ if (!npmTarballUrl.includes("https://www.npmjs.com") &&
26
+ !npmTarballUrl.includes("https://registry.npmjs.org")) {
27
+ throw new Error("The plugin origin must be from NPM");
28
+ }
29
+ if (!npmTarballUrl.includes(".tgz")) {
30
+ const npmPackageURl = url.replace("https://www.npmjs.com/package/", "https://registry.npmjs.org/");
31
+ const response = yield (0, node_fetch_1.default)(npmPackageURl);
32
+ if (response.status !== 200) {
33
+ throw new Error("NPM Package not found");
34
+ }
35
+ let npmDetails = yield response.json();
36
+ pluginName = npmDetails.name;
37
+ const npmVersion = npmDetails["dist-tags"].latest;
38
+ npmTarballUrl = (_c = (_b = (_a = npmDetails === null || npmDetails === void 0 ? void 0 : npmDetails.versions) === null || _a === void 0 ? void 0 : _a[npmVersion]) === null || _b === void 0 ? void 0 : _b.dist) === null || _c === void 0 ? void 0 : _c.tarball;
39
+ if (!npmTarballUrl) {
40
+ throw new Error("NPM tarball url not found");
41
+ }
42
+ }
43
+ const path = yield (0, utils_1.downloadUnzipTarball)(npmTarballUrl, pluginName, headers);
44
+ const tarballPluginFile = (0, fileSystem_1.findFileRec)(path, ".tar.gz");
45
+ if (!tarballPluginFile) {
46
+ throw new Error("Tarball plugin file not found");
47
+ }
48
+ try {
49
+ yield (0, fileSystem_1.extractTarball)(tarballPluginFile, path);
50
+ (0, fileSystem_1.deleteFolderFileSystem)((0, path_1.join)(path, "package"));
51
+ }
52
+ catch (err) {
53
+ throw new Error(err);
54
+ }
55
+ return yield (0, fileSystem_1.getPluginMetadata)(path);
56
+ });
57
+ }
58
+ exports.npmUpload = npmUpload;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.urlUpload = exports.npmUpload = exports.githubUpload = exports.fileUpload = void 0;
4
+ var file_1 = require("./file");
5
+ Object.defineProperty(exports, "fileUpload", { enumerable: true, get: function () { return file_1.fileUpload; } });
6
+ var github_1 = require("./github");
7
+ Object.defineProperty(exports, "githubUpload", { enumerable: true, get: function () { return github_1.githubUpload; } });
8
+ var npm_1 = require("./npm");
9
+ Object.defineProperty(exports, "npmUpload", { enumerable: true, get: function () { return npm_1.npmUpload; } });
10
+ var url_1 = require("./url");
11
+ Object.defineProperty(exports, "urlUpload", { enumerable: true, get: function () { return url_1.urlUpload; } });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.urlUpload = void 0;
13
+ const utils_1 = require("./utils");
14
+ const fileSystem_1 = require("../../../utilities/fileSystem");
15
+ function urlUpload(url, name = "", headers = {}) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ if (!url.includes(".tar.gz")) {
18
+ throw new Error("Plugin must be compressed into a gzipped tarball.");
19
+ }
20
+ const path = yield (0, utils_1.downloadUnzipTarball)(url, name, headers);
21
+ return yield (0, fileSystem_1.getPluginMetadata)(path);
22
+ });
23
+ }
24
+ exports.urlUpload = urlUpload;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.downloadUnzipTarball = void 0;
13
+ const fileSystem_1 = require("../../../utilities/fileSystem");
14
+ function downloadUnzipTarball(url, name, headers = {}) {
15
+ return __awaiter(this, void 0, void 0, function* () {
16
+ try {
17
+ const path = (0, fileSystem_1.createTempFolder)(name);
18
+ yield (0, fileSystem_1.downloadTarballDirect)(url, path, headers);
19
+ return path;
20
+ }
21
+ catch (e) {
22
+ throw new Error(e.message);
23
+ }
24
+ });
25
+ }
26
+ exports.downloadUnzipTarball = downloadUnzipTarball;
@@ -446,7 +446,7 @@ var External;
446
446
  });
447
447
  // this is the response from knex if no rows found
448
448
  const rows = !response[0].read ? response : [];
449
- const storeTo = isMany ? field.throughFrom || linkPrimaryKey : manyKey;
449
+ const storeTo = isMany ? field.throughFrom || linkPrimaryKey : fieldName;
450
450
  related[storeTo] = { rows, isMany, tableId };
451
451
  }
452
452
  return related;