feat(connect-explorer-nextra): params table for viewing schemas

This commit is contained in:
Tomas Martykan
2024-03-06 16:09:28 +01:00
committed by Tomáš Martykán
parent 5bba66069d
commit 2ed3a5b366
12 changed files with 3968 additions and 3185 deletions

View File

@@ -1,9 +1,10 @@
{
"name": "connect-explorer-nextra",
"name": "@trezor/connect-explorer-nextra",
"packageManager": "yarn@4.0.2",
"version": "1.0.0",
"private": true,
"dependencies": {
"@sinclair/typebox": "^0.32.15",
"@trezor/components": "workspace:^",
"@trezor/connect-web": "workspace:^",
"@trezor/protobuf": "workspace:^",

View File

@@ -1,5 +1,7 @@
import { ApiPlayground } from '../../src/components/ApiPlayground';
import { Param } from '../../src/components/Param';
import { ParamsTable } from '../../src/components/ParamsTable';
import { GetPublicKey } from '@trezor/connect/src/types/api/getPublicKey';
<ApiPlayground method="/method/getPublicKey" />
@@ -20,42 +22,11 @@ const result = await TrezorConnect.getPublicKey(params);
#### Exporting single public key
<Param name="path" required type="string | Array<number>">
minimum length is `1`. [read more](../path.md)
</Param>
<Param name="coin" type="string">
determines network definition specified in
[coins.json](https://github.com/trezor/trezor-suite/blob/develop/packages/connect-common/files/coins.json)
file. Coin `shortcut`, `name` or `label` can be used. If `coin` is not set API will try to get
network definition from `path`.
</Param>
<Param name="scriptType" type="string">
used to distinguish between various address formats (non-segwit, segwit, etc.).
</Param>
<Param name="ignoreXpubMagic" type="boolean">
ignore SLIP-0132 XPUB magic, use xpub/tpub prefix for all account types.
</Param>
<Param name="ecdsaCurveName" type="string">
ECDSA curve name to use
</Param>
<Param name="crossChain" type="boolean">
Advanced feature. Use it only if you are know what you are doing. Allows to generate address
between chains. For example Bitcoin path on Litecoin network will display cross chain address in
Litecoin format.
</Param>
<Param
name="unlockPath"
type="[PROTO.UnlockPath](https://github.com/trezor/trezor-suite/blob/develop/packages/protobuf/src/messages.ts)"
>
the result of [TrezorConnect.unlockPath](./unlockPath.md) method.
</Param>
<Param name="suppressBackupWarning" type="boolean">
By default, this method will emit an event to show a warning if the wallet does not have a
backup. This option suppresses the message.
</Param>
<ParamsTable schema={GetPublicKey} />
#### Exporting bundle of public keys
<Param name="bundle" type="`Array` of Objects with `path`, `coin` and `crossChain` fields" />
<Param name="bundle" type="`Array` of Objects with above schema" />
---

View File

@@ -0,0 +1,6 @@
import { ParamsTable } from '../src/components/ParamsTable';
import { MessageType } from '@trezor/protobuf/src/messages-schema';
## Whole Protobuf schema
<ParamsTable schema={MessageType} />

View File

@@ -59,11 +59,8 @@ export const Param = (props: ParamProps) => {
props.type
)}
</ParamType>
{props.required ? (
<Badge variant="primary">Required</Badge>
) : (
<Badge variant="tertiary">Optional</Badge>
)}
{props.required === true && <Badge variant="primary">Required</Badge>}
{props.required === false && <Badge variant="tertiary">Optional</Badge>}
</ParamRow>
{props.description && (
<ParamDescription>

View File

@@ -0,0 +1,115 @@
import React from 'react';
import { Kind, OptionalKind, TIntersect, TObject, TSchema } from '@sinclair/typebox';
import { Param } from './Param';
type ParamsTableProps = {
schema: TObject | TIntersect | TSchema;
};
const descriptionDictionary: Record<string, string> = {
path: 'Derivation path',
showOnTrezor: 'Display the result on the Trezor device. Default is false',
chunkify: 'Display the result in chunks for better readability. Default is false',
suppressBackupWarning:
'By default, this method will emit an event to show a warning if the wallet does not have a backup. This option suppresses the message.',
coin: 'determines network definition specified in coins.json file. Coin shortcut, name or label can be used. If coin is not set API will try to get network definition from path.',
crossChain:
'Advanced feature. Use it only if you are know what you are doing. Allows to generate address between chains. For example Bitcoin path on Litecoin network will display cross chain address in Litecoin format.',
unlockPath: 'the result of TrezorConnect.unlockPath method',
ecdsaCurveName: 'ECDSA curve name to use',
ignoreXpubMagic: 'ignore SLIP-0132 XPUB magic, use xpub/tpub prefix for all account types.',
scriptType: 'used to distinguish between various address formats (non-segwit, segwit, etc.).',
};
const getTypeName = (value: TSchema, hasDescendants?: boolean) => {
let typeName = value[Kind];
if (value[Kind] === 'Array') {
typeName = `Array<${getTypeName(value.items)}>`;
} else if (value[Kind] === 'Literal') {
if (typeof value.const === 'number') {
typeName = value.const.toString();
} else {
typeName = JSON.stringify(value.const);
}
} else if (value[Kind] === 'Union' && !hasDescendants) {
const itemsFiltered = value.anyOf?.filter((v, i) => {
// Filter union number indexes - unnecessary to display
if (v[Kind] === 'Literal' && (v.const === i || v.const === i.toString())) {
return false;
}
return true;
});
typeName = itemsFiltered?.map(v => getTypeName(v)).join(' | ');
} else if (value[Kind] === 'Intersect' && !hasDescendants) {
typeName = value.anyOf?.map(v => getTypeName(v)).join(' & ');
} else if (value[Kind] === 'Object' && value.$id) {
typeName = value.$id;
}
return typeName;
};
interface SingleParamProps {
name: string;
value: TSchema;
schema?: TSchema;
}
const SingleParam = ({ name, value, schema }: SingleParamProps) => {
// Show descendants for complex objects
const complexObjects = ['Object', 'Union', 'Intersect'];
let hasDescendants = complexObjects.includes(value[Kind]);
if (value[Kind] === 'Union') {
hasDescendants = value.anyOf.some(v => complexObjects.includes(v[Kind]));
} else if (value[Kind] === 'Array') {
hasDescendants = complexObjects.includes(value.items[Kind]);
}
// Get the type name
const typeName = getTypeName(value, hasDescendants);
// Required can also be undefined (for example union)
let isRequired: boolean | undefined;
if (schema?.required?.includes(name)) isRequired = true;
else if (value[OptionalKind] === 'Optional') isRequired = false;
return (
<>
<Param
key={name}
name={name}
type={typeName}
required={isRequired}
description={value.description ?? descriptionDictionary[name]}
/>
{hasDescendants && (
<div style={{ marginLeft: 30 }}>
{/* eslint-disable-next-line @typescript-eslint/no-use-before-define */}
<ParamsTable schema={value} />
</div>
)}
</>
);
};
export const ParamsTable = ({ schema }: ParamsTableProps) => {
if (schema[Kind] === 'Union') {
return schema.anyOf?.map((param, i) => (
<>
{i > 0 && <h3>or</h3>}
<ParamsTable key={i} schema={param} />
</>
));
} else if (schema[Kind] === 'Intersect') {
return schema.allOf?.map((param, i) => <ParamsTable key={i} schema={param} />);
} else if (schema[Kind] === 'Object') {
return Object.entries(schema.properties)?.map(([name, value]: [string, any]) => (
<SingleParam name={name} value={value} schema={schema} key={name} />
));
} else if (schema[Kind] === 'Array') {
return <SingleParam name="" value={schema.items} />;
} else {
return <SingleParam name="" value={schema} />;
}
};

View File

@@ -6,7 +6,12 @@ export type GetPublicKey = Static<typeof GetPublicKey>;
export const GetPublicKey = Type.Intersect([
GetPublicKeyShared,
Type.Object({
coin: Type.Optional(Type.String()),
coin: Type.Optional(
Type.String({
description:
'determines network definition specified in coins.json file. Coin shortcut, name or label can be used. If coin is not set API will try to get network definition from path.',
}),
),
crossChain: Type.Optional(Type.Boolean()),
scriptType: Type.Optional(PROTO.InternalInputScriptType),
ignoreXpubMagic: Type.Optional(Type.Boolean()),

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1987,12 +1987,6 @@ export type NEMDecryptedMessage = {
payload: string;
};
// experimental_message
export type experimental_message = {};
// experimental_field
export type experimental_field = {};
// RippleGetAddress
export type RippleGetAddress = {
address_n: number[];
@@ -2394,6 +2388,12 @@ export type TezosSignedTx = {
operation_hash: string;
};
// experimental_message
export type experimental_message = {};
// experimental_field
export type experimental_field = {};
// custom connect definitions
export type MessageType = {
BinanceGetAddress: BinanceGetAddress;
@@ -2620,8 +2620,6 @@ export type MessageType = {
NEMSignedTx: NEMSignedTx;
NEMDecryptMessage: NEMDecryptMessage;
NEMDecryptedMessage: NEMDecryptedMessage;
experimental_message: experimental_message;
experimental_field: experimental_field;
RippleGetAddress: RippleGetAddress;
RippleAddress: RippleAddress;
RipplePayment: RipplePayment;
@@ -2670,6 +2668,8 @@ export type MessageType = {
TezosBallotOp: TezosBallotOp;
TezosSignTx: TezosSignTx;
TezosSignedTx: TezosSignedTx;
experimental_message: experimental_message;
experimental_field: experimental_field;
};
export type MessageKey = keyof MessageType;

View File

@@ -21,6 +21,7 @@ export function generate(code: string) {
// Run generator
let output = Codegen.TypeScriptToTypeBox.Generate(customTypePlaceholder + code, {
useTypeBoxImport: false,
useIdentifiers: true,
});
// Remove placeholder declarations of custom types
const lastKey = Object.keys(customTypesMapping)[Object.keys(customTypesMapping).length - 1];
@@ -47,12 +48,12 @@ export function generate(code: string) {
);
output = output.replace(new RegExp(`enum Enum${e} \\{`, 'g'), `enum ${e} {`);
output = output.replace(
new RegExp(`Type\\.KeyOf\\(Enum${e}\\)`, 'g'),
`Type.KeyOfEnum(${e})`,
new RegExp(`Type\\.KeyOf\\(Enum${e}(,?.*)\\)`, 'g'),
`Type.KeyOfEnum(${e}$1)`,
);
});
// Add import of lib
output = `import { Type, Static } from '@trezor/schema-utils';\n\n${output}`;
output = `import { Type, Static, TypeClone } from '@trezor/schema-utils';\n\n${output}`;
// Add eslint ignore for camelcase, since some type names use underscores
output = `/* eslint-disable camelcase */\n${output}`;
// Add types for message schema

View File

@@ -1,5 +1,13 @@
/* eslint-disable @typescript-eslint/no-use-before-define */
import { JavaScriptTypeBuilder, Static, TSchema, TObject, Optional, Kind } from '@sinclair/typebox';
import {
JavaScriptTypeBuilder,
Static,
TSchema,
TObject,
Optional,
Kind,
TypeClone,
} from '@sinclair/typebox';
import { ValueErrorType, Errors, ValueError } from '@sinclair/typebox/errors';
import { Mixin } from 'ts-mixer';
@@ -111,5 +119,5 @@ export function AssertWeak<T extends TSchema>(
}
export const Type = new CustomTypeBuilder();
export { Optional };
export { Optional, TypeClone };
export type { Static, TObject, TSchema };

204
yarn.lock
View File

@@ -1775,16 +1775,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.4, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
version: 7.23.9
resolution: "@babel/runtime@npm:7.23.9"
dependencies:
regenerator-runtime: "npm:^0.14.0"
checksum: 9a520fe1bf72249f7dd60ff726434251858de15cccfca7aa831bd19d0d3fb17702e116ead82724659b8da3844977e5e13de2bae01eb8a798f2823a669f122be6
languageName: node
linkType: hard
"@babel/runtime@npm:^7.23.8":
"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.4, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
version: 7.24.0
resolution: "@babel/runtime@npm:7.24.0"
dependencies:
@@ -5305,20 +5296,13 @@ __metadata:
languageName: node
linkType: hard
"@popperjs/core@npm:^2.11.8":
"@popperjs/core@npm:^2.11.8, @popperjs/core@npm:^2.9.0":
version: 2.11.8
resolution: "@popperjs/core@npm:2.11.8"
checksum: ddd16090cde777aaf102940f05d0274602079a95ad9805bd20bc55dcc7c3a2ba1b99dd5c73e5cc2753c3d31250ca52a67d58059459d7d27debb983a9f552936c
languageName: node
linkType: hard
"@popperjs/core@npm:^2.9.0":
version: 2.11.6
resolution: "@popperjs/core@npm:2.11.6"
checksum: 37f5b021d993ae5ad3c3913d6d9b1ab506912b91756ba3ca87bcc0e727b9fd9e1f4c6cf2675aac608aa856c7c5475842df4240770052d6104967c5c6473da7b9
languageName: node
linkType: hard
"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/aspromise@npm:1.1.2"
@@ -7178,6 +7162,13 @@ __metadata:
languageName: node
linkType: hard
"@sinclair/typebox@npm:^0.32.15":
version: 0.32.15
resolution: "@sinclair/typebox@npm:0.32.15"
checksum: 94994d0ab8440387c189d565ad0179ff5ca8ce6b232e941db4505298bc250326ee3fe27c02c5a2d8ad76fb9b163017d1d753cb6f86c6caa295c52ae50b92dd31
languageName: node
linkType: hard
"@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.6.0":
version: 4.6.0
resolution: "@sindresorhus/is@npm:4.6.0"
@@ -10008,6 +9999,34 @@ __metadata:
languageName: unknown
linkType: soft
"@trezor/connect-explorer-nextra@workspace:packages/connect-explorer-nextra":
version: 0.0.0-use.local
resolution: "@trezor/connect-explorer-nextra@workspace:packages/connect-explorer-nextra"
dependencies:
"@sinclair/typebox": "npm:^0.32.15"
"@trezor/components": "workspace:^"
"@trezor/connect-web": "workspace:^"
"@trezor/protobuf": "workspace:^"
"@trezor/utils": "workspace:^"
"@types/node": "npm:20.11.24"
"@types/redux-logger": "npm:^3.0.11"
autoprefixer: "npm:^10.4.18"
next: "npm:^14.1.1"
nextra: "npm:^2.13.4"
nextra-theme-docs: "npm:^2.13.4"
postcss: "npm:^8.4.35"
react: "npm:^18.2.0"
react-dom: "npm:^18.2.0"
react-inspector: "npm:^6.0.2"
react-markdown: "npm:^9.0.1"
react-redux: "npm:8.0.7"
redux: "npm:^4.2.1"
redux-logger: "npm:^3.0.6"
redux-thunk: "npm:^2.4.2"
styled-components: "npm:^5.3.10"
languageName: unknown
linkType: soft
"@trezor/connect-explorer-webextension@workspace:packages/connect-explorer-webextension":
version: 0.0.0-use.local
resolution: "@trezor/connect-explorer-webextension@workspace:packages/connect-explorer-webextension"
@@ -11305,16 +11324,7 @@ __metadata:
languageName: node
linkType: hard
"@types/d3-scale@npm:^4.0.2":
version: 4.0.3
resolution: "@types/d3-scale@npm:4.0.3"
dependencies:
"@types/d3-time": "npm:*"
checksum: 294e2fc71cab2d3b800c8fc1a5e1aa2cd7e6215b72d22b16240411330c6907f5e092e7924e0df5726bec89192f467b26448cded41ecdd68536bbbc54e93e53a8
languageName: node
linkType: hard
"@types/d3-scale@npm:^4.0.3":
"@types/d3-scale@npm:^4.0.2, @types/d3-scale@npm:^4.0.3":
version: 4.0.8
resolution: "@types/d3-scale@npm:4.0.8"
dependencies:
@@ -12185,18 +12195,7 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:18.2.55":
version: 18.2.55
resolution: "@types/react@npm:18.2.55"
dependencies:
"@types/prop-types": "npm:*"
"@types/scheduler": "npm:*"
csstype: "npm:^3.0.2"
checksum: bf8fe19e73575489e63c0726355f164157cd69e75f2a862436ad2c0586e732cb953a7255a6bc73145e8f9506ee7a723f9a569ca9a39c53984e5b12b84e1c718a
languageName: node
linkType: hard
"@types/react@npm:>=16":
"@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16":
version: 18.2.61
resolution: "@types/react@npm:18.2.61"
dependencies:
@@ -12207,6 +12206,17 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:18.2.55":
version: 18.2.55
resolution: "@types/react@npm:18.2.55"
dependencies:
"@types/prop-types": "npm:*"
"@types/scheduler": "npm:*"
csstype: "npm:^3.0.2"
checksum: bf8fe19e73575489e63c0726355f164157cd69e75f2a862436ad2c0586e732cb953a7255a6bc73145e8f9506ee7a723f9a569ca9a39c53984e5b12b84e1c718a
languageName: node
linkType: hard
"@types/redux-logger@npm:^3.0.11":
version: 3.0.11
resolution: "@types/redux-logger@npm:3.0.11"
@@ -13892,25 +13902,7 @@ __metadata:
languageName: node
linkType: hard
"autoprefixer@npm:^10.4.17":
version: 10.4.17
resolution: "autoprefixer@npm:10.4.17"
dependencies:
browserslist: "npm:^4.22.2"
caniuse-lite: "npm:^1.0.30001578"
fraction.js: "npm:^4.3.7"
normalize-range: "npm:^0.1.2"
picocolors: "npm:^1.0.0"
postcss-value-parser: "npm:^4.2.0"
peerDependencies:
postcss: ^8.1.0
bin:
autoprefixer: bin/autoprefixer
checksum: ac4416e72643bf92c2a346af5a6a437eb39e3b852e5d48e1a0a3204a81cbf8eecc5489a9386cf63a288b7183fae3ad52cf3c24c458d7cbb5463e55e21dc7e6ed
languageName: node
linkType: hard
"autoprefixer@npm:^10.4.18":
"autoprefixer@npm:^10.4.17, autoprefixer@npm:^10.4.18":
version: 10.4.18
resolution: "autoprefixer@npm:10.4.18"
dependencies:
@@ -14845,21 +14837,7 @@ __metadata:
languageName: node
linkType: hard
"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.22.2":
version: 4.22.2
resolution: "browserslist@npm:4.22.2"
dependencies:
caniuse-lite: "npm:^1.0.30001565"
electron-to-chromium: "npm:^1.4.601"
node-releases: "npm:^2.0.14"
update-browserslist-db: "npm:^1.0.13"
bin:
browserslist: cli.js
checksum: e3590793db7f66ad3a50817e7b7f195ce61e029bd7187200244db664bfbe0ac832f784e4f6b9c958aef8ea4abe001ae7880b7522682df521f4bc0a5b67660b5e
languageName: node
linkType: hard
"browserslist@npm:^4.23.0":
"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0":
version: 4.23.0
resolution: "browserslist@npm:4.23.0"
dependencies:
@@ -15338,14 +15316,7 @@ __metadata:
languageName: node
linkType: hard
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001565, caniuse-lite@npm:^1.0.30001578":
version: 1.0.30001583
resolution: "caniuse-lite@npm:1.0.30001583"
checksum: 8e7b5ffeb1229efacc1022fbe19eb136f39e4512363322d175e836fef9d798d7308a0763ce654670d45a55c3f25f34c12f87e90e1da34c5d9531fac2327d2063
languageName: node
linkType: hard
"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591":
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591":
version: 1.0.30001593
resolution: "caniuse-lite@npm:1.0.30001593"
checksum: c179af389ca40b254939308099b9e8681d1ca1ad535e48a3e3035880e97fe2cca147e3481ca821112c11a8cde534d090daf5a3b072d73db9e9360c136bf84e55
@@ -16240,33 +16211,6 @@ __metadata:
languageName: unknown
linkType: soft
"connect-explorer-nextra@workspace:packages/connect-explorer-nextra":
version: 0.0.0-use.local
resolution: "connect-explorer-nextra@workspace:packages/connect-explorer-nextra"
dependencies:
"@trezor/components": "workspace:^"
"@trezor/connect-web": "workspace:^"
"@trezor/protobuf": "workspace:^"
"@trezor/utils": "workspace:^"
"@types/node": "npm:20.11.24"
"@types/redux-logger": "npm:^3.0.11"
autoprefixer: "npm:^10.4.18"
next: "npm:^14.1.1"
nextra: "npm:^2.13.4"
nextra-theme-docs: "npm:^2.13.4"
postcss: "npm:^8.4.35"
react: "npm:^18.2.0"
react-dom: "npm:^18.2.0"
react-inspector: "npm:^6.0.2"
react-markdown: "npm:^9.0.1"
react-redux: "npm:8.0.7"
redux: "npm:^4.2.1"
redux-logger: "npm:^3.0.6"
redux-thunk: "npm:^2.4.2"
styled-components: "npm:^5.3.10"
languageName: unknown
linkType: soft
"connect-history-api-fallback@npm:^1.5.0":
version: 1.6.0
resolution: "connect-history-api-fallback@npm:1.6.0"
@@ -17102,16 +17046,7 @@ __metadata:
languageName: node
linkType: hard
"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:^3.1.6":
version: 3.2.2
resolution: "d3-array@npm:3.2.2"
dependencies:
internmap: "npm:1 - 2"
checksum: e940c7b77e5fbb8520a3b914b8121e668d12b58f1fbd15be83d819802b73da43540422fe66d17feec04e3280255b3aa5fac452f12b7f37f2378531a8bbb233bc
languageName: node
linkType: hard
"d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.2.0":
"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.1.6, d3-array@npm:^3.2.0":
version: 3.2.4
resolution: "d3-array@npm:3.2.4"
dependencies:
@@ -18496,13 +18431,6 @@ __metadata:
languageName: node
linkType: hard
"electron-to-chromium@npm:^1.4.601":
version: 1.4.611
resolution: "electron-to-chromium@npm:1.4.611"
checksum: fb19491f64fe6ae9fe232129de66f6be2d9d4d0c052a3285ece1d95c8a4fa63b953d2fb659982d93824c3fc5dc34b15be46cd276ec82bd6c9cd16ceab41c161d
languageName: node
linkType: hard
"electron-to-chromium@npm:^1.4.668":
version: 1.4.690
resolution: "electron-to-chromium@npm:1.4.690"
@@ -30753,18 +30681,7 @@ __metadata:
languageName: node
linkType: hard
"postcss@npm:^8.4.33, postcss@npm:~8.4.32":
version: 8.4.34
resolution: "postcss@npm:8.4.34"
dependencies:
nanoid: "npm:^3.3.7"
picocolors: "npm:^1.0.0"
source-map-js: "npm:^1.0.2"
checksum: ff4769ff6910f688b0672e0a8f83d1d0a9fee3f61aa33b61b6ade0d5dc2ef53ce1a80d78e2eab03f2d40a15e04bc028682857a4f15d31501d63c80473dee2981
languageName: node
linkType: hard
"postcss@npm:^8.4.35":
"postcss@npm:^8.4.33, postcss@npm:^8.4.35, postcss@npm:~8.4.32":
version: 8.4.35
resolution: "postcss@npm:8.4.35"
dependencies:
@@ -34924,16 +34841,7 @@ __metadata:
languageName: node
linkType: hard
"style-to-object@npm:^0.4.0":
version: 0.4.1
resolution: "style-to-object@npm:0.4.1"
dependencies:
inline-style-parser: "npm:0.1.1"
checksum: aa597acebfa44b8468d486385fc63007d49cb1da2b2ffe5d54021bccf2d47e2f5d18ff499dcb8f028087fc1a4ac86556bebf768ac91137d43ecbb47b8470410a
languageName: node
linkType: hard
"style-to-object@npm:^0.4.1":
"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"
dependencies: