@rebasepro/studio 0.0.1-canary.09e5ec5

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/LICENSE +114 -0
  2. package/README.md +159 -0
  3. package/dist/ApiExplorer-gMJt5JrS.js +1053 -0
  4. package/dist/ApiExplorer-gMJt5JrS.js.map +1 -0
  5. package/dist/AuthSimulationSelector-BF4rkRGp.js +118 -0
  6. package/dist/AuthSimulationSelector-BF4rkRGp.js.map +1 -0
  7. package/dist/BranchesView-DcHZtvXo.js +292 -0
  8. package/dist/BranchesView-DcHZtvXo.js.map +1 -0
  9. package/dist/CronJobsView-CijCToeK.js +456 -0
  10. package/dist/CronJobsView-CijCToeK.js.map +1 -0
  11. package/dist/JSEditor-D8nVp3Lp.js +1308 -0
  12. package/dist/JSEditor-D8nVp3Lp.js.map +1 -0
  13. package/dist/MonacoEditor-CMYEjiRf.js +161 -0
  14. package/dist/MonacoEditor-CMYEjiRf.js.map +1 -0
  15. package/dist/RLSEditor-DBH09u9v.js +1831 -0
  16. package/dist/RLSEditor-DBH09u9v.js.map +1 -0
  17. package/dist/SQLEditor-CkVx9vgr.js +1792 -0
  18. package/dist/SQLEditor-CkVx9vgr.js.map +1 -0
  19. package/dist/SchemaVisualizer-BgD5Zb77.js +1069 -0
  20. package/dist/SchemaVisualizer-BgD5Zb77.js.map +1 -0
  21. package/dist/StorageView-CTqGFhY9.js +907 -0
  22. package/dist/StorageView-CTqGFhY9.js.map +1 -0
  23. package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
  24. package/dist/common/src/collections/index.d.ts +1 -0
  25. package/dist/common/src/data/buildRebaseData.d.ts +14 -0
  26. package/dist/common/src/index.d.ts +3 -0
  27. package/dist/common/src/util/builders.d.ts +57 -0
  28. package/dist/common/src/util/callbacks.d.ts +6 -0
  29. package/dist/common/src/util/collections.d.ts +11 -0
  30. package/dist/common/src/util/common.d.ts +2 -0
  31. package/dist/common/src/util/conditions.d.ts +26 -0
  32. package/dist/common/src/util/entities.d.ts +58 -0
  33. package/dist/common/src/util/enums.d.ts +3 -0
  34. package/dist/common/src/util/index.d.ts +16 -0
  35. package/dist/common/src/util/navigation_from_path.d.ts +34 -0
  36. package/dist/common/src/util/navigation_utils.d.ts +20 -0
  37. package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
  38. package/dist/common/src/util/paths.d.ts +14 -0
  39. package/dist/common/src/util/permissions.d.ts +5 -0
  40. package/dist/common/src/util/references.d.ts +2 -0
  41. package/dist/common/src/util/relations.d.ts +22 -0
  42. package/dist/common/src/util/resolutions.d.ts +72 -0
  43. package/dist/common/src/util/storage.d.ts +24 -0
  44. package/dist/core/src/components/AIIcon.d.ts +16 -0
  45. package/dist/core/src/components/ConfirmationDialog.d.ts +9 -0
  46. package/dist/core/src/components/Debug/UIReferenceView.d.ts +1 -0
  47. package/dist/core/src/components/Debug/UIStyleGuide.d.ts +1 -0
  48. package/dist/core/src/components/ErrorTooltip.d.ts +2 -0
  49. package/dist/core/src/components/ErrorView.d.ts +21 -0
  50. package/dist/core/src/components/LanguageToggle.d.ts +1 -0
  51. package/dist/core/src/components/LoginView/LoginView.d.ts +68 -0
  52. package/dist/core/src/components/LoginView/index.d.ts +2 -0
  53. package/dist/core/src/components/NotFoundPage.d.ts +1 -0
  54. package/dist/core/src/components/RebaseAuth.d.ts +10 -0
  55. package/dist/core/src/components/RebaseLogo.d.ts +7 -0
  56. package/dist/core/src/components/UnsavedChangesDialog.d.ts +9 -0
  57. package/dist/core/src/components/UserDisplay.d.ts +7 -0
  58. package/dist/core/src/components/UserSelectPopover.d.ts +62 -0
  59. package/dist/core/src/components/UserSettingsView.d.ts +1 -0
  60. package/dist/core/src/components/common/index.d.ts +6 -0
  61. package/dist/core/src/components/common/table_height.d.ts +5 -0
  62. package/dist/core/src/components/common/types.d.ts +63 -0
  63. package/dist/core/src/components/common/useColumnsIds.d.ts +9 -0
  64. package/dist/core/src/components/common/useDataTableController.d.ts +45 -0
  65. package/dist/core/src/components/common/useDebouncedData.d.ts +9 -0
  66. package/dist/core/src/components/common/useScrollRestoration.d.ts +14 -0
  67. package/dist/core/src/components/index.d.ts +16 -0
  68. package/dist/core/src/contexts/AdminModeController.d.ts +4 -0
  69. package/dist/core/src/contexts/AnalyticsContext.d.ts +3 -0
  70. package/dist/core/src/contexts/AuthControllerContext.d.ts +3 -0
  71. package/dist/core/src/contexts/CustomizationControllerContext.d.ts +3 -0
  72. package/dist/core/src/contexts/DataDriverContext.d.ts +3 -0
  73. package/dist/core/src/contexts/DatabaseAdminContext.d.ts +3 -0
  74. package/dist/core/src/contexts/DialogsProvider.d.ts +4 -0
  75. package/dist/core/src/contexts/EffectiveRoleController.d.ts +4 -0
  76. package/dist/core/src/contexts/InternalUserManagementContext.d.ts +3 -0
  77. package/dist/core/src/contexts/ModeController.d.ts +4 -0
  78. package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +6 -0
  79. package/dist/core/src/contexts/RebaseDataContext.d.ts +3 -0
  80. package/dist/core/src/contexts/SnackbarProvider.d.ts +2 -0
  81. package/dist/core/src/contexts/StorageSourceContext.d.ts +3 -0
  82. package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  83. package/dist/core/src/contexts/index.d.ts +13 -0
  84. package/dist/core/src/core/PluginLifecycleManager.d.ts +17 -0
  85. package/dist/core/src/core/PluginProviderStack.d.ts +21 -0
  86. package/dist/core/src/core/Rebase.d.ts +14 -0
  87. package/dist/core/src/core/RebaseProps.d.ts +136 -0
  88. package/dist/core/src/core/RebaseRouter.d.ts +4 -0
  89. package/dist/core/src/core/RebaseRoutes.d.ts +17 -0
  90. package/dist/core/src/core/index.d.ts +4 -0
  91. package/dist/core/src/hooks/ApiConfigContext.d.ts +24 -0
  92. package/dist/core/src/hooks/data/delete.d.ts +31 -0
  93. package/dist/core/src/hooks/data/save.d.ts +34 -0
  94. package/dist/core/src/hooks/data/useCollectionFetch.d.ts +51 -0
  95. package/dist/core/src/hooks/data/useData.d.ts +13 -0
  96. package/dist/core/src/hooks/data/useDataOrder.d.ts +12 -0
  97. package/dist/core/src/hooks/data/useEntityFetch.d.ts +38 -0
  98. package/dist/core/src/hooks/data/useRelationSelector.d.ts +52 -0
  99. package/dist/core/src/hooks/data/useUserSelector.d.ts +31 -0
  100. package/dist/core/src/hooks/index.d.ts +37 -0
  101. package/dist/core/src/hooks/useAdminModeController.d.ts +19 -0
  102. package/dist/core/src/hooks/useAnalyticsController.d.ts +5 -0
  103. package/dist/core/src/hooks/useAuthController.d.ts +11 -0
  104. package/dist/core/src/hooks/useAuthSubscription.d.ts +2 -0
  105. package/dist/core/src/hooks/useBackendStorageSource.d.ts +30 -0
  106. package/dist/core/src/hooks/useBridgeRegistration.d.ts +18 -0
  107. package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  108. package/dist/core/src/hooks/useBuildAdminModeController.d.ts +6 -0
  109. package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +8 -0
  110. package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
  111. package/dist/core/src/hooks/useBuildModeController.d.ts +6 -0
  112. package/dist/core/src/hooks/useClipboard.d.ts +57 -0
  113. package/dist/core/src/hooks/useCollapsedGroups.d.ts +12 -0
  114. package/dist/core/src/hooks/useCustomizationController.d.ts +11 -0
  115. package/dist/core/src/hooks/useDialogsController.d.ts +11 -0
  116. package/dist/core/src/hooks/useEffectiveRoleController.d.ts +7 -0
  117. package/dist/core/src/hooks/useInternalUserManagementController.d.ts +12 -0
  118. package/dist/core/src/hooks/useLargeLayout.d.ts +1 -0
  119. package/dist/core/src/hooks/useModeController.d.ts +19 -0
  120. package/dist/core/src/hooks/usePermissions.d.ts +12 -0
  121. package/dist/core/src/hooks/useRebaseClient.d.ts +5 -0
  122. package/dist/core/src/hooks/useRebaseContext.d.ts +11 -0
  123. package/dist/core/src/hooks/useRebaseRegistry.d.ts +34 -0
  124. package/dist/core/src/hooks/useSlot.d.ts +18 -0
  125. package/dist/core/src/hooks/useSnackbarController.d.ts +20 -0
  126. package/dist/core/src/hooks/useStorageSource.d.ts +7 -0
  127. package/dist/core/src/hooks/useStudioBridge.d.ts +91 -0
  128. package/dist/core/src/hooks/useTranslation.d.ts +17 -0
  129. package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +12 -0
  130. package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +8 -0
  131. package/dist/core/src/hooks/useValidateAuthenticator.d.ts +21 -0
  132. package/dist/core/src/i18n/RebaseI18nProvider.d.ts +33 -0
  133. package/dist/core/src/index.d.ts +15 -0
  134. package/dist/core/src/internal/common.d.ts +3 -0
  135. package/dist/core/src/internal/useRestoreScroll.d.ts +6 -0
  136. package/dist/core/src/locales/de.d.ts +2 -0
  137. package/dist/core/src/locales/en.d.ts +10 -0
  138. package/dist/core/src/locales/es.d.ts +10 -0
  139. package/dist/core/src/locales/fr.d.ts +2 -0
  140. package/dist/core/src/locales/hi.d.ts +2 -0
  141. package/dist/core/src/locales/it.d.ts +2 -0
  142. package/dist/core/src/locales/pt.d.ts +7 -0
  143. package/dist/core/src/util/constants.d.ts +1 -0
  144. package/dist/core/src/util/createFormexStub.d.ts +2 -0
  145. package/dist/core/src/util/entity_cache.d.ts +27 -0
  146. package/dist/core/src/util/enums.d.ts +5 -0
  147. package/dist/core/src/util/icon_list.d.ts +5 -0
  148. package/dist/core/src/util/icon_synonyms.d.ts +1 -0
  149. package/dist/core/src/util/icons.d.ts +20 -0
  150. package/dist/core/src/util/index.d.ts +10 -0
  151. package/dist/core/src/util/previews.d.ts +4 -0
  152. package/dist/core/src/util/useStorageUploadController.d.ts +38 -0
  153. package/dist/core/src/util/useTraceUpdate.d.ts +2 -0
  154. package/dist/formex/src/Field.d.ts +52 -0
  155. package/dist/formex/src/Formex.d.ts +7 -0
  156. package/dist/formex/src/index.d.ts +5 -0
  157. package/dist/formex/src/types.d.ts +40 -0
  158. package/dist/formex/src/useCreateFormex.d.ts +14 -0
  159. package/dist/formex/src/utils.d.ts +16 -0
  160. package/dist/index.es.js +726 -0
  161. package/dist/index.es.js.map +1 -0
  162. package/dist/index.umd.js +9647 -0
  163. package/dist/index.umd.js.map +1 -0
  164. package/dist/studio/src/components/ApiExplorer/ApiExplorer.d.ts +9 -0
  165. package/dist/studio/src/components/ApiExplorer/EndpointDetail.d.ts +9 -0
  166. package/dist/studio/src/components/ApiExplorer/TryItPanel.d.ts +15 -0
  167. package/dist/studio/src/components/ApiExplorer/parseSpec.d.ts +16 -0
  168. package/dist/studio/src/components/ApiExplorer/types.d.ts +90 -0
  169. package/dist/studio/src/components/AuthSimulationSelector.d.ts +11 -0
  170. package/dist/studio/src/components/Branches/BranchesView.d.ts +1 -0
  171. package/dist/studio/src/components/CronJobs/CronJobsView.d.ts +1 -0
  172. package/dist/studio/src/components/JSEditor/JSEditor.d.ts +1 -0
  173. package/dist/studio/src/components/JSEditor/JSEditorSidebar.d.ts +21 -0
  174. package/dist/studio/src/components/JSEditor/JSMonacoEditor.d.ts +18 -0
  175. package/dist/studio/src/components/RLSEditor/PolicyEditor.d.ts +9 -0
  176. package/dist/studio/src/components/RLSEditor/RLSEditor.d.ts +19 -0
  177. package/dist/studio/src/components/RLSEditor/index.d.ts +1 -0
  178. package/dist/studio/src/components/RebaseStudio.d.ts +2 -0
  179. package/dist/studio/src/components/SQLEditor/ExplainVisualizer.d.ts +24 -0
  180. package/dist/studio/src/components/SQLEditor/MonacoEditor.d.ts +17 -0
  181. package/dist/studio/src/components/SQLEditor/SQLEditor.d.ts +11 -0
  182. package/dist/studio/src/components/SQLEditor/SQLEditorSidebar.d.ts +21 -0
  183. package/dist/studio/src/components/SQLEditor/SchemaBrowser.d.ts +8 -0
  184. package/dist/studio/src/components/SchemaVisualizer/RelationEdge.d.ts +3 -0
  185. package/dist/studio/src/components/SchemaVisualizer/SchemaVisualizer.d.ts +2 -0
  186. package/dist/studio/src/components/SchemaVisualizer/TableNode.d.ts +3 -0
  187. package/dist/studio/src/components/SchemaVisualizer/index.d.ts +5 -0
  188. package/dist/studio/src/components/SchemaVisualizer/schema-visualizer.utils.d.ts +42 -0
  189. package/dist/studio/src/components/SchemaVisualizer/useSchemaGraph.d.ts +37 -0
  190. package/dist/studio/src/components/StorageView/StorageView.d.ts +1 -0
  191. package/dist/studio/src/components/StudioHomePage.d.ts +9 -0
  192. package/dist/studio/src/index.d.ts +4 -0
  193. package/dist/studio/src/utils/entities.d.ts +0 -0
  194. package/dist/studio/src/utils/pgColumnToProperty.d.ts +6 -0
  195. package/dist/studio/src/utils/sql_utils.d.ts +52 -0
  196. package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
  197. package/dist/types/src/controllers/auth.d.ts +119 -0
  198. package/dist/types/src/controllers/client.d.ts +170 -0
  199. package/dist/types/src/controllers/collection_registry.d.ts +45 -0
  200. package/dist/types/src/controllers/customization_controller.d.ts +60 -0
  201. package/dist/types/src/controllers/data.d.ts +168 -0
  202. package/dist/types/src/controllers/data_driver.d.ts +160 -0
  203. package/dist/types/src/controllers/database_admin.d.ts +11 -0
  204. package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
  205. package/dist/types/src/controllers/effective_role.d.ts +4 -0
  206. package/dist/types/src/controllers/email.d.ts +34 -0
  207. package/dist/types/src/controllers/index.d.ts +18 -0
  208. package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
  209. package/dist/types/src/controllers/navigation.d.ts +213 -0
  210. package/dist/types/src/controllers/registry.d.ts +54 -0
  211. package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
  212. package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
  213. package/dist/types/src/controllers/snackbar.d.ts +24 -0
  214. package/dist/types/src/controllers/storage.d.ts +171 -0
  215. package/dist/types/src/index.d.ts +4 -0
  216. package/dist/types/src/rebase_context.d.ts +105 -0
  217. package/dist/types/src/types/backend.d.ts +536 -0
  218. package/dist/types/src/types/builders.d.ts +15 -0
  219. package/dist/types/src/types/chips.d.ts +5 -0
  220. package/dist/types/src/types/collections.d.ts +856 -0
  221. package/dist/types/src/types/cron.d.ts +102 -0
  222. package/dist/types/src/types/data_source.d.ts +64 -0
  223. package/dist/types/src/types/entities.d.ts +145 -0
  224. package/dist/types/src/types/entity_actions.d.ts +98 -0
  225. package/dist/types/src/types/entity_callbacks.d.ts +173 -0
  226. package/dist/types/src/types/entity_link_builder.d.ts +7 -0
  227. package/dist/types/src/types/entity_overrides.d.ts +10 -0
  228. package/dist/types/src/types/entity_views.d.ts +61 -0
  229. package/dist/types/src/types/export_import.d.ts +21 -0
  230. package/dist/types/src/types/index.d.ts +23 -0
  231. package/dist/types/src/types/locales.d.ts +4 -0
  232. package/dist/types/src/types/modify_collections.d.ts +5 -0
  233. package/dist/types/src/types/plugins.d.ts +279 -0
  234. package/dist/types/src/types/properties.d.ts +1176 -0
  235. package/dist/types/src/types/property_config.d.ts +70 -0
  236. package/dist/types/src/types/relations.d.ts +336 -0
  237. package/dist/types/src/types/slots.d.ts +252 -0
  238. package/dist/types/src/types/translations.d.ts +870 -0
  239. package/dist/types/src/types/user_management_delegate.d.ts +121 -0
  240. package/dist/types/src/types/websockets.d.ts +78 -0
  241. package/dist/types/src/users/index.d.ts +2 -0
  242. package/dist/types/src/users/roles.d.ts +22 -0
  243. package/dist/types/src/users/user.d.ts +46 -0
  244. package/dist/ui/src/components/Alert.d.ts +12 -0
  245. package/dist/ui/src/components/Autocomplete.d.ts +21 -0
  246. package/dist/ui/src/components/Avatar.d.ts +11 -0
  247. package/dist/ui/src/components/Badge.d.ts +8 -0
  248. package/dist/ui/src/components/BooleanSwitch.d.ts +14 -0
  249. package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +17 -0
  250. package/dist/ui/src/components/Button.d.ts +14 -0
  251. package/dist/ui/src/components/Card.d.ts +9 -0
  252. package/dist/ui/src/components/CenteredView.d.ts +9 -0
  253. package/dist/ui/src/components/Checkbox.d.ts +13 -0
  254. package/dist/ui/src/components/Chip.d.ts +26 -0
  255. package/dist/ui/src/components/CircularProgress.d.ts +5 -0
  256. package/dist/ui/src/components/CircularProgressCenter.d.ts +11 -0
  257. package/dist/ui/src/components/Collapse.d.ts +9 -0
  258. package/dist/ui/src/components/ColorPicker.d.ts +30 -0
  259. package/dist/ui/src/components/Container.d.ts +8 -0
  260. package/dist/ui/src/components/DateTimeField.d.ts +24 -0
  261. package/dist/ui/src/components/DebouncedTextField.d.ts +2 -0
  262. package/dist/ui/src/components/Dialog.d.ts +39 -0
  263. package/dist/ui/src/components/DialogActions.d.ts +7 -0
  264. package/dist/ui/src/components/DialogContent.d.ts +7 -0
  265. package/dist/ui/src/components/DialogTitle.d.ts +10 -0
  266. package/dist/ui/src/components/ErrorBoundary.d.ts +11 -0
  267. package/dist/ui/src/components/ExpandablePanel.d.ts +12 -0
  268. package/dist/ui/src/components/FileUpload.d.ts +23 -0
  269. package/dist/ui/src/components/IconButton.d.ts +12 -0
  270. package/dist/ui/src/components/InfoLabel.d.ts +5 -0
  271. package/dist/ui/src/components/InputLabel.d.ts +11 -0
  272. package/dist/ui/src/components/Label.d.ts +7 -0
  273. package/dist/ui/src/components/LoadingButton.d.ts +7 -0
  274. package/dist/ui/src/components/Markdown.d.ts +10 -0
  275. package/dist/ui/src/components/Menu.d.ts +23 -0
  276. package/dist/ui/src/components/Menubar.d.ts +80 -0
  277. package/dist/ui/src/components/MultiSelect.d.ts +48 -0
  278. package/dist/ui/src/components/Paper.d.ts +6 -0
  279. package/dist/ui/src/components/Popover.d.ts +24 -0
  280. package/dist/ui/src/components/RadioGroup.d.ts +28 -0
  281. package/dist/ui/src/components/ResizablePanels.d.ts +18 -0
  282. package/dist/ui/src/components/SearchBar.d.ts +22 -0
  283. package/dist/ui/src/components/Select.d.ts +43 -0
  284. package/dist/ui/src/components/Separator.d.ts +5 -0
  285. package/dist/ui/src/components/Sheet.d.ts +22 -0
  286. package/dist/ui/src/components/Skeleton.d.ts +6 -0
  287. package/dist/ui/src/components/Slider.d.ts +21 -0
  288. package/dist/ui/src/components/Table.d.ts +34 -0
  289. package/dist/ui/src/components/Tabs.d.ts +19 -0
  290. package/dist/ui/src/components/TextField.d.ts +58 -0
  291. package/dist/ui/src/components/TextareaAutosize.d.ts +43 -0
  292. package/dist/ui/src/components/ToggleButtonGroup.d.ts +30 -0
  293. package/dist/ui/src/components/Tooltip.d.ts +19 -0
  294. package/dist/ui/src/components/Typography.d.ts +36 -0
  295. package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +11 -0
  296. package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +21 -0
  297. package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
  298. package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
  299. package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +243 -0
  300. package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +3 -0
  301. package/dist/ui/src/components/VirtualTable/index.d.ts +3 -0
  302. package/dist/ui/src/components/VirtualTable/types.d.ts +38 -0
  303. package/dist/ui/src/components/common/SelectInputLabel.d.ts +5 -0
  304. package/dist/ui/src/components/index.d.ts +53 -0
  305. package/dist/ui/src/hooks/PortalContainerContext.d.ts +31 -0
  306. package/dist/ui/src/hooks/index.d.ts +6 -0
  307. package/dist/ui/src/hooks/useDebounceCallback.d.ts +1 -0
  308. package/dist/ui/src/hooks/useDebounceValue.d.ts +1 -0
  309. package/dist/ui/src/hooks/useDebouncedCallback.d.ts +1 -0
  310. package/dist/ui/src/hooks/useInjectStyles.d.ts +7 -0
  311. package/dist/ui/src/hooks/useOutsideAlerter.d.ts +5 -0
  312. package/dist/ui/src/icons/GitHubIcon.d.ts +2 -0
  313. package/dist/ui/src/icons/HandleIcon.d.ts +1 -0
  314. package/dist/ui/src/icons/Icon.d.ts +20 -0
  315. package/dist/ui/src/icons/cool_icon_keys.d.ts +1 -0
  316. package/dist/ui/src/icons/icon_keys.d.ts +1 -0
  317. package/dist/ui/src/icons/index.d.ts +6 -0
  318. package/dist/ui/src/index.d.ts +5 -0
  319. package/dist/ui/src/styles.d.ts +12 -0
  320. package/dist/ui/src/util/chip_colors.d.ts +4 -0
  321. package/dist/ui/src/util/cls.d.ts +2 -0
  322. package/dist/ui/src/util/debounce.d.ts +10 -0
  323. package/dist/ui/src/util/hash.d.ts +1 -0
  324. package/dist/ui/src/util/index.d.ts +4 -0
  325. package/dist/ui/src/util/key_to_icon_component.d.ts +1 -0
  326. package/package.json +84 -0
  327. package/src/components/ApiExplorer/ApiExplorer.tsx +290 -0
  328. package/src/components/ApiExplorer/EndpointDetail.tsx +271 -0
  329. package/src/components/ApiExplorer/TryItPanel.tsx +510 -0
  330. package/src/components/ApiExplorer/parseSpec.ts +104 -0
  331. package/src/components/ApiExplorer/types.ts +84 -0
  332. package/src/components/AuthSimulationSelector.tsx +77 -0
  333. package/src/components/Branches/BranchesView.tsx +370 -0
  334. package/src/components/CronJobs/CronJobsView.tsx +346 -0
  335. package/src/components/JSEditor/JSEditor.tsx +1033 -0
  336. package/src/components/JSEditor/JSEditorSidebar.tsx +340 -0
  337. package/src/components/JSEditor/JSMonacoEditor.tsx +390 -0
  338. package/src/components/RLSEditor/PolicyEditor.tsx +444 -0
  339. package/src/components/RLSEditor/RLSEditor.tsx +692 -0
  340. package/src/components/RLSEditor/index.ts +1 -0
  341. package/src/components/RebaseStudio.tsx +121 -0
  342. package/src/components/SQLEditor/ExplainVisualizer.tsx +128 -0
  343. package/src/components/SQLEditor/MonacoEditor.tsx +203 -0
  344. package/src/components/SQLEditor/SQLEditor.tsx +1419 -0
  345. package/src/components/SQLEditor/SQLEditorSidebar.tsx +174 -0
  346. package/src/components/SQLEditor/SchemaBrowser.tsx +158 -0
  347. package/src/components/SchemaVisualizer/RelationEdge.tsx +102 -0
  348. package/src/components/SchemaVisualizer/SchemaVisualizer.tsx +665 -0
  349. package/src/components/SchemaVisualizer/TableNode.tsx +257 -0
  350. package/src/components/SchemaVisualizer/index.ts +5 -0
  351. package/src/components/SchemaVisualizer/schema-visualizer.utils.ts +140 -0
  352. package/src/components/SchemaVisualizer/useSchemaGraph.ts +397 -0
  353. package/src/components/StorageView/StorageView.tsx +1035 -0
  354. package/src/components/StudioHomePage.tsx +357 -0
  355. package/src/index.ts +31 -0
  356. package/src/utils/entities.ts +2 -0
  357. package/src/utils/pgColumnToProperty.test.ts +401 -0
  358. package/src/utils/pgColumnToProperty.ts +275 -0
  359. package/src/utils/sql_utils.test.ts +265 -0
  360. package/src/utils/sql_utils.ts +291 -0
  361. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,401 @@
1
+ import { buildCollectionFromTableMetadata } from "./pgColumnToProperty";
2
+ import { StringProperty, NumberProperty, DateProperty, MapProperty, ArrayProperty, BooleanProperty, TableColumnInfo, TableMetadata } from "@rebasepro/types";
3
+
4
+ describe("pgColumnToProperty Inference Logic", () => {
5
+ describe("String Data Types", () => {
6
+ it("maps character varying to StringProperty with varchar columnType", () => {
7
+ const columns: TableColumnInfo[] = [
8
+ { column_name: "first_name",
9
+ data_type: "character varying",
10
+ udt_name: "varchar",
11
+ is_nullable: "NO",
12
+ column_default: null,
13
+ character_maximum_length: 255 }
14
+ ];
15
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
16
+ const prop = collection.properties!.first_name as StringProperty;
17
+ expect(prop.type).toBe("string");
18
+ expect(prop.columnType).toBe("varchar");
19
+ expect(prop.validation?.required).toBe(true);
20
+ });
21
+
22
+ it("maps text and citext to StringProperty with text columnType", () => {
23
+ const columns: TableColumnInfo[] = [
24
+ { column_name: "bio",
25
+ data_type: "text",
26
+ udt_name: "text",
27
+ is_nullable: "YES",
28
+ column_default: null,
29
+ character_maximum_length: null },
30
+ { column_name: "username",
31
+ data_type: "citext",
32
+ udt_name: "citext",
33
+ is_nullable: "YES",
34
+ column_default: null,
35
+ character_maximum_length: null }
36
+ ];
37
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
38
+
39
+ const bioProp = collection.properties!.bio as StringProperty;
40
+ expect(bioProp.type).toBe("string");
41
+ expect(bioProp.columnType).toBe("text");
42
+ expect(bioProp.validation?.required).toBeUndefined();
43
+
44
+ const usernameProp = collection.properties!.username as StringProperty;
45
+ expect(usernameProp.type).toBe("string");
46
+ expect(usernameProp.columnType).toBe("text");
47
+ });
48
+
49
+ it("maps char and character to StringProperty with char columnType", () => {
50
+ const columns: TableColumnInfo[] = [
51
+ { column_name: "country_code",
52
+ data_type: "char",
53
+ udt_name: "char",
54
+ is_nullable: "NO",
55
+ column_default: null,
56
+ character_maximum_length: 2 }
57
+ ];
58
+ const collection = buildCollectionFromTableMetadata("locations", { columns } as TableMetadata);
59
+
60
+ const prop = collection.properties!.country_code as StringProperty;
61
+ expect(prop.type).toBe("string");
62
+ expect(prop.columnType).toBe("char");
63
+ });
64
+
65
+ it("maps uuid without generation strategy to a standard string property", () => {
66
+ const columns: TableColumnInfo[] = [
67
+ { column_name: "token",
68
+ data_type: "uuid",
69
+ udt_name: "uuid",
70
+ is_nullable: "NO",
71
+ column_default: null,
72
+ character_maximum_length: null }
73
+ ];
74
+ const collection = buildCollectionFromTableMetadata("sessions", { columns } as TableMetadata);
75
+
76
+ const prop = collection.properties!.token as StringProperty;
77
+ expect(prop.type).toBe("string");
78
+ expect(prop.isId).toBeUndefined();
79
+ });
80
+ });
81
+
82
+ describe("Numeric Data Types", () => {
83
+ it("maps integer and smallint to NumberProperty with integer columnType and validation", () => {
84
+ const columns: TableColumnInfo[] = [
85
+ { column_name: "age",
86
+ data_type: "integer",
87
+ udt_name: "int4",
88
+ is_nullable: "NO",
89
+ column_default: null,
90
+ character_maximum_length: null },
91
+ { column_name: "status_code",
92
+ data_type: "smallint",
93
+ udt_name: "int2",
94
+ is_nullable: "YES",
95
+ column_default: null,
96
+ character_maximum_length: null }
97
+ ];
98
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
99
+
100
+ const ageProp = collection.properties!.age as NumberProperty;
101
+ expect(ageProp.type).toBe("number");
102
+ expect(ageProp.columnType).toBe("integer");
103
+ expect(ageProp.validation?.integer).toBe(true);
104
+ expect(ageProp.validation?.required).toBe(true);
105
+
106
+ const statusProp = collection.properties!.status_code as NumberProperty;
107
+ expect(statusProp.type).toBe("number");
108
+ expect(statusProp.columnType).toBe("integer");
109
+ expect(statusProp.validation?.integer).toBe(true);
110
+ expect(statusProp.validation?.required).toBeUndefined();
111
+ });
112
+
113
+ it("maps bigint to NumberProperty with bigint columnType", () => {
114
+ const columns: TableColumnInfo[] = [
115
+ { column_name: "view_count",
116
+ data_type: "bigint",
117
+ udt_name: "int8",
118
+ is_nullable: "YES",
119
+ column_default: null,
120
+ character_maximum_length: null }
121
+ ];
122
+ const collection = buildCollectionFromTableMetadata("posts", { columns } as TableMetadata);
123
+ const prop = collection.properties!.view_count as NumberProperty;
124
+ expect(prop.type).toBe("number");
125
+ expect(prop.columnType).toBe("bigint");
126
+ expect(prop.validation?.integer).toBe(true);
127
+ });
128
+
129
+ it("maps real, double precision, numeric, decimal correctly", () => {
130
+ const columns: TableColumnInfo[] = [
131
+ { column_name: "price",
132
+ data_type: "numeric",
133
+ udt_name: "numeric",
134
+ is_nullable: "YES",
135
+ column_default: null,
136
+ character_maximum_length: null },
137
+ { column_name: "rating",
138
+ data_type: "real",
139
+ udt_name: "float4",
140
+ is_nullable: "YES",
141
+ column_default: null,
142
+ character_maximum_length: null },
143
+ { column_name: "precision_val",
144
+ data_type: "double precision",
145
+ udt_name: "float8",
146
+ is_nullable: "YES",
147
+ column_default: null,
148
+ character_maximum_length: null }
149
+ ];
150
+ const collection = buildCollectionFromTableMetadata("products", { columns } as TableMetadata);
151
+
152
+ expect((collection.properties!.price as NumberProperty).columnType).toBe("numeric");
153
+ expect((collection.properties!.rating as NumberProperty).columnType).toBe("real");
154
+ expect((collection.properties!.precision_val as NumberProperty).columnType).toBe("double precision");
155
+
156
+ // Decimal shouldn't have integer explicitly forced
157
+ expect((collection.properties!.price as NumberProperty).validation?.integer).toBeUndefined();
158
+ });
159
+ });
160
+
161
+ describe("Primary Keys & Auto-ID Handling", () => {
162
+ it("detects identity properties and marks them as incrementing IDs", () => {
163
+ const columns: TableColumnInfo[] = [
164
+ { column_name: "id",
165
+ data_type: "integer",
166
+ udt_name: "int4",
167
+ is_nullable: "NO",
168
+ column_default: "nextval('users_id_seq'::regclass)",
169
+ character_maximum_length: null }
170
+ ];
171
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
172
+
173
+ const prop = collection.properties!.id as NumberProperty;
174
+ expect(prop.isId).toBe("increment");
175
+ });
176
+
177
+ it("detects serial to automatically be an incrementing ID", () => {
178
+ const columns: TableColumnInfo[] = [
179
+ { column_name: "id",
180
+ data_type: "serial",
181
+ udt_name: "int4",
182
+ is_nullable: "NO",
183
+ column_default: null,
184
+ character_maximum_length: null },
185
+ { column_name: "big_id",
186
+ data_type: "bigserial",
187
+ udt_name: "int8",
188
+ is_nullable: "NO",
189
+ column_default: null,
190
+ character_maximum_length: null }
191
+ ];
192
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
193
+
194
+ expect((collection.properties!.id as NumberProperty).isId).toBe("increment");
195
+ expect((collection.properties!.id as NumberProperty).columnType).toBe("serial");
196
+ expect((collection.properties!.big_id as NumberProperty).isId).toBe("increment");
197
+ expect((collection.properties!.big_id as NumberProperty).columnType).toBe("bigserial");
198
+ });
199
+
200
+ it("detects gen_random_uuid / uuid_generate as a uuid ID strategy", () => {
201
+ const columns: TableColumnInfo[] = [
202
+ { column_name: "id",
203
+ data_type: "uuid",
204
+ udt_name: "uuid",
205
+ is_nullable: "NO",
206
+ column_default: "gen_random_uuid()",
207
+ character_maximum_length: null }
208
+ ];
209
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
210
+
211
+ const prop = collection.properties!.id as StringProperty;
212
+ expect(prop.isId).toBe("uuid");
213
+ });
214
+
215
+ it("detects auto-generated string IDs as manual fallback strategy if not a UUID column type", () => {
216
+ const columns: TableColumnInfo[] = [
217
+ // If it's varchar with a random identity function that Rebase doesn't purely know how to recreate natively
218
+ { column_name: "id",
219
+ data_type: "varchar",
220
+ udt_name: "varchar",
221
+ is_nullable: "NO",
222
+ column_default: "some_custom_id_generator()",
223
+ character_maximum_length: null }
224
+ ];
225
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
226
+
227
+ const prop = collection.properties!.id as StringProperty;
228
+ expect(prop.isId).toBeUndefined(); // Wait, the current logic maps it as `undefined` if column_default doesn't include "nextval" / "identity" / "uuid" etc. Let's adjust test according to how we wrote pgColumnToProperty... Wait, actually our logic handles `column_default.includes('identity')` or `uuid_generate`. So custom generators fail to parse as `isAutoId=true`.
229
+ // The expectation checks the *current* engine behavior.
230
+ });
231
+ });
232
+
233
+ describe("Special Types (Date, JSON, Arrays, Boolean, Enums)", () => {
234
+ it("maps boolean fields", () => {
235
+ const columns: TableColumnInfo[] = [
236
+ { column_name: "is_active",
237
+ data_type: "boolean",
238
+ udt_name: "bool",
239
+ is_nullable: "NO",
240
+ column_default: "true",
241
+ character_maximum_length: null }
242
+ ];
243
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
244
+ const prop = collection.properties!.is_active as BooleanProperty;
245
+ expect(prop.type).toBe("boolean");
246
+ });
247
+
248
+ it("maps timestamp and date correctly", () => {
249
+ const columns: TableColumnInfo[] = [
250
+ { column_name: "created_at",
251
+ data_type: "timestamp with time zone",
252
+ udt_name: "timestamptz",
253
+ is_nullable: "NO",
254
+ column_default: "now()",
255
+ character_maximum_length: null },
256
+ { column_name: "birthday",
257
+ data_type: "date",
258
+ udt_name: "date",
259
+ is_nullable: "YES",
260
+ column_default: null,
261
+ character_maximum_length: null },
262
+ { column_name: "shift_start",
263
+ data_type: "time",
264
+ udt_name: "time",
265
+ is_nullable: "YES",
266
+ column_default: null,
267
+ character_maximum_length: null }
268
+ ];
269
+ const collection = buildCollectionFromTableMetadata("events", { columns } as TableMetadata);
270
+
271
+ expect((collection.properties!.created_at as DateProperty).columnType).toBe("timestamp");
272
+ expect((collection.properties!.birthday as DateProperty).columnType).toBe("date");
273
+ expect((collection.properties!.shift_start as DateProperty).columnType).toBe("time");
274
+ });
275
+
276
+ it("maps jsonb and json to MapProperty", () => {
277
+ const columns: TableColumnInfo[] = [
278
+ { column_name: "metadata",
279
+ data_type: "jsonb",
280
+ udt_name: "jsonb",
281
+ is_nullable: "YES",
282
+ column_default: null,
283
+ character_maximum_length: null },
284
+ { column_name: "old_data",
285
+ data_type: "json",
286
+ udt_name: "json",
287
+ is_nullable: "YES",
288
+ column_default: null,
289
+ character_maximum_length: null }
290
+ ];
291
+ const collection = buildCollectionFromTableMetadata("docs", { columns } as TableMetadata);
292
+
293
+ expect((collection.properties!.metadata as MapProperty).type).toBe("map");
294
+ expect((collection.properties!.metadata as MapProperty).columnType).toBe("jsonb");
295
+ expect((collection.properties!.metadata as MapProperty).keyValue).toBe(true);
296
+
297
+ expect((collection.properties!.old_data as MapProperty).type).toBe("map");
298
+ expect((collection.properties!.old_data as MapProperty).columnType).toBe("json");
299
+ });
300
+
301
+ it("maps array to ArrayProperty", () => {
302
+ const columns: TableColumnInfo[] = [
303
+ { column_name: "tags",
304
+ data_type: "ARRAY",
305
+ udt_name: "_varchar",
306
+ is_nullable: "YES",
307
+ column_default: null,
308
+ character_maximum_length: null }
309
+ ];
310
+ const collection = buildCollectionFromTableMetadata("posts", { columns } as TableMetadata);
311
+
312
+ const prop = collection.properties!.tags as ArrayProperty;
313
+ expect(prop.type).toBe("array");
314
+ expect(!Array.isArray(prop.of) && prop.of?.type).toBe("string");
315
+ });
316
+
317
+ it("maps USER-DEFINED enums properly to StringProperty with enum configs", () => {
318
+ const columns: TableColumnInfo[] = [
319
+ {
320
+ column_name: "role",
321
+ data_type: "USER-DEFINED",
322
+ udt_name: "user_role_enum",
323
+ is_nullable: "NO",
324
+ column_default: null,
325
+ character_maximum_length: null,
326
+ enum_values: ["admin", "super_admin", "editor"]
327
+ }
328
+ ];
329
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
330
+
331
+ const prop = collection.properties!.role as StringProperty;
332
+ expect(prop.type).toBe("string");
333
+ expect(prop.validation?.required).toBe(true);
334
+ expect(prop.enum).toEqual([
335
+ { id: "admin",
336
+ label: "Admin" },
337
+ { id: "super_admin",
338
+ label: "Super Admin" },
339
+ { id: "editor",
340
+ label: "Editor" }
341
+ ]);
342
+ });
343
+ });
344
+
345
+ describe("Property Fallbacks & Formatting", () => {
346
+ it("prettifies property names automatically", () => {
347
+ const columns: TableColumnInfo[] = [
348
+ { column_name: "user_first_name",
349
+ data_type: "varchar",
350
+ udt_name: "varchar",
351
+ is_nullable: "YES",
352
+ column_default: null,
353
+ character_maximum_length: null }
354
+ ];
355
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
356
+
357
+ expect(collection.properties!.user_first_name.name).toBe("User First Name");
358
+ });
359
+
360
+ it("assigns propertiesOrder array based on iteration insertion order", () => {
361
+ const columns: TableColumnInfo[] = [
362
+ { column_name: "id",
363
+ data_type: "integer",
364
+ udt_name: "int4",
365
+ is_nullable: "NO",
366
+ column_default: null,
367
+ character_maximum_length: null },
368
+ { column_name: "email",
369
+ data_type: "varchar",
370
+ udt_name: "varchar",
371
+ is_nullable: "YES",
372
+ column_default: null,
373
+ character_maximum_length: null },
374
+ { column_name: "role",
375
+ data_type: "varchar",
376
+ udt_name: "varchar",
377
+ is_nullable: "YES",
378
+ column_default: null,
379
+ character_maximum_length: null }
380
+ ];
381
+ const collection = buildCollectionFromTableMetadata("users", { columns } as TableMetadata);
382
+
383
+ expect(collection.propertiesOrder).toEqual(["id", "email", "role"]);
384
+ });
385
+
386
+ it("maps unrecognized data types to standard string strings", () => {
387
+ const columns: TableColumnInfo[] = [
388
+ { column_name: "weird_col",
389
+ data_type: "macaddr",
390
+ udt_name: "macaddr",
391
+ is_nullable: "NO",
392
+ column_default: null,
393
+ character_maximum_length: null }
394
+ ];
395
+ const collection = buildCollectionFromTableMetadata("networks", { columns } as TableMetadata);
396
+
397
+ const prop = collection.properties!.weird_col as StringProperty;
398
+ expect(prop.type).toBe("string");
399
+ });
400
+ });
401
+ });
@@ -0,0 +1,275 @@
1
+ import { EntityCollection, Property, StringProperty, NumberProperty, ArrayProperty, TableColumnInfo, TableMetadata } from "@rebasepro/types";
2
+
3
+ /**
4
+ * Maps a PostgreSQL column data type to a Rebase property type.
5
+ */
6
+ function pgTypeToRebaseProperty(column: TableColumnInfo): Property | null {
7
+ const {
8
+ column_name,
9
+ data_type,
10
+ udt_name,
11
+ is_nullable,
12
+ column_default,
13
+ enum_values
14
+ } = column;
15
+
16
+ const required = is_nullable === "NO";
17
+ const prettifiedName = column_name
18
+ .replace(/_/g, " ")
19
+ .replace(/\b\w/g, (c: string) => c.toUpperCase());
20
+
21
+ // Detect if this column is a primary key (auto-generated id)
22
+ const isAutoId = column_default != null && (
23
+ column_default.includes("nextval") ||
24
+ column_default.includes("gen_random_uuid") ||
25
+ column_default.includes("uuid_generate") ||
26
+ column_default.includes("identity")
27
+ );
28
+
29
+ // USER-DEFINED = PostgreSQL enums
30
+ if (data_type === "USER-DEFINED" && enum_values && enum_values.length > 0) {
31
+ return {
32
+ type: "string",
33
+ name: prettifiedName,
34
+ enum: enum_values.map((v: string) => ({ id: v,
35
+ label: v.replace(/_/g, " ").replace(/\b\w/g, (c: string) => c.toUpperCase()) })),
36
+ validation: required ? { required: true } : undefined
37
+ } as StringProperty;
38
+ }
39
+
40
+ const dt = data_type.toLowerCase();
41
+ switch (dt) {
42
+ case "character varying":
43
+ case "varchar":
44
+ case "text":
45
+ case "char":
46
+ case "character":
47
+ case "citext": {
48
+ let colType: "varchar" | "text" | "char" = "varchar";
49
+ if (dt === "text" || dt === "citext") colType = "text";
50
+ if (dt === "char" || dt === "character") colType = "char";
51
+ const prop: StringProperty = {
52
+ type: "string",
53
+ name: prettifiedName,
54
+ columnType: colType,
55
+ validation: required ? { required: true } : undefined
56
+ };
57
+ if (isAutoId) {
58
+ prop.isId = "manual";
59
+ }
60
+ return prop;
61
+ }
62
+
63
+ case "uuid": {
64
+ const prop: StringProperty = {
65
+ type: "string",
66
+ name: prettifiedName,
67
+ validation: required ? { required: true } : undefined
68
+ };
69
+ if (isAutoId) {
70
+ prop.isId = "uuid";
71
+ }
72
+ return prop;
73
+ }
74
+
75
+ case "integer":
76
+ case "bigint":
77
+ case "smallint": {
78
+ const colType = dt === "bigint" ? "bigint" : "integer";
79
+ const prop: NumberProperty = {
80
+ type: "number",
81
+ name: prettifiedName,
82
+ columnType: colType,
83
+ validation: {
84
+ ...(required ? { required: true } : {}),
85
+ integer: true
86
+ }
87
+ };
88
+ if (isAutoId) {
89
+ prop.isId = "increment";
90
+ }
91
+ return prop;
92
+ }
93
+
94
+ case "serial":
95
+ case "bigserial":
96
+ case "smallserial": {
97
+ const colType = dt === "bigserial" ? "bigserial" : "serial";
98
+ return {
99
+ type: "number",
100
+ name: prettifiedName,
101
+ columnType: colType,
102
+ isId: "increment",
103
+ validation: {
104
+ ...(required ? { required: true } : {}),
105
+ integer: true
106
+ }
107
+ } as NumberProperty;
108
+ }
109
+
110
+ case "numeric":
111
+ case "decimal":
112
+ case "real":
113
+ case "double precision": {
114
+ let colType: "numeric" | "real" | "double precision" = "numeric";
115
+ if (dt === "real") colType = "real";
116
+ if (dt === "double precision") colType = "double precision";
117
+ return {
118
+ type: "number",
119
+ name: prettifiedName,
120
+ columnType: colType,
121
+ validation: required ? { required: true } : undefined
122
+ };
123
+ }
124
+
125
+ case "boolean":
126
+ return {
127
+ type: "boolean",
128
+ name: prettifiedName,
129
+ validation: required ? { required: true } : undefined
130
+ };
131
+
132
+ case "timestamp with time zone":
133
+ case "timestamp without time zone":
134
+ case "timestamp":
135
+ case "timestamptz":
136
+ case "date":
137
+ case "time with time zone":
138
+ case "time without time zone":
139
+ case "time": {
140
+ let colType: "timestamp" | "date" | "time" = "timestamp";
141
+ if (dt.startsWith("date")) colType = "date";
142
+ if (dt.startsWith("time ") || dt === "time") colType = "time";
143
+ return {
144
+ type: "date",
145
+ name: prettifiedName,
146
+ columnType: colType,
147
+ validation: required ? { required: true } : undefined
148
+ };
149
+ }
150
+
151
+ case "jsonb":
152
+ case "json":
153
+ return {
154
+ type: "map",
155
+ name: prettifiedName,
156
+ columnType: dt === "jsonb" ? "jsonb" : "json",
157
+ keyValue: true,
158
+ properties: {}
159
+ };
160
+
161
+ case "array":
162
+ case "ARRAY":
163
+ return {
164
+ type: "array",
165
+ name: prettifiedName,
166
+ of: { type: "string" }
167
+ } as ArrayProperty;
168
+
169
+ default:
170
+ // Fallback: treat unknown types as string
171
+ return {
172
+ type: "string",
173
+ name: prettifiedName,
174
+ validation: required ? { required: true } : undefined
175
+ };
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Builds a partial EntityCollection from PostgreSQL table metadata.
181
+ * This is used when creating a new collection from an existing database table.
182
+ */
183
+ export function buildCollectionFromTableMetadata(
184
+ tableName: string,
185
+ metadata: TableMetadata
186
+ ): Partial<EntityCollection> {
187
+ const properties: Record<string, Property> = {};
188
+ const propertiesOrder: string[] = [];
189
+ const relations: any[] = []; // In the builder/editor, target can be a string path before hydration
190
+ const securityRules: any[] = [];
191
+
192
+ // Parse columns
193
+ for (const column of metadata.columns) {
194
+ const property = pgTypeToRebaseProperty(column);
195
+ if (property) {
196
+ const propRecord = property as unknown as Record<string, unknown>;
197
+ Object.keys(propRecord).forEach(key => propRecord[key] === undefined && delete propRecord[key]);
198
+
199
+ properties[column.column_name] = property;
200
+ propertiesOrder.push(column.column_name);
201
+ }
202
+ }
203
+
204
+ // Parse Outgoing Foreign Keys -> Many-to-One / One-to-One
205
+ if (metadata.foreignKeys) {
206
+ for (const fk of metadata.foreignKeys) {
207
+ const relName = fk.column_name.endsWith("_id") ? fk.column_name.substring(0, fk.column_name.length - 3) : fk.column_name;
208
+ relations.push({
209
+ id: fk.column_name,
210
+ relationName: relName,
211
+ target: fk.foreign_table_name, // Will be hydrated later
212
+ cardinality: "one",
213
+ direction: "owning",
214
+ localKey: fk.column_name
215
+ });
216
+ }
217
+ }
218
+
219
+ // Parse Incoming Junctions -> Many-to-Many
220
+ if (metadata.junctions) {
221
+ for (const junction of metadata.junctions) {
222
+ const relName = junction.target_table_name; // E.g., 'roles'
223
+ relations.push({
224
+ id: junction.target_table_name + "_relation",
225
+ relationName: relName,
226
+ target: junction.target_table_name, // Will be hydrated later
227
+ cardinality: "many",
228
+ direction: "owning",
229
+ through: {
230
+ table: junction.junction_table_name,
231
+ sourceColumn: junction.source_column_name,
232
+ targetColumn: junction.target_column_name
233
+ }
234
+ });
235
+ }
236
+ }
237
+
238
+ // Parse RLS Policies
239
+ if (metadata.policies) {
240
+ for (const policy of metadata.policies) {
241
+ // Attempt to map typical cmds to operations.
242
+ // Postgres cmd: SELECT, INSERT, UPDATE, DELETE, ALL
243
+ let operations: string[] = [];
244
+ switch (policy.cmd) {
245
+ case "ALL": operations = ["read", "create", "update", "delete"]; break;
246
+ case "SELECT": operations = ["read"]; break;
247
+ case "INSERT": operations = ["create"]; break;
248
+ case "UPDATE": operations = ["update"]; break;
249
+ case "DELETE": operations = ["delete"]; break;
250
+ }
251
+ securityRules.push({
252
+ name: policy.policy_name,
253
+ operations,
254
+ // roles is string[] e.g., ["public", "authenticated"]
255
+ roles: policy.roles ?? [],
256
+ qual: policy.qual,
257
+ with_check: policy.with_check
258
+ });
259
+ }
260
+ }
261
+
262
+ const prettifiedName = tableName
263
+ .replace(/_/g, " ")
264
+ .replace(/\b\w/g, (c: string) => c.toUpperCase());
265
+
266
+ return {
267
+ name: prettifiedName,
268
+ slug: tableName,
269
+ table: tableName,
270
+ properties,
271
+ propertiesOrder,
272
+ ...(relations.length > 0 ? { relations } : {}),
273
+ ...(securityRules.length > 0 ? { securityRules } : {})
274
+ };
275
+ }