@kaspernj/api-maker 1.0.2011 → 1.0.2013

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 (413) hide show
  1. package/{.eslintrc.cjs → .eslintrc.js} +10 -1
  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.js +135 -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 +129 -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 +131 -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 +9 -0
  34. package/build/collection-loader.js +48 -0
  35. package/build/collection.js +280 -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 +62 -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 +112 -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-emitter-listener.js +15 -0
  52. package/build/event-model-class.js +24 -0
  53. package/build/events.js +5 -0
  54. package/build/flash-message.js +79 -0
  55. package/build/form.js +83 -0
  56. package/build/history-expo.js +20 -0
  57. package/build/history-react-native.js +20 -0
  58. package/build/history.js +3 -0
  59. package/build/index.js +3 -0
  60. package/build/inputs/attachment.js +133 -0
  61. package/build/inputs/auto-submit.js +36 -0
  62. package/build/inputs/checkbox.js +138 -0
  63. package/build/inputs/checkboxes.js +112 -0
  64. package/build/inputs/id-for-component.js +15 -0
  65. package/build/inputs/input-wrapper.js +19 -0
  66. package/build/inputs/input.js +243 -0
  67. package/build/inputs/money.js +179 -0
  68. package/build/inputs/name-for-component.js +13 -0
  69. package/build/inputs/select.js +93 -0
  70. package/build/instance-of-class-name.js +23 -0
  71. package/build/is-expo.js +22 -0
  72. package/build/key-value-store.js +53 -0
  73. package/build/link.js +73 -0
  74. package/build/logger.js +30 -0
  75. package/build/modal.js +38 -0
  76. package/build/model-class-require.js +13 -0
  77. package/build/model-events.js +30 -0
  78. package/build/model-name.js +28 -0
  79. package/build/model-prop-type.js +101 -0
  80. package/build/model-recipes-loader.js +32 -0
  81. package/build/model-recipes-model-loader.js +357 -0
  82. package/build/models-response-reader.js +40 -0
  83. package/build/models.js +8 -0
  84. package/build/money-formatter.js +78 -0
  85. package/build/not-loaded-error.js +2 -0
  86. package/build/params.js +61 -0
  87. package/build/preloaded.js +38 -0
  88. package/build/resize-observer.js +11 -0
  89. package/build/result.js +13 -0
  90. package/build/router/route.js +270 -0
  91. package/build/router/switch.js +72 -0
  92. package/build/router.js +59 -0
  93. package/build/routes-native.js +202 -0
  94. package/build/routes.js +50 -0
  95. package/build/run-last.js +35 -0
  96. package/build/serializer.js +63 -0
  97. package/build/services.js +20 -0
  98. package/build/session-status-updater.js +134 -0
  99. package/build/source-maps-loader.js +184 -0
  100. package/build/super-admin/config-reader.js +85 -0
  101. package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
  102. package/build/super-admin/edit-page/edit-attribute-content.js +55 -0
  103. package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
  104. package/build/super-admin/edit-page/edit-attribute.js +77 -0
  105. package/build/super-admin/edit-page.js +123 -0
  106. package/build/super-admin/has-edit-config.js +12 -0
  107. package/build/super-admin/index-page.js +25 -0
  108. package/build/super-admin/index.js +181 -0
  109. package/build/super-admin/layout/header/index.js +161 -0
  110. package/build/super-admin/layout/index.js +164 -0
  111. package/build/super-admin/layout/menu/index.js +206 -0
  112. package/build/super-admin/layout/menu/menu-content.js +46 -0
  113. package/build/super-admin/layout/menu/menu-item.js +84 -0
  114. package/build/super-admin/layout/no-access.js +27 -0
  115. package/build/super-admin/model-class-table.js +61 -0
  116. package/build/super-admin/models.js +8 -0
  117. package/build/super-admin/show-nav.js +51 -0
  118. package/build/super-admin/show-page/belongs-to-attribute-row.js +29 -0
  119. package/build/super-admin/show-page/index.js +141 -0
  120. package/build/super-admin/show-reflection-actions.js +47 -0
  121. package/build/super-admin/show-reflection-link.js +48 -0
  122. package/build/super-admin/show-reflection-page.js +48 -0
  123. package/build/table/column-content.js +117 -0
  124. package/build/table/column-identifier.js +18 -0
  125. package/build/table/column-visible.js +7 -0
  126. package/build/table/components/column.js +21 -0
  127. package/build/table/components/flat-list.js +21 -0
  128. package/build/table/components/header.js +26 -0
  129. package/build/table/components/row.js +26 -0
  130. package/build/table/filters/attribute-element.js +44 -0
  131. package/build/table/filters/filter-form.js +402 -0
  132. package/build/table/filters/filter.js +90 -0
  133. package/build/table/filters/index.js +184 -0
  134. package/build/table/filters/load-search-modal.js +175 -0
  135. package/build/table/filters/reflection-element.js +37 -0
  136. package/build/table/filters/save-search-modal.js +88 -0
  137. package/build/table/filters/scope-element.js +42 -0
  138. package/build/table/header-column-content.js +68 -0
  139. package/build/table/header-column.js +144 -0
  140. package/build/table/header-select.js +105 -0
  141. package/build/table/model-callback-args.js +10 -0
  142. package/build/table/model-column.js +97 -0
  143. package/build/table/model-row.js +193 -0
  144. package/build/table/select-calculator.js +63 -0
  145. package/build/table/settings/column-row.js +97 -0
  146. package/build/table/settings/download-action.js +79 -0
  147. package/build/table/settings/index.js +92 -0
  148. package/build/table/table-settings.js +219 -0
  149. package/build/table/table.js +972 -0
  150. package/build/table/use-sorting.js +34 -0
  151. package/build/table/widths.js +75 -0
  152. package/build/table/worker-plugins-check-all-checkbox.js +125 -0
  153. package/build/table/worker-plugins-checkbox.js +115 -0
  154. package/build/translated-attributes.js +10 -0
  155. package/build/translated-collections.js +12 -0
  156. package/build/updated-attribute.js +76 -0
  157. package/build/url-encode.js +15 -0
  158. package/build/use-breakpoint.js +71 -0
  159. package/build/use-can-can.js +55 -0
  160. package/build/use-collection.js +225 -0
  161. package/build/use-created-event.js +52 -0
  162. package/build/use-current-user.js +76 -0
  163. package/build/use-destroyed-event.js +60 -0
  164. package/build/use-event-emitter.js +13 -0
  165. package/build/use-event-listener.js +16 -0
  166. package/build/use-input.js +137 -0
  167. package/build/use-model-event.js +60 -0
  168. package/build/use-model.js +169 -0
  169. package/build/use-resize-observer.js +23 -0
  170. package/build/use-router.js +104 -0
  171. package/build/use-screen-layout.js +39 -0
  172. package/build/use-styles.js +41 -0
  173. package/build/use-updated-event.js +60 -0
  174. package/build/use-validation-errors.js +30 -0
  175. package/build/utils/card.js +51 -0
  176. package/build/utils/checkbox.js +78 -0
  177. package/build/utils/checkboxes.js +163 -0
  178. package/build/utils/default-style.js +18 -0
  179. package/build/utils/icon.js +23 -0
  180. package/build/utils/invalid-feedback.js +19 -0
  181. package/build/utils/modal.js +62 -0
  182. package/build/utils/text.js +44 -0
  183. package/build/validation-error.js +28 -0
  184. package/build/validation-errors.js +98 -0
  185. package/build/with-api-maker.js +29 -0
  186. package/build/with-collection.js +14 -0
  187. package/build/with-current-user.js +10 -0
  188. package/build/with-model.js +15 -0
  189. package/build/with-router.js +22 -0
  190. package/expo-module.config.json +17 -0
  191. package/ios/ApiMaker.podspec +29 -0
  192. package/ios/ApiMakerModule.swift +48 -0
  193. package/ios/ApiMakerView.swift +38 -0
  194. package/package.json +49 -46
  195. package/src/{api.mjs → api.js} +38 -37
  196. package/src/base-component.jsx +5 -0
  197. package/src/{base-error.mjs → base-error.js} +4 -6
  198. package/src/base-model/attribute.js +33 -0
  199. package/src/base-model/column.js +13 -0
  200. package/src/base-model/reflection.js +15 -0
  201. package/src/base-model/scope.js +12 -0
  202. package/src/{base-model.mjs → base-model.js} +302 -144
  203. package/src/bootstrap/attribute-row.jsx +135 -0
  204. package/src/bootstrap/attribute-rows.jsx +27 -0
  205. package/src/bootstrap/card.jsx +149 -0
  206. package/src/bootstrap/checkbox.jsx +86 -0
  207. package/src/bootstrap/checkboxes.jsx +185 -0
  208. package/src/bootstrap/index.js +0 -0
  209. package/src/bootstrap/input.jsx +173 -0
  210. package/src/bootstrap/invalid-feedback.jsx +31 -0
  211. package/src/bootstrap/paginate.jsx +187 -0
  212. package/src/bootstrap/radio-buttons.jsx +87 -0
  213. package/src/bootstrap/select.jsx +110 -0
  214. package/src/bootstrap/sort-link.jsx +106 -0
  215. package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +16 -36
  216. package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +26 -21
  217. package/src/{cable-subscription.mjs → cable-subscription.js} +6 -4
  218. package/src/cache-key-generator.js +100 -0
  219. package/src/{can-can.mjs → can-can.js} +13 -12
  220. package/src/channels-consumer.js +10 -0
  221. package/src/collection-loader.jsx +58 -224
  222. package/src/{collection.mjs → collection.js} +98 -44
  223. package/src/{command-submit-data.mjs → command-submit-data.js} +2 -7
  224. package/src/{commands-pool.mjs → commands-pool.js} +57 -41
  225. package/src/compose.js +11 -0
  226. package/src/{config.mjs → config.js} +6 -2
  227. package/src/{custom-error.mjs → custom-error.js} +1 -1
  228. package/src/data-set-to-attributes.js +13 -0
  229. package/src/{deserializer.mjs → deserializer.js} +3 -3
  230. package/src/destroy-error.js +7 -0
  231. package/src/devise.js +129 -0
  232. package/src/draggable-sort/controller.js +137 -0
  233. package/src/draggable-sort/index.jsx +108 -0
  234. package/src/draggable-sort/item.jsx +174 -0
  235. package/src/{error-logger.mjs → error-logger.js} +12 -7
  236. package/src/{error-messages.mjs → error-messages.js} +1 -0
  237. package/src/event-connection.jsx +1 -1
  238. package/src/event-emitter-listener.jsx +8 -27
  239. package/src/event-model-class.jsx +2 -4
  240. package/src/events.js +7 -0
  241. package/src/flash-message.js +70 -0
  242. package/src/form.jsx +91 -0
  243. package/src/history-expo.js +23 -0
  244. package/src/history-react-native.js +25 -0
  245. package/src/history.js +3 -0
  246. package/src/index.js +3 -0
  247. package/src/inputs/attachment.jsx +108 -0
  248. package/src/inputs/auto-submit.js +37 -0
  249. package/src/inputs/checkbox.jsx +125 -0
  250. package/src/inputs/checkboxes.jsx +116 -0
  251. package/src/inputs/id-for-component.js +15 -0
  252. package/src/inputs/input-wrapper.jsx +16 -0
  253. package/src/inputs/input.jsx +260 -0
  254. package/src/inputs/money.jsx +187 -0
  255. package/src/inputs/name-for-component.js +15 -0
  256. package/src/inputs/select.jsx +104 -0
  257. package/src/is-expo.js +18 -0
  258. package/src/{key-value-store.mjs → key-value-store.js} +1 -1
  259. package/src/link.jsx +54 -9
  260. package/src/logger.js +38 -0
  261. package/src/modal.jsx +37 -0
  262. package/src/model-class-require.js +17 -0
  263. package/src/{model-events.mjs → model-events.js} +1 -1
  264. package/src/{model-name.mjs → model-name.js} +8 -8
  265. package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
  266. package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +5 -5
  267. package/src/{models-response-reader.mjs → models-response-reader.js} +3 -4
  268. package/src/models.js +7 -0
  269. package/src/{models.mjs.erb → models.js.erb} +6 -3
  270. package/src/{money-formatter.mjs → money-formatter.js} +5 -4
  271. package/src/{params.mjs → params.js} +17 -7
  272. package/src/{preloaded.mjs → preloaded.js} +2 -2
  273. package/src/resize-observer.jsx +10 -0
  274. package/src/result.js +13 -0
  275. package/src/router/route.jsx +246 -0
  276. package/src/router/switch.jsx +76 -0
  277. package/src/router.jsx +23 -21
  278. package/src/{routes-native.mjs → routes-native.js} +12 -6
  279. package/src/{routes.mjs → routes.js} +1 -1
  280. package/src/run-last.js +39 -0
  281. package/src/{serializer.mjs → serializer.js} +2 -2
  282. package/src/{services.mjs → services.js} +1 -1
  283. package/src/session-status-updater.js +172 -0
  284. package/src/{source-maps-loader.mjs → source-maps-loader.js} +54 -28
  285. package/src/super-admin/config-reader.jsx +93 -0
  286. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +81 -0
  287. package/src/super-admin/edit-page/edit-attribute-content.jsx +57 -0
  288. package/src/super-admin/edit-page/edit-attribute-input.jsx +71 -0
  289. package/src/super-admin/edit-page/edit-attribute.jsx +81 -0
  290. package/src/super-admin/edit-page.jsx +117 -0
  291. package/src/super-admin/has-edit-config.js +15 -0
  292. package/src/super-admin/index-page.jsx +23 -0
  293. package/src/super-admin/index.jsx +197 -0
  294. package/src/super-admin/layout/header/index.jsx +144 -0
  295. package/src/super-admin/layout/header/style.scss +45 -0
  296. package/src/super-admin/layout/index.jsx +154 -0
  297. package/src/super-admin/layout/menu/index.jsx +171 -0
  298. package/src/super-admin/layout/menu/menu-content.jsx +43 -0
  299. package/src/super-admin/layout/menu/menu-item.jsx +70 -0
  300. package/src/super-admin/layout/menu/style.scss +11 -0
  301. package/src/super-admin/layout/no-access.jsx +26 -0
  302. package/src/super-admin/model-class-table.jsx +66 -0
  303. package/src/super-admin/models.js +11 -0
  304. package/src/super-admin/show-nav.jsx +44 -0
  305. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +30 -0
  306. package/src/super-admin/show-page/index.jsx +141 -0
  307. package/src/super-admin/show-reflection-actions.jsx +49 -0
  308. package/src/super-admin/show-reflection-link.jsx +40 -0
  309. package/src/super-admin/show-reflection-page.jsx +47 -0
  310. package/src/super-admin/stylesheets/variables.scss +11 -0
  311. package/src/table/column-content.jsx +122 -0
  312. package/src/table/column-identifier.js +23 -0
  313. package/src/table/column-visible.js +7 -0
  314. package/src/table/components/column.jsx +19 -0
  315. package/src/table/components/flat-list.jsx +19 -0
  316. package/src/table/components/header.jsx +21 -0
  317. package/src/table/components/row.jsx +23 -0
  318. package/src/table/filters/attribute-element.jsx +47 -0
  319. package/src/table/filters/filter-form.jsx +407 -0
  320. package/src/table/filters/filter.jsx +70 -0
  321. package/src/table/filters/index.jsx +170 -0
  322. package/src/table/filters/load-search-modal.jsx +146 -0
  323. package/src/table/filters/reflection-element.jsx +38 -0
  324. package/src/table/filters/save-search-modal.jsx +74 -0
  325. package/src/table/filters/scope-element.jsx +44 -0
  326. package/src/table/header-column-content.jsx +55 -0
  327. package/src/table/header-column.jsx +129 -0
  328. package/src/table/header-select.jsx +73 -0
  329. package/src/table/model-callback-args.js +10 -0
  330. package/src/table/model-column.jsx +82 -0
  331. package/src/table/model-row.jsx +136 -0
  332. package/src/table/select-calculator.js +65 -0
  333. package/src/table/settings/column-row.jsx +93 -0
  334. package/src/table/settings/download-action.jsx +68 -0
  335. package/src/table/settings/index.jsx +65 -0
  336. package/src/table/table-settings.js +263 -0
  337. package/src/table/table.jsx +950 -0
  338. package/src/table/use-sorting.js +35 -0
  339. package/src/table/variables.scss +11 -0
  340. package/src/table/widths.jsx +87 -0
  341. package/src/table/worker-plugins-check-all-checkbox.jsx +112 -0
  342. package/src/table/worker-plugins-checkbox.jsx +104 -0
  343. package/src/translated-attributes.js +11 -0
  344. package/src/{translated-collections.mjs → translated-collections.js} +3 -2
  345. package/src/updated-attribute.jsx +1 -1
  346. package/src/url-encode.js +18 -0
  347. package/src/use-breakpoint.js +87 -0
  348. package/src/use-can-can.js +55 -0
  349. package/src/use-collection.js +280 -0
  350. package/src/use-created-event.js +55 -0
  351. package/src/use-current-user.js +88 -0
  352. package/src/use-destroyed-event.js +60 -0
  353. package/src/use-event-emitter.js +15 -0
  354. package/src/use-event-listener.js +19 -0
  355. package/src/use-input.js +157 -0
  356. package/src/use-model-event.js +60 -0
  357. package/src/use-model.js +189 -0
  358. package/src/use-resize-observer.js +24 -0
  359. package/src/use-router.jsx +128 -0
  360. package/src/use-screen-layout.js +49 -0
  361. package/src/use-styles.js +50 -0
  362. package/src/use-updated-event.js +60 -0
  363. package/src/use-validation-errors.js +33 -0
  364. package/src/utils/card.jsx +49 -0
  365. package/src/utils/checkbox.jsx +80 -0
  366. package/src/utils/checkboxes.jsx +158 -0
  367. package/src/utils/default-style.jsx +25 -0
  368. package/src/utils/icon.jsx +21 -0
  369. package/src/utils/invalid-feedback.jsx +20 -0
  370. package/src/utils/modal.jsx +60 -0
  371. package/src/utils/text.jsx +38 -0
  372. package/src/{validation-error.mjs → validation-error.js} +9 -5
  373. package/src/{validation-errors.mjs → validation-errors.js} +15 -27
  374. package/src/with-api-maker.jsx +31 -0
  375. package/src/with-collection.jsx +17 -0
  376. package/src/with-current-user.jsx +7 -25
  377. package/src/with-model.jsx +16 -0
  378. package/src/with-router.jsx +7 -129
  379. package/__tests__/base-model.test.js +0 -71
  380. package/__tests__/cable-connection-pool.test.js +0 -227
  381. package/__tests__/cable-subscription-pool.test.js +0 -26
  382. package/__tests__/can-can.test.js +0 -34
  383. package/__tests__/collection.test.js +0 -51
  384. package/__tests__/custom-error.test.js +0 -13
  385. package/__tests__/model-name.test.js +0 -34
  386. package/__tests__/model-prop-type.test.js +0 -113
  387. package/__tests__/params.test.js +0 -40
  388. package/__tests__/routes-native.test.js +0 -103
  389. package/__tests__/routes.test.js +0 -46
  390. package/__tests__/serializer.test.js +0 -30
  391. package/__tests__/support/task.js +0 -27
  392. package/__tests__/support/user.js +0 -32
  393. package/index.js +0 -1
  394. package/jest.config.js +0 -4
  395. package/src/can-can-loader.jsx +0 -54
  396. package/src/channels-consumer.mjs +0 -3
  397. package/src/destroy-error.mjs +0 -7
  398. package/src/devise.mjs +0 -122
  399. package/src/event-created.jsx +0 -65
  400. package/src/event-destroyed.jsx +0 -29
  401. package/src/event-listener.jsx +0 -38
  402. package/src/event-updated.jsx +0 -74
  403. package/src/logger.mjs +0 -25
  404. package/src/model-class-require.mjs +0 -10
  405. package/src/model-load-wrapper.jsx +0 -116
  406. package/src/result.mjs +0 -29
  407. package/src/session-status-updater.mjs +0 -116
  408. package/webpack.config.js +0 -15
  409. /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
  410. /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
  411. /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
  412. /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
  413. /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
@@ -1,133 +1,11 @@
1
- import config from "./config.mjs"
2
- import escapeStringRegexp from "escape-string-regexp"
3
- import inflection from "inflection"
4
- import PropTypes from "prop-types"
5
1
  import React from "react"
6
- import shouldComponentUpdate from "set-state-compare/src/should-component-update"
2
+ import useRouter from "./use-router"
7
3
 
8
- export default (WrapperComponent) => class WithRouter extends React.Component {
9
- static propTypes = {
10
- path: PropTypes.string,
11
- routeDefinitions: PropTypes.object,
12
- routes: PropTypes.object
13
- }
4
+ export default (WrapperComponent) => (props) => {
5
+ const {path, routes, routeDefinitions, ...restProps} = props
6
+ const {match} = useRouter({path, routes, routeDefinitions})
14
7
 
15
- parsedRouteDefinitions = this.parseRouteDefinitions()
16
-
17
- shouldComponentUpdate(nextProps, nextState) {
18
- return shouldComponentUpdate(this, nextProps, nextState)
19
- }
20
-
21
- findRouteParams(routeDefinition) {
22
- const result = []
23
- const parts = routeDefinition.path.split("/")
24
-
25
- for (const part of parts) {
26
- if (part.match(/^:([a-z_]+)$/))
27
- result.push(part)
28
- }
29
-
30
- return result
31
- }
32
-
33
- path() {
34
- let path = this.props.path || window.location.pathname
35
-
36
- path = path.replace(/[/]+$/, "")
37
-
38
- return path
39
- }
40
-
41
- routeDefinitions() {
42
- return this.props.routeDefinitions || config.getRouteDefinitions()
43
- }
44
-
45
- routes() {
46
- return this.props.routes || config.getRoutes()
47
- }
48
-
49
- parseRouteDefinitions() {
50
- const Locales = require("shared/locales").default
51
- const routeDefinitions = this.routeDefinitions()
52
- const routes = this.routes()
53
- const regex = /:([A-z\d_]+)/
54
- const parsedRouteDefinitions = []
55
-
56
- for (const locale of Locales.availableLocales()) {
57
- for (const routeDefinition of routeDefinitions.routes) {
58
- const routePathName = `${inflection.camelize(routeDefinition.name, true)}Path`
59
- const params = this.findRouteParams(routeDefinition)
60
-
61
- params.push({locale})
62
-
63
- if (!(routePathName in routes))
64
- throw new Error(`${routePathName} not found in routes: ${Object.keys(routes, ", ")}`)
65
-
66
- const routePath = routes[routePathName](...params).replace(/[/]+$/, "")
67
- const groups = []
68
- let pathRegexString = "^"
69
-
70
- pathRegexString += escapeStringRegexp(routePath)
71
-
72
- while (true) {
73
- const match = pathRegexString.match(regex)
74
-
75
- if (!match) break
76
-
77
- const variableName = match[1]
78
-
79
- groups.push(variableName)
80
-
81
- pathRegexString = pathRegexString.replace(match[0], "([^/]+)")
82
- }
83
-
84
- pathRegexString += "$"
85
-
86
- const pathRegex = new RegExp(pathRegexString)
87
-
88
- parsedRouteDefinitions.push({groups, pathRegex, routeDefinition})
89
- }
90
- }
91
-
92
- return parsedRouteDefinitions
93
- }
94
-
95
- findMatchingRoute() {
96
- const path = this.path()
97
-
98
- for (const parsedRouteDefinition of this.parsedRouteDefinitions) {
99
- const match = path.match(parsedRouteDefinition.pathRegex)
100
- let matched, params
101
-
102
- if (match) {
103
- matched = true
104
- params = {}
105
-
106
- for (const groupKey in parsedRouteDefinition.groups) {
107
- const groupName = parsedRouteDefinition.groups[groupKey]
108
-
109
- params[groupName] = match[Number(groupKey) + 1]
110
- }
111
- }
112
-
113
- if (path == "" && parsedRouteDefinition.routeDefinition.path == "/") matched = true
114
- if (matched) {
115
- return {params, parsedRouteDefinition}
116
- }
117
- }
118
- }
119
-
120
- render() {
121
- const {path, routes, routeDefinitions, ...restProps} = this.props
122
- const matchingRoute = this.findMatchingRoute()
123
- const params = matchingRoute?.params || {}
124
- const match = {
125
- matchingRoute,
126
- params
127
- }
128
-
129
- return (
130
- <WrapperComponent match={match} {...restProps} />
131
- )
132
- }
8
+ return (
9
+ <WrapperComponent match={match} {...restProps} />
10
+ )
133
11
  }
@@ -1,71 +0,0 @@
1
- import BaseModel from "../src/base-model.mjs"
2
- import CustomError from "../src/custom-error.mjs"
3
- import {jest} from "@jest/globals"
4
- import {JSDOM} from "jsdom"
5
- import ValidationError from "../src/validation-error.mjs"
6
- import User from "./support/user.mjs"
7
-
8
- jest.mock("@rails/actioncable", () => ({
9
- createConsumer: () => ({})
10
- }))
11
-
12
- const {window} = new JSDOM()
13
- const document = window.document
14
-
15
- describe("BaseModel", () => {
16
- describe("identifierKey", () => {
17
- it("returns the id when persisted", () => {
18
- const user = new User({a: {id: 5}})
19
-
20
- expect(user.identifierKey()).toEqual(5)
21
- })
22
-
23
- it("returns the unique key when new record", () => {
24
- const user = new User({isNewRecord: true})
25
-
26
- user.uniqueKey = () => 45
27
-
28
- expect(user.identifierKey()).toEqual(45)
29
- })
30
- })
31
-
32
- describe("update", () => {
33
- it("aborts if no changes", async () => {
34
- const model = new BaseModel()
35
-
36
- // This will fail because of missing setup if it doesn't abort.
37
- const response = await model.update({})
38
-
39
- // There will be extra objects in the hash if it actually calls the backend.
40
- expect(response).toEqual({model})
41
- })
42
- })
43
-
44
- describe("parseValidationErrors", () => {
45
- const error = new CustomError("Some validation error", {
46
- response: {
47
- validation_errors: []
48
- }
49
- })
50
- const form = document.createElement("form")
51
- const model = new BaseModel()
52
- const dispatchEventSpy = jest.spyOn(form, "dispatchEvent").mockImplementation(() => "asd")
53
- const newCustomEventSpy = jest.spyOn(BaseModel, "newCustomEvent").mockImplementation(() => "asd")
54
-
55
- it("throws the validation errors if no options are given", () => {
56
- expect(() => BaseModel.parseValidationErrors({error, model})).toThrow(ValidationError)
57
- })
58
-
59
- it("throws the validation errors and dispatches an event to the form", () => {
60
- expect(() => BaseModel.parseValidationErrors({error, model, options: {form}})).toThrow(ValidationError)
61
- expect(dispatchEventSpy).toHaveBeenCalled()
62
- expect(newCustomEventSpy).toHaveBeenCalled()
63
- })
64
-
65
- it("doesnt throw validation errors if disabled", () => {
66
- BaseModel.parseValidationErrors({error, model, options: {throwValidationError: false}})
67
- expect(dispatchEventSpy).toHaveBeenCalled()
68
- expect(newCustomEventSpy).toHaveBeenCalled()
69
- })
70
- })
71
- })
@@ -1,227 +0,0 @@
1
- import CableConnectionPool from "../src/cable-connection-pool.mjs"
2
- import CableSubscriptionPool from "../src/cable-subscription-pool.mjs"
3
- import {digg} from "diggerize"
4
- import {jest} from "@jest/globals"
5
-
6
- jest.mock("@rails/actioncable", () => ({
7
- createConsumer: () => ({})
8
- }))
9
-
10
- describe("CableConnectionPool", () => {
11
- describe("connectCreated", () => {
12
- it("creates a new create event and connects", () => {
13
- const cableConnectionPool = new CableConnectionPool()
14
-
15
- cableConnectionPool.scheduleConnectUpcoming = function () {
16
- const subscriptionData = this.upcomingSubscriptionData
17
- const subscriptions = this.upcomingSubscriptions
18
-
19
- this.upcomingSubscriptionData = {}
20
- this.upcomingSubscriptions = {}
21
-
22
- const cableSubscriptionPool = {subscriptionData, subscriptions}
23
-
24
- this.cableSubscriptionPools.push(cableSubscriptionPool)
25
- }
26
- cableConnectionPool.cableSubscriptionPools = []
27
- cableConnectionPool.connectCreated("Contact", () => console.log("Callback"))
28
-
29
- expect(cableConnectionPool.cableSubscriptionPools.length).toEqual(1)
30
-
31
- const newCableSubscriptionPool = digg(cableConnectionPool, "cableSubscriptionPools", 0)
32
- const subscriptions = digg(newCableSubscriptionPool, "subscriptions", "Contact", "creates")
33
-
34
- expect(subscriptions.length).toEqual(1)
35
- })
36
- })
37
-
38
- describe("connectDestroyed", () => {
39
- it("creates a new destroy event and connects", () => {
40
- const cableConnectionPool = new CableConnectionPool()
41
- const cableSubscriptionPool = new CableSubscriptionPool()
42
-
43
- cableSubscriptionPool.subscriptions = {
44
- Contact: {
45
- updates: {
46
- modelId: []
47
- }
48
- }
49
- }
50
-
51
- cableConnectionPool.scheduleConnectUpcoming = function () {
52
- const subscriptionData = this.upcomingSubscriptionData
53
- const subscriptions = this.upcomingSubscriptions
54
-
55
- this.upcomingSubscriptionData = {}
56
- this.upcomingSubscriptions = {}
57
-
58
- const cableSubscriptionPool = {subscriptionData, subscriptions}
59
-
60
- this.cableSubscriptionPools.push(cableSubscriptionPool)
61
- }
62
- cableConnectionPool.cableSubscriptionPools = [cableSubscriptionPool]
63
- cableConnectionPool.connectDestroyed("Contact", "modelId", () => { })
64
-
65
- expect(cableConnectionPool.cableSubscriptionPools.length).toEqual(2)
66
-
67
- const newCableSubscriptionPool = cableConnectionPool.cableSubscriptionPools[1]
68
- const subscriptions = digg(newCableSubscriptionPool, "subscriptions", "Contact", "destroys", "modelId")
69
-
70
- expect(subscriptions.length).toEqual(1)
71
- })
72
-
73
- it("connects to an existing destroy event", () => {
74
- let connectedUnsubscribeEvent = false
75
-
76
- const cableConnectionPool = new CableConnectionPool()
77
- const cableSubscriptionPool = new CableSubscriptionPool()
78
-
79
- cableSubscriptionPool.connected = true
80
- cableSubscriptionPool.connectUnsubscriptionForSubscription = function () {
81
- connectedUnsubscribeEvent = true
82
- }
83
- cableSubscriptionPool.subscriptions = {
84
- Contact: {
85
- destroys: {
86
- modelId: []
87
- }
88
- }
89
- }
90
-
91
- cableConnectionPool.connectUpcoming = () => console.log("connectUpcoming")
92
- cableConnectionPool.cableSubscriptionPools = [cableSubscriptionPool]
93
- cableConnectionPool.connectDestroyed("Contact", "modelId", () => { })
94
-
95
- const subscriptions = digg(cableSubscriptionPool, "subscriptions", "Contact", "destroys", "modelId")
96
-
97
- expect(subscriptions.length).toEqual(1)
98
- expect(connectedUnsubscribeEvent).toEqual(true)
99
- })
100
-
101
- it("doesnt connect to an existing destroy event that is disconnected", () => {
102
- const cableConnectionPool = new CableConnectionPool()
103
- const cableSubscriptionPool = new CableSubscriptionPool()
104
-
105
- cableSubscriptionPool.subscriptions = {
106
- Contact: {
107
- destroys: {
108
- modelId: []
109
- }
110
- }
111
- }
112
-
113
- cableConnectionPool.connected = false
114
- cableConnectionPool.connectUpcoming = function () {
115
- const subscriptionData = this.upcomingSubscriptionData
116
- const subscriptions = this.upcomingSubscriptions
117
-
118
- this.upcomingSubscriptionData = {}
119
- this.upcomingSubscriptions = {}
120
-
121
- const cableSubscriptionPool = {subscriptionData, subscriptions}
122
-
123
- this.cableSubscriptionPools.push(cableSubscriptionPool)
124
- }
125
- cableConnectionPool.cableSubscriptionPools = [cableSubscriptionPool]
126
- cableConnectionPool.scheduleConnectUpcoming = () => cableConnectionPool.connectUpcoming()
127
- cableConnectionPool.connectDestroyed("Contact", "modelId", () => { })
128
-
129
- const subscriptions = digg(cableSubscriptionPool, "subscriptions", "Contact", "destroys", "modelId")
130
-
131
- expect(subscriptions.length).toEqual(0)
132
- expect(cableConnectionPool.cableSubscriptionPools.length).toEqual(2)
133
- })
134
- })
135
-
136
- describe("connectUpdate", () => {
137
- it("creates a new update event and connects", () => {
138
- const cableConnectionPool = new CableConnectionPool()
139
- const cableSubscriptionPool = new CableSubscriptionPool()
140
-
141
- cableSubscriptionPool.subscriptions = {
142
- Contact: {
143
- destroys: {
144
- modelId: []
145
- }
146
- }
147
- }
148
-
149
- cableConnectionPool.scheduleConnectUpcoming = function () {
150
- const subscriptionData = this.upcomingSubscriptionData
151
- const subscriptions = this.upcomingSubscriptions
152
-
153
- this.upcomingSubscriptionData = {}
154
- this.upcomingSubscriptions = {}
155
-
156
- const cableSubscriptionPool = {subscriptionData, subscriptions}
157
-
158
- this.cableSubscriptionPools.push(cableSubscriptionPool)
159
- }
160
- cableConnectionPool.cableSubscriptionPools = [cableSubscriptionPool]
161
- cableConnectionPool.connectUpdate("Contact", "modelId", () => console.log("Update callback"))
162
-
163
- expect(cableConnectionPool.cableSubscriptionPools.length).toEqual(2)
164
-
165
- const newCableSubscriptionPool = cableConnectionPool.cableSubscriptionPools[1]
166
- const subscriptions = digg(newCableSubscriptionPool, "subscriptions", "Contact", "updates", "modelId")
167
-
168
- expect(subscriptions.length).toEqual(1)
169
- })
170
-
171
- it("connects to an existing update event", () => {
172
- let connectedUnsubscribeEvent = false
173
-
174
- const cableConnectionPool = new CableConnectionPool()
175
- const cableSubscriptionPool = new CableSubscriptionPool()
176
-
177
- cableSubscriptionPool.connected = true
178
- cableSubscriptionPool.connectUnsubscriptionForSubscription = function () {
179
- connectedUnsubscribeEvent = true
180
- }
181
- cableSubscriptionPool.subscriptions = {
182
- Contact: {
183
- updates: {
184
- modelId: []
185
- }
186
- }
187
- }
188
-
189
- cableConnectionPool.connectUpcoming = () => console.log("connectUpcoming")
190
- cableConnectionPool.cableSubscriptionPools = [cableSubscriptionPool]
191
- cableConnectionPool.connectUpdate("Contact", "modelId", () => { })
192
-
193
- const subscriptions = digg(cableSubscriptionPool, "subscriptions", "Contact", "updates", "modelId")
194
-
195
- expect(subscriptions.length).toEqual(1)
196
- expect(connectedUnsubscribeEvent).toEqual(true)
197
- })
198
-
199
- it("connects to an existing update event if the model ID is truthy like 1 is", () => {
200
- let connectedUnsubscribeEvent = false
201
-
202
- const cableConnectionPool = new CableConnectionPool()
203
- const cableSubscriptionPool = new CableSubscriptionPool()
204
-
205
- cableSubscriptionPool.connected = true
206
- cableSubscriptionPool.connectUnsubscriptionForSubscription = function () {
207
- connectedUnsubscribeEvent = true
208
- }
209
- cableSubscriptionPool.subscriptions = {
210
- Contact: {
211
- updates: {
212
- 1: []
213
- }
214
- }
215
- }
216
-
217
- cableConnectionPool.connectUpcoming = () => console.log("connectUpcoming")
218
- cableConnectionPool.cableSubscriptionPools = [cableSubscriptionPool]
219
- cableConnectionPool.connectUpdate("Contact", 1, () => console.log("Update callback called"))
220
-
221
- const subscriptions = digg(cableSubscriptionPool, "subscriptions", "Contact", "updates", 1)
222
-
223
- expect(subscriptions.length).toEqual(1)
224
- expect(connectedUnsubscribeEvent).toEqual(true)
225
- })
226
- })
227
- })
@@ -1,26 +0,0 @@
1
- jest.mock("@rails/actioncable", () => ({
2
- createConsumer: () => ({})
3
- }))
4
- import CableSubscriptionPool from "../src/cable-subscription-pool.mjs"
5
-
6
- describe("CableSubscriptionPool", () => {
7
- describe("onUnsubscribe", () => {
8
- it("unsubscribes from ActionCable", () => {
9
- const cableSubscriptionPool = new CableSubscriptionPool()
10
-
11
- let unsubscribeCalled = false
12
-
13
- cableSubscriptionPool.activeSubscriptions = 1
14
- cableSubscriptionPool.subscription = {
15
- unsubscribe: () => {
16
- unsubscribeCalled = true
17
- }
18
- }
19
- cableSubscriptionPool.onUnsubscribe()
20
-
21
- expect(unsubscribeCalled).toEqual(true)
22
- expect(cableSubscriptionPool.activeSubscriptions).toEqual(0)
23
- expect(cableSubscriptionPool.isConnected()).toEqual(false)
24
- })
25
- })
26
- })
@@ -1,34 +0,0 @@
1
- import CanCan from "../src/can-can.mjs"
2
- import {jest} from "@jest/globals"
3
-
4
- jest.mock("../src/services.mjs")
5
-
6
- describe("CanCan", () => {
7
- const canCan = CanCan.current()
8
-
9
- describe("resetAbilities", () => {
10
- test("that reset abilities and load abilities not have concurrency issues", async () => {
11
- import Services from "../src/services.mjs"
12
- const mockedCurrent = jest.fn().mockReturnValue({
13
- sendRequest: async () => ({abilities: ["loaded"]})
14
- })
15
- Services.current = mockedCurrent
16
-
17
- const loadAbilitiesPromise = canCan.loadAbilities([["user", ["read"]]])
18
- const resetPromise = canCan.resetAbilities()
19
-
20
- await Promise.all([loadAbilitiesPromise, resetPromise])
21
-
22
- expect(canCan.abilities).toEqual([])
23
- })
24
-
25
- it("dispatches an event", async () => {
26
- const eventListener = jest.fn()
27
- canCan.events.addListener("onResetAbilities", eventListener)
28
-
29
- await canCan.resetAbilities()
30
-
31
- expect(eventListener).toHaveBeenCalled()
32
- })
33
- })
34
- })
@@ -1,51 +0,0 @@
1
- import Collection from "../src/collection.mjs"
2
-
3
- describe("Collection", () => {
4
- describe("count", () => {
5
- it("is able to clone the collection and merge count into it without manipulating the original given query", () => {
6
- let collection = new Collection({}, {})
7
-
8
- collection.ransack({name_cont: "Kasper"})
9
-
10
- let countCollection = collection.clone()._merge({count: true})
11
-
12
- expect(collection.queryArgs).toEqual({ransack: {name_cont: "Kasper"}})
13
- expect(countCollection.queryArgs).toEqual({count: true, ransack: {name_cont: "Kasper"}})
14
- })
15
- })
16
-
17
- describe("ransack", () => {
18
- it("handles undefined arguments", () => {
19
- // This can happen if someone does something like this and users_q isn't set:
20
- // query.ransack(params.users_q)
21
-
22
- let collection = new Collection({}, {ransack: {id_eq: 5}})
23
-
24
- collection.ransack(undefined)
25
-
26
- expect(collection.queryArgs).toEqual({ransack: {id_eq: 5}})
27
- })
28
-
29
- it("handles sorts of different types", () => {
30
- let collection = new Collection({}, {})
31
-
32
- collection = collection.ransack({s: "created_at"})
33
- expect(collection.queryArgs.ransack.s).toEqual("created_at")
34
-
35
- collection = collection.ransack({s: ["id", "name"]})
36
- expect(collection.queryArgs.ransack.s).toEqual(["created_at", "id", "name"])
37
- })
38
- })
39
-
40
- describe("selectColumns", () => {
41
- it("adds selected columns to the query", () => {
42
- let collection = new Collection({}, {})
43
-
44
- collection = collection.selectColumns({User: ["id"]})
45
- expect(collection.queryArgs.selectColumns).toEqual({user: ["id"]})
46
-
47
- collection = collection.selectColumns({User: ["email"]})
48
- expect(collection.queryArgs.selectColumns).toEqual({user: ["id", "email"]})
49
- })
50
- })
51
- })
@@ -1,13 +0,0 @@
1
- import CustomError from "../src/custom-error.mjs"
2
-
3
- describe("CustomError", () => {
4
- it("handles when response is a string", () => {
5
- const xhr = {status: 401}
6
- const response = "An error happened"
7
- const customError = new CustomError(`Request failed with code: ${xhr.status}`, {response, xhr})
8
-
9
- expect(customError.message).toEqual("Request failed with code: 401")
10
- expect(customError.errorMessages()).toEqual(undefined)
11
- expect(customError.errorTypes()).toEqual(undefined)
12
- })
13
- })
@@ -1,34 +0,0 @@
1
- import I18nOnSteroids from "i18n-on-steroids"
2
- import ModelName from "../src/model-name.mjs"
3
-
4
- const i18n = new I18nOnSteroids()
5
-
6
- const initializeI18n = () => {
7
- i18n.scanObject({
8
- da: {
9
- activerecord: {
10
- models: {
11
- user: {
12
- one: "Bruger",
13
- other: "Brugere"
14
- }
15
- }
16
- }
17
- }
18
- })
19
- i18n.setLocale("da")
20
- }
21
-
22
- describe("ModelName", () => {
23
- beforeEach(() => {
24
- initializeI18n()
25
- })
26
-
27
- test("human", () => {
28
- const modelClassData = {i18nKey: "user"}
29
- const modelName = new ModelName({i18n, modelClassData})
30
-
31
- expect(modelName.human()).toEqual("Bruger")
32
- expect(modelName.human({count: 2})).toEqual("Brugere")
33
- })
34
- })