feat(connect-explorer-nextra): method json params editor

This commit is contained in:
Tomas Martykan
2024-05-02 15:31:05 +02:00
committed by Tomáš Martykán
parent dc85a6ca39
commit 09086d0f1a
13 changed files with 740 additions and 67 deletions

View File

@@ -21,7 +21,7 @@ export default withNextra({
images: {
unoptimized: true,
},
transpilePackages: ['@trezor/components'],
transpilePackages: ['codemirror-json-schema', 'json-schema-library', '@trezor/components'],
compiler: {
styledComponents: true,
},

View File

@@ -14,6 +14,7 @@
"convert-old-docs": "yarn tsx scripts/convert-old-docs.ts --all"
},
"dependencies": {
"@codemirror/state": "^6.4.1",
"@hbsnow/rehype-sectionize": "^1.0.7",
"@sinclair/typebox": "^0.31.28",
"@trezor/components": "workspace:^",
@@ -25,6 +26,10 @@
"@trezor/schema-utils": "workspace:^",
"@trezor/theme": "workspace:^",
"@trezor/utils": "workspace:^",
"@uiw/react-codemirror": "^4.21.25",
"codemirror-json-schema": "^0.7.0",
"codemirror-json5": "^1.0.3",
"json5": "^2.2.3",
"next": "^14.1.1",
"next-mdx-remote": "^4.4.1",
"next-themes": "^0.2.1",

View File

@@ -1,6 +1,8 @@
import { TSchema } from '@sinclair/typebox';
import JSON5 from 'json5';
import TrezorConnect from '@trezor/connect-web';
import { getDeepValue } from '@trezor/schema-utils/src/utils';
import { GetState, Dispatch, Field } from '../types';
@@ -12,6 +14,7 @@ export const ADD_BATCH = 'method_add_batch';
export const REMOVE_BATCH = 'method_remove_batch';
export const SET_UNION = 'method_set_union';
export const RESPONSE = 'method_response';
export const SET_MANUAL_MODE = 'method_set_manual_mode';
export type MethodAction =
| { type: typeof SET_METHOD; methodConfig: any }
@@ -21,7 +24,8 @@ export type MethodAction =
| { type: typeof ADD_BATCH; field: Field<any>; item: any }
| { type: typeof REMOVE_BATCH; field: Field<any>; batch: any[] }
| { type: typeof SET_UNION; field: Field<any>; current: any }
| { type: typeof RESPONSE; response: any };
| { type: typeof RESPONSE; response: any }
| { type: typeof SET_MANUAL_MODE; manualMode: boolean };
export const onSetMethod = (methodConfig: any) => ({
type: SET_METHOD,
@@ -69,6 +73,11 @@ export const onResponse = (response: any) => ({
response,
});
export const onSetManualMode = (manualMode: boolean) => ({
type: SET_MANUAL_MODE,
manualMode,
});
export const onSubmit = () => async (dispatch: Dispatch, getState: GetState) => {
const { method } = getState();
if (!method?.name) throw new Error('method name not specified');
@@ -117,3 +126,35 @@ export const onVerify = () => (dispatch: Dispatch, getState: GetState) => {
}
});
};
export const onCodeChange = (value: string) => (dispatch: Dispatch, getState: GetState) => {
try {
const { fields } = getState().method;
const parsed = JSON5.parse(value);
const processField = (field: Field<unknown>) => {
if (field.type === 'array') {
field.items.forEach(batch => {
batch.forEach(processField);
});
} else if (field.type === 'union') {
field.options.forEach(batch => {
batch.forEach(processField);
});
}
if (field.path && field.path.length > 0) {
dispatch(
onFieldChange(
field,
getDeepValue(parsed, [...field.path, ...field.name.split('.')]),
),
);
} else {
dispatch(onFieldChange(field, getDeepValue(parsed, field.name.split('.'))));
}
};
fields.forEach(processField);
} catch (error) {
console.error('Invalid JSON', error);
}
};

View File

@@ -3,10 +3,11 @@ import React, { useEffect, useState } from 'react';
import styled from 'styled-components';
import { Type, TSchema } from '@sinclair/typebox';
import { CollapsibleBox, Select, SelectBar, variables } from '@trezor/components';
import { CollapsibleBox, Select, Switch, variables } from '@trezor/components';
import { spacingsPx } from '@trezor/theme';
import { Method } from './Method';
import { useActions } from '../hooks';
import { useActions, useSelector } from '../hooks';
import * as methodActions from '../actions/methodActions';
import { MethodState } from '../reducers/methodCommon';
@@ -53,6 +54,20 @@ const CollapsibleBoxStyled = styled(CollapsibleBox)`
}
`;
const OptionsRow = styled.div`
margin-top: -${spacingsPx.sm};
margin-bottom: ${spacingsPx.md};
display: grid;
grid-template-columns: 3fr 2fr;
gap: 20px;
align-items: center;
> div:last-child {
display: flex;
justify-content: flex-end;
}
`;
interface ApiPlaygroundProps {
options: (
| {
@@ -68,10 +83,17 @@ interface ApiPlaygroundProps {
}
export const ApiPlayground = ({ options }: ApiPlaygroundProps) => {
const [selectedOption, setSelectedOption] = useState(0);
const { method } = useSelector(state => ({
method: state.method,
}));
const actions = useActions({
onSetSchema: methodActions.onSetSchema,
onSetMethod: methodActions.onSetMethod,
onSetManualMode: methodActions.onSetManualMode,
});
const { manualMode } = method;
useEffect(() => {
const option = options[selectedOption];
if ('legacyConfig' in option) {
@@ -104,31 +126,31 @@ export const ApiPlayground = ({ options }: ApiPlaygroundProps) => {
isUpwards
data-test="@api-playground/collapsible-box"
>
{options.length >= 5 && (
<div style={{ marginTop: '-12px', marginBottom: '4px' }}>
<Select
label="Select method"
value={{ value: selectedOption, label: options[selectedOption].title }}
onChange={option => setSelectedOption(option.value)}
options={options.map((option, index) => ({
value: index,
label: option.title,
}))}
<OptionsRow>
<div>
{options.length > 1 && (
<Select
label="Select method"
value={{
value: selectedOption,
label: options[selectedOption].title,
}}
onChange={option => setSelectedOption(option.value)}
options={options.map((option, index) => ({
value: index,
label: option.title,
}))}
/>
)}
</div>
<div>
<Switch
label="Manual mode"
isChecked={!!manualMode}
onChange={checked => actions.onSetManualMode(!!checked)}
/>
</div>
)}
{options.length < 5 && options.length > 1 && (
<div style={{ marginTop: '-12px', marginBottom: '4px' }}>
<SelectBar
selectedOption={selectedOption}
onChange={(index: number) => setSelectedOption(index)}
options={options.map((option, index) => ({
value: index,
label: option.title,
}))}
/>
</div>
)}
</OptionsRow>
<Method />
</CollapsibleBoxStyled>
</ApiPlaygroundWrapper>

View File

@@ -0,0 +1,46 @@
import { useMemo, useState } from 'react';
import { json5Schema } from 'codemirror-json-schema/json5';
import CodeMirror from '@uiw/react-codemirror';
import { useTheme } from 'styled-components';
import { TSchema } from '@sinclair/typebox';
interface CodeEditorProps {
code: string;
codeChange: (code: string) => void;
schema?: TSchema;
}
export const CodeEditor = ({ code, codeChange, schema }: CodeEditorProps) => {
const theme = useTheme();
const [codeKey, setCodeKey] = useState(0);
const extensions = useMemo(() => {
setCodeKey(prev => prev + 1);
const patchedSchema = schema ? { ...schema } : { properties: {} };
const inner = (s: any) => {
// Patch Uint type which is not standard JSON Schema
if (s.type === 'Uint') {
s.type = ['number', 'string'];
}
if (s.properties) {
Object.entries(s.properties).forEach(([_, v]) => {
inner(v);
});
}
};
inner(patchedSchema);
return [json5Schema(patchedSchema)];
}, [schema]);
return (
<CodeMirror
key={codeKey}
value={code}
extensions={extensions}
theme={theme.THEME}
onChange={codeChange}
/>
);
};

View File

@@ -1,10 +1,12 @@
/* eslint-disable @typescript-eslint/no-use-before-define */
import { Inspector } from 'react-inspector';
import { useState, useCallback, useEffect } from 'react';
import styled, { useTheme } from 'styled-components';
import { CopyToClipboard } from 'nextra/components';
import { Button, H3 } from '@trezor/components';
import { Button as TrezorButton, H3 } from '@trezor/components';
import { spacingsPx } from '@trezor/theme';
import type { Field, FieldWithBundle, FieldWithUnion } from '../types';
import * as methodActions from '../actions/methodActions';
@@ -19,7 +21,7 @@ import {
UnionWrapper,
File,
} from './fields';
import { Row } from './fields/Row';
import { CodeEditor } from './CodeEditor';
interface Props {
actions: {
@@ -138,19 +140,22 @@ const Container = styled.div`
border-radius: 12px;
width: 100%;
overflow-x: scroll;
padding: 10px;
padding: ${spacingsPx.sm} ${spacingsPx.md};
word-wrap: break-word;
word-break: break-all;
min-height: 150px;
margin-bottom: 10px;
ul,
ol {
list-style: none;
}
`;
const CodeContainer = styled(Container)`
white-space: pre;
pre {
padding: 0;
width: 100%;
overflow-x: scroll;
}
`;
const Heading = styled(H3)`
@@ -183,12 +188,16 @@ const Sticky = styled.div`
width: 100%;
`;
const Button = styled(TrezorButton)`
margin-top: ${spacingsPx.sm};
`;
interface VerifyButtonProps {
onClick: (url: string) => void;
name: string;
}
const VerifyButton = ({ name, onClick }: VerifyButtonProps) => {
export const VerifyButton = ({ name, onClick }: VerifyButtonProps) => {
const signMethods = ['signMessage', 'ethereumSignMessage'];
const verifyUrls = ['/method/verifyMessage', '/method/ethereumVerifyMessage'];
const index = signMethods.indexOf(name);
@@ -210,11 +219,30 @@ export const Method = () => {
onFieldChange: methodActions.onFieldChange,
onFieldDataChange: methodActions.onFieldDataChange,
onSetUnion: methodActions.onSetUnion,
onCodeChange: methodActions.onCodeChange,
});
const { onSubmit, onVerify } = actions;
const { onSubmit } = actions;
const { name, submitButton, fields, javascriptCode, response } = method;
const { name, submitButton, fields, javascriptCode, response, schema, manualMode } = method;
const [code, setCode] = useState('');
const codeChange = useCallback(
(val: string) => {
setCode(val);
actions.onCodeChange(val);
},
[actions],
);
useEffect(() => {
// Don't override code when in manual mode
if (!javascriptCode || manualMode) return;
// Strip the function name and the brackets
const start = javascriptCode.indexOf('(');
const end = javascriptCode.lastIndexOf(')');
const params = javascriptCode.slice(start + 1, end);
setCode(params);
}, [javascriptCode, manualMode]);
if (!name) return null;
@@ -230,33 +258,45 @@ export const Method = () => {
return (
<MethodContent>
<div>
<Heading>Params</Heading>
{getFields(fields, { actions })}
<Row>
<Button onClick={onSubmit} data-test="@submit-button">
{submitButton}
</Button>
{response && response.success && (
<VerifyButton name={name} onClick={onVerify} />
)}
</Row>
{manualMode ? (
<Container>
<Heading>Method with params</Heading>
<CodeEditor {...{ code, codeChange, schema }} />
<CopyWrapper>
<CopyToClipboard getValue={() => javascriptCode ?? ''} />
</CopyWrapper>
<Button onClick={onSubmit} data-test="@submit-button">
{submitButton}
</Button>
</Container>
) : (
getFields(fields, { actions })
)}
</div>
<div>
<Sticky>
<Heading>Response</Heading>
{!manualMode && (
<Container data-test="@code">
<Heading>Method with params</Heading>
<CopyWrapper>
<CopyToClipboard getValue={() => javascriptCode ?? ''} />
</CopyWrapper>
<pre>{javascriptCode}</pre>
<Button onClick={onSubmit} data-test="@submit-button" isFullWidth>
{submitButton}
</Button>
</Container>
)}
<Container data-test="@response">
<Heading>Response</Heading>
<CopyWrapper>
<CopyToClipboard getValue={() => JSON.stringify(response, null, 2)} />
</CopyWrapper>
{json}
{/*response && response.success && (
<VerifyButton name={name} onClick={onVerify} />
)*/}
</Container>
<Heading>Method with params</Heading>
<CodeContainer data-test="@code">
<CopyWrapper>
<CopyToClipboard getValue={() => javascriptCode ?? ''} />
</CopyWrapper>
{javascriptCode}
</CodeContainer>
</Sticky>
</div>
</MethodContent>

View File

@@ -1,4 +1,5 @@
import TrezorConnect from '@trezor/connect-web';
import { TSchema } from '@trezor/schema-utils';
import { setDeepValue } from '@trezor/schema-utils/src/utils';
import { Field, FieldBasic, isFieldBasic } from '../types';
@@ -11,6 +12,8 @@ export interface MethodState {
response?: unknown;
javascriptCode?: string;
addressValidation?: boolean;
schema?: TSchema;
manualMode?: boolean;
}
export const initialState: MethodState = {
@@ -21,6 +24,7 @@ export const initialState: MethodState = {
javascriptCode: undefined,
response: undefined,
addressValidation: false,
manualMode: false,
};
// Converts the fields into a params object
@@ -64,6 +68,20 @@ export const getParam = (field: FieldBasic<any>, $params: Record<string, any> =
} else if (field.type === 'number') {
if (!Number.isNaN(Number.parseInt(field.value, 10))) {
value = Number.parseInt(field.value, 10);
} else if (!field.optional) {
value = 0;
}
} else if (field.type === 'input' || field.type === 'input-long') {
if ((field.value === null || field.value === undefined) && !field.optional) {
value = '';
} else {
value = field.value;
}
} else if (field.type === 'select') {
if ((field.value === null || field.value === undefined) && !field.optional) {
value = field.data ? field.data[0].value : '';
} else {
value = field.value;
}
} else {
value = field.value;

View File

@@ -160,17 +160,18 @@ export const getMethodState = (methodConfig?: Partial<MethodState>) => {
// set default values
state.fields = state.fields.map(f => setAffectedValues(state, prepareBundle(f)));
console.log('state', state);
// set method params
return updateParams(state);
};
// Get method state from TypeBox schema
export const getMethodStateFromSchema = (method: keyof typeof TrezorConnect, schema: TSchema) => {
return getMethodState({
name: method,
fields: schemaToFields(schema),
submitButton: 'Submit',
});
return {
...getMethodState({
name: method,
fields: schemaToFields(schema),
submitButton: 'Submit',
}),
schema,
};
};

View File

@@ -7,6 +7,7 @@ import {
SET_METHOD,
SET_SCHEMA,
SET_UNION,
SET_MANUAL_MODE,
} from '../actions/methodActions';
import { isFieldBasic, type Action, type Field } from '../types';
import {
@@ -135,6 +136,13 @@ export default function method(state: MethodState = initialState, action: Action
tab: 'response',
response: action.response,
};
case SET_MANUAL_MODE:
return {
...state,
manualMode: action.manualMode,
};
default:
return state;
}

View File

@@ -16,3 +16,7 @@ body {
font-family: 'TT Satoshi', sans-serif;
font-size: 16px;
}
.cm-editor.cm-focused {
outline: none;
}

View File

@@ -68,7 +68,7 @@ export interface FieldWithBundle<Value> extends FieldCommon {
export interface FieldWithUnion<Value> extends FieldCommon {
type: 'union';
labels: string[];
options: Batch<Value>[];
options: Field<Value>[][];
current: Field<Value>[];
affect?: undefined;
}

View File

@@ -13,3 +13,19 @@ export function setDeepValue(obj: any, [prop, ...path]: string[], value: any) {
setDeepValue(obj[prop], path, value);
}
}
/**
* Gets a value from an object by a path
* @param obj object to get value from
* @param param path to the value
* @returns value at the path
*/
export function getDeepValue(obj: any, [prop, ...path]: (string | number)[]): any {
if (!path.length) {
return obj[prop];
} else {
if (!(prop in obj)) return undefined;
return getDeepValue(obj[prop], path);
}
}

482
yarn.lock
View File

@@ -1791,6 +1791,15 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:^7.18.6":
version: 7.24.4
resolution: "@babel/runtime@npm:7.24.4"
dependencies:
regenerator-runtime: "npm:^0.14.0"
checksum: 10/8ec8ce2c145bc7e31dd39ab66df124f357f65c11489aefacb30f431bae913b9aaa66aa5efe5321ea2bf8878af3fcee338c87e7599519a952e3a6f83aa1b03308
languageName: node
linkType: hard
"@babel/template@npm:^7.0.0, @babel/template@npm:^7.16.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3":
version: 7.24.0
resolution: "@babel/template@npm:7.24.0"
@@ -1875,6 +1884,153 @@ __metadata:
languageName: node
linkType: hard
"@changesets/changelog-github@npm:^0.4.8":
version: 0.4.8
resolution: "@changesets/changelog-github@npm:0.4.8"
dependencies:
"@changesets/get-github-info": "npm:^0.5.2"
"@changesets/types": "npm:^5.2.1"
dotenv: "npm:^8.1.0"
checksum: 10/a15619c8a30cf07d0f61fbfd76fb52a508172da422238a8d599e4540a6ea9922238d447159675161722a4515877a680fd4f3f4ac65e033f989db8e0786fa5e08
languageName: node
linkType: hard
"@changesets/get-github-info@npm:^0.5.2":
version: 0.5.2
resolution: "@changesets/get-github-info@npm:0.5.2"
dependencies:
dataloader: "npm:^1.4.0"
node-fetch: "npm:^2.5.0"
checksum: 10/d1fb63ff7d9aa6aef91a4d2f3649b984e59687340e49350f8d1870a2fc150eaa1530bd3e5a07992a0cfe2fb57fedd91dd42eae0e4b845c83f5d98abbfc14f155
languageName: node
linkType: hard
"@changesets/types@npm:^5.2.1":
version: 5.2.1
resolution: "@changesets/types@npm:5.2.1"
checksum: 10/0783de5c1544c56c926efdbc1e9f04500e09395156e971e60e8de07a43627328a61d432bade108f15a12cd07776d866cc88fa5c61705dcae8640701327449674
languageName: node
linkType: hard
"@codemirror/autocomplete@npm:^6.0.0":
version: 6.16.0
resolution: "@codemirror/autocomplete@npm:6.16.0"
dependencies:
"@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.17.0"
"@lezer/common": "npm:^1.0.0"
peerDependencies:
"@codemirror/language": ^6.0.0
"@codemirror/state": ^6.0.0
"@codemirror/view": ^6.0.0
"@lezer/common": ^1.0.0
checksum: 10/a29e27f69d17bce014d1d34ab4cd7c607b139cb3cd529aad554f2b0badb9d2924412b0ab3f4eb44901ea4250cdb033e0c6b81134ee8991bdbcd128ecb3b94d75
languageName: node
linkType: hard
"@codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.1.0":
version: 6.5.0
resolution: "@codemirror/commands@npm:6.5.0"
dependencies:
"@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.4.0"
"@codemirror/view": "npm:^6.0.0"
"@lezer/common": "npm:^1.1.0"
checksum: 10/2fa3e42e02e50a02cbf55c48c3f3f7891453c841b6399834a2898f4f3a286074ef13646341a60a89b53bd8372ed5885740ced869b9482e115a73305f792971fe
languageName: node
linkType: hard
"@codemirror/lang-json@npm:^6.0.1":
version: 6.0.1
resolution: "@codemirror/lang-json@npm:6.0.1"
dependencies:
"@codemirror/language": "npm:^6.0.0"
"@lezer/json": "npm:^1.0.0"
checksum: 10/7ce35d345bf9b2f5d96e2502a9693c8b2e74981ccf3a7a20da48e405c2bd6067b39acfd9b31fe3bbb5f9f28ccdde5ff7c52253c6d5b3be84b29df6d5db0b3b9b
languageName: node
linkType: hard
"@codemirror/lang-yaml@npm:^6.0.0":
version: 6.1.1
resolution: "@codemirror/lang-yaml@npm:6.1.1"
dependencies:
"@codemirror/autocomplete": "npm:^6.0.0"
"@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
"@lezer/common": "npm:^1.2.0"
"@lezer/highlight": "npm:^1.2.0"
"@lezer/yaml": "npm:^1.0.0"
checksum: 10/b751727c5fed180e28718a3ec8277835e62e2e760ed18f3a1594062e80b7b241c02aed189d63443e50216db3eb688a3dbe7baa634bdacf3909937fcf341b414b
languageName: node
linkType: hard
"@codemirror/language@npm:^6.0.0":
version: 6.10.1
resolution: "@codemirror/language@npm:6.10.1"
dependencies:
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.23.0"
"@lezer/common": "npm:^1.1.0"
"@lezer/highlight": "npm:^1.0.0"
"@lezer/lr": "npm:^1.0.0"
style-mod: "npm:^4.0.0"
checksum: 10/14bd54aec51a36945e176ebf0e85377be498b69c4056bdca7e2eeedeea1bcc9d644a7c9d55b7340101d6e895bdbef8bc2f3ed17daa4e53a9d1ec13c4be72b0b7
languageName: node
linkType: hard
"@codemirror/lint@npm:^6.0.0":
version: 6.5.0
resolution: "@codemirror/lint@npm:6.5.0"
dependencies:
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0"
crelt: "npm:^1.0.5"
checksum: 10/6e369db9a1e36dbc6e7fcf34ff3f304e9c5cf2acb91f31f317430dc5c6574a7035e75b0f4e67383825ef1a31e3f76fbc202fe022f279f569a67cacf3fa06dda0
languageName: node
linkType: hard
"@codemirror/search@npm:^6.0.0":
version: 6.5.6
resolution: "@codemirror/search@npm:6.5.6"
dependencies:
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0"
crelt: "npm:^1.0.5"
checksum: 10/6668a34b4617e909617d3d831627d74b7a7985e8cd86d396bfcb3e86262f2310fc029fd6c846f1b8f1e6768e75985c9f1b0b18b31e05341f06b5b75c1ffde38d
languageName: node
linkType: hard
"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.4.1":
version: 6.4.1
resolution: "@codemirror/state@npm:6.4.1"
checksum: 10/a9ec56c7d7d52034ce8ebea3a9a4d216b9e972d701b32b5000e56c97790d0d46af129aeba0b80bed36648b4024b3ba3e4910cf5bfed11de4a9e89252e0707a70
languageName: node
linkType: hard
"@codemirror/theme-one-dark@npm:^6.0.0":
version: 6.1.2
resolution: "@codemirror/theme-one-dark@npm:6.1.2"
dependencies:
"@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0"
"@lezer/highlight": "npm:^1.0.0"
checksum: 10/ea4517975b4004bd7d3ef7731a861b59c36d2ddc603d9c4ceca2c5b7637d62a8290f3f9e15004cd0f0e2ea1cc0f6c882a5ad2dd79862a6971b6654325914ccbc
languageName: node
linkType: hard
"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0":
version: 6.26.3
resolution: "@codemirror/view@npm:6.26.3"
dependencies:
"@codemirror/state": "npm:^6.4.0"
style-mod: "npm:^4.1.0"
w3c-keyname: "npm:^2.2.4"
checksum: 10/fa7cb5aa37db2d252ffd7cdbfb858b23a525ce9835648070b3c99eaaa361f686fa1997576bb258b7c34b6d6bd7a251a2294158e952239616102f783da1025fe4
languageName: node
linkType: hard
"@colors/colors@npm:1.5.0":
version: 1.5.0
resolution: "@colors/colors@npm:1.5.0"
@@ -4440,6 +4596,53 @@ __metadata:
languageName: node
linkType: hard
"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.0":
version: 1.2.1
resolution: "@lezer/common@npm:1.2.1"
checksum: 10/b362ed2e97664e4b36b3dbff49b52d1bfc5accc0152b577fefd46e585d012ff685d1fd336d75d80066e01c0505b1135d4cf69be5e330b5bfec2e2650c437bcae
languageName: node
linkType: hard
"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.2.0":
version: 1.2.0
resolution: "@lezer/highlight@npm:1.2.0"
dependencies:
"@lezer/common": "npm:^1.0.0"
checksum: 10/14a80cbfb0cd1ce716decb4f3a045d42e7146f539cfd483b62ce46c4586a26d2f4fbdc35ace1cad81645304be4d30eafb95a2b057c34dfd471d56c7fbd82df3a
languageName: node
linkType: hard
"@lezer/json@npm:^1.0.0":
version: 1.0.2
resolution: "@lezer/json@npm:1.0.2"
dependencies:
"@lezer/common": "npm:^1.2.0"
"@lezer/highlight": "npm:^1.0.0"
"@lezer/lr": "npm:^1.0.0"
checksum: 10/f899d13765d95599c9199fc3404cb57969031dc40ce07de30f4e648979153966581f0bee02e2f8f70463b0a5322206a97c2fe8d5d14f218888c72a6dcedf90ef
languageName: node
linkType: hard
"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.4.0":
version: 1.4.0
resolution: "@lezer/lr@npm:1.4.0"
dependencies:
"@lezer/common": "npm:^1.0.0"
checksum: 10/7391d0d08e54cd9e4f4d46e6ee6aa81fbaf079b22ed9c13d01fc9928e0ffd16d0c2d21b2cedd55675ad6c687277db28349ea8db81c9c69222cd7e7c40edd026e
languageName: node
linkType: hard
"@lezer/yaml@npm:^1.0.0":
version: 1.0.2
resolution: "@lezer/yaml@npm:1.0.2"
dependencies:
"@lezer/common": "npm:^1.2.0"
"@lezer/highlight": "npm:^1.0.0"
"@lezer/lr": "npm:^1.4.0"
checksum: 10/a1859fee1a566602d7f3815620ccad6fedf4964d698111246d346eb6f725d0b8c35c873f89e694a20f4b9d6be695a70d47d103a8cca10e3854626471b85211f1
languageName: node
linkType: hard
"@malept/cross-spawn-promise@npm:^1.1.0":
version: 1.1.1
resolution: "@malept/cross-spawn-promise@npm:1.1.1"
@@ -6779,6 +6982,23 @@ __metadata:
languageName: node
linkType: hard
"@sagold/json-pointer@npm:^5.1.1, @sagold/json-pointer@npm:^5.1.2":
version: 5.1.2
resolution: "@sagold/json-pointer@npm:5.1.2"
checksum: 10/4c173d6cf63932aa6f6ea0b2729ccc1935ff4ff32b6b5df9ee6254ff290fef638dab20bcdb9650e95c7caf13dba7724a1e1ec8d6d23205b5794eb930bdce58d4
languageName: node
linkType: hard
"@sagold/json-query@npm:^6.1.3":
version: 6.2.0
resolution: "@sagold/json-query@npm:6.2.0"
dependencies:
"@sagold/json-pointer": "npm:^5.1.2"
ebnf: "npm:^1.9.1"
checksum: 10/8b0b6b24140fc00c5798710181c48ce858fdc864bf4440f8091f64a45e62bb550fb0153c93793b2ff3f8c1239a3882262b784b429f349ebe12243c4658d117a7
languageName: node
linkType: hard
"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.4":
version: 1.1.5
resolution: "@scure/base@npm:1.1.5"
@@ -10275,6 +10495,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@trezor/connect-explorer-nextra@workspace:packages/connect-explorer-nextra"
dependencies:
"@codemirror/state": "npm:^6.4.1"
"@hbsnow/rehype-sectionize": "npm:^1.0.7"
"@sinclair/typebox": "npm:^0.31.28"
"@trezor/components": "workspace:^"
@@ -10287,11 +10508,15 @@ __metadata:
"@trezor/theme": "workspace:^"
"@trezor/utils": "workspace:^"
"@types/redux-logger": "npm:^3.0.11"
"@uiw/react-codemirror": "npm:^4.21.25"
babel-plugin-styled-components: "npm:^2.1.4"
codemirror-json-schema: "npm:^0.7.0"
codemirror-json5: "npm:^1.0.3"
concurrently: "npm:^8.2.2"
copy-webpack-plugin: "npm:^12.0.2"
eslint-plugin-mdx: "npm:^3.1.5"
html-webpack-plugin: "npm:^5.6.0"
json5: "npm:^2.2.3"
next: "npm:^14.1.1"
next-mdx-remote: "npm:^4.4.1"
next-themes: "npm:^0.2.1"
@@ -13073,6 +13298,51 @@ __metadata:
languageName: node
linkType: hard
"@uiw/codemirror-extensions-basic-setup@npm:4.21.25":
version: 4.21.25
resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.25"
dependencies:
"@codemirror/autocomplete": "npm:^6.0.0"
"@codemirror/commands": "npm:^6.0.0"
"@codemirror/language": "npm:^6.0.0"
"@codemirror/lint": "npm:^6.0.0"
"@codemirror/search": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0"
peerDependencies:
"@codemirror/autocomplete": ">=6.0.0"
"@codemirror/commands": ">=6.0.0"
"@codemirror/language": ">=6.0.0"
"@codemirror/lint": ">=6.0.0"
"@codemirror/search": ">=6.0.0"
"@codemirror/state": ">=6.0.0"
"@codemirror/view": ">=6.0.0"
checksum: 10/56b15f0e602d39b29787a601dad189e37a60a544a587e0b06ea5a817d4fcc30a4a80e1e1c4b4d51eb6ea508595cedf4787acaecf939b712fa957fd612b300fcb
languageName: node
linkType: hard
"@uiw/react-codemirror@npm:^4.21.25":
version: 4.21.25
resolution: "@uiw/react-codemirror@npm:4.21.25"
dependencies:
"@babel/runtime": "npm:^7.18.6"
"@codemirror/commands": "npm:^6.1.0"
"@codemirror/state": "npm:^6.1.1"
"@codemirror/theme-one-dark": "npm:^6.0.0"
"@uiw/codemirror-extensions-basic-setup": "npm:4.21.25"
codemirror: "npm:^6.0.0"
peerDependencies:
"@babel/runtime": ">=7.11.0"
"@codemirror/state": ">=6.0.0"
"@codemirror/theme-one-dark": ">=6.0.0"
"@codemirror/view": ">=6.0.0"
codemirror: ">=6.0.0"
react: ">=16.8.0"
react-dom: ">=16.8.0"
checksum: 10/53847803dc73832d29ca7345ebff8714d57a5c66c13f0c3e1de0a0dd41190a0c85cd2e8583a0baa709e56032422a099d2431649018b7a3d78612256fb4878c25
languageName: node
linkType: hard
"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0":
version: 1.2.0
resolution: "@ungap/structured-clone@npm:1.2.0"
@@ -16458,6 +16728,69 @@ __metadata:
languageName: node
linkType: hard
"codemirror-json-schema@npm:^0.7.0":
version: 0.7.0
resolution: "codemirror-json-schema@npm:0.7.0"
dependencies:
"@changesets/changelog-github": "npm:^0.4.8"
"@codemirror/lang-json": "npm:^6.0.1"
"@codemirror/lang-yaml": "npm:^6.0.0"
"@sagold/json-pointer": "npm:^5.1.1"
"@types/json-schema": "npm:^7.0.12"
"@types/node": "npm:^20.4.2"
codemirror-json5: "npm:^1.0.3"
json-schema: "npm:^0.4.0"
json-schema-library: "npm:^9.1.2"
json5: "npm:^2.2.3"
markdown-it: "npm:^14.0.0"
yaml: "npm:^2.3.4"
peerDependencies:
"@codemirror/language": ^6.8.0
"@codemirror/lint": ^6.4.0
"@codemirror/state": ^6.2.1
"@codemirror/view": ^6.14.1
"@lezer/common": ^1.0.3
dependenciesMeta:
"@codemirror/lang-json":
optional: true
codemirror-json5:
optional: true
json5:
optional: true
checksum: 10/6d08d626a9b37064f1188cf3370778a5038964c8abd37828ceaf2bd40c2a134ce9fe5536afe09fd0a79ea8070e5f7719a620d2aeadb578540c0c187525a2486b
languageName: node
linkType: hard
"codemirror-json5@npm:^1.0.3":
version: 1.0.3
resolution: "codemirror-json5@npm:1.0.3"
dependencies:
"@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0"
"@lezer/common": "npm:^1.0.0"
"@lezer/highlight": "npm:^1.0.0"
json5: "npm:^2.2.1"
lezer-json5: "npm:^2.0.2"
checksum: 10/1f54faf87feddc645c6ba57b19e30d269477f1e73bbe6c09f8ff34d9c6b895fe6bb8c6ad40f5f8dd54a83293dfae51d5ade524e80b1d4186497a200483d45f7e
languageName: node
linkType: hard
"codemirror@npm:^6.0.0":
version: 6.0.1
resolution: "codemirror@npm:6.0.1"
dependencies:
"@codemirror/autocomplete": "npm:^6.0.0"
"@codemirror/commands": "npm:^6.0.0"
"@codemirror/language": "npm:^6.0.0"
"@codemirror/lint": "npm:^6.0.0"
"@codemirror/search": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0"
checksum: 10/4f858cde1cf8ce4670de9df4a64f4990bb8abdb8e13d3e437f278c40c86d841ef505aa1e5dc798582109ceaac8577a3bb4a1f026c0e5ce730465c89652ee6036
languageName: node
linkType: hard
"collect-v8-coverage@npm:^1.0.0":
version: 1.0.1
resolution: "collect-v8-coverage@npm:1.0.1"
@@ -16610,7 +16943,7 @@ __metadata:
languageName: node
linkType: hard
"commander@npm:^2.20.0, commander@npm:^2.20.3":
"commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.20.3":
version: 2.20.3
resolution: "commander@npm:2.20.3"
checksum: 10/90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b
@@ -17175,6 +17508,13 @@ __metadata:
languageName: node
linkType: hard
"crelt@npm:^1.0.5":
version: 1.0.6
resolution: "crelt@npm:1.0.6"
checksum: 10/5ed326ca6bd243b1dba6b943f665b21c2c04be03271824bc48f20dba324b0f8233e221f8c67312526d24af2b1243c023dc05a41bd8bd05d1a479fd2c72fb39c3
languageName: node
linkType: hard
"cross-fetch@npm:^3.1.5":
version: 3.1.6
resolution: "cross-fetch@npm:3.1.6"
@@ -18113,6 +18453,13 @@ __metadata:
languageName: node
linkType: hard
"dataloader@npm:^1.4.0":
version: 1.4.0
resolution: "dataloader@npm:1.4.0"
checksum: 10/8dc2181f7fc243f657aa97b5aa51b9e0da88dee9a59a689bab50d4bac826c27ae0457db8d9a5d59559d636f6b997f419303ccfde595cc26191f37ab9c792fe01
languageName: node
linkType: hard
"date-fns@npm:^2.16.1, date-fns@npm:^2.30.0":
version: 2.30.0
resolution: "date-fns@npm:2.30.0"
@@ -18321,7 +18668,7 @@ __metadata:
languageName: node
linkType: hard
"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.0":
"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.0, deepmerge@npm:^4.3.1":
version: 4.3.1
resolution: "deepmerge@npm:4.3.1"
checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529
@@ -18740,6 +19087,13 @@ __metadata:
languageName: node
linkType: hard
"discontinuous-range@npm:1.0.0":
version: 1.0.0
resolution: "discontinuous-range@npm:1.0.0"
checksum: 10/3c1716c6f107e80082600ac57648b49baa9aa60f71a442dadbaf66179610e239ed95ba96ff6080bc7845ea027ffe9176e22e94a04ff275a7dd5c30e2aece4cba
languageName: node
linkType: hard
"dlv@npm:^1.1.0, dlv@npm:^1.1.3":
version: 1.1.3
resolution: "dlv@npm:1.1.3"
@@ -19003,6 +19357,13 @@ __metadata:
languageName: node
linkType: hard
"dotenv@npm:^8.1.0":
version: 8.6.0
resolution: "dotenv@npm:8.6.0"
checksum: 10/31d7b5c010cebb80046ba6853d703f9573369b00b15129536494f04b0af4ea0060ce8646e3af58b455af2f6f1237879dd261a5831656410ec92561ae1ea44508
languageName: node
linkType: hard
"dotenv@npm:^9.0.2":
version: 9.0.2
resolution: "dotenv@npm:9.0.2"
@@ -19087,6 +19448,15 @@ __metadata:
languageName: node
linkType: hard
"ebnf@npm:^1.9.1":
version: 1.9.1
resolution: "ebnf@npm:1.9.1"
bin:
ebnf: dist/bin.js
checksum: 10/d23fff8d070b6f5a70cf64d7a84a0b8d6cdaaa85599fa401be2036acc47612626ed997a1106399d85d57888769db446dc330b3c8f7bdc255ec5836df19826425
languageName: node
linkType: hard
"ecc-jsbn@npm:~0.1.1":
version: 0.1.2
resolution: "ecc-jsbn@npm:0.1.2"
@@ -21300,6 +21670,13 @@ __metadata:
languageName: node
linkType: hard
"fast-copy@npm:^3.0.2":
version: 3.0.2
resolution: "fast-copy@npm:3.0.2"
checksum: 10/97e1022e2aaa27acf4a986d679310bfd66bfb87fe8da9dd33b698e3e50189484001cf1eeb9670e19b59d9d299828ed86c8da354c954f125995ab2a6331c5f290
languageName: node
linkType: hard
"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
version: 3.1.3
resolution: "fast-deep-equal@npm:3.1.3"
@@ -26148,6 +26525,21 @@ __metadata:
languageName: node
linkType: hard
"json-schema-library@npm:^9.1.2":
version: 9.3.4
resolution: "json-schema-library@npm:9.3.4"
dependencies:
"@sagold/json-pointer": "npm:^5.1.2"
"@sagold/json-query": "npm:^6.1.3"
deepmerge: "npm:^4.3.1"
fast-copy: "npm:^3.0.2"
fast-deep-equal: "npm:^3.1.3"
smtp-address-parser: "npm:1.0.10"
valid-url: "npm:^1.0.9"
checksum: 10/630234abd17b1709ff7d73a1e65159549ef48102885a67b04f24e6be2a54f0393aab4ab1e49a752c272c9c4554997658146e9d591f9b832b5558fd79065b48d5
languageName: node
linkType: hard
"json-schema-to-typescript@npm:^13.1.2":
version: 13.1.2
resolution: "json-schema-to-typescript@npm:13.1.2"
@@ -26193,7 +26585,7 @@ __metadata:
languageName: node
linkType: hard
"json-schema@npm:0.4.0":
"json-schema@npm:0.4.0, json-schema@npm:^0.4.0":
version: 0.4.0
resolution: "json-schema@npm:0.4.0"
checksum: 10/8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458
@@ -26817,6 +27209,15 @@ __metadata:
languageName: node
linkType: hard
"lezer-json5@npm:^2.0.2":
version: 2.0.2
resolution: "lezer-json5@npm:2.0.2"
dependencies:
"@lezer/lr": "npm:^1.0.0"
checksum: 10/3bef420796ab503451c0d9f7b661f5fd22254791f186c1e2b8b0aebca04252c35b9c6fec437847791825708c0f5b7d11c4c938102002341e3dc533bcffc9ad5d
languageName: node
linkType: hard
"libsodium-wrappers@npm:^0.7.6":
version: 0.7.13
resolution: "libsodium-wrappers@npm:0.7.13"
@@ -29866,6 +30267,13 @@ __metadata:
languageName: node
linkType: hard
"moo@npm:^0.5.0":
version: 0.5.2
resolution: "moo@npm:0.5.2"
checksum: 10/fee356cb13b52e259c925fe297d71b3f47b98b06444b696dd4870d20cad4711eb58d24131afeba9bf7a51d77c77a3cbe8479066497d12a88abb51865c1be7de7
languageName: node
linkType: hard
"mri@npm:^1.1.0, mri@npm:^1.2.0":
version: 1.2.0
resolution: "mri@npm:1.2.0"
@@ -30100,6 +30508,23 @@ __metadata:
languageName: node
linkType: hard
"nearley@npm:^2.20.1":
version: 2.20.1
resolution: "nearley@npm:2.20.1"
dependencies:
commander: "npm:^2.19.0"
moo: "npm:^0.5.0"
railroad-diagrams: "npm:^1.0.0"
randexp: "npm:0.4.6"
bin:
nearley-railroad: bin/nearley-railroad.js
nearley-test: bin/nearley-test.js
nearley-unparse: bin/nearley-unparse.js
nearleyc: bin/nearleyc.js
checksum: 10/b327a07d0fee967ec2b74205fee97c3ff13aeb6c91342443e5f0f00ed11e3fb8ce7e71e21de6a74f094206ebdb571e93c79a58f1fe5414714c97b0e55cd57cb2
languageName: node
linkType: hard
"negotiator@npm:0.6.3, negotiator@npm:^0.6.3":
version: 0.6.3
resolution: "negotiator@npm:0.6.3"
@@ -30462,7 +30887,7 @@ __metadata:
languageName: node
linkType: hard
"node-fetch@npm:^2.0.0, node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0":
"node-fetch@npm:^2.0.0, node-fetch@npm:^2.2.0, node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0":
version: 2.7.0
resolution: "node-fetch@npm:2.7.0"
dependencies:
@@ -33188,6 +33613,13 @@ __metadata:
languageName: node
linkType: hard
"railroad-diagrams@npm:^1.0.0":
version: 1.0.0
resolution: "railroad-diagrams@npm:1.0.0"
checksum: 10/5349cf7a27f28c2cd152b525964624e0d0a795ab062d01682084381570fbb07ab877035771bcfb27cd5b6a7ee9f8371ecc34ccc8c3bde3443676230a59a7a85e
languageName: node
linkType: hard
"ramda@npm:0.29.0":
version: 0.29.0
resolution: "ramda@npm:0.29.0"
@@ -33195,6 +33627,16 @@ __metadata:
languageName: node
linkType: hard
"randexp@npm:0.4.6":
version: 0.4.6
resolution: "randexp@npm:0.4.6"
dependencies:
discontinuous-range: "npm:1.0.0"
ret: "npm:~0.1.10"
checksum: 10/ae6d213ec8018b2d22960d2b73ee7a4e25f85050a11dc485b6d3a06ace318ca567353b1d75d8d11f529b7ed6bdeb52644b789307ef42812bf5da2ade4f85e113
languageName: node
linkType: hard
"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0":
version: 2.1.0
resolution: "randombytes@npm:2.1.0"
@@ -34959,6 +35401,13 @@ __metadata:
languageName: node
linkType: hard
"ret@npm:~0.1.10":
version: 0.1.15
resolution: "ret@npm:0.1.15"
checksum: 10/07c9e7619b4c86053fa57689bf7606b5a40fc1231fc87682424d0b3e296641cc19c218c3b8a8917305fbcca3bfc43038a5b6a63f54755c1bbca2f91857253b03
languageName: node
linkType: hard
"retry@npm:^0.12.0":
version: 0.12.0
resolution: "retry@npm:0.12.0"
@@ -36033,6 +36482,15 @@ __metadata:
languageName: node
linkType: hard
"smtp-address-parser@npm:1.0.10":
version: 1.0.10
resolution: "smtp-address-parser@npm:1.0.10"
dependencies:
nearley: "npm:^2.20.1"
checksum: 10/73d49712450ccd2b77ec3642e26f73fb7b3ed5b46c416d60714e2b9821e3378c3cf6b44767371d8be42286cfeae63e4c369384ef5bb3eeb42568264cbb330626
languageName: node
linkType: hard
"socket.io-adapter@npm:~2.4.0":
version: 2.4.0
resolution: "socket.io-adapter@npm:2.4.0"
@@ -36914,6 +37372,13 @@ __metadata:
languageName: node
linkType: hard
"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0":
version: 4.1.2
resolution: "style-mod@npm:4.1.2"
checksum: 10/9da37909d6dbc3c043ab6d18da5d997073a4698c91e86058293252493eb18aca4e44e3fb18f32fcee26dcee8785f393c6c95f3c96cc722a0dd6b8de622b5b293
languageName: node
linkType: hard
"style-to-object@npm:^0.4.0, style-to-object@npm:^0.4.1":
version: 0.4.4
resolution: "style-to-object@npm:0.4.4"
@@ -39333,7 +39798,7 @@ __metadata:
languageName: node
linkType: hard
"valid-url@npm:~1.0.9":
"valid-url@npm:^1.0.9, valid-url@npm:~1.0.9":
version: 1.0.9
resolution: "valid-url@npm:1.0.9"
checksum: 10/343dfaf85eb3691dc8eb93f7bc007be1ee6091e6c6d1a68bf633cb85e4bf2930e34ca9214fb2c3330de5b652510b257a8ee1ff0a0a37df0925e9dabf93ee512d
@@ -39783,6 +40248,13 @@ __metadata:
languageName: node
linkType: hard
"w3c-keyname@npm:^2.2.4":
version: 2.2.8
resolution: "w3c-keyname@npm:2.2.8"
checksum: 10/95bafa4c04fa2f685a86ca1000069c1ec43ace1f8776c10f226a73296caeddd83f893db885c2c220ebeb6c52d424e3b54d7c0c1e963bbf204038ff1a944fbb07
languageName: node
linkType: hard
"w3c-xmlserializer@npm:^4.0.0":
version: 4.0.0
resolution: "w3c-xmlserializer@npm:4.0.0"