@kaspernj/api-maker 1.0.445 → 1.0.447

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 (361) hide show
  1. package/{.eslintrc.cjs → .eslintrc.js} +4 -0
  2. package/README.md +35 -0
  3. package/android/build.gradle +43 -0
  4. package/android/src/main/AndroidManifest.xml +2 -0
  5. package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +50 -0
  6. package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +30 -0
  7. package/build/api.js +120 -0
  8. package/build/attribute-not-loaded-error.js +2 -0
  9. package/build/base-component.js +5 -0
  10. package/build/base-error.js +33 -0
  11. package/build/base-model/attribute.js +25 -0
  12. package/build/base-model/column.js +11 -0
  13. package/build/base-model/reflection.js +14 -0
  14. package/build/base-model/scope.js +11 -0
  15. package/build/base-model.js +828 -0
  16. package/build/bootstrap/attribute-row/index.js +105 -0
  17. package/build/bootstrap/attribute-rows.js +31 -0
  18. package/build/bootstrap/card.js +138 -0
  19. package/build/bootstrap/checkbox.js +97 -0
  20. package/build/bootstrap/checkboxes.js +183 -0
  21. package/build/bootstrap/index.js +2 -0
  22. package/build/bootstrap/input.js +128 -0
  23. package/build/bootstrap/invalid-feedback.js +27 -0
  24. package/build/bootstrap/paginate.js +150 -0
  25. package/build/bootstrap/radio-buttons.js +72 -0
  26. package/build/bootstrap/select.js +88 -0
  27. package/build/bootstrap/sort-link.js +130 -0
  28. package/build/cable-connection-pool.js +128 -0
  29. package/build/cable-subscription-pool.js +207 -0
  30. package/build/cable-subscription.js +21 -0
  31. package/build/cache-key-generator.js +81 -0
  32. package/build/can-can.js +134 -0
  33. package/build/channels-consumer.js +3 -0
  34. package/build/collection-loader.js +48 -0
  35. package/build/collection.js +279 -0
  36. package/build/command-submit-data.js +81 -0
  37. package/build/commands-pool.js +195 -0
  38. package/build/compose.js +9 -0
  39. package/build/config.js +53 -0
  40. package/build/custom-error.js +5 -0
  41. package/build/data-set-to-attributes.js +10 -0
  42. package/build/deserializer.js +56 -0
  43. package/build/destroy-error.js +5 -0
  44. package/build/devise.js +109 -0
  45. package/build/draggable-sort/controller.js +136 -0
  46. package/build/draggable-sort/index.js +114 -0
  47. package/build/draggable-sort/item.js +188 -0
  48. package/build/error-logger.js +101 -0
  49. package/build/error-messages.js +13 -0
  50. package/build/event-connection.js +32 -0
  51. package/build/event-model-class.js +24 -0
  52. package/build/events.js +5 -0
  53. package/build/form.js +83 -0
  54. package/build/index.js +3 -0
  55. package/build/inputs/attachment.js +121 -0
  56. package/build/inputs/auto-submit.js +36 -0
  57. package/build/inputs/checkbox.js +145 -0
  58. package/build/inputs/checkboxes.js +111 -0
  59. package/build/inputs/id-for-component.js +15 -0
  60. package/build/inputs/input-wrapper.js +18 -0
  61. package/build/inputs/input.js +230 -0
  62. package/build/inputs/money.js +179 -0
  63. package/build/inputs/name-for-component.js +13 -0
  64. package/build/inputs/select.js +92 -0
  65. package/build/instance-of-class-name.js +23 -0
  66. package/build/key-value-store.js +53 -0
  67. package/build/link.js +68 -0
  68. package/build/logger.js +30 -0
  69. package/build/modal.js +37 -0
  70. package/build/model-class-require.js +13 -0
  71. package/build/model-events.js +30 -0
  72. package/build/model-name.js +28 -0
  73. package/build/model-prop-type.js +101 -0
  74. package/build/model-recipes-loader.js +32 -0
  75. package/build/model-recipes-model-loader.js +357 -0
  76. package/build/models-response-reader.js +40 -0
  77. package/build/models.js +8 -0
  78. package/build/money-formatter.js +77 -0
  79. package/build/not-loaded-error.js +2 -0
  80. package/build/params.js +60 -0
  81. package/build/preloaded.js +38 -0
  82. package/build/resize-observer.js +11 -0
  83. package/build/result.js +13 -0
  84. package/build/router/route.js +262 -0
  85. package/build/router/switch.js +72 -0
  86. package/build/router.js +57 -0
  87. package/build/routes-native.js +202 -0
  88. package/build/routes.js +50 -0
  89. package/build/run-last.js +35 -0
  90. package/build/serializer.js +63 -0
  91. package/build/services.js +20 -0
  92. package/build/session-status-updater.js +126 -0
  93. package/build/source-maps-loader.js +171 -0
  94. package/build/super-admin/config-reader.js +84 -0
  95. package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
  96. package/build/super-admin/edit-page/edit-attribute-content.js +54 -0
  97. package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
  98. package/build/super-admin/edit-page/edit-attribute.js +76 -0
  99. package/build/super-admin/edit-page.js +120 -0
  100. package/build/super-admin/has-edit-config.js +12 -0
  101. package/build/super-admin/index-page.js +24 -0
  102. package/build/super-admin/index.js +180 -0
  103. package/build/super-admin/layout/header/index.js +151 -0
  104. package/build/super-admin/layout/index.js +109 -0
  105. package/build/super-admin/layout/menu/index.js +93 -0
  106. package/build/super-admin/layout/menu/menu-content.js +40 -0
  107. package/build/super-admin/layout/menu/menu-item.js +83 -0
  108. package/build/super-admin/layout/no-access.js +25 -0
  109. package/build/super-admin/model-class-table.js +61 -0
  110. package/build/super-admin/models.js +8 -0
  111. package/build/super-admin/show-nav.js +49 -0
  112. package/build/super-admin/show-page/belongs-to-attribute-row.js +28 -0
  113. package/build/super-admin/show-page/index.js +141 -0
  114. package/build/super-admin/show-reflection-actions.js +47 -0
  115. package/build/super-admin/show-reflection-link.js +46 -0
  116. package/build/super-admin/show-reflection-page.js +47 -0
  117. package/build/table/column-content.js +112 -0
  118. package/build/table/column-identifier.js +18 -0
  119. package/build/table/column-visible.js +7 -0
  120. package/build/table/components/column.js +20 -0
  121. package/build/table/components/flat-list.js +20 -0
  122. package/build/table/components/header.js +25 -0
  123. package/build/table/components/row.js +25 -0
  124. package/build/table/filters/attribute-element.js +43 -0
  125. package/build/table/filters/filter-form.js +392 -0
  126. package/build/table/filters/filter.js +89 -0
  127. package/build/table/filters/index.js +182 -0
  128. package/build/table/filters/load-search-modal.js +174 -0
  129. package/build/table/filters/reflection-element.js +36 -0
  130. package/build/table/filters/save-search-modal.js +86 -0
  131. package/build/table/filters/scope-element.js +41 -0
  132. package/build/table/header-column-content.js +67 -0
  133. package/build/table/header-column.js +144 -0
  134. package/build/table/header-select.js +104 -0
  135. package/build/table/model-callback-args.js +10 -0
  136. package/build/table/model-column.js +87 -0
  137. package/build/table/model-row.js +179 -0
  138. package/build/table/select-calculator.js +63 -0
  139. package/build/table/settings/column-row.js +97 -0
  140. package/build/table/settings/download-action.js +78 -0
  141. package/build/table/settings/index.js +92 -0
  142. package/build/table/table-settings.js +219 -0
  143. package/build/table/table.js +972 -0
  144. package/build/table/use-sorting.js +34 -0
  145. package/build/table/widths.js +75 -0
  146. package/build/table/worker-plugins-check-all-checkbox.js +125 -0
  147. package/build/table/worker-plugins-checkbox.js +115 -0
  148. package/build/translated-attributes.js +10 -0
  149. package/build/translated-collections.js +11 -0
  150. package/build/updated-attribute.js +76 -0
  151. package/build/url-encode.js +15 -0
  152. package/build/use-breakpoint.js +44 -0
  153. package/build/use-can-can.js +55 -0
  154. package/build/use-collection.js +225 -0
  155. package/build/use-created-event.js +52 -0
  156. package/build/use-current-user.js +73 -0
  157. package/build/use-destroyed-event.js +60 -0
  158. package/build/use-event-emitter.js +13 -0
  159. package/build/use-event-listener.js +16 -0
  160. package/build/use-input.js +140 -0
  161. package/build/use-model-event.js +60 -0
  162. package/build/use-model.js +169 -0
  163. package/build/use-resize-observer.js +23 -0
  164. package/build/use-router.js +102 -0
  165. package/build/use-screen-layout.js +39 -0
  166. package/build/use-updated-event.js +60 -0
  167. package/build/use-validation-errors.js +30 -0
  168. package/build/utils/card.js +51 -0
  169. package/build/utils/checkbox.js +48 -0
  170. package/build/utils/default-style.js +18 -0
  171. package/build/utils/modal.js +61 -0
  172. package/build/utils/text.js +18 -0
  173. package/build/validation-error.js +28 -0
  174. package/build/validation-errors.js +98 -0
  175. package/build/with-collection.js +13 -0
  176. package/build/with-current-user.js +9 -0
  177. package/build/with-model.js +14 -0
  178. package/build/with-router.js +21 -0
  179. package/expo-module.config.json +17 -0
  180. package/ios/ApiMaker.podspec +29 -0
  181. package/ios/ApiMakerModule.swift +48 -0
  182. package/ios/ApiMakerView.swift +38 -0
  183. package/package.json +35 -14
  184. package/src/{api.mjs → api.js} +5 -5
  185. package/src/{base-error.mjs → base-error.js} +1 -1
  186. package/src/base-model/{attribute.mjs → attribute.js} +1 -1
  187. package/src/base-model/{reflection.mjs → reflection.js} +1 -1
  188. package/src/{base-model.mjs → base-model.js} +14 -14
  189. package/src/bootstrap/attribute-row/index.jsx +2 -2
  190. package/src/bootstrap/attribute-rows.jsx +1 -1
  191. package/src/bootstrap/card.jsx +1 -1
  192. package/src/bootstrap/checkbox.jsx +1 -1
  193. package/src/bootstrap/checkboxes.jsx +1 -1
  194. package/src/bootstrap/input.jsx +1 -1
  195. package/src/bootstrap/paginate.jsx +2 -2
  196. package/src/bootstrap/sort-link.jsx +3 -3
  197. package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +3 -3
  198. package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +4 -4
  199. package/src/{cable-subscription.mjs → cable-subscription.js} +1 -1
  200. package/src/{can-can.mjs → can-can.js} +1 -1
  201. package/src/collection-loader.jsx +2 -2
  202. package/src/{collection.mjs → collection.js} +3 -3
  203. package/src/{commands-pool.mjs → commands-pool.js} +11 -11
  204. package/src/{custom-error.mjs → custom-error.js} +1 -1
  205. package/src/{deserializer.mjs → deserializer.js} +2 -2
  206. package/src/{destroy-error.mjs → destroy-error.js} +1 -1
  207. package/src/{devise.mjs → devise.js} +5 -9
  208. package/src/draggable-sort/controller.js +137 -0
  209. package/src/draggable-sort/index.jsx +108 -0
  210. package/src/draggable-sort/item.jsx +174 -0
  211. package/src/{error-logger.mjs → error-logger.js} +1 -1
  212. package/src/event-connection.jsx +1 -1
  213. package/src/event-model-class.jsx +1 -1
  214. package/src/form.jsx +1 -1
  215. package/src/index.js +3 -0
  216. package/src/inputs/attachment.jsx +2 -2
  217. package/src/inputs/checkbox.jsx +7 -6
  218. package/src/inputs/checkboxes.jsx +1 -1
  219. package/src/inputs/input-wrapper.jsx +1 -1
  220. package/src/inputs/input.jsx +8 -7
  221. package/src/inputs/money.jsx +3 -3
  222. package/src/inputs/select.jsx +1 -1
  223. package/src/{key-value-store.mjs → key-value-store.js} +1 -1
  224. package/src/link.jsx +2 -2
  225. package/src/modal.jsx +1 -1
  226. package/src/{model-class-require.mjs → model-class-require.js} +4 -2
  227. package/src/{model-events.mjs → model-events.js} +1 -1
  228. package/src/{model-name.mjs → model-name.js} +1 -1
  229. package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
  230. package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +2 -2
  231. package/src/{models-response-reader.mjs → models-response-reader.js} +2 -2
  232. package/src/models.js +7 -0
  233. package/src/{models.mjs.erb → models.js.erb} +1 -1
  234. package/src/{params.mjs → params.js} +2 -2
  235. package/src/{preloaded.mjs → preloaded.js} +1 -1
  236. package/src/resize-observer.jsx +1 -1
  237. package/src/router/route.jsx +1 -1
  238. package/src/router/switch.jsx +1 -1
  239. package/src/router.jsx +1 -1
  240. package/src/{routes-native.mjs → routes-native.js} +1 -1
  241. package/src/{services.mjs → services.js} +1 -1
  242. package/src/{session-status-updater.mjs → session-status-updater.js} +3 -3
  243. package/src/{source-maps-loader.mjs → source-maps-loader.js} +1 -1
  244. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +1 -1
  245. package/src/super-admin/edit-page/edit-attribute-content.jsx +1 -1
  246. package/src/super-admin/edit-page/edit-attribute-input.jsx +1 -1
  247. package/src/super-admin/edit-page/edit-attribute.jsx +1 -1
  248. package/src/super-admin/edit-page.jsx +2 -2
  249. package/src/super-admin/has-edit-config.js +1 -1
  250. package/src/super-admin/index-page.jsx +1 -1
  251. package/src/super-admin/index.jsx +7 -7
  252. package/src/super-admin/layout/header/index.jsx +2 -2
  253. package/src/super-admin/layout/index.jsx +3 -3
  254. package/src/super-admin/layout/menu/index.jsx +3 -3
  255. package/src/super-admin/layout/menu/menu-content.jsx +2 -2
  256. package/src/super-admin/layout/menu/{menu-item/index.jsx → menu-item.jsx} +5 -6
  257. package/src/super-admin/layout/no-access.jsx +2 -2
  258. package/src/super-admin/model-class-table.jsx +3 -3
  259. package/src/super-admin/models.js +1 -1
  260. package/src/super-admin/show-nav.jsx +2 -2
  261. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +1 -1
  262. package/src/super-admin/show-page/index.jsx +2 -2
  263. package/src/super-admin/show-reflection-actions.jsx +1 -1
  264. package/src/super-admin/show-reflection-link.jsx +1 -1
  265. package/src/super-admin/show-reflection-page.jsx +1 -1
  266. package/src/table/column-content.jsx +1 -1
  267. package/src/table/components/column.jsx +8 -2
  268. package/src/table/components/header.jsx +2 -2
  269. package/src/table/filters/filter-form.jsx +1 -1
  270. package/src/table/filters/index.jsx +5 -3
  271. package/src/table/filters/load-search-modal.jsx +6 -4
  272. package/src/table/filters/save-search-modal.jsx +4 -4
  273. package/src/table/header-column.jsx +59 -79
  274. package/src/table/header-select.jsx +1 -1
  275. package/src/table/model-column.jsx +12 -6
  276. package/src/table/model-row.jsx +11 -7
  277. package/src/table/{select-calculator.mjs → select-calculator.js} +1 -1
  278. package/src/table/settings/column-row.jsx +4 -3
  279. package/src/table/settings/download-action.jsx +3 -3
  280. package/src/table/settings/index.jsx +3 -3
  281. package/src/table/table-settings.js +5 -4
  282. package/src/table/table.jsx +149 -71
  283. package/src/table/{use-sorting.mjs → use-sorting.js} +1 -1
  284. package/src/table/{widths.mjs → widths.jsx} +11 -2
  285. package/src/table/worker-plugins-check-all-checkbox.jsx +2 -2
  286. package/src/table/worker-plugins-checkbox.jsx +2 -2
  287. package/src/{translated-collections.mjs → translated-collections.js} +1 -1
  288. package/src/updated-attribute.jsx +1 -1
  289. package/src/{use-breakpoint.mjs → use-breakpoint.js} +2 -2
  290. package/src/use-can-can.js +55 -0
  291. package/src/{use-collection.mjs → use-collection.js} +4 -4
  292. package/src/{use-created-event.mjs → use-created-event.js} +2 -2
  293. package/src/{use-current-user.mjs → use-current-user.js} +6 -5
  294. package/src/{use-destroyed-event.mjs → use-destroyed-event.js} +2 -2
  295. package/src/{use-input.mjs → use-input.js} +5 -5
  296. package/src/use-model-event.js +2 -2
  297. package/src/{use-model.mjs → use-model.js} +4 -4
  298. package/src/{use-resize-observer.mjs → use-resize-observer.js} +1 -1
  299. package/src/use-router.jsx +2 -2
  300. package/src/{use-updated-event.mjs → use-updated-event.js} +2 -2
  301. package/src/{use-validation-errors.mjs → use-validation-errors.js} +3 -3
  302. package/src/utils/checkbox.jsx +2 -2
  303. package/src/{validation-error.mjs → validation-error.js} +1 -1
  304. package/src/{validation-errors.mjs → validation-errors.js} +1 -1
  305. package/src/with-current-user.jsx +1 -1
  306. package/src/with-model.jsx +1 -1
  307. package/__tests__/base-model.test.mjs +0 -71
  308. package/__tests__/cable-connection-pool.test.mjs +0 -227
  309. package/__tests__/cable-subscription-pool.test.mjs +0 -27
  310. package/__tests__/can-can.test.mjs +0 -34
  311. package/__tests__/collection.test.mjs +0 -51
  312. package/__tests__/custom-error.test.mjs +0 -13
  313. package/__tests__/model-name.test.mjs +0 -34
  314. package/__tests__/model-prop-type.test.mjs +0 -113
  315. package/__tests__/params.test.mjs +0 -40
  316. package/__tests__/routes-native.test.mjs +0 -104
  317. package/__tests__/routes.test.mjs +0 -47
  318. package/__tests__/serializer.test.mjs +0 -30
  319. package/__tests__/support/task.mjs +0 -27
  320. package/__tests__/support/user.mjs +0 -32
  321. package/index.js +0 -1
  322. package/jest.config.js +0 -9
  323. package/src/event-created.jsx +0 -12
  324. package/src/event-destroyed.jsx +0 -25
  325. package/src/event-emitter-listener.jsx +0 -10
  326. package/src/event-listener.jsx +0 -25
  327. package/src/event-updated.jsx +0 -27
  328. package/src/super-admin/layout/menu/menu-item/style.scss +0 -10
  329. package/src/use-can-can.mjs +0 -48
  330. package/src/with-can-can.jsx +0 -12
  331. package/webpack.config.js +0 -15
  332. /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
  333. /package/src/base-model/{column.mjs → column.js} +0 -0
  334. /package/src/base-model/{scope.mjs → scope.js} +0 -0
  335. /package/src/{cache-key-generator.mjs → cache-key-generator.js} +0 -0
  336. /package/src/{channels-consumer.mjs → channels-consumer.js} +0 -0
  337. /package/src/{command-submit-data.mjs → command-submit-data.js} +0 -0
  338. /package/src/{config.mjs → config.js} +0 -0
  339. /package/src/{data-set-to-attributes.mjs → data-set-to-attributes.js} +0 -0
  340. /package/src/{error-messages.mjs → error-messages.js} +0 -0
  341. /package/src/{events.mjs → events.js} +0 -0
  342. /package/src/inputs/{auto-submit.mjs → auto-submit.js} +0 -0
  343. /package/src/inputs/{id-for-component.mjs → id-for-component.js} +0 -0
  344. /package/src/inputs/{name-for-component.mjs → name-for-component.js} +0 -0
  345. /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
  346. /package/src/{logger.mjs → logger.js} +0 -0
  347. /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
  348. /package/src/{money-formatter.mjs → money-formatter.js} +0 -0
  349. /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
  350. /package/src/{result.mjs → result.js} +0 -0
  351. /package/src/{routes.mjs → routes.js} +0 -0
  352. /package/src/{run-last.mjs → run-last.js} +0 -0
  353. /package/src/{serializer.mjs → serializer.js} +0 -0
  354. /package/src/table/{column-identifier.mjs → column-identifier.js} +0 -0
  355. /package/src/table/{column-visible.mjs → column-visible.js} +0 -0
  356. /package/src/table/{model-callback-args.mjs → model-callback-args.js} +0 -0
  357. /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
  358. /package/src/{url-encode.mjs → url-encode.js} +0 -0
  359. /package/src/{use-event-emitter.mjs → use-event-emitter.js} +0 -0
  360. /package/src/{use-event-listener.mjs → use-event-listener.js} +0 -0
  361. /package/src/{use-screen-layout.mjs → use-screen-layout.js} +0 -0
@@ -0,0 +1,219 @@
1
+ import columnIdentifier from "./column-identifier";
2
+ import columnVisible from "./column-visible";
3
+ import { digg } from "diggerize";
4
+ import * as inflection from "inflection";
5
+ import Logger from "../logger";
6
+ import { ReadersWriterLock } from "epic-locks";
7
+ import { serialize as objectToFormData } from "object-to-formdata";
8
+ import models from "../models";
9
+ import { v4 as uuidv4 } from "uuid";
10
+ const logger = new Logger({
11
+ name: "ApiMaker / TableSettings"
12
+ });
13
+ const {
14
+ TableSetting
15
+ } = models;
16
+
17
+ // Have a lock for each unique table identifier
18
+ const tableSettingsLocks = {};
19
+ export default class ApiMakerTableSettings {
20
+ constructor({
21
+ table
22
+ }) {
23
+ this.table = table;
24
+ this.setTableSettingsLock();
25
+ }
26
+ setTableSettingsLock() {
27
+ const identifier = this.identifier();
28
+ if (!(identifier in tableSettingsLocks)) {
29
+ tableSettingsLocks[identifier] = new ReadersWriterLock();
30
+ }
31
+ this.tableSettingsLock = digg(tableSettingsLocks, identifier);
32
+ }
33
+ columns = () => digg(this, "table", "columnsAsArray")();
34
+ currentUser = () => digg(this, "table", "props", "currentUser");
35
+ identifier = () => digg(this, "table", "state", "identifier");
36
+ preparedColumns = tableSetting => {
37
+ const columns = this.table.columnsAsArray();
38
+ const ordered = this.orderedTableSettingColumns(tableSetting);
39
+ const result = {
40
+ columns: [],
41
+ preload: []
42
+ };
43
+ if (!ordered) return;
44
+ for (const tableSettingColumn of ordered) {
45
+ const column = columns.find(column => columnIdentifier(column) == tableSettingColumn.identifier());
46
+ result.columns.push({
47
+ column,
48
+ tableSettingColumn
49
+ });
50
+
51
+ // Add needed preloads if column is visible
52
+ if (columnVisible(column, tableSettingColumn)) {
53
+ if (column.path) {
54
+ const preload = column.path.map(pathPart => inflection.underscore(pathPart)).join(".");
55
+ if (!result.preload.includes(preload)) result.preload.push(preload);
56
+ }
57
+ }
58
+ }
59
+ return result;
60
+ };
61
+ orderedTableSettingColumns = tableSetting => {
62
+ return tableSetting.columns().loaded().sort((tableSettingColumn1, tableSettingColumn2) => tableSettingColumn1.position() - tableSettingColumn2.position());
63
+ };
64
+ loadExistingOrCreateTableSettings = async () => {
65
+ return await this.tableSettingsLock.write(async () => {
66
+ let tableSetting = await this.loadTableSetting();
67
+ if (tableSetting) {
68
+ tableSetting = await this.updateTableSetting(tableSetting);
69
+ } else {
70
+ tableSetting = await this.createInitialTableSetting();
71
+ }
72
+ return tableSetting;
73
+ });
74
+ };
75
+ loadTableSetting = async () => {
76
+ if (!TableSetting) throw new Error("TableSetting model isn't globally available");
77
+ const tableSetting = await TableSetting.ransack({
78
+ identifier_eq: this.identifier(),
79
+ user_id_eq: this.currentUserIdOrFallback(),
80
+ user_type_eq: this.currentUserTypeOrFallback()
81
+ }).preload("columns").first();
82
+ return tableSetting;
83
+ };
84
+ currentUserIdOrFallback() {
85
+ const currentUser = this.currentUser();
86
+ if (currentUser) return currentUser.id();
87
+ return this.anonymouseUserId();
88
+ }
89
+ currentUserTypeOrFallback() {
90
+ const currentUser = this.currentUser();
91
+ if (currentUser) return digg(currentUser.modelClassData(), "name");
92
+ return null;
93
+ }
94
+ anonymouseUserId() {
95
+ const variableName = `ApiMakerTableAnonymousUserId-${this.identifier()}`;
96
+ if (!(variableName in localStorage)) {
97
+ const generatedId = uuidv4();
98
+ localStorage[variableName] = generatedId;
99
+ }
100
+ return digg(localStorage, variableName);
101
+ }
102
+ createInitialTableSetting = async () => {
103
+ const tableSettingData = {
104
+ identifier: this.identifier(),
105
+ user_id: this.currentUserIdOrFallback(),
106
+ user_type: this.currentUserTypeOrFallback(),
107
+ columns_attributes: {}
108
+ };
109
+ const columns = this.columns();
110
+ for (const columnKey in columns) {
111
+ const column = digg(columns, columnKey);
112
+ const identifier = columnIdentifier(column);
113
+ const columnData = this.columnSaveData(column, {
114
+ identifier,
115
+ position: columnKey
116
+ });
117
+ tableSettingData.columns_attributes[columnKey] = columnData;
118
+ }
119
+ const tableSetting = new TableSetting();
120
+ const tableSettingFormData = objectToFormData({
121
+ table_setting: tableSettingData
122
+ });
123
+ await tableSetting.saveRaw(tableSettingFormData);
124
+ const reloadedTableSetting = await this.loadTableSetting();
125
+ return reloadedTableSetting;
126
+ };
127
+ columnSaveData(column, {
128
+ identifier,
129
+ position
130
+ }) {
131
+ return {
132
+ attribute_name: column.attribute,
133
+ identifier,
134
+ path: column.path,
135
+ position,
136
+ sort_key: column.sortKey,
137
+ visible: null
138
+ };
139
+ }
140
+ updateTableSetting = async tableSetting => {
141
+ const changedAttributesList = ["attributeName", "sortKey"];
142
+ const columns = this.columns();
143
+ const columnsData = {};
144
+ const tableSettingData = {
145
+ columns_attributes: columnsData
146
+ };
147
+ let columnsKeyCount = 0;
148
+ let changed = false;
149
+
150
+ // Add missing columns
151
+ for (const column of columns) {
152
+ const identifier = columnIdentifier(column);
153
+ const tableSettingColumn = tableSetting.columns().loaded().find(tableSettingColumn => tableSettingColumn.identifier() == identifier);
154
+ if (!tableSettingColumn) {
155
+ const columnKey = ++columnsKeyCount;
156
+ columnsData[columnKey] = this.columnSaveData(column, {
157
+ identifier,
158
+ position: tableSetting.columns().loaded().length + columnKey
159
+ });
160
+ logger.debug(() => `Changed because of new column: ${column.label}`);
161
+ changed = true;
162
+ }
163
+ }
164
+ for (const tableSettingColumn of tableSetting.columns().loaded()) {
165
+ const column = columns.find(column => columnIdentifier(column) == tableSettingColumn.identifier());
166
+ if (column) {
167
+ // TODO: Update column if changed
168
+ let columnChanged = false;
169
+ for (const changedAttribute of changedAttributesList) {
170
+ let columnAttributeName;
171
+ if (changedAttribute == "attributeName") {
172
+ columnAttributeName = "attribute";
173
+ } else {
174
+ columnAttributeName = changedAttribute;
175
+ }
176
+ const oldAttributeValue = tableSettingColumn[changedAttribute]();
177
+ const newAttributeValue = column[columnAttributeName];
178
+ if (oldAttributeValue != newAttributeValue) {
179
+ logger.debug(() => `${changedAttribute} changed from ${oldAttributeValue} to ${newAttributeValue} on column: ${column.label}`);
180
+ columnChanged = true;
181
+ }
182
+ }
183
+ const columnPathAsString = JSON.stringify(column.path);
184
+ const tableSettingColumnPathAsString = tableSettingColumn.path();
185
+ if (columnPathAsString != tableSettingColumnPathAsString) {
186
+ logger.debug(() => `Path changed on ${column.label} from ${columnPathAsString} to ${tableSettingColumnPathAsString}`);
187
+ columnChanged = true;
188
+ }
189
+ if (columnChanged) {
190
+ const columnKey = ++columnsKeyCount;
191
+ changed = true;
192
+ columnsData[columnKey] = {
193
+ attribute_name: column.attributeName,
194
+ id: tableSettingColumn.id(),
195
+ path: column.path,
196
+ sort_key: column.sortKey
197
+ };
198
+ }
199
+ } else {
200
+ // Removed saved columns no longer found
201
+ const columnKey = ++columnsKeyCount;
202
+ columnsData[columnKey] = {
203
+ id: tableSettingColumn.id(),
204
+ _destroy: true
205
+ };
206
+ changed = true;
207
+ logger.debug(() => `Column got removed: ${tableSettingColumn.identifier()}`);
208
+ }
209
+ }
210
+ if (changed) {
211
+ const tableSettingFormData = objectToFormData({
212
+ table_setting: tableSettingData
213
+ });
214
+ await tableSetting.saveRaw(tableSettingFormData);
215
+ }
216
+ return tableSetting;
217
+ };
218
+ }
219
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb2x1bW5JZGVudGlmaWVyIiwiY29sdW1uVmlzaWJsZSIsImRpZ2ciLCJpbmZsZWN0aW9uIiwiTG9nZ2VyIiwiUmVhZGVyc1dyaXRlckxvY2siLCJzZXJpYWxpemUiLCJvYmplY3RUb0Zvcm1EYXRhIiwibW9kZWxzIiwidjQiLCJ1dWlkdjQiLCJsb2dnZXIiLCJuYW1lIiwiVGFibGVTZXR0aW5nIiwidGFibGVTZXR0aW5nc0xvY2tzIiwiQXBpTWFrZXJUYWJsZVNldHRpbmdzIiwiY29uc3RydWN0b3IiLCJ0YWJsZSIsInNldFRhYmxlU2V0dGluZ3NMb2NrIiwiaWRlbnRpZmllciIsInRhYmxlU2V0dGluZ3NMb2NrIiwiY29sdW1ucyIsImN1cnJlbnRVc2VyIiwicHJlcGFyZWRDb2x1bW5zIiwidGFibGVTZXR0aW5nIiwiY29sdW1uc0FzQXJyYXkiLCJvcmRlcmVkIiwib3JkZXJlZFRhYmxlU2V0dGluZ0NvbHVtbnMiLCJyZXN1bHQiLCJwcmVsb2FkIiwidGFibGVTZXR0aW5nQ29sdW1uIiwiY29sdW1uIiwiZmluZCIsInB1c2giLCJwYXRoIiwibWFwIiwicGF0aFBhcnQiLCJ1bmRlcnNjb3JlIiwiam9pbiIsImluY2x1ZGVzIiwibG9hZGVkIiwic29ydCIsInRhYmxlU2V0dGluZ0NvbHVtbjEiLCJ0YWJsZVNldHRpbmdDb2x1bW4yIiwicG9zaXRpb24iLCJsb2FkRXhpc3RpbmdPckNyZWF0ZVRhYmxlU2V0dGluZ3MiLCJ3cml0ZSIsImxvYWRUYWJsZVNldHRpbmciLCJ1cGRhdGVUYWJsZVNldHRpbmciLCJjcmVhdGVJbml0aWFsVGFibGVTZXR0aW5nIiwiRXJyb3IiLCJyYW5zYWNrIiwiaWRlbnRpZmllcl9lcSIsInVzZXJfaWRfZXEiLCJjdXJyZW50VXNlcklkT3JGYWxsYmFjayIsInVzZXJfdHlwZV9lcSIsImN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2siLCJmaXJzdCIsImlkIiwiYW5vbnltb3VzZVVzZXJJZCIsIm1vZGVsQ2xhc3NEYXRhIiwidmFyaWFibGVOYW1lIiwibG9jYWxTdG9yYWdlIiwiZ2VuZXJhdGVkSWQiLCJ0YWJsZVNldHRpbmdEYXRhIiwidXNlcl9pZCIsInVzZXJfdHlwZSIsImNvbHVtbnNfYXR0cmlidXRlcyIsImNvbHVtbktleSIsImNvbHVtbkRhdGEiLCJjb2x1bW5TYXZlRGF0YSIsInRhYmxlU2V0dGluZ0Zvcm1EYXRhIiwidGFibGVfc2V0dGluZyIsInNhdmVSYXciLCJyZWxvYWRlZFRhYmxlU2V0dGluZyIsImF0dHJpYnV0ZV9uYW1lIiwiYXR0cmlidXRlIiwic29ydF9rZXkiLCJzb3J0S2V5IiwidmlzaWJsZSIsImNoYW5nZWRBdHRyaWJ1dGVzTGlzdCIsImNvbHVtbnNEYXRhIiwiY29sdW1uc0tleUNvdW50IiwiY2hhbmdlZCIsImxlbmd0aCIsImRlYnVnIiwibGFiZWwiLCJjb2x1bW5DaGFuZ2VkIiwiY2hhbmdlZEF0dHJpYnV0ZSIsImNvbHVtbkF0dHJpYnV0ZU5hbWUiLCJvbGRBdHRyaWJ1dGVWYWx1ZSIsIm5ld0F0dHJpYnV0ZVZhbHVlIiwiY29sdW1uUGF0aEFzU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInRhYmxlU2V0dGluZ0NvbHVtblBhdGhBc1N0cmluZyIsImF0dHJpYnV0ZU5hbWUiLCJfZGVzdHJveSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS90YWJsZS1zZXR0aW5ncy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29sdW1uSWRlbnRpZmllciBmcm9tIFwiLi9jb2x1bW4taWRlbnRpZmllclwiXG5pbXBvcnQgY29sdW1uVmlzaWJsZSBmcm9tIFwiLi9jb2x1bW4tdmlzaWJsZVwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXJcIlxuaW1wb3J0IHtSZWFkZXJzV3JpdGVyTG9ja30gZnJvbSBcImVwaWMtbG9ja3NcIlxuaW1wb3J0IHtzZXJpYWxpemUgYXMgb2JqZWN0VG9Gb3JtRGF0YX0gZnJvbSBcIm9iamVjdC10by1mb3JtZGF0YVwiXG5pbXBvcnQgbW9kZWxzIGZyb20gXCIuLi9tb2RlbHNcIlxuaW1wb3J0IHt2NCBhcyB1dWlkdjR9IGZyb20gXCJ1dWlkXCJcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7bmFtZTogXCJBcGlNYWtlciAvIFRhYmxlU2V0dGluZ3NcIn0pXG5jb25zdCB7VGFibGVTZXR0aW5nfSA9IG1vZGVsc1xuXG4vLyBIYXZlIGEgbG9jayBmb3IgZWFjaCB1bmlxdWUgdGFibGUgaWRlbnRpZmllclxuY29uc3QgdGFibGVTZXR0aW5nc0xvY2tzID0ge31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJUYWJsZVNldHRpbmdzIHtcbiAgY29uc3RydWN0b3Ioe3RhYmxlfSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZVxuICAgIHRoaXMuc2V0VGFibGVTZXR0aW5nc0xvY2soKVxuICB9XG5cbiAgc2V0VGFibGVTZXR0aW5nc0xvY2soKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuaWRlbnRpZmllcigpXG5cbiAgICBpZiAoIShpZGVudGlmaWVyIGluIHRhYmxlU2V0dGluZ3NMb2NrcykpIHtcbiAgICAgIHRhYmxlU2V0dGluZ3NMb2Nrc1tpZGVudGlmaWVyXSA9IG5ldyBSZWFkZXJzV3JpdGVyTG9jaygpXG4gICAgfVxuXG4gICAgdGhpcy50YWJsZVNldHRpbmdzTG9jayA9IGRpZ2codGFibGVTZXR0aW5nc0xvY2tzLCBpZGVudGlmaWVyKVxuICB9XG5cbiAgY29sdW1ucyA9ICgpID0+IGRpZ2codGhpcywgXCJ0YWJsZVwiLCBcImNvbHVtbnNBc0FycmF5XCIpKClcbiAgY3VycmVudFVzZXIgPSAoKSA9PiBkaWdnKHRoaXMsIFwidGFibGVcIiwgXCJwcm9wc1wiLCBcImN1cnJlbnRVc2VyXCIpXG4gIGlkZW50aWZpZXIgPSAoKSA9PiBkaWdnKHRoaXMsIFwidGFibGVcIiwgXCJzdGF0ZVwiLCBcImlkZW50aWZpZXJcIilcblxuICBwcmVwYXJlZENvbHVtbnMgPSAodGFibGVTZXR0aW5nKSA9PiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMudGFibGUuY29sdW1uc0FzQXJyYXkoKVxuICAgIGNvbnN0IG9yZGVyZWQgPSB0aGlzLm9yZGVyZWRUYWJsZVNldHRpbmdDb2x1bW5zKHRhYmxlU2V0dGluZylcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICAgIHByZWxvYWQ6IFtdXG4gICAgfVxuXG4gICAgaWYgKCFvcmRlcmVkKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgdGFibGVTZXR0aW5nQ29sdW1uIG9mIG9yZGVyZWQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW5JZGVudGlmaWVyKGNvbHVtbikgPT0gdGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKSlcblxuICAgICAgcmVzdWx0LmNvbHVtbnMucHVzaCh7Y29sdW1uLCB0YWJsZVNldHRpbmdDb2x1bW59KVxuXG4gICAgICAvLyBBZGQgbmVlZGVkIHByZWxvYWRzIGlmIGNvbHVtbiBpcyB2aXNpYmxlXG4gICAgICBpZiAoY29sdW1uVmlzaWJsZShjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbikpIHtcbiAgICAgICAgaWYgKGNvbHVtbi5wYXRoKSB7XG4gICAgICAgICAgY29uc3QgcHJlbG9hZCA9IGNvbHVtbi5wYXRoLm1hcCgocGF0aFBhcnQpID0+IGluZmxlY3Rpb24udW5kZXJzY29yZShwYXRoUGFydCkpLmpvaW4oXCIuXCIpXG5cbiAgICAgICAgICBpZiAoIXJlc3VsdC5wcmVsb2FkLmluY2x1ZGVzKHByZWxvYWQpKSByZXN1bHQucHJlbG9hZC5wdXNoKHByZWxvYWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBvcmRlcmVkVGFibGVTZXR0aW5nQ29sdW1ucyA9ICh0YWJsZVNldHRpbmcpID0+IHtcbiAgICByZXR1cm4gdGFibGVTZXR0aW5nXG4gICAgICAuY29sdW1ucygpXG4gICAgICAubG9hZGVkKClcbiAgICAgIC5zb3J0KCh0YWJsZVNldHRpbmdDb2x1bW4xLCB0YWJsZVNldHRpbmdDb2x1bW4yKSA9PiB0YWJsZVNldHRpbmdDb2x1bW4xLnBvc2l0aW9uKCkgLSB0YWJsZVNldHRpbmdDb2x1bW4yLnBvc2l0aW9uKCkpXG4gIH1cblxuICBsb2FkRXhpc3RpbmdPckNyZWF0ZVRhYmxlU2V0dGluZ3MgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudGFibGVTZXR0aW5nc0xvY2sud3JpdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHRhYmxlU2V0dGluZyA9IGF3YWl0IHRoaXMubG9hZFRhYmxlU2V0dGluZygpXG5cbiAgICAgIGlmICh0YWJsZVNldHRpbmcpIHtcbiAgICAgICAgdGFibGVTZXR0aW5nID0gYXdhaXQgdGhpcy51cGRhdGVUYWJsZVNldHRpbmcodGFibGVTZXR0aW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVTZXR0aW5nID0gYXdhaXQgdGhpcy5jcmVhdGVJbml0aWFsVGFibGVTZXR0aW5nKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlU2V0dGluZ1xuICAgIH0pXG4gIH1cblxuICBsb2FkVGFibGVTZXR0aW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghVGFibGVTZXR0aW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZVNldHRpbmcgbW9kZWwgaXNuJ3QgZ2xvYmFsbHkgYXZhaWxhYmxlXCIpXG5cbiAgICBjb25zdCB0YWJsZVNldHRpbmcgPSBhd2FpdCBUYWJsZVNldHRpbmdcbiAgICAgIC5yYW5zYWNrKHtcbiAgICAgICAgaWRlbnRpZmllcl9lcTogdGhpcy5pZGVudGlmaWVyKCksXG4gICAgICAgIHVzZXJfaWRfZXE6IHRoaXMuY3VycmVudFVzZXJJZE9yRmFsbGJhY2soKSxcbiAgICAgICAgdXNlcl90eXBlX2VxOiB0aGlzLmN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2soKVxuICAgICAgfSlcbiAgICAgIC5wcmVsb2FkKFwiY29sdW1uc1wiKVxuICAgICAgLmZpcnN0KClcblxuICAgIHJldHVybiB0YWJsZVNldHRpbmdcbiAgfVxuXG4gIGN1cnJlbnRVc2VySWRPckZhbGxiYWNrKCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlcigpXG5cbiAgICBpZiAoY3VycmVudFVzZXIpIHJldHVybiBjdXJyZW50VXNlci5pZCgpXG5cbiAgICByZXR1cm4gdGhpcy5hbm9ueW1vdXNlVXNlcklkKClcbiAgfVxuXG4gIGN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2soKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyKClcblxuICAgIGlmIChjdXJyZW50VXNlcikgcmV0dXJuIGRpZ2coY3VycmVudFVzZXIubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgYW5vbnltb3VzZVVzZXJJZCgpIHtcbiAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBgQXBpTWFrZXJUYWJsZUFub255bW91c1VzZXJJZC0ke3RoaXMuaWRlbnRpZmllcigpfWBcblxuICAgIGlmICghKHZhcmlhYmxlTmFtZSBpbiBsb2NhbFN0b3JhZ2UpKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRJZCA9IHV1aWR2NCgpXG5cbiAgICAgIGxvY2FsU3RvcmFnZVt2YXJpYWJsZU5hbWVdID0gZ2VuZXJhdGVkSWRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlnZyhsb2NhbFN0b3JhZ2UsIHZhcmlhYmxlTmFtZSlcbiAgfVxuXG4gIGNyZWF0ZUluaXRpYWxUYWJsZVNldHRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVTZXR0aW5nRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcigpLFxuICAgICAgdXNlcl9pZDogdGhpcy5jdXJyZW50VXNlcklkT3JGYWxsYmFjaygpLFxuICAgICAgdXNlcl90eXBlOiB0aGlzLmN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2soKSxcbiAgICAgIGNvbHVtbnNfYXR0cmlidXRlczoge31cbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zKClcblxuICAgIGZvciAoY29uc3QgY29sdW1uS2V5IGluIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGRpZ2coY29sdW1ucywgY29sdW1uS2V5KVxuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGNvbHVtbklkZW50aWZpZXIoY29sdW1uKVxuICAgICAgY29uc3QgY29sdW1uRGF0YSA9IHRoaXMuY29sdW1uU2F2ZURhdGEoY29sdW1uLCB7aWRlbnRpZmllciwgcG9zaXRpb246IGNvbHVtbktleX0pXG5cbiAgICAgIHRhYmxlU2V0dGluZ0RhdGEuY29sdW1uc19hdHRyaWJ1dGVzW2NvbHVtbktleV0gPSBjb2x1bW5EYXRhXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVTZXR0aW5nID0gbmV3IFRhYmxlU2V0dGluZygpXG4gICAgY29uc3QgdGFibGVTZXR0aW5nRm9ybURhdGEgPSBvYmplY3RUb0Zvcm1EYXRhKHt0YWJsZV9zZXR0aW5nOiB0YWJsZVNldHRpbmdEYXRhfSlcblxuICAgIGF3YWl0IHRhYmxlU2V0dGluZy5zYXZlUmF3KHRhYmxlU2V0dGluZ0Zvcm1EYXRhKVxuXG4gICAgY29uc3QgcmVsb2FkZWRUYWJsZVNldHRpbmcgPSBhd2FpdCB0aGlzLmxvYWRUYWJsZVNldHRpbmcoKVxuXG4gICAgcmV0dXJuIHJlbG9hZGVkVGFibGVTZXR0aW5nXG4gIH1cblxuICBjb2x1bW5TYXZlRGF0YShjb2x1bW4sIHtpZGVudGlmaWVyLCBwb3NpdGlvbn0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlX25hbWU6IGNvbHVtbi5hdHRyaWJ1dGUsXG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgcGF0aDogY29sdW1uLnBhdGgsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIHNvcnRfa2V5OiBjb2x1bW4uc29ydEtleSxcbiAgICAgIHZpc2libGU6IG51bGxcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWJsZVNldHRpbmcgPSBhc3luYyAodGFibGVTZXR0aW5nKSA9PiB7XG4gICAgY29uc3QgY2hhbmdlZEF0dHJpYnV0ZXNMaXN0ID0gW1wiYXR0cmlidXRlTmFtZVwiLCBcInNvcnRLZXlcIl1cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zKClcbiAgICBjb25zdCBjb2x1bW5zRGF0YSA9IHt9XG4gICAgY29uc3QgdGFibGVTZXR0aW5nRGF0YSA9IHtjb2x1bW5zX2F0dHJpYnV0ZXM6IGNvbHVtbnNEYXRhfVxuICAgIGxldCBjb2x1bW5zS2V5Q291bnQgPSAwXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgLy8gQWRkIG1pc3NpbmcgY29sdW1uc1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjb2x1bW5JZGVudGlmaWVyKGNvbHVtbilcbiAgICAgIGNvbnN0IHRhYmxlU2V0dGluZ0NvbHVtbiA9IHRhYmxlU2V0dGluZy5jb2x1bW5zKCkubG9hZGVkKCkuZmluZCgodGFibGVTZXR0aW5nQ29sdW1uKSA9PiB0YWJsZVNldHRpbmdDb2x1bW4uaWRlbnRpZmllcigpID09IGlkZW50aWZpZXIpXG5cbiAgICAgIGlmICghdGFibGVTZXR0aW5nQ29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbktleSA9ICsrY29sdW1uc0tleUNvdW50XG5cbiAgICAgICAgY29sdW1uc0RhdGFbY29sdW1uS2V5XSA9IHRoaXMuY29sdW1uU2F2ZURhdGEoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgICAgICBwb3NpdGlvbjogdGFibGVTZXR0aW5nLmNvbHVtbnMoKS5sb2FkZWQoKS5sZW5ndGggKyBjb2x1bW5LZXlcbiAgICAgICAgICB9XG4gICAgICAgIClcblxuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYENoYW5nZWQgYmVjYXVzZSBvZiBuZXcgY29sdW1uOiAke2NvbHVtbi5sYWJlbH1gKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFibGVTZXR0aW5nQ29sdW1uIG9mIHRhYmxlU2V0dGluZy5jb2x1bW5zKCkubG9hZGVkKCkpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW5JZGVudGlmaWVyKGNvbHVtbikgPT0gdGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKSlcblxuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAvLyBUT0RPOiBVcGRhdGUgY29sdW1uIGlmIGNoYW5nZWRcbiAgICAgICAgbGV0IGNvbHVtbkNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlZEF0dHJpYnV0ZSBvZiBjaGFuZ2VkQXR0cmlidXRlc0xpc3QpIHtcbiAgICAgICAgICBsZXQgY29sdW1uQXR0cmlidXRlTmFtZVxuXG4gICAgICAgICAgaWYgKGNoYW5nZWRBdHRyaWJ1dGUgPT0gXCJhdHRyaWJ1dGVOYW1lXCIpIHtcbiAgICAgICAgICAgIGNvbHVtbkF0dHJpYnV0ZU5hbWUgPSBcImF0dHJpYnV0ZVwiXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbkF0dHJpYnV0ZU5hbWUgPSBjaGFuZ2VkQXR0cmlidXRlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb2xkQXR0cmlidXRlVmFsdWUgPSB0YWJsZVNldHRpbmdDb2x1bW5bY2hhbmdlZEF0dHJpYnV0ZV0oKVxuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZVZhbHVlID0gY29sdW1uW2NvbHVtbkF0dHJpYnV0ZU5hbWVdXG5cbiAgICAgICAgICBpZiAob2xkQXR0cmlidXRlVmFsdWUgIT0gbmV3QXR0cmlidXRlVmFsdWUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgJHtjaGFuZ2VkQXR0cmlidXRlfSBjaGFuZ2VkIGZyb20gJHtvbGRBdHRyaWJ1dGVWYWx1ZX0gdG8gJHtuZXdBdHRyaWJ1dGVWYWx1ZX0gb24gY29sdW1uOiAke2NvbHVtbi5sYWJlbH1gKVxuICAgICAgICAgICAgY29sdW1uQ2hhbmdlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5QYXRoQXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjb2x1bW4ucGF0aClcbiAgICAgICAgY29uc3QgdGFibGVTZXR0aW5nQ29sdW1uUGF0aEFzU3RyaW5nID0gdGFibGVTZXR0aW5nQ29sdW1uLnBhdGgoKVxuXG4gICAgICAgIGlmIChjb2x1bW5QYXRoQXNTdHJpbmcgIT0gdGFibGVTZXR0aW5nQ29sdW1uUGF0aEFzU3RyaW5nKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCgpID0+IGBQYXRoIGNoYW5nZWQgb24gJHtjb2x1bW4ubGFiZWx9IGZyb20gJHtjb2x1bW5QYXRoQXNTdHJpbmd9IHRvICR7dGFibGVTZXR0aW5nQ29sdW1uUGF0aEFzU3RyaW5nfWApXG4gICAgICAgICAgY29sdW1uQ2hhbmdlZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5DaGFuZ2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gKytjb2x1bW5zS2V5Q291bnRcblxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgY29sdW1uc0RhdGFbY29sdW1uS2V5XSA9IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lOiBjb2x1bW4uYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgIGlkOiB0YWJsZVNldHRpbmdDb2x1bW4uaWQoKSxcbiAgICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgICAgc29ydF9rZXk6IGNvbHVtbi5zb3J0S2V5XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmVkIHNhdmVkIGNvbHVtbnMgbm8gbG9uZ2VyIGZvdW5kXG4gICAgICAgIGNvbnN0IGNvbHVtbktleSA9ICsrY29sdW1uc0tleUNvdW50XG5cbiAgICAgICAgY29sdW1uc0RhdGFbY29sdW1uS2V5XSA9IHtcbiAgICAgICAgICBpZDogdGFibGVTZXR0aW5nQ29sdW1uLmlkKCksXG4gICAgICAgICAgX2Rlc3Ryb3k6IHRydWVcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgQ29sdW1uIGdvdCByZW1vdmVkOiAke3RhYmxlU2V0dGluZ0NvbHVtbi5pZGVudGlmaWVyKCl9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgY29uc3QgdGFibGVTZXR0aW5nRm9ybURhdGEgPSBvYmplY3RUb0Zvcm1EYXRhKHt0YWJsZV9zZXR0aW5nOiB0YWJsZVNldHRpbmdEYXRhfSlcblxuICAgICAgYXdhaXQgdGFibGVTZXR0aW5nLnNhdmVSYXcodGFibGVTZXR0aW5nRm9ybURhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlU2V0dGluZ1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixNQUFNLHFCQUFxQjtBQUNsRCxPQUFPQyxhQUFhLE1BQU0sa0JBQWtCO0FBQzVDLFNBQVFDLElBQUksUUFBTyxXQUFXO0FBQzlCLE9BQU8sS0FBS0MsVUFBVSxNQUFNLFlBQVk7QUFDeEMsT0FBT0MsTUFBTSxNQUFNLFdBQVc7QUFDOUIsU0FBUUMsaUJBQWlCLFFBQU8sWUFBWTtBQUM1QyxTQUFRQyxTQUFTLElBQUlDLGdCQUFnQixRQUFPLG9CQUFvQjtBQUNoRSxPQUFPQyxNQUFNLE1BQU0sV0FB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