From 248e6d7d6ba676eb9775e80aa78f2043c93cf6ef Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Thu, 1 Jun 2023 12:34:35 -0400 Subject: [PATCH 01/20] feat: Stream blocks while executing (#87) --- .../src/components/Editor/BlockPicker.jsx | 79 +++++++++--- frontend/src/components/Editor/Editor.js | 35 +++++- .../src/components/Editor/EditorButtons.jsx | 4 + frontend/src/utils/fetchBlock.js | 23 ++-- frontend/src/utils/indexerRunner.js | 117 ++++++++++-------- 5 files changed, 181 insertions(+), 77 deletions(-) diff --git a/frontend/src/components/Editor/BlockPicker.jsx b/frontend/src/components/Editor/BlockPicker.jsx index fcc78f918..ae3cde453 100644 --- a/frontend/src/components/Editor/BlockPicker.jsx +++ b/frontend/src/components/Editor/BlockPicker.jsx @@ -6,15 +6,19 @@ import { Badge, InputGroup, FormControl, + Dropdown, + ButtonGroup, } from "react-bootstrap"; -import { Play, Plus } from "react-bootstrap-icons"; +import { Play, Plus, Stop } from "react-bootstrap-icons"; export const BlockPicker = ({ heights = [], setHeights, executeIndexerFunction, latestHeight, + isExecuting, + stopExecution, }) => { const [inputValue, setInputValue] = useState(String(latestHeight)); @@ -37,24 +41,71 @@ export const BlockPicker = ({ value={inputValue} onChange={(e) => setInputValue(e.target.value)} /> - - Stop Indexer Execution} + > + + + } + {!isExecuting && (<> Test Indexer Function In Browser} + overlay={Add Block To Debug List} > - + + + { + (() => { + if (heights.length > 0) { + return "Test Indexer Function With Debug List" + } else if (inputValue) { + return "Test Indexer Function With Specific Block" + } else { + return "Follow the Tip of the Network" + } + })() + } + } + > + + + + + + executeIndexerFunction("latest")}>Follow The Network + executeIndexerFunction("debugList")}>Execute From Debug List + + + ) + } + + - + ); }; diff --git a/frontend/src/components/Editor/Editor.js b/frontend/src/components/Editor/Editor.js index c55c1d371..62d10c5ba 100644 --- a/frontend/src/components/Editor/Editor.js +++ b/frontend/src/components/Editor/Editor.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useCallback } from "react"; +import React, { useEffect, useState, useCallback, useMemo } from "react"; import { formatSQL, formatIndexingCode, @@ -16,6 +16,7 @@ import { ResetChangesModal } from "../Modals/resetChanges"; import { FileSwitcher } from "./FileSwitcher"; import EditorButtons from "./EditorButtons"; import { PublishModal } from "../Modals/PublishModal"; +import {getLatestBlockHeight} from "../../utils/getLatestBlockHeight"; const BLOCKHEIGHT_LIMIT = 3600; const contractRegex = RegExp( @@ -46,7 +47,7 @@ const Editor = ({ } }; - const indexerRunner = new IndexerRunner(handleLog); + const indexerRunner = useMemo(() => new IndexerRunner(handleLog), []); const [indexingCode, setIndexingCode] = useState(defaultCode); const [schema, setSchema] = useState(defaultSchema); @@ -59,6 +60,12 @@ const Editor = ({ const [isContractFilterValid, setIsContractFilterValid] = useState(true); const [contractFilter, setContractFilter] = useState("social.near"); const { height, selectedTab, currentUserAccountId } = useInitialPayload(); + const [isExecutingIndexerFunction, setIsExecutingIndexerFunction] = useState(false) + + const requestLatestBlockHeight = async () => { + const blockHeight = getLatestBlockHeight() + return blockHeight + } const handleOptionChange = (event) => { setSelectedOption(event.target.value); @@ -301,8 +308,26 @@ const Editor = ({ } } - async function executeIndexerFunction() { - await indexerRunner.executeIndexerFunction(heights,indexingCode) + async function executeIndexerFunction(option = "latest", startingBlockHeight = null) { + setIsExecutingIndexerFunction(() => true) + + switch (option) { + case "debugList": + await indexerRunner.executeIndexerFunctionOnHeights(heights, indexingCode, option) + break + case "specific": + if (startingBlockHeight === null && Number(startingBlockHeight) === 0) { + console.log("Invalid Starting Block Height: starting block height is null or 0") + break + } + + await indexerRunner.start(startingBlockHeight, indexingCode, option) + break + case "latest": + const latestHeight = await requestLatestBlockHeight() + if (latestHeight) await indexerRunner.start(latestHeight - 10, indexingCode, option) + } + setIsExecutingIndexerFunction(() => false) } return ( @@ -331,6 +356,8 @@ const Editor = ({ debugMode={debugMode} heights={heights} setHeights={setHeights} + isExecuting={isExecutingIndexerFunction} + stopExecution={() => indexerRunner.stop()} contractFilter={contractFilter} handleSetContractFilter={handleSetContractFilter} isContractFilterValid={isContractFilterValid} diff --git a/frontend/src/components/Editor/EditorButtons.jsx b/frontend/src/components/Editor/EditorButtons.jsx index 11066d3fc..d0a315fa5 100644 --- a/frontend/src/components/Editor/EditorButtons.jsx +++ b/frontend/src/components/Editor/EditorButtons.jsx @@ -37,6 +37,8 @@ const EditorButtons = ({ getActionButtonText, submit, debugMode, + isExecuting, + stopExecution, heights, setHeights, setShowPublishModal, @@ -104,6 +106,8 @@ const EditorButtons = ({ setHeights={setHeights} executeIndexerFunction={executeIndexerFunction} latestHeight={latestHeight} + isExecuting={isExecuting} + stopExecution={stopExecution} /> )} diff --git a/frontend/src/utils/fetchBlock.js b/frontend/src/utils/fetchBlock.js index f773c109a..70654f4a9 100644 --- a/frontend/src/utils/fetchBlock.js +++ b/frontend/src/utils/fetchBlock.js @@ -1,14 +1,19 @@ const BLOCK_FETCHER_API = "https://70jshyr5cb.execute-api.eu-central-1.amazonaws.com/block/"; +const GENESIS_BLOCK_HEIGHT = 52945886; export async function fetchBlockDetails(blockHeight) { - try { - const response = await fetch( - `${BLOCK_FETCHER_API}${String(blockHeight)}` - ); - const block_details = await response.json(); - return block_details; - } catch { - console.log(`Error Fetching Block Height details at ${blockHeight}`); - } + if (blockHeight <= GENESIS_BLOCK_HEIGHT) { + throw new Error(`Block Height must be greater than genesis block height #${GENESIS_BLOCK_HEIGHT}`); } + try { + const response = await fetch( + `${BLOCK_FETCHER_API}${String(blockHeight)}` + ); + const block_details = await response.json(); + return block_details; + } catch { + // console.log(`Error Fetching Block Height details at ${blockHeight}`); + throw new Error(`Error Fetching Block Height details at BlockHeight #${blockHeight}`); + } +} diff --git a/frontend/src/utils/indexerRunner.js b/frontend/src/utils/indexerRunner.js index 4007d56f5..123226bbb 100644 --- a/frontend/src/utils/indexerRunner.js +++ b/frontend/src/utils/indexerRunner.js @@ -1,29 +1,86 @@ import { Block } from "@near-lake/primitives"; import { Buffer } from "buffer"; -import {fetchBlockDetails} from "./fetchBlock"; +import { fetchBlockDetails } from "./fetchBlock"; global.Buffer = Buffer; export default class IndexerRunner { constructor(handleLog) { this.handleLog = handleLog; + this.currentHeight = 0; + this.shouldStop = false; } - async executeIndexerFunction(heights, indexingCode) { + async start(startingHeight, indexingCode, option) { + this.currentHeight = startingHeight; + this.shouldStop = false; console.clear() console.group('%c Welcome! Lets test your indexing logic on some Near Blocks!', 'color: white; background-color: navy; padding: 5px;'); - if(heights.length === 0) { + if (option == "specific" && !Number(startingHeight)) { + console.log("No Start Block Height Provided to Stream Blocks From") + this.stop() + console.groupEnd() + return + } + console.log(`Streaming Blocks Starting from ${option} Block #${this.currentHeight}`) + while (!this.shouldStop) { + console.group(`Block Height #${this.currentHeight}`) + let blockDetails; + try { + blockDetails = await fetchBlockDetails(this.currentHeight); + } catch (error) { + console.log(error) + this.stop() + } + if (blockDetails) { + await this.executeIndexerFunction(this.currentHeight, blockDetails, indexingCode); + this.currentHeight++; + await this.delay(1000); + } + console.groupEnd() + + } + } + + stop() { + this.shouldStop = true; + console.log("%c Stopping Block Processing", 'color: white; background-color: red; padding: 5px;') + } + + delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + async executeIndexerFunction(height, blockDetails, indexingCode) { + let innerCode = indexingCode.match(/getBlock\s*\([^)]*\)\s*{([\s\S]*)}/)[1]; + if (blockDetails) { + const block = Block.fromStreamerMessage(blockDetails); + block.actions() + block.receipts() + block.events() + + console.log(block) + await this.runFunction(blockDetails, height, innerCode); + } + } + + async executeIndexerFunctionOnHeights(heights, indexingCode) { + console.clear() + console.group('%c Welcome! Lets test your indexing logic on some Near Blocks!', 'color: white; background-color: navy; padding: 5px;'); + if (heights.length === 0) { console.warn("No Block Heights Selected") + return } console.log("Note: GraphQL Mutations & Queries will not be executed on your database. They will simply return an empty object. Please keep this in mind as this may cause unintended behavior of your indexer function.") - let innerCode = indexingCode.match(/getBlock\s*\([^)]*\)\s*{([\s\S]*)}/)[1]; - // for loop with await for await (const height of heights) { console.group(`Block Height #${height}`) - const block_details = await fetchBlockDetails(height); - console.time('Indexing Execution Complete') - if (block_details) { - await this.runFunction(block_details, height, innerCode); + let blockDetails; + try { + blockDetails = await fetchBlockDetails(height); + } catch (error) { + console.log(error) } + console.time('Indexing Execution Complete') + this.executeIndexerFunction(height, blockDetails, indexingCode) console.timeEnd('Indexing Execution Complete') console.groupEnd() } @@ -56,7 +113,7 @@ export default class IndexerRunner { "", () => { console.group(`Setting Key/Value`); - console.log({key: value}); + console.log({[key]: value}); console.groupEnd(); } ); @@ -92,7 +149,6 @@ export default class IndexerRunner { }, }; - // Call the wrapped function, passing the imported Block and streamerMessage wrappedFunction(Block, streamerMessage, context); } @@ -117,45 +173,6 @@ export default class IndexerRunner { ); } - // async runGraphQLQuery( - // operation, - // variables, - // function_name, - // block_height, - // hasuraRoleName, - // logError = true - // ) { - // const response = await this.deps.fetch( - // `${process.env.HASURA_ENDPOINT}/v1/graphql`, - // { - // method: "POST", - // headers: { - // "Content-Type": "application/json", - // ...(hasuraRoleName && { "X-Hasura-Role": hasuraRoleName }), - // }, - // body: JSON.stringify({ - // query: operation, - // ...(variables && { variables }), - // }), - // } - // ); - // - // const { data, errors } = await response.json(); - // - // if (response.status !== 200 || errors) { - // if (logError) { - // } - // throw new Error( - // `Failed to write graphql, http status: ${ - // response.status - // }, errors: ${JSON.stringify(errors, null, 2)}` - // ); - // } - // - // return data; - // } - // - renameUnderscoreFieldsToCamelCase(value) { if (value && typeof value === "object" && !Array.isArray(value)) { // It's a non-null, non-array object, create a replacement with the keys initially-capped From 360c4d1849a3ddfa1347ccad5dfb776c000517b9 Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Fri, 2 Jun 2023 08:58:29 +1200 Subject: [PATCH 02/20] ci: Fix rust CI check workflow --- .github/workflows/ci.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 107bcab6f..299eea0ae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,8 +3,12 @@ name: Rust on: push: branches: [ main ] + paths: + - "indexer/**" pull_request: - branches: [ main, staging, production ] + branches: [ main, stable ] + paths: + - "indexer/**" env: CARGO_TERM_COLOR: always @@ -17,6 +21,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Run check + working-directory: ./indexer run: cargo check rustfmt: @@ -33,7 +38,7 @@ jobs: profile: minimal components: rustfmt - name: Check formatting - - working-directory: ./indexer + working-directory: ./indexer run: | cargo fmt -- --check @@ -51,6 +56,6 @@ jobs: profile: minimal components: clippy - name: Clippy check - - working-directory: ./indexer + working-directory: ./indexer run: | cargo clippy From cf8274c9a22a2e30280aeda765ff539cdb9ae705 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Fri, 2 Jun 2023 09:21:22 -0400 Subject: [PATCH 03/20] [DPLT-1019] feat: store debug list in LocalStorage (#90) --- frontend/src/components/Editor/Editor.js | 7 ++++++- frontend/src/pages/_app.tsx | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Editor/Editor.js b/frontend/src/components/Editor/Editor.js index 62d10c5ba..6aba22c91 100644 --- a/frontend/src/components/Editor/Editor.js +++ b/frontend/src/components/Editor/Editor.js @@ -30,6 +30,7 @@ const Editor = ({ onLoadErrorText, actionButtonText, }) => { + const DEBUG_LIST_STORAGE_KEY = `QueryAPI:debugList:${accountId}#${indexerName}` const [error, setError] = useState(undefined); const [blockHeightError, setBlockHeightError] = useState(undefined); const [showResetCodeModel, setShowResetCodeModel] = useState(false); @@ -37,7 +38,7 @@ const Editor = ({ const [originalSQLCode, setOriginalSQLCode] = useState(defaultSchema); const [originalIndexingCode, setOriginalIndexingCode] = useState(defaultCode); const [debugMode, setDebugMode] = useState(false); - const [heights, setHeights] = useState([]); + const [heights, setHeights] = useState(localStorage.getItem(DEBUG_LIST_STORAGE_KEY) || []); const [showPublishModal, setShowPublishModal] = useState(false); const [debugModeInfoDisabled, setDebugModeInfoDisabled] = useState(false); const handleLog = (blockHeight, log, callback) => { @@ -78,6 +79,10 @@ const Editor = ({ } }, [selectedTab]); + useEffect(() => { + localStorage.setItem(DEBUG_LIST_STORAGE_KEY, heights); + }, [heights]); + useEffect(() => { if (selectedOption == "latestBlockHeight") { setBlockHeightError(null); diff --git a/frontend/src/pages/_app.tsx b/frontend/src/pages/_app.tsx index 39d9f9f81..7a86eecbe 100644 --- a/frontend/src/pages/_app.tsx +++ b/frontend/src/pages/_app.tsx @@ -10,7 +10,7 @@ overrideLocalStorage(); export default function App({ Component, pageProps }: AppProps) { return ( - }> + }> ); From 45633badf7b322aa5c295bb72f8629c8b000cdd0 Mon Sep 17 00:00:00 2001 From: Gabe Hamilton Date: Fri, 2 Jun 2023 11:44:29 -0600 Subject: [PATCH 04/20] DPLT-929 historical filtering (#81) Co-authored-by: Morgan McCauley --- .../__snapshots__/indexer.test.js.snap | 10 +- .../indexer.integration.test.js | 78 +-- indexer-js-queue-handler/indexer.js | 29 +- indexer-js-queue-handler/serverless.yml | 2 + indexer/Cargo.lock | 13 +- indexer/indexer_rules_engine/src/lib.rs | 19 + .../src/outcomes_reducer_sync.rs | 113 ++++ .../src/types/indexer_rule_match.rs | 10 + indexer/queryapi_coordinator/Cargo.toml | 1 + .../src/historical_block_processing.rs | 518 ++++++++++++++++++ .../src/indexer_registry.rs | 179 ++---- indexer/queryapi_coordinator/src/main.rs | 1 + indexer/queryapi_coordinator/src/opts.rs | 1 - 13 files changed, 760 insertions(+), 214 deletions(-) create mode 100644 indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs create mode 100644 indexer/queryapi_coordinator/src/historical_block_processing.rs diff --git a/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap b/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap index 1e7174761..03ace3e00 100644 --- a/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap +++ b/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap @@ -5,7 +5,7 @@ exports[`Indexer unit tests Indexer.runFunctions() allows imperative execution o [ "mock-hasura-endpoint/v1/graphql", { - "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":82699904,"message":"Running function:buildnear.testnet/test"}}", + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":82699904,"message":"Running function:buildnear.testnet/test:, lag in ms is: :NaN"}}", "headers": { "Content-Type": "application/json", "X-Hasura-Role": "append", @@ -65,7 +65,7 @@ exports[`Indexer unit tests Indexer.runFunctions() catches errors 1`] = ` [ "mock-hasura-endpoint/v1/graphql", { - "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":456,"message":"Running function:buildnear.testnet/test"}}", + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":456,"message":"Running function:buildnear.testnet/test:, lag in ms is: :NaN"}}", "headers": { "Content-Type": "application/json", "X-Hasura-Role": "append", @@ -114,7 +114,7 @@ exports[`Indexer unit tests Indexer.runFunctions() logs provisioning failures 1` [ "mock-hasura-endpoint/v1/graphql", { - "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"morgs.near/test","block_height":82699904,"message":"Running function:morgs.near/test"}}", + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"morgs.near/test","block_height":82699904,"message":"Running function:morgs.near/test:, lag in ms is: :NaN"}}", "headers": { "Content-Type": "application/json", "X-Hasura-Role": "append", @@ -174,7 +174,7 @@ exports[`Indexer unit tests Indexer.runFunctions() should execute all functions [ "mock-hasura-endpoint/v1/graphql", { - "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":456,"message":"Running function:buildnear.testnet/test"}}", + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":456,"message":"Running function:buildnear.testnet/test:, lag in ms is: :NaN"}}", "headers": { "Content-Type": "application/json", "X-Hasura-Role": "append", @@ -223,7 +223,7 @@ exports[`Indexer unit tests Indexer.runFunctions() supplies the required role to [ "mock-hasura-endpoint/v1/graphql", { - "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"morgs.near/test","block_height":82699904,"message":"Running function:morgs.near/test"}}", + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"morgs.near/test","block_height":82699904,"message":"Running function:morgs.near/test:, lag in ms is: :NaN"}}", "headers": { "Content-Type": "application/json", "X-Hasura-Role": "append", diff --git a/indexer-js-queue-handler/indexer.integration.test.js b/indexer-js-queue-handler/indexer.integration.test.js index fa4bb199a..248d33c84 100644 --- a/indexer-js-queue-handler/indexer.integration.test.js +++ b/indexer-js-queue-handler/indexer.integration.test.js @@ -1,26 +1,46 @@ import Indexer from './indexer'; - -/** These tests require the following Environment Variables to be set: GRAPHQL_ENDPOINT */ +import fetch from 'node-fetch'; + +const mockAwsXray = { + resolveSegment: () => ({ + addError: () => {}, + close: () => {}, + addAnnotation: () => {}, + addNewSubsegment: () => ({ + addAnnotation: () => {}, + close: () => {} + }), + }), + getSegment: () => ({ + addAnnotation: () => {}, + addNewSubsegment: () => ({ + addAnnotation: () => {}, + close: () => {} + }), + }), +}; + +/** These tests require the following Environment Variables to be set: HASURA_ENDPOINT, HASURA_ADMIN_SECRET */ describe('Indexer integration tests', () => { test('Indexer.runFunctions() should execute an imperative style test function against a given block using key-value storage', async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { fetch: fetch, awsXray: mockAwsXray }); const functions = {}; - functions['buildnear.testnet/itest1'] = {code: 'context.set("BlockHeight", block.header().height);', schema: 'create table indexer_storage (function_name text, key_name text, value text, primary key (function_name, key_name));'}; + functions['buildnear.testnet/itest1'] = {provisioned: false, code: 'context.set("BlockHeight", block.header().height);', schema: 'create table indexer_storage (function_name text, key_name text, value text, primary key (function_name, key_name));'}; const block_height = 85376002; const r = await indexer.runFunctions(block_height, functions, {imperative: true, provision: true}); const valueSet = await indexer.runGraphQLQuery('query MyQuery {\n' + - ' indexer_storage(\n' + + ' buildnear_testnet_itest1_indexer_storage(\n' + ' where: {key_name: {_eq: "BlockHeight"}, function_name: {_eq: "buildnear.testnet/itest1"}}\n' + ' ) {\n' + ' value\n' + ' }\n' + - '}', {}, 'buildnear.testnet/itest5', '1234', 'append'); - expect(valueSet.indexer_storage[0].value).toEqual("85376002"); + '}', {}, 'buildnear.testnet/itest1', '85376002', 'buildnear_testnet'); + expect(valueSet.buildnear_testnet_itest1_indexer_storage[0].value).toEqual("85376002"); }, 30000); test('Indexer.runFunctions() should execute a test function against a given block using key-value storage', async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest1'] = {code: 'context.set("BlockHeight", block.header().height);'}; const block_height = 85376546; @@ -31,7 +51,7 @@ describe('Indexer integration tests', () => { }, 30000); test('Indexer.runFunctions() should execute a test function against a given block using a full mutation to write to key-value storage', async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest1'] = {code: 'context.graphql(`mutation { insert_buildnear_testnet_itest1_indexer_storage_one(object: {function_name: "buildnear.testnet/itest3", key_name: "BlockHeight", value: "${block.header().height}"} on_conflict: {constraint: indexer_storage_pkey, update_columns: value}) {key_name}}`);'}; const block_height = 85376546; @@ -45,7 +65,7 @@ describe('Indexer integration tests', () => { * due to known Hasura issues with unique indexes vs unique constraints */ test('Indexer.runFunctions() should execute a near social function against a given block', async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/test'] = {code: @@ -106,14 +126,15 @@ describe('Indexer integration tests', () => { /** Note that the on_conflict block in the mutation is for test repeatability. * The comments table has had its unique index dropped and replaced with a unique constraint * due to known Hasura issues with unique indexes vs unique constraints */ - test('Indexer.runFunctions() should execute an imperative style near social function against a given block', async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + // needs update to have schema + test.skip('Indexer.runFunctions() should execute an imperative style near social function against a given block', async () => { + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest5'] = {code:` const { posts } = await context.graphql(\` query { - posts(where: { id: { _eq: 2 } }) { + buildnear_testnet_itest5_posts(where: { id: { _eq: 2 } }) { id } } @@ -125,9 +146,9 @@ describe('Indexer integration tests', () => { const [post] = posts; - const { insert_comments: { returning: { id } } } = await context.graphql(\` + const { insert_buildnear_testnet_itest5_comments: { returning: { id } } } = await context.graphql(\` mutation { - insert_comments( + insert_buildnear_testnet_itest5_comments( objects: { account_id: "buildnear.testnet", content: "cool post", post_id: \${post.id}, block_height: \${block.blockHeight}, block_timestamp: \${block.blockHeight}, receipt_id: "12345" } @@ -146,7 +167,7 @@ describe('Indexer integration tests', () => { const block_height = 85376002; await indexer.runFunctions(block_height, functions, {imperative: true}); const valueSet = await indexer.runGraphQLQuery('query MyQuery {\n' + - ' comments(where: {account_id: {_eq: "buildnear.testnet"}}) {\n' + + ' buildnear_testnet_itest5_comments(where: {account_id: {_eq: "buildnear.testnet"}}) {\n' + ' id\n' + ' post_id\n' + ' }\n' + @@ -155,28 +176,22 @@ describe('Indexer integration tests', () => { }); test("writeLog() should write a log to the database", async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const id = await indexer.writeLog("buildnear.testnet/itest", 85376002, "test message"); expect(id).toBeDefined(); expect(id.length).toBe(36); }); - test("fetchIndexerFunctions() should fetch the indexer functions from the database", async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); - const functions = await indexer.fetchIndexerFunctions(); - console.log(functions); - expect(functions).toBeDefined(); - expect(Object.keys(functions).length).toBeGreaterThan(0); - }); - test("writeFunctionState should write a function state to the database", async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const result = await indexer.writeFunctionState("buildnear.testnet/itest8", 85376002); expect(result).toBeDefined(); expect(result.insert_indexer_state.returning[0].current_block_height).toBe(85376002); }); - test("function that throws an error should catch the error", async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + + // Errors are now exposed to the lambda hander. This test will be relevant again if this changes. + test.skip ("function that throws an error should catch the error", async () => { + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/test'] = {code:` @@ -188,8 +203,9 @@ describe('Indexer integration tests', () => { // no error thrown is success }); - test("rejected graphql promise is awaited and caught", async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + // Errors are now exposed to the lambda hander. This test will be relevant again if this changes. + test.skip("rejected graphql promise is awaited and caught", async () => { + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest3'] = {code: @@ -203,7 +219,7 @@ describe('Indexer integration tests', () => { // Unreturned promise rejection seems to be uncatchable even with process.on('unhandledRejection' // However, the next function is run (in this test but not on Lambda). test.skip("function that rejects a promise should catch the error", async () => { - const indexer = new Indexer('mainnet', 'us-west-2'); + const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/fails'] = {code:` diff --git a/indexer-js-queue-handler/indexer.js b/indexer-js-queue-handler/indexer.js index e2b84d5d8..9869f76a5 100644 --- a/indexer-js-queue-handler/indexer.js +++ b/indexer-js-queue-handler/indexer.js @@ -31,16 +31,17 @@ export default class Indexer { async runFunctions(block_height, functions, options = { imperative: false, provision: false }) { const blockWithHelpers = Block.fromStreamerMessage(await this.fetchStreamerMessage(block_height)); + let lag = Date.now() - Math.floor(blockWithHelpers.header.timestamp_nanosec / 1000000); const simultaneousPromises = []; const allMutations = []; for (const function_name in functions) { try { const indexerFunction = functions[function_name]; - console.log('Running function', function_name); // Lambda logs + console.log('Running function', function_name, ', lag in ms is: ', lag); // Lambda logs const segment = this.deps.awsXray.getSegment(); // segment is immutable, subsegments are mutable const functionSubsegment = segment.addNewSubsegment('indexer_function'); functionSubsegment.addAnnotation('indexer_function', function_name); - simultaneousPromises.push(this.writeLog(function_name, block_height, 'Running function', function_name)); + simultaneousPromises.push(this.writeLog(function_name, block_height, 'Running function', function_name, ', lag in ms is: ', lag)); const hasuraRoleName = function_name.split('/')[0].replace(/[.-]/g, '_'); const functionNameWithoutAccount = function_name.split('/')[1].replace(/[.-]/g, '_'); @@ -140,30 +141,6 @@ export default class Indexer { } } - // deprecated - async fetchIndexerFunctions() { - const connectionConfig = { - networkId: "mainnet", - // keyStore: myKeyStore, // no keystore needed for reads - nodeUrl: "https://rpc.mainnet.near.org", - walletUrl: "https://wallet.mainnet.near.org", - helperUrl: "https://helper.mainnet.near.org", - explorerUrl: "https://explorer.mainnet.near.org", - }; - const near = await connect(connectionConfig); - const response = await near.connection.provider.query({ - request_type: "call_function", - finality: "optimistic", - account_id: "registry.queryapi.near", - method_name: "list_indexer_functions", - args_base64: "", - }); - - const stringResult = Buffer.from(response.result).toString(); - const functions = JSON.parse(stringResult); - return functions; - } - // pad with 0s to 12 digits normalizeBlockHeight(block_height) { return block_height.toString().padStart(12, '0'); diff --git a/indexer-js-queue-handler/serverless.yml b/indexer-js-queue-handler/serverless.yml index 216583ffa..bd6dd2a12 100644 --- a/indexer-js-queue-handler/serverless.yml +++ b/indexer-js-queue-handler/serverless.yml @@ -15,6 +15,7 @@ provider: lambda: true #enable X-Ray tracing # cfnRole: arn:aws:iam::754641474505:role/queryapi-cloudformation +# See https://github.com/getlift/lift/blob/master/docs/queue.md for configuration of SQS constructs constructs: indexer-runner: type: queue @@ -25,6 +26,7 @@ constructs: startFromBlock-runner: type: queue fifo: true + # batchSize: 100 worker: handler: handler.consumer timeout: 15 # 1.5 minutes as lift multiplies this value by 6 (https://github.com/getlift/lift/blob/master/docs/queue.md#retry-delay) diff --git a/indexer/Cargo.lock b/indexer/Cargo.lock index b0e37ad68..3e7e2bfb7 100644 --- a/indexer/Cargo.lock +++ b/indexer/Cargo.lock @@ -275,6 +275,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -1088,13 +1094,13 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", - "num-integer", "num-traits", "serde", "time 0.1.45", @@ -3351,6 +3357,7 @@ dependencies = [ "base64 0.13.1", "borsh 0.10.3", "cached", + "chrono", "clap", "dotenv", "futures", diff --git a/indexer/indexer_rules_engine/src/lib.rs b/indexer/indexer_rules_engine/src/lib.rs index 1f2587ee5..1e694d3c3 100644 --- a/indexer/indexer_rules_engine/src/lib.rs +++ b/indexer/indexer_rules_engine/src/lib.rs @@ -1,5 +1,6 @@ pub mod matcher; pub mod outcomes_reducer; +mod outcomes_reducer_sync; pub mod types; use indexer_rule_type::indexer_rule::{IndexerRule, MatchingRule}; @@ -24,3 +25,21 @@ pub async fn reduce_indexer_rule_matches( } }) } + +pub fn reduce_indexer_rule_matches_sync( + indexer_rule: &IndexerRule, + streamer_message: &StreamerMessage, + chain_id: ChainId, +) -> anyhow::Result> { + Ok(match &indexer_rule.matching_rule { + MatchingRule::ActionAny { .. } + | MatchingRule::ActionFunctionCall { .. } + | MatchingRule::Event { .. } => { + outcomes_reducer_sync::reduce_indexer_rule_matches_from_outcomes( + indexer_rule, + streamer_message, + chain_id, + )? + } + }) +} diff --git a/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs b/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs new file mode 100644 index 000000000..f1ab03994 --- /dev/null +++ b/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs @@ -0,0 +1,113 @@ +use crate::matcher; +use crate::types::events::Event; +use crate::types::indexer_rule_match::{ChainId, IndexerRuleMatch, IndexerRuleMatchPayload}; +use indexer_rule_type::indexer_rule::{IndexerRule, MatchingRule}; +use near_lake_framework::near_indexer_primitives::{ + IndexerExecutionOutcomeWithReceipt, StreamerMessage, +}; + +pub fn reduce_indexer_rule_matches_from_outcomes( + indexer_rule: &IndexerRule, + streamer_message: &StreamerMessage, + chain_id: ChainId, +) -> anyhow::Result> { + streamer_message + .shards + .iter() + .flat_map(|shard| { + shard + .receipt_execution_outcomes + .iter() + .filter(|receipt_execution_outcome| { + matcher::matches(&indexer_rule.matching_rule, receipt_execution_outcome) + }) + }) + .map(|receipt_execution_outcome| { + build_indexer_rule_match( + indexer_rule, + receipt_execution_outcome, + streamer_message.block.header.hash.to_string(), + streamer_message.block.header.height, + chain_id.clone(), + ) + }) + .collect() +} + +fn build_indexer_rule_match( + indexer_rule: &IndexerRule, + receipt_execution_outcome: &IndexerExecutionOutcomeWithReceipt, + block_header_hash: String, + block_height: u64, + chain_id: ChainId, +) -> anyhow::Result { + Ok(IndexerRuleMatch { + chain_id: chain_id.clone(), + indexer_rule_id: indexer_rule.id, + indexer_rule_name: indexer_rule.name.clone(), + payload: build_indexer_rule_match_payload( + indexer_rule, + receipt_execution_outcome, + block_header_hash, + ), + block_height, + }) +} + +fn build_indexer_rule_match_payload( + indexer_rule: &IndexerRule, + receipt_execution_outcome: &IndexerExecutionOutcomeWithReceipt, + block_header_hash: String, +) -> IndexerRuleMatchPayload { + // future enhancement will extract and enrich fields from block & context as + // specified in the indexer function config. + let transaction_hash = None; + + match &indexer_rule.matching_rule { + MatchingRule::ActionAny { .. } | MatchingRule::ActionFunctionCall { .. } => { + IndexerRuleMatchPayload::Actions { + block_hash: block_header_hash.to_string(), + receipt_id: receipt_execution_outcome.receipt.receipt_id.to_string(), + transaction_hash, + } + } + MatchingRule::Event { + event, + standard, + version, + .. + } => { + let event = receipt_execution_outcome + .execution_outcome + .outcome + .logs + .iter() + .filter_map(|log| Event::from_log(log).ok()) + .filter_map(|near_event| { + if vec![ + wildmatch::WildMatch::new(event).matches(&near_event.event), + wildmatch::WildMatch::new(standard).matches(&near_event.standard), + wildmatch::WildMatch::new(version).matches(&near_event.version), + ].into_iter().all(|val| val) { + Some(near_event) + } else { + None + } + }) + .collect::>() + .first() + .expect("Failed to get the matched Event itself while building the IndexerRuleMatchPayload") + .clone(); + + IndexerRuleMatchPayload::Events { + block_hash: block_header_hash.to_string(), + receipt_id: receipt_execution_outcome.receipt.receipt_id.to_string(), + transaction_hash, + event: event.event.clone(), + standard: event.standard.clone(), + version: event.version.clone(), + data: event.data.as_ref().map(|data| data.to_string()), + } + } + } +} diff --git a/indexer/indexer_rules_engine/src/types/indexer_rule_match.rs b/indexer/indexer_rules_engine/src/types/indexer_rule_match.rs index e82082339..37139b737 100644 --- a/indexer/indexer_rules_engine/src/types/indexer_rule_match.rs +++ b/indexer/indexer_rules_engine/src/types/indexer_rule_match.rs @@ -1,3 +1,5 @@ +use std::fmt; + pub type TransactionHashString = String; pub type ReceiptIdString = String; pub type BlockHashString = String; @@ -135,3 +137,11 @@ pub enum ChainId { Mainnet, Testnet, } +impl fmt::Display for ChainId { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ChainId::Mainnet => write!(f, "mainnet"), + ChainId::Testnet => write!(f, "testnet"), + } + } +} diff --git a/indexer/queryapi_coordinator/Cargo.toml b/indexer/queryapi_coordinator/Cargo.toml index c3b526627..3e1f40289 100644 --- a/indexer/queryapi_coordinator/Cargo.toml +++ b/indexer/queryapi_coordinator/Cargo.toml @@ -9,6 +9,7 @@ anyhow = "1.0.57" actix-web = "=4.0.1" borsh = "0.10.2" cached = "0.23.0" +chrono = "0.4.25" futures = "0.3.5" itertools = "0.9.0" lazy_static = "^1.4" diff --git a/indexer/queryapi_coordinator/src/historical_block_processing.rs b/indexer/queryapi_coordinator/src/historical_block_processing.rs new file mode 100644 index 000000000..7b6a0f21f --- /dev/null +++ b/indexer/queryapi_coordinator/src/historical_block_processing.rs @@ -0,0 +1,518 @@ +use crate::indexer_types::{IndexerFunction, IndexerQueueMessage}; +use crate::opts; +use crate::opts::{Opts, Parser}; +use aws_sdk_s3::Client as S3Client; +use aws_sdk_s3::Config; +use aws_sdk_sqs::Client; +use aws_types::SdkConfig; +use chrono::{DateTime, LocalResult, NaiveDate, TimeZone, Utc}; +use futures::future::join_all; +use indexer_rule_type::indexer_rule::{IndexerRule, MatchingRule}; +use indexer_rules_engine::types::indexer_rule_match::{ChainId, IndexerRuleMatchPayload}; +use near_jsonrpc_client::JsonRpcClient; +use near_jsonrpc_primitives::types::blocks::RpcBlockRequest; +use near_lake_framework::near_indexer_primitives::types::{BlockHeight, BlockId, BlockReference}; +use tokio::task::JoinHandle; + +const INDEXED_DATA_FILES_BUCKET: &str = "near-delta-lake"; +const LAKE_BUCKET_PREFIX: &str = "near-lake-data-"; + +pub fn spawn_historical_message_thread( + block_height: BlockHeight, + new_indexer_function: &IndexerFunction, +) -> Option> { + new_indexer_function.start_block_height.map(|_| { + let new_indexer_function_copy = new_indexer_function.clone(); + tokio::spawn(process_historical_messages( + block_height, + new_indexer_function_copy, + )) + }) +} + +async fn process_historical_messages( + block_height: BlockHeight, + indexer_function: IndexerFunction, +) -> i64 { + let start_block = indexer_function.start_block_height.unwrap(); + let block_difference: i64 = (block_height - start_block) as i64; + match block_difference { + i64::MIN..=-1 => { + tracing::error!(target: crate::INDEXER, "Skipping back fill, start_block_height is greater than current block height: {:?} {:?}", + indexer_function.account_id, + indexer_function.function_name); + } + 0 => { + tracing::info!(target: crate::INDEXER, "Skipping back fill, start_block_height is equal to current block height: {:?} {:?}", + indexer_function.account_id, + indexer_function.function_name); + } + 1..=i64::MAX => { + tracing::info!( + target: crate::INDEXER, + "Back filling {block_difference} blocks from {start_block} to current block height {block_height}: {:?} {:?}", + indexer_function.account_id, + indexer_function.function_name + ); + + let opts = Opts::parse(); + + let chain_id = opts.chain_id().clone(); + let aws_region = opts.aws_queue_region.clone(); + let queue_client = &opts.queue_client(aws_region); + let queue_url = opts.start_from_block_queue_url.clone(); + let aws_config: &SdkConfig = &opts.lake_aws_sdk_config(); + + let json_rpc_client = JsonRpcClient::connect(opts.rpc_url()); + let start_date = block_to_date(start_block, &json_rpc_client).await; + if start_date.is_none() { + tracing::error!( + target: crate::INDEXER, + "Failed to get start date for block {}", + start_block + ); + return block_difference; + } + + let mut indexer_function = indexer_function.clone(); + + let (last_indexed_block, mut blocks_from_index) = + filter_matching_blocks_from_index_files( + start_block, + block_height, + &indexer_function.indexer_rule, + aws_config, + start_date.unwrap(), + ) + .await; + + let mut blocks_between_indexed_and_current_block: Vec = + filter_matching_unindexed_blocks_from_lake( + last_indexed_block, + block_height, + &indexer_function.indexer_rule, + aws_config, + chain_id.clone(), + ) + .await; + + blocks_from_index.append(&mut blocks_between_indexed_and_current_block); + + for current_block in blocks_from_index { + send_execution_message( + block_height, + start_block, + chain_id.clone(), + queue_client, + queue_url.clone(), + &mut indexer_function, + current_block, + None, //alert_queue_message.payload.clone(), // future: populate with data from the Match + ) + .await; + } + } + } + block_difference +} + +async fn filter_matching_blocks_from_index_files( + start_block_height: BlockHeight, + end_block_height: BlockHeight, + indexer_rule: &IndexerRule, + aws_config: &SdkConfig, + start_date: DateTime, +) -> (BlockHeight, Vec) { + let s3_bucket = INDEXED_DATA_FILES_BUCKET; + + let index_files_content = match &indexer_rule.matching_rule { + MatchingRule::ActionAny { + affected_account_id, + status, + } => { + let s3_prefix = format!("silver/contracts/metadata/{}", affected_account_id); + fetch_contract_index_files(aws_config, s3_bucket, s3_prefix, start_date).await + } + MatchingRule::ActionFunctionCall { + affected_account_id, + status, + function, + } => { + tracing::error!( + target: crate::INDEXER, + "ActionFunctionCall matching rule not supported for historical processing" + ); + return (end_block_height, vec![]); + + // let s3_prefix = format!("silver/contracts/metadata/{}", affected_account_id); + // fetch_contract_index_files(aws_config, s3_bucket, s3_prefix).await + // // todo implement, use function name selector + } + MatchingRule::Event { .. } => { + tracing::error!( + target: crate::INDEXER, + "Event matching rule not supported for historical processing" + ); + return (end_block_height, vec![]); + } + }; + + tracing::info!( + target: crate::INDEXER, + "Found {file_count} index files matching rule {indexer_rule:?}", + file_count = index_files_content.len() + ); + + let blocks_to_process: Vec = + parse_blocks_from_index_files(index_files_content, start_block_height); + tracing::info!( + target: crate::INDEXER, + "Found {block_count} indexed blocks to process.", + block_count = blocks_to_process.len() + ); + + let last_indexed_block = blocks_to_process.last().unwrap_or(&start_block_height); + + (*last_indexed_block, blocks_to_process) +} + +fn parse_blocks_from_index_files( + index_files_content: Vec, + start_block_height: u64, +) -> Vec { + index_files_content + .into_iter() + .map(|file_content| { + if let Ok(file_json) = serde_json::from_str::(&file_content) { + if let Some(block_heights) = file_json["heights"].as_array() { + block_heights + .into_iter() + .map(|block_height| block_height.as_u64().unwrap()) + .collect::>() + .into_iter() + .filter(|block_height| block_height >= &start_block_height) + .collect() + } else { + tracing::error!( + target: crate::INDEXER, + "Unable to parse index file, no heights found: {:?}", + file_content + ); + vec![] + } + } else { + tracing::error!( + target: crate::INDEXER, + "Unable to parse index file: {:?}", + file_content + ); + vec![] + } + }) + .flatten() + .collect::>() +} + +async fn filter_matching_unindexed_blocks_from_lake( + last_indexed_block: BlockHeight, + ending_block_height: BlockHeight, + indexer_rule: &IndexerRule, + aws_config: &SdkConfig, + chain_id: ChainId, +) -> Vec { + let s3_config: Config = aws_sdk_s3::config::Builder::from(aws_config).build(); + let s3_client: S3Client = S3Client::from_conf(s3_config); + let lake_bucket = lake_bucket_for_chain(chain_id.clone()); + + let mut blocks_to_process: Vec = vec![]; + for current_block in (last_indexed_block + 1)..ending_block_height { + // fetch block file from S3 + let key = format!("{}/block.json", normalize_block_height(current_block)); + let block = fetch_text_file_from_s3(&lake_bucket, key, s3_client.clone()).await; + let block_view = serde_json::from_slice::< + near_lake_framework::near_indexer_primitives::views::BlockView, + >(block.as_ref()); + let mut shards = vec![]; + match block_view { + Ok(block_view) => { + for shard_id in 0..block_view.chunks.len() as u64 { + let key = format!( + "{}/shard_{}.json", + normalize_block_height(current_block), + shard_id + ); + let shard = fetch_text_file_from_s3(&lake_bucket, key, s3_client.clone()).await; + match serde_json::from_slice::< + near_lake_framework::near_indexer_primitives::IndexerShard, + >(shard.as_ref()) + { + Ok(parsed_shard) => { + shards.push(parsed_shard); + } + Err(e) => { + tracing::error!( + target: crate::INDEXER, + "Error parsing shard: {}", + e.to_string() + ); + // todo this needs better error handling + } + } + } + let streamer_message = + near_lake_framework::near_indexer_primitives::StreamerMessage { + block: block_view, + shards, + }; + + // // filter block + let matches = indexer_rules_engine::reduce_indexer_rule_matches_sync( + &indexer_rule, + &streamer_message, + chain_id.clone(), + ); + match matches { + Ok(match_list) => { + if match_list.len() > 0 { + blocks_to_process.push(current_block); + tracing::info!( + target: crate::INDEXER, + "Matched historical block {} against S3 file", + current_block, + ); + } + } + Err(e) => { + tracing::warn!( + target: crate::INDEXER, + "Error matching block {} against S3 file: {:?}", + current_block, + e); + } + } + } + Err(e) => { + tracing::error!( + target: crate::INDEXER, + "Error parsing block {} from S3: {:?}", + current_block, + e + ); + } + } + } + blocks_to_process +} + +fn lake_bucket_for_chain(chain_id: ChainId) -> String { + format!("{}{}", LAKE_BUCKET_PREFIX, chain_id) +} + +fn normalize_block_height(block_height: BlockHeight) -> String { + format!("{:0>12}", block_height) +} + +async fn fetch_contract_index_files( + aws_config: &SdkConfig, + s3_bucket: &str, + s3_prefix: String, + start_date: DateTime, +) -> Vec { + let s3_config: Config = aws_sdk_s3::config::Builder::from(aws_config).build(); + let s3_client: S3Client = S3Client::from_conf(s3_config); + + match s3_client + .list_objects_v2() + .bucket(s3_bucket) + .prefix(s3_prefix) + .send() + .await + { + Ok(file_list) => { + if let Some(objects) = file_list.contents { + let fetch_and_parse_tasks = objects + .into_iter() + .filter(|index_file_listing| { + file_name_date_after(start_date, index_file_listing.key.clone().unwrap()) + }) + .map(|index_file_listing| { + let key = index_file_listing.key.clone().unwrap(); + + let s3_client = s3_client.clone(); + async move { + // Fetch the file + fetch_text_file_from_s3(s3_bucket, key, s3_client).await + } + }) + .collect::>(); + + // Execute all tasks in parallel and wait for completion + let file_contents: Vec = join_all(fetch_and_parse_tasks).await; + file_contents + .into_iter() + .filter(|file_contents| file_contents.len() > 0) + .collect::>() + } else { + tracing::error!( + target: crate::INDEXER, + "Error listing files in S3 bucket, no files found." + ); + vec![] + } + } + Err(e) => { + tracing::error!( + target: crate::INDEXER, + "Error listing files in S3 bucket: {:?}", + e + ); + vec![] + } + } +} + +/// check whether the filename is a date after the start date +/// filename is in format 2022-10-03.json +fn file_name_date_after(start_date: DateTime, file_name: String) -> bool { + let file_name_date = file_name.split("/").last().unwrap().replace(".json", ""); + let file_name_date = NaiveDate::parse_from_str(&file_name_date, "%Y-%m-%d"); + match file_name_date { + Ok(file_name_date) => { + if file_name_date >= start_date.date_naive() { + true + } else { + false + } + } + Err(e) => { + tracing::error!( + target: crate::INDEXER, + "Error parsing file name date: {:?}", + e + ); + false + } + } +} + +async fn fetch_text_file_from_s3(s3_bucket: &str, key: String, s3_client: S3Client) -> String { + let get_object_output = s3_client + .get_object() + .bucket(s3_bucket) + .key(key.clone()) + .send() + .await; + + match get_object_output { + Ok(object_output) => { + let bytes = object_output.body.collect().await; + match bytes { + Ok(bytes) => { + let file_contents = String::from_utf8(bytes.to_vec()); + match file_contents { + Ok(file_contents) => { + tracing::debug!( + target: crate::INDEXER, + "Fetched S3 file {}", + key.clone(), + ); + file_contents + } + Err(e) => { + tracing::error!( + target: crate::INDEXER, + "Error parsing index file: {:?}", + e + ); + "".to_string() + } + } + } + Err(e) => { + tracing::error!(target: crate::INDEXER, "Error fetching index file: {:?}", e); + "".to_string() + } + } + } + Err(e) => { + tracing::error!(target: crate::INDEXER, "Error fetching index file: {:?}", e); + "".to_string() + } + } +} + +async fn send_execution_message( + block_height: BlockHeight, + start_block: u64, + chain_id: ChainId, + queue_client: &Client, + queue_url: String, + indexer_function: &mut IndexerFunction, + current_block: u64, + payload: Option, +) { + // only request provisioning on the first block + if current_block != start_block { + indexer_function.provisioned = true; + } + + let msg = IndexerQueueMessage { + chain_id, + indexer_rule_id: 0, + indexer_rule_name: indexer_function.function_name.clone(), + payload, + block_height: current_block, + indexer_function: indexer_function.clone(), + }; + + match opts::send_to_indexer_queue(queue_client, queue_url, vec![msg]).await { + Ok(_) => {} + Err(err) => tracing::error!( + target: crate::INDEXER, + "#{} an error occurred when sending messages to the queue\n{:#?}", + block_height, + err + ), + } +} + +pub async fn block_to_date(block_height: u64, client: &JsonRpcClient) -> Option> { + let request = RpcBlockRequest { + block_reference: BlockReference::BlockId(BlockId::Height(block_height)), + }; + + match client.call(request).await { + Ok(response) => { + let header = response.header; + let timestamp_nanosec = header.timestamp_nanosec; + match Utc.timestamp_opt((timestamp_nanosec / 1000000000) as i64, 0) { + LocalResult::Single(date) => Some(date), + LocalResult::Ambiguous(date, _) => Some(date), + LocalResult::None => { + tracing::error!("Unable to get block timestamp"); + None + } + } + } + Err(err) => { + tracing::error!("Unable to get block: {:?}", err); + None + } + } +} + +// #[tokio::test] +// async fn test_process_historical_messages() { +// let indexer_function = IndexerFunction { +// account_id: "buildnear.testnet".to_string().parse().unwrap(), +// function_name: "index_stuff".to_string(), +// code: "".to_string(), +// start_block_height: Some(85376002), +// schema: None, +// provisioned: false, +// indexer_rule: indexer_rule_type::near_social_indexer_rule(), +// }; +// +// // this depends on Opts now +// process_historical_messages(85376003, indexer_function, need_a_mock_rpc_client).await; +// } diff --git a/indexer/queryapi_coordinator/src/indexer_registry.rs b/indexer/queryapi_coordinator/src/indexer_registry.rs index 868613917..e5fdbfe44 100644 --- a/indexer/queryapi_coordinator/src/indexer_registry.rs +++ b/indexer/queryapi_coordinator/src/indexer_registry.rs @@ -14,9 +14,7 @@ use unescape::unescape; use crate::indexer_reducer; use crate::indexer_reducer::FunctionCallInfo; -use crate::indexer_types::{IndexerFunction, IndexerQueueMessage, IndexerRegistry}; -use crate::opts; -use crate::opts::{Opts, Parser}; +use crate::indexer_types::{IndexerFunction, IndexerRegistry}; use indexer_rule_type::indexer_rule::{IndexerRule, IndexerRuleKind, MatchingRule, Status}; pub(crate) fn registry_as_vec_of_indexer_functions( @@ -168,7 +166,10 @@ fn index_and_process_register_calls( if new_indexer_function.start_block_height.is_some() { if let Some(thread) = - spawn_historical_message_thread(block_height, &mut new_indexer_function) + crate::historical_block_processing::spawn_historical_message_thread( + block_height, + &mut new_indexer_function, + ) { spawned_start_from_block_threads.push(thread); } @@ -226,18 +227,6 @@ fn index_and_process_remove_calls( } } -fn spawn_historical_message_thread( - block_height: BlockHeight, - new_indexer_function: &mut IndexerFunction, -) -> Option> { - new_indexer_function.start_block_height.map(|_| { - let new_indexer_function_copy = new_indexer_function.clone(); - tokio::spawn(async move { - process_historical_messages(block_height, new_indexer_function_copy).await - }) - }) -} - fn build_function_invocation_from_args( args: Option, signer_id: String, @@ -277,45 +266,43 @@ fn build_indexer_function_from_args( ); return None; } - Some(function_name) => { - match unescape(&args["filter_json"].to_string()) { - Some(filter_string) => { - let filter_json_strip_quotes = &filter_string[1..filter_string.len() - 1]; - match serde_json::from_str(&filter_json_strip_quotes) { - Ok(filter_json) => match serde_json::from_value(filter_json) { - Ok(indexer_rule) => build_indexer_function( - &args, - function_name.to_string(), - account_id, - &indexer_rule, - ), - Err(e) => { - tracing::warn!("Error parsing filter into indexer_rule for account {} function {}: {}, {}", account_id, function_name, e, filter_string); - None - } - }, + Some(function_name) => match unescape(&args["filter_json"].to_string()) { + Some(filter_string) => { + let filter_json_strip_quotes = &filter_string[1..filter_string.len() - 1]; + match serde_json::from_str(&filter_json_strip_quotes) { + Ok(filter_json) => match serde_json::from_value(filter_json) { + Ok(indexer_rule) => build_indexer_function( + &args, + function_name.to_string(), + account_id, + &indexer_rule, + ), Err(e) => { - tracing::warn!("Error parsing indexer_rule filter for account {} function {}: {}, {}", account_id, function_name, e, filter_string); + tracing::warn!("Error parsing filter into indexer_rule for account {} function {}: {}, {}", account_id, function_name, e, filter_string); None } + }, + Err(e) => { + tracing::warn!("Error parsing indexer_rule filter for account {} function {}: {}, {}", account_id, function_name, e, filter_string); + None } - }, - None => { - tracing::warn!( - "Unable to unescape filter_json from registration args: {:?}", - &args - ); - None } } - } + None => { + tracing::warn!( + "Unable to unescape filter_json from registration args: {:?}", + &args + ); + None + } + }, } } } } fn parse_indexer_function_args(update: &FunctionCallInfo) -> Option { - if let Ok(mut args_json) = serde_json::from_str(&update.args) { + if let Ok(args_json) = serde_json::from_str(&update.args) { return Some(args_json); } else { tracing::error!( @@ -326,78 +313,6 @@ fn parse_indexer_function_args(update: &FunctionCallInfo) -> Option { None } -async fn process_historical_messages( - block_height: BlockHeight, - indexer_function: IndexerFunction, -) -> i64 { - let start_block = indexer_function.start_block_height.unwrap(); - let block_difference: i64 = (block_height - start_block) as i64; - match block_difference { - i64::MIN..=-1 => { - tracing::error!(target: crate::INDEXER, "Skipping back fill, start_block_height is greater than current block height: {:?} {:?}", - indexer_function.account_id.clone(), - indexer_function.function_name.clone(),); - } - 0 => { - tracing::info!(target: crate::INDEXER, "Skipping back fill, start_block_height is equal to current block height: {:?} {:?}", - indexer_function.account_id.clone(), - indexer_function.function_name.clone(),); - } - 1..=3600 => { - tracing::info!( - target: crate::INDEXER, - "Back filling {block_difference} blocks from {start_block} to current block height {block_height}: {:?} {:?}", - indexer_function.account_id.clone(), - indexer_function.function_name.clone(), - ); - - let opts = Opts::parse(); - - let chain_id = opts.chain_id().clone(); - let aws_region = opts.aws_queue_region.clone(); - let queue_client = &opts.queue_client(aws_region); - let queue_url = opts.start_from_block_queue_url.clone(); - - // todo: fetch contract index files to get list of relevant blocks for our filter. - - for current_block in start_block..block_height { - let mut indexer_function = indexer_function.clone(); - - // only request provisioning on the first block - if current_block != start_block { - indexer_function.provisioned = true; - } - - let msg = IndexerQueueMessage { - chain_id: chain_id.clone(), - indexer_rule_id: 0, - indexer_rule_name: indexer_function.function_name.clone(), - payload: None, //alert_queue_message.payload.clone(), // todo populate with data from the Match - block_height: current_block, - indexer_function: indexer_function.clone(), - }; - - match opts::send_to_indexer_queue(queue_client, queue_url.clone(), vec![msg]).await - { - Ok(_) => {} - Err(err) => tracing::error!( - target: crate::INDEXER, - "#{} an error occurred during sending messages to the queue\n{:#?}", - block_height, - err - ), - } - } - } - 3601..=i64::MAX => { - tracing::error!(target: crate::INDEXER, "Skipping back fill, start_block_height is more than 1 hour before current block height: {:?} {:?}", - indexer_function.account_id.clone(), - indexer_function.function_name.clone(),); - } - } - block_difference -} - fn build_registry_indexer_rule( registry_method_name: &str, registry_contract_id: &str, @@ -457,36 +372,4 @@ async fn read_only_call( return Ok(serde_json::from_str(std::str::from_utf8(&result.result).unwrap()).unwrap()); } Err(anyhow::anyhow!("Unable to make rpc call: {:?}", response)) -} - -fn escape_json(object: &mut Value) { - match object { - Value::Object(ref mut value) => { - for (_key, val) in value { - escape_json(val); - } - } - Value::Array(ref mut values) => { - for element in values.iter_mut() { - escape_json(element) - } - } - Value::String(ref mut value) => *value = value.escape_default().to_string(), - _ => {} - } -} - -#[tokio::test] -async fn test_process_historical_messages() { - let indexer_function = IndexerFunction { - account_id: "buildnear.testnet".to_string().parse().unwrap(), - function_name: "index_stuff".to_string(), - code: "".to_string(), - start_block_height: Some(85376002), - schema: None, - provisioned: false, - indexer_rule: indexer_rule_type::near_social_indexer_rule(), - }; - - process_historical_messages(85376003, indexer_function).await; -} +} \ No newline at end of file diff --git a/indexer/queryapi_coordinator/src/main.rs b/indexer/queryapi_coordinator/src/main.rs index 328598ba9..8c37cca89 100644 --- a/indexer/queryapi_coordinator/src/main.rs +++ b/indexer/queryapi_coordinator/src/main.rs @@ -13,6 +13,7 @@ use opts::{Opts, Parser}; use storage::ConnectionManager; pub(crate) mod cache; +mod historical_block_processing; mod indexer_reducer; mod indexer_registry; mod indexer_types; diff --git a/indexer/queryapi_coordinator/src/opts.rs b/indexer/queryapi_coordinator/src/opts.rs index 84c59c630..5e13138f9 100644 --- a/indexer/queryapi_coordinator/src/opts.rs +++ b/indexer/queryapi_coordinator/src/opts.rs @@ -227,7 +227,6 @@ pub async fn send_to_indexer_queue( queue_url: String, indexer_queue_messages: Vec, ) -> anyhow::Result<()> { - let message_bodies: Vec = indexer_queue_messages .into_iter() .enumerate() From 5c964384d2b7b18cb618ae9693274629e24ece6a Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Mon, 5 Jun 2023 14:53:11 -0500 Subject: [PATCH 05/20] [DPLT-1009] feat: contract validation with wild cards (#93) --- frontend/src/components/Editor/Editor.js | 17 ++++++----------- .../Form/BlockHeightOptionsInputGroup.jsx | 1 + frontend/src/utils/validators.js | 10 ++++++++++ 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 frontend/src/utils/validators.js diff --git a/frontend/src/components/Editor/Editor.js b/frontend/src/components/Editor/Editor.js index 6aba22c91..708ee87b6 100644 --- a/frontend/src/components/Editor/Editor.js +++ b/frontend/src/components/Editor/Editor.js @@ -18,10 +18,8 @@ import EditorButtons from "./EditorButtons"; import { PublishModal } from "../Modals/PublishModal"; import {getLatestBlockHeight} from "../../utils/getLatestBlockHeight"; const BLOCKHEIGHT_LIMIT = 3600; +import { validateContractId } from "../../utils/validators" -const contractRegex = RegExp( - "^(([a-zd]+[-_])*[a-zd]+.)*([a-zd]+[-_])*[a-zd]+$" -); const Editor = ({ options, @@ -299,17 +297,14 @@ const Editor = ({ } function handleSetContractFilter(e) { - // check if contract filter is greater than 2 and less than or equal to 64 chars const contractFilter = e.target.value; setContractFilter(contractFilter); - if ( - contractFilter.length > 64 || - contractFilter.length < 2 || - !contractRegex.test(contractFilter) - ) { - setIsContractFilterValid(false); - } else { + const isValid = validateContractId(contractFilter); + + if (isValid) { setIsContractFilterValid(true); + } else { + setIsContractFilterValid(false); } } diff --git a/frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx b/frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx index 66d4391f1..1a0e86f91 100644 --- a/frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx +++ b/frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx @@ -39,6 +39,7 @@ const BlockHeightOptions = ({ = 2 && + accountId.length <= 64 && + CONTRACT_NAME_REGEX.test(accountId) + ); +} + From 09a43825c24634dd224e8d6d61196c8f3065a6f2 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Mon, 5 Jun 2023 14:55:11 -0500 Subject: [PATCH 06/20] fix: contract name --- frontend/src/utils/validators.js | 2 +- frontend/yarn.lock | 4261 +++--------------------------- 2 files changed, 398 insertions(+), 3865 deletions(-) diff --git a/frontend/src/utils/validators.js b/frontend/src/utils/validators.js index 604fa1728..72005b16f 100644 --- a/frontend/src/utils/validators.js +++ b/frontend/src/utils/validators.js @@ -1,4 +1,4 @@ -const CONTRACT_NAME_REGEX = RegExp(/^(\*|([a-z\d]+[-_])*[a-z\d]+)(\.*(\*|([a-z\d]+[-_])*[a-z\d]+))*\.(\w+)$/)A +const CONTRACT_NAME_REGEX = RegExp(/^(\*|([a-z\d]+[-_])*[a-z\d]+)(\.*(\*|([a-z\d]+[-_])*[a-z\d]+))*\.(\w+)$/); export function validateContractId(accountId) { return ( diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 3b255b93d..290484472 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -84,7 +84,14 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== -"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1": +"@babel/runtime@^7.0.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.12.13": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== @@ -132,11 +139,6 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@braintree/sanitize-url@6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== - "@emotion/is-prop-valid@^1.1.0": version "1.2.0" resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" @@ -174,375 +176,33 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@floating-ui/core@^0.7.3": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-0.7.3.tgz#d274116678ffae87f6b60e90f88cc4083eefab86" - integrity sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg== - -"@floating-ui/dom@^0.5.3": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-0.5.4.tgz#4eae73f78bcd4bd553ae2ade30e6f1f9c73fe3f1" - integrity sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg== - dependencies: - "@floating-ui/core" "^0.7.3" - -"@floating-ui/react-dom@0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-0.7.2.tgz#0bf4ceccb777a140fc535c87eb5d6241c8e89864" - integrity sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg== - dependencies: - "@floating-ui/dom" "^0.5.3" - use-isomorphic-layout-effect "^1.1.1" - -"@here-wallet/core@^1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@here-wallet/core/-/core-1.4.2.tgz#1791bc3af913a46d7f85bfb669eeeaba4c8665ac" - integrity sha512-UGifE9cwwztVi0RAuqq7W8iUVfoS0Tt+355IR5xpKqJffxEmQANLvlsTv2hY5LZNpzw8C2c5jkLaryOtQCRLTQ== - dependencies: - sha1 "^1.1.1" - uuid4 "2.0.3" +"@graphiql/react@^0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@graphiql/react/-/react-0.17.6.tgz#54e3745f74ccf5cd69540aecc9dbcd15a7e28c1c" + integrity sha512-3k1paSRbRwVNxr2U80xnRhkws8tSErWlETJvEQBmqRcWbt0+WmwFJorkLnG1n3Wj0Ho6k4a2BAiTfJ6F4SPrLg== + dependencies: + "@graphiql/toolkit" "^0.8.4" + "@reach/combobox" "^0.17.0" + "@reach/dialog" "^0.17.0" + "@reach/listbox" "^0.17.0" + "@reach/menu-button" "^0.17.0" + "@reach/tooltip" "^0.17.0" + "@reach/visually-hidden" "^0.17.0" + clsx "^1.2.1" + codemirror "^5.65.3" + codemirror-graphql "^2.0.8" + copy-to-clipboard "^3.2.0" + graphql-language-service "^5.1.6" + markdown-it "^12.2.0" + set-value "^4.1.0" + +"@graphiql/toolkit@^0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@graphiql/toolkit/-/toolkit-0.8.4.tgz#8b697d140a3e96a6702428cbb8da4e8eb29162b3" + integrity sha512-cFUGqh3Dau+SD3Vq9EFlZrhzYfaHKyOJveFtaCR+U5Cn/S68p7oy+vQBIdwtO6J2J58FncnwBbVRfr+IvVfZqQ== + dependencies: + "@n1ru4l/push-pull-async-iterable-iterator" "^3.1.0" + meros "^1.1.4" "@humanwhocodes/config-array@^0.11.8": version "0.11.8" @@ -595,19 +255,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@metamask/detect-provider@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@metamask/detect-provider/-/detect-provider-2.0.0.tgz#4bc2795e5e6f7d8b84b2e845058d2f222c99917d" - integrity sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ== - -"@meteorwallet/sdk@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@meteorwallet/sdk/-/sdk-0.6.0.tgz#006b77410a7874f0c9bfc0d693f199b561f39d19" - integrity sha512-oriaQ1gk1hpQx6V6BxsvUthDd0Bpmv3ho5Ap5pm9P0euEosWtFUVF1dTYndJE10qBG8yLW+EOOX1LZ8taXCiRA== - dependencies: - nanoid "3.3.4" - query-string "^7.1.1" - "@monaco-editor/loader@^1.3.2": version "1.3.2" resolved "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz" @@ -615,13 +262,6 @@ dependencies: state-local "^1.0.6" -"@monaco-editor/loader@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.3.tgz#7f1742bd3cc21c0362a46a4056317f6e5215cfca" - integrity sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q== - dependencies: - state-local "^1.0.6" - "@monaco-editor/react@^4.1.3": version "4.4.6" resolved "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.6.tgz" @@ -630,98 +270,16 @@ "@monaco-editor/loader" "^1.3.2" prop-types "^15.7.2" -"@monaco-editor/react@^4.4.6": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.5.0.tgz#5a581f1ce5af6597dd127ac2c0d22d15ca3f3928" - integrity sha512-VJMkp5Fe1+w8pLEq8tZPHZKu8zDXQIA1FtiDTSNccg1D3wg1YIZaH2es2Qpvop1k62g3c/YySRb3bnGXu2XwYQ== - dependencies: - "@monaco-editor/loader" "^1.3.3" +"@n1ru4l/push-pull-async-iterable-iterator@^3.1.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@n1ru4l/push-pull-async-iterable-iterator/-/push-pull-async-iterable-iterator-3.2.0.tgz#c15791112db68dd9315d329d652b7e797f737655" + integrity sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q== "@near-lake/primitives@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@near-lake/primitives/-/primitives-0.1.0.tgz#c9dc196cad82b668e773eab7f673edfc6a877cea" integrity sha512-SvL6mA0SsqAz5AC2811I+cI9Mpayax8VsoRbY0Bizk5eYiGCT1u1iBBa8f1nikquDfJCEK+sBCt751Nz/xoZjw== -"@near-wallet-selector/core@7.9.3", "@near-wallet-selector/core@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/core/-/core-7.9.3.tgz#5a51b72064c9e018c0f0eb97db06b70cd58b8358" - integrity sha512-SNIgLnI/LeU1mwBHc5wcyOrVAqhWmFXJfVIfB1P16ziH3EKMsbs/gxcKUSPuvDagm9dZm11k+FA7bxSspavibA== - dependencies: - rxjs "^7.8.0" - -"@near-wallet-selector/here-wallet@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/here-wallet/-/here-wallet-7.9.3.tgz#be975257513ed8b8979e7f117747b4d8bb828eb9" - integrity sha512-kjnKATYjNhgCtZBuiyONgs2Cjj6Y52bv8P2zwmaQxmwoWu3VYZrPXw/6RHErrxMA4nOlNRlM2VD3DB51LUNT1Q== - dependencies: - "@here-wallet/core" "^1.4.0" - "@near-wallet-selector/core" "7.9.3" - bn.js "^5.2.0" - -"@near-wallet-selector/meteor-wallet@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/meteor-wallet/-/meteor-wallet-7.9.3.tgz#223a08c7ca85ae472ba5b5a6214d4f3fc4b0face" - integrity sha512-l9Fbb/mKHOs/mrOneXG5BPmvO447aokYz4SvvffMhi6eFWE4oHWKTjh7lUELaQH9gCNxTdkS5y6egJFLD8/CDQ== - dependencies: - "@meteorwallet/sdk" "^0.6.0" - "@near-wallet-selector/core" "7.9.3" - "@near-wallet-selector/wallet-utils" "7.9.3" - -"@near-wallet-selector/modal-ui@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/modal-ui/-/modal-ui-7.9.3.tgz#8fe6eddccaf76ee38ddb815b627430c061d0cf92" - integrity sha512-gwbSIW3/30WsYe9wY0F6DQ92yrv8sMYO9WF2cqy/p7UwG6ZMWQ9FIhlkc2XUC1datBEbKfB/fO4nNpeHoSGTbw== - dependencies: - "@near-wallet-selector/core" "7.9.3" - copy-to-clipboard "^3.3.3" - qrcode "^1.5.1" - react "18.2.0" - react-dom "18.2.0" - -"@near-wallet-selector/my-near-wallet@7.9.3", "@near-wallet-selector/my-near-wallet@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/my-near-wallet/-/my-near-wallet-7.9.3.tgz#8a43c01d553d9908ca93698853bee2427774cb55" - integrity sha512-McwIYW4njj1ctZUAKG2/zv6uC5OsKrjxuBPie/yx0+WVWuJiQO2Wemjs4uYMas5Ld8OqYDX5p/6cYyr7d0hfSQ== - dependencies: - "@near-wallet-selector/core" "7.9.3" - "@near-wallet-selector/wallet-utils" "7.9.3" - -"@near-wallet-selector/near-wallet@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/near-wallet/-/near-wallet-7.9.3.tgz#677b87a029af3f5a9b8855a17ffe86ddd9dbbdb0" - integrity sha512-oAtqC0ERhJZ7pVlUJZDmWU4AcTeNW+C4eab3eQCNWToH6gx1/OsKa7nSvcAzomaARBqE1ttE9KhAQUzvRXd07A== - dependencies: - "@near-wallet-selector/core" "7.9.3" - "@near-wallet-selector/my-near-wallet" "7.9.3" - -"@near-wallet-selector/neth@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/neth/-/neth-7.9.3.tgz#d9991b136225e577c569622e1ffb64b34fdd6006" - integrity sha512-v5tJdb8HOCOenW+nd5dyH/aF3ISFB/Wf+PK9Qy9UL4abvLsfBam75vqiI8cMe/15pfuqF7CHC3h9Wt2/BDt4Yg== - dependencies: - "@metamask/detect-provider" "^2.0.0" - "@near-wallet-selector/core" "7.9.3" - bn.js "^5.2.0" - ethers "^5.7.2" - is-mobile "^3.1.1" - near-seed-phrase "^0.2.0" - -"@near-wallet-selector/sender@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/sender/-/sender-7.9.3.tgz#b9fd34135b1d02c33ef7f44b5d186ee3df0ef966" - integrity sha512-rO+3giHJYF0SbyzxcapVcFlvscDB2reMOlKyZSLpbtxX80EyYBU2Qk1vqO3M1GAA8dsh9ZPwTPM63wDhyyxWMg== - dependencies: - "@near-wallet-selector/core" "7.9.3" - is-mobile "^3.1.1" - -"@near-wallet-selector/wallet-utils@7.9.3": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@near-wallet-selector/wallet-utils/-/wallet-utils-7.9.3.tgz#35a098f29080041fc83daa6b48a7e005fa441fa1" - integrity sha512-uH99A7K0eibZeWVHb+fFgP/rpaDskEfHQXZiAOuIzaDmWnm8KSG4VxA+l5GAR/X+OTpaYwNSd+AB/v3PdeH0Ug== - dependencies: - "@near-wallet-selector/core" "7.9.3" - bn.js "^5.2.0" - "@next/env@13.1.6": version "13.1.6" resolved "https://registry.npmjs.org/@next/env/-/env-13.1.6.tgz" @@ -837,676 +395,162 @@ tiny-glob "^0.2.9" tslib "^2.4.0" -"@popperjs/core@^2.10.2": - version "2.11.7" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" - integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== - "@popperjs/core@^2.11.6": version "2.11.6" resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== -"@radix-ui/number@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.0.tgz#4c536161d0de750b3f5d55860fc3de46264f897b" - integrity sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/primitive@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" - integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-accordion@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.1.1.tgz#fa1ab1b5c6a29aa75aefaf306a9e72fe3a482dbc" - integrity sha512-TQtyyRubYe8DD6DYCovNLTjd2D+TFrNCpr99T5M3cYUbR7BsRxWsxfInjbQ1nHsdy2uPTcnJS5npyXPVfP0piw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collapsible" "1.0.2" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-alert-dialog@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.3.tgz#892726f4e4441622535e68a632ec833211b46988" - integrity sha512-QXFy7+bhGi0u+paF2QbJeSCHZs4gLMJIPm6sajUamyW0fro6g1CaSGc5zmc4QmK2NlSGUrq8m+UsUqJYtzvXow== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dialog" "1.0.3" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-slot" "1.0.1" - -"@radix-ui/react-arrow@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.2.tgz#93b0ff95f65e2264a05b14ef1031ec798243dd6f" - integrity sha512-fqYwhhI9IarZ0ll2cUSfKuXHlJK0qE4AfnRrPBbRwEH/4mGQn04/QFGomLi8TXWIdv9WJk//KgGm+aDxVIr1wA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.2" - -"@radix-ui/react-aspect-ratio@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.0.2.tgz#4d40e9d80d861ae5805e951bc319802d2d65a96e" - integrity sha512-YCujQYnwcVcakbdhE8eTjhh4QR8CsngEcRlSzIPWw1vp3KPC9orETo8CxuVM65j5HAp0oFoOlIy6v7SuF+9P+Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.2" - -"@radix-ui/react-avatar@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.0.2.tgz#c72209882e191db00ac0bfa16a9d9c025f0958f0" - integrity sha512-XRL8z2l9V7hRLCPjHWg/34RBPZUGpmOjmsRSNvIh2DI28GyIWDChbcsDUVc63MzOItk6Q83Ob2KK8k2FUlXlGA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-checkbox@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.0.3.tgz#bab1916c04b9f66e944e7168be2217cb74c7b94e" - integrity sha512-55B8/vKzTuzxllH5sGJO4zaBf9gYpJuJRRzaOKm+0oAefRnMvbf+Kgww7IOANVN0w3z7agFJgtnXaZl8Uj95AA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-previous" "1.0.0" - "@radix-ui/react-use-size" "1.0.0" - -"@radix-ui/react-collapsible@1.0.2", "@radix-ui/react-collapsible@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.0.2.tgz#0583470c7caa8cd1ab6f606416288d19b3baf777" - integrity sha512-QNiDT6Au8jUU0K1WV+HEd4loH7C5CKQjeXxskwqyiyAkyCmW7qlQM5vSSJCIoQC+OVPyhgafSmGudRP8Qm1/gA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-collection@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.2.tgz#d50da00bfa2ac14585319efdbbb081d4c5a29a97" - integrity sha512-s8WdQQ6wNXpaxdZ308KSr8fEWGrg4un8i4r/w7fhiS4ElRNjk5rRcl0/C6TANG2LvLOGIxtzo/jAg6Qf73TEBw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-slot" "1.0.1" - -"@radix-ui/react-compose-refs@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" - integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-context-menu@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context-menu/-/react-context-menu-2.1.3.tgz#5e42762bffe21e8730bf5079b739465776546ba9" - integrity sha512-T+Jpbl/L9eJmlNGdgrl39NUqYTrtHJz4FmjdSc2WDUiZXWMmokK+1K8t/xEcx9q2PvVYfL5UDy9dkzU9UouyGw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-menu" "2.0.4" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-context@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0" - integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-dialog@1.0.3", "@radix-ui/react-dialog@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.3.tgz#a715bf30f35fcd80476c0a07fcc073c1968e6d3e" - integrity sha512-owNhq36kNPqC2/a+zJRioPg6HHnTn5B/sh/NjTY8r4W9g1L5VJlrzZIVcBr7R9Mg8iLjVmh6MGgMlfoVf/WO/A== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.2" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-slot" "1.0.1" - "@radix-ui/react-use-controllable-state" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.5" - -"@radix-ui/react-direction@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.0.tgz#a2e0b552352459ecf96342c79949dd833c1e6e45" - integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-dismissable-layer@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.3.tgz#63844d8e6bbcd010a513e7176d051c3c4044e09e" - integrity sha512-nXZOvFjOuHS1ovumntGV7NNoLaEp9JEvTht3MBjP44NSW5hUKj/8OnfN3+8WmB+CEhN44XaGhpHoSsUIEl5P7Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-escape-keydown" "1.0.2" - -"@radix-ui/react-dropdown-menu@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.4.tgz#237909fb94622a4900b03fbbf75dd394f1ca6273" - integrity sha512-y6AT9+MydyXcByivdK1+QpjWoKaC7MLjkS/cH1Q3keEyMvDkiY85m8o2Bi6+Z1PPUlCsMULopxagQOSfN0wahg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-menu" "2.0.4" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-focus-guards@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz#339c1c69c41628c1a5e655f15f7020bf11aa01fa" - integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-focus-scope@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.2.tgz#5fe129cbdb5986d0a3ae16d14c473c243fe3bc79" - integrity sha512-spwXlNTfeIprt+kaEWE/qYuYT3ZAqJiAGjN/JgdvgVDTu8yc+HuX+WOWXrKliKnLnwck0F6JDkqIERncnih+4A== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - -"@radix-ui/react-hover-card@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@radix-ui/react-hover-card/-/react-hover-card-1.0.5.tgz#780e442101e8f662fb75bfd4a1499212d38745e9" - integrity sha512-jXRuZEkxSWdHZbVyL0J46cm7pQjmOMpwJEFKY+VqAJnV+FxS+zIZExI1OCeIiDwCBzUy6If1FfouOsfqBxr86g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-popper" "1.1.1" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-id@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e" - integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-label@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.0.1.tgz#c05c41cb20f7877d6e9c3eac731b11584c95b2fa" - integrity sha512-qcfbS3B8hTYmEO44RNcXB6pegkxRsJIbdxTMu0PEX0Luv5O2DvTIwwVYxQfUwLpM88EL84QRPLOLgwUSApMsLQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.2" - -"@radix-ui/react-menu@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.0.4.tgz#0bf06f2ee76889ce9bdcf7fa920545f53060824f" - integrity sha512-mzKR47tZ1t193trEqlQoJvzY4u9vYfVH16ryBrVrCAGZzkgyWnMQYEZdUkM7y8ak9mrkKtJiqB47TlEnubeOFQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.2" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-popper" "1.1.1" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-roving-focus" "1.0.3" - "@radix-ui/react-slot" "1.0.1" - "@radix-ui/react-use-callback-ref" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.5" - -"@radix-ui/react-menubar@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-menubar/-/react-menubar-1.0.2.tgz#7eedcc905669e12f5fc0789bf28ab5c792ab44c0" - integrity sha512-woEg2ZODGoJHonr6ZwC01ZCpDifS6BapI5ythRfvWPBeL/80CX3u4sQKaF/58bbAZQsDnVwO5M9b0XVBN3jLhA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-menu" "2.0.4" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-roving-focus" "1.0.3" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-navigation-menu@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.2.tgz#ca5ee35ddbc4e57a9403be92f9573435173e35c8" - integrity sha512-1fSjOAGTThYSgJ5pENG2V8we7+6KDbfbiyt66HmLTeo0W3PAmmciclm0o97VlcVZW7q5Vg2hN7Cbj4XKo5u2sw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-use-previous" "1.0.0" - "@radix-ui/react-visually-hidden" "1.0.2" - -"@radix-ui/react-popover@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.5.tgz#9c58100ed6809eb611c0acbf032f9ab58c0b55d1" - integrity sha512-GRHZ8yD12MrN2NLobHPE8Rb5uHTxd9x372DE9PPNnBjpczAQHcZ5ne0KXG4xpf+RDdXSzdLv9ym6mYJCDTaUZg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.2" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-popper" "1.1.1" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-slot" "1.0.1" - "@radix-ui/react-use-controllable-state" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.5" - -"@radix-ui/react-popper@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.1.tgz#54f060941c981e965ff5d6b64e152d6298d2326e" - integrity sha512-keYDcdMPNMjSC8zTsZ8wezUMiWM9Yj14wtF3s0PTIs9srnEPC9Kt2Gny1T3T81mmSeyDjZxsD9N5WCwNNb712w== - dependencies: - "@babel/runtime" "^7.13.10" - "@floating-ui/react-dom" "0.7.2" - "@radix-ui/react-arrow" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-use-rect" "1.0.0" - "@radix-ui/react-use-size" "1.0.0" - "@radix-ui/rect" "1.0.0" - -"@radix-ui/react-portal@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.2.tgz#102370b1027a767a371cab0243be4bc664f72330" - integrity sha512-swu32idoCW7KA2VEiUZGBSu9nB6qwGdV6k6HYhUoOo3M1FFpD+VgLzUqtt3mwL1ssz7r2x8MggpLSQach2Xy/Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.2" - -"@radix-ui/react-presence@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" - integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-primitive@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz#54e22f49ca59ba88d8143090276d50b93f8a7053" - integrity sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-slot" "1.0.1" - -"@radix-ui/react-progress@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-progress/-/react-progress-1.0.2.tgz#364e414b5416f5fe8e14340b01969545ac0a48aa" - integrity sha512-c16RVM43ct2koRcMmPw4b47JWFNs89qe5p4Um9dwoPs0yi+d7It1MJ35EpsX+93o31Mqdwe4vQyu0SrHrygdCg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - -"@radix-ui/react-radio-group@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-1.1.2.tgz#9b21ab66a125f60476f272a9c07e9c16e77d4e7b" - integrity sha512-S7K8upMjOkx1fTUzEugbfCYPwI9Yw4m2h2ZfJP+ZWP/Mzc/LE2T6QgiAMaSaC3vZSxU5Kk5Eb377zMklWeaaCQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-roving-focus" "1.0.3" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-previous" "1.0.0" - "@radix-ui/react-use-size" "1.0.0" - -"@radix-ui/react-roving-focus@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.3.tgz#0b4f4f9bd509f4510079e9e0734a734fd17cdce3" - integrity sha512-stjCkIoMe6h+1fWtXlA6cRfikdBzCLp3SnVk7c48cv/uy3DTGoXhN76YaOYUJuy3aEDvDIKwKR5KSmvrtPvQPQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-scroll-area@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.3.tgz#01bbc4df59a166e4a21051a40f017903a0ce7004" - integrity sha512-sBX9j8Q+0/jReNObEAveKIGXJtk3xUoSIx4cMKygGtO128QJyVDn01XNOFsyvihKDCTcu7SINzQ2jPAZEhIQtw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/number" "1.0.0" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - -"@radix-ui/react-select@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-1.2.1.tgz#0c8fadc9a134709036add7c9c7c8581e17962040" - integrity sha512-GULRMITaOHNj79BZvQs3iZO0+f2IgI8g5HDhMi7Bnc13t7IlG86NFtOCfTLme4PNZdEtU+no+oGgcl6IFiphpQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/number" "1.0.0" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.2" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-popper" "1.1.1" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-slot" "1.0.1" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-use-previous" "1.0.0" - "@radix-ui/react-visually-hidden" "1.0.2" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.5" - -"@radix-ui/react-separator@1.0.2", "@radix-ui/react-separator@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.0.2.tgz#52417c8bfae1e4ef87356b2f7bffbc3dbbeddf23" - integrity sha512-lZoAG/rS2jzb/OSvyBrpN3dmikw20ewmWx1GkM1VldbDyD0DACCbH9LIXSrqyS/2mE1VYKOHmyq5W90Dx4ryqA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.2" - -"@radix-ui/react-slider@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-1.1.1.tgz#5685f23b6244804a5b1f55cee2d321a2acd1878e" - integrity sha512-0aswLpUKZIraPEOcXfwW25N1KPfLA6Mvm1TxogUChGsbLbys2ihd7uk9XAKsol9ZQPucxh2/mybwdRtAKrs/MQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/number" "1.0.0" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-use-previous" "1.0.0" - "@radix-ui/react-use-size" "1.0.0" - -"@radix-ui/react-slot@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz#e7868c669c974d649070e9ecbec0b367ee0b4d81" - integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - -"@radix-ui/react-switch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-1.0.2.tgz#e3d1b9fe18b6b1173aadc8b8e6efdc96a28a70f8" - integrity sha512-BcG/LKehxt36NXG0wPnoCitIfSMtU9Xo7BmythYA1PAMLtsMvW7kALfBzmduQoHTWcKr0AVcFyh0gChBUp9TiQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-previous" "1.0.0" - "@radix-ui/react-use-size" "1.0.0" - -"@radix-ui/react-tabs@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.3.tgz#8b4158160a7c6633c893c74641e929d2708e709a" - integrity sha512-4CkF/Rx1GcrusI/JZ1Rvyx4okGUs6wEenWA0RG/N+CwkRhTy7t54y7BLsWUXrAz/GRbBfHQg/Odfs/RoW0CiRA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-roving-focus" "1.0.3" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-toast@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toast/-/react-toast-1.1.3.tgz#41098f05bace7976cd4c07f6ff418261f86ede6e" - integrity sha512-yHFgpxi9wjbfPvpSPdYAzivCqw48eA1ofT8m/WqYOVTxKPdmQMuVKRYPlMmj4C1d6tJdFj/LBa1J4iY3fL4OwQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-collection" "1.0.2" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-visually-hidden" "1.0.2" - -"@radix-ui/react-toggle-group@1.0.3", "@radix-ui/react-toggle-group@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.3.tgz#6e37d03ce7d0102250ae84a26cb740c8268db26c" - integrity sha512-fl7yQ3Ty9+jeWb+TwzMkidXhTgFc5HKFxaEDn9nShjLPS1ya/bA5t2JK8wkUaUH6mo6yU+M3vcmUkxnchlXYtw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-roving-focus" "1.0.3" - "@radix-ui/react-toggle" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-toggle@1.0.2", "@radix-ui/react-toggle@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.0.2.tgz#d27ba93b72ad7d06a0138237b25e2b367d8ac64a" - integrity sha512-1MhVrHjgdmYDBgBpmOB0sjK096gFrVqUocsHNapkOTkZIxOwjpGxnW9e24CjQQX9D/c57dI6E8zAAdeAeIdY8g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-use-controllable-state" "1.0.0" - -"@radix-ui/react-toolbar@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toolbar/-/react-toolbar-1.0.3.tgz#c90decc308efa1260ed850909db4f945ac3e0dff" - integrity sha512-SRtXJ0ydFIkEYKt9c9/fxe+qJSHrMpUwY4xeeTa2Lxakrars7cih8MvX46e49KfyiP2z83xTYzJlrnw0L0ifow== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-direction" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-roving-focus" "1.0.3" - "@radix-ui/react-separator" "1.0.2" - "@radix-ui/react-toggle-group" "1.0.3" - -"@radix-ui/react-tooltip@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.5.tgz#fe20274aeac874db643717fc7761d5a8abdd62d1" - integrity sha512-cDKVcfzyO6PpckZekODJZDe5ZxZ2fCZlzKzTmPhe4mX9qTHRfLcKgqb0OKf22xLwDequ2tVleim+ZYx3rabD5w== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.3" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-popper" "1.1.1" - "@radix-ui/react-portal" "1.0.2" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.2" - "@radix-ui/react-slot" "1.0.1" - "@radix-ui/react-use-controllable-state" "1.0.0" - "@radix-ui/react-visually-hidden" "1.0.2" - -"@radix-ui/react-use-callback-ref@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" - integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== +"@reach/auto-id@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.17.0.tgz#60cce65eb7a0d6de605820727f00dfe2b03b5f17" + integrity sha512-ud8iPwF52RVzEmkHq1twuqGuPA+moreumUHdtgvU3sr3/15BNhwp3KyDLrKKSz0LP1r3V4pSdyF9MbYM8BoSjA== dependencies: - "@babel/runtime" "^7.13.10" + "@reach/utils" "0.17.0" + tslib "^2.3.0" -"@radix-ui/react-use-controllable-state@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" - integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== +"@reach/combobox@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/combobox/-/combobox-0.17.0.tgz#fb9d71d2d5aff3b339dce0ec5e3b73628a51b009" + integrity sha512-2mYvU5agOBCQBMdlM4cri+P1BbNwp05P1OuDyc33xJSNiBG7BMy4+ZSHJ0X4fyle6rHwSgCAOCLOeWV1XUYjoQ== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" + "@reach/auto-id" "0.17.0" + "@reach/descendants" "0.17.0" + "@reach/popover" "0.17.0" + "@reach/portal" "0.17.0" + "@reach/utils" "0.17.0" + prop-types "^15.7.2" + tiny-warning "^1.0.3" + tslib "^2.3.0" -"@radix-ui/react-use-escape-keydown@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz#09ab6455ab240b4f0a61faf06d4e5132c4d639f6" - integrity sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA== +"@reach/descendants@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/descendants/-/descendants-0.17.0.tgz#3fb087125a67870acd4dee1528449ed546829b67" + integrity sha512-c7lUaBfjgcmKFZiAWqhG+VnXDMEhPkI4kAav/82XKZD6NVvFjsQOTH+v3tUkskrAPV44Yuch0mFW/u5Ntifr7Q== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" + "@reach/utils" "0.17.0" + tslib "^2.3.0" -"@radix-ui/react-use-layout-effect@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" - integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== +"@reach/dialog@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/dialog/-/dialog-0.17.0.tgz#81c48dd4405945dfc6b6c3e5e125db2c4324e9e8" + integrity sha512-AnfKXugqDTGbeG3c8xDcrQDE4h9b/vnc27Sa118oQSquz52fneUeX9MeFb5ZEiBJK8T5NJpv7QUTBIKnFCAH5A== dependencies: - "@babel/runtime" "^7.13.10" + "@reach/portal" "0.17.0" + "@reach/utils" "0.17.0" + prop-types "^15.7.2" + react-focus-lock "^2.5.2" + react-remove-scroll "^2.4.3" + tslib "^2.3.0" + +"@reach/dropdown@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/dropdown/-/dropdown-0.17.0.tgz#8140bb2e6a045f91e07c6d5a6ff960958df2ef33" + integrity sha512-qBTIGInhxtPHtdj4Pl2XZgZMz3e37liydh0xR3qc48syu7g71sL4nqyKjOzThykyfhA3Pb3/wFgsFJKGTSdaig== + dependencies: + "@reach/auto-id" "0.17.0" + "@reach/descendants" "0.17.0" + "@reach/popover" "0.17.0" + "@reach/utils" "0.17.0" + tslib "^2.3.0" + +"@reach/listbox@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/listbox/-/listbox-0.17.0.tgz#e709f31056bb77781e74c9f0b69bf9ec8efbbc8b" + integrity sha512-AMnH1P6/3VKy2V/nPb4Es441arYR+t4YRdh9jdcFVrCOD6y7CQrlmxsYjeg9Ocdz08XpdoEBHM3PKLJqNAUr7A== + dependencies: + "@reach/auto-id" "0.17.0" + "@reach/descendants" "0.17.0" + "@reach/machine" "0.17.0" + "@reach/popover" "0.17.0" + "@reach/utils" "0.17.0" + prop-types "^15.7.2" -"@radix-ui/react-use-previous@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz#e48a69c3a7d8078a967084038df66d0d181c56ac" - integrity sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg== +"@reach/machine@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/machine/-/machine-0.17.0.tgz#4e4bbf66e3c3934e65243485ac84f6f8fa3d9a24" + integrity sha512-9EHnuPgXzkbRENvRUzJvVvYt+C2jp7PGN0xon7ffmKoK8rTO6eA/bb7P0xgloyDDQtu88TBUXKzW0uASqhTXGA== dependencies: - "@babel/runtime" "^7.13.10" + "@reach/utils" "0.17.0" + "@xstate/fsm" "1.4.0" + tslib "^2.3.0" -"@radix-ui/react-use-rect@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz#b040cc88a4906b78696cd3a32b075ed5b1423b3e" - integrity sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew== +"@reach/menu-button@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/menu-button/-/menu-button-0.17.0.tgz#9f40979129b61f8bdc19590c527f7ed4883d2dce" + integrity sha512-YyuYVyMZKamPtivoEI6D0UEILYH3qZtg4kJzEAuzPmoR/aHN66NZO75Fx0gtjG1S6fZfbiARaCOZJC0VEiDOtQ== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/rect" "1.0.0" + "@reach/dropdown" "0.17.0" + "@reach/popover" "0.17.0" + "@reach/utils" "0.17.0" + prop-types "^15.7.2" + tiny-warning "^1.0.3" + tslib "^2.3.0" -"@radix-ui/react-use-size@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz#a0b455ac826749419f6354dc733e2ca465054771" - integrity sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.0" +"@reach/observe-rect@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" + integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== + +"@reach/popover@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/popover/-/popover-0.17.0.tgz#feda6961f37d17b8738d2d52af6bfc5c4584464f" + integrity sha512-yYbBF4fMz4Ml4LB3agobZjcZ/oPtPsNv70ZAd7lEC2h7cvhF453pA+zOBGYTPGupKaeBvgAnrMjj7RnxDU5hoQ== + dependencies: + "@reach/portal" "0.17.0" + "@reach/rect" "0.17.0" + "@reach/utils" "0.17.0" + tabbable "^4.0.0" + tslib "^2.3.0" + +"@reach/portal@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.17.0.tgz#1dd69ffc8ffc8ba3e26dd127bf1cc4b15f0c6bdc" + integrity sha512-+IxsgVycOj+WOeNPL2NdgooUdHPSY285wCtj/iWID6akyr4FgGUK7sMhRM9aGFyrGpx2vzr+eggbUmAVZwOz+A== + dependencies: + "@reach/utils" "0.17.0" + tiny-warning "^1.0.3" + tslib "^2.3.0" + +"@reach/rect@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.17.0.tgz#804f0cfb211e0beb81632c64d4532ec9d1d73c48" + integrity sha512-3YB7KA5cLjbLc20bmPkJ06DIfXSK06Cb5BbD2dHgKXjUkT9WjZaLYIbYCO8dVjwcyO3GCNfOmPxy62VsPmZwYA== + dependencies: + "@reach/observe-rect" "1.2.0" + "@reach/utils" "0.17.0" + prop-types "^15.7.2" + tiny-warning "^1.0.3" + tslib "^2.3.0" + +"@reach/tooltip@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/tooltip/-/tooltip-0.17.0.tgz#044b43de248a05b18641b4220310983cb54675a2" + integrity sha512-HP8Blordzqb/Cxg+jnhGmWQfKgypamcYLBPlcx6jconyV5iLJ5m93qipr1giK7MqKT2wlsKWy44ZcOrJ+Wrf8w== + dependencies: + "@reach/auto-id" "0.17.0" + "@reach/portal" "0.17.0" + "@reach/rect" "0.17.0" + "@reach/utils" "0.17.0" + "@reach/visually-hidden" "0.17.0" + prop-types "^15.7.2" + tiny-warning "^1.0.3" + tslib "^2.3.0" -"@radix-ui/react-visually-hidden@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.2.tgz#29b117a59ef09a984bdad12cb98d81e8350be450" - integrity sha512-qirnJxtYn73HEk1rXL12/mXnu2rwsNHDID10th2JGtdK25T9wX+mxRmGt7iPSahw512GbZOc0syZX1nLQGoEOg== +"@reach/utils@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.17.0.tgz#3d1d2ec56d857f04fe092710d8faee2b2b121303" + integrity sha512-M5y8fCBbrWeIsxedgcSw6oDlAMQDkl5uv3VnMVJ7guwpf4E48Xlh1v66z/1BgN/WYe2y8mB/ilFD2nysEfdGeA== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.2" + tiny-warning "^1.0.3" + tslib "^2.3.0" -"@radix-ui/rect@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.0.tgz#0dc8e6a829ea2828d53cbc94b81793ba6383bf3c" - integrity sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg== +"@reach/visually-hidden@0.17.0", "@reach/visually-hidden@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@reach/visually-hidden/-/visually-hidden-0.17.0.tgz#033adba10b5ec419649da8d6bd8e46db06d4c3a1" + integrity sha512-T6xF3Nv8vVnjVkGU6cm0+kWtvliLqPAo8PcZ+WxkKacZsaHTjaZb4v1PaCcyQHmuTNT/vtTVNOJLG0SjQOIb7g== dependencies: - "@babel/runtime" "^7.13.10" + prop-types "^15.7.2" + tslib "^2.3.0" "@react-aria/ssr@^3.4.1": version "3.5.0" @@ -1515,14 +559,7 @@ dependencies: "@swc/helpers" "^0.4.14" -"@react-aria/ssr@^3.5.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.6.0.tgz#e5d52bd1686ff229f68f806cf94ee29dd9f54fb7" - integrity sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg== - dependencies: - "@swc/helpers" "^0.4.14" - -"@restart/hooks@^0.4.0", "@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7", "@restart/hooks@^0.4.9": +"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": version "0.4.9" resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.9.tgz" integrity sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ== @@ -1544,21 +581,6 @@ uncontrollable "^7.2.1" warning "^4.0.3" -"@restart/ui@^1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.3.tgz#8063f5b5e0131d41db2cefe148b20cb08a208e76" - integrity sha512-7HM5aiSWvJBWr+FghZj/n3PSuH2kUrOPiu/D92aIv1zTL8IBwFoQ3oz/f76svoN5v2PKaP6pQbg6vTcIiSffzg== - dependencies: - "@babel/runtime" "^7.21.0" - "@popperjs/core" "^2.11.6" - "@react-aria/ssr" "^3.5.0" - "@restart/hooks" "^0.4.9" - "@types/warning" "^3.0.0" - dequal "^2.0.3" - dom-helpers "^5.2.0" - uncontrollable "^7.2.1" - warning "^4.0.3" - "@rushstack/eslint-patch@^1.1.3": version "1.2.0" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" @@ -1571,20 +593,6 @@ dependencies: tslib "^2.4.0" -"@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - "@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -1595,28 +603,6 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/mdurl@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - "@types/node@18.13.0": version "18.13.0" resolved "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz" @@ -1634,7 +620,7 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": +"@types/react-transition-group@^4.4.4": version "4.4.5" resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== @@ -1655,11 +641,6 @@ resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== -"@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - "@types/warning@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" @@ -1709,23 +690,10 @@ "@typescript-eslint/types" "5.52.0" eslint-visitor-keys "^3.3.0" -"@zeit/schemas@2.29.0": - version "2.29.0" - resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.29.0.tgz#a59ae6ebfdf4ddc66a876872dd736baa58b6696c" - integrity sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" +"@xstate/fsm@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.4.0.tgz#6fd082336fde4d026e9e448576189ee5265fa51a" + integrity sha512-uTHDeu2xI5E1IFwf37JFQM31RrH7mY7877RqPBS4ZqSNUwoLDuct8AhBWaXGnVizBAYyimVwgCyGa9z/NiRhXA== acorn-jsx@^5.3.2: version "5.3.2" @@ -1737,26 +705,11 @@ acorn@^8.8.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1767,23 +720,11 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -1791,48 +732,18 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -arg@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-hidden@^1.1.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - aria-query@^5.1.3: version "5.1.3" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" @@ -1840,11 +751,6 @@ aria-query@^5.1.3: dependencies: deep-equal "^2.0.5" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -1930,11 +836,6 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -1947,10 +848,10 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== big-integer@^1.6.48: version "1.6.51" @@ -1962,73 +863,12 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -big.js@^6.1.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" - integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bip39-light@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/bip39-light/-/bip39-light-1.0.7.tgz#06a72f251b89389a136d3f177f29b03342adc5ba" - integrity sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q== - dependencies: - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - -bip39@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.2.tgz#2baf42ff3071fc9ddd5103de92e8f80d9257ee32" - integrity sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ== - dependencies: - "@types/node" "11.11.6" - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - -bn.js@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -bn.js@5.2.1, bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@5.2.1, bn.js@^5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bootstrap-icons@^1.9.0: - version "1.10.4" - resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.10.4.tgz#97f991eeb215ba8b63474b5fc508be599f2f7931" - integrity sha512-eI3HyIUmpGKRiRv15FCZccV+2sreGE2NnmH8mtxV/nPOzQVu0sPEj8HhF1MwjJ31IhjF0rgMvtYOX5VqIzcb/A== - -bootstrap@^5.2.1, bootstrap@^5.2.3: +bootstrap@^5.2.3: version "5.2.3" resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz" integrity sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ== @@ -2042,20 +882,6 @@ borsh@^0.7.0: bs58 "^4.0.0" text-encoding-utf-8 "^1.0.2" -boxen@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.0.0.tgz#9e5f8c26e716793fc96edcf7cf754cdf5e3fbf32" - integrity sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg== - dependencies: - ansi-align "^3.0.1" - camelcase "^7.0.0" - chalk "^5.0.1" - cli-boxes "^3.0.0" - string-width "^5.1.2" - type-fest "^2.13.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2064,34 +890,27 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -bs58@^4.0.0, bs58@^4.0.1: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" @@ -2106,16 +925,6 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" - integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== - camelize@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" @@ -2131,23 +940,6 @@ capability@^0.2.5: resolved "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz" integrity sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg== -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chalk-template@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" - integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== - dependencies: - chalk "^4.1.2" - -chalk@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" - integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== - chalk@^2.0.0: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -2157,7 +949,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.2: +chalk@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2165,107 +957,32 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -"charenc@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -chokidar@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -classnames@^2.2.0, classnames@^2.3.1, classnames@^2.3.2: +classnames@^2.3.1: version "2.3.2" resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - client-only@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clipboardy@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" - integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== - dependencies: - arch "^2.2.0" - execa "^5.1.1" - is-wsl "^2.2.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== +codemirror-graphql@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-2.0.8.tgz#0d63cc6a5c5792081041e319078cfc2969dd97ef" + integrity sha512-EU+pXsSKZJAFVdF8j5hbB5gqXsDDjsBiJoohQq09yhsr69pzaI8ZrXjmpuR4CMyf9jgqcz5KK7rsTmxDHmeJPQ== dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" + graphql-language-service "5.1.6" -collections@^5.1.12: - version "5.1.13" - resolved "https://registry.yarnpkg.com/collections/-/collections-5.1.13.tgz#eee204a93b67473c8e74e00e934a997cc2817585" - integrity sha512-SCb6Qd+d3Z02corWQ7/mqXiXeeTdHvkP6TeFSYfGYdCFp1WrjSNZ3j6y8Y3T/7osGEe0iOcU2g1d346l99m4Lg== - dependencies: - weak-map "~1.0.x" +codemirror@^5.65.3: + version "5.65.13" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.13.tgz#c098a6f409db8b5a7c5722788bd9fa3bb2367f2e" + integrity sha512-SVWEzKXmbHmTQQWaz03Shrh4nybG0wXx2MEu3FO4ezbPW8IbnZEd5iGHGEffSUaitKYa3i+pHpBsSvw8sPHtzg== color-convert@^1.9.0: version "1.9.3" @@ -2291,131 +1008,23 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-scroll-into-view@^1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43" - integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concurrently@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.0.1.tgz#80c0591920a9fa3e68ba0dd8aa6eac8487eb904c" - integrity sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA== - dependencies: - chalk "^4.1.2" - date-fns "^2.29.3" - lodash "^4.17.21" - rxjs "^7.8.0" - shell-quote "^1.8.0" - spawn-command "0.0.2-1" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.1" - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-to-clipboard@^3.3.3: +copy-to-clipboard@^3.2.0: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@1.1.7, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -2425,11 +1034,6 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -"crypt@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" @@ -2454,18 +1058,6 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -date-fns@^2.29.3: - version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -2473,31 +1065,14 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -decode-uri-component@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deep-equal@^2.0.5, deep-equal@^2.2.0: +deep-equal@^2.0.5: version "2.2.0" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== @@ -2520,11 +1095,6 @@ deep-equal@^2.0.5, deep-equal@^2.2.0: which-collection "^1.0.1" which-typed-array "^1.1.9" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -2543,7 +1113,7 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -depd@2.0.0, depd@^2.0.0: +depd@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -2553,31 +1123,16 @@ depd@~1.1.2: resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.0, dequal@^2.0.2, dequal@^2.0.3: +dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dijkstrajs@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" - integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -2612,34 +1167,6 @@ dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -elliptic@6.5.4, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" @@ -2650,16 +1177,6 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encode-utf8@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - enhanced-resolve@^5.10.0: version "5.12.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" @@ -2668,7 +1185,12 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -error-polyfill@^0.1.2, error-polyfill@^0.1.3: +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +error-polyfill@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/error-polyfill/-/error-polyfill-0.1.3.tgz" integrity sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg== @@ -2756,16 +1278,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -2776,11 +1288,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - eslint-config-next@13.1.6: version "13.1.6" resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.1.6.tgz" @@ -2997,104 +1504,6 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -ethers@^5.7.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - -execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -3121,13 +1530,6 @@ fast-levenshtein@^2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - fastq@^1.6.0: version "1.15.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" @@ -3135,13 +1537,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" @@ -3156,32 +1551,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -3203,6 +1572,13 @@ flatted@^3.1.0: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +focus-lock@^0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" + integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== + dependencies: + tslib "^2.0.3" + for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" @@ -3210,31 +1586,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -3255,11 +1611,6 @@ functions-have-names@^1.2.2: resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" @@ -3274,11 +1625,6 @@ get-nonce@^1.0.0: resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" @@ -3292,7 +1638,7 @@ get-tsconfig@^4.2.0: resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz" integrity sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3318,18 +1664,6 @@ glob@7.1.7, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3399,6 +1733,24 @@ grapheme-splitter@^1.0.4: resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphiql@^2.4.1: + version "2.4.7" + resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-2.4.7.tgz#77eae9e8b31628bad363384c5b382de9fad1ff86" + integrity sha512-Fm3fVI65EPyXy+PdbeQUyODTwl2NhpZ47msGnGwpDvdEzYdgF7pPrxL96xCfF31KIauS4+ceEJ+ZwEe5iLWiQw== + dependencies: + "@graphiql/react" "^0.17.6" + "@graphiql/toolkit" "^0.8.4" + graphql-language-service "^5.1.6" + markdown-it "^12.2.0" + +graphql-language-service@5.1.6, graphql-language-service@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/graphql-language-service/-/graphql-language-service-5.1.6.tgz#0d6d2b2bb09cf0d02c82fd97628dfdc63ce7936b" + integrity sha512-sl9HTlE/sBoFvZ2SPGnApwpp/a4ahl1d49SOxGm2OIYOslFv00MK7AYms9Yx91omOwAp74is10S7Cjamh5TRQw== + dependencies: + nullthrows "^1.0.0" + vscode-languageserver-types "^3.17.1" + graphql@^16.6.0: version "16.6.0" resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" @@ -3450,88 +1802,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0: +hoist-non-react-statics@^3.0.0: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - http-errors@^1.7.2: version "1.8.1" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" @@ -3543,40 +1820,10 @@ http-errors@^1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -idb@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" - integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== - -iframe-resizer-react@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iframe-resizer-react/-/iframe-resizer-react-1.1.0.tgz#5009e019b7a5c7f1c009bff5bcdf0dbf33557465" - integrity sha512-FrytSq91AIJaDgE+6uK/Vdd6IR8CrwLoZ6eGmL2qQMPTzF0xlSV2jaSzRRUh5V2fttD7vzl21jvBl97bV40eBw== - dependencies: - iframe-resizer "^4.3.0" - warning "^4.0.3" - -iframe-resizer@^4.3.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/iframe-resizer/-/iframe-resizer-4.3.6.tgz#61d92c1adefe5d416bff4fbf80c7f1f74be70ec0" - integrity sha512-wz0WodRIF6eP0oGQa5NIP1yrITAZ59ZJvVaVJqJRjaeCtfm461vy2C3us6CKx0e7pooqpIGLpVMSTzrfAjX9Sg== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0: version "5.2.4" @@ -3604,21 +1851,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - internal-slot@^1.0.3, internal-slot@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" @@ -3628,36 +1865,13 @@ internal-slot@^1.0.3, internal-slot@^1.0.4: has "^1.0.3" side-channel "^1.0.4" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.1, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -3682,13 +1896,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" @@ -3697,11 +1904,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" @@ -3714,13 +1916,6 @@ is-core-module@^2.10.0, is-core-module@^2.11.0, is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-core-module@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" @@ -3728,11 +1923,6 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" @@ -3743,33 +1933,18 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-mobile@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-3.1.1.tgz#3b9e48f40068e4ea2da411f5009779844ce8d6aa" - integrity sha512-RRoXXR2HNFxNkUnxtaBdGBXtFlUMFa06S0NUKf/LCF+MuGLu13gi9iBCkoEmc6+rpXuwi5Mso5V8Zf7mNynMBQ== - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" @@ -3792,15 +1967,17 @@ is-path-inside@^3.0.3: resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" -is-port-reachable@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-4.0.0.tgz#dac044091ef15319c8ab2f34604d8794181f8c2d" - integrity sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig== +is-primitive@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-3.0.1.tgz#98c4db1abff185485a657fc2905052b940524d05" + integrity sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w== is-regex@^1.1.4: version "1.1.4" @@ -3822,11 +1999,6 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" @@ -3879,11 +2051,6 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" @@ -3894,6 +2061,11 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + js-sdsl@^4.1.4: version "4.3.0" resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz" @@ -3904,11 +2076,6 @@ js-sha256@^0.9.0: resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -3931,11 +2098,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "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-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" @@ -3961,11 +2123,6 @@ json5@^2.1.2: array-includes "^3.1.5" object.assign "^4.1.3" -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" @@ -3986,6 +2143,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -3995,18 +2159,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -local-storage@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/local-storage/-/local-storage-2.0.0.tgz#748b7d041b197f46f3ec7393640851c175b64db8" - integrity sha512-/0sRoeijw7yr/igbVVygDuq6dlYCmtsuTmmpnweVlVtl/s10pf5BCq8LWBxW/AMyFJ3MhMUuggMZiYlx6qr9tw== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -4014,41 +2166,23 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.11, lodash@^4.17.21: +lodash@^4.17.11: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" @@ -4056,568 +2190,72 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -markdown-table@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" - integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-find-and-replace@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" - integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== - dependencies: - "@types/mdast" "^3.0.0" - escape-string-regexp "^5.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -mdast-util-from-markdown@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" - integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" - integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== - dependencies: - "@types/mdast" "^3.0.0" - ccount "^2.0.0" - mdast-util-find-and-replace "^2.0.0" - micromark-util-character "^1.0.0" - -mdast-util-gfm-footnote@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" - integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - micromark-util-normalize-identifier "^1.0.0" - -mdast-util-gfm-strikethrough@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" - integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm-table@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" - integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== - dependencies: - "@types/mdast" "^3.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm-task-list-item@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" - integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" - integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== - dependencies: - mdast-util-from-markdown "^1.0.0" - mdast-util-gfm-autolink-literal "^1.0.0" - mdast-util-gfm-footnote "^1.0.0" - mdast-util-gfm-strikethrough "^1.0.0" - mdast-util-gfm-table "^1.0.0" - mdast-util-gfm-task-list-item "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-phrasing@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" - integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== - dependencies: - "@types/mdast" "^3.0.0" - unist-util-is "^5.0.0" - -mdast-util-to-hast@^11.0.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-11.3.0.tgz#ea9220617a710e80aa5cc3ac7cc9d4bb0440ae7a" - integrity sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - "@types/mdurl" "^1.0.0" - mdast-util-definitions "^5.0.0" - mdurl "^1.0.0" - unist-builder "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" - integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== +markdown-it@^12.2.0: + version "12.3.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== dependencies: - "@types/mdast" "^3.0.0" + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" -mdurl@^1.0.0: +mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +meros@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" + integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== -micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-extension-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" - integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - micromark-util-character "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + braces "^3.0.2" + picomatch "^2.3.1" -micromark-extension-gfm-footnote@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.0.tgz#73e3db823db9defef25f68074cb4cf4bb9cf6a8c" - integrity sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-strikethrough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.5.tgz#4db40b87d674a6fe1d00d59ac91118e4f5960f12" - integrity sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w== +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + brace-expansion "^1.1.7" -micromark-extension-gfm-table@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" - integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -micromark-extension-gfm-tagfilter@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" - integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== - dependencies: - micromark-util-types "^1.0.0" +moo@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== -micromark-extension-gfm-task-list-item@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.4.tgz#4b66d87847de40cef2b5ceddb9f9629a6dfe7472" - integrity sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -micromark-extension-gfm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" - integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== - dependencies: - micromark-extension-gfm-autolink-literal "^1.0.0" - micromark-extension-gfm-footnote "^1.0.0" - micromark-extension-gfm-strikethrough "^1.0.0" - micromark-extension-gfm-table "^1.0.0" - micromark-extension-gfm-tagfilter "^1.0.0" - micromark-extension-gfm-task-list-item "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" +mustache@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== -micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== - -micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== - -micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-sanitize-uri@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== - -micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -moo@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" - integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mustache@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -nanoid@3.3.4, nanoid@^3.3.4: +nanoid@^3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -nanoid@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" - integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -4640,143 +2278,10 @@ near-api-js@1.1.0: text-encoding-utf-8 "^1.0.2" tweetnacl "^1.0.1" -near-api-js@^0.45.1: - version "0.45.1" - resolved "https://registry.yarnpkg.com/near-api-js/-/near-api-js-0.45.1.tgz#0f0a4b378758a2f1b32555399d7356da73d0ef27" - integrity sha512-QyPO/vjvMFlcMO1DCpsqzmnSqPIyHsjK1Qi4B5ZR1cJCIWMkqugDF/TDf8FVQ85pmlcYeYwfiTqKanKz+3IG0A== - dependencies: - bn.js "5.2.0" - borsh "^0.7.0" - bs58 "^4.0.0" - depd "^2.0.0" - error-polyfill "^0.1.3" - http-errors "^1.7.2" - js-sha256 "^0.9.0" - mustache "^4.0.0" - node-fetch "^2.6.1" - text-encoding-utf-8 "^1.0.2" - tweetnacl "^1.0.1" - -near-hd-key@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/near-hd-key/-/near-hd-key-1.2.1.tgz#f508ff15436cf8a439b543220f3cc72188a46756" - integrity sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg== - dependencies: - bip39 "3.0.2" - create-hmac "1.1.7" - tweetnacl "1.0.3" - -near-seed-phrase@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/near-seed-phrase/-/near-seed-phrase-0.2.0.tgz#fb7cf89682112b1160ab68abb50dc821f49be18a" - integrity sha512-NpmrnejpY1AdlRpDZ0schJQJtfBaoUheRfiYtQpcq9TkwPgqKZCRULV5L3hHmLc0ep7KRtikbPQ9R2ztN/3cyQ== - dependencies: - bip39-light "^1.0.7" - bs58 "^4.0.1" - near-hd-key "^1.2.1" - tweetnacl "^1.0.2" - -near-social-bridge@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/near-social-bridge/-/near-social-bridge-1.3.0.tgz#8daeca1135b63db34e34b5e2b1703f705e9a4d33" - integrity sha512-R/BUTUJDOUG8U0lJmqz5OdtYYi46bgljsiiXmJJblTOMyOrIkY7W++YK4+UkqAPEK+XEAIZL5uNAJPwy/nrn8w== - -near-social-local-viewer@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/near-social-local-viewer/-/near-social-local-viewer-2.1.1.tgz#7d009f51037482f461ec981c4e412b84525ae343" - integrity sha512-W6YiynYiFRRctc6CnF6bJGb8dqLnMum5GG/6gm+unNGc68d19YxtZuTBQ+3B8pRyiqLMZ0F7UQHwDx8zbaFyjg== - dependencies: - "@monaco-editor/react" "^4.4.6" - "@near-wallet-selector/core" "^7.9.0" - "@near-wallet-selector/here-wallet" "^7.9.0" - "@near-wallet-selector/meteor-wallet" "^7.9.0" - "@near-wallet-selector/modal-ui" "^7.9.0" - "@near-wallet-selector/my-near-wallet" "^7.9.0" - "@near-wallet-selector/near-wallet" "^7.9.0" - "@near-wallet-selector/neth" "^7.9.0" - "@near-wallet-selector/sender" "^7.9.0" - big.js "^6.1.1" - bn.js "^5.1.1" - bootstrap "^5.2.1" - bootstrap-icons "^1.9.0" - collections "^5.1.12" - concurrently "^8.0.1" - cors "^2.8.5" - error-polyfill "^0.1.2" - express "^4.18.2" - local-storage "^2.0.0" - near-api-js "^0.45.1" - near-social-vm "git+https://github.com/NearSocial/VM.git#1.2.0" - nodemon "^2.0.22" - prettier "^2.7.1" - react "^18.2.0" - react-bootstrap "^2.5.0" - react-dom "^18.2.0" - react-router-dom "^5.2.0" - serve "^14.2.0" - shelljs "^0.8.5" - styled-components "^5.3.6" - -"near-social-vm@git+https://github.com/NearSocial/VM.git#1.2.0": - version "1.2.0" - resolved "git+https://github.com/NearSocial/VM.git#10064520f3b752cffcbeb13133b5c97f5d287e4a" - dependencies: - "@braintree/sanitize-url" "6.0.0" - "@radix-ui/react-accordion" "^1.1.1" - "@radix-ui/react-alert-dialog" "^1.0.3" - "@radix-ui/react-aspect-ratio" "^1.0.2" - "@radix-ui/react-avatar" "^1.0.2" - "@radix-ui/react-checkbox" "^1.0.3" - "@radix-ui/react-collapsible" "^1.0.2" - "@radix-ui/react-context-menu" "^2.1.3" - "@radix-ui/react-dialog" "^1.0.3" - "@radix-ui/react-dropdown-menu" "^2.0.4" - "@radix-ui/react-hover-card" "^1.0.5" - "@radix-ui/react-label" "^2.0.1" - "@radix-ui/react-menubar" "^1.0.2" - "@radix-ui/react-navigation-menu" "^1.1.2" - "@radix-ui/react-popover" "^1.0.5" - "@radix-ui/react-progress" "^1.0.2" - "@radix-ui/react-radio-group" "^1.1.2" - "@radix-ui/react-scroll-area" "^1.0.3" - "@radix-ui/react-select" "^1.2.1" - "@radix-ui/react-separator" "^1.0.2" - "@radix-ui/react-slider" "^1.1.1" - "@radix-ui/react-switch" "^1.0.2" - "@radix-ui/react-tabs" "^1.0.3" - "@radix-ui/react-toast" "^1.1.3" - "@radix-ui/react-toggle" "^1.0.2" - "@radix-ui/react-toggle-group" "^1.0.3" - "@radix-ui/react-toolbar" "^1.0.3" - "@radix-ui/react-tooltip" "^1.0.5" - acorn "^8.8.0" - acorn-jsx "^5.3.2" - big.js "^6.1.1" - bn.js "^5.1.1" - bootstrap "^5.2.1" - bootstrap-icons "^1.9.0" - collections "^5.1.12" - deep-equal "^2.2.0" - elliptic "^6.5.4" - idb "^7.1.1" - iframe-resizer-react "^1.1.0" - local-storage "^2.0.0" - mdast-util-find-and-replace "^2.0.0" - nanoid "^4.0.1" - near-api-js "^0.45.1" - prettier "^2.7.1" - react-bootstrap "^2.5.0" - react-bootstrap-typeahead "^6.0.0" - react-error-boundary "^3.1.4" - react-files "^3.0.0-alpha.3" - react-infinite-scroller "^1.2.6" - react-markdown "^7.1.0" - react-singleton-hook "^3.1.1" - react-syntax-highlighter "^15.5.0" - react-uuid "^1.0.2" - remark-gfm "^3.0.1" - styled-components "^5.3.6" - tweetnacl "^1.0.3" +near-social-bridge@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/near-social-bridge/-/near-social-bridge-1.4.1.tgz#fa6757a95a0de5007bb0ebf28d46810c1a255bac" + integrity sha512-e8hTbBI9Pwq1aKpM6kvZ3Sy1DjjcAOau0wF/Sp9LsT7q2+F1QxeDMkO7ndQrkJI7K0+CIAvjFmoex0ikxBtnug== nearley@^2.20.1: version "2.20.1" @@ -4788,11 +2293,6 @@ nearley@^2.20.1: railroad-diagrams "^1.0.0" randexp "0.4.6" -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - next@13.1.6: version "13.1.6" resolved "https://registry.npmjs.org/next/-/next-13.1.6.tgz" @@ -4832,40 +2332,10 @@ node-sql-parser@^4.4.0: dependencies: big-integer "^1.6.48" -nodemon@^2.0.22: - version "2.0.22" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" - integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== - dependencies: - chokidar "^3.5.2" - debug "^3.2.7" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^5.7.1" - simple-update-notifier "^1.0.7" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" +nullthrows@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== o3@^1.0.3: version "1.0.3" @@ -4874,7 +2344,7 @@ o3@^1.0.3: dependencies: capability "^0.2.5" -object-assign@^4, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4942,18 +2412,6 @@ object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - once@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" @@ -4961,13 +2419,6 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - open@^8.4.0: version "8.4.1" resolved "https://registry.npmjs.org/open/-/open-8.4.1.tgz" @@ -4989,13 +2440,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" @@ -5003,13 +2447,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" @@ -5017,11 +2454,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -5029,23 +2461,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" @@ -5056,12 +2471,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -5071,54 +2481,21 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.9: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.0, picomatch@^2.3.1: +picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" - integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== - postcss-value-parser@^4.0.2: version "4.2.0" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" @@ -5152,16 +2529,6 @@ prettier@^2.7.1: resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== -prismjs@^1.27.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -prismjs@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== - prop-types-extra@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" @@ -5170,7 +2537,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.0.0, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -5179,68 +2546,11 @@ prop-types@^15.0.0, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, object-assign "^4.1.1" react-is "^16.13.1" -property-information@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qrcode@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" - integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== - dependencies: - dijkstrajs "^1.0.1" - encode-utf8 "^1.0.3" - pngjs "^5.0.0" - yargs "^15.3.1" - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -query-string@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" - integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== - dependencies: - decode-uri-component "^0.2.2" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -5259,33 +2569,6 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" -randombytes@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-loader@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" @@ -5294,51 +2577,12 @@ raw-loader@^4.0.2: loader-utils "^2.0.0" schema-utils "^3.0.0" -rc@^1.0.1, rc@^1.1.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== +react-bootstrap-icons@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/react-bootstrap-icons/-/react-bootstrap-icons-1.10.3.tgz#5d64a93c7b172856b03c7d3cd5119a025b094966" + integrity sha512-j4hSby6gT9/enhl3ybB1tfr1slZNAYXDVntcRrmVjxB3//2WwqrzpESVqKhyayYVaWpEtnwf9wgUQ03cuziwrw== dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-bootstrap-typeahead@^6.0.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/react-bootstrap-typeahead/-/react-bootstrap-typeahead-6.1.2.tgz#75d96d289d173075c56bb3270296c2ca4632dae6" - integrity sha512-waIWRQ4CUZld69iL+EFiuL/2B+N4LecaAKcRTMQey0NDOM7Sxmtl+iELFzGltt2/DK6yvrxEUCbZI8pTztPFXA== - dependencies: - "@babel/runtime" "^7.14.6" - "@popperjs/core" "^2.10.2" - "@restart/hooks" "^0.4.0" - classnames "^2.2.0" - fast-deep-equal "^3.1.1" - invariant "^2.2.1" - lodash.debounce "^4.0.8" - prop-types "^15.5.8" - react-overlays "^5.2.0" - react-popper "^2.2.5" - scroll-into-view-if-needed "^2.2.20" - warning "^4.0.1" - -react-bootstrap@^2.5.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.4.tgz#db95ecdcdfae9619de14511b5e9923bf95daf73d" - integrity sha512-EPKPwhfbxsKsNBhJBitJwqul9fvmlYWSft6jWE2EpqhEyjhqIqNihvQo2onE5XtS+QHOavUSNmA+8Lnv5YeAyg== - dependencies: - "@babel/runtime" "^7.21.0" - "@restart/hooks" "^0.4.9" - "@restart/ui" "^1.6.3" - "@types/react-transition-group" "^4.4.5" - classnames "^2.3.2" - dom-helpers "^5.2.1" - invariant "^2.2.4" - prop-types "^15.8.1" - prop-types-extra "^1.1.0" - react-transition-group "^4.4.5" - uncontrollable "^7.2.1" - warning "^4.0.3" + prop-types "^15.7.2" react-bootstrap@^2.7.2: version "2.7.2" @@ -5358,7 +2602,14 @@ react-bootstrap@^2.7.2: uncontrollable "^7.2.1" warning "^4.0.3" -react-dom@18.2.0, react-dom@^18.2.0: +react-clientside-effect@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" + integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== + dependencies: + "@babel/runtime" "^7.12.13" + +react-dom@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -5366,88 +2617,29 @@ react-dom@18.2.0, react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-error-boundary@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" - integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== - dependencies: - "@babel/runtime" "^7.12.5" - -react-fast-compare@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.1.tgz#53933d9e14f364281d6cba24bfed7a4afb808b5f" - integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== - -react-files@^3.0.0-alpha.3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/react-files/-/react-files-3.0.0.tgz#d2284e33106cc5ddcc547e8633cad0b633c017b2" - integrity sha512-/Zz7S98vZFYxHw3RVSZcf3dD+xO714ZQd/jEhIp8q+MofBgydXWlHdw05TA4jradL7XpZFPvJaIvM6Z6I5nIHw== - -react-infinite-scroller@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/react-infinite-scroller/-/react-infinite-scroller-1.2.6.tgz#8b80233226dc753a597a0eb52621247f49b15f18" - integrity sha512-mGdMyOD00YArJ1S1F3TVU9y4fGSfVVl6p5gh/Vt4u99CJOptfVu/q5V/Wlle72TMgYlBwIhbxK5wF0C/R33PXQ== +react-focus-lock@^2.5.2: + version "2.9.4" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" + integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== dependencies: - prop-types "^15.5.8" + "@babel/runtime" "^7.0.0" + focus-lock "^0.11.6" + prop-types "^15.6.2" + react-clientside-effect "^1.2.6" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" -react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.0: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-markdown@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-7.1.2.tgz#c9fa9d1c87e24529f028e1cdf731e81ccdd8e547" - integrity sha512-ibMcc0EbfmbwApqJD8AUr0yls8BSrKzIbHaUsPidQljxToCqFh34nwtu3CXNEItcVJNzpjDHrhK8A+MAh2JW3A== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^2.0.0" - prop-types "^15.0.0" - property-information "^6.0.0" - react-is "^17.0.0" - remark-parse "^10.0.0" - remark-rehype "^9.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.3.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" - -react-overlays@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.2.1.tgz#49dc007321adb6784e1f212403f0fb37a74ab86b" - integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA== - dependencies: - "@babel/runtime" "^7.13.8" - "@popperjs/core" "^2.11.6" - "@restart/hooks" "^0.4.7" - "@types/warning" "^3.0.0" - dom-helpers "^5.2.0" - prop-types "^15.7.2" - uncontrollable "^7.2.1" - warning "^4.0.3" - -react-popper@^2.2.5: - version "2.3.0" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" - integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== - dependencies: - react-fast-compare "^3.0.1" - warning "^4.0.2" - -react-remove-scroll-bar@^2.3.3: +react-remove-scroll-bar@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== @@ -5455,50 +2647,17 @@ react-remove-scroll-bar@^2.3.3: react-style-singleton "^2.2.1" tslib "^2.0.0" -react-remove-scroll@2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== +react-remove-scroll@^2.4.3: + version "2.5.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz#7510b8079e9c7eebe00e65a33daaa3aa29a10336" + integrity sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg== dependencies: - react-remove-scroll-bar "^2.3.3" + react-remove-scroll-bar "^2.3.4" react-style-singleton "^2.2.1" tslib "^2.1.0" use-callback-ref "^1.3.0" use-sidecar "^1.1.2" -react-router-dom@^5.2.0: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-singleton-hook@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/react-singleton-hook/-/react-singleton-hook-3.4.0.tgz#23e1fb8ea55c6e4f7fffdc8674bb03e99a948490" - integrity sha512-eQEpyacGAaRejmWUizUdNNQFn5AO0iaKRSl1jxgC0FQadVY/I1WFuPrYiutglPzO9s8yEbIh95UXVJQel4d7HQ== - react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" @@ -5515,18 +2674,7 @@ react-switch@^7.0.0: dependencies: prop-types "^15.7.2" -react-syntax-highlighter@^15.5.0: - version "15.5.0" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" - integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.27.0" - refractor "^3.6.0" - -react-transition-group@^4.4.2, react-transition-group@^4.4.5: +react-transition-group@^4.4.2: version "4.4.5" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -5536,50 +2684,13 @@ react-transition-group@^4.4.2, react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react-uuid@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/react-uuid/-/react-uuid-1.0.3.tgz#77418d1ebd29b4c4ab8e457272887d489aa87836" - integrity sha512-cw6Rr6JphvsdK4xHPGBjKD7XSH6Y6i4NJFWUO3OiDd7NLcR8xVeQ3CfeKm7h+S5tpZZVfbH3Tkrz/ydsIiV8pA== - -react@18.2.0, react@^18.2.0: +react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" -readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -refractor@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - regenerator-runtime@^0.13.11: version "0.13.11" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" @@ -5599,84 +2710,11 @@ regexpp@^3.2.0: resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -registry-auth-token@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== - dependencies: - rc "^1.0.1" - -remark-gfm@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" - integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-gfm "^2.0.0" - micromark-extension-gfm "^2.0.0" - unified "^10.0.0" - -remark-parse@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - -remark-rehype@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-9.1.0.tgz#e4b5b6e19c125b3780343eb66c3e9b99b0f06a81" - integrity sha512-oLa6YmgAYg19zb0ZrBACh40hpBLteYROaPLhBXzLgjqyHQrN+gVP9N/FJvfzuNNuzCutktkroXEZBrxAxKhh7Q== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^11.0.0" - unified "^10.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve@^1.1.6: - version "1.22.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283" - integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== - dependencies: - is-core-module "^2.12.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^1.22.1: version "1.22.1" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" @@ -5712,14 +2750,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -5727,26 +2757,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5760,11 +2771,6 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - scheduler@^0.23.0: version "0.23.0" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" @@ -5781,23 +2787,6 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -scroll-into-view-if-needed@^2.2.20: - version "2.2.31" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587" - integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA== - dependencies: - compute-scroll-into-view "^1.0.20" - -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" @@ -5810,97 +2799,19 @@ semver@^7.3.7: dependencies: lru-cache "^6.0.0" -semver@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-handler@6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -serve@^14.2.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/serve/-/serve-14.2.0.tgz#3d768e88fa13ad8644f2393599189707176e66b8" - integrity sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg== - dependencies: - "@zeit/schemas" "2.29.0" - ajv "8.11.0" - arg "5.0.2" - boxen "7.0.0" - chalk "5.0.1" - chalk-template "0.4.0" - clipboardy "3.0.0" - compression "1.7.4" - is-port-reachable "4.0.0" - serve-handler "6.1.5" - update-check "1.5.4" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-value@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-4.1.0.tgz#aa433662d87081b75ad88a4743bd450f044e7d09" + integrity sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw== + dependencies: + is-plain-object "^2.0.4" + is-primitive "^3.0.1" setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha1@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== - dependencies: - charenc ">= 0.0.1" - crypt ">= 0.0.1" - shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" @@ -5918,20 +2829,6 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" @@ -5941,18 +2838,6 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-update-notifier@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" - integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== - dependencies: - semver "~7.0.0" - slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -5968,26 +2853,6 @@ source-map-js@^1.0.2: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -spawn-command@0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - sql-formatter@^11.0.2: version "11.0.2" resolved "https://registry.yarnpkg.com/sql-formatter/-/sql-formatter-11.0.2.tgz#2fde373c8c1845f8ee9f201d2eccb1fb365cd893" @@ -6001,11 +2866,6 @@ state-local@^1.0.6: resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz" integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.5.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" @@ -6018,29 +2878,6 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" @@ -6073,54 +2910,23 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - styled-components@^5.3.6: version "5.3.6" resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz" @@ -6158,13 +2964,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -6178,6 +2977,11 @@ synckit@^0.8.4: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" +tabbable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-4.0.0.tgz#5bff1d1135df1482cf0f0206434f15eadbeb9261" + integrity sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ== + tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" @@ -6201,12 +3005,7 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: +tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -6233,28 +3032,11 @@ toidentifier@1.0.1: resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" @@ -6275,6 +3057,11 @@ tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.0.3, tslib@^2.3.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -6282,7 +3069,7 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tweetnacl@1.0.3, tweetnacl@^1.0.1, tweetnacl@^1.0.2, tweetnacl@^1.0.3: +tweetnacl@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -6299,19 +3086,6 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^2.13.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" @@ -6331,6 +3105,11 @@ u3@^0.1.1: resolved "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz" integrity sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" @@ -6351,87 +3130,6 @@ uncontrollable@^7.2.1: invariant "^2.2.4" react-lifecycles-compat "^3.0.4" -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unist-builder@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.1.tgz#258b89dcadd3c973656b2327b347863556907f58" - integrity sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-check@1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.4.tgz#5b508e259558f1ad7dbc8b4b0457d4c9d28c8743" - integrity sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ== - dependencies: - registry-auth-token "3.3.2" - registry-url "3.1.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" @@ -6446,11 +3144,6 @@ use-callback-ref@^1.3.0: dependencies: tslib "^2.0.0" -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - use-sidecar@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" @@ -6459,71 +3152,18 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid4@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid4/-/uuid4-2.0.3.tgz#241e5dfe1704a79c52e2aa40e7e581a5e7b01ab4" - integrity sha512-CTpAkEVXMNJl2ojgtpLXHgz23dh8z81u6/HEPiQFOvBc/c2pde6TVHmH4uwY0d/GLF3tb7+VDAj4+2eJaQSdZQ== - -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" +vscode-languageserver-types@^3.17.1: + version "3.17.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64" + integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA== -warning@^4.0.0, warning@^4.0.1, warning@^4.0.2, warning@^4.0.3: +warning@^4.0.0, warning@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" -weak-map@~1.0.x: - version "1.0.8" - resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.8.tgz#394c18a9e8262e790544ed8b55c6a4ddad1cb1a3" - integrity sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -6558,11 +3198,6 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" @@ -6582,124 +3217,22 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.7.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 2c8d367a9667aeacee253d73888d529d8b5201c9 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Mon, 5 Jun 2023 18:16:08 -0500 Subject: [PATCH 07/20] [DPLT-1007] feat: Add link to QueryApi Docs (#95) --- .../widgets/src/QueryApi.IndexerExplorer.jsx | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/frontend/widgets/src/QueryApi.IndexerExplorer.jsx b/frontend/widgets/src/QueryApi.IndexerExplorer.jsx index f8b3c4b02..62afe4def 100644 --- a/frontend/widgets/src/QueryApi.IndexerExplorer.jsx +++ b/frontend/widgets/src/QueryApi.IndexerExplorer.jsx @@ -60,6 +60,8 @@ const Header = styled.div` display: flex; flex-direction: column; gap: 12px; + min-width: 200px; + max-width: 500px; `; const H1 = styled.h1` @@ -200,15 +202,25 @@ const TabsButton = styled.a` } `; +const TextLink = styled.a` + margin: 0; + font-size: 14px; + line-height: 20px; + font-weight: ${(p) => (p.bold ? "600" : "400")}; + font-size: ${(p) => (p.small ? "12px" : "14px")}; + overflow: ${(p) => (p.ellipsis ? "hidden" : "visible")}; + text-overflow: ${(p) => (p.ellipsis ? "ellipsis" : "unset")}; + white-space: nowrap; + outline: none; + + &:focus, + &:hover { + text-decoration: underline; + } +`; + return ( - {state.selectedTab == "my-indexers" && state.my_indexers.length == 0 && ( -
-

- You currently have no indexers. Explore new Indexers and fork them! -

-
- )} State.update({ selectedTab: "my-indexers" })} @@ -244,6 +256,19 @@ return ( )} + {state.selectedTab == "my-indexers" && state.my_indexers.length == 0 && ( +
+

+ QueryAPI streamlines the process of querying specific data from the Near Blockchain. Explore new Indexers and fork them to try it out! +

+

+ To learn more about QueryAPI, visit + + QueryAPI Docs + +

+
+ )} {state.selectedTab == "my-indexers" && ( <> From 96640b3ee7b60fcdfaa392ea61bf740883e0588e Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Tue, 6 Jun 2023 15:00:58 +1200 Subject: [PATCH 08/20] DPLT-1002 Publish current block height of indexer functions to CloudWatch (#88) --- .../__snapshots__/metrics.test.js.snap | 30 +++++++ indexer-js-queue-handler/handler.js | 2 +- .../indexer.integration.test.js | 20 ++--- indexer-js-queue-handler/indexer.js | 10 ++- indexer-js-queue-handler/indexer.test.js | 81 ++++++++++++++----- indexer-js-queue-handler/metrics.js | 38 +++++++++ indexer-js-queue-handler/metrics.test.js | 30 +++++++ indexer-js-queue-handler/serverless.yml | 7 ++ 8 files changed, 186 insertions(+), 32 deletions(-) create mode 100644 indexer-js-queue-handler/__snapshots__/metrics.test.js.snap create mode 100644 indexer-js-queue-handler/metrics.js create mode 100644 indexer-js-queue-handler/metrics.test.js diff --git a/indexer-js-queue-handler/__snapshots__/metrics.test.js.snap b/indexer-js-queue-handler/__snapshots__/metrics.test.js.snap new file mode 100644 index 000000000..6886b82e0 --- /dev/null +++ b/indexer-js-queue-handler/__snapshots__/metrics.test.js.snap @@ -0,0 +1,30 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Metrics writes the block height for an indexer function 1`] = ` +[ + { + "MetricData": [ + { + "Dimensions": [ + { + "Name": "ACCOUNT_ID", + "Value": "morgs.near", + }, + { + "Name": "FUNCTION_NAME", + "Value": "test", + }, + { + "Name": "STAGE", + "Value": "dev", + }, + ], + "MetricName": "INDEXER_FUNCTION_LATEST_BLOCK_HEIGHT", + "Unit": "None", + "Value": 2, + }, + ], + "Namespace": "test", + }, +] +`; diff --git a/indexer-js-queue-handler/handler.js b/indexer-js-queue-handler/handler.js index e508a3098..2f56a5fbd 100644 --- a/indexer-js-queue-handler/handler.js +++ b/indexer-js-queue-handler/handler.js @@ -6,7 +6,7 @@ import AWS from "aws-sdk"; AWSXRay.captureAWS(AWS); export const consumer = async (event) => { - const indexer = new Indexer('mainnet', 'eu-central-1'); + const indexer = new Indexer('mainnet'); for (const record of event.Records) { const jsonBody = JSON.parse(record.body); diff --git a/indexer-js-queue-handler/indexer.integration.test.js b/indexer-js-queue-handler/indexer.integration.test.js index 248d33c84..5a8c3fa14 100644 --- a/indexer-js-queue-handler/indexer.integration.test.js +++ b/indexer-js-queue-handler/indexer.integration.test.js @@ -24,7 +24,7 @@ const mockAwsXray = { describe('Indexer integration tests', () => { test('Indexer.runFunctions() should execute an imperative style test function against a given block using key-value storage', async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: fetch, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: fetch, awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest1'] = {provisioned: false, code: 'context.set("BlockHeight", block.header().height);', schema: 'create table indexer_storage (function_name text, key_name text, value text, primary key (function_name, key_name));'}; const block_height = 85376002; @@ -40,7 +40,7 @@ describe('Indexer integration tests', () => { }, 30000); test('Indexer.runFunctions() should execute a test function against a given block using key-value storage', async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest1'] = {code: 'context.set("BlockHeight", block.header().height);'}; const block_height = 85376546; @@ -51,7 +51,7 @@ describe('Indexer integration tests', () => { }, 30000); test('Indexer.runFunctions() should execute a test function against a given block using a full mutation to write to key-value storage', async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest1'] = {code: 'context.graphql(`mutation { insert_buildnear_testnet_itest1_indexer_storage_one(object: {function_name: "buildnear.testnet/itest3", key_name: "BlockHeight", value: "${block.header().height}"} on_conflict: {constraint: indexer_storage_pkey, update_columns: value}) {key_name}}`);'}; const block_height = 85376546; @@ -65,7 +65,7 @@ describe('Indexer integration tests', () => { * due to known Hasura issues with unique indexes vs unique constraints */ test('Indexer.runFunctions() should execute a near social function against a given block', async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/test'] = {code: @@ -128,7 +128,7 @@ describe('Indexer integration tests', () => { * due to known Hasura issues with unique indexes vs unique constraints */ // needs update to have schema test.skip('Indexer.runFunctions() should execute an imperative style near social function against a given block', async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest5'] = {code:` @@ -176,14 +176,14 @@ describe('Indexer integration tests', () => { }); test("writeLog() should write a log to the database", async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const id = await indexer.writeLog("buildnear.testnet/itest", 85376002, "test message"); expect(id).toBeDefined(); expect(id.length).toBe(36); }); test("writeFunctionState should write a function state to the database", async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const result = await indexer.writeFunctionState("buildnear.testnet/itest8", 85376002); expect(result).toBeDefined(); expect(result.insert_indexer_state.returning[0].current_block_height).toBe(85376002); @@ -191,7 +191,7 @@ describe('Indexer integration tests', () => { // Errors are now exposed to the lambda hander. This test will be relevant again if this changes. test.skip ("function that throws an error should catch the error", async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/test'] = {code:` @@ -205,7 +205,7 @@ describe('Indexer integration tests', () => { // Errors are now exposed to the lambda hander. This test will be relevant again if this changes. test.skip("rejected graphql promise is awaited and caught", async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/itest3'] = {code: @@ -219,7 +219,7 @@ describe('Indexer integration tests', () => { // Unreturned promise rejection seems to be uncatchable even with process.on('unhandledRejection' // However, the next function is run (in this test but not on Lambda). test.skip("function that rejects a promise should catch the error", async () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray }); const functions = {}; functions['buildnear.testnet/fails'] = {code:` diff --git a/indexer-js-queue-handler/indexer.js b/indexer-js-queue-handler/indexer.js index 9869f76a5..25309cd7f 100644 --- a/indexer-js-queue-handler/indexer.js +++ b/indexer-js-queue-handler/indexer.js @@ -3,9 +3,11 @@ import fetch from 'node-fetch'; import { VM } from 'vm2'; import AWS from 'aws-sdk'; import { Block } from '@near-lake/primitives' + import Provisioner from './provisioner.js' import AWSXRay from "aws-xray-sdk"; import traceFetch from "./trace-fetch.js"; +import Metrics from './metrics.js' export default class Indexer { @@ -13,15 +15,15 @@ export default class Indexer { constructor( network, - aws_region, deps ) { this.DEFAULT_HASURA_ROLE = 'append'; this.network = network; - this.aws_region = aws_region; + this.aws_region = process.env.REGION; this.deps = { fetch: traceFetch(fetch), - s3: new AWS.S3({ region: aws_region }), + s3: new AWS.S3({ region: process.env.REGION }), + metrics: new Metrics('QueryAPI'), provisioner: new Provisioner(), awsXray: AWSXRay, ...deps, @@ -43,6 +45,8 @@ export default class Indexer { functionSubsegment.addAnnotation('indexer_function', function_name); simultaneousPromises.push(this.writeLog(function_name, block_height, 'Running function', function_name, ', lag in ms is: ', lag)); + simultaneousPromises.push(this.deps.metrics.putBlockHeight(indexerFunction.account_id, indexerFunction.function_name, block_height)); + const hasuraRoleName = function_name.split('/')[0].replace(/[.-]/g, '_'); const functionNameWithoutAccount = function_name.split('/')[1].replace(/[.-]/g, '_'); diff --git a/indexer-js-queue-handler/indexer.test.js b/indexer-js-queue-handler/indexer.test.js index 94a3df7d6..c5023cbc4 100644 --- a/indexer-js-queue-handler/indexer.test.js +++ b/indexer-js-queue-handler/indexer.test.js @@ -24,6 +24,10 @@ const mockAwsXray = { }), }; +const mockMetrics = { + putBlockHeight: () => {}, +}; + describe('Indexer unit tests', () => { const oldEnv = process.env; @@ -62,7 +66,7 @@ describe('Indexer unit tests', () => { }) })), }; - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = {}; functions['buildnear.testnet/test'] = {code:` @@ -82,7 +86,7 @@ describe('Indexer unit tests', () => { errors: null, }), })); - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, awsXray: mockAwsXray, metrics: mockMetrics }); const functionName = 'buildnear.testnet/test'; const mutations = {mutations: [`mutation { _0: set(functionName: "${functionName}", key: "foo2", data: "indexer test") }`], variables: {}, keysValues: {}}; @@ -109,7 +113,7 @@ describe('Indexer unit tests', () => { errors: null, }), })); - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, awsXray: mockAwsXray, metrics: mockMetrics }); const functionName = 'buildnear.testnet/test'; const mutations = {mutations: [ @@ -147,7 +151,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in }) })), }; - const indexer = new Indexer('mainnet', 'us-west-2', { s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const blockHeight = '84333960'; const block = await indexer.fetchBlockPromise(blockHeight); @@ -170,7 +174,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in }) })), }; - const indexer = new Indexer('mainnet', 'us-west-2', { s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const blockHeight = 82699904; const shard = 0; @@ -210,7 +214,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in const mockS3 = { getObject, }; - const indexer = new Indexer('mainnet', 'us-west-2', { s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const shard = 0; const streamerMessage = await indexer.fetchStreamerMessage(blockHeight); @@ -232,7 +236,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in }); test('Indexer.transformIndexerFunction() applies the necessary transformations', () => { - const indexer = new Indexer('mainnet', 'us-west-2', { awsXray: mockAwsXray }) + const indexer = new Indexer('mainnet', { awsXray: mockAwsXray, metrics: mockMetrics }) const transformedFunction = indexer.transformIndexerFunction(`console.log('hello')`); @@ -264,7 +268,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in } }) }); - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, awsXray: mockAwsXray, metrics: mockMetrics }); const context = indexer.buildImperativeContextForFunction(); @@ -315,7 +319,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in errors: ['boom'] }) }); - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, awsXray: mockAwsXray, metrics: mockMetrics }); const context = indexer.buildImperativeContextForFunction(); @@ -330,7 +334,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in data: 'mock', }), }); - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, awsXray: mockAwsXray, metrics: mockMetrics }); const context = indexer.buildImperativeContextForFunction(); @@ -429,7 +433,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in }), }), }; - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = {}; functions['buildnear.testnet/test'] = {code:` @@ -509,7 +513,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in }) })), }; - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = {}; functions['buildnear.testnet/test'] = {code:` @@ -557,7 +561,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in doesEndpointExist: jest.fn().mockReturnValue(false), createAuthenticatedEndpoint: jest.fn(), } - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = { 'morgs.near/test': { @@ -612,7 +616,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in doesEndpointExist: jest.fn().mockReturnValue(true), createAuthenticatedEndpoint: jest.fn(), } - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = { 'morgs.near/test': { @@ -662,7 +666,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in doesEndpointExist: jest.fn().mockReturnValue(true), createAuthenticatedEndpoint: jest.fn(), } - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = { 'morgs.near/test': { @@ -716,7 +720,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in doesEndpointExist: jest.fn().mockReturnValue(false), createAuthenticatedEndpoint: jest.fn().mockRejectedValue(error), } - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, provisioner, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = { 'morgs.near/test': { @@ -731,6 +735,48 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in expect(mockFetch.mock.calls).toMatchSnapshot(); }); + test('Indexer.runFunctions() publishes the current block height', async () => { + const mockFetch = jest.fn(() => ({ + status: 200, + json: async () => ({ + errors: null, + }), + })); + const block_height = 456; + const mockS3 = { + getObject: jest.fn(() => ({ + promise: () => Promise.resolve({ + Body: { + toString: () => JSON.stringify({ + chunks: [], + header: { + height: block_height + } + }) + } + }) + })), + }; + const metrics = { + putBlockHeight: jest.fn().mockReturnValueOnce({ promise: jest.fn() }), + }; + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray, metrics }); + + const functions = {}; + functions['buildnear.testnet/test'] = { + code:` + const foo = 3; + block.result = context.graphql(\`mutation { set(functionName: "buildnear.testnet/test", key: "height", data: "\$\{block.blockHeight\}")}\`); + mutationsReturnValue['hack'] = function() {return 'bad'} + `, + account_id: 'buildnear.testnet', + function_name: 'test' + }; + await indexer.runFunctions(block_height, functions); + + expect(metrics.putBlockHeight).toHaveBeenCalledWith('buildnear.testnet', 'test', block_height); + }); + // The unhandled promise causes problems with test reporting. // Note unhandled promise rejections fail to proceed to the next function on AWS Lambda test.skip('Indexer.runFunctions() continues despite promise rejection, unable to log rejection', async () => { @@ -755,7 +801,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in }) })), }; - const indexer = new Indexer('mainnet', 'us-west-2', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray }); + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray, metrics: mockMetrics }); const functions = {}; functions['buildnear.testnet/fails'] = {code:` @@ -802,5 +848,4 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in } ]); }); - }); diff --git a/indexer-js-queue-handler/metrics.js b/indexer-js-queue-handler/metrics.js new file mode 100644 index 000000000..52909fe30 --- /dev/null +++ b/indexer-js-queue-handler/metrics.js @@ -0,0 +1,38 @@ +import AWS from "aws-sdk"; + +export default class Metrics { + constructor(namespace, cloudwatch) { + this.cloudwatch = + cloudwatch || new AWS.CloudWatch({ region: process.env.REGION }); + this.namespace = namespace; + } + + putBlockHeight(accountId, functionName, height) { + return this.cloudwatch + .putMetricData({ + MetricData: [ + { + MetricName: "INDEXER_FUNCTION_LATEST_BLOCK_HEIGHT", + Dimensions: [ + { + Name: "ACCOUNT_ID", + Value: accountId, + }, + { + Name: "FUNCTION_NAME", + Value: functionName, + }, + { + Name: "STAGE", + Value: process.env.STAGE, + }, + ], + Unit: "None", + Value: height, + }, + ], + Namespace: this.namespace, + }) + .promise(); + } +} diff --git a/indexer-js-queue-handler/metrics.test.js b/indexer-js-queue-handler/metrics.test.js new file mode 100644 index 000000000..aa58b8875 --- /dev/null +++ b/indexer-js-queue-handler/metrics.test.js @@ -0,0 +1,30 @@ +import { jest } from '@jest/globals'; + +import Metrics from './metrics'; + +describe('Metrics', () => { + const oldEnv = process.env; + + beforeAll(() => { + process.env = { + ...oldEnv, + STAGE: 'dev', + }; + }); + + afterAll(() => { + process.env = oldEnv; + }); + + it('writes the block height for an indexer function', async () => { + const cloudwatch = { + putMetricData: jest.fn().mockReturnValueOnce({ promise: jest.fn() }) + }; + const metrics = new Metrics('test', cloudwatch); + + await metrics.putBlockHeight('morgs.near', 'test', 2); + + expect(cloudwatch.putMetricData).toBeCalledTimes(1); + expect(cloudwatch.putMetricData.mock.calls[0]).toMatchSnapshot() + }); +}) diff --git a/indexer-js-queue-handler/serverless.yml b/indexer-js-queue-handler/serverless.yml index bd6dd2a12..62f09cede 100644 --- a/indexer-js-queue-handler/serverless.yml +++ b/indexer-js-queue-handler/serverless.yml @@ -9,10 +9,17 @@ provider: region: eu-central-1 timeout: 15 environment: + REGION: ${self:provider.region} + STAGE: ${opt:stage, 'dev'} HASURA_ENDPOINT: ${env:HASURA_ENDPOINT} HASURA_ADMIN_SECRET: ${env:HASURA_ADMIN_SECRET} tracing: lambda: true #enable X-Ray tracing + iamRoleStatements: + - Effect: "Allow" + Action: + - "cloudwatch:PutMetricData" + Resource: "*" # cfnRole: arn:aws:iam::754641474505:role/queryapi-cloudformation # See https://github.com/getlift/lift/blob/master/docs/queue.md for configuration of SQS constructs From 2a85de449f8c60d68d86e8e34322b6f3d8dbdc3a Mon Sep 17 00:00:00 2001 From: Gabe Hamilton Date: Mon, 5 Jun 2023 22:50:31 -0600 Subject: [PATCH 09/20] DPLT-1020 Fetch indexing metadata file to determine last_indexed_block. (#96) --- .../src/historical_block_processing.rs | 99 ++++++++++++++----- .../src/indexer_registry.rs | 2 +- indexer/queryapi_coordinator/src/opts.rs | 5 +- 3 files changed, 81 insertions(+), 25 deletions(-) diff --git a/indexer/queryapi_coordinator/src/historical_block_processing.rs b/indexer/queryapi_coordinator/src/historical_block_processing.rs index 7b6a0f21f..c14d09053 100644 --- a/indexer/queryapi_coordinator/src/historical_block_processing.rs +++ b/indexer/queryapi_coordinator/src/historical_block_processing.rs @@ -12,10 +12,12 @@ use indexer_rules_engine::types::indexer_rule_match::{ChainId, IndexerRuleMatchP use near_jsonrpc_client::JsonRpcClient; use near_jsonrpc_primitives::types::blocks::RpcBlockRequest; use near_lake_framework::near_indexer_primitives::types::{BlockHeight, BlockId, BlockReference}; +use serde_json::from_str; use tokio::task::JoinHandle; const INDEXED_DATA_FILES_BUCKET: &str = "near-delta-lake"; const LAKE_BUCKET_PREFIX: &str = "near-lake-data-"; +const INDEXED_DATA_FILES_FOLDER: &str = "silver/contracts/metadata"; pub fn spawn_historical_message_thread( block_height: BlockHeight, @@ -76,15 +78,32 @@ async fn process_historical_messages( let mut indexer_function = indexer_function.clone(); - let (last_indexed_block, mut blocks_from_index) = - filter_matching_blocks_from_index_files( - start_block, - block_height, - &indexer_function.indexer_rule, - aws_config, - start_date.unwrap(), - ) - .await; + let last_indexed_block = last_indexed_block_from_metadata(aws_config).await; + if last_indexed_block.is_err() { + tracing::error!( + target: crate::INDEXER, + last_indexed_block = ?last_indexed_block, + ); + return block_difference; + } + let last_indexed_block = last_indexed_block.unwrap(); + + let mut blocks_from_index = filter_matching_blocks_from_index_files( + start_block, + block_height, + &indexer_function.indexer_rule, + aws_config, + start_date.unwrap(), + ) + .await; + + // Check for the case where an index file is written right after we get the last_indexed_block metadata + let last_block_in_data = blocks_from_index.last().unwrap_or(&start_block); + let last_indexed_block = if last_block_in_data > &last_indexed_block { + *last_block_in_data + } else { + last_indexed_block + }; let mut blocks_between_indexed_and_current_block: Vec = filter_matching_unindexed_blocks_from_lake( @@ -116,13 +135,45 @@ async fn process_historical_messages( block_difference } +pub(crate) async fn last_indexed_block_from_metadata( + aws_config: &SdkConfig, +) -> anyhow::Result { + let key = format!("{}/{}", INDEXED_DATA_FILES_FOLDER, "latest_block.json"); + let s3_config: Config = aws_sdk_s3::config::Builder::from(aws_config).build(); + let s3_client: S3Client = S3Client::from_conf(s3_config); + let metadata = fetch_text_file_from_s3(INDEXED_DATA_FILES_BUCKET, key, s3_client).await; + + let metadata: serde_json::Value = serde_json::from_str(&metadata).unwrap(); + let last_indexed_block = metadata["last_indexed_block"].clone(); + let last_indexed_block = last_indexed_block.as_str(); + if last_indexed_block.is_none() { + return Err(anyhow::anyhow!( + "No last_indexed_block found in latest_block.json" + )); + } + let last_indexed_block = last_indexed_block.unwrap(); + let last_indexed_block = from_str(last_indexed_block); + if last_indexed_block.is_err() { + return Err(anyhow::anyhow!( + "last_indexed_block couldn't be converted to u64" + )); + } + let last_indexed_block = last_indexed_block.unwrap(); + tracing::info!( + target: crate::INDEXER, + "Last indexed block from latest_block.json: {:?}", + last_indexed_block + ); + Ok(last_indexed_block) +} + async fn filter_matching_blocks_from_index_files( start_block_height: BlockHeight, end_block_height: BlockHeight, indexer_rule: &IndexerRule, aws_config: &SdkConfig, start_date: DateTime, -) -> (BlockHeight, Vec) { +) -> Vec { let s3_bucket = INDEXED_DATA_FILES_BUCKET; let index_files_content = match &indexer_rule.matching_rule { @@ -130,7 +181,7 @@ async fn filter_matching_blocks_from_index_files( affected_account_id, status, } => { - let s3_prefix = format!("silver/contracts/metadata/{}", affected_account_id); + let s3_prefix = format!("{}/{}", INDEXED_DATA_FILES_FOLDER, affected_account_id); fetch_contract_index_files(aws_config, s3_bucket, s3_prefix, start_date).await } MatchingRule::ActionFunctionCall { @@ -142,7 +193,7 @@ async fn filter_matching_blocks_from_index_files( target: crate::INDEXER, "ActionFunctionCall matching rule not supported for historical processing" ); - return (end_block_height, vec![]); + return vec![]; // let s3_prefix = format!("silver/contracts/metadata/{}", affected_account_id); // fetch_contract_index_files(aws_config, s3_bucket, s3_prefix).await @@ -153,7 +204,7 @@ async fn filter_matching_blocks_from_index_files( target: crate::INDEXER, "Event matching rule not supported for historical processing" ); - return (end_block_height, vec![]); + return vec![]; } }; @@ -171,9 +222,7 @@ async fn filter_matching_blocks_from_index_files( block_count = blocks_to_process.len() ); - let last_indexed_block = blocks_to_process.last().unwrap_or(&start_block_height); - - (*last_indexed_block, blocks_to_process) + blocks_to_process } fn parse_blocks_from_index_files( @@ -224,6 +273,11 @@ async fn filter_matching_unindexed_blocks_from_lake( let s3_client: S3Client = S3Client::from_conf(s3_config); let lake_bucket = lake_bucket_for_chain(chain_id.clone()); + let count = ending_block_height - last_indexed_block; + tracing::info!( + target: crate::INDEXER, + "Filtering {count} unindexed blocks from lake: from block {last_indexed_block} to {ending_block_height}", + ); let mut blocks_to_process: Vec = vec![]; for current_block in (last_indexed_block + 1)..ending_block_height { // fetch block file from S3 @@ -275,11 +329,6 @@ async fn filter_matching_unindexed_blocks_from_lake( Ok(match_list) => { if match_list.len() > 0 { blocks_to_process.push(current_block); - tracing::info!( - target: crate::INDEXER, - "Matched historical block {} against S3 file", - current_block, - ); } } Err(e) => { @@ -287,7 +336,8 @@ async fn filter_matching_unindexed_blocks_from_lake( target: crate::INDEXER, "Error matching block {} against S3 file: {:?}", current_block, - e); + e + ); } } } @@ -301,6 +351,11 @@ async fn filter_matching_unindexed_blocks_from_lake( } } } + tracing::info!( + target: crate::INDEXER, + "Found {block_count} unindexed blocks to process.", + block_count = blocks_to_process.len() + ); blocks_to_process } diff --git a/indexer/queryapi_coordinator/src/indexer_registry.rs b/indexer/queryapi_coordinator/src/indexer_registry.rs index e5fdbfe44..787543b6f 100644 --- a/indexer/queryapi_coordinator/src/indexer_registry.rs +++ b/indexer/queryapi_coordinator/src/indexer_registry.rs @@ -372,4 +372,4 @@ async fn read_only_call( return Ok(serde_json::from_str(std::str::from_utf8(&result.result).unwrap()).unwrap()); } Err(anyhow::anyhow!("Unable to make rpc call: {:?}", response)) -} \ No newline at end of file +} diff --git a/indexer/queryapi_coordinator/src/opts.rs b/indexer/queryapi_coordinator/src/opts.rs index 5e13138f9..a705b44b7 100644 --- a/indexer/queryapi_coordinator/src/opts.rs +++ b/indexer/queryapi_coordinator/src/opts.rs @@ -138,9 +138,10 @@ impl Opts { } pub fn rpc_url(&self) -> &str { + // To query metadata (timestamp) about blocks more than 5 epochs old we need an archival node match self.chain_id { - ChainId::Mainnet(_) => "https://rpc.mainnet.near.org", - ChainId::Testnet(_) => "https://rpc.testnet.near.org", + ChainId::Mainnet(_) => "https://archival-rpc.mainnet.near.org", //https://rpc.mainnet.near.org", + ChainId::Testnet(_) => "https://archival-rpc.testnet.near.org", } } } From 98d0254d1506d91e69b9cd36616f7fc6cfe0bca3 Mon Sep 17 00:00:00 2001 From: Gabe Hamilton Date: Tue, 6 Jun 2023 17:06:49 -0600 Subject: [PATCH 10/20] Fixed timestamp field for lag log. --- indexer-js-queue-handler/indexer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indexer-js-queue-handler/indexer.js b/indexer-js-queue-handler/indexer.js index 25309cd7f..c54ea04fa 100644 --- a/indexer-js-queue-handler/indexer.js +++ b/indexer-js-queue-handler/indexer.js @@ -33,7 +33,7 @@ export default class Indexer { async runFunctions(block_height, functions, options = { imperative: false, provision: false }) { const blockWithHelpers = Block.fromStreamerMessage(await this.fetchStreamerMessage(block_height)); - let lag = Date.now() - Math.floor(blockWithHelpers.header.timestamp_nanosec / 1000000); + let lag = Date.now() - Math.floor(blockWithHelpers.header().timestampNanosec / 1000000); const simultaneousPromises = []; const allMutations = []; for (const function_name in functions) { From 2110e72cc7ce99d9c2612f9f47eb2e81121be7e5 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Mon, 12 Jun 2023 11:41:22 -0500 Subject: [PATCH 11/20] Refactor: Introduce Editor context refactoring (#98) --- .../CreateNewIndexer/CreateNewIndexer.js | 4 +- .../src/components/Editor/BlockPicker.jsx | 1 - frontend/src/components/Editor/Editor.js | 297 +++++++----------- .../src/components/Editor/EditorButtons.jsx | 49 ++- .../src/components/Editor/FileSwitcher.jsx | 30 +- .../Editor/ResizableLayoutEditor.jsx | 13 +- .../Form/BlockHeightOptionsInputGroup.test.js | 55 ---- ...jsx => IndexerConfigOptionsInputGroup.jsx} | 47 ++- .../Form/IndexerDetailsGroup.test.js | 45 --- .../src/components/Modals/PublishModal.jsx | 43 ++- .../src/components/Modals/resetChanges.jsx | 8 +- .../src/components/Playground/graphiql.jsx | 7 +- .../src/contexts/IndexerDetailsContext.js | 126 ++++++++ frontend/src/pages/_app.tsx | 6 +- .../src/pages/create-new-indexer/index.js | 35 ++- frontend/src/pages/query-api-editor/index.js | 51 ++- frontend/src/utils/fetchBlock.js | 1 - frontend/src/utils/formatters.js | 52 ++- frontend/src/utils/queryIndexerFunction.js | 3 +- 19 files changed, 429 insertions(+), 444 deletions(-) delete mode 100644 frontend/src/components/Form/BlockHeightOptionsInputGroup.test.js rename frontend/src/components/Form/{BlockHeightOptionsInputGroup.jsx => IndexerConfigOptionsInputGroup.jsx} (51%) delete mode 100644 frontend/src/components/Form/IndexerDetailsGroup.test.js create mode 100644 frontend/src/contexts/IndexerDetailsContext.js diff --git a/frontend/src/components/CreateNewIndexer/CreateNewIndexer.js b/frontend/src/components/CreateNewIndexer/CreateNewIndexer.js index f76c755ba..ed8f77ff6 100644 --- a/frontend/src/components/CreateNewIndexer/CreateNewIndexer.js +++ b/frontend/src/components/CreateNewIndexer/CreateNewIndexer.js @@ -1,10 +1,8 @@ import Editor from '../../components/Editor'; -const CreateNewIndexer = (props) => { +const CreateNewIndexer = () => { return ( ); diff --git a/frontend/src/components/Editor/BlockPicker.jsx b/frontend/src/components/Editor/BlockPicker.jsx index ae3cde453..3602d9ffe 100644 --- a/frontend/src/components/Editor/BlockPicker.jsx +++ b/frontend/src/components/Editor/BlockPicker.jsx @@ -3,7 +3,6 @@ import { OverlayTrigger, Tooltip, Button, - Badge, InputGroup, FormControl, Dropdown, diff --git a/frontend/src/components/Editor/Editor.js b/frontend/src/components/Editor/Editor.js index 708ee87b6..0f81c46d7 100644 --- a/frontend/src/components/Editor/Editor.js +++ b/frontend/src/components/Editor/Editor.js @@ -1,7 +1,8 @@ -import React, { useEffect, useState, useCallback, useMemo } from "react"; +import React, { useEffect, useState, useMemo, useContext } from "react"; import { formatSQL, formatIndexingCode, + wrapCode, defaultCode, defaultSchema, } from "../../utils/formatters"; @@ -16,61 +17,68 @@ import { ResetChangesModal } from "../Modals/resetChanges"; import { FileSwitcher } from "./FileSwitcher"; import EditorButtons from "./EditorButtons"; import { PublishModal } from "../Modals/PublishModal"; -import {getLatestBlockHeight} from "../../utils/getLatestBlockHeight"; -const BLOCKHEIGHT_LIMIT = 3600; -import { validateContractId } from "../../utils/validators" +import { getLatestBlockHeight } from "../../utils/getLatestBlockHeight"; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; +const BLOCKHEIGHT_LIMIT = 3600; const Editor = ({ - options, - accountId, - indexerName, onLoadErrorText, actionButtonText, }) => { - const DEBUG_LIST_STORAGE_KEY = `QueryAPI:debugList:${accountId}#${indexerName}` + const { + indexerDetails, + setShowResetCodeModel, + setShowPublishModal, + debugMode, + isCreateNewIndexer, + indexerNameField, + } = useContext(IndexerDetailsContext); + + const DEBUG_LIST_STORAGE_KEY = `QueryAPI:debugList:${indexerDetails.accountId}#${indexerDetails.indexerName}` + const [error, setError] = useState(undefined); const [blockHeightError, setBlockHeightError] = useState(undefined); - const [showResetCodeModel, setShowResetCodeModel] = useState(false); + const [fileName, setFileName] = useState("indexingLogic.js"); - const [originalSQLCode, setOriginalSQLCode] = useState(defaultSchema); - const [originalIndexingCode, setOriginalIndexingCode] = useState(defaultCode); - const [debugMode, setDebugMode] = useState(false); + + const [originalSQLCode, setOriginalSQLCode] = useState(formatSQL(defaultSchema)); + const [originalIndexingCode, setOriginalIndexingCode] = useState(formatIndexingCode(defaultCode)); + const [indexingCode, setIndexingCode] = useState(originalIndexingCode); + const [schema, setSchema] = useState(originalSQLCode); + const [heights, setHeights] = useState(localStorage.getItem(DEBUG_LIST_STORAGE_KEY) || []); - const [showPublishModal, setShowPublishModal] = useState(false); + const [debugModeInfoDisabled, setDebugModeInfoDisabled] = useState(false); - const handleLog = (blockHeight, log, callback) => { - if(log) console.log(log); + const [diffView, setDiffView] = useState(false); + const [blockView, setBlockView] = useState(false); + + const [isExecutingIndexerFunction, setIsExecutingIndexerFunction] = useState(false); + + const { height, selectedTab, currentUserAccountId } = useInitialPayload(); + + const handleLog = (_, log, callback) => { + if (log) console.log(log); if (callback) { callback(); } }; const indexerRunner = useMemo(() => new IndexerRunner(handleLog), []); - - const [indexingCode, setIndexingCode] = useState(defaultCode); - const [schema, setSchema] = useState(defaultSchema); - const [diffView, setDiffView] = useState(false); - const [blockView, setBlockView] = useState(false); - const [indexerNameField, setIndexerNameField] = useState(indexerName ?? ""); - const [selectedOption, setSelectedOption] = useState("latestBlockHeight"); - const [blockHeight, setBlockHeight] = useState("0"); - - const [isContractFilterValid, setIsContractFilterValid] = useState(true); - const [contractFilter, setContractFilter] = useState("social.near"); - const { height, selectedTab, currentUserAccountId } = useInitialPayload(); - const [isExecutingIndexerFunction, setIsExecutingIndexerFunction] = useState(false) + useEffect(() => { + if (!indexerDetails.code || !indexerDetails.schema) return + const { formattedCode, formattedSchema } = reformatAll(indexerDetails.code, indexerDetails.schema) + setOriginalSQLCode(formattedSchema) + setOriginalIndexingCode(formattedCode) + setIndexingCode(formattedCode) + setSchema(formattedSchema) + }, [indexerDetails.code, indexerDetails.schema]); const requestLatestBlockHeight = async () => { const blockHeight = getLatestBlockHeight() return blockHeight } - const handleOptionChange = (event) => { - setSelectedOption(event.target.value); - setBlockHeightError(null); - }; - useEffect(() => { if (selectedTab === "playground") { setFileName("GraphiQL"); @@ -81,35 +89,32 @@ const Editor = ({ localStorage.setItem(DEBUG_LIST_STORAGE_KEY, heights); }, [heights]); - useEffect(() => { - if (selectedOption == "latestBlockHeight") { - setBlockHeightError(null); - return; - } - - if (height - blockHeight > BLOCKHEIGHT_LIMIT) { - setBlockHeightError( - `Warning: Please enter a valid start block height. At the moment we only support historical indexing of the last ${BLOCKHEIGHT_LIMIT} blocks or ${ - BLOCKHEIGHT_LIMIT / 3600 - } hrs. Choose a start block height between ${ - height - BLOCKHEIGHT_LIMIT - } - ${height}.` - ); - } else if (blockHeight > height) { - setBlockHeightError( - `Warning: Start Block Hieght can not be in the future. Please choose a value between ${ - height - BLOCKHEIGHT_LIMIT - } - ${height}.` - ); - } else { - setBlockHeightError(null); - } - }, [blockHeight, height, selectedOption]); + // useEffect(() => { + // if (selectedOption == "latestBlockHeight") { + // setBlockHeightError(null); + // return; + // } + // + // if (height - blockHeight > BLOCKHEIGHT_LIMIT) { + // setBlockHeightError( + // `Warning: Please enter a valid start block height. At the moment we only support historical indexing of the last ${BLOCKHEIGHT_LIMIT} blocks or ${BLOCKHEIGHT_LIMIT / 3600 + // } hrs. Choose a start block height between ${height - BLOCKHEIGHT_LIMIT + // } - ${height}.` + // ); + // } else if (blockHeight > height) { + // setBlockHeightError( + // `Warning: Start Block Hieght can not be in the future. Please choose a value between ${height - BLOCKHEIGHT_LIMIT + // } - ${height}.` + // ); + // } else { + // setBlockHeightError(null); + // } + // }, [blockHeight, height, selectedOption]); const checkSQLSchemaFormatting = () => { try { - let formatted_code = formatSQL(schema); - let formatted_schema = formatted_code; + let formatted_sql = formatSQL(schema); + let formatted_schema = formatted_sql; return formatted_schema; } catch (error) { console.log("error", error); @@ -121,122 +126,99 @@ const Editor = ({ } }; - const registerFunction = async () => { + const registerFunction = async (indexerConfig) => { let formatted_schema = checkSQLSchemaFormatting(); - let isForking = accountId !== currentUserAccountId; + let isForking = indexerDetails.accountId !== currentUserAccountId; let innerCode = indexingCode.match(/getBlock\s*\([^)]*\)\s*{([\s\S]*)}/)[1]; - if (indexerNameField == undefined || formatted_schema == undefined) { + let indexerName = isCreateNewIndexer ? indexerNameField.replaceAll(" ", "_") : indexerDetails?.indexerName.replaceAll(" ", "_"); + if (indexerName === undefined || indexerName === "") { setError( () => - "Please check your SQL schema formatting and specify an Indexer Name" + "Please provide an Indexer Name" + ) + return + } + if (formatted_schema == undefined) { + setError( + () => + "Please check your SQL schema formatting" ); return; } if (isForking) { - let prevAccountName = accountId.replace(".", "_"); + let prevAccountName = indexerDetails.accountId.replace(".", "_"); let newAccountName = currentUserAccountId.replace(".", "_"); innerCode = innerCode.replaceAll(prevAccountName, newAccountName); } setError(() => undefined); - let start_block_height = blockHeight; - if (selectedOption == "latestBlockHeight") { - start_block_height = null; - } - // Send a message to other sources + request("register-function", { - indexerName: indexerNameField.replaceAll(" ", "_"), + indexerName: indexerName, code: innerCode, schema: formatted_schema, - blockHeight: start_block_height, - contractFilter: contractFilter, - + blockHeight: indexerConfig.startBlockHeight, + contractFilter: indexerConfig.filter, }); setShowPublishModal(false); }; const handleDeleteIndexer = () => { request("delete-indexer", { - accountId: accountId, - indexerName: indexerName, + accountId: indexerDetails.accountId, + indexerName: indexerDetails.indexerName, }); }; - const handleReload = useCallback(async () => { - if (options?.create_new_indexer === true) { - // setIndexingCode(defaultCode); - // setSchema(defaultSchema); + + const handleReload = async () => { + if (isCreateNewIndexer) { setShowResetCodeModel(false); + setIndexingCode(defaultCode); + setSchema(defaultSchema); return; } - const data = await queryIndexerFunctionDetails(accountId, indexerNameField); + const data = await queryIndexerFunctionDetails(indexerDetails.accountId, indexerDetails.indexerName); if (data == null) { setIndexingCode(defaultCode); setSchema(defaultSchema); setError(() => onLoadErrorText); } else { try { - let unformatted_indexing_code = format_querried_code(data.code); + let unformatted_wrapped_indexing_code = wrapCode(data.code) let unformatted_schema = data.schema; - if (unformatted_indexing_code !== null) { - setOriginalIndexingCode(unformatted_indexing_code); - setIndexingCode(unformatted_indexing_code); + if (unformatted_wrapped_indexing_code !== null) { + setOriginalIndexingCode(() => unformatted_wrapped_indexing_code); + setIndexingCode(() => unformatted_wrapped_indexing_code); } if (unformatted_schema !== null) { setOriginalSQLCode(unformatted_schema); setSchema(unformatted_schema); } - if (data.start_block_height) { - setSelectedOption("specificBlockHeight"); - setBlockHeight(data.start_block_height); - } - if(data.filter) { - setContractFilter(data.filter.matching_rule.affected_account_id) - } + // if (data.start_block_height) { + // setSelectedOption("specificBlockHeight"); + // setBlockHeight(data.start_block_height); + // } + // if (data.filter) { + // setContractFilter(data.filter.matching_rule.affected_account_id) + // } + await reformat(unformatted_wrapped_indexing_code, unformatted_schema) } catch (error) { console.log(error); - setError(() => "An Error occured while trying to format the code."); } } - setShowResetCodeModel(false); - }, [ - accountId, - indexerNameField, - onLoadErrorText, - options?.create_new_indexer, - ]); - - const format_querried_code = (code) => { - try { - let formatted_code = formatIndexingCode(code, true); - setError(() => undefined); - return formatted_code; - } catch (error) { - setError( - () => - "Oh snap! We could not format the queried code. The code in the registry contract may be invalid Javascript code. " - ); - console.log(error); - return unformatted_code; - } - }; + } const getActionButtonText = () => { - const isUserIndexer = accountId === currentUserAccountId; - + const isUserIndexer = indexerDetails.accountId === currentUserAccountId; + if (isCreateNewIndexer) return "Create New Indexer" return isUserIndexer ? actionButtonText : "Fork Indexer"; }; - useEffect(() => { - const load = async () => { - await handleReload(); - }; - load(); - }, [accountId, handleReload, indexerName]); const handleFormattingError = (fileName) => { const errorMessage = @@ -247,12 +229,22 @@ const Editor = ({ setError(() => errorMessage); }; - const reformat = () => { + const reformatAll = (indexingCode, schema) => { + const formattedCode = formatIndexingCode(indexingCode); + setIndexingCode(formattedCode); + + const formattedSchema = formatSQL(schema); + setSchema(formattedSchema); + + return { formattedCode, formattedSchema } + } + + const reformat = (indexingCode, schema) => { return new Promise((resolve, reject) => { try { let formattedCode; if (fileName === "indexingLogic.js") { - formattedCode = formatIndexingCode(indexingCode, false); + formattedCode = formatIndexingCode(indexingCode); setIndexingCode(formattedCode); } else if (fileName === "schema.sql") { formattedCode = formatSQL(schema); @@ -268,13 +260,7 @@ const Editor = ({ }; async function handleFormating() { - await reformat(); - } - - async function submit() { - // Handle Register button click - await reformat(); - await registerFunction(); + await reformat(indexingCode, schema); } function handleEditorMount(editor) { @@ -296,20 +282,9 @@ const Editor = ({ ); } - function handleSetContractFilter(e) { - const contractFilter = e.target.value; - setContractFilter(contractFilter); - const isValid = validateContractId(contractFilter); - - if (isValid) { - setIsContractFilterValid(true); - } else { - setIsContractFilterValid(false); - } - } async function executeIndexerFunction(option = "latest", startingBlockHeight = null) { - setIsExecutingIndexerFunction(() => true) + setIsExecutingIndexerFunction(() => true) switch (option) { case "debugList": @@ -340,51 +315,26 @@ const Editor = ({ }} > indexerRunner.stop()} - contractFilter={contractFilter} - handleSetContractFilter={handleSetContractFilter} - isContractFilterValid={isContractFilterValid} - setShowPublishModal={setShowPublishModal} latestHeight={height} - isUserIndexer={accountId === currentUserAccountId} + isUserIndexer={indexerDetails.accountId === currentUserAccountId} handleDeleteIndexer={handleDeleteIndexer} />
diff --git a/frontend/src/components/Editor/EditorButtons.jsx b/frontend/src/components/Editor/EditorButtons.jsx index d0a315fa5..39f7eb36a 100644 --- a/frontend/src/components/Editor/EditorButtons.jsx +++ b/frontend/src/components/Editor/EditorButtons.jsx @@ -1,14 +1,10 @@ -// EditorButtons.jsx - -import React from "react"; +import React, { useContext } from "react"; import { - ButtonToolbar, Breadcrumb, Button, Form, InputGroup, Navbar, - Nav, Container, Col, Row, @@ -24,34 +20,38 @@ import { XCircle, } from "react-bootstrap-icons"; import { BlockPicker } from "./BlockPicker"; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; const EditorButtons = ({ - accountId, - indexerNameField, - setIndexerNameField, - options, - setShowResetCodeModel, handleFormating, executeIndexerFunction, currentUserAccountId, getActionButtonText, - submit, - debugMode, isExecuting, stopExecution, heights, setHeights, - setShowPublishModal, latestHeight, isUserIndexer, handleDeleteIndexer, - contractFilter, - handleSetContractFilter, - isContractFilterValid, }) => { + + const { + indexerName, + accountId, + indexerDetails, + setShowPublishModal, + setShowResetCodeModel, + debugMode, + isCreateNewIndexer, + indexerNameField, + setIndexerNameField + } = useContext(IndexerDetailsContext); + const removeHeight = (index) => { setHeights(heights.filter((_, i) => i !== index)); }; + return ( <> @@ -71,7 +71,7 @@ const EditorButtons = ({ {accountId} - {options.create_new_indexer ? ( + {isCreateNewIndexer ? ( setIndexerNameField(e.target.value)} /> ) : ( - indexerNameField + indexerName )} - + {!isCreateNewIndexer && Contract Filter Please provide a valid contract name. - - + } + {debugMode && ( - {isUserIndexer && !options.create_new_indexer && ( + {isUserIndexer && !isCreateNewIndexer && ( Delete Indexer} diff --git a/frontend/src/components/Editor/FileSwitcher.jsx b/frontend/src/components/Editor/FileSwitcher.jsx index 71262ab4a..86d3df978 100644 --- a/frontend/src/components/Editor/FileSwitcher.jsx +++ b/frontend/src/components/Editor/FileSwitcher.jsx @@ -1,16 +1,15 @@ +import React, { useContext, useState } from "react"; import { InputGroup, ToggleButtonGroup, ToggleButton } from "react-bootstrap"; import Switch from "react-switch"; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; export function FileSwitcher({ fileName, setFileName, diffView, setDiffView, - blockView, - setBlockView, - debugMode, - setDebugMode, }) { + const { debugMode, setDebugMode, isCreateNewIndexer } = useContext(IndexerDetailsContext); return ( <> schema.sql - setFileName("GraphiQL")} - > - GraphiQL - + {!isCreateNewIndexer && + setFileName("GraphiQL")} + > + GraphiQL + } Diff View diff --git a/frontend/src/components/Editor/ResizableLayoutEditor.jsx b/frontend/src/components/Editor/ResizableLayoutEditor.jsx index 667ad610e..550af5e10 100644 --- a/frontend/src/components/Editor/ResizableLayoutEditor.jsx +++ b/frontend/src/components/Editor/ResizableLayoutEditor.jsx @@ -45,9 +45,9 @@ const ResizableEditor = ({ originalIndexingCode, schema, indexingCode, - options, handleEditorWillMount, handleEditorMount, + isCreateNewIndexer }) => { const { firstRef, secondRef, dragBarRef } = useDragResize({ direction: "horizontal", @@ -68,7 +68,6 @@ const ResizableEditor = ({ modified={indexingCode} language="typescript" readOnly={false} - options={options} handleEditorMount={undefined} /> ) : ( @@ -80,7 +79,6 @@ const ResizableEditor = ({ readOnly={false} onChange={(text) => setIndexingCode(text)} handleEditorWillMount={handleEditorWillMount} - options={options} /> ), "schema.sql": () => @@ -90,8 +88,7 @@ const ResizableEditor = ({ original={originalSQLCode} modified={schema} language="sql" - readOnly={options?.create_new_indexer === true ? false : true} - options={options} + readOnly={isCreateNewIndexer === true ? false : true} handleEditorMount={undefined} /> ) : ( @@ -100,10 +97,9 @@ const ResizableEditor = ({ value={schema} defaultValue={defaultSchema} defaultLanguage="sql" - readOnly={options?.create_new_indexer === true ? false : false} + readOnly={isCreateNewIndexer === true ? false : false} onChange={(text) => setSchema(text)} handleEditorWillMount={undefined} - options={options} /> ), }; @@ -136,9 +132,9 @@ export default function ResizableLayoutEditor({ originalIndexingCode, schema, indexingCode, - options, handleEditorWillMount, handleEditorMount, + isCreateNewIndexer }) { const { dragBarRef: dragBarRefConsole, @@ -168,7 +164,6 @@ export default function ResizableLayoutEditor({ originalSQLCode={originalSQLCode} originalIndexingCode={originalIndexingCode} schema={schema} - options={options} handleEditorWillMount={handleEditorWillMount} handleEditorMount={handleEditorMount} /> diff --git a/frontend/src/components/Form/BlockHeightOptionsInputGroup.test.js b/frontend/src/components/Form/BlockHeightOptionsInputGroup.test.js deleted file mode 100644 index 86a04e432..000000000 --- a/frontend/src/components/Form/BlockHeightOptionsInputGroup.test.js +++ /dev/null @@ -1,55 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; -import BlockHeightOptions from './BlockHeightOptionsInputGroup'; - -describe('BlockHeightOptions component', () => { - test('renders correctly', () => { - const handleOptionChange = jest.fn(); - const setBlockHeight = jest.fn(); - render(); - - expect(screen.getByTestId("specific-blockheight-checkbox")).toBeInTheDocument(); - expect(screen.getByText("From Latest Block Height")).toBeInTheDocument(); - expect(screen.getByText("Specific Block Height")).toBeInTheDocument(); - expect(screen.getByTestId("latest-blockheight-checkbox")).toBeInTheDocument(); - }); - - test('handles option change correctly', () => { - const handleOptionChange = jest.fn(); - const setBlockHeight = jest.fn(); - - render(); - - fireEvent.click(screen.getByTestId("latest-blockheight-checkbox")); - expect(handleOptionChange).toHaveBeenCalledTimes(1); - - fireEvent.click(screen.getAllByRole("checkbox")[1]); - expect(handleOptionChange).toHaveBeenCalledTimes(2); - }); - - test('handles block height input change correctly', () => { - const handleOptionChange = jest.fn(); - const setBlockHeight = jest.fn(); - - render(); - - fireEvent.change(screen.getByTestId("blockheight-input"), { target: { value: '2000' } }); - expect(setBlockHeight).toHaveBeenCalledTimes(1); - expect(setBlockHeight).toHaveBeenCalledWith('2000'); - }); -}); diff --git a/frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx b/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx similarity index 51% rename from frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx rename to frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx index 1a0e86f91..ebd2e1f99 100644 --- a/frontend/src/components/Form/BlockHeightOptionsInputGroup.jsx +++ b/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx @@ -1,14 +1,41 @@ +import React, { useContext, useState, useEffect } from "react"; import { InputGroup } from "react-bootstrap"; import Form from "react-bootstrap/Form"; -const BlockHeightOptions = ({ - selectedOption, - handleOptionChange, - blockHeight, - setBlockHeight, - contractFilter, - handleSetContractFilter, - isContractFilterValid, -}) => { +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; +import { validateContractId } from "../../utils/validators"; +const IndexerConfigOptions = ({ updateConfig }) => { + const { indexerDetails } = useContext(IndexerDetailsContext); + const [blockHeight, setBlockHeight] = useState("0"); + const [contractFilter, setContractFilter] = useState("social.near"); + const [selectedOption, setSelectedOption] = useState("latestBlockHeight"); + const [isContractFilterValid, setIsContractFilterValid] = useState(true); + + const handleOptionChange = (event) => { + setSelectedOption(event.target.value); + // setBlockHeightError(null); + }; + + useEffect(() => { + if (indexerDetails.config?.startBlockHeight) { + setSelectedOption("specificBlockHeight") + setBlockHeight(indexerDetails.config.startBlockHeight) + } + if (indexerDetails.config?.filter) { + setContractFilter(indexerDetails.config.filter) + } + }, [indexerDetails]) + + function handleSetContractFilter(e) { + const contractFilter = e.target.value; + setContractFilter(contractFilter); + const isContractFilterValid = validateContractId(contractFilter); + setIsContractFilterValid(isContractFilterValid); + } + + useEffect(() => { + updateConfig(contractFilter, blockHeight, selectedOption) + }, [contractFilter, selectedOption, blockHeight]) + return ( <> @@ -52,4 +79,4 @@ const BlockHeightOptions = ({ ); }; -export default BlockHeightOptions; +export default IndexerConfigOptions; diff --git a/frontend/src/components/Form/IndexerDetailsGroup.test.js b/frontend/src/components/Form/IndexerDetailsGroup.test.js deleted file mode 100644 index e6f0b6d8d..000000000 --- a/frontend/src/components/Form/IndexerDetailsGroup.test.js +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import IndexerDetailsGroup from './IndexerDetailsGroup'; - -describe('IndexerDetailsGroup Component', () => { - const defaultProps = { - accountId: '12345', - indexerNameField: 'TestIndexer', - setIndexerNameField: jest.fn(), - isCreateNewIndexerPage: false, - }; - - test('renders AccountID input field with correct value', () => { - render(); - const accountIdInput = screen.getByTestId('account-id-input'); - expect(accountIdInput).toHaveValue('12345'); - }); - - test('renders Indexer Name input field with correct value', () => { - render(); - const indexerNameInput = screen.getByTestId('indexer-name-input'); - expect(indexerNameInput).toHaveValue('TestIndexer'); - }); - - test('Indexer Name input field is disabled when isCreateNewIndexerPage is false', () => { - render(); - const indexerNameInput = screen.getByTestId("indexer-name-input"); - expect(indexerNameInput).toBeDisabled(); - }); - - test('Indexer Name input field is enabled when isCreateNewIndexerPage is true', () => { - render(); - const indexerNameInput = screen.getByTestId('indexer-name-input') - expect(indexerNameInput).not.toBeDisabled(); - }); - - test('onChange event updates indexerNameField', () => { - render(); - const indexerNameInput = screen.getByTestId('indexer-name-input') - - fireEvent.change(indexerNameInput, { target: { value: 'NewIndexer' } }); - expect(defaultProps.setIndexerNameField).toHaveBeenCalledWith('NewIndexer'); - }); -}); diff --git a/frontend/src/components/Modals/PublishModal.jsx b/frontend/src/components/Modals/PublishModal.jsx index 4841f1744..f1de823b6 100644 --- a/frontend/src/components/Modals/PublishModal.jsx +++ b/frontend/src/components/Modals/PublishModal.jsx @@ -1,21 +1,26 @@ -import { Button, Modal } from "react-bootstrap"; -import { Alert } from "react-bootstrap"; -import BlockHeightOptions from "../Form/BlockHeightOptionsInputGroup"; +import React, { useContext, useState } from "react"; +import { Button, Modal, Alert } from "react-bootstrap"; +import IndexerConfigOptions from "../Form/IndexerConfigOptionsInputGroup"; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; export const PublishModal = ({ - showPublishModal, - setShowPublishModal, - submit, - selectedOption, - handleOptionChange, - blockHeight, - setBlockHeight, - contractFilter, - handleSetContractFilter, - isContractFilterValid, + registerFunction, actionButtonText, blockHeightError, }) => { + const { + showPublishModal, + setShowPublishModal, + } = useContext(IndexerDetailsContext); + const [indexerConfig, setIndexerConfig] = useState({ filter: "social.near", startBlockHeight: null }) + + const updateConfig = (filter, startBlockHeight, option) => { + if (option === "latestBlockHeight") { + startBlockHeight = null + } + setIndexerConfig({ filter, startBlockHeight }) + } + return ( Enter Indexer Details - + {blockHeightError && ( @@ -46,7 +43,7 @@ export const PublishModal = ({ - diff --git a/frontend/src/components/Modals/resetChanges.jsx b/frontend/src/components/Modals/resetChanges.jsx index 7b4187fe1..2ca8f8dc8 100644 --- a/frontend/src/components/Modals/resetChanges.jsx +++ b/frontend/src/components/Modals/resetChanges.jsx @@ -1,9 +1,13 @@ +import { IndexerDetailsContext } from "../../contexts/IndexerDetailsContext"; +import React, { useContext } from "react"; import { Button, Modal } from "react-bootstrap"; export const ResetChangesModal = ({ - showResetCodeModel, - setShowResetCodeModel, handleReload, }) => { + const { + showResetCodeModel, + setShowResetCodeModel, + } = useContext(IndexerDetailsContext); return ( { return await response.json(); }; -export const GraphqlPlayground = ({ accountId }) => { +export const GraphqlPlayground = () => { + const { indexerDetails } = useContext(IndexerDetailsContext); return (
graphQLFetcher(params, accountId)} + fetcher={(params) => graphQLFetcher(params, indexerDetails.accountId)} defaultQuery="" storage={sessionStorage} /> diff --git a/frontend/src/contexts/IndexerDetailsContext.js b/frontend/src/contexts/IndexerDetailsContext.js new file mode 100644 index 000000000..7aa61d274 --- /dev/null +++ b/frontend/src/contexts/IndexerDetailsContext.js @@ -0,0 +1,126 @@ +import React, { useState, useEffect } from 'react'; +import { queryIndexerFunctionDetails } from "../utils/queryIndexerFunction"; +import { + defaultCode, + defaultSchema, + wrapCode, +} from "../utils/formatters"; + +import { getLatestBlockHeight } from "../utils/getLatestBlockHeight"; +// interface IndexerDetails { +// accountId: String, +// indexerName: String, +// code: String, +// schema: String, +// config: IndexerConfig, +// } +// +// type IndexerConfig = { +// startBlockHeight?: Number, +// filter: String, +// } + +export const IndexerDetailsContext = React.createContext({ + indexerDetails: { code: undefined, schema: undefined, config: { filter: "social.near", startBlockHeight: null }, accountId: "", indexerName: "" }, + showResetCodeModel: false, + setShowResetCodeModel: () => { }, + showPublishModal: false, + setShowPublishModal: () => { }, + debugMode: false, + setDebugMode: () => { }, + latestHeight: 0, + setLatestHeight: () => { }, + isCreateNewIndexer: false, + setIsCreateNewIndexer: () => { }, + accountId: undefined, + setAccountId: () => { }, + indexerName: undefined, + setIndexerName: () => { }, + setIndexerDetails: () => { }, + indexerNameField: "", + setIndexerNameField: () => { }, +}); + +export const IndexerDetailsProvider = ({ children }) => { + const [accountId, setAccountId] = useState(undefined); + const [indexerName, setIndexerName] = useState(undefined); + const [indexerNameField, setIndexerNameField] = useState(""); + const [indexerDetails, setIndexerDetails] = useState({ code: undefined, schema: undefined, config: { filter: "social.near", startBlockHeight: null }, accountId: accountId, indexerName: indexerName }) + const [showResetCodeModel, setShowResetCodeModel] = useState(false); + const [showPublishModal, setShowPublishModal] = useState(false); + const [debugMode, setDebugMode] = useState(false); + const [latestHeight, setLatestHeight] = useState(0); + const [isCreateNewIndexer, setIsCreateNewIndexer] = useState(false); + + const requestIndexerDetails = async () => { + const data = await queryIndexerFunctionDetails(accountId, indexerName); + if (data) { + const indexerConfig = { + startBlockHeight: data.start_block_height, + filter: data.filter.matching_rule.affected_account_id, + } + const details = { + accountId: accountId, + indexerName: indexerName, + code: wrapCode(data.code), + schema: data.schema, + config: indexerConfig + } + return details + } + } + useEffect(() => { + (async () => { + const latestHeight = await getLatestBlockHeight() + setLatestHeight(latestHeight) + })() + }, []) + + useEffect(() => { + if (isCreateNewIndexer || !accountId || !indexerName) { + setIndexerDetails(prevDetails => ({ + ...prevDetails, + accountId: accountId, + indexerName: indexerName, + })); + return + } + (async () => { + const indexer = await requestIndexerDetails() + const details = { + accountId: indexer.accountId, + indexerName: indexer.indexerName, + code: indexer.code, + schema: indexer.schema, + config: indexer.config + } + setIndexerDetails(details); + })(); + + }, [accountId, indexerName, isCreateNewIndexer]); + + return ( + + {children} + + ); +}; diff --git a/frontend/src/pages/_app.tsx b/frontend/src/pages/_app.tsx index 7a86eecbe..29885ae68 100644 --- a/frontend/src/pages/_app.tsx +++ b/frontend/src/pages/_app.tsx @@ -6,12 +6,16 @@ import { overrideLocalStorage, NearSocialBridgeProvider, } from "near-social-bridge"; +import { IndexerDetailsProvider } from '../contexts/IndexerDetailsContext'; overrideLocalStorage(); export default function App({ Component, pageProps }: AppProps) { return ( }> - + + + ); } + diff --git a/frontend/src/pages/create-new-indexer/index.js b/frontend/src/pages/create-new-indexer/index.js index 526c13003..687532a0d 100644 --- a/frontend/src/pages/create-new-indexer/index.js +++ b/frontend/src/pages/create-new-indexer/index.js @@ -1,28 +1,31 @@ -import React from "react"; +import React, { useContext, useEffect} from "react"; import CreateNewIndexer from "../../components/CreateNewIndexer"; import { withRouter } from 'next/router' import { Alert } from 'react-bootstrap'; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; +const CreateNewIndexerPage = ({ router }) => { + const { accountId } = router.query + const { setAccountId, setIsCreateNewIndexer } = useContext(IndexerDetailsContext); -const CreateNewIndexerPage = ({ router }) => { - const { accountId } = router.query + useEffect(() => { + setIsCreateNewIndexer(true); + setAccountId(accountId); + }, [accountId, setAccountId, setIsCreateNewIndexer]); - if (accountId == undefined) { - return ( - <> - - AccountId needs to be specified in the URL - - - ) - } + if (accountId == undefined) { return ( - <> - - - ); + <> + + AccountId needs to be specified in the URL + + + ) + } + + return (); }; export default withRouter(CreateNewIndexerPage); diff --git a/frontend/src/pages/query-api-editor/index.js b/frontend/src/pages/query-api-editor/index.js index f78d353e0..d9d844719 100644 --- a/frontend/src/pages/query-api-editor/index.js +++ b/frontend/src/pages/query-api-editor/index.js @@ -1,40 +1,35 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect, useContext } from "react"; import Editor from "../../components/Editor"; import { withRouter } from 'next/router' import { Alert } from 'react-bootstrap'; - -import { providers } from "near-api-js"; - - -// get latest block height -const getLatestBlockHeight = async () => { - const provider = new providers.JsonRpcProvider( - "https://archival-rpc.mainnet.near.org" - ); - const latestBlock = await provider.block({ - finality: "final" - }); - return latestBlock.header.height; -} - +// import { EditorContext } from '../../contexts/EditorContext'; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; const QueryApiEditorPage = ({ router }) => { - const { accountId, indexerName } = router.query + const { accountId, indexerName } = router.query + // const { setAccountId, setIndexerName } = useContext(EditorContext); + const { setAccountId, setIndexerName } = useContext(IndexerDetailsContext); + useEffect(() => { if (accountId == undefined || indexerName == undefined) { - return ( - <> - - Both accountId and IndexerName need to be specified in the URL. - - - ) + return; } + setAccountId(accountId); + setIndexerName(indexerName); + }, [accountId, indexerName, setAccountId, setIndexerName]); + + if (accountId == undefined || indexerName == undefined) { return ( - <> - - - ); + <> + + Both accountId and IndexerName need to be specified in the URL. + + + ) + } + return ( + + ); }; export default withRouter(QueryApiEditorPage); diff --git a/frontend/src/utils/fetchBlock.js b/frontend/src/utils/fetchBlock.js index 70654f4a9..05a00468b 100644 --- a/frontend/src/utils/fetchBlock.js +++ b/frontend/src/utils/fetchBlock.js @@ -13,7 +13,6 @@ export async function fetchBlockDetails(blockHeight) { const block_details = await response.json(); return block_details; } catch { - // console.log(`Error Fetching Block Height details at ${blockHeight}`); throw new Error(`Error Fetching Block Height details at BlockHeight #${blockHeight}`); } } diff --git a/frontend/src/utils/formatters.js b/frontend/src/utils/formatters.js index a5ebed266..099863723 100644 --- a/frontend/src/utils/formatters.js +++ b/frontend/src/utils/formatters.js @@ -2,7 +2,7 @@ import prettier from "prettier"; import SqlPlugin from "prettier-plugin-sql"; import parserBabel from "prettier/parser-babel"; -let unformatted_code = (code) => `import {Block} from "@near-lake/primitives" +let wrap_code = (code) => `import {Block} from "@near-lake/primitives" /** * Note: We only support javascript at the moment. We will support Rust, Typescript in a further release. */ @@ -21,45 +21,35 @@ async function getBlock(block: Block, context) { }`; export const formatSQL = (schema) => { - try { - return prettier.format(schema, { - parser: "sql", - formatter: "sql-formatter", - plugins: [SqlPlugin], - pluginSearchDirs: false, - language: "postgresql", - database: "postgresql", - }); - } catch (e) { - console.log(e); - return schema; - } + return prettier.format(schema, { + parser: "sql", + formatter: "sql-formatter", + plugins: [SqlPlugin], + pluginSearchDirs: false, + language: "postgresql", + database: "postgresql", + }); }; -export const formatIndexingCode = (code, wrapCode) => { +export const wrapCode = (code) => { code = code.replace(/(?:\\[n])+/g, "\r\n"); - if (wrapCode) { - code = unformatted_code(code); - } - try { - return prettier.format(code, { - parser: "babel", - plugins: [parserBabel], - }); - } catch (e) { - console.log(e); - return code; - } + const wrappedCode = wrap_code(code); + return wrappedCode +} + +export const formatIndexingCode = (code) => { + return prettier.format(code, { + parser: "babel", + plugins: [parserBabel], + }); }; -export const defaultCode = formatIndexingCode( +export const defaultCode = formatIndexingCode(wrapCode( ` // Add your code here const h = block.header().height await context.set('height', h); -`, - true -); +`)); export const defaultSchema = ` CREATE TABLE "indexer_storage" ("function_name" TEXT NOT NULL, "key_name" TEXT NOT NULL, "value" TEXT NOT NULL, PRIMARY KEY ("function_name", "key_name")) diff --git a/frontend/src/utils/queryIndexerFunction.js b/frontend/src/utils/queryIndexerFunction.js index 280874bb5..06ee177e7 100644 --- a/frontend/src/utils/queryIndexerFunction.js +++ b/frontend/src/utils/queryIndexerFunction.js @@ -4,7 +4,7 @@ const REGISTRY_CONTRACT = "dev-queryapi.dataplatform.near"; //network config (replace testnet with mainnet or betanet) const provider = new providers.JsonRpcProvider( - "https://archival-rpc.mainnet.near.org" + "https://rpc.mainnet.near.org" ); export const queryIndexerFunctionDetails = async (accountId, functionName) => { @@ -24,6 +24,7 @@ export const queryIndexerFunctionDetails = async (accountId, functionName) => { JSON.parse(Buffer.from(result.result).toString()) ); } catch (error) { + console.log(`Could not query indexer function details from registry ${REGISTRY_CONTRACT}, for ${accountId}/${functionName}`) console.log(error, "error"); return null; } From 5a67b02f18477342be519fc380e3906dfe4b6397 Mon Sep 17 00:00:00 2001 From: Gabe Hamilton Date: Mon, 12 Jun 2023 11:38:04 -0600 Subject: [PATCH 12/20] Updated indexed historical data folder --- .../queryapi_coordinator/src/historical_block_processing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indexer/queryapi_coordinator/src/historical_block_processing.rs b/indexer/queryapi_coordinator/src/historical_block_processing.rs index c14d09053..3092ff808 100644 --- a/indexer/queryapi_coordinator/src/historical_block_processing.rs +++ b/indexer/queryapi_coordinator/src/historical_block_processing.rs @@ -17,7 +17,7 @@ use tokio::task::JoinHandle; const INDEXED_DATA_FILES_BUCKET: &str = "near-delta-lake"; const LAKE_BUCKET_PREFIX: &str = "near-lake-data-"; -const INDEXED_DATA_FILES_FOLDER: &str = "silver/contracts/metadata"; +const INDEXED_DATA_FILES_FOLDER: &str = "silver/contracts/action_receipt_actions/metadata"; pub fn spawn_historical_message_thread( block_height: BlockHeight, @@ -195,7 +195,7 @@ async fn filter_matching_blocks_from_index_files( ); return vec![]; - // let s3_prefix = format!("silver/contracts/metadata/{}", affected_account_id); + // let s3_prefix = format!("{}/{}", INDEXED_DATA_FILES_FOLDER, affected_account_id); // fetch_contract_index_files(aws_config, s3_bucket, s3_prefix).await // // todo implement, use function name selector } From 13910190da39c04f3dd3d49091b840516ff11d0b Mon Sep 17 00:00:00 2001 From: Gabe Hamilton Date: Mon, 12 Jun 2023 12:02:04 -0600 Subject: [PATCH 13/20] Limit unindexed block processing to two hours of blocks. --- .../src/historical_block_processing.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indexer/queryapi_coordinator/src/historical_block_processing.rs b/indexer/queryapi_coordinator/src/historical_block_processing.rs index 3092ff808..3d4100da3 100644 --- a/indexer/queryapi_coordinator/src/historical_block_processing.rs +++ b/indexer/queryapi_coordinator/src/historical_block_processing.rs @@ -18,6 +18,7 @@ use tokio::task::JoinHandle; const INDEXED_DATA_FILES_BUCKET: &str = "near-delta-lake"; const LAKE_BUCKET_PREFIX: &str = "near-lake-data-"; const INDEXED_DATA_FILES_FOLDER: &str = "silver/contracts/action_receipt_actions/metadata"; +const MAX_UNINDEXED_BLOCKS_TO_PROCESS: u64 = 7200; // two hours of blocks takes ~14 minutes. pub fn spawn_historical_message_thread( block_height: BlockHeight, @@ -274,6 +275,13 @@ async fn filter_matching_unindexed_blocks_from_lake( let lake_bucket = lake_bucket_for_chain(chain_id.clone()); let count = ending_block_height - last_indexed_block; + if count > MAX_UNINDEXED_BLOCKS_TO_PROCESS { + tracing::error!( + target: crate::INDEXER, + "Too many unindexed blocks to filter: {count}. Last indexed block is {last_indexed_block}.", + ); + return vec![]; + } tracing::info!( target: crate::INDEXER, "Filtering {count} unindexed blocks from lake: from block {last_indexed_block} to {ending_block_height}", From 330d67d1cedc976a47db81dca20f52fb898b59be Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Mon, 12 Jun 2023 14:48:14 -0500 Subject: [PATCH 14/20] [DPLT-1021] feat: enable graphiql explorer plugin (#94) --- frontend/package.json | 1 + frontend/src/components/Playground/graphiql.jsx | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 2ef51c9bd..cb5cc964b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ "lint": "next lint" }, "dependencies": { + "@graphiql/plugin-explorer": "^0.1.20", "@monaco-editor/react": "^4.1.3", "@near-lake/primitives": "0.1.0", "@next/font": "13.1.6", diff --git a/frontend/src/components/Playground/graphiql.jsx b/frontend/src/components/Playground/graphiql.jsx index d50b5c341..81b584b61 100644 --- a/frontend/src/components/Playground/graphiql.jsx +++ b/frontend/src/components/Playground/graphiql.jsx @@ -1,9 +1,13 @@ -import React, { useContext } from "react"; +import React, { useContext, useState } from "react"; import GraphiQL from "graphiql"; import { sessionStorage } from "near-social-bridge"; import "graphiql/graphiql.min.css"; import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; +import { useExplorerPlugin } from '@graphiql/plugin-explorer'; +import '@graphiql/plugin-explorer/dist/style.css'; +import "graphiql/graphiql.min.css"; + const HASURA_ENDPOINT = process.env.NEXT_PUBLIC_HASURA_ENDPOINT || "https://queryapi-hasura-graphql-24ktefolwq-ew.a.run.app/v1/graphql"; @@ -23,12 +27,21 @@ const graphQLFetcher = async (graphQLParams, accountId) => { export const GraphqlPlayground = () => { const { indexerDetails } = useContext(IndexerDetailsContext); + const [query, setQuery] = useState(""); + const explorerPlugin = useExplorerPlugin({ + query, + onEdit: setQuery, + }); return (
graphQLFetcher(params, indexerDetails.accountId)} + query={query} + onEditQuery={setQuery} + plugins={[explorerPlugin]} defaultQuery="" storage={sessionStorage} + theme="dark" />
); From 2ca99d5a0df8159a1b503d9e640dccdf4111c58a Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Tue, 13 Jun 2023 11:45:58 -0500 Subject: [PATCH 15/20] DPLT-1028 feat: Fork Your Own indexer modal (#99) --- frontend/src/components/Editor/Editor.js | 16 ++--- .../src/components/Editor/EditorButtons.jsx | 33 ++++++--- .../Form/IndexerConfigOptionsInputGroup.jsx | 47 +++++++++--- .../components/Modals/ForkIndexerModal.jsx | 72 +++++++++++++++++++ .../src/components/Modals/PublishModal.jsx | 34 ++++++--- .../src/contexts/IndexerDetailsContext.js | 10 +-- 6 files changed, 168 insertions(+), 44 deletions(-) create mode 100644 frontend/src/components/Modals/ForkIndexerModal.jsx diff --git a/frontend/src/components/Editor/Editor.js b/frontend/src/components/Editor/Editor.js index 0f81c46d7..18c133c4d 100644 --- a/frontend/src/components/Editor/Editor.js +++ b/frontend/src/components/Editor/Editor.js @@ -17,6 +17,7 @@ import { ResetChangesModal } from "../Modals/resetChanges"; import { FileSwitcher } from "./FileSwitcher"; import EditorButtons from "./EditorButtons"; import { PublishModal } from "../Modals/PublishModal"; +import { ForkIndexerModal } from "../Modals/ForkIndexerModal"; import { getLatestBlockHeight } from "../../utils/getLatestBlockHeight"; import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; @@ -126,19 +127,12 @@ const Editor = ({ } }; - const registerFunction = async (indexerConfig) => { + const registerFunction = async (indexerName, indexerConfig) => { let formatted_schema = checkSQLSchemaFormatting(); let isForking = indexerDetails.accountId !== currentUserAccountId; let innerCode = indexingCode.match(/getBlock\s*\([^)]*\)\s*{([\s\S]*)}/)[1]; - let indexerName = isCreateNewIndexer ? indexerNameField.replaceAll(" ", "_") : indexerDetails?.indexerName.replaceAll(" ", "_"); - if (indexerName === undefined || indexerName === "") { - setError( - () => - "Please provide an Indexer Name" - ) - return - } + indexerName = indexerName.replaceAll(" ", "_"); if (formatted_schema == undefined) { setError( () => @@ -336,6 +330,10 @@ const Editor = ({ actionButtonText={getActionButtonText()} blockHeightError={blockHeightError} /> + +
{accountId} + {!isCreateNewIndexer && ( - {isCreateNewIndexer ? ( - setIndexerNameField(e.target.value)} - /> - ) : ( - indexerName - )} + {indexerName} + )} {!isCreateNewIndexer && Contract Filter @@ -118,6 +112,7 @@ const EditorButtons = ({ aria-label="Action Button Group" > {isUserIndexer && !isCreateNewIndexer && ( + <> Delete Indexer} @@ -131,6 +126,20 @@ const EditorButtons = ({ + Fork this Indexer} + > + + + )} )} + @@ -198,5 +208,6 @@ const EditorButtons = ({ ); }; + export default EditorButtons; diff --git a/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx b/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx index ebd2e1f99..ca84bd625 100644 --- a/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx +++ b/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx @@ -1,14 +1,17 @@ import React, { useContext, useState, useEffect } from "react"; -import { InputGroup } from "react-bootstrap"; +import { InputGroup, Alert } from "react-bootstrap"; import Form from "react-bootstrap/Form"; import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; import { validateContractId } from "../../utils/validators"; +const GENESIS_BLOCK_HEIGHT = 9820210; const IndexerConfigOptions = ({ updateConfig }) => { - const { indexerDetails } = useContext(IndexerDetailsContext); + const { indexerDetails, showPublishModal, isCreateNewIndexer, latestHeight } = useContext(IndexerDetailsContext); const [blockHeight, setBlockHeight] = useState("0"); const [contractFilter, setContractFilter] = useState("social.near"); const [selectedOption, setSelectedOption] = useState("latestBlockHeight"); const [isContractFilterValid, setIsContractFilterValid] = useState(true); + const [indexerNameField, setIndexerNameField] = useState(indexerDetails.indexerName || ""); + const [blockHeightError, setBlockHeightError] = useState(null) const handleOptionChange = (event) => { setSelectedOption(event.target.value); @@ -33,20 +36,37 @@ const IndexerConfigOptions = ({ updateConfig }) => { } useEffect(() => { - updateConfig(contractFilter, blockHeight, selectedOption) - }, [contractFilter, selectedOption, blockHeight]) + if (selectedOption == "specificBlockHeight" && blockHeight <= GENESIS_BLOCK_HEIGHT) { + setBlockHeightError(() => `Choose a block height greater than the Genesis BlockHeight ${GENESIS_BLOCK_HEIGHT}. Latest Block Height is ${latestHeight}`) + return + } + setBlockHeightError(() => null) + updateConfig(indexerNameField, contractFilter, blockHeight, selectedOption) + }, + [indexerNameField, contractFilter, selectedOption, blockHeight]) return ( <> - - + Indexer Name + setIndexerNameField(e.target.value)} /> - From Latest Block Height + + + From Latest Block Height + { onChange={(e) => setBlockHeight(parseInt(e.target.value))} type="number" /> + {blockHeightError && ( + + {blockHeightError} + + )} Contract Filter diff --git a/frontend/src/components/Modals/ForkIndexerModal.jsx b/frontend/src/components/Modals/ForkIndexerModal.jsx new file mode 100644 index 000000000..7e427e238 --- /dev/null +++ b/frontend/src/components/Modals/ForkIndexerModal.jsx @@ -0,0 +1,72 @@ +import React, { useContext, useState } from "react"; +import { Button, Modal, Alert } from "react-bootstrap"; +import IndexerConfigOptions from "../Form/IndexerConfigOptionsInputGroup"; +import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; +import { validateContractId } from "../../utils/validators"; + +export const ForkIndexerModal = ({ + registerFunction, +}) => { + const { + indexerDetails, + showForkIndexerModal, + setShowForkIndexerModal, + } = useContext(IndexerDetailsContext); + const [indexerConfig, setIndexerConfig] = useState({ filter: "social.near", startBlockHeight: null }) + const [indexerName, setIndexerName] = useState("") + const [error, setError] = useState(null) + + const updateConfig = (indexerName, filter, startBlockHeight, option) => { + let finalStartBlockHeight = option === "latestBlockHeight" ? null : startBlockHeight; + setIndexerConfig({ filter, startBlockHeight: finalStartBlockHeight }) + setIndexerName(indexerName) + } + const register = async () => { + if (!indexerName) { + setError("Please provide an Indexer Name") + return + } + + if (indexerName === indexerDetails.indexerName) { + setError("Please provide a different Indexer Name than the orginal Indexer") + return + } + + + if (!validateContractId(indexerConfig.filter)) { + setError("Please provide a valid contract name") + return + } + setError(null) + registerFunction(indexerName, indexerConfig) + setShowForkIndexerModal(false) + } + + return ( + setShowForkIndexerModal(false)} + > + + Enter Indexer Details + + + + {error && ( + + {error} + + )} + + + + + + + ); +}; diff --git a/frontend/src/components/Modals/PublishModal.jsx b/frontend/src/components/Modals/PublishModal.jsx index f1de823b6..e95756e7d 100644 --- a/frontend/src/components/Modals/PublishModal.jsx +++ b/frontend/src/components/Modals/PublishModal.jsx @@ -2,23 +2,41 @@ import React, { useContext, useState } from "react"; import { Button, Modal, Alert } from "react-bootstrap"; import IndexerConfigOptions from "../Form/IndexerConfigOptionsInputGroup"; import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; +import { validateContractId } from "../../utils/validators"; export const PublishModal = ({ registerFunction, actionButtonText, - blockHeightError, }) => { const { showPublishModal, setShowPublishModal, } = useContext(IndexerDetailsContext); const [indexerConfig, setIndexerConfig] = useState({ filter: "social.near", startBlockHeight: null }) + const [indexerName, setIndexerName] = useState("") + const [error, setError] = useState(null) - const updateConfig = (filter, startBlockHeight, option) => { + const updateConfig = (indexerName, filter, startBlockHeight, option) => { if (option === "latestBlockHeight") { startBlockHeight = null } setIndexerConfig({ filter, startBlockHeight }) + setIndexerName(indexerName) + } + + const register = async () => { + if (indexerName === undefined || indexerName === "") { + setError( () => "Please provide an Indexer Name") + return + } + + if (!validateContractId(indexerConfig.filter)) { + setError( () => "Please provide a valid contract name") + return + } + setError(null) + registerFunction(indexerName, indexerConfig) + setShowPublishModal(false) } return ( @@ -32,18 +50,18 @@ export const PublishModal = ({ - - - {blockHeightError && ( - - {blockHeightError} + {error && ( + + {error} )} + + - diff --git a/frontend/src/contexts/IndexerDetailsContext.js b/frontend/src/contexts/IndexerDetailsContext.js index 7aa61d274..10358857b 100644 --- a/frontend/src/contexts/IndexerDetailsContext.js +++ b/frontend/src/contexts/IndexerDetailsContext.js @@ -26,6 +26,8 @@ export const IndexerDetailsContext = React.createContext({ setShowResetCodeModel: () => { }, showPublishModal: false, setShowPublishModal: () => { }, + showForkIndexerModal: false, + setShowForkIndexerModal: () => { }, debugMode: false, setDebugMode: () => { }, latestHeight: 0, @@ -37,17 +39,15 @@ export const IndexerDetailsContext = React.createContext({ indexerName: undefined, setIndexerName: () => { }, setIndexerDetails: () => { }, - indexerNameField: "", - setIndexerNameField: () => { }, }); export const IndexerDetailsProvider = ({ children }) => { const [accountId, setAccountId] = useState(undefined); const [indexerName, setIndexerName] = useState(undefined); - const [indexerNameField, setIndexerNameField] = useState(""); const [indexerDetails, setIndexerDetails] = useState({ code: undefined, schema: undefined, config: { filter: "social.near", startBlockHeight: null }, accountId: accountId, indexerName: indexerName }) const [showResetCodeModel, setShowResetCodeModel] = useState(false); const [showPublishModal, setShowPublishModal] = useState(false); + const [showForkIndexerModal, setShowForkIndexerModal] = useState(false); const [debugMode, setDebugMode] = useState(false); const [latestHeight, setLatestHeight] = useState(0); const [isCreateNewIndexer, setIsCreateNewIndexer] = useState(false); @@ -106,13 +106,13 @@ export const IndexerDetailsProvider = ({ children }) => { indexerName, setAccountId, setIndexerName, - indexerNameField, - setIndexerNameField, indexerDetails, showResetCodeModel, setShowResetCodeModel, showPublishModal, setShowPublishModal, + showForkIndexerModal, + setShowForkIndexerModal, debugMode, setDebugMode, latestHeight, From 8a21123928849904a5cbc10b3efc007888dce9b0 Mon Sep 17 00:00:00 2001 From: Gabe Hamilton Date: Wed, 14 Jun 2023 09:48:07 -0600 Subject: [PATCH 16/20] DPLT-936 message per block (#101) --- indexer/indexer_rules_engine/src/outcomes_reducer.rs | 3 ++- indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/indexer/indexer_rules_engine/src/outcomes_reducer.rs b/indexer/indexer_rules_engine/src/outcomes_reducer.rs index 5b3d6b9a7..af118d7ae 100644 --- a/indexer/indexer_rules_engine/src/outcomes_reducer.rs +++ b/indexer/indexer_rules_engine/src/outcomes_reducer.rs @@ -20,7 +20,8 @@ pub async fn reduce_indexer_rule_matches_from_outcomes( shard .receipt_execution_outcomes .iter() - .filter(|receipt_execution_outcome| { + // future: when extracting Actions, Events, etc this will be a filter operation + .find(|receipt_execution_outcome| { matcher::matches(&indexer_rule.matching_rule, receipt_execution_outcome) }) }) diff --git a/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs b/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs index f1ab03994..e93a745c1 100644 --- a/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs +++ b/indexer/indexer_rules_engine/src/outcomes_reducer_sync.rs @@ -18,7 +18,8 @@ pub fn reduce_indexer_rule_matches_from_outcomes( shard .receipt_execution_outcomes .iter() - .filter(|receipt_execution_outcome| { + // future: when extracting Actions, Events, etc this will be a filter operation + .find(|receipt_execution_outcome| { matcher::matches(&indexer_rule.matching_rule, receipt_execution_outcome) }) }) From 841e2ae7d944bf1e10126fe0674736aa01ab0be9 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Wed, 14 Jun 2023 13:09:08 -0500 Subject: [PATCH 17/20] DPLT-975 feat: support for code-exporter (#100) --- frontend/package.json | 8 +- .../Editor/ResizableLayoutEditor.jsx | 2 +- .../src/components/Playground/graphiql.jsx | 91 ++++++++++++++++++- frontend/src/components/Playground/index.js | 15 ++- frontend/src/pages/_app.tsx | 1 + 5 files changed, 106 insertions(+), 11 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index cb5cc964b..a7c3bc221 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@graphiql/plugin-explorer": "^0.1.20", + "@graphiql/plugin-code-exporter": "^0.1.2", "@monaco-editor/react": "^4.1.3", "@near-lake/primitives": "0.1.0", "@next/font": "13.1.6", @@ -34,9 +35,8 @@ "typescript": "4.9.5", "graphiql": "^2.4.1", "react-bootstrap-icons": "^1.10.3", - "buffer": "^6.0.3" - }, - "devDependencies": { - "raw-loader": "^4.0.2" + "buffer": "^6.0.3", + "raw-loader": "^4.0.2", + "regenerator-runtime": "^0.13.11" } } diff --git a/frontend/src/components/Editor/ResizableLayoutEditor.jsx b/frontend/src/components/Editor/ResizableLayoutEditor.jsx index 550af5e10..90dfb75e7 100644 --- a/frontend/src/components/Editor/ResizableLayoutEditor.jsx +++ b/frontend/src/components/Editor/ResizableLayoutEditor.jsx @@ -59,7 +59,7 @@ const ResizableEditor = ({ // Render logic based on fileName const editorComponents = { - GraphiQL: () => , + GraphiQL: () => , "indexingLogic.js": () => diffView ? ( { return await response.json(); }; -export const GraphqlPlayground = () => { +const extractQueryName = query => { + const match = query.match(/^[^{(]+\s([^{\s(]+)/); + return match ? match[1] : null; +}; + +const extractTableName = query => { + const match = query.match(/query\s*\w*\s*{\s*([^({\s]+)/); + return match ? match[1].trim() : null; +}; + +const bosQuerySnippet = (accountId) => { + return { + name: `BOS Widget`, + language: `JavaScript`, + codeMirrorMode: `jsx`, + options: [], + generate: arg => { + const { operationDataList } = arg; + const { query } = operationDataList[0]; + const queryName = extractQueryName(query) + const tableName = extractTableName(query) + const formattedQuery = query.replace(/\n/g, `\n` + ` `.repeat(2)); + return ` +const QUERYAPI_ENDPOINT = \`${HASURA_ENDPOINT}\`; + +State.init({ +data: [] +}); + +const query = \`${formattedQuery}\` +function fetchGraphQL(operationsDoc, operationName, variables) { + return asyncFetch( + QUERYAPI_ENDPOINT, + { + method: "POST", + headers: { "x-hasura-role": \`${accountId?.replaceAll(".", "_")}\` }, + body: JSON.stringify({ + query: operationsDoc, + variables: variables, + operationName: operationName, + }), + } + ); + } + + fetchGraphQL(query, "${queryName}", {}).then((result) => { + if (result.status === 200) { + if (result.body.data) { + const data = result.body.data.${tableName}; + State.update({ data }) + console.log(data); + } + } + }); + +const renderData = (a) => { + return ( +
+ {JSON.stringify(a)} +
+ ); +}; + +const renderedData = state.data.map(renderData); +return ( + {renderedData} +);`; + } + } +}; + +export default () => { const { indexerDetails } = useContext(IndexerDetailsContext); + const snippets = [bosQuerySnippet(indexerDetails.accountId)]; const [query, setQuery] = useState(""); + const explorerPlugin = useExplorerPlugin({ query, onEdit: setQuery, }); + const exporterPlugin = useExporterPlugin({ + query, + snippets, + codeMirrorTheme: 'graphiql', + }); + return (
graphQLFetcher(params, indexerDetails.accountId)} query={query} onEditQuery={setQuery} plugins={[explorerPlugin]} defaultQuery="" storage={sessionStorage} - theme="dark" + plugins={[explorerPlugin, exporterPlugin]} />
); diff --git a/frontend/src/components/Playground/index.js b/frontend/src/components/Playground/index.js index 84abb703b..352a5cd30 100644 --- a/frontend/src/components/Playground/index.js +++ b/frontend/src/components/Playground/index.js @@ -1,3 +1,16 @@ -import { GraphqlPlayground } from "./graphiql"; +import dynamic from 'next/dynamic'; + +const DynamicGraphiQLWithExporter = dynamic( + () => import('./graphiql.jsx'), + { ssr: false } // This will load the component only on client side +); + +function GraphqlPlayground({ }) { + return ( +
+ +
+ ); +} export default GraphqlPlayground; diff --git a/frontend/src/pages/_app.tsx b/frontend/src/pages/_app.tsx index 29885ae68..eecf66fe2 100644 --- a/frontend/src/pages/_app.tsx +++ b/frontend/src/pages/_app.tsx @@ -7,6 +7,7 @@ import { NearSocialBridgeProvider, } from "near-social-bridge"; import { IndexerDetailsProvider } from '../contexts/IndexerDetailsContext'; +import 'regenerator-runtime/runtime'; overrideLocalStorage(); export default function App({ Component, pageProps }: AppProps) { From 329768d71df421e1b1f3682e8544153b5970a932 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Wed, 14 Jun 2023 13:38:32 -0500 Subject: [PATCH 18/20] fix: fix build for no named component error --- frontend/src/components/Playground/graphiql.jsx | 5 +---- frontend/src/components/Playground/index.js | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/Playground/graphiql.jsx b/frontend/src/components/Playground/graphiql.jsx index 250c292ab..1e1917b01 100644 --- a/frontend/src/components/Playground/graphiql.jsx +++ b/frontend/src/components/Playground/graphiql.jsx @@ -96,7 +96,7 @@ return ( } }; -export default () => { +export const GraphqlPlayground = () => { const { indexerDetails } = useContext(IndexerDetailsContext); const snippets = [bosQuerySnippet(indexerDetails.accountId)]; const [query, setQuery] = useState(""); @@ -117,9 +117,6 @@ export default () => { query={query} onEditQuery={setQuery} fetcher={(params) => graphQLFetcher(params, indexerDetails.accountId)} - query={query} - onEditQuery={setQuery} - plugins={[explorerPlugin]} defaultQuery="" storage={sessionStorage} plugins={[explorerPlugin, exporterPlugin]} diff --git a/frontend/src/components/Playground/index.js b/frontend/src/components/Playground/index.js index 352a5cd30..18e66c885 100644 --- a/frontend/src/components/Playground/index.js +++ b/frontend/src/components/Playground/index.js @@ -1,14 +1,14 @@ import dynamic from 'next/dynamic'; -const DynamicGraphiQLWithExporter = dynamic( - () => import('./graphiql.jsx'), +const DynamicGraphiQLPlayground= dynamic( + () => import('./graphiql.jsx').then(mod => mod.GraphqlPlayground), { ssr: false } // This will load the component only on client side ); function GraphqlPlayground({ }) { return (
- +
); } From 9a652e359bdefde4a7b95c87c9694096f4cb16df Mon Sep 17 00:00:00 2001 From: Morgan McCauley Date: Mon, 19 Jun 2023 08:16:06 +1200 Subject: [PATCH 19/20] DPLT-927 Write `current_historical_block_height` during historical backfill (#102) --- .../__snapshots__/indexer.test.js.snap | 49 ++++++++++++++++ indexer-js-queue-handler/handler.js | 3 +- indexer-js-queue-handler/indexer.js | 25 ++++++-- indexer-js-queue-handler/indexer.test.js | 58 ++++++++++++++++--- .../src/historical_block_processing.rs | 1 + .../queryapi_coordinator/src/indexer_types.rs | 1 + indexer/queryapi_coordinator/src/main.rs | 1 + 7 files changed, 123 insertions(+), 15 deletions(-) diff --git a/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap b/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap index 03ace3e00..abbbed488 100644 --- a/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap +++ b/indexer-js-queue-handler/__snapshots__/indexer.test.js.snap @@ -169,6 +169,55 @@ exports[`Indexer unit tests Indexer.runFunctions() logs provisioning failures 1` ] `; +exports[`Indexer unit tests Indexer.runFunctions() sets the current historical block height 1`] = ` +[ + [ + "mock-hasura-endpoint/v1/graphql", + { + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":456,"message":"Running function:buildnear.testnet/test:, lag in ms is: :NaN"}}", + "headers": { + "Content-Type": "application/json", + "X-Hasura-Role": "append", + }, + "method": "POST", + }, + ], + [ + "mock-hasura-endpoint/v1/graphql", + { + "body": "{"query":"\\n mutation SetStatus($function_name: String, $status: String) {\\n insert_indexer_state_one(object: {function_name: $function_name, status: $status, current_block_height: 0 }, on_conflict: { constraint: indexer_state_pkey, update_columns: status }) {\\n function_name\\n status\\n }\\n }\\n ","variables":{"function_name":"buildnear.testnet/test","status":"RUNNING"}}", + "headers": { + "Content-Type": "application/json", + "X-Hasura-Role": "append", + }, + "method": "POST", + }, + ], + [ + "mock-hasura-endpoint/v1/graphql", + { + "body": "{"query":"mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){\\n insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) {id}\\n }","variables":{"function_name":"buildnear.testnet/test","block_height":456,"message":"hey"}}", + "headers": { + "Content-Type": "application/json", + "X-Hasura-Role": "append", + }, + "method": "POST", + }, + ], + [ + "mock-hasura-endpoint/v1/graphql", + { + "body": "{"query":"\\n mutation WriteBlock($function_name: String!, $block_height: numeric!) {\\n insert_indexer_state(\\n objects: {current_historical_block_height: $block_height, current_block_height: 0, function_name: $function_name}\\n on_conflict: {constraint: indexer_state_pkey, update_columns: current_historical_block_height}\\n ) {\\n returning {\\n current_block_height\\n current_historical_block_height\\n function_name\\n }\\n }\\n }\\n ","variables":{"function_name":"buildnear.testnet/test","block_height":456}}", + "headers": { + "Content-Type": "application/json", + "X-Hasura-Role": "append", + }, + "method": "POST", + }, + ], +] +`; + exports[`Indexer unit tests Indexer.runFunctions() should execute all functions against the current block 1`] = ` [ [ diff --git a/indexer-js-queue-handler/handler.js b/indexer-js-queue-handler/handler.js index 2f56a5fbd..098e8890b 100644 --- a/indexer-js-queue-handler/handler.js +++ b/indexer-js-queue-handler/handler.js @@ -11,12 +11,13 @@ export const consumer = async (event) => { for (const record of event.Records) { const jsonBody = JSON.parse(record.body); const block_height = jsonBody.block_height; + const is_historical = jsonBody.is_historical; const functions = {}; const function_config = jsonBody.indexer_function; const function_name = function_config.account_id + '/' + function_config.function_name; functions[function_name] = function_config; - const mutations = await indexer.runFunctions(block_height, functions, {imperative: true, provision: true}); + const mutations = await indexer.runFunctions(block_height, functions, is_historical, {imperative: true, provision: true}); } }; diff --git a/indexer-js-queue-handler/indexer.js b/indexer-js-queue-handler/indexer.js index c54ea04fa..9558c7ad4 100644 --- a/indexer-js-queue-handler/indexer.js +++ b/indexer-js-queue-handler/indexer.js @@ -30,7 +30,7 @@ export default class Indexer { }; } - async runFunctions(block_height, functions, options = { imperative: false, provision: false }) { + async runFunctions(block_height, functions, is_historical, options = { imperative: false, provision: false }) { const blockWithHelpers = Block.fromStreamerMessage(await this.fetchStreamerMessage(block_height)); let lag = Date.now() - Math.floor(blockWithHelpers.header().timestampNanosec / 1000000); @@ -101,7 +101,7 @@ export default class Indexer { } } - simultaneousPromises.push(this.writeFunctionState(function_name, block_height)); + simultaneousPromises.push(this.writeFunctionState(function_name, block_height, is_historical)); } catch (e) { console.error(`${function_name}: Failed to run function`, e); this.deps.awsXray.resolveSegment().addError(e); @@ -307,10 +307,10 @@ export default class Indexer { }); } - async writeFunctionState(function_name, block_height) { + async writeFunctionState(function_name, block_height, is_historical) { const activeFunctionSubsegment = this.deps.awsXray.resolveSegment(); const subsegment = activeFunctionSubsegment.addNewSubsegment(`writeFunctionState`); - const mutation = + const real_time_mutation = `mutation WriteBlock($function_name: String!, $block_height: numeric!) { insert_indexer_state( objects: {current_block_height: $block_height, function_name: $function_name} @@ -322,11 +322,25 @@ export default class Indexer { } } }`; + const historical_mutation = ` + mutation WriteBlock($function_name: String!, $block_height: numeric!) { + insert_indexer_state( + objects: {current_historical_block_height: $block_height, current_block_height: 0, function_name: $function_name} + on_conflict: {constraint: indexer_state_pkey, update_columns: current_historical_block_height} + ) { + returning { + current_block_height + current_historical_block_height + function_name + } + } + } + `; const variables = { function_name, block_height, }; - return this.runGraphQLQuery(mutation, variables, function_name, block_height, this.DEFAULT_HASURA_ROLE) + return this.runGraphQLQuery(is_historical ? historical_mutation : real_time_mutation, variables, function_name, block_height, this.DEFAULT_HASURA_ROLE) .catch((e) => { console.error(`${function_name}: Error writing function state`, e); }) @@ -334,6 +348,7 @@ export default class Indexer { subsegment.close(); }); } + async runGraphQLQuery(operation, variables, function_name, block_height, hasuraRoleName, logError = true) { const response = await this.deps.fetch(`${process.env.HASURA_ENDPOINT}/v1/graphql`, { method: 'POST', diff --git a/indexer-js-queue-handler/indexer.test.js b/indexer-js-queue-handler/indexer.test.js index c5023cbc4..ee6d4b94d 100644 --- a/indexer-js-queue-handler/indexer.test.js +++ b/indexer-js-queue-handler/indexer.test.js @@ -74,7 +74,7 @@ describe('Indexer unit tests', () => { block.result = context.graphql(\`mutation { set(functionName: "buildnear.testnet/test", key: "height", data: "\$\{block.blockHeight\}")}\`); mutationsReturnValue['hack'] = function() {return 'bad'} `}; - await indexer.runFunctions(block_height, functions); + await indexer.runFunctions(block_height, functions, false); expect(mockFetch.mock.calls).toMatchSnapshot(); }); @@ -466,7 +466,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in return (\`Created comment \${id} on post \${post.id}\`) `}; - await indexer.runFunctions(blockHeight, functions, { imperative: true }); + await indexer.runFunctions(blockHeight, functions, false, { imperative: true }); expect(mockFetch.mock.calls).toMatchSnapshot(); }); @@ -520,7 +520,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in throw new Error('boom'); `}; - await expect(indexer.runFunctions(block_height, functions, {imperative: true })).rejects.toThrow(new Error('boom')) + await expect(indexer.runFunctions(block_height, functions, false, {imperative: true })).rejects.toThrow(new Error('boom')) expect(mockFetch.mock.calls).toMatchSnapshot(); }); @@ -569,7 +569,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in schema: 'schema', } }; - await indexer.runFunctions(1, functions, { provision: true }); + await indexer.runFunctions(1, functions, false, { provision: true }); expect(provisioner.createAuthenticatedEndpoint).toHaveBeenCalledTimes(1); expect(provisioner.createAuthenticatedEndpoint).toHaveBeenCalledWith( @@ -624,7 +624,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in schema: 'schema', } }; - await indexer.runFunctions(1, functions, { provision: true }); + await indexer.runFunctions(1, functions, false, { provision: true }); expect(provisioner.createAuthenticatedEndpoint).not.toHaveBeenCalled(); }); @@ -676,7 +676,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in schema: 'schema', } }; - await indexer.runFunctions(blockHeight, functions, { provision: true }); + await indexer.runFunctions(blockHeight, functions, false, { provision: true }); expect(provisioner.createAuthenticatedEndpoint).not.toHaveBeenCalled(); expect(mockFetch.mock.calls).toMatchSnapshot(); @@ -731,7 +731,47 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in } }; - await expect(indexer.runFunctions(blockHeight, functions, { provision: true })).rejects.toThrow(error) + await expect(indexer.runFunctions(blockHeight, functions, false, { provision: true })).rejects.toThrow(error) + expect(mockFetch.mock.calls).toMatchSnapshot(); + }); + + test('Indexer.runFunctions() sets the current historical block height', async () => { + const mockFetch = jest.fn(() => ({ + status: 200, + json: async () => ({ + errors: null, + }), + })); + const block_height = 456; + const mockS3 = { + getObject: jest.fn(() => ({ + promise: () => Promise.resolve({ + Body: { + toString: () => JSON.stringify({ + chunks: [], + header: { + height: block_height + } + }) + } + }) + })), + }; + const metrics = { + putBlockHeight: jest.fn().mockReturnValueOnce({ promise: jest.fn() }), + }; + const indexer = new Indexer('mainnet', { fetch: mockFetch, s3: mockS3, awsXray: mockAwsXray, metrics }); + + const functions = {}; + functions['buildnear.testnet/test'] = { + code:` + console.log('hey') + `, + account_id: 'buildnear.testnet', + function_name: 'test' + }; + await indexer.runFunctions(block_height, functions, true); + expect(mockFetch.mock.calls).toMatchSnapshot(); }); @@ -772,7 +812,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in account_id: 'buildnear.testnet', function_name: 'test' }; - await indexer.runFunctions(block_height, functions); + await indexer.runFunctions(block_height, functions, false); expect(metrics.putBlockHeight).toHaveBeenCalledWith('buildnear.testnet', 'test', block_height); }); @@ -810,7 +850,7 @@ mutation _1 { set(functionName: "buildnear.testnet/test", key: "foo2", data: "in functions['buildnear.testnet/succeeds'] = {code:` console.log('succeeded'); `}; - await indexer.runFunctions(block_height, functions, {imperative: true}); + await indexer.runFunctions(block_height, functions, false, {imperative: true}); // console.log('"Indexer.runFunctions() catches errors" calls:', mockFetch.mock.calls); expect(mockFetch).toHaveBeenCalledTimes(5); // 2 logs, 1 state diff --git a/indexer/queryapi_coordinator/src/historical_block_processing.rs b/indexer/queryapi_coordinator/src/historical_block_processing.rs index 3d4100da3..5f666d4af 100644 --- a/indexer/queryapi_coordinator/src/historical_block_processing.rs +++ b/indexer/queryapi_coordinator/src/historical_block_processing.rs @@ -526,6 +526,7 @@ async fn send_execution_message( payload, block_height: current_block, indexer_function: indexer_function.clone(), + is_historical: true, }; match opts::send_to_indexer_queue(queue_client, queue_url, vec![msg]).await { diff --git a/indexer/queryapi_coordinator/src/indexer_types.rs b/indexer/queryapi_coordinator/src/indexer_types.rs index 905a1f088..4a4993ce5 100644 --- a/indexer/queryapi_coordinator/src/indexer_types.rs +++ b/indexer/queryapi_coordinator/src/indexer_types.rs @@ -20,6 +20,7 @@ pub struct IndexerQueueMessage { pub payload: Option, pub block_height: u64, pub indexer_function: IndexerFunction, + pub is_historical: bool, } #[derive( diff --git a/indexer/queryapi_coordinator/src/main.rs b/indexer/queryapi_coordinator/src/main.rs index 8c37cca89..5cafbbeaa 100644 --- a/indexer/queryapi_coordinator/src/main.rs +++ b/indexer/queryapi_coordinator/src/main.rs @@ -188,6 +188,7 @@ async fn handle_streamer_message( payload: Some(indexer_rule_match.payload.clone()), block_height, indexer_function: indexer_function.clone(), + is_historical: false, }; indexer_function_messages.push(msg); From 3ab0a84d34e989a8cb5ce323c78acd076dc72c16 Mon Sep 17 00:00:00 2001 From: Roshaan Siddiqui Date: Mon, 19 Jun 2023 10:39:58 -0500 Subject: [PATCH 20/20] DPLT-1014 feat: add historical block processing column (#104) --- frontend/widgets/src/QueryApi.IndexerStatus.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/widgets/src/QueryApi.IndexerStatus.jsx b/frontend/widgets/src/QueryApi.IndexerStatus.jsx index c9fa8c854..492f650e2 100644 --- a/frontend/widgets/src/QueryApi.IndexerStatus.jsx +++ b/frontend/widgets/src/QueryApi.IndexerStatus.jsx @@ -152,6 +152,7 @@ const indexerStateDoc = ` status function_name current_block_height + current_historical_block_height } indexer_state_aggregate(where: {function_name: {_eq: "${accountId}/${indexer_name}"}}) { aggregate { @@ -262,6 +263,7 @@ return ( Function Name Current Block Height + Current Historical Block Height Status @@ -270,6 +272,7 @@ return ( {x.function_name} {x.current_block_height} + {x.current_historical_block_height} {x.status} ))}