Compare commits
	
		
			39 Commits
		
	
	
		
			feat/tab-r
			...
			feat/md-pr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1fab69ef9b | ||
| 
						 | 
					dbbbfdb2f0 | ||
| 
						 | 
					052be354d1 | ||
| 
						 | 
					737523fe8d | ||
| 
						 | 
					034fc3423b | ||
| 
						 | 
					b23b0066bb | ||
| 
						 | 
					380b6b1afd | ||
| 
						 | 
					c7d77b26b5 | ||
| 
						 | 
					aa62251780 | ||
| 
						 | 
					4b2b4b25c0 | ||
| 
						 | 
					6dd5712573 | ||
| 
						 | 
					6611a94652 | ||
| 
						 | 
					2086291d4d | ||
| 
						 | 
					5505f0ac87 | ||
| 
						 | 
					2cf92b908d | ||
| 
						 | 
					70de876f75 | ||
| 
						 | 
					58cde29fff | ||
| 
						 | 
					a06fb06610 | ||
| 
						 | 
					1f5a9731bb | ||
| 
						 | 
					ef4f95ca3e | ||
| 
						 | 
					fb9814ec76 | ||
| 
						 | 
					7f6b989f15 | ||
| 
						 | 
					d459b2ee92 | ||
| 
						 | 
					6ee1a09aaa | ||
| 
						 | 
					dd2228fb35 | ||
| 
						 | 
					ca52a5e064 | ||
| 
						 | 
					df0f8abe62 | ||
| 
						 | 
					a6c4db1951 | ||
| 
						 | 
					1c91003164 | ||
| 
						 | 
					66be0efbbd | ||
| 
						 | 
					9ab64ec062 | ||
| 
						 | 
					e77a5e234f | ||
| 
						 | 
					d2f618512a | ||
| 
						 | 
					1ee8dcb536 | ||
| 
						 | 
					b2b7059774 | ||
| 
						 | 
					41ba096ef9 | ||
| 
						 | 
					8b72086c04 | ||
| 
						 | 
					895b34cc68 | ||
| 
						 | 
					3897f2d823 | 
@@ -32,6 +32,7 @@ import { SetHookDialog } from "./SetHookDialog";
 | 
			
		||||
import { addFunds } from "../state/actions/addFaucetAccount";
 | 
			
		||||
import { deleteHook } from "../state/actions/deployHook";
 | 
			
		||||
import { capitalize } from "../utils/helpers";
 | 
			
		||||
import { deleteAccount } from '../state/actions/deleteAccount';
 | 
			
		||||
 | 
			
		||||
export const AccountDialog = ({
 | 
			
		||||
  activeAccountAddress,
 | 
			
		||||
@@ -99,10 +100,7 @@ export const AccountDialog = ({
 | 
			
		||||
              css={{ ml: "auto", mr: "$9" }}
 | 
			
		||||
              tabIndex={-1}
 | 
			
		||||
              onClick={() => {
 | 
			
		||||
                const index = state.accounts.findIndex(
 | 
			
		||||
                  acc => acc.address === activeAccount?.address
 | 
			
		||||
                );
 | 
			
		||||
                state.accounts.splice(index, 1);
 | 
			
		||||
                deleteAccount(activeAccount?.address);
 | 
			
		||||
              }}
 | 
			
		||||
            >
 | 
			
		||||
              Delete Account <Trash size="15px" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import React, { useEffect, useRef } from "react";
 | 
			
		||||
import React, { useEffect, useRef, useState } from "react";
 | 
			
		||||
import { useSnapshot, ref } from "valtio";
 | 
			
		||||
import type monaco from "monaco-editor";
 | 
			
		||||
import { ArrowBendLeftUp } from "phosphor-react";
 | 
			
		||||
@@ -23,14 +23,20 @@ import Monaco from "./Monaco";
 | 
			
		||||
import { saveAllFiles } from "../state/actions/saveFile";
 | 
			
		||||
import { Tab, Tabs } from "./Tabs";
 | 
			
		||||
import { renameFile } from "../state/actions/createNewFile";
 | 
			
		||||
import { Link } from ".";
 | 
			
		||||
import Markdown from "./Markdown";
 | 
			
		||||
 | 
			
		||||
const checkWritable = (filename?: string): boolean => {
 | 
			
		||||
  if (apiHeaderFiles.find(file => file === filename)) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const validateWritability = (editor: monaco.editor.IStandaloneCodeEditor) => {
 | 
			
		||||
  const currPath = editor.getModel()?.uri.path;
 | 
			
		||||
  if (apiHeaderFiles.find(h => currPath?.endsWith(h))) {
 | 
			
		||||
    editor.updateOptions({ readOnly: true });
 | 
			
		||||
  } else {
 | 
			
		||||
    editor.updateOptions({ readOnly: false });
 | 
			
		||||
  }
 | 
			
		||||
  const filename = editor.getModel()?.uri.path.split("/").pop();
 | 
			
		||||
  const isWritable = checkWritable(filename);
 | 
			
		||||
  editor.updateOptions({ readOnly: !isWritable });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
let decorations: { [key: string]: string[] } = {};
 | 
			
		||||
@@ -99,6 +105,7 @@ const HooksEditor = () => {
 | 
			
		||||
  const snap = useSnapshot(state);
 | 
			
		||||
  const router = useRouter();
 | 
			
		||||
  const { theme } = useTheme();
 | 
			
		||||
  const [isMdPreview, setIsMdPreview] = useState(true);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (editorRef.current) validateWritability(editorRef.current);
 | 
			
		||||
@@ -138,10 +145,36 @@ const HooksEditor = () => {
 | 
			
		||||
      }}
 | 
			
		||||
    >
 | 
			
		||||
      {snap.files.map((file, index) => {
 | 
			
		||||
        return <Tab key={file.name} header={file.name} />;
 | 
			
		||||
        return (
 | 
			
		||||
          <Tab
 | 
			
		||||
            key={file.name}
 | 
			
		||||
            header={file.name}
 | 
			
		||||
            renameDisabled={!checkWritable(file.name)}
 | 
			
		||||
          />
 | 
			
		||||
        );
 | 
			
		||||
      })}
 | 
			
		||||
    </Tabs>
 | 
			
		||||
  );
 | 
			
		||||
  const previewToggle = (
 | 
			
		||||
    <Link
 | 
			
		||||
      onClick={() => {
 | 
			
		||||
        if (!isMdPreview) {
 | 
			
		||||
          saveFile(false);
 | 
			
		||||
        }
 | 
			
		||||
        setIsMdPreview(!isMdPreview);
 | 
			
		||||
      }}
 | 
			
		||||
      css={{
 | 
			
		||||
        position: "absolute",
 | 
			
		||||
        right: 0,
 | 
			
		||||
        bottom: 0,
 | 
			
		||||
        zIndex: 10,
 | 
			
		||||
        m: "$1",
 | 
			
		||||
        fontSize: "$sm",
 | 
			
		||||
      }}
 | 
			
		||||
    >
 | 
			
		||||
      {isMdPreview ? "Exit Preview" : "View Preview"}
 | 
			
		||||
    </Link>
 | 
			
		||||
  );
 | 
			
		||||
  return (
 | 
			
		||||
    <Box
 | 
			
		||||
      css={{
 | 
			
		||||
@@ -155,111 +188,128 @@ const HooksEditor = () => {
 | 
			
		||||
      }}
 | 
			
		||||
    >
 | 
			
		||||
      <EditorNavigation renderNav={renderNav} />
 | 
			
		||||
      {file?.language === "markdown" && previewToggle}
 | 
			
		||||
      {snap.files.length > 0 && router.isReady ? (
 | 
			
		||||
        <Monaco
 | 
			
		||||
          keepCurrentModel
 | 
			
		||||
          defaultLanguage={file?.language}
 | 
			
		||||
          language={file?.language}
 | 
			
		||||
          path={`file:///work/c/${file?.name}`}
 | 
			
		||||
          defaultValue={file?.content}
 | 
			
		||||
          // onChange={val => (state.files[snap.active].content = val)} // Auto save?
 | 
			
		||||
          beforeMount={monaco => {
 | 
			
		||||
            if (!snap.editorCtx) {
 | 
			
		||||
              snap.files.forEach(file =>
 | 
			
		||||
                monaco.editor.createModel(
 | 
			
		||||
                  file.content,
 | 
			
		||||
                  file.language,
 | 
			
		||||
                  monaco.Uri.parse(`file:///work/c/${file.name}`)
 | 
			
		||||
                )
 | 
			
		||||
              );
 | 
			
		||||
            }
 | 
			
		||||
        isMdPreview && file?.language === "markdown" ? (
 | 
			
		||||
          <Markdown
 | 
			
		||||
            components={{
 | 
			
		||||
              a: ({ href, children }) => (
 | 
			
		||||
                <Link target="_blank" rel="noopener noreferrer" href={href}>
 | 
			
		||||
                  {children}
 | 
			
		||||
                </Link>
 | 
			
		||||
              ),
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            {file.content}
 | 
			
		||||
          </Markdown>
 | 
			
		||||
        ) : (
 | 
			
		||||
          <Monaco
 | 
			
		||||
            keepCurrentModel
 | 
			
		||||
            defaultLanguage={file?.language}
 | 
			
		||||
            language={file?.language}
 | 
			
		||||
            path={`file:///work/c/${file?.name}`}
 | 
			
		||||
            defaultValue={file?.content}
 | 
			
		||||
            // onChange={val => (state.files[snap.active].content = val)} // Auto save?
 | 
			
		||||
            beforeMount={monaco => {
 | 
			
		||||
              if (!snap.editorCtx) {
 | 
			
		||||
                snap.files.forEach(file =>
 | 
			
		||||
                  monaco.editor.createModel(
 | 
			
		||||
                    file.content,
 | 
			
		||||
                    file.language,
 | 
			
		||||
                    monaco.Uri.parse(`file:///work/c/${file.name}`)
 | 
			
		||||
                  )
 | 
			
		||||
                );
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
            // create the web socket
 | 
			
		||||
            if (!subscriptionRef.current) {
 | 
			
		||||
              monaco.languages.register({
 | 
			
		||||
                id: "c",
 | 
			
		||||
                extensions: [".c", ".h"],
 | 
			
		||||
                aliases: ["C", "c", "H", "h"],
 | 
			
		||||
                mimetypes: ["text/plain"],
 | 
			
		||||
              });
 | 
			
		||||
              MonacoServices.install(monaco);
 | 
			
		||||
              const webSocket = createWebSocket(
 | 
			
		||||
                process.env.NEXT_PUBLIC_LANGUAGE_SERVER_API_ENDPOINT || ""
 | 
			
		||||
              );
 | 
			
		||||
              subscriptionRef.current = webSocket;
 | 
			
		||||
              // listen when the web socket is opened
 | 
			
		||||
              listen({
 | 
			
		||||
                webSocket: webSocket as WebSocket,
 | 
			
		||||
                onConnection: connection => {
 | 
			
		||||
                  // create and start the language client
 | 
			
		||||
                  const languageClient = createLanguageClient(connection);
 | 
			
		||||
                  const disposable = languageClient.start();
 | 
			
		||||
              // create the web socket
 | 
			
		||||
              if (!subscriptionRef.current) {
 | 
			
		||||
                monaco.languages.register({
 | 
			
		||||
                  id: "c",
 | 
			
		||||
                  extensions: [".c", ".h"],
 | 
			
		||||
                  aliases: ["C", "c", "H", "h"],
 | 
			
		||||
                  mimetypes: ["text/plain"],
 | 
			
		||||
                });
 | 
			
		||||
                MonacoServices.install(monaco);
 | 
			
		||||
                const webSocket = createWebSocket(
 | 
			
		||||
                  process.env.NEXT_PUBLIC_LANGUAGE_SERVER_API_ENDPOINT || ""
 | 
			
		||||
                );
 | 
			
		||||
                subscriptionRef.current = webSocket;
 | 
			
		||||
                // listen when the web socket is opened
 | 
			
		||||
                listen({
 | 
			
		||||
                  webSocket: webSocket as WebSocket,
 | 
			
		||||
                  onConnection: connection => {
 | 
			
		||||
                    // create and start the language client
 | 
			
		||||
                    const languageClient = createLanguageClient(connection);
 | 
			
		||||
                    const disposable = languageClient.start();
 | 
			
		||||
 | 
			
		||||
                  connection.onClose(() => {
 | 
			
		||||
                    try {
 | 
			
		||||
                      disposable.dispose();
 | 
			
		||||
                    } catch (err) {
 | 
			
		||||
                      console.log("err", err);
 | 
			
		||||
                    }
 | 
			
		||||
                  });
 | 
			
		||||
                    connection.onClose(() => {
 | 
			
		||||
                      try {
 | 
			
		||||
                        disposable.dispose();
 | 
			
		||||
                      } catch (err) {
 | 
			
		||||
                        console.log("err", err);
 | 
			
		||||
                      }
 | 
			
		||||
                    });
 | 
			
		||||
                  },
 | 
			
		||||
                });
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              // editor.updateOptions({
 | 
			
		||||
              //   minimap: {
 | 
			
		||||
              //     enabled: false,
 | 
			
		||||
              //   },
 | 
			
		||||
              //   ...snap.editorSettings,
 | 
			
		||||
              // });
 | 
			
		||||
              if (!state.editorCtx) {
 | 
			
		||||
                state.editorCtx = ref(monaco.editor);
 | 
			
		||||
              }
 | 
			
		||||
            }}
 | 
			
		||||
            onMount={(editor, monaco) => {
 | 
			
		||||
              editorRef.current = editor;
 | 
			
		||||
              monacoRef.current = monaco;
 | 
			
		||||
              editor.updateOptions({
 | 
			
		||||
                glyphMargin: true,
 | 
			
		||||
                lightbulb: {
 | 
			
		||||
                  enabled: true,
 | 
			
		||||
                },
 | 
			
		||||
              });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // editor.updateOptions({
 | 
			
		||||
            //   minimap: {
 | 
			
		||||
            //     enabled: false,
 | 
			
		||||
            //   },
 | 
			
		||||
            //   ...snap.editorSettings,
 | 
			
		||||
            // });
 | 
			
		||||
            if (!state.editorCtx) {
 | 
			
		||||
              state.editorCtx = ref(monaco.editor);
 | 
			
		||||
            }
 | 
			
		||||
          }}
 | 
			
		||||
          onMount={(editor, monaco) => {
 | 
			
		||||
            editorRef.current = editor;
 | 
			
		||||
            monacoRef.current = monaco;
 | 
			
		||||
            editor.updateOptions({
 | 
			
		||||
              glyphMargin: true,
 | 
			
		||||
              lightbulb: {
 | 
			
		||||
                enabled: true,
 | 
			
		||||
              },
 | 
			
		||||
            });
 | 
			
		||||
            editor.addCommand(
 | 
			
		||||
              monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,
 | 
			
		||||
              () => {
 | 
			
		||||
                saveFile();
 | 
			
		||||
              }
 | 
			
		||||
            );
 | 
			
		||||
            // When the markers (errors/warnings from clangd language server) change
 | 
			
		||||
            // Lets improve the markers by adding extra content to them from related
 | 
			
		||||
            // md files
 | 
			
		||||
            monaco.editor.onDidChangeMarkers(() => {
 | 
			
		||||
              if (monacoRef.current) {
 | 
			
		||||
                setMarkers(monacoRef.current);
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // Hacky way to hide Peek menu
 | 
			
		||||
            editor.onContextMenu(e => {
 | 
			
		||||
              const host =
 | 
			
		||||
                document.querySelector<HTMLElement>(".shadow-root-host");
 | 
			
		||||
 | 
			
		||||
              const contextMenuItems =
 | 
			
		||||
                host?.shadowRoot?.querySelectorAll("li.action-item");
 | 
			
		||||
              contextMenuItems?.forEach(k => {
 | 
			
		||||
                // If menu item contains "Peek" lets hide it
 | 
			
		||||
                if (k.querySelector(".action-label")?.textContent === "Peek") {
 | 
			
		||||
                  // @ts-expect-error
 | 
			
		||||
                  k["style"].display = "none";
 | 
			
		||||
              editor.addCommand(
 | 
			
		||||
                monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,
 | 
			
		||||
                () => {
 | 
			
		||||
                  saveFile();
 | 
			
		||||
                }
 | 
			
		||||
              );
 | 
			
		||||
              // When the markers (errors/warnings from clangd language server) change
 | 
			
		||||
              // Lets improve the markers by adding extra content to them from related
 | 
			
		||||
              // md files
 | 
			
		||||
              monaco.editor.onDidChangeMarkers(() => {
 | 
			
		||||
                if (monacoRef.current) {
 | 
			
		||||
                  setMarkers(monacoRef.current);
 | 
			
		||||
                }
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            validateWritability(editor);
 | 
			
		||||
          }}
 | 
			
		||||
          theme={theme === "dark" ? "dark" : "light"}
 | 
			
		||||
        />
 | 
			
		||||
              // Hacky way to hide Peek menu
 | 
			
		||||
              editor.onContextMenu(e => {
 | 
			
		||||
                const host =
 | 
			
		||||
                  document.querySelector<HTMLElement>(".shadow-root-host");
 | 
			
		||||
 | 
			
		||||
                const contextMenuItems =
 | 
			
		||||
                  host?.shadowRoot?.querySelectorAll("li.action-item");
 | 
			
		||||
                contextMenuItems?.forEach(k => {
 | 
			
		||||
                  // If menu item contains "Peek" lets hide it
 | 
			
		||||
                  if (
 | 
			
		||||
                    k.querySelector(".action-label")?.textContent === "Peek"
 | 
			
		||||
                  ) {
 | 
			
		||||
                    // @ts-expect-error
 | 
			
		||||
                    k["style"].display = "none";
 | 
			
		||||
                  }
 | 
			
		||||
                });
 | 
			
		||||
              });
 | 
			
		||||
 | 
			
		||||
              validateWritability(editor);
 | 
			
		||||
            }}
 | 
			
		||||
            theme={theme === "dark" ? "dark" : "light"}
 | 
			
		||||
          />
 | 
			
		||||
        )
 | 
			
		||||
      ) : (
 | 
			
		||||
        <Container>
 | 
			
		||||
          {!snap.loading && router.isReady && (
 | 
			
		||||
 
 | 
			
		||||
@@ -162,7 +162,7 @@ export const Log: FC<ILog> = ({
 | 
			
		||||
 | 
			
		||||
  const enrichAccounts = useCallback(
 | 
			
		||||
    (str?: string): ReactNode => {
 | 
			
		||||
      if (!str || !accounts.length) return null;
 | 
			
		||||
      if (!str || !accounts.length) return str;
 | 
			
		||||
 | 
			
		||||
      const pattern = `(${accounts.map(acc => acc.address).join("|")})`;
 | 
			
		||||
      const res = regexifyString({
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								components/Markdown.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								components/Markdown.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
import ReactMarkdown from 'react-markdown';
 | 
			
		||||
import { styled } from '../stitches.config';
 | 
			
		||||
 
 | 
			
		||||
const Markdown = styled(ReactMarkdown, {
 | 
			
		||||
  px: "$8",
 | 
			
		||||
  "@md": {
 | 
			
		||||
    px: "$20",
 | 
			
		||||
  },
 | 
			
		||||
  pb: "$5",
 | 
			
		||||
  height: "100%",
 | 
			
		||||
  overflowY: "auto"
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
export default Markdown;
 | 
			
		||||
@@ -102,7 +102,7 @@ const Navigation = () => {
 | 
			
		||||
            ) : (
 | 
			
		||||
              <>
 | 
			
		||||
                <Heading css={{ lineHeight: 1 }}>
 | 
			
		||||
                  {snap.files?.[0]?.name || "XRPL Hooks"}
 | 
			
		||||
                  {snap.gistName || "XRPL Hooks"}
 | 
			
		||||
                </Heading>
 | 
			
		||||
                <Text
 | 
			
		||||
                  css={{ fontSize: "$xs", color: "$mauve10", lineHeight: 1 }}
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,6 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => {
 | 
			
		||||
      setIframeCode(template);
 | 
			
		||||
 | 
			
		||||
      state.scriptLogs = [
 | 
			
		||||
        ...snap.scriptLogs,
 | 
			
		||||
        { type: "success", message: "Started running..." },
 | 
			
		||||
      ];
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
 
 | 
			
		||||
@@ -91,7 +91,7 @@ const Select = forwardRef<any, Props>((props, ref) => {
 | 
			
		||||
            ...provided,
 | 
			
		||||
            color: colors.searchText,
 | 
			
		||||
            backgroundColor:
 | 
			
		||||
              state.isSelected || state.isFocused
 | 
			
		||||
              state.isFocused
 | 
			
		||||
                ? colors.activeLight
 | 
			
		||||
                : colors.dropDownBg,
 | 
			
		||||
            ":hover": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
import React, { useCallback, useEffect, useState } from "react";
 | 
			
		||||
import { Plus, Trash, X } from "phosphor-react";
 | 
			
		||||
import Button from "./Button";
 | 
			
		||||
import Box from "./Box";
 | 
			
		||||
import { Button, Box, Text } from ".";
 | 
			
		||||
import { Stack, Flex, Select } from ".";
 | 
			
		||||
import {
 | 
			
		||||
  Dialog,
 | 
			
		||||
@@ -19,48 +18,30 @@ import {
 | 
			
		||||
  useForm,
 | 
			
		||||
} from "react-hook-form";
 | 
			
		||||
 | 
			
		||||
import { TTS, tts } from "../utils/hookOnCalculator";
 | 
			
		||||
import { deployHook } from "../state/actions";
 | 
			
		||||
import { useSnapshot } from "valtio";
 | 
			
		||||
import state, { IFile, SelectOption } from "../state";
 | 
			
		||||
import toast from "react-hot-toast";
 | 
			
		||||
import { prepareDeployHookTx, sha256 } from "../state/actions/deployHook";
 | 
			
		||||
import estimateFee from "../utils/estimateFee";
 | 
			
		||||
 | 
			
		||||
const transactionOptions = Object.keys(tts).map(key => ({
 | 
			
		||||
  label: key,
 | 
			
		||||
  value: key as keyof TTS,
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
export type SetHookData = {
 | 
			
		||||
  Invoke: {
 | 
			
		||||
    value: keyof TTS;
 | 
			
		||||
    label: string;
 | 
			
		||||
  }[];
 | 
			
		||||
  Fee: string;
 | 
			
		||||
  HookNamespace: string;
 | 
			
		||||
  HookParameters: {
 | 
			
		||||
    HookParameter: {
 | 
			
		||||
      HookParameterName: string;
 | 
			
		||||
      HookParameterValue: string;
 | 
			
		||||
    };
 | 
			
		||||
  }[];
 | 
			
		||||
  // HookGrants: {
 | 
			
		||||
  //   HookGrant: {
 | 
			
		||||
  //     Authorize: string;
 | 
			
		||||
  //     HookHash: string;
 | 
			
		||||
  //   };
 | 
			
		||||
  // }[];
 | 
			
		||||
};
 | 
			
		||||
import {
 | 
			
		||||
  getParameters,
 | 
			
		||||
  getInvokeOptions,
 | 
			
		||||
  transactionOptions,
 | 
			
		||||
  SetHookData,
 | 
			
		||||
} from "../utils/setHook";
 | 
			
		||||
import { capitalize } from "../utils/helpers";
 | 
			
		||||
 | 
			
		||||
export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
  ({ accountAddress }) => {
 | 
			
		||||
    const snap = useSnapshot(state);
 | 
			
		||||
 | 
			
		||||
    const [estimateLoading, setEstimateLoading] = useState(false);
 | 
			
		||||
    const [isSetHookDialogOpen, setIsSetHookDialogOpen] = useState(false);
 | 
			
		||||
 | 
			
		||||
    const compiledFiles = snap.files.filter(file => file.compiledContent);
 | 
			
		||||
    const activeFile = compiledFiles[snap.activeWat] as IFile | undefined;
 | 
			
		||||
 | 
			
		||||
    const [isSetHookDialogOpen, setIsSetHookDialogOpen] = useState(false);
 | 
			
		||||
 | 
			
		||||
    const accountOptions: SelectOption[] = snap.accounts.map(acc => ({
 | 
			
		||||
      label: acc.name,
 | 
			
		||||
      value: acc.address,
 | 
			
		||||
@@ -75,12 +56,23 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
 | 
			
		||||
    const getHookNamespace = useCallback(
 | 
			
		||||
      () =>
 | 
			
		||||
        activeFile && snap.deployValues[activeFile.name]
 | 
			
		||||
          ? snap.deployValues[activeFile.name].HookNamespace
 | 
			
		||||
          : activeFile?.name.split(".")[0] || "",
 | 
			
		||||
        (activeFile && snap.deployValues[activeFile.name]?.HookNamespace) ||
 | 
			
		||||
        activeFile?.name.split(".")[0] ||
 | 
			
		||||
        "",
 | 
			
		||||
      [activeFile, snap.deployValues]
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const getDefaultValues = useCallback((): Partial<SetHookData> => {
 | 
			
		||||
      const content = activeFile?.compiledValueSnapshot;
 | 
			
		||||
      return (
 | 
			
		||||
        (activeFile && snap.deployValues[activeFile.name]) || {
 | 
			
		||||
          HookNamespace: getHookNamespace(),
 | 
			
		||||
          Invoke: getInvokeOptions(content),
 | 
			
		||||
          HookParameters: getParameters(content),
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
    }, [activeFile, getHookNamespace, snap.deployValues]);
 | 
			
		||||
 | 
			
		||||
    const {
 | 
			
		||||
      register,
 | 
			
		||||
      handleSubmit,
 | 
			
		||||
@@ -88,29 +80,25 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
      watch,
 | 
			
		||||
      setValue,
 | 
			
		||||
      getValues,
 | 
			
		||||
      reset,
 | 
			
		||||
      formState: { errors },
 | 
			
		||||
    } = useForm<SetHookData>({
 | 
			
		||||
      defaultValues: (activeFile && snap.deployValues[activeFile.name]) || {
 | 
			
		||||
        HookNamespace: activeFile?.name.split(".")[0] || "",
 | 
			
		||||
        Invoke: transactionOptions.filter(to => to.label === "ttPAYMENT"),
 | 
			
		||||
      },
 | 
			
		||||
      defaultValues: getDefaultValues(),
 | 
			
		||||
    });
 | 
			
		||||
    const { fields, append, remove } = useFieldArray({
 | 
			
		||||
      control,
 | 
			
		||||
      name: "HookParameters", // unique name for your Field Array
 | 
			
		||||
    });
 | 
			
		||||
    const [formInitialized, setFormInitialized] = useState(false);
 | 
			
		||||
    const [estimateLoading, setEstimateLoading] = useState(false);
 | 
			
		||||
 | 
			
		||||
    const watchedFee = watch("Fee");
 | 
			
		||||
 | 
			
		||||
    // Update value if activeFile changes
 | 
			
		||||
    // Reset form if activeFile changes
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
      if (!activeFile) return;
 | 
			
		||||
      const defaultValue = getHookNamespace();
 | 
			
		||||
      const defaultValues = getDefaultValues();
 | 
			
		||||
 | 
			
		||||
      setValue("HookNamespace", defaultValue);
 | 
			
		||||
      setFormInitialized(true);
 | 
			
		||||
    }, [setValue, activeFile, snap.deployValues, getHookNamespace]);
 | 
			
		||||
      reset(defaultValues);
 | 
			
		||||
    }, [activeFile, getDefaultValues, reset]);
 | 
			
		||||
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
      if (
 | 
			
		||||
@@ -141,23 +129,19 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
      calculateHashedValue();
 | 
			
		||||
    }, [namespace, calculateHashedValue]);
 | 
			
		||||
 | 
			
		||||
    // Calculate initial fee estimate when modal opens
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
      if (formInitialized && account) {
 | 
			
		||||
        (async () => {
 | 
			
		||||
          const formValues = getValues();
 | 
			
		||||
          const tx = await prepareDeployHookTx(account, formValues);
 | 
			
		||||
          if (!tx) {
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
          const res = await estimateFee(tx, account);
 | 
			
		||||
          if (res && res.base_fee) {
 | 
			
		||||
            setValue("Fee", Math.round(Number(res.base_fee || "")).toString());
 | 
			
		||||
          }
 | 
			
		||||
        })();
 | 
			
		||||
    const calculateFee = useCallback(async () => {
 | 
			
		||||
      if (!account) return;
 | 
			
		||||
 | 
			
		||||
      const formValues = getValues();
 | 
			
		||||
      const tx = await prepareDeployHookTx(account, formValues);
 | 
			
		||||
      if (!tx) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      // eslint-disable-next-line react-hooks/exhaustive-deps
 | 
			
		||||
    }, [formInitialized]);
 | 
			
		||||
      const res = await estimateFee(tx, account);
 | 
			
		||||
      if (res && res.base_fee) {
 | 
			
		||||
        setValue("Fee", Math.round(Number(res.base_fee || "")).toString());
 | 
			
		||||
      }
 | 
			
		||||
    }, [account, getValues, setValue]);
 | 
			
		||||
 | 
			
		||||
    const tooLargeFile = () => {
 | 
			
		||||
      return Boolean(
 | 
			
		||||
@@ -172,6 +156,12 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
      );
 | 
			
		||||
      if (!account) return;
 | 
			
		||||
      if (currAccount) currAccount.isLoading = true;
 | 
			
		||||
 | 
			
		||||
      data.HookParameters.forEach(param => {
 | 
			
		||||
        delete param.$metaData;
 | 
			
		||||
        return param;
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      const res = await deployHook(account, data);
 | 
			
		||||
      if (currAccount) currAccount.isLoading = false;
 | 
			
		||||
 | 
			
		||||
@@ -181,8 +171,14 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
      }
 | 
			
		||||
      toast.error(`Transaction failed! (${res?.engine_result_message})`);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const onOpenChange = useCallback((open: boolean) => {
 | 
			
		||||
      setIsSetHookDialogOpen(open);
 | 
			
		||||
 | 
			
		||||
      if (open) calculateFee();
 | 
			
		||||
    }, [calculateFee]);
 | 
			
		||||
    return (
 | 
			
		||||
      <Dialog open={isSetHookDialogOpen} onOpenChange={setIsSetHookDialogOpen}>
 | 
			
		||||
      <Dialog open={isSetHookDialogOpen} onOpenChange={onOpenChange}>
 | 
			
		||||
        <DialogTrigger asChild>
 | 
			
		||||
          <Button
 | 
			
		||||
            ghost
 | 
			
		||||
@@ -206,7 +202,6 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
                  <Select
 | 
			
		||||
                    instanceId="deploy-account"
 | 
			
		||||
                    placeholder="Select account"
 | 
			
		||||
                    hideSelectedOptions
 | 
			
		||||
                    options={accountOptions}
 | 
			
		||||
                    value={selectedAccount}
 | 
			
		||||
                    onChange={(acc: any) => setSelectedAccount(acc)}
 | 
			
		||||
@@ -252,22 +247,39 @@ export const SetHookDialog: React.FC<{ accountAddress: string }> = React.memo(
 | 
			
		||||
                  <Stack>
 | 
			
		||||
                    {fields.map((field, index) => (
 | 
			
		||||
                      <Stack key={field.id}>
 | 
			
		||||
                        <Input
 | 
			
		||||
                          // important to include key with field's id
 | 
			
		||||
                          placeholder="Parameter name"
 | 
			
		||||
                          {...register(
 | 
			
		||||
                            `HookParameters.${index}.HookParameter.HookParameterName`
 | 
			
		||||
                        <Flex column>
 | 
			
		||||
                          <Flex row>
 | 
			
		||||
                            <Input
 | 
			
		||||
                              // important to include key with field's id
 | 
			
		||||
                              placeholder="Parameter name"
 | 
			
		||||
                              readOnly={field.$metaData?.required}
 | 
			
		||||
                              {...register(
 | 
			
		||||
                                `HookParameters.${index}.HookParameter.HookParameterName`
 | 
			
		||||
                              )}
 | 
			
		||||
                            />
 | 
			
		||||
                            <Input
 | 
			
		||||
                              css={{ mx: "$2" }}
 | 
			
		||||
                              placeholder="Value (hex-quoted)"
 | 
			
		||||
                              {...register(
 | 
			
		||||
                                `HookParameters.${index}.HookParameter.HookParameterValue`,
 | 
			
		||||
                                { required: field.$metaData?.required }
 | 
			
		||||
                              )}
 | 
			
		||||
                            />
 | 
			
		||||
                            <Button
 | 
			
		||||
                              onClick={() => remove(index)}
 | 
			
		||||
                              variant="destroy"
 | 
			
		||||
                            >
 | 
			
		||||
                              <Trash weight="regular" size="16px" />
 | 
			
		||||
                            </Button>
 | 
			
		||||
                          </Flex>
 | 
			
		||||
                          {errors.HookParameters?.[index]?.HookParameter
 | 
			
		||||
                            ?.HookParameterValue?.type === "required" && (
 | 
			
		||||
                            <Text error>This field is required</Text>
 | 
			
		||||
                          )}
 | 
			
		||||
                        />
 | 
			
		||||
                        <Input
 | 
			
		||||
                          placeholder="Value (hex-quoted)"
 | 
			
		||||
                          {...register(
 | 
			
		||||
                            `HookParameters.${index}.HookParameter.HookParameterValue`
 | 
			
		||||
                          )}
 | 
			
		||||
                        />
 | 
			
		||||
                        <Button onClick={() => remove(index)} variant="destroy">
 | 
			
		||||
                          <Trash weight="regular" size="16px" />
 | 
			
		||||
                        </Button>
 | 
			
		||||
                          <Label css={{ fontSize: "$sm", mt: "$1" }}>
 | 
			
		||||
                            {capitalize(field.$metaData?.description)}
 | 
			
		||||
                          </Label>
 | 
			
		||||
                        </Flex>
 | 
			
		||||
                      </Stack>
 | 
			
		||||
                    ))}
 | 
			
		||||
                    <Button
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ type Nullable<T> = T | null | undefined | false;
 | 
			
		||||
interface TabProps {
 | 
			
		||||
  header: string;
 | 
			
		||||
  children?: ReactNode;
 | 
			
		||||
  renameDisabled?: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO customize messages shown
 | 
			
		||||
@@ -98,16 +99,15 @@ export const Tabs = ({
 | 
			
		||||
  }, [tabname, setTabnameError]);
 | 
			
		||||
 | 
			
		||||
  const validateTabname = useCallback(
 | 
			
		||||
    (tabname: string): { error?: string, result?: string } => {
 | 
			
		||||
    (tabname: string): { error?: string; result?: string } => {
 | 
			
		||||
      if (!tabname) {
 | 
			
		||||
        return { error: `Please enter ${label.toLocaleLowerCase()} name.` };
 | 
			
		||||
      }
 | 
			
		||||
      let ext =
 | 
			
		||||
        (tabname.includes(".") && tabname.split(".").pop()) || "";
 | 
			
		||||
      
 | 
			
		||||
      let ext = (tabname.includes(".") && tabname.split(".").pop()) || "";
 | 
			
		||||
 | 
			
		||||
      if (!ext && defaultExtension) {
 | 
			
		||||
        ext = defaultExtension
 | 
			
		||||
        tabname = `${tabname}.${defaultExtension}`
 | 
			
		||||
        ext = defaultExtension;
 | 
			
		||||
        tabname = `${tabname}.${defaultExtension}`;
 | 
			
		||||
      }
 | 
			
		||||
      if (tabs.find(tab => tab.header === tabname)) {
 | 
			
		||||
        return { error: `${capitalize(label)} name already exists.` };
 | 
			
		||||
@@ -153,16 +153,23 @@ export const Tabs = ({
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const { result: _tabname = tabname } = res
 | 
			
		||||
    const { result: nwName = tabname } = res;
 | 
			
		||||
 | 
			
		||||
    setRenamingTab(null);
 | 
			
		||||
    setTabname("");
 | 
			
		||||
 | 
			
		||||
    const oldName = tabs[renamingTab]?.header;
 | 
			
		||||
    onRenameTab?.(renamingTab, _tabname, oldName);
 | 
			
		||||
    onRenameTab?.(renamingTab, nwName, oldName);
 | 
			
		||||
 | 
			
		||||
    handleActiveChange(renamingTab);
 | 
			
		||||
  }, [handleActiveChange, onRenameTab, renamingTab, tabname, tabs, validateTabname]);
 | 
			
		||||
    handleActiveChange(renamingTab, nwName);
 | 
			
		||||
  }, [
 | 
			
		||||
    handleActiveChange,
 | 
			
		||||
    onRenameTab,
 | 
			
		||||
    renamingTab,
 | 
			
		||||
    tabname,
 | 
			
		||||
    tabs,
 | 
			
		||||
    validateTabname,
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
  const handleCreateTab = useCallback(() => {
 | 
			
		||||
    const res = validateTabname(tabname);
 | 
			
		||||
@@ -170,7 +177,7 @@ export const Tabs = ({
 | 
			
		||||
      setTabnameError(`Error: ${res.error}`);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    const { result: _tabname = tabname } = res
 | 
			
		||||
    const { result: _tabname = tabname } = res;
 | 
			
		||||
 | 
			
		||||
    setIsNewtabDialogOpen(false);
 | 
			
		||||
    setTabname("");
 | 
			
		||||
@@ -178,17 +185,22 @@ export const Tabs = ({
 | 
			
		||||
    onCreateNewTab?.(_tabname);
 | 
			
		||||
 | 
			
		||||
    handleActiveChange(tabs.length, _tabname);
 | 
			
		||||
  }, [validateTabname, tabname, onCreateNewTab, handleActiveChange, tabs.length]);
 | 
			
		||||
  }, [
 | 
			
		||||
    validateTabname,
 | 
			
		||||
    tabname,
 | 
			
		||||
    onCreateNewTab,
 | 
			
		||||
    handleActiveChange,
 | 
			
		||||
    tabs.length,
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
  const handleCloseTab = useCallback(
 | 
			
		||||
    (idx: number) => {
 | 
			
		||||
      if (idx <= active && active !== 0) {
 | 
			
		||||
        setActive(active - 1);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      onCloseTab?.(idx, tabs[idx].header);
 | 
			
		||||
 | 
			
		||||
      handleActiveChange(idx, tabs[idx].header);
 | 
			
		||||
      if (idx <= active && active !== 0) {
 | 
			
		||||
        const nwActive = active - 1
 | 
			
		||||
        handleActiveChange(nwActive, tabs[nwActive].header);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    [active, handleActiveChange, onCloseTab, tabs]
 | 
			
		||||
  );
 | 
			
		||||
@@ -200,13 +212,16 @@ export const Tabs = ({
 | 
			
		||||
      key: "close",
 | 
			
		||||
      onSelect: () => handleCloseTab(idx),
 | 
			
		||||
    };
 | 
			
		||||
  const renameOption = (idx: number): Nullable<ContentMenuOption> =>
 | 
			
		||||
    onRenameTab && {
 | 
			
		||||
      type: "text",
 | 
			
		||||
      label: "Rename",
 | 
			
		||||
      key: "rename",
 | 
			
		||||
      onSelect: () => setRenamingTab(idx),
 | 
			
		||||
    };
 | 
			
		||||
  const renameOption = (idx: number, tab: TabProps): Nullable<ContentMenuOption> => {
 | 
			
		||||
    return (
 | 
			
		||||
      onRenameTab && !tab.renameDisabled && {
 | 
			
		||||
        type: "text",
 | 
			
		||||
        label: "Rename",
 | 
			
		||||
        key: "rename",
 | 
			
		||||
        onSelect: () => setRenamingTab(idx),
 | 
			
		||||
      }
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
@@ -225,7 +240,7 @@ export const Tabs = ({
 | 
			
		||||
            <ContextMenu
 | 
			
		||||
              key={tab.header}
 | 
			
		||||
              options={
 | 
			
		||||
                [closeOption(idx), renameOption(idx)].filter(
 | 
			
		||||
                [closeOption(idx), renameOption(idx, tab)].filter(
 | 
			
		||||
                  Boolean
 | 
			
		||||
                ) as ContentMenuOption[]
 | 
			
		||||
              }
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
    "lodash.xor": "^4.5.0",
 | 
			
		||||
    "monaco-editor": "^0.33.0",
 | 
			
		||||
    "next": "^12.0.4",
 | 
			
		||||
    "next-auth": "^4.10.1",
 | 
			
		||||
    "next-auth": "^4.10.3",
 | 
			
		||||
    "next-plausible": "^3.2.0",
 | 
			
		||||
    "next-themes": "^0.1.1",
 | 
			
		||||
    "normalize-url": "^7.0.2",
 | 
			
		||||
@@ -51,6 +51,7 @@
 | 
			
		||||
    "react-hook-form": "^7.28.0",
 | 
			
		||||
    "react-hot-keys": "^2.7.1",
 | 
			
		||||
    "react-hot-toast": "^2.1.1",
 | 
			
		||||
    "react-markdown": "^8.0.3",
 | 
			
		||||
    "react-new-window": "^0.2.1",
 | 
			
		||||
    "react-select": "^5.2.1",
 | 
			
		||||
    "react-split": "^2.0.14",
 | 
			
		||||
@@ -80,4 +81,4 @@
 | 
			
		||||
  "resolutions": {
 | 
			
		||||
    "ripple-binary-codec": "=1.4.2"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,40 +28,34 @@ export const names = [
 | 
			
		||||
 * is protected with CORS so that's why we did our own endpoint
 | 
			
		||||
 */
 | 
			
		||||
export const addFaucetAccount = async (name?: string, showToast: boolean = false) => {
 | 
			
		||||
  // Lets limit the number of faucet accounts to 5 for now
 | 
			
		||||
  if (state.accounts.length > 5) {
 | 
			
		||||
    return toast.error("You can only have maximum 6 accounts");
 | 
			
		||||
  }
 | 
			
		||||
  if (typeof window !== 'undefined') {
 | 
			
		||||
  if (typeof window === undefined) return
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    const toastId = showToast ? toast.loading("Creating account") : "";
 | 
			
		||||
    const res = await fetch(`${window.location.origin}/api/faucet`, {
 | 
			
		||||
      method: "POST",
 | 
			
		||||
    });
 | 
			
		||||
    const json: FaucetAccountRes | { error: string } = await res.json();
 | 
			
		||||
    if ("error" in json) {
 | 
			
		||||
      if (showToast) {
 | 
			
		||||
        return toast.error(json.error, { id: toastId });
 | 
			
		||||
      } else {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
  const toastId = showToast ? toast.loading("Creating account") : "";
 | 
			
		||||
  const res = await fetch(`${window.location.origin}/api/faucet`, {
 | 
			
		||||
    method: "POST",
 | 
			
		||||
  });
 | 
			
		||||
  const json: FaucetAccountRes | { error: string } = await res.json();
 | 
			
		||||
  if ("error" in json) {
 | 
			
		||||
    if (showToast) {
 | 
			
		||||
      return toast.error(json.error, { id: toastId });
 | 
			
		||||
    } else {
 | 
			
		||||
      if (showToast) {
 | 
			
		||||
        toast.success("New account created", { id: toastId });
 | 
			
		||||
      }
 | 
			
		||||
      const currNames = state.accounts.map(acc => acc.name);
 | 
			
		||||
      state.accounts.push({
 | 
			
		||||
        name: name || names.filter(name => !currNames.includes(name))[0],
 | 
			
		||||
        xrp: (json.xrp || 0 * 1000000).toString(),
 | 
			
		||||
        address: json.address,
 | 
			
		||||
        secret: json.secret,
 | 
			
		||||
        sequence: 1,
 | 
			
		||||
        hooks: [],
 | 
			
		||||
        isLoading: false,
 | 
			
		||||
        version: '2'
 | 
			
		||||
      });
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if (showToast) {
 | 
			
		||||
      toast.success("New account created", { id: toastId });
 | 
			
		||||
    }
 | 
			
		||||
    const currNames = state.accounts.map(acc => acc.name);
 | 
			
		||||
    state.accounts.push({
 | 
			
		||||
      name: name || names.filter(name => !currNames.includes(name))[0],
 | 
			
		||||
      xrp: (json.xrp || 0 * 1000000).toString(),
 | 
			
		||||
      address: json.address,
 | 
			
		||||
      secret: json.secret,
 | 
			
		||||
      sequence: 1,
 | 
			
		||||
      hooks: [],
 | 
			
		||||
      isLoading: false,
 | 
			
		||||
      version: '2'
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,25 +29,30 @@ export const compileCode = async (activeId: number) => {
 | 
			
		||||
  const file = state.files[activeId]
 | 
			
		||||
  try {
 | 
			
		||||
    file.containsErrors = false
 | 
			
		||||
    const res = await fetch(process.env.NEXT_PUBLIC_COMPILE_API_ENDPOINT, {
 | 
			
		||||
      method: "POST",
 | 
			
		||||
      headers: {
 | 
			
		||||
        "Content-Type": "application/json",
 | 
			
		||||
      },
 | 
			
		||||
      body: JSON.stringify({
 | 
			
		||||
        output: "wasm",
 | 
			
		||||
        compress: true,
 | 
			
		||||
        strip: state.compileOptions.strip,
 | 
			
		||||
        files: [
 | 
			
		||||
          {
 | 
			
		||||
            type: "c",
 | 
			
		||||
            options: state.compileOptions.optimizationLevel || '-O2',
 | 
			
		||||
            name: file.name,
 | 
			
		||||
            src: file.content,
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      }),
 | 
			
		||||
    });
 | 
			
		||||
    let res: Response
 | 
			
		||||
    try {
 | 
			
		||||
      res = await fetch(process.env.NEXT_PUBLIC_COMPILE_API_ENDPOINT, {
 | 
			
		||||
        method: "POST",
 | 
			
		||||
        headers: {
 | 
			
		||||
          "Content-Type": "application/json",
 | 
			
		||||
        },
 | 
			
		||||
        body: JSON.stringify({
 | 
			
		||||
          output: "wasm",
 | 
			
		||||
          compress: true,
 | 
			
		||||
          strip: state.compileOptions.strip,
 | 
			
		||||
          files: [
 | 
			
		||||
            {
 | 
			
		||||
              type: "c",
 | 
			
		||||
              options: state.compileOptions.optimizationLevel || '-O2',
 | 
			
		||||
              name: file.name,
 | 
			
		||||
              src: file.content,
 | 
			
		||||
            },
 | 
			
		||||
          ],
 | 
			
		||||
        }),
 | 
			
		||||
      });
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      throw Error("Something went wrong, check your network connection and try again!")
 | 
			
		||||
    }
 | 
			
		||||
    const json = await res.json();
 | 
			
		||||
    state.compiling = false;
 | 
			
		||||
    if (!json.success) {
 | 
			
		||||
@@ -61,29 +66,34 @@ export const compileCode = async (activeId: number) => {
 | 
			
		||||
      }
 | 
			
		||||
      throw errors
 | 
			
		||||
    }
 | 
			
		||||
    state.logs.push({
 | 
			
		||||
      type: "success",
 | 
			
		||||
      message: `File ${state.files?.[activeId]?.name} compiled successfully. Ready to deploy.`,
 | 
			
		||||
      link: Router.asPath.replace("develop", "deploy"),
 | 
			
		||||
      linkText: "Go to deploy",
 | 
			
		||||
    });
 | 
			
		||||
    // Decode base64 encoded wasm that is coming back from the endpoint
 | 
			
		||||
    const bufferData = await decodeBinary(json.output);
 | 
			
		||||
    file.compiledContent = ref(bufferData);
 | 
			
		||||
    file.lastCompiled = new Date();
 | 
			
		||||
    file.compiledValueSnapshot = file.content
 | 
			
		||||
    // Import wabt from and create human readable version of wasm file and
 | 
			
		||||
    // put it into state
 | 
			
		||||
    import("wabt").then((wabt) => {
 | 
			
		||||
      const ww = wabt.default();
 | 
			
		||||
    try {
 | 
			
		||||
      // Decode base64 encoded wasm that is coming back from the endpoint
 | 
			
		||||
      const bufferData = await decodeBinary(json.output);
 | 
			
		||||
 | 
			
		||||
      // Import wabt from and create human readable version of wasm file and
 | 
			
		||||
      // put it into state
 | 
			
		||||
      const ww = (await import('wabt')).default()
 | 
			
		||||
      const myModule = ww.readWasm(new Uint8Array(bufferData), {
 | 
			
		||||
        readDebugNames: true,
 | 
			
		||||
      });
 | 
			
		||||
      myModule.applyNames();
 | 
			
		||||
 | 
			
		||||
      const wast = myModule.toText({ foldExprs: false, inlineExport: false });
 | 
			
		||||
      state.files[state.active].compiledWatContent = wast;
 | 
			
		||||
      toast.success("Compiled successfully!", { position: "bottom-center" });
 | 
			
		||||
 | 
			
		||||
      file.compiledContent = ref(bufferData);
 | 
			
		||||
      file.lastCompiled = new Date();
 | 
			
		||||
      file.compiledValueSnapshot = file.content
 | 
			
		||||
      file.compiledWatContent = wast;
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      throw Error("Invalid compilation result produced, check your code for errors and try again!")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    toast.success("Compiled successfully!", { position: "bottom-center" });
 | 
			
		||||
    state.logs.push({
 | 
			
		||||
      type: "success",
 | 
			
		||||
      message: `File ${state.files?.[activeId]?.name} compiled successfully. Ready to deploy.`,
 | 
			
		||||
      link: Router.asPath.replace("develop", "deploy"),
 | 
			
		||||
      linkText: "Go to deploy",
 | 
			
		||||
    });
 | 
			
		||||
  } catch (err) {
 | 
			
		||||
    console.log(err);
 | 
			
		||||
@@ -96,12 +106,19 @@ export const compileCode = async (activeId: number) => {
 | 
			
		||||
        });
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
    else if (err instanceof Error) {
 | 
			
		||||
      state.logs.push({
 | 
			
		||||
        type: "error",
 | 
			
		||||
        message: err.message,
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      state.logs.push({
 | 
			
		||||
        type: "error",
 | 
			
		||||
        message: "Something went wrong, check your connection try again later!",
 | 
			
		||||
        message: "Something went wrong, come back later!",
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    state.compiling = false;
 | 
			
		||||
    toast.error(`Error occurred while compiling!`, { position: "bottom-center" });
 | 
			
		||||
    file.containsErrors = true
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								state/actions/deleteAccount.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								state/actions/deleteAccount.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
import state, { transactionsState } from '..';
 | 
			
		||||
 | 
			
		||||
export const deleteAccount = (addr?: string) => {
 | 
			
		||||
    if (!addr) return;
 | 
			
		||||
    const index = state.accounts.findIndex(acc => acc.address === addr);
 | 
			
		||||
    if (index === -1) return;
 | 
			
		||||
    state.accounts.splice(index, 1);
 | 
			
		||||
 | 
			
		||||
    // update selected accounts
 | 
			
		||||
    transactionsState.transactions
 | 
			
		||||
        .filter(t => t.state.selectedAccount?.value === addr)
 | 
			
		||||
        .forEach(t => {
 | 
			
		||||
            const acc = t.state.selectedAccount;
 | 
			
		||||
            if (!acc) return;
 | 
			
		||||
            acc.label = acc.value;
 | 
			
		||||
        });
 | 
			
		||||
    transactionsState.transactions
 | 
			
		||||
        .filter(t => t.state.selectedDestAccount?.value === addr)
 | 
			
		||||
        .forEach(t => {
 | 
			
		||||
            const acc = t.state.selectedDestAccount;
 | 
			
		||||
            if (!acc) return;
 | 
			
		||||
            acc.label = acc.value;
 | 
			
		||||
        });
 | 
			
		||||
};
 | 
			
		||||
@@ -3,10 +3,10 @@ import toast from "react-hot-toast";
 | 
			
		||||
 | 
			
		||||
import state, { IAccount } from "../index";
 | 
			
		||||
import calculateHookOn, { TTS } from "../../utils/hookOnCalculator";
 | 
			
		||||
import { SetHookData } from "../../components/SetHookDialog";
 | 
			
		||||
import { Link } from "../../components";
 | 
			
		||||
import { ref } from "valtio";
 | 
			
		||||
import estimateFee from "../../utils/estimateFee";
 | 
			
		||||
import { SetHookData } from '../../utils/setHook';
 | 
			
		||||
 | 
			
		||||
export const sha256 = async (string: string) => {
 | 
			
		||||
  const utf8 = new TextEncoder().encode(string);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,117 +1,92 @@
 | 
			
		||||
import { Octokit } from "@octokit/core";
 | 
			
		||||
import Router from "next/router";
 | 
			
		||||
import state from '../index';
 | 
			
		||||
import state, { IFile } from '../index';
 | 
			
		||||
import { templateFileIds } from '../constants';
 | 
			
		||||
 | 
			
		||||
const octokit = new Octokit();
 | 
			
		||||
 | 
			
		||||
/* Fetches Gist files from Githug Gists based on
 | 
			
		||||
 * gistId and stores the content in global state
 | 
			
		||||
/** 
 | 
			
		||||
 * Fetches files from Github Gists based on gistId and stores them in global state
 | 
			
		||||
 */
 | 
			
		||||
export const fetchFiles = (gistId: string) => {
 | 
			
		||||
export const fetchFiles = async (gistId: string) => {
 | 
			
		||||
  if (!gistId || state.files.length) return
 | 
			
		||||
 | 
			
		||||
  state.loading = true;
 | 
			
		||||
  if (gistId && !state.files.length) {
 | 
			
		||||
    state.logs.push({
 | 
			
		||||
      type: "log",
 | 
			
		||||
      message: `Fetching Gist with id: ${gistId}`,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    octokit
 | 
			
		||||
  state.logs.push({
 | 
			
		||||
    type: "log",
 | 
			
		||||
    message: `Fetching Gist with id: ${gistId}`,
 | 
			
		||||
  });
 | 
			
		||||
  try {
 | 
			
		||||
    const res = await octokit
 | 
			
		||||
      .request("GET /gists/{gist_id}", { gist_id: gistId })
 | 
			
		||||
      .then(async res => {
 | 
			
		||||
        if (!Object.values(templateFileIds).map(v => v.id).includes(gistId)) {
 | 
			
		||||
          return res
 | 
			
		||||
        }
 | 
			
		||||
        // in case of templates, fetch header file(s) and append to res
 | 
			
		||||
        try {
 | 
			
		||||
          const resHeader = await fetch(`${process.env.NEXT_PUBLIC_COMPILE_API_BASE_URL}/api/header-files`);
 | 
			
		||||
          if (resHeader.ok) {
 | 
			
		||||
            const resHeaderJson = await resHeader.json()
 | 
			
		||||
            const headerFiles: Record<string, { filename: string; content: string; language: string }> = {};
 | 
			
		||||
            Object.entries(resHeaderJson).forEach(([key, value]) => {
 | 
			
		||||
              const fname = `${key}.h`;
 | 
			
		||||
              headerFiles[fname] = { filename: fname, content: value as string, language: 'C' }
 | 
			
		||||
            })
 | 
			
		||||
            const files = {
 | 
			
		||||
              ...res.data.files,
 | 
			
		||||
              ...headerFiles
 | 
			
		||||
            };
 | 
			
		||||
            res.data.files = files;
 | 
			
		||||
          }
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
          console.log(err)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    const isTemplate = (id: string) => Object.values(templateFileIds).map(v => v.id).includes(id)
 | 
			
		||||
 | 
			
		||||
    if (isTemplate(gistId)) {
 | 
			
		||||
      // fetch headers
 | 
			
		||||
      const headerRes = await fetch(`${process.env.NEXT_PUBLIC_COMPILE_API_BASE_URL}/api/header-files`);
 | 
			
		||||
      if (!headerRes.ok) throw Error("Failed to fetch headers");;
 | 
			
		||||
 | 
			
		||||
        return res;
 | 
			
		||||
        // If you want to load templates from GIST instad, uncomment the code below and comment the code above.
 | 
			
		||||
        // return octokit.request("GET /gists/{gist_id}", { gist_id: templateFileIds.headers }).then(({ data: { files: headerFiles } }) => {
 | 
			
		||||
        //   const files = { ...res.data.files, ...headerFiles }
 | 
			
		||||
        //   console.log(headerFiles)
 | 
			
		||||
        //   res.data.files = files
 | 
			
		||||
        //   return res
 | 
			
		||||
        // })
 | 
			
		||||
      const headerJson = await headerRes.json()
 | 
			
		||||
      const headerFiles: Record<string, { filename: string; content: string; language: string }> = {};
 | 
			
		||||
      Object.entries(headerJson).forEach(([key, value]) => {
 | 
			
		||||
        const fname = `${key}.h`;
 | 
			
		||||
        headerFiles[fname] = { filename: fname, content: value as string, language: 'C' }
 | 
			
		||||
      })
 | 
			
		||||
      .then((res) => {
 | 
			
		||||
        if (res.data.files && Object.keys(res.data.files).length > 0) {
 | 
			
		||||
          const files = Object.keys(res.data.files).map((filename) => ({
 | 
			
		||||
            name: res.data.files?.[filename]?.filename || "untitled.c",
 | 
			
		||||
            language: res.data.files?.[filename]?.language?.toLowerCase() || "",
 | 
			
		||||
            content: res.data.files?.[filename]?.content || "",
 | 
			
		||||
          }));
 | 
			
		||||
          // Sort files so that the source files are first
 | 
			
		||||
          // In case of other files leave the order as it its
 | 
			
		||||
          files.sort((a, b) => {
 | 
			
		||||
            const aBasename = a.name.split('.')?.[0];
 | 
			
		||||
            const aCext = a.name?.toLowerCase().endsWith('.c');
 | 
			
		||||
            const bBasename = b.name.split('.')?.[0];
 | 
			
		||||
            const bCext = b.name?.toLowerCase().endsWith('.c');
 | 
			
		||||
            // If a has c extension and b doesn't move a up
 | 
			
		||||
            if (aCext && !bCext) {
 | 
			
		||||
              return -1;
 | 
			
		||||
            }
 | 
			
		||||
            if (!aCext && bCext) {
 | 
			
		||||
              return 1
 | 
			
		||||
            }
 | 
			
		||||
            // Otherwise fallback to default sorting based on basename
 | 
			
		||||
            if (aBasename > bBasename) {
 | 
			
		||||
              return 1;
 | 
			
		||||
            }
 | 
			
		||||
            if (bBasename > aBasename) {
 | 
			
		||||
              return -1;
 | 
			
		||||
            }
 | 
			
		||||
            return 0;
 | 
			
		||||
          })
 | 
			
		||||
          state.loading = false;
 | 
			
		||||
          if (files.length > 0) {
 | 
			
		||||
            state.logs.push({
 | 
			
		||||
              type: "success",
 | 
			
		||||
              message: "Fetched successfully ✅",
 | 
			
		||||
            });
 | 
			
		||||
            state.files = files;
 | 
			
		||||
            state.gistId = gistId;
 | 
			
		||||
            state.gistName = Object.keys(res.data.files)?.[0] || "untitled";
 | 
			
		||||
            state.gistOwner = res.data.owner?.login;
 | 
			
		||||
            return;
 | 
			
		||||
          } else {
 | 
			
		||||
            // Open main modal if now files
 | 
			
		||||
            state.mainModalOpen = true;
 | 
			
		||||
          }
 | 
			
		||||
          return Router.push({ pathname: "/develop" });
 | 
			
		||||
        }
 | 
			
		||||
        state.loading = false;
 | 
			
		||||
      })
 | 
			
		||||
      .catch((err) => {
 | 
			
		||||
        // console.error(err)
 | 
			
		||||
        state.loading = false;
 | 
			
		||||
        state.logs.push({
 | 
			
		||||
          type: "error",
 | 
			
		||||
          message: `Couldn't find Gist with id: ${gistId}`,
 | 
			
		||||
        });
 | 
			
		||||
        return;
 | 
			
		||||
      });
 | 
			
		||||
    return;
 | 
			
		||||
      const files = {
 | 
			
		||||
        ...res.data.files,
 | 
			
		||||
        ...headerFiles
 | 
			
		||||
      };
 | 
			
		||||
      res.data.files = files;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!res.data.files) throw Error("No files could be fetched from given gist id!")
 | 
			
		||||
 | 
			
		||||
    const files: IFile[] = Object.keys(res.data.files).map((filename) => ({
 | 
			
		||||
      name: res.data.files?.[filename]?.filename || "untitled.c",
 | 
			
		||||
      language: res.data.files?.[filename]?.language?.toLowerCase() || "",
 | 
			
		||||
      content: res.data.files?.[filename]?.content || "",
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    files.sort((a, b) => {
 | 
			
		||||
      const aBasename = a.name.split('.')?.[0];
 | 
			
		||||
      const aExt = a.name.split('.').pop() || '';
 | 
			
		||||
      const bBasename = b.name.split('.')?.[0];
 | 
			
		||||
      const bExt = b.name.split('.').pop() || '';
 | 
			
		||||
 | 
			
		||||
      // default priority is undefined == 0
 | 
			
		||||
      const extPriority: Record<string, number> = {
 | 
			
		||||
        c: 3,
 | 
			
		||||
        md: 2,
 | 
			
		||||
        h: -1
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Sort based on extention priorities
 | 
			
		||||
      const comp = (extPriority[bExt] || 0) - (extPriority[aExt] || 0)
 | 
			
		||||
      if (comp !== 0) return comp
 | 
			
		||||
  
 | 
			
		||||
      // Otherwise fallback to alphabetical sorting
 | 
			
		||||
      return aBasename.localeCompare(bBasename)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    state.logs.push({
 | 
			
		||||
      type: "success",
 | 
			
		||||
      message: "Fetched successfully ✅",
 | 
			
		||||
    });
 | 
			
		||||
    state.files = files;
 | 
			
		||||
    state.gistId = gistId;
 | 
			
		||||
    state.gistOwner = res.data.owner?.login;
 | 
			
		||||
 | 
			
		||||
    const gistName = files.find(file => file.language === 'c' || file.language === 'javascript')?.name || "untitled";
 | 
			
		||||
    state.gistName = gistName
 | 
			
		||||
  } catch (err) {
 | 
			
		||||
    console.error(err)
 | 
			
		||||
    let message: string
 | 
			
		||||
    if (err instanceof Error) message = err.message
 | 
			
		||||
    else message = `Something went wrong, try again later!`
 | 
			
		||||
    state.logs.push({
 | 
			
		||||
      type: "error",
 | 
			
		||||
      message: `Error: ${message}`,
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  state.loading = false;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ import Starter from "../../components/icons/Starter";
 | 
			
		||||
 | 
			
		||||
export const templateFileIds = {
 | 
			
		||||
    'starter': {
 | 
			
		||||
        id: '9106f1fe60482d90475bfe8f1315affe',
 | 
			
		||||
        id: '1f8109c80f504e6326db2735df2f0ad6', // Forked
 | 
			
		||||
        name: 'Starter',
 | 
			
		||||
        description: 'Just a basic starter with essential imports, just accepts any transaction coming through',
 | 
			
		||||
        icon: Starter
 | 
			
		||||
@@ -25,7 +25,7 @@ export const templateFileIds = {
 | 
			
		||||
        icon: Notary
 | 
			
		||||
    },
 | 
			
		||||
    'carbon': {
 | 
			
		||||
        id: '5941c19dce3e147948f564e224553c02',
 | 
			
		||||
        id: '953662b22d065449f8ab6f69bc2afe41',  // Forked
 | 
			
		||||
        name: 'Carbon',
 | 
			
		||||
        description: 'Send a percentage of sum to an address',
 | 
			
		||||
        icon: Carbon
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										78
									
								
								utils/setHook.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								utils/setHook.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
			
		||||
import { getTags } from './comment-parser';
 | 
			
		||||
import { tts, TTS } from './hookOnCalculator';
 | 
			
		||||
 | 
			
		||||
export const transactionOptions = Object.keys(tts).map(key => ({
 | 
			
		||||
    label: key,
 | 
			
		||||
    value: key as keyof TTS,
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
export type SetHookData = {
 | 
			
		||||
    Invoke: {
 | 
			
		||||
        value: keyof TTS;
 | 
			
		||||
        label: string;
 | 
			
		||||
    }[];
 | 
			
		||||
    Fee: string;
 | 
			
		||||
    HookNamespace: string;
 | 
			
		||||
    HookParameters: {
 | 
			
		||||
        HookParameter: {
 | 
			
		||||
            HookParameterName: string;
 | 
			
		||||
            HookParameterValue: string;
 | 
			
		||||
        };
 | 
			
		||||
        $metaData?: any;
 | 
			
		||||
    }[];
 | 
			
		||||
    // HookGrants: {
 | 
			
		||||
    //   HookGrant: {
 | 
			
		||||
    //     Authorize: string;
 | 
			
		||||
    //     HookHash: string;
 | 
			
		||||
    //   };
 | 
			
		||||
    // }[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const getParameters = (content?: string) => {
 | 
			
		||||
    const fieldTags = ["field", "param", "arg", "argument"];
 | 
			
		||||
    const tags = getTags(content)
 | 
			
		||||
        .filter(tag => fieldTags.includes(tag.tag))
 | 
			
		||||
        .filter(tag => !!tag.name);
 | 
			
		||||
 | 
			
		||||
    const paramters: SetHookData["HookParameters"] = tags.map(tag => ({
 | 
			
		||||
        HookParameter: {
 | 
			
		||||
            HookParameterName: tag.name,
 | 
			
		||||
            HookParameterValue: tag.default || "",
 | 
			
		||||
        },
 | 
			
		||||
        $metaData: {
 | 
			
		||||
            description: tag.description,
 | 
			
		||||
            required: !tag.optional
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    return paramters;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getInvokeOptions = (content?: string) => {
 | 
			
		||||
    const invokeTags = ["invoke", "invoke-on"];
 | 
			
		||||
 | 
			
		||||
    const options = getTags(content)
 | 
			
		||||
        .filter(tag => invokeTags.includes(tag.tag))
 | 
			
		||||
        .reduce((cumm, curr) => {
 | 
			
		||||
            const combined = curr.type || `${curr.name} ${curr.description}`
 | 
			
		||||
            const opts = combined.split(' ')
 | 
			
		||||
 | 
			
		||||
            return cumm.concat(opts as any)
 | 
			
		||||
        }, [] as (keyof TTS)[])
 | 
			
		||||
        .filter(opt => Object.keys(tts).includes(opt))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    const invokeOptions: SetHookData['Invoke'] = options.map(opt => ({
 | 
			
		||||
        label: opt,
 | 
			
		||||
        value: opt
 | 
			
		||||
    }))
 | 
			
		||||
 | 
			
		||||
    // default
 | 
			
		||||
    if (!invokeOptions.length) {
 | 
			
		||||
        const payment = transactionOptions.find(tx => tx.value === "ttPAYMENT")
 | 
			
		||||
        if (payment) return [payment]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return invokeOptions;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										542
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										542
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -951,6 +951,13 @@
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.0.tgz"
 | 
			
		||||
  integrity sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==
 | 
			
		||||
 | 
			
		||||
"@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/dinero.js@^1.9.0":
 | 
			
		||||
  version "1.9.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/dinero.js/-/dinero.js-1.9.0.tgz"
 | 
			
		||||
@@ -961,6 +968,13 @@
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz"
 | 
			
		||||
  integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==
 | 
			
		||||
 | 
			
		||||
"@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.9"
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz"
 | 
			
		||||
@@ -1002,6 +1016,23 @@
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz"
 | 
			
		||||
  integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==
 | 
			
		||||
 | 
			
		||||
"@types/mdast@^3.0.0":
 | 
			
		||||
  version "3.0.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af"
 | 
			
		||||
  integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==
 | 
			
		||||
  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@*":
 | 
			
		||||
  version "17.0.21"
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz"
 | 
			
		||||
@@ -1032,6 +1063,11 @@
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz"
 | 
			
		||||
  integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
 | 
			
		||||
 | 
			
		||||
"@types/prop-types@^15.0.0":
 | 
			
		||||
  version "15.7.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
 | 
			
		||||
  integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
 | 
			
		||||
 | 
			
		||||
"@types/react-transition-group@^4.4.0":
 | 
			
		||||
  version "4.4.4"
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz"
 | 
			
		||||
@@ -1062,6 +1098,11 @@
 | 
			
		||||
  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/ws@^7.2.0":
 | 
			
		||||
  version "7.4.7"
 | 
			
		||||
  resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz"
 | 
			
		||||
@@ -1292,6 +1333,11 @@ babel-plugin-macros@^2.6.1:
 | 
			
		||||
    cosmiconfig "^6.0.0"
 | 
			
		||||
    resolve "^1.12.0"
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
@@ -1487,6 +1533,11 @@ chalk@^4.0.0:
 | 
			
		||||
    ansi-styles "^4.1.0"
 | 
			
		||||
    supports-color "^7.1.0"
 | 
			
		||||
 | 
			
		||||
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==
 | 
			
		||||
 | 
			
		||||
ci-info@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz"
 | 
			
		||||
@@ -1529,6 +1580,11 @@ 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@^2.0.0:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98"
 | 
			
		||||
  integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==
 | 
			
		||||
 | 
			
		||||
comment-parser@^1.3.1:
 | 
			
		||||
  version "1.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b"
 | 
			
		||||
@@ -1654,11 +1710,25 @@ debug@^3.2.7:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ms "^2.1.1"
 | 
			
		||||
 | 
			
		||||
debug@^4.0.0:
 | 
			
		||||
  version "4.3.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
 | 
			
		||||
  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ms "2.1.2"
 | 
			
		||||
 | 
			
		||||
decimal.js@^10.2.0:
 | 
			
		||||
  version "10.3.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz"
 | 
			
		||||
  integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
 | 
			
		||||
deep-is@^0.1.3:
 | 
			
		||||
  version "0.1.4"
 | 
			
		||||
  resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
 | 
			
		||||
@@ -1676,11 +1746,21 @@ deprecation@^2.0.0, deprecation@^2.3.1:
 | 
			
		||||
  resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz"
 | 
			
		||||
  integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
 | 
			
		||||
 | 
			
		||||
dequal@^2.0.0:
 | 
			
		||||
  version "2.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
 | 
			
		||||
  integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
 | 
			
		||||
 | 
			
		||||
detect-node-es@^1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"
 | 
			
		||||
  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==
 | 
			
		||||
 | 
			
		||||
dinero.js@^1.9.1:
 | 
			
		||||
  version "1.9.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/dinero.js/-/dinero.js-1.9.1.tgz"
 | 
			
		||||
@@ -2065,6 +2145,11 @@ ext@^1.1.2:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    type "^2.5.0"
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
@@ -2336,6 +2421,11 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
 | 
			
		||||
    inherits "^2.0.3"
 | 
			
		||||
    minimalistic-assert "^1.0.1"
 | 
			
		||||
 | 
			
		||||
hast-util-whitespace@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c"
 | 
			
		||||
  integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==
 | 
			
		||||
 | 
			
		||||
hmac-drbg@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
 | 
			
		||||
@@ -2416,6 +2506,11 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
 | 
			
		||||
  resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
 | 
			
		||||
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 | 
			
		||||
 | 
			
		||||
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:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz"
 | 
			
		||||
@@ -2460,6 +2555,11 @@ 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.4, is-callable@^1.2.4:
 | 
			
		||||
  version "1.2.4"
 | 
			
		||||
  resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz"
 | 
			
		||||
@@ -2540,6 +2640,11 @@ is-number@^7.0.0:
 | 
			
		||||
  resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
 | 
			
		||||
  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
 | 
			
		||||
 | 
			
		||||
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@^5.0.0:
 | 
			
		||||
  version "5.0.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz"
 | 
			
		||||
@@ -2741,6 +2846,11 @@ klaw-sync@^6.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    graceful-fs "^4.1.11"
 | 
			
		||||
 | 
			
		||||
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.21"
 | 
			
		||||
  resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz"
 | 
			
		||||
@@ -2873,6 +2983,60 @@ md5.js@^1.3.4:
 | 
			
		||||
    inherits "^2.0.1"
 | 
			
		||||
    safe-buffer "^5.1.2"
 | 
			
		||||
 | 
			
		||||
mdast-util-definitions@^5.0.0:
 | 
			
		||||
  version "5.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db"
 | 
			
		||||
  integrity sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/mdast" "^3.0.0"
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
    unist-util-visit "^4.0.0"
 | 
			
		||||
 | 
			
		||||
mdast-util-from-markdown@^1.0.0:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268"
 | 
			
		||||
  integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==
 | 
			
		||||
  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-to-hast@^12.1.0:
 | 
			
		||||
  version "12.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.0.tgz#4dbff7ab2b20b8d12fc8fe98bf804d97e7358cbf"
 | 
			
		||||
  integrity sha512-YDwT5KhGzLgPpSnQhAlK1+WpCW4gsPmNNAxUNMkMTDhxQyPp2eX86WOelnKnLKEvSpfxqJbPbInHFkefXZBhEA==
 | 
			
		||||
  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"
 | 
			
		||||
    micromark-util-sanitize-uri "^1.0.0"
 | 
			
		||||
    trim-lines "^3.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-string@^3.1.0:
 | 
			
		||||
  version "3.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9"
 | 
			
		||||
  integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==
 | 
			
		||||
 | 
			
		||||
mdurl@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
 | 
			
		||||
  integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==
 | 
			
		||||
 | 
			
		||||
memoize-one@^5.0.0:
 | 
			
		||||
  version "5.2.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz"
 | 
			
		||||
@@ -2888,6 +3052,201 @@ merge2@^1.3.0, merge2@^1.4.1:
 | 
			
		||||
  resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
 | 
			
		||||
  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
 | 
			
		||||
 | 
			
		||||
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-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"
 | 
			
		||||
 | 
			
		||||
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.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2"
 | 
			
		||||
  integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==
 | 
			
		||||
  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.0.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.10.tgz#1eac156f0399d42736458a14b0ca2d86190b457c"
 | 
			
		||||
  integrity sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==
 | 
			
		||||
  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.2, micromatch@^4.0.4:
 | 
			
		||||
  version "4.0.4"
 | 
			
		||||
  resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz"
 | 
			
		||||
@@ -2923,6 +3282,11 @@ monaco-editor@^0.33.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.33.0.tgz#842e244f3750a2482f8a29c676b5684e75ff34af"
 | 
			
		||||
  integrity sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==
 | 
			
		||||
 | 
			
		||||
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.npmjs.org/ms/-/ms-2.0.0.tgz"
 | 
			
		||||
@@ -2953,10 +3317,10 @@ natural-compare@^1.4.0:
 | 
			
		||||
  resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
 | 
			
		||||
  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 | 
			
		||||
 | 
			
		||||
next-auth@^4.10.1:
 | 
			
		||||
  version "4.10.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.10.1.tgz#33b29265d12287bb2f6d267c8d415a407c27f0e9"
 | 
			
		||||
  integrity sha512-F00vtwBdyMIIJ8IORHOAOHjVGTDEhhm9+HpB2BQ8r40WtGxqToWWLN7Z+2ZW/z2RFlo3zhcuAtUCPUzVJxtZwQ==
 | 
			
		||||
next-auth@^4.10.3:
 | 
			
		||||
  version "4.10.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.10.3.tgz#0a952dd5004fd2ac2ba414c990922cf9b33951a3"
 | 
			
		||||
  integrity sha512-7zc4aXYc/EEln7Pkcsn21V1IevaTZsMLJwapfbnKA4+JY0+jFzWbt5p/ljugesGIrN4VOZhpZIw50EaFZyghJQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@babel/runtime" "^7.16.3"
 | 
			
		||||
    "@panva/hkdf" "^1.0.1"
 | 
			
		||||
@@ -3339,7 +3703,7 @@ progress@^2.0.0:
 | 
			
		||||
  resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
 | 
			
		||||
  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 | 
			
		||||
 | 
			
		||||
prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
 | 
			
		||||
prop-types@^15.0.0, prop-types@^15.5.7, prop-types@^15.6.0, 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==
 | 
			
		||||
@@ -3348,6 +3712,11 @@ prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2,
 | 
			
		||||
    object-assign "^4.1.1"
 | 
			
		||||
    react-is "^16.13.1"
 | 
			
		||||
 | 
			
		||||
property-information@^6.0.0:
 | 
			
		||||
  version "6.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22"
 | 
			
		||||
  integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==
 | 
			
		||||
 | 
			
		||||
proxy-compare@2.0.3:
 | 
			
		||||
  version "2.0.3"
 | 
			
		||||
  resolved "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.0.3.tgz"
 | 
			
		||||
@@ -3426,6 +3795,32 @@ react-is@^16.13.1, react-is@^16.7.0:
 | 
			
		||||
  resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
 | 
			
		||||
  integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
 | 
			
		||||
 | 
			
		||||
react-is@^18.0.0:
 | 
			
		||||
  version "18.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
 | 
			
		||||
  integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
 | 
			
		||||
 | 
			
		||||
react-markdown@^8.0.3:
 | 
			
		||||
  version "8.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.3.tgz#e8aba0d2f5a1b2124d476ee1fff9448a2f57e4b3"
 | 
			
		||||
  integrity sha512-We36SfqaKoVNpN1QqsZwWSv/OZt5J15LNgTLWynwAN5b265hrQrsjMtlRNwUvS+YyR3yDM8HpTNc4pK9H/Gc0A==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/hast" "^2.0.0"
 | 
			
		||||
    "@types/prop-types" "^15.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 "^18.0.0"
 | 
			
		||||
    remark-parse "^10.0.0"
 | 
			
		||||
    remark-rehype "^10.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-new-window@^0.2.1:
 | 
			
		||||
  version "0.2.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/react-new-window/-/react-new-window-0.2.1.tgz"
 | 
			
		||||
@@ -3572,6 +3967,25 @@ relative-time-format@^1.0.7:
 | 
			
		||||
  resolved "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.0.7.tgz"
 | 
			
		||||
  integrity sha512-BoLPaoL5y94ngPI4iJ9mNHqRS8NA+Hjs6oYHL5UYkbnA7/iTlvJiMoQQt8txhHhc+Y3e6yXWhwTAKvsQhnx2yg==
 | 
			
		||||
 | 
			
		||||
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@^10.0.0:
 | 
			
		||||
  version "10.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279"
 | 
			
		||||
  integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/hast" "^2.0.0"
 | 
			
		||||
    "@types/mdast" "^3.0.0"
 | 
			
		||||
    mdast-util-to-hast "^12.1.0"
 | 
			
		||||
    unified "^10.0.0"
 | 
			
		||||
 | 
			
		||||
require-from-string@^2.0.2:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
 | 
			
		||||
@@ -3738,6 +4152,13 @@ run-parallel@^1.1.9:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    queue-microtask "^1.2.2"
 | 
			
		||||
 | 
			
		||||
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.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
 | 
			
		||||
  version "5.2.1"
 | 
			
		||||
  resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
 | 
			
		||||
@@ -3857,6 +4278,11 @@ source-map@^0.5.7:
 | 
			
		||||
  resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
 | 
			
		||||
  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 | 
			
		||||
 | 
			
		||||
space-separated-tokens@^2.0.0:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b"
 | 
			
		||||
  integrity sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==
 | 
			
		||||
 | 
			
		||||
split.js@^1.6.0:
 | 
			
		||||
  version "1.6.5"
 | 
			
		||||
  resolved "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz"
 | 
			
		||||
@@ -3942,6 +4368,13 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
 | 
			
		||||
  resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
 | 
			
		||||
  integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
 | 
			
		||||
 | 
			
		||||
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-jsx@5.0.0:
 | 
			
		||||
  version "5.0.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz"
 | 
			
		||||
@@ -4027,6 +4460,16 @@ tr46@~0.0.3:
 | 
			
		||||
  resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
 | 
			
		||||
  integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
 | 
			
		||||
 | 
			
		||||
trim-lines@^3.0.0:
 | 
			
		||||
  version "3.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338"
 | 
			
		||||
  integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==
 | 
			
		||||
 | 
			
		||||
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.12.0, tsconfig-paths@^3.9.0:
 | 
			
		||||
  version "3.13.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz"
 | 
			
		||||
@@ -4098,6 +4541,67 @@ unbox-primitive@^1.0.1:
 | 
			
		||||
    has-symbols "^1.0.2"
 | 
			
		||||
    which-boxed-primitive "^1.0.2"
 | 
			
		||||
 | 
			
		||||
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.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04"
 | 
			
		||||
  integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
 | 
			
		||||
unist-util-generated@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113"
 | 
			
		||||
  integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==
 | 
			
		||||
 | 
			
		||||
unist-util-is@^5.0.0:
 | 
			
		||||
  version "5.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236"
 | 
			
		||||
  integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==
 | 
			
		||||
 | 
			
		||||
unist-util-position@^4.0.0:
 | 
			
		||||
  version "4.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07"
 | 
			
		||||
  integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
 | 
			
		||||
unist-util-stringify-position@^3.0.0:
 | 
			
		||||
  version "3.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447"
 | 
			
		||||
  integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
 | 
			
		||||
unist-util-visit-parents@^5.0.0:
 | 
			
		||||
  version "5.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521"
 | 
			
		||||
  integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
    unist-util-is "^5.0.0"
 | 
			
		||||
 | 
			
		||||
unist-util-visit@^4.0.0:
 | 
			
		||||
  version "4.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5"
 | 
			
		||||
  integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
    unist-util-is "^5.0.0"
 | 
			
		||||
    unist-util-visit-parents "^5.0.0"
 | 
			
		||||
 | 
			
		||||
universal-github-app-jwt@^1.0.1:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.1.0.tgz"
 | 
			
		||||
@@ -4172,6 +4676,16 @@ uuid@^8.3.2:
 | 
			
		||||
  resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
 | 
			
		||||
  integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
 | 
			
		||||
v8-compile-cache@^2.0.3:
 | 
			
		||||
  version "2.3.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz"
 | 
			
		||||
@@ -4184,6 +4698,24 @@ valtio@^1.2.5:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    proxy-compare "2.0.3"
 | 
			
		||||
 | 
			
		||||
vfile-message@^3.0.0:
 | 
			
		||||
  version "3.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d"
 | 
			
		||||
  integrity sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
    unist-util-stringify-position "^3.0.0"
 | 
			
		||||
 | 
			
		||||
vfile@^5.0.0:
 | 
			
		||||
  version "5.3.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.4.tgz#bbb8c96b956693bbf70b2c67fdb5781dff769b93"
 | 
			
		||||
  integrity sha512-KI+7cnst03KbEyN1+JE504zF5bJBZa+J+CrevLeyIMq0aPU681I2rQ5p4PlnQ6exFtWiUrg26QUdFMnAKR6PIw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/unist" "^2.0.0"
 | 
			
		||||
    is-buffer "^2.0.0"
 | 
			
		||||
    unist-util-stringify-position "^3.0.0"
 | 
			
		||||
    vfile-message "^3.0.0"
 | 
			
		||||
 | 
			
		||||
vscode-jsonrpc@6.0.0, vscode-jsonrpc@^6.0.0:
 | 
			
		||||
  version "6.0.0"
 | 
			
		||||
  resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user