db-studio 1.10.0 → 1.12.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.
- package/dist/index.js +29 -27
- package/dist/index.js.map +1 -1
- package/dist/web-dist/assets/_pathlessLayout-C6coCMpi.js +1 -0
- package/dist/web-dist/assets/{_pathlessLayout-CEv6uosT.js.map → _pathlessLayout-C6coCMpi.js.map} +1 -1
- package/dist/web-dist/assets/_pathlessLayout-DoBLI2ja.js +132 -0
- package/dist/web-dist/assets/_pathlessLayout-DoBLI2ja.js.map +1 -0
- package/dist/web-dist/assets/_queryId-Chj34V6b.js +1 -0
- package/dist/web-dist/assets/{_queryId-Bq64AuuI.js.map → _queryId-Chj34V6b.js.map} +1 -1
- package/dist/web-dist/assets/{_table-Bt9of1on.js → _table-Bg4NvAi4.js} +1 -1
- package/dist/web-dist/assets/{_table-Bt9of1on.js.map → _table-Bg4NvAi4.js.map} +1 -1
- package/dist/web-dist/assets/_table-CHFe8v3q.js +1 -0
- package/dist/web-dist/assets/{_table-CQhKMAcZ.js.map → _table-CHFe8v3q.js.map} +1 -1
- package/dist/web-dist/assets/ai-assistant-D2oc4TtC.js +1 -0
- package/dist/web-dist/assets/ai-assistant-D2oc4TtC.js.map +1 -0
- package/dist/web-dist/assets/browser-B3ZulIJb.js +1 -0
- package/dist/web-dist/assets/{browser-CFsrLhq1.js.map → browser-B3ZulIJb.js.map} +1 -1
- package/dist/web-dist/assets/code-editor-q3FlZk-L.js +9 -0
- package/dist/web-dist/assets/code-editor-q3FlZk-L.js.map +1 -0
- package/dist/web-dist/assets/database.store-O79u8Fhj.js +1 -0
- package/dist/web-dist/assets/database.store-O79u8Fhj.js.map +1 -0
- package/dist/web-dist/assets/{dist-B90HBock.js → dist-DBHqGKiG.js} +1 -1
- package/dist/web-dist/assets/{dist-B90HBock.js.map → dist-DBHqGKiG.js.map} +1 -1
- package/dist/web-dist/assets/{highlighted-body-OFNGDK62-BGFI1Y6G.js → highlighted-body-OFNGDK62-CFFJC4SW.js} +1 -1
- package/dist/web-dist/assets/{highlighted-body-OFNGDK62-BGFI1Y6G.js.map → highlighted-body-OFNGDK62-CFFJC4SW.js.map} +1 -1
- package/dist/web-dist/assets/icons-CtpwLWUI.js +1 -0
- package/dist/web-dist/assets/icons-CtpwLWUI.js.map +1 -0
- package/dist/web-dist/assets/index-Cyl_0l9I.css +2 -0
- package/dist/web-dist/assets/index-XoXxezo4.js +35 -0
- package/dist/web-dist/assets/index-XoXxezo4.js.map +1 -0
- package/dist/web-dist/assets/{indexes-BKOZUa9Z.js → indexes-C9QqJKhp.js} +1 -1
- package/dist/web-dist/assets/{indexes-BKOZUa9Z.js.map → indexes-C9QqJKhp.js.map} +1 -1
- package/dist/web-dist/assets/{logs-DHha3vDy.js → logs-B8ah8F7D.js} +1 -1
- package/dist/web-dist/assets/{logs-DHha3vDy.js.map → logs-B8ah8F7D.js.map} +1 -1
- package/dist/web-dist/assets/mermaid-GHXKKRXX-TpVEoP0K.js +1 -0
- package/dist/web-dist/assets/middleware-CCyr6cvp.js +1 -0
- package/dist/web-dist/assets/middleware-CCyr6cvp.js.map +1 -0
- package/dist/web-dist/assets/popover-wbdw6Hmx.js +1 -0
- package/dist/web-dist/assets/popover-wbdw6Hmx.js.map +1 -0
- package/dist/web-dist/assets/queries.store-CoJVGJKk.js +1 -0
- package/dist/web-dist/assets/queries.store-CoJVGJKk.js.map +1 -0
- package/dist/web-dist/assets/query-runner-Bgs0j50a.js +17 -0
- package/dist/web-dist/assets/query-runner-Bgs0j50a.js.map +1 -0
- package/dist/web-dist/assets/radix-ui-CgJOuzDv.js +51 -0
- package/dist/web-dist/assets/radix-ui-CgJOuzDv.js.map +1 -0
- package/dist/web-dist/assets/react-Cxb6eTZp.js +1 -0
- package/dist/web-dist/assets/react-Cxb6eTZp.js.map +1 -0
- package/dist/web-dist/assets/{react-dom-0lXVP1OR.js → react-dom-yg5bT29P.js} +1 -1
- package/dist/web-dist/assets/{react-dom-0lXVP1OR.js.map → react-dom-yg5bT29P.js.map} +1 -1
- package/dist/web-dist/assets/redis-value-COa6YzFD.js +1 -0
- package/dist/web-dist/assets/{redis-value-CJoRCZun.js.map → redis-value-COa6YzFD.js.map} +1 -1
- package/dist/web-dist/assets/runner-DW5iXMmq.js +1 -0
- package/dist/web-dist/assets/{runner-CZKDzRoU.js.map → runner-DW5iXMmq.js.map} +1 -1
- package/dist/web-dist/assets/schema-CtOicTEt.js +64 -0
- package/dist/web-dist/assets/schema-CtOicTEt.js.map +1 -0
- package/dist/web-dist/assets/{schema-0sozVL-z.js → schema-oy5o_4bt.js} +1 -1
- package/dist/web-dist/assets/{schema-0sozVL-z.js.map → schema-oy5o_4bt.js.map} +1 -1
- package/dist/web-dist/assets/{table-CPQhgD-a.js → table-CN9ZTCOi.js} +1 -1
- package/dist/web-dist/assets/{table-CPQhgD-a.js.map → table-CN9ZTCOi.js.map} +1 -1
- package/dist/web-dist/assets/tanstack-g1w0v_rJ.js +10 -0
- package/dist/web-dist/assets/tanstack-g1w0v_rJ.js.map +1 -0
- package/dist/web-dist/assets/tooltip-B7gM8xl3.js +9 -0
- package/dist/web-dist/assets/tooltip-B7gM8xl3.js.map +1 -0
- package/dist/web-dist/assets/{visualizer-DTPn0ywW.js → visualizer-DcEwqmuY.js} +1 -1
- package/dist/web-dist/assets/{visualizer-DTPn0ywW.js.map → visualizer-DcEwqmuY.js.map} +1 -1
- package/dist/web-dist/index.html +13 -11
- package/package.json +1 -1
- package/dist/web-dist/assets/_pathlessLayout-CEv6uosT.js +0 -1
- package/dist/web-dist/assets/_pathlessLayout-eo6iLvBo.js +0 -132
- package/dist/web-dist/assets/_pathlessLayout-eo6iLvBo.js.map +0 -1
- package/dist/web-dist/assets/_queryId-Bq64AuuI.js +0 -1
- package/dist/web-dist/assets/_table-CQhKMAcZ.js +0 -1
- package/dist/web-dist/assets/browser-CFsrLhq1.js +0 -1
- package/dist/web-dist/assets/code-editor-DQ86aZkm.js +0 -9
- package/dist/web-dist/assets/code-editor-DQ86aZkm.js.map +0 -1
- package/dist/web-dist/assets/database.store-KDHkiedw.js +0 -1
- package/dist/web-dist/assets/database.store-KDHkiedw.js.map +0 -1
- package/dist/web-dist/assets/icons-Bm7rSZLJ.js +0 -1
- package/dist/web-dist/assets/icons-Bm7rSZLJ.js.map +0 -1
- package/dist/web-dist/assets/index-BtqHnOp0.js +0 -23
- package/dist/web-dist/assets/index-BtqHnOp0.js.map +0 -1
- package/dist/web-dist/assets/index-ktDWx_UP.css +0 -2
- package/dist/web-dist/assets/mermaid-GHXKKRXX-DjR37lQN.js +0 -1
- package/dist/web-dist/assets/popover-Cm3PsrMh.js +0 -1
- package/dist/web-dist/assets/popover-Cm3PsrMh.js.map +0 -1
- package/dist/web-dist/assets/query-runner-6BhVPaC9.js +0 -9
- package/dist/web-dist/assets/query-runner-6BhVPaC9.js.map +0 -1
- package/dist/web-dist/assets/radix-ui-BUv2Nuc1.js +0 -51
- package/dist/web-dist/assets/radix-ui-BUv2Nuc1.js.map +0 -1
- package/dist/web-dist/assets/redis-value-CJoRCZun.js +0 -1
- package/dist/web-dist/assets/runner-CZKDzRoU.js +0 -1
- package/dist/web-dist/assets/schema-cZHeTHA0.js +0 -64
- package/dist/web-dist/assets/schema-cZHeTHA0.js.map +0 -1
- package/dist/web-dist/assets/tanstack-D6l4LIt3.js +0 -10
- package/dist/web-dist/assets/tanstack-D6l4LIt3.js.map +0 -1
- package/dist/web-dist/assets/toggle-group-BRWnLosM.js +0 -1
- package/dist/web-dist/assets/toggle-group-BRWnLosM.js.map +0 -1
- package/dist/web-dist/assets/tooltip-DinwklI8.js +0 -9
- package/dist/web-dist/assets/tooltip-DinwklI8.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as k}from"./rolldown-runtime-CXHxssQy.js";import{C as b,E as V,S as T}from"./tanstack-g1w0v_rJ.js";import{H as F,R as M,et as _,ut as D}from"./icons-CtpwLWUI.js";import{kt as B}from"./radix-ui-CgJOuzDv.js";import{n as y}from"./dist-DBHqGKiG.js";import{S as U,U as j,b as E,w as q,x as z,y as O,z as A}from"./tooltip-B7gM8xl3.js";import{c as N,d as H}from"./popover-wbdw6Hmx.js";import{t as S}from"./database.store-O79u8Fhj.js";import{B as h,F as J,H as L,P as Q,R as G,V as Y,z as $}from"./index-XoXxezo4.js";var ce=({search:e,exactPattern:t,type:a})=>{const{selectedDatabase:n}=S();return T({queryKey:N.list(n,e,t,a),queryFn:async({pageParam:l})=>(await q({db:n??"",cursor:l||void 0,limit:100,search:e||void 0,exactPattern:t,type:a||void 0})).data.data,initialPageParam:"",getNextPageParam:l=>l.nextCursor??void 0,enabled:n!==null,staleTime:Number.POSITIVE_INFINITY})},de=(e,t=!1,a="forward")=>{const{selectedDatabase:n}=S();return T({queryKey:N.detail(n,e,t,a),queryFn:async({pageParam:l})=>(await U({db:n??"",key:e??"",cursor:l||void 0,full:t,direction:a})).data.data,initialPageParam:"",getNextPageParam:l=>l.nextCursor??void 0,enabled:n!==null&&e!==null,staleTime:Number.POSITIVE_INFINITY,retry:!1})},g=e=>typeof e.details=="string"&&e.details||e.message||"Redis operation failed",ue=()=>{const{selectedDatabase:e}=S(),t=V(),a=async()=>t.invalidateQueries({queryKey:N.all}),n=b({mutationFn:o=>E({db:e??"",data:o}).then(i=>i.data.data),onSuccess:a}),l=b({mutationFn:({key:o,data:i})=>O({db:e??"",key:o,data:i}).then(c=>c.data.data),onSuccess:a}),d=b({mutationFn:({key:o,expectedRevision:i,force:c})=>z({db:e??"",key:o,expectedRevision:i,force:c}).then(u=>u.data.data),onSuccess:a});return{createKey:o=>y.promise(n.mutateAsync(o),{loading:"Creating Redis key…",success:"Redis key created",error:g}).unwrap(),applyAction:(o,i)=>y.promise(l.mutateAsync({key:o,data:i}),{loading:"Applying Redis change…",success:"Redis change applied",error:g}).unwrap(),deleteKey:(o,i,c)=>y.promise(d.mutateAsync({key:o,expectedRevision:i,force:c}),{loading:"Deleting Redis key…",success:"Redis key deleted",error:g}).unwrap(),isPending:n.isPending||l.isPending||d.isPending}},m=k(D(),1),s=B(),R=e=>{const t=e.replaceAll("-","+").replaceAll("_","/"),a=t.padEnd(Math.ceil(t.length/4)*4,"=");return Uint8Array.from(atob(a),n=>n.charCodeAt(0))},w=e=>{let t="";for(const a of e)t+=String.fromCharCode(a);return btoa(t).replaceAll("+","-").replaceAll("/","_").replaceAll("=","")},W=e=>({base64:w(new TextEncoder().encode(e)),utf8:e}),X=new TextDecoder("utf-8",{fatal:!0}),I=e=>{try{return{base64:w(e),utf8:X.decode(e)}}catch{return{base64:w(e)}}},P=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join(""),Z=e=>{const t=e.replaceAll(/\s/g,"");return t.length%2!==0||!/^[\da-f]*$/i.test(t)?null:Uint8Array.from(t.match(/.{2}/g)?.map(a=>Number.parseInt(a,16))??[])},v=e=>{if(!e)return!1;try{return JSON.parse(e),!0}catch{return!1}},me=({value:e,compact:t=!1,onDownload:a})=>{const n=(0,m.useMemo)(()=>R(e.base64),[e.base64]),[l,d]=(0,m.useState)(e.utf8?v(e.utf8)?"json":"text":"hex"),[o,i]=(0,m.useState)(!1),c=l==="json"&&!v(e.utf8)?e.utf8===void 0?"hex":"text":l,u=c==="hex"?P(n):c==="base64"?e.base64:c==="json"&&e.utf8?JSON.stringify(JSON.parse(e.utf8),null,2):e.utf8??"Binary value",p=async()=>{await navigator.clipboard.writeText(u),i(!0),window.setTimeout(()=>i(!1),1200)},f=()=>{const r=new Blob([new Uint8Array(n).buffer]),C=URL.createObjectURL(r),x=document.createElement("a");x.href=C,x.download="redis-value.bin",x.click(),URL.revokeObjectURL(C)};return t?(0,s.jsx)("span",{className:"truncate font-mono text-xs text-foreground",title:u,children:u||"∅"}):(0,s.jsxs)("div",{className:"overflow-hidden border border-border bg-background",children:[(0,s.jsxs)("div",{className:"flex h-10 items-center justify-between border-b border-border",children:[(0,s.jsx)(Q,{type:"single",variant:"ghost",size:"sm",value:c,onValueChange:r=>r&&d(r),className:"h-full rounded-none",children:["text",...v(e.utf8)?["json"]:[],"hex","base64"].map(r=>(0,s.jsx)(J,{value:r,"aria-label":`View value as ${r}`,disabled:(r==="text"||r==="json")&&e.utf8===void 0,className:"h-full rounded-none! px-3 text-[10px] uppercase tracking-wider text-muted-foreground data-[state=on]:bg-muted data-[state=on]:text-foreground",children:r},r))}),(0,s.jsxs)("div",{className:"flex",children:[(0,s.jsx)(A,{variant:"ghost",size:"icon-sm",onClick:p,"aria-label":o?"Value copied":"Copy value",children:(0,s.jsxs)("span",{className:"relative inline-flex items-center justify-center",children:[(0,s.jsx)(F,{className:j("transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]",o?"scale-25 opacity-0 blur-[4px]":"scale-100 opacity-100 blur-[0px]")}),(0,s.jsx)(_,{className:j("absolute inset-0 transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]",o?"scale-100 opacity-100 blur-[0px]":"scale-25 opacity-0 blur-[4px]")})]})}),(0,s.jsx)(A,{variant:"ghost",size:"icon-sm",onClick:a??f,"aria-label":"Download original bytes",children:(0,s.jsx)(M,{})})]})]}),(0,s.jsx)("pre",{className:"max-h-[55vh] min-h-32 overflow-auto whitespace-pre-wrap break-all p-3 font-mono text-xs leading-5 text-foreground",children:u})]})},K=(e,t)=>{if(t==="text")return W(e);if(t==="hex"){const a=Z(e);return a&&I(a)}try{return I(R(e))}catch{return null}},pe=({value:e,onChange:t,placeholder:a,className:n,id:l})=>{const[d,o]=(0,m.useState)(e!==null&&e.utf8===void 0?"hex":"text"),i=e===null?null:d==="text"?e.utf8??"":d==="hex"?P(R(e.base64)):e.base64,[c,u]=(0,m.useState)(i??"");(0,m.useEffect)(()=>{i!==null&&u(i)},[i]);const p=r=>{u(r),t(K(r,d))},f=r=>{o(r),e===null&&t(K(c,r))};return(0,s.jsxs)("div",{className:j("flex min-w-0",n),children:[(0,s.jsxs)(G,{value:d,onValueChange:r=>f(r),children:[(0,s.jsx)(Y,{"aria-label":"Value encoding",className:"h-8! w-18 shrink-0 rounded-e-none border-e-0 px-1 font-mono text-[10px] uppercase",children:(0,s.jsx)(L,{})}),(0,s.jsxs)($,{children:[(0,s.jsx)(h,{value:"text",children:"Text"}),(0,s.jsx)(h,{value:"hex",children:"Hex"}),(0,s.jsx)(h,{value:"base64",children:"Base64"})]})]}),(0,s.jsx)(H,{id:l,value:c,onChange:r=>p(r.target.value),placeholder:a,"aria-invalid":e===null||void 0,className:"rounded-s-none font-mono h-8!"})]})};export{de as a,W as i,pe as n,ue as o,R as r,ce as s,me as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-value-CJoRCZun.js","names":[],"sources":["../../src/features/redis-browser/hooks/use-redis-browser.ts","../../src/features/redis-browser/components/redis-value.tsx"],"sourcesContent":["import type {\n\tCreateKeySchemaType,\n\tKeyActionSchemaType,\n\tRedisKeyTypeSchemaType,\n} from \"@db-studio/shared/types\";\nimport { useInfiniteQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { toast } from \"sonner\";\nimport {\n\tapplyRedisKeyAction,\n\tcreateRedisKey,\n\tdeleteRedisKey,\n\tgetRedisKey,\n\tscanRedisKeys,\n} from \"@/shared/api\";\nimport { redisKeyBrowserKeys } from \"@/shared/query/keys\";\nimport { useDatabaseStore } from \"@/stores/database.store\";\n\nexport const useRedisKeys = ({\n\tsearch,\n\texactPattern,\n\ttype,\n}: {\n\tsearch: string;\n\texactPattern: boolean;\n\ttype: string;\n}) => {\n\tconst { selectedDatabase } = useDatabaseStore();\n\treturn useInfiniteQuery({\n\t\tqueryKey: redisKeyBrowserKeys.list(selectedDatabase, search, exactPattern, type),\n\t\tqueryFn: async ({ pageParam }) => {\n\t\t\tconst response = await scanRedisKeys({\n\t\t\t\tdb: selectedDatabase ?? \"\",\n\t\t\t\tcursor: pageParam || undefined,\n\t\t\t\tlimit: 100,\n\t\t\t\tsearch: search || undefined,\n\t\t\t\texactPattern,\n\t\t\t\ttype: (type || undefined) as Exclude<RedisKeyTypeSchemaType, \"unknown\"> | undefined,\n\t\t\t});\n\t\t\treturn response.data.data;\n\t\t},\n\t\tinitialPageParam: \"\",\n\t\tgetNextPageParam: (page) => page.nextCursor ?? undefined,\n\t\tenabled: selectedDatabase !== null,\n\t\tstaleTime: Number.POSITIVE_INFINITY,\n\t});\n};\n\nexport const useRedisKey = (\n\tkey: string | null,\n\tfull = false,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n) => {\n\tconst { selectedDatabase } = useDatabaseStore();\n\treturn useInfiniteQuery({\n\t\tqueryKey: redisKeyBrowserKeys.detail(selectedDatabase, key, full, direction),\n\t\tqueryFn: async ({ pageParam }) => {\n\t\t\tconst response = await getRedisKey({\n\t\t\t\tdb: selectedDatabase ?? \"\",\n\t\t\t\tkey: key ?? \"\",\n\t\t\t\tcursor: pageParam || undefined,\n\t\t\t\tfull,\n\t\t\t\tdirection,\n\t\t\t});\n\t\t\treturn response.data.data;\n\t\t},\n\t\tinitialPageParam: \"\",\n\t\tgetNextPageParam: (page) => page.nextCursor ?? undefined,\n\t\tenabled: selectedDatabase !== null && key !== null,\n\t\tstaleTime: Number.POSITIVE_INFINITY,\n\t\tretry: false,\n\t});\n};\n\nconst mutationError = (error: Error & { details?: unknown }): string =>\n\t(typeof error.details === \"string\" && error.details) ||\n\terror.message ||\n\t\"Redis operation failed\";\n\nexport const useRedisKeyMutations = () => {\n\tconst { selectedDatabase } = useDatabaseStore();\n\tconst queryClient = useQueryClient();\n\tconst refresh = async () =>\n\t\tqueryClient.invalidateQueries({ queryKey: redisKeyBrowserKeys.all });\n\n\tconst createMutation = useMutation({\n\t\tmutationFn: (data: CreateKeySchemaType) =>\n\t\t\tcreateRedisKey({ db: selectedDatabase ?? \"\", data }).then(\n\t\t\t\t(response) => response.data.data,\n\t\t\t),\n\t\tonSuccess: refresh,\n\t});\n\tconst actionMutation = useMutation({\n\t\tmutationFn: ({ key, data }: { key: string; data: KeyActionSchemaType }) =>\n\t\t\tapplyRedisKeyAction({ db: selectedDatabase ?? \"\", key, data }).then(\n\t\t\t\t(response) => response.data.data,\n\t\t\t),\n\t\tonSuccess: refresh,\n\t});\n\tconst deleteMutation = useMutation({\n\t\tmutationFn: ({\n\t\t\tkey,\n\t\t\texpectedRevision,\n\t\t\tforce,\n\t\t}: {\n\t\t\tkey: string;\n\t\t\texpectedRevision: string;\n\t\t\tforce?: boolean;\n\t\t}) =>\n\t\t\tdeleteRedisKey({ db: selectedDatabase ?? \"\", key, expectedRevision, force }).then(\n\t\t\t\t(response) => response.data.data,\n\t\t\t),\n\t\tonSuccess: refresh,\n\t});\n\n\treturn {\n\t\tcreateKey: (data: CreateKeySchemaType) =>\n\t\t\ttoast\n\t\t\t\t.promise(createMutation.mutateAsync(data), {\n\t\t\t\t\tloading: \"Creating Redis key…\",\n\t\t\t\t\tsuccess: \"Redis key created\",\n\t\t\t\t\terror: mutationError,\n\t\t\t\t})\n\t\t\t\t.unwrap(),\n\t\tapplyAction: (key: string, data: KeyActionSchemaType) =>\n\t\t\ttoast\n\t\t\t\t.promise(actionMutation.mutateAsync({ key, data }), {\n\t\t\t\t\tloading: \"Applying Redis change…\",\n\t\t\t\t\tsuccess: \"Redis change applied\",\n\t\t\t\t\terror: mutationError,\n\t\t\t\t})\n\t\t\t\t.unwrap(),\n\t\tdeleteKey: (key: string, expectedRevision: string, force?: boolean) =>\n\t\t\ttoast\n\t\t\t\t.promise(deleteMutation.mutateAsync({ key, expectedRevision, force }), {\n\t\t\t\t\tloading: \"Deleting Redis key…\",\n\t\t\t\t\tsuccess: \"Redis key deleted\",\n\t\t\t\t\terror: mutationError,\n\t\t\t\t})\n\t\t\t\t.unwrap(),\n\t\tisPending:\n\t\t\tcreateMutation.isPending || actionMutation.isPending || deleteMutation.isPending,\n\t};\n};\n","import type { EncodedRedisValueSchemaType } from \"@db-studio/shared/types\";\nimport { Button } from \"@db-studio/ui/button\";\nimport { Input } from \"@db-studio/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@db-studio/ui/select\";\nimport { ToggleGroup, ToggleGroupItem } from \"@db-studio/ui/toggle-group\";\nimport { cn } from \"@db-studio/ui/utils\";\nimport { Check, Copy, Download } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type RedisValueMode = \"text\" | \"json\" | \"hex\" | \"base64\";\n\nexport const bytesFromBase64Url = (base64: string): Uint8Array => {\n\tconst normalized = base64.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n\tconst padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n\treturn Uint8Array.from(atob(padded), (character) => character.charCodeAt(0));\n};\n\nexport const base64UrlFromBytes = (bytes: Uint8Array): string => {\n\tlet binary = \"\";\n\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\treturn btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\n};\n\nexport const encodeTextValue = (value: string): EncodedRedisValueSchemaType => ({\n\tbase64: base64UrlFromBytes(new TextEncoder().encode(value)),\n\tutf8: value,\n});\n\nconst utf8Decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\n/** Encodes raw bytes, keeping `utf8` whenever the bytes are clean UTF-8 text. */\nexport const encodeBytesValue = (bytes: Uint8Array): EncodedRedisValueSchemaType => {\n\ttry {\n\t\treturn { base64: base64UrlFromBytes(bytes), utf8: utf8Decoder.decode(bytes) };\n\t} catch {\n\t\treturn { base64: base64UrlFromBytes(bytes) };\n\t}\n};\n\nconst hexFromBytes = (bytes: Uint8Array): string =>\n\tArray.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst bytesFromHex = (hex: string): Uint8Array | null => {\n\tconst clean = hex.replaceAll(/\\s/g, \"\");\n\tif (clean.length % 2 !== 0 || !/^[\\da-f]*$/i.test(clean)) return null;\n\treturn Uint8Array.from(clean.match(/.{2}/g)?.map((pair) => Number.parseInt(pair, 16)) ?? []);\n};\n\nconst isJson = (value?: string): boolean => {\n\tif (!value) return false;\n\ttry {\n\t\tJSON.parse(value);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const RedisValue = ({\n\tvalue,\n\tcompact = false,\n\tonDownload,\n}: {\n\tvalue: EncodedRedisValueSchemaType;\n\tcompact?: boolean;\n\tonDownload?: () => void;\n}) => {\n\tconst bytes = useMemo(() => bytesFromBase64Url(value.base64), [value.base64]);\n\tconst [mode, setMode] = useState<RedisValueMode>(\n\t\tvalue.utf8 ? (isJson(value.utf8) ? \"json\" : \"text\") : \"hex\",\n\t);\n\tconst [copied, setCopied] = useState(false);\n\tconst effectiveMode: RedisValueMode =\n\t\tmode === \"json\" && !isJson(value.utf8)\n\t\t\t? value.utf8 === undefined\n\t\t\t\t? \"hex\"\n\t\t\t\t: \"text\"\n\t\t\t: mode;\n\tconst display =\n\t\teffectiveMode === \"hex\"\n\t\t\t? hexFromBytes(bytes)\n\t\t\t: effectiveMode === \"base64\"\n\t\t\t\t? value.base64\n\t\t\t\t: effectiveMode === \"json\" && value.utf8\n\t\t\t\t\t? JSON.stringify(JSON.parse(value.utf8), null, 2)\n\t\t\t\t\t: (value.utf8 ?? \"Binary value\");\n\n\tconst copy = async () => {\n\t\tawait navigator.clipboard.writeText(display);\n\t\tsetCopied(true);\n\t\twindow.setTimeout(() => setCopied(false), 1200);\n\t};\n\tconst download = () => {\n\t\tconst blob = new Blob([new Uint8Array(bytes).buffer as ArrayBuffer]);\n\t\tconst url = URL.createObjectURL(blob);\n\t\tconst anchor = document.createElement(\"a\");\n\t\tanchor.href = url;\n\t\tanchor.download = \"redis-value.bin\";\n\t\tanchor.click();\n\t\tURL.revokeObjectURL(url);\n\t};\n\n\tif (compact) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName=\"truncate font-mono text-xs text-foreground\"\n\t\t\t\ttitle={display}\n\t\t\t>\n\t\t\t\t{display || \"∅\"}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"overflow-hidden border border-border bg-background\">\n\t\t\t<div className=\"flex h-10 items-center justify-between border-b border-border\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tvalue={effectiveMode}\n\t\t\t\t\tonValueChange={(next) => next && setMode(next as RedisValueMode)}\n\t\t\t\t\tclassName=\"h-full rounded-none\"\n\t\t\t\t>\n\t\t\t\t\t{(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"text\",\n\t\t\t\t\t\t\t...(isJson(value.utf8) ? [\"json\" as const] : []),\n\t\t\t\t\t\t\t\"hex\",\n\t\t\t\t\t\t\t\"base64\",\n\t\t\t\t\t\t] as RedisValueMode[]\n\t\t\t\t\t).map((item) => (\n\t\t\t\t\t\t<ToggleGroupItem\n\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\tvalue={item}\n\t\t\t\t\t\t\taria-label={`View value as ${item}`}\n\t\t\t\t\t\t\tdisabled={(item === \"text\" || item === \"json\") && value.utf8 === undefined}\n\t\t\t\t\t\t\tclassName=\"h-full rounded-none! px-3 text-[10px] uppercase tracking-wider text-muted-foreground data-[state=on]:bg-muted data-[state=on]:text-foreground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item}\n\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t))}\n\t\t\t\t</ToggleGroup>\n\t\t\t\t<div className=\"flex\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\tonClick={copy}\n\t\t\t\t\t\taria-label={copied ? \"Value copied\" : \"Copy value\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"relative inline-flex items-center justify-center\">\n\t\t\t\t\t\t\t<Copy\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]\",\n\t\t\t\t\t\t\t\t\tcopied\n\t\t\t\t\t\t\t\t\t\t? \"scale-25 opacity-0 blur-[4px]\"\n\t\t\t\t\t\t\t\t\t\t: \"scale-100 opacity-100 blur-[0px]\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"absolute inset-0 transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]\",\n\t\t\t\t\t\t\t\t\tcopied\n\t\t\t\t\t\t\t\t\t\t? \"scale-100 opacity-100 blur-[0px]\"\n\t\t\t\t\t\t\t\t\t\t: \"scale-25 opacity-0 blur-[4px]\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\tonClick={onDownload ?? download}\n\t\t\t\t\t\taria-label=\"Download original bytes\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Download />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<pre className=\"max-h-[55vh] min-h-32 overflow-auto whitespace-pre-wrap break-all p-3 font-mono text-xs leading-5 text-foreground\">\n\t\t\t\t{display}\n\t\t\t</pre>\n\t\t</div>\n\t);\n};\n\n/**\n * Parses the visible draft under the selected encoding. `null` means the draft\n * has no byte representation yet (odd-length or non-hex characters, malformed\n * Base64) — never a value to submit.\n */\nconst parseDraft = (\n\tdraft: string,\n\tmode: \"text\" | \"hex\" | \"base64\",\n): EncodedRedisValueSchemaType | null => {\n\tif (mode === \"text\") return encodeTextValue(draft);\n\tif (mode === \"hex\") {\n\t\tconst parsed = bytesFromHex(draft);\n\t\treturn parsed && encodeBytesValue(parsed);\n\t}\n\ttry {\n\t\treturn encodeBytesValue(bytesFromBase64Url(draft));\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n/**\n * Value editor with a text/hex/base64 encoding switch. The committed `value`\n * always mirrors what the input displays: an unparseable draft commits `null`\n * (rendered via `aria-invalid`), so consumers MUST disable their actions while\n * `value === null` instead of submitting a stale earlier value.\n */\nexport const RedisValueInput = ({\n\tvalue,\n\tonChange,\n\tplaceholder,\n\tclassName,\n\tid,\n}: {\n\tvalue: EncodedRedisValueSchemaType | null;\n\tonChange: (value: EncodedRedisValueSchemaType | null) => void;\n\tplaceholder?: string;\n\tclassName?: string;\n\tid?: string;\n}) => {\n\tconst [mode, setMode] = useState<\"text\" | \"hex\" | \"base64\">(\n\t\tvalue !== null && value.utf8 === undefined ? \"hex\" : \"text\",\n\t);\n\t// While the draft is invalid (value === null) there is nothing canonical to\n\t// re-derive the text from, so the draft stays untouched.\n\tconst shown =\n\t\tvalue === null\n\t\t\t? null\n\t\t\t: mode === \"text\"\n\t\t\t\t? (value.utf8 ?? \"\")\n\t\t\t\t: mode === \"hex\"\n\t\t\t\t\t? hexFromBytes(bytesFromBase64Url(value.base64))\n\t\t\t\t\t: value.base64;\n\tconst [draft, setDraft] = useState(shown ?? \"\");\n\tuseEffect(() => {\n\t\tif (shown !== null) setDraft(shown);\n\t}, [shown]);\n\tconst update = (next: string) => {\n\t\tsetDraft(next);\n\t\tonChange(parseDraft(next, mode));\n\t};\n\tconst switchMode = (next: typeof mode) => {\n\t\tsetMode(next);\n\t\t// An invalid draft may become valid under the new encoding (and vice\n\t\t// versa); re-commit so the parent always tracks the visible text.\n\t\tif (value === null) onChange(parseDraft(draft, next));\n\t};\n\n\treturn (\n\t\t<div className={cn(\"flex min-w-0\", className)}>\n\t\t\t<Select\n\t\t\t\tvalue={mode}\n\t\t\t\tonValueChange={(next) => switchMode(next as typeof mode)}\n\t\t\t>\n\t\t\t\t<SelectTrigger\n\t\t\t\t\taria-label=\"Value encoding\"\n\t\t\t\t\tclassName=\"h-8! w-18 shrink-0 rounded-e-none border-e-0 px-1 font-mono text-[10px] uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<SelectValue />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectItem value=\"text\">Text</SelectItem>\n\t\t\t\t\t<SelectItem value=\"hex\">Hex</SelectItem>\n\t\t\t\t\t<SelectItem value=\"base64\">Base64</SelectItem>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t\t<Input\n\t\t\t\tid={id}\n\t\t\t\tvalue={draft}\n\t\t\t\tonChange={(event) => update(event.target.value)}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\taria-invalid={value === null || undefined}\n\t\t\t\tclassName=\"rounded-s-none font-mono h-8!\"\n\t\t\t/>\n\t\t</div>\n\t);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"redis-value-COa6YzFD.js","names":[],"sources":["../../src/features/redis-browser/hooks/use-redis-browser.ts","../../src/features/redis-browser/components/redis-value.tsx"],"sourcesContent":["import type {\n\tCreateKeySchemaType,\n\tKeyActionSchemaType,\n\tRedisKeyTypeSchemaType,\n} from \"@db-studio/shared/types\";\nimport { useInfiniteQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { toast } from \"sonner\";\nimport {\n\tapplyRedisKeyAction,\n\tcreateRedisKey,\n\tdeleteRedisKey,\n\tgetRedisKey,\n\tscanRedisKeys,\n} from \"@/shared/api\";\nimport { redisKeyBrowserKeys } from \"@/shared/query/keys\";\nimport { useDatabaseStore } from \"@/stores/database.store\";\n\nexport const useRedisKeys = ({\n\tsearch,\n\texactPattern,\n\ttype,\n}: {\n\tsearch: string;\n\texactPattern: boolean;\n\ttype: string;\n}) => {\n\tconst { selectedDatabase } = useDatabaseStore();\n\treturn useInfiniteQuery({\n\t\tqueryKey: redisKeyBrowserKeys.list(selectedDatabase, search, exactPattern, type),\n\t\tqueryFn: async ({ pageParam }) => {\n\t\t\tconst response = await scanRedisKeys({\n\t\t\t\tdb: selectedDatabase ?? \"\",\n\t\t\t\tcursor: pageParam || undefined,\n\t\t\t\tlimit: 100,\n\t\t\t\tsearch: search || undefined,\n\t\t\t\texactPattern,\n\t\t\t\ttype: (type || undefined) as Exclude<RedisKeyTypeSchemaType, \"unknown\"> | undefined,\n\t\t\t});\n\t\t\treturn response.data.data;\n\t\t},\n\t\tinitialPageParam: \"\",\n\t\tgetNextPageParam: (page) => page.nextCursor ?? undefined,\n\t\tenabled: selectedDatabase !== null,\n\t\tstaleTime: Number.POSITIVE_INFINITY,\n\t});\n};\n\nexport const useRedisKey = (\n\tkey: string | null,\n\tfull = false,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n) => {\n\tconst { selectedDatabase } = useDatabaseStore();\n\treturn useInfiniteQuery({\n\t\tqueryKey: redisKeyBrowserKeys.detail(selectedDatabase, key, full, direction),\n\t\tqueryFn: async ({ pageParam }) => {\n\t\t\tconst response = await getRedisKey({\n\t\t\t\tdb: selectedDatabase ?? \"\",\n\t\t\t\tkey: key ?? \"\",\n\t\t\t\tcursor: pageParam || undefined,\n\t\t\t\tfull,\n\t\t\t\tdirection,\n\t\t\t});\n\t\t\treturn response.data.data;\n\t\t},\n\t\tinitialPageParam: \"\",\n\t\tgetNextPageParam: (page) => page.nextCursor ?? undefined,\n\t\tenabled: selectedDatabase !== null && key !== null,\n\t\tstaleTime: Number.POSITIVE_INFINITY,\n\t\tretry: false,\n\t});\n};\n\nconst mutationError = (error: Error & { details?: unknown }): string =>\n\t(typeof error.details === \"string\" && error.details) ||\n\terror.message ||\n\t\"Redis operation failed\";\n\nexport const useRedisKeyMutations = () => {\n\tconst { selectedDatabase } = useDatabaseStore();\n\tconst queryClient = useQueryClient();\n\tconst refresh = async () =>\n\t\tqueryClient.invalidateQueries({ queryKey: redisKeyBrowserKeys.all });\n\n\tconst createMutation = useMutation({\n\t\tmutationFn: (data: CreateKeySchemaType) =>\n\t\t\tcreateRedisKey({ db: selectedDatabase ?? \"\", data }).then(\n\t\t\t\t(response) => response.data.data,\n\t\t\t),\n\t\tonSuccess: refresh,\n\t});\n\tconst actionMutation = useMutation({\n\t\tmutationFn: ({ key, data }: { key: string; data: KeyActionSchemaType }) =>\n\t\t\tapplyRedisKeyAction({ db: selectedDatabase ?? \"\", key, data }).then(\n\t\t\t\t(response) => response.data.data,\n\t\t\t),\n\t\tonSuccess: refresh,\n\t});\n\tconst deleteMutation = useMutation({\n\t\tmutationFn: ({\n\t\t\tkey,\n\t\t\texpectedRevision,\n\t\t\tforce,\n\t\t}: {\n\t\t\tkey: string;\n\t\t\texpectedRevision: string;\n\t\t\tforce?: boolean;\n\t\t}) =>\n\t\t\tdeleteRedisKey({ db: selectedDatabase ?? \"\", key, expectedRevision, force }).then(\n\t\t\t\t(response) => response.data.data,\n\t\t\t),\n\t\tonSuccess: refresh,\n\t});\n\n\treturn {\n\t\tcreateKey: (data: CreateKeySchemaType) =>\n\t\t\ttoast\n\t\t\t\t.promise(createMutation.mutateAsync(data), {\n\t\t\t\t\tloading: \"Creating Redis key…\",\n\t\t\t\t\tsuccess: \"Redis key created\",\n\t\t\t\t\terror: mutationError,\n\t\t\t\t})\n\t\t\t\t.unwrap(),\n\t\tapplyAction: (key: string, data: KeyActionSchemaType) =>\n\t\t\ttoast\n\t\t\t\t.promise(actionMutation.mutateAsync({ key, data }), {\n\t\t\t\t\tloading: \"Applying Redis change…\",\n\t\t\t\t\tsuccess: \"Redis change applied\",\n\t\t\t\t\terror: mutationError,\n\t\t\t\t})\n\t\t\t\t.unwrap(),\n\t\tdeleteKey: (key: string, expectedRevision: string, force?: boolean) =>\n\t\t\ttoast\n\t\t\t\t.promise(deleteMutation.mutateAsync({ key, expectedRevision, force }), {\n\t\t\t\t\tloading: \"Deleting Redis key…\",\n\t\t\t\t\tsuccess: \"Redis key deleted\",\n\t\t\t\t\terror: mutationError,\n\t\t\t\t})\n\t\t\t\t.unwrap(),\n\t\tisPending:\n\t\t\tcreateMutation.isPending || actionMutation.isPending || deleteMutation.isPending,\n\t};\n};\n","import type { EncodedRedisValueSchemaType } from \"@db-studio/shared/types\";\nimport { Button } from \"@db-studio/ui/button\";\nimport { Input } from \"@db-studio/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@db-studio/ui/select\";\nimport { ToggleGroup, ToggleGroupItem } from \"@db-studio/ui/toggle-group\";\nimport { cn } from \"@db-studio/ui/utils\";\nimport { Check, Copy, Download } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type RedisValueMode = \"text\" | \"json\" | \"hex\" | \"base64\";\n\nexport const bytesFromBase64Url = (base64: string): Uint8Array => {\n\tconst normalized = base64.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n\tconst padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n\treturn Uint8Array.from(atob(padded), (character) => character.charCodeAt(0));\n};\n\nexport const base64UrlFromBytes = (bytes: Uint8Array): string => {\n\tlet binary = \"\";\n\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\treturn btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\n};\n\nexport const encodeTextValue = (value: string): EncodedRedisValueSchemaType => ({\n\tbase64: base64UrlFromBytes(new TextEncoder().encode(value)),\n\tutf8: value,\n});\n\nconst utf8Decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\n/** Encodes raw bytes, keeping `utf8` whenever the bytes are clean UTF-8 text. */\nexport const encodeBytesValue = (bytes: Uint8Array): EncodedRedisValueSchemaType => {\n\ttry {\n\t\treturn { base64: base64UrlFromBytes(bytes), utf8: utf8Decoder.decode(bytes) };\n\t} catch {\n\t\treturn { base64: base64UrlFromBytes(bytes) };\n\t}\n};\n\nconst hexFromBytes = (bytes: Uint8Array): string =>\n\tArray.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst bytesFromHex = (hex: string): Uint8Array | null => {\n\tconst clean = hex.replaceAll(/\\s/g, \"\");\n\tif (clean.length % 2 !== 0 || !/^[\\da-f]*$/i.test(clean)) return null;\n\treturn Uint8Array.from(clean.match(/.{2}/g)?.map((pair) => Number.parseInt(pair, 16)) ?? []);\n};\n\nconst isJson = (value?: string): boolean => {\n\tif (!value) return false;\n\ttry {\n\t\tJSON.parse(value);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const RedisValue = ({\n\tvalue,\n\tcompact = false,\n\tonDownload,\n}: {\n\tvalue: EncodedRedisValueSchemaType;\n\tcompact?: boolean;\n\tonDownload?: () => void;\n}) => {\n\tconst bytes = useMemo(() => bytesFromBase64Url(value.base64), [value.base64]);\n\tconst [mode, setMode] = useState<RedisValueMode>(\n\t\tvalue.utf8 ? (isJson(value.utf8) ? \"json\" : \"text\") : \"hex\",\n\t);\n\tconst [copied, setCopied] = useState(false);\n\tconst effectiveMode: RedisValueMode =\n\t\tmode === \"json\" && !isJson(value.utf8)\n\t\t\t? value.utf8 === undefined\n\t\t\t\t? \"hex\"\n\t\t\t\t: \"text\"\n\t\t\t: mode;\n\tconst display =\n\t\teffectiveMode === \"hex\"\n\t\t\t? hexFromBytes(bytes)\n\t\t\t: effectiveMode === \"base64\"\n\t\t\t\t? value.base64\n\t\t\t\t: effectiveMode === \"json\" && value.utf8\n\t\t\t\t\t? JSON.stringify(JSON.parse(value.utf8), null, 2)\n\t\t\t\t\t: (value.utf8 ?? \"Binary value\");\n\n\tconst copy = async () => {\n\t\tawait navigator.clipboard.writeText(display);\n\t\tsetCopied(true);\n\t\twindow.setTimeout(() => setCopied(false), 1200);\n\t};\n\tconst download = () => {\n\t\tconst blob = new Blob([new Uint8Array(bytes).buffer as ArrayBuffer]);\n\t\tconst url = URL.createObjectURL(blob);\n\t\tconst anchor = document.createElement(\"a\");\n\t\tanchor.href = url;\n\t\tanchor.download = \"redis-value.bin\";\n\t\tanchor.click();\n\t\tURL.revokeObjectURL(url);\n\t};\n\n\tif (compact) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName=\"truncate font-mono text-xs text-foreground\"\n\t\t\t\ttitle={display}\n\t\t\t>\n\t\t\t\t{display || \"∅\"}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"overflow-hidden border border-border bg-background\">\n\t\t\t<div className=\"flex h-10 items-center justify-between border-b border-border\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tvalue={effectiveMode}\n\t\t\t\t\tonValueChange={(next) => next && setMode(next as RedisValueMode)}\n\t\t\t\t\tclassName=\"h-full rounded-none\"\n\t\t\t\t>\n\t\t\t\t\t{(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"text\",\n\t\t\t\t\t\t\t...(isJson(value.utf8) ? [\"json\" as const] : []),\n\t\t\t\t\t\t\t\"hex\",\n\t\t\t\t\t\t\t\"base64\",\n\t\t\t\t\t\t] as RedisValueMode[]\n\t\t\t\t\t).map((item) => (\n\t\t\t\t\t\t<ToggleGroupItem\n\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\tvalue={item}\n\t\t\t\t\t\t\taria-label={`View value as ${item}`}\n\t\t\t\t\t\t\tdisabled={(item === \"text\" || item === \"json\") && value.utf8 === undefined}\n\t\t\t\t\t\t\tclassName=\"h-full rounded-none! px-3 text-[10px] uppercase tracking-wider text-muted-foreground data-[state=on]:bg-muted data-[state=on]:text-foreground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item}\n\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t))}\n\t\t\t\t</ToggleGroup>\n\t\t\t\t<div className=\"flex\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\tonClick={copy}\n\t\t\t\t\t\taria-label={copied ? \"Value copied\" : \"Copy value\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"relative inline-flex items-center justify-center\">\n\t\t\t\t\t\t\t<Copy\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]\",\n\t\t\t\t\t\t\t\t\tcopied\n\t\t\t\t\t\t\t\t\t\t? \"scale-25 opacity-0 blur-[4px]\"\n\t\t\t\t\t\t\t\t\t\t: \"scale-100 opacity-100 blur-[0px]\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"absolute inset-0 transition-[opacity,scale,filter] duration-300 ease-[cubic-bezier(0.2,0,0,1)]\",\n\t\t\t\t\t\t\t\t\tcopied\n\t\t\t\t\t\t\t\t\t\t? \"scale-100 opacity-100 blur-[0px]\"\n\t\t\t\t\t\t\t\t\t\t: \"scale-25 opacity-0 blur-[4px]\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\tonClick={onDownload ?? download}\n\t\t\t\t\t\taria-label=\"Download original bytes\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Download />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<pre className=\"max-h-[55vh] min-h-32 overflow-auto whitespace-pre-wrap break-all p-3 font-mono text-xs leading-5 text-foreground\">\n\t\t\t\t{display}\n\t\t\t</pre>\n\t\t</div>\n\t);\n};\n\n/**\n * Parses the visible draft under the selected encoding. `null` means the draft\n * has no byte representation yet (odd-length or non-hex characters, malformed\n * Base64) — never a value to submit.\n */\nconst parseDraft = (\n\tdraft: string,\n\tmode: \"text\" | \"hex\" | \"base64\",\n): EncodedRedisValueSchemaType | null => {\n\tif (mode === \"text\") return encodeTextValue(draft);\n\tif (mode === \"hex\") {\n\t\tconst parsed = bytesFromHex(draft);\n\t\treturn parsed && encodeBytesValue(parsed);\n\t}\n\ttry {\n\t\treturn encodeBytesValue(bytesFromBase64Url(draft));\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n/**\n * Value editor with a text/hex/base64 encoding switch. The committed `value`\n * always mirrors what the input displays: an unparseable draft commits `null`\n * (rendered via `aria-invalid`), so consumers MUST disable their actions while\n * `value === null` instead of submitting a stale earlier value.\n */\nexport const RedisValueInput = ({\n\tvalue,\n\tonChange,\n\tplaceholder,\n\tclassName,\n\tid,\n}: {\n\tvalue: EncodedRedisValueSchemaType | null;\n\tonChange: (value: EncodedRedisValueSchemaType | null) => void;\n\tplaceholder?: string;\n\tclassName?: string;\n\tid?: string;\n}) => {\n\tconst [mode, setMode] = useState<\"text\" | \"hex\" | \"base64\">(\n\t\tvalue !== null && value.utf8 === undefined ? \"hex\" : \"text\",\n\t);\n\t// While the draft is invalid (value === null) there is nothing canonical to\n\t// re-derive the text from, so the draft stays untouched.\n\tconst shown =\n\t\tvalue === null\n\t\t\t? null\n\t\t\t: mode === \"text\"\n\t\t\t\t? (value.utf8 ?? \"\")\n\t\t\t\t: mode === \"hex\"\n\t\t\t\t\t? hexFromBytes(bytesFromBase64Url(value.base64))\n\t\t\t\t\t: value.base64;\n\tconst [draft, setDraft] = useState(shown ?? \"\");\n\tuseEffect(() => {\n\t\tif (shown !== null) setDraft(shown);\n\t}, [shown]);\n\tconst update = (next: string) => {\n\t\tsetDraft(next);\n\t\tonChange(parseDraft(next, mode));\n\t};\n\tconst switchMode = (next: typeof mode) => {\n\t\tsetMode(next);\n\t\t// An invalid draft may become valid under the new encoding (and vice\n\t\t// versa); re-commit so the parent always tracks the visible text.\n\t\tif (value === null) onChange(parseDraft(draft, next));\n\t};\n\n\treturn (\n\t\t<div className={cn(\"flex min-w-0\", className)}>\n\t\t\t<Select\n\t\t\t\tvalue={mode}\n\t\t\t\tonValueChange={(next) => switchMode(next as typeof mode)}\n\t\t\t>\n\t\t\t\t<SelectTrigger\n\t\t\t\t\taria-label=\"Value encoding\"\n\t\t\t\t\tclassName=\"h-8! w-18 shrink-0 rounded-e-none border-e-0 px-1 font-mono text-[10px] uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<SelectValue />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectItem value=\"text\">Text</SelectItem>\n\t\t\t\t\t<SelectItem value=\"hex\">Hex</SelectItem>\n\t\t\t\t\t<SelectItem value=\"base64\">Base64</SelectItem>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t\t<Input\n\t\t\t\tid={id}\n\t\t\t\tvalue={draft}\n\t\t\t\tonChange={(event) => update(event.target.value)}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\taria-invalid={value === null || undefined}\n\t\t\t\tclassName=\"rounded-s-none font-mono h-8!\"\n\t\t\t/>\n\t\t</div>\n\t);\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{kt as t}from"./radix-ui-CgJOuzDv.js";import{r as e}from"./index-XoXxezo4.js";import{t as o}from"./query-runner-Bgs0j50a.js";var n=t();function s(){const{cmd:r}=e.useSearch();return(0,n.jsx)(o,{initialQuery:r})}export{s as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-
|
|
1
|
+
{"version":3,"file":"runner-DW5iXMmq.js","names":["RunnerScreen","Route","RouteComponent","cmd","useSearch","component"],"sources":["../../src/routes/_pathlessLayout/runner/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\";\nimport { RunnerScreen } from \"@/features/query-runner\";\n\nexport const Route = createFileRoute(\"/_pathlessLayout/runner/\")({\n\tvalidateSearch: (search: Record<string, unknown>): { cmd?: string } =>\n\t\ttypeof search.cmd === \"string\" ? { cmd: search.cmd } : {},\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\tconst { cmd } = Route.useSearch();\n\treturn <RunnerScreen initialQuery={cmd} />;\n}\n"],"mappings":"6IASA,SAASE,GAAiB,CACzB,KAAM,CAAEC,IAAAA,CAAAA,EAAQF,EAAMG,UAAU,EAChC,SAAO,EAAA,KAAC,EAAD,CAAc,aAAcD,CAAI,CAAA,CACxC"}
|