@upstash/react-redis-browser 0.1.2-canary-7 → 0.1.2

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.
package/dist/index.js CHANGED
@@ -222,6 +222,20 @@ var _iconsreact = require('@tabler/icons-react');
222
222
 
223
223
  var _reactresizablepanels = require('react-resizable-panels');
224
224
 
225
+ // src/components/ui/toaster.tsx
226
+ var _reactportal = require('@radix-ui/react-portal');
227
+
228
+ // src/lib/portal-root.ts
229
+ var root;
230
+ if (typeof document !== "undefined") {
231
+ const id = "react-redis-browser-portal-root";
232
+ root = _nullishCoalesce(document.querySelector(`#${id}`), () => ( document.createElement("div")));
233
+ root.classList.add("ups-db");
234
+ root.id = "react-redis-browser-portal-root";
235
+ document.body.append(root);
236
+ }
237
+ var portalRoot = root;
238
+
225
239
  // src/components/ui/toast.tsx
226
240
 
227
241
  var _reacticons = require('@radix-ui/react-icons');
@@ -2874,7 +2888,7 @@ ToastDescription.displayName = ToastPrimitives.Description.displayName;
2874
2888
 
2875
2889
  function Toaster() {
2876
2890
  const { toasts } = useToast();
2877
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ToastProvider, { children: [
2891
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactportal.Portal, { container: portalRoot, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ToastProvider, { children: [
2878
2892
  toasts.map(({ id, title, description, action, ...props }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, Toast, { ...props, children: [
2879
2893
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid gap-1", children: [
2880
2894
  title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToastTitle, { children: title }),
@@ -2884,7 +2898,7 @@ function Toaster() {
2884
2898
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToastClose, {})
2885
2899
  ] }, id)),
2886
2900
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToastViewport, {})
2887
- ] });
2901
+ ] }) });
2888
2902
  }
2889
2903
 
2890
2904
  // src/components/databrowser/hooks/use-keys.tsx
@@ -3174,6 +3188,7 @@ var useAddKey = () => {
3174
3188
  const { redis } = useDatabrowser();
3175
3189
  const mutation = _reactquery.useMutation.call(void 0, {
3176
3190
  mutationFn: async ({ key, type }) => {
3191
+ if (await redis.exists(key)) throw new Error(`Key "${key}" already exists`);
3177
3192
  switch (type) {
3178
3193
  case "set": {
3179
3194
  await redis.sadd(key, "value");
@@ -3577,19 +3592,6 @@ var _reactcontextmenu = require('@radix-ui/react-context-menu'); var ContextMenu
3577
3592
 
3578
3593
 
3579
3594
 
3580
- // src/lib/portal-root.ts
3581
- var root;
3582
- if (typeof document !== "undefined") {
3583
- const id = "react-redis-browser-portal-root";
3584
- root = _nullishCoalesce(document.querySelector(`#${id}`), () => ( document.createElement("div")));
3585
- root.classList.add("ups-db");
3586
- root.id = "react-redis-browser-portal-root";
3587
- document.body.append(root);
3588
- }
3589
- var portalRoot = root;
3590
-
3591
- // src/components/ui/context-menu.tsx
3592
-
3593
3595
  var ContextMenu = ContextMenuPrimitive.Root;
3594
3596
  var ContextMenuTrigger = ContextMenuPrimitive.Trigger;
3595
3597
  var ContextMenuSubTrigger = React4.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -4708,7 +4710,8 @@ var CustomEditor = ({
4708
4710
  value,
4709
4711
  onChange,
4710
4712
  height,
4711
- showCopyButton
4713
+ showCopyButton,
4714
+ readOnly
4712
4715
  }) => {
4713
4716
  const monaco = _react2.useMonaco.call(void 0, );
4714
4717
  const editorRef = _react.useRef.call(void 0, );
@@ -4739,6 +4742,7 @@ var CustomEditor = ({
4739
4742
  },
4740
4743
  defaultLanguage: language,
4741
4744
  options: {
4745
+ readOnly,
4742
4746
  wordWrap: "on",
4743
4747
  overviewRulerBorder: false,
4744
4748
  overviewRulerLanes: 0,
@@ -4784,7 +4788,8 @@ var useField = ({
4784
4788
  name,
4785
4789
  form,
4786
4790
  height,
4787
- showCopyButton
4791
+ showCopyButton,
4792
+ readOnly
4788
4793
  }) => {
4789
4794
  const { field, fieldState } = _reacthookform.useController.call(void 0, {
4790
4795
  name,
@@ -4822,7 +4827,8 @@ var useField = ({
4822
4827
  value: field.value,
4823
4828
  onChange: field.onChange,
4824
4829
  height,
4825
- showCopyButton
4830
+ showCopyButton,
4831
+ readOnly
4826
4832
  }
4827
4833
  ) })
4828
4834
  };
@@ -4873,8 +4879,24 @@ var ListEditForm = ({
4873
4879
  });
4874
4880
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reacthookform.FormProvider, { ...form, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { onSubmit, className: "flex flex-col gap-2", children: [
4875
4881
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex grow flex-col gap-2", children: [
4876
- type !== "list" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, FormItem, { name: "key", height: type === "set" ? 250 : 100, label: keyLabel }),
4877
- type === "zset" ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NumberFormItem, { name: "value", label: valueLabel }) : type !== "set" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, FormItem, { name: "value", height: type === "list" ? 250 : 100, label: valueLabel })
4882
+ type !== "list" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
4883
+ FormItem,
4884
+ {
4885
+ readOnly: type === "stream",
4886
+ name: "key",
4887
+ height: type === "set" ? 250 : 100,
4888
+ label: keyLabel
4889
+ }
4890
+ ),
4891
+ type === "zset" ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NumberFormItem, { name: "value", label: valueLabel }) : type !== "set" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
4892
+ FormItem,
4893
+ {
4894
+ readOnly: type === "stream",
4895
+ name: "value",
4896
+ height: type === "list" ? 250 : 100,
4897
+ label: valueLabel
4898
+ }
4899
+ )
4878
4900
  ] }),
4879
4901
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex justify-end gap-2", children: [
4880
4902
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -4927,14 +4949,16 @@ var NumberFormItem = ({ name, label }) => {
4927
4949
  var FormItem = ({
4928
4950
  name,
4929
4951
  label,
4930
- height
4952
+ height,
4953
+ readOnly
4931
4954
  }) => {
4932
4955
  const form = _reacthookform.useFormContext.call(void 0, );
4933
4956
  const { editor, selector } = useField({
4934
4957
  name,
4935
4958
  form,
4936
4959
  height,
4937
- showCopyButton: true
4960
+ showCopyButton: true,
4961
+ readOnly
4938
4962
  });
4939
4963
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-1", children: [
4940
4964
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-1 text-xs", children: [
@@ -5225,23 +5249,16 @@ function AddKeyModal() {
5225
5249
  }
5226
5250
  });
5227
5251
  const onSubmit = handleSubmit(async ({ key, type }) => {
5228
- try {
5229
- await addKey({ key, type });
5230
- setSelectedKey(key);
5231
- setOpen(false);
5232
- setTimeout(() => {
5233
- _optionalChain([window, 'access', _32 => _32.document, 'access', _33 => _33.querySelector, 'call', _34 => _34(`[data-key="${key}"]`), 'optionalAccess', _35 => _35.scrollIntoView, 'call', _36 => _36({
5234
- behavior: "smooth",
5235
- block: "start",
5236
- inline: "nearest"
5237
- })]);
5238
- }, 100);
5239
- } catch (error) {
5240
- toast({
5241
- description: error instanceof Error ? error.message : "An error occurred",
5242
- variant: "destructive"
5243
- });
5244
- }
5252
+ await addKey({ key, type });
5253
+ setSelectedKey(key);
5254
+ setOpen(false);
5255
+ setTimeout(() => {
5256
+ _optionalChain([window, 'access', _32 => _32.document, 'access', _33 => _33.querySelector, 'call', _34 => _34(`[data-key="${key}"]`), 'optionalAccess', _35 => _35.scrollIntoView, 'call', _36 => _36({
5257
+ behavior: "smooth",
5258
+ block: "start",
5259
+ inline: "nearest"
5260
+ })]);
5261
+ }, 100);
5245
5262
  });
5246
5263
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
5247
5264
  Dialog,
@@ -5506,6 +5523,9 @@ function Sidebar() {
5506
5523
 
5507
5524
  var RedisBrowser = ({ token, url }) => {
5508
5525
  const credentials = _react.useMemo.call(void 0, () => ({ token, url }), [token, url]);
5526
+ _react.useEffect.call(void 0, () => {
5527
+ queryClient.resetQueries();
5528
+ }, [credentials.url]);
5509
5529
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactquery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reacttooltip.TooltipProvider, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DatabrowserProvider, { redisCredentials: credentials, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, KeysProvider, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "ups-db", style: { height: "100%" }, children: [
5510
5530
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
5511
5531
  _reactresizablepanels.PanelGroup,
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/components/databrowser/index.tsx
2
- import { useMemo as useMemo6 } from "react";
2
+ import { useEffect as useEffect9, useMemo as useMemo6 } from "react";
3
3
 
4
4
  // src/store.tsx
5
5
  import { createContext, useContext, useMemo, useState as useState2 } from "react";
@@ -222,6 +222,20 @@ import { IconDotsVertical as IconDotsVertical2 } from "@tabler/icons-react";
222
222
  import { QueryClientProvider } from "@tanstack/react-query";
223
223
  import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
224
224
 
225
+ // src/components/ui/toaster.tsx
226
+ import { Portal } from "@radix-ui/react-portal";
227
+
228
+ // src/lib/portal-root.ts
229
+ var root;
230
+ if (typeof document !== "undefined") {
231
+ const id = "react-redis-browser-portal-root";
232
+ root = document.querySelector(`#${id}`) ?? document.createElement("div");
233
+ root.classList.add("ups-db");
234
+ root.id = "react-redis-browser-portal-root";
235
+ document.body.append(root);
236
+ }
237
+ var portalRoot = root;
238
+
225
239
  // src/components/ui/toast.tsx
226
240
  import * as React2 from "react";
227
241
  import { Cross2Icon } from "@radix-ui/react-icons";
@@ -2874,7 +2888,7 @@ ToastDescription.displayName = ToastPrimitives.Description.displayName;
2874
2888
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
2875
2889
  function Toaster() {
2876
2890
  const { toasts } = useToast();
2877
- return /* @__PURE__ */ jsxs(ToastProvider, { children: [
2891
+ return /* @__PURE__ */ jsx3(Portal, { container: portalRoot, children: /* @__PURE__ */ jsxs(ToastProvider, { children: [
2878
2892
  toasts.map(({ id, title, description, action, ...props }) => /* @__PURE__ */ jsxs(Toast, { ...props, children: [
2879
2893
  /* @__PURE__ */ jsxs("div", { className: "grid gap-1", children: [
2880
2894
  title && /* @__PURE__ */ jsx3(ToastTitle, { children: title }),
@@ -2884,7 +2898,7 @@ function Toaster() {
2884
2898
  /* @__PURE__ */ jsx3(ToastClose, {})
2885
2899
  ] }, id)),
2886
2900
  /* @__PURE__ */ jsx3(ToastViewport, {})
2887
- ] });
2901
+ ] }) });
2888
2902
  }
2889
2903
 
2890
2904
  // src/components/databrowser/hooks/use-keys.tsx
@@ -3174,6 +3188,7 @@ var useAddKey = () => {
3174
3188
  const { redis } = useDatabrowser();
3175
3189
  const mutation = useMutation({
3176
3190
  mutationFn: async ({ key, type }) => {
3191
+ if (await redis.exists(key)) throw new Error(`Key "${key}" already exists`);
3177
3192
  switch (type) {
3178
3193
  case "set": {
3179
3194
  await redis.sadd(key, "value");
@@ -3576,19 +3591,6 @@ import { ContextMenuSeparator as ContextMenuSeparator2 } from "@radix-ui/react-c
3576
3591
  import * as React4 from "react";
3577
3592
  import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
3578
3593
  import { CheckIcon, ChevronRightIcon, DotFilledIcon } from "@radix-ui/react-icons";
3579
-
3580
- // src/lib/portal-root.ts
3581
- var root;
3582
- if (typeof document !== "undefined") {
3583
- const id = "react-redis-browser-portal-root";
3584
- root = document.querySelector(`#${id}`) ?? document.createElement("div");
3585
- root.classList.add("ups-db");
3586
- root.id = "react-redis-browser-portal-root";
3587
- document.body.append(root);
3588
- }
3589
- var portalRoot = root;
3590
-
3591
- // src/components/ui/context-menu.tsx
3592
3594
  import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
3593
3595
  var ContextMenu = ContextMenuPrimitive.Root;
3594
3596
  var ContextMenuTrigger = ContextMenuPrimitive.Trigger;
@@ -4708,7 +4710,8 @@ var CustomEditor = ({
4708
4710
  value,
4709
4711
  onChange,
4710
4712
  height,
4711
- showCopyButton
4713
+ showCopyButton,
4714
+ readOnly
4712
4715
  }) => {
4713
4716
  const monaco = useMonaco();
4714
4717
  const editorRef = useRef3();
@@ -4739,6 +4742,7 @@ var CustomEditor = ({
4739
4742
  },
4740
4743
  defaultLanguage: language,
4741
4744
  options: {
4745
+ readOnly,
4742
4746
  wordWrap: "on",
4743
4747
  overviewRulerBorder: false,
4744
4748
  overviewRulerLanes: 0,
@@ -4784,7 +4788,8 @@ var useField = ({
4784
4788
  name,
4785
4789
  form,
4786
4790
  height,
4787
- showCopyButton
4791
+ showCopyButton,
4792
+ readOnly
4788
4793
  }) => {
4789
4794
  const { field, fieldState } = useController({
4790
4795
  name,
@@ -4822,7 +4827,8 @@ var useField = ({
4822
4827
  value: field.value,
4823
4828
  onChange: field.onChange,
4824
4829
  height,
4825
- showCopyButton
4830
+ showCopyButton,
4831
+ readOnly
4826
4832
  }
4827
4833
  ) })
4828
4834
  };
@@ -4873,8 +4879,24 @@ var ListEditForm = ({
4873
4879
  });
4874
4880
  return /* @__PURE__ */ jsx29(FormProvider, { ...form, children: /* @__PURE__ */ jsxs19("form", { onSubmit, className: "flex flex-col gap-2", children: [
4875
4881
  /* @__PURE__ */ jsxs19("div", { className: "flex grow flex-col gap-2", children: [
4876
- type !== "list" && /* @__PURE__ */ jsx29(FormItem, { name: "key", height: type === "set" ? 250 : 100, label: keyLabel }),
4877
- type === "zset" ? /* @__PURE__ */ jsx29(NumberFormItem, { name: "value", label: valueLabel }) : type !== "set" && /* @__PURE__ */ jsx29(FormItem, { name: "value", height: type === "list" ? 250 : 100, label: valueLabel })
4882
+ type !== "list" && /* @__PURE__ */ jsx29(
4883
+ FormItem,
4884
+ {
4885
+ readOnly: type === "stream",
4886
+ name: "key",
4887
+ height: type === "set" ? 250 : 100,
4888
+ label: keyLabel
4889
+ }
4890
+ ),
4891
+ type === "zset" ? /* @__PURE__ */ jsx29(NumberFormItem, { name: "value", label: valueLabel }) : type !== "set" && /* @__PURE__ */ jsx29(
4892
+ FormItem,
4893
+ {
4894
+ readOnly: type === "stream",
4895
+ name: "value",
4896
+ height: type === "list" ? 250 : 100,
4897
+ label: valueLabel
4898
+ }
4899
+ )
4878
4900
  ] }),
4879
4901
  /* @__PURE__ */ jsxs19("div", { className: "flex justify-end gap-2", children: [
4880
4902
  /* @__PURE__ */ jsx29(
@@ -4927,14 +4949,16 @@ var NumberFormItem = ({ name, label }) => {
4927
4949
  var FormItem = ({
4928
4950
  name,
4929
4951
  label,
4930
- height
4952
+ height,
4953
+ readOnly
4931
4954
  }) => {
4932
4955
  const form = useFormContext();
4933
4956
  const { editor, selector } = useField({
4934
4957
  name,
4935
4958
  form,
4936
4959
  height,
4937
- showCopyButton: true
4960
+ showCopyButton: true,
4961
+ readOnly
4938
4962
  });
4939
4963
  return /* @__PURE__ */ jsxs19("div", { className: "flex flex-col gap-1", children: [
4940
4964
  /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-1 text-xs", children: [
@@ -5225,23 +5249,16 @@ function AddKeyModal() {
5225
5249
  }
5226
5250
  });
5227
5251
  const onSubmit = handleSubmit(async ({ key, type }) => {
5228
- try {
5229
- await addKey({ key, type });
5230
- setSelectedKey(key);
5231
- setOpen(false);
5232
- setTimeout(() => {
5233
- window.document.querySelector(`[data-key="${key}"]`)?.scrollIntoView({
5234
- behavior: "smooth",
5235
- block: "start",
5236
- inline: "nearest"
5237
- });
5238
- }, 100);
5239
- } catch (error) {
5240
- toast({
5241
- description: error instanceof Error ? error.message : "An error occurred",
5242
- variant: "destructive"
5252
+ await addKey({ key, type });
5253
+ setSelectedKey(key);
5254
+ setOpen(false);
5255
+ setTimeout(() => {
5256
+ window.document.querySelector(`[data-key="${key}"]`)?.scrollIntoView({
5257
+ behavior: "smooth",
5258
+ block: "start",
5259
+ inline: "nearest"
5243
5260
  });
5244
- }
5261
+ }, 100);
5245
5262
  });
5246
5263
  return /* @__PURE__ */ jsxs23(
5247
5264
  Dialog,
@@ -5506,6 +5523,9 @@ function Sidebar() {
5506
5523
  import { jsx as jsx42, jsxs as jsxs31 } from "react/jsx-runtime";
5507
5524
  var RedisBrowser = ({ token, url }) => {
5508
5525
  const credentials = useMemo6(() => ({ token, url }), [token, url]);
5526
+ useEffect9(() => {
5527
+ queryClient.resetQueries();
5528
+ }, [credentials.url]);
5509
5529
  return /* @__PURE__ */ jsx42(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx42(TooltipProvider, { children: /* @__PURE__ */ jsx42(DatabrowserProvider, { redisCredentials: credentials, children: /* @__PURE__ */ jsx42(KeysProvider, { children: /* @__PURE__ */ jsxs31("div", { className: "ups-db", style: { height: "100%" }, children: [
5510
5530
  /* @__PURE__ */ jsxs31(
5511
5531
  PanelGroup,
package/package.json CHANGED
@@ -1 +1 @@
1
- { "name": "@upstash/react-redis-browser", "version": "v0.1.2-canary-7", "main": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT", "private": false, "publishConfig": { "access": "public" }, "bugs": { "url": "https://github.com/upstash/react-redis-browser/issues" }, "homepage": "https://github.com/upstash/react-redis-browser", "files": [ "./dist/**" ], "scripts": { "build": "tsup", "dev": "vite", "lint": "tsc && eslint", "fmt": "prettier --write ./src" }, "lint-staged": { "**/*.{js,ts,tsx}": [ "prettier --write", "eslint --fix" ] }, "dependencies": { "@ianvs/prettier-plugin-sort-imports": "^4.4.0", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-context-menu": "^2.2.2", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-scroll-area": "^1.0.3", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", "@tabler/icons-react": "^3.19.0", "@tanstack/react-query": "^5.32.0", "@types/bytes": "^3.1.4", "@upstash/redis": "^1.34.3", "bytes": "^3.1.2", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.4", "zustand": "5.0.0" }, "devDependencies": { "postcss-prefix-selector": "^2.1.0", "@types/node": "^22.8.4", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "8.4.0", "@typescript-eslint/parser": "8.4.0", "@vitejs/plugin-react": "^4.1.0", "autoprefixer": "^10.4.14", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "eslint": "9.10.0", "eslint-plugin-unicorn": "55.0.0", "postcss": "^8.4.31", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.5", "react": "^18.3.1", "react-dom": "^18.3.1", "tailwind-merge": "^2.5.4", "tailwindcss": "^3.4.14", "tailwindcss-animate": "^1.0.7", "tsup": "^8.3.5", "typescript": "^5.0.4", "vite": "^5.4.10", "vite-tsconfig-paths": "^5.0.1" }, "peerDependencies": { "react": "^18.2.0 || ^19", "react-dom": "^18.2.0 || ^19" } }
1
+ { "name": "@upstash/react-redis-browser", "version": "v0.1.2", "main": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT", "private": false, "publishConfig": { "access": "public" }, "bugs": { "url": "https://github.com/upstash/react-redis-browser/issues" }, "homepage": "https://github.com/upstash/react-redis-browser", "files": [ "./dist/**" ], "scripts": { "build": "tsup", "dev": "vite", "lint": "tsc && eslint", "fmt": "prettier --write ./src" }, "lint-staged": { "**/*.{js,ts,tsx}": [ "prettier --write", "eslint --fix" ] }, "dependencies": { "@ianvs/prettier-plugin-sort-imports": "^4.4.0", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-context-menu": "^2.2.2", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-portal": "^1.1.2", "@radix-ui/react-scroll-area": "^1.0.3", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", "@tabler/icons-react": "^3.19.0", "@tanstack/react-query": "^5.32.0", "@types/bytes": "^3.1.4", "@upstash/redis": "^1.34.3", "bytes": "^3.1.2", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.4", "zustand": "5.0.0" }, "devDependencies": { "postcss-prefix-selector": "^2.1.0", "@types/node": "^22.8.4", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "8.4.0", "@typescript-eslint/parser": "8.4.0", "@vitejs/plugin-react": "^4.1.0", "autoprefixer": "^10.4.14", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "eslint": "9.10.0", "eslint-plugin-unicorn": "55.0.0", "postcss": "^8.4.31", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.5", "react": "^18.3.1", "react-dom": "^18.3.1", "tailwind-merge": "^2.5.4", "tailwindcss": "^3.4.14", "tailwindcss-animate": "^1.0.7", "tsup": "^8.3.5", "typescript": "^5.0.4", "vite": "^5.4.10", "vite-tsconfig-paths": "^5.0.1" }, "peerDependencies": { "react": "^18.2.0 || ^19", "react-dom": "^18.2.0 || ^19" } }