@rebasepro/studio 0.6.1 → 0.7.0

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 (30) hide show
  1. package/dist/ApiKeysView-D-_FSlNL.js +684 -0
  2. package/dist/ApiKeysView-D-_FSlNL.js.map +1 -0
  3. package/dist/{BranchesView-DncIRcZt.js → BranchesView-Dlg78EQ8.js} +4 -5
  4. package/dist/{BranchesView-DncIRcZt.js.map → BranchesView-Dlg78EQ8.js.map} +1 -1
  5. package/dist/{JSEditor-BhAbEjCP.js → JSEditor-DSucz6wV.js} +4 -4
  6. package/dist/{JSEditor-BhAbEjCP.js.map → JSEditor-DSucz6wV.js.map} +1 -1
  7. package/dist/{LogsExplorer-CqtKILj8.js → LogsExplorer-J4xfsuv3.js} +49 -83
  8. package/dist/LogsExplorer-J4xfsuv3.js.map +1 -0
  9. package/dist/{RLSEditor-DpF1u9EC.js → RLSEditor-BM64laoW.js} +294 -107
  10. package/dist/RLSEditor-BM64laoW.js.map +1 -0
  11. package/dist/{SQLEditor-BLuq_zDM.js → SQLEditor-CuAhR-zr.js} +4 -4
  12. package/dist/{SQLEditor-BLuq_zDM.js.map → SQLEditor-CuAhR-zr.js.map} +1 -1
  13. package/dist/{SchemaVisualizer-BJK2u3C0.js → SchemaVisualizer-OibKoD3g.js} +2 -2
  14. package/dist/{SchemaVisualizer-BJK2u3C0.js.map → SchemaVisualizer-OibKoD3g.js.map} +1 -1
  15. package/dist/components/ApiKeys/ApiKeysView.d.ts +2 -0
  16. package/dist/index.es.js +37 -18
  17. package/dist/index.es.js.map +1 -1
  18. package/dist/index.umd.js +1154 -305
  19. package/dist/index.umd.js.map +1 -1
  20. package/package.json +17 -17
  21. package/src/components/ApiKeys/ApiKeysView.tsx +580 -0
  22. package/src/components/Branches/BranchesView.tsx +3 -4
  23. package/src/components/JSEditor/JSEditorSidebar.tsx +3 -3
  24. package/src/components/LogsExplorer/LogsExplorer.tsx +46 -84
  25. package/src/components/RLSEditor/RLSEditor.tsx +354 -117
  26. package/src/components/RebaseStudio.tsx +10 -1
  27. package/src/components/SQLEditor/SchemaBrowser.tsx +3 -3
  28. package/src/components/StudioHomePage.tsx +5 -1
  29. package/dist/LogsExplorer-CqtKILj8.js.map +0 -1
  30. package/dist/RLSEditor-DpF1u9EC.js.map +0 -1
@@ -1,32 +1,32 @@
1
1
  import { useCallback, useEffect, useRef, useState } from "react";
2
- import { Checkbox, Label, Select, SelectItem, TextField } from "@rebasepro/ui";
2
+ import { Checkbox, Label, Select, SelectItem, TextField, Typography, cls, defaultBorderMixin } from "@rebasepro/ui";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/components/LogsExplorer/LogsExplorer.tsx
5
5
  var LEVEL_COLORS = {
6
- debug: "#6c7086",
7
- info: "#89b4fa",
8
- warn: "#f9e2af",
9
- error: "#f38ba8"
6
+ debug: "text-surface-500",
7
+ info: "text-blue-600 dark:text-blue-500",
8
+ warn: "text-amber-600 dark:text-amber-500",
9
+ error: "text-red-600 dark:text-red-500"
10
10
  };
11
11
  var SOURCE_COLORS = {
12
- api: "#74c7ec",
13
- auth: "#cba6f7",
14
- storage: "#a6e3a1",
15
- realtime: "#fab387",
16
- system: "#6c7086"
12
+ api: "text-sky-600 dark:text-sky-400",
13
+ auth: "text-purple-600 dark:text-purple-400",
14
+ storage: "text-green-600 dark:text-green-500",
15
+ realtime: "text-orange-600 dark:text-orange-400",
16
+ system: "text-surface-600 dark:text-surface-400"
17
17
  };
18
18
  function LogsExplorer() {
19
19
  const [logs, setLogs] = useState([]);
20
- const [level, setLevel] = useState("");
21
- const [source, setSource] = useState("");
20
+ const [level, setLevel] = useState("all");
21
+ const [source, setSource] = useState("all");
22
22
  const [search, setSearch] = useState("");
23
23
  const [autoScroll, setAutoScroll] = useState(true);
24
24
  const containerRef = useRef(null);
25
25
  const fetchLogs = useCallback(async () => {
26
26
  try {
27
27
  const params = new URLSearchParams();
28
- if (level) params.set("level", level);
29
- if (source) params.set("source", source);
28
+ if (level && level !== "all") params.set("level", level);
29
+ if (source && source !== "all") params.set("source", source);
30
30
  if (search) params.set("search", search);
31
31
  params.set("limit", "200");
32
32
  const resp = await fetch(`/api/logs?${params}`);
@@ -63,22 +63,9 @@ function LogsExplorer() {
63
63
  if (autoScroll && containerRef.current) containerRef.current.scrollTop = containerRef.current.scrollHeight;
64
64
  }, [logs, autoScroll]);
65
65
  return /* @__PURE__ */ jsxs("div", {
66
- style: {
67
- display: "flex",
68
- flexDirection: "column",
69
- height: "calc(100vh - 64px)",
70
- background: "#1e1e2e",
71
- color: "#cdd6f4"
72
- },
66
+ className: "flex flex-col h-[calc(100vh-64px)] w-full bg-surface-50 dark:bg-surface-800",
73
67
  children: [/* @__PURE__ */ jsxs("div", {
74
- style: {
75
- display: "flex",
76
- gap: 8,
77
- padding: "8px 16px",
78
- borderBottom: "1px solid #313244",
79
- alignItems: "center",
80
- flexWrap: "wrap"
81
- },
68
+ className: cls("flex gap-2 p-3 border-b items-center flex-wrap shrink-0", defaultBorderMixin),
82
69
  children: [
83
70
  /* @__PURE__ */ jsxs(Select, {
84
71
  value: level,
@@ -87,7 +74,7 @@ function LogsExplorer() {
87
74
  placeholder: "All Levels",
88
75
  children: [
89
76
  /* @__PURE__ */ jsx(SelectItem, {
90
- value: "",
77
+ value: "all",
91
78
  children: "All Levels"
92
79
  }),
93
80
  /* @__PURE__ */ jsx(SelectItem, {
@@ -115,7 +102,7 @@ function LogsExplorer() {
115
102
  placeholder: "All Sources",
116
103
  children: [
117
104
  /* @__PURE__ */ jsx(SelectItem, {
118
- value: "",
105
+ value: "all",
119
106
  children: "All Sources"
120
107
  }),
121
108
  /* @__PURE__ */ jsx(SelectItem, {
@@ -148,7 +135,7 @@ function LogsExplorer() {
148
135
  className: "flex-1 min-w-[200px]"
149
136
  }),
150
137
  /* @__PURE__ */ jsxs("div", {
151
- className: "flex items-center gap-1.5 cursor-pointer",
138
+ className: "flex items-center gap-1.5 cursor-pointer ml-2",
152
139
  children: [/* @__PURE__ */ jsx(Checkbox, {
153
140
  id: "auto-scroll",
154
141
  checked: autoScroll,
@@ -157,79 +144,58 @@ function LogsExplorer() {
157
144
  padding: false
158
145
  }), /* @__PURE__ */ jsx(Label, {
159
146
  htmlFor: "auto-scroll",
160
- className: "text-xs select-none cursor-pointer",
147
+ className: "text-xs select-none cursor-pointer text-surface-600 dark:text-surface-400",
161
148
  children: "Auto-scroll"
162
149
  })]
163
150
  }),
164
- /* @__PURE__ */ jsxs("span", {
165
- style: {
166
- fontSize: 12,
167
- color: "#6c7086"
168
- },
169
- children: [logs.length, " entries"]
151
+ /* @__PURE__ */ jsx("div", {
152
+ className: "ml-auto pl-4",
153
+ children: /* @__PURE__ */ jsxs(Typography, {
154
+ variant: "caption",
155
+ color: "secondary",
156
+ children: [logs.length, " entries"]
157
+ })
170
158
  })
171
159
  ]
172
160
  }), /* @__PURE__ */ jsxs("div", {
173
161
  ref: containerRef,
174
- style: {
175
- flex: 1,
176
- overflow: "auto",
177
- fontFamily: "monospace",
178
- fontSize: 12,
179
- padding: "8px 0"
180
- },
162
+ className: "flex-1 overflow-auto py-2",
181
163
  children: [logs.map((log) => /* @__PURE__ */ jsxs("div", {
182
- style: {
183
- padding: "2px 16px",
184
- display: "flex",
185
- gap: 8,
186
- borderBottom: "1px solid #181825"
187
- },
164
+ className: cls("flex gap-4 px-4 py-[6px] border-b hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors", defaultBorderMixin),
188
165
  children: [
189
- /* @__PURE__ */ jsx("span", {
190
- style: {
191
- color: "#6c7086",
192
- flexShrink: 0
193
- },
166
+ /* @__PURE__ */ jsx(Typography, {
167
+ variant: "body2",
168
+ color: "secondary",
169
+ className: "w-[72px] shrink-0 font-mono",
194
170
  children: new Date(log.timestamp).toLocaleTimeString()
195
171
  }),
196
- /* @__PURE__ */ jsx("span", {
197
- style: {
198
- color: LEVEL_COLORS[log.level] || "#cdd6f4",
199
- width: 40,
200
- flexShrink: 0,
201
- textTransform: "uppercase",
202
- fontWeight: 600
203
- },
172
+ /* @__PURE__ */ jsx(Typography, {
173
+ variant: "body2",
174
+ className: cls("w-[48px] shrink-0 uppercase font-semibold font-mono", LEVEL_COLORS[log.level] || "text-surface-500"),
204
175
  children: log.level
205
176
  }),
206
- /* @__PURE__ */ jsxs("span", {
207
- style: {
208
- color: SOURCE_COLORS[log.source] || "#cdd6f4",
209
- width: 64,
210
- flexShrink: 0
211
- },
177
+ /* @__PURE__ */ jsxs(Typography, {
178
+ variant: "body2",
179
+ className: cls("w-[80px] shrink-0 font-mono", SOURCE_COLORS[log.source] || "text-surface-500"),
212
180
  children: [
213
181
  "[",
214
182
  log.source,
215
183
  "]"
216
184
  ]
217
185
  }),
218
- /* @__PURE__ */ jsx("span", {
219
- style: {
220
- color: "#cdd6f4",
221
- flex: 1
222
- },
186
+ /* @__PURE__ */ jsx(Typography, {
187
+ variant: "body2",
188
+ className: "flex-1 font-mono break-all whitespace-pre-wrap text-surface-900 dark:text-surface-100",
223
189
  children: log.message
224
190
  })
225
191
  ]
226
192
  }, log.id)), logs.length === 0 && /* @__PURE__ */ jsx("div", {
227
- style: {
228
- padding: 32,
229
- textAlign: "center",
230
- color: "#6c7086"
231
- },
232
- children: "No log entries yet. Logs will appear here as requests come in."
193
+ className: "p-8 text-center",
194
+ children: /* @__PURE__ */ jsx(Typography, {
195
+ variant: "body2",
196
+ color: "secondary",
197
+ children: "No log entries yet. Logs will appear here as requests come in."
198
+ })
233
199
  })]
234
200
  })]
235
201
  });
@@ -237,4 +203,4 @@ function LogsExplorer() {
237
203
  //#endregion
238
204
  export { LogsExplorer };
239
205
 
240
- //# sourceMappingURL=LogsExplorer-CqtKILj8.js.map
206
+ //# sourceMappingURL=LogsExplorer-J4xfsuv3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogsExplorer-J4xfsuv3.js","names":[],"sources":["../src/components/LogsExplorer/LogsExplorer.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Select, SelectItem, TextField, Checkbox, Label, Typography, cls, defaultBorderMixin } from \"@rebasepro/ui\";\n\ninterface LogEntry {\n id: string;\n timestamp: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n source: \"api\" | \"auth\" | \"storage\" | \"realtime\" | \"system\";\n message: string;\n metadata?: Record<string, unknown>;\n}\n\nconst LEVEL_COLORS: Record<string, string> = {\n debug: \"text-surface-500\",\n info: \"text-blue-600 dark:text-blue-500\",\n warn: \"text-amber-600 dark:text-amber-500\",\n error: \"text-red-600 dark:text-red-500\"\n};\n\nconst SOURCE_COLORS: Record<string, string> = {\n api: \"text-sky-600 dark:text-sky-400\",\n auth: \"text-purple-600 dark:text-purple-400\",\n storage: \"text-green-600 dark:text-green-500\",\n realtime: \"text-orange-600 dark:text-orange-400\",\n system: \"text-surface-600 dark:text-surface-400\"\n};\n\nexport function LogsExplorer() {\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const [level, setLevel] = useState<string>(\"all\");\n const [source, setSource] = useState<string>(\"all\");\n const [search, setSearch] = useState(\"\");\n const [autoScroll, setAutoScroll] = useState(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const fetchLogs = useCallback(async () => {\n try {\n const params = new URLSearchParams();\n if (level && level !== \"all\") params.set(\"level\", level);\n if (source && source !== \"all\") params.set(\"source\", source);\n if (search) params.set(\"search\", search);\n params.set(\"limit\", \"200\");\n\n const resp = await fetch(`/api/logs?${params}`);\n if (resp.ok) {\n const data: { entries?: LogEntry[] } = await resp.json();\n setLogs(data.entries || []);\n }\n } catch {\n /* ignore poll failures */\n }\n }, [level, source, search]);\n\n useEffect(() => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let cancelled = false;\n\n fetchLogs();\n\n const scheduleNext = () => {\n if (cancelled) return;\n timeoutId = setTimeout(async () => {\n if (document.visibilityState === \"visible\") {\n await fetchLogs();\n }\n scheduleNext();\n }, 3000);\n };\n\n scheduleNext();\n\n const handleVisibility = () => {\n if (document.visibilityState === \"visible\") {\n fetchLogs();\n }\n };\n document.addEventListener(\"visibilitychange\", handleVisibility);\n\n return () => {\n cancelled = true;\n if (timeoutId) clearTimeout(timeoutId);\n document.removeEventListener(\"visibilitychange\", handleVisibility);\n };\n }, [fetchLogs]);\n\n useEffect(() => {\n if (autoScroll && containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [logs, autoScroll]);\n\n return (\n <div className=\"flex flex-col h-[calc(100vh-64px)] w-full bg-surface-50 dark:bg-surface-800\">\n {/* Toolbar */}\n <div className={cls(\n \"flex gap-2 p-3 border-b items-center flex-wrap shrink-0\",\n defaultBorderMixin\n )}>\n <Select\n value={level}\n onValueChange={setLevel}\n size=\"small\"\n placeholder=\"All Levels\"\n >\n <SelectItem value=\"all\">All Levels</SelectItem>\n <SelectItem value=\"debug\">Debug</SelectItem>\n <SelectItem value=\"info\">Info</SelectItem>\n <SelectItem value=\"warn\">Warn</SelectItem>\n <SelectItem value=\"error\">Error</SelectItem>\n </Select>\n <Select\n value={source}\n onValueChange={setSource}\n size=\"small\"\n placeholder=\"All Sources\"\n >\n <SelectItem value=\"all\">All Sources</SelectItem>\n <SelectItem value=\"api\">API</SelectItem>\n <SelectItem value=\"auth\">Auth</SelectItem>\n <SelectItem value=\"storage\">Storage</SelectItem>\n <SelectItem value=\"realtime\">Realtime</SelectItem>\n <SelectItem value=\"system\">System</SelectItem>\n </Select>\n <TextField\n size=\"small\"\n placeholder=\"Search logs...\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n className=\"flex-1 min-w-[200px]\"\n />\n <div className=\"flex items-center gap-1.5 cursor-pointer ml-2\">\n <Checkbox\n id=\"auto-scroll\"\n checked={autoScroll}\n onCheckedChange={setAutoScroll}\n size=\"small\"\n padding={false}\n />\n <Label\n htmlFor=\"auto-scroll\"\n className=\"text-xs select-none cursor-pointer text-surface-600 dark:text-surface-400\"\n >\n Auto-scroll\n </Label>\n </div>\n <div className=\"ml-auto pl-4\">\n <Typography variant=\"caption\" color=\"secondary\">\n {logs.length} entries\n </Typography>\n </div>\n </div>\n \n {/* Log entries */}\n <div\n ref={containerRef}\n className=\"flex-1 overflow-auto py-2\"\n >\n {logs.map(log => (\n <div\n key={log.id}\n className={cls(\n \"flex gap-4 px-4 py-[6px] border-b hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors\",\n defaultBorderMixin\n )}\n >\n <Typography variant=\"body2\" color=\"secondary\" className=\"w-[72px] shrink-0 font-mono\">\n {new Date(log.timestamp).toLocaleTimeString()}\n </Typography>\n <Typography variant=\"body2\" className={cls(\"w-[48px] shrink-0 uppercase font-semibold font-mono\", LEVEL_COLORS[log.level] || \"text-surface-500\")}>\n {log.level}\n </Typography>\n <Typography variant=\"body2\" className={cls(\"w-[80px] shrink-0 font-mono\", SOURCE_COLORS[log.source] || \"text-surface-500\")}>\n [{log.source}]\n </Typography>\n <Typography variant=\"body2\" className=\"flex-1 font-mono break-all whitespace-pre-wrap text-surface-900 dark:text-surface-100\">\n {log.message}\n </Typography>\n </div>\n ))}\n {logs.length === 0 && (\n <div className=\"p-8 text-center\">\n <Typography variant=\"body2\" color=\"secondary\">\n No log entries yet. Logs will appear here as requests come in.\n </Typography>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}