mirror of
https://github.com/desktop/desktop
synced 2024-10-05 23:59:33 +00:00
Merge branch 'development' into releases/3.2.5
This commit is contained in:
commit
6b5eeca5e0
|
@ -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
|
||||
|
||||
|
|
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -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:
|
||||
|
|
2
.github/workflows/release-pr.yml
vendored
2
.github/workflows/release-pr.yml
vendored
|
@ -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:
|
||||
|
|
|
@ -1 +1 @@
|
|||
16.17.1
|
||||
18.14.0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
python 3.9.5
|
||||
nodejs 16.17.1
|
||||
nodejs 18.14.0
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
runtime = electron
|
||||
disturl = https://electronjs.org/headers
|
||||
target = 22.0.0
|
||||
target = 24.4.0
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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 })
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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.`
|
||||
)
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: (
|
||||
|
|
|
@ -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 (
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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}`
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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()}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import * as React from 'react'
|
||||
|
||||
import { Repository } from '../../models/repository'
|
||||
import {
|
||||
ITextDiff,
|
||||
|
|
|
@ -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 = () => {
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -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 (
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
|
|
|
@ -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}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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()}
|
||||
|
|
|
@ -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>
|
||||
)}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -81,7 +81,7 @@ export const renderer = merge({}, commonConfig, {
|
|||
},
|
||||
{
|
||||
test: /\.cmd$/,
|
||||
loader: 'file-loader',
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
|
@ -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!",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
435
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue