@eldrforge/git-tools 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/child.js +22 -14
- package/dist/child.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/package.json +3 -3
package/dist/child.js
CHANGED
|
@@ -121,16 +121,18 @@ import { getLogger } from './logger.js';
|
|
|
121
121
|
async function run(command, options = {}) {
|
|
122
122
|
const logger = getLogger();
|
|
123
123
|
const execPromise = util.promisify(exec);
|
|
124
|
+
// Extract our custom option and pass the rest to exec
|
|
125
|
+
const { suppressErrorLogging = false, ...execOptions } = options || {};
|
|
124
126
|
// Ensure encoding is set to 'utf8' to get string output instead of Buffer
|
|
125
|
-
const
|
|
127
|
+
const finalOptions = {
|
|
126
128
|
encoding: 'utf8',
|
|
127
|
-
...
|
|
129
|
+
...execOptions
|
|
128
130
|
};
|
|
129
131
|
logger.verbose(`Executing command: ${command}`);
|
|
130
|
-
logger.verbose(`Working directory: ${(
|
|
131
|
-
logger.verbose(`Environment variables: ${Object.keys((
|
|
132
|
+
logger.verbose(`Working directory: ${(finalOptions === null || finalOptions === void 0 ? void 0 : finalOptions.cwd) || process.cwd()}`);
|
|
133
|
+
logger.verbose(`Environment variables: ${Object.keys((finalOptions === null || finalOptions === void 0 ? void 0 : finalOptions.env) || process.env).length} variables`);
|
|
132
134
|
try {
|
|
133
|
-
const result = await execPromise(command,
|
|
135
|
+
const result = await execPromise(command, finalOptions);
|
|
134
136
|
logger.verbose(`Command completed successfully`);
|
|
135
137
|
logger.verbose(`stdout: ${result.stdout}`);
|
|
136
138
|
if (result.stderr) {
|
|
@@ -142,15 +144,21 @@ async function run(command, options = {}) {
|
|
|
142
144
|
stderr: String(result.stderr)
|
|
143
145
|
};
|
|
144
146
|
} catch (error) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
147
|
+
if (!suppressErrorLogging) {
|
|
148
|
+
logger.error(`Command failed: ${command}`);
|
|
149
|
+
logger.error(`Error: ${error.message}`);
|
|
150
|
+
logger.error(`Exit code: ${error.code}`);
|
|
151
|
+
logger.error(`Signal: ${error.signal}`);
|
|
152
|
+
if (error.stdout) {
|
|
153
|
+
logger.error(`stdout: ${error.stdout}`);
|
|
154
|
+
}
|
|
155
|
+
if (error.stderr) {
|
|
156
|
+
logger.error(`stderr: ${error.stderr}`);
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
// Still log at verbose level for debugging
|
|
160
|
+
logger.verbose(`Command exited with non-zero code (suppressed): ${command}`);
|
|
161
|
+
logger.verbose(`Exit code: ${error.code}`);
|
|
154
162
|
}
|
|
155
163
|
throw error;
|
|
156
164
|
}
|
package/dist/child.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child.js","sources":["../src/child.ts"],"sourcesContent":["#!/usr/bin/env node\nimport child_process, { exec, spawn } from 'child_process';\nimport util from 'util';\nimport { getLogger } from './logger';\n\n/**\n * Escapes shell arguments to prevent command injection\n */\nfunction escapeShellArg(arg: string): string {\n // For Windows, we need different escaping\n if (process.platform === 'win32') {\n // Escape double quotes and backslashes\n return `\"${arg.replace(/[\\\\\"]/g, '\\\\$&')}\"`;\n } else {\n // For Unix-like systems, escape single quotes\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n }\n}\n\n/**\n * Validates git references to prevent injection\n */\nfunction validateGitRef(ref: string): boolean {\n // Git refs can contain letters, numbers, hyphens, underscores, slashes, and dots\n // But cannot contain certain dangerous characters\n const validRefPattern = /^[a-zA-Z0-9._/-]+$/;\n const invalidPatterns = [\n /\\.\\./, // No double dots (directory traversal)\n /^-/, // Cannot start with dash (flag injection)\n /[\\s;<>|&`$(){}[\\]]/ // No shell metacharacters\n ];\n\n if (!validRefPattern.test(ref)) {\n return false;\n }\n\n return !invalidPatterns.some(pattern => pattern.test(ref));\n}\n\n/**\n * Validates file paths to prevent injection\n */\nfunction validateFilePath(filePath: string): boolean {\n // Basic validation - no shell metacharacters\n const invalidChars = /[;<>|&`$(){}[\\]]/;\n return !invalidChars.test(filePath);\n}\n\n/**\n * Securely executes a command with arguments array (no shell injection risk)\n */\nexport async function runSecure(\n command: string,\n args: string[] = [],\n options: child_process.SpawnOptions = {}\n): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n\n return new Promise((resolve, reject) => {\n logger.verbose(`Executing command securely: ${command} ${args.join(' ')}`);\n logger.verbose(`Working directory: ${options?.cwd || process.cwd()}`);\n\n const child = spawn(command, args, {\n ...options,\n shell: false, // CRITICAL: Never use shell for user input\n stdio: 'pipe'\n });\n\n let stdout = '';\n let stderr = '';\n\n if (child.stdout) {\n child.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n }\n\n if (child.stderr) {\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n }\n\n child.on('close', (code) => {\n if (code === 0) {\n logger.verbose(`Command completed successfully`);\n logger.verbose(`stdout: ${stdout}`);\n if (stderr) {\n logger.verbose(`stderr: ${stderr}`);\n }\n resolve({ stdout, stderr });\n } else {\n logger.error(`Command failed with exit code ${code}`);\n logger.error(`stdout: ${stdout}`);\n logger.error(`stderr: ${stderr}`);\n reject(new Error(`Command \"${[command, ...args].join(' ')}\" failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n logger.error(`Command failed to start: ${error.message}`);\n reject(error);\n });\n });\n}\n\n/**\n * Securely executes a command with inherited stdio (no shell injection risk)\n */\nexport async function runSecureWithInheritedStdio(\n command: string,\n args: string[] = [],\n options: child_process.SpawnOptions = {}\n): Promise<void> {\n const logger = getLogger();\n\n return new Promise((resolve, reject) => {\n logger.verbose(`Executing command securely with inherited stdio: ${command} ${args.join(' ')}`);\n logger.verbose(`Working directory: ${options?.cwd || process.cwd()}`);\n\n const child = spawn(command, args, {\n ...options,\n shell: false, // CRITICAL: Never use shell for user input\n stdio: 'inherit'\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n logger.verbose(`Command completed successfully with code ${code}`);\n resolve();\n } else {\n logger.error(`Command failed with exit code ${code}`);\n reject(new Error(`Command \"${[command, ...args].join(' ')}\" failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n logger.error(`Command failed to start: ${error.message}`);\n reject(error);\n });\n });\n}\n\nexport async function run(command: string, options: child_process.ExecOptions = {}): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n const execPromise = util.promisify(exec);\n\n // Ensure encoding is set to 'utf8' to get string output instead of Buffer\n const execOptions = { encoding: 'utf8' as const, ...options };\n\n logger.verbose(`Executing command: ${command}`);\n logger.verbose(`Working directory: ${execOptions?.cwd || process.cwd()}`);\n logger.verbose(`Environment variables: ${Object.keys(execOptions?.env || process.env).length} variables`);\n\n try {\n const result = await execPromise(command, execOptions);\n logger.verbose(`Command completed successfully`);\n logger.verbose(`stdout: ${result.stdout}`);\n if (result.stderr) {\n logger.verbose(`stderr: ${result.stderr}`);\n }\n // Ensure result is properly typed as strings\n return {\n stdout: String(result.stdout),\n stderr: String(result.stderr)\n };\n } catch (error: any) {\n logger.error(`Command failed: ${command}`);\n logger.error(`Error: ${error.message}`);\n logger.error(`Exit code: ${error.code}`);\n logger.error(`Signal: ${error.signal}`);\n if (error.stdout) {\n logger.error(`stdout: ${error.stdout}`);\n }\n if (error.stderr) {\n logger.error(`stderr: ${error.stderr}`);\n }\n throw error;\n }\n}\n\n/**\n * @deprecated Use runSecureWithInheritedStdio instead for better security\n * Legacy function for backward compatibility - parses shell command string\n */\nexport async function runWithInheritedStdio(command: string, options: child_process.ExecOptions = {}): Promise<void> {\n\n // Parse command to extract command and arguments safely\n const parts = command.trim().split(/\\s+/);\n if (parts.length === 0) {\n throw new Error('Empty command provided');\n }\n\n const cmd = parts[0];\n const args = parts.slice(1);\n\n // Use the secure version\n return runSecureWithInheritedStdio(cmd, args, options);\n}\n\nexport async function runWithDryRunSupport(\n command: string,\n isDryRun: boolean,\n options: child_process.ExecOptions = {},\n useInheritedStdio: boolean = false\n): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would execute command: ${command}`);\n return { stdout: '', stderr: '' };\n }\n\n if (useInheritedStdio) {\n await runWithInheritedStdio(command, options);\n return { stdout: '', stderr: '' }; // No output captured when using inherited stdio\n }\n\n return run(command, options);\n}\n\n/**\n * Secure version of runWithDryRunSupport using argument arrays\n */\nexport async function runSecureWithDryRunSupport(\n command: string,\n args: string[] = [],\n isDryRun: boolean,\n options: child_process.SpawnOptions = {},\n useInheritedStdio: boolean = false\n): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would execute command: ${command} ${args.join(' ')}`);\n return { stdout: '', stderr: '' };\n }\n\n if (useInheritedStdio) {\n await runSecureWithInheritedStdio(command, args, options);\n return { stdout: '', stderr: '' }; // No output captured when using inherited stdio\n }\n\n return runSecure(command, args, options);\n}\n\n// Export validation functions for use in other modules\nexport { validateGitRef, validateFilePath, escapeShellArg };\n\n"],"names":["escapeShellArg","arg","process","platform","replace","validateGitRef","ref","validRefPattern","invalidPatterns","test","some","pattern","validateFilePath","filePath","invalidChars","runSecure","command","args","options","logger","getLogger","Promise","resolve","reject","verbose","join","cwd","child","spawn","shell","stdio","stdout","stderr","on","data","toString","code","error","Error","message","runSecureWithInheritedStdio","run","execPromise","util","promisify","exec","execOptions","encoding","Object","keys","env","length","result","String","signal","runWithInheritedStdio","parts","trim","split","cmd","slice","runWithDryRunSupport","isDryRun","useInheritedStdio","info","runSecureWithDryRunSupport"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"child.js","sources":["../src/child.ts"],"sourcesContent":["#!/usr/bin/env node\nimport child_process, { exec, spawn } from 'child_process';\nimport util from 'util';\nimport { getLogger } from './logger';\n\n/**\n * Escapes shell arguments to prevent command injection\n */\nfunction escapeShellArg(arg: string): string {\n // For Windows, we need different escaping\n if (process.platform === 'win32') {\n // Escape double quotes and backslashes\n return `\"${arg.replace(/[\\\\\"]/g, '\\\\$&')}\"`;\n } else {\n // For Unix-like systems, escape single quotes\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n }\n}\n\n/**\n * Validates git references to prevent injection\n */\nfunction validateGitRef(ref: string): boolean {\n // Git refs can contain letters, numbers, hyphens, underscores, slashes, and dots\n // But cannot contain certain dangerous characters\n const validRefPattern = /^[a-zA-Z0-9._/-]+$/;\n const invalidPatterns = [\n /\\.\\./, // No double dots (directory traversal)\n /^-/, // Cannot start with dash (flag injection)\n /[\\s;<>|&`$(){}[\\]]/ // No shell metacharacters\n ];\n\n if (!validRefPattern.test(ref)) {\n return false;\n }\n\n return !invalidPatterns.some(pattern => pattern.test(ref));\n}\n\n/**\n * Validates file paths to prevent injection\n */\nfunction validateFilePath(filePath: string): boolean {\n // Basic validation - no shell metacharacters\n const invalidChars = /[;<>|&`$(){}[\\]]/;\n return !invalidChars.test(filePath);\n}\n\n/**\n * Securely executes a command with arguments array (no shell injection risk)\n */\nexport async function runSecure(\n command: string,\n args: string[] = [],\n options: child_process.SpawnOptions = {}\n): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n\n return new Promise((resolve, reject) => {\n logger.verbose(`Executing command securely: ${command} ${args.join(' ')}`);\n logger.verbose(`Working directory: ${options?.cwd || process.cwd()}`);\n\n const child = spawn(command, args, {\n ...options,\n shell: false, // CRITICAL: Never use shell for user input\n stdio: 'pipe'\n });\n\n let stdout = '';\n let stderr = '';\n\n if (child.stdout) {\n child.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n }\n\n if (child.stderr) {\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n }\n\n child.on('close', (code) => {\n if (code === 0) {\n logger.verbose(`Command completed successfully`);\n logger.verbose(`stdout: ${stdout}`);\n if (stderr) {\n logger.verbose(`stderr: ${stderr}`);\n }\n resolve({ stdout, stderr });\n } else {\n logger.error(`Command failed with exit code ${code}`);\n logger.error(`stdout: ${stdout}`);\n logger.error(`stderr: ${stderr}`);\n reject(new Error(`Command \"${[command, ...args].join(' ')}\" failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n logger.error(`Command failed to start: ${error.message}`);\n reject(error);\n });\n });\n}\n\n/**\n * Securely executes a command with inherited stdio (no shell injection risk)\n */\nexport async function runSecureWithInheritedStdio(\n command: string,\n args: string[] = [],\n options: child_process.SpawnOptions = {}\n): Promise<void> {\n const logger = getLogger();\n\n return new Promise((resolve, reject) => {\n logger.verbose(`Executing command securely with inherited stdio: ${command} ${args.join(' ')}`);\n logger.verbose(`Working directory: ${options?.cwd || process.cwd()}`);\n\n const child = spawn(command, args, {\n ...options,\n shell: false, // CRITICAL: Never use shell for user input\n stdio: 'inherit'\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n logger.verbose(`Command completed successfully with code ${code}`);\n resolve();\n } else {\n logger.error(`Command failed with exit code ${code}`);\n reject(new Error(`Command \"${[command, ...args].join(' ')}\" failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n logger.error(`Command failed to start: ${error.message}`);\n reject(error);\n });\n });\n}\n\nexport interface RunOptions extends child_process.ExecOptions {\n /** If true, suppresses error logging for non-zero exits (useful when non-zero exit is expected behavior) */\n suppressErrorLogging?: boolean;\n}\n\nexport async function run(command: string, options: RunOptions = {}): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n const execPromise = util.promisify(exec);\n\n // Extract our custom option and pass the rest to exec\n const { suppressErrorLogging = false, ...execOptions } = options || {};\n\n // Ensure encoding is set to 'utf8' to get string output instead of Buffer\n const finalOptions = { encoding: 'utf8' as const, ...execOptions };\n\n logger.verbose(`Executing command: ${command}`);\n logger.verbose(`Working directory: ${finalOptions?.cwd || process.cwd()}`);\n logger.verbose(`Environment variables: ${Object.keys(finalOptions?.env || process.env).length} variables`);\n\n try {\n const result = await execPromise(command, finalOptions);\n logger.verbose(`Command completed successfully`);\n logger.verbose(`stdout: ${result.stdout}`);\n if (result.stderr) {\n logger.verbose(`stderr: ${result.stderr}`);\n }\n // Ensure result is properly typed as strings\n return {\n stdout: String(result.stdout),\n stderr: String(result.stderr)\n };\n } catch (error: any) {\n if (!suppressErrorLogging) {\n logger.error(`Command failed: ${command}`);\n logger.error(`Error: ${error.message}`);\n logger.error(`Exit code: ${error.code}`);\n logger.error(`Signal: ${error.signal}`);\n if (error.stdout) {\n logger.error(`stdout: ${error.stdout}`);\n }\n if (error.stderr) {\n logger.error(`stderr: ${error.stderr}`);\n }\n } else {\n // Still log at verbose level for debugging\n logger.verbose(`Command exited with non-zero code (suppressed): ${command}`);\n logger.verbose(`Exit code: ${error.code}`);\n }\n throw error;\n }\n}\n\n/**\n * @deprecated Use runSecureWithInheritedStdio instead for better security\n * Legacy function for backward compatibility - parses shell command string\n */\nexport async function runWithInheritedStdio(command: string, options: child_process.ExecOptions = {}): Promise<void> {\n\n // Parse command to extract command and arguments safely\n const parts = command.trim().split(/\\s+/);\n if (parts.length === 0) {\n throw new Error('Empty command provided');\n }\n\n const cmd = parts[0];\n const args = parts.slice(1);\n\n // Use the secure version\n return runSecureWithInheritedStdio(cmd, args, options);\n}\n\nexport async function runWithDryRunSupport(\n command: string,\n isDryRun: boolean,\n options: child_process.ExecOptions = {},\n useInheritedStdio: boolean = false\n): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would execute command: ${command}`);\n return { stdout: '', stderr: '' };\n }\n\n if (useInheritedStdio) {\n await runWithInheritedStdio(command, options);\n return { stdout: '', stderr: '' }; // No output captured when using inherited stdio\n }\n\n return run(command, options);\n}\n\n/**\n * Secure version of runWithDryRunSupport using argument arrays\n */\nexport async function runSecureWithDryRunSupport(\n command: string,\n args: string[] = [],\n isDryRun: boolean,\n options: child_process.SpawnOptions = {},\n useInheritedStdio: boolean = false\n): Promise<{ stdout: string; stderr: string }> {\n const logger = getLogger();\n\n if (isDryRun) {\n logger.info(`DRY RUN: Would execute command: ${command} ${args.join(' ')}`);\n return { stdout: '', stderr: '' };\n }\n\n if (useInheritedStdio) {\n await runSecureWithInheritedStdio(command, args, options);\n return { stdout: '', stderr: '' }; // No output captured when using inherited stdio\n }\n\n return runSecure(command, args, options);\n}\n\n// Export validation functions for use in other modules\nexport { validateGitRef, validateFilePath, escapeShellArg };\n\n"],"names":["escapeShellArg","arg","process","platform","replace","validateGitRef","ref","validRefPattern","invalidPatterns","test","some","pattern","validateFilePath","filePath","invalidChars","runSecure","command","args","options","logger","getLogger","Promise","resolve","reject","verbose","join","cwd","child","spawn","shell","stdio","stdout","stderr","on","data","toString","code","error","Error","message","runSecureWithInheritedStdio","run","execPromise","util","promisify","exec","suppressErrorLogging","execOptions","finalOptions","encoding","Object","keys","env","length","result","String","signal","runWithInheritedStdio","parts","trim","split","cmd","slice","runWithDryRunSupport","isDryRun","useInheritedStdio","info","runSecureWithDryRunSupport"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -164,11 +164,16 @@ export declare interface Logger {
|
|
|
164
164
|
*/
|
|
165
165
|
export declare const remoteBranchExists: (branchName: string, remote?: string) => Promise<boolean>;
|
|
166
166
|
|
|
167
|
-
export declare function run(command: string, options?:
|
|
167
|
+
export declare function run(command: string, options?: RunOptions): Promise<{
|
|
168
168
|
stdout: string;
|
|
169
169
|
stderr: string;
|
|
170
170
|
}>;
|
|
171
171
|
|
|
172
|
+
export declare interface RunOptions extends default_2.ExecOptions {
|
|
173
|
+
/** If true, suppresses error logging for non-zero exits (useful when non-zero exit is expected behavior) */
|
|
174
|
+
suppressErrorLogging?: boolean;
|
|
175
|
+
}
|
|
176
|
+
|
|
172
177
|
/**
|
|
173
178
|
* Securely executes a command with arguments array (no shell injection risk)
|
|
174
179
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eldrforge/git-tools",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Git utilities for automation - secure process execution and Git operations",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"@types/winston": "^2.4.4",
|
|
60
60
|
"@typescript-eslint/eslint-plugin": "^8.39.1",
|
|
61
61
|
"@typescript-eslint/parser": "^8.39.1",
|
|
62
|
-
"@vitest/coverage-v8": "^
|
|
62
|
+
"@vitest/coverage-v8": "^4.0.13",
|
|
63
63
|
"esbuild": "0.25.10",
|
|
64
64
|
"eslint": "^9.33.0",
|
|
65
65
|
"eslint-plugin-import": "^2.32.0",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"vite": "^7.1.2",
|
|
70
70
|
"vite-plugin-dts": "^4.3.0",
|
|
71
71
|
"vite-plugin-node": "^7.0.0",
|
|
72
|
-
"vitest": "^
|
|
72
|
+
"vitest": "^4.0.13",
|
|
73
73
|
"winston": "^3.17.0"
|
|
74
74
|
}
|
|
75
75
|
}
|