@tanstack/react-devtools 0.7.11 → 0.8.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/dist/esm/devtools.d.ts +19 -1
- package/dist/esm/devtools.js +24 -6
- package/dist/esm/devtools.js.map +1 -1
- package/package.json +2 -2
- package/src/devtools.tsx +64 -9
package/dist/esm/devtools.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { JSX, ReactElement } from 'react';
|
|
2
2
|
import { ClientEventBusConfig, TanStackDevtoolsConfig, TanStackDevtoolsPlugin } from '@tanstack/devtools';
|
|
3
3
|
type PluginRender = JSX.Element | ((el: HTMLElement, theme: 'dark' | 'light') => JSX.Element);
|
|
4
|
+
type TriggerProps = {
|
|
5
|
+
theme: 'dark' | 'light';
|
|
6
|
+
};
|
|
7
|
+
type TriggerRender = JSX.Element | ((el: HTMLElement, props: TriggerProps) => JSX.Element);
|
|
4
8
|
export type TanStackDevtoolsReactPlugin = Omit<TanStackDevtoolsPlugin, 'render' | 'name'> & {
|
|
5
9
|
/**
|
|
6
10
|
* The render function can be a React element or a function that returns a React element.
|
|
@@ -42,6 +46,20 @@ export type TanStackDevtoolsReactPlugin = Omit<TanStackDevtoolsPlugin, 'render'
|
|
|
42
46
|
*/
|
|
43
47
|
name: string | PluginRender;
|
|
44
48
|
};
|
|
49
|
+
type TanStackDevtoolsReactConfig = Omit<Partial<TanStackDevtoolsConfig>, 'customTrigger'> & {
|
|
50
|
+
/**
|
|
51
|
+
* Optional custom trigger component for the devtools.
|
|
52
|
+
* It can be a React element or a function that renders one.
|
|
53
|
+
*
|
|
54
|
+
* Example:
|
|
55
|
+
* ```jsx
|
|
56
|
+
* {
|
|
57
|
+
* customTrigger: <CustomTriggerComponent />,
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
customTrigger?: TriggerRender;
|
|
62
|
+
};
|
|
45
63
|
export interface TanStackDevtoolsReactInit {
|
|
46
64
|
/**
|
|
47
65
|
* Array of plugins to be used in the devtools.
|
|
@@ -66,7 +84,7 @@ export interface TanStackDevtoolsReactInit {
|
|
|
66
84
|
* initial state of the devtools when it is started for the first time. Afterwards,
|
|
67
85
|
* the settings are persisted in local storage and changed through the settings panel.
|
|
68
86
|
*/
|
|
69
|
-
config?:
|
|
87
|
+
config?: TanStackDevtoolsReactConfig;
|
|
70
88
|
/**
|
|
71
89
|
* Configuration for the TanStack Devtools client event bus.
|
|
72
90
|
*/
|
package/dist/esm/devtools.js
CHANGED
|
@@ -9,6 +9,10 @@ const convertRender = (Component, setComponents, e, theme) => {
|
|
|
9
9
|
[e.getAttribute("id")]: element
|
|
10
10
|
}));
|
|
11
11
|
};
|
|
12
|
+
const convertTrigger = (Component, setComponent, e, props) => {
|
|
13
|
+
const element = typeof Component === "function" ? Component(e, props) : Component;
|
|
14
|
+
setComponent(element);
|
|
15
|
+
};
|
|
12
16
|
const TanStackDevtools = ({
|
|
13
17
|
plugins,
|
|
14
18
|
config,
|
|
@@ -17,8 +21,14 @@ const TanStackDevtools = ({
|
|
|
17
21
|
const devToolRef = useRef(null);
|
|
18
22
|
const [pluginContainers, setPluginContainers] = useState({});
|
|
19
23
|
const [titleContainers, setTitleContainers] = useState({});
|
|
24
|
+
const [triggerContainer, setTriggerContainer] = useState(
|
|
25
|
+
null
|
|
26
|
+
);
|
|
20
27
|
const [PluginComponents, setPluginComponents] = useState({});
|
|
21
28
|
const [TitleComponents, setTitleComponents] = useState({});
|
|
29
|
+
const [TriggerComponent, setTriggerComponent] = useState(
|
|
30
|
+
null
|
|
31
|
+
);
|
|
22
32
|
const pluginsMap = useMemo(
|
|
23
33
|
() => plugins?.map((plugin) => {
|
|
24
34
|
return {
|
|
@@ -54,13 +64,20 @@ const TanStackDevtools = ({
|
|
|
54
64
|
}) ?? [],
|
|
55
65
|
[plugins]
|
|
56
66
|
);
|
|
57
|
-
const [devtools] = useState(
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
const [devtools] = useState(() => {
|
|
68
|
+
const { customTrigger, ...coreConfig } = config || {};
|
|
69
|
+
return new TanStackDevtoolsCore({
|
|
70
|
+
config: {
|
|
71
|
+
...coreConfig,
|
|
72
|
+
customTrigger: customTrigger ? (el, props) => {
|
|
73
|
+
setTriggerContainer(el);
|
|
74
|
+
convertTrigger(customTrigger, setTriggerComponent, el, props);
|
|
75
|
+
} : void 0
|
|
76
|
+
},
|
|
60
77
|
eventBusConfig,
|
|
61
78
|
plugins: pluginsMap
|
|
62
|
-
})
|
|
63
|
-
);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
64
81
|
useEffect(() => {
|
|
65
82
|
devtools.setConfig({
|
|
66
83
|
plugins: pluginsMap
|
|
@@ -81,7 +98,8 @@ const TanStackDevtools = ({
|
|
|
81
98
|
) : null,
|
|
82
99
|
hasTitles ? Object.entries(titleContainers).map(
|
|
83
100
|
([key, titleContainer]) => createPortal(/* @__PURE__ */ jsx(Fragment, { children: TitleComponents[key] }), titleContainer)
|
|
84
|
-
) : null
|
|
101
|
+
) : null,
|
|
102
|
+
triggerContainer && TriggerComponent ? createPortal(/* @__PURE__ */ jsx(Fragment, { children: TriggerComponent }), triggerContainer) : null
|
|
85
103
|
] });
|
|
86
104
|
};
|
|
87
105
|
export {
|
package/dist/esm/devtools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.js","sources":["../../src/devtools.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { TanStackDevtoolsCore } from '@tanstack/devtools'\nimport { createPortal } from 'react-dom'\nimport type { JSX, ReactElement } from 'react'\nimport type {\n ClientEventBusConfig,\n TanStackDevtoolsConfig,\n TanStackDevtoolsPlugin,\n} from '@tanstack/devtools'\n\ntype PluginRender =\n | JSX.Element\n | ((el: HTMLElement, theme: 'dark' | 'light') => JSX.Element)\n\nexport type TanStackDevtoolsReactPlugin = Omit<\n TanStackDevtoolsPlugin,\n 'render' | 'name'\n> & {\n /**\n * The render function can be a React element or a function that returns a React element.\n * If it's a function, it will be called to render the plugin, otherwise it will be rendered directly.\n *\n * Example:\n * ```jsx\n * {\n * render: () => <CustomPluginComponent />,\n * }\n * ```\n * or\n * ```jsx\n * {\n * render: <CustomPluginComponent />,\n * }\n * ```\n */\n render: PluginRender\n /**\n * Name to be displayed in the devtools UI.\n * If a string, it will be used as the plugin name.\n * If a function, it will be called with the mount element.\n *\n * Example:\n * ```jsx\n * {\n * name: \"Your Plugin\",\n * render: () => <CustomPluginComponent />,\n * }\n * ```\n * or\n * ```jsx\n * {\n * name: <h1>Your Plugin title</h1>,\n * render: () => <CustomPluginComponent />,\n * }\n * ```\n */\n name: string | PluginRender\n}\n\nexport interface TanStackDevtoolsReactInit {\n /**\n * Array of plugins to be used in the devtools.\n * Each plugin should have a `render` function that returns a React element or a function\n *\n * Example:\n * ```jsx\n * <TanStackDevtools\n * plugins={[\n * {\n * id: \"your-plugin-id\",\n * name: \"Your Plugin\",\n * render: <CustomPluginComponent />,\n * }\n * ]}\n * />\n * ```\n */\n plugins?: Array<TanStackDevtoolsReactPlugin>\n /**\n * Configuration for the devtools shell. These configuration options are used to set the\n * initial state of the devtools when it is started for the first time. Afterwards,\n * the settings are persisted in local storage and changed through the settings panel.\n */\n config?: Partial<TanStackDevtoolsConfig>\n /**\n * Configuration for the TanStack Devtools client event bus.\n */\n eventBusConfig?: ClientEventBusConfig\n}\n\nconst convertRender = (\n Component: PluginRender,\n setComponents: React.Dispatch<\n React.SetStateAction<Record<string, JSX.Element>>\n >,\n e: HTMLElement,\n theme: 'dark' | 'light',\n) => {\n const element =\n typeof Component === 'function' ? Component(e, theme) : Component\n\n setComponents((prev) => ({\n ...prev,\n [e.getAttribute('id') as string]: element,\n }))\n}\n\nexport const TanStackDevtools = ({\n plugins,\n config,\n eventBusConfig,\n}: TanStackDevtoolsReactInit): ReactElement | null => {\n const devToolRef = useRef<HTMLDivElement>(null)\n\n const [pluginContainers, setPluginContainers] = useState<\n Record<string, HTMLElement>\n >({})\n const [titleContainers, setTitleContainers] = useState<\n Record<string, HTMLElement>\n >({})\n\n const [PluginComponents, setPluginComponents] = useState<\n Record<string, JSX.Element>\n >({})\n const [TitleComponents, setTitleComponents] = useState<\n Record<string, JSX.Element>\n >({})\n\n const pluginsMap: Array<TanStackDevtoolsPlugin> = useMemo(\n () =>\n plugins?.map((plugin) => {\n return {\n ...plugin,\n name:\n typeof plugin.name === 'string'\n ? plugin.name\n : (e, theme) => {\n const id = e.getAttribute('id')!\n const target = e.ownerDocument.getElementById(id)\n\n if (target) {\n setTitleContainers((prev) => ({\n ...prev,\n [id]: e,\n }))\n }\n\n convertRender(\n plugin.name as PluginRender,\n setTitleComponents,\n e,\n theme,\n )\n },\n render: (e, theme) => {\n const id = e.getAttribute('id')!\n const target = e.ownerDocument.getElementById(id)\n\n if (target) {\n setPluginContainers((prev) => ({\n ...prev,\n [id]: e,\n }))\n }\n\n convertRender(plugin.render, setPluginComponents, e, theme)\n },\n }\n }) ?? [],\n [plugins],\n )\n\n const [devtools] = useState(\n () =>\n new TanStackDevtoolsCore({\n config,\n eventBusConfig,\n plugins: pluginsMap,\n }),\n )\n\n useEffect(() => {\n devtools.setConfig({\n plugins: pluginsMap,\n })\n }, [devtools, pluginsMap])\n\n useEffect(() => {\n if (devToolRef.current) {\n devtools.mount(devToolRef.current)\n }\n\n return () => devtools.unmount()\n }, [devtools])\n\n const hasPlugins =\n Object.values(pluginContainers).length > 0 &&\n Object.values(PluginComponents).length > 0\n const hasTitles =\n Object.values(titleContainers).length > 0 &&\n Object.values(TitleComponents).length > 0\n\n return (\n <>\n <div style={{ position: 'absolute' }} ref={devToolRef} />\n\n {hasPlugins\n ? Object.entries(pluginContainers).map(([key, pluginContainer]) =>\n createPortal(<>{PluginComponents[key]}</>, pluginContainer),\n )\n : null}\n\n {hasTitles\n ? Object.entries(titleContainers).map(([key, titleContainer]) =>\n createPortal(<>{TitleComponents[key]}</>, titleContainer),\n )\n : null}\n </>\n )\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devtools.js","sources":["../../src/devtools.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { TanStackDevtoolsCore } from '@tanstack/devtools'\nimport { createPortal } from 'react-dom'\nimport type { JSX, ReactElement } from 'react'\nimport type {\n ClientEventBusConfig,\n TanStackDevtoolsConfig,\n TanStackDevtoolsPlugin,\n} from '@tanstack/devtools'\n\ntype PluginRender =\n | JSX.Element\n | ((el: HTMLElement, theme: 'dark' | 'light') => JSX.Element)\n\ntype TriggerProps = {\n theme: 'dark' | 'light'\n}\n\ntype TriggerRender =\n | JSX.Element\n | ((el: HTMLElement, props: TriggerProps) => JSX.Element)\n\nexport type TanStackDevtoolsReactPlugin = Omit<\n TanStackDevtoolsPlugin,\n 'render' | 'name'\n> & {\n /**\n * The render function can be a React element or a function that returns a React element.\n * If it's a function, it will be called to render the plugin, otherwise it will be rendered directly.\n *\n * Example:\n * ```jsx\n * {\n * render: () => <CustomPluginComponent />,\n * }\n * ```\n * or\n * ```jsx\n * {\n * render: <CustomPluginComponent />,\n * }\n * ```\n */\n render: PluginRender\n /**\n * Name to be displayed in the devtools UI.\n * If a string, it will be used as the plugin name.\n * If a function, it will be called with the mount element.\n *\n * Example:\n * ```jsx\n * {\n * name: \"Your Plugin\",\n * render: () => <CustomPluginComponent />,\n * }\n * ```\n * or\n * ```jsx\n * {\n * name: <h1>Your Plugin title</h1>,\n * render: () => <CustomPluginComponent />,\n * }\n * ```\n */\n name: string | PluginRender\n}\n\ntype TanStackDevtoolsReactConfig = Omit<\n Partial<TanStackDevtoolsConfig>,\n 'customTrigger'\n> & {\n /**\n * Optional custom trigger component for the devtools.\n * It can be a React element or a function that renders one.\n *\n * Example:\n * ```jsx\n * {\n * customTrigger: <CustomTriggerComponent />,\n * }\n * ```\n */\n customTrigger?: TriggerRender\n}\n\nexport interface TanStackDevtoolsReactInit {\n /**\n * Array of plugins to be used in the devtools.\n * Each plugin should have a `render` function that returns a React element or a function\n *\n * Example:\n * ```jsx\n * <TanStackDevtools\n * plugins={[\n * {\n * id: \"your-plugin-id\",\n * name: \"Your Plugin\",\n * render: <CustomPluginComponent />,\n * }\n * ]}\n * />\n * ```\n */\n plugins?: Array<TanStackDevtoolsReactPlugin>\n /**\n * Configuration for the devtools shell. These configuration options are used to set the\n * initial state of the devtools when it is started for the first time. Afterwards,\n * the settings are persisted in local storage and changed through the settings panel.\n */\n config?: TanStackDevtoolsReactConfig\n /**\n * Configuration for the TanStack Devtools client event bus.\n */\n eventBusConfig?: ClientEventBusConfig\n}\n\nconst convertRender = (\n Component: PluginRender,\n setComponents: React.Dispatch<\n React.SetStateAction<Record<string, JSX.Element>>\n >,\n e: HTMLElement,\n theme: 'dark' | 'light',\n) => {\n const element =\n typeof Component === 'function' ? Component(e, theme) : Component\n\n setComponents((prev) => ({\n ...prev,\n [e.getAttribute('id') as string]: element,\n }))\n}\n\nconst convertTrigger = (\n Component: TriggerRender,\n setComponent: React.Dispatch<React.SetStateAction<JSX.Element | null>>,\n e: HTMLElement,\n props: TriggerProps,\n) => {\n const element =\n typeof Component === 'function' ? Component(e, props) : Component\n setComponent(element)\n}\n\nexport const TanStackDevtools = ({\n plugins,\n config,\n eventBusConfig,\n}: TanStackDevtoolsReactInit): ReactElement | null => {\n const devToolRef = useRef<HTMLDivElement>(null)\n\n const [pluginContainers, setPluginContainers] = useState<\n Record<string, HTMLElement>\n >({})\n const [titleContainers, setTitleContainers] = useState<\n Record<string, HTMLElement>\n >({})\n const [triggerContainer, setTriggerContainer] = useState<HTMLElement | null>(\n null,\n )\n\n const [PluginComponents, setPluginComponents] = useState<\n Record<string, JSX.Element>\n >({})\n const [TitleComponents, setTitleComponents] = useState<\n Record<string, JSX.Element>\n >({})\n const [TriggerComponent, setTriggerComponent] = useState<JSX.Element | null>(\n null,\n )\n\n const pluginsMap: Array<TanStackDevtoolsPlugin> = useMemo(\n () =>\n plugins?.map((plugin) => {\n return {\n ...plugin,\n name:\n typeof plugin.name === 'string'\n ? plugin.name\n : (e, theme) => {\n const id = e.getAttribute('id')!\n const target = e.ownerDocument.getElementById(id)\n\n if (target) {\n setTitleContainers((prev) => ({\n ...prev,\n [id]: e,\n }))\n }\n\n convertRender(\n plugin.name as PluginRender,\n setTitleComponents,\n e,\n theme,\n )\n },\n render: (e, theme) => {\n const id = e.getAttribute('id')!\n const target = e.ownerDocument.getElementById(id)\n\n if (target) {\n setPluginContainers((prev) => ({\n ...prev,\n [id]: e,\n }))\n }\n\n convertRender(plugin.render, setPluginComponents, e, theme)\n },\n }\n }) ?? [],\n [plugins],\n )\n\n const [devtools] = useState(() => {\n const { customTrigger, ...coreConfig } = config || {}\n return new TanStackDevtoolsCore({\n config: {\n ...coreConfig,\n customTrigger: customTrigger\n ? (el, props) => {\n setTriggerContainer(el)\n convertTrigger(customTrigger, setTriggerComponent, el, props)\n }\n : undefined,\n },\n eventBusConfig,\n plugins: pluginsMap,\n })\n })\n\n useEffect(() => {\n devtools.setConfig({\n plugins: pluginsMap,\n })\n }, [devtools, pluginsMap])\n\n useEffect(() => {\n if (devToolRef.current) {\n devtools.mount(devToolRef.current)\n }\n\n return () => devtools.unmount()\n }, [devtools])\n\n const hasPlugins =\n Object.values(pluginContainers).length > 0 &&\n Object.values(PluginComponents).length > 0\n const hasTitles =\n Object.values(titleContainers).length > 0 &&\n Object.values(TitleComponents).length > 0\n\n return (\n <>\n <div style={{ position: 'absolute' }} ref={devToolRef} />\n\n {hasPlugins\n ? Object.entries(pluginContainers).map(([key, pluginContainer]) =>\n createPortal(<>{PluginComponents[key]}</>, pluginContainer),\n )\n : null}\n\n {hasTitles\n ? Object.entries(titleContainers).map(([key, titleContainer]) =>\n createPortal(<>{TitleComponents[key]}</>, titleContainer),\n )\n : null}\n\n {triggerContainer && TriggerComponent\n ? createPortal(<>{TriggerComponent}</>, triggerContainer)\n : null}\n </>\n )\n}\n"],"names":[],"mappings":";;;;AAoHA,MAAM,gBAAgB,CACpB,WACA,eAGA,GACA,UACG;AACH,QAAM,UACJ,OAAO,cAAc,aAAa,UAAU,GAAG,KAAK,IAAI;AAE1D,gBAAc,CAAC,UAAU;AAAA,IACvB,GAAG;AAAA,IACH,CAAC,EAAE,aAAa,IAAI,CAAW,GAAG;AAAA,EAAA,EAClC;AACJ;AAEA,MAAM,iBAAiB,CACrB,WACA,cACA,GACA,UACG;AACH,QAAM,UACJ,OAAO,cAAc,aAAa,UAAU,GAAG,KAAK,IAAI;AAC1D,eAAa,OAAO;AACtB;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,MAAsD;AACpD,QAAM,aAAa,OAAuB,IAAI;AAE9C,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAE9C,CAAA,CAAE;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAE5C,CAAA,CAAE;AACJ,QAAM,CAAC,kBAAkB,mBAAmB,IAAI;AAAA,IAC9C;AAAA,EAAA;AAGF,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAE9C,CAAA,CAAE;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAE5C,CAAA,CAAE;AACJ,QAAM,CAAC,kBAAkB,mBAAmB,IAAI;AAAA,IAC9C;AAAA,EAAA;AAGF,QAAM,aAA4C;AAAA,IAChD,MACE,SAAS,IAAI,CAAC,WAAW;AACvB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MACE,OAAO,OAAO,SAAS,WACnB,OAAO,OACP,CAAC,GAAG,UAAU;AACZ,gBAAM,KAAK,EAAE,aAAa,IAAI;AAC9B,gBAAM,SAAS,EAAE,cAAc,eAAe,EAAE;AAEhD,cAAI,QAAQ;AACV,+BAAmB,CAAC,UAAU;AAAA,cAC5B,GAAG;AAAA,cACH,CAAC,EAAE,GAAG;AAAA,YAAA,EACN;AAAA,UACJ;AAEA;AAAA,YACE,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,QACN,QAAQ,CAAC,GAAG,UAAU;AACpB,gBAAM,KAAK,EAAE,aAAa,IAAI;AAC9B,gBAAM,SAAS,EAAE,cAAc,eAAe,EAAE;AAEhD,cAAI,QAAQ;AACV,gCAAoB,CAAC,UAAU;AAAA,cAC7B,GAAG;AAAA,cACH,CAAC,EAAE,GAAG;AAAA,YAAA,EACN;AAAA,UACJ;AAEA,wBAAc,OAAO,QAAQ,qBAAqB,GAAG,KAAK;AAAA,QAC5D;AAAA,MAAA;AAAA,IAEJ,CAAC,KAAK,CAAA;AAAA,IACR,CAAC,OAAO;AAAA,EAAA;AAGV,QAAM,CAAC,QAAQ,IAAI,SAAS,MAAM;AAChC,UAAM,EAAE,eAAe,GAAG,WAAA,IAAe,UAAU,CAAA;AACnD,WAAO,IAAI,qBAAqB;AAAA,MAC9B,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,eAAe,gBACX,CAAC,IAAI,UAAU;AACb,8BAAoB,EAAE;AACtB,yBAAe,eAAe,qBAAqB,IAAI,KAAK;AAAA,QAC9D,IACA;AAAA,MAAA;AAAA,MAEN;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAAA,EACH,CAAC;AAED,YAAU,MAAM;AACd,aAAS,UAAU;AAAA,MACjB,SAAS;AAAA,IAAA,CACV;AAAA,EACH,GAAG,CAAC,UAAU,UAAU,CAAC;AAEzB,YAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,eAAS,MAAM,WAAW,OAAO;AAAA,IACnC;AAEA,WAAO,MAAM,SAAS,QAAA;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,aACJ,OAAO,OAAO,gBAAgB,EAAE,SAAS,KACzC,OAAO,OAAO,gBAAgB,EAAE,SAAS;AAC3C,QAAM,YACJ,OAAO,OAAO,eAAe,EAAE,SAAS,KACxC,OAAO,OAAO,eAAe,EAAE,SAAS;AAE1C,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,SAAI,OAAO,EAAE,UAAU,WAAA,GAAc,KAAK,YAAY;AAAA,IAEtD,aACG,OAAO,QAAQ,gBAAgB,EAAE;AAAA,MAAI,CAAC,CAAC,KAAK,eAAe,MACzD,aAAa,oBAAA,UAAA,EAAG,UAAA,iBAAiB,GAAG,EAAA,CAAE,GAAK,eAAe;AAAA,IAAA,IAE5D;AAAA,IAEH,YACG,OAAO,QAAQ,eAAe,EAAE;AAAA,MAAI,CAAC,CAAC,KAAK,cAAc,MACvD,aAAa,oBAAA,UAAA,EAAG,UAAA,gBAAgB,GAAG,EAAA,CAAE,GAAK,cAAc;AAAA,IAAA,IAE1D;AAAA,IAEH,oBAAoB,mBACjB,6CAAgB,UAAA,iBAAA,CAAiB,GAAK,gBAAgB,IACtD;AAAA,EAAA,GACN;AAEJ;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-devtools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "TanStack Devtools is a set of tools for building advanced devtools for your React application.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"src"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@tanstack/devtools": "0.
|
|
42
|
+
"@tanstack/devtools": "0.8.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@eslint-react/eslint-plugin": "^1.53.1",
|
package/src/devtools.tsx
CHANGED
|
@@ -12,6 +12,14 @@ type PluginRender =
|
|
|
12
12
|
| JSX.Element
|
|
13
13
|
| ((el: HTMLElement, theme: 'dark' | 'light') => JSX.Element)
|
|
14
14
|
|
|
15
|
+
type TriggerProps = {
|
|
16
|
+
theme: 'dark' | 'light'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type TriggerRender =
|
|
20
|
+
| JSX.Element
|
|
21
|
+
| ((el: HTMLElement, props: TriggerProps) => JSX.Element)
|
|
22
|
+
|
|
15
23
|
export type TanStackDevtoolsReactPlugin = Omit<
|
|
16
24
|
TanStackDevtoolsPlugin,
|
|
17
25
|
'render' | 'name'
|
|
@@ -57,6 +65,24 @@ export type TanStackDevtoolsReactPlugin = Omit<
|
|
|
57
65
|
name: string | PluginRender
|
|
58
66
|
}
|
|
59
67
|
|
|
68
|
+
type TanStackDevtoolsReactConfig = Omit<
|
|
69
|
+
Partial<TanStackDevtoolsConfig>,
|
|
70
|
+
'customTrigger'
|
|
71
|
+
> & {
|
|
72
|
+
/**
|
|
73
|
+
* Optional custom trigger component for the devtools.
|
|
74
|
+
* It can be a React element or a function that renders one.
|
|
75
|
+
*
|
|
76
|
+
* Example:
|
|
77
|
+
* ```jsx
|
|
78
|
+
* {
|
|
79
|
+
* customTrigger: <CustomTriggerComponent />,
|
|
80
|
+
* }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
customTrigger?: TriggerRender
|
|
84
|
+
}
|
|
85
|
+
|
|
60
86
|
export interface TanStackDevtoolsReactInit {
|
|
61
87
|
/**
|
|
62
88
|
* Array of plugins to be used in the devtools.
|
|
@@ -81,7 +107,7 @@ export interface TanStackDevtoolsReactInit {
|
|
|
81
107
|
* initial state of the devtools when it is started for the first time. Afterwards,
|
|
82
108
|
* the settings are persisted in local storage and changed through the settings panel.
|
|
83
109
|
*/
|
|
84
|
-
config?:
|
|
110
|
+
config?: TanStackDevtoolsReactConfig
|
|
85
111
|
/**
|
|
86
112
|
* Configuration for the TanStack Devtools client event bus.
|
|
87
113
|
*/
|
|
@@ -105,6 +131,17 @@ const convertRender = (
|
|
|
105
131
|
}))
|
|
106
132
|
}
|
|
107
133
|
|
|
134
|
+
const convertTrigger = (
|
|
135
|
+
Component: TriggerRender,
|
|
136
|
+
setComponent: React.Dispatch<React.SetStateAction<JSX.Element | null>>,
|
|
137
|
+
e: HTMLElement,
|
|
138
|
+
props: TriggerProps,
|
|
139
|
+
) => {
|
|
140
|
+
const element =
|
|
141
|
+
typeof Component === 'function' ? Component(e, props) : Component
|
|
142
|
+
setComponent(element)
|
|
143
|
+
}
|
|
144
|
+
|
|
108
145
|
export const TanStackDevtools = ({
|
|
109
146
|
plugins,
|
|
110
147
|
config,
|
|
@@ -118,6 +155,9 @@ export const TanStackDevtools = ({
|
|
|
118
155
|
const [titleContainers, setTitleContainers] = useState<
|
|
119
156
|
Record<string, HTMLElement>
|
|
120
157
|
>({})
|
|
158
|
+
const [triggerContainer, setTriggerContainer] = useState<HTMLElement | null>(
|
|
159
|
+
null,
|
|
160
|
+
)
|
|
121
161
|
|
|
122
162
|
const [PluginComponents, setPluginComponents] = useState<
|
|
123
163
|
Record<string, JSX.Element>
|
|
@@ -125,6 +165,9 @@ export const TanStackDevtools = ({
|
|
|
125
165
|
const [TitleComponents, setTitleComponents] = useState<
|
|
126
166
|
Record<string, JSX.Element>
|
|
127
167
|
>({})
|
|
168
|
+
const [TriggerComponent, setTriggerComponent] = useState<JSX.Element | null>(
|
|
169
|
+
null,
|
|
170
|
+
)
|
|
128
171
|
|
|
129
172
|
const pluginsMap: Array<TanStackDevtoolsPlugin> = useMemo(
|
|
130
173
|
() =>
|
|
@@ -170,14 +213,22 @@ export const TanStackDevtools = ({
|
|
|
170
213
|
[plugins],
|
|
171
214
|
)
|
|
172
215
|
|
|
173
|
-
const [devtools] = useState(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
216
|
+
const [devtools] = useState(() => {
|
|
217
|
+
const { customTrigger, ...coreConfig } = config || {}
|
|
218
|
+
return new TanStackDevtoolsCore({
|
|
219
|
+
config: {
|
|
220
|
+
...coreConfig,
|
|
221
|
+
customTrigger: customTrigger
|
|
222
|
+
? (el, props) => {
|
|
223
|
+
setTriggerContainer(el)
|
|
224
|
+
convertTrigger(customTrigger, setTriggerComponent, el, props)
|
|
225
|
+
}
|
|
226
|
+
: undefined,
|
|
227
|
+
},
|
|
228
|
+
eventBusConfig,
|
|
229
|
+
plugins: pluginsMap,
|
|
230
|
+
})
|
|
231
|
+
})
|
|
181
232
|
|
|
182
233
|
useEffect(() => {
|
|
183
234
|
devtools.setConfig({
|
|
@@ -215,6 +266,10 @@ export const TanStackDevtools = ({
|
|
|
215
266
|
createPortal(<>{TitleComponents[key]}</>, titleContainer),
|
|
216
267
|
)
|
|
217
268
|
: null}
|
|
269
|
+
|
|
270
|
+
{triggerContainer && TriggerComponent
|
|
271
|
+
? createPortal(<>{TriggerComponent}</>, triggerContainer)
|
|
272
|
+
: null}
|
|
218
273
|
</>
|
|
219
274
|
)
|
|
220
275
|
}
|