项目文件夹

文件
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

75 行
2.7 KiB
TypeScript

import { Metadata } from '@/sync/storageTypes';
/**
* Resolves a path relative to the root path from metadata.
* ALL paths are treated as relative to the metadata root, regardless of their format.
* If metadata is not provided, returns the original path.
*
* @param path - The path to resolve (always treated as relative to the metadata root)
* @param metadata - Optional metadata containing the root path
* @returns The resolved absolute path
*/
export function resolvePath(path: string, metadata: Metadata | null): string {
if (!metadata) {
return path;
}
if (path.toLowerCase().startsWith(metadata.path.toLowerCase())) {
// Check that the path is actually within the metadata path by ensuring
// there's either an exact match or a path separator after the metadata path
const remainder = path.slice(metadata.path.length);
if (remainder === '' || remainder.startsWith('/')) {
let out = remainder;
if (out.startsWith('/')) {
out = out.slice(1);
}
if (out === '') {
return '<root>';
}
return out;
}
}
return path;
}
/**
* Resolves paths starting with ~ to absolute paths using the provided home directory.
* Non-tilde paths are returned unchanged.
*
* @param path - The path to resolve (may start with ~)
* @param homeDir - The user's home directory (e.g., '/Users/steve' or 'C:\Users\steve')
* @returns The resolved absolute path
*/
export function resolveAbsolutePath(path: string, homeDir?: string): string {
// Return original path if it doesn't start with ~
if (!path.startsWith('~')) {
return path;
}
// Return original path if no home directory provided
if (!homeDir) {
return path;
}
// Handle exact ~ (home directory)
if (path === '~') {
// Remove trailing separator for consistency
return homeDir.endsWith('/') || homeDir.endsWith('\\')
? homeDir.slice(0, -1)
: homeDir;
}
// Handle ~/ and ~/path (home directory with subdirectory)
if (path.startsWith('~/')) {
const relativePart = path.slice(2); // Remove '~/'
// Detect path separator based on homeDir - prefer the last separator found
const hasBackslash = homeDir.lastIndexOf('\\') > homeDir.lastIndexOf('/');
const separator = hasBackslash ? '\\' : '/';
const normalizedHome = homeDir.endsWith('/') || homeDir.endsWith('\\')
? homeDir.slice(0, -1)
: homeDir;
return normalizedHome + separator + relativePart;
}
// Handle ~username paths (not supported, return original)
return path;
}