UNPKG

@tanstack/cli

Version:
67 lines (66 loc) 2.53 kB
import { basename, resolve } from 'node:path'; import validatePackageName from 'validate-npm-package-name'; const FALLBACK_PACKAGE_NAME = 'tanstack-app'; export function sanitizePackageName(name) { return name .toLowerCase() .replace(/\s+/g, '-') // Replace spaces with hyphens .replace(/_/g, '-') // Replace underscores with hyphens .replace(/[^a-z0-9-]/g, '') // Remove invalid characters .replace(/^[^a-z]+/, '') // Ensure it starts with a letter .replace(/-+/g, '-') // Collapse multiple hyphens .replace(/-$/, ''); // Remove trailing hyphen } export function getCurrentDirectoryName() { return basename(process.cwd()); } export function getDirectoryPackageName(directory) { return sanitizePackageName(basename(resolve(directory))) || FALLBACK_PACKAGE_NAME; } export function getCurrentDirectoryPackageName() { return getDirectoryPackageName(process.cwd()); } export function isCurrentDirectoryProjectNameInput(name) { const normalized = name.trim(); return normalized === '' || normalized === '.'; } export function resolveProjectLocation({ projectName, targetDir, emptyProjectNameIsCurrentDirectory = false, }) { const normalizedProjectName = projectName?.trim() ?? ''; if (normalizedProjectName === '.') { return { projectName: getCurrentDirectoryPackageName(), targetDir: resolve(process.cwd()), }; } if (normalizedProjectName) { return { projectName: normalizedProjectName, targetDir: targetDir ? resolve(targetDir) : resolve(process.cwd(), normalizedProjectName), }; } if (targetDir) { const resolvedTargetDir = resolve(targetDir); return { projectName: getDirectoryPackageName(resolvedTargetDir), targetDir: resolvedTargetDir, }; } if (emptyProjectNameIsCurrentDirectory) { return { projectName: getCurrentDirectoryPackageName(), targetDir: resolve(process.cwd()), }; } return undefined; } export function validateProjectName(name) { const { validForNewPackages, validForOldPackages, errors, warnings } = validatePackageName(name); const error = errors?.[0] || warnings?.[0]; return { valid: validForNewPackages && validForOldPackages, error: error?.replace(/name/g, 'Project name') || 'Project name does not meet npm package naming requirements', }; }