@tanstack/router-devtools-core 1.20.3-alpha.1
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/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/cjs/AgeTicker.cjs +47 -0
- package/dist/cjs/AgeTicker.cjs.map +1 -0
- package/dist/cjs/AgeTicker.d.cts +6 -0
- package/dist/cjs/BaseTanStackRouterDevtoolsPanel.cjs +602 -0
- package/dist/cjs/BaseTanStackRouterDevtoolsPanel.cjs.map +1 -0
- package/dist/cjs/BaseTanStackRouterDevtoolsPanel.d.cts +35 -0
- package/dist/cjs/Explorer.cjs +307 -0
- package/dist/cjs/Explorer.cjs.map +1 -0
- package/dist/cjs/Explorer.d.cts +43 -0
- package/dist/cjs/FloatingTanStackRouterDevtools.cjs +204 -0
- package/dist/cjs/FloatingTanStackRouterDevtools.cjs.map +1 -0
- package/dist/cjs/FloatingTanStackRouterDevtools.d.cts +48 -0
- package/dist/cjs/NavigateButton.cjs +30 -0
- package/dist/cjs/NavigateButton.cjs.map +1 -0
- package/dist/cjs/NavigateButton.d.cts +7 -0
- package/dist/cjs/TanStackRouterDevtoolsCore.cjs +107 -0
- package/dist/cjs/TanStackRouterDevtoolsCore.cjs.map +1 -0
- package/dist/cjs/TanStackRouterDevtoolsCore.d.cts +55 -0
- package/dist/cjs/TanStackRouterDevtoolsPanelCore.cjs +107 -0
- package/dist/cjs/TanStackRouterDevtoolsPanelCore.cjs.map +1 -0
- package/dist/cjs/TanStackRouterDevtoolsPanelCore.d.cts +43 -0
- package/dist/cjs/context.cjs +20 -0
- package/dist/cjs/context.cjs.map +1 -0
- package/dist/cjs/context.d.cts +13 -0
- package/dist/cjs/index.cjs +7 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +2 -0
- package/dist/cjs/logo.cjs +92 -0
- package/dist/cjs/logo.cjs.map +1 -0
- package/dist/cjs/logo.d.cts +1 -0
- package/dist/cjs/theme.d.cts +34 -0
- package/dist/cjs/tokens.cjs +201 -0
- package/dist/cjs/tokens.cjs.map +1 -0
- package/dist/cjs/tokens.d.cts +298 -0
- package/dist/cjs/useLocalStorage.cjs +42 -0
- package/dist/cjs/useLocalStorage.cjs.map +1 -0
- package/dist/cjs/useLocalStorage.d.cts +2 -0
- package/dist/cjs/useMediaQuery.d.cts +2 -0
- package/dist/cjs/useStyles.cjs +607 -0
- package/dist/cjs/useStyles.cjs.map +1 -0
- package/dist/cjs/useStyles.d.cts +55 -0
- package/dist/cjs/utils.cjs +63 -0
- package/dist/cjs/utils.cjs.map +1 -0
- package/dist/cjs/utils.d.cts +25 -0
- package/dist/esm/AgeTicker.d.ts +6 -0
- package/dist/esm/AgeTicker.js +47 -0
- package/dist/esm/AgeTicker.js.map +1 -0
- package/dist/esm/BaseTanStackRouterDevtoolsPanel.d.ts +35 -0
- package/dist/esm/BaseTanStackRouterDevtoolsPanel.js +602 -0
- package/dist/esm/BaseTanStackRouterDevtoolsPanel.js.map +1 -0
- package/dist/esm/Explorer.d.ts +43 -0
- package/dist/esm/Explorer.js +290 -0
- package/dist/esm/Explorer.js.map +1 -0
- package/dist/esm/FloatingTanStackRouterDevtools.d.ts +48 -0
- package/dist/esm/FloatingTanStackRouterDevtools.js +204 -0
- package/dist/esm/FloatingTanStackRouterDevtools.js.map +1 -0
- package/dist/esm/NavigateButton.d.ts +7 -0
- package/dist/esm/NavigateButton.js +30 -0
- package/dist/esm/NavigateButton.js.map +1 -0
- package/dist/esm/TanStackRouterDevtoolsCore.d.ts +55 -0
- package/dist/esm/TanStackRouterDevtoolsCore.js +107 -0
- package/dist/esm/TanStackRouterDevtoolsCore.js.map +1 -0
- package/dist/esm/TanStackRouterDevtoolsPanelCore.d.ts +43 -0
- package/dist/esm/TanStackRouterDevtoolsPanelCore.js +107 -0
- package/dist/esm/TanStackRouterDevtoolsPanelCore.js.map +1 -0
- package/dist/esm/context.d.ts +13 -0
- package/dist/esm/context.js +20 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logo.d.ts +1 -0
- package/dist/esm/logo.js +92 -0
- package/dist/esm/logo.js.map +1 -0
- package/dist/esm/theme.d.ts +34 -0
- package/dist/esm/tokens.d.ts +298 -0
- package/dist/esm/tokens.js +201 -0
- package/dist/esm/tokens.js.map +1 -0
- package/dist/esm/useLocalStorage.d.ts +2 -0
- package/dist/esm/useLocalStorage.js +43 -0
- package/dist/esm/useLocalStorage.js.map +1 -0
- package/dist/esm/useMediaQuery.d.ts +2 -0
- package/dist/esm/useStyles.d.ts +55 -0
- package/dist/esm/useStyles.js +590 -0
- package/dist/esm/useStyles.js.map +1 -0
- package/dist/esm/utils.d.ts +25 -0
- package/dist/esm/utils.js +63 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +71 -0
- package/src/AgeTicker.tsx +59 -0
- package/src/BaseTanStackRouterDevtoolsPanel.tsx +632 -0
- package/src/Explorer.tsx +339 -0
- package/src/FloatingTanStackRouterDevtools.tsx +290 -0
- package/src/NavigateButton.tsx +25 -0
- package/src/TanStackRouterDevtoolsCore.tsx +152 -0
- package/src/TanStackRouterDevtoolsPanelCore.tsx +131 -0
- package/src/context.ts +24 -0
- package/src/index.tsx +2 -0
- package/src/logo.tsx +817 -0
- package/src/theme.tsx +36 -0
- package/src/tokens.ts +305 -0
- package/src/useLocalStorage.ts +52 -0
- package/src/useMediaQuery.ts +44 -0
- package/src/useStyles.tsx +614 -0
- package/src/utils.tsx +185 -0
package/src/utils.tsx
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Dynamic } from 'solid-js/web'
|
|
2
|
+
import { createEffect, createRenderEffect, createSignal } from 'solid-js'
|
|
3
|
+
import { useTheme } from './theme'
|
|
4
|
+
import useMediaQuery from './useMediaQuery'
|
|
5
|
+
import type { AnyRoute, AnyRouteMatch } from '@tanstack/router-core'
|
|
6
|
+
|
|
7
|
+
import type { Theme } from './theme'
|
|
8
|
+
import type { JSX } from 'solid-js'
|
|
9
|
+
|
|
10
|
+
export const isServer = typeof window === 'undefined'
|
|
11
|
+
|
|
12
|
+
type StyledComponent<T> = T extends 'button'
|
|
13
|
+
? JSX.ButtonHTMLAttributes<HTMLButtonElement>
|
|
14
|
+
: T extends 'input'
|
|
15
|
+
? JSX.InputHTMLAttributes<HTMLInputElement>
|
|
16
|
+
: T extends 'select'
|
|
17
|
+
? JSX.SelectHTMLAttributes<HTMLSelectElement>
|
|
18
|
+
: T extends keyof HTMLElementTagNameMap
|
|
19
|
+
? JSX.HTMLAttributes<HTMLElementTagNameMap[T]>
|
|
20
|
+
: never
|
|
21
|
+
|
|
22
|
+
export function getStatusColor(match: AnyRouteMatch) {
|
|
23
|
+
const colorMap = {
|
|
24
|
+
pending: 'yellow',
|
|
25
|
+
success: 'green',
|
|
26
|
+
error: 'red',
|
|
27
|
+
notFound: 'purple',
|
|
28
|
+
redirected: 'gray',
|
|
29
|
+
} as const
|
|
30
|
+
|
|
31
|
+
return match.isFetching && match.status === 'success'
|
|
32
|
+
? match.isFetching === 'beforeLoad'
|
|
33
|
+
? 'purple'
|
|
34
|
+
: 'blue'
|
|
35
|
+
: colorMap[match.status]
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function getRouteStatusColor(
|
|
39
|
+
matches: Array<AnyRouteMatch>,
|
|
40
|
+
route: AnyRoute,
|
|
41
|
+
) {
|
|
42
|
+
const found = matches.find((d) => d.routeId === route.id)
|
|
43
|
+
if (!found) return 'gray'
|
|
44
|
+
return getStatusColor(found)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
type Styles =
|
|
48
|
+
| JSX.CSSProperties
|
|
49
|
+
| ((props: Record<string, any>, theme: Theme) => JSX.CSSProperties)
|
|
50
|
+
|
|
51
|
+
export function styled<T extends keyof HTMLElementTagNameMap>(
|
|
52
|
+
type: T,
|
|
53
|
+
newStyles: Styles,
|
|
54
|
+
queries: Record<string, Styles> = {},
|
|
55
|
+
) {
|
|
56
|
+
return ({
|
|
57
|
+
ref,
|
|
58
|
+
style,
|
|
59
|
+
...rest
|
|
60
|
+
}: StyledComponent<T> & {
|
|
61
|
+
ref?: HTMLElementTagNameMap[T] | undefined
|
|
62
|
+
}) => {
|
|
63
|
+
const theme = useTheme()
|
|
64
|
+
|
|
65
|
+
const mediaStyles = Object.entries(queries).reduce(
|
|
66
|
+
(current, [key, value]) => {
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
68
|
+
return useMediaQuery(key)
|
|
69
|
+
? {
|
|
70
|
+
...current,
|
|
71
|
+
...(typeof value === 'function' ? value(rest, theme) : value),
|
|
72
|
+
}
|
|
73
|
+
: current
|
|
74
|
+
},
|
|
75
|
+
{},
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
const baseStyles =
|
|
79
|
+
typeof newStyles === 'function' ? newStyles(rest, theme) : newStyles
|
|
80
|
+
|
|
81
|
+
// Handle style being either a string or an object
|
|
82
|
+
const combinedStyles =
|
|
83
|
+
typeof style === 'string'
|
|
84
|
+
? { ...baseStyles, ...mediaStyles, cssText: style }
|
|
85
|
+
: { ...baseStyles, ...style, ...mediaStyles }
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
<Dynamic component={type} {...rest} style={combinedStyles} ref={ref} />
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function useIsMounted() {
|
|
96
|
+
const [isMounted, setIsMounted] = createSignal(false)
|
|
97
|
+
|
|
98
|
+
const effect = isServer ? createEffect : createRenderEffect
|
|
99
|
+
|
|
100
|
+
effect(() => {
|
|
101
|
+
setIsMounted(true)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
return isMounted
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Displays a string regardless the type of the data
|
|
109
|
+
* @param {unknown} value Value to be stringified
|
|
110
|
+
*/
|
|
111
|
+
export const displayValue = (value: unknown) => {
|
|
112
|
+
const name = Object.getOwnPropertyNames(Object(value))
|
|
113
|
+
const newValue = typeof value === 'bigint' ? `${value.toString()}n` : value
|
|
114
|
+
try {
|
|
115
|
+
return JSON.stringify(newValue, name)
|
|
116
|
+
} catch (e) {
|
|
117
|
+
return `unable to stringify`
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* This hook is a safe useState version which schedules state updates in microtasks
|
|
123
|
+
* to prevent updating a component state while React is rendering different components
|
|
124
|
+
* or when the component is not mounted anymore.
|
|
125
|
+
*/
|
|
126
|
+
export function useSafeState<T>(initialState: T): [T, (value: T) => void] {
|
|
127
|
+
const isMounted = useIsMounted()
|
|
128
|
+
const [state, setState] = createSignal(initialState)
|
|
129
|
+
|
|
130
|
+
const safeSetState = (value: T) => {
|
|
131
|
+
scheduleMicrotask(() => {
|
|
132
|
+
if (isMounted()) {
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
134
|
+
// @ts-ignore
|
|
135
|
+
setState(value)
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return [state(), safeSetState]
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Schedules a microtask.
|
|
145
|
+
* This can be useful to schedule state updates after rendering.
|
|
146
|
+
*/
|
|
147
|
+
function scheduleMicrotask(callback: () => void) {
|
|
148
|
+
Promise.resolve()
|
|
149
|
+
.then(callback)
|
|
150
|
+
.catch((error) =>
|
|
151
|
+
setTimeout(() => {
|
|
152
|
+
throw error
|
|
153
|
+
}),
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function multiSortBy<T>(
|
|
158
|
+
arr: Array<T>,
|
|
159
|
+
accessors: Array<(item: T) => any> = [(d) => d],
|
|
160
|
+
): Array<T> {
|
|
161
|
+
return arr
|
|
162
|
+
.map((d, i) => [d, i] as const)
|
|
163
|
+
.sort(([a, ai], [b, bi]) => {
|
|
164
|
+
for (const accessor of accessors) {
|
|
165
|
+
const ao = accessor(a)
|
|
166
|
+
const bo = accessor(b)
|
|
167
|
+
|
|
168
|
+
if (typeof ao === 'undefined') {
|
|
169
|
+
if (typeof bo === 'undefined') {
|
|
170
|
+
continue
|
|
171
|
+
}
|
|
172
|
+
return 1
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (ao === bo) {
|
|
176
|
+
continue
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return ao > bo ? 1 : -1
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return ai - bi
|
|
183
|
+
})
|
|
184
|
+
.map(([d]) => d)
|
|
185
|
+
}
|