@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.
- package/CHANGELOG.md +28 -0
- package/LICENSE +20 -0
- package/README.md +77 -0
- package/dist/assets/panel-C7usUotG.js +22 -0
- package/dist/assets/panel-DMhXYHH4.css +1 -0
- package/dist/panel.html +31 -0
- package/dist/react-native.cjs +1 -0
- package/dist/react-native.d.ts +4 -0
- package/dist/react-native.js +200 -0
- package/dist/rozenite.config.d.ts +7 -0
- package/dist/rozenite.json +1 -0
- package/dist/src/react-native/adapters/async-storage.d.ts +33 -0
- package/dist/src/react-native/adapters/index.d.ts +6 -0
- package/dist/src/react-native/adapters/mmkv.d.ts +13 -0
- package/dist/src/react-native/adapters/secure-storage.d.ts +18 -0
- package/dist/src/react-native/is-garbled.d.ts +1 -0
- package/dist/src/react-native/storage-view.d.ts +19 -0
- package/dist/src/react-native/useRozeniteStoragePlugin.d.ts +6 -0
- package/dist/src/shared/messaging.d.ts +29 -0
- package/dist/src/shared/types.d.ts +60 -0
- package/dist/src/ui/add-entry-dialog.d.ts +9 -0
- package/dist/src/ui/confirm-dialog.d.ts +11 -0
- package/dist/src/ui/edit-entry-dialog.d.ts +9 -0
- package/dist/src/ui/editable-table.d.ts +10 -0
- package/dist/src/ui/entry-detail-dialog.d.ts +8 -0
- package/dist/src/ui/panel.d.ts +1 -0
- package/dist/types.cjs +1 -0
- package/dist/types.js +11 -0
- package/dist/useRozeniteStoragePlugin.cjs +1 -0
- package/dist/useRozeniteStoragePlugin.js +212 -0
- package/package.json +59 -0
- package/postcss.config.js +6 -0
- package/react-native.ts +40 -0
- package/rozenite.config.ts +8 -0
- package/src/css-modules.d.ts +4 -0
- package/src/react-native/adapters/async-storage.ts +115 -0
- package/src/react-native/adapters/index.ts +19 -0
- package/src/react-native/adapters/mmkv.ts +187 -0
- package/src/react-native/adapters/secure-storage.ts +76 -0
- package/src/react-native/is-garbled.ts +17 -0
- package/src/react-native/storage-view.ts +245 -0
- package/src/react-native/useRozeniteStoragePlugin.ts +162 -0
- package/src/shared/messaging.ts +37 -0
- package/src/shared/types.ts +66 -0
- package/src/ui/add-entry-dialog.tsx +310 -0
- package/src/ui/confirm-dialog.tsx +100 -0
- package/src/ui/edit-entry-dialog.tsx +280 -0
- package/src/ui/editable-table.tsx +298 -0
- package/src/ui/entry-detail-dialog.tsx +220 -0
- package/src/ui/globals.css +123 -0
- package/src/ui/panel.tsx +442 -0
- package/tailwind.config.ts +94 -0
- package/tsconfig.json +36 -0
- 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}
|
package/dist/panel.html
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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;
|