@qodalis/cli-scp 2.0.0-beta.1 → 2.0.0-beta.11
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/package.json +4 -4
- package/public-api.d.mts +5 -1
- package/public-api.d.ts +5 -1
- package/public-api.js +67 -31
- package/public-api.js.map +1 -1
- package/public-api.mjs +67 -31
- package/public-api.mjs.map +1 -1
- package/umd/{cli-entrypoint.global.js → index.global.js} +74 -36
package/public-api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["ICliFileTransferService_TOKEN","parts","serverUrl"],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.1';\nexport const API_VERSION = 2;\n ","export const IScpTransferService_TOKEN = 'scp-transfer-service';\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string>;\n stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: Record<string, string>,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig } from '@qodalis/cli-core';\n\nexport function resolveServer(\n serverName: string | undefined,\n context: ICliExecutionContext,\n): CliServerConfig | null {\n const servers = context.options?.servers;\n if (!servers || servers.length === 0) {\n context.writer.writeError('No servers configured. Add servers to CLI options.');\n return null;\n }\n\n if (!serverName) {\n if (servers.length === 1) {\n return servers[0];\n }\n context.writer.writeError('Multiple servers configured. Specify server name.');\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n const server = servers.find(s => s.name.toLowerCase() === serverName.toLowerCase());\n if (!server) {\n context.writer.writeError(`Unknown server: ${serverName}`);\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n return server;\n}\n\nexport function serverUrl(server: CliServerConfig): string {\n return server.url.replace(/\\/+$/, '');\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Parse server and path from either positional args (command.value)\n * or named args (--server, --path).\n *\n * Supports:\n * scp ls node /app (positional)\n * scp ls --server node --path /app (named, space-separated)\n * scp ls --server=\"node\" --path=\"/app\" (named, equals syntax)\n */\nexport function parseServerAndPath(\n value: string | undefined,\n context: ICliExecutionContext,\n args?: Record<string, any>,\n): [string, string] | null {\n // Try named args first (--server, --path)\n const serverArg = args?.['server'];\n const pathArg = args?.['path'];\n if (serverArg && pathArg) {\n return [String(serverArg), String(pathArg)];\n }\n\n // Fall back to positional from command.value\n if (!value?.trim()) {\n return null;\n }\n const parts = value.trim().split(/\\s+/);\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a local file to a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['local-path'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = String(args['local-path']);\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n\n if (!serverName || !localPath || !remotePath) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a local file to a remote server.');\n context.writer.writeln('Usage: scp upload <server> <local-path> <remote-path>');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const value = command.value?.trim();\n\n // Shorthand: scp myserver:/remote/path => download\n if (value && value.includes(':') && !value.startsWith('-')) {\n const colonIdx = value.indexOf(':');\n const spaceBeforeColon = value.lastIndexOf(' ', colonIdx);\n\n // If no space before colon, first token is \"server:path\"\n if (spaceBeforeColon === -1) {\n const serverName = value.substring(0, colonIdx);\n const rest = value.substring(colonIdx + 1);\n const parts = rest.trim().split(/\\s+/);\n const remotePath = parts[0];\n const localPath = parts[1] || remotePath.split('/').pop() || 'download';\n\n if (remotePath) {\n await this.doDownload(serverName, remotePath, localPath, command, context);\n return;\n }\n }\n\n // Shorthand upload: scp ./local myserver:/remote\n const parts = value.split(/\\s+/);\n if (parts.length >= 2) {\n const secondPart = parts[1];\n if (secondPart.includes(':')) {\n const localPath = parts[0];\n const srvColonIdx = secondPart.indexOf(':');\n const serverName = secondPart.substring(0, srvColonIdx);\n const remotePath = secondPart.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, localPath, remotePath, context);\n return;\n }\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/cli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/cli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/cli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/cli/fs/download?path=${encodeURIComponent(path)}`, {\n headers,\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: Record<string, string>,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/cli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers,\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/cli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/cli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers,\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["ICliFileTransferService_TOKEN","parts","serverUrl"],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.11';\nexport const API_VERSION = 2;\n ","export const IScpTransferService_TOKEN = 'scp-transfer-service';\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string>;\n stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: Record<string, string>,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig } from '@qodalis/cli-core';\n\nexport function resolveServer(\n serverName: string | undefined,\n context: ICliExecutionContext,\n): CliServerConfig | null {\n const servers = context.options?.servers;\n if (!servers || servers.length === 0) {\n context.writer.writeError('No servers configured. Add servers to CLI options.');\n return null;\n }\n\n if (!serverName) {\n if (servers.length === 1) {\n return servers[0];\n }\n context.writer.writeError('Multiple servers configured. Specify server name.');\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n const server = servers.find(s => s.name.toLowerCase() === serverName.toLowerCase());\n if (!server) {\n context.writer.writeError(`Unknown server: ${serverName}`);\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n return server;\n}\n\nexport function serverUrl(server: CliServerConfig): string {\n return server.url.replace(/\\/+$/, '');\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Parse server and path from either positional args (command.value)\n * or named args (--server, --path).\n *\n * Supports:\n * scp ls node /app (positional)\n * scp ls --server node --path /app (named, space-separated)\n * scp ls --server=\"node\" --path=\"/app\" (named, equals syntax)\n */\nexport function parseServerAndPath(\n value: string | undefined,\n context: ICliExecutionContext,\n args?: Record<string, any>,\n): [string, string] | null {\n // Try named args first (--server, --path)\n const serverArg = args?.['server'];\n const pathArg = args?.['path'];\n if (serverArg && pathArg) {\n return [String(serverArg), String(pathArg)];\n }\n\n // Fall back to positional from command.value\n if (!value?.trim()) {\n return null;\n }\n const parts = value.trim().split(/\\s+/);\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n const parts = value.split(/\\s+/);\n if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const value = command.value?.trim();\n\n // Shorthand: scp myserver:/remote/path => download\n if (value && value.includes(':') && !value.startsWith('-')) {\n const colonIdx = value.indexOf(':');\n const spaceBeforeColon = value.lastIndexOf(' ', colonIdx);\n\n // If no space before colon, first token is \"server:path\"\n if (spaceBeforeColon === -1) {\n const serverName = value.substring(0, colonIdx);\n const rest = value.substring(colonIdx + 1);\n const parts = rest.trim().split(/\\s+/);\n const remotePath = parts[0];\n const localPath = parts[1] || remotePath.split('/').pop() || 'download';\n\n if (remotePath) {\n await this.doDownload(serverName, remotePath, localPath, command, context);\n return;\n }\n }\n\n // Shorthand upload: scp ./local myserver:/remote\n const parts = value.split(/\\s+/);\n if (parts.length >= 2) {\n const secondPart = parts[1];\n if (secondPart.includes(':')) {\n const localPath = parts[0];\n const srvColonIdx = secondPart.indexOf(':');\n const serverName = secondPart.substring(0, srvColonIdx);\n const remotePath = secondPart.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, localPath, remotePath, context);\n return;\n }\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.get<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.get<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers,\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: Record<string, string>,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers,\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers,\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
|
|
@@ -1827,9 +1827,11 @@ var scp = (() => {
|
|
|
1827
1827
|
email: "nicolae.lupei@qodalis.com"
|
|
1828
1828
|
};
|
|
1829
1829
|
var semver = __toESM(require_semver2());
|
|
1830
|
+
var API_VERSION = 2;
|
|
1831
|
+
var VERSIONS_ENDPOINT = "/api/qcli/versions";
|
|
1830
1832
|
var ServerVersionNegotiator = class {
|
|
1831
1833
|
static {
|
|
1832
|
-
this.CLIENT_SUPPORTED_VERSIONS = [
|
|
1834
|
+
this.CLIENT_SUPPORTED_VERSIONS = [API_VERSION];
|
|
1833
1835
|
}
|
|
1834
1836
|
/**
|
|
1835
1837
|
* Given a server's version info, pick the highest mutually compatible version.
|
|
@@ -1848,14 +1850,14 @@ var scp = (() => {
|
|
|
1848
1850
|
*/
|
|
1849
1851
|
static async discover(baseUrl) {
|
|
1850
1852
|
try {
|
|
1851
|
-
const response = await fetch(`${baseUrl}
|
|
1853
|
+
const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
|
|
1852
1854
|
if (!response.ok) return null;
|
|
1853
1855
|
const info = await response.json();
|
|
1854
1856
|
const version = this.negotiate(info);
|
|
1855
1857
|
if (version === null) return null;
|
|
1856
1858
|
return {
|
|
1857
1859
|
apiVersion: version,
|
|
1858
|
-
basePath: `${baseUrl}/api/v${version}/
|
|
1860
|
+
basePath: `${baseUrl}/api/v${version}/qcli`
|
|
1859
1861
|
};
|
|
1860
1862
|
} catch {
|
|
1861
1863
|
return null;
|
|
@@ -2680,8 +2682,8 @@ var scp = (() => {
|
|
|
2680
2682
|
};
|
|
2681
2683
|
|
|
2682
2684
|
// src/lib/version.ts
|
|
2683
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
2684
|
-
var
|
|
2685
|
+
var LIBRARY_VERSION = "2.0.0-beta.11";
|
|
2686
|
+
var API_VERSION2 = 2;
|
|
2685
2687
|
|
|
2686
2688
|
// src/lib/interfaces/index.ts
|
|
2687
2689
|
var IScpTransferService_TOKEN = "scp-transfer-service";
|
|
@@ -3012,7 +3014,7 @@ var scp = (() => {
|
|
|
3012
3014
|
constructor() {
|
|
3013
3015
|
this.command = "upload";
|
|
3014
3016
|
this.aliases = ["put"];
|
|
3015
|
-
this.description = "Upload a
|
|
3017
|
+
this.description = "Upload a file to a remote server (use --local to pick from your machine)";
|
|
3016
3018
|
this.acceptsRawInput = true;
|
|
3017
3019
|
this.valueRequired = true;
|
|
3018
3020
|
this.parameters = [
|
|
@@ -3024,8 +3026,8 @@ var scp = (() => {
|
|
|
3024
3026
|
},
|
|
3025
3027
|
{
|
|
3026
3028
|
name: "local-path",
|
|
3027
|
-
description: "Local file path",
|
|
3028
|
-
required:
|
|
3029
|
+
description: "Local file path (from virtual filesystem)",
|
|
3030
|
+
required: false,
|
|
3029
3031
|
type: "string"
|
|
3030
3032
|
},
|
|
3031
3033
|
{
|
|
@@ -3033,35 +3035,55 @@ var scp = (() => {
|
|
|
3033
3035
|
description: "Remote destination path",
|
|
3034
3036
|
required: true,
|
|
3035
3037
|
type: "string"
|
|
3038
|
+
},
|
|
3039
|
+
{
|
|
3040
|
+
name: "local",
|
|
3041
|
+
description: "Pick a file from your local machine via browser file picker",
|
|
3042
|
+
required: false,
|
|
3043
|
+
type: "boolean"
|
|
3036
3044
|
}
|
|
3037
3045
|
];
|
|
3038
3046
|
}
|
|
3039
3047
|
async processCommand(command, context) {
|
|
3040
3048
|
const args = command.args || {};
|
|
3049
|
+
const useLocalPicker = !!args["local"];
|
|
3041
3050
|
let serverName;
|
|
3042
3051
|
let localPath;
|
|
3043
3052
|
let remotePath;
|
|
3044
|
-
if (args["server"] && args["
|
|
3053
|
+
if (args["server"] && args["remote-path"]) {
|
|
3045
3054
|
serverName = String(args["server"]);
|
|
3046
|
-
localPath = String(args["local-path"]);
|
|
3055
|
+
localPath = args["local-path"] ? String(args["local-path"]) : void 0;
|
|
3047
3056
|
remotePath = String(args["remote-path"]);
|
|
3048
3057
|
} else {
|
|
3049
3058
|
const value = command.value?.trim();
|
|
3050
3059
|
if (!value) {
|
|
3051
|
-
context.writer.writeError(
|
|
3060
|
+
context.writer.writeError(
|
|
3061
|
+
useLocalPicker ? "Usage: scp upload --local <server> <remote-path>" : "Usage: scp upload <server> <local-path> <remote-path>"
|
|
3062
|
+
);
|
|
3052
3063
|
return;
|
|
3053
3064
|
}
|
|
3054
3065
|
const parts = value.split(/\s+/);
|
|
3055
|
-
if (
|
|
3056
|
-
|
|
3057
|
-
|
|
3066
|
+
if (useLocalPicker) {
|
|
3067
|
+
if (parts.length < 2) {
|
|
3068
|
+
context.writer.writeError("Usage: scp upload --local <server> <remote-path>");
|
|
3069
|
+
return;
|
|
3070
|
+
}
|
|
3071
|
+
serverName = parts[0];
|
|
3072
|
+
remotePath = parts[1];
|
|
3073
|
+
} else {
|
|
3074
|
+
if (parts.length < 3) {
|
|
3075
|
+
context.writer.writeError("Usage: scp upload <server> <local-path> <remote-path>");
|
|
3076
|
+
return;
|
|
3077
|
+
}
|
|
3078
|
+
serverName = parts[0];
|
|
3079
|
+
localPath = parts[1];
|
|
3080
|
+
remotePath = parts[2];
|
|
3058
3081
|
}
|
|
3059
|
-
serverName = parts[0];
|
|
3060
|
-
localPath = parts[1];
|
|
3061
|
-
remotePath = parts[2];
|
|
3062
3082
|
}
|
|
3063
|
-
if (!serverName || !localPath || !remotePath) {
|
|
3064
|
-
context.writer.writeError(
|
|
3083
|
+
if (!serverName || !useLocalPicker && !localPath || !remotePath) {
|
|
3084
|
+
context.writer.writeError(
|
|
3085
|
+
useLocalPicker ? "Usage: scp upload --local <server> <remote-path>" : "Usage: scp upload <server> <local-path> <remote-path>"
|
|
3086
|
+
);
|
|
3065
3087
|
return;
|
|
3066
3088
|
}
|
|
3067
3089
|
const server = resolveServer(serverName, context);
|
|
@@ -3080,18 +3102,30 @@ var scp = (() => {
|
|
|
3080
3102
|
context.writer.writeError("SCP transfer service not available.");
|
|
3081
3103
|
return;
|
|
3082
3104
|
}
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3105
|
+
let content;
|
|
3106
|
+
let filename;
|
|
3107
|
+
if (useLocalPicker) {
|
|
3108
|
+
const picked = await fileService.uploadFromBrowser();
|
|
3109
|
+
if (!picked) {
|
|
3110
|
+
context.writer.writeln("Upload cancelled.");
|
|
3111
|
+
return;
|
|
3112
|
+
}
|
|
3113
|
+
content = picked.content;
|
|
3114
|
+
filename = picked.name;
|
|
3115
|
+
} else {
|
|
3116
|
+
context.spinner?.show(`Reading local file "${localPath}"...`);
|
|
3117
|
+
content = await fileService.readFile(localPath);
|
|
3086
3118
|
if (content === null) {
|
|
3087
3119
|
context.spinner?.hide();
|
|
3088
3120
|
context.writer.writeError(`Local file not found: ${localPath}`);
|
|
3089
3121
|
return;
|
|
3090
3122
|
}
|
|
3091
|
-
|
|
3092
|
-
|
|
3093
|
-
|
|
3094
|
-
)
|
|
3123
|
+
filename = localPath.split("/").pop() || "file";
|
|
3124
|
+
}
|
|
3125
|
+
context.spinner?.show(
|
|
3126
|
+
`Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
|
|
3127
|
+
);
|
|
3128
|
+
try {
|
|
3095
3129
|
await transferService.upload(
|
|
3096
3130
|
serverUrl(server),
|
|
3097
3131
|
remotePath,
|
|
@@ -3109,8 +3143,11 @@ var scp = (() => {
|
|
|
3109
3143
|
}
|
|
3110
3144
|
}
|
|
3111
3145
|
writeDescription(context) {
|
|
3112
|
-
context.writer.writeln("Upload a
|
|
3113
|
-
context.writer.writeln("
|
|
3146
|
+
context.writer.writeln("Upload a file to a remote server.");
|
|
3147
|
+
context.writer.writeln("");
|
|
3148
|
+
context.writer.writeln("Usage:");
|
|
3149
|
+
context.writer.writeln(" scp upload <server> <local-path> <remote-path> Upload from virtual filesystem");
|
|
3150
|
+
context.writer.writeln(" scp upload --local <server> <remote-path> Pick from your machine via browser");
|
|
3114
3151
|
}
|
|
3115
3152
|
};
|
|
3116
3153
|
|
|
@@ -3302,6 +3339,7 @@ var scp = (() => {
|
|
|
3302
3339
|
this.description = "SCP-like file transfer between browser and remote servers";
|
|
3303
3340
|
this.author = DefaultLibraryAuthor;
|
|
3304
3341
|
this.version = LIBRARY_VERSION;
|
|
3342
|
+
this.metadata = { icon: "\u{1F4C1}", module: "file management" };
|
|
3305
3343
|
this.acceptsRawInput = true;
|
|
3306
3344
|
this.processors = [
|
|
3307
3345
|
new CliScpLsProcessor(),
|
|
@@ -3457,27 +3495,27 @@ var scp = (() => {
|
|
|
3457
3495
|
// src/lib/services/scp-transfer.service.ts
|
|
3458
3496
|
var ScpTransferService = class {
|
|
3459
3497
|
async ls(serverUrl2, path, headers) {
|
|
3460
|
-
const res = await this._fetch(`${serverUrl2}/api/
|
|
3498
|
+
const res = await this._fetch(`${serverUrl2}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {
|
|
3461
3499
|
headers
|
|
3462
3500
|
});
|
|
3463
3501
|
const data = await res.json();
|
|
3464
3502
|
return data.entries;
|
|
3465
3503
|
}
|
|
3466
3504
|
async cat(serverUrl2, path, headers) {
|
|
3467
|
-
const res = await this._fetch(`${serverUrl2}/api/
|
|
3505
|
+
const res = await this._fetch(`${serverUrl2}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {
|
|
3468
3506
|
headers
|
|
3469
3507
|
});
|
|
3470
3508
|
const data = await res.json();
|
|
3471
3509
|
return data.content;
|
|
3472
3510
|
}
|
|
3473
3511
|
async stat(serverUrl2, path, headers) {
|
|
3474
|
-
const res = await this._fetch(`${serverUrl2}/api/
|
|
3512
|
+
const res = await this._fetch(`${serverUrl2}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {
|
|
3475
3513
|
headers
|
|
3476
3514
|
});
|
|
3477
3515
|
return await res.json();
|
|
3478
3516
|
}
|
|
3479
3517
|
async download(serverUrl2, path, headers, onProgress, signal) {
|
|
3480
|
-
const res = await this._fetch(`${serverUrl2}/api/
|
|
3518
|
+
const res = await this._fetch(`${serverUrl2}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {
|
|
3481
3519
|
headers,
|
|
3482
3520
|
signal
|
|
3483
3521
|
});
|
|
@@ -3511,21 +3549,21 @@ var scp = (() => {
|
|
|
3511
3549
|
const formData = new FormData();
|
|
3512
3550
|
formData.append("path", remotePath);
|
|
3513
3551
|
formData.append("file", new Blob([content]), filename);
|
|
3514
|
-
await this._fetch(`${serverUrl2}/api/
|
|
3552
|
+
await this._fetch(`${serverUrl2}/api/qcli/fs/upload`, {
|
|
3515
3553
|
method: "POST",
|
|
3516
3554
|
body: formData,
|
|
3517
3555
|
headers
|
|
3518
3556
|
});
|
|
3519
3557
|
}
|
|
3520
3558
|
async mkdir(serverUrl2, path, headers) {
|
|
3521
|
-
await this._fetch(`${serverUrl2}/api/
|
|
3559
|
+
await this._fetch(`${serverUrl2}/api/qcli/fs/mkdir`, {
|
|
3522
3560
|
method: "POST",
|
|
3523
3561
|
headers: { "Content-Type": "application/json", ...headers },
|
|
3524
3562
|
body: JSON.stringify({ path })
|
|
3525
3563
|
});
|
|
3526
3564
|
}
|
|
3527
3565
|
async rm(serverUrl2, path, headers) {
|
|
3528
|
-
await this._fetch(`${serverUrl2}/api/
|
|
3566
|
+
await this._fetch(`${serverUrl2}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {
|
|
3529
3567
|
method: "DELETE",
|
|
3530
3568
|
headers
|
|
3531
3569
|
});
|
|
@@ -3548,7 +3586,7 @@ var scp = (() => {
|
|
|
3548
3586
|
|
|
3549
3587
|
// src/cli-entrypoint.ts
|
|
3550
3588
|
var module = {
|
|
3551
|
-
apiVersion:
|
|
3589
|
+
apiVersion: API_VERSION2,
|
|
3552
3590
|
name: "@qodalis/cli-scp",
|
|
3553
3591
|
processors: [new CliScpCommandCommandProcessor()],
|
|
3554
3592
|
services: [
|