@tanstack/react-devtools 0.0.0 → 0.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.
- package/README.md +31 -0
- package/dist/cjs/devtools.cjs +50 -4
- package/dist/cjs/devtools.cjs.map +1 -1
- package/dist/cjs/devtools.d.cts +13 -3
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.d.cts +2 -1
- package/dist/esm/devtools.d.ts +13 -3
- package/dist/esm/devtools.js +52 -6
- package/dist/esm/devtools.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -2
- package/package.json +4 -9
- package/src/devtools.tsx +87 -5
- package/src/index.ts +2 -1
package/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# @tanstack/react-devtools
|
|
2
|
+
|
|
3
|
+
This package is still under active development and might have breaking changes in the future. Please use it with caution.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { TanstackDevtools } from '@tanstack/react-devtools'
|
|
9
|
+
import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools'
|
|
10
|
+
import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
|
|
11
|
+
|
|
12
|
+
function App() {
|
|
13
|
+
return (
|
|
14
|
+
<div>
|
|
15
|
+
<h1>My App</h1>
|
|
16
|
+
<TanstackDevtools
|
|
17
|
+
plugins={[
|
|
18
|
+
{
|
|
19
|
+
name: 'Tanstack Query',
|
|
20
|
+
render: <ReactQueryDevtoolsPanel />,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'Tanstack Router',
|
|
24
|
+
render: <TanStackRouterDevtoolsPanel router={router} />,
|
|
25
|
+
},
|
|
26
|
+
]}
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
```
|
package/dist/cjs/devtools.cjs
CHANGED
|
@@ -3,9 +3,51 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const devtools = require("@tanstack/devtools");
|
|
6
|
-
const
|
|
6
|
+
const reactDom = require("react-dom");
|
|
7
|
+
const convertRender = (Component, setComponent) => {
|
|
8
|
+
setComponent(typeof Component === "function" ? Component() : Component);
|
|
9
|
+
};
|
|
10
|
+
const TanstackDevtools = ({
|
|
11
|
+
plugins,
|
|
12
|
+
config
|
|
13
|
+
}) => {
|
|
7
14
|
const devToolRef = react.useRef(null);
|
|
8
|
-
const [
|
|
15
|
+
const [pluginContainer, setPluginContainer] = react.useState(
|
|
16
|
+
null
|
|
17
|
+
);
|
|
18
|
+
const [titleContainer, setTitleContainer] = react.useState(null);
|
|
19
|
+
const [PluginComponent, setPluginComponent] = react.useState(
|
|
20
|
+
null
|
|
21
|
+
);
|
|
22
|
+
const [TitleComponent, setTitleComponent] = react.useState(null);
|
|
23
|
+
const [devtools$1] = react.useState(
|
|
24
|
+
() => new devtools.TanStackDevtoolsCore({
|
|
25
|
+
config,
|
|
26
|
+
plugins: plugins?.map((plugin) => {
|
|
27
|
+
return {
|
|
28
|
+
...plugin,
|
|
29
|
+
name: typeof plugin.name === "string" ? plugin.name : (
|
|
30
|
+
// The check above confirms that `plugin.name` is of Render type
|
|
31
|
+
() => {
|
|
32
|
+
setTitleContainer(
|
|
33
|
+
document.getElementById(devtools.PLUGIN_TITLE_CONTAINER_ID) || null
|
|
34
|
+
);
|
|
35
|
+
convertRender(
|
|
36
|
+
plugin.name,
|
|
37
|
+
setTitleComponent
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
render: () => {
|
|
42
|
+
setPluginContainer(
|
|
43
|
+
document.getElementById(devtools.PLUGIN_CONTAINER_ID) || null
|
|
44
|
+
);
|
|
45
|
+
convertRender(plugin.render, setPluginComponent);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
);
|
|
9
51
|
react.useEffect(() => {
|
|
10
52
|
if (devToolRef.current) {
|
|
11
53
|
devtools$1.mount(devToolRef.current);
|
|
@@ -14,7 +56,11 @@ const Devtools = (opts) => {
|
|
|
14
56
|
devtools$1.unmount();
|
|
15
57
|
};
|
|
16
58
|
}, [devtools$1]);
|
|
17
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
59
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
60
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: devToolRef }),
|
|
61
|
+
pluginContainer && PluginComponent ? reactDom.createPortal(/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: PluginComponent }), pluginContainer) : null,
|
|
62
|
+
titleContainer && TitleComponent ? reactDom.createPortal(/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: TitleComponent }), titleContainer) : null
|
|
63
|
+
] });
|
|
18
64
|
};
|
|
19
|
-
exports.
|
|
65
|
+
exports.TanstackDevtools = TanstackDevtools;
|
|
20
66
|
//# sourceMappingURL=devtools.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.cjs","sources":["../../src/devtools.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport {
|
|
1
|
+
{"version":3,"file":"devtools.cjs","sources":["../../src/devtools.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport {\n PLUGIN_CONTAINER_ID,\n PLUGIN_TITLE_CONTAINER_ID,\n TanStackDevtoolsCore,\n} from '@tanstack/devtools'\nimport { createPortal } from 'react-dom'\nimport type { JSX } from 'react'\nimport type {\n TanStackDevtoolsConfig,\n TanStackDevtoolsPlugin,\n} from '@tanstack/devtools'\n\ntype PluginRender = JSX.Element | (() => JSX.Element)\n\nexport type TanStackDevtoolsReactPlugin = Omit<\n TanStackDevtoolsPlugin,\n 'render' | 'name'\n> & {\n render: PluginRender\n name: string | PluginRender\n}\n\nexport interface TanStackDevtoolsReactInit {\n plugins?: Array<TanStackDevtoolsReactPlugin>\n config?: TanStackDevtoolsConfig\n}\n\nconst convertRender = (\n Component: PluginRender,\n setComponent: React.Dispatch<React.SetStateAction<JSX.Element | null>>,\n) => {\n setComponent(typeof Component === 'function' ? Component() : Component)\n}\n\nexport const TanstackDevtools = ({\n plugins,\n config,\n}: TanStackDevtoolsReactInit) => {\n const devToolRef = useRef<HTMLDivElement>(null)\n const [pluginContainer, setPluginContainer] = useState<HTMLElement | null>(\n null,\n )\n const [titleContainer, setTitleContainer] = useState<HTMLElement | null>(null)\n const [PluginComponent, setPluginComponent] = useState<JSX.Element | null>(\n null,\n )\n const [TitleComponent, setTitleComponent] = useState<JSX.Element | null>(null)\n const [devtools] = useState(\n () =>\n new TanStackDevtoolsCore({\n config,\n plugins: plugins?.map((plugin) => {\n return {\n ...plugin,\n name:\n typeof plugin.name === 'string'\n ? plugin.name\n : // The check above confirms that `plugin.name` is of Render type\n () => {\n setTitleContainer(\n document.getElementById(PLUGIN_TITLE_CONTAINER_ID) ||\n null,\n )\n convertRender(\n plugin.name as PluginRender,\n setTitleComponent,\n )\n },\n render: () => {\n setPluginContainer(\n document.getElementById(PLUGIN_CONTAINER_ID) || null,\n )\n convertRender(plugin.render, setPluginComponent)\n },\n }\n }),\n }),\n )\n useEffect(() => {\n if (devToolRef.current) {\n devtools.mount(devToolRef.current)\n }\n\n return () => {\n devtools.unmount()\n }\n }, [devtools])\n\n return (\n <>\n <div ref={devToolRef} />\n {pluginContainer && PluginComponent\n ? createPortal(<>{PluginComponent}</>, pluginContainer)\n : null}\n {titleContainer && TitleComponent\n ? createPortal(<>{TitleComponent}</>, titleContainer)\n : null}\n </>\n )\n}\n"],"names":["useRef","useState","devtools","TanStackDevtoolsCore","PLUGIN_TITLE_CONTAINER_ID","PLUGIN_CONTAINER_ID","useEffect","jsxs","Fragment","jsx","createPortal"],"mappings":";;;;;;AA4BA,MAAM,gBAAgB,CACpB,WACA,iBACG;AACH,eAAa,OAAO,cAAc,aAAa,UAAA,IAAc,SAAS;AACxE;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAAiC;AAC/B,QAAM,aAAaA,MAAAA,OAAuB,IAAI;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,MAAAA;AAAAA,IAC5C;AAAA,EAAA;AAEF,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAA6B,IAAI;AAC7E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA;AAAAA,IAC5C;AAAA,EAAA;AAEF,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAA6B,IAAI;AAC7E,QAAM,CAACC,UAAQ,IAAID,MAAAA;AAAAA,IACjB,MACE,IAAIE,SAAAA,qBAAqB;AAAA,MACvB;AAAA,MACA,SAAS,SAAS,IAAI,CAAC,WAAW;AAChC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MACE,OAAO,OAAO,SAAS,WACnB,OAAO;AAAA;AAAA,YAEP,MAAM;AACJ;AAAA,gBACE,SAAS,eAAeC,SAAAA,yBAAyB,KAC/C;AAAA,cAAA;AAEJ;AAAA,gBACE,OAAO;AAAA,gBACP;AAAA,cAAA;AAAA,YAEJ;AAAA;AAAA,UACN,QAAQ,MAAM;AACZ;AAAA,cACE,SAAS,eAAeC,SAAAA,mBAAmB,KAAK;AAAA,YAAA;AAElD,0BAAc,OAAO,QAAQ,kBAAkB;AAAA,UACjD;AAAA,QAAA;AAAA,MAEJ,CAAC;AAAA,IAAA,CACF;AAAA,EAAA;AAELC,QAAAA,UAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtBJ,iBAAS,MAAM,WAAW,OAAO;AAAA,IACnC;AAEA,WAAO,MAAM;AACXA,iBAAS,QAAA;AAAA,IACX;AAAA,EACF,GAAG,CAACA,UAAQ,CAAC;AAEb,SACEK,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA,IAAC,OAAA,EAAI,KAAK,WAAA,CAAY;AAAA,IACrB,mBAAmB,kBAChBC,4EAAgB,UAAA,gBAAA,CAAgB,GAAK,eAAe,IACpD;AAAA,IACH,kBAAkB,iBACfA,SAAAA,mEAAgB,UAAA,eAAA,CAAe,GAAK,cAAc,IAClD;AAAA,EAAA,GACN;AAEJ;;"}
|
package/dist/cjs/devtools.d.cts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { TanStackDevtoolsConfig, TanStackDevtoolsPlugin } from '@tanstack/devtools';
|
|
3
|
+
type PluginRender = JSX.Element | (() => JSX.Element);
|
|
4
|
+
export type TanStackDevtoolsReactPlugin = Omit<TanStackDevtoolsPlugin, 'render' | 'name'> & {
|
|
5
|
+
render: PluginRender;
|
|
6
|
+
name: string | PluginRender;
|
|
7
|
+
};
|
|
8
|
+
export interface TanStackDevtoolsReactInit {
|
|
9
|
+
plugins?: Array<TanStackDevtoolsReactPlugin>;
|
|
10
|
+
config?: TanStackDevtoolsConfig;
|
|
11
|
+
}
|
|
12
|
+
export declare const TanstackDevtools: ({ plugins, config, }: TanStackDevtoolsReactInit) => JSX.Element;
|
|
13
|
+
export {};
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const devtools$1 = require("@tanstack/devtools");
|
|
4
4
|
const devtools = require("./devtools.cjs");
|
|
5
|
-
exports.
|
|
5
|
+
exports.TanstackDevtools = devtools.TanstackDevtools;
|
|
6
6
|
Object.keys(devtools$1).forEach((k) => {
|
|
7
7
|
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
8
8
|
enumerable: true,
|
package/dist/cjs/index.d.cts
CHANGED
package/dist/esm/devtools.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { TanStackDevtoolsConfig, TanStackDevtoolsPlugin } from '@tanstack/devtools';
|
|
3
|
+
type PluginRender = JSX.Element | (() => JSX.Element);
|
|
4
|
+
export type TanStackDevtoolsReactPlugin = Omit<TanStackDevtoolsPlugin, 'render' | 'name'> & {
|
|
5
|
+
render: PluginRender;
|
|
6
|
+
name: string | PluginRender;
|
|
7
|
+
};
|
|
8
|
+
export interface TanStackDevtoolsReactInit {
|
|
9
|
+
plugins?: Array<TanStackDevtoolsReactPlugin>;
|
|
10
|
+
config?: TanStackDevtoolsConfig;
|
|
11
|
+
}
|
|
12
|
+
export declare const TanstackDevtools: ({ plugins, config, }: TanStackDevtoolsReactInit) => JSX.Element;
|
|
13
|
+
export {};
|
package/dist/esm/devtools.js
CHANGED
|
@@ -1,9 +1,51 @@
|
|
|
1
|
-
import { jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useRef, useState, useEffect } from "react";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { TanStackDevtoolsCore, PLUGIN_CONTAINER_ID, PLUGIN_TITLE_CONTAINER_ID } from "@tanstack/devtools";
|
|
4
|
+
import { createPortal } from "react-dom";
|
|
5
|
+
const convertRender = (Component, setComponent) => {
|
|
6
|
+
setComponent(typeof Component === "function" ? Component() : Component);
|
|
7
|
+
};
|
|
8
|
+
const TanstackDevtools = ({
|
|
9
|
+
plugins,
|
|
10
|
+
config
|
|
11
|
+
}) => {
|
|
5
12
|
const devToolRef = useRef(null);
|
|
6
|
-
const [
|
|
13
|
+
const [pluginContainer, setPluginContainer] = useState(
|
|
14
|
+
null
|
|
15
|
+
);
|
|
16
|
+
const [titleContainer, setTitleContainer] = useState(null);
|
|
17
|
+
const [PluginComponent, setPluginComponent] = useState(
|
|
18
|
+
null
|
|
19
|
+
);
|
|
20
|
+
const [TitleComponent, setTitleComponent] = useState(null);
|
|
21
|
+
const [devtools] = useState(
|
|
22
|
+
() => new TanStackDevtoolsCore({
|
|
23
|
+
config,
|
|
24
|
+
plugins: plugins?.map((plugin) => {
|
|
25
|
+
return {
|
|
26
|
+
...plugin,
|
|
27
|
+
name: typeof plugin.name === "string" ? plugin.name : (
|
|
28
|
+
// The check above confirms that `plugin.name` is of Render type
|
|
29
|
+
() => {
|
|
30
|
+
setTitleContainer(
|
|
31
|
+
document.getElementById(PLUGIN_TITLE_CONTAINER_ID) || null
|
|
32
|
+
);
|
|
33
|
+
convertRender(
|
|
34
|
+
plugin.name,
|
|
35
|
+
setTitleComponent
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
render: () => {
|
|
40
|
+
setPluginContainer(
|
|
41
|
+
document.getElementById(PLUGIN_CONTAINER_ID) || null
|
|
42
|
+
);
|
|
43
|
+
convertRender(plugin.render, setPluginComponent);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
);
|
|
7
49
|
useEffect(() => {
|
|
8
50
|
if (devToolRef.current) {
|
|
9
51
|
devtools.mount(devToolRef.current);
|
|
@@ -12,9 +54,13 @@ const Devtools = (opts) => {
|
|
|
12
54
|
devtools.unmount();
|
|
13
55
|
};
|
|
14
56
|
}, [devtools]);
|
|
15
|
-
return /* @__PURE__ */
|
|
57
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
58
|
+
/* @__PURE__ */ jsx("div", { ref: devToolRef }),
|
|
59
|
+
pluginContainer && PluginComponent ? createPortal(/* @__PURE__ */ jsx(Fragment, { children: PluginComponent }), pluginContainer) : null,
|
|
60
|
+
titleContainer && TitleComponent ? createPortal(/* @__PURE__ */ jsx(Fragment, { children: TitleComponent }), titleContainer) : null
|
|
61
|
+
] });
|
|
16
62
|
};
|
|
17
63
|
export {
|
|
18
|
-
|
|
64
|
+
TanstackDevtools
|
|
19
65
|
};
|
|
20
66
|
//# sourceMappingURL=devtools.js.map
|
package/dist/esm/devtools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.js","sources":["../../src/devtools.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport {
|
|
1
|
+
{"version":3,"file":"devtools.js","sources":["../../src/devtools.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\nimport {\n PLUGIN_CONTAINER_ID,\n PLUGIN_TITLE_CONTAINER_ID,\n TanStackDevtoolsCore,\n} from '@tanstack/devtools'\nimport { createPortal } from 'react-dom'\nimport type { JSX } from 'react'\nimport type {\n TanStackDevtoolsConfig,\n TanStackDevtoolsPlugin,\n} from '@tanstack/devtools'\n\ntype PluginRender = JSX.Element | (() => JSX.Element)\n\nexport type TanStackDevtoolsReactPlugin = Omit<\n TanStackDevtoolsPlugin,\n 'render' | 'name'\n> & {\n render: PluginRender\n name: string | PluginRender\n}\n\nexport interface TanStackDevtoolsReactInit {\n plugins?: Array<TanStackDevtoolsReactPlugin>\n config?: TanStackDevtoolsConfig\n}\n\nconst convertRender = (\n Component: PluginRender,\n setComponent: React.Dispatch<React.SetStateAction<JSX.Element | null>>,\n) => {\n setComponent(typeof Component === 'function' ? Component() : Component)\n}\n\nexport const TanstackDevtools = ({\n plugins,\n config,\n}: TanStackDevtoolsReactInit) => {\n const devToolRef = useRef<HTMLDivElement>(null)\n const [pluginContainer, setPluginContainer] = useState<HTMLElement | null>(\n null,\n )\n const [titleContainer, setTitleContainer] = useState<HTMLElement | null>(null)\n const [PluginComponent, setPluginComponent] = useState<JSX.Element | null>(\n null,\n )\n const [TitleComponent, setTitleComponent] = useState<JSX.Element | null>(null)\n const [devtools] = useState(\n () =>\n new TanStackDevtoolsCore({\n config,\n plugins: plugins?.map((plugin) => {\n return {\n ...plugin,\n name:\n typeof plugin.name === 'string'\n ? plugin.name\n : // The check above confirms that `plugin.name` is of Render type\n () => {\n setTitleContainer(\n document.getElementById(PLUGIN_TITLE_CONTAINER_ID) ||\n null,\n )\n convertRender(\n plugin.name as PluginRender,\n setTitleComponent,\n )\n },\n render: () => {\n setPluginContainer(\n document.getElementById(PLUGIN_CONTAINER_ID) || null,\n )\n convertRender(plugin.render, setPluginComponent)\n },\n }\n }),\n }),\n )\n useEffect(() => {\n if (devToolRef.current) {\n devtools.mount(devToolRef.current)\n }\n\n return () => {\n devtools.unmount()\n }\n }, [devtools])\n\n return (\n <>\n <div ref={devToolRef} />\n {pluginContainer && PluginComponent\n ? createPortal(<>{PluginComponent}</>, pluginContainer)\n : null}\n {titleContainer && TitleComponent\n ? createPortal(<>{TitleComponent}</>, titleContainer)\n : null}\n </>\n )\n}\n"],"names":[],"mappings":";;;;AA4BA,MAAM,gBAAgB,CACpB,WACA,iBACG;AACH,eAAa,OAAO,cAAc,aAAa,UAAA,IAAc,SAAS;AACxE;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAAiC;AAC/B,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI;AAAA,IAC5C;AAAA,EAAA;AAEF,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA6B,IAAI;AAC7E,QAAM,CAAC,iBAAiB,kBAAkB,IAAI;AAAA,IAC5C;AAAA,EAAA;AAEF,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA6B,IAAI;AAC7E,QAAM,CAAC,QAAQ,IAAI;AAAA,IACjB,MACE,IAAI,qBAAqB;AAAA,MACvB;AAAA,MACA,SAAS,SAAS,IAAI,CAAC,WAAW;AAChC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MACE,OAAO,OAAO,SAAS,WACnB,OAAO;AAAA;AAAA,YAEP,MAAM;AACJ;AAAA,gBACE,SAAS,eAAe,yBAAyB,KAC/C;AAAA,cAAA;AAEJ;AAAA,gBACE,OAAO;AAAA,gBACP;AAAA,cAAA;AAAA,YAEJ;AAAA;AAAA,UACN,QAAQ,MAAM;AACZ;AAAA,cACE,SAAS,eAAe,mBAAmB,KAAK;AAAA,YAAA;AAElD,0BAAc,OAAO,QAAQ,kBAAkB;AAAA,UACjD;AAAA,QAAA;AAAA,MAEJ,CAAC;AAAA,IAAA,CACF;AAAA,EAAA;AAEL,YAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,eAAS,MAAM,WAAW,OAAO;AAAA,IACnC;AAEA,WAAO,MAAM;AACX,eAAS,QAAA;AAAA,IACX;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,KAAK,WAAA,CAAY;AAAA,IACrB,mBAAmB,kBAChB,6CAAgB,UAAA,gBAAA,CAAgB,GAAK,eAAe,IACpD;AAAA,IACH,kBAAkB,iBACf,6CAAgB,UAAA,eAAA,CAAe,GAAK,cAAc,IAClD;AAAA,EAAA,GACN;AAEJ;"}
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-devtools",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.0",
|
|
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",
|
|
7
7
|
"repository": {
|
|
@@ -16,12 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"keywords": [
|
|
18
18
|
"react",
|
|
19
|
-
"devtools"
|
|
20
|
-
"autocomplete",
|
|
21
|
-
"dropdown",
|
|
22
|
-
"menu",
|
|
23
|
-
"headless-ui",
|
|
24
|
-
"nested"
|
|
19
|
+
"devtools"
|
|
25
20
|
],
|
|
26
21
|
"type": "module",
|
|
27
22
|
"types": "dist/esm/index.d.ts",
|
|
@@ -49,7 +44,7 @@
|
|
|
49
44
|
"src"
|
|
50
45
|
],
|
|
51
46
|
"dependencies": {
|
|
52
|
-
"@tanstack/devtools": "0.
|
|
47
|
+
"@tanstack/devtools": "0.1.0"
|
|
53
48
|
},
|
|
54
49
|
"devDependencies": {
|
|
55
50
|
"@eslint-react/eslint-plugin": "^1.48.5",
|
package/src/devtools.tsx
CHANGED
|
@@ -1,10 +1,82 @@
|
|
|
1
1
|
import React, { useEffect, useRef, useState } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
PLUGIN_CONTAINER_ID,
|
|
4
|
+
PLUGIN_TITLE_CONTAINER_ID,
|
|
5
|
+
TanStackDevtoolsCore,
|
|
6
|
+
} from '@tanstack/devtools'
|
|
7
|
+
import { createPortal } from 'react-dom'
|
|
8
|
+
import type { JSX } from 'react'
|
|
9
|
+
import type {
|
|
10
|
+
TanStackDevtoolsConfig,
|
|
11
|
+
TanStackDevtoolsPlugin,
|
|
12
|
+
} from '@tanstack/devtools'
|
|
4
13
|
|
|
5
|
-
|
|
14
|
+
type PluginRender = JSX.Element | (() => JSX.Element)
|
|
15
|
+
|
|
16
|
+
export type TanStackDevtoolsReactPlugin = Omit<
|
|
17
|
+
TanStackDevtoolsPlugin,
|
|
18
|
+
'render' | 'name'
|
|
19
|
+
> & {
|
|
20
|
+
render: PluginRender
|
|
21
|
+
name: string | PluginRender
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface TanStackDevtoolsReactInit {
|
|
25
|
+
plugins?: Array<TanStackDevtoolsReactPlugin>
|
|
26
|
+
config?: TanStackDevtoolsConfig
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const convertRender = (
|
|
30
|
+
Component: PluginRender,
|
|
31
|
+
setComponent: React.Dispatch<React.SetStateAction<JSX.Element | null>>,
|
|
32
|
+
) => {
|
|
33
|
+
setComponent(typeof Component === 'function' ? Component() : Component)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const TanstackDevtools = ({
|
|
37
|
+
plugins,
|
|
38
|
+
config,
|
|
39
|
+
}: TanStackDevtoolsReactInit) => {
|
|
6
40
|
const devToolRef = useRef<HTMLDivElement>(null)
|
|
7
|
-
const [
|
|
41
|
+
const [pluginContainer, setPluginContainer] = useState<HTMLElement | null>(
|
|
42
|
+
null,
|
|
43
|
+
)
|
|
44
|
+
const [titleContainer, setTitleContainer] = useState<HTMLElement | null>(null)
|
|
45
|
+
const [PluginComponent, setPluginComponent] = useState<JSX.Element | null>(
|
|
46
|
+
null,
|
|
47
|
+
)
|
|
48
|
+
const [TitleComponent, setTitleComponent] = useState<JSX.Element | null>(null)
|
|
49
|
+
const [devtools] = useState(
|
|
50
|
+
() =>
|
|
51
|
+
new TanStackDevtoolsCore({
|
|
52
|
+
config,
|
|
53
|
+
plugins: plugins?.map((plugin) => {
|
|
54
|
+
return {
|
|
55
|
+
...plugin,
|
|
56
|
+
name:
|
|
57
|
+
typeof plugin.name === 'string'
|
|
58
|
+
? plugin.name
|
|
59
|
+
: // The check above confirms that `plugin.name` is of Render type
|
|
60
|
+
() => {
|
|
61
|
+
setTitleContainer(
|
|
62
|
+
document.getElementById(PLUGIN_TITLE_CONTAINER_ID) ||
|
|
63
|
+
null,
|
|
64
|
+
)
|
|
65
|
+
convertRender(
|
|
66
|
+
plugin.name as PluginRender,
|
|
67
|
+
setTitleComponent,
|
|
68
|
+
)
|
|
69
|
+
},
|
|
70
|
+
render: () => {
|
|
71
|
+
setPluginContainer(
|
|
72
|
+
document.getElementById(PLUGIN_CONTAINER_ID) || null,
|
|
73
|
+
)
|
|
74
|
+
convertRender(plugin.render, setPluginComponent)
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
}),
|
|
78
|
+
}),
|
|
79
|
+
)
|
|
8
80
|
useEffect(() => {
|
|
9
81
|
if (devToolRef.current) {
|
|
10
82
|
devtools.mount(devToolRef.current)
|
|
@@ -15,5 +87,15 @@ export const Devtools = (opts: DevtoolsOptions) => {
|
|
|
15
87
|
}
|
|
16
88
|
}, [devtools])
|
|
17
89
|
|
|
18
|
-
return
|
|
90
|
+
return (
|
|
91
|
+
<>
|
|
92
|
+
<div ref={devToolRef} />
|
|
93
|
+
{pluginContainer && PluginComponent
|
|
94
|
+
? createPortal(<>{PluginComponent}</>, pluginContainer)
|
|
95
|
+
: null}
|
|
96
|
+
{titleContainer && TitleComponent
|
|
97
|
+
? createPortal(<>{TitleComponent}</>, titleContainer)
|
|
98
|
+
: null}
|
|
99
|
+
</>
|
|
100
|
+
)
|
|
19
101
|
}
|
package/src/index.ts
CHANGED