@budibase/server 2.2.12-alpha.20 → 2.2.12-alpha.21

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 (374) hide show
  1. package/builder/assets/{index.fa480d5b.css → index.34817feb.css} +1 -1
  2. package/builder/assets/{index.35af2c9c.js → index.61dfdc1c.js} +245 -244
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +772 -771
  5. package/coverage/coverage-final.json +40 -40
  6. package/coverage/lcov-report/index.html +55 -55
  7. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +1 -1
  8. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +1 -1
  9. package/coverage/lcov-report/src/api/controllers/application.ts.html +56 -56
  10. package/coverage/lcov-report/src/api/controllers/auth.ts.html +1 -1
  11. package/coverage/lcov-report/src/api/controllers/automation.ts.html +1 -1
  12. package/coverage/lcov-report/src/api/controllers/backup.ts.html +1 -1
  13. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +1 -1
  14. package/coverage/lcov-report/src/api/controllers/component.ts.html +1 -1
  15. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +1 -1
  16. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +12 -12
  17. package/coverage/lcov-report/src/api/controllers/deploy/index.html +1 -1
  18. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +69 -69
  19. package/coverage/lcov-report/src/api/controllers/dev.ts.html +1 -1
  20. package/coverage/lcov-report/src/api/controllers/index.html +1 -1
  21. package/coverage/lcov-report/src/api/controllers/integration.ts.html +1 -1
  22. package/coverage/lcov-report/src/api/controllers/layout.ts.html +1 -1
  23. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +1 -1
  24. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +1 -1
  25. package/coverage/lcov-report/src/api/controllers/permission.ts.html +1 -1
  26. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +1 -1
  27. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +1 -1
  28. package/coverage/lcov-report/src/api/controllers/plugin/index.html +1 -1
  29. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +1 -1
  30. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +1 -1
  31. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +1 -1
  32. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +1 -1
  33. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +1 -1
  34. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +1 -1
  35. package/coverage/lcov-report/src/api/controllers/public/index.html +1 -1
  36. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +1 -1
  37. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +1 -1
  38. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +1 -1
  39. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +1 -1
  40. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +1 -1
  41. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +1 -1
  42. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +1 -1
  43. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +1 -1
  44. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +1 -1
  45. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +1 -1
  46. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +1 -1
  47. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +1 -1
  48. package/coverage/lcov-report/src/api/controllers/query/import/index.html +1 -1
  49. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +1 -1
  50. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +1 -1
  51. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +1 -1
  52. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +1 -1
  53. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +1 -1
  54. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +1 -1
  55. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +1 -1
  56. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +1 -1
  57. package/coverage/lcov-report/src/api/controllers/query/index.html +1 -1
  58. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +1 -1
  59. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +1 -1
  60. package/coverage/lcov-report/src/api/controllers/role.ts.html +1 -1
  61. package/coverage/lcov-report/src/api/controllers/routing.ts.html +1 -1
  62. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +1 -1
  63. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +1 -1
  64. package/coverage/lcov-report/src/api/controllers/row/index.html +15 -15
  65. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +1 -1
  66. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +23 -20
  67. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +1 -1
  68. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +1 -1
  69. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +1 -1
  70. package/coverage/lcov-report/src/api/controllers/screen.ts.html +1 -1
  71. package/coverage/lcov-report/src/api/controllers/script.ts.html +1 -1
  72. package/coverage/lcov-report/src/api/controllers/static/index.html +1 -1
  73. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +1 -1
  74. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +1 -1
  75. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +17 -17
  76. package/coverage/lcov-report/src/api/controllers/table/index.html +33 -33
  77. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +122 -35
  78. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +5 -5
  79. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +23 -26
  80. package/coverage/lcov-report/src/api/controllers/templates.ts.html +1 -1
  81. package/coverage/lcov-report/src/api/controllers/user.ts.html +1 -1
  82. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +61 -16
  83. package/coverage/lcov-report/src/api/controllers/view/index.html +28 -28
  84. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +52 -25
  85. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +1 -1
  86. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +1 -1
  87. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +1 -1
  88. package/coverage/lcov-report/src/api/index.html +1 -1
  89. package/coverage/lcov-report/src/api/index.ts.html +5 -5
  90. package/coverage/lcov-report/src/api/routes/analytics.ts.html +1 -1
  91. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +1 -1
  92. package/coverage/lcov-report/src/api/routes/application.ts.html +1 -1
  93. package/coverage/lcov-report/src/api/routes/auth.ts.html +1 -1
  94. package/coverage/lcov-report/src/api/routes/automation.ts.html +1 -1
  95. package/coverage/lcov-report/src/api/routes/backup.ts.html +1 -1
  96. package/coverage/lcov-report/src/api/routes/cloud.ts.html +1 -1
  97. package/coverage/lcov-report/src/api/routes/component.ts.html +1 -1
  98. package/coverage/lcov-report/src/api/routes/datasource.ts.html +1 -1
  99. package/coverage/lcov-report/src/api/routes/deploy.ts.html +1 -1
  100. package/coverage/lcov-report/src/api/routes/dev.ts.html +1 -1
  101. package/coverage/lcov-report/src/api/routes/index.html +1 -1
  102. package/coverage/lcov-report/src/api/routes/index.ts.html +1 -1
  103. package/coverage/lcov-report/src/api/routes/integration.ts.html +1 -1
  104. package/coverage/lcov-report/src/api/routes/layout.ts.html +1 -1
  105. package/coverage/lcov-report/src/api/routes/metadata.ts.html +1 -1
  106. package/coverage/lcov-report/src/api/routes/migrations.ts.html +1 -1
  107. package/coverage/lcov-report/src/api/routes/permission.ts.html +1 -1
  108. package/coverage/lcov-report/src/api/routes/plugin.ts.html +1 -1
  109. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +1 -1
  110. package/coverage/lcov-report/src/api/routes/public/index.html +1 -1
  111. package/coverage/lcov-report/src/api/routes/public/index.ts.html +1 -1
  112. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +1 -1
  113. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +1 -1
  114. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +1 -1
  115. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +1 -1
  116. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +1 -1
  117. package/coverage/lcov-report/src/api/routes/public/tests/index.html +1 -1
  118. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +1 -1
  119. package/coverage/lcov-report/src/api/routes/public/users.ts.html +1 -1
  120. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +1 -1
  121. package/coverage/lcov-report/src/api/routes/public/utils/index.html +1 -1
  122. package/coverage/lcov-report/src/api/routes/query.ts.html +1 -1
  123. package/coverage/lcov-report/src/api/routes/role.ts.html +1 -1
  124. package/coverage/lcov-report/src/api/routes/routing.ts.html +1 -1
  125. package/coverage/lcov-report/src/api/routes/row.ts.html +1 -1
  126. package/coverage/lcov-report/src/api/routes/screen.ts.html +1 -1
  127. package/coverage/lcov-report/src/api/routes/script.ts.html +1 -1
  128. package/coverage/lcov-report/src/api/routes/static.ts.html +1 -1
  129. package/coverage/lcov-report/src/api/routes/table.ts.html +17 -86
  130. package/coverage/lcov-report/src/api/routes/templates.ts.html +1 -1
  131. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +1 -1
  132. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +1 -1
  133. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +1 -1
  134. package/coverage/lcov-report/src/api/routes/user.ts.html +1 -1
  135. package/coverage/lcov-report/src/api/routes/utils/index.html +1 -1
  136. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +2 -2
  137. package/coverage/lcov-report/src/api/routes/view.ts.html +1 -1
  138. package/coverage/lcov-report/src/api/routes/webhook.ts.html +1 -1
  139. package/coverage/lcov-report/src/app.ts.html +1 -1
  140. package/coverage/lcov-report/src/automations/actions.ts.html +1 -1
  141. package/coverage/lcov-report/src/automations/automationUtils.ts.html +1 -1
  142. package/coverage/lcov-report/src/automations/bullboard.ts.html +2 -2
  143. package/coverage/lcov-report/src/automations/index.html +1 -1
  144. package/coverage/lcov-report/src/automations/index.ts.html +1 -1
  145. package/coverage/lcov-report/src/automations/logging/index.html +1 -1
  146. package/coverage/lcov-report/src/automations/logging/index.ts.html +1 -1
  147. package/coverage/lcov-report/src/automations/steps/bash.ts.html +1 -1
  148. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +1 -1
  149. package/coverage/lcov-report/src/automations/steps/delay.ts.html +1 -1
  150. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +1 -1
  151. package/coverage/lcov-report/src/automations/steps/discord.ts.html +1 -1
  152. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +1 -1
  153. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +1 -1
  154. package/coverage/lcov-report/src/automations/steps/filter.ts.html +1 -1
  155. package/coverage/lcov-report/src/automations/steps/index.html +1 -1
  156. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +1 -1
  157. package/coverage/lcov-report/src/automations/steps/loop.ts.html +1 -1
  158. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +1 -1
  159. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +1 -1
  160. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +1 -1
  161. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +1 -1
  162. package/coverage/lcov-report/src/automations/steps/slack.ts.html +1 -1
  163. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +1 -1
  164. package/coverage/lcov-report/src/automations/steps/utils.ts.html +1 -1
  165. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +1 -1
  166. package/coverage/lcov-report/src/automations/tests/utilities/index.html +1 -1
  167. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +1 -1
  168. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +1 -1
  169. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +1 -1
  170. package/coverage/lcov-report/src/automations/triggerInfo/index.html +1 -1
  171. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +1 -1
  172. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +1 -1
  173. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +1 -1
  174. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +1 -1
  175. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +1 -1
  176. package/coverage/lcov-report/src/automations/triggers.ts.html +1 -1
  177. package/coverage/lcov-report/src/automations/utils.ts.html +11 -11
  178. package/coverage/lcov-report/src/constants/index.html +1 -1
  179. package/coverage/lcov-report/src/constants/index.ts.html +25 -25
  180. package/coverage/lcov-report/src/constants/layouts.ts.html +1 -1
  181. package/coverage/lcov-report/src/constants/screens.ts.html +1 -1
  182. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +1 -1
  183. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +1 -1
  184. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +1 -1
  185. package/coverage/lcov-report/src/db/defaultData/index.html +1 -1
  186. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +1 -1
  187. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +1 -1
  188. package/coverage/lcov-report/src/db/dynamoClient.ts.html +1 -1
  189. package/coverage/lcov-report/src/db/inMemoryView.ts.html +1 -1
  190. package/coverage/lcov-report/src/db/index.html +1 -1
  191. package/coverage/lcov-report/src/db/index.ts.html +1 -1
  192. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +1 -1
  193. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +1 -1
  194. package/coverage/lcov-report/src/db/linkedRows/index.html +1 -1
  195. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +1 -1
  196. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +1 -1
  197. package/coverage/lcov-report/src/db/newid.ts.html +3 -3
  198. package/coverage/lcov-report/src/db/utils.ts.html +15 -15
  199. package/coverage/lcov-report/src/definitions/automations.ts.html +1 -1
  200. package/coverage/lcov-report/src/definitions/datasource.ts.html +1 -1
  201. package/coverage/lcov-report/src/definitions/index.html +1 -1
  202. package/coverage/lcov-report/src/environment.ts.html +19 -19
  203. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +1 -1
  204. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +1 -1
  205. package/coverage/lcov-report/src/events/index.html +1 -1
  206. package/coverage/lcov-report/src/events/index.ts.html +1 -1
  207. package/coverage/lcov-report/src/events/utils.ts.html +1 -1
  208. package/coverage/lcov-report/src/index.html +1 -1
  209. package/coverage/lcov-report/src/index.ts.html +1 -1
  210. package/coverage/lcov-report/src/integrations/airtable.ts.html +1 -1
  211. package/coverage/lcov-report/src/integrations/arangodb.ts.html +1 -1
  212. package/coverage/lcov-report/src/integrations/base/index.html +1 -1
  213. package/coverage/lcov-report/src/integrations/base/query.ts.html +1 -1
  214. package/coverage/lcov-report/src/integrations/base/sql.ts.html +1 -1
  215. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +1 -1
  216. package/coverage/lcov-report/src/integrations/base/utils.ts.html +1 -1
  217. package/coverage/lcov-report/src/integrations/couchdb.ts.html +1 -1
  218. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +1 -1
  219. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +1 -1
  220. package/coverage/lcov-report/src/integrations/firebase.ts.html +1 -1
  221. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +1 -1
  222. package/coverage/lcov-report/src/integrations/index.html +1 -1
  223. package/coverage/lcov-report/src/integrations/index.ts.html +1 -1
  224. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +1 -1
  225. package/coverage/lcov-report/src/integrations/mongodb.ts.html +1 -1
  226. package/coverage/lcov-report/src/integrations/mysql.ts.html +1 -1
  227. package/coverage/lcov-report/src/integrations/oracle.ts.html +1 -1
  228. package/coverage/lcov-report/src/integrations/postgres.ts.html +1 -1
  229. package/coverage/lcov-report/src/integrations/queries/index.html +1 -1
  230. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +1 -1
  231. package/coverage/lcov-report/src/integrations/redis.ts.html +1 -1
  232. package/coverage/lcov-report/src/integrations/rest.ts.html +1 -1
  233. package/coverage/lcov-report/src/integrations/s3.ts.html +1 -1
  234. package/coverage/lcov-report/src/integrations/snowflake.ts.html +1 -1
  235. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +1 -1
  236. package/coverage/lcov-report/src/integrations/tests/index.html +1 -1
  237. package/coverage/lcov-report/src/integrations/utils.ts.html +1 -1
  238. package/coverage/lcov-report/src/middleware/appInfo.ts.html +1 -1
  239. package/coverage/lcov-report/src/middleware/authorized.ts.html +21 -21
  240. package/coverage/lcov-report/src/middleware/builder.ts.html +12 -12
  241. package/coverage/lcov-report/src/middleware/currentapp.ts.html +33 -33
  242. package/coverage/lcov-report/src/middleware/index.html +1 -1
  243. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +1 -1
  244. package/coverage/lcov-report/src/middleware/publicApi.ts.html +1 -1
  245. package/coverage/lcov-report/src/middleware/resourceId.ts.html +1 -1
  246. package/coverage/lcov-report/src/middleware/selfhost.ts.html +1 -1
  247. package/coverage/lcov-report/src/middleware/utils.ts.html +3 -3
  248. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +1 -1
  249. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +1 -1
  250. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +1 -1
  251. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +1 -1
  252. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +1 -1
  253. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +1 -1
  254. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +1 -1
  255. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +1 -1
  256. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +1 -1
  257. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +1 -1
  258. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +1 -1
  259. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +1 -1
  260. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +1 -1
  261. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +1 -1
  262. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +1 -1
  263. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +1 -1
  264. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +1 -1
  265. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +1 -1
  266. package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
  267. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +1 -1
  268. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +1 -1
  269. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +1 -1
  270. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +1 -1
  271. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +1 -1
  272. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +1 -1
  273. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +1 -1
  274. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +1 -1
  275. package/coverage/lcov-report/src/migrations/index.html +1 -1
  276. package/coverage/lcov-report/src/migrations/index.ts.html +1 -1
  277. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +1 -1
  278. package/coverage/lcov-report/src/migrations/tests/index.html +1 -1
  279. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +1 -1
  280. package/coverage/lcov-report/src/sdk/app/applications/index.html +1 -1
  281. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +1 -1
  282. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +18 -18
  283. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +7 -7
  284. package/coverage/lcov-report/src/sdk/app/automations/index.html +1 -1
  285. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +1 -1
  286. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +1 -1
  287. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +1 -1
  288. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +1 -1
  289. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +1 -1
  290. package/coverage/lcov-report/src/sdk/app/backups/index.html +1 -1
  291. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +1 -1
  292. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +1 -1
  293. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +1 -1
  294. package/coverage/lcov-report/src/sdk/app/rows/index.html +1 -1
  295. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +1 -1
  296. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +1 -1
  297. package/coverage/lcov-report/src/sdk/app/tables/index.html +1 -1
  298. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +1 -1
  299. package/coverage/lcov-report/src/sdk/index.html +1 -1
  300. package/coverage/lcov-report/src/sdk/index.ts.html +2 -2
  301. package/coverage/lcov-report/src/sdk/users/index.html +1 -1
  302. package/coverage/lcov-report/src/sdk/users/index.ts.html +1 -1
  303. package/coverage/lcov-report/src/sdk/users/utils.ts.html +20 -20
  304. package/coverage/lcov-report/src/startup.ts.html +1 -1
  305. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +59 -59
  306. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +3 -3
  307. package/coverage/lcov-report/src/tests/utilities/index.html +1 -1
  308. package/coverage/lcov-report/src/tests/utilities/index.ts.html +1 -1
  309. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +2 -2
  310. package/coverage/lcov-report/src/threads/automation.ts.html +1 -1
  311. package/coverage/lcov-report/src/threads/index.html +1 -1
  312. package/coverage/lcov-report/src/threads/index.ts.html +1 -1
  313. package/coverage/lcov-report/src/threads/query.ts.html +1 -1
  314. package/coverage/lcov-report/src/threads/utils.ts.html +1 -1
  315. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +3 -3
  316. package/coverage/lcov-report/src/utilities/centralPath.ts.html +2 -2
  317. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +16 -16
  318. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +8 -8
  319. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +30 -30
  320. package/coverage/lcov-report/src/utilities/fileSystem/index.html +15 -15
  321. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +6 -6
  322. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +8 -8
  323. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +1 -1
  324. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +7 -7
  325. package/coverage/lcov-report/src/utilities/global.ts.html +33 -33
  326. package/coverage/lcov-report/src/utilities/index.html +24 -24
  327. package/coverage/lcov-report/src/utilities/index.ts.html +4 -4
  328. package/coverage/lcov-report/src/utilities/redis.ts.html +1 -1
  329. package/coverage/lcov-report/src/utilities/routing/index.html +1 -1
  330. package/coverage/lcov-report/src/utilities/routing/index.ts.html +1 -1
  331. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +1 -1
  332. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +1 -1
  333. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +1 -1
  334. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +1 -1
  335. package/coverage/lcov-report/src/utilities/{csvParser.ts.html → schema.ts.html} +173 -233
  336. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +1 -1
  337. package/coverage/lcov-report/src/utilities/security.ts.html +1 -1
  338. package/coverage/lcov-report/src/utilities/usageQuota/index.html +1 -1
  339. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +1 -1
  340. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +1 -1
  341. package/coverage/lcov-report/src/utilities/users.ts.html +1 -1
  342. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +1 -1
  343. package/coverage/lcov-report/src/watch.ts.html +1 -1
  344. package/coverage/lcov-report/src/websocket.ts.html +1 -1
  345. package/coverage/lcov.info +1303 -1267
  346. package/dist/api/controllers/row/internal.js +12 -8
  347. package/dist/api/controllers/table/external.js +8 -30
  348. package/dist/api/controllers/table/index.js +44 -15
  349. package/dist/api/controllers/table/internal.js +4 -4
  350. package/dist/api/controllers/table/utils.js +9 -9
  351. package/dist/api/controllers/view/exporters.js +22 -6
  352. package/dist/api/controllers/view/index.js +19 -34
  353. package/dist/api/routes/table.js +6 -37
  354. package/dist/api/routes/utils/validators.js +1 -1
  355. package/dist/package.json +6 -6
  356. package/dist/tsconfig.build.tsbuildinfo +1 -1
  357. package/dist/utilities/schema.js +108 -0
  358. package/package.json +7 -7
  359. package/src/api/controllers/row/internal.ts +10 -9
  360. package/src/api/controllers/table/external.ts +10 -10
  361. package/src/api/controllers/table/index.ts +46 -17
  362. package/src/api/controllers/table/internal.ts +4 -4
  363. package/src/api/controllers/table/utils.ts +12 -13
  364. package/src/api/controllers/view/exporters.ts +20 -5
  365. package/src/api/controllers/view/index.ts +21 -12
  366. package/src/api/routes/table.ts +15 -38
  367. package/src/api/routes/tests/misc.spec.js +4 -10
  368. package/src/api/routes/tests/table.spec.js +8 -30
  369. package/src/api/routes/utils/validators.ts +1 -1
  370. package/src/utilities/schema.ts +141 -0
  371. package/dist/utilities/csvParser.js +0 -152
  372. package/src/utilities/csvParser.ts +0 -161
  373. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -15
  374. package/src/utilities/tests/csvParser.spec.js +0 -112
@@ -43,21 +43,18 @@ describe("/tables", () => {
43
43
  expect(events.table.created).toBeCalledWith(res.body)
44
44
  })
45
45
 
46
- it("creates a table via data import CSV", async () => {
46
+ it("creates a table via data import", async () => {
47
47
  const table = basicTable()
48
- table.dataImport = {
49
- csvString: "\"name\",\"description\"\n\"test-name\",\"test-desc\"",
50
- }
51
- table.dataImport.schema = table.schema
48
+ table.rows = [{ name: 'test-name', description: 'test-desc' }]
52
49
 
53
50
  const res = await createTable(table)
54
51
 
55
52
  expect(events.table.created).toBeCalledTimes(1)
56
53
  expect(events.table.created).toBeCalledWith(res.body)
57
54
  expect(events.table.imported).toBeCalledTimes(1)
58
- expect(events.table.imported).toBeCalledWith(res.body, "csv")
55
+ expect(events.table.imported).toBeCalledWith(res.body)
59
56
  expect(events.rows.imported).toBeCalledTimes(1)
60
- expect(events.rows.imported).toBeCalledWith(res.body, "csv", 1)
57
+ expect(events.rows.imported).toBeCalledWith(res.body, 1)
61
58
  })
62
59
 
63
60
  it("should apply authorization to endpoint", async () => {
@@ -155,11 +152,10 @@ describe("/tables", () => {
155
152
  it("imports rows successfully", async () => {
156
153
  const table = await config.createTable()
157
154
  const importRequest = {
158
- dataImport: {
159
- csvString: "\"name\",\"description\"\n\"test-name\",\"test-desc\"",
160
- schema: table.schema
161
- }
155
+ schema: table.schema,
156
+ rows: [{ name: 'test-name', description: 'test-desc' }]
162
157
  }
158
+
163
159
  jest.clearAllMocks()
164
160
 
165
161
  await request
@@ -171,7 +167,7 @@ describe("/tables", () => {
171
167
 
172
168
  expect(events.table.created).not.toHaveBeenCalled()
173
169
  expect(events.rows.imported).toBeCalledTimes(1)
174
- expect(events.rows.imported).toBeCalledWith(table, "csv", 1)
170
+ expect(events.rows.imported).toBeCalledWith(table, 1)
175
171
  })
176
172
  })
177
173
 
@@ -206,24 +202,6 @@ describe("/tables", () => {
206
202
  })
207
203
  })
208
204
 
209
- describe("validate csv", () => {
210
- it("should be able to validate a CSV layout", async () => {
211
- const res = await request
212
- .post(`/api/tables/csv/validate`)
213
- .send({
214
- csvString: "a,b,c,d\n1,2,3,4"
215
- })
216
- .set(config.defaultHeaders())
217
- .expect('Content-Type', /json/)
218
- .expect(200)
219
- expect(res.body.schema).toBeDefined()
220
- expect(res.body.schema.a).toEqual({
221
- type: "string",
222
- success: true,
223
- })
224
- })
225
- })
226
-
227
205
  describe("indexing", () => {
228
206
  it("should be able to create a table with indexes", async () => {
229
207
  await context.doInAppContext(appId, async () => {
@@ -18,7 +18,7 @@ export function tableValidator() {
18
18
  schema: Joi.object().required(),
19
19
  name: Joi.string().required(),
20
20
  views: Joi.object(),
21
- dataImport: Joi.object(),
21
+ rows: Joi.array(),
22
22
  }).unknown(true))
23
23
  }
24
24
 
@@ -0,0 +1,141 @@
1
+ import { FieldTypes } from "../constants"
2
+
3
+ interface SchemaColumn {
4
+ readonly name: string
5
+ readonly type: FieldTypes
6
+ readonly autocolumn?: boolean
7
+ }
8
+
9
+ interface Schema {
10
+ readonly [index: string]: SchemaColumn
11
+ }
12
+
13
+ interface Row {
14
+ [index: string]: any
15
+ }
16
+
17
+ type Rows = Array<Row>
18
+
19
+ interface SchemaValidation {
20
+ [index: string]: boolean
21
+ }
22
+
23
+ interface ValidationResults {
24
+ schemaValidation: SchemaValidation
25
+ allValid: boolean
26
+ invalidColumns: Array<string>
27
+ }
28
+
29
+ const PARSERS: any = {
30
+ [FieldTypes.NUMBER]: (attribute?: string) => {
31
+ if (!attribute) {
32
+ return attribute
33
+ }
34
+ return Number(attribute)
35
+ },
36
+ [FieldTypes.DATETIME]: (attribute?: string) => {
37
+ if (!attribute) {
38
+ return attribute
39
+ }
40
+ return new Date(attribute).toISOString()
41
+ },
42
+ }
43
+
44
+ export function isSchema(schema: any): schema is Schema {
45
+ return (
46
+ typeof schema === "object" &&
47
+ Object.values(schema).every(rawColumn => {
48
+ const column = rawColumn as SchemaColumn
49
+
50
+ return (
51
+ column !== null &&
52
+ typeof column === "object" &&
53
+ typeof column.type === "string" &&
54
+ Object.values(FieldTypes).includes(column.type as FieldTypes)
55
+ )
56
+ })
57
+ )
58
+ }
59
+
60
+ export function isRows(rows: any): rows is Rows {
61
+ return Array.isArray(rows) && rows.every(row => typeof row === "object")
62
+ }
63
+
64
+ export function validate(rows: Rows, schema: Schema): ValidationResults {
65
+ const results: ValidationResults = {
66
+ schemaValidation: {},
67
+ allValid: false,
68
+ invalidColumns: [],
69
+ }
70
+
71
+ rows.forEach(row => {
72
+ Object.entries(row).forEach(([columnName, columnData]) => {
73
+ const columnType = schema[columnName]?.type
74
+ const isAutoColumn = schema[columnName]?.autocolumn
75
+
76
+ // If the columnType is not a string, then it's not present in the schema, and should be added to the invalid columns array
77
+ if (typeof columnType !== "string") {
78
+ results.invalidColumns.push(columnName)
79
+ } else if (
80
+ // If there's no data for this field don't bother with further checks
81
+ // If the field is already marked as invalid there's no need for further checks
82
+ results.schemaValidation[columnName] === false ||
83
+ columnData == null ||
84
+ isAutoColumn
85
+ ) {
86
+ return
87
+ } else if (
88
+ columnType === FieldTypes.NUMBER &&
89
+ isNaN(Number(columnData))
90
+ ) {
91
+ // If provided must be a valid number
92
+ results.schemaValidation[columnName] = false
93
+ } else if (
94
+ // If provided must be a valid date
95
+ columnType === FieldTypes.DATETIME &&
96
+ isNaN(new Date(columnData).getTime())
97
+ ) {
98
+ results.schemaValidation[columnName] = false
99
+ } else {
100
+ results.schemaValidation[columnName] = true
101
+ }
102
+ })
103
+ })
104
+
105
+ results.allValid =
106
+ Object.values(results.schemaValidation).length > 0 &&
107
+ Object.values(results.schemaValidation).every(column => column)
108
+
109
+ // Select unique values
110
+ results.invalidColumns = [...new Set(results.invalidColumns)]
111
+ return results
112
+ }
113
+
114
+ export function parse(rows: Rows, schema: Schema): Rows {
115
+ return rows.map(row => {
116
+ const parsedRow: Row = {}
117
+
118
+ Object.entries(row).forEach(([columnName, columnData]) => {
119
+ if (!(columnName in schema) || schema[columnName]?.autocolumn) {
120
+ // Objects can be present in the row data but not in the schema, so make sure we don't proceed in such a case
121
+ return
122
+ }
123
+
124
+ const columnType = schema[columnName].type
125
+
126
+ if (columnType === FieldTypes.NUMBER) {
127
+ // If provided must be a valid number
128
+ parsedRow[columnName] = columnData ? Number(columnData) : columnData
129
+ } else if (columnType === FieldTypes.DATETIME) {
130
+ // If provided must be a valid date
131
+ parsedRow[columnName] = columnData
132
+ ? new Date(columnData).toISOString()
133
+ : columnData
134
+ } else {
135
+ parsedRow[columnName] = columnData
136
+ }
137
+ })
138
+
139
+ return parsedRow
140
+ })
141
+ }
@@ -1,152 +0,0 @@
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.transform = exports.updateSchema = exports.parse = void 0;
16
- const csvtojson_1 = __importDefault(require("csvtojson"));
17
- const constants_1 = require("../constants");
18
- const VALIDATORS = {
19
- [constants_1.FieldTypes.STRING]: () => true,
20
- [constants_1.FieldTypes.OPTIONS]: () => true,
21
- [constants_1.FieldTypes.BARCODEQR]: () => true,
22
- [constants_1.FieldTypes.NUMBER]: (attribute) => {
23
- // allow not to be present
24
- if (!attribute) {
25
- return true;
26
- }
27
- return !isNaN(Number(attribute));
28
- },
29
- [constants_1.FieldTypes.DATETIME]: (attribute) => {
30
- // allow not to be present
31
- if (!attribute) {
32
- return true;
33
- }
34
- return !isNaN(new Date(attribute).getTime());
35
- },
36
- };
37
- const PARSERS = {
38
- [constants_1.FieldTypes.NUMBER]: (attribute) => {
39
- if (!attribute) {
40
- return attribute;
41
- }
42
- return Number(attribute);
43
- },
44
- [constants_1.FieldTypes.DATETIME]: (attribute) => {
45
- if (!attribute) {
46
- return attribute;
47
- }
48
- return new Date(attribute).toISOString();
49
- },
50
- };
51
- function parse(csvString, parsers) {
52
- const result = (0, csvtojson_1.default)().fromString(csvString);
53
- const schema = {};
54
- return new Promise((resolve, reject) => {
55
- result.on("header", headers => {
56
- for (let header of headers) {
57
- schema[header] = {
58
- type: parsers[header] ? parsers[header].type : "string",
59
- success: true,
60
- };
61
- }
62
- });
63
- result.subscribe(row => {
64
- // For each CSV row parse all the columns that need parsed
65
- for (let key of Object.keys(parsers)) {
66
- if (!schema[key] || schema[key].success) {
67
- // get the validator for the column type
68
- const validator = VALIDATORS[parsers[key].type];
69
- try {
70
- // allow null/undefined values
71
- schema[key].success = !row[key] || validator(row[key]);
72
- }
73
- catch (err) {
74
- schema[key].success = false;
75
- }
76
- }
77
- }
78
- });
79
- result.on("done", error => {
80
- if (error) {
81
- console.error(error);
82
- reject(error);
83
- }
84
- resolve(schema);
85
- });
86
- });
87
- }
88
- exports.parse = parse;
89
- function updateSchema({ schema, existingTable, }) {
90
- if (!schema) {
91
- return schema;
92
- }
93
- const finalSchema = {};
94
- const schemaKeyMap = {};
95
- Object.keys(schema).forEach(key => (schemaKeyMap[key.toLowerCase()] = key));
96
- for (let [key, field] of Object.entries((existingTable === null || existingTable === void 0 ? void 0 : existingTable.schema) || {})) {
97
- const lcKey = key.toLowerCase();
98
- const foundKey = schemaKeyMap[lcKey];
99
- if (foundKey) {
100
- finalSchema[key] = schema[foundKey];
101
- finalSchema[key].type = field.type;
102
- }
103
- }
104
- return finalSchema;
105
- }
106
- exports.updateSchema = updateSchema;
107
- function transform({ schema, csvString, existingTable, }) {
108
- return __awaiter(this, void 0, void 0, function* () {
109
- if (!schema || !csvString) {
110
- throw new Error("Unable to transform CSV without schema");
111
- }
112
- const colParser = {};
113
- // make sure the table has all the columns required for import
114
- if (existingTable) {
115
- schema = updateSchema({ schema, existingTable });
116
- }
117
- for (let [key, field] of Object.entries(schema || {})) {
118
- // don't import data to auto columns
119
- if (!field.autocolumn) {
120
- colParser[key] = PARSERS[field.type] || field.type;
121
- }
122
- }
123
- try {
124
- const data = yield (0, csvtojson_1.default)({ colParser }).fromString(csvString);
125
- const schemaKeyMap = {};
126
- Object.keys(schema || {}).forEach(key => (schemaKeyMap[key.toLowerCase()] = key));
127
- for (let element of data) {
128
- if (!data) {
129
- continue;
130
- }
131
- for (let key of Object.keys(element)) {
132
- const mappedKey = schemaKeyMap[key.toLowerCase()];
133
- // isn't a column in the table, remove it
134
- if (mappedKey == null) {
135
- delete element[key];
136
- }
137
- // casing is different, fix it in row
138
- else if (key !== mappedKey) {
139
- element[mappedKey] = element[key];
140
- delete element[key];
141
- }
142
- }
143
- }
144
- return data;
145
- }
146
- catch (err) {
147
- console.error(`Error transforming CSV to JSON for data import`, err);
148
- throw err;
149
- }
150
- });
151
- }
152
- exports.transform = transform;
@@ -1,161 +0,0 @@
1
- import { FieldSchema, Table } from "@budibase/types"
2
- import csv from "csvtojson"
3
- import { FieldTypes } from "../constants"
4
-
5
- type CsvParseOpts = {
6
- schema?: { [key: string]: any }
7
- existingTable: Table
8
- csvString?: string
9
- }
10
-
11
- const VALIDATORS: any = {
12
- [FieldTypes.STRING]: () => true,
13
- [FieldTypes.OPTIONS]: () => true,
14
- [FieldTypes.BARCODEQR]: () => true,
15
- [FieldTypes.NUMBER]: (attribute?: string) => {
16
- // allow not to be present
17
- if (!attribute) {
18
- return true
19
- }
20
- return !isNaN(Number(attribute))
21
- },
22
- [FieldTypes.DATETIME]: (attribute?: string) => {
23
- // allow not to be present
24
- if (!attribute) {
25
- return true
26
- }
27
- return !isNaN(new Date(attribute).getTime())
28
- },
29
- }
30
-
31
- const PARSERS: any = {
32
- [FieldTypes.NUMBER]: (attribute?: string) => {
33
- if (!attribute) {
34
- return attribute
35
- }
36
- return Number(attribute)
37
- },
38
- [FieldTypes.DATETIME]: (attribute?: string) => {
39
- if (!attribute) {
40
- return attribute
41
- }
42
- return new Date(attribute).toISOString()
43
- },
44
- }
45
-
46
- export function parse(csvString: string, parsers: any): Record<string, any> {
47
- const result = csv().fromString(csvString)
48
-
49
- const schema: Record<string, any> = {}
50
-
51
- return new Promise((resolve, reject) => {
52
- result.on("header", headers => {
53
- for (let header of headers) {
54
- schema[header] = {
55
- type: parsers[header] ? parsers[header].type : "string",
56
- success: true,
57
- }
58
- }
59
- })
60
- result.subscribe(row => {
61
- // For each CSV row parse all the columns that need parsed
62
- for (let key of Object.keys(parsers)) {
63
- if (!schema[key] || schema[key].success) {
64
- // get the validator for the column type
65
- const validator = VALIDATORS[parsers[key].type]
66
-
67
- try {
68
- // allow null/undefined values
69
- schema[key].success = !row[key] || validator(row[key])
70
- } catch (err) {
71
- schema[key].success = false
72
- }
73
- }
74
- }
75
- })
76
- result.on("done", error => {
77
- if (error) {
78
- console.error(error)
79
- reject(error)
80
- }
81
-
82
- resolve(schema)
83
- })
84
- })
85
- }
86
-
87
- export function updateSchema({
88
- schema,
89
- existingTable,
90
- }: {
91
- schema?: Record<string, any>
92
- existingTable?: Table
93
- }) {
94
- if (!schema) {
95
- return schema
96
- }
97
- const finalSchema: Record<string, FieldSchema> = {}
98
- const schemaKeyMap: Record<string, any> = {}
99
- Object.keys(schema).forEach(key => (schemaKeyMap[key.toLowerCase()] = key))
100
- for (let [key, field] of Object.entries(existingTable?.schema || {})) {
101
- const lcKey = key.toLowerCase()
102
- const foundKey: string = schemaKeyMap[lcKey]
103
- if (foundKey) {
104
- finalSchema[key] = schema[foundKey]
105
- finalSchema[key].type = field.type
106
- }
107
- }
108
- return finalSchema
109
- }
110
-
111
- export async function transform({
112
- schema,
113
- csvString,
114
- existingTable,
115
- }: CsvParseOpts) {
116
- if (!schema || !csvString) {
117
- throw new Error("Unable to transform CSV without schema")
118
- }
119
- const colParser: any = {}
120
-
121
- // make sure the table has all the columns required for import
122
- if (existingTable) {
123
- schema = updateSchema({ schema, existingTable })
124
- }
125
-
126
- for (let [key, field] of Object.entries(schema || {})) {
127
- // don't import data to auto columns
128
- if (!field.autocolumn) {
129
- colParser[key] = PARSERS[field.type] || field.type
130
- }
131
- }
132
-
133
- try {
134
- const data = await csv({ colParser }).fromString(csvString)
135
- const schemaKeyMap: any = {}
136
- Object.keys(schema || {}).forEach(
137
- key => (schemaKeyMap[key.toLowerCase()] = key)
138
- )
139
- for (let element of data) {
140
- if (!data) {
141
- continue
142
- }
143
- for (let key of Object.keys(element)) {
144
- const mappedKey = schemaKeyMap[key.toLowerCase()]
145
- // isn't a column in the table, remove it
146
- if (mappedKey == null) {
147
- delete element[key]
148
- }
149
- // casing is different, fix it in row
150
- else if (key !== mappedKey) {
151
- element[mappedKey] = element[key]
152
- delete element[key]
153
- }
154
- }
155
- }
156
- return data
157
- } catch (err) {
158
- console.error(`Error transforming CSV to JSON for data import`, err)
159
- throw err
160
- }
161
- }
@@ -1,15 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`CSV Parser transformation transforms a CSV file into JSON 1`] = `
4
- Array [
5
- Object {
6
- "Age": 4324,
7
- },
8
- Object {
9
- "Age": 34,
10
- },
11
- Object {
12
- "Age": 23423,
13
- },
14
- ]
15
- `;
@@ -1,112 +0,0 @@
1
- const { readFileSync } = require("../fileSystem")
2
- const csvParser = require("../csvParser")
3
-
4
- const CSV_PATH = __dirname + "/test.csv"
5
-
6
- const SCHEMAS = {
7
- VALID: {
8
- Age: {
9
- type: "number",
10
- },
11
- },
12
- INVALID: {
13
- Address: {
14
- type: "number",
15
- },
16
- Age: {
17
- type: "number",
18
- },
19
- },
20
- IGNORE: {
21
- Address: {
22
- type: "omit",
23
- },
24
- Age: {
25
- type: "omit",
26
- },
27
- Name: {
28
- type: "string",
29
- },
30
- },
31
- BROKEN: {
32
- Address: {
33
- type: "datetime",
34
- },
35
- },
36
- }
37
-
38
- describe("CSV Parser", () => {
39
- const csvString = readFileSync(CSV_PATH, "utf8")
40
-
41
- describe("parsing", () => {
42
- it("returns status and types for a valid CSV transformation", async () => {
43
- expect(await csvParser.parse(csvString, SCHEMAS.VALID)).toEqual({
44
- Address: {
45
- success: true,
46
- type: "string",
47
- },
48
- Age: {
49
- success: true,
50
- type: "number",
51
- },
52
- Name: {
53
- success: true,
54
- type: "string",
55
- },
56
- })
57
- })
58
-
59
- it("returns status and types for an invalid CSV transformation", async () => {
60
- expect(await csvParser.parse(csvString, SCHEMAS.INVALID)).toEqual({
61
- Address: {
62
- success: false,
63
- type: "number",
64
- },
65
- Age: {
66
- success: true,
67
- type: "number",
68
- },
69
- Name: {
70
- success: true,
71
- type: "string",
72
- },
73
- })
74
- })
75
- })
76
-
77
- describe("transformation", () => {
78
- it("transforms a CSV file into JSON", async () => {
79
- expect(
80
- await csvParser.transform({
81
- schema: SCHEMAS.VALID,
82
- csvString,
83
- })
84
- ).toMatchSnapshot()
85
- })
86
-
87
- it("transforms a CSV file into JSON ignoring certain fields", async () => {
88
- expect(
89
- await csvParser.transform({
90
- schema: SCHEMAS.IGNORE,
91
- csvString,
92
- })
93
- ).toEqual([
94
- {
95
- Name: "Bertå",
96
- },
97
- {
98
- Name: "Ernie",
99
- },
100
- {
101
- Name: "Big Bird",
102
- },
103
- ])
104
- })
105
-
106
- it("throws an error on invalid schema", async () => {
107
- await expect(
108
- csvParser.transform({ schema: SCHEMAS.BROKEN, csvString })
109
- ).rejects.toThrow()
110
- })
111
- })
112
- })