@shutootaki/gwm
Version:
git worktree manager CLI
99 lines • 2.93 kB
JavaScript
/**
* バリデーション共通ユーティリティ
*/
import { BRANCH_NAME } from './constants.js';
/**
* ブランチ名をワークツリーパス用にサニタイズする
* スラッシュをハイフンに置換する
*/
export function sanitizeBranchName(branch) {
return branch.replace(/\//g, '-');
}
/**
* ブランチ名が有効かどうかをチェック
*/
export function isValidBranchName(branch) {
if (!branch || branch.trim() === '') {
return false;
}
// Git ブランチ名の基本的なルール
// - 空文字列ではない
// - 制御文字を含まない
// - 連続したドットを含まない
// - スペースで開始・終了しない
const trimmed = branch.trim();
// 基本チェック
if (trimmed.length === 0 || trimmed.length > BRANCH_NAME.MAX_LENGTH) {
return false;
}
// 制御文字や無効文字のチェック
if (BRANCH_NAME.FORBIDDEN_CHARS.test(trimmed)) {
return false;
}
// 連続ドットのチェック
if (BRANCH_NAME.FORBIDDEN_PATTERNS.test(trimmed)) {
return false;
}
// 開始・終了文字のチェック
if (trimmed.startsWith('.') || trimmed.endsWith('.')) {
return false;
}
return true;
}
/**
* 文字列が空でないかチェック
*/
export function isNonEmptyString(value) {
return typeof value === 'string' && value.trim() !== '';
}
/**
* 配列が空でない文字列の配列かチェック
*/
export function isNonEmptyStringArray(value) {
return (Array.isArray(value) &&
value.length > 0 &&
value.every((item) => isNonEmptyString(item)));
}
/**
* 数値が指定された範囲内にあるかチェック
*/
export function isNumberInRange(value, min, max) {
return typeof value === 'number' && value >= min && value <= max;
}
/**
* 非負の数値かチェック
*/
export function isNonNegativeNumber(value) {
return typeof value === 'number' && value >= 0;
}
/**
* ファイルパスが安全かチェック(基本的なチェック)
*/
export function isSafePath(path) {
if (!isNonEmptyString(path)) {
return false;
}
// パストラバーサル攻撃の基本的な防止
if (path.includes('..') || path.includes('//')) {
return false;
}
// null文字やその他の危険な文字
// eslint-disable-next-line no-control-regex
if (/[\x00\r\n]/.test(path)) {
return false;
}
return true;
}
/**
* オブジェクトが指定されたプロパティを持つかチェック
*/
export function hasProperty(obj, prop) {
return typeof obj === 'object' && obj !== null && prop in obj;
}
/**
* 型ガード: オブジェクトかつnullでない
*/
export function isObject(value) {
return typeof value === 'object' && value !== null && !Array.isArray(value);
}
//# sourceMappingURL=validation.js.map