@epoch32/visage 0.0.0-stage → 0.0.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 (138) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +110 -2
  3. package/dist/bundle.dev.js +4875 -0
  4. package/dist/index.js +9633 -0
  5. package/dist/src/api/index.js +4002 -0
  6. package/dist/src/charts/index.js +2717 -0
  7. package/dist/src/devtools/index.js +4677 -0
  8. package/dist/src/dom/index.js +1550 -0
  9. package/dist/src/form/index.js +1415 -0
  10. package/dist/src/index.js +11826 -0
  11. package/dist/src/jsx-runtime/index.js +1630 -0
  12. package/dist/src/query/index.js +2422 -0
  13. package/dist/src/router/index.js +1856 -0
  14. package/dist/src/rpc/index.js +3484 -0
  15. package/dist/src/server/index.js +1173 -0
  16. package/dist/src/signals/index.js +1077 -0
  17. package/dist/src/style/index.js +2340 -0
  18. package/dist/src/template/index.js +1149 -0
  19. package/dist/src/ui/index.js +4155 -0
  20. package/dist/src/virtual/index.js +1955 -0
  21. package/dist/src/vite/index.js +984 -0
  22. package/dist/vite/index.js +707 -0
  23. package/package.json +140 -4
  24. package/src/api/client.ts +371 -0
  25. package/src/api/file-router.ts +183 -0
  26. package/src/api/handler.ts +326 -0
  27. package/src/api/index.ts +71 -0
  28. package/src/api/middleware.ts +54 -0
  29. package/src/api/pragma.ts +155 -0
  30. package/src/api/procedure.ts +172 -0
  31. package/src/api/types.ts +249 -0
  32. package/src/charts/Area.tsx +111 -0
  33. package/src/charts/Axis.tsx +126 -0
  34. package/src/charts/Bar.tsx +86 -0
  35. package/src/charts/CartesianGrid.tsx +72 -0
  36. package/src/charts/Chart.tsx +269 -0
  37. package/src/charts/Cursor.tsx +42 -0
  38. package/src/charts/Legend.tsx +56 -0
  39. package/src/charts/Line.tsx +106 -0
  40. package/src/charts/Pie.tsx +88 -0
  41. package/src/charts/Tooltip.tsx +127 -0
  42. package/src/charts/context.ts +30 -0
  43. package/src/charts/index.ts +14 -0
  44. package/src/charts/path.ts +155 -0
  45. package/src/charts/scale.ts +133 -0
  46. package/src/charts/types.ts +50 -0
  47. package/src/devtools/DomTab.tsx +134 -0
  48. package/src/devtools/GraphInspector.tsx +196 -0
  49. package/src/devtools/GraphTab.tsx +315 -0
  50. package/src/devtools/QueryTab.tsx +200 -0
  51. package/src/devtools/RpcTab.tsx +190 -0
  52. package/src/devtools/SignalsTab.tsx +129 -0
  53. package/src/devtools/component.tsx +243 -0
  54. package/src/devtools/highlighter.ts +134 -0
  55. package/src/devtools/hub.ts +175 -0
  56. package/src/devtools/index.ts +20 -0
  57. package/src/devtools/styles.ts +313 -0
  58. package/src/devtools/types.ts +45 -0
  59. package/src/dom/async.ts +232 -0
  60. package/src/dom/control-flow.ts +353 -0
  61. package/src/dom/index.ts +32 -0
  62. package/src/dom/lazy.ts +82 -0
  63. package/src/dom/render.ts +286 -0
  64. package/src/dom/resource.ts +120 -0
  65. package/src/form/form.ts +218 -0
  66. package/src/form/index.ts +17 -0
  67. package/src/form/schema.ts +299 -0
  68. package/src/index.ts +413 -0
  69. package/src/jsx-dev-runtime/index.ts +1 -0
  70. package/src/jsx-runtime/index.ts +112 -0
  71. package/src/jsx-runtime/jsx.d.ts +278 -0
  72. package/src/query/create-mutation.ts +64 -0
  73. package/src/query/create-query.ts +426 -0
  74. package/src/query/focus-manager.ts +68 -0
  75. package/src/query/index.ts +63 -0
  76. package/src/query/mutation-cache.ts +138 -0
  77. package/src/query/online-manager.ts +67 -0
  78. package/src/query/query-cache.ts +369 -0
  79. package/src/query/query-client.ts +248 -0
  80. package/src/query/types.ts +221 -0
  81. package/src/query/utils.ts +132 -0
  82. package/src/router/index.ts +19 -0
  83. package/src/router/router.tsx +352 -0
  84. package/src/rpc/client.ts +317 -0
  85. package/src/rpc/error.ts +70 -0
  86. package/src/rpc/index.ts +52 -0
  87. package/src/rpc/procedure.ts +88 -0
  88. package/src/rpc/router.ts +105 -0
  89. package/src/rpc/server.ts +511 -0
  90. package/src/rpc/types.ts +328 -0
  91. package/src/server/hydrate.ts +21 -0
  92. package/src/server/index.ts +10 -0
  93. package/src/server/render-to-stream.ts +31 -0
  94. package/src/server/render-to-string.ts +125 -0
  95. package/src/signals/computed.ts +217 -0
  96. package/src/signals/context.ts +89 -0
  97. package/src/signals/effect.ts +161 -0
  98. package/src/signals/index.ts +57 -0
  99. package/src/signals/scope.ts +132 -0
  100. package/src/signals/signal.ts +203 -0
  101. package/src/signals/store.ts +163 -0
  102. package/src/signals/system.ts +124 -0
  103. package/src/signals/types.ts +64 -0
  104. package/src/style/component.tsx +122 -0
  105. package/src/style/create-style.ts +229 -0
  106. package/src/style/cx.ts +75 -0
  107. package/src/style/hash.ts +19 -0
  108. package/src/style/index.ts +8 -0
  109. package/src/style/layout.tsx +406 -0
  110. package/src/style/manager.ts +87 -0
  111. package/src/style/parser.ts +257 -0
  112. package/src/style/scale.ts +237 -0
  113. package/src/template/index.ts +4 -0
  114. package/src/template/template.ts +126 -0
  115. package/src/ui/accordion.tsx +286 -0
  116. package/src/ui/command-dialog.tsx +49 -0
  117. package/src/ui/command.tsx +400 -0
  118. package/src/ui/data-table.tsx +322 -0
  119. package/src/ui/dialog.tsx +362 -0
  120. package/src/ui/dropdown-menu.tsx +381 -0
  121. package/src/ui/icon.tsx +69 -0
  122. package/src/ui/index.ts +138 -0
  123. package/src/ui/layout.tsx +13 -0
  124. package/src/ui/popover.tsx +249 -0
  125. package/src/ui/switch.tsx +114 -0
  126. package/src/ui/tabs.tsx +297 -0
  127. package/src/ui/toast.tsx +280 -0
  128. package/src/ui/tooltip.tsx +262 -0
  129. package/src/ui/utils.ts +110 -0
  130. package/src/virtual/index.ts +12 -0
  131. package/src/virtual/virtual-list.tsx +185 -0
  132. package/src/virtual/virtualizer.ts +274 -0
  133. package/src/vite/hmr.ts +38 -0
  134. package/src/vite/index.ts +3 -0
  135. package/src/vite/lucide.ts +124 -0
  136. package/src/vite/plugin.ts +102 -0
  137. package/src/vite/rpc-middleware.ts +82 -0
  138. package/src/vite/types.ts +65 -0
@@ -0,0 +1,221 @@
1
+ import type { ReadonlySignal } from "../signals";
2
+
3
+ export type QueryKey = readonly unknown[];
4
+
5
+ export interface QueryFunctionContext<TQueryKey extends QueryKey = QueryKey, TPageParam = any> {
6
+ queryKey: TQueryKey;
7
+ signal: AbortSignal;
8
+ pageParam?: TPageParam;
9
+ meta?: Record<string, unknown>;
10
+ }
11
+
12
+ export type QueryFunction<
13
+ TData = unknown,
14
+ TQueryKey extends QueryKey = QueryKey,
15
+ TPageParam = any
16
+ > = (context: QueryFunctionContext<TQueryKey, TPageParam>) => Promise<TData> | TData;
17
+
18
+ export type QueryStatus = "pending" | "success" | "error";
19
+ export type FetchStatus = "fetching" | "paused" | "idle";
20
+ export type MutationStatus = "idle" | "pending" | "success" | "error";
21
+
22
+ export type RetryValue = boolean | number | ((failureCount: number, error: any) => boolean);
23
+ export type RetryDelayValue = number | ((attemptIndex: number, error: any) => number);
24
+
25
+ export interface QueryFilters {
26
+ queryKey?: QueryKey;
27
+ exact?: boolean;
28
+ type?: "all" | "active" | "inactive";
29
+ stale?: boolean;
30
+ fetchStatus?: FetchStatus;
31
+ predicate?: (query: any) => boolean;
32
+ }
33
+
34
+ export interface QueryState<TData = unknown, TError = any> {
35
+ data: TData | undefined;
36
+ error: TError | null;
37
+ status: QueryStatus;
38
+ fetchStatus: FetchStatus;
39
+ dataUpdatedAt: number;
40
+ errorUpdatedAt: number;
41
+ failureCount: number;
42
+ isInvalidated: boolean;
43
+ }
44
+
45
+ export interface QueryOptions<
46
+ TData = unknown,
47
+ _TError = any,
48
+ TQueryKey extends QueryKey = QueryKey
49
+ > {
50
+ queryKey: TQueryKey;
51
+ queryFn?: QueryFunction<TData, TQueryKey>;
52
+ enabled?: boolean | (() => boolean);
53
+ staleTime?: number;
54
+ gcTime?: number;
55
+ retry?: RetryValue;
56
+ retryDelay?: RetryDelayValue;
57
+ refetchInterval?: number | false | (() => number | false);
58
+ refetchIntervalInBackground?: boolean;
59
+ refetchOnWindowFocus?: boolean | "always";
60
+ refetchOnReconnect?: boolean | "always";
61
+ initialData?: TData | (() => TData);
62
+ initialDataUpdatedAt?: number | (() => number);
63
+ placeholderData?: TData | ((previousData: TData | undefined) => TData);
64
+ meta?: Record<string, unknown>;
65
+ }
66
+
67
+ export interface CreateQueryOptions<
68
+ TData = unknown,
69
+ TError = any,
70
+ TSelected = TData,
71
+ TQueryKey extends QueryKey = QueryKey
72
+ > extends QueryOptions<TData, TError, TQueryKey> {
73
+ select?: (data: TData) => TSelected;
74
+ suspense?: boolean;
75
+ }
76
+
77
+ export interface RefetchOptions {
78
+ throwOnError?: boolean;
79
+ cancelRefetch?: boolean;
80
+ }
81
+
82
+ export interface QueryResult<TData = unknown, TError = any> {
83
+ data: ReadonlySignal<TData | undefined>;
84
+ error: ReadonlySignal<TError | null>;
85
+ status: ReadonlySignal<QueryStatus>;
86
+ fetchStatus: ReadonlySignal<FetchStatus>;
87
+ isLoading: ReadonlySignal<boolean>;
88
+ isFetching: ReadonlySignal<boolean>;
89
+ isSuccess: ReadonlySignal<boolean>;
90
+ isError: ReadonlySignal<boolean>;
91
+ isStale: ReadonlySignal<boolean>;
92
+ dataUpdatedAt: ReadonlySignal<number>;
93
+ errorUpdatedAt: ReadonlySignal<number>;
94
+ refetch: (options?: RefetchOptions) => Promise<TData | undefined>;
95
+ (): TData | undefined;
96
+ }
97
+
98
+ export type MutationFunction<TData = unknown, TVariables = void> = (
99
+ variables: TVariables
100
+ ) => Promise<TData>;
101
+
102
+ export interface MutationOptions<
103
+ TData = unknown,
104
+ TError = any,
105
+ TVariables = void,
106
+ TContext = unknown
107
+ > {
108
+ mutationKey?: QueryKey;
109
+ mutationFn: MutationFunction<TData, TVariables>;
110
+ onMutate?: (variables: TVariables) => Promise<TContext | void> | TContext | void;
111
+ onSuccess?: (
112
+ data: TData,
113
+ variables: TVariables,
114
+ context: TContext | undefined
115
+ ) => Promise<void> | void;
116
+ onError?: (
117
+ error: TError,
118
+ variables: TVariables,
119
+ context: TContext | undefined
120
+ ) => Promise<void> | void;
121
+ onSettled?: (
122
+ data: TData | undefined,
123
+ error: TError | null,
124
+ variables: TVariables,
125
+ context: TContext | undefined
126
+ ) => Promise<void> | void;
127
+ retry?: RetryValue;
128
+ retryDelay?: RetryDelayValue;
129
+ meta?: Record<string, unknown>;
130
+ }
131
+
132
+ export interface MutateOptions<
133
+ TData = unknown,
134
+ TError = any,
135
+ TVariables = void,
136
+ TContext = unknown
137
+ > {
138
+ onSuccess?: (data: TData, variables: TVariables, context: TContext | undefined) => void;
139
+ onError?: (error: TError, variables: TVariables, context: TContext | undefined) => void;
140
+ onSettled?: (
141
+ data: TData | undefined,
142
+ error: TError | null,
143
+ variables: TVariables,
144
+ context: TContext | undefined
145
+ ) => void;
146
+ }
147
+
148
+ export interface MutationResult<
149
+ TData = unknown,
150
+ TError = any,
151
+ TVariables = void,
152
+ TContext = unknown
153
+ > {
154
+ mutate: (
155
+ variables: TVariables,
156
+ options?: MutateOptions<TData, TError, TVariables, TContext>
157
+ ) => void;
158
+ mutateAsync: (
159
+ variables: TVariables,
160
+ options?: MutateOptions<TData, TError, TVariables, TContext>
161
+ ) => Promise<TData>;
162
+ data: ReadonlySignal<TData | undefined>;
163
+ error: ReadonlySignal<TError | null>;
164
+ status: ReadonlySignal<MutationStatus>;
165
+ isIdle: ReadonlySignal<boolean>;
166
+ isPending: ReadonlySignal<boolean>;
167
+ isLoading: ReadonlySignal<boolean>;
168
+ isSuccess: ReadonlySignal<boolean>;
169
+ isError: ReadonlySignal<boolean>;
170
+ reset: () => void;
171
+ variables: ReadonlySignal<TVariables | undefined>;
172
+ submittedAt: ReadonlySignal<number>;
173
+ (): TData | undefined;
174
+ }
175
+
176
+ export interface InfiniteData<TData = unknown, TPageParam = unknown> {
177
+ pages: TData[];
178
+ pageParams: TPageParam[];
179
+ }
180
+
181
+ export interface InfiniteQueryOptions<
182
+ TData = unknown,
183
+ TError = any,
184
+ TPageParam = unknown,
185
+ TSelected = InfiniteData<TData, TPageParam>,
186
+ TQueryKey extends QueryKey = QueryKey
187
+ > extends Omit<QueryOptions<InfiniteData<TData, TPageParam>, TError, TQueryKey>, "queryFn"> {
188
+ queryFn?: (context: QueryFunctionContext<TQueryKey, TPageParam>) => Promise<TData> | TData;
189
+ initialPageParam: TPageParam;
190
+ getNextPageParam: (
191
+ lastPage: TData,
192
+ allPages: TData[],
193
+ lastPageParam: TPageParam,
194
+ allPageParams: TPageParam[]
195
+ ) => TPageParam | undefined | null;
196
+ getPreviousPageParam?: (
197
+ firstPage: TData,
198
+ allPages: TData[],
199
+ firstPageParam: TPageParam,
200
+ allPageParams: TPageParam[]
201
+ ) => TPageParam | undefined | null;
202
+ maxPages?: number;
203
+ select?: (data: InfiniteData<TData, TPageParam>) => TSelected;
204
+ suspense?: boolean;
205
+ }
206
+
207
+ export interface InfiniteQueryResult<TData = unknown, TError = any, TPageParam = unknown>
208
+ extends Omit<QueryResult<InfiniteData<TData, TPageParam>, TError>, "refetch"> {
209
+ fetchNextPage: () => Promise<InfiniteData<TData, TPageParam> | undefined>;
210
+ fetchPreviousPage: () => Promise<InfiniteData<TData, TPageParam> | undefined>;
211
+ hasNextPage: ReadonlySignal<boolean>;
212
+ hasPreviousPage: ReadonlySignal<boolean>;
213
+ isFetchingNextPage: ReadonlySignal<boolean>;
214
+ isFetchingPreviousPage: ReadonlySignal<boolean>;
215
+ refetch: (options?: RefetchOptions) => Promise<InfiniteData<TData, TPageParam> | undefined>;
216
+ }
217
+
218
+ export interface DefaultOptions {
219
+ queries?: Partial<QueryOptions<any, any, any>>;
220
+ mutations?: Partial<MutationOptions<any, any, any, any>>;
221
+ }
@@ -0,0 +1,132 @@
1
+ import type { QueryFilters } from "./types";
2
+
3
+ export function isPlainObject(value: unknown): value is Record<string, unknown> {
4
+ if (value === null || typeof value !== "object") return false;
5
+ const proto = Object.getPrototypeOf(value);
6
+ return proto === null || proto === Object.prototype;
7
+ }
8
+
9
+ /**
10
+ * Deterministic JSON stringifier for consistent query key hashing
11
+ */
12
+ export function hashKey(queryKey: unknown): string {
13
+ return JSON.stringify(queryKey, (_key, val) => {
14
+ if (isPlainObject(val)) {
15
+ return Object.keys(val)
16
+ .sort()
17
+ .reduce((result: Record<string, unknown>, k) => {
18
+ result[k] = val[k];
19
+ return result;
20
+ }, {});
21
+ }
22
+ return val;
23
+ });
24
+ }
25
+
26
+ /**
27
+ * Deep equality check for primitives, arrays, and objects
28
+ */
29
+ export function deepEqual(a: unknown, b: unknown): boolean {
30
+ if (Object.is(a, b)) return true;
31
+ if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
32
+ return false;
33
+ }
34
+
35
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
36
+
37
+ if (Array.isArray(a) && Array.isArray(b)) {
38
+ if (a.length !== b.length) return false;
39
+ for (let i = 0; i < a.length; i++) {
40
+ if (!deepEqual(a[i], b[i])) return false;
41
+ }
42
+ return true;
43
+ }
44
+
45
+ const keysA = Object.keys(a as Record<string, unknown>);
46
+ const keysB = Object.keys(b as Record<string, unknown>);
47
+
48
+ if (keysA.length !== keysB.length) return false;
49
+
50
+ for (const key of keysA) {
51
+ if (!Object.hasOwn(b, key)) return false;
52
+ if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) {
53
+ return false;
54
+ }
55
+ }
56
+
57
+ return true;
58
+ }
59
+
60
+ /**
61
+ * Partial matching check: matches if `a` is a subset or partial structure of `b`
62
+ */
63
+ export function partialDeepEqual(a: unknown, b: unknown): boolean {
64
+ if (Object.is(a, b)) return true;
65
+ if (a === undefined || a === null || b === undefined || b === null) {
66
+ return a === b;
67
+ }
68
+
69
+ if (Array.isArray(a) && Array.isArray(b)) {
70
+ if (a.length > b.length) return false;
71
+ for (let i = 0; i < a.length; i++) {
72
+ if (!partialDeepEqual(a[i], b[i])) return false;
73
+ }
74
+ return true;
75
+ }
76
+
77
+ if (isPlainObject(a) && isPlainObject(b)) {
78
+ for (const key of Object.keys(a)) {
79
+ if (!(key in b)) return false;
80
+ if (!partialDeepEqual(a[key], b[key])) return false;
81
+ }
82
+ return true;
83
+ }
84
+
85
+ return false;
86
+ }
87
+
88
+ export function matchQuery(filters: QueryFilters | undefined, query: any): boolean {
89
+ if (!filters) return true;
90
+
91
+ if (filters.queryKey !== undefined) {
92
+ const filterKey = Array.isArray(filters.queryKey) ? filters.queryKey : [filters.queryKey];
93
+ const queryKey = Array.isArray(query.queryKey) ? query.queryKey : [query.queryKey];
94
+
95
+ if (filters.exact) {
96
+ if (filterKey.length !== queryKey.length) return false;
97
+ if (!deepEqual(filterKey, queryKey)) return false;
98
+ } else {
99
+ if (filterKey.length > queryKey.length) return false;
100
+ for (let i = 0; i < filterKey.length; i++) {
101
+ if (!partialDeepEqual(filterKey[i], queryKey[i])) {
102
+ return false;
103
+ }
104
+ }
105
+ }
106
+ }
107
+
108
+ if (filters.type === "active" && query.observers.size === 0) {
109
+ return false;
110
+ }
111
+ if (filters.type === "inactive" && query.observers.size > 0) {
112
+ return false;
113
+ }
114
+
115
+ if (filters.stale !== undefined && query.isStale() !== filters.stale) {
116
+ return false;
117
+ }
118
+
119
+ if (filters.fetchStatus !== undefined && query.fetchStatus() !== filters.fetchStatus) {
120
+ return false;
121
+ }
122
+
123
+ if (filters.predicate && !filters.predicate(query)) {
124
+ return false;
125
+ }
126
+
127
+ return true;
128
+ }
129
+
130
+ export function sleep(ms: number): Promise<void> {
131
+ return new Promise((resolve) => setTimeout(resolve, ms));
132
+ }
@@ -0,0 +1,19 @@
1
+ export {
2
+ Link,
3
+ type LinkProps,
4
+ type LocationState,
5
+ lazy,
6
+ type MatchedRoute,
7
+ Route,
8
+ type RouteDefinition,
9
+ type RouteProps,
10
+ Router,
11
+ type RouterContextValue,
12
+ type RouterProps,
13
+ Routes,
14
+ type RoutesProps,
15
+ useLocation,
16
+ useNavigate,
17
+ useParams,
18
+ useSearchParams
19
+ } from "./router";