diff --git a/packages/dev-app/package.json b/packages/dev-app/package.json
index aee894c..989a94d 100644
--- a/packages/dev-app/package.json
+++ b/packages/dev-app/package.json
@@ -15,6 +15,7 @@
"@trpc/react-query": "^10.18.0",
"@trpc/server": "^10.18.0",
"autoprefixer": "^10.4.14",
+ "jsoneditor": "^9.10.3",
"next": "^13.2.4",
"next-transpile-modules": "^10.0.0",
"postcss": "^8.4.21",
diff --git a/packages/dev-app/src/pages/_app.tsx b/packages/dev-app/src/pages/_app.tsx
index 1831917..c54739e 100644
--- a/packages/dev-app/src/pages/_app.tsx
+++ b/packages/dev-app/src/pages/_app.tsx
@@ -3,6 +3,7 @@ import { type AppType } from "next/app";
import { api } from "~/utils/api";
import "~/styles/globals.css";
+import 'jsoneditor/dist/jsoneditor.css';
const MyApp: AppType = ({ Component, pageProps }) => {
return ;
diff --git a/packages/trpc-panel/package.json b/packages/trpc-panel/package.json
index 9a86042..52f586c 100644
--- a/packages/trpc-panel/package.json
+++ b/packages/trpc-panel/package.json
@@ -55,6 +55,7 @@
"@trpc/server": "10.2.0",
"@types/jest": "^29.2.4",
"@types/json-bigint": "^1.0.1",
+ "@types/jsoneditor": "^9.9.1",
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
"ajv": "^8.11.2",
@@ -66,6 +67,7 @@
"gulp-replace": "^1.1.3",
"jest": "^29.3.1",
"json-bigint": "^1.0.0",
+ "jsoneditor": "^9.10.3",
"postcss": "^8.4.19",
"react": "18.2.0",
"react-dom": "18.2.0",
diff --git a/packages/trpc-panel/rollup.config.js b/packages/trpc-panel/rollup.config.js
index 7c4bc10..911675d 100644
--- a/packages/trpc-panel/rollup.config.js
+++ b/packages/trpc-panel/rollup.config.js
@@ -24,8 +24,8 @@ export default [
// commonjs(),
],
output: [
- { file: "lib/index.js", format: "cjs" },
- { file: "lib/index.mjs", format: "es" },
+ { file: "lib/index.js", format: "cjs", inlineDynamicImports: true },
+ { file: "lib/index.mjs", format: "es", inlineDynamicImports: true },
],
},
{
@@ -35,6 +35,7 @@ export default [
format: "umd",
sourcemap: true,
name: "trpc-panel",
+ inlineDynamicImports: true,
},
plugins: [
postcss({
diff --git a/packages/trpc-panel/src/react-app/components/form/JSONEditor.tsx b/packages/trpc-panel/src/react-app/components/form/JSONEditor.tsx
new file mode 100644
index 0000000..34f3785
--- /dev/null
+++ b/packages/trpc-panel/src/react-app/components/form/JSONEditor.tsx
@@ -0,0 +1,44 @@
+import React, { useEffect, useRef } from 'react';
+import type JSONEditor from 'jsoneditor';
+
+const jsonEditorImport = import('jsoneditor').then(({ default: JSONEditor }) => JSONEditor);
+
+export default function JSONEditorDemo ({
+ value,
+ onChange,
+}: {
+ value: any;
+ onChange: (value: any) => void;
+}) {
+ const editorRef = useRef(null);
+
+ useEffect(() => {
+ let abort = false;
+ let newEditor: JSONEditor;
+ jsonEditorImport.then(JSONEditor => {
+ if (!abort && editorRef.current) {
+ newEditor = new JSONEditor(editorRef.current, {
+ mode: 'code',
+ history: false,
+ onChange: () => {
+ try {
+ onChange(newEditor.get());
+ } catch (err) {}
+ },
+ });
+ newEditor.set(value);
+ }
+ });
+
+ return () => {
+ abort = true;
+ if (newEditor) {
+ newEditor.destroy();
+ }
+ };
+ }, [ editorRef.current, value ]);
+
+ return (
+
+ );
+}
diff --git a/packages/trpc-panel/src/react-app/components/form/ProcedureForm/index.tsx b/packages/trpc-panel/src/react-app/components/form/ProcedureForm/index.tsx
index d96fecf..183311a 100644
--- a/packages/trpc-panel/src/react-app/components/form/ProcedureForm/index.tsx
+++ b/packages/trpc-panel/src/react-app/components/form/ProcedureForm/index.tsx
@@ -13,12 +13,14 @@ import { Error } from "./Error";
import { RequestResult } from "./RequestResult";
import { CollapsableSection } from "@src/react-app/components/CollapsableSection";
import { CloseIcon } from "@src/react-app/components/icons/CloseIcon";
+import { ToggleJsonIcon } from "@src/react-app/components/icons/ToggleJsonIcon";
import { ObjectField } from "@src/react-app/components/form/fields/ObjectField";
import { fullFormats } from "ajv-formats/dist/formats";
import type { ParsedInputNode } from "@src/parse/parseNodeTypes";
import { DocumentationSection } from "@src/react-app/components/form/ProcedureForm/DescriptionSection";
import { Field } from "@src/react-app/components/form/Field";
import { ProcedureFormContextProvider } from "@src/react-app/components/form/ProcedureForm/ProcedureFormContext";
+import JSONEditor from '../JSONEditor';
const TRPCErrorSchema = z.object({
shape: z.object({
@@ -96,6 +98,8 @@ export function ProcedureForm({
control,
reset: resetForm,
handleSubmit,
+ getValues,
+ setValue,
} = useForm({
resolver: ajvResolver(wrapJsonSchema(procedure.inputSchema as any), {
formats: fullFormats,
@@ -147,6 +151,12 @@ export function ProcedureForm({
const fieldName = procedure.node.path.join(".");
+ const [ useRawInput, setUseRawInput ] = useState(false);
+ function toggleRawInput() {
+ console.log(getValues());
+ setUseRawInput(!useRawInput);
+ }
+
return (
}
+ topRightElement={
+
+
+
+
+ }
>
- {procedure.node.type === "object" ? (
+ {useRawInput && {setValue('vals', values)}} />}
+ {!useRawInput && (procedure.node.type === "object" ? (
Object.keys(procedure.node.children).length > 0 && (
- )}
+ ))}
void
+}) {
+ return (
+
+
+
+ );
+}
+
function wrapJsonSchema(jsonSchema: any) {
delete jsonSchema["$schema"];
diff --git a/packages/trpc-panel/src/react-app/components/icons/ToggleJsonIcon.tsx b/packages/trpc-panel/src/react-app/components/icons/ToggleJsonIcon.tsx
new file mode 100644
index 0000000..0884bdf
--- /dev/null
+++ b/packages/trpc-panel/src/react-app/components/icons/ToggleJsonIcon.tsx
@@ -0,0 +1,23 @@
+import React from "react";
+
+export function ToggleJsonIcon({ className }: { className?: string }) {
+ return (
+
+ );
+}
diff --git a/packages/trpc-panel/src/react-app/index.tsx b/packages/trpc-panel/src/react-app/index.tsx
index 4caa7b7..c96aad6 100644
--- a/packages/trpc-panel/src/react-app/index.tsx
+++ b/packages/trpc-panel/src/react-app/index.tsx
@@ -3,6 +3,7 @@ import React from "react";
import ReactDOM from "react-dom/client";
import { RootComponent } from "./Root";
import "./index.css";
+import 'jsoneditor/dist/jsoneditor.css';
import { RenderOptions } from "@src/render";
import { trpc } from "@src/react-app/trpc";
diff --git a/yarn.lock b/yarn.lock
index 7db8cf4..c8dded7 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1113,6 +1113,11 @@
dependencies:
"@sinonjs/commons" "^2.0.0"
+"@sphinxxxx/color-conversion@^2.2.2":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz#03ecc29279e3c0c832f6185a5bfa3497858ac8ca"
+ integrity sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==
+
"@swc/helpers@0.5.0":
version "0.5.0"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.0.tgz#bf1d807b60f7290d0ec763feea7ccdeda06e85f1"
@@ -1238,6 +1243,11 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
+"@types/ace@*":
+ version "0.0.49"
+ resolved "https://registry.yarnpkg.com/@types/ace/-/ace-0.0.49.tgz#067d2f14d7c18d6b03646f06336fef4329370b3a"
+ integrity sha512-VpeUGbQ5f1Pka30vOMyLoI+GuNcbyeroeFsuy2H+CHBJ9GYwpg/qPlbI5cfsUvvac4EWwP55x+xMfwgpal4USQ==
+
"@types/aria-query@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc"
@@ -1406,6 +1416,14 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+"@types/jsoneditor@^9.9.1":
+ version "9.9.1"
+ resolved "https://registry.yarnpkg.com/@types/jsoneditor/-/jsoneditor-9.9.1.tgz#b96a26437e04210c666da2f31a51b9428f165199"
+ integrity sha512-+TJ8eXq5sm3z8gPAO6ZSBB9YyYvzWoHOvORnc0y4i+i5RL3ghQakJ211kCE3sKnuTIYqK752kITOnF3yfjdkug==
+ dependencies:
+ "@types/ace" "*"
+ ajv "^6.12.0"
+
"@types/livereload@^0.9.2":
version "0.9.2"
resolved "https://registry.yarnpkg.com/@types/livereload/-/livereload-0.9.2.tgz#e5259bc2f38f6dc631a7139a2383cd70e267fe81"
@@ -1674,6 +1692,11 @@ accepts@~1.3.8:
mime-types "~2.1.34"
negotiator "0.6.3"
+ace-builds@^1.27.0:
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.28.0.tgz#b606702c33dec470393531d9808a1082add8302b"
+ integrity sha512-wkJp+Wz8MRHtCVdt65L/jPFLAQ0iqJZ2EeD2XWOvKGbIi4mZNwHlpHRLRB8ZnQ07VoiB0TLFWwIjjm2FL9gUcQ==
+
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@@ -1696,7 +1719,7 @@ ajv-formats@^2.1.1:
dependencies:
ajv "^8.0.0"
-ajv@^6.10.0, ajv@^6.12.4:
+ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.6:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -5258,6 +5281,11 @@ istextorbinary@^3.0.0:
binaryextensions "^2.2.0"
textextensions "^3.2.0"
+javascript-natural-sort@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
+ integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==
+
jest-changed-files@^29.5.0:
version "29.5.0"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e"
@@ -5624,6 +5652,11 @@ jiti@^1.17.2:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd"
integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==
+jmespath@^0.16.0:
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076"
+ integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==
+
js-sdsl@^4.1.4:
version "4.4.0"
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430"
@@ -5676,6 +5709,11 @@ json-schema-traverse@^1.0.0:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+json-source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/json-source-map/-/json-source-map-0.6.1.tgz#e0b1f6f4ce13a9ad57e2ae165a24d06e62c79a0f"
+ integrity sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==
+
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -5698,6 +5736,21 @@ jsonc-parser@3.2.0:
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
+jsoneditor@^9.10.3:
+ version "9.10.3"
+ resolved "https://registry.yarnpkg.com/jsoneditor/-/jsoneditor-9.10.3.tgz#dbd8a32c5eb5f9900a0560ebe921132bed6f212d"
+ integrity sha512-9vSMTPKBZzz56WY0SjbV7VQqa1+wUPKmwqtitmVXmTT5ohAMOYlOLgOdRwj0bl81nHP5HsKsYEVLCPiArHNSFw==
+ dependencies:
+ ace-builds "^1.27.0"
+ ajv "^6.12.6"
+ javascript-natural-sort "^0.7.1"
+ jmespath "^0.16.0"
+ json-source-map "^0.6.1"
+ jsonrepair "^3.2.1"
+ mobius1-selectr "^2.4.13"
+ picomodal "^3.0.0"
+ vanilla-picker "^2.12.2"
+
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -5714,6 +5767,11 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
+jsonrepair@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/jsonrepair/-/jsonrepair-3.2.2.tgz#712315e4aa953bd066819810545cb976b0b6f3ef"
+ integrity sha512-IwsEsj59BVjFTO5DJ22Naxk5+AuNjS+1BUqOebpPlcyF8C+n8SAAICFo4Db74ORltzDygAlTAH56Pe1vupsnzA==
+
"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea"
@@ -6145,6 +6203,11 @@ mkdirp@~0.5.1:
dependencies:
minimist "^1.2.6"
+mobius1-selectr@^2.4.13:
+ version "2.4.13"
+ resolved "https://registry.yarnpkg.com/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz#0019dfd9f984840d6e40f70683ab3ec78ce3b5df"
+ integrity sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==
+
morgan@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
@@ -6828,6 +6891,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+picomodal@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/picomodal/-/picomodal-3.0.0.tgz#facd30f4fbf34a809c1e04ea525f004f399c0b82"
+ integrity sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==
+
pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -8972,6 +9040,13 @@ value-or-function@^3.0.0:
resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
integrity sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==
+vanilla-picker@^2.12.2:
+ version "2.12.2"
+ resolved "https://registry.yarnpkg.com/vanilla-picker/-/vanilla-picker-2.12.2.tgz#b4c6a3f4015dbd208080265fe7edd311709aa251"
+ integrity sha512-dk0gNeNL9fQFGd1VEhNDQfFlbCqAiksRh1H2tVPlavkH88n/a/y30rXi9PPKrYPTK5kEfPO4xcldt4ts/1wIAg==
+ dependencies:
+ "@sphinxxxx/color-conversion" "^2.2.2"
+
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"