Spaces:
Running
Running
| import crypto from 'node:crypto'; | |
| import path from 'node:path'; | |
| // Short stable IDs keep project routes readable while still deriving from the full path hash. | |
| const PROJECT_ID_LENGTH = 16; | |
| export function normalizeComparablePath(value) { | |
| if (!value || typeof value !== 'string') { | |
| return ''; | |
| } | |
| const normalized = path.resolve(value); | |
| return process.platform === 'win32' ? normalized.toLowerCase() : normalized; | |
| } | |
| export function projectIdFor(projectPath) { | |
| return crypto.createHash('sha1').update(normalizeComparablePath(projectPath)).digest('hex').slice(0, PROJECT_ID_LENGTH); | |
| } | |
| export function displayNameFor(projectPath) { | |
| if (!projectPath || typeof projectPath !== 'string') { | |
| return ''; | |
| } | |
| const parsed = path.parse(projectPath); | |
| return path.basename(projectPath) || parsed.root || projectPath; | |
| } | |
| export function toPublicProject(entry) { | |
| return { | |
| id: entry.id, | |
| name: entry.name, | |
| path: entry.path, | |
| trusted: entry.trusted, | |
| updatedAt: entry.updatedAt, | |
| sessionCount: entry.sessionCount || 0 | |
| }; | |
| } | |