@rozenite/storage-plugin 1.4.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 (54) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +20 -0
  3. package/README.md +77 -0
  4. package/dist/assets/panel-C7usUotG.js +22 -0
  5. package/dist/assets/panel-DMhXYHH4.css +1 -0
  6. package/dist/panel.html +31 -0
  7. package/dist/react-native.cjs +1 -0
  8. package/dist/react-native.d.ts +4 -0
  9. package/dist/react-native.js +200 -0
  10. package/dist/rozenite.config.d.ts +7 -0
  11. package/dist/rozenite.json +1 -0
  12. package/dist/src/react-native/adapters/async-storage.d.ts +33 -0
  13. package/dist/src/react-native/adapters/index.d.ts +6 -0
  14. package/dist/src/react-native/adapters/mmkv.d.ts +13 -0
  15. package/dist/src/react-native/adapters/secure-storage.d.ts +18 -0
  16. package/dist/src/react-native/is-garbled.d.ts +1 -0
  17. package/dist/src/react-native/storage-view.d.ts +19 -0
  18. package/dist/src/react-native/useRozeniteStoragePlugin.d.ts +6 -0
  19. package/dist/src/shared/messaging.d.ts +29 -0
  20. package/dist/src/shared/types.d.ts +60 -0
  21. package/dist/src/ui/add-entry-dialog.d.ts +9 -0
  22. package/dist/src/ui/confirm-dialog.d.ts +11 -0
  23. package/dist/src/ui/edit-entry-dialog.d.ts +9 -0
  24. package/dist/src/ui/editable-table.d.ts +10 -0
  25. package/dist/src/ui/entry-detail-dialog.d.ts +8 -0
  26. package/dist/src/ui/panel.d.ts +1 -0
  27. package/dist/types.cjs +1 -0
  28. package/dist/types.js +11 -0
  29. package/dist/useRozeniteStoragePlugin.cjs +1 -0
  30. package/dist/useRozeniteStoragePlugin.js +212 -0
  31. package/package.json +59 -0
  32. package/postcss.config.js +6 -0
  33. package/react-native.ts +40 -0
  34. package/rozenite.config.ts +8 -0
  35. package/src/css-modules.d.ts +4 -0
  36. package/src/react-native/adapters/async-storage.ts +115 -0
  37. package/src/react-native/adapters/index.ts +19 -0
  38. package/src/react-native/adapters/mmkv.ts +187 -0
  39. package/src/react-native/adapters/secure-storage.ts +76 -0
  40. package/src/react-native/is-garbled.ts +17 -0
  41. package/src/react-native/storage-view.ts +245 -0
  42. package/src/react-native/useRozeniteStoragePlugin.ts +162 -0
  43. package/src/shared/messaging.ts +37 -0
  44. package/src/shared/types.ts +66 -0
  45. package/src/ui/add-entry-dialog.tsx +310 -0
  46. package/src/ui/confirm-dialog.tsx +100 -0
  47. package/src/ui/edit-entry-dialog.tsx +280 -0
  48. package/src/ui/editable-table.tsx +298 -0
  49. package/src/ui/entry-detail-dialog.tsx +220 -0
  50. package/src/ui/globals.css +123 -0
  51. package/src/ui/panel.tsx +442 -0
  52. package/tailwind.config.ts +94 -0
  53. package/tsconfig.json +36 -0
  54. package/vite.config.ts +20 -0
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 0 0% 3.9%;--card: 0 0% 100%;--card-foreground: 0 0% 3.9%;--popover: 0 0% 100%;--popover-foreground: 0 0% 3.9%;--primary: 0 0% 9%;--primary-foreground: 0 0% 98%;--secondary: 0 0% 96.1%;--secondary-foreground: 0 0% 9%;--muted: 0 0% 96.1%;--muted-foreground: 0 0% 45.1%;--accent: 0 0% 96.1%;--accent-foreground: 0 0% 9%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--border: 0 0% 89.8%;--input: 0 0% 89.8%;--ring: 0 0% 3.9%;--chart-1: 12 76% 61%;--chart-2: 173 58% 39%;--chart-3: 197 37% 24%;--chart-4: 43 74% 66%;--chart-5: 27 87% 67%;--radius: .5rem;--sidebar-background: 0 0% 98%;--sidebar-foreground: 240 5.3% 26.1%;--sidebar-primary: 240 5.9% 10%;--sidebar-primary-foreground: 0 0% 98%;--sidebar-accent: 240 4.8% 95.9%;--sidebar-accent-foreground: 240 5.9% 10%;--sidebar-border: 220 13% 91%;--sidebar-ring: 217.2 91.2% 59.8%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.left-2{left:.5rem}.top-0{top:0}.top-1\/2{top:50%}.z-10{z-index:10}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-2{margin-left:.5rem}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.block{display:block}.flex{display:flex}.table{display:table}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-96{max-height:24rem}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-96{width:24rem}.w-\[90vw\]{width:90vw}.w-full{width:100%}.max-w-2xl{max-width:42rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-relaxed{line-height:1.625}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-cyan-500{--tw-text-opacity: 1;color:rgb(6 182 212 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-pink-500{--tw-text-opacity: 1;color:rgb(236 72 153 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#1f2937;border-radius:4px}::-webkit-scrollbar-thumb{background:#374151;border-radius:4px;border:1px solid #1f2937}::-webkit-scrollbar-thumb:hover{background:#4b5563}::-webkit-scrollbar-thumb:active{background:#6b7280}::-webkit-scrollbar-corner{background:#1f2937}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:text-blue-400:hover{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-600:disabled{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>panel Panel</title>
7
+ <style>
8
+ html,
9
+ body {
10
+ height: 100%;
11
+ }
12
+
13
+ body {
14
+ overflow: hidden;
15
+ }
16
+
17
+ #root {
18
+ display: flex;
19
+ height: 100%;
20
+ }
21
+ </style>
22
+ <script>
23
+ var __ROZENITE_PANEL__ = true;
24
+ </script>
25
+ <script type="module" crossorigin src="./assets/panel-C7usUotG.js"></script>
26
+ <link rel="stylesheet" crossorigin href="./assets/panel-DMhXYHH4.css">
27
+ </head>
28
+ <body>
29
+ <div id="root"></div>
30
+ </body>
31
+ </html>
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("./types.cjs"),p=e=>!!(e.includes("�")||/[\u0000-\u001F\u007F-\u009F]/.test(e)||[...e].filter(a=>a>=" "&&a<="~").length/e.length<.7),c=e=>"remove"in e,y=e=>{if(Array.isArray(e)){if(e.some(c))throw new Error("[Rozenite] Storage Plugin: MMKV arrays are not supported for v4 storages. Pass a record of storage IDs and MMKV instances.");return Object.fromEntries(e.map(n=>[n.id,n]))}return e},S=e=>c(e)?{set:(t,n)=>e.set(t,n),getBoolean:t=>e.getBoolean(t),getString:t=>e.getString(t),getNumber:t=>e.getNumber(t),getBuffer:t=>e.getBuffer(t),delete:t=>e.remove(t),getAllKeys:()=>e.getAllKeys(),addOnValueChangedListener:t=>e.addOnValueChangedListener(t)}:{set:(t,n)=>e.set(t,n),getBoolean:t=>e.getBoolean(t),getString:t=>e.getString(t),getNumber:t=>e.getNumber(t),getBuffer:t=>e.getBuffer(t),delete:t=>e.delete(t),getAllKeys:()=>e.getAllKeys(),addOnValueChangedListener:t=>e.addOnValueChangedListener(t)},A=(e,t)=>{const n=e.getString(t);if(n!==void 0&&n.length>0)return p(n)?{key:t,type:"buffer",value:Array.from(new TextEncoder().encode(n))}:{key:t,type:"string",value:n};const a=e.getNumber(t);if(a!==void 0)return{key:t,type:"number",value:a};const i=e.getBoolean(t);if(i!==void 0)return{key:t,type:"boolean",value:i};const s=e.getBuffer(t);if(s!==void 0)return{key:t,type:"buffer",value:Array.from(new Uint8Array(s))}},b=(e,t)=>{if(t.type==="buffer"){e.set(t.key,new Uint8Array(t.value).buffer);return}e.set(t.key,t.value)},v=(e,t)=>{if(e)return e instanceof RegExp?e:e[t]},V=({adapterId:e="mmkv",adapterName:t="MMKV",storages:n,blacklist:a})=>{const i=y(n),s=Object.entries(i).map(([u,l])=>{const r=S(l);return{id:u,name:u,blacklist:v(a,u),capabilities:{supportedTypes:f.DEFAULT_SUPPORTED_TYPES},storage:{kind:"sync",getAllKeys:()=>r.getAllKeys(),get:o=>A(r,o),set:o=>b(r,o),delete:o=>r.delete(o),subscribe:o=>r.addOnValueChangedListener(o)}}});return{id:e,name:t,storages:s}},g=(e,t,n,a)=>{const i="storage"in t?t:{storage:t},{storage:s,name:u,blacklist:l}=i;return{id:e,name:u??n??e,blacklist:l??a,capabilities:{supportedTypes:["string"]},storage:{kind:"async",getAllKeys:()=>s.getAllKeys(),get:async r=>{const o=await s.getItem(r);if(o!==null)return{key:r,type:"string",value:o}},set:async r=>{if(r.type!=="string")throw new Error("AsyncStorage adapter supports only string values.");await s.setItem(r.key,r.value)},delete:r=>s.removeItem(r)}}},d=e=>{const{adapterId:t="async-storage",adapterName:n="AsyncStorage"}=e,a="storages"in e?Object.entries(e.storages).map(([i,s])=>g(i,s)):[g(e.storageId??"default",e.storage,e.storageName??"Default Storage",e.blacklist)];return{id:t,name:n,storages:a}},w=d,E=async e=>Array.isArray(e)?e:e(),K=({storage:e,keys:t,adapterId:n="expo-secure-store",adapterName:a="Expo SecureStore",storageId:i="default",storageName:s="Default Secure Storage",blacklist:u})=>({id:n,name:a,storages:[{id:i,name:s,blacklist:u,capabilities:{supportedTypes:["string"]},storage:{kind:"async",getAllKeys:()=>E(t),get:async r=>{const o=await e.getItemAsync(r);if(o!==null)return{key:r,type:"string",value:o}},set:async r=>{if(r.type!=="string")throw new Error("Expo SecureStore adapter supports only string values.");await e.setItemAsync(r.key,r.value)},delete:r=>e.deleteItemAsync(r)}}]});exports.useRozeniteStoragePlugin=void 0;const M=typeof window<"u"&&window.navigator.product!=="ReactNative",N=process.env.NODE_ENV!=="production",h=typeof window>"u";N&&!M&&!h?exports.useRozeniteStoragePlugin=require("./useRozeniteStoragePlugin.cjs").useRozeniteStoragePlugin:exports.useRozeniteStoragePlugin=()=>null;exports.createAsyncStorageAdapter=d;exports.createExpoAsyncStorageAdapter=w;exports.createExpoSecureStorageAdapter=K;exports.createMMKVStorageAdapter=V;
@@ -0,0 +1,4 @@
1
+ export { createAsyncStorageAdapter, createExpoAsyncStorageAdapter, createExpoSecureStorageAdapter, createMMKVStorageAdapter, } from './src/react-native/adapters';
2
+ export type { AsyncStorageInstanceConfig, AsyncStorageLike, CreateAsyncStorageAdapterOptions, CreateExpoAsyncStorageAdapterOptions, CreateExpoSecureStorageAdapterOptions, CreateMMKVStorageAdapterOptions, SecureStorageLike, } from './src/react-native/adapters';
3
+ export type { AsyncStorage, StorageAdapter, StorageCapabilities, StorageEntry, StorageEntryType, StorageEntryValue, StorageNode, SyncStorage, } from './src/shared/types';
4
+ export declare let useRozeniteStoragePlugin: typeof import('./src/react-native/useRozeniteStoragePlugin').useRozeniteStoragePlugin;
@@ -0,0 +1,200 @@
1
+ import { D as f } from "./types.js";
2
+ const p = (e) => !!(e.includes("�") || /[\u0000-\u001F\u007F-\u009F]/.test(e) || [...e].filter((s) => s >= " " && s <= "~").length / e.length < 0.7), d = (e) => "remove" in e, y = (e) => {
3
+ if (Array.isArray(e)) {
4
+ if (e.some(d))
5
+ throw new Error(
6
+ "[Rozenite] Storage Plugin: MMKV arrays are not supported for v4 storages. Pass a record of storage IDs and MMKV instances."
7
+ );
8
+ return Object.fromEntries(
9
+ e.map((n) => [n.id, n])
10
+ );
11
+ }
12
+ return e;
13
+ }, A = (e) => d(e) ? {
14
+ set: (t, n) => e.set(t, n),
15
+ getBoolean: (t) => e.getBoolean(t),
16
+ getString: (t) => e.getString(t),
17
+ getNumber: (t) => e.getNumber(t),
18
+ getBuffer: (t) => e.getBuffer(t),
19
+ delete: (t) => e.remove(t),
20
+ getAllKeys: () => e.getAllKeys(),
21
+ addOnValueChangedListener: (t) => e.addOnValueChangedListener(t)
22
+ } : {
23
+ set: (t, n) => e.set(t, n),
24
+ getBoolean: (t) => e.getBoolean(t),
25
+ getString: (t) => e.getString(t),
26
+ getNumber: (t) => e.getNumber(t),
27
+ getBuffer: (t) => e.getBuffer(t),
28
+ delete: (t) => e.delete(t),
29
+ getAllKeys: () => e.getAllKeys(),
30
+ addOnValueChangedListener: (t) => e.addOnValueChangedListener(t)
31
+ }, S = (e, t) => {
32
+ const n = e.getString(t);
33
+ if (n !== void 0 && n.length > 0)
34
+ return p(n) ? {
35
+ key: t,
36
+ type: "buffer",
37
+ value: Array.from(new TextEncoder().encode(n))
38
+ } : {
39
+ key: t,
40
+ type: "string",
41
+ value: n
42
+ };
43
+ const s = e.getNumber(t);
44
+ if (s !== void 0)
45
+ return {
46
+ key: t,
47
+ type: "number",
48
+ value: s
49
+ };
50
+ const i = e.getBoolean(t);
51
+ if (i !== void 0)
52
+ return {
53
+ key: t,
54
+ type: "boolean",
55
+ value: i
56
+ };
57
+ const a = e.getBuffer(t);
58
+ if (a !== void 0)
59
+ return {
60
+ key: t,
61
+ type: "buffer",
62
+ value: Array.from(new Uint8Array(a))
63
+ };
64
+ }, b = (e, t) => {
65
+ if (t.type === "buffer") {
66
+ e.set(t.key, new Uint8Array(t.value).buffer);
67
+ return;
68
+ }
69
+ e.set(t.key, t.value);
70
+ }, w = (e, t) => {
71
+ if (e)
72
+ return e instanceof RegExp ? e : e[t];
73
+ }, M = ({
74
+ adapterId: e = "mmkv",
75
+ adapterName: t = "MMKV",
76
+ storages: n,
77
+ blacklist: s
78
+ }) => {
79
+ const i = y(n), a = Object.entries(i).map(
80
+ ([u, l]) => {
81
+ const r = A(l);
82
+ return {
83
+ id: u,
84
+ name: u,
85
+ blacklist: w(s, u),
86
+ capabilities: {
87
+ supportedTypes: f
88
+ },
89
+ storage: {
90
+ kind: "sync",
91
+ getAllKeys: () => r.getAllKeys(),
92
+ get: (o) => S(r, o),
93
+ set: (o) => b(r, o),
94
+ delete: (o) => r.delete(o),
95
+ subscribe: (o) => r.addOnValueChangedListener(o)
96
+ }
97
+ };
98
+ }
99
+ );
100
+ return {
101
+ id: e,
102
+ name: t,
103
+ storages: a
104
+ };
105
+ }, g = (e, t, n, s) => {
106
+ const i = "storage" in t ? t : {
107
+ storage: t
108
+ }, { storage: a, name: u, blacklist: l } = i;
109
+ return {
110
+ id: e,
111
+ name: u ?? n ?? e,
112
+ blacklist: l ?? s,
113
+ capabilities: {
114
+ supportedTypes: ["string"]
115
+ },
116
+ storage: {
117
+ kind: "async",
118
+ getAllKeys: () => a.getAllKeys(),
119
+ get: async (r) => {
120
+ const o = await a.getItem(r);
121
+ if (o !== null)
122
+ return {
123
+ key: r,
124
+ type: "string",
125
+ value: o
126
+ };
127
+ },
128
+ set: async (r) => {
129
+ if (r.type !== "string")
130
+ throw new Error("AsyncStorage adapter supports only string values.");
131
+ await a.setItem(r.key, r.value);
132
+ },
133
+ delete: (r) => a.removeItem(r)
134
+ }
135
+ };
136
+ }, V = (e) => {
137
+ const { adapterId: t = "async-storage", adapterName: n = "AsyncStorage" } = e, s = "storages" in e ? Object.entries(e.storages).map(
138
+ ([i, a]) => g(i, a)
139
+ ) : [
140
+ g(
141
+ e.storageId ?? "default",
142
+ e.storage,
143
+ e.storageName ?? "Default Storage",
144
+ e.blacklist
145
+ )
146
+ ];
147
+ return {
148
+ id: t,
149
+ name: n,
150
+ storages: s
151
+ };
152
+ }, B = V, v = async (e) => Array.isArray(e) ? e : e(), O = ({
153
+ storage: e,
154
+ keys: t,
155
+ adapterId: n = "expo-secure-store",
156
+ adapterName: s = "Expo SecureStore",
157
+ storageId: i = "default",
158
+ storageName: a = "Default Secure Storage",
159
+ blacklist: u
160
+ }) => ({
161
+ id: n,
162
+ name: s,
163
+ storages: [{
164
+ id: i,
165
+ name: a,
166
+ blacklist: u,
167
+ capabilities: {
168
+ supportedTypes: ["string"]
169
+ },
170
+ storage: {
171
+ kind: "async",
172
+ getAllKeys: () => v(t),
173
+ get: async (r) => {
174
+ const o = await e.getItemAsync(r);
175
+ if (o !== null)
176
+ return {
177
+ key: r,
178
+ type: "string",
179
+ value: o
180
+ };
181
+ },
182
+ set: async (r) => {
183
+ if (r.type !== "string")
184
+ throw new Error("Expo SecureStore adapter supports only string values.");
185
+ await e.setItemAsync(r.key, r.value);
186
+ },
187
+ delete: (r) => e.deleteItemAsync(r)
188
+ }
189
+ }]
190
+ });
191
+ let c;
192
+ const E = typeof window < "u" && window.navigator.product !== "ReactNative", K = process.env.NODE_ENV !== "production", N = typeof window > "u";
193
+ K && !E && !N ? c = require("./useRozeniteStoragePlugin.js").useRozeniteStoragePlugin : c = () => null;
194
+ export {
195
+ V as createAsyncStorageAdapter,
196
+ B as createExpoAsyncStorageAdapter,
197
+ O as createExpoSecureStorageAdapter,
198
+ M as createMMKVStorageAdapter,
199
+ c as useRozeniteStoragePlugin
200
+ };
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ panels: {
3
+ name: string;
4
+ source: string;
5
+ }[];
6
+ };
7
+ export default _default;
@@ -0,0 +1 @@
1
+ {"name":"@rozenite/storage-plugin","version":"1.4.0","description":"Generic Storage Inspector for Rozenite.","panels":[{"name":"Storage","source":"/panel.html"}]}
@@ -0,0 +1,33 @@
1
+ import { StorageAdapter } from '../../shared/types';
2
+ export type AsyncStorageLike = {
3
+ getAllKeys: () => Promise<string[]>;
4
+ getItem: (key: string) => Promise<string | null>;
5
+ setItem: (key: string, value: string) => Promise<void>;
6
+ removeItem: (key: string) => Promise<void>;
7
+ };
8
+ export type AsyncStorageInstanceConfig = {
9
+ storage: AsyncStorageLike;
10
+ name?: string;
11
+ blacklist?: RegExp;
12
+ };
13
+ type SingleStorageOptions = {
14
+ storage: AsyncStorageLike;
15
+ adapterId?: string;
16
+ adapterName?: string;
17
+ storageId?: string;
18
+ storageName?: string;
19
+ blacklist?: RegExp;
20
+ };
21
+ type MultiStorageOptions = {
22
+ storages: Record<string, AsyncStorageLike | AsyncStorageInstanceConfig>;
23
+ adapterId?: string;
24
+ adapterName?: string;
25
+ };
26
+ export type CreateAsyncStorageAdapterOptions = SingleStorageOptions | MultiStorageOptions;
27
+ export declare const createAsyncStorageAdapter: (options: CreateAsyncStorageAdapterOptions) => StorageAdapter;
28
+ /**
29
+ * @deprecated Use createAsyncStorageAdapter instead.
30
+ */
31
+ export declare const createExpoAsyncStorageAdapter: (options: CreateAsyncStorageAdapterOptions) => StorageAdapter;
32
+ export type CreateExpoAsyncStorageAdapterOptions = CreateAsyncStorageAdapterOptions;
33
+ export {};
@@ -0,0 +1,6 @@
1
+ export { createMMKVStorageAdapter } from './mmkv';
2
+ export type { CreateMMKVStorageAdapterOptions } from './mmkv';
3
+ export { createAsyncStorageAdapter, createExpoAsyncStorageAdapter, } from './async-storage';
4
+ export type { AsyncStorageInstanceConfig, AsyncStorageLike, CreateAsyncStorageAdapterOptions, CreateExpoAsyncStorageAdapterOptions, } from './async-storage';
5
+ export { createExpoSecureStorageAdapter } from './secure-storage';
6
+ export type { CreateExpoSecureStorageAdapterOptions, SecureStorageLike, } from './secure-storage';
@@ -0,0 +1,13 @@
1
+ import { MMKV as MMKVV3 } from 'react-native-mmkv-v3';
2
+ import { MMKV as MMKVV4 } from 'react-native-mmkv-v4';
3
+ import { StorageAdapter } from '../../shared/types';
4
+ type MMKV = MMKVV3 | MMKVV4;
5
+ export type MMKVBlacklistConfig = RegExp | Record<string, RegExp | undefined>;
6
+ export type CreateMMKVStorageAdapterOptions = {
7
+ adapterId?: string;
8
+ adapterName?: string;
9
+ storages: MMKV[] | Record<string, MMKV>;
10
+ blacklist?: MMKVBlacklistConfig;
11
+ };
12
+ export declare const createMMKVStorageAdapter: ({ adapterId, adapterName, storages, blacklist, }: CreateMMKVStorageAdapterOptions) => StorageAdapter;
13
+ export {};
@@ -0,0 +1,18 @@
1
+ import { StorageAdapter } from '../../shared/types';
2
+ export type SecureStorageLike = {
3
+ getItemAsync: (key: string) => Promise<string | null>;
4
+ setItemAsync: (key: string, value: string) => Promise<void>;
5
+ deleteItemAsync: (key: string) => Promise<void>;
6
+ };
7
+ type KeySource = string[] | (() => Promise<string[]>);
8
+ export type CreateExpoSecureStorageAdapterOptions = {
9
+ storage: SecureStorageLike;
10
+ keys: KeySource;
11
+ adapterId?: string;
12
+ adapterName?: string;
13
+ storageId?: string;
14
+ storageName?: string;
15
+ blacklist?: RegExp;
16
+ };
17
+ export declare const createExpoSecureStorageAdapter: ({ storage, keys, adapterId, adapterName, storageId, storageName, blacklist, }: CreateExpoSecureStorageAdapterOptions) => StorageAdapter;
18
+ export {};
@@ -0,0 +1 @@
1
+ export declare const looksLikeGarbled: (str: string) => boolean;
@@ -0,0 +1,19 @@
1
+ import { StorageAdapter, StorageCapabilities, StorageEntry, StorageNode, StorageSubscription, StorageTarget } from '../shared/types';
2
+ export type StorageView = {
3
+ id: string;
4
+ target: StorageTarget;
5
+ adapterName: string;
6
+ storageName: string;
7
+ capabilities: StorageCapabilities;
8
+ get: (key: string) => Promise<StorageEntry | undefined>;
9
+ set: (entry: StorageEntry) => Promise<void>;
10
+ delete: (key: string) => Promise<void>;
11
+ getAllKeys: () => Promise<string[]>;
12
+ getAllEntries: () => Promise<StorageEntry[]>;
13
+ watch: (callbacks: {
14
+ onSet: (entry: StorageEntry) => void;
15
+ onDelete: (key: string) => void;
16
+ }) => Promise<StorageSubscription>;
17
+ };
18
+ export declare const createStorageView: (adapter: StorageAdapter, storageNode: StorageNode) => StorageView;
19
+ export declare const createStorageViews: (storages: StorageAdapter[]) => StorageView[];
@@ -0,0 +1,6 @@
1
+ import { StorageEventMap } from '../shared/messaging';
2
+ import { StorageAdapter } from '../shared/types';
3
+ export type RozeniteStoragePluginOptions = {
4
+ storages: StorageAdapter[];
5
+ };
6
+ export declare const useRozeniteStoragePlugin: ({ storages, }: RozeniteStoragePluginOptions) => import('../../../plugin-bridge/src/index.ts').RozeniteDevToolsClient<StorageEventMap> | null;
@@ -0,0 +1,29 @@
1
+ import { StorageCapabilities, StorageEntry, StorageTarget } from './types';
2
+ export type StorageSnapshotEvent = {
3
+ type: 'snapshot';
4
+ target: StorageTarget;
5
+ adapterName: string;
6
+ storageName: string;
7
+ capabilities: StorageCapabilities;
8
+ entries: StorageEntry[];
9
+ };
10
+ export type StorageSetEntryEvent = {
11
+ type: 'set-entry';
12
+ target: StorageTarget;
13
+ entry: StorageEntry;
14
+ };
15
+ export type StorageDeleteEntryEvent = {
16
+ type: 'delete-entry';
17
+ target: StorageTarget;
18
+ key: string;
19
+ };
20
+ export type StorageGetSnapshotEvent = {
21
+ type: 'get-snapshot';
22
+ target: StorageTarget | 'all';
23
+ };
24
+ export type StorageEvent = StorageSnapshotEvent | StorageSetEntryEvent | StorageDeleteEntryEvent | StorageGetSnapshotEvent;
25
+ export type StorageEventMap = {
26
+ [K in StorageEvent['type']]: Extract<StorageEvent, {
27
+ type: K;
28
+ }>;
29
+ };
@@ -0,0 +1,60 @@
1
+ export type StorageEntry = {
2
+ key: string;
3
+ type: 'string';
4
+ value: string;
5
+ } | {
6
+ key: string;
7
+ type: 'number';
8
+ value: number;
9
+ } | {
10
+ key: string;
11
+ type: 'boolean';
12
+ value: boolean;
13
+ } | {
14
+ key: string;
15
+ type: 'buffer';
16
+ value: number[];
17
+ };
18
+ export type StorageEntryType = StorageEntry['type'];
19
+ export type StorageEntryValue = StorageEntry['value'];
20
+ export type StorageCapabilities = {
21
+ supportedTypes: StorageEntryType[];
22
+ };
23
+ export type StorageSubscription = {
24
+ remove: () => void;
25
+ };
26
+ export type SyncStorage = {
27
+ kind: 'sync';
28
+ getAllKeys: () => string[];
29
+ get: (key: string) => StorageEntry | undefined;
30
+ set: (entry: StorageEntry) => void;
31
+ delete: (key: string) => void;
32
+ subscribe?: (callback: (key: string) => void) => StorageSubscription;
33
+ };
34
+ export type AsyncStorage = {
35
+ kind: 'async';
36
+ getAllKeys: () => Promise<string[]>;
37
+ get: (key: string) => Promise<StorageEntry | undefined>;
38
+ set: (entry: StorageEntry) => Promise<void>;
39
+ delete: (key: string) => Promise<void>;
40
+ subscribe?: (callback: (key: string) => void) => StorageSubscription;
41
+ };
42
+ export type StorageNode = {
43
+ id: string;
44
+ name: string;
45
+ storage: SyncStorage | AsyncStorage;
46
+ capabilities: StorageCapabilities;
47
+ blacklist?: RegExp;
48
+ };
49
+ export type StorageAdapter = {
50
+ id: string;
51
+ name: string;
52
+ storages: StorageNode[];
53
+ };
54
+ export type StorageTarget = {
55
+ adapterId: string;
56
+ storageId: string;
57
+ };
58
+ export declare const DEFAULT_SUPPORTED_TYPES: StorageEntryType[];
59
+ export declare const getStorageViewId: ({ adapterId, storageId }: StorageTarget) => string;
60
+ export declare const supportsType: (capabilities: StorageCapabilities, type: StorageEntryType) => boolean;
@@ -0,0 +1,9 @@
1
+ import { StorageEntry, StorageEntryType } from '../shared/types';
2
+ export type AddEntryDialogProps = {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onAddEntry: (entry: StorageEntry) => void;
6
+ existingKeys: string[];
7
+ supportedTypes: StorageEntryType[];
8
+ };
9
+ export declare const AddEntryDialog: ({ isOpen, onClose, onAddEntry, existingKeys, supportedTypes, }: AddEntryDialogProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,11 @@
1
+ export type ConfirmDialogProps = {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ onConfirm: () => void;
5
+ title: string;
6
+ message: string;
7
+ type?: 'confirm' | 'alert';
8
+ confirmText?: string;
9
+ cancelText?: string;
10
+ };
11
+ export declare const ConfirmDialog: ({ isOpen, onClose, onConfirm, title, message, type, confirmText, cancelText, }: ConfirmDialogProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,9 @@
1
+ import { StorageEntry, StorageEntryType, StorageEntryValue } from '../shared/types';
2
+ export type EditEntryDialogProps = {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onEditEntry: (key: string, newValue: StorageEntryValue) => void;
6
+ entry: StorageEntry | null;
7
+ supportedTypes: StorageEntryType[];
8
+ };
9
+ export declare const EditEntryDialog: ({ isOpen, onClose, onEditEntry, entry, supportedTypes, }: EditEntryDialogProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,10 @@
1
+ import { StorageEntry, StorageEntryType, StorageEntryValue } from '../shared/types';
2
+ export type EditableTableProps = {
3
+ data: StorageEntry[];
4
+ supportedTypes: StorageEntryType[];
5
+ onValueChange?: (key: string, newValue: StorageEntryValue) => void;
6
+ onDeleteEntry?: (key: string) => void;
7
+ onRowClick?: (entry: StorageEntry) => void;
8
+ loading?: boolean;
9
+ };
10
+ export declare const EditableTable: ({ data, supportedTypes, onValueChange, onDeleteEntry, onRowClick, loading, }: EditableTableProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { StorageEntry } from '../shared/types';
2
+ export type EntryDetailDialogProps = {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onEdit?: (entry: StorageEntry) => void;
6
+ entry: StorageEntry | null;
7
+ };
8
+ export declare const EntryDetailDialog: ({ isOpen, onClose, onEdit, entry, }: EntryDetailDialogProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1 @@
1
+ export default function StoragePanel(): import("react/jsx-runtime").JSX.Element;
package/dist/types.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";const t=["string","number","boolean","buffer"],o=({adapterId:e,storageId:s})=>`${e}:${s}`,p=(e,s)=>e.supportedTypes.includes(s);exports.DEFAULT_SUPPORTED_TYPES=t;exports.getStorageViewId=o;exports.supportsType=p;
package/dist/types.js ADDED
@@ -0,0 +1,11 @@
1
+ const o = [
2
+ "string",
3
+ "number",
4
+ "boolean",
5
+ "buffer"
6
+ ], t = ({ adapterId: s, storageId: e }) => `${s}:${e}`, n = (s, e) => s.supportedTypes.includes(e);
7
+ export {
8
+ o as D,
9
+ t as g,
10
+ n as s
11
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("@rozenite/plugin-bridge"),g=require("react"),S=require("./types.cjs"),b=1500,d=e=>e.kind==="async",y=e=>e.type==="buffer"?`${e.type}:${e.value.join(",")}`:`${e.type}:${String(e.value)}`,m=e=>new Map(e.map(t=>[t.key,t])),p=(e,t)=>e.blacklist?(e.blacklist.lastIndex=0,e.blacklist.test(t)):!1,$=(e,t,r)=>{if(!S.supportsType(e,t))throw new Error(`Type "${t}" is not supported by storage "${r.storageId}" in adapter "${r.adapterId}".`)},f=async e=>(d(e),e.getAllKeys()),w=async(e,t)=>(d(e),e.get(t)),v=async(e,t)=>{if(d(e)){await e.set(t);return}e.set(t)},E=async(e,t)=>{if(d(e)){await e.delete(t);return}e.delete(t)},I=async e=>{const t=await e();return m(t)},P=(e,t,r)=>{t.forEach((i,c)=>{const u=e.get(c);if(!u){r.onSet(i);return}y(u)!==y(i)&&r.onSet(i)}),e.forEach((i,c)=>{t.has(c)||r.onDelete(c)})},z=async(e,t)=>{let r=await I(e);const i=setInterval(async()=>{try{const c=await I(e);P(r,c,t),r=c}catch{}},b);return{remove:()=>{clearInterval(i)}}},M=(e,t)=>{const r=t.storage,i={adapterId:e.id,storageId:t.id},c=async o=>{if(!p(t,o))return w(r,o)},u=async()=>{const o=await f(r);return(await Promise.all(o.filter(s=>!p(t,s)).map(s=>w(r,s)))).filter(s=>!!s)};return{id:S.getStorageViewId(i),target:i,adapterName:e.name,storageName:t.name,capabilities:t.capabilities,get:c,set:async o=>{$(t.capabilities,o.type,i),await v(r,o)},delete:async o=>{await E(r,o)},getAllKeys:async()=>(await f(r)).filter(a=>!p(t,a)),getAllEntries:u,watch:async({onSet:o,onDelete:a})=>r.subscribe?r.subscribe(async s=>{try{const n=await c(s);if(!n){a(s);return}o(n)}catch{}}):z(u,{onSet:o,onDelete:a})}},R=e=>e.flatMap(t=>t.storages.map(r=>M(t,r))),A=({storages:e})=>{const t=g.useMemo(()=>R(e),[e]),r=h.useRozeniteDevToolsClient({pluginId:"@rozenite/storage-plugin"});return g.useEffect(()=>{if(!r)return;const i=async a=>{const s=a?t.filter(n=>n.id===a):t;for(const n of s)try{const l=await n.getAllEntries();r.send("snapshot",{type:"snapshot",target:n.target,adapterName:n.adapterName,storageName:n.storageName,capabilities:n.capabilities,entries:l})}catch(l){console.warn(`[Rozenite] Storage Plugin: Failed to snapshot ${n.target.adapterId}/${n.target.storageId}.`,l)}};i();const c=[];let u=!1;Promise.all(t.map(async a=>{try{const s=await a.watch({onSet:n=>{r.send("set-entry",{type:"set-entry",target:a.target,entry:n})},onDelete:n=>{r.send("delete-entry",{type:"delete-entry",target:a.target,key:n})}});if(u){s.remove();return}c.push(s)}catch(s){console.warn(`[Rozenite] Storage Plugin: Failed to attach watcher for ${a.target.adapterId}/${a.target.storageId}.`,s)}}));const o=[r.onMessage("set-entry",async({target:a,entry:s})=>{const n=t.find(l=>l.target.adapterId===a.adapterId&&l.target.storageId===a.storageId);if(!n){console.warn(`[Rozenite] Storage Plugin: Storage target not found for ${a.adapterId}/${a.storageId}`);return}try{await n.set(s)}catch(l){console.warn(`[Rozenite] Storage Plugin: Failed to set entry in ${a.adapterId}/${a.storageId}.`,l)}}),r.onMessage("delete-entry",async({target:a,key:s})=>{const n=t.find(l=>l.target.adapterId===a.adapterId&&l.target.storageId===a.storageId);if(!n){console.warn(`[Rozenite] Storage Plugin: Storage target not found for ${a.adapterId}/${a.storageId}`);return}try{await n.delete(s)}catch(l){console.warn(`[Rozenite] Storage Plugin: Failed to delete entry in ${a.adapterId}/${a.storageId}.`,l)}}),r.onMessage("get-snapshot",async({target:a})=>{if(a==="all"){await i();return}await i(`${a.adapterId}:${a.storageId}`)})];return()=>{u=!0,c.forEach(a=>a.remove()),o.forEach(a=>a.remove())}},[r,t]),r};exports.useRozeniteStoragePlugin=A;