@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,113 +0,0 @@
1
- import ModelPropType from "../src/model-prop-type.mjs"
2
- import Task from "./support/task.mjs"
3
- import User from "./support/user.mjs"
4
-
5
- describe("ModelPropType", () => {
6
- describe("ofModel", () => {
7
- it("validates model class successfully", () => {
8
- const user = new User({})
9
- const validator = ModelPropType.ofModel(User).isRequired
10
- const validation = validator({user}, "user")
11
-
12
- expect(validation).toBeUndefined()
13
- })
14
-
15
- it("validates model class unsuccessfully", () => {
16
- const task = new Task()
17
- const validator = ModelPropType.ofModel(User).isRequired
18
- const validation = validator({user: task}, "user")
19
-
20
- expect(validation).toEqual(new Error("Expected user to be of type User but it wasn't: Task"))
21
- })
22
- })
23
-
24
- describe("withLoadedAbilities", () => {
25
- it("validates required attributes successfully", () => {
26
- const user = new User({a: {id: 5}, b: {destroy: false, edit: true}})
27
- const validator = ModelPropType.ofModel(User).withLoadedAbilities(["destroy", "edit"]).isRequired
28
- const validation = validator({user}, "user")
29
-
30
- expect(validation).toBeUndefined()
31
- })
32
-
33
- it("validates required attributes unsuccessfully", () => {
34
- const user = new User({a: {id: 5}, b: {edit: true}})
35
- const validator = ModelPropType.ofModel(User).withLoadedAbilities(["destroy", "edit"]).isRequired
36
- const validation = validator({user}, "user")
37
-
38
- expect(validation).toEqual(new Error("The ability destroy was required to be loaded in user of the User type but it wasn't"))
39
- })
40
- })
41
-
42
- describe("withLoadedAssociation", () => {
43
- it("validates association is loaded overall successfully", () => {
44
- const task = new Task()
45
- const user = new User({r: {tasks: [task]}})
46
-
47
- const validator = ModelPropType
48
- .ofModel(User)
49
- .withLoadedAssociation("tasks")
50
- .previous()
51
- .isRequired
52
-
53
- const validation = validator({user}, "user")
54
-
55
- expect(validation).toBeUndefined()
56
- })
57
-
58
- it("validates association is loaded overall unsuccessfully", () => {
59
- const user = new User({r: {}})
60
-
61
- const validator = ModelPropType
62
- .ofModel(User)
63
- .withLoadedAssociation("tasks")
64
- .previous()
65
- .isRequired
66
-
67
- const validation = validator({user}, "user")
68
-
69
- expect(validation).toEqual(new Error("The association tasks was required to be loaded in user of the User type but it wasn't"))
70
- })
71
-
72
- it("validates attributes on nested associations", () => {
73
- const task = new Task({a: {id: 4, name: "Test task"}})
74
- const user = new User({r: {tasks: [task]}})
75
-
76
- const validator = ModelPropType.ofModel(User)
77
- .withLoadedAssociation("tasks")
78
- .withLoadedAttributes(["id", "name", "updatedAt"])
79
- .previous()
80
- .isRequired
81
-
82
- const validation = validator({user}, "user")
83
-
84
- expect(validation).toEqual(new Error("The attribute updatedAt was required to be loaded in user.tasks of the Task type but it wasn't"))
85
- })
86
- })
87
-
88
- describe("withLoadedAttributes", () => {
89
- it("validates required attributes successfully", () => {
90
- const user = new User({a: {id: 5, name: "Donald Duck"}})
91
- const validator = ModelPropType.ofModel(User).withLoadedAttributes(["id", "name"]).isRequired
92
- const validation = validator({user}, "user")
93
-
94
- expect(validation).toBeUndefined()
95
- })
96
-
97
- it("validates required attributes unsuccessfully", () => {
98
- const user = new User({a: {id: 5}})
99
- const validator = ModelPropType.ofModel(User).withLoadedAttributes(["id", "name"]).isRequired
100
- const validation = validator({user}, "user")
101
-
102
- expect(validation).toEqual(new Error("The attribute name was required to be loaded in user of the User type but it wasn't"))
103
- })
104
-
105
- it("ignores if the model is a new record", () => {
106
- const user = new User({isNewRecord: true})
107
- const validator = ModelPropType.ofModel(User).withLoadedAttributes(["id", "name"]).isRequired
108
- const validation = validator({user}, "user")
109
-
110
- expect(validation).toBeUndefined()
111
- })
112
- })
113
- })
@@ -1,40 +0,0 @@
1
- import Params from "../src/params.mjs"
2
-
3
- describe("Params", () => {
4
- describe("change", () => {
5
- it("changes the params", () => {
6
- delete global.location
7
-
8
- global.location = {
9
- search: "?q[name_cont]=kasper"
10
- }
11
-
12
- const result = Params.change({q: {s: "name asc"}})
13
-
14
- expect(result).toEqual({
15
- q: {
16
- name_cont: "kasper",
17
- s: "name asc"
18
- }
19
- })
20
- })
21
- })
22
-
23
- describe("parse", () => {
24
- it("parses the current path", () => {
25
- delete global.location
26
-
27
- global.location = {
28
- search: "?q[name_cont]=kasper"
29
- }
30
-
31
- const result = Params.parse()
32
-
33
- expect(result).toEqual({
34
- q: {
35
- name_cont: "kasper"
36
- }
37
- })
38
- })
39
- })
40
- })
@@ -1,103 +0,0 @@
1
- import RoutesNative from "../src/routes-native.mjs"
2
- const testRoutes = () => ({
3
- routes: [
4
- {"name": "blank", "path": "/blank", "component": "blank"},
5
-
6
- {"name": "root", "path": "", "component": "dashboard"},
7
-
8
- {"name": "new_drink", "path": "/drinks/new", "component": "drinks/edit"},
9
- {"name": "edit_drink", "path": "/drinks/:id/edit", "component": "drinks/edit"},
10
- {"name": "drink", "path": "/drinks/:id", "component": "drinks/show"},
11
- {"name": "drinks", "path": "/drinks", "component": "drinks/index"}
12
- ]
13
- })
14
- const testTranslations = () => ({
15
- locales: {
16
- da: {
17
- routes: {
18
- drink: "drink",
19
- edit: "rediger"
20
- }
21
- },
22
- en: {
23
- routes: {
24
- drink: "drink",
25
- edit: "edit"
26
- }
27
- }
28
- }
29
- })
30
-
31
- const routesNative = ({args, currentLocale}) => {
32
- const test = new RoutesNative({
33
- getLocale: () => currentLocale
34
- })
35
-
36
- test.loadRouteTranslations(testTranslations())
37
- test.loadRouteDefinitions(testRoutes(), args)
38
-
39
- return test
40
- }
41
-
42
- describe("RoutesNative", () => {
43
- it("translates routes from the current locale", () => {
44
- const test = routesNative({args: {localized: true}, currentLocale: "da"})
45
- const daRoute = test.editDrinkPath(5)
46
-
47
- expect(daRoute).toEqual("/da/drinks/5/rediger")
48
- })
49
-
50
- it("translates routes from the locale-param", () => {
51
- const test = routesNative({args: {localized: true}, currentLocale: "en"})
52
- const daRoute = test.editDrinkPath(5, {locale: "da"})
53
-
54
- expect(daRoute).toEqual("/da/drinks/5/rediger")
55
- })
56
-
57
- it("defaults to the locale given by the getLocale callback", () => {
58
- const test = routesNative({args: {localized: true}, currentLocale: "en"})
59
- const daRoute = test.editDrinkPath(5)
60
-
61
- expect(daRoute).toEqual("/en/drinks/5/edit")
62
- })
63
-
64
- it("uses the rest of the params as a query string", () => {
65
- const test = routesNative({args: {localized: true}, currentLocale: "en"})
66
- const daRoute = test.editDrinkPath(5, {drink: {name: "Pina Colada"}, locale: "da"})
67
-
68
- expect(daRoute).toEqual("/da/drinks/5/rediger?drink%5Bname%5D=Pina%20Colada")
69
- })
70
-
71
- it("translates a route without localization", () => {
72
- const test = routesNative({currentLocale: "en"})
73
- const daRoute = test.editDrinkPath(5, {drink: {name: "Pina Colada"}})
74
-
75
- expect(daRoute).toEqual("/drinks/5/edit?drink%5Bname%5D=Pina%20Colada")
76
- })
77
-
78
- it("generates urls", () => {
79
- if (!globalThis.location) globalThis.location = {} // eslint-disable-line jest/no-if
80
-
81
- globalThis.location.host = "localhost"
82
- globalThis.location.protocol = "http:"
83
-
84
- const test = routesNative({args: {localized: true}, currentLocale: "en"})
85
- const daRoute = test.editDrinkUrl(5, {drink: {name: "Pina Colada"}, locale: "da"})
86
-
87
- expect(daRoute).toEqual("http://localhost/da/drinks/5/rediger?drink%5Bname%5D=Pina%20Colada")
88
- })
89
-
90
- it("generates urls with custom options", () => {
91
- const test = routesNative({args: {localized: true}, currentLocale: "en"})
92
- const daRoute = test.editDrinkUrl(5, {drink: {name: "Pina Colada"}, locale: "da", host: "google.com", port: 123, protocol: "https"})
93
-
94
- expect(daRoute).toEqual("https://google.com:123/da/drinks/5/rediger?drink%5Bname%5D=Pina%20Colada")
95
- })
96
-
97
- it("generates urls without locales", () => {
98
- const test = routesNative({currentLocale: "en"})
99
- const daRoute = test.editDrinkUrl(5, {drink: {name: "Pina Colada"}, locale: "da", host: "google.com", port: 123, protocol: "https"})
100
-
101
- expect(daRoute).toEqual("https://google.com:123/drinks/5/edit?drink%5Bname%5D=Pina%20Colada")
102
- })
103
- })
@@ -1,46 +0,0 @@
1
- import Routes from "../src/routes.mjs"
2
- const testRoutes = {
3
- routes: [
4
- {"name": "blank", "path": "/blank", "component": "blank"},
5
-
6
- {"name": "root", "path": "", "component": "dashboard"},
7
-
8
- {"name": "new_drink", "path": "/drinks/new", "component": "drinks/edit"},
9
- {"name": "edit_drink", "path": "/drinks/:id/edit", "component": "drinks/edit"},
10
- {"name": "drink", "path": "/drinks/:id", "component": "drinks/show"},
11
- {"name": "drinks", "path": "/drinks", "component": "drinks/index"}
12
- ]
13
- }
14
- const fakeJsRoutes = {
15
- blankPath: () => "/blank",
16
- blankUrl: () => "https://localhost/blank",
17
- newDrinkPath: () => "/drinks/new",
18
- newDrinkUrl: () => "/drinks/new",
19
- editDrinkPath: (drinkId) => `/drinks/${drinkId}/edit`,
20
- editDrinkUrl: (drinkId) => `https://localhost/drinks/${drinkId}/edit`,
21
- drinkPath: (drinkId) => `/druiks/${drinkId}`,
22
- drinkUrl: (drinkId) => `https://localhost/drinks/${drinkId}`,
23
- drinksPath: () => "/drinks",
24
- drinksUrl: () => "https://localhost/drinks",
25
- rootPath: () => "/root",
26
- rootUrl: () => "https://localhost"
27
- }
28
-
29
- const routes = new Routes({
30
- jsRoutes: fakeJsRoutes,
31
- routeDefinitions: testRoutes
32
- })
33
-
34
- describe("Routes", () => {
35
- it("generates paths", () => {
36
- const daRoute = routes.editDrinkPath(5)
37
-
38
- expect(daRoute).toEqual("/drinks/5/edit")
39
- })
40
-
41
- it("generates urls", () => {
42
- const daRoute = routes.editDrinkUrl(5)
43
-
44
- expect(daRoute).toEqual("https://localhost/drinks/5/edit")
45
- })
46
- })
@@ -1,30 +0,0 @@
1
- import Serializer from "../src/serializer.mjs"
2
- import User from "./support/user.mjs"
3
-
4
- describe("Serializer", () => {
5
- test("it serializes model classes", () => {
6
- const testObject = {
7
- userModel: User
8
- }
9
- const serialized = Serializer.serialize(testObject)
10
-
11
- expect(serialized).toEqual({userModel: {api_maker_type: "resource", name: "User"}})
12
- })
13
-
14
- test("it serializes dates", () => {
15
- // Mock time zone offset
16
- var getTimezoneOffset = Date.prototype.getTimezoneOffset
17
-
18
- Date.prototype.getTimezoneOffset = function () {
19
- return -120
20
- }
21
-
22
- const date = new Date(1985, 5, 17, 10, 30, 5)
23
- const serialized = Serializer.serialize(date)
24
-
25
- // Restore time zone offset
26
- Date.prototype.getTimezoneOffset = getTimezoneOffset
27
-
28
- expect(serialized).toEqual({api_maker_type: "datetime", value: "1985-6-17 10:30:5+0200"})
29
- })
30
- })
@@ -1,27 +0,0 @@
1
- export default class Task {
2
- static modelClassData () {
3
- return {
4
- attributes: [],
5
- name: "Task"
6
- }
7
- }
8
-
9
- static modelName () {
10
- return "Task"
11
- }
12
-
13
- constructor ({a, b, isNewRecord = false, r} = {}) {
14
- this.abilities = b
15
- this._isNewRecord = isNewRecord
16
- this.modelData = a
17
- this.relationshipsCache = r
18
- }
19
-
20
- isNewRecord () {
21
- return this._isNewRecord
22
- }
23
-
24
- isPersisted () {
25
- return !this._isNewRecord
26
- }
27
- }
@@ -1,32 +0,0 @@
1
- import BaseModel from "../../src/base-model.mjs"
2
-
3
- export default class User extends BaseModel {
4
- static modelClassData () {
5
- return {
6
- attributes: [],
7
- name: "User",
8
- primaryKey: "id"
9
- }
10
- }
11
-
12
- static modelName () {
13
- return "User"
14
- }
15
-
16
- constructor ({a, b, isNewRecord = false, r}) {
17
- super({a})
18
-
19
- this.abilities = b
20
- this._isNewRecord = isNewRecord
21
- this.modelData = a
22
- this.relationshipsCache = r
23
- }
24
-
25
- isNewRecord () {
26
- return this._isNewRecord
27
- }
28
-
29
- isPersisted () {
30
- return !this._isNewRecord
31
- }
32
- }
package/index.js DELETED
@@ -1 +0,0 @@
1
- export {}
package/jest.config.js DELETED
@@ -1,4 +0,0 @@
1
- export default {
2
- testRegex: "__tests__/.*\.test\.(m|)js$", // eslint-disable-line no-useless-escape
3
- transform: {}
4
- }
@@ -1,54 +0,0 @@
1
- import ApiMakerEventEmitterListener from "./event-emitter-listener"
2
- import {digg, digs} from "diggerize"
3
- import CanCan from "./can-can.mjs"
4
- import PropTypes from "prop-types"
5
- import propTypesExact from "prop-types-exact"
6
- import React from "react"
7
-
8
- export default class ApiMakerCanCanLoader extends React.PureComponent {
9
- static propTypes = propTypesExact({
10
- abilities: PropTypes.array.isRequired,
11
- component: PropTypes.object.isRequired
12
- })
13
-
14
- componentDidMount () {
15
- this.loadAbilities()
16
- }
17
-
18
- async loadAbilities () {
19
- const canCan = CanCan.current()
20
- const {abilities} = digs(this.props, "abilities")
21
-
22
- await canCan.loadAbilities(abilities)
23
-
24
- this.updateComponent({canCan})
25
- }
26
-
27
- render () {
28
- const canCan = CanCan.current()
29
- const events = digg(canCan, "events")
30
-
31
- return (
32
- <ApiMakerEventEmitterListener
33
- event="onResetAbilities"
34
- events={events}
35
- onCalled={this.onResetAbilities}
36
- />
37
- )
38
- }
39
-
40
- onResetAbilities = () => {
41
- this.updateComponent({canCan: undefined})
42
- this.loadAbilities()
43
- }
44
-
45
- updateComponent (updatedState) {
46
- const {component} = digs(this.props, "component")
47
-
48
- if (component.shape) {
49
- component.shape.set(updatedState)
50
- } else {
51
- component.setState(updatedState)
52
- }
53
- }
54
- }
@@ -1,3 +0,0 @@
1
- import {createConsumer} from "@rails/actioncable"
2
-
3
- export default createConsumer()
@@ -1,7 +0,0 @@
1
- import BaseError from "./base-error.mjs"
2
-
3
- class DestroyError extends BaseError {}
4
-
5
- DestroyError.apiMakerType = "DestroyError"
6
-
7
- export default DestroyError
package/src/devise.mjs DELETED
@@ -1,122 +0,0 @@
1
- import CanCan from "./can-can.mjs"
2
- import Deserializer from "./deserializer.mjs"
3
- import {digg} from "diggerize"
4
- import EventEmitter from "events"
5
- import inflection from "inflection"
6
- import modelClassRequire from "./model-class-require.mjs"
7
- import Services from "./services.mjs"
8
-
9
- export default class ApiMakerDevise {
10
- static callSignOutEvent (args) {
11
- ApiMakerDevise.events().emit("onDeviseSignOut", {args})
12
- }
13
-
14
- static current () {
15
- if (!globalThis.currentApiMakerDevise)
16
- globalThis.currentApiMakerDevise = new ApiMakerDevise()
17
-
18
- return globalThis.currentApiMakerDevise
19
- }
20
-
21
- static events () {
22
- if (!globalThis.apiMakerDeviseEvents) {
23
- globalThis.apiMakerDeviseEvents = new EventEmitter()
24
- globalThis.apiMakerDeviseEvents.setMaxListeners(1000)
25
- }
26
-
27
- return globalThis.apiMakerDeviseEvents
28
- }
29
-
30
- static addUserScope (scope) {
31
- const currentMethodName = `current${inflection.camelize(scope)}`
32
-
33
- ApiMakerDevise[currentMethodName] = function () {
34
- return ApiMakerDevise.current().getCurrentScope(scope)
35
- }
36
-
37
- const isSignedInMethodName = `is${inflection.camelize(scope)}SignedIn`
38
-
39
- ApiMakerDevise[isSignedInMethodName] = function () {
40
- if (ApiMakerDevise.current().getCurrentScope(scope)) {
41
- return true
42
- }
43
-
44
- return false
45
- }
46
- }
47
-
48
- static async signIn (username, password, args = {}) {
49
- if (!args.scope) args.scope = "user"
50
-
51
- const postData = {username, password, args}
52
- const response = await Services.current().sendRequest("Devise::SignIn", postData)
53
-
54
- let model = response.model
55
-
56
- if (Array.isArray(model)) model = model[0]
57
-
58
- await CanCan.current().resetAbilities()
59
-
60
- ApiMakerDevise.updateSession(model)
61
- ApiMakerDevise.events().emit("onDeviseSignIn", Object.assign({username}, args))
62
-
63
- return {model, response}
64
- }
65
-
66
- static updateSession (model) {
67
- const scope = digg(model.modelClassData(), "name")
68
- const camelizedScopeName = inflection.camelize(scope, true)
69
-
70
- ApiMakerDevise.current().currents[camelizedScopeName] = model
71
- }
72
-
73
- static setSignedOut (args) {
74
- ApiMakerDevise.current().currents[inflection.camelize(args.scope, true)] = null
75
- }
76
-
77
- static async signOut (args = {}) {
78
- if (!args.scope)
79
- args.scope = "user"
80
-
81
- const response = await Services.current().sendRequest("Devise::SignOut", {args})
82
-
83
- await CanCan.current().resetAbilities()
84
-
85
- // Cannot use the class because they would both import each other
86
- if (globalThis.apiMakerSessionStatusUpdater) {
87
- globalThis.apiMakerSessionStatusUpdater.updateSessionStatus()
88
- }
89
-
90
- ApiMakerDevise.setSignedOut(args)
91
- ApiMakerDevise.callSignOutEvent(args)
92
-
93
- return response
94
- }
95
-
96
- constructor () {
97
- this.currents = {}
98
- }
99
-
100
- getCurrentScope (scope) {
101
- if (!(scope in this.currents))
102
- this.currents[scope] = this.loadCurrentScope(scope)
103
-
104
- return this.currents[scope]
105
- }
106
-
107
- loadCurrentScope (scope) {
108
- const scopeData = globalThis.apiMakerDeviseCurrent[scope]
109
-
110
- if (!scopeData) return null
111
-
112
- const parsedScopeData = Deserializer.parse(scopeData)
113
-
114
- // Might be a collection with preloaded relationships
115
- if (Array.isArray(parsedScopeData)) return parsedScopeData[0]
116
-
117
- const ModelClass = modelClassRequire(scope)
118
- const modelInstance = new ModelClass({data: parsedScopeData})
119
-
120
- return modelInstance
121
- }
122
- }
@@ -1,65 +0,0 @@
1
- import debounce from "debounce"
2
- import ModelEvents from "./model-events.mjs"
3
- import PropTypes from "prop-types"
4
- import propTypesExact from "prop-types-exact"
5
- import React from "react"
6
-
7
- export default class ApiMakerEventCreated extends React.PureComponent {
8
- static defaultProps = {
9
- active: true
10
- }
11
-
12
- static propTypes = propTypesExact({
13
- active: PropTypes.bool.isRequired,
14
- debounce: PropTypes.oneOfType([
15
- PropTypes.bool,
16
- PropTypes.number
17
- ]),
18
- modelClass: PropTypes.func.isRequired,
19
- onCreated: PropTypes.func.isRequired
20
- })
21
-
22
- componentDidMount () {
23
- this.connect()
24
- }
25
-
26
- componentWillUnmount () {
27
- if (this.connectCreated) {
28
- this.connectCreated.unsubscribe()
29
- }
30
- }
31
-
32
- connect () {
33
- this.connectCreated = ModelEvents.connectCreated(this.props.modelClass, (...args) => this.onCreated(...args))
34
- }
35
-
36
- debounce () {
37
- if (!this.debounceInstance) {
38
- const {onCreated} = digs(this.props, "onCreated")
39
-
40
- if (typeof this.props.debounce == "number") {
41
- this.debounceInstance = debounce(onCreated, this.props.debounce)
42
- } else {
43
- this.debounceInstance = debounce(onCreated)
44
- }
45
- }
46
-
47
- return this.debounceInstance
48
- }
49
-
50
- onCreated (...args) {
51
- if (!this.props.active) {
52
- return
53
- }
54
-
55
- if (this.props.debounce) {
56
- this.debounce()(...args)
57
- } else {
58
- this.props.onCreated(...args)
59
- }
60
- }
61
-
62
- render () {
63
- return null
64
- }
65
- }
@@ -1,29 +0,0 @@
1
- import ModelEvents from "./model-events.mjs"
2
- import PropTypes from "prop-types"
3
- import propTypesExact from "prop-types-exact"
4
- import React from "react"
5
-
6
- export default class ApiMakerEventDestroyed extends React.PureComponent {
7
- static propTypes = propTypesExact({
8
- model: PropTypes.object.isRequired,
9
- onDestroyed: PropTypes.func.isRequired
10
- })
11
-
12
- componentDidMount () {
13
- this.connect()
14
- }
15
-
16
- componentWillUnmount () {
17
- if (this.connectDestroyed) {
18
- this.connectDestroyed.unsubscribe()
19
- }
20
- }
21
-
22
- connect () {
23
- this.connectDestroyed = ModelEvents.connectDestroyed(this.props.model, this.props.onDestroyed)
24
- }
25
-
26
- render () {
27
- return null
28
- }
29
- }