From df103f9870870683901dbd2bc57c48fdd8f7f853 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 08:33:06 +0100 Subject: [PATCH 01/71] add git components --- libs/remix-ui/git/src/components/gitui.tsx | 189 ++++++ .../components/navigation/branchedetails.tsx | 52 ++ .../src/components/navigation/branches.tsx | 30 + .../git/src/components/navigation/clone.tsx | 27 + .../src/components/navigation/commands.tsx | 50 ++ .../components/navigation/commitdetails.tsx | 27 + .../git/src/components/navigation/commits.tsx | 49 ++ .../git/src/components/navigation/github.tsx | 29 + .../navigation/menu/sourcecontrolmenu.tsx | 49 ++ .../git/src/components/navigation/remotes.tsx | 30 + .../components/navigation/remotesdetails.tsx | 44 ++ .../src/components/navigation/settings.tsx | 43 ++ .../components/navigation/sourcecontrol.tsx | 54 ++ .../navigation/sourcecontrolgroup.tsx | 55 ++ .../git/src/components/panels/branches.tsx | 57 ++ .../panels/branches/branchedetails.tsx | 61 ++ .../git/src/components/panels/clone.tsx | 100 +++ .../git/src/components/panels/commands.tsx | 16 + .../src/components/panels/commands/fetch.tsx | 15 + .../src/components/panels/commands/merge.tsx | 67 ++ .../components/panels/commands/pushpull.tsx | 146 +++++ .../src/components/panels/commitmessage.tsx | 54 ++ .../git/src/components/panels/commits.tsx | 50 ++ .../panels/commits/commitdetails.tsx | 40 ++ .../panels/commits/commitdetailsitem.tsx | 47 ++ .../panels/commits/commitsummary.tsx | 53 ++ .../git/src/components/panels/github.tsx | 143 ++++ .../components/panels/githubcredentials.tsx | 55 ++ .../git/src/components/panels/remotes.tsx | 58 ++ .../src/components/panels/remoteselect.tsx | 47 ++ .../src/components/panels/remotesimport.tsx | 100 +++ .../src/components/panels/repositories.tsx | 131 ++++ .../git/src/components/panels/settings.tsx | 52 ++ .../sourcecontrol/sourcecontrolgroup.tsx | 38 ++ .../sourcecontrol/sourcecontrolitem.tsx | 67 ++ .../sourcecontrol/sourcontrolitembuttons.tsx | 44 ++ .../git/src/components/panels/sourcontrol.tsx | 58 ++ .../git/src/hooks/useLocalStorage.tsx | 37 ++ libs/remix-ui/git/src/index.ts | 4 + libs/remix-ui/git/src/lib/fileHelpers.ts | 59 ++ libs/remix-ui/git/src/lib/gitactions.ts | 619 ++++++++++++++++++ libs/remix-ui/git/src/lib/listeners.ts | 192 ++++++ libs/remix-ui/git/src/lib/pluginActions.ts | 104 +++ libs/remix-ui/git/src/state/context.tsx | 39 ++ libs/remix-ui/git/src/state/gitpayload.ts | 130 ++++ libs/remix-ui/git/src/state/gitreducer.tsx | 147 +++++ libs/remix-ui/git/src/state/loaderReducer.ts | 11 + libs/remix-ui/git/src/style/index.css | 36 + libs/remix-ui/git/src/types/index.ts | 214 ++++++ libs/remix-ui/git/src/types/styles.ts | 53 ++ libs/remix-ui/git/src/utils/index.ts | 3 + 51 files changed, 3875 insertions(+) create mode 100644 libs/remix-ui/git/src/components/gitui.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/branchedetails.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/branches.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/clone.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/commands.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/commitdetails.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/commits.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/github.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/menu/sourcecontrolmenu.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/remotes.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/remotesdetails.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/settings.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx create mode 100644 libs/remix-ui/git/src/components/navigation/sourcecontrolgroup.tsx create mode 100644 libs/remix-ui/git/src/components/panels/branches.tsx create mode 100644 libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx create mode 100644 libs/remix-ui/git/src/components/panels/clone.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commands.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commands/fetch.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commands/merge.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commands/pushpull.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commitmessage.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commits.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commits/commitdetailsitem.tsx create mode 100644 libs/remix-ui/git/src/components/panels/commits/commitsummary.tsx create mode 100644 libs/remix-ui/git/src/components/panels/github.tsx create mode 100644 libs/remix-ui/git/src/components/panels/githubcredentials.tsx create mode 100644 libs/remix-ui/git/src/components/panels/remotes.tsx create mode 100644 libs/remix-ui/git/src/components/panels/remoteselect.tsx create mode 100644 libs/remix-ui/git/src/components/panels/remotesimport.tsx create mode 100644 libs/remix-ui/git/src/components/panels/repositories.tsx create mode 100644 libs/remix-ui/git/src/components/panels/settings.tsx create mode 100644 libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolgroup.tsx create mode 100644 libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolitem.tsx create mode 100644 libs/remix-ui/git/src/components/panels/sourcecontrol/sourcontrolitembuttons.tsx create mode 100644 libs/remix-ui/git/src/components/panels/sourcontrol.tsx create mode 100644 libs/remix-ui/git/src/hooks/useLocalStorage.tsx create mode 100644 libs/remix-ui/git/src/index.ts create mode 100644 libs/remix-ui/git/src/lib/fileHelpers.ts create mode 100644 libs/remix-ui/git/src/lib/gitactions.ts create mode 100644 libs/remix-ui/git/src/lib/listeners.ts create mode 100644 libs/remix-ui/git/src/lib/pluginActions.ts create mode 100644 libs/remix-ui/git/src/state/context.tsx create mode 100644 libs/remix-ui/git/src/state/gitpayload.ts create mode 100644 libs/remix-ui/git/src/state/gitreducer.tsx create mode 100644 libs/remix-ui/git/src/state/loaderReducer.ts create mode 100644 libs/remix-ui/git/src/style/index.css create mode 100644 libs/remix-ui/git/src/types/index.ts create mode 100644 libs/remix-ui/git/src/types/styles.ts create mode 100644 libs/remix-ui/git/src/utils/index.ts diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx new file mode 100644 index 0000000000..32cfe7c321 --- /dev/null +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -0,0 +1,189 @@ +import React, { useEffect, useReducer, useState } from 'react' +import { add, addall, checkout, checkoutfile, clone, commit, createBranch, remoteBranches, repositories, rm, getCommitChanges, diff, resolveRef, getBranchCommits, setUpstreamRemote, getGitHubUser, getBranches, getRemotes, remoteCommits } from '../lib/gitactions' +import { loadFiles, setCallBacks } from '../lib/listeners' +import { openDiff, openFile, saveToken, setModifiedDecorator, setPlugin, setUntrackedDecorator, statusChanged } from '../lib/pluginActions' +import { gitActionsContext, pluginActionsContext } from '../state/context' +import { gitReducer } from '../state/gitreducer' +import { defaultGitState, defaultLoaderState, gitState, loaderState } from '../types' +import { SourceControl } from './panels/sourcontrol' +import { Accordion } from "react-bootstrap"; +import { CommitMessage } from './panels/commitmessage' +import { Commits } from './panels/commits' +import { Branches } from './panels/branches' +import { SourceControlNavigation } from './navigation/sourcecontrol' +import { BranchesNavigation } from './navigation/branches' +import { CommitslNavigation } from './navigation/commits' +import '../style/index.css' +import { CloneNavigation } from './navigation/clone' +import { Clone } from './panels/clone' +import { Commands } from './panels/commands' +import { CommandsNavigation } from './navigation/commands' +import { RemotesNavigation } from './navigation/remotes' +import { Remotes } from './panels/remotes' +import { ViewPlugin } from '@remixproject/engine-web' +import { SettingsNavigation } from './navigation/settings' +import { Settings } from './panels/settings' +import { GitHubNavigation } from './navigation/github' +import { GitHubAuth } from './panels/github' +import { GitHubCredentials } from './panels/githubcredentials' +import { loaderReducer } from '../state/loaderReducer' + +export const gitPluginContext = React.createContext(defaultGitState) +export const loaderContext = React.createContext(defaultLoaderState) + +interface IGitUi { + plugin: ViewPlugin +} + +export const GitUI = (props: IGitUi) => { + const plugin = props.plugin + const [gitState, gitDispatch] = useReducer(gitReducer, defaultGitState) + const [loaderState, loaderDispatch] = useReducer(loaderReducer, defaultLoaderState) + const [activePanel, setActivePanel] = useState("0"); + const [timeOut, setTimeOut] = useState(null) + + useEffect(() => { + setCallBacks(plugin, gitDispatch, loaderDispatch) + setPlugin(plugin, gitDispatch, loaderDispatch) + console.log(props) + }, []) + + useEffect(() => { + + + async function setDecorators(gitState: gitState) { + await plugin.call('fileDecorator', 'clearFileDecorators') + await setModifiedDecorator(gitState.modified) + await setUntrackedDecorator(gitState.untracked) + } + + console.log('gitState.fileStatusResult', gitState.fileStatusResult) + + setTimeout(() => { + setDecorators(gitState) + }) + + + }, [gitState.fileStatusResult]) + + useEffect(() => { + + + async function updatestate(){ + console.log('updatestate', gitState) + if(gitState.currentBranch.remote.url){ + remoteCommits(gitState.currentBranch.remote.url, gitState.currentBranch.name, 1) + } + } + setTimeout(() => { + updatestate() + }) + + }, [gitState.gitHubUser, gitState.currentBranch, gitState.remotes]) + + + const gitActionsProviderValue = { + commit, + addall, + add, + checkoutfile, + rm, + checkout, + createBranch, + clone, + repositories, + remoteBranches, + getCommitChanges, + getBranchCommits, + diff, + resolveRef, + setUpstreamRemote, + getGitHubUser, + getBranches, + getRemotes + } + + const pluginActionsProviderValue = { + statusChanged, + loadFiles, + openFile, + openDiff, + saveToken + } + + return ( +
+ + + + + {gitState.loading &&
} + {!gitState.loading && + + + + + <> + + + + +
+ + + <> + + + +
+ + + <> + + + +
+ + + <> + + +
+ + + <> + + +
+ + + <> + + + +
+ + + <> + + + +
+ + + <> + + + + + + + +
} +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/branchedetails.tsx b/libs/remix-ui/git/src/components/navigation/branchedetails.tsx new file mode 100644 index 0000000000..1b0f39c0c0 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/branchedetails.tsx @@ -0,0 +1,52 @@ +import { faCaretUp, faCaretDown, faCaretRight, faArrowUp, faArrowDown, faArrowRotateRight, faArrowsUpDown, faGlobe, faCheckCircle, faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useContext, useEffect } from "react"; +import { branch } from "../../types"; +import { gitPluginContext } from "../gitui"; + +interface BrancheDetailsNavigationProps { + eventKey: string; + activePanel: string; + callback: (eventKey: string) => void; + branch: branch; + checkout: (branch: branch) => void; +} + +export const BrancheDetailsNavigation = (props: BrancheDetailsNavigationProps) => { + const { eventKey, activePanel, callback, branch, checkout } = props; + const context = React.useContext(gitPluginContext) + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + + const openRemote = () => { + window.open(`${branch.remote.url}/tree/${branch.name}`, '_blank'); + } + + return ( + <> +
+
handleClick()} role={'button'} className='pointer d-flex flex-row w-100 commit-navigation'> + { + activePanel === eventKey ? : + } + +
{branch.name} {branch.remote ? `on ${branch.remote.remote}` : ''}
+ +
+ {context.currentBranch.name === branch.name ? + checkout(branch)}> + : + checkout(branch)}> + } + checkout(branch)}> + {branch.remote?.url && openRemote()}>} +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/branches.tsx b/libs/remix-ui/git/src/components/navigation/branches.tsx new file mode 100644 index 0000000000..d3ee0a9a05 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/branches.tsx @@ -0,0 +1,30 @@ +import { faCaretDown, faCaretRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { } from "react"; +import { gitActionsContext, pluginActionsContext } from "../../state/context"; + +export const BranchesNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + const context = React.useContext(gitActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/clone.tsx b/libs/remix-ui/git/src/components/navigation/clone.tsx new file mode 100644 index 0000000000..85deddbcab --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/clone.tsx @@ -0,0 +1,27 @@ +import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useContext, useEffect } from "react"; + +export const CloneNavigation = ({ eventKey, activePanel, callback }) => { + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/commands.tsx b/libs/remix-ui/git/src/components/navigation/commands.tsx new file mode 100644 index 0000000000..0ab669fd63 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/commands.tsx @@ -0,0 +1,50 @@ +import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faCircleCheck, faArrowsUpDown } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { CustomTooltip } from "@remix-ui/helper"; +import React, { useContext, useEffect } from "react"; +import { FormattedMessage } from "react-intl"; +import { pluginActionsContext } from "../../state/context"; +import { SourceControlMenu } from "./menu/sourcecontrolmenu"; + +export const CommandsNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + + + + { + activePanel === eventKey ? + + }> + + + }> + + + }> + + + : null + } + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/commitdetails.tsx b/libs/remix-ui/git/src/components/navigation/commitdetails.tsx new file mode 100644 index 0000000000..2a130d40b3 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/commitdetails.tsx @@ -0,0 +1,27 @@ +import { faCaretUp, faCaretDown, faCaretRight, faArrowUp, faArrowDown, faArrowRotateRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useContext, useEffect } from "react"; +import { CommitSummary } from "../panels/commits/commitsummary"; + +export const CommitDetailsNavigation = ({ eventKey, activePanel, callback, commit, checkout }) => { + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + return ( + <> +
handleClick()} role={'button'} className='pointer mb-2 mt-2 w-100 d-flex flex-row commit-navigation'> + { + activePanel === eventKey ? : + } + + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/commits.tsx b/libs/remix-ui/git/src/components/navigation/commits.tsx new file mode 100644 index 0000000000..4b3f455e03 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/commits.tsx @@ -0,0 +1,49 @@ +import { faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faArrowsUpDown } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { CustomTooltip } from "@remix-ui/helper"; +import React, { } from "react"; +import { FormattedMessage } from "react-intl"; +import { pluginActionsContext } from "../../state/context"; + +export const CommitslNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + + + + { + activePanel === eventKey ? + + }> + + + }> + + + }> + + + : null + } + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/github.tsx b/libs/remix-ui/git/src/components/navigation/github.tsx new file mode 100644 index 0000000000..0f1c429922 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/github.tsx @@ -0,0 +1,29 @@ +import { faCaretDown, faCaretRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { } from "react"; +import { pluginActionsContext } from "../../state/context"; + +export const GitHubNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/menu/sourcecontrolmenu.tsx b/libs/remix-ui/git/src/components/navigation/menu/sourcecontrolmenu.tsx new file mode 100644 index 0000000000..1fe9aa0e96 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/menu/sourcecontrolmenu.tsx @@ -0,0 +1,49 @@ +import { count } from "console" +import { CustomIconsToggle, CustomMenu, CustomTooltip } from "@remix-ui/helper" +import React, { useState } from "react" +import { Dropdown } from "react-bootstrap" +import { FormattedMessage } from "react-intl" + +export const SourceControlMenu = () => { + const [showIconsMenu, hideIconsMenu] = useState(false) + return ( + hideIconsMenu(!showIconsMenu)} show={showIconsMenu}> + { + hideIconsMenu(!showIconsMenu) + }} + as={CustomIconsToggle} + icon={'fas fa-bars'} + > + + + } + > +
{ + hideIconsMenu(!showIconsMenu) + }} + key={`cloneGitRepository-fe-ws`} + > + { + hideIconsMenu(!showIconsMenu) + }} + className='fab fa-github pl-2' + > + + +
+
+
+
+
+ ) +} diff --git a/libs/remix-ui/git/src/components/navigation/remotes.tsx b/libs/remix-ui/git/src/components/navigation/remotes.tsx new file mode 100644 index 0000000000..e63c588bb2 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/remotes.tsx @@ -0,0 +1,30 @@ +import { faCaretDown, faCaretRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { } from "react"; +import { gitActionsContext, pluginActionsContext } from "../../state/context"; + +export const RemotesNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + const context = React.useContext(gitActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx b/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx new file mode 100644 index 0000000000..4665e6d281 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx @@ -0,0 +1,44 @@ +import { faCaretDown, faCaretRight, faArrowRightArrowLeft, faGlobe } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useContext, useEffect } from "react"; +import { branch, remote } from "../../types"; +import { gitPluginContext } from "../gitui"; + +interface RemotesDetailsNavigationProps { + eventKey: string; + activePanel: string; + callback: (eventKey: string) => void; + remote: remote; +} + +export const RemotesDetailsNavigation = (props: RemotesDetailsNavigationProps) => { + const { eventKey, activePanel, callback, remote } = props; + const context = React.useContext(gitPluginContext) + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + + const openRemote = () => { + window.open(`${remote.url}`, '_blank'); + } + + return ( + <> +
+
handleClick()} role={'button'} className='pointer d-flex flex-row w-100 commit-navigation'> + { + activePanel === eventKey ? : + } +
{remote.remote} {remote.url}
+ +
+ {remote?.url && openRemote()}>} +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/settings.tsx b/libs/remix-ui/git/src/components/navigation/settings.tsx new file mode 100644 index 0000000000..3075fc4814 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/settings.tsx @@ -0,0 +1,43 @@ +import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faArrowsUpDown, faTriangleExclamation } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { CustomTooltip } from "@remix-ui/helper"; +import React, { useContext, useEffect } from "react"; +import { FormattedMessage } from "react-intl"; +import { pluginActionsContext } from "../../state/context"; + +export const SettingsNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + + + + + + }> + + + + + + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx new file mode 100644 index 0000000000..bd21c3e6e0 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx @@ -0,0 +1,54 @@ +import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faArrowsUpDown } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { CustomTooltip } from "@remix-ui/helper"; +import React, { useContext, useEffect } from "react"; +import { FormattedMessage } from "react-intl"; +import { pluginActionsContext } from "../../state/context"; +import { SourceControlMenu } from "./menu/sourcecontrolmenu"; + +export const SourceControlNavigation = ({ eventKey, activePanel, callback }) => { + const pluginactions = React.useContext(pluginActionsContext) + + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + + + + { + activePanel === eventKey ? + + }> + + + }> + + + }> + + + }> + + + + : null + } + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/sourcecontrolgroup.tsx b/libs/remix-ui/git/src/components/navigation/sourcecontrolgroup.tsx new file mode 100644 index 0000000000..7355fb50f8 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/sourcecontrolgroup.tsx @@ -0,0 +1,55 @@ +import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faArrowsUpDown, faPlus, faMinus } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { CustomTooltip } from "@remix-ui/helper"; +import React, { useContext, useEffect } from "react"; +import { FormattedMessage } from "react-intl"; +import { gitActionsContext, pluginActionsContext } from "../../state/context"; +import { sourceControlGroup } from "../../types"; + +interface SourceControlGroupNavigationProps { + eventKey: string; + activePanel: string; + callback: (eventKey: string) => void; + group: sourceControlGroup +} + + +export const SourceControlGroupNavigation = (props: SourceControlGroupNavigationProps) => { + const { eventKey, activePanel, callback, group } = props; + const actions = React.useContext(gitActionsContext) + const pluginActions = React.useContext(pluginActionsContext) + const handleClick = () => { + if (!callback) return + if (activePanel === eventKey) { + callback('') + } else { + callback(eventKey) + } + } + return ( + <> +
+ handleClick()} role={'button'} className='nav d-flex justify-content-start align-items-center w-75'> + { + activePanel === eventKey ? : + } + + + { + activePanel === eventKey ? + + {group.name === 'Changes' ? + }> + + : null} + {group.name === 'Staged' ? + }> + + : null} + + : null + } +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/branches.tsx b/libs/remix-ui/git/src/components/panels/branches.tsx new file mode 100644 index 0000000000..b655e1f5fa --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/branches.tsx @@ -0,0 +1,57 @@ +import React, { useState } from "react"; +import { Alert } from "react-bootstrap"; +import { gitActionsContext } from "../../state/context"; +import { remote } from "../../types"; +import { gitPluginContext } from "../gitui"; +import { BranchDetails } from "./branches/branchedetails"; + +export const Branches = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [newBranch, setNewBranch] = useState({ value: "" }); + + const handleChange = (e: React.ChangeEvent) => { + setNewBranch({ value: e.currentTarget.value }); + }; + + const checkout = async (oid: string, remote: remote) => { + try { + actions.checkout({ ref: oid, remote: remote.remote }); + } catch (e) { + // do nothing + } + }; + return ( + <> +
+ {context.branches && context.branches.length ? +
+ {context.branches && context.branches.map((branch, index) => { + return ( + + ); + })} +
+ +
+ + +
+ +
:
No branches
} +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx b/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx new file mode 100644 index 0000000000..1956ceeba2 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx @@ -0,0 +1,61 @@ +import { ReadCommitResult } from "isomorphic-git" +import React, { useEffect, useState } from "react"; +import { Accordion } from "react-bootstrap"; +import { CommitDetailsNavigation } from "../../navigation/commitdetails"; +import { gitActionsContext } from "../../../state/context"; +import { gitPluginContext } from "../../gitui"; +import { branch } from "../../../types"; +import { BrancheDetailsNavigation } from "../../navigation/branchedetails"; +import { CommitDetailsItems } from "../commits/commitdetailsitem"; +import { CommitDetails } from "../commits/commitdetails"; + +export interface BrancheDetailsProps { + branch: branch; +} + +export const BranchDetails = (props: BrancheDetailsProps) => { + const { branch } = props; + const actions = React.useContext(gitActionsContext) + const context = React.useContext(gitPluginContext) + const [activePanel, setActivePanel] = useState(""); + + useEffect(() => { + if (activePanel === "0") { + console.log('GET BRANCH COMMITS', branch) + actions.getBranchCommits(branch) + } + }, [activePanel]) + + const checkout = (branch: branch) => { + actions.checkout({ + ref: branch.name, + remote: branch.remote && branch.remote.remote || null + }); + } + + const checkoutCommit = async (oid: string) => { + try { + //await ModalRef.current?.show(); + actions.checkout({ ref: oid }) + //Utils.log("yes"); + } catch (e) { + //Utils.log("no"); + } +}; + + return ( + + +
+ {context.branchCommits && Object.entries(context.branchCommits).map(([key, value]) => { + if(key == branch.name){ + return value.map((commit, index) => { + return() + }) + } + })} + +
+
+
) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/clone.tsx b/libs/remix-ui/git/src/components/panels/clone.tsx new file mode 100644 index 0000000000..2e65158018 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/clone.tsx @@ -0,0 +1,100 @@ + +import React, { useState } from "react"; +import { Alert, Form, FormControl, InputGroup } from "react-bootstrap"; +import { useLocalStorage } from "../../hooks/useLocalStorage"; +import { gitActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import { Repositories } from "./repositories"; +import { RemixUiCheckbox } from "@remix-ui/checkbox"; + +export const Clone = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [cloneUrl, setCloneUrl] = useLocalStorage( + "CLONE_URL", + '' + ); + + const [cloneDepth, setCloneDepth] = useLocalStorage( + "CLONE_DEPTH", + 1 + ); + + const [cloneBranch, setCloneBranch] = useLocalStorage( + "CLONE_BRANCH", + '' + ); + + const [url, setUrl] = useLocalStorage( + "GITHUB_URL", + '' + ); + + + const clone = async () => { + try { + setTimeout(() => actions.clone(cloneUrl, cloneBranch, cloneDepth, !cloneAllBranches), 1500) + } catch (e) { + + } + } + + const onCloneBranchChange = (value: string) => { + setCloneBranch(value) + } + + const onGitHubCloneUrlChange = (value: string) => { + setCloneUrl(value) + } + + const onDepthChange = (value: number) => { + setCloneDepth(value) + } + + const [cloneAllBranches, setcloneAllBranches] = useLocalStorage( + "GITHUB_CLONE_ALL_BRANCES", + false + ); + + const onAllBranchChange = () => { + setcloneAllBranches((e: any) => !e) + } + + return ( + <> + + onGitHubCloneUrlChange(e.target.value)} aria-describedby="urlprepend" /> + + + + onCloneBranchChange(e.target.value)} value={cloneBranch} className="form-control mb-1 mt-2" placeholder="branch" type="text" id="clonebranch" /> + +
+ +
+ + + + + --depth + + + onDepthChange(parseInt(e.target.value))} aria-describedby="clonedepthprepend" /> + + + onAllBranchChange()} + checked={cloneAllBranches} + onChange={() => { }} + /> + + +
+ ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commands.tsx b/libs/remix-ui/git/src/components/panels/commands.tsx new file mode 100644 index 0000000000..bb1abc9991 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commands.tsx @@ -0,0 +1,16 @@ +import React, { useEffect, useState } from "react"; +import { PushPull } from "./commands/pushpull"; +import { Fetch } from "./commands/fetch"; +import { Merge } from "./commands/merge"; + +export const Commands = () => { + + return ( + <> + +
+ +
+ + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commands/fetch.tsx b/libs/remix-ui/git/src/components/panels/commands/fetch.tsx new file mode 100644 index 0000000000..f73e7a04fe --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commands/fetch.tsx @@ -0,0 +1,15 @@ +import React, { useEffect, useState } from "react"; + + +export const Fetch = () => { + + const fetch = async () => { + //gitservice.fetch(currentRemote, '', '') + } + + + return ( + <> + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commands/merge.tsx b/libs/remix-ui/git/src/components/panels/commands/merge.tsx new file mode 100644 index 0000000000..b312faed21 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commands/merge.tsx @@ -0,0 +1,67 @@ +import React, { useEffect, useState } from "react"; +import { gitActionsContext } from "../../../state/context"; +import { gitPluginContext } from "../../gitui"; +import { selectStyles, selectTheme } from "../../../types/styles"; +import Select from 'react-select' + +export const Merge = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [localBranch, setLocalBranch] = useState('') + const [localBranchOptions, setLocalBranchOptions] = useState([]); + + useEffect(() => { + setLocalBranch(context.currentBranch.name) + }, [context.currentBranch]) + + + + const onLocalBranchChange = (value: any) => { + console.log('onLocalBranchChange', value) + setLocalBranch(value) + } + + const merge = async () => { + //gitservice.push(currentRemote, branch || '', remoteBranch, force) + } + + useEffect(() => { + console.log('context', context.repositories) + // map context.repositories to options + const localBranches = context.branches && context.branches.length > 0 && context.branches + .filter(branch => !branch.remote) + .map(repo => { + return { value: repo.name, label: repo.name } + }) + setLocalBranchOptions(localBranches) + + + }, [context.branches]) + + + + return ( + <> + + + +
+ + +
+ + + + e && onLocalBranchChange(e.value)} + theme={selectTheme} + styles={selectStyles} + isClearable={true} + value={{ value: localBranch, label: localBranch }} + placeholder="Type to search for a branch..." + /> + + + e && onRemoteChange(e.value)} + theme={selectTheme} + styles={selectStyles} + isClearable={true} + value={{ value: context.upstream, label: context.upstream }} + placeholder="Type to search for a branch..." + /> + + +
+ onForceChange(e)} className="remixui_autocompile custom-control-input" type="checkbox" data-id="compilerContainerAutoCompile" id="forcepush" title="Force Push" /> + +
+ + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commitmessage.tsx b/libs/remix-ui/git/src/components/panels/commitmessage.tsx new file mode 100644 index 0000000000..49153684a1 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commitmessage.tsx @@ -0,0 +1,54 @@ +import React, { useEffect } from "react" +import { useState } from "react" +import { gitActionsContext } from "../../state/context" +import { gitPluginContext } from "../gitui" +import { faCheck } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +export const CommitMessage = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + + const [message, setMessage] = useState({ value: '' }) + + const handleChange = (e: React.ChangeEvent) => { + setMessage({ value: e.currentTarget.value }) + } + + useEffect(() => { + if (context.fileStatusResult) { + console.log(context.staged.length + ' staged') + } + }, [context.fileStatusResult]) + + const commit = async() => { + if(context.staged.length === 0 && context.allchangesnotstaged.length == 0) return + if(context.staged.length === 0) + await actions.addall() + await actions.commit(message.value) + } + + const commitAllowed = () => { + return context.canCommit === false || message.value === "" || ( context.staged.length === 0 && context.allchangesnotstaged.length == 0 ) + } + + const commitMessagePlaceholder = () => { + if(context.currentBranch === undefined || context.currentBranch.name === "") + return `message` + return `message ( commit on ${context.currentBranch.name} )` + } + + return ( + <> +
+ +
+ {context.canCommit ? <> :
Cannot commit in detached state! Create a new branch and check it out first or checkout main.

} + +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commits.tsx b/libs/remix-ui/git/src/components/panels/commits.tsx new file mode 100644 index 0000000000..5468f0433b --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commits.tsx @@ -0,0 +1,50 @@ +import { checkout, ReadCommitResult } from "isomorphic-git"; +import React from "react"; +import { gitActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import { CommitDetails } from "./commits/commitdetails"; +import { CommitSummary } from "./commits/commitsummary"; + + +export const Commits = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + + const checkout = async (oid: string) => { + try { + //await ModalRef.current?.show(); + actions.checkout({ ref: oid }) + //Utils.log("yes"); + } catch (e) { + //Utils.log("no"); + } + }; + + + return ( + <> + {context.commits && context.commits.length ? +
+ +
+ {context.commits && context.commits.map((commit, index) => { + return ( + + + + ); + })} + +
await checkout("main")} + className="btn btn-primary btn-sm checkout-btn mt-2 d-none" + data-oid="main" + > + git checkout main +
+
+
+ :
No commits
} + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx b/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx new file mode 100644 index 0000000000..3144b85ca4 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx @@ -0,0 +1,40 @@ +import { ReadCommitResult } from "isomorphic-git" +import React, { useEffect, useState } from "react"; +import { Accordion } from "react-bootstrap"; +import { CommitDetailsNavigation } from "../../navigation/commitdetails"; +import { gitActionsContext } from "../../../state/context"; +import { gitPluginContext } from "../../gitui"; +import { CommitDetailsItems } from "./commitdetailsitem"; + +export interface CommitDetailsProps { + commit: ReadCommitResult; + checkout: (oid: string) => void; +} + +export const CommitDetails = (props: CommitDetailsProps) => { + const { commit, checkout } = props; + const actions = React.useContext(gitActionsContext) + const context = React.useContext(gitPluginContext) + const [activePanel, setActivePanel] = useState(""); + + useEffect(() => { + if (activePanel === "0") { + console.log(commit.oid, commit.commit.parent) + actions.getCommitChanges(commit.oid, commit.commit.parent[0]) + } + }, [activePanel]) + + return ( + + + <> + {context.commitChanges && context.commitChanges.filter( + (change) => change.hashModified === commit.oid && change.hashOriginal === commit.commit.parent[0] + ).map((change, index) => { + return() + })} + + + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commits/commitdetailsitem.tsx b/libs/remix-ui/git/src/components/panels/commits/commitdetailsitem.tsx new file mode 100644 index 0000000000..96f0e46be0 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commits/commitdetailsitem.tsx @@ -0,0 +1,47 @@ +import { commitChange } from "../../../types"; +import React from "react"; +import path from "path"; +import { gitActionsContext, pluginActionsContext } from "../../../state/context"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faGlobe } from "@fortawesome/free-solid-svg-icons"; + +export interface CCommitDetailsItemsProps { + commitChange: commitChange; +} + +export const CommitDetailsItems = (props: CCommitDetailsItemsProps) => { + const { commitChange } = props; + const actions = React.useContext(gitActionsContext) + const pluginActions = React.useContext(pluginActionsContext) + + const openChanges = async (change: commitChange) => { + console.log("open changes", change); + await actions.diff(change) + console.log("open changes", change); + await pluginActions.openDiff(change) + } + + function FunctionStatusIcons() { + const status = commitChange.type + return (<> + + {status && status.indexOf("modified") === -1 ? <> : M} + {status && status.indexOf("deleted") === -1 ? <> : D} + {status && status.indexOf("added") === -1 ? <> : A} + + + ) + } + return (<> +
+
await openChanges(commitChange)}> + {path.basename(commitChange.path)} +
{commitChange.path}
+
+
+ + +
+
+ ) +} diff --git a/libs/remix-ui/git/src/components/panels/commits/commitsummary.tsx b/libs/remix-ui/git/src/components/panels/commits/commitsummary.tsx new file mode 100644 index 0000000000..ac4439c864 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/commits/commitsummary.tsx @@ -0,0 +1,53 @@ +import { ReadCommitResult } from "isomorphic-git" +import { default as dateFormat } from "dateformat"; +import React from "react"; + +export interface CommitSummaryProps { + commit: ReadCommitResult; + checkout: (oid: string) => void; +} + +export const CommitSummary = (props: CommitSummaryProps) => { + const { commit, checkout } = props; + + const getDate = (commit: ReadCommitResult) => { + const timestamp = commit.commit.author.timestamp; + + if (timestamp) { + // calculate the difference between the current time and the commit time in days or hours or minutes + const diff = Math.floor((Date.now() - timestamp * 1000) / 1000 / 60 / 60 / 24); + + if (diff == 0) { + return "today at " + dateFormat(timestamp * 1000, "HH:MM"); + } else + + if (diff < 1) { + // return how many hours ago + return `${Math.floor(diff * 24)} hour(s) ago`; + } + + if (diff < 7) { + // return how many days ago + return `${diff} day(s) ago`; + } + if (diff < 365) { + return dateFormat(timestamp * 1000, "mmm dd"); + } + return dateFormat(timestamp * 1000, "mmm dd yyyy"); + } + return ""; + }; + + return ( + <> +
+ {commit.commit.message} +
+ {commit.commit.author.name || ""} + {getDate(commit)} + + + + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/github.tsx b/libs/remix-ui/git/src/components/panels/github.tsx new file mode 100644 index 0000000000..8d7958c1b9 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/github.tsx @@ -0,0 +1,143 @@ +import React, { useEffect } from "react"; +import { gitActionsContext, pluginActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import axios from "axios"; +import { CopyToClipboard } from "@remix-ui/clipboard"; +import { Card } from "react-bootstrap"; + + +export const GitHubAuth = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const pluginActions = React.useContext(pluginActionsContext) + const [gitHubResponse, setGitHubResponse] = React.useState(null) + const [authorized, setAuthorized] = React.useState(false) + + + + const getDeviceCodeFromGitHub = async () => { + + setAuthorized(false) + // Send a POST request + const response = await axios({ + method: 'post', + url: 'http://0.0.0.0:3000/github.com/login/device/code', + data: { + client_id: 'Iv1.12fc02c69c512462' + }, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + }); + + // convert response to json + const githubrespone = await response.data; + console.log('json', githubrespone) + + setGitHubResponse(githubrespone) + } + + const connectApp = async () => { + // poll https://github.com/login/oauth/access_token + const accestokenresponse = await axios({ + method: 'post', + url: 'http://0.0.0.0:3000/github.com/login/oauth/access_token', + data: { + client_id: 'Iv1.12fc02c69c512462', + device_code: gitHubResponse.device_code, + grant_type: 'urn:ietf:params:oauth:grant-type:device_code' + }, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + }); + + // convert response to json + const response = await accestokenresponse.data; + console.log('json2', response) + + if (response.error) { + + } + + if (response.access_token) { + setAuthorized(true) + await pluginActions.saveToken(response.access_token) + await actions.getGitHubUser() + } + + } + + const disconnect = async () => { + setAuthorized(false) + setGitHubResponse(null) + } + + const checkConnection = async () => { + //await actions.getGitHubUser() + } + + useEffect(() => { + + },[]) + + useEffect(() => { + console.log('context.rateLimit', context.rateLimit) + }, [context.rateLimit]) + + + return ( + <> + {(context.gitHubUser && context.gitHubUser.login) ? null : + + } + {gitHubResponse && !authorized && +
+ + Step 1: Copy this code: +
+ +
+ +
+
+

+ Step 2: Authorize the app here +

{gitHubResponse.verification_uri} +


+ Step 3: When you are done, click on the button below: + +
+ } + { + (context.gitHubUser && context.gitHubUser.login) ? +
+ +
: null + } + { + (context.gitHubUser && context.gitHubUser.login) ? +
+ + + Connected as {context.gitHubUser.login} + + + {context.gitHubUser.html_url} + + + +
: null + } + + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/githubcredentials.tsx b/libs/remix-ui/git/src/components/panels/githubcredentials.tsx new file mode 100644 index 0000000000..3e23b56988 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/githubcredentials.tsx @@ -0,0 +1,55 @@ +import { checkout, clone, ReadCommitResult } from "isomorphic-git"; +import React from "react"; +import { gitActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import { CustomTooltip } from "@remix-ui/helper"; + +import { useIntl, FormattedMessage } from "react-intl"; +import { CopyToClipboard } from "@remix-ui/clipboard"; +import { FormControl, InputGroup } from "react-bootstrap"; + + +export const GitHubCredentials = () => { + const context = React.useContext(gitPluginContext) + const [githubToken, setGithubToken] = React.useState('') + const [githubUsername, setGithubUsername] = React.useState('') + const [githubEmail, setGithubEmail] = React.useState('') + const intl = useIntl() + + const gitAccessTokenLink = 'https://github.com/settings/tokens/new?scopes=gist,repo&description=Remix%20IDE%20Token' + + function handleChangeTokenState(e: string): void { + throw new Error("Function not implemented."); + } + + function handleChangeUserNameState(e: string): void { + throw new Error("Function not implemented."); + } + + function handleChangeEmailState(e: string): void { + throw new Error("Function not implemented."); + } + + function saveGithubToken(): void { + throw new Error("Function not implemented."); + } + + function removeToken(): void { + throw new Error("Function not implemented."); + } + + + return ( + <> +
+ +
+ +
+
+ handleChangeUserNameState(e.target.value)} value={githubUsername} className="form-control mb-2" placeholder="GitHub username" type="text" id="githubUsername" /> + handleChangeEmailState(e.target.value)} value={githubEmail} className="form-control mb-1" placeholder="GitHub email" type="text" id="githubEmail" /> +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/remotes.tsx b/libs/remix-ui/git/src/components/panels/remotes.tsx new file mode 100644 index 0000000000..af8536d2e6 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/remotes.tsx @@ -0,0 +1,58 @@ +import React, { useEffect } from "react"; +import { gitActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import { Remoteselect } from "./remoteselect"; +import { RemotesImport } from "./remotesimport"; + +export const Remotes = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [remoteName, setRemoteName] = React.useState('') + const [url, setUrl] = React.useState('') + + const onRemoteNameChange = (value: string) => { + setRemoteName(value) + } + const onUrlChange = (value: string) => { + setUrl(value) + } + + const addRemote = async () => { + //await gitservice.addRemote(remoteName, url) + //setCurrentRemote(remoteName) + //await gitservice.getRemotes() + } + + + useEffect(() => { + console.log('SHOW REMOTES', context.remotes) + }, [context.remotes]) + + return ( + <> + + + {context.remotes && context.remotes.length ? + <> + + {context.remotes && context.remotes.map((remote, index) => { + + return ( + + ); + })} + : <>No remotes} +
+ + onRemoteNameChange(e.target.value)} value={remoteName} className="form-control mb-2" type="text" id="remotename" /> + onUrlChange(e.target.value)} value={url} className="form-control" type="text" id="remoteurl" /> + + +
+ +
+ + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/remoteselect.tsx b/libs/remix-ui/git/src/components/panels/remoteselect.tsx new file mode 100644 index 0000000000..3285f81304 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/remoteselect.tsx @@ -0,0 +1,47 @@ +import { branch, checkout, ReadCommitResult } from "isomorphic-git"; +import React, { useEffect, useState } from "react"; +import { gitActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import { default as dateFormat } from "dateformat"; +import { RemotesDetailsNavigation } from "../navigation/remotesdetails"; +import { Accordion } from "react-bootstrap"; +import { remote } from "../../types"; +import { BranchDetails } from "./branches/branchedetails"; + +export interface RemoteSelectProps { + remote: remote +} + +export const Remoteselect = (props: RemoteSelectProps) => { + const { remote } = props; + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [activePanel, setActivePanel] = useState(""); + + useEffect(() => { + if (activePanel === "0") { + console.log('fetching', remote) + } + }, [activePanel]) + + useEffect(() => { + console.log('remote branches', context.branches) + }, [context.branches]) + + return ( + <> + + + + <> + {context.branches && context.branches.filter((branch, index) => branch.remote && branch.remote.remote === remote.remote ).map((branch, index) => { + return ( + + ); + })} + + + + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/remotesimport.tsx b/libs/remix-ui/git/src/components/panels/remotesimport.tsx new file mode 100644 index 0000000000..c39552b733 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/remotesimport.tsx @@ -0,0 +1,100 @@ +import React, { useEffect, useState } from "react"; +import { Alert, Button } from "react-bootstrap"; +import { gitActionsContext } from "../../state/context"; +import { repository } from "../../types"; +import { gitPluginContext } from "../gitui"; +import Select from 'react-select' +import { selectStyles, selectTheme } from "../../types/styles"; + + +export const RemotesImport = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [repo, setRepo] = useState(null); + const [repoOtions, setRepoOptions] = useState([]); + const [loading, setLoading] = useState(false) + const [show, setShow] = useState(false) + const [remoteName, setRemoteName] = useState('') + + useEffect(() => { + console.log('context', context.repositories) + // map context.repositories to options + const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { + return { value: repo.id, label: repo.full_name } + }) + setLoading(false) + setRepoOptions(options) + + }, [context.repositories]) + + + + const fetchRepositories = async () => { + try { + setShow(true) + setLoading(true) + setRepoOptions([]) + console.log(await actions.repositories()) + } catch (e) { + // do nothing + } + }; + + const selectRepo = async (value: number | string) => { + // find repo + console.log('setRepo', value, context.repositories) + + const repo = context.repositories.find(repo => { + return repo.id.toString() === value.toString() + }) + console.log('repo', repo) + if (repo) { + setRepo(repo) + } + } + + const addRemote = async () => { + try { + + } catch (e) { + // do nothing + } + + }; + const onRemoteNameChange = (value: string) => { + setRemoteName(value) + } + + return ( + <> + + {show ? + onRemoteNameChange(e.target.value)} value={remoteName} className="form-control mb-2" type="text" id="remotename" /> + : null} + + + + {repo && remoteName ? + : null} + + + ) +} + + diff --git a/libs/remix-ui/git/src/components/panels/repositories.tsx b/libs/remix-ui/git/src/components/panels/repositories.tsx new file mode 100644 index 0000000000..f06a67100f --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/repositories.tsx @@ -0,0 +1,131 @@ +import React, { useEffect, useState } from "react"; +import { Alert, Button } from "react-bootstrap"; +import { gitActionsContext } from "../../state/context"; +import { repository } from "../../types"; +import { gitPluginContext } from "../gitui"; +import Select from 'react-select' +import { selectStyles, selectTheme } from "../../types/styles"; + +interface RepositoriesProps { + cloneDepth?: number + cloneAllBranches?: boolean +} + +export const Repositories = (props: RepositoriesProps) => { + const { cloneDepth, cloneAllBranches } = props + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [branch, setBranch] = useState({ name: "" }); + const [repo, setRepo] = useState(null); + const [repoOtions, setRepoOptions] = useState([]); + const [branchOptions, setBranchOptions] = useState([]); + const [loading, setLoading] = useState(false) + const [show, setShow] = useState(false) + + useEffect(() => { + console.log('context', context.repositories) + // map context.repositories to options + const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { + return { value: repo.id, label: repo.full_name } + }) + setLoading(false) + setRepoOptions(options) + + }, [context.repositories]) + + + useEffect(() => { + // map context.branches to options + const options = context.remoteBranches && context.remoteBranches.length > 0 && context.remoteBranches.map(branch => { + return { value: branch.name, label: branch.name } + } + ) + setBranchOptions(options) + }, [context.remoteBranches]) + + + useEffect(() => { + console.log('show', show) + },[show]) + + const fetchRepositories = async () => { + try { + setShow(true) + setLoading(true) + setRepoOptions([]) + setBranchOptions([]) + console.log(await actions.repositories()) + } catch (e) { + // do nothing + } + }; + + const selectRepo = async (value: number | string) => { + // find repo + console.log('setRepo', value, context.repositories) + + const repo = context.repositories.find(repo => { + return repo.id.toString() === value.toString() + }) + console.log('repo', repo) + if (repo) { + setBranchOptions([]) + setBranch({ name: "" }) + setRepo(repo) + await actions.remoteBranches(repo.owner.login, repo.name) + } + } + + const selectRemoteBranch = async (value: number | string) => { + console.log('setRemoteBranch', value) + setBranch({ name: value.toString() }) + } + + const clone = async () => { + try { + console.log('clone', repo, branch) + actions.clone(repo.html_url, branch.name, cloneDepth, !cloneAllBranches) + } catch (e) { + // do nothing + } + }; + + + return ( + <> + + {show? + e && selectRemoteBranch(e.value)} + theme={selectTheme} + styles={selectStyles} + isClearable={true} + placeholder="Type to search for a branch..." + /> : null} + + {repo && branch.name && branch.name !== '0' ? + : null} + + + ) +} + + diff --git a/libs/remix-ui/git/src/components/panels/settings.tsx b/libs/remix-ui/git/src/components/panels/settings.tsx new file mode 100644 index 0000000000..923ff61d04 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/settings.tsx @@ -0,0 +1,52 @@ +import { checkout, clone, ReadCommitResult } from "isomorphic-git"; +import React from "react"; +import { gitActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import { CustomTooltip } from "@remix-ui/helper"; + +import { useIntl, FormattedMessage } from "react-intl"; +import { CopyToClipboard } from "@remix-ui/clipboard"; +import { FormControl, InputGroup } from "react-bootstrap"; + + +export const Settings = () => { + + const [githubToken, setGithubToken] = React.useState('') + const [githubUsername, setGithubUsername] = React.useState('') + const [githubEmail, setGithubEmail] = React.useState('') + const intl = useIntl() + + const gitAccessTokenLink = 'https://github.com/settings/tokens/new?scopes=gist,repo&description=Remix%20IDE%20Token' + + + + function handleChangeTokenState(e: string): void { + throw new Error("Function not implemented."); + } + + function handleChangeUserNameState(e: string): void { + throw new Error("Function not implemented."); + } + + function handleChangeEmailState(e: string): void { + throw new Error("Function not implemented."); + } + + function saveGithubToken(): void { + throw new Error("Function not implemented."); + } + + function removeToken(): void { + throw new Error("Function not implemented."); + } + + + return ( + <> + handleChangeUserNameState(e.target.value)} value={githubToken} className="form-control mb-2" placeholder="GitHub token" type="text" id="githubToken" /> + handleChangeUserNameState(e.target.value)} value={githubUsername} className="form-control mb-2" placeholder="GitHub username" type="text" id="githubUsername" /> + handleChangeEmailState(e.target.value)} value={githubEmail} className="form-control mb-1" placeholder="GitHub email" type="text" id="githubEmail" /> +
+ + ); +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolgroup.tsx b/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolgroup.tsx new file mode 100644 index 0000000000..1b17cb2b31 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolgroup.tsx @@ -0,0 +1,38 @@ +import { ReadCommitResult } from "isomorphic-git" +import React, { useEffect, useState } from "react"; +import { Accordion } from "react-bootstrap"; +import { gitActionsContext } from "../../../state/context"; +import { gitPluginContext } from "../../gitui"; +import { sourceControlGroup } from "../../../types"; +import { SourceControlGroupNavigation } from "../../navigation/sourcecontrolgroup"; +import { SourceControlItem } from "./sourcecontrolitem"; + +export interface SourceControGroupProps { + group: sourceControlGroup +} + +export const SourceControGroup = (props: SourceControGroupProps) => { + const { group } = props; + const actions = React.useContext(gitActionsContext) + const context = React.useContext(gitPluginContext) + const [activePanel, setActivePanel] = useState("0"); + + useEffect(() => { + if (activePanel === "0") { + } + }, [activePanel]) + + return (<> + {group.group.length > 0 ? + + + + <> + {group.group.map((file, index) => { + return () + })} + + + : <>} + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolitem.tsx b/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolitem.tsx new file mode 100644 index 0000000000..67dc376a8f --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcecontrolitem.tsx @@ -0,0 +1,67 @@ +import { commitChange, fileStatusResult, sourceControlGroup } from "../../../types"; +import React from "react"; +import path from "path"; +import { gitActionsContext, pluginActionsContext } from "../../../state/context"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faGlobe } from "@fortawesome/free-solid-svg-icons"; +import { SourceControlItemButtons } from "./sourcontrolitembuttons"; +import { removeSlash } from "../../../utils"; + +export interface SourceControlItemProps { + file: fileStatusResult; + group: sourceControlGroup; +} + +export const SourceControlItem = (props: SourceControlItemProps) => { + const { file, group } = props; + const actions = React.useContext(gitActionsContext) + const pluginActions = React.useContext(pluginActionsContext) + + async function fileClick(file: fileStatusResult) { + console.log(file) + //let status = fileservice.getFileStatusForFile(file.filename || ""); + if (file.statusNames && file.statusNames.indexOf("modified") !== -1) { + const headHash = await actions.resolveRef("HEAD") + const change: commitChange = { + path: removeSlash(file.filename), + type: "modified", + hashOriginal: headHash, + hashModified: '', + readonly: false, + } + await actions.diff(change) + await pluginActions.openDiff(change) + console.log("diff", change) + + } else { + await pluginActions.openFile(file.filename) + //await client.call('fileManager', 'open', file.filename) + } + } + + function FunctionStatusIcons() { + + const status = file.statusNames + + return (<> + + {status && status.indexOf("modified") === -1 ? <> :
M
} + {status && status.indexOf("deleted") === -1 ? <> : D} + {status && status.indexOf("added") === -1 ? <> : A} + {status && status.indexOf("untracked") === -1 ? <> : U} + ) + + } + return (<> +
+
await fileClick(file)}> + {path.basename(file.filename)} +
{file.filename}
+
+
+ + +
+
+ ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcontrolitembuttons.tsx b/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcontrolitembuttons.tsx new file mode 100644 index 0000000000..9020f6e03c --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/sourcecontrol/sourcontrolitembuttons.tsx @@ -0,0 +1,44 @@ +import { commitChange, fileStatusResult, sourceControlGroup } from "../../../types"; +import React from "react"; +import path from "path"; +import { gitActionsContext, pluginActionsContext } from "../../../state/context"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faGlobe, faMinus, faPlus, faUndo } from "@fortawesome/free-solid-svg-icons"; + +export interface SourceControlItemButtonsProps { + file: fileStatusResult, + group: sourceControlGroup +} + +export const SourceControlItemButtons = (props: SourceControlItemButtonsProps) => { + const { file, group } = props; + const actions = React.useContext(gitActionsContext) + const pluginActions = React.useContext(pluginActionsContext) + + function RenderButtons() { + const status = file.statusNames + + if (group.name === 'Staged') { + return <> + + {status && status.indexOf("modified") === -1 ? <> : } + {status && status.indexOf("deleted") === -1 ? <> : } + {status && status.indexOf("deleted") !== -1 ? <> : } + + + } + if (group.name === 'Changes') { + return <> + + {status && status.indexOf("deleted") === -1 ? <> : <>} + {status && status.indexOf("modified") === -1 ? <> : } + {(status && status.indexOf("unstaged") !== -1 || status && status.indexOf("deleted") !== -1) ? <> : } + {(status && status.indexOf("unstaged") !== -1 && status && status.indexOf("modified") !== -1) ? : <>} + + } + return <> + } + + return + +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/sourcontrol.tsx b/libs/remix-ui/git/src/components/panels/sourcontrol.tsx new file mode 100644 index 0000000000..3804579abd --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/sourcontrol.tsx @@ -0,0 +1,58 @@ +import React, { useEffect, useState } from 'react' +import { gitActionsContext, pluginActionsContext } from '../../state/context' +import { gitPluginContext } from '../gitui' +import { sourceControlGroup } from '../../types' +import { SourceControGroup } from './sourcecontrol/sourcecontrolgroup' + +export const SourceControl = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const pluginactions = React.useContext(pluginActionsContext) + const [show, setShow] = useState(false) + + + useEffect(() => { + if (context.fileStatusResult) { + console.log(context) + const total = context.allchangesnotstaged.length + const badges = total + context.staged.length + pluginactions.statusChanged(badges) + //console.log("allchangesnotstaged", context.allchangesnotstaged, context.fileStatusResult) + setShow((context.deleted.length > 0 || context.staged.length > 0 || context.untracked.length > 0 || context.modified.length > 0)) + } + }, [context.fileStatusResult, context.modified, context.allchangesnotstaged, context.untracked, context.deleted]) + + useEffect(() => { + if (context.commits) { + console.log("SC commits", context.localCommitCount, context.currentBranch) + } + }, [context.localCommitCount, context.currentBranch]) + + function RenderGroups() { + const groups: sourceControlGroup[] = [{ name: 'Staged', group: context.staged }, { name: 'Changes', group: context.allchangesnotstaged }] + return (<> + { + groups.map((ob: sourceControlGroup, index: number) => { + return ( + + ) + }) + } + + ) + } + + return ( + <> + {show ? + <> +
+ +
+ : <> + + } + + ); + +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/hooks/useLocalStorage.tsx b/libs/remix-ui/git/src/hooks/useLocalStorage.tsx new file mode 100644 index 0000000000..dbef5378a8 --- /dev/null +++ b/libs/remix-ui/git/src/hooks/useLocalStorage.tsx @@ -0,0 +1,37 @@ +import { useState } from "react" + +export function useLocalStorage(key: string, initialValue: any) { + // State to store our value + // Pass initial state function to useState so logic is only executed once + const [storedValue, setStoredValue] = useState(() => { + try { + // Get from local storage by key + const item = window.localStorage.getItem(key) + // Parse stored json or if none return initialValue + return item ? JSON.parse(item) : initialValue + } catch (error) { + // If error also return initialValue + console.error(error) + return initialValue + } + }) + + // Return a wrapped version of useState's setter function that ... + // ... persists the new value to localStorage. + const setValue = (value: any) => { + try { + // Allow value to be a function so we have same API as useState + const valueToStore = + value instanceof Function ? value(storedValue) : value + // Save state + setStoredValue(valueToStore) + // Save to local storage + window.localStorage.setItem(key, JSON.stringify(valueToStore)) + } catch (error) { + // A more advanced implementation would handle the error case + console.error(error) + } + } + + return [storedValue, setValue] +} diff --git a/libs/remix-ui/git/src/index.ts b/libs/remix-ui/git/src/index.ts new file mode 100644 index 0000000000..677c174059 --- /dev/null +++ b/libs/remix-ui/git/src/index.ts @@ -0,0 +1,4 @@ +export * from './types' +export { GitUI } from './components/gitui' +export { commitChange, commitChangeType, remote, branch } from './types' +export * from './types/styles' \ No newline at end of file diff --git a/libs/remix-ui/git/src/lib/fileHelpers.ts b/libs/remix-ui/git/src/lib/fileHelpers.ts new file mode 100644 index 0000000000..a3c65b6deb --- /dev/null +++ b/libs/remix-ui/git/src/lib/fileHelpers.ts @@ -0,0 +1,59 @@ +import { fileStatusResult, gitState } from "../types"; + +export const getFilesCountByStatus = (status: string, files: fileStatusResult[]) => { + let count = 0; + + files.map((m) => { + if (m.statusNames !== undefined) { + if (m.statusNames && m.statusNames.indexOf(status) > -1) { + count++; + } + } + }); + return count; +} + +export const getFilesByStatus = (status: string, files: fileStatusResult[]): fileStatusResult[] => { + const result: fileStatusResult[] = [] + files.map((m) => { + if (m.statusNames !== undefined) { + if (m.statusNames && m.statusNames.indexOf(status) > -1) { + result.push(m) + } + } + }); + return result; +} + +export const getFilesWithNotModifiedStatus = (files: fileStatusResult[]): fileStatusResult[] => { + const result: fileStatusResult[] = [] + + + files.map((m) => { + + + if (m.statusNames !== undefined) { + if (m.statusNames && m.statusNames.indexOf("unmodified") === -1) { + result.push(m) + } + } + }); + return result; +} + +export const allChangedButNotStagedFiles = (files: fileStatusResult[]): fileStatusResult[] => { + let allfiles = getFilesWithNotModifiedStatus(files) + const staged = getFilesByStatus("staged", files) + allfiles = allfiles.filter((trackedFile) => { + return staged.findIndex((stagedFile) => stagedFile.filename === trackedFile.filename) === -1 + }) + return allfiles; +} + + +export const getFileStatusForFile = (filename: string, files: fileStatusResult[]) => { + for (let i: number = 0; i < files.length; i++) { + if (files[i].filename === filename) + return files[i].statusNames; + } +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts new file mode 100644 index 0000000000..d079b9e889 --- /dev/null +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -0,0 +1,619 @@ +import { ViewPlugin } from "@remixproject/engine-web"; +import { ReadBlobResult, ReadCommitResult } from "isomorphic-git"; +import React from "react"; +import { fileStatus, fileStatusMerge, setBranchCommits, setBranches, setCanCommit, setCommitChanges, setCommits, setCurrentBranch, setGitHubUser, setLoading, setRateLimit, setRemoteBranches, setRemotes, setRepos, setUpstream } from "../state/gitpayload"; +import { GitHubUser, RateLimit, branch, commitChange, gitActionDispatch, statusMatrixType } from '../types'; +import { removeSlash } from "../utils"; +import { disableCallBacks, enableCallBacks } from "./listeners"; +import { AlertModal, ModalTypes } from "@remix-ui/app"; +import { gitActionsContext } from "../state/context"; +import { gitPluginContext } from "../components/gitui"; +import { setFileDecorators } from "./pluginActions"; + +export const fileStatuses = [ + ["new,untracked", 0, 2, 0], // new, untracked + ["added,staged", 0, 2, 2], // + ["added,staged,with unstaged changes", 0, 2, 3], // added, staged, with unstaged changes + ["unmodified", 1, 1, 1], // unmodified + ["modified,unstaged", 1, 2, 1], // modified, unstaged + ["modified,staged", 1, 2, 2], // modified, staged + ["modified,staged,with unstaged changes", 1, 2, 3], // modified, staged, with unstaged changes + ["deleted,unstaged", 1, 0, 1], // deleted, unstaged + ["deleted,staged", 1, 0, 0], + //["deleted", 1, 1, 0], // deleted, staged + ["unmodified", 1, 1, 3], + ["deleted,not in git", 0, 0, 3], + ["unstaged,modified", 1, 2, 0] +]; + +const statusmatrix: statusMatrixType[] = fileStatuses.map((x: any) => { + return { + matrix: x.shift().split(","), + status: x, + }; +}); + +let plugin: ViewPlugin, dispatch: React.Dispatch + + +export const setPlugin = (p: ViewPlugin, dispatcher: React.Dispatch) => { + plugin = p + dispatch = dispatcher +} + +export const getBranches = async () => { + console.log('getBranches') + const branches = await plugin.call("dGitProvider", "branches"); + console.log('branches :>>', branches) + dispatch(setBranches(branches)); +} +export const getRemotes = async () => { + console.log('getRemotes') + const remotes = await plugin.call("dGitProvider", "remotes" as any); + console.log('remotes :>>', remotes) + dispatch(setRemotes(remotes)); +} + +export const setUpstreamRemote = async (remote: string) => { + dispatch(setUpstream(remote)); +} + +export const getFileStatusMatrix = async (filepaths: string[]) => { + const fileStatusResult = await statusMatrix(filepaths); + fileStatusResult.map((m) => { + statusmatrix.map((sm) => { + if (JSON.stringify(sm.status) === JSON.stringify(m.status)) { + //Utils.log(m, sm); + m.statusNames = sm.matrix; + } + }); + }); + //console.log(fileStatusResult); + if (!filepaths) { + dispatch(fileStatus(fileStatusResult)) + } else { + dispatch(fileStatusMerge(fileStatusResult)) + setFileDecorators(fileStatusResult) + } +} + +export const getCommits = async () => { + //Utils.log("get commits"); + console.log('getCommits') + try { + const commits: ReadCommitResult[] = await plugin.call( + "dGitProvider", + "log", + { ref: "HEAD" } + ); + console.log('commits :>>', commits) + return commits; + } catch (e) { + return []; + } +} + +export const gitlog = async () => { + let commits = [] + try { + commits = await getCommits() + } catch (e) { + } + dispatch(setCommits(commits)) + await showCurrentBranch() + await getGitHubUser() +} + +export const showCurrentBranch = async () => { + try { + const branch = await currentBranch(); + const currentcommitoid = await getCommitFromRef("HEAD"); + + + if (typeof branch === "undefined" || branch.name === "") { + //toast.warn(`You are in a detached state`); + plugin.call('notification', 'alert', { + type: 'warning', + title: 'You are in a detached state', + }) + branch.name = `HEAD detached at ${currentcommitoid}`; + //canCommit = false; + dispatch(setCanCommit(false)); + } else { + //canCommit = true; + dispatch(setCanCommit(true)); + dispatch(setCurrentBranch(branch)); + } + } catch (e) { + // show empty branch + } +} + +export const currentBranch = async () => { + // eslint-disable-next-line no-useless-catch + try { + const branch: branch = + (await plugin.call("dGitProvider", "currentbranch")) || ""; + return branch; + } catch (e) { + throw e; + } +} + +export const createBranch = async (name: string = "") => { + if (name) { + await plugin.call("dGitProvider", "branch", { ref: name }); + await plugin.call("dGitProvider", "checkout", { ref: name }); + } +} + +export const getCommitFromRef = async (ref: string) => { + const commitOid = await plugin.call("dGitProvider", "resolveref", { + ref: ref, + }); + return commitOid; +} + +const settingsWarning = async () => { + const username = await plugin.call('config' as any, 'getAppParameter', 'settings/github-user-name') + const email = await plugin.call('config' as any, 'getAppParameter', 'settings/github-email') + if (!username || !email) { + plugin.call('notification', 'toast', 'Please set your github username and email in the settings') + return false; + } else { + return { + username, + email + }; + } +} + +export const commit = async (message: string = "") => { + + try { + const credentials = await settingsWarning() + if (!credentials) { + dispatch(setLoading(false)) + return + } + + const sha = await plugin.call("dGitProvider", "commit", { + author: { + name: credentials.username, + email: credentials.email, + }, + message: message, + }); + plugin.call('notification', 'toast', `Commited: ${sha}`) + + } catch (err) { + plugin.call('notification', 'toast', `${err}`) + } + +} + +export const addall = async () => { + try { + await plugin + .call("dGitProvider", "status", { ref: "HEAD" }) + .then((status) => + Promise.all( + status.map(([filepath, , worktreeStatus]) => + worktreeStatus + ? plugin.call("dGitProvider", "add", { + filepath: removeSlash(filepath), + }) + : plugin.call("dGitProvider", "rm", { + filepath: removeSlash(filepath), + }) + ) + ) + ); + plugin.call('notification', 'toast', `Added all files to git`) + + } catch (e) { + plugin.call('notification', 'toast', `${e}`) + } +} + +export const add = async (args: string | undefined) => { + if (args !== undefined) { + let filename = args; // $(args[0].currentTarget).data('file') + let stagingfiles; + if (filename !== "/") { + filename = removeSlash(filename); + stagingfiles = [filename]; + } else { + await addall(); + return; + } + try { + for (const filepath of stagingfiles) { + try { + await plugin.call("dGitProvider", "add", { + filepath: removeSlash(filepath), + }); + } catch (e) { } + } + plugin.call('notification', 'toast', `Added ${filename} to git`); + } catch (e) { + plugin.call('notification', 'toast', `${e}`) + } + } +} + + +const getLastCommmit = async () => { + try { + let currentcommitoid = ""; + currentcommitoid = await getCommitFromRef("HEAD"); + return currentcommitoid; + } catch (e) { + return false; + } +} + + +export const rm = async (args: any) => { + const filename = args; + await plugin.call("dGitProvider", "rm", { + filepath: removeSlash(filename), + }); + plugin.call('notification', 'toast', `Removed ${filename} from git`) +} + + +export const checkoutfile = async (filename: string) => { + const oid = await getLastCommmit(); + if (oid) + try { + const commitOid = await plugin.call("dGitProvider", "resolveref", { + ref: oid, + }); + const { blob } = await plugin.call("dGitProvider", "readblob", { + oid: commitOid, + filepath: removeSlash(filename), + }); + const original = Buffer.from(blob).toString("utf8"); + //(original, filename); + await disableCallBacks(); + await plugin.call( + "fileManager", + "setFile", + removeSlash(filename), + original + ); + await enableCallBacks(); + } catch (e) { + plugin.call('notification', 'toast', `No such file`) + } +} + +export const checkout = async (cmd: any) => { + await disableCallBacks(); + await plugin.call('fileManager', 'closeAllFiles') + try { + await plugin.call("dGitProvider", "checkout", cmd); + gitlog(); + } catch (e) { + plugin.call('notification', 'toast', `${e}`) + } + await enableCallBacks(); +} + +export const clone = async (url: string, branch: string, depth: number, singleBranch: boolean) => { + console.log(url, branch, depth, singleBranch) + dispatch(setLoading(true)) + try { + await disableCallBacks() + // get last part of url + const urlParts = url.split("/"); + const lastPart = urlParts[urlParts.length - 1]; + const repoName = lastPart.split(".")[0]; + // add timestamp to repo name + const timestamp = new Date().getTime(); + const repoNameWithTimestamp = `${repoName}-${timestamp}`; + //const token = await tokenWarning(); + const token = await plugin.call('config' as any, 'getAppParameter', 'settings/gist-access-token') + //if (!token) { + // dispatch(setLoading(false)) + // return + //} else { + await plugin.call('dGitProvider' as any, 'clone', { url, branch, token, depth, singleBranch }, repoNameWithTimestamp); + await enableCallBacks() + plugin.call('notification', 'toast', `Cloned ${url} to ${repoNameWithTimestamp}`) + //} + } catch (e: any) { + await parseError(e) + } + dispatch(setLoading(false)) +} + +const tokenWarning = async () => { + const token = await plugin.call('config' as any, 'getAppParameter', 'settings/gist-access-token') + if (!token) { + const modalContent: AlertModal = { + message: 'Please set a token first in the GitHub settings of REMIX', + title: 'No GitHub token set', + id: 'no-token-set', + } + plugin.call('notification', 'alert', modalContent) + return false; + } else { + return token; + } +} + + +const parseError = async (e: any) => { + // if message conttains 401 Unauthorized, show token warning + if (e.message.includes('401')) { + const result = await plugin.call('notification', 'modal', { + title: 'The GitHub token may be missing or invalid', + message: 'Please check the GitHub token and try again. Error: 401 Unauthorized', + okLabel: 'Go to settings', + cancelLabel: 'Close', + type: ModalTypes.confirm + }) + console.log(result) + } + // if message contains 404 Not Found, show repo not found + else if (e.message.includes('404')) { + await plugin.call('notification', 'modal', { + title: 'Repository not found', + message: 'Please check the URL and try again.', + okLabel: 'Go to settings', + cancelLabel: 'Close', + type: ModalTypes.confirm + }) + } + // if message contains 403 Forbidden + else if (e.message.includes('403')) { + await plugin.call('notification', 'modal', { + title: 'The GitHub token may be missing or invalid', + message: 'Please check the GitHub token and try again. Error: 403 Forbidden', + okLabel: 'Go to settings', + cancelLabel: 'Close', + type: ModalTypes.confirm + }) + } else { + await plugin.call('notification', 'alert', { + title: 'Error', + message: e.message + }) + } +} + + + + +export const repositories = async () => { + try { + const token = await tokenWarning(); + if (token) { + const repos = await plugin.call('dGitProvider' as any, 'repositories', { token }); + dispatch(setRepos(repos)) + } + } catch (e) { + console.log(e) + plugin.call('notification', 'alert', { + title: 'Error getting repositories', + message: `${e.message}: Please check your GitHub token in the GitHub settings.` + }) + } +} + +export const remoteBranches = async (owner: string, repo: string) => { + try { + const token = await tokenWarning(); + if (token) { + const branches = await plugin.call('dGitProvider' as any, 'remotebranches', { token, owner, repo }); + dispatch(setRemoteBranches(branches)) + } + } catch (e) { + console.log(e) + plugin.call('notification', 'alert', { + title: 'Error', + message: e.message + }) + } +} + +export const remoteCommits = async (url: string, branch: string, length: number) => { + const urlParts = url.split("/"); + + console.log(urlParts, 'urlParts') + // check if it's github + if(!urlParts[urlParts.length - 3].includes('github')) { + return + } + + const owner = urlParts[urlParts.length - 2]; + const repo = urlParts[urlParts.length - 1].split(".")[0]; + + try { + const token = await tokenWarning(); + if (token) { + console.log(token, owner, repo, branch, length) + const commits = await plugin.call('dGitProvider' as any, 'remotecommits', { token, owner, repo, branch, length }); + console.log(commits, 'remote commits') + } + } catch (e) { + console.log(e) + plugin.call('notification', 'alert', { + title: 'Error', + message: e.message + }) + } +} + +export const getGitHubUser = async () => { + try { + const token = await tokenWarning(); + if (token) { + const data: { + user: GitHubUser, + ratelimit: RateLimit + } = await plugin.call('dGitProvider' as any, 'getGitHubUser', { token }); + + console.log('GET USER"', data) + + dispatch(setGitHubUser(data.user)) + dispatch(setRateLimit(data.ratelimit)) + } + } catch (e) { + console.log(e) + } +} + + + +export const statusMatrix = async (filepaths: string[]) => { + const matrix = await plugin.call("dGitProvider", "status", { ref: "HEAD", filepaths: filepaths || ['.'] }); + const result = (matrix || []).map((x) => { + return { + filename: `/${x.shift()}`, + status: x, + }; + }); + + return result; +} + +export const diffFiles = async (filename: string | undefined) => { + +} + +export const resolveRef = async (ref: string) => { + const oid = await plugin.call("dGitProvider", "resolveref", { + ref, + }); + return oid; +} + +export const diff = async (commitChange: commitChange) => { + + if (!commitChange.hashModified) { + const newcontent = await plugin.call( + "fileManager", + "readFile",// + removeSlash(commitChange.path) + ); + commitChange.modified = newcontent; + commitChange.readonly = false; + + } else { + + try { + const modifiedContentReadBlobResult: ReadBlobResult = await plugin.call("dGitProvider", "readblob", { + oid: commitChange.hashModified, + filepath: removeSlash(commitChange.path), + }); + + const modifiedContent = Buffer.from(modifiedContentReadBlobResult.blob).toString("utf8"); + console.log(modifiedContent) + commitChange.modified = modifiedContent; + commitChange.readonly = true; + } catch (e) { + commitChange.modified = ""; + } + } + + try { + const originalContentReadBlobResult: ReadBlobResult = await plugin.call("dGitProvider", "readblob", { + oid: commitChange.hashOriginal, + filepath: removeSlash(commitChange.path), + }); + + const originalContent = Buffer.from(originalContentReadBlobResult.blob).toString("utf8"); + console.log(originalContent) + commitChange.original = originalContent; + } catch (e) { + commitChange.original = ""; + } + + + + + /* + const fullfilename = args; // $(args[0].currentTarget).data('file') + try { + const commitOid = await client.call( + "dGitProvider", + "resolveref", + { ref: "HEAD" } + ); + + const { blob } = await client.call("dGitProvider", "readblob", { + oid: commitOid, + filepath: removeSlash(fullfilename), + }); + + const newcontent = await client.call( + "fileManager", + "readFile",// + removeSlash(fullfilename) + ); + + + // Utils.log(original); + //Utils.log(newcontent); + //const filediff = createPatch(filename, original, newcontent); // diffLines(original,newcontent) + ////Utils.log(filediff) + const filediff: diffObject = { + originalFileName: fullfilename, + updatedFileName: fullfilename, + current: newcontent, + past: original, + }; + + return filediff; + } catch (e) { + + + const filediff: diffObject = { + originalFileName: "", + updatedFileName: "", + current: "", + past: "", + }; + return filediff; + } + */ +} + +export const getCommitChanges = async (oid1: string, oid2: string) => { + const result: commitChange[] = await plugin.call('dGitProvider', 'getCommitChanges', oid1, oid2) + dispatch(setCommitChanges(result)) + return result +} + +export const fetchBranch = async (branch: branch) => { + const r = await plugin.call('dGitProvider', 'fetch', { + ref: branch.name, + remoteRef: branch.name, + singleBranch: true, + remote: branch.remote.remote, + depth: 10 + }) + const commits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { + ref: r.fetchHead + }) + console.log(r, commits) + dispatch(setBranchCommits({ branch, commits })) +} + +export const getBranchCommits = async (branch: branch) => { + try { + console.log(branch) + const commits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { + ref: branch.name, + }) + console.log(commits) + dispatch(setBranchCommits({ branch, commits })) + return commits + } catch (e) { + console.log(e) + await fetchBranch(branch) + } +} diff --git a/libs/remix-ui/git/src/lib/listeners.ts b/libs/remix-ui/git/src/lib/listeners.ts new file mode 100644 index 0000000000..255e32d66a --- /dev/null +++ b/libs/remix-ui/git/src/lib/listeners.ts @@ -0,0 +1,192 @@ + +import { ViewPlugin } from "@remixproject/engine-web"; +import React from "react"; +import { setCanUseApp, setLoading, setRepoName } from "../state/gitpayload"; +import { gitActionDispatch } from "../types"; +import { diffFiles, getBranches, getFileStatusMatrix, getGitHubUser, getRemotes, gitlog, setPlugin } from "./gitactions"; + +let plugin: ViewPlugin, gitDispatch: React.Dispatch, loaderDispatch: React.Dispatch +let callBackEnabled: boolean = false +let syncTimer: NodeJS.Timer = null + +export const setCallBacks = (viewPlugin: ViewPlugin, gitDispatcher: React.Dispatch, loaderDispatcher: React.Dispatch) => { + plugin = viewPlugin + gitDispatch = gitDispatcher + loaderDispatch = loaderDispatcher + + setPlugin(viewPlugin, gitDispatcher) + + plugin.on("fileManager", "fileSaved", async (file: string) => { + console.log(file) + loadFiles([file]) + //await synTimerStart(); + }); + + plugin.on('dGitProvider', 'checkout' as any, async () => { + await synTimerStart(); + }) + plugin.on('dGitProvider', 'branch' as any, async () => { + await synTimerStart(); + }) + + plugin.on("fileManager", "fileAdded", async (e) => { + await synTimerStart(); + }); + + plugin.on("fileManager", "fileRemoved", async (e) => { + await synTimerStart(); + }); + + plugin.on("fileManager", "currentFileChanged", async (e) => { + console.log('current file change', e) + //await synTimerStart(); + }); + + plugin.on("fileManager", "fileRenamed", async (oldfile, newfile) => { + await synTimerStart(); + }); + + plugin.on("filePanel", "setWorkspace", async (x: any) => { + await synTimerStart(); + }); + + plugin.on("filePanel", "deleteWorkspace" as any, async (x: any) => { + await synTimerStart(); + }); + + plugin.on("filePanel", "renameWorkspace" as any, async (x: any) => { + await synTimerStart(); + }); + + plugin.on('dGitProvider', 'checkout', async () => { + await loadFiles(); + }) + plugin.on('dGitProvider', 'init', async () => { + await loadFiles(); + }) + plugin.on('dGitProvider', 'add', async () => { + await loadFiles(); + }) + plugin.on('dGitProvider', 'rm', async () => { + await loadFiles(); + }) + plugin.on('dGitProvider', 'commit', async () => { + await loadFiles(); + }) + plugin.on('dGitProvider', 'branch', async () => { + await loadFiles(); + }) + plugin.on('dGitProvider', 'clone', async () => { + await loadFiles(); + }) + plugin.on('manager', 'pluginActivated', async (p: Plugin) => { + if (p.name === 'dGitProvider') { + getGitHubUser(); + plugin.off('manager', 'pluginActivated'); + } + }) + + plugin.on('config', 'configChanged', async () => { + await getGitConfig() + }) + plugin.on('settings', 'configChanged', async () => { + await getGitConfig() + }) + + + callBackEnabled = true; +} + +export const getGitConfig = async () => { + const username = await plugin.call('settings', 'get', 'settings/github-user-name') + const email = await plugin.call('settings', 'get', 'settings/github-email') + const token = await plugin.call('settings', 'get', 'settings/gist-access-token') + const config = { username, email, token } + //dispatch(setGitConfig(config)) + return config +} + +const syncFromWorkspace = async (isLocalhost = false) => { + //gitDispatch(setLoading(true)); + await disableCallBacks(); + if (isLocalhost) { + gitDispatch(setCanUseApp(false)); + gitDispatch(setLoading(false)); + await enableCallBacks(); + return; + } + try { + const workspace = await plugin.call( + "filePanel", + "getCurrentWorkspace" + ); + if (workspace.isLocalhost) { + gitDispatch(setCanUseApp(false)); + await enableCallBacks(); + return + } + + gitDispatch(setRepoName(workspace.name)); + gitDispatch(setCanUseApp(true)); + } catch (e) { + gitDispatch(setCanUseApp(false)); + } + await loadFiles(); + await enableCallBacks(); +} + +export const loadFiles = async (filepaths: string[] = null) => { + //gitDispatch(setLoading(true)); + + try { + await getFileStatusMatrix(filepaths); + } catch (e) { + // TODO: handle error + console.error(e); + } + try { + await gitlog(); + } catch (e) { } + try { + await getBranches(); + } catch (e) { } + try { + await getRemotes(); + } catch (e) { } + try { + //await getStorageUsed(); + } catch (e) { } + try { + //await diffFiles(''); + } catch (e) { } + //gitDispatch(setLoading(false)); +} + +const getStorageUsed = async () => { + try { + const storageUsed = await plugin.call("storage" as any, "getStorage" as any); + } catch (e) { + const storage: string = await plugin.call("dGitProvider", "localStorageUsed" as any); + const storageUsed = { + usage: parseFloat(storage) * 1000, + quota: 10000000, + }; + } +} + + + +export const disableCallBacks = async () => { + callBackEnabled = false; +} +export const enableCallBacks = async () => { + callBackEnabled = true; +} + +const synTimerStart = async () => { + if (!callBackEnabled) return + clearTimeout(syncTimer) + syncTimer = setTimeout(async () => { + await syncFromWorkspace(); + }, 1000) +} diff --git a/libs/remix-ui/git/src/lib/pluginActions.ts b/libs/remix-ui/git/src/lib/pluginActions.ts new file mode 100644 index 0000000000..78b7fd5ad7 --- /dev/null +++ b/libs/remix-ui/git/src/lib/pluginActions.ts @@ -0,0 +1,104 @@ +import { ViewPlugin } from "@remixproject/engine-web" +import { commitChange, fileStatusResult, gitActionDispatch, gitState } from "../types" +import { fileDecoration, fileDecorationType } from "@remix-ui/file-decorators" +import { removeSlash } from "../utils" +import path from "path" +import { getFilesByStatus, getFilesWithNotModifiedStatus } from "./fileHelpers" + +let plugin: ViewPlugin, gitDispatch: React.Dispatch, loaderDispatch: React.Dispatch + +export const setPlugin = (p: ViewPlugin, gitDispatcher: React.Dispatch, loaderDispatcher: React.Dispatch) => { + plugin = p + gitDispatch = gitDispatcher + loaderDispatch = loaderDispatcher +} + +export const statusChanged = (badges: number) => { + if(!plugin) return + plugin.emit('statusChanged', { + key: badges === 0 ? 'none' : badges, + type: badges === 0 ? '' : 'success', + title: 'Git changes' + }) +} + +export const openFile = async (path: string) => { + if(!plugin) return + await plugin.call('fileManager', 'open', path) +} + +export const openDiff = async (change: commitChange) => { + console.log('openDiff', change) + if(!plugin) return + plugin.call('fileManager', 'diff', change) +} + +export const saveToken = async (token: string) => { + if(!plugin) return + await plugin.call('config', 'setAppParameter', 'settings/gist-access-token', token) +} + + +export const setFileDecorators = async (files: fileStatusResult[]) => { + + if(!plugin) return + const modified = getFilesByStatus('modified', files) + const untracked = getFilesByStatus('untracked', files) + const unmodified = getFilesByStatus('unmodified', files) + + + await setModifiedDecorator(modified) + await setUntrackedDecorator(untracked) + unmodified.forEach((file) => { + clearFileDecorator(removeSlash(file.filename)) + }) +} + + +export const setModifiedDecorator = async (files: fileStatusResult[]) => { + const decorators: fileDecoration[] = [] + for (const file of files) { + const decorator: fileDecoration = { + path: removeSlash(file.filename), + isDirectory: false, + fileStateType: fileDecorationType.Custom, + fileStateLabelClass: 'text-warning', + fileStateIconClass: 'text-warning', + fileStateIcon: '', + text: 'M', + owner: 'git', + bubble: true, + comment: 'Modified' + } + decorators.push(decorator) + } + + await plugin.call('fileDecorator', 'setFileDecorators', decorators) +} + +export const setUntrackedDecorator = async (files: fileStatusResult[]) => { + const decorators: fileDecoration[] = [] + for (const file of files) { + const decorator: fileDecoration = { + path: removeSlash(file.filename), + isDirectory: false, + fileStateType: fileDecorationType.Custom, + fileStateLabelClass: 'text-success', + fileStateIconClass: 'text-success', + fileStateIcon: '', + text: 'U', + owner: 'git', + bubble: true, + comment: 'Untracked' + } + decorators.push(decorator) + } + + await plugin.call('fileDecorator', 'setFileDecorators', decorators) +} + +export const clearFileDecorator = async(path: string) => { + await plugin.call('fileDecorator', 'clearFileDecorators', path) +} + + diff --git a/libs/remix-ui/git/src/state/context.tsx b/libs/remix-ui/git/src/state/context.tsx new file mode 100644 index 0000000000..38b5c6a094 --- /dev/null +++ b/libs/remix-ui/git/src/state/context.tsx @@ -0,0 +1,39 @@ +import { ReadCommitResult } from "isomorphic-git" +import React from "react" +import { branch, commitChange } from "../types" + +export interface gitActions { + clone(url: string, path: string, depth: number, singleBranch: boolean): Promise + add(path: string): Promise + rm(path: string): Promise + commit(message: string): Promise + addall(): Promise + //push(): Promise + //pull(): Promise + //fetch(): Promise + repositories(): Promise + checkoutfile(file: string): Promise + checkout(cmd: any): Promise + createBranch(branch: string): Promise + remoteBranches(owner: string, repo: string): Promise + getCommitChanges(oid1: string, oid2: string): Promise + getBranchCommits(branch: branch): Promise + getGitHubUser(): Promise + diff(commitChange: commitChange): Promise + resolveRef(ref: string): Promise + setUpstreamRemote(upstream: string): Promise + getBranches: () => Promise + getRemotes: () => Promise +} + +export const gitActionsContext = React.createContext(null) + +export interface pluginActions { + statusChanged(data: any): void + loadFiles(): void + openFile(path: string): Promise + openDiff(change: commitChange): Promise + saveToken(token: string): Promise +} + +export const pluginActionsContext = React.createContext(null) \ No newline at end of file diff --git a/libs/remix-ui/git/src/state/gitpayload.ts b/libs/remix-ui/git/src/state/gitpayload.ts new file mode 100644 index 0000000000..c1281fcd2f --- /dev/null +++ b/libs/remix-ui/git/src/state/gitpayload.ts @@ -0,0 +1,130 @@ +import { ReadCommitResult } from "isomorphic-git" +import { GitHubUser, branch, commitChange, fileStatusResult, remote } from "../types" +import { Endpoints } from "@octokit/types" + +export const fileStatus = (files: fileStatusResult[]) => { + return { + type: 'FILE_STATUS', + payload: files + } +} + +export const fileStatusMerge = (files: fileStatusResult[]) => { + return { + type: 'FILE_STATUS_MERGE', + payload: files + } +} + +export const setCommits = (commits: ReadCommitResult[]) => { + return { + type: 'SET_COMMITS', + payload: commits + } +} + +export const setBranches = (branches: any[]) => { + return { + type: 'SET_BRANCHES', + payload: branches + } +} + +export const setRepos = (repos: any[]) => { + return { + type: 'SET_REPOS', + payload: repos + } +} + +export const setRemoteBranches = (branches: any[]) => { + return { + type: 'SET_REMOTE_BRANCHES', + payload: branches + } +} + +export const setGitHubUser = (user: any) => { + return { + type: 'SET_GITHUB_USER', + payload: user + } +} + +export const setRateLimit = (rateLimit: any) => { + return { + type: 'SET_RATE_LIMIT', + payload: rateLimit + } +} + +export const setGitHubAccessToken = (token: string) => { + return { + type: 'SET_GITHUB_ACCESS_TOKEN', + payload: token + } +} + + +export const setLoading = (loading: boolean) => { + return { + type: 'SET_LOADING', + payload: loading + } +} + +export const setCanUseApp = (canUseApp: boolean) => { + return { + type: 'SET_CAN_USE_APP', + payload: canUseApp + } +} + +export const setRepoName = (reponame: string) => { + return { + type: 'SET_REPO_NAME', + payload: reponame + } +} + +export const setCurrentBranch = (currentBranch: branch) => { + return { + type: 'SET_CURRENT_BRANCH', + payload: currentBranch + } +} + +export const setCanCommit = (canCommit: boolean) => { + return { + type: 'SET_CAN_COMMIT', + payload: canCommit + } +} + +export const setRemotes = (remotes: remote[]) => { + return { + type: 'SET_REMOTES', + payload: remotes + } +} + +export const setUpstream = (upstream: string) => { + return { + type: 'SET_UPSTREAM', + payload: upstream + } +} + +export const setCommitChanges = (commitChanges: commitChange[]) => { + return { + type: 'SET_COMMIT_CHANGES', + payload: commitChanges + } +} + +export const setBranchCommits =({branch, commits}) => { + return { + type: 'SET_BRANCH_COMMITS', + payload: { branch, commits } + } +} diff --git a/libs/remix-ui/git/src/state/gitreducer.tsx b/libs/remix-ui/git/src/state/gitreducer.tsx new file mode 100644 index 0000000000..671752142b --- /dev/null +++ b/libs/remix-ui/git/src/state/gitreducer.tsx @@ -0,0 +1,147 @@ +import { ReadCommitResult } from "isomorphic-git" +import { allChangedButNotStagedFiles, getFilesByStatus, getFilesWithNotModifiedStatus } from "../lib/fileHelpers" +import { branch, commitChange, defaultGitState, fileStatusResult, gitState, setBranchCommitsAction } from "../types" + +interface Action { + type: string + payload: any +} + +export const gitReducer = (state: gitState = defaultGitState, action: Action): gitState => { + ///console.log(action, state) + switch (action.type) { + + case 'FILE_STATUS': + return { + ...state, + fileStatusResult: action.payload, + staged: getFilesByStatus("staged", action.payload), + modified: getFilesByStatus("modified", action.payload), + untracked: getFilesByStatus("untracked", action.payload), + deleted: getFilesByStatus("deleted", action.payload), + allchangesnotstaged: allChangedButNotStagedFiles(action.payload) + } + + case 'FILE_STATUS_MERGE': + const filesStatusResults: fileStatusResult[] = action.payload + filesStatusResults.map((fileStatusResult: fileStatusResult) => { + const file = state.fileStatusResult.find( stateFile => { + return stateFile.filename === fileStatusResult.filename + }) + if(file){ + file.status = fileStatusResult.status + file.statusNames = fileStatusResult.statusNames + } + }) + + return {...state, + staged: getFilesByStatus("staged", state.fileStatusResult), + modified: getFilesByStatus("modified", state.fileStatusResult), + untracked: getFilesByStatus("untracked", state.fileStatusResult), + deleted: getFilesByStatus("deleted", state.fileStatusResult), + allchangesnotstaged: allChangedButNotStagedFiles(state.fileStatusResult) + } + + case 'SET_COMMITS': + return { + ...state, + commits: action.payload, + localCommitCount: action.payload.length + } + + case 'SET_BRANCHES': + return { + ...state, + branches: action.payload + } + + case 'SET_CURRENT_BRANCH': + return { + ...state, + currentBranch: action.payload + } + + case 'SET_CAN_USE_APP': + return { + ...state, + canUseApp: action.payload + } + case 'SET_REPO_NAME': + return { + ...state, + reponame: action.payload + } + case 'SET_LOADING': + return { + ...state, + loading: action.payload + } + + case 'SET_REPOS': + return { + ...state, + repositories: action.payload + } + + case 'SET_REMOTE_BRANCHES': + return { + ...state, + remoteBranches: action.payload + } + + case 'SET_CAN_COMMIT': + return { + ...state, + canCommit: action.payload + } + + case 'SET_REMOTES': + return { + ...state, + remotes: action.payload + } + + case 'SET_UPSTREAM': + return { + ...state, + upstream: action.payload + } + + case 'SET_COMMIT_CHANGES': + + action.payload.forEach((change: commitChange) => { + state.commitChanges.find((c) => c.hashModified === change.hashModified && c.hashOriginal === change.hashOriginal && c.path === change.path) ? null : state.commitChanges.push(change) + }) + + return { + ...state, + commitChanges: [...state.commitChanges] + } + + case 'SET_BRANCH_COMMITS': + state.branchCommits[(action as setBranchCommitsAction).payload.branch.name] = (action as setBranchCommitsAction).payload.commits + return { + ...state, + branchCommits: {...state.branchCommits} + } + + case 'SET_GITHUB_USER': + return { + ...state, + gitHubUser: action.payload + } + + case 'SET_RATE_LIMIT': + console.log("rate limit", action.payload) + return { + ...state, + rateLimit: action.payload + } + + case 'SET_GITHUB_ACCESS_TOKEN': + return { + ...state, + gitHubAccessToken: action.payload + } + } +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/state/loaderReducer.ts b/libs/remix-ui/git/src/state/loaderReducer.ts new file mode 100644 index 0000000000..dccd7439de --- /dev/null +++ b/libs/remix-ui/git/src/state/loaderReducer.ts @@ -0,0 +1,11 @@ +import { defaultLoaderState, loaderState } from "../types"; + +interface Action { + type: string + payload: any +} + +export const loaderReducer = (state: loaderState = defaultLoaderState, action: Action): loaderState => { + state[action.type] = action.payload + return state +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/style/index.css b/libs/remix-ui/git/src/style/index.css new file mode 100644 index 0000000000..973889c15c --- /dev/null +++ b/libs/remix-ui/git/src/style/index.css @@ -0,0 +1,36 @@ +.nav { + cursor: pointer; +} + +.pointer { + cursor: pointer; +} + +.long-and-truncated { + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + +.commit-navigation{ + align-items: center; +} + +.commit-navigation:hover { + background-color: var(--custom-select); +} + +.commitdetailsitem { + align-items: baseline; +} + +.gitfile:hover { + background-color : var(--custom-select); +} + +hr { + background-color: var(--custom-select); +} + + diff --git a/libs/remix-ui/git/src/types/index.ts b/libs/remix-ui/git/src/types/index.ts new file mode 100644 index 0000000000..8994199692 --- /dev/null +++ b/libs/remix-ui/git/src/types/index.ts @@ -0,0 +1,214 @@ +import { Endpoints } from "@octokit/types" +import { CommitObject, ReadCommitResult } from "isomorphic-git" + +export type GitHubUser = Endpoints["GET /user"]["response"]['data'] +export type RateLimit = Endpoints["GET /rate_limit"]["response"]["data"] + +export type gitState = { + currentBranch: branch + commits: ReadCommitResult[] + branch: string + canCommit: boolean + branches: branch[] + remotes: remote[] + fileStatusResult: fileStatusResult[] + canUseApp: boolean + loading: boolean + storageUsed: any + reponame: string + staged: fileStatusResult[] + untracked: fileStatusResult[] + deleted: fileStatusResult[] + modified: fileStatusResult[] + allchangesnotstaged: fileStatusResult[], + repositories: repository[] + remoteBranches: remoteBranch[] + commitChanges: commitChange[] + branchCommits: Record + syncStatus: syncStatus, + localCommitCount: number + remoteCommitCount: number + upstream: string + gitHubUser: GitHubUser + rateLimit: RateLimit + gitHubAccessToken: string +} + +export type loaderState = { + branches: boolean + remotes: boolean + commits: boolean + sourcecontrol: boolean +} + +export type commitChangeTypes = { + "deleted": "D" + "modified": "M" + "added": "A", + "unknown": "?" +} + +export enum syncStatus { + "sync" = "sync", + "publishBranch" = "publishBranch", + "none" = "none", +} + +export type commitChangeType = keyof commitChangeTypes + +export type commitChange = { + type: commitChangeType + path: string, + hashModified : string, + hashOriginal : string, + original?: string, + modified?: string, + readonly?: boolean +} + +export type repository = { + name: string + html_url: string + owner: { + login: string + }, + full_name: string + default_branch: string + id: number +} + +export type branch = { + name: string + remote: remote +} + +export type remote = { + remote: string + url: string +} + +export type remoteBranch = { + name: string +} + +export const defaultGitState: gitState = { + currentBranch: { name: "", remote: { remote: "", url: "" } }, + commits: [], + branch: "", + canCommit: true, + branches: [], + remotes: [], + fileStatusResult: [], + staged: [], + untracked: [], + deleted: [], + modified: [], + allchangesnotstaged: [], + canUseApp: false, + loading: false, + storageUsed: {}, + reponame: "", + repositories: [], + remoteBranches: [], + commitChanges: [], + branchCommits: {}, + syncStatus: syncStatus.none, + localCommitCount: 0, + remoteCommitCount: 0, + upstream: "", + gitHubUser: {} as GitHubUser, + rateLimit: {} as RateLimit, + gitHubAccessToken: "" +} + +export const defaultLoaderState: loaderState = { + branches: false, + commits: false, + sourcecontrol: false, + remotes: false +} + +export type fileStatusResult = { + filename:string, + status?: fileStatus + statusNames?:string[] +} + +export type fileStatus =[string, 0 | 1, 0 | 1 | 2, 0 | 1 | 2 | 3] + +export type statusMatrixType = { matrix: string[] | undefined; status: string[] } + +export type sourceControlGroup = { + group: fileStatusResult[], + name: string +} + +export interface fileStatusAction { + type: string, + payload: fileStatusResult[] +} + +export interface setCommitsAction { + type: string, + payload: ReadCommitResult[] +} + +export interface setBranchesAction { + type: string, + payload: any[] +} + +export interface setReposAction { + type: string, + payload: any[] +} + +export interface setRemoteBranchesAction { + type: string, + payload: any[] +} + +export interface setGitHubUserAction { + type: string, + payload: any +} + +export interface setLoadingAction { + type: string, + payload: boolean +} + +export interface setCanUseAppAction { + type: string, + payload: boolean +} + +export interface setRepoNameAction { + type: string, + payload: string +} + +export interface setCurrentBranchAction { + type: string, + payload: branch +} + +export interface setRemotesAction { + type: string, + payload: remote[] +} + +export interface setUpstreamAction { + type: string, + payload: string +} + +export interface setBranchCommitsAction { + type: string, + payload: { + branch: branch, + commits: ReadCommitResult[] + } +} + +export type gitActionDispatch = setUpstreamAction | setBranchCommitsAction | setRemotesAction | setCurrentBranchAction | fileStatusAction | setLoadingAction | setCanUseAppAction | setRepoNameAction | setCommitsAction | setBranchesAction | setReposAction | setRemoteBranchesAction \ No newline at end of file diff --git a/libs/remix-ui/git/src/types/styles.ts b/libs/remix-ui/git/src/types/styles.ts new file mode 100644 index 0000000000..928a981dff --- /dev/null +++ b/libs/remix-ui/git/src/types/styles.ts @@ -0,0 +1,53 @@ +import { StylesConfig } from 'react-select' +export const selectStyles: StylesConfig = { + option: (baseStyles, state) => { + return { + ...baseStyles, + color: 'var(--text)', + } + }, + input(base, props) { + return { + ...base, + color: 'var(--text)', + } + }, + singleValue: (baseStyles, state) => { + return { + ...baseStyles, + color: 'var(--text)', + } + }, + control: (baseStyles, state) => ({ + ...baseStyles, + color: 'var(--text)', + backgroundColor: 'var(--custom-select)', + border: 'none', + }), + menu: (baseStyles, state) => { + return { + ...baseStyles, + backgroundColor: 'var(--custom-select)', + color: 'var(--text)', + } + }, + menuList: (baseStyles, props) => { + return { + ...baseStyles, + backgroundColor: 'var(--custom-select)', + color: 'var(--text)', + } + }, +} + +export const selectTheme = (theme) => ({ + ...theme, + borderRadius: 0, + colors: { + ...theme.colors, + primary25: 'var(--primary)', + primary: 'var(--primary)', + primary50: 'var(--primary)', + primary75: 'var(--primary)', + }, +}) \ No newline at end of file diff --git a/libs/remix-ui/git/src/utils/index.ts b/libs/remix-ui/git/src/utils/index.ts new file mode 100644 index 0000000000..d203c6efe5 --- /dev/null +++ b/libs/remix-ui/git/src/utils/index.ts @@ -0,0 +1,3 @@ +export const removeSlash = (s: string) => { + return s.replace(/^\/+/, ""); + }; From afce79d418c1308dcb5fdfd8b4823d4d837b45e0 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 08:35:27 +0100 Subject: [PATCH 02/71] add git plugin --- apps/remix-ide/src/app/plugins/git.tsx | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 apps/remix-ide/src/app/plugins/git.tsx diff --git a/apps/remix-ide/src/app/plugins/git.tsx b/apps/remix-ide/src/app/plugins/git.tsx new file mode 100644 index 0000000000..b2e33bddf1 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/git.tsx @@ -0,0 +1,33 @@ +'use strict' +import { ViewPlugin } from '@remixproject/engine-web'; +import React from 'react' // eslint-disable-line +import { gitState, GitUI } from '@remix-ui/git'; + +const profile = { + name: 'dgit', + desciption: 'Git plugin for Remix', + methods: ['pull', 'track', 'diff', 'clone', 'open'], + events: [''], + version: '0.0.1', + location: 'sidePanel', + icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIxLjAwNyA4LjIyMTY4QzIxLjAxMDUgNy41Mjc5MiAyMC44MjA3IDYuODQ2ODkgMjAuNDU5MSA2LjI1NDg1QzIwLjA5NzQgNS42NjI4MSAxOS41NzggNS4xODMxNSAxOC45NTkyIDQuODY5NTdDMTguMzQwMyA0LjU1NiAxNy42NDYzIDQuNDIwOTEgMTYuOTU1MSA0LjQ3OTQxQzE2LjI2MzcgNC41Mzc5MyAxNS42MDI1IDQuNzg3NzMgMTUuMDQ1IDUuMjAwODVDMTQuNDg3NyA1LjYxMzk3IDE0LjA1NjMgNi4xNzQwOSAxMy43OTkzIDYuODE4NUMxMy41NDI0IDcuNDYyOSAxMy40Njk3IDguMTY2MTMgMTMuNTg5OCA4Ljg0OTQ0QzEzLjcwOTkgOS41MzI3NCAxNC4wMTc3IDEwLjE2OTIgMTQuNDc4OSAxMC42ODc0QzE0Ljk0MDIgMTEuMjA1NiAxNS41MzY3IDExLjU4NTIgMTYuMjAxNSAxMS43ODM2QzE1Ljk1NiAxMi4yODI0IDE1LjU3NjMgMTIuNzAzIDE1LjEwNDkgMTIuOTk3OUMxNC42MzM2IDEzLjI5MjkgMTQuMDg5NCAxMy40NTA1IDEzLjUzMzQgMTMuNDUzMkgxMC41NDRDOS40MzcyNiAxMy40NTcxIDguMzcxNjMgMTMuODcyNyA3LjU1NDUxIDE0LjYxOTFWNy4zOTgwOUM4LjQ2MTg0IDcuMjEyODggOS4yNjgwOCA2LjY5NzM3IDkuODE2OTIgNS45NTE1MUMxMC4zNjU4IDUuMjA1NjUgMTAuNjE4MSA0LjI4MjU2IDEwLjUyNSAzLjM2MTIxQzEwLjQzMTkgMi40Mzk4NyAxMC4wMDAxIDEuNTg1OSA5LjMxMzE2IDAuOTY0ODczQzguNjI2MjQgMC4zNDM4NDUgNy43MzMxOSAwIDYuODA3MTYgMEM1Ljg4MTEyIDAgNC45ODgwNyAwLjM0Mzg0NSA0LjMwMTE0IDAuOTY0ODczQzMuNjE0MjIgMS41ODU5IDMuMTgyMzYgMi40Mzk4NyAzLjA4OTI4IDMuMzYxMjFDMi45OTYyIDQuMjgyNTYgMy4yNDg1NSA1LjIwNTY1IDMuNzk3MzkgNS45NTE1MUM0LjM0NjIzIDYuNjk3MzcgNS4xNTI0NyA3LjIxMjg4IDYuMDU5OCA3LjM5ODA5VjE2LjUxNTlDNS4xNTQxOCAxNi42ODkxIDQuMzQzMjMgMTcuMTg3NyAzLjc3OTkzIDE3LjkxNzZDMy4yMTY2MyAxOC42NDc2IDIuOTM5OTIgMTkuNTU4NSAzLjAwMTk3IDIwLjQ3ODVDMy4wNjQwMyAyMS4zOTg0IDMuNDYwNTcgMjIuMjYzOSA0LjExNjggMjIuOTExNUM0Ljc3MzAzIDIzLjU1OTIgNS42NDM2IDIzLjk0NDQgNi41NjQyNyAyMy45OTQ0QzcuNDg0OTYgMjQuMDQ0NSA4LjM5MjExIDIzLjc1NTggOS4xMTQ2NCAyMy4xODNDOS44MzcxOCAyMi42MTAyIDEwLjMyNTEgMjEuNzkyOCAxMC40ODY1IDIwLjg4NUMxMC42NDc4IDE5Ljk3NzEgMTAuNDcxNCAxOS4wNDE3IDkuOTkwNDggMTguMjU1QzkuNTA5NTcgMTcuNDY4MyA4Ljc1NzQxIDE2Ljg4NDggNy44NzU4OCAxNi42MTQ1QzguMTIxNzYgMTYuMTE2MiA4LjUwMTY3IDE1LjY5NjMgOC45NzI5NiAxNS40MDE5QzkuNDQ0MjYgMTUuMTA3NCA5Ljk4ODI3IDE0Ljk1MDMgMTAuNTQ0IDE0Ljk0NzlIMTMuNTMzNEMxNC40NjYxIDE0Ljk0MzYgMTUuMzc0MiAxNC42NDg2IDE2LjEzMTMgMTQuMTAzOUMxNi44ODg0IDEzLjU1OTIgMTcuNDU2OCAxMi43OTIgMTcuNzU3NSAxMS45MDkxQzE4LjY1MzQgMTEuNzkxNCAxOS40NzYzIDExLjM1MjggMjAuMDczOCAxMC42NzQ4QzIwLjY3MTMgOS45OTY4IDIxLjAwMjggOS4xMjUzMyAyMS4wMDcgOC4yMjE2OFpNNC41NjUwOCAzLjczNzUyQzQuNTY1MDggMy4yOTQwOCA0LjY5NjU3IDIuODYwNiA0Ljk0MjkzIDIuNDkxOUM1LjE4OTMgMi4xMjMxOSA1LjUzOTQ3IDEuODM1ODEgNS45NDkxNSAxLjY2NjExQzYuMzU4ODQgMS40OTY0MiA2LjgwOTY1IDEuNDUyMDIgNy4yNDQ1NiAxLjUzODU0QzcuNjc5NDggMS42MjUwNCA4LjA3ODk4IDEuODM4NTcgOC4zOTI1NCAyLjE1MjE0QzguNzA2MTEgMi40NjU3IDguOTE5NjQgMi44NjUyIDkuMDA2MTUgMy4zMDAxMkM5LjA5MjY2IDMuNzM1MDQgOS4wNDgyNyA0LjE4NTg1IDguODc4NTcgNC41OTU1M0M4LjcwODg3IDUuMDA1MjEgOC40MjE0OSA1LjM1NTM5IDguMDUyNzggNS42MDE3NUM3LjY4NDA4IDUuODQ4MTEgNy4yNTA2IDUuOTc5NiA2LjgwNzE2IDUuOTc5NkM2LjIxMjUyIDUuOTc5NiA1LjY0MjI0IDUuNzQzMzkgNS4yMjE3NyA1LjMyMjkxQzQuODAxMjkgNC45MDI0NSA0LjU2NTA4IDQuMzMyMTYgNC41NjUwOCAzLjczNzUyWk05LjA0OTIzIDIwLjE3OTRDOS4wNDkyMyAyMC42MjI5IDguOTE3NzQgMjEuMDU2MyA4LjY3MTM4IDIxLjQyNUM4LjQyNTAxIDIxLjc5MzcgOC4wNzQ4NSAyMi4wODExIDcuNjY1MTYgMjIuMjUwOEM3LjI1NTQ3IDIyLjQyMDUgNi44MDQ2NiAyMi40NjQ5IDYuMzY5NzUgMjIuMzc4NEM1LjkzNDgzIDIyLjI5MiA1LjUzNTMzIDIyLjA3ODQgNS4yMjE3NyAyMS43NjQ4QzQuOTA4MjEgMjEuNDUxMiA0LjY5NDY3IDIxLjA1MTcgNC42MDgxNiAyMC42MTY5QzQuNTIxNjUgMjAuMTgxOSA0LjU2NjA1IDE5LjczMTEgNC43MzU3NSAxOS4zMjE0QzQuOTA1NDUgMTguOTExNyA1LjE5MjgyIDE4LjU2MTUgNS41NjE1MyAxOC4zMTUyQzUuOTMwMjMgMTguMDY4OSA2LjM2MzcxIDE3LjkzNzMgNi44MDcxNiAxNy45MzczQzcuNDAxNzkgMTcuOTM3MyA3Ljk3MjA3IDE4LjE3MzYgOC4zOTI1NCAxOC41OTRDOC44MTMwMiAxOS4wMTQ1IDkuMDQ5MjMgMTkuNTg0OCA5LjA0OTIzIDIwLjE3OTRaTTE3LjI3MDIgMTAuNDYzOEMxNi44MjY3IDEwLjQ2MzggMTYuMzkzMyAxMC4zMzIyIDE2LjAyNDYgMTAuMDg1OUMxNS42NTU5IDkuODM5NTQgMTUuMzY4NSA5LjQ4OTM3IDE1LjE5ODggOS4wNzk2OUMxNS4wMjkxIDguNjcgMTQuOTg0NyA4LjIxOTIgMTUuMDcxMiA3Ljc4NDI3QzE1LjE1NzYgNy4zNDkzNSAxNS4zNzEyIDYuOTQ5ODUgMTUuNjg0OCA2LjYzNjI5QzE1Ljk5ODQgNi4zMjI3MyAxNi4zOTc5IDYuMTA5MTkgMTYuODMyNyA2LjAyMjY4QzE3LjI2NzcgNS45MzYxNyAxNy43MTg1IDUuOTgwNTggMTguMTI4MSA2LjE1MDI3QzE4LjUzNzkgNi4zMTk5NyAxOC44ODgxIDYuNjA3MzQgMTkuMTM0NCA2Ljk3NjA1QzE5LjM4MDcgNy4zNDQ3NiAxOS41MTIzIDcuNzc4MjMgMTkuNTEyMyA4LjIyMTY4QzE5LjUxMjMgOC44MTYzMiAxOS4yNzYgOS4zODY2IDE4Ljg1NTYgOS44MDcwNkMxOC40MzUxIDEwLjIyNzUgMTcuODY0OCAxMC40NjM4IDE3LjI3MDIgMTAuNDYzOFoiIGZpbGw9IiM0MjQyNDIiLz4KPC9zdmc+Cg==" +} + + +export class GitPlugin extends ViewPlugin { + + constructor() { + + super(profile) + } + + onDeactivation(): void { + this.call('fileDecorator', 'clearFileDecorators') + this.call('manager', 'activatePlugin', 'dGitProvider') + } + + render() { + return
+ } + +} From 097f528d29b8efbf8f9c520e8796facad1f1c4cf Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 08:37:19 +0100 Subject: [PATCH 03/71] add dgit to app.js --- apps/remix-ide/src/app.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 6f01181fa5..017cceb9b3 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -57,6 +57,7 @@ import { electronTemplates } from './app/plugins/electron/templatesPlugin' import { xtermPlugin } from './app/plugins/electron/xtermPlugin' import { ripgrepPlugin } from './app/plugins/electron/ripgrepPlugin' import { compilerLoaderPlugin, compilerLoaderPluginDesktop } from './app/plugins/electron/compilerLoaderPlugin' +import { GitPlugin } from './app/plugins/git' import {OpenAIGpt} from './app/plugins/openaigpt' @@ -222,6 +223,9 @@ class AppComponent { //---- templates const templates = new TemplatesPlugin() + //---- git + const git = new GitPlugin() + //---------------- Solidity UML Generator ------------------------- const solidityumlgen = new SolidityUmlGen(appManager) @@ -360,7 +364,8 @@ class AppComponent { solidityScript, templates, openaigpt, - copilotSuggestion + copilotSuggestion, + git ]) //---- fs plugin @@ -496,7 +501,7 @@ class AppComponent { ]) await this.appManager.activatePlugin(['settings']) - await this.appManager.activatePlugin(['walkthrough', 'storage', 'search', 'compileAndRun', 'recorder']) + await this.appManager.activatePlugin(['walkthrough', 'storage', 'search', 'compileAndRun', 'recorder', 'dgit']) await this.appManager.activatePlugin(['solidity-script', 'remix-templates']) if (isElectron()){ From a769356ee15c645f5cda1d901b755fb01cb1357d Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 08:38:27 +0100 Subject: [PATCH 04/71] add appman hack --- apps/remix-ide/src/remixAppManager.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/remix-ide/src/remixAppManager.js b/apps/remix-ide/src/remixAppManager.js index 19716a2f84..126cb1926a 100644 --- a/apps/remix-ide/src/remixAppManager.js +++ b/apps/remix-ide/src/remixAppManager.js @@ -243,6 +243,7 @@ export class RemixAppManager extends PluginManager { const res = await fetch(this.pluginsDirectory) plugins = await res.json() plugins = plugins.filter((plugin) => { + if (plugin.name === 'dgit') return false if (plugin.targets && Array.isArray(plugin.targets) && plugin.targets.length > 0) { return plugin.targets.includes('remix') } From eded03fbcf15a92293cdd23d4b290dd1c1b70793 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 08:46:13 +0100 Subject: [PATCH 05/71] add git to tsconfig paths --- tsconfig.paths.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tsconfig.paths.json b/tsconfig.paths.json index 9fc27276d1..d4cc2cdee1 100644 --- a/tsconfig.paths.json +++ b/tsconfig.paths.json @@ -163,7 +163,9 @@ "@remix-ui/xterm": [ "libs/remix-ui/xterm/src/index.ts" ], - + "@remix-ui/git": [ + "libs/remix-ui/git/src/index.ts" + ] } } } From 236b3095f4167ac3123770718f81f2fc24cf3335 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 09:27:43 +0100 Subject: [PATCH 06/71] octokit dgitprovider --- apps/remix-ide/src/app/files/dgitProvider.ts | 140 ++++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index b741860cdb..d62fc2b018 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -15,6 +15,8 @@ import path from 'path' import FormData from 'form-data' import axios from 'axios' import {Registry} from '@remix-project/remix-lib' +import { Octokit, App } from "octokit"; +import { commitChange, GitHubUser, RateLimit } from '@remix-ui/git' const profile = { name: 'dGitProvider', @@ -22,7 +24,8 @@ const profile = { description: 'Decentralized git provider', icon: 'assets/img/fileManager.webp', version: '0.0.1', - methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version', 'updateSubmodules'], + methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version', 'updateSubmodules' + , 'getGitHubUser', 'remotebranches', 'remotecommits', 'repositories', 'getCommitChanges'], kind: 'file-system' } class DGitProvider extends Plugin { @@ -233,6 +236,60 @@ class DGitProvider extends Plugin { return status } + async getCommitChanges(commitHash1, commitHash2): Promise { + //console.log([git.TREE({ ref: commitHash1 }), git.TREE({ ref: commitHash2 })]) + const result: commitChange[] = await git.walk({ + ...await this.getGitConfig(), + trees: [git.TREE({ ref: commitHash1 }), git.TREE({ ref: commitHash2 })], + map: async function (filepath, [A, B]) { + // ignore directories + + //console.log(filepath, A, B) + + if (filepath === '.') { + return + } + try { + if ((A && await A.type()) === 'tree' || B && (await B.type()) === 'tree') { + return + } + } catch (e) { + // ignore + } + + // generate ids + const Aoid = A && await A.oid() || undefined + const Boid = B && await B.oid() || undefined + + const commitChange: Partial = { + hashModified: commitHash1, + hashOriginal: commitHash2, + path: filepath, + } + + // determine modification type + if (Aoid !== Boid) { + commitChange.type = "modified" + } + if (Aoid === undefined) { + commitChange.type = "deleted" + } + if (Boid === undefined) { + commitChange.type = "added" + } + if (Aoid === undefined && Boid === undefined) { + commitChange.type = "unknown" + } + if (commitChange.type) + return commitChange + else + return undefined + }, + }) + //console.log(result) + return result + } + async remotes(config) { if ((Registry.getInstance().get('platform').api.isDesktop())) { return await this.call('isogit', 'remotes', config) @@ -939,6 +996,87 @@ class DGitProvider extends Plugin { } return result } + + // OCTOKIT FEATURES + + async remotebranches(input: { owner: string, repo: string, token: string }) { + console.log(input) + + const octokit = new Octokit({ + auth: input.token + }) + + const data = await octokit.request('GET /repos/{owner}/{repo}/branches{?protected,per_page,page}', { + owner: input.owner, + repo: input.repo, + per_page: 100 + }) + console.log(data) + return data.data + } + + async getGitHubUser(input: { token: string }): Promise<{ + user: GitHubUser, + ratelimit: RateLimit + }> { + const octokit = new Octokit({ + auth: input.token + }) + + const ratelimit = await octokit.request('GET /rate_limit', { + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + // epoch timestamp to local date time + const localResetTime = ratelimit.data.rate.reset * 1000 + const localResetTimeString = new Date(localResetTime).toLocaleString() + + + console.log('rate limit', localResetTimeString) + + const user = await octokit.request('GET /user') + + return { + user: user.data, + ratelimit: ratelimit.data + } + } + + async remotecommits(input: { owner: string, repo: string, token: string, branch: string, length: number }): Promise { + const octokit = new Octokit({ + auth: input.token + }) + + const data = await octokit.request('GET /repos/{owner}/{repo}/commits', { + owner: input.owner, + repo: input.repo, + sha: input.branch, + per_page: input.length + }) + + + return data.data + } + + async repositories(input: { token: string }) { + const octokit = new Octokit({ + auth: input.token + }) + + const data = await octokit.request('GET /user/repos{?visibility,affiliation,type,sort,direction,per_page,page,since,before}', { + sort: "pushed", + direction: "desc", + per_page: 100, + affiliation: "owner,collaborator" + }) + + + octokit + + return data.data + } + } const addSlash = (file) => { From 51b2d20cb84f13bb8357e8c71a28fdc450d3f32d Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 09:57:40 +0100 Subject: [PATCH 07/71] add react select --- package.json | 1 + yarn.lock | 171 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 167 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 887f70c51a..138f4b022c 100644 --- a/package.json +++ b/package.json @@ -215,6 +215,7 @@ "react-markdown": "^8.0.5", "react-multi-carousel": "^2.8.2", "react-router-dom": "^6.16.0", + "react-select": "^5.8.0", "react-tabs": "^6.0.2", "react-virtualized": "^9.22.5", "react-virtuoso": "^4.6.2", diff --git a/yarn.lock b/yarn.lock index 80e97b8efc..1334930c10 100644 --- a/yarn.lock +++ b/yarn.lock @@ -423,6 +423,13 @@ dependencies: "@babel/types" "^7.21.4" +"@babel/helper-module-imports@^7.16.7": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" @@ -1663,6 +1670,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.12.0", "@babel/runtime@^7.18.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.14.8": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" @@ -2139,6 +2153,94 @@ minimatch "^3.0.4" plist "^3.0.4" +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.8.1": + version "11.11.3" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" + integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0" + integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + "@erebos/bzz-node@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@erebos/bzz-node/-/bzz-node-0.13.0.tgz#495240c8b4fa67fa920c52a2d8db2cf82e673e1a" @@ -2872,6 +2974,26 @@ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== +"@floating-ui/core@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@^1.0.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.1.tgz#d552e8444f77f2d88534372369b3771dc3a2fa5d" + integrity sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + "@formatjs/ecma402-abstract@1.11.7": version "1.11.7" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.7.tgz#47f1a854f679f813d9baa1ee55adae94880ec706" @@ -6442,7 +6564,7 @@ "@types/history" "*" "@types/react" "*" -"@types/react-transition-group@^4.4.1": +"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.1": version "4.4.10" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== @@ -8653,6 +8775,15 @@ babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + babel-plugin-module-resolver@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" @@ -14497,6 +14628,11 @@ find-cache-dir@^3.3.2: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -16096,7 +16232,7 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -19916,6 +20052,11 @@ memfs@^3.4.1, memfs@^3.4.3: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + memoizee@^0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" @@ -23746,7 +23887,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.0.0, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -24373,6 +24514,21 @@ react-router@6.21.0: dependencies: "@remix-run/router" "1.14.0" +react-select@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.0.tgz#bd5c467a4df223f079dd720be9498076a3f085b5" + integrity sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.1.2" + react-tabs@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-6.0.2.tgz#bc1065c3828561fee285a8fd045f22e0fcdde1eb" @@ -24390,7 +24546,7 @@ react-textarea-autosize@~8.3.2: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react-transition-group@^4.4.1: +react-transition-group@^4.3.0, react-transition-group@^4.4.1: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -27147,6 +27303,11 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + stylus-loader@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-7.1.0.tgz#19e09a98b19075c246e6e3f65e38b8cb89d2d6fb" @@ -28614,7 +28775,7 @@ use-composed-ref@^1.3.0: resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== -use-isomorphic-layout-effect@^1.1.1: +use-isomorphic-layout-effect@^1.1.1, use-isomorphic-layout-effect@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== From 933ae65fb8d55fa11e9f9b53111960b6bc69f448 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 12 Feb 2024 13:34:11 +0100 Subject: [PATCH 08/71] font awesome --- apps/remix-ide/src/app/files/dgitProvider.ts | 6 ++++- package.json | 4 +++ yarn.lock | 26 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index d62fc2b018..669a28e78b 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -15,7 +15,9 @@ import path from 'path' import FormData from 'form-data' import axios from 'axios' import {Registry} from '@remix-project/remix-lib' -import { Octokit, App } from "octokit"; +import { Octokit, App } from "octokit" +import { OctokitResponse } from '@octokit/types' +import { Endpoints } from "@octokit/types" import { commitChange, GitHubUser, RateLimit } from '@remix-ui/git' const profile = { @@ -1048,6 +1050,8 @@ class DGitProvider extends Plugin { auth: input.token }) + + const data = await octokit.request('GET /repos/{owner}/{repo}/commits', { owner: input.owner, repo: input.repo, diff --git a/package.json b/package.json index 138f4b022c..99632b458a 100644 --- a/package.json +++ b/package.json @@ -136,6 +136,9 @@ "@ethereumjs/util": "^8.0.5", "@ethereumjs/vm": "^6.4.1", "@ethersphere/bee-js": "^3.2.0", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@isomorphic-git/lightning-fs": "^4.4.1", "@microlink/react-json-view": "^1.23.0", "@openzeppelin/contracts": "^5.0.0", @@ -270,6 +273,7 @@ "@nrwl/web": "15.7.1", "@nrwl/webpack": "15.7.1", "@nrwl/workspace": "15.7.1", + "@octokit/types": "^12.4.0", "@openzeppelin/contracts-upgradeable": "^5.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@svgr/webpack": "^6.5.1", diff --git a/yarn.lock b/yarn.lock index 1334930c10..d9ffa721d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3064,11 +3064,37 @@ intl-messageformat "10.1.0" tslib "2.4.0" +"@fortawesome/fontawesome-common-types@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz#fdb1ec4952b689f5f7aa0bffe46180bb35490032" + integrity sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A== + "@fortawesome/fontawesome-free@^5.8.1": version "5.15.4" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== +"@fortawesome/fontawesome-svg-core@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz#9d56d46bddad78a7ebb2043a97957039fcebcf0a" + integrity sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.1" + +"@fortawesome/free-solid-svg-icons@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz#737b8d787debe88b400ab7528f47be333031274a" + integrity sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.1" + +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" From 63c15f03d61686e1e56316476fd27ae19b27cf8f Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 15 Feb 2024 09:00:53 +0100 Subject: [PATCH 09/71] translations --- apps/remix-ide/src/app/files/dgitProvider.ts | 154 +++++------------- .../src/app/tabs/locales/en/git.json | 15 ++ .../src/app/tabs/locales/en/index.js | 4 +- apps/remix-ide/src/assets/list.json | 15 +- libs/remix-ui/git/src/components/gitui.tsx | 7 - .../src/components/navigation/commands.tsx | 6 +- .../git/src/components/navigation/commits.tsx | 6 +- .../components/navigation/remotesdetails.tsx | 4 +- .../components/navigation/sourcecontrol.tsx | 12 +- .../components/panels/commands/pushpull.tsx | 6 +- .../git/src/components/panels/github.tsx | 12 +- .../components/panels/githubcredentials.tsx | 8 +- libs/remix-ui/git/src/lib/gitactions.ts | 2 +- .../workspace/src/lib/actions/workspace.ts | 11 +- 14 files changed, 106 insertions(+), 156 deletions(-) create mode 100644 apps/remix-ide/src/app/tabs/locales/en/git.json diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index 669a28e78b..12c9d35693 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -18,8 +18,11 @@ import {Registry} from '@remix-project/remix-lib' import { Octokit, App } from "octokit" import { OctokitResponse } from '@octokit/types' import { Endpoints } from "@octokit/types" -import { commitChange, GitHubUser, RateLimit } from '@remix-ui/git' - +import { IndexedDBStorage } from './filesystems/indexedDB' +import { GitHubUser, RateLimit, branch, commitChange, remote } from '@remix-ui/git' +declare global { + interface Window { remixFileSystemCallback: IndexedDBStorage; remixFileSystem: any; } +} const profile = { name: 'dGitProvider', displayName: 'Decentralized git', @@ -338,10 +341,32 @@ class DGitProvider extends Plugin { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const name = await git.currentBranch(cmd) + console.log('current branch', name) + let remote: remote = undefined + try { + const remoteName = await git.getConfig({ + ...defaultConfig, + path: `branch.${name}.remote` + }) + if (remoteName) + { + const remoteUrl = await git.getConfig({ + ...defaultConfig, + path: `remote.${remoteName}.url` + }) + remote = { remote: remoteName, url: remoteUrl } + } + + } catch (e) { + // do nothing + } - return name + return { + remote: remote, + name: name || '' + } } catch (e) { - return '' + return undefined } } @@ -746,7 +771,7 @@ class DGitProvider extends Plugin { const files = await this.getDirectory('/') this.filesToSend = [] for (const file of files) { - const c = await window.remixFileSystem.readFile(`${workspace.absolutePath}/${file}`) + const c = await window.remixFileSystem.readFile(`${workspace.absolutePath}/${file}`, null) const ob = { path: file, content: c @@ -760,108 +785,6 @@ class DGitProvider extends Plugin { return r.cid.string } - async pin(pinataApiKey, pinataSecretApiKey) { - const workspace = await this.call('filePanel', 'getCurrentWorkspace') - const files = await this.getDirectory('/') - this.filesToSend = [] - - const data = new FormData() - for (const file of files) { - const c = await window.remixFileSystem.readFile(`${workspace.absolutePath}/${file}`) - data.append('file', new Blob([c]), `base/${file}`) - } - // get last commit data - let ob - try { - const commits = await this.log({ ref: 'HEAD' }) - ob = { - ref: commits[0].oid, - message: commits[0].commit.message, - commits: JSON.stringify(commits.map((commit) => { - return { - oid: commit.oid, - commit: { - parent: commit.commit?.parent, - tree: commit.commit?.tree, - message: commit.commit?.message, - committer: { - timestamp: commit.commit?.committer?.timestamp - } - } - } - })) - } - } catch (e) { - ob = { - ref: 'no commits', - message: 'no commits' - } - } - const today = new Date() - const metadata = JSON.stringify({ - name: `remix - ${workspace.name} - ${today.toLocaleString()}`, - keyvalues: ob - }) - const pinataOptions = JSON.stringify({ - wrapWithDirectory: false - }) - data.append('pinataOptions', pinataOptions) - data.append('pinataMetadata', metadata) - const url = 'https://api.pinata.cloud/pinning/pinFileToIPFS' - try { - const result = await axios - .post(url, data, { - maxBodyLength: 'Infinity', - headers: { - 'Content-Type': `multipart/form-data; boundary=${(data as any)._boundary}`, - pinata_api_key: pinataApiKey, - pinata_secret_api_key: pinataSecretApiKey - } - } as any).catch((e) => { - console.log(e) - }) - // also commit to remix IPFS for availability after pinning to Pinata - return await this.export(this.remixIPFS) || (result as any).data.IpfsHash - } catch (error) { - throw new Error(error) - } - } - - async pinList(pinataApiKey, pinataSecretApiKey) { - const url = 'https://api.pinata.cloud/data/pinList?status=pinned' - try { - const result = await axios - .get(url, { - maxBodyLength: 'Infinity', - headers: { - pinata_api_key: pinataApiKey, - pinata_secret_api_key: pinataSecretApiKey - } - } as any).catch((e) => { - console.log('Pinata unreachable') - }) - return (result as any).data - } catch (error) { - throw new Error(error) - } - } - - async unPin(pinataApiKey, pinataSecretApiKey, hashToUnpin) { - const url = `https://api.pinata.cloud/pinning/unpin/${hashToUnpin}` - try { - await axios - .delete(url, { - headers: { - pinata_api_key: pinataApiKey, - pinata_secret_api_key: pinataSecretApiKey - } - }) - return true - } catch (error) { - throw new Error(error) - } - } - async importIPFSFiles(config, cid, workspace) { const ipfs = IpfsHttpClient(config) let result = false @@ -882,7 +805,7 @@ class DGitProvider extends Plugin { await this.createDirectories(`${workspace.absolutePath}/${dir}`) } catch (e) { throw new Error(e) } try { - await window.remixFileSystem.writeFile(`${workspace.absolutePath}/${file.path}`, Buffer.concat(content) || new Uint8Array()) + await window.remixFileSystem.writeFile(`${workspace.absolutePath}/${file.path}`, Buffer.concat(content) || new Uint8Array(), null) } catch (e) { throw new Error(e) } } } catch (e) { @@ -948,7 +871,7 @@ class DGitProvider extends Plugin { const files = await this.getDirectory('/') this.filesToSend = [] for (const file of files) { - const c = await window.remixFileSystem.readFile(`${workspace.absolutePath}/${file}`) + const c = await window.remixFileSystem.readFile(`${workspace.absolutePath}/${file}`, null) zip.file(file, c) } await zip.generateAsync({ @@ -1064,20 +987,19 @@ class DGitProvider extends Plugin { } async repositories(input: { token: string }) { + console.log(input) const octokit = new Octokit({ auth: input.token }) + + console.log('octokit', input.token) - const data = await octokit.request('GET /user/repos{?visibility,affiliation,type,sort,direction,per_page,page,since,before}', { - sort: "pushed", - direction: "desc", + const data = await octokit.request('GET /user/repos', { per_page: 100, - affiliation: "owner,collaborator" + page: 1 }) - - octokit - + console.log(data.data) return data.data } diff --git a/apps/remix-ide/src/app/tabs/locales/en/git.json b/apps/remix-ide/src/app/tabs/locales/en/git.json new file mode 100644 index 0000000000..2ccdb2e2ba --- /dev/null +++ b/apps/remix-ide/src/app/tabs/locales/en/git.json @@ -0,0 +1,15 @@ +{ + "git.push": "push", + "git.pull": "pull", + "git.commit": "commit", + "git.sync": "sync", + "git.publish": "publish", + "git.ignore": "ignore", + "git.createBranch": "create branch", + "git.deleteBranch": "delete branch", + "git.mergeBranch": "merge branch", + "git.rebaseBranch": "rebase branch", + "git.checkout": "checkout", + "git.fetch": "fetch", + "git.refresh": "refresh" +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/tabs/locales/en/index.js b/apps/remix-ide/src/app/tabs/locales/en/index.js index 8da7dd179f..31c606f7a7 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/index.js +++ b/apps/remix-ide/src/app/tabs/locales/en/index.js @@ -15,6 +15,7 @@ import solUmlGenJson from './solUmlGen.json' import remixAppJson from './remixApp.json' import remixUiTabsJson from './remixUiTabs.json' import circuitJson from './circuit.json'; +import gitJson from './git.json' export default { ...debuggerJson, @@ -33,5 +34,6 @@ export default { ...solUmlGenJson, ...remixAppJson, ...remixUiTabsJson, - ...circuitJson + ...circuitJson, + ...gitJson } diff --git a/apps/remix-ide/src/assets/list.json b/apps/remix-ide/src/assets/list.json index 7c75a856e5..b22d882d4b 100644 --- a/apps/remix-ide/src/assets/list.json +++ b/apps/remix-ide/src/assets/list.json @@ -1079,9 +1079,22 @@ "bzzr://6e70fe6bfe8c3fc63f8a3eba733731aab129e6e58828b78058e53bb50440709b", "dweb:/ipfs/QmZy5ho8W943FMGwppXZFS1WFrVwV3UXhUUwcD7oH5vrYe" ] + }, + { + "path": "soljson-v0.8.24+commit.e11b9ed9.js", + "version": "0.8.24", + "build": "commit.e11b9ed9", + "longVersion": "0.8.24+commit.e11b9ed9", + "keccak256": "0x1b6ceeabad21bbb2011ba13373160f7c4d46c11371a354243ee1be07159345f3", + "sha256": "0x11b054b55273ec55f6ab3f445eb0eb2c83a23fed43d10079d34ac3eabe6ed8b1", + "urls": [ + "bzzr://c604bdd6384bf73594cd0e5cfbe979048191549ebc88e70996346f3b744c0680", + "dweb:/ipfs/QmW2SQbEhiz3n2qV5iL8WBgzapv6cXjkLStvTMpCZhvr2x" + ] } ], "releases": { + "0.8.24": "soljson-v0.8.24+commit.e11b9ed9.js", "0.8.23": "soljson-v0.8.23+commit.f704f362.js", "0.8.22": "soljson-v0.8.22+commit.4fc1097e.js", "0.8.21": "soljson-v0.8.21+commit.d9974bed.js", @@ -1173,5 +1186,5 @@ "0.4.0": "soljson-v0.4.0+commit.acd334c9.js", "0.3.6": "soljson-v0.3.6+commit.3fc68da5.js" }, - "latestRelease": "0.8.23" + "latestRelease": "0.8.24" } \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx index 32cfe7c321..0c15769cfb 100644 --- a/libs/remix-ui/git/src/components/gitui.tsx +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -162,13 +162,6 @@ export const GitUI = (props: IGitUi) => {
- - - <> - - - -
<> diff --git a/libs/remix-ui/git/src/components/navigation/commands.tsx b/libs/remix-ui/git/src/components/navigation/commands.tsx index 0ab669fd63..1d69ca9c01 100644 --- a/libs/remix-ui/git/src/components/navigation/commands.tsx +++ b/libs/remix-ui/git/src/components/navigation/commands.tsx @@ -32,13 +32,13 @@ export const CommandsNavigation = ({ eventKey, activePanel, callback }) => { { activePanel === eventKey ? - }> + }> - }> + }> - }> + }> : null diff --git a/libs/remix-ui/git/src/components/navigation/commits.tsx b/libs/remix-ui/git/src/components/navigation/commits.tsx index 4b3f455e03..8d07175748 100644 --- a/libs/remix-ui/git/src/components/navigation/commits.tsx +++ b/libs/remix-ui/git/src/components/navigation/commits.tsx @@ -31,13 +31,13 @@ export const CommitslNavigation = ({ eventKey, activePanel, callback }) => { { activePanel === eventKey ? - }> + }> - }> + }> - }> + }> : null diff --git a/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx b/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx index 4665e6d281..60ef11aa17 100644 --- a/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx +++ b/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx @@ -34,7 +34,9 @@ export const RemotesDetailsNavigation = (props: RemotesDetailsNavigationProps) = { activePanel === eventKey ? : } -
{remote.remote} {remote.url}
+
+ {remote.remote} {remote.url} +
{remote?.url && openRemote()}>} diff --git a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx index bd21c3e6e0..c7c83b46f9 100644 --- a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx +++ b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx @@ -32,16 +32,16 @@ export const SourceControlNavigation = ({ eventKey, activePanel, callback }) => { activePanel === eventKey ? - }> - - - }> + }> - }> + }> + + + }> - }> + }> diff --git a/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx b/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx index 22adc81dc2..ca6ed1c8ae 100644 --- a/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx +++ b/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx @@ -97,9 +97,9 @@ export const PushPull = () => {
- - - + + +
diff --git a/libs/remix-ui/git/src/components/panels/github.tsx b/libs/remix-ui/git/src/components/panels/github.tsx index 8d7958c1b9..57ce6938b6 100644 --- a/libs/remix-ui/git/src/components/panels/github.tsx +++ b/libs/remix-ui/git/src/components/panels/github.tsx @@ -13,7 +13,7 @@ export const GitHubAuth = () => { const [gitHubResponse, setGitHubResponse] = React.useState(null) const [authorized, setAuthorized] = React.useState(false) - + const client_id = 'Iv1.12fc02c69c512462'// 'e90cf20e6cafa2fd71ea' const getDeviceCodeFromGitHub = async () => { @@ -23,7 +23,7 @@ export const GitHubAuth = () => { method: 'post', url: 'http://0.0.0.0:3000/github.com/login/device/code', data: { - client_id: 'Iv1.12fc02c69c512462' + client_id // : 'Iv1.12fc02c69c512462' }, headers: { 'Content-Type': 'application/json', @@ -44,9 +44,9 @@ export const GitHubAuth = () => { method: 'post', url: 'http://0.0.0.0:3000/github.com/login/oauth/access_token', data: { - client_id: 'Iv1.12fc02c69c512462', + client_id,// : 'Iv1.12fc02c69c512462', device_code: gitHubResponse.device_code, - grant_type: 'urn:ietf:params:oauth:grant-type:device_code' + grant_type: 'urn:ietf:params:oauth:grant-type:device_code', }, headers: { 'Content-Type': 'application/json', @@ -93,7 +93,7 @@ export const GitHubAuth = () => { {(context.gitHubUser && context.gitHubUser.login) ? null : + }}>Sign in with GitHub } {gitHubResponse && !authorized &&
@@ -120,7 +120,7 @@ export const GitHubAuth = () => {
+ }}>Sign out
: null } { diff --git a/libs/remix-ui/git/src/components/panels/githubcredentials.tsx b/libs/remix-ui/git/src/components/panels/githubcredentials.tsx index 3e23b56988..de7bb09d94 100644 --- a/libs/remix-ui/git/src/components/panels/githubcredentials.tsx +++ b/libs/remix-ui/git/src/components/panels/githubcredentials.tsx @@ -41,13 +41,15 @@ export const GitHubCredentials = () => { return ( <> -
- +
+ +
+
- handleChangeUserNameState(e.target.value)} value={githubUsername} className="form-control mb-2" placeholder="GitHub username" type="text" id="githubUsername" /> + handleChangeUserNameState(e.target.value)} value={githubUsername} className="form-control mb-1" placeholder="GitHub username" type="text" id="githubUsername" /> handleChangeEmailState(e.target.value)} value={githubEmail} className="form-control mb-1" placeholder="GitHub email" type="text" id="githubEmail" />
diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index d079b9e889..d9bc95baa8 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -337,7 +337,7 @@ const tokenWarning = async () => { title: 'No GitHub token set', id: 'no-token-set', } - plugin.call('notification', 'alert', modalContent) + //plugin.call('notification', 'alert', modalContent) return false; } else { return token; diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 3a932a8f9d..4bc4220107 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -42,6 +42,7 @@ import { IndexedDBStorage } from '../../../../../../apps/remix-ide/src/app/files import { getUncommittedFiles } from '../utils/gitStatusFilter' import { AppModal, ModalTypes } from '@remix-ui/app' import { contractDeployerScripts, etherscanScripts } from '@remix-project/remix-ws-templates' +import { branch } from '@remix-ui/git' declare global { interface Window { @@ -151,7 +152,7 @@ export const createWorkspace = async ( if (isGitRepo && createCommit) { const name = await plugin.call('settings', 'get', 'settings/github-user-name') const email = await plugin.call('settings', 'get', 'settings/github-email') - const currentBranch = await plugin.call('dGitProvider', 'currentbranch') + const currentBranch: branch = await plugin.call('dGitProvider', 'currentbranch') if (!currentBranch) { if (!name || !email) { @@ -673,8 +674,8 @@ export const checkGit = async () => { dispatch(setCurrentWorkspaceIsGitRepo(isGitRepo)) dispatch(setCurrentWorkspaceHasGitSubmodules(hasGitSubmodule)) await refreshBranches() - const currentBranch = await plugin.call('dGitProvider', 'currentbranch') - dispatch(setCurrentWorkspaceCurrentBranch(currentBranch)) + const currentBranch: branch = await plugin.call('dGitProvider', 'currentbranch') + dispatch(setCurrentWorkspaceCurrentBranch(currentBranch.name)) } catch (e) {} } @@ -711,8 +712,8 @@ export const getGitRepoCurrentBranch = async (workspaceName: string) => { fs: window.remixFileSystemCallback, dir: addSlash(workspaceName), } - const currentBranch: string = await plugin.call('dGitProvider', 'currentbranch', { ...gitConfig }) - return currentBranch + const currentBranch: branch = await plugin.call('dGitProvider', 'currentbranch', { ...gitConfig }) + return currentBranch.name } export const showAllBranches = async () => { From 88cef7b6bf56d28248df5957a3a3f5285caae498 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 23 Feb 2024 08:19:23 +0100 Subject: [PATCH 10/71] context --- libs/remix-ui/git/src/components/gitui.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx index 0c15769cfb..19141d5e97 100644 --- a/libs/remix-ui/git/src/components/gitui.tsx +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useReducer, useState } from 'react' -import { add, addall, checkout, checkoutfile, clone, commit, createBranch, remoteBranches, repositories, rm, getCommitChanges, diff, resolveRef, getBranchCommits, setUpstreamRemote, getGitHubUser, getBranches, getRemotes, remoteCommits } from '../lib/gitactions' +import { add, addall, checkout, checkoutfile, clone, commit, createBranch, remoteBranches, repositories, rm, getCommitChanges, diff, resolveRef, getBranchCommits, setUpstreamRemote, getGitHubUser, getBranches, getRemotes, remoteCommits, saveGitHubCredentials, getGitHubCredentials, fetch, pull, push } from '../lib/gitactions' import { loadFiles, setCallBacks } from '../lib/listeners' import { openDiff, openFile, saveToken, setModifiedDecorator, setPlugin, setUntrackedDecorator, statusChanged } from '../lib/pluginActions' import { gitActionsContext, pluginActionsContext } from '../state/context' @@ -45,6 +45,7 @@ export const GitUI = (props: IGitUi) => { useEffect(() => { setCallBacks(plugin, gitDispatch, loaderDispatch) setPlugin(plugin, gitDispatch, loaderDispatch) + loaderDispatch({ type: 'plugin', payload: true }) console.log(props) }, []) @@ -71,7 +72,7 @@ export const GitUI = (props: IGitUi) => { async function updatestate(){ console.log('updatestate', gitState) - if(gitState.currentBranch.remote.url){ + if(gitState.currentBranch && gitState.currentBranch.remote && gitState.currentBranch.remote.url){ remoteCommits(gitState.currentBranch.remote.url, gitState.currentBranch.name, 1) } } @@ -100,7 +101,10 @@ export const GitUI = (props: IGitUi) => { setUpstreamRemote, getGitHubUser, getBranches, - getRemotes + getRemotes, + fetch, + pull, + push } const pluginActionsProviderValue = { @@ -108,7 +112,9 @@ export const GitUI = (props: IGitUi) => { loadFiles, openFile, openDiff, - saveToken + saveToken, + saveGitHubCredentials, + getGitHubCredentials } return ( From 82caba939fccb6ae768c34153fdd18d2532e5db9 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 23 Feb 2024 10:40:59 +0100 Subject: [PATCH 11/71] refactor --- apps/remix-ide/src/app/files/dgitProvider.ts | 197 ++++++++++-------- .../components/navigation/branchedetails.tsx | 8 +- .../src/components/panels/commands/fetch.tsx | 5 +- .../components/panels/commands/pushpull.tsx | 4 +- .../git/src/components/panels/github.tsx | 107 +--------- .../components/panels/githubcredentials.tsx | 57 +++-- .../src/components/panels/remotesimport.tsx | 19 +- .../src/components/panels/repositories.tsx | 17 +- .../src/components/panels/tokenWarning.tsx | 12 ++ libs/remix-ui/git/src/lib/gitactions.ts | 147 +++++++++++-- libs/remix-ui/git/src/lib/listeners.ts | 4 +- libs/remix-ui/git/src/state/context.tsx | 16 +- libs/remix-ui/git/src/state/gitpayload.ts | 7 + libs/remix-ui/git/src/types/index.ts | 11 +- 14 files changed, 372 insertions(+), 239 deletions(-) create mode 100644 libs/remix-ui/git/src/components/panels/tokenWarning.tsx diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index 12c9d35693..63ac21e868 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -14,22 +14,27 @@ import JSZip from 'jszip' import path from 'path' import FormData from 'form-data' import axios from 'axios' -import {Registry} from '@remix-project/remix-lib' +import { Registry } from '@remix-project/remix-lib' import { Octokit, App } from "octokit" import { OctokitResponse } from '@octokit/types' import { Endpoints } from "@octokit/types" import { IndexedDBStorage } from './filesystems/indexedDB' import { GitHubUser, RateLimit, branch, commitChange, remote } from '@remix-ui/git' +import { LibraryProfile, StatusEvents } from '@remixproject/plugin-utils' +import { ITerminal } from '@remixproject/plugin-api/src/lib/terminal' + declare global { interface Window { remixFileSystemCallback: IndexedDBStorage; remixFileSystem: any; } } -const profile = { + + +const profile: LibraryProfile = { name: 'dGitProvider', displayName: 'Decentralized git', description: 'Decentralized git provider', icon: 'assets/img/fileManager.webp', version: '0.0.1', - methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version', 'updateSubmodules' + methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pull', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version', 'updateSubmodules' , 'getGitHubUser', 'remotebranches', 'remotecommits', 'repositories', 'getCommitChanges'], kind: 'file-system' } @@ -63,7 +68,7 @@ class DGitProvider extends Plugin { this.ipfsSources = [this.remixIPFS, this.globalIPFSConfig, this.ipfsconfig] } - async getGitConfig(dir = '') { + async addIsomorphicGitConfigFS(dir = '') { if ((Registry.getInstance().get('platform').api.isDesktop())) { return { @@ -81,14 +86,15 @@ class DGitProvider extends Plugin { } } - async parseInput(input) { + async addIsomorphicGitConfig(input) { + const token = await this.call('config' as any, 'getAppParameter', 'settings/gist-access-token') return { corsProxy: 'https://corsproxy.remixproject.org/', http, onAuth: url => { url const auth = { - username: input.token, + username: input.token || token, password: '' } return auth @@ -96,6 +102,33 @@ class DGitProvider extends Plugin { } } + async getCommandUser(input) { + const author = { + name: '', + email: '' + } + if (input && input.name && input.email) { + author.name = input.name + author.email = input.email + } else { + const username = await this.call('config' as any, 'getAppParameter', 'settings/github-user-name') + const email = await this.call('config' as any, 'getAppParameter', 'settings/github-email') + const token = await this.call('config' as any, 'getAppParameter', 'settings/gist-access-token') + if (username && email) { + author.name = username + author.email = email + } else if (token) { + console.log('token', token) + const gitHubUser = await this.getGitHubUser({ token }) + console.log('gitHubUser', gitHubUser) + if (gitHubUser) { + author.name = gitHubUser.user.login + } + } + } + return author + } + async init(input?) { if ((Registry.getInstance().get('platform').api.isDesktop())) { await this.call('isogit', 'init', { @@ -106,7 +139,7 @@ class DGitProvider extends Plugin { } await git.init({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), defaultBranch: (input && input.branch) || 'main' }) this.emit('init') @@ -131,7 +164,7 @@ class DGitProvider extends Plugin { const status = await git.statusMatrix({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) @@ -144,7 +177,7 @@ class DGitProvider extends Plugin { await this.call('isogit', 'add', cmd) } else { await git.add({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) } @@ -158,7 +191,7 @@ class DGitProvider extends Plugin { await this.call('isogit', 'rm', cmd) } else { await git.remove({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) this.emit('rm') @@ -172,7 +205,7 @@ class DGitProvider extends Plugin { await this.call('isogit', 'reset', cmd) } else { await git.resetIndex({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) this.emit('rm') @@ -187,7 +220,7 @@ class DGitProvider extends Plugin { } else { const gitmodules = await this.parseGitmodules() || [] await git.checkout({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) const newgitmodules = await this.parseGitmodules() || [] @@ -197,14 +230,14 @@ class DGitProvider extends Plugin { return newmodule.name === module.name }) }) - + for (const module of toRemove) { - const path = (await this.getGitConfig(module.path)).dir + const path = (await this.addIsomorphicGitConfigFS(module.path)).dir if (await window.remixFileSystem.exists(path)) { const stat = await window.remixFileSystem.stat(path) try { if (stat.isDirectory()) { - await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) + await window.remixFileSystem.unlink((await this.addIsomorphicGitConfigFS(module.path)).dir) } } catch (e) { // do nothing @@ -234,7 +267,7 @@ class DGitProvider extends Plugin { const status = await git.log({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd, depth: 10 }) @@ -244,7 +277,7 @@ class DGitProvider extends Plugin { async getCommitChanges(commitHash1, commitHash2): Promise { //console.log([git.TREE({ ref: commitHash1 }), git.TREE({ ref: commitHash2 })]) const result: commitChange[] = await git.walk({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), trees: [git.TREE({ ref: commitHash1 }), git.TREE({ ref: commitHash2 })], map: async function (filepath, [A, B]) { // ignore directories @@ -300,9 +333,9 @@ class DGitProvider extends Plugin { return await this.call('isogit', 'remotes', config) } - let remotes = [] + let remotes: remote[] = [] try { - remotes = await git.listRemotes({ ...config ? config : await this.getGitConfig() }) + remotes = await git.listRemotes({ ...config ? config : await this.addIsomorphicGitConfigFS() }) } catch (e) { // do nothing } @@ -316,7 +349,7 @@ class DGitProvider extends Plugin { status = await this.call('isogit', 'branch', cmd) } else { status = await git.branch({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) } @@ -331,14 +364,12 @@ class DGitProvider extends Plugin { async currentbranch(config) { - - if ((Registry.getInstance().get('platform').api.isDesktop())) { return await this.call('isogit', 'currentbranch') } try { - const defaultConfig = await this.getGitConfig() + const defaultConfig = await this.addIsomorphicGitConfigFS() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const name = await git.currentBranch(cmd) console.log('current branch', name) @@ -348,8 +379,7 @@ class DGitProvider extends Plugin { ...defaultConfig, path: `branch.${name}.remote` }) - if (remoteName) - { + if (remoteName) { const remoteUrl = await git.getConfig({ ...defaultConfig, path: `remote.${remoteName}.url` @@ -377,14 +407,14 @@ class DGitProvider extends Plugin { } try { - const defaultConfig = await this.getGitConfig() + const defaultConfig = await this.addIsomorphicGitConfigFS() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const remotes = await this.remotes(config) - let branches = [] + let branches: branch[] = [] branches = (await git.listBranches(cmd)).map((branch) => { return { remote: undefined, name: branch } }) for (const remote of remotes) { cmd.remote = remote.remote - const remotebranches = (await git.listBranches(cmd)).map((branch) => { return { remote: remote.remote, name: branch } }) + const remotebranches = (await git.listBranches(cmd)).map((branch) => { return { remote: remote, name: branch } }) branches = [...branches, ...remotebranches] } return branches @@ -409,7 +439,7 @@ class DGitProvider extends Plugin { await this.init() try { const sha = await git.commit({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) this.emit('commit') @@ -427,7 +457,7 @@ class DGitProvider extends Plugin { } const filesInStaging = await git.listFiles({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) return filesInStaging @@ -440,7 +470,7 @@ class DGitProvider extends Plugin { } const oid = await git.resolveRef({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) return oid @@ -452,7 +482,7 @@ class DGitProvider extends Plugin { return readBlobResult } const readBlobResult = await git.readBlob({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd }) @@ -481,7 +511,7 @@ class DGitProvider extends Plugin { await this.call('isogit', 'addremote', { url: input.url, remote: input.remote }) return } - await git.addRemote({ ...await this.getGitConfig(), url: input.url, remote: input.remote }) + await git.addRemote({ ...await this.addIsomorphicGitConfigFS(), url: input.url, remote: input.remote }) } async delremote(input) { @@ -489,7 +519,7 @@ class DGitProvider extends Plugin { await this.call('isogit', 'delremote', { remote: input.remote }) return } - await git.deleteRemote({ ...await this.getGitConfig(), remote: input.remote }) + await git.deleteRemote({ ...await this.addIsomorphicGitConfigFS(), remote: input.remote }) } async localStorageUsed() { @@ -510,11 +540,11 @@ class DGitProvider extends Plugin { input } this.call('terminal', 'logHtml', `Cloning ${input.url}... please wait...`) - try{ + try { const result = await this.call('isogit', 'clone', cmd) this.call('fs', 'openWindow', folder) return result - }catch(e){ + } catch (e) { this.call('notification', 'alert', { id: 'dgitAlert', message: 'Unexpected error while cloning the repository: \n' + e.toString(), @@ -530,8 +560,8 @@ class DGitProvider extends Plugin { singleBranch: input.singleBranch, ref: input.branch, depth: input.depth || 10, - ...await this.parseInput(input), - ...await this.getGitConfig() + ...await this.addIsomorphicGitConfig(input), + ...await this.addIsomorphicGitConfigFS() } this.call('terminal', 'logHtml', `Cloning ${input.url}...`) const result = await git.clone(cmd) @@ -545,12 +575,12 @@ class DGitProvider extends Plugin { } } - async parseGitmodules (dir = '') { + async parseGitmodules(dir = '') { try { const gitmodules = await this.call('fileManager', 'readFile', path.join(dir, '.gitmodules')) if (gitmodules) { const lines = gitmodules.split('\n') - let currentModule:any = {} + let currentModule: any = {} const modules = [] for (let line of lines) { line = line.trim() @@ -585,7 +615,7 @@ class DGitProvider extends Plugin { if (gitmodules) { for (const module of gitmodules) { const dir = path.join(currentDir, module.path) - const targetPath = (await this.getGitConfig(dir)).dir + const targetPath = (await this.addIsomorphicGitConfigFS(dir)).dir if (await window.remixFileSystem.exists(targetPath)) { const stat = await window.remixFileSystem.stat(targetPath) try { @@ -600,7 +630,7 @@ class DGitProvider extends Plugin { for (const module of gitmodules) { const dir = path.join(currentDir, module.path) // if url contains git@github.com: convert it - if(module.url && module.url.startsWith('git@github.com:')) { + if (module.url && module.url.startsWith('git@github.com:')) { module.url = module.url.replace('git@github.com:', 'https://github.com/') } try { @@ -608,51 +638,52 @@ class DGitProvider extends Plugin { url: module.url, singleBranch: true, depth: 1, - ...await this.parseInput(input), - ...await this.getGitConfig(dir) + ...await this.addIsomorphicGitConfig(input), + ...await this.addIsomorphicGitConfigFS(dir) } this.call('terminal', 'logHtml', `Cloning submodule ${dir}...`) await git.clone(cmd) this.call('terminal', 'logHtml', `Cloned successfully submodule ${dir}...`) - + const commitHash = await git.resolveRef({ - ...await this.getGitConfig(currentDir), + ...await this.addIsomorphicGitConfigFS(currentDir), ref: 'HEAD' }) const result = await git.walk({ - ...await this.getGitConfig(currentDir), + ...await this.addIsomorphicGitConfigFS(currentDir), trees: [git.TREE({ ref: commitHash })], map: async function (filepath, [A]) { - if(filepath === module.path) { + if (filepath === module.path) { return await A.oid() } } }) - if(result && result.length) { + if (result && result.length) { this.call('terminal', 'logHtml', `Checking out submodule ${dir} to ${result[0]} in directory ${dir}`) await git.fetch({ - ...await this.parseInput(input), - ...await this.getGitConfig(dir), + ...await this.addIsomorphicGitConfig(input), + ...await this.addIsomorphicGitConfigFS(dir), singleBranch: true, ref: result[0] }) await git.checkout({ - ...await this.getGitConfig(dir), + ...await this.addIsomorphicGitConfigFS(dir), ref: result[0] }) - + const log = await git.log({ - ...await this.getGitConfig(dir), + ...await this.addIsomorphicGitConfigFS(dir), }) - if(log[0].oid !== result[0]) { + if (log[0].oid !== result[0]) { this.call('terminal', 'log', { type: 'error', value: `Could not checkout submodule to ${result[0]}` - })} else { - this.call('terminal', 'logHtml',`Checked out submodule ${dir} to ${result[0]}`) + }) + } else { + this.call('terminal', 'logHtml', `Checked out submodule ${dir} to ${result[0]}`) } } @@ -682,10 +713,7 @@ class DGitProvider extends Plugin { ref: input.ref, remoteRef: input.remoteRef, remote: input.remote, - author: { - name: input.name, - email: input.email - }, + author: await this.getCommandUser(input), input, } if ((Registry.getInstance().get('platform').api.isDesktop())) { @@ -694,12 +722,14 @@ class DGitProvider extends Plugin { const cmd2 = { ...cmd, - ...await this.parseInput(input), + ...await this.addIsomorphicGitConfig(input), } - return await git.push({ - ...await this.getGitConfig(), + const result = await git.push({ + ...await this.addIsomorphicGitConfigFS(), ...cmd2 }) + console.log('push result', result) + return result } } @@ -708,10 +738,7 @@ class DGitProvider extends Plugin { const cmd = { ref: input.ref, remoteRef: input.remoteRef, - author: { - name: input.name, - email: input.email - }, + author: await this.getCommandUser(input), remote: input.remote, input, } @@ -722,13 +749,14 @@ class DGitProvider extends Plugin { else { const cmd2 = { ...cmd, - ...await this.parseInput(input), + ...await this.addIsomorphicGitConfig(input), } result = await git.pull({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), ...cmd2 }) } + console.log('pull result', result) setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) @@ -739,10 +767,7 @@ class DGitProvider extends Plugin { const cmd = { ref: input.ref, remoteRef: input.remoteRef, - author: { - name: input.name, - email: input.email - }, + author: await this.getCommandUser(input), remote: input.remote, input } @@ -752,13 +777,19 @@ class DGitProvider extends Plugin { } else { const cmd2 = { ...cmd, - ...await this.parseInput(input), + ...await this.addIsomorphicGitConfig(input), } result = await git.fetch({ - ...await this.getGitConfig(), + ...await this.addIsomorphicGitConfigFS(), + ...cmd2 + }) + console.log('fetch result', result) + console.log({ + ...await this.addIsomorphicGitConfigFS(), ...cmd2 }) } + setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) @@ -926,7 +957,7 @@ class DGitProvider extends Plugin { async remotebranches(input: { owner: string, repo: string, token: string }) { console.log(input) - + const octokit = new Octokit({ auth: input.token }) @@ -973,13 +1004,13 @@ class DGitProvider extends Plugin { auth: input.token }) - + const data = await octokit.request('GET /repos/{owner}/{repo}/commits', { owner: input.owner, repo: input.repo, sha: input.branch, - per_page: input.length + per_page: 100 }) @@ -991,15 +1022,15 @@ class DGitProvider extends Plugin { const octokit = new Octokit({ auth: input.token }) - + console.log('octokit', input.token) const data = await octokit.request('GET /user/repos', { - per_page: 100, - page: 1 + per_page: 200, + page: 2 }) - console.log(data.data) + console.log(data.data) return data.data } diff --git a/libs/remix-ui/git/src/components/navigation/branchedetails.tsx b/libs/remix-ui/git/src/components/navigation/branchedetails.tsx index 1b0f39c0c0..7a5537c577 100644 --- a/libs/remix-ui/git/src/components/navigation/branchedetails.tsx +++ b/libs/remix-ui/git/src/components/navigation/branchedetails.tsx @@ -1,4 +1,4 @@ -import { faCaretUp, faCaretDown, faCaretRight, faArrowUp, faArrowDown, faArrowRotateRight, faArrowsUpDown, faGlobe, faCheckCircle, faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; +import { faCaretUp, faCaretDown, faCaretRight, faArrowUp, faArrowDown, faArrowRotateRight, faArrowsUpDown, faGlobe, faCheckCircle, faToggleOff, faToggleOn, faSync } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { useContext, useEffect } from "react"; import { branch } from "../../types"; @@ -44,8 +44,10 @@ export const BrancheDetailsNavigation = (props: BrancheDetailsNavigationProps) = : checkout(branch)}> } - checkout(branch)}> - {branch.remote?.url && openRemote()}>} + + {branch.remote?.url && <> + checkout(branch)}> + openRemote()}>}
); diff --git a/libs/remix-ui/git/src/components/panels/commands/fetch.tsx b/libs/remix-ui/git/src/components/panels/commands/fetch.tsx index f73e7a04fe..88de01c27f 100644 --- a/libs/remix-ui/git/src/components/panels/commands/fetch.tsx +++ b/libs/remix-ui/git/src/components/panels/commands/fetch.tsx @@ -1,10 +1,11 @@ import React, { useEffect, useState } from "react"; +import { gitActionsContext } from "../../../state/context"; export const Fetch = () => { - + const actions = React.useContext(gitActionsContext) const fetch = async () => { - //gitservice.fetch(currentRemote, '', '') + await actions.fetch() } diff --git a/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx b/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx index ca6ed1c8ae..84f3cd041d 100644 --- a/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx +++ b/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx @@ -50,11 +50,11 @@ export const PushPull = () => { } const push = async () => { - //gitservice.push(currentRemote, branch || '', remoteBranch, force) + actions.push() } const pull = async () => { - //gitservice.pull(currentRemote, branch || '', remoteBranch) + actions.pull() } diff --git a/libs/remix-ui/git/src/components/panels/github.tsx b/libs/remix-ui/git/src/components/panels/github.tsx index 57ce6938b6..2eb386c464 100644 --- a/libs/remix-ui/git/src/components/panels/github.tsx +++ b/libs/remix-ui/git/src/components/panels/github.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from "react"; import { gitActionsContext, pluginActionsContext } from "../../state/context"; -import { gitPluginContext } from "../gitui"; +import { gitPluginContext, loaderContext } from "../gitui"; import axios from "axios"; import { CopyToClipboard } from "@remix-ui/clipboard"; import { Card } from "react-bootstrap"; @@ -9,80 +9,20 @@ import { Card } from "react-bootstrap"; export const GitHubAuth = () => { const context = React.useContext(gitPluginContext) const actions = React.useContext(gitActionsContext) + const loader = React.useContext(loaderContext) const pluginActions = React.useContext(pluginActionsContext) const [gitHubResponse, setGitHubResponse] = React.useState(null) const [authorized, setAuthorized] = React.useState(false) - - const client_id = 'Iv1.12fc02c69c512462'// 'e90cf20e6cafa2fd71ea' - const getDeviceCodeFromGitHub = async () => { - - setAuthorized(false) - // Send a POST request - const response = await axios({ - method: 'post', - url: 'http://0.0.0.0:3000/github.com/login/device/code', - data: { - client_id // : 'Iv1.12fc02c69c512462' - }, - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }, - }); - - // convert response to json - const githubrespone = await response.data; - console.log('json', githubrespone) - - setGitHubResponse(githubrespone) - } - - const connectApp = async () => { - // poll https://github.com/login/oauth/access_token - const accestokenresponse = await axios({ - method: 'post', - url: 'http://0.0.0.0:3000/github.com/login/oauth/access_token', - data: { - client_id,// : 'Iv1.12fc02c69c512462', - device_code: gitHubResponse.device_code, - grant_type: 'urn:ietf:params:oauth:grant-type:device_code', - }, - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }, - }); - - // convert response to json - const response = await accestokenresponse.data; - console.log('json2', response) - - if (response.error) { - - } - - if (response.access_token) { - setAuthorized(true) - await pluginActions.saveToken(response.access_token) - await actions.getGitHubUser() - } - - } - - const disconnect = async () => { - setAuthorized(false) - setGitHubResponse(null) - } + useEffect(() => { + checkConnection() + }, [context.gitHubAccessToken, loader.plugin]) const checkConnection = async () => { - //await actions.getGitHubUser() + console.log('checkConnection', context.gitHubAccessToken) + await actions.getGitHubUser() } - useEffect(() => { - - },[]) - useEffect(() => { console.log('context.rateLimit', context.rateLimit) }, [context.rateLimit]) @@ -91,37 +31,8 @@ export const GitHubAuth = () => { return ( <> {(context.gitHubUser && context.gitHubUser.login) ? null : - - } - {gitHubResponse && !authorized && -
- - Step 1: Copy this code: -
- -
- -
-
-

- Step 2: Authorize the app here -

{gitHubResponse.verification_uri} -


- Step 3: When you are done, click on the button below: - -
- } - { - (context.gitHubUser && context.gitHubUser.login) ? -
- -
: null +
  • + Not connected to GitHub. Add a valid token.
  • } { (context.gitHubUser && context.gitHubUser.login) ? diff --git a/libs/remix-ui/git/src/components/panels/githubcredentials.tsx b/libs/remix-ui/git/src/components/panels/githubcredentials.tsx index de7bb09d94..86216abbac 100644 --- a/libs/remix-ui/git/src/components/panels/githubcredentials.tsx +++ b/libs/remix-ui/git/src/components/panels/githubcredentials.tsx @@ -1,7 +1,7 @@ import { checkout, clone, ReadCommitResult } from "isomorphic-git"; -import React from "react"; -import { gitActionsContext } from "../../state/context"; -import { gitPluginContext } from "../gitui"; +import React, { useEffect } from "react"; +import { gitActionsContext, pluginActionsContext } from "../../state/context"; +import { gitPluginContext, loaderContext } from "../gitui"; import { CustomTooltip } from "@remix-ui/helper"; import { useIntl, FormattedMessage } from "react-intl"; @@ -11,46 +11,75 @@ import { FormControl, InputGroup } from "react-bootstrap"; export const GitHubCredentials = () => { const context = React.useContext(gitPluginContext) + const pluginactions = React.useContext(pluginActionsContext) + const loader = React.useContext(loaderContext) const [githubToken, setGithubToken] = React.useState('') const [githubUsername, setGithubUsername] = React.useState('') const [githubEmail, setGithubEmail] = React.useState('') const intl = useIntl() - const gitAccessTokenLink = 'https://github.com/settings/tokens/new?scopes=gist,repo&description=Remix%20IDE%20Token' + useEffect(() => { + refresh() + }, [loader.plugin, context.gitHubAccessToken]) function handleChangeTokenState(e: string): void { - throw new Error("Function not implemented."); + setGithubToken(e) } function handleChangeUserNameState(e: string): void { - throw new Error("Function not implemented."); + setGithubUsername(e) } function handleChangeEmailState(e: string): void { - throw new Error("Function not implemented."); + setGithubEmail(e) } - function saveGithubToken(): void { - throw new Error("Function not implemented."); + async function saveGithubToken() { + await pluginactions.saveGitHubCredentials({ + username: githubUsername, + email: githubEmail, + token: githubToken + }) + } + + async function refresh() { + const credentials = await pluginactions.getGitHubCredentials() + if(!credentials) return + console.log('credentials', credentials) + setGithubToken(credentials.token || '') + setGithubUsername(credentials.username || '') + setGithubEmail(credentials.email || '') } function removeToken(): void { - throw new Error("Function not implemented."); + setGithubToken('') + setGithubUsername('') + setGithubEmail('') + pluginactions.saveGitHubCredentials({ + username: '', + email: '', + token: '' + }) } return ( <> -
    -
    - + handleChangeTokenState(e.target.value)} />
    - +
    handleChangeUserNameState(e.target.value)} value={githubUsername} className="form-control mb-1" placeholder="GitHub username" type="text" id="githubUsername" /> handleChangeEmailState(e.target.value)} value={githubEmail} className="form-control mb-1" placeholder="GitHub email" type="text" id="githubEmail" /> +
    + + +

    ); diff --git a/libs/remix-ui/git/src/components/panels/remotesimport.tsx b/libs/remix-ui/git/src/components/panels/remotesimport.tsx index c39552b733..e0840e57fb 100644 --- a/libs/remix-ui/git/src/components/panels/remotesimport.tsx +++ b/libs/remix-ui/git/src/components/panels/remotesimport.tsx @@ -5,6 +5,7 @@ import { repository } from "../../types"; import { gitPluginContext } from "../gitui"; import Select from 'react-select' import { selectStyles, selectTheme } from "../../types/styles"; +import { TokenWarning } from "./tokenWarning"; export const RemotesImport = () => { @@ -18,17 +19,20 @@ export const RemotesImport = () => { useEffect(() => { console.log('context', context.repositories) - // map context.repositories to options - const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { - return { value: repo.id, label: repo.full_name } - }) + if (context.repositories && context.repositories.length > 0) { + // map context.repositories to options + const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { + return { value: repo.id, label: repo.full_name } + }) + setRepoOptions(options) + } else { + setRepoOptions(null) + setShow(false) + } setLoading(false) - setRepoOptions(options) }, [context.repositories]) - - const fetchRepositories = async () => { try { setShow(true) @@ -67,6 +71,7 @@ export const RemotesImport = () => { return ( <> + diff --git a/libs/remix-ui/git/src/components/panels/repositories.tsx b/libs/remix-ui/git/src/components/panels/repositories.tsx index f06a67100f..47af4e86e1 100644 --- a/libs/remix-ui/git/src/components/panels/repositories.tsx +++ b/libs/remix-ui/git/src/components/panels/repositories.tsx @@ -5,6 +5,7 @@ import { repository } from "../../types"; import { gitPluginContext } from "../gitui"; import Select from 'react-select' import { selectStyles, selectTheme } from "../../types/styles"; +import { TokenWarning } from "./tokenWarning"; interface RepositoriesProps { cloneDepth?: number @@ -24,12 +25,17 @@ export const Repositories = (props: RepositoriesProps) => { useEffect(() => { console.log('context', context.repositories) - // map context.repositories to options - const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { - return { value: repo.id, label: repo.full_name } - }) + if (context.repositories && context.repositories.length > 0) { + // map context.repositories to options + const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { + return { value: repo.id, label: repo.full_name } + }) + setRepoOptions(options) + } else { + setRepoOptions(null) + setShow(false) + } setLoading(false) - setRepoOptions(options) }, [context.repositories]) @@ -93,6 +99,7 @@ export const Repositories = (props: RepositoriesProps) => { return ( <> + diff --git a/libs/remix-ui/git/src/components/panels/tokenWarning.tsx b/libs/remix-ui/git/src/components/panels/tokenWarning.tsx new file mode 100644 index 0000000000..4188c07c93 --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/tokenWarning.tsx @@ -0,0 +1,12 @@ +import { gitPluginContext } from "../gitui" +import React, { useEffect, useState } from "react"; +export const TokenWarning = () => { + const context = React.useContext(gitPluginContext) + return (<> + {(context.gitHubUser && context.gitHubUser.login) ? null : +
  • + To use add a GitHub token to the settings.
  • + } + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index d9bc95baa8..5e89b1b92d 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -2,13 +2,17 @@ import { ViewPlugin } from "@remixproject/engine-web"; import { ReadBlobResult, ReadCommitResult } from "isomorphic-git"; import React from "react"; import { fileStatus, fileStatusMerge, setBranchCommits, setBranches, setCanCommit, setCommitChanges, setCommits, setCurrentBranch, setGitHubUser, setLoading, setRateLimit, setRemoteBranches, setRemotes, setRepos, setUpstream } from "../state/gitpayload"; -import { GitHubUser, RateLimit, branch, commitChange, gitActionDispatch, statusMatrixType } from '../types'; +import { GitHubUser, RateLimit, branch, commitChange, gitActionDispatch, statusMatrixType, gitState } from '../types'; import { removeSlash } from "../utils"; import { disableCallBacks, enableCallBacks } from "./listeners"; import { AlertModal, ModalTypes } from "@remix-ui/app"; import { gitActionsContext } from "../state/context"; import { gitPluginContext } from "../components/gitui"; import { setFileDecorators } from "./pluginActions"; +import { IDgitSystem, IRemixApi, RemixApi } from "@remixproject/plugin-api"; +import { Plugin } from "@remixproject/engine"; +import { AnyMxRecord } from "dns"; +import { StatusEvents } from "@remixproject/plugin-utils"; export const fileStatuses = [ ["new,untracked", 0, 2, 0], // new, untracked @@ -32,13 +36,48 @@ const statusmatrix: statusMatrixType[] = fileStatuses.map((x: any) => { status: x, }; }); +/* +interface customDGitSystem extends IDgitSystem{ + events: StatusEvents, + methods: { + getCommitChanges(oid1: string, oid2: string): Promise + getBranchCommits(branch: branch): Promise + fetchBranch(branch: branch): Promise + remotebranches(owner: string, repo: string): Promise + remoteCommits(url: string, branch: string, length: number): Promise + repositories(token: string): Promise + clone(url: string, branch: string, depth: number, singleBranch: boolean): Promise + getGitHubUser(token: string): Promise<{ user: GitHubUser, ratelimit: RateLimit }> + saveGitHubCredentials(credentials: { username: string, email: string, token: string }): Promise + getGitHubCredentials(): Promise<{ username: string, email: string, token: string }> + currentbranch(): Promise + } +} + +interface notificationSystem { + methods: { + toast(message: string): void + alert(message: { + title: string, + type: string + }): void + modal(modal: AlertModal): void + }, + events: StatusEvents +} -let plugin: ViewPlugin, dispatch: React.Dispatch +interface customApi extends IRemixApi { + dGitProvider: customDGitSystem + notification: notificationSystem +} +*/ +let plugin: Plugin, dispatch: React.Dispatch -export const setPlugin = (p: ViewPlugin, dispatcher: React.Dispatch) => { +export const setPlugin = (p: Plugin, dispatcher: React.Dispatch) => { plugin = p dispatch = dispatcher + console.log('setPlugin') } export const getBranches = async () => { @@ -101,7 +140,6 @@ export const gitlog = async () => { } dispatch(setCommits(commits)) await showCurrentBranch() - await getGitHubUser() } export const showCurrentBranch = async () => { @@ -133,7 +171,13 @@ export const currentBranch = async () => { // eslint-disable-next-line no-useless-catch try { const branch: branch = - (await plugin.call("dGitProvider", "currentbranch")) || ""; + (await plugin.call("dGitProvider", "currentbranch")) || { + name: "", + remote: { + remote: "", + url: "", + }, + }; return branch; } catch (e) { throw e; @@ -329,15 +373,36 @@ export const clone = async (url: string, branch: string, depth: number, singleBr dispatch(setLoading(false)) } +export const fetch = async(remote?: string, ref?: string, remoteRef?: string) => { + try { + await plugin.call('dGitProvider' as any, 'fetch', { remote, ref, remoteRef }) + await gitlog() + await getBranches() + } catch (e: any) { + await parseError(e) + } +} + +export const pull = async(remote?: string, ref?: string, remoteRef?: string) => { + try { + await plugin.call('dGitProvider' as any, 'pull', { remote, ref, remoteRef }) + await gitlog() + } catch (e: any) { + await parseError(e) + } +} + +export const push = async(remote?: string, ref?: string, remoteRef?: string, force?: boolean) => { + try { + await plugin.call('dGitProvider' as any, 'push', { remote, ref, remoteRef, force }) + } catch (e: any) { + await parseError(e) + } +} + const tokenWarning = async () => { const token = await plugin.call('config' as any, 'getAppParameter', 'settings/gist-access-token') if (!token) { - const modalContent: AlertModal = { - message: 'Please set a token first in the GitHub settings of REMIX', - title: 'No GitHub token set', - id: 'no-token-set', - } - //plugin.call('notification', 'alert', modalContent) return false; } else { return token; @@ -384,15 +449,18 @@ const parseError = async (e: any) => { } } - - - export const repositories = async () => { try { const token = await tokenWarning(); if (token) { const repos = await plugin.call('dGitProvider' as any, 'repositories', { token }); dispatch(setRepos(repos)) + } else { + plugin.call('notification', 'alert', { + title: 'Error getting repositories', + message: `Please check your GitHub token in the GitHub settings. It needs to have access to the repositories.` + }) + dispatch(setRepos([])) } } catch (e) { console.log(e) @@ -400,6 +468,7 @@ export const repositories = async () => { title: 'Error getting repositories', message: `${e.message}: Please check your GitHub token in the GitHub settings.` }) + dispatch(setRepos([])) } } @@ -409,6 +478,12 @@ export const remoteBranches = async (owner: string, repo: string) => { if (token) { const branches = await plugin.call('dGitProvider' as any, 'remotebranches', { token, owner, repo }); dispatch(setRemoteBranches(branches)) + } else { + plugin.call('notification', 'alert', { + title: 'Error getting branches', + message: `Please check your GitHub token in the GitHub settings. It needs to have access to the branches.` + }) + dispatch(setRemoteBranches([])) } } catch (e) { console.log(e) @@ -416,27 +491,33 @@ export const remoteBranches = async (owner: string, repo: string) => { title: 'Error', message: e.message }) + dispatch(setRemoteBranches([])) } } export const remoteCommits = async (url: string, branch: string, length: number) => { const urlParts = url.split("/"); - + console.log(urlParts, 'urlParts') // check if it's github - if(!urlParts[urlParts.length - 3].includes('github')) { + if (!urlParts[urlParts.length - 3].includes('github')) { return } - + const owner = urlParts[urlParts.length - 2]; const repo = urlParts[urlParts.length - 1].split(".")[0]; - + try { const token = await tokenWarning(); if (token) { console.log(token, owner, repo, branch, length) const commits = await plugin.call('dGitProvider' as any, 'remotecommits', { token, owner, repo, branch, length }); console.log(commits, 'remote commits') + } else { + plugin.call('notification', 'alert', { + title: 'Error getting commits', + message: `Please check your GitHub token in the GitHub settings. It needs to have access to the commits.` + }) } } catch (e) { console.log(e) @@ -447,7 +528,34 @@ export const remoteCommits = async (url: string, branch: string, length: number) } } +export const saveGitHubCredentials = async (credentials: { username: string, email: string, token: string }) => { + try { + await plugin.call('config' as any, 'setAppParameter', 'settings/github-user-name', credentials.username) + await plugin.call('config' as any, 'setAppParameter', 'settings/github-email', credentials.email) + await plugin.call('config' as any, 'setAppParameter', 'settings/gist-access-token', credentials.token) + } catch (e) { + console.log(e) + } +} + +export const getGitHubCredentials = async () => { + if (!plugin) return + try { + const username = await plugin.call('config' as any, 'getAppParameter', 'settings/github-user-name') + const email = await plugin.call('config' as any, 'getAppParameter', 'settings/github-email') + const token = await plugin.call('config' as any, 'getAppParameter', 'settings/gist-access-token') + return { + username, + email, + token + } + } catch (e) { + console.log(e) + } +} + export const getGitHubUser = async () => { + if (!plugin) return try { const token = await tokenWarning(); if (token) { @@ -460,6 +568,8 @@ export const getGitHubUser = async () => { dispatch(setGitHubUser(data.user)) dispatch(setRateLimit(data.ratelimit)) + } else { + dispatch(setGitHubUser(null)) } } catch (e) { console.log(e) @@ -611,6 +721,7 @@ export const getBranchCommits = async (branch: branch) => { }) console.log(commits) dispatch(setBranchCommits({ branch, commits })) + await fetchBranch(branch) return commits } catch (e) { console.log(e) diff --git a/libs/remix-ui/git/src/lib/listeners.ts b/libs/remix-ui/git/src/lib/listeners.ts index 255e32d66a..d1cf8457f8 100644 --- a/libs/remix-ui/git/src/lib/listeners.ts +++ b/libs/remix-ui/git/src/lib/listeners.ts @@ -1,7 +1,7 @@ import { ViewPlugin } from "@remixproject/engine-web"; import React from "react"; -import { setCanUseApp, setLoading, setRepoName } from "../state/gitpayload"; +import { setCanUseApp, setLoading, setRepoName, setGItHubToken } from "../state/gitpayload"; import { gitActionDispatch } from "../types"; import { diffFiles, getBranches, getFileStatusMatrix, getGitHubUser, getRemotes, gitlog, setPlugin } from "./gitactions"; @@ -102,7 +102,7 @@ export const getGitConfig = async () => { const email = await plugin.call('settings', 'get', 'settings/github-email') const token = await plugin.call('settings', 'get', 'settings/gist-access-token') const config = { username, email, token } - //dispatch(setGitConfig(config)) + gitDispatch(setGItHubToken(config.token)) return config } diff --git a/libs/remix-ui/git/src/state/context.tsx b/libs/remix-ui/git/src/state/context.tsx index 38b5c6a094..373c29bbc9 100644 --- a/libs/remix-ui/git/src/state/context.tsx +++ b/libs/remix-ui/git/src/state/context.tsx @@ -8,9 +8,9 @@ export interface gitActions { rm(path: string): Promise commit(message: string): Promise addall(): Promise - //push(): Promise - //pull(): Promise - //fetch(): Promise + push(remote?: string, ref?: string, remoteRef?: string, force?: boolean): Promise + pull(remote?: string, ref?: string, remoteRef?: string): Promise + fetch(remote?: string, ref?: string, remoteRef?: string): Promise repositories(): Promise checkoutfile(file: string): Promise checkout(cmd: any): Promise @@ -34,6 +34,16 @@ export interface pluginActions { openFile(path: string): Promise openDiff(change: commitChange): Promise saveToken(token: string): Promise + saveGitHubCredentials({ + username, + email, + token + }): Promise + getGitHubCredentials(): Promise<{ + username: string + email: string + token: string + }> } export const pluginActionsContext = React.createContext(null) \ No newline at end of file diff --git a/libs/remix-ui/git/src/state/gitpayload.ts b/libs/remix-ui/git/src/state/gitpayload.ts index c1281fcd2f..cb1989c7c0 100644 --- a/libs/remix-ui/git/src/state/gitpayload.ts +++ b/libs/remix-ui/git/src/state/gitpayload.ts @@ -128,3 +128,10 @@ export const setBranchCommits =({branch, commits}) => { payload: { branch, commits } } } + +export const setGItHubToken = (token: string) => { + return { + type: 'SET_GITHUB_ACCESS_TOKEN', + payload: token + } +} diff --git a/libs/remix-ui/git/src/types/index.ts b/libs/remix-ui/git/src/types/index.ts index 8994199692..f4e1516143 100644 --- a/libs/remix-ui/git/src/types/index.ts +++ b/libs/remix-ui/git/src/types/index.ts @@ -39,6 +39,7 @@ export type loaderState = { remotes: boolean commits: boolean sourcecontrol: boolean + plugin: boolean } export type commitChangeTypes = { @@ -125,7 +126,8 @@ export const defaultLoaderState: loaderState = { branches: false, commits: false, sourcecontrol: false, - remotes: false + remotes: false, + plugin: false } export type fileStatusResult = { @@ -211,4 +213,9 @@ export interface setBranchCommitsAction { } } -export type gitActionDispatch = setUpstreamAction | setBranchCommitsAction | setRemotesAction | setCurrentBranchAction | fileStatusAction | setLoadingAction | setCanUseAppAction | setRepoNameAction | setCommitsAction | setBranchesAction | setReposAction | setRemoteBranchesAction \ No newline at end of file +export interface setTokenAction { + type: string, + payload: string +} + +export type gitActionDispatch = setTokenAction | setUpstreamAction | setBranchCommitsAction | setRemotesAction | setCurrentBranchAction | fileStatusAction | setLoadingAction | setCanUseAppAction | setRepoNameAction | setCommitsAction | setBranchesAction | setReposAction | setRemoteBranchesAction \ No newline at end of file From 6beeda8c6f52ba4a2637db3de63b91bb4de8fa6c Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 24 Feb 2024 09:50:07 +0100 Subject: [PATCH 12/71] remote commits --- libs/remix-ui/git/src/lib/gitactions.ts | 63 +++++++++++++++++++------ libs/remix-ui/git/src/state/context.tsx | 2 +- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index 5e89b1b92d..2792d2c346 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -373,7 +373,7 @@ export const clone = async (url: string, branch: string, depth: number, singleBr dispatch(setLoading(false)) } -export const fetch = async(remote?: string, ref?: string, remoteRef?: string) => { +export const fetch = async (remote?: string, ref?: string, remoteRef?: string) => { try { await plugin.call('dGitProvider' as any, 'fetch', { remote, ref, remoteRef }) await gitlog() @@ -383,7 +383,7 @@ export const fetch = async(remote?: string, ref?: string, remoteRef?: string) => } } -export const pull = async(remote?: string, ref?: string, remoteRef?: string) => { +export const pull = async (remote?: string, ref?: string, remoteRef?: string) => { try { await plugin.call('dGitProvider' as any, 'pull', { remote, ref, remoteRef }) await gitlog() @@ -392,7 +392,7 @@ export const pull = async(remote?: string, ref?: string, remoteRef?: string) => } } -export const push = async(remote?: string, ref?: string, remoteRef?: string, force?: boolean) => { +export const push = async (remote?: string, ref?: string, remoteRef?: string, force?: boolean) => { try { await plugin.call('dGitProvider' as any, 'push', { remote, ref, remoteRef, force }) } catch (e: any) { @@ -643,8 +643,6 @@ export const diff = async (commitChange: commitChange) => { } - - /* const fullfilename = args; // $(args[0].currentTarget).data('file') try { @@ -706,23 +704,58 @@ export const fetchBranch = async (branch: branch) => { remote: branch.remote.remote, depth: 10 }) - const commits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { + const remoteCommits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { ref: r.fetchHead }) - console.log(r, commits) - dispatch(setBranchCommits({ branch, commits })) + console.log(r, remoteCommits) + let localCommits: ReadCommitResult[] = [] + try { + + localCommits = await plugin.call('dGitProvider', 'log', { + ref: branch.name, + }) + console.log(r, localCommits) + } catch (e) { } + + const remoteCommitsThatAreNotLocal: ReadCommitResult[] = remoteCommits.filter((commit) => { + return !localCommits.find((localCommit) => localCommit.oid === commit.oid) + } + ) + console.log(remoteCommitsThatAreNotLocal) + const mergeCommits = remoteCommitsThatAreNotLocal.map((commit) => { + return { + ...commit, + remote: true + } + }).concat(localCommits.map((commit) => { + return { + ...commit, + remote: false + } + } + )) + // sort by date + mergeCommits.sort((a, b) => { + return new Date(b.commit.committer.timestamp).getTime() - new Date(a.commit.committer.timestamp).getTime() + }) + + console.log(mergeCommits) + //console.log(r, commits) + dispatch(setBranchCommits({ branch, commits: mergeCommits })) } export const getBranchCommits = async (branch: branch) => { try { console.log(branch) - const commits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { - ref: branch.name, - }) - console.log(commits) - dispatch(setBranchCommits({ branch, commits })) - await fetchBranch(branch) - return commits + if (!branch.remote) { + const commits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { + ref: branch.name, + }) + console.log(commits) + dispatch(setBranchCommits({ branch, commits })) + } else { + await fetchBranch(branch) + } } catch (e) { console.log(e) await fetchBranch(branch) diff --git a/libs/remix-ui/git/src/state/context.tsx b/libs/remix-ui/git/src/state/context.tsx index 373c29bbc9..fa932b992e 100644 --- a/libs/remix-ui/git/src/state/context.tsx +++ b/libs/remix-ui/git/src/state/context.tsx @@ -17,7 +17,7 @@ export interface gitActions { createBranch(branch: string): Promise remoteBranches(owner: string, repo: string): Promise getCommitChanges(oid1: string, oid2: string): Promise - getBranchCommits(branch: branch): Promise + getBranchCommits(branch: branch): Promise getGitHubUser(): Promise diff(commitChange: commitChange): Promise resolveRef(ref: string): Promise From 0a5d2e2c8423288fd4a12ad3ac69ce21db43553a Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 26 Feb 2024 08:23:18 +0100 Subject: [PATCH 13/71] add gql --- libs/remix-ui/git/src/components/gitui.tsx | 144 +- .../panels/branches/branchCommits.tsx | 93 + .../panels/branches/branchedetails.tsx | 8 +- libs/remix-ui/git/src/state/apolloClient.tsx | 22 + package.json | 8 +- yarn.lock | 1660 ++++++++++++++++- 6 files changed, 1809 insertions(+), 126 deletions(-) create mode 100644 libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx create mode 100644 libs/remix-ui/git/src/state/apolloClient.tsx diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx index 19141d5e97..d788b13c78 100644 --- a/libs/remix-ui/git/src/components/gitui.tsx +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -27,6 +27,8 @@ import { GitHubNavigation } from './navigation/github' import { GitHubAuth } from './panels/github' import { GitHubCredentials } from './panels/githubcredentials' import { loaderReducer } from '../state/loaderReducer' +import { ApolloClient, ApolloProvider, NormalizedCacheObject } from '@apollo/client' +import { client, getApolloLink } from '../state/apolloClient' export const gitPluginContext = React.createContext(defaultGitState) export const loaderContext = React.createContext(defaultLoaderState) @@ -38,6 +40,7 @@ interface IGitUi { export const GitUI = (props: IGitUi) => { const plugin = props.plugin const [gitState, gitDispatch] = useReducer(gitReducer, defaultGitState) + const [apolloClient, setApolloClient] = useState>(client) const [loaderState, loaderDispatch] = useReducer(loaderReducer, defaultLoaderState) const [activePanel, setActivePanel] = useState("0"); const [timeOut, setTimeOut] = useState(null) @@ -70,17 +73,20 @@ export const GitUI = (props: IGitUi) => { useEffect(() => { - async function updatestate(){ + async function updatestate() { console.log('updatestate', gitState) - if(gitState.currentBranch && gitState.currentBranch.remote && gitState.currentBranch.remote.url){ + if (gitState.currentBranch && gitState.currentBranch.remote && gitState.currentBranch.remote.url) { remoteCommits(gitState.currentBranch.remote.url, gitState.currentBranch.name, 1) } + if(gitState.gitHubAccessToken) { + client.setLink(getApolloLink(gitState.gitHubAccessToken)) + } } setTimeout(() => { updatestate() }) - - }, [gitState.gitHubUser, gitState.currentBranch, gitState.remotes]) + + }, [gitState.gitHubUser, gitState.currentBranch, gitState.remotes, gitState.gitHubAccessToken]) const gitActionsProviderValue = { @@ -119,70 +125,72 @@ export const GitUI = (props: IGitUi) => { return (
    - - - - - {gitState.loading &&
    } - {!gitState.loading && - - - - - <> - - - - -
    - - - <> - - - -
    - - - <> - - - -
    - - - <> - - -
    - - - <> - - -
    - - - <> - - - -
    - - - <> - - - - - - - -
    } -
    -
    -
    -
    + + + + + + {gitState.loading &&
    } + {!gitState.loading && + + + + + <> + + + + +
    + + + <> + + + +
    + + + <> + + + +
    + + + <> + + +
    + + + <> + + +
    + + + <> + + + +
    + + + <> + + + + + + + +
    } +
    +
    +
    +
    +
    ) } \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx b/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx new file mode 100644 index 0000000000..7562fb434e --- /dev/null +++ b/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { gql, useQuery } from '@apollo/client'; + +const GET_COMMITS = gql` + query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) { + repository(name: $name, owner: $owner) { + ref(qualifiedName: "master") { + target { + ... on Commit { + history(first: $limit, after: $cursor) { + pageInfo { + endCursor + hasNextPage + } + edges { + node { + oid + messageHeadline + author { + name + date + } + } + } + } + } + } + } + } + } +`; + + +export const BranchCommits = ({ owner, name }) => { + const { data, loading, fetchMore } = useQuery(GET_COMMITS, { + variables: { owner, name }, + }); + + if (loading) return

    Loading...

    ; + + const { edges, pageInfo } = data.repository.ref.target.history; + + const loadNextPage= ()=>{ + fetchMore({ + variables: { + cursor: pageInfo.endCursor, + }, + updateQuery: (prevResult, { fetchMoreResult }) => { + const newEdges = fetchMoreResult.repository.ref.target.history.edges; + const pageInfo = fetchMoreResult.repository.ref.target.history.pageInfo; + + return newEdges.length + ? { + repository: { + __typename: prevResult.repository.__typename, + ref: { + __typename: prevResult.repository.ref.__typename, + target: { + __typename: prevResult.repository.ref.target.__typename, + history: { + __typename: prevResult.repository.ref.target.history.__typename, + edges: [...prevResult.repository.ref.target.history.edges, ...newEdges], + pageInfo, + }, + }, + }, + }, + } + : prevResult; + }, + }); + } + + return ( +
    +

    Commits

    +
      + {edges.map(({ node }) => ( +
    • +

      {node.messageHeadline} - {node.author.name} ({new Date(node.author.date).toLocaleDateString()})

      +
    • + ))} +
    + {pageInfo.hasNextPage && ( + + )} +
    + ); +}; diff --git a/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx b/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx index 1956ceeba2..21c55c8774 100644 --- a/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/branchedetails.tsx @@ -8,6 +8,7 @@ import { branch } from "../../../types"; import { BrancheDetailsNavigation } from "../../navigation/branchedetails"; import { CommitDetailsItems } from "../commits/commitdetailsitem"; import { CommitDetails } from "../commits/commitdetails"; +import { BranchCommits } from "./branchCommits"; export interface BrancheDetailsProps { branch: branch; @@ -22,7 +23,7 @@ export const BranchDetails = (props: BrancheDetailsProps) => { useEffect(() => { if (activePanel === "0") { console.log('GET BRANCH COMMITS', branch) - actions.getBranchCommits(branch) + //actions.getBranchCommits(branch) } }, [activePanel]) @@ -47,13 +48,14 @@ export const BranchDetails = (props: BrancheDetailsProps) => {
    - {context.branchCommits && Object.entries(context.branchCommits).map(([key, value]) => { + {/* {context.branchCommits && Object.entries(context.branchCommits).map(([key, value]) => { if(key == branch.name){ return value.map((commit, index) => { return() }) } - })} + })} */} +
    diff --git a/libs/remix-ui/git/src/state/apolloClient.tsx b/libs/remix-ui/git/src/state/apolloClient.tsx new file mode 100644 index 0000000000..e4ae6d60d5 --- /dev/null +++ b/libs/remix-ui/git/src/state/apolloClient.tsx @@ -0,0 +1,22 @@ +// ApolloClient.js +import { ApolloClient, InMemoryCache, createHttpLink, ApolloLink } from '@apollo/client'; + +export const getApolloLink = (token: string, uri = 'https://api.github.com/graphql')=>{ + const authLink = new ApolloLink((operation, forward) => { + operation.setContext({ + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return forward(operation); + }); + const httpLink = createHttpLink({ + uri, // Replace with your GraphQL endpoint + }); + return authLink.concat(httpLink) +} + +export const client = new ApolloClient({ + link: getApolloLink(''), + cache: new InMemoryCache(), +}); diff --git a/package.json b/package.json index 99632b458a..523bb817eb 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,7 @@ "build-contracts": "find ./node_modules/@openzeppelin/contracts | grep -i '.sol' > libs/remix-ui/editor/src/lib/providers/completion/contracts/contracts.txt && find ./node_modules/@uniswap/v3-core/contracts | grep -i '.sol' >> libs/remix-ui/editor/src/lib/providers/completion/contracts/contracts.txt" }, "dependencies": { + "@apollo/client": "^3.9.5", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@erebos/bzz-node": "^0.13.0", @@ -190,6 +191,7 @@ "from-exponential": "1.1.1", "fs-extra": "^3.0.1", "ganache": "^7.9.1", + "graphql": "^16.8.1", "html-react-parser": "^3.0.4", "http-server": "^14.1.1", "intro.js": "^4.1.0", @@ -208,6 +210,7 @@ "path-browserify": "^1.0.1", "prettier": "^2.8.4", "prettier-plugin-solidity": "^1.0.0-beta.24", + "ra-data-graphql": "^4.16.11", "raw-loader": "^4.0.2", "react": "^18.2.0", "react-beautiful-dnd": "^13.1.0", @@ -262,6 +265,9 @@ "@babel/register": "^7.4.4", "@electron-forge/cli": "^6.1.1", "@fortawesome/fontawesome-free": "^5.8.1", + "@graphql-codegen/cli": "^5.0.2", + "@graphql-codegen/client-preset": "^4.2.4", + "@graphql-typed-document-node/core": "^3.2.0", "@monaco-editor/react": "4.6.0", "@nrwl/cli": "15.7.1", "@nrwl/eslint-plugin-nx": "15.7.1", @@ -392,7 +398,7 @@ "timers-browserify": "^2.0.12", "ts-node": "10.9.1", "tslint": "~6.0.0", - "typescript": "^4.8.4", + "typescript": "^5.3.3", "uglify-js": "^2.8.16", "url": "^0.11.0", "vm-browserify": "^1.1.2", diff --git a/yarn.lock b/yarn.lock index d9ffa721d1..3cdfead0b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,6 +30,56 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@apollo/client@^3.3.19", "@apollo/client@^3.9.5": + version "3.9.5" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.9.5.tgz#502ec191756a7f44788b5f08cbe7b8de594a7656" + integrity sha512-7y+c8MTPU+hhTwvcGVtMMGIgWduzrvG1mz5yJMRyqYbheBkkky3Lki6ADWVSBXG1lZoOtPYvB2zDgVfKb2HSsw== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/caches" "^1.0.0" + "@wry/equality" "^0.5.6" + "@wry/trie" "^0.5.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.18.0" + prop-types "^15.7.2" + rehackt "0.0.5" + response-iterator "^0.2.6" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + +"@ardatan/relay-compiler@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" + integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +"@ardatan/sync-fetch@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz#3385d3feedceb60a896518a1db857ec1e945348f" + integrity sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA== + dependencies: + node-fetch "^2.6.1" + "@babel/cli@^7.19.3": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.21.0.tgz#1868eb70e9824b427fc607610cce8e9e7889e7e1" @@ -75,6 +125,14 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" +"@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.1.tgz#72d647b4ff6a4f82878d184613353af1dd0290f9" @@ -95,6 +153,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + "@babel/core@^7.11.6": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" @@ -137,6 +200,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.14.0", "@babel/core@^7.22.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.15.0": version "7.19.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" @@ -188,6 +272,16 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/generator@^7.15.8", "@babel/generator@^7.21.0", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" @@ -240,6 +334,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" @@ -279,6 +380,17 @@ browserslist "^4.21.3" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" @@ -409,6 +521,13 @@ dependencies: "@babel/types" "^7.18.9" +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + "@babel/helper-module-imports@^7.0.0-beta.44": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" @@ -423,7 +542,7 @@ dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-imports@^7.16.7": +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== @@ -493,6 +612,17 @@ "@babel/traverse" "^7.21.0" "@babel/types" "^7.21.0" +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-optimise-call-expression@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" @@ -507,6 +637,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" @@ -522,6 +659,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" @@ -553,6 +695,15 @@ "@babel/traverse" "^7.19.1" "@babel/types" "^7.19.0" +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-simple-access@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" @@ -574,6 +725,13 @@ dependencies: "@babel/types" "^7.20.2" +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" @@ -581,6 +739,13 @@ dependencies: "@babel/types" "^7.18.9" +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-split-export-declaration@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" @@ -622,6 +787,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" @@ -642,6 +812,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + "@babel/helper-wrap-function@^7.18.9": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" @@ -679,6 +854,15 @@ "@babel/traverse" "^7.19.4" "@babel/types" "^7.19.4" +"@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== + dependencies: + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + "@babel/highlight@^7.14.5", "@babel/highlight@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" @@ -706,11 +890,25 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.7.0": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.1.tgz#a8f81ee2fe872af23faea4b17a08fcc869de7bcc" integrity sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg== +"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + "@babel/parser@^7.15.8", "@babel/parser@^7.4.3": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" @@ -767,6 +965,14 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-class-properties@^7.14.5": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" @@ -775,14 +981,6 @@ "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-proposal-class-static-block@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" @@ -851,6 +1049,17 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/plugin-proposal-object-rest-spread@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" @@ -938,7 +1147,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -973,6 +1182,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz#084564e0f3cc21ea6c70c44cff984a1c0509729a" + integrity sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-import-assertions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" @@ -980,6 +1196,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -994,6 +1217,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" @@ -1022,7 +1252,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -1078,6 +1308,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" @@ -1094,6 +1331,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-remap-async-to-generator" "^7.18.6" +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" @@ -1101,6 +1345,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-block-scoping@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" @@ -1115,6 +1366,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-transform-classes@^7.0.0": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + "@babel/plugin-transform-classes@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" @@ -1130,6 +1395,14 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/plugin-transform-computed-properties@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" @@ -1137,6 +1410,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-destructuring@^7.18.13": version "7.18.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" @@ -1182,6 +1462,22 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz#cfa7ca159cc3306fab526fc67091556b51af26ff" + integrity sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.23.3" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-for-of@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" @@ -1189,6 +1485,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-function-name@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" @@ -1198,6 +1503,13 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" @@ -1205,6 +1517,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" @@ -1221,6 +1540,15 @@ "@babel/helper-plugin-utils" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/plugin-transform-modules-commonjs@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" @@ -1281,6 +1609,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-object-super@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" @@ -1289,6 +1625,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-parameters@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" @@ -1296,6 +1639,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" @@ -1310,6 +1660,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" @@ -1324,6 +1681,17 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + "@babel/plugin-transform-react-jsx@^7.18.6": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" @@ -1370,6 +1738,13 @@ babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" @@ -1377,6 +1752,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-spread@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-spread@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" @@ -1392,6 +1775,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" @@ -1734,6 +2124,31 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.0", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" @@ -1767,6 +2182,15 @@ "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" +"@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" @@ -3100,6 +3524,444 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@graphql-codegen/add@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-5.0.2.tgz#71b3ae0465a4537172dddb84531b6967ca5545f2" + integrity sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + tslib "~2.6.0" + +"@graphql-codegen/cli@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-5.0.2.tgz#07ff691c16da4c3dcc0e1995d3231530379ab317" + integrity sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw== + dependencies: + "@babel/generator" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/types" "^7.18.13" + "@graphql-codegen/client-preset" "^4.2.2" + "@graphql-codegen/core" "^4.0.2" + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/apollo-engine-loader" "^8.0.0" + "@graphql-tools/code-file-loader" "^8.0.0" + "@graphql-tools/git-loader" "^8.0.0" + "@graphql-tools/github-loader" "^8.0.0" + "@graphql-tools/graphql-file-loader" "^8.0.0" + "@graphql-tools/json-file-loader" "^8.0.0" + "@graphql-tools/load" "^8.0.0" + "@graphql-tools/prisma-loader" "^8.0.0" + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + "@whatwg-node/fetch" "^0.8.0" + chalk "^4.1.0" + cosmiconfig "^8.1.3" + debounce "^1.2.0" + detect-indent "^6.0.0" + graphql-config "^5.0.2" + inquirer "^8.0.0" + is-glob "^4.0.1" + jiti "^1.17.1" + json-to-pretty-yaml "^1.2.2" + listr2 "^4.0.5" + log-symbols "^4.0.0" + micromatch "^4.0.5" + shell-quote "^1.7.3" + string-env-interpolation "^1.0.1" + ts-log "^2.2.3" + tslib "^2.4.0" + yaml "^2.3.1" + yargs "^17.0.0" + +"@graphql-codegen/client-preset@^4.2.2", "@graphql-codegen/client-preset@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.4.tgz#a20e85b07b77282bb27b2e8e014bed5d491443e7" + integrity sha512-k1c8v2YxJhhITGQGxViG9asLAoop9m7X9duU7Zztqjc98ooxsUzXICfvAWsH3mLAUibXAx4Ax6BPzKsTtQmBPg== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + "@graphql-codegen/add" "^5.0.2" + "@graphql-codegen/gql-tag-operations" "4.0.6" + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/typed-document-node" "^5.0.6" + "@graphql-codegen/typescript" "^4.0.6" + "@graphql-codegen/typescript-operations" "^4.2.0" + "@graphql-codegen/visitor-plugin-common" "^5.1.0" + "@graphql-tools/documents" "^1.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-typed-document-node/core" "3.2.0" + tslib "~2.6.0" + +"@graphql-codegen/core@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-4.0.2.tgz#7e6ec266276f54bbf02f60599d9e518f4a59d85e" + integrity sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "~2.6.0" + +"@graphql-codegen/gql-tag-operations@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz#d16ee0306cfdea60217c025a1bc21649452d7da3" + integrity sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/visitor-plugin-common" "5.1.0" + "@graphql-tools/utils" "^10.0.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/plugin-helpers@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.3.tgz#7027b9d911d7cb594663590fcf5d63e9cf7ec2ff" + integrity sha512-yZ1rpULIWKBZqCDlvGIJRSyj1B2utkEdGmXZTBT/GVayP4hyRYlkd36AJV/LfEsVD8dnsKL5rLz2VTYmRNlJ5Q== + dependencies: + "@graphql-tools/utils" "^10.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.6.0" + +"@graphql-codegen/schema-ast@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz#aeaa104e4555cca73a058f0a9350b4b0e290b377" + integrity sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/utils" "^10.0.0" + tslib "~2.6.0" + +"@graphql-codegen/typed-document-node@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz#54750f4a7c6e963defeb6c27a9ea280a2a8bc2a3" + integrity sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/visitor-plugin-common" "5.1.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + tslib "~2.6.0" + +"@graphql-codegen/typescript-operations@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz#0c6bbaf41cb325809b7e9e2b9d85ab01f11d142f" + integrity sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/typescript" "^4.0.6" + "@graphql-codegen/visitor-plugin-common" "5.1.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/typescript@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.6.tgz#2c9b70dc1eafda912de5e31c119c757b1aa5fca1" + integrity sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/schema-ast" "^4.0.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/visitor-plugin-common@5.1.0", "@graphql-codegen/visitor-plugin-common@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz#4edf7edb53460e71762a5fd8bbf5269bc3d9200b" + integrity sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/optimize" "^2.0.0" + "@graphql-tools/relay-operation-optimizer" "^7.0.0" + "@graphql-tools/utils" "^10.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.6.0" + +"@graphql-tools/apollo-engine-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.1.tgz#1ec8718af6130ff8039cd653991412472cdd7e55" + integrity sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/utils" "^10.0.13" + "@whatwg-node/fetch" "^0.9.0" + tslib "^2.4.0" + +"@graphql-tools/batch-execute@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.4.tgz#11601409c0c33491971fc82592de12390ec58be2" + integrity sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w== + dependencies: + "@graphql-tools/utils" "^10.0.13" + dataloader "^2.2.2" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/code-file-loader@^8.0.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.1.1.tgz#517c37d4f8a20b2c6558b10cbe9a6f9bcfe98918" + integrity sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ== + dependencies: + "@graphql-tools/graphql-tag-pluck" "8.3.0" + "@graphql-tools/utils" "^10.0.13" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/delegate@^10.0.4": + version "10.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.0.4.tgz#7c38240f11e42ec2dd45d0a569ca6433ce4cb8dc" + integrity sha512-WswZRbQZMh/ebhc8zSomK9DIh6Pd5KbuiMsyiKkKz37TWTrlCOe+4C/fyrBFez30ksq6oFyCeSKMwfrCbeGo0Q== + dependencies: + "@graphql-tools/batch-execute" "^9.0.4" + "@graphql-tools/executor" "^1.2.1" + "@graphql-tools/schema" "^10.0.3" + "@graphql-tools/utils" "^10.0.13" + dataloader "^2.2.2" + tslib "^2.5.0" + +"@graphql-tools/documents@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/documents/-/documents-1.0.0.tgz#e3ed97197cc22ec830ca227fd7d17e86d8424bdf" + integrity sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg== + dependencies: + lodash.sortby "^4.7.0" + tslib "^2.4.0" + +"@graphql-tools/executor-graphql-ws@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.2.tgz#2bf959d2319692460b39400c0fe1515dfbb9f034" + integrity sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg== + dependencies: + "@graphql-tools/utils" "^10.0.13" + "@types/ws" "^8.0.0" + graphql-ws "^5.14.0" + isomorphic-ws "^5.0.0" + tslib "^2.4.0" + ws "^8.13.0" + +"@graphql-tools/executor-http@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz#87ca8b99a32241eb0cc30a9c500d2672e92d58b7" + integrity sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q== + dependencies: + "@graphql-tools/utils" "^10.0.13" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/fetch" "^0.9.0" + extract-files "^11.0.0" + meros "^1.2.1" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/executor-legacy-ws@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.6.tgz#4ed311b731db8fd5c99e66a66361afbf9c2109fc" + integrity sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg== + dependencies: + "@graphql-tools/utils" "^10.0.13" + "@types/ws" "^8.0.0" + isomorphic-ws "^5.0.0" + tslib "^2.4.0" + ws "^8.15.0" + +"@graphql-tools/executor@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.2.1.tgz#9aa132ac1839679fbd14810f7ad8a65e82c0db44" + integrity sha512-BP5UI1etbNOXmTSt7q4NL1+zsURFgh2pG+Hyt9K/xO0LlsfbSx59L5dHLerqZP7Js0xI6GYqrUQ4m29rUwUHJg== + dependencies: + "@graphql-tools/utils" "^10.0.13" + "@graphql-typed-document-node/core" "3.2.0" + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/git-loader@^8.0.0": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.5.tgz#77f9c2a35fdb3a403d33660ed11702720d4b016e" + integrity sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "8.3.0" + "@graphql-tools/utils" "^10.0.13" + is-glob "4.0.3" + micromatch "^4.0.4" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/github-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.1.tgz#011e1f9495d42a55139a12f576cc6bb04943ecf4" + integrity sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/executor-http" "^1.0.9" + "@graphql-tools/graphql-tag-pluck" "^8.0.0" + "@graphql-tools/utils" "^10.0.13" + "@whatwg-node/fetch" "^0.9.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/graphql-file-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.1.tgz#03869b14cb91d0ef539df8195101279bb2df9c9e" + integrity sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA== + dependencies: + "@graphql-tools/import" "7.0.1" + "@graphql-tools/utils" "^10.0.13" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/graphql-tag-pluck@8.3.0", "@graphql-tools/graphql-tag-pluck@^8.0.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz#11bb8c627253137b39b34fb765cd6ebe506388b9" + integrity sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw== + dependencies: + "@babel/core" "^7.22.9" + "@babel/parser" "^7.16.8" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@graphql-tools/utils" "^10.0.13" + tslib "^2.4.0" + +"@graphql-tools/import@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.1.tgz#4e0d181c63350b1c926ae91b84a4cbaf03713c2c" + integrity sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w== + dependencies: + "@graphql-tools/utils" "^10.0.13" + resolve-from "5.0.0" + tslib "^2.4.0" + +"@graphql-tools/json-file-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.1.tgz#3fcfe869f22d8129a74369da69bf491c0bff7c2d" + integrity sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA== + dependencies: + "@graphql-tools/utils" "^10.0.13" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/load@^8.0.0": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.2.tgz#47d9916bf96dea05df27f11b53812f4327d9b6d2" + integrity sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA== + dependencies: + "@graphql-tools/schema" "^10.0.3" + "@graphql-tools/utils" "^10.0.13" + p-limit "3.1.0" + tslib "^2.4.0" + +"@graphql-tools/merge@^9.0.0", "@graphql-tools/merge@^9.0.3": + version "9.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.3.tgz#4d0b467132e6f788b69fab803d31480b8ce4b61a" + integrity sha512-FeKv9lKLMwqDu0pQjPpF59GY3HReUkWXKsMIuMuJQOKh9BETu7zPEFUELvcw8w+lwZkl4ileJsHXC9+AnsT2Lw== + dependencies: + "@graphql-tools/utils" "^10.0.13" + tslib "^2.4.0" + +"@graphql-tools/optimize@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-2.0.0.tgz#7a9779d180824511248a50c5a241eff6e7a2d906" + integrity sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/prisma-loader@^8.0.0": + version "8.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.3.tgz#a41acb41629cf5327834bedd259939024cf774ba" + integrity sha512-oZhxnMr3Jw2WAW1h9FIhF27xWzIB7bXWM8olz4W12oII4NiZl7VRkFw9IT50zME2Bqi9LGh9pkmMWkjvbOpl+Q== + dependencies: + "@graphql-tools/url-loader" "^8.0.2" + "@graphql-tools/utils" "^10.0.13" + "@types/js-yaml" "^4.0.0" + "@types/json-stable-stringify" "^1.0.32" + "@whatwg-node/fetch" "^0.9.0" + chalk "^4.1.0" + debug "^4.3.1" + dotenv "^16.0.0" + graphql-request "^6.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + jose "^5.0.0" + js-yaml "^4.0.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.20" + scuid "^1.1.0" + tslib "^2.4.0" + yaml-ast-parser "^0.0.43" + +"@graphql-tools/relay-operation-optimizer@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.1.tgz#8ac33e1d2626b6816d9283769c4a05c062b8065a" + integrity sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "^10.0.13" + tslib "^2.4.0" + +"@graphql-tools/schema@^10.0.0", "@graphql-tools/schema@^10.0.3": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.3.tgz#48c14be84cc617c19c4c929258672b6ab01768de" + integrity sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog== + dependencies: + "@graphql-tools/merge" "^9.0.3" + "@graphql-tools/utils" "^10.0.13" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/url-loader@^8.0.0", "@graphql-tools/url-loader@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.2.tgz#ee8e10a85d82c72662f6bc6bbc7b408510a36ebd" + integrity sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/delegate" "^10.0.4" + "@graphql-tools/executor-graphql-ws" "^1.1.2" + "@graphql-tools/executor-http" "^1.0.9" + "@graphql-tools/executor-legacy-ws" "^1.0.6" + "@graphql-tools/utils" "^10.0.13" + "@graphql-tools/wrap" "^10.0.2" + "@types/ws" "^8.0.0" + "@whatwg-node/fetch" "^0.9.0" + isomorphic-ws "^5.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.11" + ws "^8.12.0" + +"@graphql-tools/utils@^10.0.0", "@graphql-tools/utils@^10.0.13": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.1.0.tgz#d8c23a8b8636a5df59b14991bf25eae5ac15d314" + integrity sha512-wLPqhgeZ9BZJPRoaQbsDN/CtJDPd/L4qmmtPkjI3NuYJ39x+Eqz1Sh34EAGMuDh+xlOHqBwHczkZUpoK9tvzjw== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + cross-inspect "1.0.0" + dset "^3.1.2" + tslib "^2.4.0" + +"@graphql-tools/wrap@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.2.tgz#87f510b5f35db2771e7743bc3d71059ee4adaf09" + integrity sha512-nb/YjBcyF02KBCy3hiyw0nBKIC+qkiDY/tGMCcIe4pM6BPEcnreaPhXA28Rdge7lKtySF4Mhbc86XafFH5bIkQ== + dependencies: + "@graphql-tools/delegate" "^10.0.4" + "@graphql-tools/schema" "^10.0.3" + "@graphql-tools/utils" "^10.0.13" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" @@ -3421,6 +4283,11 @@ dependencies: glob-to-regexp "^0.4.1" +"@kamilkisiela/fast-url-parser@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz#9d68877a489107411b953c54ea65d0658b515809" + integrity sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew== + "@ledgerhq/connect-kit-loader@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@ledgerhq/connect-kit-loader/-/connect-kit-loader-1.1.0.tgz#10343b78ef13436818bf3453568a559c0eeb9d48" @@ -5247,6 +6114,33 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@peculiar/asn1-schema@^2.3.8": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz#04b38832a814e25731232dd5be883460a156da3b" + integrity sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.5" + tslib "^2.6.2" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz#424bed6b0d133b772f5cbffd143d0468a90f40a0" + integrity sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw== + dependencies: + "@peculiar/asn1-schema" "^2.3.8" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.5" + tslib "^2.6.2" + webcrypto-core "^1.7.8" + "@phenomnomnominal/tsquery@4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df" @@ -5428,6 +6322,11 @@ "@remixproject/plugin-utils" "0.3.42" events "3.2.0" +"@repeaterjs/repeater@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.5.tgz#b77571685410217a548a9c753aa3cdfc215bfc78" + integrity sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA== + "@restart/context@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" @@ -6371,6 +7270,11 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/js-yaml@^4.0.0": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== + "@types/json-schema@*", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -6381,6 +7285,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-stable-stringify@^1.0.32": + version "1.0.36" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz#fe6c6001a69ff8160a772da08779448a333c7ddd" + integrity sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -6760,6 +7669,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.0.0": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + "@types/ws@^8.5.4": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" @@ -7492,17 +8408,103 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@whatwg-node/events@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" + integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== + +"@whatwg-node/events@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.1.tgz#0ca718508249419587e130da26d40e29d99b5356" + integrity sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w== + +"@whatwg-node/fetch@^0.8.0": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" + integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.6" + busboy "^1.6.0" + urlpattern-polyfill "^8.0.0" + web-streams-polyfill "^3.2.1" + +"@whatwg-node/fetch@^0.9.0": + version "0.9.16" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.16.tgz#c833eb714f41f5d2caf1a345bed7a05f56db7b16" + integrity sha512-mqasZiUNquRe3ea9+aCAuo81BR6vq5opUKprPilIHTnrg8a21Z1T1OrI+KiMFX8OmwO5HUJe/vro47lpj2JPWQ== + dependencies: + "@whatwg-node/node-fetch" "^0.5.5" + urlpattern-polyfill "^10.0.0" + +"@whatwg-node/node-fetch@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" + integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== + dependencies: + "@whatwg-node/events" "^0.0.3" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + +"@whatwg-node/node-fetch@^0.5.5": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.5.6.tgz#3ec2044ff66dd78134492b5f2f841bedf1cc73c9" + integrity sha512-cmAsGMHoI0S3AHi3CmD3ma1Q234ZI2JNmXyDyM9rLtbXejBKxU3ZWdhS+mzRIAyUxZCMGlFW1tHmROv0MDdxpw== + dependencies: + "@kamilkisiela/fast-url-parser" "^1.1.4" + "@whatwg-node/events" "^0.1.0" + busboy "^1.6.0" + fast-querystring "^1.1.1" + tslib "^2.3.1" + +"@wry/caches@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@wry/caches/-/caches-1.0.1.tgz#8641fd3b6e09230b86ce8b93558d44cf1ece7e52" + integrity sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA== + dependencies: + tslib "^2.3.0" + +"@wry/context@^0.7.0": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.4.tgz#e32d750fa075955c4ab2cfb8c48095e1d42d5990" + integrity sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.6": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.7.tgz#72ec1a73760943d439d56b7b1e9985aec5d497bb" + integrity sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" + integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== dependencies: - envinfo "^7.7.3" + tslib "^2.3.0" -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== +"@wry/trie@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.5.0.tgz#11e783f3a53f6e4cd1d42d2d1323f5bc3fa99c94" + integrity sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA== + dependencies: + tslib "^2.3.0" "@xenova/transformers@^2.7.0": version "2.7.0" @@ -8351,6 +9353,15 @@ asn1@~0.2.3: resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" integrity sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w== +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" @@ -8490,6 +9501,11 @@ author-regex@^1.0.0: resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" integrity sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g== +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + autoprefixer@^10.4.9: version "10.4.12" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" @@ -8875,6 +9891,11 @@ babel-plugin-syntax-trailing-function-commas@^6.22.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + babel-plugin-syntax-typescript@7.0.0-alpha.19: version "7.0.0-alpha.19" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-typescript/-/babel-plugin-syntax-typescript-7.0.0-alpha.19.tgz#fc5876863db297549f5d840d248eac3310241f84" @@ -9184,6 +10205,39 @@ babel-preset-env@^1.7.0: invariant "^2.2.2" semver "^5.3.0" +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + babel-preset-jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" @@ -9935,6 +10989,16 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -10082,6 +11146,13 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -10352,6 +11423,11 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001412.tgz#30f67d55a865da43e0aeec003f073ea8764d5d7c" integrity sha512-+TeEIee1gS5bYOiuf+PS/kp2mrXic37Hl66VY6EAfxasIk5fELTktK2oOezYed12H8w7jt3s512PpulQidPjwA== +caniuse-lite@^1.0.30001587: + version "1.0.30001589" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb" + integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== + canvg@^3.0.6: version "3.0.10" resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.10.tgz#8e52a2d088b6ffa23ac78970b2a9eebfae0ef4b3" @@ -10468,7 +11544,7 @@ chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -10476,7 +11552,23 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -change-case@^4.1.1: +change-case-all@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" + integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case@^4.1.1, change-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== @@ -10826,6 +11918,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -11065,7 +12162,7 @@ colorette@^2.0.10, colorette@^2.0.14: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== -colorette@^2.0.19: +colorette@^2.0.16, colorette@^2.0.19: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -11182,6 +12279,11 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== +common-tags@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -11444,6 +12546,11 @@ convert-source-map@^1.4.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" @@ -11633,6 +12740,16 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + crc-32@^1.2.0, crc-32@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" @@ -11703,6 +12820,13 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.6.12" +cross-inspect@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cross-inspect/-/cross-inspect-1.0.0.tgz#5fda1af759a148594d2d58394a9e21364f6849af" + integrity sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ== + dependencies: + tslib "^2.4.0" + cross-spawn-async@^2.1.1: version "2.2.5" resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" @@ -12126,6 +13250,11 @@ data-uri-to-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== +dataloader@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -12139,6 +13268,11 @@ deasync@^0.1.9: bindings "^1.5.0" node-addon-api "^1.7.1" +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -12466,6 +13600,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -12514,6 +13653,11 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + detect-libc@^2.0.0, detect-libc@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" @@ -12801,6 +13945,11 @@ dotenv@10.0.0, dotenv@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^16.0.0: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" @@ -12813,6 +13962,11 @@ dotignore@~0.1.2: dependencies: minimatch "^3.0.4" +dset@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2" + integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== + duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -12964,6 +14118,11 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz#2f68a062c38b7a04bf57f3e6954b868672fbdcd3" integrity sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw== +electron-to-chromium@^1.4.668: + version "1.4.681" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz#5f23fad8aa7e1f64cbb7dd9d15c7e39a1cd7e6e3" + integrity sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg== + electron@^24.4.0: version "24.4.0" resolved "https://registry.yarnpkg.com/electron/-/electron-24.4.0.tgz#48d05561dab6a5835ec1a3a96852797f69824eea" @@ -14261,6 +15420,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-files@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" + integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== + extract-zip@2.0.1, extract-zip@^2.0.0, extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -14303,6 +15467,11 @@ fast-async@^7.0.6: nodent-runtime "^3.2.1" nodent-transform "^3.2.4" +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -14367,6 +15536,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-querystring@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== + dependencies: + fast-decode-uri-component "^1.0.1" + fast-redact@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" @@ -14387,6 +15563,13 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -14497,7 +15680,7 @@ figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@3.2.0: +figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -15765,7 +16948,7 @@ globby@10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.1.0: +globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -15911,6 +17094,48 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql-config@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-5.0.3.tgz#d9aa2954cf47a927f9cb83cdc4e42ae55d0b321e" + integrity sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ== + dependencies: + "@graphql-tools/graphql-file-loader" "^8.0.0" + "@graphql-tools/json-file-loader" "^8.0.0" + "@graphql-tools/load" "^8.0.0" + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + cosmiconfig "^8.1.0" + jiti "^1.18.2" + minimatch "^4.2.3" + string-env-interpolation "^1.0.1" + tslib "^2.4.0" + +graphql-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql-tag@^2.11.0, graphql-tag@^2.12.6: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql-ws@^5.14.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.15.0.tgz#2db79e1b42468a8363bf5ca6168d076e2f8fdebc" + integrity sha512-xWGAtm3fig9TIhSaNsg0FaDZ8Pyn/3re3RFlP4rhQcmjRDIPpk1EhRuNB+YSJtLzttyuToaDiNhwT1OMoGnJnw== + +graphql@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -16657,6 +17882,11 @@ immutable@^4.0.0-rc.12: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== + import-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" @@ -16672,7 +17902,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -16680,6 +17910,11 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + import-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" @@ -16822,6 +18057,27 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^8.0.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + insert-css@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-0.2.0.tgz#d15789971662d9899c28977fb6220d5381d2451a" @@ -17348,6 +18604,13 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" +is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -17362,13 +18625,6 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" @@ -17391,6 +18647,13 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -17659,6 +18922,13 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -18384,6 +19654,11 @@ jest-worker@^29.1.2: merge-stream "^2.0.0" supports-color "^8.0.0" +jiti@^1.17.1, jiti@^1.18.2: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + jju@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" @@ -18396,6 +19671,11 @@ jodid25519@^1.0.0: dependencies: jsbn "~0.1.0" +jose@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.2.2.tgz#b91170e9ba6dbe609b0c0a86568f9a1fbe4335c0" + integrity sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg== + jquery@^3.3.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -18448,7 +19728,7 @@ js-yaml@4.0.0: dependencies: argparse "^2.0.1" -js-yaml@4.1.0, js-yaml@^4.1.0: +js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -18564,6 +19844,14 @@ json-text-sequence@~0.1.0: dependencies: delimit-stream "0.1.0" +json-to-pretty-yaml@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" + integrity sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A== + dependencies: + remedial "^1.0.7" + remove-trailing-spaces "^1.0.6" + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -18576,7 +19864,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -19120,6 +20408,20 @@ lint-staged@^13.2.3: string-argv "^0.3.1" yaml "^2.2.2" +listr2@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + listr2@^5.0.3, listr2@^5.0.7: version "5.0.8" resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" @@ -19543,7 +20845,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.0, lodash@~4.17.5: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -19633,6 +20935,13 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" @@ -20200,6 +21509,11 @@ merge@^2.1.1: resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== +meros@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" + integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -20663,6 +21977,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.3.tgz#b4dcece1d674dee104bb0fb833ebb85a78cbbca6" + integrity sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" @@ -21199,6 +22520,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + mute-stream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -21605,6 +22931,11 @@ node-notifier@^4.2.3: shellwords "^0.1.0" which "^1.0.5" +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" @@ -22079,6 +23410,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -22488,6 +23824,16 @@ opener@~1.4.3: resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= +optimism@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.0.tgz#e7bb38b24715f3fdad8a9a7fc18e999144bbfa63" + integrity sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ== + dependencies: + "@wry/caches" "^1.0.0" + "@wry/context" "^0.7.0" + "@wry/trie" "^0.4.3" + tslib "^2.3.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -22525,7 +23871,7 @@ options@>=0.0.5: resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" integrity sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg== -ora@5.4.1, ora@^5.1.0: +ora@5.4.1, ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -22656,6 +24002,13 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@3.1.0, p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -22677,13 +24030,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -22900,7 +24246,7 @@ parse-duration@^0.4.4: resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== -parse-filepath@^1.0.1: +parse-filepath@^1.0.1, parse-filepath@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= @@ -23329,6 +24675,11 @@ plur@^1.0.0: resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= +pluralize@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + pngjs@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" @@ -24136,6 +25487,18 @@ pure-color@^1.2.0: resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== +pvtsutils@^1.3.2, pvtsutils@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -24262,6 +25625,15 @@ r1csfile@0.0.45: fastfile "0.0.20" ffjavascript "0.2.57" +ra-data-graphql@^4.16.11: + version "4.16.11" + resolved "https://registry.yarnpkg.com/ra-data-graphql/-/ra-data-graphql-4.16.11.tgz#974e87ea178aec547407372c2c32018333c2ac52" + integrity sha512-mJ1xWYjdgJu8mKwMRZfU/0+ZdLC3y6QES0hpc2kLuVvB2t3OtecYMB0WwfQnyekt+qZ1Chj6sMLtEvUCAZcpkA== + dependencies: + "@apollo/client" "^3.3.19" + lodash "~4.17.5" + pluralize "~7.0.0" + raf-schd@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" @@ -25151,6 +26523,20 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +rehackt@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.0.5.tgz#184c82ea369d5b0b989ede0593ebea8b2bcfb1d6" + integrity sha512-BI1rV+miEkaHj8zd2n+gaMgzu/fKz7BGlb4zZ6HAiY9adDmJMkaDcmuXlJFv0eyKUob+oszs3/2gdnXUrzx2Tg== + +relay-runtime@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" + integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + invariant "^2.2.4" + release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" @@ -25187,6 +26573,11 @@ remark-rehype@^10.0.0: mdast-util-to-hast "^12.1.0" unified "^10.0.0" +remedial@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" + integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== + remove-bom-buffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" @@ -25209,6 +26600,11 @@ remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +remove-trailing-spaces@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" + integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== + repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -25356,6 +26752,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -25366,11 +26767,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-options@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" @@ -25441,6 +26837,11 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" +response-iterator@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" + integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -25668,7 +27069,7 @@ rss-parser@^3.12.0: entities "^2.0.3" xml2js "^0.4.19" -run-async@^2.2.0: +run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -25713,7 +27114,7 @@ rxjs@^6.4.0, rxjs@^6.5.4, rxjs@^6.6.3: dependencies: tslib "^1.9.0" -rxjs@^7.8.0: +rxjs@^7.5.5, rxjs@^7.8.0: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -25853,6 +27254,11 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0: resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +scuid@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" + integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== + secp256k1@4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" @@ -25962,6 +27368,11 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: version "7.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" @@ -26195,6 +27606,11 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + shelljs@^0.7.5: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" @@ -26249,6 +27665,11 @@ signed-varint@^2.0.1: dependencies: varint "~5.0.0" +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -26756,6 +28177,13 @@ split@^1.0.0: dependencies: through "2" +sponge-case@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" + integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== + dependencies: + tslib "^2.0.3" + sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -26932,6 +28360,11 @@ stream-to-it@^0.2.0, stream-to-it@^0.2.1: dependencies: get-iterator "^1.0.2" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + streamx@^2.15.0: version "2.15.1" resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.1.tgz#396ad286d8bc3eeef8f5cea3f029e81237c024c6" @@ -26950,6 +28383,11 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== +string-env-interpolation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" + integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== + string-hash@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" @@ -27486,6 +28924,18 @@ svgpath@^2.3.0: resolved "https://registry.yarnpkg.com/svgpath/-/svgpath-2.6.0.tgz#5b160ef3d742b7dfd2d721bf90588d3450d7a90d" integrity sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg== +swap-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" + integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== + dependencies: + tslib "^2.0.3" + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" @@ -27834,6 +29284,13 @@ tiny-warning@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +title-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== + dependencies: + tslib "^2.0.3" + tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -28041,6 +29498,13 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + ts-loader@^9.2.6: version "9.2.6" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.6.tgz#9937c4dd0a1e3dbbb5e433f8102a6601c6615d74" @@ -28061,6 +29525,11 @@ ts-loader@^9.3.1: micromatch "^4.0.0" semver "^7.3.4" +ts-log@^2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" + integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== + ts-node@10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" @@ -28143,6 +29612,11 @@ tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== +tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2, tslib@~2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tslint@~6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.0.0.tgz#1c0148beac4779924216302f192cdaa153618310" @@ -28346,6 +29820,11 @@ typescript@^4.8.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + ua-parser-js@^1.0.35: version "1.0.37" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" @@ -28693,6 +30172,13 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -28716,6 +30202,14 @@ upath@^1.1.1, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-browserslist-db@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" @@ -28796,6 +30290,16 @@ url@^0.11.0, url@~0.11.0: punycode "1.3.2" querystring "0.2.0" +urlpattern-polyfill@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + +urlpattern-polyfill@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" + integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== + use-composed-ref@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" @@ -29020,6 +30524,11 @@ value-or-function@^3.0.0: resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= +value-or-promise@^1.0.11, value-or-promise@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" + integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== + varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" @@ -29262,6 +30771,11 @@ web-streams-polyfill@^3.1.0: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== +web-streams-polyfill@^3.2.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + web-worker@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" @@ -29478,6 +30992,17 @@ web3@^4.1.0: web3-utils "^4.0.7" web3-validator "^2.0.3" +webcrypto-core@^1.7.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.8.tgz#056918036e846c72cfebbb04052e283f57f1114a" + integrity sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg== + dependencies: + "@peculiar/asn1-schema" "^2.3.8" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.5" + tslib "^2.6.2" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -29876,7 +31401,7 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -30000,6 +31525,11 @@ ws@^7.3.1, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.12.0, ws@^8.13.0, ws@^8.15.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + ws@^8.4.2: version "8.9.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" @@ -30078,6 +31608,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml-ast-parser@^0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" @@ -30088,6 +31623,11 @@ yaml@^2.2.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== +yaml@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.0.tgz#2376db1083d157f4b3a452995803dbcf43b08140" + integrity sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ== + yargs-parser@20.2.4, yargs-parser@^20.2.2: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -30248,7 +31788,7 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.0.1: +yargs@^17.0.0, yargs@^17.0.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -30329,6 +31869,18 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + zod@^3.21.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From 4fa7238999ca1ae3a879e1afbc7753d853e78071 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 26 Feb 2024 08:53:08 +0100 Subject: [PATCH 14/71] codegen --- libs/remix-ui/git/src/types/codegen.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 libs/remix-ui/git/src/types/codegen.ts diff --git a/libs/remix-ui/git/src/types/codegen.ts b/libs/remix-ui/git/src/types/codegen.ts new file mode 100644 index 0000000000..f815d67ad5 --- /dev/null +++ b/libs/remix-ui/git/src/types/codegen.ts @@ -0,0 +1,20 @@ +import { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + schema: 'https://docs.github.com/public/schema.docs.graphql', + // this assumes that all your source files are in a top-level `src/` directory - you might need to adjust this to your file structure + documents: ['src/**/*.{ts,tsx}'], + generates: { + './libs/remix-ui/git/src/types/': { + preset: 'client', + plugins: [], + presetConfig: { + gqlTagName: 'gql', + } + } + }, + overwrite: true, + ignoreNoDocuments: true, +}; + +export default config; \ No newline at end of file From 66ef29f129351597952d194997fd105b9cf23652 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 26 Feb 2024 09:09:48 +0100 Subject: [PATCH 15/71] restore ts --- package.json | 2 +- yarn.lock | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/package.json b/package.json index 64f42c0e30..240235c8df 100644 --- a/package.json +++ b/package.json @@ -402,7 +402,7 @@ "timers-browserify": "^2.0.12", "ts-node": "10.9.1", "tslint": "~6.0.0", - "typescript": "^5.3.3", + "typescript": "^4.8.4", "uglify-js": "^2.8.16", "url": "^0.11.0", "vm-browserify": "^1.1.2", diff --git a/yarn.lock b/yarn.lock index ecfb44b88d..84c462b28a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30263,11 +30263,6 @@ typescript@^4.8.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== - ua-parser-js@^1.0.35: version "1.0.37" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" From f4380cece5e0b803acbbd6713cb8a4a43d943235 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 28 Feb 2024 07:48:56 +0100 Subject: [PATCH 16/71] types for gql --- .../components/navigation/commitdetails.tsx | 13 +- .../panels/branches/branchCommits.tsx | 20 +- libs/remix-ui/git/src/types/codegen.ts | 2 +- .../git/src/types/fragment-masking.ts | 67 + libs/remix-ui/git/src/types/gql.ts | 42 + libs/remix-ui/git/src/types/graphql.ts | 30771 ++++++++++++++++ libs/remix-ui/git/src/types/index.ts | 3 +- 7 files changed, 30904 insertions(+), 14 deletions(-) create mode 100644 libs/remix-ui/git/src/types/fragment-masking.ts create mode 100644 libs/remix-ui/git/src/types/gql.ts create mode 100644 libs/remix-ui/git/src/types/graphql.ts diff --git a/libs/remix-ui/git/src/components/navigation/commitdetails.tsx b/libs/remix-ui/git/src/components/navigation/commitdetails.tsx index 2a130d40b3..3643411dde 100644 --- a/libs/remix-ui/git/src/components/navigation/commitdetails.tsx +++ b/libs/remix-ui/git/src/components/navigation/commitdetails.tsx @@ -2,9 +2,18 @@ import { faCaretUp, faCaretDown, faCaretRight, faArrowUp, faArrowDown, faArrowRo import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { useContext, useEffect } from "react"; import { CommitSummary } from "../panels/commits/commitsummary"; +import { ReadCommitResult } from "isomorphic-git" -export const CommitDetailsNavigation = ({ eventKey, activePanel, callback, commit, checkout }) => { +interface CommitDetailsNavigationProps { + commit: ReadCommitResult, + checkout: (oid: string) => void + eventKey: string + activePanel: string + callback: (eventKey: string) => void +} +export const CommitDetailsNavigation = (props: CommitDetailsNavigationProps) => { + const { commit, checkout, eventKey, activePanel, callback } = props; const handleClick = () => { if (!callback) return if (activePanel === eventKey) { @@ -19,7 +28,7 @@ export const CommitDetailsNavigation = ({ eventKey, activePanel, callback, commi { activePanel === eventKey ? : } - +
    diff --git a/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx b/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx index 7562fb434e..cd85f8f542 100644 --- a/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/branchCommits.tsx @@ -1,7 +1,8 @@ import React from 'react'; -import { gql, useQuery } from '@apollo/client'; +import { useQuery } from '@apollo/client'; +import { gql } from './../../../types'; -const GET_COMMITS = gql` +const GET_COMMITS = gql(/* GraphQL */` query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) { repository(name: $name, owner: $owner) { ref(qualifiedName: "master") { @@ -28,7 +29,7 @@ const GET_COMMITS = gql` } } } -`; +`); export const BranchCommits = ({ owner, name }) => { @@ -38,7 +39,7 @@ export const BranchCommits = ({ owner, name }) => { if (loading) return

    Loading...

    ; - const { edges, pageInfo } = data.repository.ref.target.history; + const { edges, pageInfo } = (data.repository.ref.target.__typename === "Commit")? data.repository.ref.target.history : { edges: [], pageInfo: { endCursor: null, hasNextPage: false } }; const loadNextPage= ()=>{ fetchMore({ @@ -46,10 +47,10 @@ export const BranchCommits = ({ owner, name }) => { cursor: pageInfo.endCursor, }, updateQuery: (prevResult, { fetchMoreResult }) => { - const newEdges = fetchMoreResult.repository.ref.target.history.edges; - const pageInfo = fetchMoreResult.repository.ref.target.history.pageInfo; - - return newEdges.length + const newEdges = (fetchMoreResult.repository.ref.target.__typename === "Commit"? fetchMoreResult.repository.ref.target.history.edges : []) + const pageInfo = (fetchMoreResult.repository.ref.target.__typename === "Commit"? fetchMoreResult.repository.ref.target.history.pageInfo : {}) + + return newEdges.length && prevResult.repository.ref.target.__typename === "Commit" ? { repository: { __typename: prevResult.repository.__typename, @@ -65,7 +66,7 @@ export const BranchCommits = ({ owner, name }) => { }, }, }, - } + } as any : prevResult; }, }); @@ -73,7 +74,6 @@ export const BranchCommits = ({ owner, name }) => { return (
    -

    Commits

      {edges.map(({ node }) => (
    • diff --git a/libs/remix-ui/git/src/types/codegen.ts b/libs/remix-ui/git/src/types/codegen.ts index f815d67ad5..aaac7fe651 100644 --- a/libs/remix-ui/git/src/types/codegen.ts +++ b/libs/remix-ui/git/src/types/codegen.ts @@ -3,7 +3,7 @@ import { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { schema: 'https://docs.github.com/public/schema.docs.graphql', // this assumes that all your source files are in a top-level `src/` directory - you might need to adjust this to your file structure - documents: ['src/**/*.{ts,tsx}'], + documents: ['./libs/remix-ui/git/src/**/*.{ts,tsx}'], generates: { './libs/remix-ui/git/src/types/': { preset: 'client', diff --git a/libs/remix-ui/git/src/types/fragment-masking.ts b/libs/remix-ui/git/src/types/fragment-masking.ts new file mode 100644 index 0000000000..fbedede1f6 --- /dev/null +++ b/libs/remix-ui/git/src/types/fragment-masking.ts @@ -0,0 +1,67 @@ +/* eslint-disable */ +import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core'; +import { FragmentDefinitionNode } from 'graphql'; +import { Incremental } from './graphql'; + + +export type FragmentType> = TDocumentType extends DocumentTypeDecoration< + infer TType, + any +> + ? [TType] extends [{ ' $fragmentName'?: infer TKey }] + ? TKey extends string + ? { ' $fragmentRefs'?: { [key in TKey]: TType } } + : never + : never + : never; + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> +): TType; +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | null | undefined +): TType | null | undefined; +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> +): ReadonlyArray; +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> | null | undefined +): ReadonlyArray | null | undefined; +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | ReadonlyArray>> | null | undefined +): TType | ReadonlyArray | null | undefined { + return fragmentType as any; +} + + +export function makeFragmentData< + F extends DocumentTypeDecoration, + FT extends ResultOf +>(data: FT, _fragment: F): FragmentType { + return data as FragmentType; +} +export function isFragmentReady( + queryNode: DocumentTypeDecoration, + fragmentNode: TypedDocumentNode, + data: FragmentType, any>> | null | undefined +): data is FragmentType { + const deferredFields = (queryNode as { __meta__?: { deferredFields: Record } }).__meta__ + ?.deferredFields; + + if (!deferredFields) return true; + + const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined; + const fragName = fragDef?.name?.value; + + const fields = (fragName && deferredFields[fragName]) || []; + return fields.length > 0 && fields.every(field => data && field in data); +} diff --git a/libs/remix-ui/git/src/types/gql.ts b/libs/remix-ui/git/src/types/gql.ts new file mode 100644 index 0000000000..aed8d177c9 --- /dev/null +++ b/libs/remix-ui/git/src/types/gql.ts @@ -0,0 +1,42 @@ +/* eslint-disable */ +import * as types from './graphql'; +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; + +/** + * Map of all GraphQL operations in the project. + * + * This map has several performance disadvantages: + * 1. It is not tree-shakeable, so it will include all operations in the project. + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. + * 3. It does not support dead code elimination, so it will add unused operations. + * + * Therefore it is highly recommended to use the babel or swc plugin for production. + */ +const documents = { + "\n query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) {\n repository(name: $name, owner: $owner) {\n ref(qualifiedName: \"master\") {\n target {\n ... on Commit {\n history(first: $limit, after: $cursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n node {\n oid\n messageHeadline\n author {\n name\n date\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.GetCommitsDocument, +}; + +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + * + * + * @example + * ```ts + * const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`); + * ``` + * + * The query argument is unknown! + * Please regenerate the types. + */ +export function gql(source: string): unknown; + +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function gql(source: "\n query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) {\n repository(name: $name, owner: $owner) {\n ref(qualifiedName: \"master\") {\n target {\n ... on Commit {\n history(first: $limit, after: $cursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n node {\n oid\n messageHeadline\n author {\n name\n date\n }\n }\n }\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) {\n repository(name: $name, owner: $owner) {\n ref(qualifiedName: \"master\") {\n target {\n ... on Commit {\n history(first: $limit, after: $cursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n node {\n oid\n messageHeadline\n author {\n name\n date\n }\n }\n }\n }\n }\n }\n }\n }\n }\n"]; + +export function gql(source: string) { + return (documents as any)[source] ?? {}; +} + +export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/libs/remix-ui/git/src/types/graphql.ts b/libs/remix-ui/git/src/types/graphql.ts new file mode 100644 index 0000000000..6fa57dc229 --- /dev/null +++ b/libs/remix-ui/git/src/types/graphql.ts @@ -0,0 +1,30771 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + /** A (potentially binary) string encoded using base64. */ + Base64String: { input: any; output: any; } + /** + * Represents non-fractional signed whole numeric values. Since the value may + * exceed the size of a 32-bit integer, it's encoded as a string. + */ + BigInt: { input: any; output: any; } + /** An ISO-8601 encoded date string. */ + Date: { input: any; output: any; } + /** An ISO-8601 encoded UTC date string. */ + DateTime: { input: any; output: any; } + /** A Git object ID. */ + GitObjectID: { input: any; output: any; } + /** A fully qualified reference name (e.g. `refs/heads/master`). */ + GitRefname: { input: any; output: any; } + /** Git SSH string */ + GitSSHRemote: { input: any; output: any; } + /** An ISO-8601 encoded date string. Unlike the DateTime type, GitTimestamp is not converted in UTC. */ + GitTimestamp: { input: any; output: any; } + /** A string containing HTML code. */ + HTML: { input: any; output: any; } + /** An ISO-8601 encoded UTC date string with millisecond precision. */ + PreciseDateTime: { input: any; output: any; } + /** An RFC 3986, RFC 3987, and RFC 6570 (level 4) compliant URI string. */ + URI: { input: any; output: any; } + /** A valid x509 certificate string */ + X509Certificate: { input: any; output: any; } +}; + +/** Autogenerated input type of AbortQueuedMigrations */ +export type AbortQueuedMigrationsInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the organization that is running the migrations. */ + ownerId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AbortQueuedMigrations */ +export type AbortQueuedMigrationsPayload = { + __typename?: 'AbortQueuedMigrationsPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** Did the operation succeed? */ + success?: Maybe; +}; + +/** Autogenerated input type of AbortRepositoryMigration */ +export type AbortRepositoryMigrationInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the migration to be aborted. */ + migrationId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AbortRepositoryMigration */ +export type AbortRepositoryMigrationPayload = { + __typename?: 'AbortRepositoryMigrationPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** Did the operation succeed? */ + success?: Maybe; +}; + +/** Autogenerated input type of AcceptEnterpriseAdministratorInvitation */ +export type AcceptEnterpriseAdministratorInvitationInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The id of the invitation being accepted */ + invitationId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AcceptEnterpriseAdministratorInvitation */ +export type AcceptEnterpriseAdministratorInvitationPayload = { + __typename?: 'AcceptEnterpriseAdministratorInvitationPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The invitation that was accepted. */ + invitation?: Maybe; + /** A message confirming the result of accepting an administrator invitation. */ + message?: Maybe; +}; + +/** Autogenerated input type of AcceptTopicSuggestion */ +export type AcceptTopicSuggestionInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** + * The name of the suggested topic. + * + * **Upcoming Change on 2024-04-01 UTC** + * **Description:** `name` will be removed. + * **Reason:** Suggested topics are no longer supported + */ + name?: InputMaybe; + /** + * The Node ID of the repository. + * + * **Upcoming Change on 2024-04-01 UTC** + * **Description:** `repositoryId` will be removed. + * **Reason:** Suggested topics are no longer supported + */ + repositoryId?: InputMaybe; +}; + +/** Autogenerated return type of AcceptTopicSuggestion */ +export type AcceptTopicSuggestionPayload = { + __typename?: 'AcceptTopicSuggestionPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** + * The accepted topic. + * @deprecated Suggested topics are no longer supported Removal on 2024-04-01 UTC. + */ + topic?: Maybe; +}; + +/** Represents an object which can take actions on GitHub. Typically a User or Bot. */ +export type Actor = { + /** A URL pointing to the actor's public avatar. */ + avatarUrl: Scalars['URI']['output']; + /** The username of the actor. */ + login: Scalars['String']['output']; + /** The HTTP path for this actor. */ + resourcePath: Scalars['URI']['output']; + /** The HTTP URL for this actor. */ + url: Scalars['URI']['output']; +}; + + +/** Represents an object which can take actions on GitHub. Typically a User or Bot. */ +export type ActorAvatarUrlArgs = { + size?: InputMaybe; +}; + +/** Location information for an actor */ +export type ActorLocation = { + __typename?: 'ActorLocation'; + /** City */ + city?: Maybe; + /** Country name */ + country?: Maybe; + /** Country code */ + countryCode?: Maybe; + /** Region name */ + region?: Maybe; + /** Region or state code */ + regionCode?: Maybe; +}; + +/** The actor's type. */ +export enum ActorType { + /** Indicates a team actor. */ + Team = 'TEAM', + /** Indicates a user actor. */ + User = 'USER' +} + +/** Autogenerated input type of AddAssigneesToAssignable */ +export type AddAssigneesToAssignableInput = { + /** The id of the assignable object to add assignees to. */ + assignableId: Scalars['ID']['input']; + /** The id of users to add as assignees. */ + assigneeIds: Array; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; +}; + +/** Autogenerated return type of AddAssigneesToAssignable */ +export type AddAssigneesToAssignablePayload = { + __typename?: 'AddAssigneesToAssignablePayload'; + /** The item that was assigned. */ + assignable?: Maybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; +}; + +/** Autogenerated input type of AddComment */ +export type AddCommentInput = { + /** The contents of the comment. */ + body: Scalars['String']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the subject to modify. */ + subjectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddComment */ +export type AddCommentPayload = { + __typename?: 'AddCommentPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The edge from the subject's comment connection. */ + commentEdge?: Maybe; + /** The subject */ + subject?: Maybe; + /** The edge from the subject's timeline connection. */ + timelineEdge?: Maybe; +}; + +/** Autogenerated input type of AddDiscussionComment */ +export type AddDiscussionCommentInput = { + /** The contents of the comment. */ + body: Scalars['String']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the discussion to comment on. */ + discussionId: Scalars['ID']['input']; + /** The Node ID of the discussion comment within this discussion to reply to. */ + replyToId?: InputMaybe; +}; + +/** Autogenerated return type of AddDiscussionComment */ +export type AddDiscussionCommentPayload = { + __typename?: 'AddDiscussionCommentPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The newly created discussion comment. */ + comment?: Maybe; +}; + +/** Autogenerated input type of AddDiscussionPollVote */ +export type AddDiscussionPollVoteInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the discussion poll option to vote for. */ + pollOptionId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddDiscussionPollVote */ +export type AddDiscussionPollVotePayload = { + __typename?: 'AddDiscussionPollVotePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The poll option that a vote was added to. */ + pollOption?: Maybe; +}; + +/** Autogenerated input type of AddEnterpriseOrganizationMember */ +export type AddEnterpriseOrganizationMemberInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the enterprise which owns the organization. */ + enterpriseId: Scalars['ID']['input']; + /** The ID of the organization the users will be added to. */ + organizationId: Scalars['ID']['input']; + /** The role to assign the users in the organization */ + role?: InputMaybe; + /** The IDs of the enterprise members to add. */ + userIds: Array; +}; + +/** Autogenerated return type of AddEnterpriseOrganizationMember */ +export type AddEnterpriseOrganizationMemberPayload = { + __typename?: 'AddEnterpriseOrganizationMemberPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The users who were added to the organization. */ + users?: Maybe>; +}; + +/** Autogenerated input type of AddEnterpriseSupportEntitlement */ +export type AddEnterpriseSupportEntitlementInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the Enterprise which the admin belongs to. */ + enterpriseId: Scalars['ID']['input']; + /** The login of a member who will receive the support entitlement. */ + login: Scalars['String']['input']; +}; + +/** Autogenerated return type of AddEnterpriseSupportEntitlement */ +export type AddEnterpriseSupportEntitlementPayload = { + __typename?: 'AddEnterpriseSupportEntitlementPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** A message confirming the result of adding the support entitlement. */ + message?: Maybe; +}; + +/** Autogenerated input type of AddLabelsToLabelable */ +export type AddLabelsToLabelableInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ids of the labels to add. */ + labelIds: Array; + /** The id of the labelable object to add labels to. */ + labelableId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddLabelsToLabelable */ +export type AddLabelsToLabelablePayload = { + __typename?: 'AddLabelsToLabelablePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The item that was labeled. */ + labelable?: Maybe; +}; + +/** Autogenerated input type of AddProjectCard */ +export type AddProjectCardInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The content of the card. Must be a member of the ProjectCardItem union */ + contentId?: InputMaybe; + /** The note on the card. */ + note?: InputMaybe; + /** The Node ID of the ProjectColumn. */ + projectColumnId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddProjectCard */ +export type AddProjectCardPayload = { + __typename?: 'AddProjectCardPayload'; + /** The edge from the ProjectColumn's card connection. */ + cardEdge?: Maybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The ProjectColumn */ + projectColumn?: Maybe; +}; + +/** Autogenerated input type of AddProjectColumn */ +export type AddProjectColumnInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The name of the column. */ + name: Scalars['String']['input']; + /** The Node ID of the project. */ + projectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddProjectColumn */ +export type AddProjectColumnPayload = { + __typename?: 'AddProjectColumnPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The edge from the project's column connection. */ + columnEdge?: Maybe; + /** The project */ + project?: Maybe; +}; + +/** Autogenerated input type of AddProjectV2DraftIssue */ +export type AddProjectV2DraftIssueInput = { + /** The IDs of the assignees of the draft issue. */ + assigneeIds?: InputMaybe>; + /** The body of the draft issue. */ + body?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the Project to add the draft issue to. */ + projectId: Scalars['ID']['input']; + /** + * The title of the draft issue. A project item can also be created by providing + * the URL of an Issue or Pull Request if you have access. + */ + title: Scalars['String']['input']; +}; + +/** Autogenerated return type of AddProjectV2DraftIssue */ +export type AddProjectV2DraftIssuePayload = { + __typename?: 'AddProjectV2DraftIssuePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The draft issue added to the project. */ + projectItem?: Maybe; +}; + +/** Autogenerated input type of AddProjectV2ItemById */ +export type AddProjectV2ItemByIdInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The id of the Issue or Pull Request to add. */ + contentId: Scalars['ID']['input']; + /** The ID of the Project to add the item to. */ + projectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddProjectV2ItemById */ +export type AddProjectV2ItemByIdPayload = { + __typename?: 'AddProjectV2ItemByIdPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The item added to the project. */ + item?: Maybe; +}; + +/** Autogenerated input type of AddPullRequestReviewComment */ +export type AddPullRequestReviewCommentInput = { + /** + * The text of the comment. This field is required + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `body` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + body?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** + * The SHA of the commit to comment on. + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `commitOID` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + commitOID?: InputMaybe; + /** + * The comment id to reply to. + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `inReplyTo` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + inReplyTo?: InputMaybe; + /** + * The relative path of the file to comment on. + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `path` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + path?: InputMaybe; + /** + * The line index in the diff to comment on. + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `position` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + position?: InputMaybe; + /** + * The node ID of the pull request reviewing + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `pullRequestId` will be removed. use + * addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + pullRequestId?: InputMaybe; + /** + * The Node ID of the review to modify. + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `pullRequestReviewId` will be removed. use + * addPullRequestReviewThread or addPullRequestReviewThreadReply instead + * **Reason:** We are deprecating the addPullRequestReviewComment mutation + */ + pullRequestReviewId?: InputMaybe; +}; + +/** Autogenerated return type of AddPullRequestReviewComment */ +export type AddPullRequestReviewCommentPayload = { + __typename?: 'AddPullRequestReviewCommentPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The newly created comment. */ + comment?: Maybe; + /** The edge from the review's comment connection. */ + commentEdge?: Maybe; +}; + +/** Autogenerated input type of AddPullRequestReview */ +export type AddPullRequestReviewInput = { + /** The contents of the review body comment. */ + body?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** + * The review line comments. + * + * **Upcoming Change on 2023-10-01 UTC** + * **Description:** `comments` will be removed. use the `threads` argument instead + * **Reason:** We are deprecating comment fields that use diff-relative positioning + */ + comments?: InputMaybe>>; + /** The commit OID the review pertains to. */ + commitOID?: InputMaybe; + /** The event to perform on the pull request review. */ + event?: InputMaybe; + /** The Node ID of the pull request to modify. */ + pullRequestId: Scalars['ID']['input']; + /** The review line comment threads. */ + threads?: InputMaybe>>; +}; + +/** Autogenerated return type of AddPullRequestReview */ +export type AddPullRequestReviewPayload = { + __typename?: 'AddPullRequestReviewPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The newly created pull request review. */ + pullRequestReview?: Maybe; + /** The edge from the pull request's review connection. */ + reviewEdge?: Maybe; +}; + +/** Autogenerated input type of AddPullRequestReviewThread */ +export type AddPullRequestReviewThreadInput = { + /** Body of the thread's first comment. */ + body: Scalars['String']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** + * The line of the blob to which the thread refers, required for line-level + * threads. The end of the line range for multi-line comments. + */ + line?: InputMaybe; + /** Path to the file being commented on. */ + path: Scalars['String']['input']; + /** The node ID of the pull request reviewing */ + pullRequestId?: InputMaybe; + /** The Node ID of the review to modify. */ + pullRequestReviewId?: InputMaybe; + /** The side of the diff on which the line resides. For multi-line comments, this is the side for the end of the line range. */ + side?: InputMaybe; + /** The first line of the range to which the comment refers. */ + startLine?: InputMaybe; + /** The side of the diff on which the start line resides. */ + startSide?: InputMaybe; + /** The level at which the comments in the corresponding thread are targeted, can be a diff line or a file */ + subjectType?: InputMaybe; +}; + +/** Autogenerated return type of AddPullRequestReviewThread */ +export type AddPullRequestReviewThreadPayload = { + __typename?: 'AddPullRequestReviewThreadPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The newly created thread. */ + thread?: Maybe; +}; + +/** Autogenerated input type of AddPullRequestReviewThreadReply */ +export type AddPullRequestReviewThreadReplyInput = { + /** The text of the reply. */ + body: Scalars['String']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the pending review to which the reply will belong. */ + pullRequestReviewId?: InputMaybe; + /** The Node ID of the thread to which this reply is being written. */ + pullRequestReviewThreadId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddPullRequestReviewThreadReply */ +export type AddPullRequestReviewThreadReplyPayload = { + __typename?: 'AddPullRequestReviewThreadReplyPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The newly created reply. */ + comment?: Maybe; +}; + +/** Autogenerated input type of AddReaction */ +export type AddReactionInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The name of the emoji to react with. */ + content: ReactionContent; + /** The Node ID of the subject to modify. */ + subjectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddReaction */ +export type AddReactionPayload = { + __typename?: 'AddReactionPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The reaction object. */ + reaction?: Maybe; + /** The reaction groups for the subject. */ + reactionGroups?: Maybe>; + /** The reactable subject. */ + subject?: Maybe; +}; + +/** Autogenerated input type of AddStar */ +export type AddStarInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Starrable ID to star. */ + starrableId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddStar */ +export type AddStarPayload = { + __typename?: 'AddStarPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The starrable. */ + starrable?: Maybe; +}; + +/** Autogenerated input type of AddUpvote */ +export type AddUpvoteInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the discussion or comment to upvote. */ + subjectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddUpvote */ +export type AddUpvotePayload = { + __typename?: 'AddUpvotePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The votable subject. */ + subject?: Maybe; +}; + +/** Autogenerated input type of AddVerifiableDomain */ +export type AddVerifiableDomainInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The URL of the domain */ + domain: Scalars['URI']['input']; + /** The ID of the owner to add the domain to */ + ownerId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of AddVerifiableDomain */ +export type AddVerifiableDomainPayload = { + __typename?: 'AddVerifiableDomainPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The verifiable domain that was added. */ + domain?: Maybe; +}; + +/** Represents an 'added_to_merge_queue' event on a given pull request. */ +export type AddedToMergeQueueEvent = Node & { + __typename?: 'AddedToMergeQueueEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The user who added this Pull Request to the merge queue */ + enqueuer?: Maybe; + /** The Node ID of the AddedToMergeQueueEvent object */ + id: Scalars['ID']['output']; + /** The merge queue where this pull request was added to. */ + mergeQueue?: Maybe; + /** PullRequest referenced by event. */ + pullRequest?: Maybe; +}; + +/** Represents a 'added_to_project' event on a given issue or pull request. */ +export type AddedToProjectEvent = Node & { + __typename?: 'AddedToProjectEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The Node ID of the AddedToProjectEvent object */ + id: Scalars['ID']['output']; + /** Project referenced by event. */ + project?: Maybe; + /** Project card referenced by this project event. */ + projectCard?: Maybe; + /** Column name referenced by this project event. */ + projectColumnName: Scalars['String']['output']; +}; + +/** Represents an announcement banner. */ +export type AnnouncementBanner = { + /** The text of the announcement */ + announcement?: Maybe; + /** The expiration date of the announcement, if any */ + announcementExpiresAt?: Maybe; + /** Whether the announcement can be dismissed by the user */ + announcementUserDismissible?: Maybe; +}; + +/** A GitHub App. */ +export type App = Node & { + __typename?: 'App'; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The description of the app. */ + description?: Maybe; + /** The Node ID of the App object */ + id: Scalars['ID']['output']; + /** The IP addresses of the app. */ + ipAllowListEntries: IpAllowListEntryConnection; + /** The hex color code, without the leading '#', for the logo background. */ + logoBackgroundColor: Scalars['String']['output']; + /** A URL pointing to the app's logo. */ + logoUrl: Scalars['URI']['output']; + /** The name of the app. */ + name: Scalars['String']['output']; + /** A slug based on the name of the app for use in URLs. */ + slug: Scalars['String']['output']; + /** Identifies the date and time when the object was last updated. */ + updatedAt: Scalars['DateTime']['output']; + /** The URL to the app's homepage. */ + url: Scalars['URI']['output']; +}; + + +/** A GitHub App. */ +export type AppIpAllowListEntriesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** A GitHub App. */ +export type AppLogoUrlArgs = { + size?: InputMaybe; +}; + +/** Autogenerated input type of ApproveDeployments */ +export type ApproveDeploymentsInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** Optional comment for approving deployments */ + comment?: InputMaybe; + /** The ids of environments to reject deployments */ + environmentIds: Array; + /** The node ID of the workflow run containing the pending deployments. */ + workflowRunId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ApproveDeployments */ +export type ApproveDeploymentsPayload = { + __typename?: 'ApproveDeploymentsPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The affected deployments. */ + deployments?: Maybe>; +}; + +/** Autogenerated input type of ApproveVerifiableDomain */ +export type ApproveVerifiableDomainInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the verifiable domain to approve. */ + id: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ApproveVerifiableDomain */ +export type ApproveVerifiableDomainPayload = { + __typename?: 'ApproveVerifiableDomainPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The verifiable domain that was approved. */ + domain?: Maybe; +}; + +/** Autogenerated input type of ArchiveProjectV2Item */ +export type ArchiveProjectV2ItemInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the ProjectV2Item to archive. */ + itemId: Scalars['ID']['input']; + /** The ID of the Project to archive the item from. */ + projectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ArchiveProjectV2Item */ +export type ArchiveProjectV2ItemPayload = { + __typename?: 'ArchiveProjectV2ItemPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The item archived from the project. */ + item?: Maybe; +}; + +/** Autogenerated input type of ArchiveRepository */ +export type ArchiveRepositoryInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the repository to mark as archived. */ + repositoryId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ArchiveRepository */ +export type ArchiveRepositoryPayload = { + __typename?: 'ArchiveRepositoryPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The repository that was marked as archived. */ + repository?: Maybe; +}; + +/** An object that can have users assigned to it. */ +export type Assignable = { + /** A list of Users assigned to this object. */ + assignees: UserConnection; +}; + + +/** An object that can have users assigned to it. */ +export type AssignableAssigneesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** Represents an 'assigned' event on any assignable object. */ +export type AssignedEvent = Node & { + __typename?: 'AssignedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the assignable associated with the event. */ + assignable: Assignable; + /** Identifies the user or mannequin that was assigned. */ + assignee?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the AssignedEvent object */ + id: Scalars['ID']['output']; + /** + * Identifies the user who was assigned. + * @deprecated Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC. + */ + user?: Maybe; +}; + +/** Types that can be assigned to issues. */ +export type Assignee = Bot | Mannequin | Organization | User; + +/** An entry in the audit log. */ +export type AuditEntry = { + /** The action name */ + action: Scalars['String']['output']; + /** The user who initiated the action */ + actor?: Maybe; + /** The IP address of the actor */ + actorIp?: Maybe; + /** A readable representation of the actor's location */ + actorLocation?: Maybe; + /** The username of the user who initiated the action */ + actorLogin?: Maybe; + /** The HTTP path for the actor. */ + actorResourcePath?: Maybe; + /** The HTTP URL for the actor. */ + actorUrl?: Maybe; + /** The time the action was initiated */ + createdAt: Scalars['PreciseDateTime']['output']; + /** The corresponding operation type for the action */ + operationType?: Maybe; + /** The user affected by the action */ + user?: Maybe; + /** For actions involving two users, the actor is the initiator and the user is the affected user. */ + userLogin?: Maybe; + /** The HTTP path for the user. */ + userResourcePath?: Maybe; + /** The HTTP URL for the user. */ + userUrl?: Maybe; +}; + +/** Types that can initiate an audit log event. */ +export type AuditEntryActor = Bot | Organization | User; + +/** Ordering options for Audit Log connections. */ +export type AuditLogOrder = { + /** The ordering direction. */ + direction?: InputMaybe; + /** The field to order Audit Logs by. */ + field?: InputMaybe; +}; + +/** Properties by which Audit Log connections can be ordered. */ +export enum AuditLogOrderField { + /** Order audit log entries by timestamp */ + CreatedAt = 'CREATED_AT' +} + +/** Represents a 'auto_merge_disabled' event on a given pull request. */ +export type AutoMergeDisabledEvent = Node & { + __typename?: 'AutoMergeDisabledEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The user who disabled auto-merge for this Pull Request */ + disabler?: Maybe; + /** The Node ID of the AutoMergeDisabledEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event */ + pullRequest?: Maybe; + /** The reason auto-merge was disabled */ + reason?: Maybe; + /** The reason_code relating to why auto-merge was disabled */ + reasonCode?: Maybe; +}; + +/** Represents a 'auto_merge_enabled' event on a given pull request. */ +export type AutoMergeEnabledEvent = Node & { + __typename?: 'AutoMergeEnabledEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The user who enabled auto-merge for this Pull Request */ + enabler?: Maybe; + /** The Node ID of the AutoMergeEnabledEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event. */ + pullRequest?: Maybe; +}; + +/** Represents an auto-merge request for a pull request */ +export type AutoMergeRequest = { + __typename?: 'AutoMergeRequest'; + /** The email address of the author of this auto-merge request. */ + authorEmail?: Maybe; + /** + * The commit message of the auto-merge request. If a merge queue is required by + * the base branch, this value will be set by the merge queue when merging. + */ + commitBody?: Maybe; + /** + * The commit title of the auto-merge request. If a merge queue is required by + * the base branch, this value will be set by the merge queue when merging + */ + commitHeadline?: Maybe; + /** When was this auto-merge request was enabled. */ + enabledAt?: Maybe; + /** The actor who created the auto-merge request. */ + enabledBy?: Maybe; + /** + * The merge method of the auto-merge request. If a merge queue is required by + * the base branch, this value will be set by the merge queue when merging. + */ + mergeMethod: PullRequestMergeMethod; + /** The pull request that this auto-merge request is set against. */ + pullRequest: PullRequest; +}; + +/** Represents a 'auto_rebase_enabled' event on a given pull request. */ +export type AutoRebaseEnabledEvent = Node & { + __typename?: 'AutoRebaseEnabledEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The user who enabled auto-merge (rebase) for this Pull Request */ + enabler?: Maybe; + /** The Node ID of the AutoRebaseEnabledEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event. */ + pullRequest?: Maybe; +}; + +/** Represents a 'auto_squash_enabled' event on a given pull request. */ +export type AutoSquashEnabledEvent = Node & { + __typename?: 'AutoSquashEnabledEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The user who enabled auto-merge (squash) for this Pull Request */ + enabler?: Maybe; + /** The Node ID of the AutoSquashEnabledEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event. */ + pullRequest?: Maybe; +}; + +/** Represents a 'automatic_base_change_failed' event on a given pull request. */ +export type AutomaticBaseChangeFailedEvent = Node & { + __typename?: 'AutomaticBaseChangeFailedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the AutomaticBaseChangeFailedEvent object */ + id: Scalars['ID']['output']; + /** The new base for this PR */ + newBase: Scalars['String']['output']; + /** The old base for this PR */ + oldBase: Scalars['String']['output']; + /** PullRequest referenced by event. */ + pullRequest: PullRequest; +}; + +/** Represents a 'automatic_base_change_succeeded' event on a given pull request. */ +export type AutomaticBaseChangeSucceededEvent = Node & { + __typename?: 'AutomaticBaseChangeSucceededEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the AutomaticBaseChangeSucceededEvent object */ + id: Scalars['ID']['output']; + /** The new base for this PR */ + newBase: Scalars['String']['output']; + /** The old base for this PR */ + oldBase: Scalars['String']['output']; + /** PullRequest referenced by event. */ + pullRequest: PullRequest; +}; + +/** Represents a 'base_ref_changed' event on a given issue or pull request. */ +export type BaseRefChangedEvent = Node & { + __typename?: 'BaseRefChangedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Identifies the name of the base ref for the pull request after it was changed. */ + currentRefName: Scalars['String']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The Node ID of the BaseRefChangedEvent object */ + id: Scalars['ID']['output']; + /** Identifies the name of the base ref for the pull request before it was changed. */ + previousRefName: Scalars['String']['output']; + /** PullRequest referenced by event. */ + pullRequest: PullRequest; +}; + +/** Represents a 'base_ref_deleted' event on a given pull request. */ +export type BaseRefDeletedEvent = Node & { + __typename?: 'BaseRefDeletedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the name of the Ref associated with the `base_ref_deleted` event. */ + baseRefName?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the BaseRefDeletedEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event. */ + pullRequest?: Maybe; +}; + +/** Represents a 'base_ref_force_pushed' event on a given pull request. */ +export type BaseRefForcePushedEvent = Node & { + __typename?: 'BaseRefForcePushedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the after commit SHA for the 'base_ref_force_pushed' event. */ + afterCommit?: Maybe; + /** Identifies the before commit SHA for the 'base_ref_force_pushed' event. */ + beforeCommit?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the BaseRefForcePushedEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event. */ + pullRequest: PullRequest; + /** Identifies the fully qualified ref name for the 'base_ref_force_pushed' event. */ + ref?: Maybe; +}; + +/** Represents a Git blame. */ +export type Blame = { + __typename?: 'Blame'; + /** The list of ranges from a Git blame. */ + ranges: Array; +}; + +/** Represents a range of information from a Git blame. */ +export type BlameRange = { + __typename?: 'BlameRange'; + /** + * Identifies the recency of the change, from 1 (new) to 10 (old). This is + * calculated as a 2-quantile and determines the length of distance between the + * median age of all the changes in the file and the recency of the current + * range's change. + */ + age: Scalars['Int']['output']; + /** Identifies the line author */ + commit: Commit; + /** The ending line for the range */ + endingLine: Scalars['Int']['output']; + /** The starting line for the range */ + startingLine: Scalars['Int']['output']; +}; + +/** Represents a Git blob. */ +export type Blob = GitObject & Node & { + __typename?: 'Blob'; + /** An abbreviated version of the Git object ID */ + abbreviatedOid: Scalars['String']['output']; + /** Byte size of Blob object */ + byteSize: Scalars['Int']['output']; + /** The HTTP path for this Git object */ + commitResourcePath: Scalars['URI']['output']; + /** The HTTP URL for this Git object */ + commitUrl: Scalars['URI']['output']; + /** The Node ID of the Blob object */ + id: Scalars['ID']['output']; + /** Indicates whether the Blob is binary or text. Returns null if unable to determine the encoding. */ + isBinary?: Maybe; + /** Indicates whether the contents is truncated */ + isTruncated: Scalars['Boolean']['output']; + /** The Git object ID */ + oid: Scalars['GitObjectID']['output']; + /** The Repository the Git object belongs to */ + repository: Repository; + /** UTF8 text data or null if the Blob is binary */ + text?: Maybe; +}; + +/** A special type of user which takes actions on behalf of GitHub Apps. */ +export type Bot = Actor & Node & UniformResourceLocatable & { + __typename?: 'Bot'; + /** A URL pointing to the GitHub App's public avatar. */ + avatarUrl: Scalars['URI']['output']; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The Node ID of the Bot object */ + id: Scalars['ID']['output']; + /** The username of the actor. */ + login: Scalars['String']['output']; + /** The HTTP path for this bot */ + resourcePath: Scalars['URI']['output']; + /** Identifies the date and time when the object was last updated. */ + updatedAt: Scalars['DateTime']['output']; + /** The HTTP URL for this bot */ + url: Scalars['URI']['output']; +}; + + +/** A special type of user which takes actions on behalf of GitHub Apps. */ +export type BotAvatarUrlArgs = { + size?: InputMaybe; +}; + +/** Types which can be actors for `BranchActorAllowance` objects. */ +export type BranchActorAllowanceActor = App | Team | User; + +/** Parameters to be used for the branch_name_pattern rule */ +export type BranchNamePatternParameters = { + __typename?: 'BranchNamePatternParameters'; + /** How this rule will appear to users. */ + name?: Maybe; + /** If true, the rule will fail if the pattern matches. */ + negate: Scalars['Boolean']['output']; + /** The operator to use for matching. */ + operator: Scalars['String']['output']; + /** The pattern to match with. */ + pattern: Scalars['String']['output']; +}; + +/** Parameters to be used for the branch_name_pattern rule */ +export type BranchNamePatternParametersInput = { + /** How this rule will appear to users. */ + name?: InputMaybe; + /** If true, the rule will fail if the pattern matches. */ + negate?: InputMaybe; + /** The operator to use for matching. */ + operator: Scalars['String']['input']; + /** The pattern to match with. */ + pattern: Scalars['String']['input']; +}; + +/** A branch protection rule. */ +export type BranchProtectionRule = Node & { + __typename?: 'BranchProtectionRule'; + /** Can this branch be deleted. */ + allowsDeletions: Scalars['Boolean']['output']; + /** Are force pushes allowed on this branch. */ + allowsForcePushes: Scalars['Boolean']['output']; + /** Is branch creation a protected operation. */ + blocksCreations: Scalars['Boolean']['output']; + /** A list of conflicts matching branches protection rule and other branch protection rules */ + branchProtectionRuleConflicts: BranchProtectionRuleConflictConnection; + /** A list of actors able to force push for this branch protection rule. */ + bypassForcePushAllowances: BypassForcePushAllowanceConnection; + /** A list of actors able to bypass PRs for this branch protection rule. */ + bypassPullRequestAllowances: BypassPullRequestAllowanceConnection; + /** The actor who created this branch protection rule. */ + creator?: Maybe; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** Will new commits pushed to matching branches dismiss pull request review approvals. */ + dismissesStaleReviews: Scalars['Boolean']['output']; + /** The Node ID of the BranchProtectionRule object */ + id: Scalars['ID']['output']; + /** Can admins override branch protection. */ + isAdminEnforced: Scalars['Boolean']['output']; + /** + * Whether users can pull changes from upstream when the branch is locked. Set to + * `true` to allow fork syncing. Set to `false` to prevent fork syncing. + */ + lockAllowsFetchAndMerge: Scalars['Boolean']['output']; + /** Whether to set the branch as read-only. If this is true, users will not be able to push to the branch. */ + lockBranch: Scalars['Boolean']['output']; + /** Repository refs that are protected by this rule */ + matchingRefs: RefConnection; + /** Identifies the protection rule pattern. */ + pattern: Scalars['String']['output']; + /** A list push allowances for this branch protection rule. */ + pushAllowances: PushAllowanceConnection; + /** The repository associated with this branch protection rule. */ + repository?: Maybe; + /** Whether the most recent push must be approved by someone other than the person who pushed it */ + requireLastPushApproval: Scalars['Boolean']['output']; + /** Number of approving reviews required to update matching branches. */ + requiredApprovingReviewCount?: Maybe; + /** List of required deployment environments that must be deployed successfully to update matching branches */ + requiredDeploymentEnvironments?: Maybe>>; + /** List of required status check contexts that must pass for commits to be accepted to matching branches. */ + requiredStatusCheckContexts?: Maybe>>; + /** List of required status checks that must pass for commits to be accepted to matching branches. */ + requiredStatusChecks?: Maybe>; + /** Are approving reviews required to update matching branches. */ + requiresApprovingReviews: Scalars['Boolean']['output']; + /** Are reviews from code owners required to update matching branches. */ + requiresCodeOwnerReviews: Scalars['Boolean']['output']; + /** Are commits required to be signed. */ + requiresCommitSignatures: Scalars['Boolean']['output']; + /** Are conversations required to be resolved before merging. */ + requiresConversationResolution: Scalars['Boolean']['output']; + /** Does this branch require deployment to specific environments before merging */ + requiresDeployments: Scalars['Boolean']['output']; + /** Are merge commits prohibited from being pushed to this branch. */ + requiresLinearHistory: Scalars['Boolean']['output']; + /** Are status checks required to update matching branches. */ + requiresStatusChecks: Scalars['Boolean']['output']; + /** Are branches required to be up to date before merging. */ + requiresStrictStatusChecks: Scalars['Boolean']['output']; + /** Is pushing to matching branches restricted. */ + restrictsPushes: Scalars['Boolean']['output']; + /** Is dismissal of pull request reviews restricted. */ + restrictsReviewDismissals: Scalars['Boolean']['output']; + /** A list review dismissal allowances for this branch protection rule. */ + reviewDismissalAllowances: ReviewDismissalAllowanceConnection; +}; + + +/** A branch protection rule. */ +export type BranchProtectionRuleBranchProtectionRuleConflictsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A branch protection rule. */ +export type BranchProtectionRuleBypassForcePushAllowancesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A branch protection rule. */ +export type BranchProtectionRuleBypassPullRequestAllowancesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A branch protection rule. */ +export type BranchProtectionRuleMatchingRefsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + query?: InputMaybe; +}; + + +/** A branch protection rule. */ +export type BranchProtectionRulePushAllowancesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A branch protection rule. */ +export type BranchProtectionRuleReviewDismissalAllowancesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** A conflict between two branch protection rules. */ +export type BranchProtectionRuleConflict = { + __typename?: 'BranchProtectionRuleConflict'; + /** Identifies the branch protection rule. */ + branchProtectionRule?: Maybe; + /** Identifies the conflicting branch protection rule. */ + conflictingBranchProtectionRule?: Maybe; + /** Identifies the branch ref that has conflicting rules */ + ref?: Maybe; +}; + +/** The connection type for BranchProtectionRuleConflict. */ +export type BranchProtectionRuleConflictConnection = { + __typename?: 'BranchProtectionRuleConflictConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type BranchProtectionRuleConflictEdge = { + __typename?: 'BranchProtectionRuleConflictEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** The connection type for BranchProtectionRule. */ +export type BranchProtectionRuleConnection = { + __typename?: 'BranchProtectionRuleConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type BranchProtectionRuleEdge = { + __typename?: 'BranchProtectionRuleEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** + * Information about a sponsorship to make for a user or organization with a GitHub + * Sponsors profile, as part of sponsoring many users or organizations at once. + */ +export type BulkSponsorship = { + /** The amount to pay to the sponsorable in US dollars. Valid values: 1-12000. */ + amount: Scalars['Int']['input']; + /** The ID of the user or organization who is receiving the sponsorship. Required if sponsorableLogin is not given. */ + sponsorableId?: InputMaybe; + /** The username of the user or organization who is receiving the sponsorship. Required if sponsorableId is not given. */ + sponsorableLogin?: InputMaybe; +}; + +/** Types that can represent a repository ruleset bypass actor. */ +export type BypassActor = App | Team; + +/** A user, team, or app who has the ability to bypass a force push requirement on a protected branch. */ +export type BypassForcePushAllowance = Node & { + __typename?: 'BypassForcePushAllowance'; + /** The actor that can force push. */ + actor?: Maybe; + /** Identifies the branch protection rule associated with the allowed user, team, or app. */ + branchProtectionRule?: Maybe; + /** The Node ID of the BypassForcePushAllowance object */ + id: Scalars['ID']['output']; +}; + +/** The connection type for BypassForcePushAllowance. */ +export type BypassForcePushAllowanceConnection = { + __typename?: 'BypassForcePushAllowanceConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type BypassForcePushAllowanceEdge = { + __typename?: 'BypassForcePushAllowanceEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** A user, team, or app who has the ability to bypass a pull request requirement on a protected branch. */ +export type BypassPullRequestAllowance = Node & { + __typename?: 'BypassPullRequestAllowance'; + /** The actor that can bypass. */ + actor?: Maybe; + /** Identifies the branch protection rule associated with the allowed user, team, or app. */ + branchProtectionRule?: Maybe; + /** The Node ID of the BypassPullRequestAllowance object */ + id: Scalars['ID']['output']; +}; + +/** The connection type for BypassPullRequestAllowance. */ +export type BypassPullRequestAllowanceConnection = { + __typename?: 'BypassPullRequestAllowanceConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type BypassPullRequestAllowanceEdge = { + __typename?: 'BypassPullRequestAllowanceEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** The Common Vulnerability Scoring System */ +export type Cvss = { + __typename?: 'CVSS'; + /** The CVSS score associated with this advisory */ + score: Scalars['Float']['output']; + /** The CVSS vector string associated with this advisory */ + vectorString?: Maybe; +}; + +/** A common weakness enumeration */ +export type Cwe = Node & { + __typename?: 'CWE'; + /** The id of the CWE */ + cweId: Scalars['String']['output']; + /** A detailed description of this CWE */ + description: Scalars['String']['output']; + /** The Node ID of the CWE object */ + id: Scalars['ID']['output']; + /** The name of this CWE */ + name: Scalars['String']['output']; +}; + +/** The connection type for CWE. */ +export type CweConnection = { + __typename?: 'CWEConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type CweEdge = { + __typename?: 'CWEEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** Autogenerated input type of CancelEnterpriseAdminInvitation */ +export type CancelEnterpriseAdminInvitationInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the pending enterprise administrator invitation. */ + invitationId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CancelEnterpriseAdminInvitation */ +export type CancelEnterpriseAdminInvitationPayload = { + __typename?: 'CancelEnterpriseAdminInvitationPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The invitation that was canceled. */ + invitation?: Maybe; + /** A message confirming the result of canceling an administrator invitation. */ + message?: Maybe; +}; + +/** Autogenerated input type of CancelSponsorship */ +export type CancelSponsorshipInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** + * The ID of the user or organization who is acting as the sponsor, paying for + * the sponsorship. Required if sponsorLogin is not given. + */ + sponsorId?: InputMaybe; + /** + * The username of the user or organization who is acting as the sponsor, paying + * for the sponsorship. Required if sponsorId is not given. + */ + sponsorLogin?: InputMaybe; + /** The ID of the user or organization who is receiving the sponsorship. Required if sponsorableLogin is not given. */ + sponsorableId?: InputMaybe; + /** The username of the user or organization who is receiving the sponsorship. Required if sponsorableId is not given. */ + sponsorableLogin?: InputMaybe; +}; + +/** Autogenerated return type of CancelSponsorship */ +export type CancelSponsorshipPayload = { + __typename?: 'CancelSponsorshipPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The tier that was being used at the time of cancellation. */ + sponsorsTier?: Maybe; +}; + +/** Autogenerated input type of ChangeUserStatus */ +export type ChangeUserStatusInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The emoji to represent your status. Can either be a native Unicode emoji or an emoji name with colons, e.g., :grinning:. */ + emoji?: InputMaybe; + /** If set, the user status will not be shown after this date. */ + expiresAt?: InputMaybe; + /** Whether this status should indicate you are not fully available on GitHub, e.g., you are away. */ + limitedAvailability?: InputMaybe; + /** A short description of your current status. */ + message?: InputMaybe; + /** + * The ID of the organization whose members will be allowed to see the status. If + * omitted, the status will be publicly visible. + */ + organizationId?: InputMaybe; +}; + +/** Autogenerated return type of ChangeUserStatus */ +export type ChangeUserStatusPayload = { + __typename?: 'ChangeUserStatusPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** Your updated status. */ + status?: Maybe; +}; + +/** A single check annotation. */ +export type CheckAnnotation = { + __typename?: 'CheckAnnotation'; + /** The annotation's severity level. */ + annotationLevel?: Maybe; + /** The path to the file that this annotation was made on. */ + blobUrl: Scalars['URI']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The position of this annotation. */ + location: CheckAnnotationSpan; + /** The annotation's message. */ + message: Scalars['String']['output']; + /** The path that this annotation was made on. */ + path: Scalars['String']['output']; + /** Additional information about the annotation. */ + rawDetails?: Maybe; + /** The annotation's title */ + title?: Maybe; +}; + +/** The connection type for CheckAnnotation. */ +export type CheckAnnotationConnection = { + __typename?: 'CheckAnnotationConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** Information from a check run analysis to specific lines of code. */ +export type CheckAnnotationData = { + /** Represents an annotation's information level */ + annotationLevel: CheckAnnotationLevel; + /** The location of the annotation */ + location: CheckAnnotationRange; + /** A short description of the feedback for these lines of code. */ + message: Scalars['String']['input']; + /** The path of the file to add an annotation to. */ + path: Scalars['String']['input']; + /** Details about this annotation. */ + rawDetails?: InputMaybe; + /** The title that represents the annotation. */ + title?: InputMaybe; +}; + +/** An edge in a connection. */ +export type CheckAnnotationEdge = { + __typename?: 'CheckAnnotationEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** Represents an annotation's information level. */ +export enum CheckAnnotationLevel { + /** An annotation indicating an inescapable error. */ + Failure = 'FAILURE', + /** An annotation indicating some information. */ + Notice = 'NOTICE', + /** An annotation indicating an ignorable error. */ + Warning = 'WARNING' +} + +/** A character position in a check annotation. */ +export type CheckAnnotationPosition = { + __typename?: 'CheckAnnotationPosition'; + /** Column number (1 indexed). */ + column?: Maybe; + /** Line number (1 indexed). */ + line: Scalars['Int']['output']; +}; + +/** Information from a check run analysis to specific lines of code. */ +export type CheckAnnotationRange = { + /** The ending column of the range. */ + endColumn?: InputMaybe; + /** The ending line of the range. */ + endLine: Scalars['Int']['input']; + /** The starting column of the range. */ + startColumn?: InputMaybe; + /** The starting line of the range. */ + startLine: Scalars['Int']['input']; +}; + +/** An inclusive pair of positions for a check annotation. */ +export type CheckAnnotationSpan = { + __typename?: 'CheckAnnotationSpan'; + /** End position (inclusive). */ + end: CheckAnnotationPosition; + /** Start position (inclusive). */ + start: CheckAnnotationPosition; +}; + +/** The possible states for a check suite or run conclusion. */ +export enum CheckConclusionState { + /** The check suite or run requires action. */ + ActionRequired = 'ACTION_REQUIRED', + /** The check suite or run has been cancelled. */ + Cancelled = 'CANCELLED', + /** The check suite or run has failed. */ + Failure = 'FAILURE', + /** The check suite or run was neutral. */ + Neutral = 'NEUTRAL', + /** The check suite or run was skipped. */ + Skipped = 'SKIPPED', + /** The check suite or run was marked stale by GitHub. Only GitHub can use this conclusion. */ + Stale = 'STALE', + /** The check suite or run has failed at startup. */ + StartupFailure = 'STARTUP_FAILURE', + /** The check suite or run has succeeded. */ + Success = 'SUCCESS', + /** The check suite or run has timed out. */ + TimedOut = 'TIMED_OUT' +} + +/** A check run. */ +export type CheckRun = Node & RequirableByPullRequest & UniformResourceLocatable & { + __typename?: 'CheckRun'; + /** The check run's annotations */ + annotations?: Maybe; + /** The check suite that this run is a part of. */ + checkSuite: CheckSuite; + /** Identifies the date and time when the check run was completed. */ + completedAt?: Maybe; + /** The conclusion of the check run. */ + conclusion?: Maybe; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The corresponding deployment for this job, if any */ + deployment?: Maybe; + /** The URL from which to find full details of the check run on the integrator's site. */ + detailsUrl?: Maybe; + /** A reference for the check run on the integrator's system. */ + externalId?: Maybe; + /** The Node ID of the CheckRun object */ + id: Scalars['ID']['output']; + /** Whether this is required to pass before merging for a specific pull request. */ + isRequired: Scalars['Boolean']['output']; + /** The name of the check for this check run. */ + name: Scalars['String']['output']; + /** Information about a pending deployment, if any, in this check run */ + pendingDeploymentRequest?: Maybe; + /** The permalink to the check run summary. */ + permalink: Scalars['URI']['output']; + /** The repository associated with this check run. */ + repository: Repository; + /** The HTTP path for this check run. */ + resourcePath: Scalars['URI']['output']; + /** Identifies the date and time when the check run was started. */ + startedAt?: Maybe; + /** The current status of the check run. */ + status: CheckStatusState; + /** The check run's steps */ + steps?: Maybe; + /** A string representing the check run's summary */ + summary?: Maybe; + /** A string representing the check run's text */ + text?: Maybe; + /** A string representing the check run */ + title?: Maybe; + /** The HTTP URL for this check run. */ + url: Scalars['URI']['output']; +}; + + +/** A check run. */ +export type CheckRunAnnotationsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A check run. */ +export type CheckRunIsRequiredArgs = { + pullRequestId?: InputMaybe; + pullRequestNumber?: InputMaybe; +}; + + +/** A check run. */ +export type CheckRunStepsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + number?: InputMaybe; +}; + +/** Possible further actions the integrator can perform. */ +export type CheckRunAction = { + /** A short explanation of what this action would do. */ + description: Scalars['String']['input']; + /** A reference for the action on the integrator's system. */ + identifier: Scalars['String']['input']; + /** The text to be displayed on a button in the web UI. */ + label: Scalars['String']['input']; +}; + +/** The connection type for CheckRun. */ +export type CheckRunConnection = { + __typename?: 'CheckRunConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type CheckRunEdge = { + __typename?: 'CheckRunEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** The filters that are available when fetching check runs. */ +export type CheckRunFilter = { + /** Filters the check runs created by this application ID. */ + appId?: InputMaybe; + /** Filters the check runs by this name. */ + checkName?: InputMaybe; + /** Filters the check runs by this type. */ + checkType?: InputMaybe; + /** Filters the check runs by these conclusions. */ + conclusions?: InputMaybe>; + /** Filters the check runs by this status. Superceded by statuses. */ + status?: InputMaybe; + /** Filters the check runs by this status. Overrides status. */ + statuses?: InputMaybe>; +}; + +/** Descriptive details about the check run. */ +export type CheckRunOutput = { + /** The annotations that are made as part of the check run. */ + annotations?: InputMaybe>; + /** Images attached to the check run output displayed in the GitHub pull request UI. */ + images?: InputMaybe>; + /** The summary of the check run (supports Commonmark). */ + summary: Scalars['String']['input']; + /** The details of the check run (supports Commonmark). */ + text?: InputMaybe; + /** A title to provide for this check run. */ + title: Scalars['String']['input']; +}; + +/** Images attached to the check run output displayed in the GitHub pull request UI. */ +export type CheckRunOutputImage = { + /** The alternative text for the image. */ + alt: Scalars['String']['input']; + /** A short image description. */ + caption?: InputMaybe; + /** The full URL of the image. */ + imageUrl: Scalars['URI']['input']; +}; + +/** The possible states of a check run in a status rollup. */ +export enum CheckRunState { + /** The check run requires action. */ + ActionRequired = 'ACTION_REQUIRED', + /** The check run has been cancelled. */ + Cancelled = 'CANCELLED', + /** The check run has been completed. */ + Completed = 'COMPLETED', + /** The check run has failed. */ + Failure = 'FAILURE', + /** The check run is in progress. */ + InProgress = 'IN_PROGRESS', + /** The check run was neutral. */ + Neutral = 'NEUTRAL', + /** The check run is in pending state. */ + Pending = 'PENDING', + /** The check run has been queued. */ + Queued = 'QUEUED', + /** The check run was skipped. */ + Skipped = 'SKIPPED', + /** The check run was marked stale by GitHub. Only GitHub can use this conclusion. */ + Stale = 'STALE', + /** The check run has failed at startup. */ + StartupFailure = 'STARTUP_FAILURE', + /** The check run has succeeded. */ + Success = 'SUCCESS', + /** The check run has timed out. */ + TimedOut = 'TIMED_OUT', + /** The check run is in waiting state. */ + Waiting = 'WAITING' +} + +/** Represents a count of the state of a check run. */ +export type CheckRunStateCount = { + __typename?: 'CheckRunStateCount'; + /** The number of check runs with this state. */ + count: Scalars['Int']['output']; + /** The state of a check run. */ + state: CheckRunState; +}; + +/** The possible types of check runs. */ +export enum CheckRunType { + /** Every check run available. */ + All = 'ALL', + /** The latest check run. */ + Latest = 'LATEST' +} + +/** The possible states for a check suite or run status. */ +export enum CheckStatusState { + /** The check suite or run has been completed. */ + Completed = 'COMPLETED', + /** The check suite or run is in progress. */ + InProgress = 'IN_PROGRESS', + /** The check suite or run is in pending state. */ + Pending = 'PENDING', + /** The check suite or run has been queued. */ + Queued = 'QUEUED', + /** The check suite or run has been requested. */ + Requested = 'REQUESTED', + /** The check suite or run is in waiting state. */ + Waiting = 'WAITING' +} + +/** A single check step. */ +export type CheckStep = { + __typename?: 'CheckStep'; + /** Identifies the date and time when the check step was completed. */ + completedAt?: Maybe; + /** The conclusion of the check step. */ + conclusion?: Maybe; + /** A reference for the check step on the integrator's system. */ + externalId?: Maybe; + /** The step's name. */ + name: Scalars['String']['output']; + /** The index of the step in the list of steps of the parent check run. */ + number: Scalars['Int']['output']; + /** Number of seconds to completion. */ + secondsToCompletion?: Maybe; + /** Identifies the date and time when the check step was started. */ + startedAt?: Maybe; + /** The current status of the check step. */ + status: CheckStatusState; +}; + +/** The connection type for CheckStep. */ +export type CheckStepConnection = { + __typename?: 'CheckStepConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type CheckStepEdge = { + __typename?: 'CheckStepEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** A check suite. */ +export type CheckSuite = Node & { + __typename?: 'CheckSuite'; + /** The GitHub App which created this check suite. */ + app?: Maybe; + /** The name of the branch for this check suite. */ + branch?: Maybe; + /** The check runs associated with a check suite. */ + checkRuns?: Maybe; + /** The commit for this check suite */ + commit: Commit; + /** The conclusion of this check suite. */ + conclusion?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The user who triggered the check suite. */ + creator?: Maybe; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The Node ID of the CheckSuite object */ + id: Scalars['ID']['output']; + /** A list of open pull requests matching the check suite. */ + matchingPullRequests?: Maybe; + /** The push that triggered this check suite. */ + push?: Maybe; + /** The repository associated with this check suite. */ + repository: Repository; + /** The HTTP path for this check suite */ + resourcePath: Scalars['URI']['output']; + /** The status of this check suite. */ + status: CheckStatusState; + /** Identifies the date and time when the object was last updated. */ + updatedAt: Scalars['DateTime']['output']; + /** The HTTP URL for this check suite */ + url: Scalars['URI']['output']; + /** The workflow run associated with this check suite. */ + workflowRun?: Maybe; +}; + + +/** A check suite. */ +export type CheckSuiteCheckRunsArgs = { + after?: InputMaybe; + before?: InputMaybe; + filterBy?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A check suite. */ +export type CheckSuiteMatchingPullRequestsArgs = { + after?: InputMaybe; + baseRefName?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + headRefName?: InputMaybe; + labels?: InputMaybe>; + last?: InputMaybe; + orderBy?: InputMaybe; + states?: InputMaybe>; +}; + +/** The auto-trigger preferences that are available for check suites. */ +export type CheckSuiteAutoTriggerPreference = { + /** The node ID of the application that owns the check suite. */ + appId: Scalars['ID']['input']; + /** Set to `true` to enable automatic creation of CheckSuite events upon pushes to the repository. */ + setting: Scalars['Boolean']['input']; +}; + +/** The connection type for CheckSuite. */ +export type CheckSuiteConnection = { + __typename?: 'CheckSuiteConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type CheckSuiteEdge = { + __typename?: 'CheckSuiteEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** The filters that are available when fetching check suites. */ +export type CheckSuiteFilter = { + /** Filters the check suites created by this application ID. */ + appId?: InputMaybe; + /** Filters the check suites by this name. */ + checkName?: InputMaybe; +}; + +/** An object which can have its data claimed or claim data from another. */ +export type Claimable = Mannequin | User; + +/** Autogenerated input type of ClearLabelsFromLabelable */ +export type ClearLabelsFromLabelableInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The id of the labelable object to clear the labels from. */ + labelableId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ClearLabelsFromLabelable */ +export type ClearLabelsFromLabelablePayload = { + __typename?: 'ClearLabelsFromLabelablePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The item that was unlabeled. */ + labelable?: Maybe; +}; + +/** Autogenerated input type of ClearProjectV2ItemFieldValue */ +export type ClearProjectV2ItemFieldValueInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the field to be cleared. */ + fieldId: Scalars['ID']['input']; + /** The ID of the item to be cleared. */ + itemId: Scalars['ID']['input']; + /** The ID of the Project. */ + projectId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ClearProjectV2ItemFieldValue */ +export type ClearProjectV2ItemFieldValuePayload = { + __typename?: 'ClearProjectV2ItemFieldValuePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The updated item. */ + projectV2Item?: Maybe; +}; + +/** Autogenerated input type of CloneProject */ +export type CloneProjectInput = { + /** The description of the project. */ + body?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** Whether or not to clone the source project's workflows. */ + includeWorkflows: Scalars['Boolean']['input']; + /** The name of the project. */ + name: Scalars['String']['input']; + /** The visibility of the project, defaults to false (private). */ + public?: InputMaybe; + /** The source project to clone. */ + sourceId: Scalars['ID']['input']; + /** The owner ID to create the project under. */ + targetOwnerId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CloneProject */ +export type CloneProjectPayload = { + __typename?: 'CloneProjectPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The id of the JobStatus for populating cloned fields. */ + jobStatusId?: Maybe; + /** The new cloned project. */ + project?: Maybe; +}; + +/** Autogenerated input type of CloneTemplateRepository */ +export type CloneTemplateRepositoryInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** A short description of the new repository. */ + description?: InputMaybe; + /** + * Whether to copy all branches from the template to the new repository. Defaults + * to copying only the default branch of the template. + */ + includeAllBranches?: InputMaybe; + /** The name of the new repository. */ + name: Scalars['String']['input']; + /** The ID of the owner for the new repository. */ + ownerId: Scalars['ID']['input']; + /** The Node ID of the template repository. */ + repositoryId: Scalars['ID']['input']; + /** Indicates the repository's visibility level. */ + visibility: RepositoryVisibility; +}; + +/** Autogenerated return type of CloneTemplateRepository */ +export type CloneTemplateRepositoryPayload = { + __typename?: 'CloneTemplateRepositoryPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new repository. */ + repository?: Maybe; +}; + +/** An object that can be closed */ +export type Closable = { + /** Indicates if the object is closed (definition of closed may depend on type) */ + closed: Scalars['Boolean']['output']; + /** Identifies the date and time when the object was closed. */ + closedAt?: Maybe; + /** Indicates if the object can be closed by the viewer. */ + viewerCanClose: Scalars['Boolean']['output']; + /** Indicates if the object can be reopened by the viewer. */ + viewerCanReopen: Scalars['Boolean']['output']; +}; + +/** Autogenerated input type of CloseDiscussion */ +export type CloseDiscussionInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** ID of the discussion to be closed. */ + discussionId: Scalars['ID']['input']; + /** The reason why the discussion is being closed. */ + reason?: InputMaybe; +}; + +/** Autogenerated return type of CloseDiscussion */ +export type CloseDiscussionPayload = { + __typename?: 'CloseDiscussionPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The discussion that was closed. */ + discussion?: Maybe; +}; + +/** Autogenerated input type of CloseIssue */ +export type CloseIssueInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** ID of the issue to be closed. */ + issueId: Scalars['ID']['input']; + /** The reason the issue is to be closed. */ + stateReason?: InputMaybe; +}; + +/** Autogenerated return type of CloseIssue */ +export type CloseIssuePayload = { + __typename?: 'CloseIssuePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The issue that was closed. */ + issue?: Maybe; +}; + +/** Autogenerated input type of ClosePullRequest */ +export type ClosePullRequestInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** ID of the pull request to be closed. */ + pullRequestId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ClosePullRequest */ +export type ClosePullRequestPayload = { + __typename?: 'ClosePullRequestPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The pull request that was closed. */ + pullRequest?: Maybe; +}; + +/** Represents a 'closed' event on any `Closable`. */ +export type ClosedEvent = Node & UniformResourceLocatable & { + __typename?: 'ClosedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Object that was closed. */ + closable: Closable; + /** Object which triggered the creation of this event. */ + closer?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the ClosedEvent object */ + id: Scalars['ID']['output']; + /** The HTTP path for this closed event. */ + resourcePath: Scalars['URI']['output']; + /** The reason the issue state was changed to closed. */ + stateReason?: Maybe; + /** The HTTP URL for this closed event. */ + url: Scalars['URI']['output']; +}; + +/** The object which triggered a `ClosedEvent`. */ +export type Closer = Commit | PullRequest; + +/** The Code of Conduct for a repository */ +export type CodeOfConduct = Node & { + __typename?: 'CodeOfConduct'; + /** The body of the Code of Conduct */ + body?: Maybe; + /** The Node ID of the CodeOfConduct object */ + id: Scalars['ID']['output']; + /** The key for the Code of Conduct */ + key: Scalars['String']['output']; + /** The formal name of the Code of Conduct */ + name: Scalars['String']['output']; + /** The HTTP path for this Code of Conduct */ + resourcePath?: Maybe; + /** The HTTP URL for this Code of Conduct */ + url?: Maybe; +}; + +/** Collaborators affiliation level with a subject. */ +export enum CollaboratorAffiliation { + /** All collaborators the authenticated user can see. */ + All = 'ALL', + /** All collaborators with permissions to an organization-owned subject, regardless of organization membership status. */ + Direct = 'DIRECT', + /** All outside collaborators of an organization-owned subject. */ + Outside = 'OUTSIDE' +} + +/** Represents a comment. */ +export type Comment = { + /** The actor who authored the comment. */ + author?: Maybe; + /** Author's association with the subject of the comment. */ + authorAssociation: CommentAuthorAssociation; + /** The body as Markdown. */ + body: Scalars['String']['output']; + /** The body rendered to HTML. */ + bodyHTML: Scalars['HTML']['output']; + /** The body rendered to text. */ + bodyText: Scalars['String']['output']; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Check if this comment was created via an email reply. */ + createdViaEmail: Scalars['Boolean']['output']; + /** The actor who edited the comment. */ + editor?: Maybe; + /** The Node ID of the Comment object */ + id: Scalars['ID']['output']; + /** Check if this comment was edited and includes an edit with the creation data */ + includesCreatedEdit: Scalars['Boolean']['output']; + /** The moment the editor made the last edit */ + lastEditedAt?: Maybe; + /** Identifies when the comment was published at. */ + publishedAt?: Maybe; + /** Identifies the date and time when the object was last updated. */ + updatedAt: Scalars['DateTime']['output']; + /** A list of edits to this content. */ + userContentEdits?: Maybe; + /** Did the viewer author this comment. */ + viewerDidAuthor: Scalars['Boolean']['output']; +}; + + +/** Represents a comment. */ +export type CommentUserContentEditsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** A comment author association with repository. */ +export enum CommentAuthorAssociation { + /** Author has been invited to collaborate on the repository. */ + Collaborator = 'COLLABORATOR', + /** Author has previously committed to the repository. */ + Contributor = 'CONTRIBUTOR', + /** Author has not previously committed to GitHub. */ + FirstTimer = 'FIRST_TIMER', + /** Author has not previously committed to the repository. */ + FirstTimeContributor = 'FIRST_TIME_CONTRIBUTOR', + /** Author is a placeholder for an unclaimed user. */ + Mannequin = 'MANNEQUIN', + /** Author is a member of the organization that owns the repository. */ + Member = 'MEMBER', + /** Author has no association with the repository. */ + None = 'NONE', + /** Author is the owner of the repository. */ + Owner = 'OWNER' +} + +/** The possible errors that will prevent a user from updating a comment. */ +export enum CommentCannotUpdateReason { + /** Unable to create comment because repository is archived. */ + Archived = 'ARCHIVED', + /** You cannot update this comment */ + Denied = 'DENIED', + /** You must be the author or have write access to this repository to update this comment. */ + InsufficientAccess = 'INSUFFICIENT_ACCESS', + /** Unable to create comment because issue is locked. */ + Locked = 'LOCKED', + /** You must be logged in to update this comment. */ + LoginRequired = 'LOGIN_REQUIRED', + /** Repository is under maintenance. */ + Maintenance = 'MAINTENANCE', + /** At least one email address must be verified to update this comment. */ + VerifiedEmailRequired = 'VERIFIED_EMAIL_REQUIRED' +} + +/** Represents a 'comment_deleted' event on a given issue or pull request. */ +export type CommentDeletedEvent = Node & { + __typename?: 'CommentDeletedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The user who authored the deleted comment. */ + deletedCommentAuthor?: Maybe; + /** The Node ID of the CommentDeletedEvent object */ + id: Scalars['ID']['output']; +}; + +/** Represents a Git commit. */ +export type Commit = GitObject & Node & Subscribable & UniformResourceLocatable & { + __typename?: 'Commit'; + /** An abbreviated version of the Git object ID */ + abbreviatedOid: Scalars['String']['output']; + /** The number of additions in this commit. */ + additions: Scalars['Int']['output']; + /** + * The merged Pull Request that introduced the commit to the repository. If the + * commit is not present in the default branch, additionally returns open Pull + * Requests associated with the commit + */ + associatedPullRequests?: Maybe; + /** Authorship details of the commit. */ + author?: Maybe; + /** Check if the committer and the author match. */ + authoredByCommitter: Scalars['Boolean']['output']; + /** The datetime when this commit was authored. */ + authoredDate: Scalars['DateTime']['output']; + /** + * The list of authors for this commit based on the git author and the Co-authored-by + * message trailer. The git author will always be first. + */ + authors: GitActorConnection; + /** Fetches `git blame` information. */ + blame: Blame; + /** + * We recommend using the `changedFilesIfAvailable` field instead of + * `changedFiles`, as `changedFiles` will cause your request to return an error + * if GitHub is unable to calculate the number of changed files. + * @deprecated `changedFiles` will be removed. Use `changedFilesIfAvailable` instead. Removal on 2023-01-01 UTC. + */ + changedFiles: Scalars['Int']['output']; + /** + * The number of changed files in this commit. If GitHub is unable to calculate + * the number of changed files (for example due to a timeout), this will return + * `null`. We recommend using this field instead of `changedFiles`. + */ + changedFilesIfAvailable?: Maybe; + /** The check suites associated with a commit. */ + checkSuites?: Maybe; + /** Comments made on the commit. */ + comments: CommitCommentConnection; + /** The HTTP path for this Git object */ + commitResourcePath: Scalars['URI']['output']; + /** The HTTP URL for this Git object */ + commitUrl: Scalars['URI']['output']; + /** The datetime when this commit was committed. */ + committedDate: Scalars['DateTime']['output']; + /** Check if committed via GitHub web UI. */ + committedViaWeb: Scalars['Boolean']['output']; + /** Committer details of the commit. */ + committer?: Maybe; + /** The number of deletions in this commit. */ + deletions: Scalars['Int']['output']; + /** The deployments associated with a commit. */ + deployments?: Maybe; + /** The tree entry representing the file located at the given path. */ + file?: Maybe; + /** The linear commit history starting from (and including) this commit, in the same order as `git log`. */ + history: CommitHistoryConnection; + /** The Node ID of the Commit object */ + id: Scalars['ID']['output']; + /** The Git commit message */ + message: Scalars['String']['output']; + /** The Git commit message body */ + messageBody: Scalars['String']['output']; + /** The commit message body rendered to HTML. */ + messageBodyHTML: Scalars['HTML']['output']; + /** The Git commit message headline */ + messageHeadline: Scalars['String']['output']; + /** The commit message headline rendered to HTML. */ + messageHeadlineHTML: Scalars['HTML']['output']; + /** The Git object ID */ + oid: Scalars['GitObjectID']['output']; + /** The organization this commit was made on behalf of. */ + onBehalfOf?: Maybe; + /** The parents of a commit. */ + parents: CommitConnection; + /** + * The datetime when this commit was pushed. + * @deprecated `pushedDate` is no longer supported. Removal on 2023-07-01 UTC. + */ + pushedDate?: Maybe; + /** The Repository this commit belongs to */ + repository: Repository; + /** The HTTP path for this commit */ + resourcePath: Scalars['URI']['output']; + /** Commit signing information, if present. */ + signature?: Maybe; + /** Status information for this commit */ + status?: Maybe; + /** Check and Status rollup information for this commit. */ + statusCheckRollup?: Maybe; + /** Returns a list of all submodules in this repository as of this Commit parsed from the .gitmodules file. */ + submodules: SubmoduleConnection; + /** + * Returns a URL to download a tarball archive for a repository. + * Note: For private repositories, these links are temporary and expire after five minutes. + */ + tarballUrl: Scalars['URI']['output']; + /** Commit's root Tree */ + tree: Tree; + /** The HTTP path for the tree of this commit */ + treeResourcePath: Scalars['URI']['output']; + /** The HTTP URL for the tree of this commit */ + treeUrl: Scalars['URI']['output']; + /** The HTTP URL for this commit */ + url: Scalars['URI']['output']; + /** Check if the viewer is able to change their subscription status for the repository. */ + viewerCanSubscribe: Scalars['Boolean']['output']; + /** Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. */ + viewerSubscription?: Maybe; + /** + * Returns a URL to download a zipball archive for a repository. + * Note: For private repositories, these links are temporary and expire after five minutes. + */ + zipballUrl: Scalars['URI']['output']; +}; + + +/** Represents a Git commit. */ +export type CommitAssociatedPullRequestsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitAuthorsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitBlameArgs = { + path: Scalars['String']['input']; +}; + + +/** Represents a Git commit. */ +export type CommitCheckSuitesArgs = { + after?: InputMaybe; + before?: InputMaybe; + filterBy?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitCommentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitDeploymentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + environments?: InputMaybe>; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitFileArgs = { + path: Scalars['String']['input']; +}; + + +/** Represents a Git commit. */ +export type CommitHistoryArgs = { + after?: InputMaybe; + author?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + path?: InputMaybe; + since?: InputMaybe; + until?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitParentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** Represents a Git commit. */ +export type CommitSubmodulesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** Specifies an author for filtering Git commits. */ +export type CommitAuthor = { + /** Email addresses to filter by. Commits authored by any of the specified email addresses will be returned. */ + emails?: InputMaybe>; + /** + * ID of a User to filter by. If non-null, only commits authored by this user + * will be returned. This field takes precedence over emails. + */ + id?: InputMaybe; +}; + +/** Parameters to be used for the commit_author_email_pattern rule */ +export type CommitAuthorEmailPatternParameters = { + __typename?: 'CommitAuthorEmailPatternParameters'; + /** How this rule will appear to users. */ + name?: Maybe; + /** If true, the rule will fail if the pattern matches. */ + negate: Scalars['Boolean']['output']; + /** The operator to use for matching. */ + operator: Scalars['String']['output']; + /** The pattern to match with. */ + pattern: Scalars['String']['output']; +}; + +/** Parameters to be used for the commit_author_email_pattern rule */ +export type CommitAuthorEmailPatternParametersInput = { + /** How this rule will appear to users. */ + name?: InputMaybe; + /** If true, the rule will fail if the pattern matches. */ + negate?: InputMaybe; + /** The operator to use for matching. */ + operator: Scalars['String']['input']; + /** The pattern to match with. */ + pattern: Scalars['String']['input']; +}; + +/** Represents a comment on a given Commit. */ +export type CommitComment = Comment & Deletable & Minimizable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment & { + __typename?: 'CommitComment'; + /** The actor who authored the comment. */ + author?: Maybe; + /** Author's association with the subject of the comment. */ + authorAssociation: CommentAuthorAssociation; + /** Identifies the comment body. */ + body: Scalars['String']['output']; + /** The body rendered to HTML. */ + bodyHTML: Scalars['HTML']['output']; + /** The body rendered to text. */ + bodyText: Scalars['String']['output']; + /** Identifies the commit associated with the comment, if the commit exists. */ + commit?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Check if this comment was created via an email reply. */ + createdViaEmail: Scalars['Boolean']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The actor who edited the comment. */ + editor?: Maybe; + /** The Node ID of the CommitComment object */ + id: Scalars['ID']['output']; + /** Check if this comment was edited and includes an edit with the creation data */ + includesCreatedEdit: Scalars['Boolean']['output']; + /** Returns whether or not a comment has been minimized. */ + isMinimized: Scalars['Boolean']['output']; + /** The moment the editor made the last edit */ + lastEditedAt?: Maybe; + /** + * Returns why the comment was minimized. One of `abuse`, `off-topic`, + * `outdated`, `resolved`, `duplicate` and `spam`. Note that the case and + * formatting of these values differs from the inputs to the `MinimizeComment` mutation. + */ + minimizedReason?: Maybe; + /** Identifies the file path associated with the comment. */ + path?: Maybe; + /** Identifies the line position associated with the comment. */ + position?: Maybe; + /** Identifies when the comment was published at. */ + publishedAt?: Maybe; + /** A list of reactions grouped by content left on the subject. */ + reactionGroups?: Maybe>; + /** A list of Reactions left on the Issue. */ + reactions: ReactionConnection; + /** The repository associated with this node. */ + repository: Repository; + /** The HTTP path permalink for this commit comment. */ + resourcePath: Scalars['URI']['output']; + /** Identifies the date and time when the object was last updated. */ + updatedAt: Scalars['DateTime']['output']; + /** The HTTP URL permalink for this commit comment. */ + url: Scalars['URI']['output']; + /** A list of edits to this content. */ + userContentEdits?: Maybe; + /** Check if the current viewer can delete this object. */ + viewerCanDelete: Scalars['Boolean']['output']; + /** Check if the current viewer can minimize this object. */ + viewerCanMinimize: Scalars['Boolean']['output']; + /** Can user react to this subject */ + viewerCanReact: Scalars['Boolean']['output']; + /** Check if the current viewer can update this object. */ + viewerCanUpdate: Scalars['Boolean']['output']; + /** Reasons why the current viewer can not update this comment. */ + viewerCannotUpdateReasons: Array; + /** Did the viewer author this comment. */ + viewerDidAuthor: Scalars['Boolean']['output']; +}; + + +/** Represents a comment on a given Commit. */ +export type CommitCommentReactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + content?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** Represents a comment on a given Commit. */ +export type CommitCommentUserContentEditsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** The connection type for CommitComment. */ +export type CommitCommentConnection = { + __typename?: 'CommitCommentConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** An edge in a connection. */ +export type CommitCommentEdge = { + __typename?: 'CommitCommentEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** A thread of comments on a commit. */ +export type CommitCommentThread = Node & RepositoryNode & { + __typename?: 'CommitCommentThread'; + /** The comments that exist in this thread. */ + comments: CommitCommentConnection; + /** The commit the comments were made on. */ + commit?: Maybe; + /** The Node ID of the CommitCommentThread object */ + id: Scalars['ID']['output']; + /** The file the comments were made on. */ + path?: Maybe; + /** The position in the diff for the commit that the comment was made on. */ + position?: Maybe; + /** The repository associated with this node. */ + repository: Repository; +}; + + +/** A thread of comments on a commit. */ +export type CommitCommentThreadCommentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** The connection type for Commit. */ +export type CommitConnection = { + __typename?: 'CommitConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** Ordering options for commit contribution connections. */ +export type CommitContributionOrder = { + /** The ordering direction. */ + direction: OrderDirection; + /** The field by which to order commit contributions. */ + field: CommitContributionOrderField; +}; + +/** Properties by which commit contribution connections can be ordered. */ +export enum CommitContributionOrderField { + /** Order commit contributions by how many commits they represent. */ + CommitCount = 'COMMIT_COUNT', + /** Order commit contributions by when they were made. */ + OccurredAt = 'OCCURRED_AT' +} + +/** This aggregates commits made by a user within one repository. */ +export type CommitContributionsByRepository = { + __typename?: 'CommitContributionsByRepository'; + /** The commit contributions, each representing a day. */ + contributions: CreatedCommitContributionConnection; + /** The repository in which the commits were made. */ + repository: Repository; + /** The HTTP path for the user's commits to the repository in this time range. */ + resourcePath: Scalars['URI']['output']; + /** The HTTP URL for the user's commits to the repository in this time range. */ + url: Scalars['URI']['output']; +}; + + +/** This aggregates commits made by a user within one repository. */ +export type CommitContributionsByRepositoryContributionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + +/** An edge in a connection. */ +export type CommitEdge = { + __typename?: 'CommitEdge'; + /** A cursor for use in pagination. */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge. */ + node?: Maybe; +}; + +/** The connection type for Commit. */ +export type CommitHistoryConnection = { + __typename?: 'CommitHistoryConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** A message to include with a new commit */ +export type CommitMessage = { + /** The body of the message. */ + body?: InputMaybe; + /** The headline of the message. */ + headline: Scalars['String']['input']; +}; + +/** Parameters to be used for the commit_message_pattern rule */ +export type CommitMessagePatternParameters = { + __typename?: 'CommitMessagePatternParameters'; + /** How this rule will appear to users. */ + name?: Maybe; + /** If true, the rule will fail if the pattern matches. */ + negate: Scalars['Boolean']['output']; + /** The operator to use for matching. */ + operator: Scalars['String']['output']; + /** The pattern to match with. */ + pattern: Scalars['String']['output']; +}; + +/** Parameters to be used for the commit_message_pattern rule */ +export type CommitMessagePatternParametersInput = { + /** How this rule will appear to users. */ + name?: InputMaybe; + /** If true, the rule will fail if the pattern matches. */ + negate?: InputMaybe; + /** The operator to use for matching. */ + operator: Scalars['String']['input']; + /** The pattern to match with. */ + pattern: Scalars['String']['input']; +}; + +/** + * A git ref for a commit to be appended to. + * + * The ref must be a branch, i.e. its fully qualified name must start + * with `refs/heads/` (although the input is not required to be fully + * qualified). + * + * The Ref may be specified by its global node ID or by the + * `repositoryNameWithOwner` and `branchName`. + * + * ### Examples + * + * Specify a branch using a global node ID: + * + * { "id": "MDM6UmVmMTpyZWZzL2hlYWRzL21haW4=" } + * + * Specify a branch using `repositoryNameWithOwner` and `branchName`: + * + * { + * "repositoryNameWithOwner": "github/graphql-client", + * "branchName": "main" + * } + */ +export type CommittableBranch = { + /** The unqualified name of the branch to append the commit to. */ + branchName?: InputMaybe; + /** The Node ID of the Ref to be updated. */ + id?: InputMaybe; + /** The nameWithOwner of the repository to commit to. */ + repositoryNameWithOwner?: InputMaybe; +}; + +/** Parameters to be used for the committer_email_pattern rule */ +export type CommitterEmailPatternParameters = { + __typename?: 'CommitterEmailPatternParameters'; + /** How this rule will appear to users. */ + name?: Maybe; + /** If true, the rule will fail if the pattern matches. */ + negate: Scalars['Boolean']['output']; + /** The operator to use for matching. */ + operator: Scalars['String']['output']; + /** The pattern to match with. */ + pattern: Scalars['String']['output']; +}; + +/** Parameters to be used for the committer_email_pattern rule */ +export type CommitterEmailPatternParametersInput = { + /** How this rule will appear to users. */ + name?: InputMaybe; + /** If true, the rule will fail if the pattern matches. */ + negate?: InputMaybe; + /** The operator to use for matching. */ + operator: Scalars['String']['input']; + /** The pattern to match with. */ + pattern: Scalars['String']['input']; +}; + +/** Represents a comparison between two commit revisions. */ +export type Comparison = Node & { + __typename?: 'Comparison'; + /** The number of commits ahead of the base branch. */ + aheadBy: Scalars['Int']['output']; + /** The base revision of this comparison. */ + baseTarget: GitObject; + /** The number of commits behind the base branch. */ + behindBy: Scalars['Int']['output']; + /** The commits which compose this comparison. */ + commits: ComparisonCommitConnection; + /** The head revision of this comparison. */ + headTarget: GitObject; + /** The Node ID of the Comparison object */ + id: Scalars['ID']['output']; + /** The status of this comparison. */ + status: ComparisonStatus; +}; + + +/** Represents a comparison between two commit revisions. */ +export type ComparisonCommitsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** The connection type for Commit. */ +export type ComparisonCommitConnection = { + __typename?: 'ComparisonCommitConnection'; + /** The total count of authors and co-authors across all commits. */ + authorCount: Scalars['Int']['output']; + /** A list of edges. */ + edges?: Maybe>>; + /** A list of nodes. */ + nodes?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']['output']; +}; + +/** The status of a git comparison between two refs. */ +export enum ComparisonStatus { + /** The head ref is ahead of the base ref. */ + Ahead = 'AHEAD', + /** The head ref is behind the base ref. */ + Behind = 'BEHIND', + /** The head ref is both ahead and behind of the base ref, indicating git history has diverged. */ + Diverged = 'DIVERGED', + /** The head ref and base ref are identical. */ + Identical = 'IDENTICAL' +} + +/** Represents a 'connected' event on a given issue or pull request. */ +export type ConnectedEvent = Node & { + __typename?: 'ConnectedEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the ConnectedEvent object */ + id: Scalars['ID']['output']; + /** Reference originated in a different repository. */ + isCrossRepository: Scalars['Boolean']['output']; + /** Issue or pull request that made the reference. */ + source: ReferencedSubject; + /** Issue or pull request which was connected. */ + subject: ReferencedSubject; +}; + +/** The Contributing Guidelines for a repository. */ +export type ContributingGuidelines = { + __typename?: 'ContributingGuidelines'; + /** The body of the Contributing Guidelines. */ + body?: Maybe; + /** The HTTP path for the Contributing Guidelines. */ + resourcePath?: Maybe; + /** The HTTP URL for the Contributing Guidelines. */ + url?: Maybe; +}; + +/** Represents a contribution a user made on GitHub, such as opening an issue. */ +export type Contribution = { + /** + * Whether this contribution is associated with a record you do not have access to. For + * example, your own 'first issue' contribution may have been made on a repository you can no + * longer access. + */ + isRestricted: Scalars['Boolean']['output']; + /** When this contribution was made. */ + occurredAt: Scalars['DateTime']['output']; + /** The HTTP path for this contribution. */ + resourcePath: Scalars['URI']['output']; + /** The HTTP URL for this contribution. */ + url: Scalars['URI']['output']; + /** The user who made this contribution. */ + user: User; +}; + +/** A calendar of contributions made on GitHub by a user. */ +export type ContributionCalendar = { + __typename?: 'ContributionCalendar'; + /** A list of hex color codes used in this calendar. The darker the color, the more contributions it represents. */ + colors: Array; + /** Determine if the color set was chosen because it's currently Halloween. */ + isHalloween: Scalars['Boolean']['output']; + /** A list of the months of contributions in this calendar. */ + months: Array; + /** The count of total contributions in the calendar. */ + totalContributions: Scalars['Int']['output']; + /** A list of the weeks of contributions in this calendar. */ + weeks: Array; +}; + +/** Represents a single day of contributions on GitHub by a user. */ +export type ContributionCalendarDay = { + __typename?: 'ContributionCalendarDay'; + /** The hex color code that represents how many contributions were made on this day compared to others in the calendar. */ + color: Scalars['String']['output']; + /** How many contributions were made by the user on this day. */ + contributionCount: Scalars['Int']['output']; + /** + * Indication of contributions, relative to other days. Can be used to indicate + * which color to represent this day on a calendar. + */ + contributionLevel: ContributionLevel; + /** The day this square represents. */ + date: Scalars['Date']['output']; + /** A number representing which day of the week this square represents, e.g., 1 is Monday. */ + weekday: Scalars['Int']['output']; +}; + +/** A month of contributions in a user's contribution graph. */ +export type ContributionCalendarMonth = { + __typename?: 'ContributionCalendarMonth'; + /** The date of the first day of this month. */ + firstDay: Scalars['Date']['output']; + /** The name of the month. */ + name: Scalars['String']['output']; + /** How many weeks started in this month. */ + totalWeeks: Scalars['Int']['output']; + /** The year the month occurred in. */ + year: Scalars['Int']['output']; +}; + +/** A week of contributions in a user's contribution graph. */ +export type ContributionCalendarWeek = { + __typename?: 'ContributionCalendarWeek'; + /** The days of contributions in this week. */ + contributionDays: Array; + /** The date of the earliest square in this week. */ + firstDay: Scalars['Date']['output']; +}; + +/** Varying levels of contributions from none to many. */ +export enum ContributionLevel { + /** Lowest 25% of days of contributions. */ + FirstQuartile = 'FIRST_QUARTILE', + /** Highest 25% of days of contributions. More contributions than the third quartile. */ + FourthQuartile = 'FOURTH_QUARTILE', + /** No contributions occurred. */ + None = 'NONE', + /** Second lowest 25% of days of contributions. More contributions than the first quartile. */ + SecondQuartile = 'SECOND_QUARTILE', + /** Second highest 25% of days of contributions. More contributions than second quartile, less than the fourth quartile. */ + ThirdQuartile = 'THIRD_QUARTILE' +} + +/** Ordering options for contribution connections. */ +export type ContributionOrder = { + /** The ordering direction. */ + direction: OrderDirection; +}; + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollection = { + __typename?: 'ContributionsCollection'; + /** Commit contributions made by the user, grouped by repository. */ + commitContributionsByRepository: Array; + /** A calendar of this user's contributions on GitHub. */ + contributionCalendar: ContributionCalendar; + /** The years the user has been making contributions with the most recent year first. */ + contributionYears: Array; + /** Determine if this collection's time span ends in the current month. */ + doesEndInCurrentMonth: Scalars['Boolean']['output']; + /** + * The date of the first restricted contribution the user made in this time + * period. Can only be non-null when the user has enabled private contribution counts. + */ + earliestRestrictedContributionDate?: Maybe; + /** The ending date and time of this collection. */ + endedAt: Scalars['DateTime']['output']; + /** + * The first issue the user opened on GitHub. This will be null if that issue was + * opened outside the collection's time range and ignoreTimeRange is false. If + * the issue is not visible but the user has opted to show private contributions, + * a RestrictedContribution will be returned. + */ + firstIssueContribution?: Maybe; + /** + * The first pull request the user opened on GitHub. This will be null if that + * pull request was opened outside the collection's time range and + * ignoreTimeRange is not true. If the pull request is not visible but the user + * has opted to show private contributions, a RestrictedContribution will be returned. + */ + firstPullRequestContribution?: Maybe; + /** + * The first repository the user created on GitHub. This will be null if that + * first repository was created outside the collection's time range and + * ignoreTimeRange is false. If the repository is not visible, then a + * RestrictedContribution is returned. + */ + firstRepositoryContribution?: Maybe; + /** Does the user have any more activity in the timeline that occurred prior to the collection's time range? */ + hasActivityInThePast: Scalars['Boolean']['output']; + /** Determine if there are any contributions in this collection. */ + hasAnyContributions: Scalars['Boolean']['output']; + /** + * Determine if the user made any contributions in this time frame whose details + * are not visible because they were made in a private repository. Can only be + * true if the user enabled private contribution counts. + */ + hasAnyRestrictedContributions: Scalars['Boolean']['output']; + /** Whether or not the collector's time span is all within the same day. */ + isSingleDay: Scalars['Boolean']['output']; + /** A list of issues the user opened. */ + issueContributions: CreatedIssueContributionConnection; + /** Issue contributions made by the user, grouped by repository. */ + issueContributionsByRepository: Array; + /** + * When the user signed up for GitHub. This will be null if that sign up date + * falls outside the collection's time range and ignoreTimeRange is false. + */ + joinedGitHubContribution?: Maybe; + /** + * The date of the most recent restricted contribution the user made in this time + * period. Can only be non-null when the user has enabled private contribution counts. + */ + latestRestrictedContributionDate?: Maybe; + /** + * When this collection's time range does not include any activity from the user, use this + * to get a different collection from an earlier time range that does have activity. + */ + mostRecentCollectionWithActivity?: Maybe; + /** + * Returns a different contributions collection from an earlier time range than this one + * that does not have any contributions. + */ + mostRecentCollectionWithoutActivity?: Maybe; + /** + * The issue the user opened on GitHub that received the most comments in the specified + * time frame. + */ + popularIssueContribution?: Maybe; + /** + * The pull request the user opened on GitHub that received the most comments in the + * specified time frame. + */ + popularPullRequestContribution?: Maybe; + /** Pull request contributions made by the user. */ + pullRequestContributions: CreatedPullRequestContributionConnection; + /** Pull request contributions made by the user, grouped by repository. */ + pullRequestContributionsByRepository: Array; + /** + * Pull request review contributions made by the user. Returns the most recently + * submitted review for each PR reviewed by the user. + */ + pullRequestReviewContributions: CreatedPullRequestReviewContributionConnection; + /** Pull request review contributions made by the user, grouped by repository. */ + pullRequestReviewContributionsByRepository: Array; + /** A list of repositories owned by the user that the user created in this time range. */ + repositoryContributions: CreatedRepositoryContributionConnection; + /** + * A count of contributions made by the user that the viewer cannot access. Only + * non-zero when the user has chosen to share their private contribution counts. + */ + restrictedContributionsCount: Scalars['Int']['output']; + /** The beginning date and time of this collection. */ + startedAt: Scalars['DateTime']['output']; + /** How many commits were made by the user in this time span. */ + totalCommitContributions: Scalars['Int']['output']; + /** How many issues the user opened. */ + totalIssueContributions: Scalars['Int']['output']; + /** How many pull requests the user opened. */ + totalPullRequestContributions: Scalars['Int']['output']; + /** How many pull request reviews the user left. */ + totalPullRequestReviewContributions: Scalars['Int']['output']; + /** How many different repositories the user committed to. */ + totalRepositoriesWithContributedCommits: Scalars['Int']['output']; + /** How many different repositories the user opened issues in. */ + totalRepositoriesWithContributedIssues: Scalars['Int']['output']; + /** How many different repositories the user left pull request reviews in. */ + totalRepositoriesWithContributedPullRequestReviews: Scalars['Int']['output']; + /** How many different repositories the user opened pull requests in. */ + totalRepositoriesWithContributedPullRequests: Scalars['Int']['output']; + /** How many repositories the user created. */ + totalRepositoryContributions: Scalars['Int']['output']; + /** The user who made the contributions in this collection. */ + user: User; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionCommitContributionsByRepositoryArgs = { + maxRepositories?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionIssueContributionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionIssueContributionsByRepositoryArgs = { + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; + maxRepositories?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionPullRequestContributionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionPullRequestContributionsByRepositoryArgs = { + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; + maxRepositories?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionPullRequestReviewContributionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionPullRequestReviewContributionsByRepositoryArgs = { + maxRepositories?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionRepositoryContributionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + excludeFirst?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + orderBy?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionTotalIssueContributionsArgs = { + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionTotalPullRequestContributionsArgs = { + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionTotalRepositoriesWithContributedIssuesArgs = { + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionTotalRepositoriesWithContributedPullRequestsArgs = { + excludeFirst?: InputMaybe; + excludePopular?: InputMaybe; +}; + + +/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ +export type ContributionsCollectionTotalRepositoryContributionsArgs = { + excludeFirst?: InputMaybe; +}; + +/** Autogenerated input type of ConvertProjectCardNoteToIssue */ +export type ConvertProjectCardNoteToIssueInput = { + /** The body of the newly created issue. */ + body?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ProjectCard ID to convert. */ + projectCardId: Scalars['ID']['input']; + /** The ID of the repository to create the issue in. */ + repositoryId: Scalars['ID']['input']; + /** The title of the newly created issue. Defaults to the card's note text. */ + title?: InputMaybe; +}; + +/** Autogenerated return type of ConvertProjectCardNoteToIssue */ +export type ConvertProjectCardNoteToIssuePayload = { + __typename?: 'ConvertProjectCardNoteToIssuePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The updated ProjectCard. */ + projectCard?: Maybe; +}; + +/** Autogenerated input type of ConvertPullRequestToDraft */ +export type ConvertPullRequestToDraftInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** ID of the pull request to convert to draft */ + pullRequestId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of ConvertPullRequestToDraft */ +export type ConvertPullRequestToDraftPayload = { + __typename?: 'ConvertPullRequestToDraftPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The pull request that is now a draft. */ + pullRequest?: Maybe; +}; + +/** Represents a 'convert_to_draft' event on a given pull request. */ +export type ConvertToDraftEvent = Node & UniformResourceLocatable & { + __typename?: 'ConvertToDraftEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The Node ID of the ConvertToDraftEvent object */ + id: Scalars['ID']['output']; + /** PullRequest referenced by event. */ + pullRequest: PullRequest; + /** The HTTP path for this convert to draft event. */ + resourcePath: Scalars['URI']['output']; + /** The HTTP URL for this convert to draft event. */ + url: Scalars['URI']['output']; +}; + +/** Represents a 'converted_note_to_issue' event on a given issue or pull request. */ +export type ConvertedNoteToIssueEvent = Node & { + __typename?: 'ConvertedNoteToIssueEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** Identifies the primary key from the database. */ + databaseId?: Maybe; + /** The Node ID of the ConvertedNoteToIssueEvent object */ + id: Scalars['ID']['output']; + /** Project referenced by event. */ + project?: Maybe; + /** Project card referenced by this project event. */ + projectCard?: Maybe; + /** Column name referenced by this project event. */ + projectColumnName: Scalars['String']['output']; +}; + +/** Represents a 'converted_to_discussion' event on a given issue. */ +export type ConvertedToDiscussionEvent = Node & { + __typename?: 'ConvertedToDiscussionEvent'; + /** Identifies the actor who performed the event. */ + actor?: Maybe; + /** Identifies the date and time when the object was created. */ + createdAt: Scalars['DateTime']['output']; + /** The discussion that the issue was converted into. */ + discussion?: Maybe; + /** The Node ID of the ConvertedToDiscussionEvent object */ + id: Scalars['ID']['output']; +}; + +/** Autogenerated input type of CopyProjectV2 */ +export type CopyProjectV2Input = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** Include draft issues in the new project */ + includeDraftIssues?: InputMaybe; + /** The owner ID of the new project. */ + ownerId: Scalars['ID']['input']; + /** The ID of the source Project to copy. */ + projectId: Scalars['ID']['input']; + /** The title of the project. */ + title: Scalars['String']['input']; +}; + +/** Autogenerated return type of CopyProjectV2 */ +export type CopyProjectV2Payload = { + __typename?: 'CopyProjectV2Payload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The copied project. */ + projectV2?: Maybe; +}; + +/** Autogenerated input type of CreateAttributionInvitation */ +export type CreateAttributionInvitationInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The Node ID of the owner scoping the reattributable data. */ + ownerId: Scalars['ID']['input']; + /** The Node ID of the account owning the data to reattribute. */ + sourceId: Scalars['ID']['input']; + /** The Node ID of the account which may claim the data. */ + targetId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CreateAttributionInvitation */ +export type CreateAttributionInvitationPayload = { + __typename?: 'CreateAttributionInvitationPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The owner scoping the reattributable data. */ + owner?: Maybe; + /** The account owning the data to reattribute. */ + source?: Maybe; + /** The account which may claim the data. */ + target?: Maybe; +}; + +/** Autogenerated input type of CreateBranchProtectionRule */ +export type CreateBranchProtectionRuleInput = { + /** Can this branch be deleted. */ + allowsDeletions?: InputMaybe; + /** Are force pushes allowed on this branch. */ + allowsForcePushes?: InputMaybe; + /** Is branch creation a protected operation. */ + blocksCreations?: InputMaybe; + /** A list of User, Team, or App IDs allowed to bypass force push targeting matching branches. */ + bypassForcePushActorIds?: InputMaybe>; + /** A list of User, Team, or App IDs allowed to bypass pull requests targeting matching branches. */ + bypassPullRequestActorIds?: InputMaybe>; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** Will new commits pushed to matching branches dismiss pull request review approvals. */ + dismissesStaleReviews?: InputMaybe; + /** Can admins override branch protection. */ + isAdminEnforced?: InputMaybe; + /** + * Whether users can pull changes from upstream when the branch is locked. Set to + * `true` to allow fork syncing. Set to `false` to prevent fork syncing. + */ + lockAllowsFetchAndMerge?: InputMaybe; + /** Whether to set the branch as read-only. If this is true, users will not be able to push to the branch. */ + lockBranch?: InputMaybe; + /** The glob-like pattern used to determine matching branches. */ + pattern: Scalars['String']['input']; + /** A list of User, Team, or App IDs allowed to push to matching branches. */ + pushActorIds?: InputMaybe>; + /** The global relay id of the repository in which a new branch protection rule should be created in. */ + repositoryId: Scalars['ID']['input']; + /** Whether the most recent push must be approved by someone other than the person who pushed it */ + requireLastPushApproval?: InputMaybe; + /** Number of approving reviews required to update matching branches. */ + requiredApprovingReviewCount?: InputMaybe; + /** The list of required deployment environments */ + requiredDeploymentEnvironments?: InputMaybe>; + /** List of required status check contexts that must pass for commits to be accepted to matching branches. */ + requiredStatusCheckContexts?: InputMaybe>; + /** The list of required status checks */ + requiredStatusChecks?: InputMaybe>; + /** Are approving reviews required to update matching branches. */ + requiresApprovingReviews?: InputMaybe; + /** Are reviews from code owners required to update matching branches. */ + requiresCodeOwnerReviews?: InputMaybe; + /** Are commits required to be signed. */ + requiresCommitSignatures?: InputMaybe; + /** Are conversations required to be resolved before merging. */ + requiresConversationResolution?: InputMaybe; + /** Are successful deployments required before merging. */ + requiresDeployments?: InputMaybe; + /** Are merge commits prohibited from being pushed to this branch. */ + requiresLinearHistory?: InputMaybe; + /** Are status checks required to update matching branches. */ + requiresStatusChecks?: InputMaybe; + /** Are branches required to be up to date before merging. */ + requiresStrictStatusChecks?: InputMaybe; + /** Is pushing to matching branches restricted. */ + restrictsPushes?: InputMaybe; + /** Is dismissal of pull request reviews restricted. */ + restrictsReviewDismissals?: InputMaybe; + /** A list of User, Team, or App IDs allowed to dismiss reviews on pull requests targeting matching branches. */ + reviewDismissalActorIds?: InputMaybe>; +}; + +/** Autogenerated return type of CreateBranchProtectionRule */ +export type CreateBranchProtectionRulePayload = { + __typename?: 'CreateBranchProtectionRulePayload'; + /** The newly created BranchProtectionRule. */ + branchProtectionRule?: Maybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; +}; + +/** Autogenerated input type of CreateCheckRun */ +export type CreateCheckRunInput = { + /** Possible further actions the integrator can perform, which a user may trigger. */ + actions?: InputMaybe>; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The time that the check run finished. */ + completedAt?: InputMaybe; + /** The final conclusion of the check. */ + conclusion?: InputMaybe; + /** The URL of the integrator's site that has the full details of the check. */ + detailsUrl?: InputMaybe; + /** A reference for the run on the integrator's system. */ + externalId?: InputMaybe; + /** The SHA of the head commit. */ + headSha: Scalars['GitObjectID']['input']; + /** The name of the check. */ + name: Scalars['String']['input']; + /** Descriptive details about the run. */ + output?: InputMaybe; + /** The node ID of the repository. */ + repositoryId: Scalars['ID']['input']; + /** The time that the check run began. */ + startedAt?: InputMaybe; + /** The current status. */ + status?: InputMaybe; +}; + +/** Autogenerated return type of CreateCheckRun */ +export type CreateCheckRunPayload = { + __typename?: 'CreateCheckRunPayload'; + /** The newly created check run. */ + checkRun?: Maybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; +}; + +/** Autogenerated input type of CreateCheckSuite */ +export type CreateCheckSuiteInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The SHA of the head commit. */ + headSha: Scalars['GitObjectID']['input']; + /** The Node ID of the repository. */ + repositoryId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CreateCheckSuite */ +export type CreateCheckSuitePayload = { + __typename?: 'CreateCheckSuitePayload'; + /** The newly created check suite. */ + checkSuite?: Maybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; +}; + +/** Autogenerated input type of CreateCommitOnBranch */ +export type CreateCommitOnBranchInput = { + /** The Ref to be updated. Must be a branch. */ + branch: CommittableBranch; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The git commit oid expected at the head of the branch prior to the commit */ + expectedHeadOid: Scalars['GitObjectID']['input']; + /** A description of changes to files in this commit. */ + fileChanges?: InputMaybe; + /** The commit message the be included with the commit. */ + message: CommitMessage; +}; + +/** Autogenerated return type of CreateCommitOnBranch */ +export type CreateCommitOnBranchPayload = { + __typename?: 'CreateCommitOnBranchPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new commit. */ + commit?: Maybe; + /** The ref which has been updated to point to the new commit. */ + ref?: Maybe; +}; + +/** Autogenerated input type of CreateDeployment */ +export type CreateDeploymentInput = { + /** Attempt to automatically merge the default branch into the requested ref, defaults to true. */ + autoMerge?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** Short description of the deployment. */ + description?: InputMaybe; + /** Name for the target deployment environment. */ + environment?: InputMaybe; + /** JSON payload with extra information about the deployment. */ + payload?: InputMaybe; + /** The node ID of the ref to be deployed. */ + refId: Scalars['ID']['input']; + /** The node ID of the repository. */ + repositoryId: Scalars['ID']['input']; + /** + * The status contexts to verify against commit status checks. To bypass required + * contexts, pass an empty array. Defaults to all unique contexts. + */ + requiredContexts?: InputMaybe>; + /** Specifies a task to execute. */ + task?: InputMaybe; +}; + +/** Autogenerated return type of CreateDeployment */ +export type CreateDeploymentPayload = { + __typename?: 'CreateDeploymentPayload'; + /** True if the default branch has been auto-merged into the deployment ref. */ + autoMerged?: Maybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new deployment. */ + deployment?: Maybe; +}; + +/** Autogenerated input type of CreateDeploymentStatus */ +export type CreateDeploymentStatusInput = { + /** + * Adds a new inactive status to all non-transient, non-production environment + * deployments with the same repository and environment name as the created + * status's deployment. + */ + autoInactive?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The node ID of the deployment. */ + deploymentId: Scalars['ID']['input']; + /** A short description of the status. Maximum length of 140 characters. */ + description?: InputMaybe; + /** If provided, updates the environment of the deploy. Otherwise, does not modify the environment. */ + environment?: InputMaybe; + /** Sets the URL for accessing your environment. */ + environmentUrl?: InputMaybe; + /** + * The log URL to associate with this status. This URL should contain + * output to keep the user updated while the task is running or serve as + * historical information for what happened in the deployment. + */ + logUrl?: InputMaybe; + /** The state of the deployment. */ + state: DeploymentStatusState; +}; + +/** Autogenerated return type of CreateDeploymentStatus */ +export type CreateDeploymentStatusPayload = { + __typename?: 'CreateDeploymentStatusPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new deployment status. */ + deploymentStatus?: Maybe; +}; + +/** Autogenerated input type of CreateDiscussion */ +export type CreateDiscussionInput = { + /** The body of the discussion. */ + body: Scalars['String']['input']; + /** The id of the discussion category to associate with this discussion. */ + categoryId: Scalars['ID']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The id of the repository on which to create the discussion. */ + repositoryId: Scalars['ID']['input']; + /** The title of the discussion. */ + title: Scalars['String']['input']; +}; + +/** Autogenerated return type of CreateDiscussion */ +export type CreateDiscussionPayload = { + __typename?: 'CreateDiscussionPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The discussion that was just created. */ + discussion?: Maybe; +}; + +/** Autogenerated input type of CreateEnterpriseOrganization */ +export type CreateEnterpriseOrganizationInput = { + /** The logins for the administrators of the new organization. */ + adminLogins: Array; + /** The email used for sending billing receipts. */ + billingEmail: Scalars['String']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The ID of the enterprise owning the new organization. */ + enterpriseId: Scalars['ID']['input']; + /** The login of the new organization. */ + login: Scalars['String']['input']; + /** The profile name of the new organization. */ + profileName: Scalars['String']['input']; +}; + +/** Autogenerated return type of CreateEnterpriseOrganization */ +export type CreateEnterpriseOrganizationPayload = { + __typename?: 'CreateEnterpriseOrganizationPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The enterprise that owns the created organization. */ + enterprise?: Maybe; + /** The organization that was created. */ + organization?: Maybe; +}; + +/** Autogenerated input type of CreateEnvironment */ +export type CreateEnvironmentInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The name of the environment. */ + name: Scalars['String']['input']; + /** The node ID of the repository. */ + repositoryId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CreateEnvironment */ +export type CreateEnvironmentPayload = { + __typename?: 'CreateEnvironmentPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new or existing environment. */ + environment?: Maybe; +}; + +/** Autogenerated input type of CreateIpAllowListEntry */ +export type CreateIpAllowListEntryInput = { + /** An IP address or range of addresses in CIDR notation. */ + allowListValue: Scalars['String']['input']; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** Whether the IP allow list entry is active when an IP allow list is enabled. */ + isActive: Scalars['Boolean']['input']; + /** An optional name for the IP allow list entry. */ + name?: InputMaybe; + /** The ID of the owner for which to create the new IP allow list entry. */ + ownerId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CreateIpAllowListEntry */ +export type CreateIpAllowListEntryPayload = { + __typename?: 'CreateIpAllowListEntryPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The IP allow list entry that was created. */ + ipAllowListEntry?: Maybe; +}; + +/** Autogenerated input type of CreateIssue */ +export type CreateIssueInput = { + /** The Node ID for the user assignee for this issue. */ + assigneeIds?: InputMaybe>; + /** The body for the issue description. */ + body?: InputMaybe; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** The name of an issue template in the repository, assigns labels and assignees from the template to the issue */ + issueTemplate?: InputMaybe; + /** An array of Node IDs of labels for this issue. */ + labelIds?: InputMaybe>; + /** The Node ID of the milestone for this issue. */ + milestoneId?: InputMaybe; + /** An array of Node IDs for projects associated with this issue. */ + projectIds?: InputMaybe>; + /** The Node ID of the repository. */ + repositoryId: Scalars['ID']['input']; + /** The title for the issue. */ + title: Scalars['String']['input']; +}; + +/** Autogenerated return type of CreateIssue */ +export type CreateIssuePayload = { + __typename?: 'CreateIssuePayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new issue. */ + issue?: Maybe; +}; + +/** Autogenerated input type of CreateLabel */ +export type CreateLabelInput = { + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: InputMaybe; + /** A 6 character hex code, without the leading #, identifying the color of the label. */ + color: Scalars['String']['input']; + /** A brief description of the label, such as its purpose. */ + description?: InputMaybe; + /** The name of the label. */ + name: Scalars['String']['input']; + /** The Node ID of the repository. */ + repositoryId: Scalars['ID']['input']; +}; + +/** Autogenerated return type of CreateLabel */ +export type CreateLabelPayload = { + __typename?: 'CreateLabelPayload'; + /** A unique identifier for the client performing the mutation. */ + clientMutationId?: Maybe; + /** The new label. */ + label?: Maybe
    diff --git a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx index 77e2b9dc56..dfebd66bd8 100644 --- a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx +++ b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx @@ -30,10 +30,9 @@ export const SourceControlNavigation = ({ eventKey, activePanel, callback }) =>
    - { - activePanel === eventKey ? - : null - } + + + diff --git a/libs/remix-ui/git/src/components/panels/branches.tsx b/libs/remix-ui/git/src/components/panels/branches.tsx index c45e0304b4..c1d10ae0a8 100644 --- a/libs/remix-ui/git/src/components/panels/branches.tsx +++ b/libs/remix-ui/git/src/components/panels/branches.tsx @@ -2,6 +2,7 @@ import React, { useState } from "react"; import { Alert } from "react-bootstrap"; import { gitActionsContext } from "../../state/context"; import { remote } from "../../types"; +import GitUIButton from "../buttons/gituibutton"; import { gitPluginContext } from "../gitui"; import { LocalBranchDetails } from "./branches/localbranchdetails"; import { RemoteBranchDetails } from "./branches/remotebranchedetails"; @@ -44,13 +45,13 @@ export const Branches = () => { id="newbranchname" /> - + :
    No branches
    } diff --git a/libs/remix-ui/git/src/components/panels/branches/branchdifferencedetails.tsx b/libs/remix-ui/git/src/components/panels/branches/branchdifferencedetails.tsx index 812c0e91fd..bf6fde3334 100644 --- a/libs/remix-ui/git/src/components/panels/branches/branchdifferencedetails.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/branchdifferencedetails.tsx @@ -3,26 +3,35 @@ import { Accordion } from "react-bootstrap"; import React, { useEffect, useState } from "react"; import { CommitDetails } from "../commits/commitdetails"; import { CommitsNavigation } from "../../navigation/commits"; +import { branch, remote } from "../../../types"; +import { gitActionsContext } from "../../../state/context"; export interface BrancheDifferenceProps { commits: ReadCommitResult[]; - title: string + title: string, + remote?: remote, + branch?: branch } export const BranchDifferenceDetails = (props: BrancheDifferenceProps) => { - const { commits, title } = props; + const { commits, title, branch, remote } = props; const [activePanel, setActivePanel] = useState(""); + const actions = React.useContext(gitActionsContext) if (commits.length === 0) return null + const getCommitChanges = async (commit: ReadCommitResult) => { + await actions.getCommitChanges(commit.oid, commit.commit.parent[0]) + } + return ( - +
    {commits && commits.map((commit, index) => { return ( - {}} commit={commit}> + {}} commit={commit}> ); })}
    diff --git a/libs/remix-ui/git/src/components/panels/branches/branchdifferences.tsx b/libs/remix-ui/git/src/components/panels/branches/branchdifferences.tsx index 6eac8033c4..c8574a18d3 100644 --- a/libs/remix-ui/git/src/components/panels/branches/branchdifferences.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/branchdifferences.tsx @@ -35,8 +35,8 @@ export const BranchDifferences = (props: BrancheDetailsProps) => { {!showSummary && context.remotes.map((remote, index) => { return (
    - - + + {commitsAhead(remote).length === 0 && commitsBehind(remote).length === 0? null:
    }
    ); diff --git a/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx b/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx index b1976c8a5e..58284182af 100644 --- a/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx @@ -25,7 +25,7 @@ export const LocalBranchDetails = (props: BrancheDetailsProps) => { useEffect(() => { if (activePanel === "0") { console.log('GET BRANCH COMMITS', branch) - if(lastPageNumber === 0) + if (lastPageNumber === 0) actions.getBranchCommits(branch, 1) } }, [activePanel]) @@ -40,37 +40,41 @@ export const LocalBranchDetails = (props: BrancheDetailsProps) => { } const loadNextPage = () => { - console.log('LOAD NEXT PAGE', lastPageNumber+1) - actions.getBranchCommits(branch, lastPageNumber+1) + console.log('LOAD NEXT PAGE', lastPageNumber + 1) + actions.getBranchCommits(branch, lastPageNumber + 1) } const checkoutCommit = async (oid: string) => { try { - //await ModalRef.current?.show(); - actions.checkout({ ref: oid }) - //Utils.log("yes"); + //await ModalRef.current?.show(); + actions.checkout({ ref: oid }) + //Utils.log("yes"); } catch (e) { - //Utils.log("no"); + //Utils.log("no"); } -}; + }; + + const getCommitChanges = async (commit: ReadCommitResult) => { + await actions.getCommitChanges(commit.oid, commit.commit.parent[0]) + } return ( <> -
    - - {context.localBranchCommits && Object.entries(context.localBranchCommits).map(([key, value]) => { - if(key == branch.name){ +
    + + {context.localBranchCommits && Object.entries(context.localBranchCommits).map(([key, value]) => { + if (key == branch.name) { return value.map((commit, index) => { - return() + return () }) - } - })} - + } + })} + -
    - {hasNextPage && Load more} +
    + {hasNextPage && Load more}
    ) diff --git a/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx b/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx index 29adbc9511..a013db4ef2 100644 --- a/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx @@ -24,7 +24,7 @@ export const RemoteBranchDetails = (props: BrancheDetailsProps) => { useEffect(() => { if (activePanel === "0") { console.log('GET BRANCH COMMITS', branch) - if(lastPageNumber === 0) + if (lastPageNumber === 0) actions.getBranchCommits(branch, 1) } }, [activePanel]) @@ -34,7 +34,7 @@ export const RemoteBranchDetails = (props: BrancheDetailsProps) => { let lastPageNumber = 0 console.log('BRANCH COMMITS', context.remoteBranchCommits) context.remoteBranchCommits && Object.entries(context.remoteBranchCommits).map(([key, value]) => { - if(key == branch.name){ + if (key == branch.name) { value.map((page, index) => { hasNextPage = page.hasNextPage lastPageNumber = page.page @@ -53,38 +53,47 @@ export const RemoteBranchDetails = (props: BrancheDetailsProps) => { } const loadNextPage = () => { - console.log('LOAD NEXT PAGE', lastPageNumber+1) - actions.getBranchCommits(branch, lastPageNumber+1) + console.log('LOAD NEXT PAGE', lastPageNumber + 1) + actions.getBranchCommits(branch, lastPageNumber + 1) } const checkoutCommit = async (oid: string) => { try { - //await ModalRef.current?.show(); - actions.checkout({ ref: oid }) - //Utils.log("yes"); + //await ModalRef.current?.show(); + actions.checkout({ ref: oid }) + //Utils.log("yes"); } catch (e) { - //Utils.log("no"); + //Utils.log("no"); } -}; + }; + + const getCommitChanges = async (commit: ReadCommitResult) => { + const changes = await actions.getCommitChanges(commit.oid, commit.commit.parent[0], branch, branch.remote) + console.log('CHANGES', changes) + if(!changes) { + // try to fetch the data + await actions.fetch(branch.remote.remote, branch.name,null,20, true, false, true) + } + } return ( <> -
    - {context.remoteBranchCommits && Object.entries(context.remoteBranchCommits).map(([key, value]) => { - if(key == branch.name){ - return value.map((page, index) => { - return page.commits.map((commit, index) => { - return() +
    + {context.remoteBranchCommits && Object.entries(context.remoteBranchCommits).map(([key, value]) => { + if (key == branch.name) { + return value.map((page, index) => { + return page.commits.map((commit, index) => { + return () + }) }) - }) - } - })} - + } + })} + -
    - {hasNextPage && Load more} +
    + {hasNextPage && Load more}
    ) diff --git a/libs/remix-ui/git/src/components/panels/clone.tsx b/libs/remix-ui/git/src/components/panels/clone.tsx index 2e65158018..f7f76a24c9 100644 --- a/libs/remix-ui/git/src/components/panels/clone.tsx +++ b/libs/remix-ui/git/src/components/panels/clone.tsx @@ -6,6 +6,7 @@ import { gitActionsContext } from "../../state/context"; import { gitPluginContext } from "../gitui"; import { Repositories } from "./repositories"; import { RemixUiCheckbox } from "@remix-ui/checkbox"; +import GitUIButton from "../buttons/gituibutton"; export const Clone = () => { const context = React.useContext(gitPluginContext) @@ -68,9 +69,9 @@ export const Clone = () => { onCloneBranchChange(e.target.value)} value={cloneBranch} className="form-control mb-1 mt-2" placeholder="branch" type="text" id="clonebranch" /> - + }}>clone

    diff --git a/libs/remix-ui/git/src/components/panels/commands/fetch.tsx b/libs/remix-ui/git/src/components/panels/commands/fetch.tsx index 88de01c27f..4b8257185d 100644 --- a/libs/remix-ui/git/src/components/panels/commands/fetch.tsx +++ b/libs/remix-ui/git/src/components/panels/commands/fetch.tsx @@ -1,16 +1,18 @@ import React, { useEffect, useState } from "react"; import { gitActionsContext } from "../../../state/context"; +import GitUIButton from "../../buttons/gituibutton"; +import { gitPluginContext } from "../../gitui"; export const Fetch = () => { const actions = React.useContext(gitActionsContext) - const fetch = async () => { - await actions.fetch() - } - - + const context = React.useContext(gitPluginContext) + return ( <> - +
    + actions.fetch()} className="btn btn-primary mr-1">Fetch {context.upstream} + actions.fetch(null, null, context.currentBranch.name, null, true )} className="btn btn-primary">Fetch {context.currentBranch.name} +
    ) } \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/panels/commands/merge.tsx b/libs/remix-ui/git/src/components/panels/commands/merge.tsx index b312faed21..431a388010 100644 --- a/libs/remix-ui/git/src/components/panels/commands/merge.tsx +++ b/libs/remix-ui/git/src/components/panels/commands/merge.tsx @@ -3,6 +3,7 @@ import { gitActionsContext } from "../../../state/context"; import { gitPluginContext } from "../../gitui"; import { selectStyles, selectTheme } from "../../../types/styles"; import Select from 'react-select' +import GitUIButton from "../../buttons/gituibutton"; export const Merge = () => { const context = React.useContext(gitPluginContext) @@ -46,8 +47,7 @@ export const Merge = () => {
    - - + merge()} className="btn btn-primary mr-1">Merge
    diff --git a/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx b/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx index cffecf9d93..7776a85d74 100644 --- a/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx +++ b/libs/remix-ui/git/src/components/panels/commands/pushpull.tsx @@ -4,6 +4,7 @@ import { gitPluginContext } from "../../gitui"; import { selectStyles, selectTheme } from "../../../types/styles"; import Select, { Options, OptionsOrGroups } from 'react-select' import { setUpstream } from "../../../state/gitpayload"; +import GitUIButton from "../../buttons/gituibutton"; export const PushPull = () => { const context = React.useContext(gitPluginContext) @@ -50,11 +51,12 @@ export const PushPull = () => { } const push = async () => { - actions.push() + console.log('PUSH', context.upstream, localBranch, remoteBranch, force) + actions.push(context.upstream, localBranch, remoteBranch, force) } const pull = async () => { - actions.pull() + actions.pull(context.upstream, localBranch, remoteBranch) } @@ -96,10 +98,10 @@ export const PushPull = () => { -
    +
    - - + pull()} className="btn btn-primary mr-1">Pull + push()} className="btn btn-primary">Push
    diff --git a/libs/remix-ui/git/src/components/panels/commits.tsx b/libs/remix-ui/git/src/components/panels/commits.tsx index 5d784d805f..290bcfc26a 100644 --- a/libs/remix-ui/git/src/components/panels/commits.tsx +++ b/libs/remix-ui/git/src/components/panels/commits.tsx @@ -8,6 +8,7 @@ import { CommitSummary } from "./commits/commitsummary"; export const Commits = () => { + const [hasNextPage, setHasNextPage] = React.useState(true) const context = React.useContext(gitPluginContext) const actions = React.useContext(gitActionsContext) @@ -21,6 +22,16 @@ export const Commits = () => { } }; + const loadNextPage = () => { + console.log('LOAD NEXT PAGE', context.commits.length) + actions.fetch(null, context.currentBranch.name, null, 5, true, true) + //actions.getBranchCommits(branch, lastPageNumber+1) + } + + const getCommitChanges = async (commit: ReadCommitResult) => { + await actions.getCommitChanges(commit.oid, commit.commit.parent[0]) + } + return ( <> @@ -29,11 +40,13 @@ export const Commits = () => {
    {context.commits && context.commits.map((commit, index) => { return ( - + ); })}
    -
    + + {hasNextPage && Load more} + :
    No commits
    } ) diff --git a/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx b/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx index 5b9d3b7e55..15635b0025 100644 --- a/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx +++ b/libs/remix-ui/git/src/components/panels/commits/commitdetails.tsx @@ -9,19 +9,19 @@ import { CommitDetailsItems } from "./commitdetailsitem"; export interface CommitDetailsProps { commit: ReadCommitResult; checkout: (oid: string) => void; + getCommitChanges: (commit: ReadCommitResult) => void; } export const CommitDetails = (props: CommitDetailsProps) => { - const { commit, checkout } = props; + const { commit, checkout, getCommitChanges } = props; const actions = React.useContext(gitActionsContext) const context = React.useContext(gitPluginContext) const [activePanel, setActivePanel] = useState(""); useEffect(() => { - console.log(commit) if (activePanel === "0") { - console.log(commit.oid, commit.commit.parent) - actions.getCommitChanges(commit.oid, commit.commit.parent[0]) + console.log(context) + getCommitChanges(commit) } }, [activePanel]) diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index 37d3ec80d0..a66dc77a93 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -373,31 +373,46 @@ export const clone = async (url: string, branch: string, depth: number, singleBr dispatch(setLoading(false)) } -export const fetch = async (remote?: string, ref?: string, remoteRef?: string) => { +export const fetch = async (remote?: string, ref?: string, remoteRef?: string, depth?: number, singleBranch?: boolean, relative?: boolean, quiet?: boolean) => { + dispatch(setLoading(true)) + await disableCallBacks() + await plugin.call('notification', 'toast', `Fetching ${remote || ''} ${ref || ''} ${remoteRef || ''}`) try { - await plugin.call('dGitProvider' as any, 'fetch', { remote, ref, remoteRef }) - await gitlog() - await getBranches() + await plugin.call('dGitProvider' as any, 'fetch', { remote, ref, remoteRef, depth, singleBranch, relative }); + if(!quiet){ + await gitlog() + await getBranches() + } } catch (e: any) { await parseError(e) } + dispatch(setLoading(false)) + await enableCallBacks() } export const pull = async (remote?: string, ref?: string, remoteRef?: string) => { + dispatch(setLoading(true)) + await disableCallBacks() try { await plugin.call('dGitProvider' as any, 'pull', { remote, ref, remoteRef }) await gitlog() } catch (e: any) { await parseError(e) } + dispatch(setLoading(false)) + await enableCallBacks() } export const push = async (remote?: string, ref?: string, remoteRef?: string, force?: boolean) => { + dispatch(setLoading(true)) + await disableCallBacks() try { await plugin.call('dGitProvider' as any, 'push', { remote, ref, remoteRef, force }) } catch (e: any) { await parseError(e) } + dispatch(setLoading(false)) + await enableCallBacks() } const tokenWarning = async () => { @@ -690,10 +705,16 @@ export const diff = async (commitChange: commitChange) => { */ } -export const getCommitChanges = async (oid1: string, oid2: string) => { - const result: commitChange[] = await plugin.call('dGitProvider', 'getCommitChanges', oid1, oid2) - dispatch(setCommitChanges(result)) - return result +export const getCommitChanges = async (oid1: string, oid2: string, branch?: branch, remote?: remote) => { + console.log(oid1, oid2, branch, remote) + try{ + const result: commitChange[] = await plugin.call('dGitProvider', 'getCommitChanges', oid1, oid2) + dispatch(setCommitChanges(result)) + return result + }catch(e){ + console.log(e) + return false + } } async function getRepoDetails(url: string) { @@ -709,6 +730,7 @@ async function getRepoDetails(url: string) { export const fetchBranch = async (branch: branch, page: number) => { + if(!branch.remote || !branch.remote.url) return const token = await tokenWarning(); console.log('fetch', branch) const { owner, repo } = await getRepoDetails(branch.remote.url); @@ -772,7 +794,7 @@ export const getBranchCommits = async (branch: branch, page: number) => { const commits: ReadCommitResult[] = await plugin.call('dGitProvider', 'log', { ref: branch.name, }) - + const branchDifference: branchDifference = await plugin.call('dGitProvider', 'compareBranches', { branch, remote: { @@ -787,7 +809,7 @@ export const getBranchCommits = async (branch: branch, page: number) => { remote: { remote: 'origin', url: '' }, branchDifference: branchDifference - })) + })) dispatch(setLocalBranchCommits({ branch, commits })) } else { await fetchBranch(branch, page) diff --git a/libs/remix-ui/git/src/lib/listeners.ts b/libs/remix-ui/git/src/lib/listeners.ts index d1cf8457f8..5e012be2e4 100644 --- a/libs/remix-ui/git/src/lib/listeners.ts +++ b/libs/remix-ui/git/src/lib/listeners.ts @@ -184,6 +184,7 @@ export const enableCallBacks = async () => { } const synTimerStart = async () => { + console.trace('synTimerStart') if (!callBackEnabled) return clearTimeout(syncTimer) syncTimer = setTimeout(async () => { diff --git a/libs/remix-ui/git/src/state/context.tsx b/libs/remix-ui/git/src/state/context.tsx index 7b823fb632..69341038a1 100644 --- a/libs/remix-ui/git/src/state/context.tsx +++ b/libs/remix-ui/git/src/state/context.tsx @@ -11,13 +11,13 @@ export interface gitActions { addall(): Promise push(remote?: string, ref?: string, remoteRef?: string, force?: boolean): Promise pull(remote?: string, ref?: string, remoteRef?: string): Promise - fetch(remote?: string, ref?: string, remoteRef?: string): Promise + fetch(remote?: string, ref?: string, remoteRef?: string, depth?: number, singleBranch?: boolean, relative?: boolean, quiet?: boolean): Promise repositories(): Promise checkoutfile(file: string): Promise checkout(cmd: any): Promise createBranch(branch: string): Promise remoteBranches(owner: string, repo: string): Promise - getCommitChanges(oid1: string, oid2: string): Promise + getCommitChanges(oid1: string, oid2: string, branch?: branch, remote?: remote): Promise getBranchCommits(branch: branch, page: number): Promise getGitHubUser(): Promise diff(commitChange: commitChange): Promise diff --git a/package.json b/package.json index 22bec278af..437d5124ce 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "http-server": "^14.1.1", "intro.js": "^4.1.0", "isbinaryfile": "^3.0.2", - "isomorphic-git": "^1.25.0", + "isomorphic-git": "^1.25.7", "jquery": "^3.3.1", "js-yaml": "^4.1.0", "jspdf": "^2.5.1", diff --git a/yarn.lock b/yarn.lock index 0f3a7c9790..145032ffd6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19155,10 +19155,10 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-git@^1.25.0: - version "1.25.0" - resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.25.0.tgz#3a04d7e70f75ebdbb991f9fa87cfec90e3742c9f" - integrity sha512-F8X7z74gL+jN4bd6qB6a3Z0QQzonWPkiQ3nK/oFWlrc2pIwVM9Uksl3YMFh99ltswsqoCoOthgasybX08/fiGg== +isomorphic-git@^1.25.7: + version "1.25.7" + resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.25.7.tgz#f6f6fae81ee67d3982edad8c90ca0f096e39267c" + integrity sha512-KE10ejaIsEpQ+I/apS33qqTjyzCXgOniEaL32DwNbXtboKG8H3cu+RiBcdp3G9w4MpOOTQfGPsWp4i8UxRfDLg== dependencies: async-lock "^1.1.0" clean-git-ref "^2.0.1" From be0be4c078ddc888df48f16531fa933565037eac Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 22 Apr 2024 09:06:13 +0200 Subject: [PATCH 26/71] add gui button --- .../buttons/sourcecontrolbuttons.tsx | 9 +++++---- .../src/components/navigation/branches.tsx | 2 ++ .../git/src/components/navigation/clone.tsx | 2 ++ .../src/components/navigation/commands.tsx | 6 +++++- .../git/src/components/navigation/commits.tsx | 3 ++- .../components/navigation/loaderindicator.tsx | 20 +++++++++++++++++++ .../git/src/components/navigation/remotes.tsx | 2 ++ .../components/navigation/remotesdetails.tsx | 13 ++++++------ .../components/navigation/sourcecontrol.tsx | 3 ++- .../panels/branches/localbranchdetails.tsx | 3 ++- .../panels/branches/remotebranchedetails.tsx | 3 ++- .../git/src/components/panels/clone.tsx | 6 +----- .../git/src/components/panels/commits.tsx | 4 +++- libs/remix-ui/git/src/lib/gitactions.ts | 10 ++++++++++ 14 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 libs/remix-ui/git/src/components/navigation/loaderindicator.tsx diff --git a/libs/remix-ui/git/src/components/buttons/sourcecontrolbuttons.tsx b/libs/remix-ui/git/src/components/buttons/sourcecontrolbuttons.tsx index 54d726c99f..9ec7b56f26 100644 --- a/libs/remix-ui/git/src/components/buttons/sourcecontrolbuttons.tsx +++ b/libs/remix-ui/git/src/components/buttons/sourcecontrolbuttons.tsx @@ -6,6 +6,7 @@ import { FormattedMessage } from "react-intl" import { gitActionsContext } from "../../state/context" import { branch, remote } from "../../types" import { gitPluginContext } from "../gitui" +import GitUIButton from "./gituibutton" interface SourceControlButtonsProps { remote?: remote, @@ -88,16 +89,16 @@ export const SourceControlButtons = (props: SourceControlButtonsProps) => { return ( }> - <>{commitsBehind.length} + <>{commitsBehind.length} }> - <>{commitsAhead.length} + <>{commitsAhead.length} }> - + }> - + { }} className='btn btn-sm'> ) } \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/branches.tsx b/libs/remix-ui/git/src/components/navigation/branches.tsx index d3ee0a9a05..8747e6c48c 100644 --- a/libs/remix-ui/git/src/components/navigation/branches.tsx +++ b/libs/remix-ui/git/src/components/navigation/branches.tsx @@ -2,6 +2,7 @@ import { faCaretDown, faCaretRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { } from "react"; import { gitActionsContext, pluginActionsContext } from "../../state/context"; +import LoaderIndicator from "./loaderindicator"; export const BranchesNavigation = ({ eventKey, activePanel, callback }) => { const pluginactions = React.useContext(pluginActionsContext) @@ -23,6 +24,7 @@ export const BranchesNavigation = ({ eventKey, activePanel, callback }) => { activePanel === eventKey ? : } + diff --git a/libs/remix-ui/git/src/components/navigation/clone.tsx b/libs/remix-ui/git/src/components/navigation/clone.tsx index 85deddbcab..a69b8ada88 100644 --- a/libs/remix-ui/git/src/components/navigation/clone.tsx +++ b/libs/remix-ui/git/src/components/navigation/clone.tsx @@ -1,6 +1,7 @@ import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { useContext, useEffect } from "react"; +import LoaderIndicator from "./loaderindicator"; export const CloneNavigation = ({ eventKey, activePanel, callback }) => { @@ -20,6 +21,7 @@ export const CloneNavigation = ({ eventKey, activePanel, callback }) => { activePanel === eventKey ? : } + diff --git a/libs/remix-ui/git/src/components/navigation/commands.tsx b/libs/remix-ui/git/src/components/navigation/commands.tsx index 7e348a075c..83ee664002 100644 --- a/libs/remix-ui/git/src/components/navigation/commands.tsx +++ b/libs/remix-ui/git/src/components/navigation/commands.tsx @@ -1,8 +1,10 @@ -import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faCircleCheck, faArrowsUpDown } from "@fortawesome/free-solid-svg-icons"; +import { faCaretUp, faCaretDown, faArrowUp, faArrowDown, faArrowRotateRight, faCaretRight, faCircleCheck, faArrowsUpDown, faSpinner } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { useContext, useEffect } from "react"; import { pluginActionsContext } from "../../state/context"; +import GitUIButton from "../buttons/gituibutton"; import { SourceControlButtons } from "../buttons/sourcecontrolbuttons"; +import LoaderIndicator from "./loaderindicator"; export const CommandsNavigation = ({ eventKey, activePanel, callback }) => { const pluginactions = React.useContext(pluginActionsContext) @@ -24,6 +26,8 @@ export const CommandsNavigation = ({ eventKey, activePanel, callback }) => { activePanel === eventKey ? : } + + diff --git a/libs/remix-ui/git/src/components/navigation/commits.tsx b/libs/remix-ui/git/src/components/navigation/commits.tsx index d73fef5818..2657d985cb 100644 --- a/libs/remix-ui/git/src/components/navigation/commits.tsx +++ b/libs/remix-ui/git/src/components/navigation/commits.tsx @@ -7,6 +7,7 @@ import { pluginActionsContext } from "../../state/context"; import { branch, remote } from "../../types"; import { SourceControlButtons } from "../buttons/sourcecontrolbuttons"; import { gitPluginContext } from "../gitui"; +import LoaderIndicator from "./loaderindicator"; export interface CommitsNavigationProps { title: string, @@ -42,7 +43,7 @@ export const CommitsNavigation = ({ eventKey, activePanel, callback, title, bran activePanel === eventKey ? : } - + diff --git a/libs/remix-ui/git/src/components/navigation/loaderindicator.tsx b/libs/remix-ui/git/src/components/navigation/loaderindicator.tsx new file mode 100644 index 0000000000..8c13e101b3 --- /dev/null +++ b/libs/remix-ui/git/src/components/navigation/loaderindicator.tsx @@ -0,0 +1,20 @@ +import React, { useContext } from 'react' +import { gitPluginContext } from '../gitui' + +interface LoaderIndicatorProps { + type?: string; + isLoadingCondition?: boolean; // Optional additional disabling condition +} + +// This component extends a button, disabling it when loading is true +const LoaderIndicator = ({ type, isLoadingCondition }: LoaderIndicatorProps) => { + const { loading } = React.useContext(gitPluginContext) + + const isLoading = loading || isLoadingCondition + if (!isLoading) return null + return ( + + ); +}; + +export default LoaderIndicator; \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/navigation/remotes.tsx b/libs/remix-ui/git/src/components/navigation/remotes.tsx index e63c588bb2..047a31b9da 100644 --- a/libs/remix-ui/git/src/components/navigation/remotes.tsx +++ b/libs/remix-ui/git/src/components/navigation/remotes.tsx @@ -2,6 +2,7 @@ import { faCaretDown, faCaretRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { } from "react"; import { gitActionsContext, pluginActionsContext } from "../../state/context"; +import LoaderIndicator from "./loaderindicator"; export const RemotesNavigation = ({ eventKey, activePanel, callback }) => { const pluginactions = React.useContext(pluginActionsContext) @@ -23,6 +24,7 @@ export const RemotesNavigation = ({ eventKey, activePanel, callback }) => { activePanel === eventKey ? : } + diff --git a/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx b/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx index 819dd1fdd7..ef5c03e1b0 100644 --- a/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx +++ b/libs/remix-ui/git/src/components/navigation/remotesdetails.tsx @@ -3,6 +3,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { useContext, useEffect } from "react"; import { gitActionsContext } from "../../state/context"; import { branch, remote } from "../../types"; +import GitUIButton from "../buttons/gituibutton"; import { gitPluginContext } from "../gitui"; interface RemotesDetailsNavigationProps { @@ -47,15 +48,15 @@ export const RemotesDetailsNavigation = (props: RemotesDetailsNavigationProps) = {context.defaultRemote && context.defaultRemote?.url === remote.url ? - + {}} disabledCondition={true}> : - + } - { + { await actions.fetch(remote.remote) - }}> - actions.removeRemote(remote)}> - {remote?.url && openRemote()}>} + }}> + actions.removeRemote(remote)}> + {remote?.url && openRemote()}>} ); diff --git a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx index dfebd66bd8..66b50f68e8 100644 --- a/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx +++ b/libs/remix-ui/git/src/components/navigation/sourcecontrol.tsx @@ -5,6 +5,7 @@ import React, { useContext, useEffect } from "react"; import { FormattedMessage } from "react-intl"; import { pluginActionsContext } from "../../state/context"; import { SourceControlButtons } from "../buttons/sourcecontrolbuttons"; +import LoaderIndicator from "./loaderindicator"; import { SourceControlMenu } from "./menu/sourcecontrolmenu"; export const SourceControlNavigation = ({ eventKey, activePanel, callback }) => { @@ -27,7 +28,7 @@ export const SourceControlNavigation = ({ eventKey, activePanel, callback }) => activePanel === eventKey ? : } - + diff --git a/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx b/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx index 58284182af..4e9692731a 100644 --- a/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/localbranchdetails.tsx @@ -9,6 +9,7 @@ import { BrancheDetailsNavigation } from "../../navigation/branchedetails"; import { CommitDetailsItems } from "../commits/commitdetailsitem"; import { CommitDetails } from "../commits/commitdetails"; import { BranchDifferences } from "./branchdifferences"; +import GitUIButton from "../../buttons/gituibutton"; export interface BrancheDetailsProps { branch: branch; @@ -74,7 +75,7 @@ export const LocalBranchDetails = (props: BrancheDetailsProps) => { - {hasNextPage && Load more} + {hasNextPage && Load more}
    ) diff --git a/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx b/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx index a013db4ef2..257e179cf6 100644 --- a/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx +++ b/libs/remix-ui/git/src/components/panels/branches/remotebranchedetails.tsx @@ -8,6 +8,7 @@ import { branch } from "../../../types"; import { BrancheDetailsNavigation } from "../../navigation/branchedetails"; import { CommitDetailsItems } from "../commits/commitdetailsitem"; import { CommitDetails } from "../commits/commitdetails"; +import GitUIButton from "../../buttons/gituibutton"; export interface BrancheDetailsProps { branch: branch; @@ -93,7 +94,7 @@ export const RemoteBranchDetails = (props: BrancheDetailsProps) => { - {hasNextPage && Load more} + {hasNextPage && Load more}
    ) diff --git a/libs/remix-ui/git/src/components/panels/clone.tsx b/libs/remix-ui/git/src/components/panels/clone.tsx index f7f76a24c9..1d1bab91cc 100644 --- a/libs/remix-ui/git/src/components/panels/clone.tsx +++ b/libs/remix-ui/git/src/components/panels/clone.tsx @@ -33,11 +33,7 @@ export const Clone = () => { const clone = async () => { - try { - setTimeout(() => actions.clone(cloneUrl, cloneBranch, cloneDepth, !cloneAllBranches), 1500) - } catch (e) { - - } + await actions.clone(cloneUrl, cloneBranch, cloneDepth, !cloneAllBranches) } const onCloneBranchChange = (value: string) => { diff --git a/libs/remix-ui/git/src/components/panels/commits.tsx b/libs/remix-ui/git/src/components/panels/commits.tsx index 290bcfc26a..ad8c3c196a 100644 --- a/libs/remix-ui/git/src/components/panels/commits.tsx +++ b/libs/remix-ui/git/src/components/panels/commits.tsx @@ -1,7 +1,9 @@ import { checkout, ReadCommitResult } from "isomorphic-git"; import React from "react"; import { gitActionsContext } from "../../state/context"; +import GitUIButton from "../buttons/gituibutton"; import { gitPluginContext } from "../gitui"; +import LoaderIndicator from "../navigation/loaderindicator"; import { BranchDifferences } from "./branches/branchdifferences"; import { CommitDetails } from "./commits/commitdetails"; import { CommitSummary } from "./commits/commitsummary"; @@ -45,7 +47,7 @@ export const Commits = () => { })} - {hasNextPage && Load more} + {hasNextPage && Load more} :
    No commits
    } diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index a66dc77a93..4197d80032 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -185,10 +185,16 @@ export const currentBranch = async () => { } export const createBranch = async (name: string = "") => { + dispatch(setLoading(true)) + await disableCallBacks() + if (name) { await plugin.call("dGitProvider", "branch", { ref: name }); await plugin.call("dGitProvider", "checkout", { ref: name }); } + + dispatch(setLoading(false)) + await enableCallBacks() } export const getCommitFromRef = async (ref: string) => { @@ -788,6 +794,8 @@ export const fetchBranch = async (branch: branch, page: number) => { } export const getBranchCommits = async (branch: branch, page: number) => { + dispatch(setLoading(true)) + await disableCallBacks() try { console.log(branch) if (!branch.remote) { @@ -818,6 +826,8 @@ export const getBranchCommits = async (branch: branch, page: number) => { console.log(e) await fetchBranch(branch, page) } + dispatch(setLoading(false)) + await enableCallBacks() } export const setDefaultRemote = async (remote: remote) => { From 777f635f7575201c6a518141a3bf47a33f54a242 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 22 Apr 2024 11:56:19 +0200 Subject: [PATCH 27/71] add device code --- .../git/src/components/github/devicecode.tsx | 30 +++++++++++++++++++ libs/remix-ui/git/src/components/gitui.tsx | 2 ++ libs/remix-ui/git/src/lib/gitactions.ts | 4 --- 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 libs/remix-ui/git/src/components/github/devicecode.tsx diff --git a/libs/remix-ui/git/src/components/github/devicecode.tsx b/libs/remix-ui/git/src/components/github/devicecode.tsx new file mode 100644 index 0000000000..59f574afcb --- /dev/null +++ b/libs/remix-ui/git/src/components/github/devicecode.tsx @@ -0,0 +1,30 @@ +import React, { useState } from 'react'; + +const GetDeviceCode = () => { + const [userCode, setUserCode] = useState(null); + + const requestDeviceCode = async () => { + const response = await fetch('http://localhost:3000/github.com/login/device/code', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + client_id: 'dccbc48453f7afa34fad', + scope: 'repo', // or another appropriate scope + }), + }); + + const data = await response.json(); + setUserCode(data.user_code); // Store user code to show to the user + }; + + return ( +
    + + {userCode &&
    User Code: {userCode}
    } +
    + ); +}; + +export default GetDeviceCode; diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx index 876fe9d1f3..40ec615d75 100644 --- a/libs/remix-ui/git/src/components/gitui.tsx +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -29,6 +29,7 @@ import { GitHubCredentials } from './panels/githubcredentials' import { loaderReducer } from '../state/loaderReducer' import { ApolloClient, ApolloProvider, NormalizedCacheObject } from '@apollo/client' import { client, getApolloLink } from '../state/apolloClient' +import GetDeviceCode from './github/devicecode' export const gitPluginContext = React.createContext(defaultGitState) export const loaderContext = React.createContext(defaultLoaderState) @@ -181,6 +182,7 @@ export const GitUI = (props: IGitUi) => { <> + diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index 4197d80032..f19c0075bf 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -186,15 +186,11 @@ export const currentBranch = async () => { export const createBranch = async (name: string = "") => { dispatch(setLoading(true)) - await disableCallBacks() - if (name) { await plugin.call("dGitProvider", "branch", { ref: name }); await plugin.call("dGitProvider", "checkout", { ref: name }); } - dispatch(setLoading(false)) - await enableCallBacks() } export const getCommitFromRef = async (ref: string) => { From c4dce2d804441f3d18f1a5d9c4f9cfff14115970 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 22 Apr 2024 13:26:09 +0200 Subject: [PATCH 28/71] add device flow --- apps/remix-ide/src/app/files/dgitProvider.ts | 35 ++-- .../git/src/components/github/devicecode.tsx | 154 +++++++++++++++--- .../components/github/repositoryselect.tsx | 88 ++++++++++ libs/remix-ui/git/src/components/gitui.tsx | 4 +- .../src/components/panels/repositories.tsx | 21 +-- 5 files changed, 244 insertions(+), 58 deletions(-) create mode 100644 libs/remix-ui/git/src/components/github/repositoryselect.tsx diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index fee67ca089..65728a3382 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -273,29 +273,29 @@ class DGitProvider extends Plugin { return status } - async compareBranches({branch, remote}:{branch: branch, remote: remote}) { + async compareBranches({ branch, remote }: { branch: branch, remote: remote }) { // Get current branch commits const headCommits = await git.log({ ...await this.addIsomorphicGitConfigFS(), ref: branch.name, }); - + // Get remote branch commits const remoteCommits = await git.log({ ...await this.addIsomorphicGitConfigFS(), ref: `${remote.remote}/${branch.name}`, }); - + // Convert arrays of commit objects to sets of commit SHAs const headCommitSHAs = new Set(headCommits.map(commit => commit.oid)); const remoteCommitSHAs = new Set(remoteCommits.map(commit => commit.oid)); - + // Filter out commits that are only in the remote branch const uniqueRemoteCommits = remoteCommits.filter(commit => !headCommitSHAs.has(commit.oid)); // filter out commits that are only in the local branch const uniqueHeadCommits = headCommits.filter(commit => !remoteCommitSHAs.has(commit.oid)); - + return { uniqueHeadCommits, uniqueRemoteCommits, @@ -1028,7 +1028,7 @@ class DGitProvider extends Plugin { } } - async remotecommits(input: { owner: string, repo: string, token: string, branch: string, length: number,page: number }): Promise { + async remotecommits(input: { owner: string, repo: string, token: string, branch: string, length: number, page: number }): Promise { const octokit = new Octokit({ auth: input.token }) @@ -1091,20 +1091,19 @@ class DGitProvider extends Plugin { } async repositories(input: { token: string }) { - console.log(input) - const octokit = new Octokit({ - auth: input.token - }) - - console.log('octokit', input.token) + // Set your access token + const accessToken = input.token; - const data = await octokit.request('GET /user/repos', { - per_page: 200, - page: 2 - }) + // Set headers for the request + const headers = { + 'Authorization': `Bearer ${accessToken}`, // Include your GitHub access token + 'Accept': 'application/vnd.github.v3+json', // GitHub API v3 media type + }; - console.log(data.data) - return data.data + // Make the GET request with Axios + const response = await axios.get('https://api.github.com/user/repos?visibility=private,public', { headers }) + + return response.data } } diff --git a/libs/remix-ui/git/src/components/github/devicecode.tsx b/libs/remix-ui/git/src/components/github/devicecode.tsx index 59f574afcb..d40127e31c 100644 --- a/libs/remix-ui/git/src/components/github/devicecode.tsx +++ b/libs/remix-ui/git/src/components/github/devicecode.tsx @@ -1,30 +1,144 @@ -import React, { useState } from 'react'; +import React, { useEffect } from "react"; +import { gitActionsContext, pluginActionsContext } from "../../state/context"; +import { gitPluginContext } from "../gitui"; +import axios from "axios"; +import { CopyToClipboard } from "@remix-ui/clipboard"; +import { Card } from "react-bootstrap"; -const GetDeviceCode = () => { - const [userCode, setUserCode] = useState(null); - const requestDeviceCode = async () => { - const response = await fetch('http://localhost:3000/github.com/login/device/code', { - method: 'POST', +export const GetDeviceCode = () => { + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const pluginActions = React.useContext(pluginActionsContext) + const [gitHubResponse, setGitHubResponse] = React.useState(null) + const [authorized, setAuthorized] = React.useState(false) + + + + const getDeviceCodeFromGitHub = async () => { + + setAuthorized(false) + // Send a POST request + const response = await axios({ + method: 'post', + url: 'http://0.0.0.0:3000/github.com/login/device/code', + data: { + client_id: 'dccbc48453f7afa34fad', + scope: 'repo' + }, headers: { 'Content-Type': 'application/json', + 'Accept': 'application/json' }, - body: JSON.stringify({ + }); + + // convert response to json + const githubrespone = await response.data; + console.log('json', githubrespone) + + setGitHubResponse(githubrespone) + } + + const connectApp = async () => { + // poll https://github.com/login/oauth/access_token + const accestokenresponse = await axios({ + method: 'post', + url: 'http://0.0.0.0:3000/github.com/login/oauth/access_token', + data: { client_id: 'dccbc48453f7afa34fad', - scope: 'repo', // or another appropriate scope - }), + device_code: gitHubResponse.device_code, + grant_type: 'urn:ietf:params:oauth:grant-type:device_code' + }, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, }); - const data = await response.json(); - setUserCode(data.user_code); // Store user code to show to the user - }; + // convert response to json + const response = await accestokenresponse.data; + console.log('json2', response) + + if (response.error) { + + } + + if (response.access_token) { + setAuthorized(true) + await pluginActions.saveToken(response.access_token) + await actions.getGitHubUser() + } + + } + + const disconnect = async () => { + setAuthorized(false) + setGitHubResponse(null) + } + + const checkConnection = async () => { + //await actions.getGitHubUser() + } + + useEffect(() => { + + },[]) + + useEffect(() => { + console.log('context.rateLimit', context.rateLimit) + }, [context.rateLimit]) + return ( -
    - - {userCode &&
    User Code: {userCode}
    } -
    - ); -}; - -export default GetDeviceCode; + <> + {(context.gitHubUser && context.gitHubUser.login) ? null : + + } + {gitHubResponse && !authorized && +
    + + Step 1: Copy this code: +
    + +
    + +
    +
    +

    + Step 2: Authorize the app here +

    {gitHubResponse.verification_uri} +


    + Step 3: When you are done, click on the button below: + +
    + } + { + (context.gitHubUser && context.gitHubUser.login) ? +
    + +
    : null + } + { + (context.gitHubUser && context.gitHubUser.login) ? +
    + + + Connected as {context.gitHubUser.login} + + + {context.gitHubUser.html_url} + + + +
    : null + } + + + ) +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/github/repositoryselect.tsx b/libs/remix-ui/git/src/components/github/repositoryselect.tsx new file mode 100644 index 0000000000..7cdcbe8db5 --- /dev/null +++ b/libs/remix-ui/git/src/components/github/repositoryselect.tsx @@ -0,0 +1,88 @@ +import { clearInstances } from 'libs/remix-ui/run-tab/src/lib/actions/actions'; +import React, { useState, useCallback, useEffect } from 'react'; +import { Button } from 'react-bootstrap'; +import { OptionsOrGroups, GroupBase } from 'react-select'; +import Select from 'react-select/async'; +import { gitActionsContext } from '../../state/context'; +import { selectStyles, selectTheme } from '../../types/styles'; +import { gitPluginContext } from '../gitui'; +import { TokenWarning } from '../panels/tokenWarning'; + +const RepositorySelect = () => { + const [page, setPage] = useState(1); + const [repoOtions, setRepoOptions] = useState([]); + const context = React.useContext(gitPluginContext) + const actions = React.useContext(gitActionsContext) + const [loading, setLoading] = useState(false) + const [show, setShow] = useState(false) + + useEffect(() => { + console.log('context', context.repositories) + if (context.repositories && context.repositories.length > 0) { + // map context.repositories to options + const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { + return { value: repo.id, label: repo.full_name } + }) + console.log('options', options) + setRepoOptions(options) + } else { + setRepoOptions(null) + setShow(false) + } + setLoading(false) + + }, [context.repositories]) + + useEffect(() => { + console.log('OTIONS', repoOtions) + },[repoOtions]) + + const selectRepo = async (value: number | string) => { + // find repo + console.log('setRepo', value, context.repositories) + + const repo = context.repositories.find(repo => { + return repo.id.toString() === value.toString() + }) + console.log('repo', repo) + if (repo) { + //setBranchOptions([]) + //setBranch({ name: "" }) + //setRepo(repo) + await actions.remoteBranches(repo.owner.login, repo.name) + } + } + + const fetchRepositories = async () => { + try { + setShow(true) + setLoading(true) + //setRepoOptions([]) + //setBranchOptions([]) + console.log(await actions.repositories()) + } catch (e) { + // do nothing + } + }; + + return ( + <> + { + show ? + e && selectRepo(e.value)} - theme={selectTheme} - styles={selectStyles} - isClearable={true} - placeholder="Type to search for a repository..." - isLoading={loading} - />:null} + {branchOptions && branchOptions.length ? - selectRemoteBranch(e)} + theme={selectTheme} + styles={selectStyles} + isClearable={true} + placeholder="Type to search for a branch..." + /> : null} + ) + +} \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/github/repositoryselect.tsx b/libs/remix-ui/git/src/components/github/repositoryselect.tsx index 7cdcbe8db5..afbace7e32 100644 --- a/libs/remix-ui/git/src/components/github/repositoryselect.tsx +++ b/libs/remix-ui/git/src/components/github/repositoryselect.tsx @@ -1,15 +1,17 @@ -import { clearInstances } from 'libs/remix-ui/run-tab/src/lib/actions/actions'; -import React, { useState, useCallback, useEffect } from 'react'; +import React, { useState, useEffect } from 'react'; import { Button } from 'react-bootstrap'; -import { OptionsOrGroups, GroupBase } from 'react-select'; -import Select from 'react-select/async'; +import Select from 'react-select'; import { gitActionsContext } from '../../state/context'; +import { repository } from '../../types'; import { selectStyles, selectTheme } from '../../types/styles'; import { gitPluginContext } from '../gitui'; import { TokenWarning } from '../panels/tokenWarning'; -const RepositorySelect = () => { - const [page, setPage] = useState(1); +interface RepositorySelectProps { + select: (repo: repository) => void; +} + +const RepositorySelect = (props: RepositorySelectProps) => { const [repoOtions, setRepoOptions] = useState([]); const context = React.useContext(gitPluginContext) const actions = React.useContext(gitActionsContext) @@ -17,14 +19,14 @@ const RepositorySelect = () => { const [show, setShow] = useState(false) useEffect(() => { - console.log('context', context.repositories) if (context.repositories && context.repositories.length > 0) { // map context.repositories to options const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { return { value: repo.id, label: repo.full_name } }) - console.log('options', options) + setRepoOptions(options) + setShow(options.length > 0) } else { setRepoOptions(null) setShow(false) @@ -33,22 +35,19 @@ const RepositorySelect = () => { }, [context.repositories]) - useEffect(() => { - console.log('OTIONS', repoOtions) - },[repoOtions]) - - const selectRepo = async (value: number | string) => { - // find repo - console.log('setRepo', value, context.repositories) - + const selectRepo = async (e: any) => { + if(!e || !e.value) { + props.select(null) + return + } + const value = e && e.value + const repo = context.repositories.find(repo => { return repo.id.toString() === value.toString() }) - console.log('repo', repo) + if (repo) { - //setBranchOptions([]) - //setBranch({ name: "" }) - //setRepo(repo) + props.select(repo) await actions.remoteBranches(repo.owner.login, repo.name) } } @@ -57,8 +56,7 @@ const RepositorySelect = () => { try { setShow(true) setLoading(true) - //setRepoOptions([]) - //setBranchOptions([]) + setRepoOptions([]) console.log(await actions.repositories()) } catch (e) { // do nothing @@ -74,7 +72,7 @@ const RepositorySelect = () => { e && selectRepo(e.value)} - theme={selectTheme} - styles={selectStyles} - isClearable={true} - placeholder="Type to search for a repository..." - isLoading={loading} - /> : null} + {repo ? onRemoteNameChange(e.target.value)} value={remoteName} className="form-control mb-2" type="text" id="remotename" /> diff --git a/libs/remix-ui/git/src/components/panels/repositories.tsx b/libs/remix-ui/git/src/components/panels/repositories.tsx deleted file mode 100644 index 6ab5f32d37..0000000000 --- a/libs/remix-ui/git/src/components/panels/repositories.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { Alert, Button } from "react-bootstrap"; -import { gitActionsContext } from "../../state/context"; -import { repository } from "../../types"; -import { gitPluginContext } from "../gitui"; -import AsyncSelect from 'react-select' -import { selectStyles, selectTheme } from "../../types/styles"; -import { TokenWarning } from "./tokenWarning"; -import RepositorySelect from "../github/repositoryselect"; - -interface RepositoriesProps { - cloneDepth?: number - cloneAllBranches?: boolean -} - -export const Repositories = (props: RepositoriesProps) => { - const { cloneDepth, cloneAllBranches } = props - const context = React.useContext(gitPluginContext) - const actions = React.useContext(gitActionsContext) - const [branch, setBranch] = useState({ name: "" }); - const [repo, setRepo] = useState(null); - const [repoOtions, setRepoOptions] = useState([]); - const [branchOptions, setBranchOptions] = useState([]); - const [loading, setLoading] = useState(false) - const [show, setShow] = useState(false) - - useEffect(() => { - console.log('context', context.repositories) - if (context.repositories && context.repositories.length > 0) { - // map context.repositories to options - const options = context.repositories && context.repositories.length > 0 && context.repositories.map(repo => { - return { value: repo.id, label: repo.full_name } - }) - setRepoOptions(options) - } else { - setRepoOptions(null) - setShow(false) - } - setLoading(false) - - }, [context.repositories]) - - - useEffect(() => { - // map context.branches to options - const options = context.remoteBranches && context.remoteBranches.length > 0 && context.remoteBranches.map(branch => { - return { value: branch.name, label: branch.name } - } - ) - setBranchOptions(options) - }, [context.remoteBranches]) - - - useEffect(() => { - console.log('show', show) - },[show]) - - const fetchRepositories = async () => { - try { - setShow(true) - setLoading(true) - setRepoOptions([]) - setBranchOptions([]) - console.log(await actions.repositories()) - } catch (e) { - // do nothing - } - }; - - const selectRepo = async (value: number | string) => { - // find repo - console.log('setRepo', value, context.repositories) - - const repo = context.repositories.find(repo => { - return repo.id.toString() === value.toString() - }) - console.log('repo', repo) - if (repo) { - setBranchOptions([]) - setBranch({ name: "" }) - setRepo(repo) - await actions.remoteBranches(repo.owner.login, repo.name) - } - } - - const selectRemoteBranch = async (value: number | string) => { - console.log('setRemoteBranch', value) - setBranch({ name: value.toString() }) - } - - const clone = async () => { - try { - console.log('clone', repo, branch) - actions.clone(repo.html_url, branch.name, cloneDepth, !cloneAllBranches) - } catch (e) { - // do nothing - } - }; - - - return ( - <> - - - {branchOptions && branchOptions.length ? - e && selectRemoteBranch(e.value)} - theme={selectTheme} - styles={selectStyles} - isClearable={true} - placeholder="Type to search for a branch..." - /> : null} - - {repo && branch.name && branch.name !== '0' ? - : null} - - - ) -} - - diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index f19c0075bf..1a15191fa5 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -470,8 +470,21 @@ export const repositories = async () => { try { const token = await tokenWarning(); if (token) { - const repos = await plugin.call('dGitProvider' as any, 'repositories', { token }); + let repos = await plugin.call('dGitProvider' as any, 'repositories', { token, per_page: 100 }) dispatch(setRepos(repos)) + let page = 2 + let hasMoreData = true + const per_page = 100 + while(hasMoreData){ + let pagedResponse = await plugin.call('dGitProvider' as any, 'repositories', { token, page:page, per_page: per_page }) + if(pagedResponse.length < per_page){ + hasMoreData = false + } + repos = [...repos,...pagedResponse] + dispatch(setRepos(repos)) + page++ + } + } else { plugin.call('notification', 'alert', { title: 'Error getting repositories', @@ -493,8 +506,20 @@ export const remoteBranches = async (owner: string, repo: string) => { try { const token = await tokenWarning(); if (token) { - const branches = await plugin.call('dGitProvider' as any, 'remotebranches', { token, owner, repo }); + let branches = await plugin.call('dGitProvider' as any, 'remotebranches', { token, owner, repo, per_page: 100 }); dispatch(setRemoteBranches(branches)) + let page = 2 + let hasMoreData = true + const per_page = 100 + while(hasMoreData){ + let pagedResponse = await plugin.call('dGitProvider' as any, 'remotebranches', { token, owner, repo, page:page, per_page: per_page }) + if(pagedResponse.length < per_page){ + hasMoreData = false + } + branches = [...branches,...pagedResponse] + dispatch(setRemoteBranches(branches)) + page++ + } } else { plugin.call('notification', 'alert', { title: 'Error getting branches', From 86c877989a4f88e12dbba7684f503f76ce277e91 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Tue, 23 Apr 2024 12:00:04 +0200 Subject: [PATCH 30/71] rm gql --- libs/remix-ui/git/src/components/gitui.tsx | 8 +- libs/remix-ui/git/src/state/apolloClient.tsx | 22 - libs/remix-ui/git/src/types/codegen.ts | 20 - .../git/src/types/fragment-masking.ts | 67 - libs/remix-ui/git/src/types/gql.ts | 42 - libs/remix-ui/git/src/types/graphql.ts | 30771 ---------------- libs/remix-ui/git/src/types/index.ts | 2 - 7 files changed, 1 insertion(+), 30931 deletions(-) delete mode 100644 libs/remix-ui/git/src/state/apolloClient.tsx delete mode 100644 libs/remix-ui/git/src/types/codegen.ts delete mode 100644 libs/remix-ui/git/src/types/fragment-masking.ts delete mode 100644 libs/remix-ui/git/src/types/gql.ts delete mode 100644 libs/remix-ui/git/src/types/graphql.ts diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx index 3b054a9347..fe4384c67b 100644 --- a/libs/remix-ui/git/src/components/gitui.tsx +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -28,7 +28,7 @@ import { GitHubAuth } from './panels/github' import { GitHubCredentials } from './panels/githubcredentials' import { loaderReducer } from '../state/loaderReducer' import { ApolloClient, ApolloProvider, NormalizedCacheObject } from '@apollo/client' -import { client, getApolloLink } from '../state/apolloClient' + import { GetDeviceCode } from './github/devicecode' export const gitPluginContext = React.createContext(defaultGitState) @@ -41,7 +41,6 @@ interface IGitUi { export const GitUI = (props: IGitUi) => { const plugin = props.plugin const [gitState, gitDispatch] = useReducer(gitReducer, defaultGitState) - const [apolloClient, setApolloClient] = useState>(client) const [loaderState, loaderDispatch] = useReducer(loaderReducer, defaultLoaderState) const [activePanel, setActivePanel] = useState("0"); const [timeOut, setTimeOut] = useState(null) @@ -79,9 +78,6 @@ export const GitUI = (props: IGitUi) => { if (gitState.currentBranch && gitState.currentBranch.remote && gitState.currentBranch.remote.url) { remoteCommits(gitState.currentBranch.remote.url, gitState.currentBranch.name, 1) } - if(gitState.gitHubAccessToken) { - client.setLink(getApolloLink(gitState.gitHubAccessToken)) - } } setTimeout(() => { updatestate() @@ -129,7 +125,6 @@ export const GitUI = (props: IGitUi) => { return (
    - @@ -191,7 +186,6 @@ export const GitUI = (props: IGitUi) => { -
    ) } \ No newline at end of file diff --git a/libs/remix-ui/git/src/state/apolloClient.tsx b/libs/remix-ui/git/src/state/apolloClient.tsx deleted file mode 100644 index e4ae6d60d5..0000000000 --- a/libs/remix-ui/git/src/state/apolloClient.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// ApolloClient.js -import { ApolloClient, InMemoryCache, createHttpLink, ApolloLink } from '@apollo/client'; - -export const getApolloLink = (token: string, uri = 'https://api.github.com/graphql')=>{ - const authLink = new ApolloLink((operation, forward) => { - operation.setContext({ - headers: { - Authorization: `Bearer ${token}`, - }, - }); - return forward(operation); - }); - const httpLink = createHttpLink({ - uri, // Replace with your GraphQL endpoint - }); - return authLink.concat(httpLink) -} - -export const client = new ApolloClient({ - link: getApolloLink(''), - cache: new InMemoryCache(), -}); diff --git a/libs/remix-ui/git/src/types/codegen.ts b/libs/remix-ui/git/src/types/codegen.ts deleted file mode 100644 index aaac7fe651..0000000000 --- a/libs/remix-ui/git/src/types/codegen.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CodegenConfig } from '@graphql-codegen/cli'; - -const config: CodegenConfig = { - schema: 'https://docs.github.com/public/schema.docs.graphql', - // this assumes that all your source files are in a top-level `src/` directory - you might need to adjust this to your file structure - documents: ['./libs/remix-ui/git/src/**/*.{ts,tsx}'], - generates: { - './libs/remix-ui/git/src/types/': { - preset: 'client', - plugins: [], - presetConfig: { - gqlTagName: 'gql', - } - } - }, - overwrite: true, - ignoreNoDocuments: true, -}; - -export default config; \ No newline at end of file diff --git a/libs/remix-ui/git/src/types/fragment-masking.ts b/libs/remix-ui/git/src/types/fragment-masking.ts deleted file mode 100644 index fbedede1f6..0000000000 --- a/libs/remix-ui/git/src/types/fragment-masking.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* eslint-disable */ -import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core'; -import { FragmentDefinitionNode } from 'graphql'; -import { Incremental } from './graphql'; - - -export type FragmentType> = TDocumentType extends DocumentTypeDecoration< - infer TType, - any -> - ? [TType] extends [{ ' $fragmentName'?: infer TKey }] - ? TKey extends string - ? { ' $fragmentRefs'?: { [key in TKey]: TType } } - : never - : never - : never; - -// return non-nullable if `fragmentType` is non-nullable -export function useFragment( - _documentNode: DocumentTypeDecoration, - fragmentType: FragmentType> -): TType; -// return nullable if `fragmentType` is nullable -export function useFragment( - _documentNode: DocumentTypeDecoration, - fragmentType: FragmentType> | null | undefined -): TType | null | undefined; -// return array of non-nullable if `fragmentType` is array of non-nullable -export function useFragment( - _documentNode: DocumentTypeDecoration, - fragmentType: ReadonlyArray>> -): ReadonlyArray; -// return array of nullable if `fragmentType` is array of nullable -export function useFragment( - _documentNode: DocumentTypeDecoration, - fragmentType: ReadonlyArray>> | null | undefined -): ReadonlyArray | null | undefined; -export function useFragment( - _documentNode: DocumentTypeDecoration, - fragmentType: FragmentType> | ReadonlyArray>> | null | undefined -): TType | ReadonlyArray | null | undefined { - return fragmentType as any; -} - - -export function makeFragmentData< - F extends DocumentTypeDecoration, - FT extends ResultOf ->(data: FT, _fragment: F): FragmentType { - return data as FragmentType; -} -export function isFragmentReady( - queryNode: DocumentTypeDecoration, - fragmentNode: TypedDocumentNode, - data: FragmentType, any>> | null | undefined -): data is FragmentType { - const deferredFields = (queryNode as { __meta__?: { deferredFields: Record } }).__meta__ - ?.deferredFields; - - if (!deferredFields) return true; - - const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined; - const fragName = fragDef?.name?.value; - - const fields = (fragName && deferredFields[fragName]) || []; - return fields.length > 0 && fields.every(field => data && field in data); -} diff --git a/libs/remix-ui/git/src/types/gql.ts b/libs/remix-ui/git/src/types/gql.ts deleted file mode 100644 index aed8d177c9..0000000000 --- a/libs/remix-ui/git/src/types/gql.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable */ -import * as types from './graphql'; -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; - -/** - * Map of all GraphQL operations in the project. - * - * This map has several performance disadvantages: - * 1. It is not tree-shakeable, so it will include all operations in the project. - * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. - * 3. It does not support dead code elimination, so it will add unused operations. - * - * Therefore it is highly recommended to use the babel or swc plugin for production. - */ -const documents = { - "\n query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) {\n repository(name: $name, owner: $owner) {\n ref(qualifiedName: \"master\") {\n target {\n ... on Commit {\n history(first: $limit, after: $cursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n node {\n oid\n messageHeadline\n author {\n name\n date\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.GetCommitsDocument, -}; - -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - * - * - * @example - * ```ts - * const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`); - * ``` - * - * The query argument is unknown! - * Please regenerate the types. - */ -export function gql(source: string): unknown; - -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "\n query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) {\n repository(name: $name, owner: $owner) {\n ref(qualifiedName: \"master\") {\n target {\n ... on Commit {\n history(first: $limit, after: $cursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n node {\n oid\n messageHeadline\n author {\n name\n date\n }\n }\n }\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query GetCommits($name: String!, $owner: String!, $cursor: String, $limit: Int = 10) {\n repository(name: $name, owner: $owner) {\n ref(qualifiedName: \"master\") {\n target {\n ... on Commit {\n history(first: $limit, after: $cursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n node {\n oid\n messageHeadline\n author {\n name\n date\n }\n }\n }\n }\n }\n }\n }\n }\n }\n"]; - -export function gql(source: string) { - return (documents as any)[source] ?? {}; -} - -export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/libs/remix-ui/git/src/types/graphql.ts b/libs/remix-ui/git/src/types/graphql.ts deleted file mode 100644 index 6fa57dc229..0000000000 --- a/libs/remix-ui/git/src/types/graphql.ts +++ /dev/null @@ -1,30771 +0,0 @@ -/* eslint-disable */ -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -export type Maybe = T | null; -export type InputMaybe = Maybe; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type MakeEmpty = { [_ in K]?: never }; -export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: { input: string; output: string; } - String: { input: string; output: string; } - Boolean: { input: boolean; output: boolean; } - Int: { input: number; output: number; } - Float: { input: number; output: number; } - /** A (potentially binary) string encoded using base64. */ - Base64String: { input: any; output: any; } - /** - * Represents non-fractional signed whole numeric values. Since the value may - * exceed the size of a 32-bit integer, it's encoded as a string. - */ - BigInt: { input: any; output: any; } - /** An ISO-8601 encoded date string. */ - Date: { input: any; output: any; } - /** An ISO-8601 encoded UTC date string. */ - DateTime: { input: any; output: any; } - /** A Git object ID. */ - GitObjectID: { input: any; output: any; } - /** A fully qualified reference name (e.g. `refs/heads/master`). */ - GitRefname: { input: any; output: any; } - /** Git SSH string */ - GitSSHRemote: { input: any; output: any; } - /** An ISO-8601 encoded date string. Unlike the DateTime type, GitTimestamp is not converted in UTC. */ - GitTimestamp: { input: any; output: any; } - /** A string containing HTML code. */ - HTML: { input: any; output: any; } - /** An ISO-8601 encoded UTC date string with millisecond precision. */ - PreciseDateTime: { input: any; output: any; } - /** An RFC 3986, RFC 3987, and RFC 6570 (level 4) compliant URI string. */ - URI: { input: any; output: any; } - /** A valid x509 certificate string */ - X509Certificate: { input: any; output: any; } -}; - -/** Autogenerated input type of AbortQueuedMigrations */ -export type AbortQueuedMigrationsInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the organization that is running the migrations. */ - ownerId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AbortQueuedMigrations */ -export type AbortQueuedMigrationsPayload = { - __typename?: 'AbortQueuedMigrationsPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** Did the operation succeed? */ - success?: Maybe; -}; - -/** Autogenerated input type of AbortRepositoryMigration */ -export type AbortRepositoryMigrationInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the migration to be aborted. */ - migrationId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AbortRepositoryMigration */ -export type AbortRepositoryMigrationPayload = { - __typename?: 'AbortRepositoryMigrationPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** Did the operation succeed? */ - success?: Maybe; -}; - -/** Autogenerated input type of AcceptEnterpriseAdministratorInvitation */ -export type AcceptEnterpriseAdministratorInvitationInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The id of the invitation being accepted */ - invitationId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AcceptEnterpriseAdministratorInvitation */ -export type AcceptEnterpriseAdministratorInvitationPayload = { - __typename?: 'AcceptEnterpriseAdministratorInvitationPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The invitation that was accepted. */ - invitation?: Maybe; - /** A message confirming the result of accepting an administrator invitation. */ - message?: Maybe; -}; - -/** Autogenerated input type of AcceptTopicSuggestion */ -export type AcceptTopicSuggestionInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** - * The name of the suggested topic. - * - * **Upcoming Change on 2024-04-01 UTC** - * **Description:** `name` will be removed. - * **Reason:** Suggested topics are no longer supported - */ - name?: InputMaybe; - /** - * The Node ID of the repository. - * - * **Upcoming Change on 2024-04-01 UTC** - * **Description:** `repositoryId` will be removed. - * **Reason:** Suggested topics are no longer supported - */ - repositoryId?: InputMaybe; -}; - -/** Autogenerated return type of AcceptTopicSuggestion */ -export type AcceptTopicSuggestionPayload = { - __typename?: 'AcceptTopicSuggestionPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** - * The accepted topic. - * @deprecated Suggested topics are no longer supported Removal on 2024-04-01 UTC. - */ - topic?: Maybe; -}; - -/** Represents an object which can take actions on GitHub. Typically a User or Bot. */ -export type Actor = { - /** A URL pointing to the actor's public avatar. */ - avatarUrl: Scalars['URI']['output']; - /** The username of the actor. */ - login: Scalars['String']['output']; - /** The HTTP path for this actor. */ - resourcePath: Scalars['URI']['output']; - /** The HTTP URL for this actor. */ - url: Scalars['URI']['output']; -}; - - -/** Represents an object which can take actions on GitHub. Typically a User or Bot. */ -export type ActorAvatarUrlArgs = { - size?: InputMaybe; -}; - -/** Location information for an actor */ -export type ActorLocation = { - __typename?: 'ActorLocation'; - /** City */ - city?: Maybe; - /** Country name */ - country?: Maybe; - /** Country code */ - countryCode?: Maybe; - /** Region name */ - region?: Maybe; - /** Region or state code */ - regionCode?: Maybe; -}; - -/** The actor's type. */ -export enum ActorType { - /** Indicates a team actor. */ - Team = 'TEAM', - /** Indicates a user actor. */ - User = 'USER' -} - -/** Autogenerated input type of AddAssigneesToAssignable */ -export type AddAssigneesToAssignableInput = { - /** The id of the assignable object to add assignees to. */ - assignableId: Scalars['ID']['input']; - /** The id of users to add as assignees. */ - assigneeIds: Array; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; -}; - -/** Autogenerated return type of AddAssigneesToAssignable */ -export type AddAssigneesToAssignablePayload = { - __typename?: 'AddAssigneesToAssignablePayload'; - /** The item that was assigned. */ - assignable?: Maybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; -}; - -/** Autogenerated input type of AddComment */ -export type AddCommentInput = { - /** The contents of the comment. */ - body: Scalars['String']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the subject to modify. */ - subjectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddComment */ -export type AddCommentPayload = { - __typename?: 'AddCommentPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The edge from the subject's comment connection. */ - commentEdge?: Maybe; - /** The subject */ - subject?: Maybe; - /** The edge from the subject's timeline connection. */ - timelineEdge?: Maybe; -}; - -/** Autogenerated input type of AddDiscussionComment */ -export type AddDiscussionCommentInput = { - /** The contents of the comment. */ - body: Scalars['String']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the discussion to comment on. */ - discussionId: Scalars['ID']['input']; - /** The Node ID of the discussion comment within this discussion to reply to. */ - replyToId?: InputMaybe; -}; - -/** Autogenerated return type of AddDiscussionComment */ -export type AddDiscussionCommentPayload = { - __typename?: 'AddDiscussionCommentPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The newly created discussion comment. */ - comment?: Maybe; -}; - -/** Autogenerated input type of AddDiscussionPollVote */ -export type AddDiscussionPollVoteInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the discussion poll option to vote for. */ - pollOptionId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddDiscussionPollVote */ -export type AddDiscussionPollVotePayload = { - __typename?: 'AddDiscussionPollVotePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The poll option that a vote was added to. */ - pollOption?: Maybe; -}; - -/** Autogenerated input type of AddEnterpriseOrganizationMember */ -export type AddEnterpriseOrganizationMemberInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the enterprise which owns the organization. */ - enterpriseId: Scalars['ID']['input']; - /** The ID of the organization the users will be added to. */ - organizationId: Scalars['ID']['input']; - /** The role to assign the users in the organization */ - role?: InputMaybe; - /** The IDs of the enterprise members to add. */ - userIds: Array; -}; - -/** Autogenerated return type of AddEnterpriseOrganizationMember */ -export type AddEnterpriseOrganizationMemberPayload = { - __typename?: 'AddEnterpriseOrganizationMemberPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The users who were added to the organization. */ - users?: Maybe>; -}; - -/** Autogenerated input type of AddEnterpriseSupportEntitlement */ -export type AddEnterpriseSupportEntitlementInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the Enterprise which the admin belongs to. */ - enterpriseId: Scalars['ID']['input']; - /** The login of a member who will receive the support entitlement. */ - login: Scalars['String']['input']; -}; - -/** Autogenerated return type of AddEnterpriseSupportEntitlement */ -export type AddEnterpriseSupportEntitlementPayload = { - __typename?: 'AddEnterpriseSupportEntitlementPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** A message confirming the result of adding the support entitlement. */ - message?: Maybe; -}; - -/** Autogenerated input type of AddLabelsToLabelable */ -export type AddLabelsToLabelableInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ids of the labels to add. */ - labelIds: Array; - /** The id of the labelable object to add labels to. */ - labelableId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddLabelsToLabelable */ -export type AddLabelsToLabelablePayload = { - __typename?: 'AddLabelsToLabelablePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The item that was labeled. */ - labelable?: Maybe; -}; - -/** Autogenerated input type of AddProjectCard */ -export type AddProjectCardInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The content of the card. Must be a member of the ProjectCardItem union */ - contentId?: InputMaybe; - /** The note on the card. */ - note?: InputMaybe; - /** The Node ID of the ProjectColumn. */ - projectColumnId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddProjectCard */ -export type AddProjectCardPayload = { - __typename?: 'AddProjectCardPayload'; - /** The edge from the ProjectColumn's card connection. */ - cardEdge?: Maybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The ProjectColumn */ - projectColumn?: Maybe; -}; - -/** Autogenerated input type of AddProjectColumn */ -export type AddProjectColumnInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The name of the column. */ - name: Scalars['String']['input']; - /** The Node ID of the project. */ - projectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddProjectColumn */ -export type AddProjectColumnPayload = { - __typename?: 'AddProjectColumnPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The edge from the project's column connection. */ - columnEdge?: Maybe; - /** The project */ - project?: Maybe; -}; - -/** Autogenerated input type of AddProjectV2DraftIssue */ -export type AddProjectV2DraftIssueInput = { - /** The IDs of the assignees of the draft issue. */ - assigneeIds?: InputMaybe>; - /** The body of the draft issue. */ - body?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the Project to add the draft issue to. */ - projectId: Scalars['ID']['input']; - /** - * The title of the draft issue. A project item can also be created by providing - * the URL of an Issue or Pull Request if you have access. - */ - title: Scalars['String']['input']; -}; - -/** Autogenerated return type of AddProjectV2DraftIssue */ -export type AddProjectV2DraftIssuePayload = { - __typename?: 'AddProjectV2DraftIssuePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The draft issue added to the project. */ - projectItem?: Maybe; -}; - -/** Autogenerated input type of AddProjectV2ItemById */ -export type AddProjectV2ItemByIdInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The id of the Issue or Pull Request to add. */ - contentId: Scalars['ID']['input']; - /** The ID of the Project to add the item to. */ - projectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddProjectV2ItemById */ -export type AddProjectV2ItemByIdPayload = { - __typename?: 'AddProjectV2ItemByIdPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The item added to the project. */ - item?: Maybe; -}; - -/** Autogenerated input type of AddPullRequestReviewComment */ -export type AddPullRequestReviewCommentInput = { - /** - * The text of the comment. This field is required - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `body` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - body?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** - * The SHA of the commit to comment on. - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `commitOID` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - commitOID?: InputMaybe; - /** - * The comment id to reply to. - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `inReplyTo` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - inReplyTo?: InputMaybe; - /** - * The relative path of the file to comment on. - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `path` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - path?: InputMaybe; - /** - * The line index in the diff to comment on. - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `position` will be removed. use addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - position?: InputMaybe; - /** - * The node ID of the pull request reviewing - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `pullRequestId` will be removed. use - * addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - pullRequestId?: InputMaybe; - /** - * The Node ID of the review to modify. - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `pullRequestReviewId` will be removed. use - * addPullRequestReviewThread or addPullRequestReviewThreadReply instead - * **Reason:** We are deprecating the addPullRequestReviewComment mutation - */ - pullRequestReviewId?: InputMaybe; -}; - -/** Autogenerated return type of AddPullRequestReviewComment */ -export type AddPullRequestReviewCommentPayload = { - __typename?: 'AddPullRequestReviewCommentPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The newly created comment. */ - comment?: Maybe; - /** The edge from the review's comment connection. */ - commentEdge?: Maybe; -}; - -/** Autogenerated input type of AddPullRequestReview */ -export type AddPullRequestReviewInput = { - /** The contents of the review body comment. */ - body?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** - * The review line comments. - * - * **Upcoming Change on 2023-10-01 UTC** - * **Description:** `comments` will be removed. use the `threads` argument instead - * **Reason:** We are deprecating comment fields that use diff-relative positioning - */ - comments?: InputMaybe>>; - /** The commit OID the review pertains to. */ - commitOID?: InputMaybe; - /** The event to perform on the pull request review. */ - event?: InputMaybe; - /** The Node ID of the pull request to modify. */ - pullRequestId: Scalars['ID']['input']; - /** The review line comment threads. */ - threads?: InputMaybe>>; -}; - -/** Autogenerated return type of AddPullRequestReview */ -export type AddPullRequestReviewPayload = { - __typename?: 'AddPullRequestReviewPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The newly created pull request review. */ - pullRequestReview?: Maybe; - /** The edge from the pull request's review connection. */ - reviewEdge?: Maybe; -}; - -/** Autogenerated input type of AddPullRequestReviewThread */ -export type AddPullRequestReviewThreadInput = { - /** Body of the thread's first comment. */ - body: Scalars['String']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** - * The line of the blob to which the thread refers, required for line-level - * threads. The end of the line range for multi-line comments. - */ - line?: InputMaybe; - /** Path to the file being commented on. */ - path: Scalars['String']['input']; - /** The node ID of the pull request reviewing */ - pullRequestId?: InputMaybe; - /** The Node ID of the review to modify. */ - pullRequestReviewId?: InputMaybe; - /** The side of the diff on which the line resides. For multi-line comments, this is the side for the end of the line range. */ - side?: InputMaybe; - /** The first line of the range to which the comment refers. */ - startLine?: InputMaybe; - /** The side of the diff on which the start line resides. */ - startSide?: InputMaybe; - /** The level at which the comments in the corresponding thread are targeted, can be a diff line or a file */ - subjectType?: InputMaybe; -}; - -/** Autogenerated return type of AddPullRequestReviewThread */ -export type AddPullRequestReviewThreadPayload = { - __typename?: 'AddPullRequestReviewThreadPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The newly created thread. */ - thread?: Maybe; -}; - -/** Autogenerated input type of AddPullRequestReviewThreadReply */ -export type AddPullRequestReviewThreadReplyInput = { - /** The text of the reply. */ - body: Scalars['String']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the pending review to which the reply will belong. */ - pullRequestReviewId?: InputMaybe; - /** The Node ID of the thread to which this reply is being written. */ - pullRequestReviewThreadId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddPullRequestReviewThreadReply */ -export type AddPullRequestReviewThreadReplyPayload = { - __typename?: 'AddPullRequestReviewThreadReplyPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The newly created reply. */ - comment?: Maybe; -}; - -/** Autogenerated input type of AddReaction */ -export type AddReactionInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The name of the emoji to react with. */ - content: ReactionContent; - /** The Node ID of the subject to modify. */ - subjectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddReaction */ -export type AddReactionPayload = { - __typename?: 'AddReactionPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The reaction object. */ - reaction?: Maybe; - /** The reaction groups for the subject. */ - reactionGroups?: Maybe>; - /** The reactable subject. */ - subject?: Maybe; -}; - -/** Autogenerated input type of AddStar */ -export type AddStarInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Starrable ID to star. */ - starrableId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddStar */ -export type AddStarPayload = { - __typename?: 'AddStarPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The starrable. */ - starrable?: Maybe; -}; - -/** Autogenerated input type of AddUpvote */ -export type AddUpvoteInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the discussion or comment to upvote. */ - subjectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddUpvote */ -export type AddUpvotePayload = { - __typename?: 'AddUpvotePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The votable subject. */ - subject?: Maybe; -}; - -/** Autogenerated input type of AddVerifiableDomain */ -export type AddVerifiableDomainInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The URL of the domain */ - domain: Scalars['URI']['input']; - /** The ID of the owner to add the domain to */ - ownerId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of AddVerifiableDomain */ -export type AddVerifiableDomainPayload = { - __typename?: 'AddVerifiableDomainPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The verifiable domain that was added. */ - domain?: Maybe; -}; - -/** Represents an 'added_to_merge_queue' event on a given pull request. */ -export type AddedToMergeQueueEvent = Node & { - __typename?: 'AddedToMergeQueueEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The user who added this Pull Request to the merge queue */ - enqueuer?: Maybe; - /** The Node ID of the AddedToMergeQueueEvent object */ - id: Scalars['ID']['output']; - /** The merge queue where this pull request was added to. */ - mergeQueue?: Maybe; - /** PullRequest referenced by event. */ - pullRequest?: Maybe; -}; - -/** Represents a 'added_to_project' event on a given issue or pull request. */ -export type AddedToProjectEvent = Node & { - __typename?: 'AddedToProjectEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The Node ID of the AddedToProjectEvent object */ - id: Scalars['ID']['output']; - /** Project referenced by event. */ - project?: Maybe; - /** Project card referenced by this project event. */ - projectCard?: Maybe; - /** Column name referenced by this project event. */ - projectColumnName: Scalars['String']['output']; -}; - -/** Represents an announcement banner. */ -export type AnnouncementBanner = { - /** The text of the announcement */ - announcement?: Maybe; - /** The expiration date of the announcement, if any */ - announcementExpiresAt?: Maybe; - /** Whether the announcement can be dismissed by the user */ - announcementUserDismissible?: Maybe; -}; - -/** A GitHub App. */ -export type App = Node & { - __typename?: 'App'; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The description of the app. */ - description?: Maybe; - /** The Node ID of the App object */ - id: Scalars['ID']['output']; - /** The IP addresses of the app. */ - ipAllowListEntries: IpAllowListEntryConnection; - /** The hex color code, without the leading '#', for the logo background. */ - logoBackgroundColor: Scalars['String']['output']; - /** A URL pointing to the app's logo. */ - logoUrl: Scalars['URI']['output']; - /** The name of the app. */ - name: Scalars['String']['output']; - /** A slug based on the name of the app for use in URLs. */ - slug: Scalars['String']['output']; - /** Identifies the date and time when the object was last updated. */ - updatedAt: Scalars['DateTime']['output']; - /** The URL to the app's homepage. */ - url: Scalars['URI']['output']; -}; - - -/** A GitHub App. */ -export type AppIpAllowListEntriesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** A GitHub App. */ -export type AppLogoUrlArgs = { - size?: InputMaybe; -}; - -/** Autogenerated input type of ApproveDeployments */ -export type ApproveDeploymentsInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** Optional comment for approving deployments */ - comment?: InputMaybe; - /** The ids of environments to reject deployments */ - environmentIds: Array; - /** The node ID of the workflow run containing the pending deployments. */ - workflowRunId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ApproveDeployments */ -export type ApproveDeploymentsPayload = { - __typename?: 'ApproveDeploymentsPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The affected deployments. */ - deployments?: Maybe>; -}; - -/** Autogenerated input type of ApproveVerifiableDomain */ -export type ApproveVerifiableDomainInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the verifiable domain to approve. */ - id: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ApproveVerifiableDomain */ -export type ApproveVerifiableDomainPayload = { - __typename?: 'ApproveVerifiableDomainPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The verifiable domain that was approved. */ - domain?: Maybe; -}; - -/** Autogenerated input type of ArchiveProjectV2Item */ -export type ArchiveProjectV2ItemInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the ProjectV2Item to archive. */ - itemId: Scalars['ID']['input']; - /** The ID of the Project to archive the item from. */ - projectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ArchiveProjectV2Item */ -export type ArchiveProjectV2ItemPayload = { - __typename?: 'ArchiveProjectV2ItemPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The item archived from the project. */ - item?: Maybe; -}; - -/** Autogenerated input type of ArchiveRepository */ -export type ArchiveRepositoryInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the repository to mark as archived. */ - repositoryId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ArchiveRepository */ -export type ArchiveRepositoryPayload = { - __typename?: 'ArchiveRepositoryPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The repository that was marked as archived. */ - repository?: Maybe; -}; - -/** An object that can have users assigned to it. */ -export type Assignable = { - /** A list of Users assigned to this object. */ - assignees: UserConnection; -}; - - -/** An object that can have users assigned to it. */ -export type AssignableAssigneesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** Represents an 'assigned' event on any assignable object. */ -export type AssignedEvent = Node & { - __typename?: 'AssignedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the assignable associated with the event. */ - assignable: Assignable; - /** Identifies the user or mannequin that was assigned. */ - assignee?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the AssignedEvent object */ - id: Scalars['ID']['output']; - /** - * Identifies the user who was assigned. - * @deprecated Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC. - */ - user?: Maybe; -}; - -/** Types that can be assigned to issues. */ -export type Assignee = Bot | Mannequin | Organization | User; - -/** An entry in the audit log. */ -export type AuditEntry = { - /** The action name */ - action: Scalars['String']['output']; - /** The user who initiated the action */ - actor?: Maybe; - /** The IP address of the actor */ - actorIp?: Maybe; - /** A readable representation of the actor's location */ - actorLocation?: Maybe; - /** The username of the user who initiated the action */ - actorLogin?: Maybe; - /** The HTTP path for the actor. */ - actorResourcePath?: Maybe; - /** The HTTP URL for the actor. */ - actorUrl?: Maybe; - /** The time the action was initiated */ - createdAt: Scalars['PreciseDateTime']['output']; - /** The corresponding operation type for the action */ - operationType?: Maybe; - /** The user affected by the action */ - user?: Maybe; - /** For actions involving two users, the actor is the initiator and the user is the affected user. */ - userLogin?: Maybe; - /** The HTTP path for the user. */ - userResourcePath?: Maybe; - /** The HTTP URL for the user. */ - userUrl?: Maybe; -}; - -/** Types that can initiate an audit log event. */ -export type AuditEntryActor = Bot | Organization | User; - -/** Ordering options for Audit Log connections. */ -export type AuditLogOrder = { - /** The ordering direction. */ - direction?: InputMaybe; - /** The field to order Audit Logs by. */ - field?: InputMaybe; -}; - -/** Properties by which Audit Log connections can be ordered. */ -export enum AuditLogOrderField { - /** Order audit log entries by timestamp */ - CreatedAt = 'CREATED_AT' -} - -/** Represents a 'auto_merge_disabled' event on a given pull request. */ -export type AutoMergeDisabledEvent = Node & { - __typename?: 'AutoMergeDisabledEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The user who disabled auto-merge for this Pull Request */ - disabler?: Maybe; - /** The Node ID of the AutoMergeDisabledEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event */ - pullRequest?: Maybe; - /** The reason auto-merge was disabled */ - reason?: Maybe; - /** The reason_code relating to why auto-merge was disabled */ - reasonCode?: Maybe; -}; - -/** Represents a 'auto_merge_enabled' event on a given pull request. */ -export type AutoMergeEnabledEvent = Node & { - __typename?: 'AutoMergeEnabledEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The user who enabled auto-merge for this Pull Request */ - enabler?: Maybe; - /** The Node ID of the AutoMergeEnabledEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event. */ - pullRequest?: Maybe; -}; - -/** Represents an auto-merge request for a pull request */ -export type AutoMergeRequest = { - __typename?: 'AutoMergeRequest'; - /** The email address of the author of this auto-merge request. */ - authorEmail?: Maybe; - /** - * The commit message of the auto-merge request. If a merge queue is required by - * the base branch, this value will be set by the merge queue when merging. - */ - commitBody?: Maybe; - /** - * The commit title of the auto-merge request. If a merge queue is required by - * the base branch, this value will be set by the merge queue when merging - */ - commitHeadline?: Maybe; - /** When was this auto-merge request was enabled. */ - enabledAt?: Maybe; - /** The actor who created the auto-merge request. */ - enabledBy?: Maybe; - /** - * The merge method of the auto-merge request. If a merge queue is required by - * the base branch, this value will be set by the merge queue when merging. - */ - mergeMethod: PullRequestMergeMethod; - /** The pull request that this auto-merge request is set against. */ - pullRequest: PullRequest; -}; - -/** Represents a 'auto_rebase_enabled' event on a given pull request. */ -export type AutoRebaseEnabledEvent = Node & { - __typename?: 'AutoRebaseEnabledEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The user who enabled auto-merge (rebase) for this Pull Request */ - enabler?: Maybe; - /** The Node ID of the AutoRebaseEnabledEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event. */ - pullRequest?: Maybe; -}; - -/** Represents a 'auto_squash_enabled' event on a given pull request. */ -export type AutoSquashEnabledEvent = Node & { - __typename?: 'AutoSquashEnabledEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The user who enabled auto-merge (squash) for this Pull Request */ - enabler?: Maybe; - /** The Node ID of the AutoSquashEnabledEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event. */ - pullRequest?: Maybe; -}; - -/** Represents a 'automatic_base_change_failed' event on a given pull request. */ -export type AutomaticBaseChangeFailedEvent = Node & { - __typename?: 'AutomaticBaseChangeFailedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the AutomaticBaseChangeFailedEvent object */ - id: Scalars['ID']['output']; - /** The new base for this PR */ - newBase: Scalars['String']['output']; - /** The old base for this PR */ - oldBase: Scalars['String']['output']; - /** PullRequest referenced by event. */ - pullRequest: PullRequest; -}; - -/** Represents a 'automatic_base_change_succeeded' event on a given pull request. */ -export type AutomaticBaseChangeSucceededEvent = Node & { - __typename?: 'AutomaticBaseChangeSucceededEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the AutomaticBaseChangeSucceededEvent object */ - id: Scalars['ID']['output']; - /** The new base for this PR */ - newBase: Scalars['String']['output']; - /** The old base for this PR */ - oldBase: Scalars['String']['output']; - /** PullRequest referenced by event. */ - pullRequest: PullRequest; -}; - -/** Represents a 'base_ref_changed' event on a given issue or pull request. */ -export type BaseRefChangedEvent = Node & { - __typename?: 'BaseRefChangedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Identifies the name of the base ref for the pull request after it was changed. */ - currentRefName: Scalars['String']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The Node ID of the BaseRefChangedEvent object */ - id: Scalars['ID']['output']; - /** Identifies the name of the base ref for the pull request before it was changed. */ - previousRefName: Scalars['String']['output']; - /** PullRequest referenced by event. */ - pullRequest: PullRequest; -}; - -/** Represents a 'base_ref_deleted' event on a given pull request. */ -export type BaseRefDeletedEvent = Node & { - __typename?: 'BaseRefDeletedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the name of the Ref associated with the `base_ref_deleted` event. */ - baseRefName?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the BaseRefDeletedEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event. */ - pullRequest?: Maybe; -}; - -/** Represents a 'base_ref_force_pushed' event on a given pull request. */ -export type BaseRefForcePushedEvent = Node & { - __typename?: 'BaseRefForcePushedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the after commit SHA for the 'base_ref_force_pushed' event. */ - afterCommit?: Maybe; - /** Identifies the before commit SHA for the 'base_ref_force_pushed' event. */ - beforeCommit?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the BaseRefForcePushedEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event. */ - pullRequest: PullRequest; - /** Identifies the fully qualified ref name for the 'base_ref_force_pushed' event. */ - ref?: Maybe; -}; - -/** Represents a Git blame. */ -export type Blame = { - __typename?: 'Blame'; - /** The list of ranges from a Git blame. */ - ranges: Array; -}; - -/** Represents a range of information from a Git blame. */ -export type BlameRange = { - __typename?: 'BlameRange'; - /** - * Identifies the recency of the change, from 1 (new) to 10 (old). This is - * calculated as a 2-quantile and determines the length of distance between the - * median age of all the changes in the file and the recency of the current - * range's change. - */ - age: Scalars['Int']['output']; - /** Identifies the line author */ - commit: Commit; - /** The ending line for the range */ - endingLine: Scalars['Int']['output']; - /** The starting line for the range */ - startingLine: Scalars['Int']['output']; -}; - -/** Represents a Git blob. */ -export type Blob = GitObject & Node & { - __typename?: 'Blob'; - /** An abbreviated version of the Git object ID */ - abbreviatedOid: Scalars['String']['output']; - /** Byte size of Blob object */ - byteSize: Scalars['Int']['output']; - /** The HTTP path for this Git object */ - commitResourcePath: Scalars['URI']['output']; - /** The HTTP URL for this Git object */ - commitUrl: Scalars['URI']['output']; - /** The Node ID of the Blob object */ - id: Scalars['ID']['output']; - /** Indicates whether the Blob is binary or text. Returns null if unable to determine the encoding. */ - isBinary?: Maybe; - /** Indicates whether the contents is truncated */ - isTruncated: Scalars['Boolean']['output']; - /** The Git object ID */ - oid: Scalars['GitObjectID']['output']; - /** The Repository the Git object belongs to */ - repository: Repository; - /** UTF8 text data or null if the Blob is binary */ - text?: Maybe; -}; - -/** A special type of user which takes actions on behalf of GitHub Apps. */ -export type Bot = Actor & Node & UniformResourceLocatable & { - __typename?: 'Bot'; - /** A URL pointing to the GitHub App's public avatar. */ - avatarUrl: Scalars['URI']['output']; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The Node ID of the Bot object */ - id: Scalars['ID']['output']; - /** The username of the actor. */ - login: Scalars['String']['output']; - /** The HTTP path for this bot */ - resourcePath: Scalars['URI']['output']; - /** Identifies the date and time when the object was last updated. */ - updatedAt: Scalars['DateTime']['output']; - /** The HTTP URL for this bot */ - url: Scalars['URI']['output']; -}; - - -/** A special type of user which takes actions on behalf of GitHub Apps. */ -export type BotAvatarUrlArgs = { - size?: InputMaybe; -}; - -/** Types which can be actors for `BranchActorAllowance` objects. */ -export type BranchActorAllowanceActor = App | Team | User; - -/** Parameters to be used for the branch_name_pattern rule */ -export type BranchNamePatternParameters = { - __typename?: 'BranchNamePatternParameters'; - /** How this rule will appear to users. */ - name?: Maybe; - /** If true, the rule will fail if the pattern matches. */ - negate: Scalars['Boolean']['output']; - /** The operator to use for matching. */ - operator: Scalars['String']['output']; - /** The pattern to match with. */ - pattern: Scalars['String']['output']; -}; - -/** Parameters to be used for the branch_name_pattern rule */ -export type BranchNamePatternParametersInput = { - /** How this rule will appear to users. */ - name?: InputMaybe; - /** If true, the rule will fail if the pattern matches. */ - negate?: InputMaybe; - /** The operator to use for matching. */ - operator: Scalars['String']['input']; - /** The pattern to match with. */ - pattern: Scalars['String']['input']; -}; - -/** A branch protection rule. */ -export type BranchProtectionRule = Node & { - __typename?: 'BranchProtectionRule'; - /** Can this branch be deleted. */ - allowsDeletions: Scalars['Boolean']['output']; - /** Are force pushes allowed on this branch. */ - allowsForcePushes: Scalars['Boolean']['output']; - /** Is branch creation a protected operation. */ - blocksCreations: Scalars['Boolean']['output']; - /** A list of conflicts matching branches protection rule and other branch protection rules */ - branchProtectionRuleConflicts: BranchProtectionRuleConflictConnection; - /** A list of actors able to force push for this branch protection rule. */ - bypassForcePushAllowances: BypassForcePushAllowanceConnection; - /** A list of actors able to bypass PRs for this branch protection rule. */ - bypassPullRequestAllowances: BypassPullRequestAllowanceConnection; - /** The actor who created this branch protection rule. */ - creator?: Maybe; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** Will new commits pushed to matching branches dismiss pull request review approvals. */ - dismissesStaleReviews: Scalars['Boolean']['output']; - /** The Node ID of the BranchProtectionRule object */ - id: Scalars['ID']['output']; - /** Can admins override branch protection. */ - isAdminEnforced: Scalars['Boolean']['output']; - /** - * Whether users can pull changes from upstream when the branch is locked. Set to - * `true` to allow fork syncing. Set to `false` to prevent fork syncing. - */ - lockAllowsFetchAndMerge: Scalars['Boolean']['output']; - /** Whether to set the branch as read-only. If this is true, users will not be able to push to the branch. */ - lockBranch: Scalars['Boolean']['output']; - /** Repository refs that are protected by this rule */ - matchingRefs: RefConnection; - /** Identifies the protection rule pattern. */ - pattern: Scalars['String']['output']; - /** A list push allowances for this branch protection rule. */ - pushAllowances: PushAllowanceConnection; - /** The repository associated with this branch protection rule. */ - repository?: Maybe; - /** Whether the most recent push must be approved by someone other than the person who pushed it */ - requireLastPushApproval: Scalars['Boolean']['output']; - /** Number of approving reviews required to update matching branches. */ - requiredApprovingReviewCount?: Maybe; - /** List of required deployment environments that must be deployed successfully to update matching branches */ - requiredDeploymentEnvironments?: Maybe>>; - /** List of required status check contexts that must pass for commits to be accepted to matching branches. */ - requiredStatusCheckContexts?: Maybe>>; - /** List of required status checks that must pass for commits to be accepted to matching branches. */ - requiredStatusChecks?: Maybe>; - /** Are approving reviews required to update matching branches. */ - requiresApprovingReviews: Scalars['Boolean']['output']; - /** Are reviews from code owners required to update matching branches. */ - requiresCodeOwnerReviews: Scalars['Boolean']['output']; - /** Are commits required to be signed. */ - requiresCommitSignatures: Scalars['Boolean']['output']; - /** Are conversations required to be resolved before merging. */ - requiresConversationResolution: Scalars['Boolean']['output']; - /** Does this branch require deployment to specific environments before merging */ - requiresDeployments: Scalars['Boolean']['output']; - /** Are merge commits prohibited from being pushed to this branch. */ - requiresLinearHistory: Scalars['Boolean']['output']; - /** Are status checks required to update matching branches. */ - requiresStatusChecks: Scalars['Boolean']['output']; - /** Are branches required to be up to date before merging. */ - requiresStrictStatusChecks: Scalars['Boolean']['output']; - /** Is pushing to matching branches restricted. */ - restrictsPushes: Scalars['Boolean']['output']; - /** Is dismissal of pull request reviews restricted. */ - restrictsReviewDismissals: Scalars['Boolean']['output']; - /** A list review dismissal allowances for this branch protection rule. */ - reviewDismissalAllowances: ReviewDismissalAllowanceConnection; -}; - - -/** A branch protection rule. */ -export type BranchProtectionRuleBranchProtectionRuleConflictsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** A branch protection rule. */ -export type BranchProtectionRuleBypassForcePushAllowancesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** A branch protection rule. */ -export type BranchProtectionRuleBypassPullRequestAllowancesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** A branch protection rule. */ -export type BranchProtectionRuleMatchingRefsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - query?: InputMaybe; -}; - - -/** A branch protection rule. */ -export type BranchProtectionRulePushAllowancesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** A branch protection rule. */ -export type BranchProtectionRuleReviewDismissalAllowancesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** A conflict between two branch protection rules. */ -export type BranchProtectionRuleConflict = { - __typename?: 'BranchProtectionRuleConflict'; - /** Identifies the branch protection rule. */ - branchProtectionRule?: Maybe; - /** Identifies the conflicting branch protection rule. */ - conflictingBranchProtectionRule?: Maybe; - /** Identifies the branch ref that has conflicting rules */ - ref?: Maybe; -}; - -/** The connection type for BranchProtectionRuleConflict. */ -export type BranchProtectionRuleConflictConnection = { - __typename?: 'BranchProtectionRuleConflictConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type BranchProtectionRuleConflictEdge = { - __typename?: 'BranchProtectionRuleConflictEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** The connection type for BranchProtectionRule. */ -export type BranchProtectionRuleConnection = { - __typename?: 'BranchProtectionRuleConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type BranchProtectionRuleEdge = { - __typename?: 'BranchProtectionRuleEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** - * Information about a sponsorship to make for a user or organization with a GitHub - * Sponsors profile, as part of sponsoring many users or organizations at once. - */ -export type BulkSponsorship = { - /** The amount to pay to the sponsorable in US dollars. Valid values: 1-12000. */ - amount: Scalars['Int']['input']; - /** The ID of the user or organization who is receiving the sponsorship. Required if sponsorableLogin is not given. */ - sponsorableId?: InputMaybe; - /** The username of the user or organization who is receiving the sponsorship. Required if sponsorableId is not given. */ - sponsorableLogin?: InputMaybe; -}; - -/** Types that can represent a repository ruleset bypass actor. */ -export type BypassActor = App | Team; - -/** A user, team, or app who has the ability to bypass a force push requirement on a protected branch. */ -export type BypassForcePushAllowance = Node & { - __typename?: 'BypassForcePushAllowance'; - /** The actor that can force push. */ - actor?: Maybe; - /** Identifies the branch protection rule associated with the allowed user, team, or app. */ - branchProtectionRule?: Maybe; - /** The Node ID of the BypassForcePushAllowance object */ - id: Scalars['ID']['output']; -}; - -/** The connection type for BypassForcePushAllowance. */ -export type BypassForcePushAllowanceConnection = { - __typename?: 'BypassForcePushAllowanceConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type BypassForcePushAllowanceEdge = { - __typename?: 'BypassForcePushAllowanceEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** A user, team, or app who has the ability to bypass a pull request requirement on a protected branch. */ -export type BypassPullRequestAllowance = Node & { - __typename?: 'BypassPullRequestAllowance'; - /** The actor that can bypass. */ - actor?: Maybe; - /** Identifies the branch protection rule associated with the allowed user, team, or app. */ - branchProtectionRule?: Maybe; - /** The Node ID of the BypassPullRequestAllowance object */ - id: Scalars['ID']['output']; -}; - -/** The connection type for BypassPullRequestAllowance. */ -export type BypassPullRequestAllowanceConnection = { - __typename?: 'BypassPullRequestAllowanceConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type BypassPullRequestAllowanceEdge = { - __typename?: 'BypassPullRequestAllowanceEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** The Common Vulnerability Scoring System */ -export type Cvss = { - __typename?: 'CVSS'; - /** The CVSS score associated with this advisory */ - score: Scalars['Float']['output']; - /** The CVSS vector string associated with this advisory */ - vectorString?: Maybe; -}; - -/** A common weakness enumeration */ -export type Cwe = Node & { - __typename?: 'CWE'; - /** The id of the CWE */ - cweId: Scalars['String']['output']; - /** A detailed description of this CWE */ - description: Scalars['String']['output']; - /** The Node ID of the CWE object */ - id: Scalars['ID']['output']; - /** The name of this CWE */ - name: Scalars['String']['output']; -}; - -/** The connection type for CWE. */ -export type CweConnection = { - __typename?: 'CWEConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type CweEdge = { - __typename?: 'CWEEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** Autogenerated input type of CancelEnterpriseAdminInvitation */ -export type CancelEnterpriseAdminInvitationInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the pending enterprise administrator invitation. */ - invitationId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CancelEnterpriseAdminInvitation */ -export type CancelEnterpriseAdminInvitationPayload = { - __typename?: 'CancelEnterpriseAdminInvitationPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The invitation that was canceled. */ - invitation?: Maybe; - /** A message confirming the result of canceling an administrator invitation. */ - message?: Maybe; -}; - -/** Autogenerated input type of CancelSponsorship */ -export type CancelSponsorshipInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** - * The ID of the user or organization who is acting as the sponsor, paying for - * the sponsorship. Required if sponsorLogin is not given. - */ - sponsorId?: InputMaybe; - /** - * The username of the user or organization who is acting as the sponsor, paying - * for the sponsorship. Required if sponsorId is not given. - */ - sponsorLogin?: InputMaybe; - /** The ID of the user or organization who is receiving the sponsorship. Required if sponsorableLogin is not given. */ - sponsorableId?: InputMaybe; - /** The username of the user or organization who is receiving the sponsorship. Required if sponsorableId is not given. */ - sponsorableLogin?: InputMaybe; -}; - -/** Autogenerated return type of CancelSponsorship */ -export type CancelSponsorshipPayload = { - __typename?: 'CancelSponsorshipPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The tier that was being used at the time of cancellation. */ - sponsorsTier?: Maybe; -}; - -/** Autogenerated input type of ChangeUserStatus */ -export type ChangeUserStatusInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The emoji to represent your status. Can either be a native Unicode emoji or an emoji name with colons, e.g., :grinning:. */ - emoji?: InputMaybe; - /** If set, the user status will not be shown after this date. */ - expiresAt?: InputMaybe; - /** Whether this status should indicate you are not fully available on GitHub, e.g., you are away. */ - limitedAvailability?: InputMaybe; - /** A short description of your current status. */ - message?: InputMaybe; - /** - * The ID of the organization whose members will be allowed to see the status. If - * omitted, the status will be publicly visible. - */ - organizationId?: InputMaybe; -}; - -/** Autogenerated return type of ChangeUserStatus */ -export type ChangeUserStatusPayload = { - __typename?: 'ChangeUserStatusPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** Your updated status. */ - status?: Maybe; -}; - -/** A single check annotation. */ -export type CheckAnnotation = { - __typename?: 'CheckAnnotation'; - /** The annotation's severity level. */ - annotationLevel?: Maybe; - /** The path to the file that this annotation was made on. */ - blobUrl: Scalars['URI']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The position of this annotation. */ - location: CheckAnnotationSpan; - /** The annotation's message. */ - message: Scalars['String']['output']; - /** The path that this annotation was made on. */ - path: Scalars['String']['output']; - /** Additional information about the annotation. */ - rawDetails?: Maybe; - /** The annotation's title */ - title?: Maybe; -}; - -/** The connection type for CheckAnnotation. */ -export type CheckAnnotationConnection = { - __typename?: 'CheckAnnotationConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** Information from a check run analysis to specific lines of code. */ -export type CheckAnnotationData = { - /** Represents an annotation's information level */ - annotationLevel: CheckAnnotationLevel; - /** The location of the annotation */ - location: CheckAnnotationRange; - /** A short description of the feedback for these lines of code. */ - message: Scalars['String']['input']; - /** The path of the file to add an annotation to. */ - path: Scalars['String']['input']; - /** Details about this annotation. */ - rawDetails?: InputMaybe; - /** The title that represents the annotation. */ - title?: InputMaybe; -}; - -/** An edge in a connection. */ -export type CheckAnnotationEdge = { - __typename?: 'CheckAnnotationEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** Represents an annotation's information level. */ -export enum CheckAnnotationLevel { - /** An annotation indicating an inescapable error. */ - Failure = 'FAILURE', - /** An annotation indicating some information. */ - Notice = 'NOTICE', - /** An annotation indicating an ignorable error. */ - Warning = 'WARNING' -} - -/** A character position in a check annotation. */ -export type CheckAnnotationPosition = { - __typename?: 'CheckAnnotationPosition'; - /** Column number (1 indexed). */ - column?: Maybe; - /** Line number (1 indexed). */ - line: Scalars['Int']['output']; -}; - -/** Information from a check run analysis to specific lines of code. */ -export type CheckAnnotationRange = { - /** The ending column of the range. */ - endColumn?: InputMaybe; - /** The ending line of the range. */ - endLine: Scalars['Int']['input']; - /** The starting column of the range. */ - startColumn?: InputMaybe; - /** The starting line of the range. */ - startLine: Scalars['Int']['input']; -}; - -/** An inclusive pair of positions for a check annotation. */ -export type CheckAnnotationSpan = { - __typename?: 'CheckAnnotationSpan'; - /** End position (inclusive). */ - end: CheckAnnotationPosition; - /** Start position (inclusive). */ - start: CheckAnnotationPosition; -}; - -/** The possible states for a check suite or run conclusion. */ -export enum CheckConclusionState { - /** The check suite or run requires action. */ - ActionRequired = 'ACTION_REQUIRED', - /** The check suite or run has been cancelled. */ - Cancelled = 'CANCELLED', - /** The check suite or run has failed. */ - Failure = 'FAILURE', - /** The check suite or run was neutral. */ - Neutral = 'NEUTRAL', - /** The check suite or run was skipped. */ - Skipped = 'SKIPPED', - /** The check suite or run was marked stale by GitHub. Only GitHub can use this conclusion. */ - Stale = 'STALE', - /** The check suite or run has failed at startup. */ - StartupFailure = 'STARTUP_FAILURE', - /** The check suite or run has succeeded. */ - Success = 'SUCCESS', - /** The check suite or run has timed out. */ - TimedOut = 'TIMED_OUT' -} - -/** A check run. */ -export type CheckRun = Node & RequirableByPullRequest & UniformResourceLocatable & { - __typename?: 'CheckRun'; - /** The check run's annotations */ - annotations?: Maybe; - /** The check suite that this run is a part of. */ - checkSuite: CheckSuite; - /** Identifies the date and time when the check run was completed. */ - completedAt?: Maybe; - /** The conclusion of the check run. */ - conclusion?: Maybe; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The corresponding deployment for this job, if any */ - deployment?: Maybe; - /** The URL from which to find full details of the check run on the integrator's site. */ - detailsUrl?: Maybe; - /** A reference for the check run on the integrator's system. */ - externalId?: Maybe; - /** The Node ID of the CheckRun object */ - id: Scalars['ID']['output']; - /** Whether this is required to pass before merging for a specific pull request. */ - isRequired: Scalars['Boolean']['output']; - /** The name of the check for this check run. */ - name: Scalars['String']['output']; - /** Information about a pending deployment, if any, in this check run */ - pendingDeploymentRequest?: Maybe; - /** The permalink to the check run summary. */ - permalink: Scalars['URI']['output']; - /** The repository associated with this check run. */ - repository: Repository; - /** The HTTP path for this check run. */ - resourcePath: Scalars['URI']['output']; - /** Identifies the date and time when the check run was started. */ - startedAt?: Maybe; - /** The current status of the check run. */ - status: CheckStatusState; - /** The check run's steps */ - steps?: Maybe; - /** A string representing the check run's summary */ - summary?: Maybe; - /** A string representing the check run's text */ - text?: Maybe; - /** A string representing the check run */ - title?: Maybe; - /** The HTTP URL for this check run. */ - url: Scalars['URI']['output']; -}; - - -/** A check run. */ -export type CheckRunAnnotationsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** A check run. */ -export type CheckRunIsRequiredArgs = { - pullRequestId?: InputMaybe; - pullRequestNumber?: InputMaybe; -}; - - -/** A check run. */ -export type CheckRunStepsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - number?: InputMaybe; -}; - -/** Possible further actions the integrator can perform. */ -export type CheckRunAction = { - /** A short explanation of what this action would do. */ - description: Scalars['String']['input']; - /** A reference for the action on the integrator's system. */ - identifier: Scalars['String']['input']; - /** The text to be displayed on a button in the web UI. */ - label: Scalars['String']['input']; -}; - -/** The connection type for CheckRun. */ -export type CheckRunConnection = { - __typename?: 'CheckRunConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type CheckRunEdge = { - __typename?: 'CheckRunEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** The filters that are available when fetching check runs. */ -export type CheckRunFilter = { - /** Filters the check runs created by this application ID. */ - appId?: InputMaybe; - /** Filters the check runs by this name. */ - checkName?: InputMaybe; - /** Filters the check runs by this type. */ - checkType?: InputMaybe; - /** Filters the check runs by these conclusions. */ - conclusions?: InputMaybe>; - /** Filters the check runs by this status. Superceded by statuses. */ - status?: InputMaybe; - /** Filters the check runs by this status. Overrides status. */ - statuses?: InputMaybe>; -}; - -/** Descriptive details about the check run. */ -export type CheckRunOutput = { - /** The annotations that are made as part of the check run. */ - annotations?: InputMaybe>; - /** Images attached to the check run output displayed in the GitHub pull request UI. */ - images?: InputMaybe>; - /** The summary of the check run (supports Commonmark). */ - summary: Scalars['String']['input']; - /** The details of the check run (supports Commonmark). */ - text?: InputMaybe; - /** A title to provide for this check run. */ - title: Scalars['String']['input']; -}; - -/** Images attached to the check run output displayed in the GitHub pull request UI. */ -export type CheckRunOutputImage = { - /** The alternative text for the image. */ - alt: Scalars['String']['input']; - /** A short image description. */ - caption?: InputMaybe; - /** The full URL of the image. */ - imageUrl: Scalars['URI']['input']; -}; - -/** The possible states of a check run in a status rollup. */ -export enum CheckRunState { - /** The check run requires action. */ - ActionRequired = 'ACTION_REQUIRED', - /** The check run has been cancelled. */ - Cancelled = 'CANCELLED', - /** The check run has been completed. */ - Completed = 'COMPLETED', - /** The check run has failed. */ - Failure = 'FAILURE', - /** The check run is in progress. */ - InProgress = 'IN_PROGRESS', - /** The check run was neutral. */ - Neutral = 'NEUTRAL', - /** The check run is in pending state. */ - Pending = 'PENDING', - /** The check run has been queued. */ - Queued = 'QUEUED', - /** The check run was skipped. */ - Skipped = 'SKIPPED', - /** The check run was marked stale by GitHub. Only GitHub can use this conclusion. */ - Stale = 'STALE', - /** The check run has failed at startup. */ - StartupFailure = 'STARTUP_FAILURE', - /** The check run has succeeded. */ - Success = 'SUCCESS', - /** The check run has timed out. */ - TimedOut = 'TIMED_OUT', - /** The check run is in waiting state. */ - Waiting = 'WAITING' -} - -/** Represents a count of the state of a check run. */ -export type CheckRunStateCount = { - __typename?: 'CheckRunStateCount'; - /** The number of check runs with this state. */ - count: Scalars['Int']['output']; - /** The state of a check run. */ - state: CheckRunState; -}; - -/** The possible types of check runs. */ -export enum CheckRunType { - /** Every check run available. */ - All = 'ALL', - /** The latest check run. */ - Latest = 'LATEST' -} - -/** The possible states for a check suite or run status. */ -export enum CheckStatusState { - /** The check suite or run has been completed. */ - Completed = 'COMPLETED', - /** The check suite or run is in progress. */ - InProgress = 'IN_PROGRESS', - /** The check suite or run is in pending state. */ - Pending = 'PENDING', - /** The check suite or run has been queued. */ - Queued = 'QUEUED', - /** The check suite or run has been requested. */ - Requested = 'REQUESTED', - /** The check suite or run is in waiting state. */ - Waiting = 'WAITING' -} - -/** A single check step. */ -export type CheckStep = { - __typename?: 'CheckStep'; - /** Identifies the date and time when the check step was completed. */ - completedAt?: Maybe; - /** The conclusion of the check step. */ - conclusion?: Maybe; - /** A reference for the check step on the integrator's system. */ - externalId?: Maybe; - /** The step's name. */ - name: Scalars['String']['output']; - /** The index of the step in the list of steps of the parent check run. */ - number: Scalars['Int']['output']; - /** Number of seconds to completion. */ - secondsToCompletion?: Maybe; - /** Identifies the date and time when the check step was started. */ - startedAt?: Maybe; - /** The current status of the check step. */ - status: CheckStatusState; -}; - -/** The connection type for CheckStep. */ -export type CheckStepConnection = { - __typename?: 'CheckStepConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type CheckStepEdge = { - __typename?: 'CheckStepEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** A check suite. */ -export type CheckSuite = Node & { - __typename?: 'CheckSuite'; - /** The GitHub App which created this check suite. */ - app?: Maybe; - /** The name of the branch for this check suite. */ - branch?: Maybe; - /** The check runs associated with a check suite. */ - checkRuns?: Maybe; - /** The commit for this check suite */ - commit: Commit; - /** The conclusion of this check suite. */ - conclusion?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The user who triggered the check suite. */ - creator?: Maybe; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The Node ID of the CheckSuite object */ - id: Scalars['ID']['output']; - /** A list of open pull requests matching the check suite. */ - matchingPullRequests?: Maybe; - /** The push that triggered this check suite. */ - push?: Maybe; - /** The repository associated with this check suite. */ - repository: Repository; - /** The HTTP path for this check suite */ - resourcePath: Scalars['URI']['output']; - /** The status of this check suite. */ - status: CheckStatusState; - /** Identifies the date and time when the object was last updated. */ - updatedAt: Scalars['DateTime']['output']; - /** The HTTP URL for this check suite */ - url: Scalars['URI']['output']; - /** The workflow run associated with this check suite. */ - workflowRun?: Maybe; -}; - - -/** A check suite. */ -export type CheckSuiteCheckRunsArgs = { - after?: InputMaybe; - before?: InputMaybe; - filterBy?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** A check suite. */ -export type CheckSuiteMatchingPullRequestsArgs = { - after?: InputMaybe; - baseRefName?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - headRefName?: InputMaybe; - labels?: InputMaybe>; - last?: InputMaybe; - orderBy?: InputMaybe; - states?: InputMaybe>; -}; - -/** The auto-trigger preferences that are available for check suites. */ -export type CheckSuiteAutoTriggerPreference = { - /** The node ID of the application that owns the check suite. */ - appId: Scalars['ID']['input']; - /** Set to `true` to enable automatic creation of CheckSuite events upon pushes to the repository. */ - setting: Scalars['Boolean']['input']; -}; - -/** The connection type for CheckSuite. */ -export type CheckSuiteConnection = { - __typename?: 'CheckSuiteConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type CheckSuiteEdge = { - __typename?: 'CheckSuiteEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** The filters that are available when fetching check suites. */ -export type CheckSuiteFilter = { - /** Filters the check suites created by this application ID. */ - appId?: InputMaybe; - /** Filters the check suites by this name. */ - checkName?: InputMaybe; -}; - -/** An object which can have its data claimed or claim data from another. */ -export type Claimable = Mannequin | User; - -/** Autogenerated input type of ClearLabelsFromLabelable */ -export type ClearLabelsFromLabelableInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The id of the labelable object to clear the labels from. */ - labelableId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ClearLabelsFromLabelable */ -export type ClearLabelsFromLabelablePayload = { - __typename?: 'ClearLabelsFromLabelablePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The item that was unlabeled. */ - labelable?: Maybe; -}; - -/** Autogenerated input type of ClearProjectV2ItemFieldValue */ -export type ClearProjectV2ItemFieldValueInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the field to be cleared. */ - fieldId: Scalars['ID']['input']; - /** The ID of the item to be cleared. */ - itemId: Scalars['ID']['input']; - /** The ID of the Project. */ - projectId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ClearProjectV2ItemFieldValue */ -export type ClearProjectV2ItemFieldValuePayload = { - __typename?: 'ClearProjectV2ItemFieldValuePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The updated item. */ - projectV2Item?: Maybe; -}; - -/** Autogenerated input type of CloneProject */ -export type CloneProjectInput = { - /** The description of the project. */ - body?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** Whether or not to clone the source project's workflows. */ - includeWorkflows: Scalars['Boolean']['input']; - /** The name of the project. */ - name: Scalars['String']['input']; - /** The visibility of the project, defaults to false (private). */ - public?: InputMaybe; - /** The source project to clone. */ - sourceId: Scalars['ID']['input']; - /** The owner ID to create the project under. */ - targetOwnerId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CloneProject */ -export type CloneProjectPayload = { - __typename?: 'CloneProjectPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The id of the JobStatus for populating cloned fields. */ - jobStatusId?: Maybe; - /** The new cloned project. */ - project?: Maybe; -}; - -/** Autogenerated input type of CloneTemplateRepository */ -export type CloneTemplateRepositoryInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** A short description of the new repository. */ - description?: InputMaybe; - /** - * Whether to copy all branches from the template to the new repository. Defaults - * to copying only the default branch of the template. - */ - includeAllBranches?: InputMaybe; - /** The name of the new repository. */ - name: Scalars['String']['input']; - /** The ID of the owner for the new repository. */ - ownerId: Scalars['ID']['input']; - /** The Node ID of the template repository. */ - repositoryId: Scalars['ID']['input']; - /** Indicates the repository's visibility level. */ - visibility: RepositoryVisibility; -}; - -/** Autogenerated return type of CloneTemplateRepository */ -export type CloneTemplateRepositoryPayload = { - __typename?: 'CloneTemplateRepositoryPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new repository. */ - repository?: Maybe; -}; - -/** An object that can be closed */ -export type Closable = { - /** Indicates if the object is closed (definition of closed may depend on type) */ - closed: Scalars['Boolean']['output']; - /** Identifies the date and time when the object was closed. */ - closedAt?: Maybe; - /** Indicates if the object can be closed by the viewer. */ - viewerCanClose: Scalars['Boolean']['output']; - /** Indicates if the object can be reopened by the viewer. */ - viewerCanReopen: Scalars['Boolean']['output']; -}; - -/** Autogenerated input type of CloseDiscussion */ -export type CloseDiscussionInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** ID of the discussion to be closed. */ - discussionId: Scalars['ID']['input']; - /** The reason why the discussion is being closed. */ - reason?: InputMaybe; -}; - -/** Autogenerated return type of CloseDiscussion */ -export type CloseDiscussionPayload = { - __typename?: 'CloseDiscussionPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The discussion that was closed. */ - discussion?: Maybe; -}; - -/** Autogenerated input type of CloseIssue */ -export type CloseIssueInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** ID of the issue to be closed. */ - issueId: Scalars['ID']['input']; - /** The reason the issue is to be closed. */ - stateReason?: InputMaybe; -}; - -/** Autogenerated return type of CloseIssue */ -export type CloseIssuePayload = { - __typename?: 'CloseIssuePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The issue that was closed. */ - issue?: Maybe; -}; - -/** Autogenerated input type of ClosePullRequest */ -export type ClosePullRequestInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** ID of the pull request to be closed. */ - pullRequestId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ClosePullRequest */ -export type ClosePullRequestPayload = { - __typename?: 'ClosePullRequestPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The pull request that was closed. */ - pullRequest?: Maybe; -}; - -/** Represents a 'closed' event on any `Closable`. */ -export type ClosedEvent = Node & UniformResourceLocatable & { - __typename?: 'ClosedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Object that was closed. */ - closable: Closable; - /** Object which triggered the creation of this event. */ - closer?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the ClosedEvent object */ - id: Scalars['ID']['output']; - /** The HTTP path for this closed event. */ - resourcePath: Scalars['URI']['output']; - /** The reason the issue state was changed to closed. */ - stateReason?: Maybe; - /** The HTTP URL for this closed event. */ - url: Scalars['URI']['output']; -}; - -/** The object which triggered a `ClosedEvent`. */ -export type Closer = Commit | PullRequest; - -/** The Code of Conduct for a repository */ -export type CodeOfConduct = Node & { - __typename?: 'CodeOfConduct'; - /** The body of the Code of Conduct */ - body?: Maybe; - /** The Node ID of the CodeOfConduct object */ - id: Scalars['ID']['output']; - /** The key for the Code of Conduct */ - key: Scalars['String']['output']; - /** The formal name of the Code of Conduct */ - name: Scalars['String']['output']; - /** The HTTP path for this Code of Conduct */ - resourcePath?: Maybe; - /** The HTTP URL for this Code of Conduct */ - url?: Maybe; -}; - -/** Collaborators affiliation level with a subject. */ -export enum CollaboratorAffiliation { - /** All collaborators the authenticated user can see. */ - All = 'ALL', - /** All collaborators with permissions to an organization-owned subject, regardless of organization membership status. */ - Direct = 'DIRECT', - /** All outside collaborators of an organization-owned subject. */ - Outside = 'OUTSIDE' -} - -/** Represents a comment. */ -export type Comment = { - /** The actor who authored the comment. */ - author?: Maybe; - /** Author's association with the subject of the comment. */ - authorAssociation: CommentAuthorAssociation; - /** The body as Markdown. */ - body: Scalars['String']['output']; - /** The body rendered to HTML. */ - bodyHTML: Scalars['HTML']['output']; - /** The body rendered to text. */ - bodyText: Scalars['String']['output']; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Check if this comment was created via an email reply. */ - createdViaEmail: Scalars['Boolean']['output']; - /** The actor who edited the comment. */ - editor?: Maybe; - /** The Node ID of the Comment object */ - id: Scalars['ID']['output']; - /** Check if this comment was edited and includes an edit with the creation data */ - includesCreatedEdit: Scalars['Boolean']['output']; - /** The moment the editor made the last edit */ - lastEditedAt?: Maybe; - /** Identifies when the comment was published at. */ - publishedAt?: Maybe; - /** Identifies the date and time when the object was last updated. */ - updatedAt: Scalars['DateTime']['output']; - /** A list of edits to this content. */ - userContentEdits?: Maybe; - /** Did the viewer author this comment. */ - viewerDidAuthor: Scalars['Boolean']['output']; -}; - - -/** Represents a comment. */ -export type CommentUserContentEditsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** A comment author association with repository. */ -export enum CommentAuthorAssociation { - /** Author has been invited to collaborate on the repository. */ - Collaborator = 'COLLABORATOR', - /** Author has previously committed to the repository. */ - Contributor = 'CONTRIBUTOR', - /** Author has not previously committed to GitHub. */ - FirstTimer = 'FIRST_TIMER', - /** Author has not previously committed to the repository. */ - FirstTimeContributor = 'FIRST_TIME_CONTRIBUTOR', - /** Author is a placeholder for an unclaimed user. */ - Mannequin = 'MANNEQUIN', - /** Author is a member of the organization that owns the repository. */ - Member = 'MEMBER', - /** Author has no association with the repository. */ - None = 'NONE', - /** Author is the owner of the repository. */ - Owner = 'OWNER' -} - -/** The possible errors that will prevent a user from updating a comment. */ -export enum CommentCannotUpdateReason { - /** Unable to create comment because repository is archived. */ - Archived = 'ARCHIVED', - /** You cannot update this comment */ - Denied = 'DENIED', - /** You must be the author or have write access to this repository to update this comment. */ - InsufficientAccess = 'INSUFFICIENT_ACCESS', - /** Unable to create comment because issue is locked. */ - Locked = 'LOCKED', - /** You must be logged in to update this comment. */ - LoginRequired = 'LOGIN_REQUIRED', - /** Repository is under maintenance. */ - Maintenance = 'MAINTENANCE', - /** At least one email address must be verified to update this comment. */ - VerifiedEmailRequired = 'VERIFIED_EMAIL_REQUIRED' -} - -/** Represents a 'comment_deleted' event on a given issue or pull request. */ -export type CommentDeletedEvent = Node & { - __typename?: 'CommentDeletedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The user who authored the deleted comment. */ - deletedCommentAuthor?: Maybe; - /** The Node ID of the CommentDeletedEvent object */ - id: Scalars['ID']['output']; -}; - -/** Represents a Git commit. */ -export type Commit = GitObject & Node & Subscribable & UniformResourceLocatable & { - __typename?: 'Commit'; - /** An abbreviated version of the Git object ID */ - abbreviatedOid: Scalars['String']['output']; - /** The number of additions in this commit. */ - additions: Scalars['Int']['output']; - /** - * The merged Pull Request that introduced the commit to the repository. If the - * commit is not present in the default branch, additionally returns open Pull - * Requests associated with the commit - */ - associatedPullRequests?: Maybe; - /** Authorship details of the commit. */ - author?: Maybe; - /** Check if the committer and the author match. */ - authoredByCommitter: Scalars['Boolean']['output']; - /** The datetime when this commit was authored. */ - authoredDate: Scalars['DateTime']['output']; - /** - * The list of authors for this commit based on the git author and the Co-authored-by - * message trailer. The git author will always be first. - */ - authors: GitActorConnection; - /** Fetches `git blame` information. */ - blame: Blame; - /** - * We recommend using the `changedFilesIfAvailable` field instead of - * `changedFiles`, as `changedFiles` will cause your request to return an error - * if GitHub is unable to calculate the number of changed files. - * @deprecated `changedFiles` will be removed. Use `changedFilesIfAvailable` instead. Removal on 2023-01-01 UTC. - */ - changedFiles: Scalars['Int']['output']; - /** - * The number of changed files in this commit. If GitHub is unable to calculate - * the number of changed files (for example due to a timeout), this will return - * `null`. We recommend using this field instead of `changedFiles`. - */ - changedFilesIfAvailable?: Maybe; - /** The check suites associated with a commit. */ - checkSuites?: Maybe; - /** Comments made on the commit. */ - comments: CommitCommentConnection; - /** The HTTP path for this Git object */ - commitResourcePath: Scalars['URI']['output']; - /** The HTTP URL for this Git object */ - commitUrl: Scalars['URI']['output']; - /** The datetime when this commit was committed. */ - committedDate: Scalars['DateTime']['output']; - /** Check if committed via GitHub web UI. */ - committedViaWeb: Scalars['Boolean']['output']; - /** Committer details of the commit. */ - committer?: Maybe; - /** The number of deletions in this commit. */ - deletions: Scalars['Int']['output']; - /** The deployments associated with a commit. */ - deployments?: Maybe; - /** The tree entry representing the file located at the given path. */ - file?: Maybe; - /** The linear commit history starting from (and including) this commit, in the same order as `git log`. */ - history: CommitHistoryConnection; - /** The Node ID of the Commit object */ - id: Scalars['ID']['output']; - /** The Git commit message */ - message: Scalars['String']['output']; - /** The Git commit message body */ - messageBody: Scalars['String']['output']; - /** The commit message body rendered to HTML. */ - messageBodyHTML: Scalars['HTML']['output']; - /** The Git commit message headline */ - messageHeadline: Scalars['String']['output']; - /** The commit message headline rendered to HTML. */ - messageHeadlineHTML: Scalars['HTML']['output']; - /** The Git object ID */ - oid: Scalars['GitObjectID']['output']; - /** The organization this commit was made on behalf of. */ - onBehalfOf?: Maybe; - /** The parents of a commit. */ - parents: CommitConnection; - /** - * The datetime when this commit was pushed. - * @deprecated `pushedDate` is no longer supported. Removal on 2023-07-01 UTC. - */ - pushedDate?: Maybe; - /** The Repository this commit belongs to */ - repository: Repository; - /** The HTTP path for this commit */ - resourcePath: Scalars['URI']['output']; - /** Commit signing information, if present. */ - signature?: Maybe; - /** Status information for this commit */ - status?: Maybe; - /** Check and Status rollup information for this commit. */ - statusCheckRollup?: Maybe; - /** Returns a list of all submodules in this repository as of this Commit parsed from the .gitmodules file. */ - submodules: SubmoduleConnection; - /** - * Returns a URL to download a tarball archive for a repository. - * Note: For private repositories, these links are temporary and expire after five minutes. - */ - tarballUrl: Scalars['URI']['output']; - /** Commit's root Tree */ - tree: Tree; - /** The HTTP path for the tree of this commit */ - treeResourcePath: Scalars['URI']['output']; - /** The HTTP URL for the tree of this commit */ - treeUrl: Scalars['URI']['output']; - /** The HTTP URL for this commit */ - url: Scalars['URI']['output']; - /** Check if the viewer is able to change their subscription status for the repository. */ - viewerCanSubscribe: Scalars['Boolean']['output']; - /** Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. */ - viewerSubscription?: Maybe; - /** - * Returns a URL to download a zipball archive for a repository. - * Note: For private repositories, these links are temporary and expire after five minutes. - */ - zipballUrl: Scalars['URI']['output']; -}; - - -/** Represents a Git commit. */ -export type CommitAssociatedPullRequestsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitAuthorsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitBlameArgs = { - path: Scalars['String']['input']; -}; - - -/** Represents a Git commit. */ -export type CommitCheckSuitesArgs = { - after?: InputMaybe; - before?: InputMaybe; - filterBy?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitCommentsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitDeploymentsArgs = { - after?: InputMaybe; - before?: InputMaybe; - environments?: InputMaybe>; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitFileArgs = { - path: Scalars['String']['input']; -}; - - -/** Represents a Git commit. */ -export type CommitHistoryArgs = { - after?: InputMaybe; - author?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - path?: InputMaybe; - since?: InputMaybe; - until?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitParentsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -/** Represents a Git commit. */ -export type CommitSubmodulesArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** Specifies an author for filtering Git commits. */ -export type CommitAuthor = { - /** Email addresses to filter by. Commits authored by any of the specified email addresses will be returned. */ - emails?: InputMaybe>; - /** - * ID of a User to filter by. If non-null, only commits authored by this user - * will be returned. This field takes precedence over emails. - */ - id?: InputMaybe; -}; - -/** Parameters to be used for the commit_author_email_pattern rule */ -export type CommitAuthorEmailPatternParameters = { - __typename?: 'CommitAuthorEmailPatternParameters'; - /** How this rule will appear to users. */ - name?: Maybe; - /** If true, the rule will fail if the pattern matches. */ - negate: Scalars['Boolean']['output']; - /** The operator to use for matching. */ - operator: Scalars['String']['output']; - /** The pattern to match with. */ - pattern: Scalars['String']['output']; -}; - -/** Parameters to be used for the commit_author_email_pattern rule */ -export type CommitAuthorEmailPatternParametersInput = { - /** How this rule will appear to users. */ - name?: InputMaybe; - /** If true, the rule will fail if the pattern matches. */ - negate?: InputMaybe; - /** The operator to use for matching. */ - operator: Scalars['String']['input']; - /** The pattern to match with. */ - pattern: Scalars['String']['input']; -}; - -/** Represents a comment on a given Commit. */ -export type CommitComment = Comment & Deletable & Minimizable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment & { - __typename?: 'CommitComment'; - /** The actor who authored the comment. */ - author?: Maybe; - /** Author's association with the subject of the comment. */ - authorAssociation: CommentAuthorAssociation; - /** Identifies the comment body. */ - body: Scalars['String']['output']; - /** The body rendered to HTML. */ - bodyHTML: Scalars['HTML']['output']; - /** The body rendered to text. */ - bodyText: Scalars['String']['output']; - /** Identifies the commit associated with the comment, if the commit exists. */ - commit?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Check if this comment was created via an email reply. */ - createdViaEmail: Scalars['Boolean']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The actor who edited the comment. */ - editor?: Maybe; - /** The Node ID of the CommitComment object */ - id: Scalars['ID']['output']; - /** Check if this comment was edited and includes an edit with the creation data */ - includesCreatedEdit: Scalars['Boolean']['output']; - /** Returns whether or not a comment has been minimized. */ - isMinimized: Scalars['Boolean']['output']; - /** The moment the editor made the last edit */ - lastEditedAt?: Maybe; - /** - * Returns why the comment was minimized. One of `abuse`, `off-topic`, - * `outdated`, `resolved`, `duplicate` and `spam`. Note that the case and - * formatting of these values differs from the inputs to the `MinimizeComment` mutation. - */ - minimizedReason?: Maybe; - /** Identifies the file path associated with the comment. */ - path?: Maybe; - /** Identifies the line position associated with the comment. */ - position?: Maybe; - /** Identifies when the comment was published at. */ - publishedAt?: Maybe; - /** A list of reactions grouped by content left on the subject. */ - reactionGroups?: Maybe>; - /** A list of Reactions left on the Issue. */ - reactions: ReactionConnection; - /** The repository associated with this node. */ - repository: Repository; - /** The HTTP path permalink for this commit comment. */ - resourcePath: Scalars['URI']['output']; - /** Identifies the date and time when the object was last updated. */ - updatedAt: Scalars['DateTime']['output']; - /** The HTTP URL permalink for this commit comment. */ - url: Scalars['URI']['output']; - /** A list of edits to this content. */ - userContentEdits?: Maybe; - /** Check if the current viewer can delete this object. */ - viewerCanDelete: Scalars['Boolean']['output']; - /** Check if the current viewer can minimize this object. */ - viewerCanMinimize: Scalars['Boolean']['output']; - /** Can user react to this subject */ - viewerCanReact: Scalars['Boolean']['output']; - /** Check if the current viewer can update this object. */ - viewerCanUpdate: Scalars['Boolean']['output']; - /** Reasons why the current viewer can not update this comment. */ - viewerCannotUpdateReasons: Array; - /** Did the viewer author this comment. */ - viewerDidAuthor: Scalars['Boolean']['output']; -}; - - -/** Represents a comment on a given Commit. */ -export type CommitCommentReactionsArgs = { - after?: InputMaybe; - before?: InputMaybe; - content?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** Represents a comment on a given Commit. */ -export type CommitCommentUserContentEditsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** The connection type for CommitComment. */ -export type CommitCommentConnection = { - __typename?: 'CommitCommentConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** An edge in a connection. */ -export type CommitCommentEdge = { - __typename?: 'CommitCommentEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** A thread of comments on a commit. */ -export type CommitCommentThread = Node & RepositoryNode & { - __typename?: 'CommitCommentThread'; - /** The comments that exist in this thread. */ - comments: CommitCommentConnection; - /** The commit the comments were made on. */ - commit?: Maybe; - /** The Node ID of the CommitCommentThread object */ - id: Scalars['ID']['output']; - /** The file the comments were made on. */ - path?: Maybe; - /** The position in the diff for the commit that the comment was made on. */ - position?: Maybe; - /** The repository associated with this node. */ - repository: Repository; -}; - - -/** A thread of comments on a commit. */ -export type CommitCommentThreadCommentsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** The connection type for Commit. */ -export type CommitConnection = { - __typename?: 'CommitConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** Ordering options for commit contribution connections. */ -export type CommitContributionOrder = { - /** The ordering direction. */ - direction: OrderDirection; - /** The field by which to order commit contributions. */ - field: CommitContributionOrderField; -}; - -/** Properties by which commit contribution connections can be ordered. */ -export enum CommitContributionOrderField { - /** Order commit contributions by how many commits they represent. */ - CommitCount = 'COMMIT_COUNT', - /** Order commit contributions by when they were made. */ - OccurredAt = 'OCCURRED_AT' -} - -/** This aggregates commits made by a user within one repository. */ -export type CommitContributionsByRepository = { - __typename?: 'CommitContributionsByRepository'; - /** The commit contributions, each representing a day. */ - contributions: CreatedCommitContributionConnection; - /** The repository in which the commits were made. */ - repository: Repository; - /** The HTTP path for the user's commits to the repository in this time range. */ - resourcePath: Scalars['URI']['output']; - /** The HTTP URL for the user's commits to the repository in this time range. */ - url: Scalars['URI']['output']; -}; - - -/** This aggregates commits made by a user within one repository. */ -export type CommitContributionsByRepositoryContributionsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - -/** An edge in a connection. */ -export type CommitEdge = { - __typename?: 'CommitEdge'; - /** A cursor for use in pagination. */ - cursor: Scalars['String']['output']; - /** The item at the end of the edge. */ - node?: Maybe; -}; - -/** The connection type for Commit. */ -export type CommitHistoryConnection = { - __typename?: 'CommitHistoryConnection'; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** A message to include with a new commit */ -export type CommitMessage = { - /** The body of the message. */ - body?: InputMaybe; - /** The headline of the message. */ - headline: Scalars['String']['input']; -}; - -/** Parameters to be used for the commit_message_pattern rule */ -export type CommitMessagePatternParameters = { - __typename?: 'CommitMessagePatternParameters'; - /** How this rule will appear to users. */ - name?: Maybe; - /** If true, the rule will fail if the pattern matches. */ - negate: Scalars['Boolean']['output']; - /** The operator to use for matching. */ - operator: Scalars['String']['output']; - /** The pattern to match with. */ - pattern: Scalars['String']['output']; -}; - -/** Parameters to be used for the commit_message_pattern rule */ -export type CommitMessagePatternParametersInput = { - /** How this rule will appear to users. */ - name?: InputMaybe; - /** If true, the rule will fail if the pattern matches. */ - negate?: InputMaybe; - /** The operator to use for matching. */ - operator: Scalars['String']['input']; - /** The pattern to match with. */ - pattern: Scalars['String']['input']; -}; - -/** - * A git ref for a commit to be appended to. - * - * The ref must be a branch, i.e. its fully qualified name must start - * with `refs/heads/` (although the input is not required to be fully - * qualified). - * - * The Ref may be specified by its global node ID or by the - * `repositoryNameWithOwner` and `branchName`. - * - * ### Examples - * - * Specify a branch using a global node ID: - * - * { "id": "MDM6UmVmMTpyZWZzL2hlYWRzL21haW4=" } - * - * Specify a branch using `repositoryNameWithOwner` and `branchName`: - * - * { - * "repositoryNameWithOwner": "github/graphql-client", - * "branchName": "main" - * } - */ -export type CommittableBranch = { - /** The unqualified name of the branch to append the commit to. */ - branchName?: InputMaybe; - /** The Node ID of the Ref to be updated. */ - id?: InputMaybe; - /** The nameWithOwner of the repository to commit to. */ - repositoryNameWithOwner?: InputMaybe; -}; - -/** Parameters to be used for the committer_email_pattern rule */ -export type CommitterEmailPatternParameters = { - __typename?: 'CommitterEmailPatternParameters'; - /** How this rule will appear to users. */ - name?: Maybe; - /** If true, the rule will fail if the pattern matches. */ - negate: Scalars['Boolean']['output']; - /** The operator to use for matching. */ - operator: Scalars['String']['output']; - /** The pattern to match with. */ - pattern: Scalars['String']['output']; -}; - -/** Parameters to be used for the committer_email_pattern rule */ -export type CommitterEmailPatternParametersInput = { - /** How this rule will appear to users. */ - name?: InputMaybe; - /** If true, the rule will fail if the pattern matches. */ - negate?: InputMaybe; - /** The operator to use for matching. */ - operator: Scalars['String']['input']; - /** The pattern to match with. */ - pattern: Scalars['String']['input']; -}; - -/** Represents a comparison between two commit revisions. */ -export type Comparison = Node & { - __typename?: 'Comparison'; - /** The number of commits ahead of the base branch. */ - aheadBy: Scalars['Int']['output']; - /** The base revision of this comparison. */ - baseTarget: GitObject; - /** The number of commits behind the base branch. */ - behindBy: Scalars['Int']['output']; - /** The commits which compose this comparison. */ - commits: ComparisonCommitConnection; - /** The head revision of this comparison. */ - headTarget: GitObject; - /** The Node ID of the Comparison object */ - id: Scalars['ID']['output']; - /** The status of this comparison. */ - status: ComparisonStatus; -}; - - -/** Represents a comparison between two commit revisions. */ -export type ComparisonCommitsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** The connection type for Commit. */ -export type ComparisonCommitConnection = { - __typename?: 'ComparisonCommitConnection'; - /** The total count of authors and co-authors across all commits. */ - authorCount: Scalars['Int']['output']; - /** A list of edges. */ - edges?: Maybe>>; - /** A list of nodes. */ - nodes?: Maybe>>; - /** Information to aid in pagination. */ - pageInfo: PageInfo; - /** Identifies the total count of items in the connection. */ - totalCount: Scalars['Int']['output']; -}; - -/** The status of a git comparison between two refs. */ -export enum ComparisonStatus { - /** The head ref is ahead of the base ref. */ - Ahead = 'AHEAD', - /** The head ref is behind the base ref. */ - Behind = 'BEHIND', - /** The head ref is both ahead and behind of the base ref, indicating git history has diverged. */ - Diverged = 'DIVERGED', - /** The head ref and base ref are identical. */ - Identical = 'IDENTICAL' -} - -/** Represents a 'connected' event on a given issue or pull request. */ -export type ConnectedEvent = Node & { - __typename?: 'ConnectedEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the ConnectedEvent object */ - id: Scalars['ID']['output']; - /** Reference originated in a different repository. */ - isCrossRepository: Scalars['Boolean']['output']; - /** Issue or pull request that made the reference. */ - source: ReferencedSubject; - /** Issue or pull request which was connected. */ - subject: ReferencedSubject; -}; - -/** The Contributing Guidelines for a repository. */ -export type ContributingGuidelines = { - __typename?: 'ContributingGuidelines'; - /** The body of the Contributing Guidelines. */ - body?: Maybe; - /** The HTTP path for the Contributing Guidelines. */ - resourcePath?: Maybe; - /** The HTTP URL for the Contributing Guidelines. */ - url?: Maybe; -}; - -/** Represents a contribution a user made on GitHub, such as opening an issue. */ -export type Contribution = { - /** - * Whether this contribution is associated with a record you do not have access to. For - * example, your own 'first issue' contribution may have been made on a repository you can no - * longer access. - */ - isRestricted: Scalars['Boolean']['output']; - /** When this contribution was made. */ - occurredAt: Scalars['DateTime']['output']; - /** The HTTP path for this contribution. */ - resourcePath: Scalars['URI']['output']; - /** The HTTP URL for this contribution. */ - url: Scalars['URI']['output']; - /** The user who made this contribution. */ - user: User; -}; - -/** A calendar of contributions made on GitHub by a user. */ -export type ContributionCalendar = { - __typename?: 'ContributionCalendar'; - /** A list of hex color codes used in this calendar. The darker the color, the more contributions it represents. */ - colors: Array; - /** Determine if the color set was chosen because it's currently Halloween. */ - isHalloween: Scalars['Boolean']['output']; - /** A list of the months of contributions in this calendar. */ - months: Array; - /** The count of total contributions in the calendar. */ - totalContributions: Scalars['Int']['output']; - /** A list of the weeks of contributions in this calendar. */ - weeks: Array; -}; - -/** Represents a single day of contributions on GitHub by a user. */ -export type ContributionCalendarDay = { - __typename?: 'ContributionCalendarDay'; - /** The hex color code that represents how many contributions were made on this day compared to others in the calendar. */ - color: Scalars['String']['output']; - /** How many contributions were made by the user on this day. */ - contributionCount: Scalars['Int']['output']; - /** - * Indication of contributions, relative to other days. Can be used to indicate - * which color to represent this day on a calendar. - */ - contributionLevel: ContributionLevel; - /** The day this square represents. */ - date: Scalars['Date']['output']; - /** A number representing which day of the week this square represents, e.g., 1 is Monday. */ - weekday: Scalars['Int']['output']; -}; - -/** A month of contributions in a user's contribution graph. */ -export type ContributionCalendarMonth = { - __typename?: 'ContributionCalendarMonth'; - /** The date of the first day of this month. */ - firstDay: Scalars['Date']['output']; - /** The name of the month. */ - name: Scalars['String']['output']; - /** How many weeks started in this month. */ - totalWeeks: Scalars['Int']['output']; - /** The year the month occurred in. */ - year: Scalars['Int']['output']; -}; - -/** A week of contributions in a user's contribution graph. */ -export type ContributionCalendarWeek = { - __typename?: 'ContributionCalendarWeek'; - /** The days of contributions in this week. */ - contributionDays: Array; - /** The date of the earliest square in this week. */ - firstDay: Scalars['Date']['output']; -}; - -/** Varying levels of contributions from none to many. */ -export enum ContributionLevel { - /** Lowest 25% of days of contributions. */ - FirstQuartile = 'FIRST_QUARTILE', - /** Highest 25% of days of contributions. More contributions than the third quartile. */ - FourthQuartile = 'FOURTH_QUARTILE', - /** No contributions occurred. */ - None = 'NONE', - /** Second lowest 25% of days of contributions. More contributions than the first quartile. */ - SecondQuartile = 'SECOND_QUARTILE', - /** Second highest 25% of days of contributions. More contributions than second quartile, less than the fourth quartile. */ - ThirdQuartile = 'THIRD_QUARTILE' -} - -/** Ordering options for contribution connections. */ -export type ContributionOrder = { - /** The ordering direction. */ - direction: OrderDirection; -}; - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollection = { - __typename?: 'ContributionsCollection'; - /** Commit contributions made by the user, grouped by repository. */ - commitContributionsByRepository: Array; - /** A calendar of this user's contributions on GitHub. */ - contributionCalendar: ContributionCalendar; - /** The years the user has been making contributions with the most recent year first. */ - contributionYears: Array; - /** Determine if this collection's time span ends in the current month. */ - doesEndInCurrentMonth: Scalars['Boolean']['output']; - /** - * The date of the first restricted contribution the user made in this time - * period. Can only be non-null when the user has enabled private contribution counts. - */ - earliestRestrictedContributionDate?: Maybe; - /** The ending date and time of this collection. */ - endedAt: Scalars['DateTime']['output']; - /** - * The first issue the user opened on GitHub. This will be null if that issue was - * opened outside the collection's time range and ignoreTimeRange is false. If - * the issue is not visible but the user has opted to show private contributions, - * a RestrictedContribution will be returned. - */ - firstIssueContribution?: Maybe; - /** - * The first pull request the user opened on GitHub. This will be null if that - * pull request was opened outside the collection's time range and - * ignoreTimeRange is not true. If the pull request is not visible but the user - * has opted to show private contributions, a RestrictedContribution will be returned. - */ - firstPullRequestContribution?: Maybe; - /** - * The first repository the user created on GitHub. This will be null if that - * first repository was created outside the collection's time range and - * ignoreTimeRange is false. If the repository is not visible, then a - * RestrictedContribution is returned. - */ - firstRepositoryContribution?: Maybe; - /** Does the user have any more activity in the timeline that occurred prior to the collection's time range? */ - hasActivityInThePast: Scalars['Boolean']['output']; - /** Determine if there are any contributions in this collection. */ - hasAnyContributions: Scalars['Boolean']['output']; - /** - * Determine if the user made any contributions in this time frame whose details - * are not visible because they were made in a private repository. Can only be - * true if the user enabled private contribution counts. - */ - hasAnyRestrictedContributions: Scalars['Boolean']['output']; - /** Whether or not the collector's time span is all within the same day. */ - isSingleDay: Scalars['Boolean']['output']; - /** A list of issues the user opened. */ - issueContributions: CreatedIssueContributionConnection; - /** Issue contributions made by the user, grouped by repository. */ - issueContributionsByRepository: Array; - /** - * When the user signed up for GitHub. This will be null if that sign up date - * falls outside the collection's time range and ignoreTimeRange is false. - */ - joinedGitHubContribution?: Maybe; - /** - * The date of the most recent restricted contribution the user made in this time - * period. Can only be non-null when the user has enabled private contribution counts. - */ - latestRestrictedContributionDate?: Maybe; - /** - * When this collection's time range does not include any activity from the user, use this - * to get a different collection from an earlier time range that does have activity. - */ - mostRecentCollectionWithActivity?: Maybe; - /** - * Returns a different contributions collection from an earlier time range than this one - * that does not have any contributions. - */ - mostRecentCollectionWithoutActivity?: Maybe; - /** - * The issue the user opened on GitHub that received the most comments in the specified - * time frame. - */ - popularIssueContribution?: Maybe; - /** - * The pull request the user opened on GitHub that received the most comments in the - * specified time frame. - */ - popularPullRequestContribution?: Maybe; - /** Pull request contributions made by the user. */ - pullRequestContributions: CreatedPullRequestContributionConnection; - /** Pull request contributions made by the user, grouped by repository. */ - pullRequestContributionsByRepository: Array; - /** - * Pull request review contributions made by the user. Returns the most recently - * submitted review for each PR reviewed by the user. - */ - pullRequestReviewContributions: CreatedPullRequestReviewContributionConnection; - /** Pull request review contributions made by the user, grouped by repository. */ - pullRequestReviewContributionsByRepository: Array; - /** A list of repositories owned by the user that the user created in this time range. */ - repositoryContributions: CreatedRepositoryContributionConnection; - /** - * A count of contributions made by the user that the viewer cannot access. Only - * non-zero when the user has chosen to share their private contribution counts. - */ - restrictedContributionsCount: Scalars['Int']['output']; - /** The beginning date and time of this collection. */ - startedAt: Scalars['DateTime']['output']; - /** How many commits were made by the user in this time span. */ - totalCommitContributions: Scalars['Int']['output']; - /** How many issues the user opened. */ - totalIssueContributions: Scalars['Int']['output']; - /** How many pull requests the user opened. */ - totalPullRequestContributions: Scalars['Int']['output']; - /** How many pull request reviews the user left. */ - totalPullRequestReviewContributions: Scalars['Int']['output']; - /** How many different repositories the user committed to. */ - totalRepositoriesWithContributedCommits: Scalars['Int']['output']; - /** How many different repositories the user opened issues in. */ - totalRepositoriesWithContributedIssues: Scalars['Int']['output']; - /** How many different repositories the user left pull request reviews in. */ - totalRepositoriesWithContributedPullRequestReviews: Scalars['Int']['output']; - /** How many different repositories the user opened pull requests in. */ - totalRepositoriesWithContributedPullRequests: Scalars['Int']['output']; - /** How many repositories the user created. */ - totalRepositoryContributions: Scalars['Int']['output']; - /** The user who made the contributions in this collection. */ - user: User; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionCommitContributionsByRepositoryArgs = { - maxRepositories?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionIssueContributionsArgs = { - after?: InputMaybe; - before?: InputMaybe; - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionIssueContributionsByRepositoryArgs = { - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; - maxRepositories?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionPullRequestContributionsArgs = { - after?: InputMaybe; - before?: InputMaybe; - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionPullRequestContributionsByRepositoryArgs = { - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; - maxRepositories?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionPullRequestReviewContributionsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionPullRequestReviewContributionsByRepositoryArgs = { - maxRepositories?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionRepositoryContributionsArgs = { - after?: InputMaybe; - before?: InputMaybe; - excludeFirst?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - orderBy?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionTotalIssueContributionsArgs = { - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionTotalPullRequestContributionsArgs = { - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionTotalRepositoriesWithContributedIssuesArgs = { - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionTotalRepositoriesWithContributedPullRequestsArgs = { - excludeFirst?: InputMaybe; - excludePopular?: InputMaybe; -}; - - -/** A contributions collection aggregates contributions such as opened issues and commits created by a user. */ -export type ContributionsCollectionTotalRepositoryContributionsArgs = { - excludeFirst?: InputMaybe; -}; - -/** Autogenerated input type of ConvertProjectCardNoteToIssue */ -export type ConvertProjectCardNoteToIssueInput = { - /** The body of the newly created issue. */ - body?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ProjectCard ID to convert. */ - projectCardId: Scalars['ID']['input']; - /** The ID of the repository to create the issue in. */ - repositoryId: Scalars['ID']['input']; - /** The title of the newly created issue. Defaults to the card's note text. */ - title?: InputMaybe; -}; - -/** Autogenerated return type of ConvertProjectCardNoteToIssue */ -export type ConvertProjectCardNoteToIssuePayload = { - __typename?: 'ConvertProjectCardNoteToIssuePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The updated ProjectCard. */ - projectCard?: Maybe; -}; - -/** Autogenerated input type of ConvertPullRequestToDraft */ -export type ConvertPullRequestToDraftInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** ID of the pull request to convert to draft */ - pullRequestId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of ConvertPullRequestToDraft */ -export type ConvertPullRequestToDraftPayload = { - __typename?: 'ConvertPullRequestToDraftPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The pull request that is now a draft. */ - pullRequest?: Maybe; -}; - -/** Represents a 'convert_to_draft' event on a given pull request. */ -export type ConvertToDraftEvent = Node & UniformResourceLocatable & { - __typename?: 'ConvertToDraftEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The Node ID of the ConvertToDraftEvent object */ - id: Scalars['ID']['output']; - /** PullRequest referenced by event. */ - pullRequest: PullRequest; - /** The HTTP path for this convert to draft event. */ - resourcePath: Scalars['URI']['output']; - /** The HTTP URL for this convert to draft event. */ - url: Scalars['URI']['output']; -}; - -/** Represents a 'converted_note_to_issue' event on a given issue or pull request. */ -export type ConvertedNoteToIssueEvent = Node & { - __typename?: 'ConvertedNoteToIssueEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** Identifies the primary key from the database. */ - databaseId?: Maybe; - /** The Node ID of the ConvertedNoteToIssueEvent object */ - id: Scalars['ID']['output']; - /** Project referenced by event. */ - project?: Maybe; - /** Project card referenced by this project event. */ - projectCard?: Maybe; - /** Column name referenced by this project event. */ - projectColumnName: Scalars['String']['output']; -}; - -/** Represents a 'converted_to_discussion' event on a given issue. */ -export type ConvertedToDiscussionEvent = Node & { - __typename?: 'ConvertedToDiscussionEvent'; - /** Identifies the actor who performed the event. */ - actor?: Maybe; - /** Identifies the date and time when the object was created. */ - createdAt: Scalars['DateTime']['output']; - /** The discussion that the issue was converted into. */ - discussion?: Maybe; - /** The Node ID of the ConvertedToDiscussionEvent object */ - id: Scalars['ID']['output']; -}; - -/** Autogenerated input type of CopyProjectV2 */ -export type CopyProjectV2Input = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** Include draft issues in the new project */ - includeDraftIssues?: InputMaybe; - /** The owner ID of the new project. */ - ownerId: Scalars['ID']['input']; - /** The ID of the source Project to copy. */ - projectId: Scalars['ID']['input']; - /** The title of the project. */ - title: Scalars['String']['input']; -}; - -/** Autogenerated return type of CopyProjectV2 */ -export type CopyProjectV2Payload = { - __typename?: 'CopyProjectV2Payload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The copied project. */ - projectV2?: Maybe; -}; - -/** Autogenerated input type of CreateAttributionInvitation */ -export type CreateAttributionInvitationInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The Node ID of the owner scoping the reattributable data. */ - ownerId: Scalars['ID']['input']; - /** The Node ID of the account owning the data to reattribute. */ - sourceId: Scalars['ID']['input']; - /** The Node ID of the account which may claim the data. */ - targetId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CreateAttributionInvitation */ -export type CreateAttributionInvitationPayload = { - __typename?: 'CreateAttributionInvitationPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The owner scoping the reattributable data. */ - owner?: Maybe; - /** The account owning the data to reattribute. */ - source?: Maybe; - /** The account which may claim the data. */ - target?: Maybe; -}; - -/** Autogenerated input type of CreateBranchProtectionRule */ -export type CreateBranchProtectionRuleInput = { - /** Can this branch be deleted. */ - allowsDeletions?: InputMaybe; - /** Are force pushes allowed on this branch. */ - allowsForcePushes?: InputMaybe; - /** Is branch creation a protected operation. */ - blocksCreations?: InputMaybe; - /** A list of User, Team, or App IDs allowed to bypass force push targeting matching branches. */ - bypassForcePushActorIds?: InputMaybe>; - /** A list of User, Team, or App IDs allowed to bypass pull requests targeting matching branches. */ - bypassPullRequestActorIds?: InputMaybe>; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** Will new commits pushed to matching branches dismiss pull request review approvals. */ - dismissesStaleReviews?: InputMaybe; - /** Can admins override branch protection. */ - isAdminEnforced?: InputMaybe; - /** - * Whether users can pull changes from upstream when the branch is locked. Set to - * `true` to allow fork syncing. Set to `false` to prevent fork syncing. - */ - lockAllowsFetchAndMerge?: InputMaybe; - /** Whether to set the branch as read-only. If this is true, users will not be able to push to the branch. */ - lockBranch?: InputMaybe; - /** The glob-like pattern used to determine matching branches. */ - pattern: Scalars['String']['input']; - /** A list of User, Team, or App IDs allowed to push to matching branches. */ - pushActorIds?: InputMaybe>; - /** The global relay id of the repository in which a new branch protection rule should be created in. */ - repositoryId: Scalars['ID']['input']; - /** Whether the most recent push must be approved by someone other than the person who pushed it */ - requireLastPushApproval?: InputMaybe; - /** Number of approving reviews required to update matching branches. */ - requiredApprovingReviewCount?: InputMaybe; - /** The list of required deployment environments */ - requiredDeploymentEnvironments?: InputMaybe>; - /** List of required status check contexts that must pass for commits to be accepted to matching branches. */ - requiredStatusCheckContexts?: InputMaybe>; - /** The list of required status checks */ - requiredStatusChecks?: InputMaybe>; - /** Are approving reviews required to update matching branches. */ - requiresApprovingReviews?: InputMaybe; - /** Are reviews from code owners required to update matching branches. */ - requiresCodeOwnerReviews?: InputMaybe; - /** Are commits required to be signed. */ - requiresCommitSignatures?: InputMaybe; - /** Are conversations required to be resolved before merging. */ - requiresConversationResolution?: InputMaybe; - /** Are successful deployments required before merging. */ - requiresDeployments?: InputMaybe; - /** Are merge commits prohibited from being pushed to this branch. */ - requiresLinearHistory?: InputMaybe; - /** Are status checks required to update matching branches. */ - requiresStatusChecks?: InputMaybe; - /** Are branches required to be up to date before merging. */ - requiresStrictStatusChecks?: InputMaybe; - /** Is pushing to matching branches restricted. */ - restrictsPushes?: InputMaybe; - /** Is dismissal of pull request reviews restricted. */ - restrictsReviewDismissals?: InputMaybe; - /** A list of User, Team, or App IDs allowed to dismiss reviews on pull requests targeting matching branches. */ - reviewDismissalActorIds?: InputMaybe>; -}; - -/** Autogenerated return type of CreateBranchProtectionRule */ -export type CreateBranchProtectionRulePayload = { - __typename?: 'CreateBranchProtectionRulePayload'; - /** The newly created BranchProtectionRule. */ - branchProtectionRule?: Maybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; -}; - -/** Autogenerated input type of CreateCheckRun */ -export type CreateCheckRunInput = { - /** Possible further actions the integrator can perform, which a user may trigger. */ - actions?: InputMaybe>; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The time that the check run finished. */ - completedAt?: InputMaybe; - /** The final conclusion of the check. */ - conclusion?: InputMaybe; - /** The URL of the integrator's site that has the full details of the check. */ - detailsUrl?: InputMaybe; - /** A reference for the run on the integrator's system. */ - externalId?: InputMaybe; - /** The SHA of the head commit. */ - headSha: Scalars['GitObjectID']['input']; - /** The name of the check. */ - name: Scalars['String']['input']; - /** Descriptive details about the run. */ - output?: InputMaybe; - /** The node ID of the repository. */ - repositoryId: Scalars['ID']['input']; - /** The time that the check run began. */ - startedAt?: InputMaybe; - /** The current status. */ - status?: InputMaybe; -}; - -/** Autogenerated return type of CreateCheckRun */ -export type CreateCheckRunPayload = { - __typename?: 'CreateCheckRunPayload'; - /** The newly created check run. */ - checkRun?: Maybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; -}; - -/** Autogenerated input type of CreateCheckSuite */ -export type CreateCheckSuiteInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The SHA of the head commit. */ - headSha: Scalars['GitObjectID']['input']; - /** The Node ID of the repository. */ - repositoryId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CreateCheckSuite */ -export type CreateCheckSuitePayload = { - __typename?: 'CreateCheckSuitePayload'; - /** The newly created check suite. */ - checkSuite?: Maybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; -}; - -/** Autogenerated input type of CreateCommitOnBranch */ -export type CreateCommitOnBranchInput = { - /** The Ref to be updated. Must be a branch. */ - branch: CommittableBranch; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The git commit oid expected at the head of the branch prior to the commit */ - expectedHeadOid: Scalars['GitObjectID']['input']; - /** A description of changes to files in this commit. */ - fileChanges?: InputMaybe; - /** The commit message the be included with the commit. */ - message: CommitMessage; -}; - -/** Autogenerated return type of CreateCommitOnBranch */ -export type CreateCommitOnBranchPayload = { - __typename?: 'CreateCommitOnBranchPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new commit. */ - commit?: Maybe; - /** The ref which has been updated to point to the new commit. */ - ref?: Maybe; -}; - -/** Autogenerated input type of CreateDeployment */ -export type CreateDeploymentInput = { - /** Attempt to automatically merge the default branch into the requested ref, defaults to true. */ - autoMerge?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** Short description of the deployment. */ - description?: InputMaybe; - /** Name for the target deployment environment. */ - environment?: InputMaybe; - /** JSON payload with extra information about the deployment. */ - payload?: InputMaybe; - /** The node ID of the ref to be deployed. */ - refId: Scalars['ID']['input']; - /** The node ID of the repository. */ - repositoryId: Scalars['ID']['input']; - /** - * The status contexts to verify against commit status checks. To bypass required - * contexts, pass an empty array. Defaults to all unique contexts. - */ - requiredContexts?: InputMaybe>; - /** Specifies a task to execute. */ - task?: InputMaybe; -}; - -/** Autogenerated return type of CreateDeployment */ -export type CreateDeploymentPayload = { - __typename?: 'CreateDeploymentPayload'; - /** True if the default branch has been auto-merged into the deployment ref. */ - autoMerged?: Maybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new deployment. */ - deployment?: Maybe; -}; - -/** Autogenerated input type of CreateDeploymentStatus */ -export type CreateDeploymentStatusInput = { - /** - * Adds a new inactive status to all non-transient, non-production environment - * deployments with the same repository and environment name as the created - * status's deployment. - */ - autoInactive?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The node ID of the deployment. */ - deploymentId: Scalars['ID']['input']; - /** A short description of the status. Maximum length of 140 characters. */ - description?: InputMaybe; - /** If provided, updates the environment of the deploy. Otherwise, does not modify the environment. */ - environment?: InputMaybe; - /** Sets the URL for accessing your environment. */ - environmentUrl?: InputMaybe; - /** - * The log URL to associate with this status. This URL should contain - * output to keep the user updated while the task is running or serve as - * historical information for what happened in the deployment. - */ - logUrl?: InputMaybe; - /** The state of the deployment. */ - state: DeploymentStatusState; -}; - -/** Autogenerated return type of CreateDeploymentStatus */ -export type CreateDeploymentStatusPayload = { - __typename?: 'CreateDeploymentStatusPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new deployment status. */ - deploymentStatus?: Maybe; -}; - -/** Autogenerated input type of CreateDiscussion */ -export type CreateDiscussionInput = { - /** The body of the discussion. */ - body: Scalars['String']['input']; - /** The id of the discussion category to associate with this discussion. */ - categoryId: Scalars['ID']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The id of the repository on which to create the discussion. */ - repositoryId: Scalars['ID']['input']; - /** The title of the discussion. */ - title: Scalars['String']['input']; -}; - -/** Autogenerated return type of CreateDiscussion */ -export type CreateDiscussionPayload = { - __typename?: 'CreateDiscussionPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The discussion that was just created. */ - discussion?: Maybe; -}; - -/** Autogenerated input type of CreateEnterpriseOrganization */ -export type CreateEnterpriseOrganizationInput = { - /** The logins for the administrators of the new organization. */ - adminLogins: Array; - /** The email used for sending billing receipts. */ - billingEmail: Scalars['String']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The ID of the enterprise owning the new organization. */ - enterpriseId: Scalars['ID']['input']; - /** The login of the new organization. */ - login: Scalars['String']['input']; - /** The profile name of the new organization. */ - profileName: Scalars['String']['input']; -}; - -/** Autogenerated return type of CreateEnterpriseOrganization */ -export type CreateEnterpriseOrganizationPayload = { - __typename?: 'CreateEnterpriseOrganizationPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The enterprise that owns the created organization. */ - enterprise?: Maybe; - /** The organization that was created. */ - organization?: Maybe; -}; - -/** Autogenerated input type of CreateEnvironment */ -export type CreateEnvironmentInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The name of the environment. */ - name: Scalars['String']['input']; - /** The node ID of the repository. */ - repositoryId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CreateEnvironment */ -export type CreateEnvironmentPayload = { - __typename?: 'CreateEnvironmentPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new or existing environment. */ - environment?: Maybe; -}; - -/** Autogenerated input type of CreateIpAllowListEntry */ -export type CreateIpAllowListEntryInput = { - /** An IP address or range of addresses in CIDR notation. */ - allowListValue: Scalars['String']['input']; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** Whether the IP allow list entry is active when an IP allow list is enabled. */ - isActive: Scalars['Boolean']['input']; - /** An optional name for the IP allow list entry. */ - name?: InputMaybe; - /** The ID of the owner for which to create the new IP allow list entry. */ - ownerId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CreateIpAllowListEntry */ -export type CreateIpAllowListEntryPayload = { - __typename?: 'CreateIpAllowListEntryPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The IP allow list entry that was created. */ - ipAllowListEntry?: Maybe; -}; - -/** Autogenerated input type of CreateIssue */ -export type CreateIssueInput = { - /** The Node ID for the user assignee for this issue. */ - assigneeIds?: InputMaybe>; - /** The body for the issue description. */ - body?: InputMaybe; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** The name of an issue template in the repository, assigns labels and assignees from the template to the issue */ - issueTemplate?: InputMaybe; - /** An array of Node IDs of labels for this issue. */ - labelIds?: InputMaybe>; - /** The Node ID of the milestone for this issue. */ - milestoneId?: InputMaybe; - /** An array of Node IDs for projects associated with this issue. */ - projectIds?: InputMaybe>; - /** The Node ID of the repository. */ - repositoryId: Scalars['ID']['input']; - /** The title for the issue. */ - title: Scalars['String']['input']; -}; - -/** Autogenerated return type of CreateIssue */ -export type CreateIssuePayload = { - __typename?: 'CreateIssuePayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new issue. */ - issue?: Maybe; -}; - -/** Autogenerated input type of CreateLabel */ -export type CreateLabelInput = { - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: InputMaybe; - /** A 6 character hex code, without the leading #, identifying the color of the label. */ - color: Scalars['String']['input']; - /** A brief description of the label, such as its purpose. */ - description?: InputMaybe; - /** The name of the label. */ - name: Scalars['String']['input']; - /** The Node ID of the repository. */ - repositoryId: Scalars['ID']['input']; -}; - -/** Autogenerated return type of CreateLabel */ -export type CreateLabelPayload = { - __typename?: 'CreateLabelPayload'; - /** A unique identifier for the client performing the mutation. */ - clientMutationId?: Maybe; - /** The new label. */ - label?: Maybe