@epoch32/visage 0.0.0 → 1.1.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 (139) hide show
  1. package/dist/api/client.d.ts +5 -0
  2. package/dist/api/file-router.d.ts +29 -0
  3. package/dist/api/handler.d.ts +15 -0
  4. package/dist/api/index.d.ts +12 -0
  5. package/dist/{src/api → api}/index.js +87 -2
  6. package/dist/api/middleware.d.ts +11 -0
  7. package/dist/api/pragma.d.ts +21 -0
  8. package/dist/api/procedure.d.ts +66 -0
  9. package/dist/api/types.d.ts +181 -0
  10. package/dist/charts/Area.d.ts +18 -0
  11. package/dist/charts/Axis.d.ts +21 -0
  12. package/dist/charts/Bar.d.ts +10 -0
  13. package/dist/charts/CartesianGrid.d.ts +10 -0
  14. package/dist/charts/Chart.d.ts +16 -0
  15. package/dist/charts/Cursor.d.ts +8 -0
  16. package/dist/charts/Legend.d.ts +9 -0
  17. package/dist/charts/Line.d.ts +18 -0
  18. package/dist/charts/Pie.d.ts +12 -0
  19. package/dist/charts/Tooltip.d.ts +12 -0
  20. package/dist/charts/context.d.ts +20 -0
  21. package/dist/charts/index.d.ts +14 -0
  22. package/dist/{src/charts → charts}/index.js +87 -2
  23. package/dist/charts/path.d.ts +27 -0
  24. package/dist/charts/scale.d.ts +23 -0
  25. package/dist/charts/types.d.ts +43 -0
  26. package/dist/devtools/DomTab.d.ts +6 -0
  27. package/dist/devtools/GraphInspector.d.ts +11 -0
  28. package/dist/devtools/GraphTab.d.ts +10 -0
  29. package/dist/devtools/QueryTab.d.ts +10 -0
  30. package/dist/devtools/RpcTab.d.ts +10 -0
  31. package/dist/devtools/SignalsTab.d.ts +10 -0
  32. package/dist/devtools/component.d.ts +2 -0
  33. package/dist/devtools/highlighter.d.ts +2 -0
  34. package/dist/devtools/hub.d.ts +41 -0
  35. package/dist/devtools/index.d.ts +9 -0
  36. package/dist/{src/devtools → devtools}/index.js +87 -2
  37. package/dist/devtools/styles.d.ts +1 -0
  38. package/dist/devtools/types.d.ts +44 -0
  39. package/dist/dom/async.d.ts +41 -0
  40. package/dist/dom/control-flow.d.ts +53 -0
  41. package/dist/dom/index.d.ts +3 -0
  42. package/dist/{src/dom → dom}/index.js +87 -2
  43. package/dist/dom/lazy.d.ts +30 -0
  44. package/dist/dom/render.d.ts +23 -0
  45. package/dist/dom/resource.d.ts +34 -0
  46. package/dist/form/form.d.ts +41 -0
  47. package/dist/form/index.d.ts +2 -0
  48. package/dist/{src/form → form}/index.js +87 -2
  49. package/dist/form/schema.d.ts +96 -0
  50. package/dist/index.d.ts +15 -0
  51. package/dist/index.js +3571 -1293
  52. package/dist/jsx-dev-runtime/index.d.ts +1 -0
  53. package/dist/jsx-runtime/index.d.ts +8 -0
  54. package/dist/{src/jsx-runtime → jsx-runtime}/index.js +87 -2
  55. package/dist/query/create-mutation.d.ts +3 -0
  56. package/dist/query/create-query.d.ts +4 -0
  57. package/dist/query/focus-manager.d.ts +14 -0
  58. package/dist/query/index.d.ts +9 -0
  59. package/dist/{src/query → query}/index.js +87 -2
  60. package/dist/query/mutation-cache.d.ts +24 -0
  61. package/dist/query/online-manager.d.ts +14 -0
  62. package/dist/query/query-cache.d.ts +69 -0
  63. package/dist/query/query-client.d.ts +46 -0
  64. package/dist/query/types.d.ts +131 -0
  65. package/dist/query/utils.d.ts +16 -0
  66. package/dist/router/index.d.ts +1 -0
  67. package/dist/{src/router → router}/index.js +87 -2
  68. package/dist/router/router.d.ts +91 -0
  69. package/dist/rpc/client.d.ts +2 -0
  70. package/dist/rpc/error.d.ts +16 -0
  71. package/dist/rpc/index.d.ts +7 -0
  72. package/dist/{src/rpc → rpc}/index.js +87 -2
  73. package/dist/rpc/procedure.d.ts +8 -0
  74. package/dist/rpc/router.d.ts +19 -0
  75. package/dist/rpc/server.d.ts +3 -0
  76. package/dist/rpc/types.d.ts +200 -0
  77. package/dist/server/hydrate.d.ts +5 -0
  78. package/dist/server/index.d.ts +3 -0
  79. package/dist/{src/server → server}/index.js +87 -2
  80. package/dist/server/render-to-stream.d.ts +9 -0
  81. package/dist/server/render-to-string.d.ts +6 -0
  82. package/dist/signals/computed.d.ts +61 -0
  83. package/dist/signals/context.d.ts +44 -0
  84. package/dist/signals/effect.d.ts +56 -0
  85. package/dist/signals/index.d.ts +8 -0
  86. package/dist/{src/signals → signals}/index.js +87 -2
  87. package/dist/signals/scope.d.ts +61 -0
  88. package/dist/signals/signal.d.ts +40 -0
  89. package/dist/signals/store.d.ts +45 -0
  90. package/dist/signals/system.d.ts +56 -0
  91. package/dist/signals/types.d.ts +58 -0
  92. package/dist/style/component.d.ts +49 -0
  93. package/dist/style/create-style.d.ts +63 -0
  94. package/dist/style/cx.d.ts +18 -0
  95. package/dist/style/hash.d.ts +8 -0
  96. package/dist/style/index.d.ts +8 -0
  97. package/dist/{src/style → style}/index.js +87 -2
  98. package/dist/style/layout.d.ts +129 -0
  99. package/dist/style/manager.d.ts +31 -0
  100. package/dist/style/parser.d.ts +12 -0
  101. package/dist/style/scale.d.ts +82 -0
  102. package/dist/template/index.d.ts +1 -0
  103. package/dist/{src/template → template}/index.js +87 -2
  104. package/dist/template/template.d.ts +8 -0
  105. package/dist/ui/accordion.d.ts +81 -0
  106. package/dist/ui/command-dialog.d.ts +10 -0
  107. package/dist/ui/command.d.ts +103 -0
  108. package/dist/ui/data-table.d.ts +38 -0
  109. package/dist/ui/dialog.d.ts +102 -0
  110. package/dist/ui/dropdown-menu.d.ts +92 -0
  111. package/dist/ui/icon.d.ts +18 -0
  112. package/dist/ui/index.d.ts +14 -0
  113. package/dist/{src/ui → ui}/index.js +87 -2
  114. package/dist/ui/layout.d.ts +1 -0
  115. package/dist/ui/popover.d.ts +68 -0
  116. package/dist/ui/switch.d.ts +31 -0
  117. package/dist/ui/tabs.d.ts +71 -0
  118. package/dist/ui/toast.d.ts +91 -0
  119. package/dist/ui/tooltip.d.ts +64 -0
  120. package/dist/ui/utils.d.ts +21 -0
  121. package/dist/virtual/index.d.ts +2 -0
  122. package/dist/{src/virtual → virtual}/index.js +87 -2
  123. package/dist/virtual/virtual-list.d.ts +21 -0
  124. package/dist/virtual/virtualizer.d.ts +31 -0
  125. package/dist/vite/hmr.d.ts +7 -0
  126. package/dist/vite/index.d.ts +3 -0
  127. package/dist/vite/index.js +296 -15
  128. package/dist/vite/lucide.d.ts +27 -0
  129. package/dist/vite/plugin.d.ts +3 -0
  130. package/dist/vite/rpc-middleware.d.ts +5 -0
  131. package/dist/vite/types.d.ts +59 -0
  132. package/package.json +40 -40
  133. package/src/signals/index.ts +1 -0
  134. package/src/signals/signal.ts +110 -2
  135. package/src/signals/types.ts +9 -0
  136. package/src/vite/plugin.ts +4 -0
  137. package/dist/bundle.dev.js +0 -4875
  138. package/dist/src/index.js +0 -11826
  139. package/dist/src/vite/index.js +0 -984
@@ -22,11 +22,13 @@ export class Signal<T> implements IDependency {
22
22
  private _value: T;
23
23
  private _subscribers: Set<ISubscriber> = new Set();
24
24
  private _equals: (a: T, b: T) => boolean;
25
+ private _onSet?: (val: T) => void;
25
26
  version = 0;
26
27
 
27
- constructor(initialValue: T, equals?: (a: T, b: T) => boolean) {
28
+ constructor(initialValue: T, equals?: (a: T, b: T) => boolean, onSet?: (val: T) => void) {
28
29
  this._value = initialValue;
29
30
  this._equals = equals ?? Object.is;
31
+ this._onSet = onSet;
30
32
  }
31
33
 
32
34
  get(): T {
@@ -58,6 +60,9 @@ export class Signal<T> implements IDependency {
58
60
 
59
61
  this._value = newValue;
60
62
  this.version++;
63
+ if (this._onSet) {
64
+ this._onSet(newValue);
65
+ }
61
66
  batch(() => {
62
67
  this.notify();
63
68
  });
@@ -117,6 +122,43 @@ export class Signal<T> implements IDependency {
117
122
  * @param optionsOrEquals - Custom equality comparison function or SignalOptions
118
123
  * @returns A writable reactive signal function accessor
119
124
  */
125
+ function resolveStorage(storageOption?: "local" | "session" | Storage): Storage | null {
126
+ if (storageOption && typeof storageOption === "object") {
127
+ return storageOption;
128
+ }
129
+ if (storageOption === "session") {
130
+ try {
131
+ if (typeof sessionStorage !== "undefined") return sessionStorage;
132
+ } catch {}
133
+ try {
134
+ if (typeof window !== "undefined" && (window as any).sessionStorage) {
135
+ return (window as any).sessionStorage;
136
+ }
137
+ } catch {}
138
+ try {
139
+ if (typeof globalThis !== "undefined" && (globalThis as any).sessionStorage) {
140
+ return (globalThis as any).sessionStorage;
141
+ }
142
+ } catch {}
143
+ return null;
144
+ }
145
+
146
+ try {
147
+ if (typeof localStorage !== "undefined") return localStorage;
148
+ } catch {}
149
+ try {
150
+ if (typeof window !== "undefined" && (window as any).localStorage) {
151
+ return (window as any).localStorage;
152
+ }
153
+ } catch {}
154
+ try {
155
+ if (typeof globalThis !== "undefined" && (globalThis as any).localStorage) {
156
+ return (globalThis as any).localStorage;
157
+ }
158
+ } catch {}
159
+ return null;
160
+ }
161
+
120
162
  export function signal<T>(
121
163
  initialValue: T,
122
164
  optionsOrEquals?: ((a: T, b: T) => boolean) | SignalOptions<T>
@@ -125,7 +167,73 @@ export function signal<T>(
125
167
  const isInternal = typeof optionsOrEquals === "object" ? optionsOrEquals?.internal : false;
126
168
  const customName = typeof optionsOrEquals === "object" ? optionsOrEquals?.name : undefined;
127
169
 
128
- const s = new Signal(initialValue, equals);
170
+ const persistOption = typeof optionsOrEquals === "object" ? optionsOrEquals?.persist : undefined;
171
+ const persistConfig = persistOption
172
+ ? typeof persistOption === "string"
173
+ ? { key: persistOption }
174
+ : persistOption
175
+ : undefined;
176
+
177
+ let effectiveInitial = initialValue;
178
+ const storage = persistConfig ? resolveStorage(persistConfig.storage) : null;
179
+ const serialize = persistConfig?.serialize ?? JSON.stringify;
180
+ const deserialize = persistConfig?.deserialize ?? JSON.parse;
181
+
182
+ if (persistConfig && storage) {
183
+ try {
184
+ const stored = storage.getItem(persistConfig.key);
185
+ if (stored !== null) {
186
+ effectiveInitial = deserialize(stored);
187
+ }
188
+ } catch {
189
+ // Fallback cleanly to initialValue
190
+ }
191
+ }
192
+
193
+ let isSyncing = false;
194
+ const onSet =
195
+ persistConfig && storage
196
+ ? (val: T) => {
197
+ if (isSyncing) return;
198
+ try {
199
+ storage.setItem(persistConfig.key, serialize(val));
200
+ } catch {
201
+ // Gracefully handle storage quota or access errors
202
+ }
203
+ }
204
+ : undefined;
205
+
206
+ const s = new Signal(effectiveInitial, equals, onSet);
207
+
208
+ if (
209
+ persistConfig &&
210
+ storage &&
211
+ (persistConfig.syncTabs ?? true) &&
212
+ typeof window !== "undefined" &&
213
+ typeof window.addEventListener === "function"
214
+ ) {
215
+ const onStorage = (e: StorageEvent) => {
216
+ if (e.key === persistConfig.key) {
217
+ try {
218
+ const nextVal = e.newValue !== null ? deserialize(e.newValue) : initialValue;
219
+ isSyncing = true;
220
+ try {
221
+ s.set(nextVal);
222
+ } finally {
223
+ isSyncing = false;
224
+ }
225
+ } catch {
226
+ // Ignore external malformed entries
227
+ }
228
+ }
229
+ };
230
+ window.addEventListener("storage", onStorage);
231
+ if (currentScope) {
232
+ currentScope.addCleanup(() => {
233
+ window.removeEventListener("storage", onStorage);
234
+ });
235
+ }
236
+ }
129
237
 
130
238
  const accessor = ((...args: [value?: T]): T => {
131
239
  if (args.length === 0) {
@@ -29,10 +29,19 @@ export interface WritableSignal<T> extends ReadonlySignal<T> {
29
29
  value: T;
30
30
  }
31
31
 
32
+ export interface PersistOptions<T> {
33
+ key: string;
34
+ storage?: "local" | "session" | Storage;
35
+ serialize?: (value: T) => string;
36
+ deserialize?: (raw: string) => T;
37
+ syncTabs?: boolean;
38
+ }
39
+
32
40
  export interface SignalOptions<T> {
33
41
  name?: string;
34
42
  equals?: (a: T, b: T) => boolean;
35
43
  internal?: boolean;
44
+ persist?: string | PersistOptions<T>;
36
45
  }
37
46
 
38
47
  export interface ComputedOptions {
@@ -57,6 +57,10 @@ export function visage(options: VisagePluginOptions = {}): VisageVitePlugin[] {
57
57
  ]
58
58
  },
59
59
  resolve: {
60
+ alias: [
61
+ { find: /^visage\/(.*)/, replacement: "@epoch32/visage/$1" },
62
+ { find: /^visage$/, replacement: "@epoch32/visage" }
63
+ ],
60
64
  dedupe: ["@epoch32/visage", "visage"]
61
65
  }
62
66
  };