msw-dev-tool 1.0.21 → 1.0.23
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/cjs/hook/useFlattenHandlersTable.js +16 -5
- package/dist/cjs/hook/useFlattenHandlersTable.js.map +1 -1
- package/dist/cjs/ui/Table/PreviewHandler/PathParamSetter.js +22 -0
- package/dist/cjs/ui/Table/PreviewHandler/PathParamSetter.js.map +1 -0
- package/dist/cjs/ui/Table/PreviewHandler/RequestPreview.js +62 -0
- package/dist/cjs/ui/Table/PreviewHandler/RequestPreview.js.map +1 -0
- package/dist/cjs/ui/Table/PreviewHandler/index.js +52 -0
- package/dist/cjs/ui/Table/PreviewHandler/index.js.map +1 -0
- package/dist/cjs/utils/url.js +29 -0
- package/dist/cjs/utils/url.js.map +1 -0
- package/dist/esm/hook/useFlattenHandlersTable.js +12 -1
- package/dist/esm/hook/useFlattenHandlersTable.js.map +1 -1
- package/dist/esm/ui/Table/PreviewHandler/PathParamSetter.js +20 -0
- package/dist/esm/ui/Table/PreviewHandler/PathParamSetter.js.map +1 -0
- package/dist/esm/ui/Table/PreviewHandler/RequestPreview.js +60 -0
- package/dist/esm/ui/Table/PreviewHandler/RequestPreview.js.map +1 -0
- package/dist/esm/ui/Table/PreviewHandler/index.js +50 -0
- package/dist/esm/ui/Table/PreviewHandler/index.js.map +1 -0
- package/dist/esm/utils/url.js +26 -0
- package/dist/esm/utils/url.js.map +1 -0
- package/package.json +2 -1
@@ -1,13 +1,14 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
|
-
var index = require('../node_modules/@tanstack/react-table/build/lib/index.js');
|
3
|
+
var index$1 = require('../node_modules/@tanstack/react-table/build/lib/index.js');
|
4
4
|
var handlerStore = require('../lib/handlerStore.js');
|
5
5
|
var React = require('react');
|
6
|
-
var index
|
6
|
+
var index = require('../ui/Table/PreviewHandler/index.js');
|
7
|
+
var index$2 = require('../node_modules/@tanstack/table-core/build/lib/index.js');
|
7
8
|
|
8
9
|
const useFlattenHandlersTable = () => {
|
9
10
|
const { flattenHandlers, handlerRowSelection, handleHandlerRowSelectionChange, } = handlerStore.useHandlerStore();
|
10
|
-
const columnHelper = index$
|
11
|
+
const columnHelper = index$2.createColumnHelper();
|
11
12
|
const columns = React.useMemo(() => {
|
12
13
|
return [
|
13
14
|
columnHelper.accessor("enabled", {
|
@@ -21,12 +22,22 @@ const useFlattenHandlersTable = () => {
|
|
21
22
|
header: "Method",
|
22
23
|
cell: ({ row }) => (React.createElement("div", { className: "msw-dev-tool-center" }, row.original.method)),
|
23
24
|
}),
|
25
|
+
columnHelper.accessor("handler", {
|
26
|
+
header: "Preview",
|
27
|
+
cell: ({ row }) => {
|
28
|
+
const handler = row.original.handler;
|
29
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
30
|
+
return (React.createElement(React.Fragment, null,
|
31
|
+
React.createElement("button", { onClick: () => setIsOpen(true) }, "Preview"),
|
32
|
+
isOpen && (React.createElement(index.PreviewHandler, { handler: handler, onClose: () => setIsOpen(false) }))));
|
33
|
+
},
|
34
|
+
}),
|
24
35
|
];
|
25
36
|
}, []);
|
26
|
-
const table = index.useReactTable({
|
37
|
+
const table = index$1.useReactTable({
|
27
38
|
columns,
|
28
39
|
data: flattenHandlers,
|
29
|
-
getCoreRowModel: index$
|
40
|
+
getCoreRowModel: index$2.getCoreRowModel(),
|
30
41
|
state: {
|
31
42
|
rowSelection: handlerRowSelection,
|
32
43
|
},
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useFlattenHandlersTable.js","sources":["../../../src/hook/useFlattenHandlersTable.tsx"],"sourcesContent":["import {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useHandlerStore } from \"../lib/handlerStore\";\nimport { FlattenHandler } from \"../lib\";\nimport React, { useMemo } from \"react\";\n\nexport const useFlattenHandlersTable = () => {\n const {\n flattenHandlers,\n handlerRowSelection,\n handleHandlerRowSelectionChange,\n } = useHandlerStore();\n\n const columnHelper = createColumnHelper<FlattenHandler>();\n const columns: ColumnDef<FlattenHandler, any>[] = useMemo(() => {\n return [\n columnHelper.accessor(\"enabled\", {\n header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={(e) => table.toggleAllRowsSelected(e.target.checked)}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={(e) => row.toggleSelected(e.target.checked)}\n />\n ),\n }),\n columnHelper.accessor(\"path\", {\n header: \"End point\",\n }),\n columnHelper.accessor(\"method\", {\n header: \"Method\",\n cell: ({ row }) => (\n <div className=\"msw-dev-tool-center\">{row.original.method}</div>\n ),\n }),\n ];\n }, []);\n\n const table = useReactTable({\n columns,\n data: flattenHandlers,\n getCoreRowModel: getCoreRowModel(),\n state: {\n rowSelection: handlerRowSelection,\n },\n onRowSelectionChange: handleHandlerRowSelectionChange,\n getRowId: (row) => row.id,\n enableRowSelection: true,\n });\n\n return table;\n};\n"],"names":["useHandlerStore","createColumnHelper","useMemo","useReactTable","getCoreRowModel"],"mappings":"
|
1
|
+
{"version":3,"file":"useFlattenHandlersTable.js","sources":["../../../src/hook/useFlattenHandlersTable.tsx"],"sourcesContent":["import {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useHandlerStore } from \"../lib/handlerStore\";\nimport { FlattenHandler } from \"../lib\";\nimport React, { useMemo, useState } from \"react\";\nimport { PreviewHandler } from \"../ui/Table/PreviewHandler\";\n\nexport const useFlattenHandlersTable = () => {\n const {\n flattenHandlers,\n handlerRowSelection,\n handleHandlerRowSelectionChange,\n } = useHandlerStore();\n\n const columnHelper = createColumnHelper<FlattenHandler>();\n const columns: ColumnDef<FlattenHandler, any>[] = useMemo(() => {\n return [\n columnHelper.accessor(\"enabled\", {\n header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={(e) => table.toggleAllRowsSelected(e.target.checked)}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={(e) => row.toggleSelected(e.target.checked)}\n />\n ),\n }),\n columnHelper.accessor(\"path\", {\n header: \"End point\",\n }),\n columnHelper.accessor(\"method\", {\n header: \"Method\",\n cell: ({ row }) => (\n <div className=\"msw-dev-tool-center\">{row.original.method}</div>\n ),\n }),\n columnHelper.accessor(\"handler\", {\n header: \"Preview\",\n cell: ({ row }) => {\n const handler = row.original.handler;\n const [isOpen, setIsOpen] = useState(false);\n return (\n <>\n <button onClick={() => setIsOpen(true)}>Preview</button>\n {isOpen && (\n <PreviewHandler\n handler={handler}\n onClose={() => setIsOpen(false)}\n />\n )}\n </>\n );\n },\n }),\n ];\n }, []);\n\n const table = useReactTable({\n columns,\n data: flattenHandlers,\n getCoreRowModel: getCoreRowModel(),\n state: {\n rowSelection: handlerRowSelection,\n },\n onRowSelectionChange: handleHandlerRowSelectionChange,\n getRowId: (row) => row.id,\n enableRowSelection: true,\n });\n\n return table;\n};\n"],"names":["useHandlerStore","createColumnHelper","useMemo","useState","PreviewHandler","useReactTable","getCoreRowModel"],"mappings":";;;;;;;;AAWO,MAAM,uBAAuB,GAAG,MAAK;IAC1C,MAAM,EACJ,eAAe,EACf,mBAAmB,EACnB,+BAA+B,GAChC,GAAGA,4BAAe,EAAE,CAAC;AAEtB,IAAA,MAAM,YAAY,GAAGC,0BAAkB,EAAkB,CAAC;AAC1D,IAAA,MAAM,OAAO,GAAqCC,aAAO,CAAC,MAAK;QAC7D,OAAO;AACL,YAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE;AAC/B,gBAAA,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAChB,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,KAAK,CAAC,oBAAoB,EAAE,EACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC9D,CACH;AACD,gBAAA,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MACZ,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,EAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GACrD,CACH;aACF,CAAC;AACF,YAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC5B,gBAAA,MAAM,EAAE,WAAW;aACpB,CAAC;AACF,YAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE;AAC9B,gBAAA,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MACZ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,IAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAO,CACjE;aACF,CAAC;AACF,YAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE;AAC/B,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAI;AAChB,oBAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACrC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC,CAAC;AAC5C,oBAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;wBACE,KAAQ,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC,EAAkB,EAAA,SAAA,CAAA;wBACvD,MAAM,KACL,KAAC,CAAA,aAAA,CAAAC,oBAAc,IACb,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,EAC/B,CAAA,CACH,CACA,EACH;iBACH;aACF,CAAC;SACH,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAGC,qBAAa,CAAC;QAC1B,OAAO;AACP,QAAA,IAAI,EAAE,eAAe;QACrB,eAAe,EAAEC,uBAAe,EAAE;AAClC,QAAA,KAAK,EAAE;AACL,YAAA,YAAY,EAAE,mBAAmB;AAClC,SAAA;AACD,QAAA,oBAAoB,EAAE,+BAA+B;QACrD,QAAQ,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE;AACzB,QAAA,kBAAkB,EAAE,IAAI;AACzB,KAAA,CAAC,CAAC;AAEH,IAAA,OAAO,KAAK,CAAC;AACf;;;;"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var React = require('react');
|
4
|
+
|
5
|
+
const PathParamSetter = ({ paramValues, onParamChange, }) => {
|
6
|
+
return (paramValues &&
|
7
|
+
Object.keys(paramValues).length > 0 && (React.createElement(React.Fragment, null,
|
8
|
+
React.createElement("h3", null, "Path Parameters"),
|
9
|
+
React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "8px" } }, Object.entries(paramValues).map(([key, value]) => (React.createElement("div", { key: key, style: { display: "flex", alignItems: "center", gap: "8px" } },
|
10
|
+
React.createElement("label", { htmlFor: `param-${key}`, style: { minWidth: "100px" } },
|
11
|
+
key,
|
12
|
+
":"),
|
13
|
+
React.createElement("input", { id: `param-${key}`, type: "text", value: value, onChange: (e) => onParamChange(key, e.target.value), style: {
|
14
|
+
padding: "4px 8px",
|
15
|
+
borderRadius: "4px",
|
16
|
+
border: "1px solid #ccc",
|
17
|
+
width: "100%",
|
18
|
+
} }))))))));
|
19
|
+
};
|
20
|
+
|
21
|
+
exports.PathParamSetter = PathParamSetter;
|
22
|
+
//# sourceMappingURL=PathParamSetter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"PathParamSetter.js","sources":["../../../../../src/ui/Table/PreviewHandler/PathParamSetter.tsx"],"sourcesContent":["import { PathParams } from \"msw\";\nimport React from \"react\";\n\nexport const PathParamSetter = ({\n paramValues,\n onParamChange,\n}: {\n paramValues?: PathParams<string>;\n onParamChange: (key: string, value: string) => void;\n}) => {\n return (\n paramValues &&\n Object.keys(paramValues).length > 0 && (\n <>\n <h3>Path Parameters</h3>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\n {Object.entries(paramValues).map(([key, value]) => (\n <div\n key={key}\n style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}\n >\n <label htmlFor={`param-${key}`} style={{ minWidth: \"100px\" }}>\n {key}:\n </label>\n <input\n id={`param-${key}`}\n type=\"text\"\n value={value}\n onChange={(e) => onParamChange(key, e.target.value)}\n style={{\n padding: \"4px 8px\",\n borderRadius: \"4px\",\n border: \"1px solid #ccc\",\n width: \"100%\",\n }}\n />\n </div>\n ))}\n </div>\n </>\n )\n );\n};\n"],"names":[],"mappings":";;;;AAGa,MAAA,eAAe,GAAG,CAAC,EAC9B,WAAW,EACX,aAAa,GAId,KAAI;AACH,IAAA,QACE,WAAW;QACX,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,KACjC,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;QACE,KAAwB,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,CAAA;QACxB,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EACjE,EAAA,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAC5C,KACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAA;AAE5D,YAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,CAAS,MAAA,EAAA,GAAG,CAAE,CAAA,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAA;gBACzD,GAAG;AACE,gBAAA,GAAA,CAAA;AACR,YAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,CAAS,MAAA,EAAA,GAAG,EAAE,EAClB,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACnD,KAAK,EAAE;AACL,oBAAA,OAAO,EAAE,SAAS;AAClB,oBAAA,YAAY,EAAE,KAAK;AACnB,oBAAA,MAAM,EAAE,gBAAgB;AACxB,oBAAA,KAAK,EAAE,MAAM;AACd,iBAAA,EAAA,CACD,CACE,CACP,CAAC,CACE,CACL,CACJ,EACD;AACJ;;;;"}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var React = require('react');
|
4
|
+
var url = require('../../../utils/url.js');
|
5
|
+
|
6
|
+
const RequestPreview = ({ url: url$1, paramValues, }) => {
|
7
|
+
const [loading, setLoading] = React.useState(false);
|
8
|
+
const [error, setError] = React.useState(null);
|
9
|
+
const [response, setResponse] = React.useState(null);
|
10
|
+
const finalPath = url.getPathWithParams(url$1, paramValues);
|
11
|
+
const totalUrl = url.getTotalUrl(url$1.origin, finalPath);
|
12
|
+
const handleFetch = () => {
|
13
|
+
setLoading(true);
|
14
|
+
setError(null);
|
15
|
+
fetch(totalUrl)
|
16
|
+
.then((res) => res.json())
|
17
|
+
.then((data) => {
|
18
|
+
setResponse(data);
|
19
|
+
setLoading(false);
|
20
|
+
})
|
21
|
+
.catch((err) => {
|
22
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch"));
|
23
|
+
setLoading(false);
|
24
|
+
});
|
25
|
+
};
|
26
|
+
return (React.createElement("div", { style: { marginTop: "20px" } },
|
27
|
+
React.createElement("h3", null, "Response"),
|
28
|
+
React.createElement("div", { style: {
|
29
|
+
fontFamily: "monospace",
|
30
|
+
wordBreak: "break-all",
|
31
|
+
} },
|
32
|
+
React.createElement("button", { onClick: handleFetch, disabled: loading, style: {
|
33
|
+
padding: "4px 12px",
|
34
|
+
borderRadius: "4px",
|
35
|
+
border: "1px solid #ccc",
|
36
|
+
backgroundColor: loading ? "#f5f5f5" : "white",
|
37
|
+
cursor: loading ? "not-allowed" : "pointer",
|
38
|
+
} }, loading ? "Fetching..." : "Send Request"),
|
39
|
+
error && (React.createElement("div", { style: {
|
40
|
+
marginTop: "8px",
|
41
|
+
color: "#f44336",
|
42
|
+
backgroundColor: "#f5f5f5",
|
43
|
+
} },
|
44
|
+
"Error: ",
|
45
|
+
error.message)),
|
46
|
+
response && (React.createElement("div", { style: {
|
47
|
+
marginTop: "8px",
|
48
|
+
maxHeight: "200px",
|
49
|
+
overflow: "scroll",
|
50
|
+
backgroundColor: "#f5f5f5",
|
51
|
+
} },
|
52
|
+
React.createElement("pre", { style: {
|
53
|
+
margin: 0,
|
54
|
+
overflow: "auto",
|
55
|
+
borderRadius: "4px",
|
56
|
+
fontFamily: "monospace",
|
57
|
+
wordBreak: "break-all",
|
58
|
+
} }, JSON.stringify(response, null, 2)))))));
|
59
|
+
};
|
60
|
+
|
61
|
+
exports.RequestPreview = RequestPreview;
|
62
|
+
//# sourceMappingURL=RequestPreview.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"RequestPreview.js","sources":["../../../../../src/ui/Table/PreviewHandler/RequestPreview.tsx"],"sourcesContent":["import { PathParams } from \"msw\";\nimport React, { useState } from \"react\";\nimport { getPathWithParams, getTotalUrl } from \"../../../utils/url\";\n\nexport const RequestPreview = ({\n url,\n paramValues,\n}: {\n url: URL;\n paramValues?: PathParams<string>;\n}) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [response, setResponse] = useState<any>(null);\n\n const finalPath = getPathWithParams(url, paramValues);\n const totalUrl = getTotalUrl(url.origin, finalPath);\n\n const handleFetch = () => {\n setLoading(true);\n setError(null);\n\n fetch(totalUrl)\n .then((res) => res.json())\n .then((data) => {\n setResponse(data);\n setLoading(false);\n })\n .catch((err) => {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch\"));\n setLoading(false);\n });\n };\n\n return (\n <div style={{ marginTop: \"20px\" }}>\n <h3>Response</h3>\n <div\n style={{\n fontFamily: \"monospace\",\n wordBreak: \"break-all\",\n }}\n >\n <button\n onClick={handleFetch}\n disabled={loading}\n style={{\n padding: \"4px 12px\",\n borderRadius: \"4px\",\n border: \"1px solid #ccc\",\n backgroundColor: loading ? \"#f5f5f5\" : \"white\",\n cursor: loading ? \"not-allowed\" : \"pointer\",\n }}\n >\n {loading ? \"Fetching...\" : \"Send Request\"}\n </button>\n\n {error && (\n <div\n style={{\n marginTop: \"8px\",\n color: \"#f44336\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n Error: {error.message}\n </div>\n )}\n\n {response && (\n <div\n style={{\n marginTop: \"8px\",\n maxHeight: \"200px\",\n overflow: \"scroll\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <pre\n style={{\n margin: 0,\n overflow: \"auto\",\n borderRadius: \"4px\",\n fontFamily: \"monospace\",\n wordBreak: \"break-all\",\n }}\n >\n {JSON.stringify(response, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["url","useState","getPathWithParams","getTotalUrl"],"mappings":"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"}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var React = require('react');
|
4
|
+
var reactDom = require('react-dom');
|
5
|
+
var msw = require('msw');
|
6
|
+
var PathParamSetter = require('./PathParamSetter.js');
|
7
|
+
var RequestPreview = require('./RequestPreview.js');
|
8
|
+
|
9
|
+
const PreviewHandler = ({ handler, onClose }) => {
|
10
|
+
const path = handler.info.path;
|
11
|
+
const url = new URL(String(path), location.href);
|
12
|
+
const { params } = msw.matchRequestUrl(url, path, url.origin);
|
13
|
+
const [paramValues, setParamValues] = React.useState(params
|
14
|
+
? Object.keys(params).reduce((acc, key) => ({
|
15
|
+
...acc,
|
16
|
+
[key]: "",
|
17
|
+
}), {})
|
18
|
+
: undefined);
|
19
|
+
const handleParamChange = (key, value) => {
|
20
|
+
setParamValues((prev) => ({
|
21
|
+
...prev,
|
22
|
+
[key]: value,
|
23
|
+
}));
|
24
|
+
};
|
25
|
+
return reactDom.createPortal(React.createElement("div", { style: {
|
26
|
+
padding: "20px",
|
27
|
+
position: "fixed",
|
28
|
+
zIndex: 9999,
|
29
|
+
backgroundColor: "white",
|
30
|
+
boxShadow: "0 2px 10px rgba(0, 0, 0, 0.1)",
|
31
|
+
borderRadius: "8px",
|
32
|
+
width: "320px",
|
33
|
+
} },
|
34
|
+
React.createElement("div", { style: { position: "relative" } },
|
35
|
+
React.createElement("button", { onClick: onClose, style: {
|
36
|
+
position: "absolute",
|
37
|
+
right: 0,
|
38
|
+
top: 0,
|
39
|
+
background: "none",
|
40
|
+
border: "none",
|
41
|
+
cursor: "pointer",
|
42
|
+
fontSize: "1.2rem",
|
43
|
+
padding: "4px",
|
44
|
+
} }, "\u2715"),
|
45
|
+
React.createElement("h2", { style: { marginBottom: "20px", paddingRight: "24px" } }, "Handler Preview"),
|
46
|
+
React.createElement("p", { style: { fontSize: "0.8rem", color: "#666", overflow: "scroll" } }, url.toString()),
|
47
|
+
React.createElement(PathParamSetter.PathParamSetter, { paramValues: paramValues, onParamChange: handleParamChange }),
|
48
|
+
React.createElement(RequestPreview.RequestPreview, { url: url, paramValues: paramValues }))), document.body);
|
49
|
+
};
|
50
|
+
|
51
|
+
exports.PreviewHandler = PreviewHandler;
|
52
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/ui/Table/PreviewHandler/index.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { HttpHandler, matchRequestUrl, PathParams } from \"msw\";\nimport { PathParamSetter } from \"./PathParamSetter\";\nimport { RequestPreview } from \"./RequestPreview\";\n\ninterface PreviewHandlerProps {\n handler: HttpHandler;\n onClose: () => void;\n}\n\nexport const PreviewHandler = ({ handler, onClose }: PreviewHandlerProps) => {\n const path = handler.info.path;\n const url = new URL(String(path), location.href);\n const { params } = matchRequestUrl(url, path, url.origin);\n\n const [paramValues, setParamValues] = useState<\n PathParams<string> | undefined\n >(\n params\n ? Object.keys(params).reduce(\n (acc, key) => ({\n ...acc,\n [key]: \"\",\n }),\n {}\n )\n : undefined\n );\n\n const handleParamChange = (key: string, value: string) => {\n setParamValues((prev) => ({\n ...prev,\n [key]: value,\n }));\n };\n\n return createPortal(\n <div\n style={{\n padding: \"20px\",\n position: \"fixed\",\n zIndex: 9999,\n backgroundColor: \"white\",\n boxShadow: \"0 2px 10px rgba(0, 0, 0, 0.1)\",\n borderRadius: \"8px\",\n width: \"320px\",\n }}\n >\n <div style={{ position: \"relative\" }}>\n <button\n onClick={onClose}\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"1.2rem\",\n padding: \"4px\",\n }}\n >\n ✕\n </button>\n\n <h2 style={{ marginBottom: \"20px\", paddingRight: \"24px\" }}>\n Handler Preview\n </h2>\n <p style={{ fontSize: \"0.8rem\", color: \"#666\", overflow: \"scroll\" }}>\n {url.toString()}\n </p>\n <PathParamSetter\n paramValues={paramValues}\n onParamChange={handleParamChange}\n />\n <RequestPreview url={url} paramValues={paramValues} />\n </div>\n </div>,\n document.body\n );\n};\n"],"names":["matchRequestUrl","useState","createPortal","PathParamSetter","RequestPreview"],"mappings":";;;;;;;;AAWa,MAAA,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAuB,KAAI;AAC1E,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjD,IAAA,MAAM,EAAE,MAAM,EAAE,GAAGA,mBAAe,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE1D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGC,cAAQ,CAG5C,MAAM;AACJ,UAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,GAAG,MAAM;AACb,YAAA,GAAG,GAAG;YACN,CAAC,GAAG,GAAG,EAAE;SACV,CAAC,EACF,EAAE,CACH;UACD,SAAS,CACd,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,KAAa,KAAI;AACvD,QAAA,cAAc,CAAC,CAAC,IAAI,MAAM;AACxB,YAAA,GAAG,IAAI;YACP,CAAC,GAAG,GAAG,KAAK;AACb,SAAA,CAAC,CAAC,CAAC;AACN,KAAC,CAAC;AAEF,IAAA,OAAOC,qBAAY,CACjB,KACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,SAAS,EAAE,+BAA+B;AAC1C,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,KAAK,EAAE,OAAO;AACf,SAAA,EAAA;AAED,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAA;AAClC,YAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,KAAK,EAAE,CAAC;AACR,oBAAA,GAAG,EAAE,CAAC;AACN,oBAAA,UAAU,EAAE,MAAM;AAClB,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,OAAO,EAAE,KAAK;iBACf,EAGM,EAAA,QAAA,CAAA;YAET,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAEpD,EAAA,iBAAA,CAAA;YACL,KAAG,CAAA,aAAA,CAAA,GAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAA,EAChE,GAAG,CAAC,QAAQ,EAAE,CACb;YACJ,KAAC,CAAA,aAAA,CAAAC,+BAAe,IACd,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,iBAAiB,EAChC,CAAA;AACF,YAAA,KAAA,CAAA,aAAA,CAACC,6BAAc,EAAC,EAAA,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAA,CAAI,CAClD,CACF,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ;;;;"}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Replace path parameters with path object and formatted path
|
5
|
+
*/
|
6
|
+
const getPathWithParams = (url, paramValues) => {
|
7
|
+
if (!paramValues)
|
8
|
+
return url.pathname;
|
9
|
+
return url.pathname
|
10
|
+
.split("/")
|
11
|
+
.map((segment) => {
|
12
|
+
if (segment.startsWith(":")) {
|
13
|
+
const paramName = segment.slice(1); // remove ':'
|
14
|
+
return paramValues[paramName] || "undefined"; // replace with param value if exists, otherwise "undefined"
|
15
|
+
}
|
16
|
+
return segment;
|
17
|
+
})
|
18
|
+
.join("/");
|
19
|
+
};
|
20
|
+
/**
|
21
|
+
* Create full URL string
|
22
|
+
*/
|
23
|
+
const getTotalUrl = (origin, path) => {
|
24
|
+
return `${origin}${path}`;
|
25
|
+
};
|
26
|
+
|
27
|
+
exports.getPathWithParams = getPathWithParams;
|
28
|
+
exports.getTotalUrl = getTotalUrl;
|
29
|
+
//# sourceMappingURL=url.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"url.js","sources":["../../../src/utils/url.ts"],"sourcesContent":["import { PathParams } from \"msw\";\n\n/**\n * Replace path parameters with path object and formatted path\n */\nexport const getPathWithParams = (\n url: URL,\n paramValues?: PathParams<string>\n): string => {\n if (!paramValues) return url.pathname;\n\n return url.pathname\n .split(\"/\")\n .map((segment) => {\n if (segment.startsWith(\":\")) {\n const paramName = segment.slice(1); // remove ':'\n return paramValues[paramName] || \"undefined\"; // replace with param value if exists, otherwise \"undefined\"\n }\n return segment;\n })\n .join(\"/\");\n};\n\n/**\n * Create full URL string\n */\nexport const getTotalUrl = (origin: string, path: string): string => {\n return `${origin}${path}`;\n};\n"],"names":[],"mappings":";;AAEA;;AAEG;MACU,iBAAiB,GAAG,CAC/B,GAAQ,EACR,WAAgC,KACtB;AACV,IAAA,IAAI,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IAEtC,OAAO,GAAG,CAAC,QAAQ;SAChB,KAAK,CAAC,GAAG,CAAC;AACV,SAAA,GAAG,CAAC,CAAC,OAAO,KAAI;AACf,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC;SAC9C;AACD,QAAA,OAAO,OAAO,CAAC;AACjB,KAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,EAAE;AAEF;;AAEG;MACU,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,KAAY;AAClE,IAAA,OAAO,CAAG,EAAA,MAAM,CAAG,EAAA,IAAI,EAAE,CAAC;AAC5B;;;;;"}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { useReactTable } from '../node_modules/@tanstack/react-table/build/lib/index.js';
|
2
2
|
import { useHandlerStore } from '../lib/handlerStore.js';
|
3
|
-
import React__default, { useMemo } from 'react';
|
3
|
+
import React__default, { useMemo, useState } from 'react';
|
4
|
+
import { PreviewHandler } from '../ui/Table/PreviewHandler/index.js';
|
4
5
|
import { createColumnHelper, getCoreRowModel } from '../node_modules/@tanstack/table-core/build/lib/index.js';
|
5
6
|
|
6
7
|
const useFlattenHandlersTable = () => {
|
@@ -19,6 +20,16 @@ const useFlattenHandlersTable = () => {
|
|
19
20
|
header: "Method",
|
20
21
|
cell: ({ row }) => (React__default.createElement("div", { className: "msw-dev-tool-center" }, row.original.method)),
|
21
22
|
}),
|
23
|
+
columnHelper.accessor("handler", {
|
24
|
+
header: "Preview",
|
25
|
+
cell: ({ row }) => {
|
26
|
+
const handler = row.original.handler;
|
27
|
+
const [isOpen, setIsOpen] = useState(false);
|
28
|
+
return (React__default.createElement(React__default.Fragment, null,
|
29
|
+
React__default.createElement("button", { onClick: () => setIsOpen(true) }, "Preview"),
|
30
|
+
isOpen && (React__default.createElement(PreviewHandler, { handler: handler, onClose: () => setIsOpen(false) }))));
|
31
|
+
},
|
32
|
+
}),
|
22
33
|
];
|
23
34
|
}, []);
|
24
35
|
const table = useReactTable({
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useFlattenHandlersTable.js","sources":["../../../src/hook/useFlattenHandlersTable.tsx"],"sourcesContent":["import {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useHandlerStore } from \"../lib/handlerStore\";\nimport { FlattenHandler } from \"../lib\";\nimport React, { useMemo } from \"react\";\n\nexport const useFlattenHandlersTable = () => {\n const {\n flattenHandlers,\n handlerRowSelection,\n handleHandlerRowSelectionChange,\n } = useHandlerStore();\n\n const columnHelper = createColumnHelper<FlattenHandler>();\n const columns: ColumnDef<FlattenHandler, any>[] = useMemo(() => {\n return [\n columnHelper.accessor(\"enabled\", {\n header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={(e) => table.toggleAllRowsSelected(e.target.checked)}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={(e) => row.toggleSelected(e.target.checked)}\n />\n ),\n }),\n columnHelper.accessor(\"path\", {\n header: \"End point\",\n }),\n columnHelper.accessor(\"method\", {\n header: \"Method\",\n cell: ({ row }) => (\n <div className=\"msw-dev-tool-center\">{row.original.method}</div>\n ),\n }),\n ];\n }, []);\n\n const table = useReactTable({\n columns,\n data: flattenHandlers,\n getCoreRowModel: getCoreRowModel(),\n state: {\n rowSelection: handlerRowSelection,\n },\n onRowSelectionChange: handleHandlerRowSelectionChange,\n getRowId: (row) => row.id,\n enableRowSelection: true,\n });\n\n return table;\n};\n"],"names":["React"],"mappings":"
|
1
|
+
{"version":3,"file":"useFlattenHandlersTable.js","sources":["../../../src/hook/useFlattenHandlersTable.tsx"],"sourcesContent":["import {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useHandlerStore } from \"../lib/handlerStore\";\nimport { FlattenHandler } from \"../lib\";\nimport React, { useMemo, useState } from \"react\";\nimport { PreviewHandler } from \"../ui/Table/PreviewHandler\";\n\nexport const useFlattenHandlersTable = () => {\n const {\n flattenHandlers,\n handlerRowSelection,\n handleHandlerRowSelectionChange,\n } = useHandlerStore();\n\n const columnHelper = createColumnHelper<FlattenHandler>();\n const columns: ColumnDef<FlattenHandler, any>[] = useMemo(() => {\n return [\n columnHelper.accessor(\"enabled\", {\n header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={(e) => table.toggleAllRowsSelected(e.target.checked)}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={(e) => row.toggleSelected(e.target.checked)}\n />\n ),\n }),\n columnHelper.accessor(\"path\", {\n header: \"End point\",\n }),\n columnHelper.accessor(\"method\", {\n header: \"Method\",\n cell: ({ row }) => (\n <div className=\"msw-dev-tool-center\">{row.original.method}</div>\n ),\n }),\n columnHelper.accessor(\"handler\", {\n header: \"Preview\",\n cell: ({ row }) => {\n const handler = row.original.handler;\n const [isOpen, setIsOpen] = useState(false);\n return (\n <>\n <button onClick={() => setIsOpen(true)}>Preview</button>\n {isOpen && (\n <PreviewHandler\n handler={handler}\n onClose={() => setIsOpen(false)}\n />\n )}\n </>\n );\n },\n }),\n ];\n }, []);\n\n const table = useReactTable({\n columns,\n data: flattenHandlers,\n getCoreRowModel: getCoreRowModel(),\n state: {\n rowSelection: handlerRowSelection,\n },\n onRowSelectionChange: handleHandlerRowSelectionChange,\n getRowId: (row) => row.id,\n enableRowSelection: true,\n });\n\n return table;\n};\n"],"names":["React"],"mappings":";;;;;;AAWO,MAAM,uBAAuB,GAAG,MAAK;IAC1C,MAAM,EACJ,eAAe,EACf,mBAAmB,EACnB,+BAA+B,GAChC,GAAG,eAAe,EAAE,CAAC;AAEtB,IAAA,MAAM,YAAY,GAAG,kBAAkB,EAAkB,CAAC;AAC1D,IAAA,MAAM,OAAO,GAAqC,OAAO,CAAC,MAAK;QAC7D,OAAO;AACL,YAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE;AAC/B,gBAAA,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAChBA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,KAAK,CAAC,oBAAoB,EAAE,EACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC9D,CACH;AACD,gBAAA,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MACZA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,EAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GACrD,CACH;aACF,CAAC;AACF,YAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC5B,gBAAA,MAAM,EAAE,WAAW;aACpB,CAAC;AACF,YAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE;AAC9B,gBAAA,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MACZA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,IAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAO,CACjE;aACF,CAAC;AACF,YAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE;AAC/B,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAI;AAChB,oBAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACrC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5C,oBAAA,QACEA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA;wBACEA,cAAQ,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC,EAAkB,EAAA,SAAA,CAAA;wBACvD,MAAM,KACLA,cAAC,CAAA,aAAA,CAAA,cAAc,IACb,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,EAC/B,CAAA,CACH,CACA,EACH;iBACH;aACF,CAAC;SACH,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,aAAa,CAAC;QAC1B,OAAO;AACP,QAAA,IAAI,EAAE,eAAe;QACrB,eAAe,EAAE,eAAe,EAAE;AAClC,QAAA,KAAK,EAAE;AACL,YAAA,YAAY,EAAE,mBAAmB;AAClC,SAAA;AACD,QAAA,oBAAoB,EAAE,+BAA+B;QACrD,QAAQ,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE;AACzB,QAAA,kBAAkB,EAAE,IAAI;AACzB,KAAA,CAAC,CAAC;AAEH,IAAA,OAAO,KAAK,CAAC;AACf;;;;"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import React__default from 'react';
|
2
|
+
|
3
|
+
const PathParamSetter = ({ paramValues, onParamChange, }) => {
|
4
|
+
return (paramValues &&
|
5
|
+
Object.keys(paramValues).length > 0 && (React__default.createElement(React__default.Fragment, null,
|
6
|
+
React__default.createElement("h3", null, "Path Parameters"),
|
7
|
+
React__default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "8px" } }, Object.entries(paramValues).map(([key, value]) => (React__default.createElement("div", { key: key, style: { display: "flex", alignItems: "center", gap: "8px" } },
|
8
|
+
React__default.createElement("label", { htmlFor: `param-${key}`, style: { minWidth: "100px" } },
|
9
|
+
key,
|
10
|
+
":"),
|
11
|
+
React__default.createElement("input", { id: `param-${key}`, type: "text", value: value, onChange: (e) => onParamChange(key, e.target.value), style: {
|
12
|
+
padding: "4px 8px",
|
13
|
+
borderRadius: "4px",
|
14
|
+
border: "1px solid #ccc",
|
15
|
+
width: "100%",
|
16
|
+
} }))))))));
|
17
|
+
};
|
18
|
+
|
19
|
+
export { PathParamSetter };
|
20
|
+
//# sourceMappingURL=PathParamSetter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"PathParamSetter.js","sources":["../../../../../src/ui/Table/PreviewHandler/PathParamSetter.tsx"],"sourcesContent":["import { PathParams } from \"msw\";\nimport React from \"react\";\n\nexport const PathParamSetter = ({\n paramValues,\n onParamChange,\n}: {\n paramValues?: PathParams<string>;\n onParamChange: (key: string, value: string) => void;\n}) => {\n return (\n paramValues &&\n Object.keys(paramValues).length > 0 && (\n <>\n <h3>Path Parameters</h3>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\n {Object.entries(paramValues).map(([key, value]) => (\n <div\n key={key}\n style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}\n >\n <label htmlFor={`param-${key}`} style={{ minWidth: \"100px\" }}>\n {key}:\n </label>\n <input\n id={`param-${key}`}\n type=\"text\"\n value={value}\n onChange={(e) => onParamChange(key, e.target.value)}\n style={{\n padding: \"4px 8px\",\n borderRadius: \"4px\",\n border: \"1px solid #ccc\",\n width: \"100%\",\n }}\n />\n </div>\n ))}\n </div>\n </>\n )\n );\n};\n"],"names":["React"],"mappings":";;AAGa,MAAA,eAAe,GAAG,CAAC,EAC9B,WAAW,EACX,aAAa,GAId,KAAI;AACH,IAAA,QACE,WAAW;QACX,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,KACjCA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA;QACEA,cAAwB,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,CAAA;QACxBA,cAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EACjE,EAAA,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAC5CA,cACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAA;AAE5D,YAAAA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,CAAS,MAAA,EAAA,GAAG,CAAE,CAAA,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAA;gBACzD,GAAG;AACE,gBAAA,GAAA,CAAA;AACR,YAAAA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,CAAS,MAAA,EAAA,GAAG,EAAE,EAClB,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACnD,KAAK,EAAE;AACL,oBAAA,OAAO,EAAE,SAAS;AAClB,oBAAA,YAAY,EAAE,KAAK;AACnB,oBAAA,MAAM,EAAE,gBAAgB;AACxB,oBAAA,KAAK,EAAE,MAAM;AACd,iBAAA,EAAA,CACD,CACE,CACP,CAAC,CACE,CACL,CACJ,EACD;AACJ;;;;"}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
import React__default, { useState } from 'react';
|
2
|
+
import { getPathWithParams, getTotalUrl } from '../../../utils/url.js';
|
3
|
+
|
4
|
+
const RequestPreview = ({ url, paramValues, }) => {
|
5
|
+
const [loading, setLoading] = useState(false);
|
6
|
+
const [error, setError] = useState(null);
|
7
|
+
const [response, setResponse] = useState(null);
|
8
|
+
const finalPath = getPathWithParams(url, paramValues);
|
9
|
+
const totalUrl = getTotalUrl(url.origin, finalPath);
|
10
|
+
const handleFetch = () => {
|
11
|
+
setLoading(true);
|
12
|
+
setError(null);
|
13
|
+
fetch(totalUrl)
|
14
|
+
.then((res) => res.json())
|
15
|
+
.then((data) => {
|
16
|
+
setResponse(data);
|
17
|
+
setLoading(false);
|
18
|
+
})
|
19
|
+
.catch((err) => {
|
20
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch"));
|
21
|
+
setLoading(false);
|
22
|
+
});
|
23
|
+
};
|
24
|
+
return (React__default.createElement("div", { style: { marginTop: "20px" } },
|
25
|
+
React__default.createElement("h3", null, "Response"),
|
26
|
+
React__default.createElement("div", { style: {
|
27
|
+
fontFamily: "monospace",
|
28
|
+
wordBreak: "break-all",
|
29
|
+
} },
|
30
|
+
React__default.createElement("button", { onClick: handleFetch, disabled: loading, style: {
|
31
|
+
padding: "4px 12px",
|
32
|
+
borderRadius: "4px",
|
33
|
+
border: "1px solid #ccc",
|
34
|
+
backgroundColor: loading ? "#f5f5f5" : "white",
|
35
|
+
cursor: loading ? "not-allowed" : "pointer",
|
36
|
+
} }, loading ? "Fetching..." : "Send Request"),
|
37
|
+
error && (React__default.createElement("div", { style: {
|
38
|
+
marginTop: "8px",
|
39
|
+
color: "#f44336",
|
40
|
+
backgroundColor: "#f5f5f5",
|
41
|
+
} },
|
42
|
+
"Error: ",
|
43
|
+
error.message)),
|
44
|
+
response && (React__default.createElement("div", { style: {
|
45
|
+
marginTop: "8px",
|
46
|
+
maxHeight: "200px",
|
47
|
+
overflow: "scroll",
|
48
|
+
backgroundColor: "#f5f5f5",
|
49
|
+
} },
|
50
|
+
React__default.createElement("pre", { style: {
|
51
|
+
margin: 0,
|
52
|
+
overflow: "auto",
|
53
|
+
borderRadius: "4px",
|
54
|
+
fontFamily: "monospace",
|
55
|
+
wordBreak: "break-all",
|
56
|
+
} }, JSON.stringify(response, null, 2)))))));
|
57
|
+
};
|
58
|
+
|
59
|
+
export { RequestPreview };
|
60
|
+
//# sourceMappingURL=RequestPreview.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"RequestPreview.js","sources":["../../../../../src/ui/Table/PreviewHandler/RequestPreview.tsx"],"sourcesContent":["import { PathParams } from \"msw\";\nimport React, { useState } from \"react\";\nimport { getPathWithParams, getTotalUrl } from \"../../../utils/url\";\n\nexport const RequestPreview = ({\n url,\n paramValues,\n}: {\n url: URL;\n paramValues?: PathParams<string>;\n}) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [response, setResponse] = useState<any>(null);\n\n const finalPath = getPathWithParams(url, paramValues);\n const totalUrl = getTotalUrl(url.origin, finalPath);\n\n const handleFetch = () => {\n setLoading(true);\n setError(null);\n\n fetch(totalUrl)\n .then((res) => res.json())\n .then((data) => {\n setResponse(data);\n setLoading(false);\n })\n .catch((err) => {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch\"));\n setLoading(false);\n });\n };\n\n return (\n <div style={{ marginTop: \"20px\" }}>\n <h3>Response</h3>\n <div\n style={{\n fontFamily: \"monospace\",\n wordBreak: \"break-all\",\n }}\n >\n <button\n onClick={handleFetch}\n disabled={loading}\n style={{\n padding: \"4px 12px\",\n borderRadius: \"4px\",\n border: \"1px solid #ccc\",\n backgroundColor: loading ? \"#f5f5f5\" : \"white\",\n cursor: loading ? \"not-allowed\" : \"pointer\",\n }}\n >\n {loading ? \"Fetching...\" : \"Send Request\"}\n </button>\n\n {error && (\n <div\n style={{\n marginTop: \"8px\",\n color: \"#f44336\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n Error: {error.message}\n </div>\n )}\n\n {response && (\n <div\n style={{\n marginTop: \"8px\",\n maxHeight: \"200px\",\n overflow: \"scroll\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <pre\n style={{\n margin: 0,\n overflow: \"auto\",\n borderRadius: \"4px\",\n fontFamily: \"monospace\",\n wordBreak: \"break-all\",\n }}\n >\n {JSON.stringify(response, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import React__default, { useState } from 'react';
|
2
|
+
import { createPortal } from 'react-dom';
|
3
|
+
import { matchRequestUrl } from 'msw';
|
4
|
+
import { PathParamSetter } from './PathParamSetter.js';
|
5
|
+
import { RequestPreview } from './RequestPreview.js';
|
6
|
+
|
7
|
+
const PreviewHandler = ({ handler, onClose }) => {
|
8
|
+
const path = handler.info.path;
|
9
|
+
const url = new URL(String(path), location.href);
|
10
|
+
const { params } = matchRequestUrl(url, path, url.origin);
|
11
|
+
const [paramValues, setParamValues] = useState(params
|
12
|
+
? Object.keys(params).reduce((acc, key) => ({
|
13
|
+
...acc,
|
14
|
+
[key]: "",
|
15
|
+
}), {})
|
16
|
+
: undefined);
|
17
|
+
const handleParamChange = (key, value) => {
|
18
|
+
setParamValues((prev) => ({
|
19
|
+
...prev,
|
20
|
+
[key]: value,
|
21
|
+
}));
|
22
|
+
};
|
23
|
+
return createPortal(React__default.createElement("div", { style: {
|
24
|
+
padding: "20px",
|
25
|
+
position: "fixed",
|
26
|
+
zIndex: 9999,
|
27
|
+
backgroundColor: "white",
|
28
|
+
boxShadow: "0 2px 10px rgba(0, 0, 0, 0.1)",
|
29
|
+
borderRadius: "8px",
|
30
|
+
width: "320px",
|
31
|
+
} },
|
32
|
+
React__default.createElement("div", { style: { position: "relative" } },
|
33
|
+
React__default.createElement("button", { onClick: onClose, style: {
|
34
|
+
position: "absolute",
|
35
|
+
right: 0,
|
36
|
+
top: 0,
|
37
|
+
background: "none",
|
38
|
+
border: "none",
|
39
|
+
cursor: "pointer",
|
40
|
+
fontSize: "1.2rem",
|
41
|
+
padding: "4px",
|
42
|
+
} }, "\u2715"),
|
43
|
+
React__default.createElement("h2", { style: { marginBottom: "20px", paddingRight: "24px" } }, "Handler Preview"),
|
44
|
+
React__default.createElement("p", { style: { fontSize: "0.8rem", color: "#666", overflow: "scroll" } }, url.toString()),
|
45
|
+
React__default.createElement(PathParamSetter, { paramValues: paramValues, onParamChange: handleParamChange }),
|
46
|
+
React__default.createElement(RequestPreview, { url: url, paramValues: paramValues }))), document.body);
|
47
|
+
};
|
48
|
+
|
49
|
+
export { PreviewHandler };
|
50
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/ui/Table/PreviewHandler/index.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { HttpHandler, matchRequestUrl, PathParams } from \"msw\";\nimport { PathParamSetter } from \"./PathParamSetter\";\nimport { RequestPreview } from \"./RequestPreview\";\n\ninterface PreviewHandlerProps {\n handler: HttpHandler;\n onClose: () => void;\n}\n\nexport const PreviewHandler = ({ handler, onClose }: PreviewHandlerProps) => {\n const path = handler.info.path;\n const url = new URL(String(path), location.href);\n const { params } = matchRequestUrl(url, path, url.origin);\n\n const [paramValues, setParamValues] = useState<\n PathParams<string> | undefined\n >(\n params\n ? Object.keys(params).reduce(\n (acc, key) => ({\n ...acc,\n [key]: \"\",\n }),\n {}\n )\n : undefined\n );\n\n const handleParamChange = (key: string, value: string) => {\n setParamValues((prev) => ({\n ...prev,\n [key]: value,\n }));\n };\n\n return createPortal(\n <div\n style={{\n padding: \"20px\",\n position: \"fixed\",\n zIndex: 9999,\n backgroundColor: \"white\",\n boxShadow: \"0 2px 10px rgba(0, 0, 0, 0.1)\",\n borderRadius: \"8px\",\n width: \"320px\",\n }}\n >\n <div style={{ position: \"relative\" }}>\n <button\n onClick={onClose}\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"1.2rem\",\n padding: \"4px\",\n }}\n >\n ✕\n </button>\n\n <h2 style={{ marginBottom: \"20px\", paddingRight: \"24px\" }}>\n Handler Preview\n </h2>\n <p style={{ fontSize: \"0.8rem\", color: \"#666\", overflow: \"scroll\" }}>\n {url.toString()}\n </p>\n <PathParamSetter\n paramValues={paramValues}\n onParamChange={handleParamChange}\n />\n <RequestPreview url={url} paramValues={paramValues} />\n </div>\n </div>,\n document.body\n );\n};\n"],"names":["React"],"mappings":";;;;;;AAWa,MAAA,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAuB,KAAI;AAC1E,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjD,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE1D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAG5C,MAAM;AACJ,UAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,GAAG,MAAM;AACb,YAAA,GAAG,GAAG;YACN,CAAC,GAAG,GAAG,EAAE;SACV,CAAC,EACF,EAAE,CACH;UACD,SAAS,CACd,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,KAAa,KAAI;AACvD,QAAA,cAAc,CAAC,CAAC,IAAI,MAAM;AACxB,YAAA,GAAG,IAAI;YACP,CAAC,GAAG,GAAG,KAAK;AACb,SAAA,CAAC,CAAC,CAAC;AACN,KAAC,CAAC;AAEF,IAAA,OAAO,YAAY,CACjBA,cACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,SAAS,EAAE,+BAA+B;AAC1C,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,KAAK,EAAE,OAAO;AACf,SAAA,EAAA;AAED,QAAAA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAA;AAClC,YAAAA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,KAAK,EAAE,CAAC;AACR,oBAAA,GAAG,EAAE,CAAC;AACN,oBAAA,UAAU,EAAE,MAAM;AAClB,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,OAAO,EAAE,KAAK;iBACf,EAGM,EAAA,QAAA,CAAA;YAETA,cAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAEpD,EAAA,iBAAA,CAAA;YACLA,cAAG,CAAA,aAAA,CAAA,GAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAA,EAChE,GAAG,CAAC,QAAQ,EAAE,CACb;YACJA,cAAC,CAAA,aAAA,CAAA,eAAe,IACd,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,iBAAiB,EAChC,CAAA;AACF,YAAAA,cAAA,CAAA,aAAA,CAAC,cAAc,EAAC,EAAA,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAA,CAAI,CAClD,CACF,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ;;;;"}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/**
|
2
|
+
* Replace path parameters with path object and formatted path
|
3
|
+
*/
|
4
|
+
const getPathWithParams = (url, paramValues) => {
|
5
|
+
if (!paramValues)
|
6
|
+
return url.pathname;
|
7
|
+
return url.pathname
|
8
|
+
.split("/")
|
9
|
+
.map((segment) => {
|
10
|
+
if (segment.startsWith(":")) {
|
11
|
+
const paramName = segment.slice(1); // remove ':'
|
12
|
+
return paramValues[paramName] || "undefined"; // replace with param value if exists, otherwise "undefined"
|
13
|
+
}
|
14
|
+
return segment;
|
15
|
+
})
|
16
|
+
.join("/");
|
17
|
+
};
|
18
|
+
/**
|
19
|
+
* Create full URL string
|
20
|
+
*/
|
21
|
+
const getTotalUrl = (origin, path) => {
|
22
|
+
return `${origin}${path}`;
|
23
|
+
};
|
24
|
+
|
25
|
+
export { getPathWithParams, getTotalUrl };
|
26
|
+
//# sourceMappingURL=url.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"url.js","sources":["../../../src/utils/url.ts"],"sourcesContent":["import { PathParams } from \"msw\";\n\n/**\n * Replace path parameters with path object and formatted path\n */\nexport const getPathWithParams = (\n url: URL,\n paramValues?: PathParams<string>\n): string => {\n if (!paramValues) return url.pathname;\n\n return url.pathname\n .split(\"/\")\n .map((segment) => {\n if (segment.startsWith(\":\")) {\n const paramName = segment.slice(1); // remove ':'\n return paramValues[paramName] || \"undefined\"; // replace with param value if exists, otherwise \"undefined\"\n }\n return segment;\n })\n .join(\"/\");\n};\n\n/**\n * Create full URL string\n */\nexport const getTotalUrl = (origin: string, path: string): string => {\n return `${origin}${path}`;\n};\n"],"names":[],"mappings":"AAEA;;AAEG;MACU,iBAAiB,GAAG,CAC/B,GAAQ,EACR,WAAgC,KACtB;AACV,IAAA,IAAI,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IAEtC,OAAO,GAAG,CAAC,QAAQ;SAChB,KAAK,CAAC,GAAG,CAAC;AACV,SAAA,GAAG,CAAC,CAAC,OAAO,KAAI;AACf,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC;SAC9C;AACD,QAAA,OAAO,OAAO,CAAC;AACjB,KAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,EAAE;AAEF;;AAEG;MACU,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,KAAY;AAClE,IAAA,OAAO,CAAG,EAAA,MAAM,CAAG,EAAA,IAAI,EAAE,CAAC;AAC5B;;;;"}
|
package/package.json
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
{
|
2
2
|
"name": "msw-dev-tool",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.23",
|
4
4
|
"main": "dist/cjs/index.js",
|
5
5
|
"module": "dist/esm/index.js",
|
6
6
|
"types": "dist/types/index.d.ts",
|
7
|
+
"repository": "https://github.com/nayounsang/msw-dev-tool",
|
7
8
|
"files": [
|
8
9
|
"dist",
|
9
10
|
"LICENSE",
|