diff --git a/.changeset/cold-moments-yell.md b/.changeset/cold-moments-yell.md new file mode 100644 index 00000000..60f7a8a6 --- /dev/null +++ b/.changeset/cold-moments-yell.md @@ -0,0 +1,5 @@ +--- +"simple-git": minor +--- + +Use `pathspec` wrappers for remote and local paths wehn running either `git.clone` or `git.mirror` diff --git a/.changeset/heavy-showers-prove.md b/.changeset/heavy-showers-prove.md new file mode 100644 index 00000000..53fc931d --- /dev/null +++ b/.changeset/heavy-showers-prove.md @@ -0,0 +1,5 @@ +--- +"simple-git": patch +--- + +Restrict lint and format settings with biome. diff --git a/.changeset/shaky-readers-share.md b/.changeset/shaky-readers-share.md new file mode 100644 index 00000000..5bfbfdc2 --- /dev/null +++ b/.changeset/shaky-readers-share.md @@ -0,0 +1,7 @@ +--- +"simple-git": patch +--- + +Enhanced `git -c` checks in `unsafe` plugin. + +Thanks to @JohannesLks for identifying the issue diff --git a/biome.json b/biome.json index da57ff7b..a532fac0 100644 --- a/biome.json +++ b/biome.json @@ -3,7 +3,20 @@ "assist": { "actions": { "source": { - "organizeImports": "off" + "organizeImports": { + "level": "on", + "options": { + "groups": [ + ":URL:", + ":NODE:", + ":BLANK_LINE:", + [":PACKAGE:", ":PACKAGE_WITH_PROTOCOL:"], + ":BLANK_LINE:", + ":ALIAS:", + ":PATH:" + ] + } + } } } }, @@ -51,7 +64,6 @@ "linter": { "rules": { "complexity": { - "noBannedTypes": "off", "noUselessEscapeInRegex": "off", "useArrowFunction": "off", "useOptionalChain": "off" @@ -60,10 +72,8 @@ "noUnusedPrivateClassMembers": "off" }, "style": { - "useConst": "off", "useShorthandFunctionType": "off", "useTemplate": "off", - "useImportType": "off", "useNodejsImportProtocol": "off" }, "suspicious": { @@ -76,10 +86,18 @@ }, { "includes": ["simple-git/src/git.js", "simple-git/scripts/*"], + "assist": { + "actions": { + "source": { + "organizeImports": "off" + } + } + }, "linter": { "rules": { "complexity": { - "useArrowFunction": "off" + "useArrowFunction": "off", + "noBannedTypes": "off" }, "correctness": { "noUnusedFunctionParameters": "off", @@ -95,25 +113,16 @@ "**/__fixtures__/**", "**/__mocks__/**" ], - "assist": { - "actions": { - "source": { - "organizeImports": "off" - } - } - }, "formatter": { "enabled": false }, "linter": { "rules": { "complexity": { - "noBannedTypes": "off", - "useArrowFunction": "off" + "useArrowFunction": "off", + "noBannedTypes": "off" }, "style": { - "useConst": "off", - "useImportType": "off", "useTemplate": "off" }, "suspicious": { @@ -134,7 +143,8 @@ "!**/coverage/**", "!**/dist/**", "!.changeset/**", - "!node_modules/**" + "!node_modules/**", + "!**/.astro/**" ] } } diff --git a/packages/test-typescript-consumer/test/ts-default-from-root.spec.ts b/packages/test-typescript-consumer/test/ts-default-from-root.spec.ts index 01b023fe..a490d16e 100644 --- a/packages/test-typescript-consumer/test/ts-default-from-root.spec.ts +++ b/packages/test-typescript-consumer/test/ts-default-from-root.spec.ts @@ -1,4 +1,4 @@ -import { simpleGit, CleanOptions, SimpleGit, TaskConfigurationError } from 'simple-git'; +import { CleanOptions, type SimpleGit, simpleGit, TaskConfigurationError } from 'simple-git'; describe('simple-git', () => { describe('named export', () => { diff --git a/packages/test-typescript-consumer/test/ts-named-import.spec.ts b/packages/test-typescript-consumer/test/ts-named-import.spec.ts index 4f53b1ea..4230527f 100644 --- a/packages/test-typescript-consumer/test/ts-named-import.spec.ts +++ b/packages/test-typescript-consumer/test/ts-named-import.spec.ts @@ -1,4 +1,4 @@ -import simpleGit, { gitP, CleanOptions, SimpleGit, TaskConfigurationError } from 'simple-git'; +import simpleGit, { CleanOptions, gitP, type SimpleGit, TaskConfigurationError } from 'simple-git'; describe('simple-git', () => { describe('default export', () => { diff --git a/packages/test-typescript-esm-consumer/test/ts-default-renamed-import.spec.ts b/packages/test-typescript-esm-consumer/test/ts-default-renamed-import.spec.ts index cf9a1b65..0c4863ab 100644 --- a/packages/test-typescript-esm-consumer/test/ts-default-renamed-import.spec.ts +++ b/packages/test-typescript-esm-consumer/test/ts-default-renamed-import.spec.ts @@ -1,4 +1,4 @@ -import { default as simpleGit, CleanOptions, SimpleGit, TaskConfigurationError } from 'simple-git'; +import { CleanOptions, type SimpleGit, default as simpleGit, TaskConfigurationError } from 'simple-git'; describe('simple-git', () => { describe('renamed default export', () => { diff --git a/packages/test-typescript-esm-consumer/test/ts-named-import.spec.ts b/packages/test-typescript-esm-consumer/test/ts-named-import.spec.ts index 77e3b539..a93f4938 100644 --- a/packages/test-typescript-esm-consumer/test/ts-named-import.spec.ts +++ b/packages/test-typescript-esm-consumer/test/ts-named-import.spec.ts @@ -1,4 +1,4 @@ -import { simpleGit, CleanOptions, SimpleGit, TaskConfigurationError } from 'simple-git'; +import { CleanOptions, type SimpleGit, simpleGit, TaskConfigurationError } from 'simple-git'; describe('simple-git', () => { describe('named export', () => { diff --git a/packages/test-utils/index.ts b/packages/test-utils/index.ts index d1c6f368..d58834a5 100644 --- a/packages/test-utils/index.ts +++ b/packages/test-utils/index.ts @@ -3,9 +3,8 @@ export * from './src/create-test-context'; export * from './src/expectations'; export * from './src/instance'; export * from './src/like'; -export * from './src/wait'; - export * from './src/setup/setup-conflicted'; export * from './src/setup/setup-files'; -export * from './src/setup/setup-init'; export * from './src/setup/setup-ignored'; +export * from './src/setup/setup-init'; +export * from './src/wait'; diff --git a/packages/test-utils/src/create-test-context.ts b/packages/test-utils/src/create-test-context.ts index 855753d1..c6a829a0 100644 --- a/packages/test-utils/src/create-test-context.ts +++ b/packages/test-utils/src/create-test-context.ts @@ -1,8 +1,8 @@ import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import { existsSync, mkdir, mkdtemp, realpathSync, writeFile, WriteFileOptions } from 'fs'; +import { existsSync, mkdir, mkdtemp, realpathSync, type WriteFileOptions, writeFile } from 'fs'; -import { simpleGit, SimpleGit } from 'simple-git'; +import { type SimpleGit, simpleGit } from 'simple-git'; export interface SimpleGitTestContext { /** Creates a directory under the repo root at the given path(s) */ diff --git a/packages/test-utils/src/setup/setup-conflicted.ts b/packages/test-utils/src/setup/setup-conflicted.ts index c7abfec1..aa769931 100644 --- a/packages/test-utils/src/setup/setup-conflicted.ts +++ b/packages/test-utils/src/setup/setup-conflicted.ts @@ -1,4 +1,4 @@ -import { SimpleGitTestContext } from '../create-test-context'; +import type { SimpleGitTestContext } from '../create-test-context'; export const FIRST_BRANCH = 'first'; export const SECOND_BRANCH = 'second'; diff --git a/packages/test-utils/src/setup/setup-files.ts b/packages/test-utils/src/setup/setup-files.ts index ff1b8dae..4967000f 100644 --- a/packages/test-utils/src/setup/setup-files.ts +++ b/packages/test-utils/src/setup/setup-files.ts @@ -1,4 +1,4 @@ -import { SimpleGitTestContext } from '../create-test-context'; +import type { SimpleGitTestContext } from '../create-test-context'; export async function setUpFilesAdded( { git, files }: SimpleGitTestContext, diff --git a/packages/test-utils/src/setup/setup-ignored.ts b/packages/test-utils/src/setup/setup-ignored.ts index f7d21243..24677d1a 100644 --- a/packages/test-utils/src/setup/setup-ignored.ts +++ b/packages/test-utils/src/setup/setup-ignored.ts @@ -1,4 +1,4 @@ -import { SimpleGitTestContext } from '../create-test-context'; +import type { SimpleGitTestContext } from '../create-test-context'; export async function setUpIgnored({ git, file }: SimpleGitTestContext, paths: string[] = [], filename = '.gitignore') { await file(filename, paths.join('\n') + '\n'); diff --git a/packages/test-utils/src/setup/setup-init.ts b/packages/test-utils/src/setup/setup-init.ts index 873c7645..fd39386f 100644 --- a/packages/test-utils/src/setup/setup-init.ts +++ b/packages/test-utils/src/setup/setup-init.ts @@ -1,5 +1,6 @@ -import { SimpleGit } from 'simple-git'; -import { SimpleGitTestContext } from '../create-test-context'; +import type { SimpleGit } from 'simple-git'; + +import type { SimpleGitTestContext } from '../create-test-context'; export const GIT_USER_NAME = 'Simple Git Tests'; export const GIT_USER_EMAIL = 'tests@simple-git.dev'; diff --git a/simple-git/jest.config.js b/simple-git/jest.config.js deleted file mode 100644 index f77cd57c..00000000 --- a/simple-git/jest.config.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - roots: ['/src/', '/test/', '/typings/'], - coverageThreshold: { - global: { - branches: 80, - functions: 80, - lines: 80, - statements: 80, - }, - }, - coveragePathIgnorePatterns: ['/test/'], - coverageReporters: ['json', 'lcov', 'text', 'clover'], - testMatch: ['**/test/**/test-*.js', '**/test/**/*.spec.*'], -}; diff --git a/simple-git/jest.config.ts b/simple-git/jest.config.ts new file mode 100644 index 00000000..9485daba --- /dev/null +++ b/simple-git/jest.config.ts @@ -0,0 +1,33 @@ +import type { Config } from 'jest'; + +const projectConfig = (type: string): Config => ({ + displayName: type, + coverageThreshold: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80, + }, + }, + coveragePathIgnorePatterns: ['/test/'], + // coverageReporters: ['json', 'lcov', 'text', 'clover'], + roots: ['/src/', '/test/', '/typings/'], + testMatch: [`**/test/${type}/**/*.spec.*`], +}); + +const config: Config = { + projects: [ + { + ...projectConfig('unit'), + setupFilesAfterEnv: [ + '/test/unit/__fixtures__/debug.ts', + '/test/unit/__fixtures__/file-exists.ts', + '/test/unit/__mocks__/mock-child-process.ts', + ], + }, + projectConfig('integration'), + ], +}; + +export default config; diff --git a/simple-git/src/git.js b/simple-git/src/git.js index 2668f5ce..97ce3c18 100644 --- a/simple-git/src/git.js +++ b/simple-git/src/git.js @@ -23,7 +23,6 @@ const { } = require('./lib/tasks/branch'); const { checkIgnoreTask } = require('./lib/tasks/check-ignore'); const { checkIsRepoTask } = require('./lib/tasks/check-is-repo'); -const { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone'); const { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean'); const { diffSummaryTask } = require('./lib/tasks/diff'); const { fetchTask } = require('./lib/tasks/fetch'); @@ -101,34 +100,6 @@ Git.prototype.stashList = function (options) { ); }; -function createCloneTask(api, task, repoPath, localPath) { - if (typeof repoPath !== 'string') { - return configurationErrorTask(`git.${api}() requires a string 'repoPath'`); - } - - return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments)); -} - -/** - * Clone a git repo - */ -Git.prototype.clone = function () { - return this._runTask( - createCloneTask('clone', cloneTask, ...arguments), - trailingFunctionArgument(arguments) - ); -}; - -/** - * Mirror a git repo - */ -Git.prototype.mirror = function () { - return this._runTask( - createCloneTask('mirror', cloneMirrorTask, ...arguments), - trailingFunctionArgument(arguments) - ); -}; - /** * Moves one or more files to a new destination. * diff --git a/simple-git/src/lib/args/pathspec.ts b/simple-git/src/lib/args/pathspec.ts index abc26c2a..ae37b2e4 100644 --- a/simple-git/src/lib/args/pathspec.ts +++ b/simple-git/src/lib/args/pathspec.ts @@ -1,3 +1,4 @@ +// biome-ignore lint/complexity/noBannedTypes: Object reference required for WeakMap const cache = new WeakMap(); export function pathspec(...paths: string[]) { @@ -14,3 +15,9 @@ export function isPathSpec(path: string | unknown): path is string { export function toPaths(pathSpec: string): string[] { return cache.get(pathSpec) || []; } + +export function insertBeforePathsIndex(commands: string[]) { + const index = commands.indexOf('--'); + + return index > -1 ? index : commands.length; +} diff --git a/simple-git/src/lib/errors/git-construct-error.ts b/simple-git/src/lib/errors/git-construct-error.ts index e871787a..f1eec06a 100644 --- a/simple-git/src/lib/errors/git-construct-error.ts +++ b/simple-git/src/lib/errors/git-construct-error.ts @@ -1,5 +1,5 @@ +import type { SimpleGitOptions } from '../types'; import { GitError } from './git-error'; -import { SimpleGitOptions } from '../types'; /** * The `GitConstructError` is thrown when an error occurs in the constructor diff --git a/simple-git/src/lib/errors/git-plugin-error.ts b/simple-git/src/lib/errors/git-plugin-error.ts index 3d9d9cee..ccfda65c 100644 --- a/simple-git/src/lib/errors/git-plugin-error.ts +++ b/simple-git/src/lib/errors/git-plugin-error.ts @@ -1,4 +1,4 @@ -import { SimpleGitOptions, SimpleGitTask } from '../types'; +import type { SimpleGitOptions, SimpleGitTask } from '../types'; import { GitError } from './git-error'; export class GitPluginError extends GitError { diff --git a/simple-git/src/lib/git-factory.ts b/simple-git/src/lib/git-factory.ts index 684af558..77e29ebb 100644 --- a/simple-git/src/lib/git-factory.ts +++ b/simple-git/src/lib/git-factory.ts @@ -1,5 +1,4 @@ -import { SimpleGitFactory } from '../../typings'; - +import type { SimpleGitFactory } from '../../typings'; import * as api from './api'; import { abortPlugin, @@ -15,8 +14,8 @@ import { timeoutPlugin, } from './plugins'; import { suffixPathsPlugin } from './plugins/suffix-paths.plugin'; +import type { SimpleGitOptions } from './types'; import { createInstanceConfig, folderExists } from './utils'; -import { SimpleGitOptions } from './types'; const Git = require('../git'); @@ -59,12 +58,12 @@ export function gitInstanceFactory( } plugins.add(blockUnsafeOperationsPlugin(config.unsafe)); - plugins.add(suffixPathsPlugin()); plugins.add(completionDetectionPlugin(config.completion)); config.abort && plugins.add(abortPlugin(config.abort)); config.progress && plugins.add(progressMonitorPlugin(config.progress)); config.timeout && plugins.add(timeoutPlugin(config.timeout)); config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); + plugins.add(suffixPathsPlugin()); plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); config.errors && plugins.add(errorDetectionPlugin(config.errors)); diff --git a/simple-git/src/lib/git-logger.ts b/simple-git/src/lib/git-logger.ts index 45e3af82..57278c0a 100644 --- a/simple-git/src/lib/git-logger.ts +++ b/simple-git/src/lib/git-logger.ts @@ -1,4 +1,6 @@ -import debug, { Debugger } from 'debug'; +import debug, { type Debugger } from 'debug'; + +import type { Maybe } from './types'; import { append, filterHasLength, @@ -8,7 +10,6 @@ import { objectToString, remove, } from './utils'; -import { Maybe } from './types'; debug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-'); debug.formatters.B = (value: Buffer) => { diff --git a/simple-git/src/lib/parsers/parse-branch-delete.ts b/simple-git/src/lib/parsers/parse-branch-delete.ts index 5ee4476c..482c74ed 100644 --- a/simple-git/src/lib/parsers/parse-branch-delete.ts +++ b/simple-git/src/lib/parsers/parse-branch-delete.ts @@ -1,10 +1,10 @@ -import { BranchMultiDeleteResult } from '../../../typings'; +import type { BranchMultiDeleteResult } from '../../../typings'; import { BranchDeletionBatch, branchDeletionFailure, branchDeletionSuccess, } from '../responses/BranchDeleteSummary'; -import { TaskParser } from '../types'; +import type { TaskParser } from '../types'; import { ExitCodes, LineParser, parseStringResponse } from '../utils'; const deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; diff --git a/simple-git/src/lib/parsers/parse-commit.ts b/simple-git/src/lib/parsers/parse-commit.ts index 9bf298bb..24878538 100644 --- a/simple-git/src/lib/parsers/parse-commit.ts +++ b/simple-git/src/lib/parsers/parse-commit.ts @@ -1,4 +1,4 @@ -import { CommitResult } from '../../../typings'; +import type { CommitResult } from '../../../typings'; import { LineParser, parseStringResponse } from '../utils'; const parsers: LineParser[] = [ diff --git a/simple-git/src/lib/parsers/parse-diff-summary.ts b/simple-git/src/lib/parsers/parse-diff-summary.ts index 53d10678..21dd3d5f 100644 --- a/simple-git/src/lib/parsers/parse-diff-summary.ts +++ b/simple-git/src/lib/parsers/parse-diff-summary.ts @@ -1,4 +1,4 @@ -import { DiffResult } from '../../../typings'; +import type { DiffResult } from '../../../typings'; import { LogFormat } from '../args/log-format'; import { DiffSummary } from '../responses/DiffSummary'; import { isDiffNameStatus } from '../tasks/diff-name-status'; diff --git a/simple-git/src/lib/parsers/parse-fetch.ts b/simple-git/src/lib/parsers/parse-fetch.ts index 7e97c155..14b21eef 100644 --- a/simple-git/src/lib/parsers/parse-fetch.ts +++ b/simple-git/src/lib/parsers/parse-fetch.ts @@ -1,4 +1,4 @@ -import { FetchResult } from '../../../typings'; +import type { FetchResult } from '../../../typings'; import { LineParser, parseStringResponse } from '../utils'; const parsers: LineParser[] = [ diff --git a/simple-git/src/lib/parsers/parse-list-log-summary.ts b/simple-git/src/lib/parsers/parse-list-log-summary.ts index 1b8a3cbd..4236ef2f 100644 --- a/simple-git/src/lib/parsers/parse-list-log-summary.ts +++ b/simple-git/src/lib/parsers/parse-list-log-summary.ts @@ -1,7 +1,7 @@ -import { ListLogLine, LogResult } from '../../../typings'; +import type { ListLogLine, LogResult } from '../../../typings'; +import { LogFormat } from '../args/log-format'; import { toLinesWithContent } from '../utils'; import { getDiffParser } from './parse-diff-summary'; -import { LogFormat } from '../args/log-format'; export const START_BOUNDARY = 'òòòòòò '; diff --git a/simple-git/src/lib/parsers/parse-merge.ts b/simple-git/src/lib/parsers/parse-merge.ts index b0ee3cdd..4181e25f 100644 --- a/simple-git/src/lib/parsers/parse-merge.ts +++ b/simple-git/src/lib/parsers/parse-merge.ts @@ -1,6 +1,6 @@ -import { MergeDetail, MergeResult } from '../../../typings'; +import type { MergeDetail, MergeResult } from '../../../typings'; import { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary'; -import { TaskParser } from '../types'; +import type { TaskParser } from '../types'; import { LineParser, parseStringResponse } from '../utils'; import { parsePullResult } from './parse-pull'; diff --git a/simple-git/src/lib/parsers/parse-move.ts b/simple-git/src/lib/parsers/parse-move.ts index 0ddb82d8..ecbb8560 100644 --- a/simple-git/src/lib/parsers/parse-move.ts +++ b/simple-git/src/lib/parsers/parse-move.ts @@ -1,4 +1,4 @@ -import { MoveResult } from '../../../typings'; +import type { MoveResult } from '../../../typings'; import { LineParser, parseStringResponse } from '../utils'; const parsers: LineParser[] = [ diff --git a/simple-git/src/lib/parsers/parse-pull.ts b/simple-git/src/lib/parsers/parse-pull.ts index 4201d066..7677d58e 100644 --- a/simple-git/src/lib/parsers/parse-pull.ts +++ b/simple-git/src/lib/parsers/parse-pull.ts @@ -1,6 +1,6 @@ -import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings'; +import type { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings'; import { PullFailedSummary, PullSummary } from '../responses/PullSummary'; -import { TaskParser } from '../types'; +import type { TaskParser } from '../types'; import { append, LineParser, parseStringResponse } from '../utils'; import { parseRemoteMessages } from './parse-remote-messages'; diff --git a/simple-git/src/lib/parsers/parse-push.ts b/simple-git/src/lib/parsers/parse-push.ts index b12db8b2..ea702807 100644 --- a/simple-git/src/lib/parsers/parse-push.ts +++ b/simple-git/src/lib/parsers/parse-push.ts @@ -1,10 +1,10 @@ -import { +import type { PushDetail, PushResult, PushResultPushedItem, PushResultRemoteMessages, } from '../../../typings'; -import { TaskParser } from '../types'; +import type { TaskParser } from '../types'; import { LineParser, parseStringResponse } from '../utils'; import { parseRemoteMessages } from './parse-remote-messages'; diff --git a/simple-git/src/lib/parsers/parse-remote-messages.ts b/simple-git/src/lib/parsers/parse-remote-messages.ts index 4706d568..26552ede 100644 --- a/simple-git/src/lib/parsers/parse-remote-messages.ts +++ b/simple-git/src/lib/parsers/parse-remote-messages.ts @@ -1,4 +1,8 @@ -import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings'; +import type { + PushResultRemoteMessages, + RemoteMessageResult, + RemoteMessages, +} from '../../../typings'; import { asNumber, parseStringResponse, RemoteLineParser } from '../utils'; import { remoteMessagesObjectParsers } from './parse-remote-objects'; diff --git a/simple-git/src/lib/parsers/parse-remote-objects.ts b/simple-git/src/lib/parsers/parse-remote-objects.ts index 27d69885..174bf393 100644 --- a/simple-git/src/lib/parsers/parse-remote-objects.ts +++ b/simple-git/src/lib/parsers/parse-remote-objects.ts @@ -1,4 +1,4 @@ -import { +import type { RemoteMessageResult, RemoteMessages, RemoteMessagesObjectEnumeration, diff --git a/simple-git/src/lib/plugins/abort-plugin.ts b/simple-git/src/lib/plugins/abort-plugin.ts index 4771a3fb..69fc6d0e 100644 --- a/simple-git/src/lib/plugins/abort-plugin.ts +++ b/simple-git/src/lib/plugins/abort-plugin.ts @@ -1,6 +1,6 @@ -import { SimpleGitOptions } from '../types'; -import { SimpleGitPlugin } from './simple-git-plugin'; import { GitPluginError } from '../errors/git-plugin-error'; +import type { SimpleGitOptions } from '../types'; +import type { SimpleGitPlugin } from './simple-git-plugin'; export function abortPlugin(signal: SimpleGitOptions['abort']) { if (!signal) { diff --git a/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts b/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts index 93f31d58..d2095267 100644 --- a/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts +++ b/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts @@ -1,7 +1,6 @@ -import type { SimpleGitPlugin } from './simple-git-plugin'; - import { GitPluginError } from '../errors/git-plugin-error'; import type { SimpleGitPluginConfig } from '../types'; +import type { SimpleGitPlugin } from './simple-git-plugin'; function isConfigSwitch(arg: string | unknown) { return typeof arg === 'string' && arg.trim().toLowerCase() === '-c'; @@ -16,22 +15,40 @@ function isCloneSwitch(char: string, arg: string | unknown) { return /^[\dlsqvnobucj]+\b/.test(token); } -function preventProtocolOverride(arg: string, next: string) { - if (!isConfigSwitch(arg)) { - return; - } - - if (!/^\s*protocol(.[a-z]+)?.allow/i.test(next)) { - return; - } +function preventConfigBuilder( + config: string | RegExp, + setting: keyof SimpleGitPluginConfig['unsafe'], + message = String(config) +) { + const regex = typeof config === 'string' ? new RegExp(`\\s*${config}`, 'i') : config; - throw new GitPluginError( - undefined, - 'unsafe', - 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol' - ); + return function preventCommand( + options: Partial, + arg: string, + next: string + ) { + if (options[setting] !== true && isConfigSwitch(arg) && regex.test(next)) { + throw new GitPluginError( + undefined, + 'unsafe', + `Configuring ${message} is not permitted without enabling ${setting}` + ); + } + }; } +const preventUnsafeConfig = [ + preventConfigBuilder( + /^\s*protocol(.[a-z]+)?.allow/i, + 'allowUnsafeProtocolOverride', + 'protocol.allow' + ), + preventConfigBuilder('core.sshCommand', 'allowUnsafeSshCommand'), + preventConfigBuilder('core.gitProxy', 'allowUnsafeGitProxy'), + preventConfigBuilder('core.hooksPath', 'allowUnsafeHooksPath'), + preventConfigBuilder('diff.external', 'allowUnsafeDiffExternal'), +]; + function preventUploadPack(arg: string, method: string) { if (/^\s*--(upload|receive)-pack/.test(arg)) { throw new GitPluginError( @@ -59,8 +76,8 @@ function preventUploadPack(arg: string, method: string) { } export function blockUnsafeOperationsPlugin({ - allowUnsafeProtocolOverride = false, allowUnsafePack = false, + ...options }: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> { return { type: 'spawn.args', @@ -68,8 +85,8 @@ export function blockUnsafeOperationsPlugin({ args.forEach((current, index) => { const next = index < args.length ? args[index + 1] : ''; - allowUnsafeProtocolOverride || preventProtocolOverride(current, next); allowUnsafePack || preventUploadPack(current, context.method); + preventUnsafeConfig.forEach((helper) => helper(options, current, next)); }); return args; diff --git a/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts b/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts index 9ac7dbdd..85e2cf10 100644 --- a/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts +++ b/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts @@ -1,5 +1,5 @@ import { prefixedArray } from '../utils'; -import { SimpleGitPlugin } from './simple-git-plugin'; +import type { SimpleGitPlugin } from './simple-git-plugin'; export function commandConfigPrefixingPlugin( configuration: string[] diff --git a/simple-git/src/lib/plugins/completion-detection.plugin.ts b/simple-git/src/lib/plugins/completion-detection.plugin.ts index b8a7cc5c..85fd4fbf 100644 --- a/simple-git/src/lib/plugins/completion-detection.plugin.ts +++ b/simple-git/src/lib/plugins/completion-detection.plugin.ts @@ -1,7 +1,8 @@ -import { deferred, DeferredPromise } from '@kwsites/promise-deferred'; -import { SimpleGitPluginConfig } from '../types'; +import { type DeferredPromise, deferred } from '@kwsites/promise-deferred'; + +import type { SimpleGitPluginConfig } from '../types'; import { delay } from '../utils'; -import { SimpleGitPlugin } from './simple-git-plugin'; +import type { SimpleGitPlugin } from './simple-git-plugin'; const never = deferred().promise; @@ -60,7 +61,7 @@ export function completionDetectionPlugin({ const events = createEvents(); let deferClose = true; - let quickClose = () => void (deferClose = false); + const quickClose = () => void (deferClose = false); spawned.stdout?.on('data', quickClose); spawned.stderr?.on('data', quickClose); diff --git a/simple-git/src/lib/plugins/custom-binary.plugin.ts b/simple-git/src/lib/plugins/custom-binary.plugin.ts index 18119090..389353b7 100644 --- a/simple-git/src/lib/plugins/custom-binary.plugin.ts +++ b/simple-git/src/lib/plugins/custom-binary.plugin.ts @@ -1,8 +1,7 @@ -import type { SimpleGitOptions } from '../types'; - import { GitPluginError } from '../errors/git-plugin-error'; +import type { SimpleGitOptions } from '../types'; import { asArray } from '../utils'; -import { PluginStore } from './plugin-store'; +import type { PluginStore } from './plugin-store'; const WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`; const WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`; diff --git a/simple-git/src/lib/plugins/error-detection.plugin.ts b/simple-git/src/lib/plugins/error-detection.plugin.ts index ef745bbf..cd5f4049 100644 --- a/simple-git/src/lib/plugins/error-detection.plugin.ts +++ b/simple-git/src/lib/plugins/error-detection.plugin.ts @@ -1,6 +1,6 @@ import { GitError } from '../errors/git-error'; -import { GitExecutorResult, SimpleGitPluginConfig } from '../types'; -import { SimpleGitPlugin } from './simple-git-plugin'; +import type { GitExecutorResult, SimpleGitPluginConfig } from '../types'; +import type { SimpleGitPlugin } from './simple-git-plugin'; type TaskResult = Omit; diff --git a/simple-git/src/lib/plugins/plugin-store.ts b/simple-git/src/lib/plugins/plugin-store.ts index 2220e46b..282bd474 100644 --- a/simple-git/src/lib/plugins/plugin-store.ts +++ b/simple-git/src/lib/plugins/plugin-store.ts @@ -1,12 +1,12 @@ import { EventEmitter } from 'node:events'; +import type { SimpleGitPluginConfig } from '../types'; +import { append, asArray } from '../utils'; import type { SimpleGitPlugin, SimpleGitPluginType, SimpleGitPluginTypes, } from './simple-git-plugin'; -import { append, asArray } from '../utils'; -import type { SimpleGitPluginConfig } from '../types'; export class PluginStore { private plugins: Set> = new Set(); diff --git a/simple-git/src/lib/plugins/progress-monitor-plugin.ts b/simple-git/src/lib/plugins/progress-monitor-plugin.ts index f3dac58a..b9425e99 100644 --- a/simple-git/src/lib/plugins/progress-monitor-plugin.ts +++ b/simple-git/src/lib/plugins/progress-monitor-plugin.ts @@ -1,7 +1,7 @@ -import { SimpleGitOptions } from '../types'; +import { insertBeforePathsIndex } from '../args/pathspec'; +import type { SimpleGitOptions } from '../types'; import { asNumber, including } from '../utils'; - -import { SimpleGitPlugin } from './simple-git-plugin'; +import type { SimpleGitPlugin } from './simple-git-plugin'; export function progressMonitorPlugin(progress: Exclude) { const progressCommand = '--progress'; @@ -38,7 +38,7 @@ export function progressMonitorPlugin(progress: Exclude diff --git a/simple-git/src/lib/plugins/suffix-paths.plugin.ts b/simple-git/src/lib/plugins/suffix-paths.plugin.ts index 0e7bf7a1..7a301b93 100644 --- a/simple-git/src/lib/plugins/suffix-paths.plugin.ts +++ b/simple-git/src/lib/plugins/suffix-paths.plugin.ts @@ -1,5 +1,5 @@ -import { SimpleGitPlugin } from './simple-git-plugin'; import { isPathSpec, toPaths } from '../args/pathspec'; +import type { SimpleGitPlugin } from './simple-git-plugin'; export function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> { return { diff --git a/simple-git/src/lib/plugins/timout-plugin.ts b/simple-git/src/lib/plugins/timout-plugin.ts index 684fbec0..20c6c813 100644 --- a/simple-git/src/lib/plugins/timout-plugin.ts +++ b/simple-git/src/lib/plugins/timout-plugin.ts @@ -1,7 +1,6 @@ -import type { SimpleGitPlugin } from './simple-git-plugin'; - -import type { SimpleGitOptions } from '../types'; import { GitPluginError } from '../errors/git-plugin-error'; +import type { SimpleGitOptions } from '../types'; +import type { SimpleGitPlugin } from './simple-git-plugin'; export function timeoutPlugin({ block, diff --git a/simple-git/src/lib/responses/BranchDeleteSummary.ts b/simple-git/src/lib/responses/BranchDeleteSummary.ts index 266c558f..8a96fe6c 100644 --- a/simple-git/src/lib/responses/BranchDeleteSummary.ts +++ b/simple-git/src/lib/responses/BranchDeleteSummary.ts @@ -1,4 +1,4 @@ -import { +import type { BranchMultiDeleteResult, BranchSingleDeleteFailure, BranchSingleDeleteResult, diff --git a/simple-git/src/lib/responses/CleanSummary.ts b/simple-git/src/lib/responses/CleanSummary.ts index 41797ee4..3765c553 100644 --- a/simple-git/src/lib/responses/CleanSummary.ts +++ b/simple-git/src/lib/responses/CleanSummary.ts @@ -1,4 +1,4 @@ -import { CleanSummary } from '../../../typings'; +import type { CleanSummary } from '../../../typings'; import { toLinesWithContent } from '../utils'; export class CleanResponse implements CleanSummary { diff --git a/simple-git/src/lib/responses/ConfigList.ts b/simple-git/src/lib/responses/ConfigList.ts index c8109b86..52c50ff1 100644 --- a/simple-git/src/lib/responses/ConfigList.ts +++ b/simple-git/src/lib/responses/ConfigList.ts @@ -1,4 +1,4 @@ -import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings'; +import type { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings'; import { last, splitOn } from '../utils'; export class ConfigList implements ConfigListSummary { diff --git a/simple-git/src/lib/responses/DiffSummary.ts b/simple-git/src/lib/responses/DiffSummary.ts index 2c2eab71..7a60093c 100644 --- a/simple-git/src/lib/responses/DiffSummary.ts +++ b/simple-git/src/lib/responses/DiffSummary.ts @@ -1,4 +1,4 @@ -import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings'; +import type { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings'; /*** * The DiffSummary is returned as a response to getting `git().status()` diff --git a/simple-git/src/lib/responses/FileStatusSummary.ts b/simple-git/src/lib/responses/FileStatusSummary.ts index 92ce0af1..c809d397 100644 --- a/simple-git/src/lib/responses/FileStatusSummary.ts +++ b/simple-git/src/lib/responses/FileStatusSummary.ts @@ -1,4 +1,4 @@ -import { FileStatusResult } from '../../../typings'; +import type { FileStatusResult } from '../../../typings'; export const fromPathRegex = /^(.+)\0(.+)$/; diff --git a/simple-git/src/lib/responses/InitSummary.ts b/simple-git/src/lib/responses/InitSummary.ts index 8d4fb6df..1a8207c0 100644 --- a/simple-git/src/lib/responses/InitSummary.ts +++ b/simple-git/src/lib/responses/InitSummary.ts @@ -1,4 +1,4 @@ -import { InitResult } from '../../../typings'; +import type { InitResult } from '../../../typings'; export class InitSummary implements InitResult { constructor( diff --git a/simple-git/src/lib/responses/MergeSummary.ts b/simple-git/src/lib/responses/MergeSummary.ts index 7a0e0a63..635d371d 100644 --- a/simple-git/src/lib/responses/MergeSummary.ts +++ b/simple-git/src/lib/responses/MergeSummary.ts @@ -1,4 +1,4 @@ -import { +import type { MergeConflict, MergeConflictDeletion, MergeDetail, diff --git a/simple-git/src/lib/responses/PullSummary.ts b/simple-git/src/lib/responses/PullSummary.ts index 55c398ba..f1527ddb 100644 --- a/simple-git/src/lib/responses/PullSummary.ts +++ b/simple-git/src/lib/responses/PullSummary.ts @@ -1,4 +1,4 @@ -import { +import type { PullDetailFileChanges, PullDetailSummary, PullFailedResult, diff --git a/simple-git/src/lib/responses/StatusSummary.ts b/simple-git/src/lib/responses/StatusSummary.ts index 5e4c7ad7..dfbe105d 100644 --- a/simple-git/src/lib/responses/StatusSummary.ts +++ b/simple-git/src/lib/responses/StatusSummary.ts @@ -1,4 +1,4 @@ -import { StatusResult } from '../../../typings'; +import type { StatusResult } from '../../../typings'; import { filterString, filterType, NULL } from '../utils'; import { FileStatusSummary } from './FileStatusSummary'; diff --git a/simple-git/src/lib/responses/TagList.ts b/simple-git/src/lib/responses/TagList.ts index 60b7bf3a..ad6ceb14 100644 --- a/simple-git/src/lib/responses/TagList.ts +++ b/simple-git/src/lib/responses/TagList.ts @@ -1,4 +1,4 @@ -import { TagResult } from '../../../typings'; +import type { TagResult } from '../../../typings'; export class TagList implements TagResult { constructor( diff --git a/simple-git/src/lib/runners/git-executor-chain.ts b/simple-git/src/lib/runners/git-executor-chain.ts index 2fceb2e8..e5106499 100644 --- a/simple-git/src/lib/runners/git-executor-chain.ts +++ b/simple-git/src/lib/runners/git-executor-chain.ts @@ -1,9 +1,10 @@ -import { spawn, SpawnOptions } from 'child_process'; +import { type SpawnOptions, spawn } from 'child_process'; + import { GitError } from '../errors/git-error'; -import { OutputLogger } from '../git-logger'; -import { PluginStore } from '../plugins'; -import { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task'; -import { +import type { OutputLogger } from '../git-logger'; +import type { PluginStore } from '../plugins'; +import { type EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task'; +import type { GitExecutorResult, Maybe, outputHandler, @@ -12,7 +13,7 @@ import { SimpleGitTask, } from '../types'; import { callTaskParser, first, GitOutputStreams, objectToString } from '../utils'; -import { Scheduler } from './scheduler'; +import type { Scheduler } from './scheduler'; import { TasksPendingQueue } from './tasks-pending-queue'; export class GitExecutorChain implements SimpleGitExecutor { diff --git a/simple-git/src/lib/runners/git-executor.ts b/simple-git/src/lib/runners/git-executor.ts index 02a3bdfe..a5358c90 100644 --- a/simple-git/src/lib/runners/git-executor.ts +++ b/simple-git/src/lib/runners/git-executor.ts @@ -1,8 +1,7 @@ import type { PluginStore } from '../plugins'; import type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types'; - import { GitExecutorChain } from './git-executor-chain'; -import { Scheduler } from './scheduler'; +import type { Scheduler } from './scheduler'; export class GitExecutor implements SimpleGitExecutor { private _chain = new GitExecutorChain(this, this._scheduler, this._plugins); diff --git a/simple-git/src/lib/runners/promise-wrapped.ts b/simple-git/src/lib/runners/promise-wrapped.ts index 7fe0044c..71f5588f 100644 --- a/simple-git/src/lib/runners/promise-wrapped.ts +++ b/simple-git/src/lib/runners/promise-wrapped.ts @@ -1,8 +1,7 @@ -import { SimpleGit, SimpleGitOptions } from '../../../typings'; - +import type { SimpleGit, SimpleGitOptions } from '../../../typings'; import { GitResponseError } from '../errors/git-response-error'; import { gitInstanceFactory } from '../git-factory'; -import { SimpleGitTaskCallback } from '../types'; +import type { SimpleGitTaskCallback } from '../types'; const functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent']; diff --git a/simple-git/src/lib/runners/scheduler.ts b/simple-git/src/lib/runners/scheduler.ts index 94c2af0d..574ce545 100644 --- a/simple-git/src/lib/runners/scheduler.ts +++ b/simple-git/src/lib/runners/scheduler.ts @@ -1,6 +1,7 @@ -import { append, remove } from '../utils'; -import { createDeferred, DeferredPromise } from '@kwsites/promise-deferred'; +import { createDeferred, type DeferredPromise } from '@kwsites/promise-deferred'; + import { createLogger } from '../git-logger'; +import { append, remove } from '../utils'; type ScheduleCompleteCallback = () => void; type ScheduledTask = Pick, 'promise' | 'done'> & { diff --git a/simple-git/src/lib/runners/tasks-pending-queue.ts b/simple-git/src/lib/runners/tasks-pending-queue.ts index fdfa7f00..219f7914 100644 --- a/simple-git/src/lib/runners/tasks-pending-queue.ts +++ b/simple-git/src/lib/runners/tasks-pending-queue.ts @@ -1,6 +1,6 @@ -import { SimpleGitTask } from '../types'; import { GitError } from '../errors/git-error'; -import { createLogger, OutputLogger } from '../git-logger'; +import { createLogger, type OutputLogger } from '../git-logger'; +import type { SimpleGitTask } from '../types'; type AnySimpleGitTask = SimpleGitTask; diff --git a/simple-git/src/lib/simple-git-api.ts b/simple-git/src/lib/simple-git-api.ts index f24fc957..1b5f2239 100644 --- a/simple-git/src/lib/simple-git-api.ts +++ b/simple-git/src/lib/simple-git-api.ts @@ -1,10 +1,11 @@ -import { SimpleGitBase } from '../../typings'; +import type { SimpleGitBase } from '../../typings'; import { taskCallback } from './task-callback'; import { changeWorkingDirectoryTask } from './tasks/change-working-directory'; import checkout from './tasks/checkout'; -import countObjects from './tasks/count-objects'; +import clone from './tasks/clone'; import commit from './tasks/commit'; import config from './tasks/config'; +import countObjects from './tasks/count-objects'; import firstCommit from './tasks/first-commit'; import grep from './tasks/grep'; import { hashObjectTask } from './tasks/hash-object'; @@ -16,7 +17,12 @@ import show from './tasks/show'; import { statusTask } from './tasks/status'; import { configurationErrorTask, straightThroughStringTask } from './tasks/task'; import version from './tasks/version'; -import { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types'; +import type { + outputHandler, + SimpleGitExecutor, + SimpleGitTask, + SimpleGitTaskCallback, +} from './types'; import { asArray, filterString, @@ -144,6 +150,7 @@ export class SimpleGitApi implements SimpleGitBase { Object.assign( SimpleGitApi.prototype, checkout(), + clone(), commit(), config(), countObjects(), diff --git a/simple-git/src/lib/task-callback.ts b/simple-git/src/lib/task-callback.ts index 3e6327b8..2ac5b809 100644 --- a/simple-git/src/lib/task-callback.ts +++ b/simple-git/src/lib/task-callback.ts @@ -1,6 +1,6 @@ -import { GitError } from './errors/git-error'; +import type { GitError } from './errors/git-error'; import { GitResponseError } from './errors/git-response-error'; -import { SimpleGitTask, SimpleGitTaskCallback } from './types'; +import type { SimpleGitTask, SimpleGitTaskCallback } from './types'; import { NOOP } from './utils'; export function taskCallback( diff --git a/simple-git/src/lib/tasks/apply-patch.ts b/simple-git/src/lib/tasks/apply-patch.ts index 07773edd..899fec2b 100644 --- a/simple-git/src/lib/tasks/apply-patch.ts +++ b/simple-git/src/lib/tasks/apply-patch.ts @@ -1,5 +1,5 @@ +import type { OptionFlags, Options, StringTask } from '../types'; import { straightThroughStringTask } from './task'; -import { OptionFlags, Options, StringTask } from '../types'; export type ApplyOptions = Options & OptionFlags< diff --git a/simple-git/src/lib/tasks/branch.ts b/simple-git/src/lib/tasks/branch.ts index d071531e..338fcfd6 100644 --- a/simple-git/src/lib/tasks/branch.ts +++ b/simple-git/src/lib/tasks/branch.ts @@ -1,8 +1,12 @@ -import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings'; -import { StringTask } from '../types'; +import type { + BranchMultiDeleteResult, + BranchSingleDeleteResult, + BranchSummary, +} from '../../../typings'; import { GitResponseError } from '../errors/git-response-error'; -import { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete'; import { parseBranchSummary } from '../parsers/parse-branch'; +import { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete'; +import type { StringTask } from '../types'; import { bufferToString } from '../utils'; export function containsDeleteBranchCommand(commands: string[]) { diff --git a/simple-git/src/lib/tasks/change-working-directory.ts b/simple-git/src/lib/tasks/change-working-directory.ts index 137a0d1f..1f1ba4cd 100644 --- a/simple-git/src/lib/tasks/change-working-directory.ts +++ b/simple-git/src/lib/tasks/change-working-directory.ts @@ -1,5 +1,5 @@ +import type { SimpleGitExecutor } from '../types'; import { folderExists } from '../utils'; -import { SimpleGitExecutor } from '../types'; import { adhocExecTask } from './task'; export function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) { diff --git a/simple-git/src/lib/tasks/check-ignore.ts b/simple-git/src/lib/tasks/check-ignore.ts index 0cd933ed..e86580d3 100644 --- a/simple-git/src/lib/tasks/check-ignore.ts +++ b/simple-git/src/lib/tasks/check-ignore.ts @@ -1,5 +1,5 @@ -import { StringTask } from '../types'; import { parseCheckIgnore } from '../responses/CheckIgnore'; +import type { StringTask } from '../types'; export function checkIgnoreTask(paths: string[]): StringTask { return { diff --git a/simple-git/src/lib/tasks/check-is-repo.ts b/simple-git/src/lib/tasks/check-is-repo.ts index 16dbaf4c..5f91e381 100644 --- a/simple-git/src/lib/tasks/check-is-repo.ts +++ b/simple-git/src/lib/tasks/check-is-repo.ts @@ -1,5 +1,5 @@ +import type { Maybe, StringTask } from '../types'; import { ExitCodes } from '../utils'; -import { Maybe, StringTask } from '../types'; export enum CheckRepoActions { BARE = 'bare', diff --git a/simple-git/src/lib/tasks/clean.ts b/simple-git/src/lib/tasks/clean.ts index 66fb8776..cdc41fd5 100644 --- a/simple-git/src/lib/tasks/clean.ts +++ b/simple-git/src/lib/tasks/clean.ts @@ -1,6 +1,6 @@ -import { CleanSummary } from '../../../typings'; +import type { CleanSummary } from '../../../typings'; import { cleanSummaryParser } from '../responses/CleanSummary'; -import { Maybe, StringTask } from '../types'; +import type { Maybe, StringTask } from '../types'; import { asStringArray } from '../utils'; import { configurationErrorTask } from './task'; @@ -70,8 +70,8 @@ export function isCleanOptionsArray(input: string[]): input is CleanOptions[] { function getCleanOptions(input: string) { let cleanMode: Maybe; - let options: string[] = []; - let valid = { cleanMode: false, options: true }; + const options: string[] = []; + const valid = { cleanMode: false, options: true }; input .replace(/[^a-z]i/g, '') diff --git a/simple-git/src/lib/tasks/clone.ts b/simple-git/src/lib/tasks/clone.ts index 1d41f37e..44c8f3bb 100644 --- a/simple-git/src/lib/tasks/clone.ts +++ b/simple-git/src/lib/tasks/clone.ts @@ -1,6 +1,15 @@ -import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task'; -import { OptionFlags, Options, StringTask } from '../types'; -import { append, filterString } from '../utils'; +import type { SimpleGit } from '../../../typings'; +import { pathspec } from '../args/pathspec'; +import type { SimpleGitApi } from '../simple-git-api'; +import type { OptionFlags, Options, StringTask } from '../types'; +import { + append, + filterString, + filterType, + getTrailingOptions, + trailingFunctionArgument, +} from '../utils'; +import { configurationErrorTask, type EmptyTask, straightThroughStringTask } from './task'; export type CloneOptions = Options & OptionFlags< @@ -29,34 +38,53 @@ export type CloneOptions = Options & string >; -function disallowedCommand(command: string) { - return /^--upload-pack(=|$)/.test(command); -} - -export function cloneTask( +type CloneTaskBuilder = ( repo: string | undefined, directory: string | undefined, customArgs: string[] -): StringTask | EmptyTask { - const commands = ['clone', ...customArgs]; +) => StringTask | EmptyTask; - filterString(repo) && commands.push(repo); - filterString(directory) && commands.push(directory); +export const cloneTask: CloneTaskBuilder = (repo, directory, customArgs) => { + const commands = ['clone', ...customArgs]; - const banned = commands.find(disallowedCommand); - if (banned) { - return configurationErrorTask(`git.fetch: potential exploit argument blocked.`); - } + filterString(repo) && commands.push(pathspec(repo)); + filterString(directory) && commands.push(pathspec(directory)); return straightThroughStringTask(commands); -} +}; -export function cloneMirrorTask( - repo: string | undefined, - directory: string | undefined, - customArgs: string[] -) { +export const cloneMirrorTask: CloneTaskBuilder = (repo, directory, customArgs) => { append(customArgs, '--mirror'); return cloneTask(repo, directory, customArgs); +}; + +function createCloneTask( + api: 'clone' | 'mirror', + task: CloneTaskBuilder, + repoPath: string | undefined, + ...args: unknown[] +) { + if (!filterString(repoPath)) { + return configurationErrorTask(`git.${api}() requires a string 'repoPath'`); + } + + return task(repoPath, filterType(args[0], filterString), getTrailingOptions(arguments)); +} + +export default function (): Pick { + return { + clone(this: SimpleGitApi, repo: string | unknown, ...rest: unknown[]) { + return this._runTask( + createCloneTask('clone', cloneTask, filterType(repo, filterString), ...rest), + trailingFunctionArgument(arguments) + ); + }, + mirror(this: SimpleGitApi, repo: string | unknown, ...rest: unknown[]) { + return this._runTask( + createCloneTask('mirror', cloneMirrorTask, filterType(repo, filterString), ...rest), + trailingFunctionArgument(arguments) + ); + }, + }; } diff --git a/simple-git/src/lib/tasks/commit.ts b/simple-git/src/lib/tasks/commit.ts index 503f0c2f..6ca1835a 100644 --- a/simple-git/src/lib/tasks/commit.ts +++ b/simple-git/src/lib/tasks/commit.ts @@ -1,7 +1,7 @@ import type { CommitResult, SimpleGit } from '../../../typings'; +import { parseCommitResult } from '../parsers/parse-commit'; import type { SimpleGitApi } from '../simple-git-api'; import type { StringTask } from '../types'; -import { parseCommitResult } from '../parsers/parse-commit'; import { asArray, asStringArray, diff --git a/simple-git/src/lib/tasks/count-objects.ts b/simple-git/src/lib/tasks/count-objects.ts index 571b119a..1db437e8 100644 --- a/simple-git/src/lib/tasks/count-objects.ts +++ b/simple-git/src/lib/tasks/count-objects.ts @@ -1,5 +1,5 @@ -import type { SimpleGitApi } from '../simple-git-api'; import type { SimpleGit } from '../../../typings'; +import type { SimpleGitApi } from '../simple-git-api'; import { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils'; export interface CountObjectsResult { diff --git a/simple-git/src/lib/tasks/diff.ts b/simple-git/src/lib/tasks/diff.ts index 695bffca..f543acfe 100644 --- a/simple-git/src/lib/tasks/diff.ts +++ b/simple-git/src/lib/tasks/diff.ts @@ -1,8 +1,8 @@ -import { StringTask } from '../types'; -import { DiffResult } from '../../../typings'; +import type { DiffResult } from '../../../typings'; import { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format'; import { getDiffParser } from '../parsers/parse-diff-summary'; -import { configurationErrorTask, EmptyTask } from './task'; +import type { StringTask } from '../types'; +import { configurationErrorTask, type EmptyTask } from './task'; export function diffSummaryTask(customArgs: string[]): StringTask | EmptyTask { let logFormat = logFormatFromCommand(customArgs); diff --git a/simple-git/src/lib/tasks/fetch.ts b/simple-git/src/lib/tasks/fetch.ts index 9dd97446..230291e8 100644 --- a/simple-git/src/lib/tasks/fetch.ts +++ b/simple-git/src/lib/tasks/fetch.ts @@ -1,8 +1,7 @@ -import { FetchResult } from '../../../typings'; +import type { FetchResult } from '../../../typings'; import { parseFetchResult } from '../parsers/parse-fetch'; -import { StringTask } from '../types'; - -import { configurationErrorTask, EmptyTask } from './task'; +import type { StringTask } from '../types'; +import { configurationErrorTask, type EmptyTask } from './task'; function disallowedCommand(command: string) { return /^--upload-pack(=|$)/.test(command); diff --git a/simple-git/src/lib/tasks/first-commit.ts b/simple-git/src/lib/tasks/first-commit.ts index 1dd64c6a..896874b7 100644 --- a/simple-git/src/lib/tasks/first-commit.ts +++ b/simple-git/src/lib/tasks/first-commit.ts @@ -1,5 +1,5 @@ -import { Response, SimpleGit } from '../../../typings'; -import { SimpleGitApi } from '../simple-git-api'; +import type { Response, SimpleGit } from '../../../typings'; +import type { SimpleGitApi } from '../simple-git-api'; import { trailingFunctionArgument } from '../utils'; import { straightThroughStringTask } from './task'; diff --git a/simple-git/src/lib/tasks/grep.ts b/simple-git/src/lib/tasks/grep.ts index 1e53115f..1a9d5859 100644 --- a/simple-git/src/lib/tasks/grep.ts +++ b/simple-git/src/lib/tasks/grep.ts @@ -1,5 +1,5 @@ -import { GrepResult, SimpleGit } from '../../../typings'; -import { SimpleGitApi } from '../simple-git-api'; +import type { GrepResult, SimpleGit } from '../../../typings'; +import type { SimpleGitApi } from '../simple-git-api'; import { asNumber, forEachLineWithContent, @@ -8,7 +8,6 @@ import { prefixedArray, trailingFunctionArgument, } from '../utils'; - import { configurationErrorTask } from './task'; const disallowedOptions = ['-h']; diff --git a/simple-git/src/lib/tasks/hash-object.ts b/simple-git/src/lib/tasks/hash-object.ts index 38d1ed2a..0d36562c 100644 --- a/simple-git/src/lib/tasks/hash-object.ts +++ b/simple-git/src/lib/tasks/hash-object.ts @@ -1,5 +1,5 @@ +import type { StringTask } from '../types'; import { straightThroughStringTask } from './task'; -import { StringTask } from '../types'; /** * Task used by `git.hashObject` diff --git a/simple-git/src/lib/tasks/init.ts b/simple-git/src/lib/tasks/init.ts index 41a3a9a7..9a19d96a 100644 --- a/simple-git/src/lib/tasks/init.ts +++ b/simple-git/src/lib/tasks/init.ts @@ -1,6 +1,6 @@ -import { InitResult } from '../../../typings'; +import type { InitResult } from '../../../typings'; import { parseInit } from '../responses/InitSummary'; -import { StringTask } from '../types'; +import type { StringTask } from '../types'; const bareCommand = '--bare'; diff --git a/simple-git/src/lib/tasks/log.ts b/simple-git/src/lib/tasks/log.ts index 60a08e91..9f3084ca 100644 --- a/simple-git/src/lib/tasks/log.ts +++ b/simple-git/src/lib/tasks/log.ts @@ -7,6 +7,8 @@ import { SPLITTER, START_BOUNDARY, } from '../parsers/parse-list-log-summary'; +import type { SimpleGitApi } from '../simple-git-api'; +import type { StringTask } from '../types'; import { appendTaskOptions, asStringArray, @@ -17,10 +19,8 @@ import { trailingFunctionArgument, trailingOptionsArgument, } from '../utils'; -import { SimpleGitApi } from '../simple-git-api'; -import { configurationErrorTask } from './task'; import { validateLogFormatConfig } from './diff'; -import { StringTask } from '../types'; +import { configurationErrorTask } from './task'; enum excludeOptions { '--pretty', diff --git a/simple-git/src/lib/tasks/merge.ts b/simple-git/src/lib/tasks/merge.ts index 8e90d351..da50a40e 100644 --- a/simple-git/src/lib/tasks/merge.ts +++ b/simple-git/src/lib/tasks/merge.ts @@ -1,8 +1,8 @@ -import { MergeResult } from '../../../typings'; +import type { MergeResult } from '../../../typings'; import { GitResponseError } from '../errors/git-response-error'; import { parseMergeResult } from '../parsers/parse-merge'; -import { StringTask } from '../types'; -import { configurationErrorTask, EmptyTask } from './task'; +import type { StringTask } from '../types'; +import { configurationErrorTask, type EmptyTask } from './task'; export function mergeTask(customArgs: string[]): EmptyTask | StringTask { if (!customArgs.length) { diff --git a/simple-git/src/lib/tasks/move.ts b/simple-git/src/lib/tasks/move.ts index 69b0fd15..75ad43c2 100644 --- a/simple-git/src/lib/tasks/move.ts +++ b/simple-git/src/lib/tasks/move.ts @@ -1,6 +1,6 @@ -import { MoveResult } from '../../../typings'; +import type { MoveResult } from '../../../typings'; import { parseMoveResult } from '../parsers/parse-move'; -import { StringTask } from '../types'; +import type { StringTask } from '../types'; import { asArray } from '../utils'; export function moveTask(from: string | string[], to: string): StringTask { diff --git a/simple-git/src/lib/tasks/pull.ts b/simple-git/src/lib/tasks/pull.ts index 44a69168..91971cfa 100644 --- a/simple-git/src/lib/tasks/pull.ts +++ b/simple-git/src/lib/tasks/pull.ts @@ -1,7 +1,7 @@ -import { PullResult } from '../../../typings'; +import type { PullResult } from '../../../typings'; import { GitResponseError } from '../errors/git-response-error'; import { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull'; -import { Maybe, StringTask } from '../types'; +import type { Maybe, StringTask } from '../types'; import { bufferToString } from '../utils'; export function pullTask( diff --git a/simple-git/src/lib/tasks/push.ts b/simple-git/src/lib/tasks/push.ts index 05608d4c..cb065e0b 100644 --- a/simple-git/src/lib/tasks/push.ts +++ b/simple-git/src/lib/tasks/push.ts @@ -1,6 +1,6 @@ -import { PushResult } from '../../../typings'; +import type { PushResult } from '../../../typings'; import { parsePushResult as parser } from '../parsers/parse-push'; -import { StringTask } from '../types'; +import type { StringTask } from '../types'; import { append, remove } from '../utils'; type PushRef = { remote?: string; branch?: string }; diff --git a/simple-git/src/lib/tasks/show.ts b/simple-git/src/lib/tasks/show.ts index 36268f49..d95da867 100644 --- a/simple-git/src/lib/tasks/show.ts +++ b/simple-git/src/lib/tasks/show.ts @@ -1,5 +1,5 @@ -import { SimpleGit } from '../../../typings'; -import { SimpleGitApi } from '../simple-git-api'; +import type { SimpleGit } from '../../../typings'; +import type { SimpleGitApi } from '../simple-git-api'; import { getTrailingOptions, trailingFunctionArgument } from '../utils'; import { straightThroughBufferTask, straightThroughStringTask } from './task'; diff --git a/simple-git/src/lib/tasks/stash-list.ts b/simple-git/src/lib/tasks/stash-list.ts index 423dbeb4..b384b538 100644 --- a/simple-git/src/lib/tasks/stash-list.ts +++ b/simple-git/src/lib/tasks/stash-list.ts @@ -1,4 +1,4 @@ -import { LogOptions, LogResult } from '../../../typings'; +import type { LogOptions, LogResult } from '../../../typings'; import { logFormatFromCommand } from '../args/log-format'; import { createListLogSummaryParser } from '../parsers/parse-list-log-summary'; import type { StringTask } from '../types'; diff --git a/simple-git/src/lib/tasks/status.ts b/simple-git/src/lib/tasks/status.ts index 2af08c9f..04e219be 100644 --- a/simple-git/src/lib/tasks/status.ts +++ b/simple-git/src/lib/tasks/status.ts @@ -1,6 +1,6 @@ -import { StatusResult } from '../../../typings'; +import type { StatusResult } from '../../../typings'; import { parseStatusSummary } from '../responses/StatusSummary'; -import { StringTask } from '../types'; +import type { StringTask } from '../types'; const ignoredOptions = ['--null', '-z']; diff --git a/simple-git/src/lib/tasks/sub-module.ts b/simple-git/src/lib/tasks/sub-module.ts index b276add0..19a7ab54 100644 --- a/simple-git/src/lib/tasks/sub-module.ts +++ b/simple-git/src/lib/tasks/sub-module.ts @@ -1,4 +1,4 @@ -import { StringTask } from '../types'; +import type { StringTask } from '../types'; import { straightThroughStringTask } from './task'; export function addSubModuleTask(repo: string, path: string): StringTask { diff --git a/simple-git/src/lib/tasks/tag.ts b/simple-git/src/lib/tasks/tag.ts index 2c6848aa..95903c82 100644 --- a/simple-git/src/lib/tasks/tag.ts +++ b/simple-git/src/lib/tasks/tag.ts @@ -1,6 +1,6 @@ -import { TagResult } from '../../../typings'; +import type { TagResult } from '../../../typings'; import { parseTagList } from '../responses/TagList'; -import { StringTask } from '../types'; +import type { StringTask } from '../types'; /** * Task used by `git.tags` diff --git a/simple-git/src/lib/tasks/version.ts b/simple-git/src/lib/tasks/version.ts index 0b9a87dc..081e9825 100644 --- a/simple-git/src/lib/tasks/version.ts +++ b/simple-git/src/lib/tasks/version.ts @@ -1,5 +1,5 @@ -import type { SimpleGitApi } from '../simple-git-api'; import type { SimpleGit } from '../../../typings'; +import type { SimpleGitApi } from '../simple-git-api'; import { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils'; export interface VersionResult { diff --git a/simple-git/src/lib/types/handlers.ts b/simple-git/src/lib/types/handlers.ts index a37c1359..cc10ce0e 100644 --- a/simple-git/src/lib/types/handlers.ts +++ b/simple-git/src/lib/types/handlers.ts @@ -1,4 +1,4 @@ -import { GitError } from '../errors/git-error'; +import type { GitError } from '../errors/git-error'; /** * The node-style callback to a task accepts either two arguments with the first as a null diff --git a/simple-git/src/lib/types/index.ts b/simple-git/src/lib/types/index.ts index 0842bb89..7810c8f3 100644 --- a/simple-git/src/lib/types/index.ts +++ b/simple-git/src/lib/types/index.ts @@ -1,7 +1,7 @@ import type { SpawnOptions } from 'child_process'; -import type { SimpleGitTask } from './tasks'; import type { SimpleGitProgressEvent } from './handlers'; +import type { SimpleGitTask } from './tasks'; export * from './handlers'; export * from './tasks'; @@ -137,7 +137,7 @@ export interface SimpleGitPluginConfig { allowUnsafeCustomBinary?: boolean; /** - * By default `simple-git` prevents the use of inline configuration + * By default, `simple-git` prevents the use of inline configuration * options to override the protocols available for the `git` child * process to prevent accidental security vulnerabilities when * unsanitised user data is passed directly into operations such as @@ -156,6 +156,30 @@ export interface SimpleGitPluginConfig { * Enable this override to permit the use of these arguments. */ allowUnsafePack?: boolean; + + /** + * Using a `-c` switch to enable custom SSH commands opens up a potential + * attack vector for running arbitrary commands. + */ + allowUnsafeSshCommand?: boolean; + + /** + * Using a `-c` switch to enable custom proxy command for the `git://` transport + * exposes and attack vector for running arbitrary commands. + */ + allowUnsafeGitProxy?: boolean; + + /** + * Using a `-c` switch to enable custom hooks path commands to be run automatically + * exposes and attack vector for running arbitrary commands. + */ + allowUnsafeHooksPath?: boolean; + + /** + * Using a `-c` switch to enable setting binary for processing diffs + * exposes and attack vector for running arbitrary commands. + */ + allowUnsafeDiffExternal?: boolean; }; } diff --git a/simple-git/src/lib/types/tasks.ts b/simple-git/src/lib/types/tasks.ts index d168bd35..34eb26d5 100644 --- a/simple-git/src/lib/types/tasks.ts +++ b/simple-git/src/lib/types/tasks.ts @@ -1,5 +1,5 @@ -import { GitExecutorResult, SimpleGitExecutor } from './index'; -import { EmptyTask } from '../tasks/task'; +import type { EmptyTask } from '../tasks/task'; +import type { GitExecutorResult, SimpleGitExecutor } from './index'; export type TaskResponseFormat = Buffer | string; diff --git a/simple-git/src/lib/utils/argument-filters.ts b/simple-git/src/lib/utils/argument-filters.ts index da1c6661..6e62ad86 100644 --- a/simple-git/src/lib/utils/argument-filters.ts +++ b/simple-git/src/lib/utils/argument-filters.ts @@ -39,7 +39,7 @@ export const filterNumber: ArgumentFilterPredicate = (input: unknown): i }; export const filterString: ArgumentFilterPredicate = (input: unknown): input is string => { - return typeof input === 'string'; + return typeof input === 'string' || isPathSpec(input); }; export const filterStringOrStringArray: ArgumentFilterPredicate = ( diff --git a/simple-git/src/lib/utils/git-output-streams.ts b/simple-git/src/lib/utils/git-output-streams.ts index 12bcff7e..9b418120 100644 --- a/simple-git/src/lib/utils/git-output-streams.ts +++ b/simple-git/src/lib/utils/git-output-streams.ts @@ -1,4 +1,4 @@ -import { TaskResponseFormat } from '../types'; +import type { TaskResponseFormat } from '../types'; export class GitOutputStreams { constructor( diff --git a/simple-git/src/lib/utils/simple-git-options.ts b/simple-git/src/lib/utils/simple-git-options.ts index 480932f3..ab802c8f 100644 --- a/simple-git/src/lib/utils/simple-git-options.ts +++ b/simple-git/src/lib/utils/simple-git-options.ts @@ -1,4 +1,4 @@ -import { SimpleGitOptions } from '../types'; +import type { SimpleGitOptions } from '../types'; const defaultOptions: Omit = { binary: 'git', diff --git a/simple-git/src/lib/utils/task-options.ts b/simple-git/src/lib/utils/task-options.ts index 6e69c99f..188b4cec 100644 --- a/simple-git/src/lib/utils/task-options.ts +++ b/simple-git/src/lib/utils/task-options.ts @@ -1,3 +1,5 @@ +import { isPathSpec } from '../args/pathspec'; +import type { Maybe, Options } from '../types'; import { filterArray, filterFunction, @@ -6,8 +8,6 @@ import { filterType, } from './argument-filters'; import { asFunction, asStringArray, isUserFunction, last } from './util'; -import { Maybe, Options } from '../types'; -import { isPathSpec } from '../args/pathspec'; export function appendTaskOptions( options: Maybe, diff --git a/simple-git/src/lib/utils/task-parser.ts b/simple-git/src/lib/utils/task-parser.ts index d2151c6e..cfdb3689 100644 --- a/simple-git/src/lib/utils/task-parser.ts +++ b/simple-git/src/lib/utils/task-parser.ts @@ -1,6 +1,6 @@ import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types'; -import { GitOutputStreams } from './git-output-streams'; -import { LineParser } from './line-parser'; +import type { GitOutputStreams } from './git-output-streams'; +import type { LineParser } from './line-parser'; import { asArray, toLinesWithContent } from './util'; export function callTaskParser( diff --git a/simple-git/src/lib/utils/util.ts b/simple-git/src/lib/utils/util.ts index 4e60bdf3..95c0650b 100644 --- a/simple-git/src/lib/utils/util.ts +++ b/simple-git/src/lib/utils/util.ts @@ -1,5 +1,7 @@ import { Buffer } from 'node:buffer'; + import { exists, FOLDER } from '@kwsites/file-exists'; + import type { Maybe } from '../types'; import { filterHasLength } from './argument-filters'; @@ -24,7 +26,7 @@ export function asFunction(source: T | unknown): Callable { * Determines whether the supplied argument is both a function, and is not * the `NOOP` function. */ -export function isUserFunction(source: T | unknown): source is T { +export function isUserFunction(source: T | unknown): source is T { return typeof source === 'function' && source !== NOOP; } @@ -98,9 +100,9 @@ export function append(target: T[] | Set, item: T): typeof item { /** * Adds `item` into the `target` `Array` when it is not already present and returns the `target`. */ -export function including(target: T[], item: T): typeof target { +export function including(target: T[], item: T, at?: number): typeof target { if (Array.isArray(target) && !target.includes(item)) { - target.push(item); + target.splice(Math.max(Math.min(at ?? target.length, target.length), 0), 0, item); } return target; diff --git a/simple-git/test/integration/add.spec.ts b/simple-git/test/integration/add.spec.ts index aaaf0417..0124e5e1 100644 --- a/simple-git/test/integration/add.spec.ts +++ b/simple-git/test/integration/add.spec.ts @@ -2,8 +2,8 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('add', () => { diff --git a/simple-git/test/integration/bad-initial-path.spec.ts b/simple-git/test/integration/bad-initial-path.spec.ts index 155612ee..a8b59044 100644 --- a/simple-git/test/integration/bad-initial-path.spec.ts +++ b/simple-git/test/integration/bad-initial-path.spec.ts @@ -3,7 +3,7 @@ import { createTestContext, like, newSimpleGit, - SimpleGitTestContext, + type SimpleGitTestContext, } from '@simple-git/test-utils'; import { GitConstructError } from '../..'; diff --git a/simple-git/test/integration/branches-show-current.spec.ts b/simple-git/test/integration/branches-show-current.spec.ts index 958288c8..c76b7a39 100644 --- a/simple-git/test/integration/branches-show-current.spec.ts +++ b/simple-git/test/integration/branches-show-current.spec.ts @@ -1,4 +1,4 @@ -import { createTestContext, like, setUpFilesAdded, setUpInit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { createTestContext, like, type SimpleGitTestContext, setUpFilesAdded, setUpInit } from '@simple-git/test-utils'; describe('branch-show-current', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/branches.spec.ts b/simple-git/test/integration/branches.spec.ts index 6f05c2bc..523ee861 100644 --- a/simple-git/test/integration/branches.spec.ts +++ b/simple-git/test/integration/branches.spec.ts @@ -4,8 +4,8 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('branches', () => { @@ -28,7 +28,7 @@ describe('branches', () => { it('reports the current branch detail', async () => { const git = newSimpleGit(context.root); - let actual = await git.branch(); + const actual = await git.branch(); expect(actual).toEqual( like({ all: ['alpha', 'beta', 'master'], diff --git a/simple-git/test/integration/broken-chains.spec.ts b/simple-git/test/integration/broken-chains.spec.ts index 8a9faaef..cf617ae8 100644 --- a/simple-git/test/integration/broken-chains.spec.ts +++ b/simple-git/test/integration/broken-chains.spec.ts @@ -3,9 +3,10 @@ import { assertGitError, createTestContext, newSimpleGit, - SimpleGitTestContext, + type SimpleGitTestContext, } from '@simple-git/test-utils'; -import { SimpleGit } from '../../typings'; + +import type { SimpleGit } from '../../typings'; /* The broken chains test assures the behaviour of both standard and Promise wrapped versions diff --git a/simple-git/test/integration/change-directory.spec.ts b/simple-git/test/integration/change-directory.spec.ts index 136202aa..eb36387e 100644 --- a/simple-git/test/integration/change-directory.spec.ts +++ b/simple-git/test/integration/change-directory.spec.ts @@ -3,10 +3,11 @@ import { assertGitError, createTestContext, newSimpleGit, - SimpleGitTestContext, + type SimpleGitTestContext, wait, } from '@simple-git/test-utils'; -import { SimpleGit } from '../../typings'; + +import type { SimpleGit } from '../../typings'; describe('change-directory', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/check-ignore.win32.spec.ts b/simple-git/test/integration/check-ignore.win32.spec.ts index 5499443a..1f46e589 100644 --- a/simple-git/test/integration/check-ignore.win32.spec.ts +++ b/simple-git/test/integration/check-ignore.win32.spec.ts @@ -1,6 +1,7 @@ -import { createTestContext, setUpIgnored, setUpInit, SimpleGitTestContext } from '@simple-git/test-utils'; import { join } from 'node:path'; +import { createTestContext, type SimpleGitTestContext, setUpIgnored, setUpInit } from '@simple-git/test-utils'; + describe('checkIgnore', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/check-is-repo.spec.ts b/simple-git/test/integration/check-is-repo.spec.ts index 4bf5fbee..b4a72ded 100644 --- a/simple-git/test/integration/check-is-repo.spec.ts +++ b/simple-git/test/integration/check-is-repo.spec.ts @@ -2,7 +2,7 @@ import { assertGitError, createTestContext, newSimpleGit, - SimpleGitTestContext, + type SimpleGitTestContext, } from '@simple-git/test-utils'; import { CheckRepoActions } from '../../src/lib/tasks/check-is-repo'; diff --git a/simple-git/test/integration/checkout.spec.ts b/simple-git/test/integration/checkout.spec.ts index 8812e339..8946076a 100644 --- a/simple-git/test/integration/checkout.spec.ts +++ b/simple-git/test/integration/checkout.spec.ts @@ -1,11 +1,12 @@ +import { promiseError } from '@kwsites/promise-result'; import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; -import { SimpleGit } from '../../typings'; -import { promiseError } from '@kwsites/promise-result'; + +import type { SimpleGit } from '../../typings'; describe('checkout', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/clean.spec.ts b/simple-git/test/integration/clean.spec.ts index 79e9ff35..e7f3469d 100644 --- a/simple-git/test/integration/clean.spec.ts +++ b/simple-git/test/integration/clean.spec.ts @@ -4,9 +4,9 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; import { CleanOptions } from '../../src/lib/tasks/clean'; diff --git a/simple-git/test/integration/commit.spec.ts b/simple-git/test/integration/commit.spec.ts index 6f0f2838..a17a73f2 100644 --- a/simple-git/test/integration/commit.spec.ts +++ b/simple-git/test/integration/commit.spec.ts @@ -1,8 +1,8 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('commit', () => { diff --git a/simple-git/test/integration/concurrent-commands.spec.ts b/simple-git/test/integration/concurrent-commands.spec.ts index a2cce2df..a9f4a868 100644 --- a/simple-git/test/integration/concurrent-commands.spec.ts +++ b/simple-git/test/integration/concurrent-commands.spec.ts @@ -1,9 +1,9 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('concurrent commands', () => { diff --git a/simple-git/test/integration/config.spec.ts b/simple-git/test/integration/config.spec.ts index d0468033..78e08805 100644 --- a/simple-git/test/integration/config.spec.ts +++ b/simple-git/test/integration/config.spec.ts @@ -1,11 +1,12 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; + import { GitConfigScope } from '../..'; -import { SimpleGit } from '../../typings'; +import type { SimpleGit } from '../../typings'; describe('config', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/diff.spec.ts b/simple-git/test/integration/diff.spec.ts index 6aee0ada..e6377959 100644 --- a/simple-git/test/integration/diff.spec.ts +++ b/simple-git/test/integration/diff.spec.ts @@ -2,9 +2,9 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('diff', function () { diff --git a/simple-git/test/integration/exec.spec.ts b/simple-git/test/integration/exec.spec.ts index 6c7b0f6f..ec2f9766 100644 --- a/simple-git/test/integration/exec.spec.ts +++ b/simple-git/test/integration/exec.spec.ts @@ -1,4 +1,4 @@ -import { createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; describe('exec', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/fetch.spec.ts b/simple-git/test/integration/fetch.spec.ts index 964ae06d..3c84887c 100644 --- a/simple-git/test/integration/fetch.spec.ts +++ b/simple-git/test/integration/fetch.spec.ts @@ -1,8 +1,8 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('fetch', () => { diff --git a/simple-git/test/integration/grep.spec.ts b/simple-git/test/integration/grep.spec.ts index 496aebd5..5a3d4543 100644 --- a/simple-git/test/integration/grep.spec.ts +++ b/simple-git/test/integration/grep.spec.ts @@ -1,4 +1,5 @@ -import { createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; + import { grepQueryBuilder } from '../..'; import { pathspec } from '../../src/lib/args/pathspec'; diff --git a/simple-git/test/integration/log-name-status.spec.ts b/simple-git/test/integration/log-name-status.spec.ts index 0e9be3d5..ef5ef4b4 100644 --- a/simple-git/test/integration/log-name-status.spec.ts +++ b/simple-git/test/integration/log-name-status.spec.ts @@ -2,12 +2,12 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; -import { DiffNameStatus, DiffResultTextFile } from '../..'; +import { DiffNameStatus, type DiffResultTextFile } from '../..'; describe('log-name-status', function () { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/log-numstat.spec.ts b/simple-git/test/integration/log-numstat.spec.ts index 983b3cfb..831a6f2a 100644 --- a/simple-git/test/integration/log-numstat.spec.ts +++ b/simple-git/test/integration/log-numstat.spec.ts @@ -20,7 +20,8 @@ describe('log-numstat', function () { ae: '%ae', }, '--all': null, - '--since': '2025-01-01', + '--since': '2025-12-01', + '--until': '2025-12-31', '--numstat': null, }); diff --git a/simple-git/test/integration/log.spec.ts b/simple-git/test/integration/log.spec.ts index 2a57ae7e..0ae8c753 100644 --- a/simple-git/test/integration/log.spec.ts +++ b/simple-git/test/integration/log.spec.ts @@ -5,10 +5,11 @@ import { GIT_USER_NAME, like, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; + import type { DiffResultTextFile } from '../../typings'; describe('log', () => { diff --git a/simple-git/test/integration/merge-integration.spec.ts b/simple-git/test/integration/merge-integration.spec.ts index e7560108..c75e97f3 100644 --- a/simple-git/test/integration/merge-integration.spec.ts +++ b/simple-git/test/integration/merge-integration.spec.ts @@ -1,4 +1,3 @@ -import { GitResponseError, MergeResult, SimpleGit } from '../../typings'; import { promiseError } from '@kwsites/promise-result'; import { assertGitError, @@ -8,11 +7,13 @@ import { like, newSimpleGit, SECOND_BRANCH, + type SimpleGitTestContext, setUpConflicted, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; +import type { GitResponseError, MergeResult, SimpleGit } from '../../typings'; + describe('merge', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/output-handler.spec.ts b/simple-git/test/integration/output-handler.spec.ts index 67b66a67..05fb454a 100644 --- a/simple-git/test/integration/output-handler.spec.ts +++ b/simple-git/test/integration/output-handler.spec.ts @@ -1,4 +1,4 @@ -import { createTestContext, setUpInit, SimpleGitTestContext, wait } from '@simple-git/test-utils'; +import { createTestContext, type SimpleGitTestContext, setUpInit, wait } from '@simple-git/test-utils'; describe('outputHandler', function () { let context: SimpleGitTestContext; @@ -10,7 +10,7 @@ describe('outputHandler', function () { }); it('using the outputHandler to count currently running processes', async () => { - let processes = new Set(); + const processes = new Set(); const currentlyRunning = () => processes.size; const git = context.git.outputHandler((_x, stdout, stderr) => { const start = new Date(); diff --git a/simple-git/test/integration/plugin.abort.spec.ts b/simple-git/test/integration/plugin.abort.spec.ts index e2a7e898..6aac0362 100644 --- a/simple-git/test/integration/plugin.abort.spec.ts +++ b/simple-git/test/integration/plugin.abort.spec.ts @@ -4,7 +4,7 @@ import { createAbortController, createTestContext, newSimpleGit, - SimpleGitTestContext, + type SimpleGitTestContext, wait, } from '@simple-git/test-utils'; diff --git a/simple-git/test/integration/plugin.completion.spec.ts b/simple-git/test/integration/plugin.completion.spec.ts index f0fb1bb0..c35b39e3 100644 --- a/simple-git/test/integration/plugin.completion.spec.ts +++ b/simple-git/test/integration/plugin.completion.spec.ts @@ -1,5 +1,5 @@ import { promiseError } from '@kwsites/promise-result'; -import { createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; describe('progress-monitor', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/plugin.progress.spec.ts b/simple-git/test/integration/plugin.progress.spec.ts index 7430ad44..d819e59c 100644 --- a/simple-git/test/integration/plugin.progress.spec.ts +++ b/simple-git/test/integration/plugin.progress.spec.ts @@ -1,5 +1,6 @@ -import { createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; -import { SimpleGitOptions } from '../../src/lib/types'; +import { createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; + +import type { SimpleGitOptions } from '../../src/lib/types'; describe('progress-monitor', () => { const upstream = 'https://github.com/steveukx/git-js.git'; diff --git a/simple-git/test/integration/plugin.timeout.spec.ts b/simple-git/test/integration/plugin.timeout.spec.ts index 17442747..ed022cd8 100644 --- a/simple-git/test/integration/plugin.timeout.spec.ts +++ b/simple-git/test/integration/plugin.timeout.spec.ts @@ -3,7 +3,7 @@ import { assertGitError, createTestContext, newSimpleGit, - SimpleGitTestContext, + type SimpleGitTestContext, } from '@simple-git/test-utils'; import { GitPluginError } from '../..'; diff --git a/simple-git/test/integration/plugin.unsafe.spec.ts b/simple-git/test/integration/plugin.unsafe.spec.ts index 0d7dcf39..8b8fe65e 100644 --- a/simple-git/test/integration/plugin.unsafe.spec.ts +++ b/simple-git/test/integration/plugin.unsafe.spec.ts @@ -1,7 +1,8 @@ import { join } from 'node:path'; + import { exists } from '@kwsites/file-exists'; -import { promiseError, PromiseResult, promiseResult } from '@kwsites/promise-result'; -import { assertGitError, createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { type PromiseResult, promiseError, promiseResult } from '@kwsites/promise-result'; +import { assertGitError, createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; import { GitPluginError } from '../..'; diff --git a/simple-git/test/integration/promise-from-root.spec.ts b/simple-git/test/integration/promise-from-root.spec.ts index 314727c3..ba43aa76 100644 --- a/simple-git/test/integration/promise-from-root.spec.ts +++ b/simple-git/test/integration/promise-from-root.spec.ts @@ -1,4 +1,4 @@ -import { createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; describe('promises-from-root', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/promise.spec.ts b/simple-git/test/integration/promise.spec.ts index bfd4a618..68dc0d48 100644 --- a/simple-git/test/integration/promise.spec.ts +++ b/simple-git/test/integration/promise.spec.ts @@ -1,8 +1,8 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; import { InitSummary } from '../../src/lib/responses/InitSummary'; @@ -56,9 +56,7 @@ describe('promise', () => { }); it('awaits the returned task', async () => { - let init, - status, - callbacks = { + const callbacks = { init: jest.fn(), initNested: jest.fn(), status: jest.fn(), @@ -68,8 +66,8 @@ describe('promise', () => { expect(git).not.toHaveProperty('then'); expect(git).not.toHaveProperty('catch'); - init = git.init(); - status = init.status(); + const init = git.init(); + const status = init.status(); assertArePromises(init, status); diff --git a/simple-git/test/integration/pull-fails-ff.spec.ts b/simple-git/test/integration/pull-fails-ff.spec.ts index 0ba22a9e..f4fabf37 100644 --- a/simple-git/test/integration/pull-fails-ff.spec.ts +++ b/simple-git/test/integration/pull-fails-ff.spec.ts @@ -1,13 +1,14 @@ import { promiseError } from '@kwsites/promise-result'; -import { GitResponseError, PullFailedResult } from '../../typings'; import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; +import type { GitResponseError, PullFailedResult } from '../../typings'; + describe('pull --ff-only', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/integration/remote.spec.ts b/simple-git/test/integration/remote.spec.ts index 0e61c829..38a43dfa 100644 --- a/simple-git/test/integration/remote.spec.ts +++ b/simple-git/test/integration/remote.spec.ts @@ -1,14 +1,14 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('remote', () => { let context: SimpleGitTestContext; - let REMOTE_URL_ROOT = 'https://github.com/steveukx'; - let REMOTE_URL = `${REMOTE_URL_ROOT}/git-js.git`; + const REMOTE_URL_ROOT = 'https://github.com/steveukx'; + const REMOTE_URL = `${REMOTE_URL_ROOT}/git-js.git`; beforeEach(async () => (context = await createTestContext())); beforeEach(async () => { @@ -29,9 +29,9 @@ describe('remote', () => { it('allows setting the remote url', async () => { const git = newSimpleGit(context.root); - let repoName = 'origin'; - let initialRemoteRepo = `${REMOTE_URL_ROOT}/initial.git`; - let updatedRemoteRepo = `${REMOTE_URL_ROOT}/updated.git`; + const repoName = 'origin'; + const initialRemoteRepo = `${REMOTE_URL_ROOT}/initial.git`; + const updatedRemoteRepo = `${REMOTE_URL_ROOT}/updated.git`; await git.addRemote(repoName, initialRemoteRepo); expect(await git.getRemotes(true)).toEqual([ diff --git a/simple-git/test/integration/reset.spec.ts b/simple-git/test/integration/reset.spec.ts index 5649978d..f1318b83 100644 --- a/simple-git/test/integration/reset.spec.ts +++ b/simple-git/test/integration/reset.spec.ts @@ -3,9 +3,9 @@ import { assertGitError, createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; import { ResetMode } from '../../src/lib/tasks/reset'; diff --git a/simple-git/test/integration/rev-parse.spec.ts b/simple-git/test/integration/rev-parse.spec.ts index 9197ba28..11867c9d 100644 --- a/simple-git/test/integration/rev-parse.spec.ts +++ b/simple-git/test/integration/rev-parse.spec.ts @@ -1,9 +1,9 @@ import { createTestContext, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('rev-parse', () => { diff --git a/simple-git/test/integration/status.spec.ts b/simple-git/test/integration/status.spec.ts index 74e12051..c30e8022 100644 --- a/simple-git/test/integration/status.spec.ts +++ b/simple-git/test/integration/status.spec.ts @@ -2,9 +2,9 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('status', () => { diff --git a/simple-git/test/integration/tag.spec.ts b/simple-git/test/integration/tag.spec.ts index f0e7f345..8b4c6827 100644 --- a/simple-git/test/integration/tag.spec.ts +++ b/simple-git/test/integration/tag.spec.ts @@ -2,9 +2,9 @@ import { createTestContext, like, newSimpleGit, + type SimpleGitTestContext, setUpFilesAdded, setUpInit, - SimpleGitTestContext, } from '@simple-git/test-utils'; describe('tag', () => { diff --git a/simple-git/test/integration/version.spec.ts b/simple-git/test/integration/version.spec.ts index 1e51a8fd..cf29ca8e 100644 --- a/simple-git/test/integration/version.spec.ts +++ b/simple-git/test/integration/version.spec.ts @@ -1,4 +1,4 @@ -import { createTestContext, newSimpleGit, SimpleGitTestContext } from '@simple-git/test-utils'; +import { createTestContext, newSimpleGit, type SimpleGitTestContext } from '@simple-git/test-utils'; describe('version', () => { let context: SimpleGitTestContext; diff --git a/simple-git/test/unit/__fixtures__/child-processes.ts b/simple-git/test/unit/__fixtures__/child-processes.ts index 70e7c7fd..6489d2d2 100644 --- a/simple-git/test/unit/__fixtures__/child-processes.ts +++ b/simple-git/test/unit/__fixtures__/child-processes.ts @@ -1,6 +1,7 @@ -import { MockChildProcess, mockChildProcessModule } from '../__mocks__/mock-child-process'; import { wait } from '@simple-git/test-utils'; +import { type MockChildProcess, mockChildProcessModule } from '../__mocks__/mock-child-process'; + const EXIT_CODE_SUCCESS = 0; const EXIT_CODE_ERROR = 1; diff --git a/simple-git/test/unit/__fixtures__/index.ts b/simple-git/test/unit/__fixtures__/index.ts index 436ee758..1059b00c 100644 --- a/simple-git/test/unit/__fixtures__/index.ts +++ b/simple-git/test/unit/__fixtures__/index.ts @@ -1,14 +1,12 @@ -export * from './debug'; -export * from './file-exists'; +export * from '@simple-git/test-utils'; export * from './child-processes'; +export * from './debug'; export * from './expectations'; - +export * from './file-exists'; export * from './responses/branch'; export * from './responses/commit'; export * from './responses/diff'; export * from './responses/merge'; export * from './responses/remote-messages'; export * from './responses/status'; - -export * from '@simple-git/test-utils'; diff --git a/simple-git/test/unit/__fixtures__/push/index.ts b/simple-git/test/unit/__fixtures__/push/index.ts index fc89591f..757317d4 100644 --- a/simple-git/test/unit/__fixtures__/push/index.ts +++ b/simple-git/test/unit/__fixtures__/push/index.ts @@ -1,6 +1,6 @@ +export * from './constants'; export * from './push-deleted-branch'; export * from './push-new-branch'; export * from './push-new-branch-remote-says-vulnerabilities'; export * from './push-new-branch-with-tags'; export * from './push-update-existing-branch'; -export * from './constants'; diff --git a/simple-git/test/unit/__fixtures__/push/push-new-branch-remote-says-vulnerabilities.ts b/simple-git/test/unit/__fixtures__/push/push-new-branch-remote-says-vulnerabilities.ts index df787f6e..5e34c165 100644 --- a/simple-git/test/unit/__fixtures__/push/push-new-branch-remote-says-vulnerabilities.ts +++ b/simple-git/test/unit/__fixtures__/push/push-new-branch-remote-says-vulnerabilities.ts @@ -1,5 +1,5 @@ -import { gitHubAlertsUrl, gitHubPullRequest } from './constants'; import { createFixture } from '../create-fixture'; +import { gitHubAlertsUrl, gitHubPullRequest } from './constants'; const stdErr = `Pushing to git@github.com:kwsites/mock-repo.git remote: diff --git a/simple-git/test/unit/__fixtures__/push/push-new-branch.ts b/simple-git/test/unit/__fixtures__/push/push-new-branch.ts index 5e44205a..e9b9aea2 100644 --- a/simple-git/test/unit/__fixtures__/push/push-new-branch.ts +++ b/simple-git/test/unit/__fixtures__/push/push-new-branch.ts @@ -1,5 +1,5 @@ -import { gitLabPullRequest } from './constants'; import { createFixture } from '../create-fixture'; +import { gitLabPullRequest } from './constants'; const stdOut = `To github.com:kwsites/mock-repo.git * refs/heads/new-branch-name-here:refs/heads/new-branch-name-here [new branch] diff --git a/simple-git/test/unit/__fixtures__/responses/status.ts b/simple-git/test/unit/__fixtures__/responses/status.ts index 0a1fc7fa..a264ba52 100644 --- a/simple-git/test/unit/__fixtures__/responses/status.ts +++ b/simple-git/test/unit/__fixtures__/responses/status.ts @@ -1,5 +1,5 @@ -import { createFixture } from '../create-fixture'; import { NULL } from '../../../../src/lib/utils'; +import { createFixture } from '../create-fixture'; export function stagedRenamed(from = 'from.ext', to = 'to.ext', workingDir = ' ') { return `R${workingDir} ${to}${NULL}${from}`; diff --git a/simple-git/test/unit/add.spec.ts b/simple-git/test/unit/add.spec.ts index 5421cb10..a74e8cfb 100644 --- a/simple-git/test/unit/add.spec.ts +++ b/simple-git/test/unit/add.spec.ts @@ -1,4 +1,4 @@ -import { SimpleGit } from '../../typings'; +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; describe('add', () => { diff --git a/simple-git/test/unit/apply-patch.spec.ts b/simple-git/test/unit/apply-patch.spec.ts index 5c33e090..5bb6b9dc 100644 --- a/simple-git/test/unit/apply-patch.spec.ts +++ b/simple-git/test/unit/apply-patch.spec.ts @@ -1,11 +1,12 @@ -import { SimpleGit, TaskOptions } from 'typings'; +import { promiseError } from '@kwsites/promise-result'; +import type { SimpleGit, TaskOptions } from 'typings'; + import { assertExecutedCommands, assertGitError, closeWithSuccess, newSimpleGit, } from './__fixtures__'; -import { promiseError } from '@kwsites/promise-result'; describe('applyPatch', () => { describe('commands', () => { diff --git a/simple-git/test/unit/branch.spec.ts b/simple-git/test/unit/branch.spec.ts index fbf8a793..40da79c1 100644 --- a/simple-git/test/unit/branch.spec.ts +++ b/simple-git/test/unit/branch.spec.ts @@ -1,4 +1,7 @@ -import { BranchSingleDeleteResult, BranchSummary, SimpleGit } from 'typings'; +import type { BranchSingleDeleteResult, BranchSummary, SimpleGit } from 'typings'; + +import { parseBranchSummary } from '../../src/lib/parsers/parse-branch'; +import { BranchSummaryResult } from '../../src/lib/responses/BranchSummary'; import { assertExecutedCommands, branchSummary, @@ -8,9 +11,6 @@ import { newSimpleGit, } from './__fixtures__'; -import { parseBranchSummary } from '../../src/lib/parsers/parse-branch'; -import { BranchSummaryResult } from '../../src/lib/responses/BranchSummary'; - describe('branch', () => { let callback: jest.Mock; let git: SimpleGit; diff --git a/simple-git/test/unit/catfile.spec.ts b/simple-git/test/unit/catfile.spec.ts index 2a3a8583..d6a9dde9 100644 --- a/simple-git/test/unit/catfile.spec.ts +++ b/simple-git/test/unit/catfile.spec.ts @@ -1,4 +1,6 @@ import { promiseError } from '@kwsites/promise-result'; + +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, assertGitError, @@ -7,7 +9,6 @@ import { closeWithSuccess, newSimpleGit, } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('catFile', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/check-ignore.spec.ts b/simple-git/test/unit/check-ignore.spec.ts index 0a7054b2..a2b3264a 100644 --- a/simple-git/test/unit/check-ignore.spec.ts +++ b/simple-git/test/unit/check-ignore.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('checkIgnore', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/check-is-repo.spec.ts b/simple-git/test/unit/check-is-repo.spec.ts index 9ff1b55e..156876f5 100644 --- a/simple-git/test/unit/check-is-repo.spec.ts +++ b/simple-git/test/unit/check-is-repo.spec.ts @@ -1,5 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; -import { SimpleGit } from 'typings'; +import type { SimpleGit } from 'typings'; + +import { CheckRepoActions } from '../../src/lib/tasks/check-is-repo'; import { assertExecutedCommands, assertGitError, @@ -8,7 +10,6 @@ import { newSimpleGit, wait, } from './__fixtures__'; -import { CheckRepoActions } from '../../src/lib/tasks/check-is-repo'; describe('checkIsRepo', () => { const EXIT_UNCLEAN = 128; diff --git a/simple-git/test/unit/checkout.spec.ts b/simple-git/test/unit/checkout.spec.ts index 0563e6f2..a84cbe5c 100644 --- a/simple-git/test/unit/checkout.spec.ts +++ b/simple-git/test/unit/checkout.spec.ts @@ -1,4 +1,5 @@ -import { SimpleGit } from 'typings'; +import type { SimpleGit } from 'typings'; + import { assertExecutedCommands, closeWithSuccess, newSimpleGit, wait } from './__fixtures__'; describe('checkout', () => { diff --git a/simple-git/test/unit/child-process.spec.ts b/simple-git/test/unit/child-process.spec.ts index 71d0fef0..038d98ee 100644 --- a/simple-git/test/unit/child-process.spec.ts +++ b/simple-git/test/unit/child-process.spec.ts @@ -1,4 +1,6 @@ import { promiseError } from '@kwsites/promise-result'; + +import type { SimpleGit } from '../../typings'; import { assertChildProcessEnvironmentVariables, assertGitError, @@ -6,7 +8,6 @@ import { closeWithSuccess, newSimpleGit, } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('child-process', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/clean.spec.ts b/simple-git/test/unit/clean.spec.ts index 2656a92e..f2d4f467 100644 --- a/simple-git/test/unit/clean.spec.ts +++ b/simple-git/test/unit/clean.spec.ts @@ -1,12 +1,4 @@ -import { SimpleGit } from 'typings'; -import { - assertExecutedCommands, - assertGitError, - assertNoExecutedTasks, - closeWithSuccess, - newSimpleGit, - wait, -} from './__fixtures__'; +import type { SimpleGit } from 'typings'; import { TaskConfigurationError } from '../..'; import { CleanResponse, cleanSummaryParser } from '../../src/lib/responses/CleanSummary'; @@ -16,6 +8,14 @@ import { CONFIG_ERROR_MODE_REQUIRED, CONFIG_ERROR_UNKNOWN_OPTION, } from '../../src/lib/tasks/clean'; +import { + assertExecutedCommands, + assertGitError, + assertNoExecutedTasks, + closeWithSuccess, + newSimpleGit, + wait, +} from './__fixtures__'; describe('clean', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/clone.spec.ts b/simple-git/test/unit/clone.spec.ts index a387f4e0..361c6765 100644 --- a/simple-git/test/unit/clone.spec.ts +++ b/simple-git/test/unit/clone.spec.ts @@ -1,5 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; -import { SimpleGit, TaskOptions } from 'typings'; +import type { SimpleGit, TaskOptions } from 'typings'; + +import { pathspec } from '../..'; import { assertExecutedCommands, assertGitError, @@ -11,32 +13,62 @@ describe('clone', () => { let git: SimpleGit; const cloneTests: [keyof SimpleGit, string, Array, string[]][] = [ - ['clone', 'with repo and local', ['repo', 'lcl'], ['clone', 'repo', 'lcl']], + ['clone', 'with repo and local', ['repo', 'lcl'], ['clone', '--', 'repo', 'lcl']], [ 'clone', 'with just repo', ['proto://remote.com/repo.git'], - ['clone', 'proto://remote.com/repo.git'], + ['clone', '--', 'proto://remote.com/repo.git'], ], [ 'clone', 'with options array', ['repo', 'lcl', ['foo', 'bar']], - ['clone', 'foo', 'bar', 'repo', 'lcl'], + ['clone', 'foo', 'bar', '--', 'repo', 'lcl'], ], [ 'clone', 'with options object', ['url', '.', { '--config': 'http.extraheader=AUTHORIZATION bearer xxxx' }], - ['clone', '--config=http.extraheader=AUTHORIZATION bearer xxxx', 'url', '.'], + ['clone', '--config=http.extraheader=AUTHORIZATION bearer xxxx', '--', 'url', '.'], ], [ 'clone', 'with array of options without local', ['repo', ['--config=http.extraheader=AUTHORIZATION bearer xxxx']], - ['clone', '--config=http.extraheader=AUTHORIZATION bearer xxxx', 'repo'], + ['clone', '--config=http.extraheader=AUTHORIZATION bearer xxxx', '--', 'repo'], + ], + ['mirror', 'explicitly set', ['r', 'l'], ['clone', '--mirror', '--', 'r', 'l']], + ['clone', 'kitchen sink', ['https://abcdefghijklmnopqrstuvwxyz01234567890.repo', 'dir', + ['--template=', '-l', '-s', '--no-hardlinks', '-q', '-n', '--bare', '--mirror', + '-o', 'alternative-origin', '-b', 'specific-branch', '--separate-git-dir', 'other-path', + '--depth', '1', '--no-single-branch', '--no-tags', '--recurse-submodules=foo', + '--no-shallow-submodules', '--no-remote-submodules', '--jobs', '2', '--sparse', + '--no-reject-shallow', '--filter=sub-path', '--also-filter-submodules']], + + ['clone', '--template=', '-l', '-s', '--no-hardlinks', '-q', '-n', '--bare', '--mirror', + '-o', 'alternative-origin', '-b', 'specific-branch', '--separate-git-dir', 'other-path', + '--depth', '1', '--no-single-branch', '--no-tags', '--recurse-submodules=foo', + '--no-shallow-submodules', '--no-remote-submodules', '--jobs', '2', '--sparse', + '--no-reject-shallow', '--filter=sub-path', '--also-filter-submodules', '--', 'https://abcdefghijklmnopqrstuvwxyz01234567890.repo', 'dir']], + + ['clone', 'when there is a pathspec in the config', + ['repo', ['--config=blah', '--', 'explicit-path']], + ['clone', '--config=blah', '--', 'explicit-path', 'repo'] ], - ['mirror', 'explicitly set', ['r', 'l'], ['clone', '--mirror', 'r', 'l']], + ['clone', 'when using single pathspec', + [pathspec('repo'), ['--config=blah', '--', 'explicit-path']], + ['clone', '--config=blah', '--', 'explicit-path', 'repo'] + ], + ['clone', 'when using one pathspec (repo)', + [pathspec('repo'), 'local', ['--config=blah']], + ['clone', '--config=blah', '--', 'repo', 'local'] + ], + ['clone', 'when using one pathspec (local)', + ['repo', pathspec('local'), ['--config=blah']], + ['clone', '--config=blah', '--', 'repo', 'local'] + ], + ]; beforeEach(() => (git = newSimpleGit())); @@ -63,7 +95,7 @@ describe('clone', () => { it('disallows upload-pack as remote/branch', async () => { const error = await promiseError(git.clone('origin', '--upload-pack=touch ./foo')); - assertGitError(error, 'potential exploit argument blocked'); + assertGitError(error, 'allowUnsafePack'); }); it('disallows upload-pack as varargs', async () => { @@ -73,7 +105,7 @@ describe('clone', () => { }) ); - assertGitError(error, 'potential exploit argument blocked'); + assertGitError(error, 'allowUnsafePack'); }); it('disallows upload-pack as varargs', async () => { @@ -81,7 +113,7 @@ describe('clone', () => { git.clone('origin', 'main', ['--upload-pack', 'touch ./foo']) ); - assertGitError(error, 'potential exploit argument blocked'); + assertGitError(error, 'allowUnsafePack'); }); }); }); diff --git a/simple-git/test/unit/commit.spec.ts b/simple-git/test/unit/commit.spec.ts index 7823a5c5..c3224183 100644 --- a/simple-git/test/unit/commit.spec.ts +++ b/simple-git/test/unit/commit.spec.ts @@ -1,4 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; + +import { type SimpleGit, TaskConfigurationError } from '../..'; +import { parseCommitResult } from '../../src/lib/parsers/parse-commit'; import { assertExecutedCommands, assertGitError, @@ -10,8 +13,6 @@ import { like, newSimpleGit, } from './__fixtures__'; -import { SimpleGit, TaskConfigurationError } from '../..'; -import { parseCommitResult } from '../../src/lib/parsers/parse-commit'; describe('commit', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/config.spec.ts b/simple-git/test/unit/config.spec.ts index 8085b54a..1d250314 100644 --- a/simple-git/test/unit/config.spec.ts +++ b/simple-git/test/unit/config.spec.ts @@ -1,7 +1,8 @@ -import { SimpleGit } from 'typings'; -import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; +import type { SimpleGit } from 'typings'; + import { GitConfigScope } from '../..'; import { configListParser } from '../../src/lib/responses/ConfigList'; +import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; describe('config list parser', () => { const NULL = '\0'; diff --git a/simple-git/test/unit/count-objects.spec.ts b/simple-git/test/unit/count-objects.spec.ts index 07eb6fef..e8595a7d 100644 --- a/simple-git/test/unit/count-objects.spec.ts +++ b/simple-git/test/unit/count-objects.spec.ts @@ -1,5 +1,5 @@ +import type { CountObjectsResult } from '../../typings'; import { closeWithSuccess, like, newSimpleGit } from './__fixtures__'; -import { CountObjectsResult } from '../../typings'; const COUNT_OBJ_RESPONSE = ` count: 323 diff --git a/simple-git/test/unit/cwd.spec.ts b/simple-git/test/unit/cwd.spec.ts index e89fe55b..d8ac8c02 100644 --- a/simple-git/test/unit/cwd.spec.ts +++ b/simple-git/test/unit/cwd.spec.ts @@ -1,4 +1,5 @@ -import { SimpleGit } from 'typings'; +import type { SimpleGit } from 'typings'; + import { assertNoExecutedTasks, isInvalidDirectory, diff --git a/simple-git/test/unit/diff.spec.ts b/simple-git/test/unit/diff.spec.ts index eaab3687..126ad011 100644 --- a/simple-git/test/unit/diff.spec.ts +++ b/simple-git/test/unit/diff.spec.ts @@ -1,4 +1,8 @@ import { promiseError } from '@kwsites/promise-result'; + +import { type SimpleGit, TaskConfigurationError } from '../..'; +import { LogFormat } from '../../src/lib/args/log-format'; +import { getDiffParser } from '../../src/lib/parsers/parse-diff-summary'; import { assertExecutedCommands, assertGitError, @@ -9,9 +13,6 @@ import { newSimpleGit, wait, } from './__fixtures__'; -import { SimpleGit, TaskConfigurationError } from '../..'; -import { LogFormat } from '../../src/lib/args/log-format'; -import { getDiffParser } from '../../src/lib/parsers/parse-diff-summary'; describe('diff', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/fetch.spec.ts b/simple-git/test/unit/fetch.spec.ts index 497e7447..62fbd83d 100644 --- a/simple-git/test/unit/fetch.spec.ts +++ b/simple-git/test/unit/fetch.spec.ts @@ -1,4 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; + +import { parseFetchResult } from '../../src/lib/parsers/parse-fetch'; +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, assertGitError, @@ -6,8 +9,6 @@ import { like, newSimpleGit, } from './__fixtures__'; -import { SimpleGit } from '../../typings'; -import { parseFetchResult } from '../../src/lib/parsers/parse-fetch'; describe('fetch', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/git-executor.spec.ts b/simple-git/test/unit/git-executor.spec.ts index 96e8e458..8e159eed 100644 --- a/simple-git/test/unit/git-executor.spec.ts +++ b/simple-git/test/unit/git-executor.spec.ts @@ -1,5 +1,6 @@ +import type { SimpleGit } from 'typings'; + import { newSimpleGit, wait } from './__fixtures__'; -import { SimpleGit } from 'typings'; import { mockChildProcessModule } from './__mocks__/mock-child-process'; async function withStdOut() { diff --git a/simple-git/test/unit/git.spec.ts b/simple-git/test/unit/git.spec.ts index 242044c8..2800a682 100644 --- a/simple-git/test/unit/git.spec.ts +++ b/simple-git/test/unit/git.spec.ts @@ -1,4 +1,7 @@ -import { SimpleGit } from 'typings'; +import type { SimpleGit } from 'typings'; + +import { GitResponseError } from '../..'; +import { createInstanceConfig } from '../../src/lib/utils'; import { autoMergeConflict, autoMergeResponse, @@ -9,9 +12,6 @@ import { wait, } from './__fixtures__'; -import { GitResponseError } from '../..'; -import { createInstanceConfig } from '../../src/lib/utils'; - describe('git', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/grep.spec.ts b/simple-git/test/unit/grep.spec.ts index ec74b5c5..eee6999b 100644 --- a/simple-git/test/unit/grep.spec.ts +++ b/simple-git/test/unit/grep.spec.ts @@ -1,5 +1,8 @@ import { promiseError } from '@kwsites/promise-result'; +import { grepQueryBuilder, TaskConfigurationError } from '../..'; +import { pathspec } from '../../src/lib/args/pathspec'; +import { NULL } from '../../src/lib/utils'; import { assertExecutedCommands, assertGitError, @@ -7,10 +10,6 @@ import { newSimpleGit, } from './__fixtures__'; -import { grepQueryBuilder, TaskConfigurationError } from '../..'; -import { NULL } from '../../src/lib/utils'; -import { pathspec } from '../../src/lib/args/pathspec'; - describe('grep', () => { describe('grepQueryBuilder', () => { it('-e NODE -e Unexpected', () => { @@ -23,7 +22,7 @@ describe('grep', () => { }); it('-e #define --and ( -e MAX_PATH -e PATH_MAX )', () => { - let query = grepQueryBuilder('#define').and('MAX_PATH', 'PATH_MAX'); + const query = grepQueryBuilder('#define').and('MAX_PATH', 'PATH_MAX'); expect(Array.from(query)).toEqual([ '-e', diff --git a/simple-git/test/unit/hash-object.spec.ts b/simple-git/test/unit/hash-object.spec.ts index 6cb2b6d1..2946cc0c 100644 --- a/simple-git/test/unit/hash-object.spec.ts +++ b/simple-git/test/unit/hash-object.spec.ts @@ -1,4 +1,5 @@ -import { SimpleGit } from 'typings'; +import type { SimpleGit } from 'typings'; + import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; describe('hash-object', () => { diff --git a/simple-git/test/unit/init.spec.ts b/simple-git/test/unit/init.spec.ts index 173aa180..cb79adb8 100644 --- a/simple-git/test/unit/init.spec.ts +++ b/simple-git/test/unit/init.spec.ts @@ -1,6 +1,7 @@ -import { InitResult, SimpleGit } from 'typings'; -import { assertExecutedCommands, closeWithSuccess, newSimpleGit, wait } from './__fixtures__'; +import type { InitResult, SimpleGit } from 'typings'; + import { InitSummary } from '../../src/lib/responses/InitSummary'; +import { assertExecutedCommands, closeWithSuccess, newSimpleGit, wait } from './__fixtures__'; describe('init', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/log.spec.ts b/simple-git/test/unit/log.spec.ts index 4c3bd04a..2fff80bd 100644 --- a/simple-git/test/unit/log.spec.ts +++ b/simple-git/test/unit/log.spec.ts @@ -1,5 +1,13 @@ import { promiseError } from '@kwsites/promise-result'; import type { LogResult, SimpleGit } from 'typings'; + +import { pathspec, TaskConfigurationError } from '../..'; +import { + COMMIT_BOUNDARY, + createListLogSummaryParser, + SPLITTER, + START_BOUNDARY, +} from '../../src/lib/parsers/parse-list-log-summary'; import { assertExecutedCommands, assertExecutedCommandsContains, @@ -9,13 +17,6 @@ import { like, newSimpleGit, } from './__fixtures__'; -import { TaskConfigurationError, pathspec } from '../..'; -import { - COMMIT_BOUNDARY, - createListLogSummaryParser, - SPLITTER, - START_BOUNDARY, -} from '../../src/lib/parsers/parse-list-log-summary'; describe('log', () => { let git: SimpleGit; @@ -96,7 +97,7 @@ describe('log', () => { '--stat=4096' ); - let actual = await task; + const actual = await task; expect(actual).toEqual( like({ total: 1, diff --git a/simple-git/test/unit/logging.spec.ts b/simple-git/test/unit/logging.spec.ts index f53334bf..29a60e7a 100644 --- a/simple-git/test/unit/logging.spec.ts +++ b/simple-git/test/unit/logging.spec.ts @@ -1,3 +1,6 @@ +import debug from 'debug'; + +import { TasksPendingQueue } from '../../src/lib/runners/tasks-pending-queue'; import { $logMessagesFor, $logNames, @@ -5,9 +8,6 @@ import { closeWithSuccess, newSimpleGit, } from './__fixtures__'; -import { TasksPendingQueue } from '../../src/lib/runners/tasks-pending-queue'; - -import debug from 'debug'; describe('logging', () => { afterEach(() => ((TasksPendingQueue as any).counter = 0)); diff --git a/simple-git/test/unit/merge.spec.ts b/simple-git/test/unit/merge.spec.ts index 7c3f85d5..e98a3cdd 100644 --- a/simple-git/test/unit/merge.spec.ts +++ b/simple-git/test/unit/merge.spec.ts @@ -1,4 +1,9 @@ import { promiseError } from '@kwsites/promise-result'; +import type { MergeResult, SimpleGit, SimpleGitTaskCallback } from 'typings'; + +import { TaskConfigurationError } from '../..'; +import { parseMergeResult } from '../../src/lib/parsers/parse-merge'; +import { MergeSummaryDetail } from '../../src/lib/responses/MergeSummary'; import { assertExecutedCommands, assertGitError, @@ -10,11 +15,6 @@ import { newSimpleGit, wait, } from './__fixtures__'; -import { MergeResult, SimpleGit, SimpleGitTaskCallback } from 'typings'; -import { MergeSummaryDetail } from '../../src/lib/responses/MergeSummary'; -import { parseMergeResult } from '../../src/lib/parsers/parse-merge'; - -import { TaskConfigurationError } from '../..'; describe('merge', () => { describe('api', () => { diff --git a/simple-git/test/unit/mv.spec.ts b/simple-git/test/unit/mv.spec.ts index 7f32cd69..6e611672 100644 --- a/simple-git/test/unit/mv.spec.ts +++ b/simple-git/test/unit/mv.spec.ts @@ -1,6 +1,6 @@ -import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; import { parseMoveResult } from '../../src/lib/parsers/parse-move'; +import type { SimpleGit } from '../../typings'; +import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; const renaming = (from: string, to: string) => `Renaming ${from} to ${to}`; diff --git a/simple-git/test/unit/output-handler.spec.ts b/simple-git/test/unit/output-handler.spec.ts index 47316946..5c3a315b 100644 --- a/simple-git/test/unit/output-handler.spec.ts +++ b/simple-git/test/unit/output-handler.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('outputHandler', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/plugins/plugin.abort.spec.ts b/simple-git/test/unit/plugins/plugin.abort.spec.ts index c7bceb56..86fdb52a 100644 --- a/simple-git/test/unit/plugins/plugin.abort.spec.ts +++ b/simple-git/test/unit/plugins/plugin.abort.spec.ts @@ -1,4 +1,6 @@ import { promiseError } from '@kwsites/promise-result'; + +import { GitPluginError } from '../../..'; import { assertExecutedTasksCount, assertGitError, @@ -6,7 +8,6 @@ import { newSimpleGit, wait, } from '../__fixtures__'; -import { GitPluginError } from '../../..'; describe('plugin.abort', function () { it('aborts an active child process', async () => { diff --git a/simple-git/test/unit/plugins/plugin.binary.spec.ts b/simple-git/test/unit/plugins/plugin.binary.spec.ts index d1969a15..fb7aa39b 100644 --- a/simple-git/test/unit/plugins/plugin.binary.spec.ts +++ b/simple-git/test/unit/plugins/plugin.binary.spec.ts @@ -1,4 +1,5 @@ import { promiseError } from '@kwsites/promise-result'; + import { assertGitError, closeWithSuccess, newSimpleGit } from '../__fixtures__'; import { mockChildProcessModule } from '../__mocks__/mock-child-process'; diff --git a/simple-git/test/unit/plugins/plugin.completion-detection.spec.ts b/simple-git/test/unit/plugins/plugin.completion-detection.spec.ts index 5c5e23d9..a088ed7b 100644 --- a/simple-git/test/unit/plugins/plugin.completion-detection.spec.ts +++ b/simple-git/test/unit/plugins/plugin.completion-detection.spec.ts @@ -1,5 +1,5 @@ import { newSimpleGit, theChildProcessMatching, wait } from '../__fixtures__'; -import { MockChildProcess } from '../__mocks__/mock-child-process'; +import type { MockChildProcess } from '../__mocks__/mock-child-process'; describe('completionDetectionPlugin', () => { function process(proc: MockChildProcess, data: string, close = false, exit = false) { diff --git a/simple-git/test/unit/plugins/plugin.error.spec.ts b/simple-git/test/unit/plugins/plugin.error.spec.ts index dbbcc6b4..3e20b1e6 100644 --- a/simple-git/test/unit/plugins/plugin.error.spec.ts +++ b/simple-git/test/unit/plugins/plugin.error.spec.ts @@ -1,7 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; -import { assertGitError, closeWithError, closeWithSuccess, newSimpleGit } from '../__fixtures__'; import { GitError } from '../../..'; +import { assertGitError, closeWithError, closeWithSuccess, newSimpleGit } from '../__fixtures__'; describe('errorDetectionPlugin', () => { it('can throw with custom content', async () => { diff --git a/simple-git/test/unit/plugins/plugin.pathspec.spec.ts b/simple-git/test/unit/plugins/plugin.pathspec.spec.ts index 55105c1d..01e38f2c 100644 --- a/simple-git/test/unit/plugins/plugin.pathspec.spec.ts +++ b/simple-git/test/unit/plugins/plugin.pathspec.spec.ts @@ -1,12 +1,35 @@ -import { SimpleGit } from '../../../typings'; +import { insertBeforePathsIndex, pathspec } from '../../../src/lib/args/pathspec'; +import type { SimpleGit } from '../../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from '../__fixtures__'; -import { pathspec } from '../../../src/lib/args/pathspec'; -describe('suffixPathsPlugin', function () { +describe('suffixPathsPlugin', function() { let git: SimpleGit; beforeEach(() => (git = newSimpleGit())); + describe('inserts before', () => { + it('when present', () => { + expect(insertBeforePathsIndex(['a', '--', 'b'])) + .toBe(1); + }); + it('when trailing', () => { + expect(insertBeforePathsIndex(['a', 'b', '--'])) + .toBe(2); + }); + it('when leading', () => { + expect(insertBeforePathsIndex(['--', 'a', 'b'])) + .toBe(0); + }); + it('when double', () => { + expect(insertBeforePathsIndex(['a', '--', 'b', '--', 'e'])) + .toBe(1); + }); + it('when missing', () => { + expect(insertBeforePathsIndex(['a', 'b'])) + .toBe(2); + }); + }); + it('moves pathspec to end', async () => { git.raw(['a', pathspec('b'), 'c']); await closeWithSuccess(); diff --git a/simple-git/test/unit/plugins/plugin.unsafe.spec.ts b/simple-git/test/unit/plugins/plugin.unsafe.spec.ts index 6c0313de..b915fae8 100644 --- a/simple-git/test/unit/plugins/plugin.unsafe.spec.ts +++ b/simple-git/test/unit/plugins/plugin.unsafe.spec.ts @@ -1,4 +1,5 @@ import { promiseError } from '@kwsites/promise-result'; + import { assertExecutedCommands, assertGitError, @@ -13,12 +14,12 @@ describe('blockUnsafeOperationsPlugin', () => { ['Protocol.Allow=always'], ['PROTOCOL.allow=always'], ['protocol.ALLOW=always'], - ])('blocks protocol overide in format %s', async (cmd) => { + ])('blocks protocol override in format %s', async (cmd) => { const task = ['config', '-c', cmd, 'config', '--list']; assertGitError( await promiseError(newSimpleGit().raw(...task)), - 'allowUnsafeExtProtocol' + 'allowUnsafeProtocolOverride', ); const err = promiseError( @@ -38,11 +39,11 @@ describe('blockUnsafeOperationsPlugin', () => { ])('allows %s %s only when using override', async (cmd, option) => { assertGitError( await promiseError(newSimpleGit({ unsafe: {} }).raw(cmd, option)), - 'allowUnsafePack' + 'allowUnsafePack', ); const err = promiseError( - newSimpleGit({ unsafe: { allowUnsafePack: true } }).raw(cmd, option) + newSimpleGit({ unsafe: { allowUnsafePack: true } }).raw(cmd, option), ); await closeWithSuccess(); @@ -50,6 +51,32 @@ describe('blockUnsafeOperationsPlugin', () => { assertExecutedCommands(cmd, option); }); + describe.each([ + ['allowUnsafeSshCommand', `core.sshCommand=sh -c 'id > pwned'`], + ['allowUnsafeGitProxy', `core.gitProxy=sh -c 'id > pwned'`], + ['allowUnsafeHooksPath', `core.hooksPath=sh -c 'id > pwned'`], + ['allowUnsafeDiffExternal', `diff.external=sh -c 'id > pwned'`], + ])('unsafe config option - %s', (setting, command) => { + + it('blocks by default', async () => { + const err = promiseError( + newSimpleGit().clone('remote', 'local', ['-c', command]), + ); + await promiseError(closeWithSuccess()); + + assertGitError(await err, setting); + }); + + it('allows with override', async () => { + const err = promiseError( + newSimpleGit({ unsafe: { [setting]: true } }).clone('remote', 'local', ['-c', command]), + ); + await closeWithSuccess(); + + expect(await err).toBeUndefined(); + }); + }); + it('allows -u for non-clone commands', async () => { const git = newSimpleGit({ unsafe: {} }); const err = promiseError(git.raw('push', '-u', 'origin/main')); @@ -61,14 +88,14 @@ describe('blockUnsafeOperationsPlugin', () => { it('blocks -u for clone command', async () => { const git = newSimpleGit({ unsafe: {} }); - const err = promiseError(git.clone('-u touch /tmp/pwn', 'file:///tmp/zero12')); + const err = promiseError(git.raw('clone', '-u touch /tmp/pwn', 'file:///tmp/zero12')); assertGitError(await err, 'allowUnsafePack'); }); it('allows -u for clone command with override', async () => { const git = newSimpleGit({ unsafe: { allowUnsafePack: true } }); - const err = promiseError(git.clone('-u touch /tmp/pwn', 'file:///tmp/zero12')); + const err = promiseError(git.raw('clone', '-u touch /tmp/pwn', 'file:///tmp/zero12')); await closeWithSuccess(); expect(await err).toBeUndefined(); diff --git a/simple-git/test/unit/plugins/plugins.spec.ts b/simple-git/test/unit/plugins/plugins.spec.ts index e9b05b69..930a6a07 100644 --- a/simple-git/test/unit/plugins/plugins.spec.ts +++ b/simple-git/test/unit/plugins/plugins.spec.ts @@ -1,4 +1,4 @@ -import { SimpleGit } from '../../../typings'; +import type { SimpleGit } from '../../../typings'; import { assertChildProcessSpawnOptions, assertExecutedCommands, diff --git a/simple-git/test/unit/promises.spec.ts b/simple-git/test/unit/promises.spec.ts index a4c32c92..da6501fb 100644 --- a/simple-git/test/unit/promises.spec.ts +++ b/simple-git/test/unit/promises.spec.ts @@ -1,7 +1,7 @@ -import { closeWithError, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; import { BranchDeletionBatch } from '../../src/lib/responses/BranchDeleteSummary'; import { CleanResponse } from '../../src/lib/responses/CleanSummary'; +import type { SimpleGit } from '../../typings'; +import { closeWithError, closeWithSuccess, newSimpleGit } from './__fixtures__'; describe('promises', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/pull.spec.ts b/simple-git/test/unit/pull.spec.ts index 9c159517..4146fd03 100644 --- a/simple-git/test/unit/pull.spec.ts +++ b/simple-git/test/unit/pull.spec.ts @@ -1,7 +1,8 @@ -import { SimpleGit } from 'typings'; -import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; +import type { SimpleGit } from 'typings'; + import { parsePullResult } from '../../src/lib/parsers/parse-pull'; import { PullSummary } from '../../src/lib/responses/PullSummary'; +import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; describe('pull', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/push.spec.ts b/simple-git/test/unit/push.spec.ts index 4a82a38e..a21f2ff0 100644 --- a/simple-git/test/unit/push.spec.ts +++ b/simple-git/test/unit/push.spec.ts @@ -1,11 +1,11 @@ -import { PushResult, SimpleGit } from '../../typings'; +import { parsePushResult } from '../../src/lib/parsers/parse-push'; +import type { PushResult, SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; import { pushNewBranch, pushNewBranchWithTags, pushUpdateExistingBranch, } from './__fixtures__/push'; -import { parsePushResult } from '../../src/lib/parsers/parse-push'; describe('push', () => { describe('usage', () => { diff --git a/simple-git/test/unit/raw.spec.ts b/simple-git/test/unit/raw.spec.ts index 5ad492b5..f7ad1407 100644 --- a/simple-git/test/unit/raw.spec.ts +++ b/simple-git/test/unit/raw.spec.ts @@ -1,4 +1,6 @@ import { promiseError } from '@kwsites/promise-result'; + +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, assertGitError, @@ -7,7 +9,6 @@ import { newSimpleGit, wait, } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('raw', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/rebase.spec.ts b/simple-git/test/unit/rebase.spec.ts index 246f5664..e0f54eb1 100644 --- a/simple-git/test/unit/rebase.spec.ts +++ b/simple-git/test/unit/rebase.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('rebase', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/remote-messages.spec.ts b/simple-git/test/unit/remote-messages.spec.ts index 682fce17..d4c6c55f 100644 --- a/simple-git/test/unit/remote-messages.spec.ts +++ b/simple-git/test/unit/remote-messages.spec.ts @@ -1,3 +1,5 @@ +import { parseRemoteMessages } from '../../src/lib/parsers/parse-remote-messages'; +import { like, remoteMessagesObjectEnumeration } from './__fixtures__'; import { gitHubAlertsUrl, gitHubPullRequest, @@ -5,8 +7,6 @@ import { pushNewBranch, pushNewBranchWithVulnerabilities, } from './__fixtures__/push'; -import { like, remoteMessagesObjectEnumeration } from './__fixtures__'; -import { parseRemoteMessages } from '../../src/lib/parsers/parse-remote-messages'; describe('remote-messages', () => { it('detects object enumeration', () => { diff --git a/simple-git/test/unit/remote.spec.ts b/simple-git/test/unit/remote.spec.ts index b683b8a0..9ddc50d3 100644 --- a/simple-git/test/unit/remote.spec.ts +++ b/simple-git/test/unit/remote.spec.ts @@ -1,6 +1,6 @@ -import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; import { getRemotesTask } from '../../src/lib/tasks/remote'; +import type { SimpleGit } from '../../typings'; +import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; describe('remotes', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/reset.spec.ts b/simple-git/test/unit/reset.spec.ts index f7c2b306..ed974fc4 100644 --- a/simple-git/test/unit/reset.spec.ts +++ b/simple-git/test/unit/reset.spec.ts @@ -1,6 +1,6 @@ -import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; import { ResetMode } from '../../src/lib/tasks/reset'; +import type { SimpleGit } from '../../typings'; +import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; describe('reset', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/rev-parse.spec.ts b/simple-git/test/unit/rev-parse.spec.ts index 034ec740..0d140679 100644 --- a/simple-git/test/unit/rev-parse.spec.ts +++ b/simple-git/test/unit/rev-parse.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('revParse', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/revert.spec.ts b/simple-git/test/unit/revert.spec.ts index 1c1ee88e..8b319e86 100644 --- a/simple-git/test/unit/revert.spec.ts +++ b/simple-git/test/unit/revert.spec.ts @@ -1,4 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; + +import { TaskConfigurationError } from '../..'; +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, assertGitError, @@ -6,9 +9,6 @@ import { closeWithSuccess, newSimpleGit, } from './__fixtures__'; -import { SimpleGit } from '../../typings'; - -import { TaskConfigurationError } from '../..'; describe('revert', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/rm.spec.ts b/simple-git/test/unit/rm.spec.ts index 91884df7..786bc93e 100644 --- a/simple-git/test/unit/rm.spec.ts +++ b/simple-git/test/unit/rm.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('rm', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/scheduler.spec.ts b/simple-git/test/unit/scheduler.spec.ts index 30a405ed..fd605c2a 100644 --- a/simple-git/test/unit/scheduler.spec.ts +++ b/simple-git/test/unit/scheduler.spec.ts @@ -1,11 +1,11 @@ +import { Scheduler } from '../../src/lib/runners/scheduler'; +import type { SimpleGit } from '../../typings'; import { assertAllExecutedCommands, newSimpleGit, theChildProcessMatching, wait, } from './__fixtures__'; -import { SimpleGit } from '../../typings'; -import { Scheduler } from '../../src/lib/runners/scheduler'; describe('scheduler', () => { describe('in isolation', () => { diff --git a/simple-git/test/unit/show.spec.ts b/simple-git/test/unit/show.spec.ts index e3268b57..843a60e6 100644 --- a/simple-git/test/unit/show.spec.ts +++ b/simple-git/test/unit/show.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; import { showAbbrevCommitSingleFile } from './__fixtures__/responses/show'; describe('show', () => { diff --git a/simple-git/test/unit/stash-list.spec.ts b/simple-git/test/unit/stash-list.spec.ts index 8ed2b069..aac3c749 100644 --- a/simple-git/test/unit/stash-list.spec.ts +++ b/simple-git/test/unit/stash-list.spec.ts @@ -1,10 +1,10 @@ -import { SimpleGit } from '../../typings'; -import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; import { COMMIT_BOUNDARY, SPLITTER, START_BOUNDARY, } from '../../src/lib/parsers/parse-list-log-summary'; +import type { SimpleGit } from '../../typings'; +import { assertExecutedCommands, closeWithSuccess, like, newSimpleGit } from './__fixtures__'; describe('stashList', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/stash.spec.ts b/simple-git/test/unit/stash.spec.ts index b7baf26d..82c343f7 100644 --- a/simple-git/test/unit/stash.spec.ts +++ b/simple-git/test/unit/stash.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('stash', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/status.spec.ts b/simple-git/test/unit/status.spec.ts index b80f3593..89f1a946 100644 --- a/simple-git/test/unit/status.spec.ts +++ b/simple-git/test/unit/status.spec.ts @@ -1,4 +1,8 @@ import { promiseError } from '@kwsites/promise-result'; + +import { parseStatusSummary, StatusSummary } from '../../src/lib/responses/StatusSummary'; +import { NULL } from '../../src/lib/utils'; +import type { SimpleGit, StatusResult } from '../../typings'; import { assertExecutedCommands, assertGitError, @@ -15,14 +19,11 @@ import { statusResponse, unStagedDeleted, } from './__fixtures__'; -import { SimpleGit, StatusResult } from '../../typings'; -import { parseStatusSummary, StatusSummary } from '../../src/lib/responses/StatusSummary'; -import { NULL } from '../../src/lib/utils'; describe('status', () => { let git: SimpleGit; let callback: jest.Mock; - let statusCommands = (...extras: string[]) => [ + const statusCommands = (...extras: string[]) => [ 'status', '--porcelain', '-b', diff --git a/simple-git/test/unit/sub-module.spec.ts b/simple-git/test/unit/sub-module.spec.ts index 5bbb63b7..c556efb5 100644 --- a/simple-git/test/unit/sub-module.spec.ts +++ b/simple-git/test/unit/sub-module.spec.ts @@ -1,5 +1,5 @@ +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('submodule', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/tags.spec.ts b/simple-git/test/unit/tags.spec.ts index 5ce6304c..d0a9d466 100644 --- a/simple-git/test/unit/tags.spec.ts +++ b/simple-git/test/unit/tags.spec.ts @@ -1,6 +1,6 @@ -import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; import { parseTagList } from '../../src/lib/responses/TagList'; +import type { SimpleGit } from '../../typings'; +import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; describe('tags', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/update-server-info.spec.ts b/simple-git/test/unit/update-server-info.spec.ts index 65b7aa59..45bc2576 100644 --- a/simple-git/test/unit/update-server-info.spec.ts +++ b/simple-git/test/unit/update-server-info.spec.ts @@ -1,6 +1,7 @@ import { promiseError } from '@kwsites/promise-result'; + +import type { SimpleGit } from '../../typings'; import { assertExecutedCommands, closeWithSuccess, newSimpleGit } from './__fixtures__'; -import { SimpleGit } from '../../typings'; describe('updateServerInfo', () => { let git: SimpleGit; diff --git a/simple-git/test/unit/utils.spec.ts b/simple-git/test/unit/utils.spec.ts index 98fbf799..8c5f1fa0 100644 --- a/simple-git/test/unit/utils.spec.ts +++ b/simple-git/test/unit/utils.spec.ts @@ -144,6 +144,13 @@ describe('utils', () => { expect(input).toBe(output); expect(output).toEqual(['abc', 'bar', 'foo']); }); + + it('appends at requested index', () => { + expect(including(['a', 'c'], 'b', 1)).toEqual(['a', 'b', 'c']); + expect(including(['a', 'c'], 'b', 10)).toEqual(['a', 'c', 'b']); + expect(including(['a', 'c'], 'b', 0)).toEqual(['b', 'a', 'c']); + expect(including(['a', 'c'], 'b', -100)).toEqual(['b', 'a', 'c']); + }) }); describe('argument filtering', () => { diff --git a/simple-git/typings/simple-git.d.ts b/simple-git/typings/simple-git.d.ts index 0afac60a..29c88518 100644 --- a/simple-git/typings/simple-git.d.ts +++ b/simple-git/typings/simple-git.d.ts @@ -862,12 +862,12 @@ export interface SimpleGit extends SimpleGitBase { * - commit The commit to revert. Can be any hash, offset (eg: `HEAD~2`) or range (eg: `master~5..master~2`) */ revert( - commit: String, + commit: string, options?: types.TaskOptions, callback?: types.SimpleGitTaskCallback ): Response; - revert(commit: String, callback?: types.SimpleGitTaskCallback): Response; + revert(commit: string, callback?: types.SimpleGitTaskCallback): Response; /** * Passes the supplied options to `git rev-parse` and returns the string response. Options can be either a diff --git a/yarn.lock b/yarn.lock index 2e684d08..af3fcfe4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6029,15 +6029,15 @@ __metadata: linkType: hard "tar@npm:^7.4.3": - version: 7.5.9 - resolution: "tar@npm:7.5.9" + version: 7.5.10 + resolution: "tar@npm:7.5.10" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10/1213cdde9c22d6acf8809ba5d2a025212ce3517bc99c4a4c6981b7dc0489bf3b164db9c826c9517680889194c9ba57448c8ff0da35eca9a60bb7689bf0b3897d + checksum: 10/98ba6421a250b233c36a54f7441647bdfee1ed0b916cd57850259a3602154d996f5b8422f67ef5c8ce77f582ed938054775c2873fc7c901e0c7530ed50febc40 languageName: node linkType: hard