Merge branch 'development' into releases/3.2.5

This commit is contained in:
tidy-dev 2023-06-22 11:21:51 -04:00
commit 6b5eeca5e0
64 changed files with 480 additions and 645 deletions

View file

@ -123,7 +123,10 @@ rules:
jsdoc/check-tag-names: error
jsdoc/check-types: error
jsdoc/implements-on-classes: error
jsdoc/newline-after-description: error
jsdoc/tag-lines:
- error
- any
- startLines: 1
jsdoc/no-undefined-types: error
jsdoc/valid-types: error

View file

@ -15,7 +15,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node: [16.17.1]
node: [18.14.0]
os: [macos-11, windows-2019]
arch: [x64, arm64]
include:

View file

@ -37,7 +37,7 @@ jobs:
private_key: ${{ secrets.DESKTOP_RELEASES_APP_PRIVATE_KEY }}
- name: Create Release Pull Request
uses: peter-evans/create-pull-request@v5.0.1
uses: peter-evans/create-pull-request@v5.0.2
if: |
startsWith(github.ref, 'refs/heads/releases/') && !contains(github.ref, 'test')
with:

View file

@ -1 +1 @@
16.17.1
18.14.0

2
.nvmrc
View file

@ -1 +1 @@
v16.17.1
v18.14.0

View file

@ -1,2 +1,2 @@
python 3.9.5
nodejs 16.17.1
nodejs 18.14.0

View file

@ -1,3 +1,3 @@
runtime = electron
disturl = https://electronjs.org/headers
target = 22.0.0
target = 24.4.0

View file

@ -15,7 +15,7 @@ export async function launchExternalEditor(
const editorPath = editor.path
const exists = await pathExists(editorPath)
if (!exists) {
const label = __DARWIN__ ? 'Preferences' : 'Options'
const label = __DARWIN__ ? 'Settings' : 'Options'
throw new ExternalEditorError(
`Could not find executable for '${editor.editor}' at path '${editor.path}'. Please open ${label} and select an available editor.`,
{ openPreferences: true }

View file

@ -57,7 +57,7 @@ export async function findEditorOrDefault(
if (name) {
const match = editors.find(p => p.editor === name) || null
if (!match) {
const menuItemName = __DARWIN__ ? 'Preferences' : 'Options'
const menuItemName = __DARWIN__ ? 'Settings' : 'Options'
const message = `The editor '${name}' could not be found. Please open ${menuItemName} and choose an available editor.`
throw new ExternalEditorError(message, { openPreferences: true })

View file

@ -14,7 +14,6 @@ export function fatalError(msg: string): never {
* in an exhaustive check.
*
* @param message The message to be used in the runtime exception.
*
*/
export function assertNever(x: never, message: string): never {
throw new Error(message)

View file

@ -88,37 +88,6 @@ export function enablePullRequestQuickView(): boolean {
return enableDevelopmentFeatures()
}
/** Should we enable displaying multi commit diffs. This also switches diff logic from one commit */
export function enableMultiCommitDiffs(): boolean {
return true
}
/** Should we enable the new interstitial for submodule diffs? */
export function enableSubmoduleDiff(): boolean {
return true
}
/** Should we enable starting pull requests? */
export function enableStartingPullRequests(): boolean {
return true
}
/** Should we enable starting pull requests? */
export function enableStackedPopups(): boolean {
return true
}
/** Should we enable mechanism to prevent closing while the app is updating? */
export function enablePreventClosingWhileUpdating(): boolean {
return true
}
/** Should we enable the new push-pull-fetch dropdown? */
export function enablePushPullFetchDropdown(): boolean {
return true
}
/** Should we enable the new PR comment notifications? */
export function enablePullRequestCommentNotifications(): boolean {
return true
export function enableMoveStash(): boolean {
return enableBetaFeatures()
}

View file

@ -23,7 +23,6 @@ import { envForRemoteOperation } from './environment'
* of the clone operation. When provided this enables
* the '--progress' command line flag for
* 'git clone'.
*
*/
export async function clone(
url: string,

View file

@ -309,7 +309,7 @@ export function parseConfigLockFilePathFromError(result: IGitResult) {
function getDescriptionForError(error: DugiteError): string | null {
if (isAuthFailureError(error)) {
const menuHint = __DARWIN__
? 'GitHub Desktop > Preferences.'
? 'GitHub Desktop > Settings.'
: 'File > Options.'
return `Authentication failed. Some common reasons include:

View file

@ -12,7 +12,6 @@
* Example:
*
* `const { args, parse } = createLogParser({ sha: '%H' })`
*
*/
export function createLogParser<T extends Record<string, string>>(fields: T) {
const keys: Array<keyof T> = Object.keys(fields)
@ -49,7 +48,6 @@ export function createLogParser<T extends Record<string, string>>(fields: T) {
* Example:
*
* `const { args, parse } = createForEachRefParser({ sha: '%(objectname)' })`
*
*/
export function createForEachRefParser<T extends Record<string, string>>(
fields: T

View file

@ -16,7 +16,6 @@ import { getCaptures } from '../helpers/regex'
import { createLogParser } from './git-delimiter-parser'
import { revRange } from '.'
import { forceUnwrap } from '../fatal-error'
import { enableSubmoduleDiff } from '../feature-flag'
// File mode 160000 is used by git specifically for submodules:
// https://github.com/git/git/blob/v2.37.3/cache.h#L62-L69
@ -27,10 +26,6 @@ function mapSubmoduleStatusFileModes(
srcMode: string,
dstMode: string
): SubmoduleStatus | undefined {
if (!enableSubmoduleDiff()) {
return undefined
}
return srcMode === SubmoduleFileMode &&
dstMode === SubmoduleFileMode &&
status === 'M'

View file

@ -18,7 +18,6 @@ import {
* @param repository - The repository to update
*
* @param commit - The SHA of the commit to be reverted
*
*/
export async function revertCommit(
repository: Repository,

View file

@ -1,11 +1,9 @@
import { ChildProcess } from 'child_process'
import { git } from './core'
import { spawnAndComplete } from './spawn'
import { Repository } from '../../models/repository'
import { GitError } from 'dugite'
import { enableMultiCommitDiffs } from '../feature-flag'
/**
* Retrieve the binary contents of a blob from the repository at a given
@ -76,28 +74,12 @@ export async function getPartialBlobContents(
path: string,
length: number
): Promise<Buffer | null> {
if (enableMultiCommitDiffs()) {
return getPartialBlobContentsCatchPathNotInRef(
repository,
commitish,
path,
length
)
}
const successExitCodes = new Set([0, 1])
const args = ['show', `${commitish}:${path}`]
const { output } = await spawnAndComplete(
args,
repository.path,
'getPartialBlobContents',
successExitCodes,
return getPartialBlobContentsCatchPathNotInRef(
repository,
commitish,
path,
length
)
return output
}
export async function getPartialBlobContentsCatchPathNotInRef(

View file

@ -46,6 +46,8 @@ export async function getStashes(repository: Repository): Promise<StashResult> {
name: '%gD',
stashSha: '%H',
message: '%gs',
tree: '%T',
parents: '%P',
})
const result = await git(
@ -66,17 +68,52 @@ export async function getStashes(repository: Repository): Promise<StashResult> {
const entries = parse(result.stdout)
for (const { name, message, stashSha } of entries) {
for (const { name, message, stashSha, tree, parents } of entries) {
const branchName = extractBranchFromMessage(message)
if (branchName !== null) {
desktopEntries.push({ name, stashSha, branchName, files })
desktopEntries.push({
name,
stashSha,
branchName,
tree,
parents: parents.length > 0 ? parents.split(' ') : [],
files,
})
}
}
return { desktopEntries, stashEntryCount: entries.length - 1 }
}
/**
* Moves a stash entry to a different branch by means of creating
* a new stash entry associated with the new branch and dropping the old
* stash entry.
*/
export async function moveStashEntry(
repository: Repository,
{ stashSha, parents, tree }: IStashEntry,
branchName: string
) {
const message = `On ${branchName}: ${createDesktopStashMessage(branchName)}`
const parentArgs = parents.flatMap(p => ['-p', p])
const { stdout: commitId } = await git(
['commit-tree', ...parentArgs, '-m', message, '--no-gpg-sign', tree],
repository.path,
'moveStashEntryToBranch'
)
await git(
['stash', 'store', '-m', message, commitId.trim()],
repository.path,
'moveStashEntryToBranch'
)
await dropDesktopStashEntry(repository, stashSha)
}
/**
* Returns the last Desktop created stash entry for the given branch
*/

View file

@ -11,7 +11,6 @@ import { updateMenuState as ipcUpdateMenuState } from '../ui/main-process-proxy'
import { AppMenu, MenuItem } from '../models/app-menu'
import { hasConflictedFiles } from './status'
import { findContributionTargetDefaultBranch } from './branch'
import { enableStartingPullRequests } from './feature-flag'
export interface IMenuItemState {
readonly enabled?: boolean
@ -136,7 +135,7 @@ const allMenuIds: ReadonlyArray<MenuIDs> = [
'clone-repository',
'about',
'create-pull-request',
...(enableStartingPullRequests() ? ['preview-pull-request' as MenuIDs] : []),
'preview-pull-request',
'squash-and-merge-branch',
]
@ -293,12 +292,10 @@ function getRepositoryMenuBuilder(state: IAppState): MenuStateBuilder {
'create-pull-request',
isHostedOnGitHub && !branchIsUnborn && !onDetachedHead
)
if (enableStartingPullRequests()) {
menuStateBuilder.setEnabled(
'preview-pull-request',
!branchIsUnborn && !onDetachedHead && isHostedOnGitHub
)
}
menuStateBuilder.setEnabled(
'preview-pull-request',
!branchIsUnborn && !onDetachedHead && isHostedOnGitHub
)
menuStateBuilder.setEnabled(
'push',
@ -339,9 +336,7 @@ function getRepositoryMenuBuilder(state: IAppState): MenuStateBuilder {
menuStateBuilder.disable('view-repository-on-github')
menuStateBuilder.disable('create-pull-request')
if (enableStartingPullRequests()) {
menuStateBuilder.disable('preview-pull-request')
}
menuStateBuilder.disable('preview-pull-request')
if (
selectedState &&
selectedState.type === SelectionType.MissingRepository

View file

@ -1,5 +1,4 @@
import { Popup, PopupType } from '../models/popup'
import { enableStackedPopups } from './feature-flag'
import { sendNonFatalException } from './helpers/non-fatal-exception'
import { uuid } from './uuid'
@ -97,10 +96,6 @@ export class PopupManager {
const existingPopup = this.getPopupsOfType(popupToAdd.type)
const popup = { id: uuid(), ...popupToAdd }
if (!enableStackedPopups()) {
this.popupStack = [popup, ...this.getPopupsOfType(PopupType.Error)]
return popup
}
if (existingPopup.length > 0) {
log.warn(

View file

@ -83,7 +83,7 @@ export async function launchShell(
// platform-specific build targets.
const exists = await pathExists(shell.path)
if (!exists) {
const label = __DARWIN__ ? 'Preferences' : 'Options'
const label = __DARWIN__ ? 'Settings' : 'Options'
throw new ShellError(
`Could not find executable for '${shell.shell}' at path '${shell.path}'. Please open ${label} and select an available shell.`
)

View file

@ -14,7 +14,6 @@ const squirrelTimeoutRegex =
* friendlier message to the user.
*
* @param error The underlying error from Squirrel.
*
*/
export function parseError(error: Error): Error | null {
if (squirrelMissingRegex.test(error.message)) {

View file

@ -4,7 +4,6 @@ import {
SubmoduleStatus,
UnmergedEntrySummary,
} from '../models/status'
import { enableSubmoduleDiff } from './feature-flag'
type StatusItem = IStatusHeader | IStatusEntry
@ -180,7 +179,7 @@ function parseUntrackedEntry(field: string): IStatusEntry {
function mapSubmoduleStatus(
submoduleStatusCode: string
): SubmoduleStatus | undefined {
if (!enableSubmoduleDiff() || !submoduleStatusCode.startsWith('S')) {
if (!submoduleStatusCode.startsWith('S')) {
return undefined
}

View file

@ -231,7 +231,7 @@ import {
} from './updates/changes-state'
import { ManualConflictResolution } from '../../models/manual-conflict-resolution'
import { BranchPruner } from './helpers/branch-pruner'
import { enableMultiCommitDiffs } from '../feature-flag'
import { enableMoveStash } from '../feature-flag'
import { Banner, BannerType } from '../../models/banner'
import { ComputedAction } from '../../models/computed-action'
import {
@ -239,6 +239,7 @@ import {
getLastDesktopStashEntryForBranch,
popStashEntry,
dropDesktopStashEntry,
moveStashEntry,
} from '../git/stash'
import {
UncommittedChangesStrategy,
@ -316,6 +317,7 @@ import { ValidNotificationPullRequestReview } from '../valid-notification-pull-r
import { determineMergeability } from '../git/merge-tree'
import { PopupManager } from '../popup-manager'
import { resizableComponentClass } from '../../ui/resizable'
import { compare } from '../compare'
const LastSelectedRepositoryIDKey = 'last-selected-repository-id'
@ -1252,32 +1254,28 @@ export class AppStore extends TypedBaseStore<IAppState> {
isContiguous: boolean,
commitLookup: Map<string, Commit>
) {
const shasInDiff = new Array<string>()
if (selectedShas.length <= 1 || !isContiguous) {
return selectedShas
}
const shasInDiff = new Set<string>()
const selected = new Set(selectedShas)
const shasToTraverse = [selectedShas.at(-1)]
do {
const currentSha = shasToTraverse.pop()
if (currentSha === undefined) {
continue
let sha
while ((sha = shasToTraverse.pop()) !== undefined) {
if (!shasInDiff.has(sha)) {
shasInDiff.add(sha)
commitLookup.get(sha)?.parentSHAs?.forEach(parentSha => {
if (selected.has(parentSha) && !shasInDiff.has(parentSha)) {
shasToTraverse.push(parentSha)
}
})
}
}
shasInDiff.push(currentSha)
// shas are selection of history -> should be in lookup -> `|| []` is for typing sake
const parentSHAs = commitLookup.get(currentSha)?.parentSHAs || []
const parentsInSelection = parentSHAs.filter(parentSha =>
selectedShas.includes(parentSha)
)
shasToTraverse.push(...parentsInSelection)
} while (shasToTraverse.length > 0)
return shasInDiff
return Array.from(shasInDiff)
}
private updateOrSelectFirstCommit(
@ -1561,10 +1559,7 @@ export class AppStore extends TypedBaseStore<IAppState> {
const state = this.repositoryStateCache.get(repository)
const { commitSelection } = state
const { shas: currentSHAs, isContiguous } = commitSelection
if (
currentSHAs.length === 0 ||
(currentSHAs.length > 1 && (!enableMultiCommitDiffs() || !isContiguous))
) {
if (currentSHAs.length === 0 || (currentSHAs.length > 1 && !isContiguous)) {
return
}
@ -1644,7 +1639,7 @@ export class AppStore extends TypedBaseStore<IAppState> {
}
}
if (shas.length > 1 && (!enableMultiCommitDiffs() || !isContiguous)) {
if (shas.length > 1 && !isContiguous) {
return
}
@ -4012,9 +4007,17 @@ export class AppStore extends TypedBaseStore<IAppState> {
newName: string
): Promise<void> {
const gitStore = this.gitStoreCache.get(repository)
await gitStore.performFailableOperation(() =>
renameBranch(repository, branch, newName)
)
await gitStore.performFailableOperation(async () => {
await renameBranch(repository, branch, newName)
if (enableMoveStash()) {
const stashEntry = gitStore.desktopStashEntries.get(branch.name)
if (stashEntry) {
await moveStashEntry(repository, stashEntry, newName)
}
}
})
return this._refreshRepository(repository)
}
@ -6652,9 +6655,10 @@ export class AppStore extends TypedBaseStore<IAppState> {
) {
const { compareState } = this.repositoryStateCache.get(repository)
const { commitSHAs } = compareState
const commitIndexBySha = new Map(commitSHAs.map((sha, i) => [sha, i]))
return [...commits].sort(
(a, b) => commitSHAs.indexOf(b.sha) - commitSHAs.indexOf(a.sha)
return [...commits].sort((a, b) =>
compare(commitIndexBySha.get(b.sha), commitIndexBySha.get(a.sha))
)
}
@ -6671,9 +6675,10 @@ export class AppStore extends TypedBaseStore<IAppState> {
) {
const { compareState } = this.repositoryStateCache.get(repository)
const { commitSHAs } = compareState
const commitIndexBySha = new Map(commitSHAs.map((sha, i) => [sha, i]))
return [...commits].sort(
(a, b) => commitSHAs.indexOf(b) - commitSHAs.indexOf(a)
return [...commits].sort((a, b) =>
compare(commitIndexBySha.get(b), commitIndexBySha.get(a))
)
}

View file

@ -1051,7 +1051,6 @@ export class GitStore extends BaseStore {
* @param refspec - The association between a remote and local ref to use as
* part of this action. Refer to git-scm for more
* information on refspecs: https://www.git-scm.com/book/tr/v2/Git-Internals-The-Refspec
*
*/
public async fetchRefspec(
account: IGitAccount | null,
@ -1171,6 +1170,10 @@ export class GitStore extends BaseStore {
: null
}
public get desktopStashEntries(): ReadonlyMap<string, IStashEntry> {
return this._desktopStashEntries
}
/** The total number of stash entries */
public get stashEntryCount(): number {
return this._stashEntryCount

View file

@ -37,7 +37,6 @@ import {
ValidNotificationPullRequestReview,
} from '../valid-notification-pull-request-review'
import { NotificationCallback } from 'desktop-notifications/dist/notification-callback'
import { enablePullRequestCommentNotifications } from '../feature-flag'
type OnChecksFailedCallback = (
repository: RepositoryWithGitHubRepository,
@ -138,10 +137,6 @@ export class NotificationsStore {
event: IDesktopPullRequestCommentAliveEvent,
skipNotification: boolean
) {
if (!enablePullRequestCommentNotifications()) {
return
}
const repository = this.repository
if (repository === null) {
return

View file

@ -80,7 +80,6 @@ export class PullRequestCoordinator {
* the `Repository`)
* * the parent GitHub repo, if the `Repository` has one (the
* `upstream` remote for the `Repository`)
*
*/
public onPullRequestsChanged(
fn: (
@ -119,7 +118,6 @@ export class PullRequestCoordinator {
* the `Repository`)
* * the parent GitHub repo, if the `Repository` has one (the
* `upstream` remote for the `Repository`)
*
*/
public onIsLoadingPullRequests(
fn: (

View file

@ -24,7 +24,6 @@ import { merge } from '../merge'
import { DefaultCommitMessage } from '../../models/commit-message'
import { sendNonFatalException } from '../helpers/non-fatal-exception'
import { StatsStore } from '../stats'
import { enableSubmoduleDiff } from '../feature-flag'
export class RepositoryStateCache {
private readonly repositoryState = new Map<string, IRepositoryState>()
@ -101,10 +100,6 @@ export class RepositoryStateCache {
oldState: IChangesState,
newState: IChangesState
) {
if (!enableSubmoduleDiff()) {
return
}
// Make sure only one file is selected from the current commit
if (
newState.selection.kind !== ChangesSelectionKind.WorkingDirectory ||
@ -153,10 +148,6 @@ export class RepositoryStateCache {
oldState: ICommitSelection,
newState: ICommitSelection
) {
if (!enableSubmoduleDiff()) {
return
}
// Just detect when the app is gonna show the diff of a different submodule
// and record that in the stats.
if (

View file

@ -26,7 +26,6 @@ import {
terminateDesktopNotifications,
} from './notifications'
import { addTrustedIPCSender } from './trusted-ipc-sender'
import { enablePreventClosingWhileUpdating } from '../lib/feature-flag'
export class AppWindow {
private window: Electron.BrowserWindow
@ -115,7 +114,6 @@ export class AppWindow {
// app is updating, we will prevent the window from closing only when the
// app is also quitting.
if (
enablePreventClosingWhileUpdating() &&
(!__DARWIN__ || quitting) &&
!quittingEvenIfUpdating &&
this.isDownloadingUpdate

View file

@ -7,7 +7,6 @@ import { UNSAFE_openDirectory } from '../shell'
import { MenuLabelsEvent } from '../../models/menu-labels'
import * as ipcWebContents from '../ipc-webcontents'
import { mkdir } from 'fs/promises'
import { enableStartingPullRequests } from '../../lib/feature-flag'
const platformDefaultShell = __WIN32__ ? 'Command Prompt' : 'Terminal'
const createPullRequestLabel = __DARWIN__
@ -70,7 +69,7 @@ export function buildDefaultMenu({
},
separator,
{
label: 'Preferences…',
label: 'Settings…',
id: 'preferences',
accelerator: 'CmdOrCtrl+,',
click: emit('show-preferences'),
@ -450,14 +449,12 @@ export function buildDefaultMenu({
},
]
if (enableStartingPullRequests()) {
branchSubmenu.push({
label: __DARWIN__ ? 'Preview Pull Request' : 'Preview pull request',
id: 'preview-pull-request',
accelerator: 'CmdOrCtrl+Alt+P',
click: emit('preview-pull-request'),
})
}
branchSubmenu.push({
label: __DARWIN__ ? 'Preview Pull Request' : 'Preview pull request',
id: 'preview-pull-request',
accelerator: 'CmdOrCtrl+Alt+P',
click: emit('preview-pull-request'),
})
branchSubmenu.push({
label: pullRequestLabel,

View file

@ -12,6 +12,9 @@ export interface IStashEntry {
/** The list of files this stash touches */
readonly files: StashedFileChanges
readonly tree: string
readonly parents: ReadonlyArray<string>
}
/** Whether file changes for a stash entry are loaded or not */

View file

@ -1,4 +1,6 @@
import * as React from 'react'
import * as Path from 'path'
import { TransitionGroup, CSSTransition } from 'react-transition-group'
import {
IAppState,
@ -161,7 +163,6 @@ import { sendNonFatalException } from '../lib/helpers/non-fatal-exception'
import { createCommitURL } from '../lib/commit-url'
import { uuid } from '../lib/uuid'
import { InstallingUpdate } from './installing-update/installing-update'
import { enableStackedPopups } from '../lib/feature-flag'
import { DialogStackContext } from './dialog'
import { TestNotifications } from './test-notifications/test-notifications'
import { NotificationsDebugStore } from '../lib/stores/notifications-debug-store'
@ -1471,11 +1472,7 @@ export class App extends React.Component<IAppProps, IAppState> {
this.props.dispatcher.setUpdateBannerVisibility(false)
private allPopupContent(): JSX.Element | null {
let { allPopups } = this.state
if (!enableStackedPopups() && this.state.currentPopup !== null) {
allPopups = [this.state.currentPopup]
}
const { allPopups } = this.state
if (allPopups.length === 0) {
return null
@ -2424,6 +2421,7 @@ export class App extends React.Component<IAppProps, IAppState> {
showSideBySideDiff={showSideBySideDiff}
currentBranchHasPullRequest={currentBranchHasPullRequest}
onDismissed={onPopupDismissedFn}
onOpenInExternalEditor={this.onOpenInExternalEditor}
/>
)
}
@ -2761,6 +2759,16 @@ export class App extends React.Component<IAppProps, IAppState> {
this.props.dispatcher.openInExternalEditor(repository.path)
}
private onOpenInExternalEditor = (path: string) => {
const repository = this.state.selectedState?.repository
if (repository === undefined) {
return
}
const fullPath = Path.join(repository.path, path)
this.props.dispatcher.openInExternalEditor(fullPath)
}
private showRepository = (repository: Repository | CloningRepository) => {
if (!(repository instanceof Repository)) {
return
@ -3192,7 +3200,7 @@ export class App extends React.Component<IAppProps, IAppState> {
accounts={state.accounts}
externalEditorLabel={externalEditorLabel}
resolvedExternalEditor={state.resolvedExternalEditor}
onOpenInExternalEditor={this.openFileInExternalEditor}
onOpenInExternalEditor={this.onOpenInExternalEditor}
appMenu={state.appMenuState[0]}
currentTutorialStep={state.currentOnboardingTutorialStep}
onExitTutorial={this.onExitTutorial}

View file

@ -672,6 +672,8 @@ export abstract class AutocompletingTextInput<
str: string,
caretPosition: number
): Promise<IAutocompletionState<AutocompleteItemType> | null> {
const lowercaseStr = str.toLowerCase()
for (const provider of this.props.autocompletionProviders) {
// NB: RegExps are stateful (AAAAAAAAAAAAAAAAAA) so defensively copy the
// regex we're given.
@ -683,7 +685,7 @@ export abstract class AutocompletingTextInput<
}
let result: RegExpExecArray | null = null
while ((result = regex.exec(str))) {
while ((result = regex.exec(lowercaseStr))) {
const index = regex.lastIndex
const text = result[1] || ''
if (index === caretPosition || this.props.alwaysAutocomplete) {

View file

@ -103,13 +103,15 @@ export class EmojiAutocompletionProvider
return <div className="title">{emoji}</div>
}
// Offset the match start by one to account for the leading ':' that was
// removed from the emoji string
const matchStart = hit.matchStart - 1
return (
<div className="title">
{emoji.substring(0, hit.matchStart)}
<mark>
{emoji.substring(hit.matchStart, hit.matchStart + hit.matchLength)}
</mark>
{emoji.substring(hit.matchStart + hit.matchLength)}
{emoji.substring(0, matchStart)}
<mark>{emoji.substring(matchStart, matchStart + hit.matchLength)}</mark>
{emoji.substring(matchStart + hit.matchLength)}
</div>
)
}

View file

@ -146,11 +146,19 @@ interface IChangesListProps {
readonly changesListScrollTop?: number
/**
* Called to open a file it its default application
* Called to open a file in its default application
*
* @param path The path of the file relative to the root of the repository
*/
readonly onOpenItem: (path: string) => void
/**
* Called to open a file in the default external editor
*
* @param path The path of the file relative to the root of the repository
*/
readonly onOpenItemInExternalEditor: (path: string) => void
/**
* The currently checked out branch (null if no branch is checked out).
*/
@ -196,13 +204,6 @@ interface IChangesListProps {
/** The name of the currently selected external editor */
readonly externalEditorLabel?: string
/**
* Callback to open a selected file using the configured external editor
*
* @param fullPath The full path to the file on disk
*/
readonly onOpenInExternalEditor: (fullPath: string) => void
readonly stashEntry: IStashEntry | null
readonly isShowingStashEntry: boolean
@ -493,7 +494,7 @@ export class ChangesList extends React.Component<
file: WorkingDirectoryFileChange,
enabled: boolean
): IMenuItem => {
const { externalEditorLabel, repository } = this.props
const { externalEditorLabel } = this.props
const openInExternalEditor = externalEditorLabel
? `Open in ${externalEditorLabel}`
@ -502,8 +503,7 @@ export class ChangesList extends React.Component<
return {
label: openInExternalEditor,
action: () => {
const fullPath = Path.join(repository.path, file.path)
this.props.onOpenInExternalEditor(fullPath)
this.props.onOpenItemInExternalEditor(file.path)
},
enabled,
}
@ -901,6 +901,12 @@ export class ChangesList extends React.Component<
)
}
private onRowDoubleClick = (row: number) => {
const file = this.props.workingDirectory.files[row]
this.props.onOpenItemInExternalEditor(file.path)
}
private onRowKeyDown = (
_row: number,
event: React.KeyboardEvent<HTMLDivElement>
@ -981,6 +987,7 @@ export class ChangesList extends React.Component<
isCommitting: isCommitting,
}}
onRowClick={this.props.onRowClick}
onRowDoubleClick={this.onRowDoubleClick}
onScroll={this.onScroll}
setScrollTop={this.props.changesListScrollTop}
onRowKeyDown={this.onRowKeyDown}

View file

@ -23,6 +23,13 @@ interface IChangesProps {
readonly isCommitting: boolean
readonly hideWhitespaceInDiff: boolean
/**
* Callback to open a selected file using the configured external editor
*
* @param fullPath The full path to the file on disk
*/
readonly onOpenInExternalEditor: (fullPath: string) => void
/**
* Called when the user requests to open a binary file in an the
* system-assigned application for said file type.

View file

@ -181,7 +181,7 @@ export class CommitMessageAvatar extends React.Component<
const location = isGitConfigLocal ? 'local' : 'global'
const locationDesc = isGitConfigLocal ? 'for your repository' : ''
const settingsName = __DARWIN__ ? 'preferences' : 'options'
const settingsName = __DARWIN__ ? 'settings' : 'options'
const settings = isGitConfigLocal
? 'repository settings'
: `git ${settingsName}`

View file

@ -27,7 +27,6 @@ import {
IDropdownSuggestedActionOption,
} from '../suggested-actions/dropdown-suggested-action'
import { PullRequestSuggestedNextAction } from '../../models/pull-request'
import { enableStartingPullRequests } from '../../lib/feature-flag'
import { KeyboardShortcut } from '../keyboard-shortcut/keyboard-shortcut'
function formatMenuItemLabel(text: string) {
@ -676,24 +675,6 @@ export class NoChanges extends React.Component<
const title = `Create a Pull Request from your current branch`
const buttonText = `Create Pull Request`
if (!enableStartingPullRequests()) {
return (
<MenuBackedSuggestedAction
key="create-pr-action"
title={title}
menuItemId={'create-pull-request'}
description={description}
buttonText={buttonText}
discoverabilityContent={this.renderDiscoverabilityElements(
createMenuItem
)}
type="primary"
disabled={!createMenuItem.enabled}
onClick={this.onCreatePullRequestClicked}
/>
)
}
const previewPullMenuItem = this.getMenuItemInfo('preview-pull-request')
if (previewPullMenuItem === undefined) {

View file

@ -249,6 +249,14 @@ export class ChangesSidebar extends React.Component<IChangesSidebarProps, {}> {
const fullPath = Path.join(this.props.repository.path, path)
openFile(fullPath, this.props.dispatcher)
}
/**
* Called to open a file in the default external editor
*
* @param path The path of the file relative to the root of the repository
*/
private onOpenItemInExternalEditor = (path: string) => {
this.props.onOpenInExternalEditor(path)
}
/**
* Toggles the selection of a given working directory file.
@ -413,7 +421,7 @@ export class ChangesSidebar extends React.Component<IChangesSidebarProps, {}> {
showCoAuthoredBy={showCoAuthoredBy}
coAuthors={coAuthors}
externalEditorLabel={this.props.externalEditorLabel}
onOpenInExternalEditor={this.props.onOpenInExternalEditor}
onOpenItemInExternalEditor={this.onOpenItemInExternalEditor}
onChangesListScrolled={this.props.onChangesListScrolled}
changesListScrollTop={this.props.changesListScrollTop}
stashEntry={this.props.changes.stashEntry}

View file

@ -16,7 +16,7 @@ import * as OcticonSymbol from '../octicons/octicons.generated'
export class DialogError extends React.Component {
public render() {
return (
<div className="dialog-error">
<div className="dialog-error" role="alert">
<Octicon symbol={OcticonSymbol.stop} />
<div>{this.props.children}</div>
</div>

View file

@ -102,7 +102,7 @@ export class DiffOptions extends React.Component<
onClickOutside={this.closePopover}
>
<h3 id="diff-options-popover-header">
Diff {__DARWIN__ ? 'Preferences' : 'Options'}
Diff {__DARWIN__ ? 'Settings' : 'Options'}
</h3>
{this.renderHideWhitespaceChanges()}
{this.renderShowSideBySide()}

View file

@ -82,6 +82,13 @@ interface IDiffProps {
*/
readonly onOpenBinaryFile: (fullPath: string) => void
/**
* Callback to open a selected file using the configured external editor
*
* @param fullPath The full path to the file on disk
*/
readonly onOpenInExternalEditor?: (fullPath: string) => void
/** Called when the user requests to open a submodule. */
readonly onOpenSubmodule?: (fullPath: string) => void

View file

@ -1,4 +1,5 @@
import * as React from 'react'
import { Repository } from '../../models/repository'
import {
ITextDiff,

View file

@ -7,6 +7,7 @@ import { List } from '../lib/list'
import { arrayEquals } from '../../lib/equality'
import { DragData, DragType } from '../../models/drag-drop'
import classNames from 'classnames'
import memoizeOne from 'memoize-one'
const RowHeight = 50
@ -142,6 +143,11 @@ interface ICommitListProps {
/** A component which displays the list of commits. */
export class CommitList extends React.Component<ICommitListProps, {}> {
private commitsHash = memoize(makeCommitsHash, arrayEquals)
private commitIndexBySha = memoizeOne(
(commitSHAs: ReadonlyArray<string>) =>
new Map(commitSHAs.map((sha, index) => [sha, index]))
)
private listRef = React.createRef<List>()
private getVisibleCommits(): ReadonlyArray<Commit> {
@ -345,13 +351,8 @@ export class CommitList extends React.Component<ICommitListProps, {}> {
this.props.onCompareListScrolled?.(scrollTop)
}
private rowForSHA(sha_: string | null): number {
const sha = sha_
if (!sha) {
return -1
}
return this.props.commitSHAs.findIndex(s => s === sha)
private rowForSHA(sha: string) {
return this.commitIndexBySha(this.props.commitSHAs).get(sha) ?? -1
}
private getRowCustomClassMap = () => {

View file

@ -19,6 +19,7 @@ import _ from 'lodash'
import { LinkButton } from '../lib/link-button'
import { UnreachableCommitsTab } from './unreachable-commits-dialog'
import { TooltippedCommitSHA } from '../lib/tooltipped-commit-sha'
import memoizeOne from 'memoize-one'
interface ICommitSummaryProps {
readonly repository: Repository
@ -141,21 +142,6 @@ function getCommitSummary(selectedCommits: ReadonlyArray<Commit>) {
: selectedCommits[0].summary
}
function getCountCommitsNotInDiff(
selectedCommits: ReadonlyArray<Commit>,
shasInDiff: ReadonlyArray<string>
) {
if (selectedCommits.length === 1) {
return 0
}
const excludedCommits = selectedCommits.filter(
({ sha }) => !shasInDiff.includes(sha)
)
return excludedCommits.length
}
/**
* Helper function which determines if two commit objects
* have the same commit summary and body.
@ -173,6 +159,23 @@ export class CommitSummary extends React.Component<
private updateOverflowTimeoutId: NodeJS.Immediate | null = null
private descriptionRef: HTMLDivElement | null = null
private getCountCommitsNotInDiff = memoizeOne(
(
selectedCommits: ReadonlyArray<Commit>,
shasInDiff: ReadonlyArray<string>
) => {
if (selectedCommits.length === 1) {
return 0
} else {
const shas = new Set(shasInDiff)
return selectedCommits.reduce(
(acc, c) => acc + (shas.has(c.sha) ? 0 : 1),
0
)
}
}
)
public constructor(props: ICommitSummaryProps) {
super(props)
@ -369,7 +372,7 @@ export class CommitSummary extends React.Component<
return
}
const excludedCommitsCount = getCountCommitsNotInDiff(
const excludedCommitsCount = this.getCountCommitsNotInDiff(
selectedCommits,
shasInDiff
)
@ -455,7 +458,7 @@ export class CommitSummary extends React.Component<
)
}
const commitsNotInDiff = getCountCommitsNotInDiff(
const commitsNotInDiff = this.getCountCommitsNotInDiff(
selectedCommits,
shasInDiff
)

View file

@ -1,13 +1,14 @@
import * as React from 'react'
import { CommittedFileChange } from '../../models/status'
import { List } from '../lib/list'
import { ClickSource, List } from '../lib/list'
import { CommittedFileItem } from './committed-file-item'
interface IFileListProps {
readonly files: ReadonlyArray<CommittedFileChange>
readonly selectedFile: CommittedFileChange | null
readonly onSelectedFileChanged: (file: CommittedFileChange) => void
readonly onRowDoubleClick: (row: number, source: ClickSource) => void
readonly availableWidth: number
readonly onContextMenu?: (
file: CommittedFileChange,
@ -47,6 +48,7 @@ export class FileList extends React.Component<IFileListProps> {
rowHeight={29}
selectedRows={[this.rowForFile(this.props.selectedFile)]}
onSelectedRowChanged={this.onSelectedRowChanged}
onRowDoubleClick={this.props.onRowDoubleClick}
/>
</div>
)

View file

@ -34,7 +34,6 @@ import { IChangesetData } from '../../lib/git'
import { IConstrainedValue } from '../../lib/app-state'
import { clamp } from '../../lib/clamp'
import { pathExists } from '../lib/path-exists'
import { enableMultiCommitDiffs } from '../../lib/feature-flag'
import { UnreachableCommitsTab } from './unreachable-commits-dialog'
interface ISelectedCommitsProps {
@ -116,6 +115,13 @@ export class SelectedCommits extends React.Component<
this.props.dispatcher.changeFileSelection(this.props.repository, file)
}
private onRowDoubleClick = (row: number) => {
const files = this.props.changesetData.files
const file = files[row]
this.props.onOpenInExternalEditor(file.path)
}
private onHistoryRef = (ref: HTMLDivElement | null) => {
this.historyRef = ref
}
@ -252,6 +258,7 @@ export class SelectedCommits extends React.Component<
selectedFile={this.props.selectedFile}
availableWidth={availableWidth}
onContextMenu={this.onContextMenu}
onRowDoubleClick={this.onRowDoubleClick}
/>
)
}
@ -269,10 +276,7 @@ export class SelectedCommits extends React.Component<
public render() {
const { selectedCommits, isContiguous } = this.props
if (
selectedCommits.length > 1 &&
(!isContiguous || !enableMultiCommitDiffs())
) {
if (selectedCommits.length > 1 && !isContiguous) {
return this.renderMultipleCommitsBlankSlate()
}
@ -323,18 +327,13 @@ export class SelectedCommits extends React.Component<
<img src={BlankSlateImage} className="blankslate-image" alt="" />
<div>
<p>
Unable to display diff when multiple{' '}
{enableMultiCommitDiffs() ? 'non-consecutive ' : ' '}commits are
selected.
Unable to display diff when multiple non-consecutive selected.
</p>
<div>You can:</div>
<ul>
<li>
Select a single commit{' '}
{enableMultiCommitDiffs()
? 'or a range of consecutive commits '
: ' '}
to view a diff.
Select a single commit or a range of consecutive commits to view
a diff.
</li>
<li>Drag the commits to the branch menu to cherry-pick them.</li>
<li>Drag the commits to squash or reorder them.</li>
@ -389,7 +388,7 @@ export class SelectedCommits extends React.Component<
},
{
label: openInExternalEditor,
action: () => this.props.onOpenInExternalEditor(fullPath),
action: () => this.props.onOpenInExternalEditor(file.path),
enabled: fileExistsOnDisk,
},
{

View file

@ -6,6 +6,7 @@ import { Octicon } from '../octicons'
import * as OcticonSymbol from '../octicons/octicons.generated'
import { Ref } from './ref'
import { IStashEntry } from '../../models/stash-entry'
import { enableMoveStash } from '../../lib/feature-flag'
export function renderBranchHasRemoteWarning(branch: Branch) {
if (branch.upstream != null) {
@ -47,7 +48,7 @@ export function renderBranchNameExistsOnRemoteWarning(
}
export function renderStashWillBeLostWarning(stash: IStashEntry | null) {
if (stash === null) {
if (stash === null || enableMoveStash()) {
return null
}
return (

View file

@ -32,6 +32,9 @@ interface IListRowProps {
/** callback to fire when the row is clicked */
readonly onRowClick: (index: number, e: React.MouseEvent<any>) => void
/** callback to fire when the row is double clicked */
readonly onRowDoubleClick: (index: number, e: React.MouseEvent<any>) => void
/** callback to fire when the row receives a keyboard event */
readonly onRowKeyDown: (index: number, e: React.KeyboardEvent<any>) => void
@ -82,6 +85,10 @@ export class ListRow extends React.Component<IListRowProps, {}> {
this.props.onRowClick(this.props.rowIndex, e)
}
private onRowDoubleClick = (e: React.MouseEvent<HTMLDivElement>) => {
this.props.onRowDoubleClick(this.props.rowIndex, e)
}
private onRowKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
this.props.onRowKeyDown(this.props.rowIndex, e)
}
@ -128,6 +135,7 @@ export class ListRow extends React.Component<IListRowProps, {}> {
onMouseDown={this.onRowMouseDown}
onMouseUp={this.onRowMouseUp}
onClick={this.onRowClick}
onDoubleClick={this.onRowDoubleClick}
onKeyDown={this.onRowKeyDown}
style={style}
onFocus={this.onFocus}

View file

@ -113,6 +113,8 @@ interface IListProps {
*/
readonly onRowClick?: (row: number, source: ClickSource) => void
readonly onRowDoubleClick?: (row: number, source: IMouseClickSource) => void
/**
* This prop defines the behaviour of the selection of items within this list.
* - 'single' : (default) single list-item selection. [shift] and [ctrl] have
@ -943,6 +945,7 @@ export class List extends React.Component<IListProps, IListState> {
rowIndex={rowIndex}
selected={selected}
onRowClick={this.onRowClick}
onRowDoubleClick={this.onRowDoubleClick}
onRowKeyDown={this.onRowKeyDown}
onRowMouseDown={this.onRowMouseDown}
onRowMouseUp={this.onRowMouseUp}
@ -995,7 +998,6 @@ export class List extends React.Component<IListProps, IListState> {
*
* @param width - The width of the Grid as given by AutoSizer
* @param height - The height of the Grid as given by AutoSizer
*
*/
private renderContents(width: number, height: number) {
if (__WIN32__) {
@ -1082,7 +1084,6 @@ export class List extends React.Component<IListProps, IListState> {
* and accurately positions the fake scroll bar.
*
* @param height The height of the Grid as given by AutoSizer
*
*/
private renderFakeScroll(height: number) {
let totalHeight: number = 0
@ -1300,6 +1301,14 @@ export class List extends React.Component<IListProps, IListState> {
}
}
private onRowDoubleClick = (row: number, event: React.MouseEvent<any>) => {
if (!this.props.onRowDoubleClick) {
return
}
this.props.onRowDoubleClick(row, { kind: 'mouseclick', event })
}
private onScroll = ({
scrollTop,
clientHeight,

View file

@ -61,6 +61,13 @@ interface IOpenPullRequestDialogProps {
/** Label for selected external editor */
readonly externalEditorLabel?: string
/**
* Callback to open a selected file using the configured external editor
*
* @param fullPath The full path to the file on disk
*/
readonly onOpenInExternalEditor: (fullPath: string) => void
/** Width to use for the files list pane in the files changed view */
readonly fileListWidth: IConstrainedValue
@ -168,6 +175,7 @@ export class OpenPullRequestDialog extends React.Component<IOpenPullRequestDialo
selectedFile={file}
showSideBySideDiff={this.props.showSideBySideDiff}
repository={repository}
onOpenInExternalEditor={this.props.onOpenInExternalEditor}
/>
)
}

View file

@ -57,6 +57,13 @@ interface IPullRequestFilesChangedProps {
/** If the latest commit of the pull request is not local, this will contain
* it's SHA */
readonly nonLocalCommitSHA: string | null
/**
* Callback to open a selected file using the configured external editor
*
* @param fullPath The full path to the file on disk
*/
readonly onOpenInExternalEditor: (fullPath: string) => void
}
interface IPullRequestFilesChangedState {
@ -224,6 +231,13 @@ export class PullRequestFilesChanged extends React.Component<
)
}
private onRowDoubleClick = (row: number) => {
const files = this.props.files
const file = files[row]
this.props.onOpenInExternalEditor(file.path)
}
private renderHeader() {
const { hideWhitespaceInDiff } = this.props
const { showSideBySideDiff } = this.state
@ -261,6 +275,7 @@ export class PullRequestFilesChanged extends React.Component<
selectedFile={selectedFile}
availableWidth={clamp(fileListWidth)}
onContextMenu={this.onFileContextMenu}
onRowDoubleClick={this.onRowDoubleClick}
/>
</Resizable>
)

View file

@ -380,6 +380,7 @@ export class RepositoryView extends React.Component<
onOpenSubmodule={this.onOpenSubmodule}
onChangeImageDiffType={this.onChangeImageDiffType}
onHideWhitespaceInDiffChanged={this.onHideWhitespaceInDiffChanged}
onOpenInExternalEditor={this.props.onOpenInExternalEditor}
/>
)
}
@ -519,6 +520,7 @@ export class RepositoryView extends React.Component<
this.props.askForConfirmationOnDiscardChanges
}
onDiffOptionsOpened={this.onDiffOptionsOpened}
onOpenInExternalEditor={this.props.onOpenInExternalEditor}
/>
)
}

View file

@ -53,6 +53,13 @@ interface IStashDiffViewerProps {
/** Called when the user requests to open a submodule. */
readonly onOpenSubmodule: (fullPath: string) => void
/**
* Called to open a file using the user's configured applications
*
* @param path The path of the file relative to the root of the repository
*/
readonly onOpenInExternalEditor: (path: string) => void
}
/**
@ -64,11 +71,23 @@ export class StashDiffViewer extends React.PureComponent<IStashDiffViewerProps>
private onSelectedFileChanged = (file: CommittedFileChange) =>
this.props.dispatcher.selectStashedFile(this.props.repository, file)
private onRowDoubleClick = (row: number) => {
const files = this.getFiles()
const file = files[row]
this.props.onOpenInExternalEditor(file.path)
}
private onResize = (width: number) =>
this.props.dispatcher.setStashedFilesWidth(width)
private onReset = () => this.props.dispatcher.resetStashedFilesWidth()
private getFiles = () =>
this.props.stashEntry.files.kind === StashedChangesLoadStates.Loaded
? this.props.stashEntry.files.files
: new Array<CommittedFileChange>()
public render() {
const {
stashEntry,
@ -83,10 +102,7 @@ export class StashDiffViewer extends React.PureComponent<IStashDiffViewerProps>
onChangeImageDiffType,
onOpenSubmodule,
} = this.props
const files =
stashEntry.files.kind === StashedChangesLoadStates.Loaded
? stashEntry.files.files
: new Array<CommittedFileChange>()
const files = this.getFiles()
const diffComponent =
selectedStashedFile !== null ? (
@ -133,6 +149,7 @@ export class StashDiffViewer extends React.PureComponent<IStashDiffViewerProps>
onSelectedFileChanged={this.onSelectedFileChanged}
selectedFile={selectedStashedFile}
availableWidth={availableWidth}
onRowDoubleClick={this.onRowDoubleClick}
/>
</Resizable>
{diffComponent}

View file

@ -111,6 +111,13 @@ export interface IToolbarButtonProps {
readonly ariaExpanded?: boolean
readonly ariaHaspopup?: AriaHasPopupType
/**
* Typically the contents of a button serve the purpose of describing the
* buttons use. However, ariaLabel can be used if the contents do not suffice.
* Such as when a button wraps an image and there is no text.
*/
readonly ariaLabel?: string
/**
* Whether to only show the tooltip when the tooltip target overflows its
* bounds. Typically this is used in conjunction with an ellipsis CSS ruleset.
@ -224,6 +231,7 @@ export class ToolbarButton extends React.Component<IToolbarButtonProps, {}> {
role={this.props.role}
ariaExpanded={this.props.ariaExpanded}
ariaHaspopup={this.props.ariaHaspopup}
ariaLabel={this.props.ariaLabel}
>
{progress}
{icon}

View file

@ -195,6 +195,13 @@ export interface IToolbarDropdownProps {
* the tooltip.
*/
readonly isOverflowed?: ((target: TooltipTarget) => boolean) | boolean
/**
* Typically the contents of a button serve the purpose of describing the
* buttons use. However, ariaLabel can be used if the contents do not suffice.
* Such as when a button wraps an image and there is no text.
*/
readonly ariaLabel?: string
}
interface IToolbarDropdownState {
@ -258,6 +265,7 @@ export class ToolbarDropdown extends React.Component<
onClick={this.onToggleDropdownClick}
ariaExpanded={this.isOpen}
ariaHaspopup={true}
ariaLabel={this.props.ariaLabel}
>
{dropdownIcon}
</ToolbarButton>

View file

@ -22,7 +22,6 @@ import {
import { FoldoutType } from '../../lib/app-state'
import { ForcePushBranchState } from '../../lib/rebase'
import { PushPullButtonDropDown } from './push-pull-button-dropdown'
import { enablePushPullFetchDropdown } from '../../lib/feature-flag'
export const DropdownItemClassName = 'push-pull-dropdown-item'
@ -179,6 +178,7 @@ export class PushPullButton extends React.Component<IPushPullButtonProps> {
buttonClassName: 'push-pull-button',
style: ToolbarButtonStyle.Subtitle,
dropdownStyle: ToolbarDropdownStyle.MultiOption,
ariaLabel: 'Push, pull, fetch options',
dropdownState: this.props.isDropdownOpen ? 'open' : 'closed',
onDropdownStateChanged: this.props.onDropdownStateChanged,
}
@ -376,27 +376,6 @@ export class PushPullButton extends React.Component<IPushPullButtonProps> {
? 'Publish this branch to GitHub'
: 'Publish this branch to the remote'
if (!enablePushPullFetchDropdown()) {
const className = classNames(
this.defaultButtonProps().className,
'nudge-arrow',
{
'nudge-arrow-up': shouldNudge,
}
)
return (
<ToolbarButton
{...this.defaultButtonProps()}
title="Publish branch"
description={description}
icon={OcticonSymbol.upload}
onClick={onClick}
className={className}
/>
)
}
const className = classNames(
this.defaultDropdownProps().className,
'nudge-arrow',
@ -456,20 +435,6 @@ export class PushPullButton extends React.Component<IPushPullButtonProps> {
dropdownItemTypes.push(DropdownItemType.ForcePush)
}
if (!enablePushPullFetchDropdown()) {
return (
<ToolbarButton
{...this.defaultButtonProps()}
title={title}
description={renderLastFetched(lastFetched)}
icon={OcticonSymbol.arrowDown}
onClick={onClick}
>
{renderAheadBehind(aheadBehind, numTagsToPush)}
</ToolbarButton>
)
}
return (
<ToolbarDropdown
{...this.defaultDropdownProps()}
@ -493,20 +458,6 @@ export class PushPullButton extends React.Component<IPushPullButtonProps> {
lastFetched: Date | null,
onClick: () => void
) {
if (!enablePushPullFetchDropdown()) {
return (
<ToolbarButton
{...this.defaultButtonProps()}
title={`Push ${remoteName}`}
description={renderLastFetched(lastFetched)}
icon={OcticonSymbol.arrowUp}
onClick={onClick}
>
{renderAheadBehind(aheadBehind, numTagsToPush)}
</ToolbarButton>
)
}
return (
<ToolbarDropdown
{...this.defaultDropdownProps()}
@ -530,20 +481,6 @@ export class PushPullButton extends React.Component<IPushPullButtonProps> {
lastFetched: Date | null,
onClick: () => void
) {
if (!enablePushPullFetchDropdown()) {
return (
<ToolbarButton
{...this.defaultButtonProps()}
title={`Force push ${remoteName}`}
description={renderLastFetched(lastFetched)}
icon={forcePushIcon}
onClick={onClick}
>
{renderAheadBehind(aheadBehind, numTagsToPush)}
</ToolbarButton>
)
}
return (
<ToolbarDropdown
{...this.defaultDropdownProps()}

View file

@ -145,7 +145,7 @@ export class TutorialPanel extends React.Component<
<strong>{this.props.resolvedExternalEditor}</strong>. You can
change your preferred editor in{' '}
<LinkButton onClick={this.onPreferencesClick}>
{__DARWIN__ ? 'Preferences' : 'options'}
{__DARWIN__ ? 'Settings' : 'options'}
</LinkButton>
</p>
)}

View file

@ -195,6 +195,8 @@ describe('git/stash', () => {
name: 'refs/stash@{0}',
branchName: 'master',
stashSha: 'xyz',
tree: 'xyz',
parents: ['abc'],
files: { kind: StashedChangesLoadStates.NotLoaded },
}
@ -213,6 +215,8 @@ describe('git/stash', () => {
name: 'refs/stash@{4}',
branchName: 'master',
stashSha: 'xyz',
tree: 'xyz',
parents: ['abc'],
files: { kind: StashedChangesLoadStates.NotLoaded },
}
await generateTestStashEntry(repository, 'master', true)

View file

@ -81,7 +81,7 @@ export const renderer = merge({}, commonConfig, {
},
{
test: /\.cmd$/,
loader: 'file-loader',
type: 'asset/resource',
},
],
},

View file

@ -18,6 +18,13 @@
"[Improved] Show the remote branch name if it does not match the local branch name - #13591. Thanks @samuelko123!",
"[Improved] Reduce retries of avatars that fail to load - #16592"
],
"3.2.4": [
"[Fixed] The misattributed commit avatar popover no longer causes the changes list to have scrollbars - #16684",
"[Fixed] Autocompletion list is always visible regardless of its position on the screen - #16609, #16650",
"[Fixed] Close Squash Commit Message dialog on squash start - #16605",
"[Fixed] Multi-commit diffing produces the same results whether you select up to down or down to up - #15883",
"[Removed] Remove support for Windows 7, 8, and 8.1 - #16566"
],
"3.2.4-beta1": [
"[Fixed] Entering in double forward slash does not target directory in cloning dialog - #15842. Thanks @IgnazioGul!",
"[Fixed] In the \"No Repositories\" screen, controls at the bottom stay inside window when it is resized - #16502. Thanks @samuelko123!",

View file

@ -70,13 +70,12 @@
"css-loader": "^6.7.1",
"eslint": "^7.3.1",
"eslint-config-prettier": "^6.11.0",
"eslint-plugin-jsdoc": "^37.7.0",
"eslint-plugin-jsdoc": "^43.0.1",
"eslint-plugin-json": "^2.1.1",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "7.26.1",
"express": "^4.17.3",
"fake-indexeddb": "^2.0.4",
"file-loader": "^6.2.0",
"front-matter": "^2.3.0",
"fs-extra": "^9.0.1",
"glob": "^7.1.2",
@ -156,9 +155,9 @@
"@types/webpack-hot-middleware": "^2.25.6",
"@types/webpack-merge": "^5.0.0",
"@types/xml2js": "^0.4.11",
"electron": "22.0.3",
"electron": "24.4.0",
"electron-builder": "^23.6.0",
"electron-packager": "^15.1.0",
"electron-packager": "^17.1.1",
"electron-winstaller": "^5.0.0",
"eslint-plugin-github": "^4.3.7",
"jest-esm-transformer": "^1.0.0",

View file

@ -4,12 +4,7 @@
import * as path from 'path'
import * as cp from 'child_process'
import * as os from 'os'
import packager, {
OfficialArch,
OsxNotarizeOptions,
OsxSignOptions,
Options,
} from 'electron-packager'
import packager, { OfficialArch, OsxNotarizeOptions } from 'electron-packager'
import frontMatter from 'front-matter'
import { externals } from '../app/webpack.common'
@ -124,21 +119,6 @@ verifyInjectedSassVariables(outRoot)
console.log(`Built to ${appPaths}`)
})
/**
* The additional packager options not included in the existing typing.
*
* See https://github.com/desktop/desktop/issues/2429 for some history on this.
*/
interface IPackageAdditionalOptions {
readonly protocols: ReadonlyArray<{
readonly name: string
readonly schemes: ReadonlyArray<string>
}>
readonly osxSign: OsxSignOptions & {
readonly hardenedRuntime?: boolean
}
}
function packageApp() {
// not sure if this is needed anywhere, so I'm just going to inline it here
// for now and see what the future brings...
@ -181,7 +161,7 @@ function packageApp() {
)
}
const options: Options & IPackageAdditionalOptions = {
return packager({
name: getExecutableName(),
platform: toPackagePlatform(process.platform),
arch: toPackageArch(process.env.TARGET_ARCH),
@ -206,17 +186,17 @@ function packageApp() {
appCategoryType: 'public.app-category.developer-tools',
darwinDarkModeSupport: true,
osxSign: {
hardenedRuntime: true,
entitlements: entitlementsPath,
'entitlements-inherit': entitlementsPath,
optionsForFile: (path: string) => ({
hardenedRuntime: true,
entitlements: entitlementsPath,
}),
type: isPublishableBuild ? 'distribution' : 'development',
// For development, we will use '-' as the identifier so that codesign
// will sign the app to run locally. We need to disable 'identity-validation'
// or otherwise it will replace '-' with one of the regular codesigning
// identities in our system.
identity: isDevelopmentBuild ? '-' : undefined,
'identity-validation': !isDevelopmentBuild,
'gatekeeper-assess': !isDevelopmentBuild,
identityValidation: !isDevelopmentBuild,
},
osxNotarize: notarizationCredentials,
protocols: [
@ -241,9 +221,7 @@ function packageApp() {
ProductName: getProductName(),
InternalName: getProductName(),
},
}
return packager(options)
})
}
function removeAndCopy(source: string, destination: string) {

435
yarn.lock
View file

@ -610,20 +610,15 @@
ajv "^6.12.0"
ajv-keywords "^3.4.1"
"@electron/get@^1.6.0":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.7.1.tgz#41aa60871b9d7e225bbe68135012f88a9ef87012"
integrity sha512-+BOIzkmYbe+oOBGqSByq8zXYXCFztccoymR3uNkvX5ckJ/5xU+4peVyEvFyH6+zfv58hCo99RxgIpwuaMfRtRg==
"@electron/asar@^3.2.1":
version "3.2.4"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.4.tgz#7e8635a3c4f6d8b3f8ae6efaf5ecb9fbf3bd9864"
integrity sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==
dependencies:
debug "^4.1.1"
env-paths "^2.2.0"
fs-extra "^8.1.0"
got "^9.6.0"
sanitize-filename "^1.6.2"
sumchecker "^3.0.0"
optionalDependencies:
global-agent "^2.0.2"
global-tunnel-ng "^2.7.1"
chromium-pickle-js "^0.2.0"
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
"@electron/get@^2.0.0":
version "2.0.2"
@ -640,6 +635,26 @@
optionalDependencies:
global-agent "^3.0.0"
"@electron/notarize@^1.2.3":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.3.tgz#38056a629e5a0b5fd56c975c4828c0f74285b644"
integrity sha512-9oRzT56rKh5bspk3KpAVF8lPKHYQrBnRwcgiOeR0hdilVEQmszDaAu0IPCPrwwzJN0ugNs0rRboTreHMt/6mBQ==
dependencies:
debug "^4.1.1"
fs-extra "^9.0.1"
"@electron/osx-sign@^1.0.1":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.4.tgz#8e91442846471636ca0469426a82b253b9170151"
integrity sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g==
dependencies:
compare-version "^0.1.2"
debug "^4.3.4"
fs-extra "^10.0.0"
isbinaryfile "^4.0.8"
minimist "^1.2.6"
plist "^3.0.5"
"@electron/universal@1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339"
@ -653,14 +668,27 @@
minimatch "^3.0.4"
plist "^3.0.4"
"@es-joy/jsdoccomment@~0.18.0":
version "0.18.0"
resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.18.0.tgz#2532b2ecb8576d694011b157c447ed6b12534c70"
integrity sha512-TjT8KJULV4I6ZiwIoKr6eMs+XpRejqwJ/VA+QPDeFGe9j6bZFKmMJ81EeFsGm6JNZhnzm37aoxVROmTh2PZoyA==
"@electron/universal@^1.3.2":
version "1.3.4"
resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777"
integrity sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==
dependencies:
comment-parser "1.3.0"
esquery "^1.4.0"
jsdoc-type-pratt-parser "~2.2.2"
"@electron/asar" "^3.2.1"
"@malept/cross-spawn-promise" "^1.1.0"
debug "^4.3.1"
dir-compare "^3.0.0"
fs-extra "^9.0.1"
minimatch "^3.0.4"
plist "^3.0.4"
"@es-joy/jsdoccomment@~0.37.1":
version "0.37.1"
resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz#fa32a41ba12097452693343e09ad4d26d157aedd"
integrity sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==
dependencies:
comment-parser "1.3.1"
esquery "^1.5.0"
jsdoc-type-pratt-parser "~4.0.0"
"@github/markdownlint-github@^0.1.0":
version "0.1.0"
@ -997,11 +1025,6 @@
dependencies:
object-assign "^4.1.1"
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
"@sindresorhus/is@^4.0.0":
version "4.6.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
@ -1021,13 +1044,6 @@
dependencies:
"@sinonjs/commons" "^1.7.0"
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
dependencies:
defer-to-connect "^1.0.1"
"@szmarczak/http-timer@^4.0.5":
version "4.0.6"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
@ -1397,10 +1413,10 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234"
integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==
"@types/node@^16.11.26":
version "16.11.40"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.40.tgz#bcf85f3febe74436107aeb2d3fb5fd0d30818600"
integrity sha512-7bOWglXUO6f21NG3YDI7hIpeMX3M59GG+DzZuzX2EkFKYUnRoxq3EOg4R0KNv2hxryY9M3UUqG5akwwsifrukw==
"@types/node@^18.11.18":
version "18.16.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01"
integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==
"@types/normalize-package-data@^2.4.0":
version "2.4.0"
@ -2277,6 +2293,11 @@ app-builder-lib@23.6.0:
tar "^6.1.11"
temp-file "^3.4.0"
are-docs-informative@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963"
integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -2417,18 +2438,6 @@ asar@^2.0.1:
mkdirp "^0.5.1"
tmp-promise "^1.0.5"
asar@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b"
integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==
dependencies:
chromium-pickle-js "^0.2.0"
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
optionalDependencies:
"@types/glob" "^7.1.1"
asar@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221"
@ -2739,6 +2748,11 @@ buffer-equal@1.0.0:
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==
buffer-equal@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90"
integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==
buffer-from@1.x, buffer-from@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@ -2818,19 +2832,6 @@ cacheable-lookup@^5.0.3:
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
cacheable-request@^6.0.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
dependencies:
clone-response "^1.0.2"
get-stream "^5.1.0"
http-cache-semantics "^4.0.0"
keyv "^3.0.0"
lowercase-keys "^2.0.0"
normalize-url "^4.1.0"
responselike "^1.0.2"
cacheable-request@^7.0.2:
version "7.0.2"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
@ -3144,10 +3145,10 @@ commander@~9.4.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c"
integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==
comment-parser@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.0.tgz#68beb7dbe0849295309b376406730cd16c719c44"
integrity sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==
comment-parser@1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b"
integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==
compare-version@^0.1.2:
version "0.1.2"
@ -3164,14 +3165,6 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
config-chain@^1.1.11:
version "1.1.12"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
dependencies:
ini "^1.3.4"
proto-list "~1.2.1"
console-polyfill@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861"
@ -3226,11 +3219,6 @@ core-js@^2.4.1, core-js@^2.5.3:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==
core-js@^3.6.5:
version "3.8.2"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044"
integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@ -3251,6 +3239,15 @@ cross-env@^5.0.5:
cross-spawn "^5.1.0"
is-windows "^1.0.0"
cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec"
integrity sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==
dependencies:
"@malept/cross-spawn-promise" "^1.1.0"
is-wsl "^2.2.0"
which "^2.0.2"
cross-spawn@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@ -3363,7 +3360,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
dependencies:
ms "2.0.0"
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@ -3397,13 +3394,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
dependencies:
mimic-response "^1.0.0"
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@ -3431,11 +3421,6 @@ deepmerge@^4.2.2:
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
defer-to-connect@^1.0.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
defer-to-connect@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
@ -3541,6 +3526,14 @@ dir-compare@^2.4.0:
commander "2.9.0"
minimatch "3.0.4"
dir-compare@^3.0.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416"
integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==
dependencies:
buffer-equal "^1.0.0"
minimatch "^3.0.4"
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@ -3659,11 +3652,6 @@ dotenv@^9.0.2:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05"
integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
@ -3704,26 +3692,6 @@ electron-builder@^23.6.0:
simple-update-notifier "^1.0.7"
yargs "^17.5.1"
electron-notarize@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f"
integrity sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og==
dependencies:
debug "^4.1.1"
fs-extra "^9.0.1"
electron-osx-sign@^0.4.11:
version "0.4.17"
resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz#2727ca0c79e1e4e5ccd3861fb3da9c3c913b006c"
integrity sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==
dependencies:
bluebird "^3.5.0"
compare-version "^0.1.2"
debug "^2.6.8"
isbinaryfile "^3.0.2"
minimist "^1.2.0"
plist "^3.0.1"
electron-osx-sign@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8"
@ -3736,28 +3704,30 @@ electron-osx-sign@^0.6.0:
minimist "^1.2.0"
plist "^3.0.1"
electron-packager@^15.1.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.1.0.tgz#16a3733e4cad26112a2ac36f0b0f35c3b0170eff"
integrity sha512-THNm4bz1DfvR9f0g51+NjuAYELflM8+1vhQ/iv/G8vyZNKzSMuFd5doobngQKq3rRsLdPNZVnGqDdgS884d7Og==
electron-packager@^17.1.1:
version "17.1.1"
resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.1.tgz#f156fc63d3a66f4e902e4b42992550a172982d59"
integrity sha512-r1NDtlajsq7gf2EXgjRfblCVPquvD2yeg+6XGErOKblvxOpDi0iulZLVhgYDP4AEF1P5/HgbX/vwjlkEv7PEIQ==
dependencies:
"@electron/get" "^1.6.0"
asar "^3.0.0"
"@electron/asar" "^3.2.1"
"@electron/get" "^2.0.0"
"@electron/notarize" "^1.2.3"
"@electron/osx-sign" "^1.0.1"
"@electron/universal" "^1.3.2"
cross-spawn-windows-exe "^1.2.0"
debug "^4.0.1"
electron-notarize "^1.0.0"
electron-osx-sign "^0.4.11"
extract-zip "^2.0.0"
filenamify "^4.1.0"
fs-extra "^9.0.0"
fs-extra "^10.1.0"
galactus "^0.2.1"
get-package-info "^1.0.0"
junk "^3.1.0"
parse-author "^2.0.0"
plist "^3.0.0"
rcedit "^2.0.0"
rcedit "^3.0.1"
resolve "^1.1.6"
semver "^7.1.3"
yargs-parser "^19.0.1"
yargs-parser "^21.1.1"
electron-publish@23.6.0:
version "23.6.0"
@ -3788,13 +3758,13 @@ electron-winstaller@*, electron-winstaller@^5.0.0:
lodash.template "^4.2.2"
temp "^0.9.0"
electron@22.0.3:
version "22.0.3"
resolved "https://registry.yarnpkg.com/electron/-/electron-22.0.3.tgz#44806cd053ea2ed35bffefd92143d3fc69d7337d"
integrity sha512-eETrJTINTzlXgQrnJSrKiF2Xdt5EHpxZ6Kk+WUjFCE0zUztdVm+hrngUecqhj8TPFlYScTANzPwRwUIjOChl+g==
electron@24.4.0:
version "24.4.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-24.4.0.tgz#48d05561dab6a5835ec1a3a96852797f69824eea"
integrity sha512-A9YzLHRUA+HfYVf2daNv0jPXNCWShgcgcTaGntrZRGynQLEhDTbti9Lfmq2tjRKoEgXZ7qj+aJFw+tJZsT/Cfw==
dependencies:
"@electron/get" "^2.0.0"
"@types/node" "^16.11.26"
"@types/node" "^18.11.18"
extract-zip "^2.0.1"
element-closest@^2.0.2:
@ -3827,7 +3797,7 @@ emojis-list@^3.0.0:
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
encodeurl@^1.0.2, encodeurl@~1.0.2:
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
@ -4146,18 +4116,18 @@ eslint-plugin-import@^2.25.2:
resolve "^1.22.0"
tsconfig-paths "^3.14.1"
eslint-plugin-jsdoc@^37.7.0:
version "37.7.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.7.0.tgz#975d9f18cb0520dde7a2b0db5f4421dfee3fdd17"
integrity sha512-vzy3/ltXoGtabRnjLogaEmhGxxIv5B8HK5MJLIrdxFJUvhBppZjuVuLr71DjIBi0jg6bFomwkYKjojt29cN8PA==
eslint-plugin-jsdoc@^43.0.1:
version "43.1.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-43.1.1.tgz#fc72ba21597cc99b1a0dc988aebb9bb57d0ec492"
integrity sha512-J2kjjsJ5vBXSyNzqJhceeSGTAgVgZHcPSJKo3vD4tNjUdfky98rR2VfZUDsS1GKL6isyVa8GWvr+Az7Vyg2HXA==
dependencies:
"@es-joy/jsdoccomment" "~0.18.0"
comment-parser "1.3.0"
debug "^4.3.3"
"@es-joy/jsdoccomment" "~0.37.1"
are-docs-informative "^0.0.2"
comment-parser "1.3.1"
debug "^4.3.4"
escape-string-regexp "^4.0.0"
esquery "^1.4.0"
regextras "^0.8.0"
semver "^7.3.5"
esquery "^1.5.0"
semver "^7.5.0"
spdx-expression-parse "^3.0.1"
eslint-plugin-json@^2.1.1:
@ -4341,10 +4311,10 @@ esquery@^1.2.0:
dependencies:
estraverse "^5.1.0"
esquery@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
esquery@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
dependencies:
estraverse "^5.1.0"
@ -4614,14 +4584,6 @@ file-entry-cache@^5.0.1:
dependencies:
flat-cache "^2.0.1"
file-loader@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
dependencies:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
filelist@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.3.tgz#448607750376484932f67ef1b9ff07386b036c83"
@ -4917,7 +4879,7 @@ get-stdin@~9.0.0:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
get-stream@^4.0.0, get-stream@^4.1.0:
get-stream@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
@ -5003,19 +4965,6 @@ glob@~8.0.3:
minimatch "^5.0.1"
once "^1.3.0"
global-agent@^2.0.2:
version "2.1.12"
resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195"
integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==
dependencies:
boolean "^3.0.1"
core-js "^3.6.5"
es6-error "^4.1.1"
matcher "^3.0.0"
roarr "^2.15.3"
semver "^7.3.2"
serialize-error "^7.0.1"
global-agent@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
@ -5028,16 +4977,6 @@ global-agent@^3.0.0:
semver "^7.3.2"
serialize-error "^7.0.1"
global-tunnel-ng@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
dependencies:
encodeurl "^1.0.2"
lodash "^4.17.10"
npm-conf "^1.1.3"
tunnel "^0.0.6"
globals@^11.1.0:
version "11.7.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673"
@ -5086,23 +5025,6 @@ got@^11.8.5:
p-cancelable "^2.0.0"
responselike "^2.0.0"
got@^9.6.0:
version "9.6.0"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
dependencies:
"@sindresorhus/is" "^0.14.0"
"@szmarczak/http-timer" "^1.1.2"
cacheable-request "^6.0.0"
decompress-response "^3.3.0"
duplexer3 "^0.1.4"
get-stream "^4.1.0"
lowercase-keys "^1.0.1"
mimic-response "^1.0.1"
p-cancelable "^1.0.0"
to-readable-stream "^1.0.0"
url-parse-lax "^3.0.0"
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
@ -5445,11 +5367,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@^1.3.4:
version "1.3.8"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
ini@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d"
@ -5822,7 +5739,7 @@ isbinaryfile@^3.0.2:
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=
isbinaryfile@^4.0.10:
isbinaryfile@^4.0.10, isbinaryfile@^4.0.8:
version "4.0.10"
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3"
integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==
@ -6404,10 +6321,10 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
jsdoc-type-pratt-parser@~2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.2.tgz#a85e407ac502b444dc23333aa4d6d0dc83f76187"
integrity sha512-zRokSWcPLSWkoNzsWn9pq7YYSwDhKyEe+cJYT2qaPqLOOJb5sFSi46BPj81vP+e8chvCNdQL9RG86Bi9EI6MDw==
jsdoc-type-pratt-parser@~4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114"
integrity sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==
jsdom@^16.4.0:
version "16.7.0"
@ -6447,11 +6364,6 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=
json-buffer@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
json-buffer@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
@ -6575,13 +6487,6 @@ junk@^3.1.0:
resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
keyv@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
dependencies:
json-buffer "3.0.0"
keyv@^4.0.0:
version "4.5.2"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56"
@ -6825,7 +6730,7 @@ lodash.upperfirst@4.3.1:
resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==
lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0:
lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@ -6844,11 +6749,6 @@ lower-case@^2.0.2:
dependencies:
tslib "^2.0.3"
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
lowercase-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
@ -7055,7 +6955,7 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-response@^1.0.0, mimic-response@^1.0.1:
mimic-response@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
@ -7301,24 +7201,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
normalize-url@^4.1.0:
version "4.5.1"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
normalize-url@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
npm-conf@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
dependencies:
config-chain "^1.1.11"
pify "^3.0.0"
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@ -7546,11 +7433,6 @@ os-tmpdir@~1.0.2:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
p-cancelable@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
@ -7759,11 +7641,6 @@ pify@^2.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pirates@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
@ -7778,7 +7655,7 @@ pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
plist@^3.0.0, plist@^3.0.1, plist@^3.0.4:
plist@^3.0.0, plist@^3.0.1, plist@^3.0.4, plist@^3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3"
integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==
@ -7856,11 +7733,6 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
prettier-linter-helpers@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
@ -7970,11 +7842,6 @@ prop-types@^15.7.2:
object-assign "^4.1.1"
react-is "^16.8.1"
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
proxy-addr@~2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
@ -8065,10 +7932,12 @@ raw-body@2.4.3:
iconv-lite "0.4.24"
unpipe "1.0.0"
rcedit@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.1.0.tgz#37ae6ad1fc8d7734b2e445ec3d378ace89d4076d"
integrity sha512-Nrd/65LzMjFmKpS9d2fqIxVYdW0M8ovsN0PgZhCrPMQss2yznkp6/zjEQ1a9DzzoGv2uuN3yDJAeHybOD5ZNKA==
rcedit@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-3.0.1.tgz#ae21b43e49c075f4d84df1929832a12c302f3c90"
integrity sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==
dependencies:
cross-spawn-windows-exe "^1.1.0"
react-is@^16.12.0:
version "16.13.1"
@ -8261,11 +8130,6 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
regextras@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.8.0.tgz#ec0f99853d4912839321172f608b544814b02217"
integrity sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==
relateurl@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
@ -8383,13 +8247,6 @@ resolve@^2.0.0-next.3:
is-core-module "^2.2.0"
path-parse "^1.0.6"
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
dependencies:
lowercase-keys "^1.0.0"
responselike@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
@ -8504,7 +8361,7 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
sanitize-filename@^1.6.2, sanitize-filename@^1.6.3:
sanitize-filename@^1.6.3:
version "1.6.3"
resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
@ -8596,6 +8453,13 @@ semver@^7.3.7:
dependencies:
lru-cache "^6.0.0"
semver@^7.5.0:
version "7.5.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0"
integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==
dependencies:
lru-cache "^6.0.0"
semver@~7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
@ -9164,7 +9028,7 @@ style-loader@^3.3.1:
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575"
integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==
sumchecker@^3.0.0, sumchecker@^3.0.1:
sumchecker@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
@ -9382,11 +9246,6 @@ to-object-path@^0.3.0:
dependencies:
kind-of "^3.0.2"
to-readable-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
to-regex-range@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
@ -9735,13 +9594,6 @@ urix@^0.1.0:
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
dependencies:
prepend-http "^2.0.0"
use@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"
@ -10188,11 +10040,6 @@ yargs-parser@^18.1.2:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^19.0.1:
version "19.0.4"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-19.0.4.tgz#99183a3a59268b205c6b04177f2a5bfb46e79ba7"
integrity sha512-eXeQm7yXRjPFFyf1voPkZgXQZJjYfjgQUmGPbD2TLtZeIYzvacgWX7sQ5a1HsRgVP+pfKAkRZDNtTGev4h9vhw==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"