npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

fe-card-validation-hooks

v0.0.7

Published

custom card validation hooks

Readme

Hooks Module

  • Custom card validation hooks made by paran and fe

Quick Start

  • install with npm:
npm install fe-card-validation-hooks

Hooks

  • 에러가 발생하면 아래 문서에 작성된 순서대로 해당하는 에러 문자열이 validationResulterrorMessages 배열에 저장합니다.
  • 사용하고 싶은 에러 메시지를 각 handler가 반환하는 배열에서 문자열로 찾아 사용하거나 배열을 순회하면서 모두 사용할 수 있습니다.

useCardNumber

  • 입력한 카드 번호에 맞는 카드 브랜드를 반환합니다.
  • 카드 브랜드에 맞는 카드 번호 자릿수를 제한합니다.
  • 숫자 이외의 입력을 차단합니다.
  • 카드 브랜드마다 다른 포맷팅 규칙을 적용해서 배열 형태로 반환합니다. join을 통해 사용하세요.

return { cardNumberInfo, handleCardNumberChange }

cardNumberInfo {
  cardNumber: string[];
  cardType: CardBrand;
  isValid: boolean;
  errorMessages?: string[];
}

handleCardNumberChange(cardNumber: string)

사용 예시:

const { cardNumberInfo, handleCardNumberChange } = useCardNumber();

{
  return (
    <input
      type='text'
      value={cardNumberInfo.cardNumber.join(' ')}
      onChange={(e) => handleCardNumberInputChange(e.target.value)}
    />
  );
}

반환 에러 문자열:

  • cardNumber의 길이가 해당 카드 브랜드의 길이가 아닌 경우: {해당 카드 브랜드 자릿수}자리 숫자를 입력해주세요.

useExpiryDateValidation

return { validationResult, handleExpiryDateChange }

validationResult {
  isValidMonth: boolean;
  monthErrorMessage?: string[];

  isValidYear: boolean;
  yearErrorMessage?: string[];
}

handleExpiryDateChange(month: string, year: string)

반환 에러 문자열:

  • 월 입력이 숫자가 아닌 경우: 숫자로 입력해주세요.

  • 월 입력이 범위를 벗어난 경우: 올바른 월을 입력해주세요 (01~12).

  • 연 입력이 숫자가 아닌 경우: 숫자로 입력해주세요.

  • 월 입력이 2자가 아닌 경우: 2자로 입력해주세요.

  • 연 입력이 2자가 아닌 경우: 2자로 입력해주세요.

  • 현재 년/월 이전의 값을 입력한 경우: 만료된 카드입니다.

사용 예시:

  const [expiryMonth, setExpiryMonth] = useState('');
  const [expiryYear, setExpiryYear] = useState('');

  const { validationResult: expiryValidationResult, handleExpiryDateChange } = useExpiryDateValidation();

  <input
    type='text'
    value={expiryMonth}
    maxLength={2}
    onChange={(e) => {
      setExpiryMonth(e.target.value);
      handleExpiryDateChange(e.target.value, expiryYear);
    }}
  />

  <input
    type='text'
    value={expiryYear}
    maxLength={2}
    onChange={(e) => {
      setExpiryYear(e.target.value);
      handleExpiryDateChange(expiryMonth, e.target.value);
    }}
  />

useCVCValidation

return { validationResult, handleCVCChange }

validationResult {
  isValid: boolean;
  errorMessage?: string[];
}

handleCVCChange(value: string, maxLength: number)

반환 에러 문자열:

  • value가 숫자가 아닌 경우: 숫자로 입력해주세요.
  • value의 길이가 maxLength가 아닌 경우: {maxLength}자로 입력해주세요.

사용 예시:

const [cvc, setCVC] = useState('');
const { validationResult: cvcValidationResult, handleCVCChange } = useCVCValidation();

<input
  type='text'
  value={cvc}
  onChange={(e) => {
    setCVC(e.target.value);
    handleCVCChange(e.target.value, 4);
  }}
/>;

useCardHolderValidation

return { validationResult, handleCardHolderChange };

validationResult {
  isValid: boolean;
  errorMessage?: string[];
}

handleCardHolderChange = (value: string, maxLength: number)

반환 에러 문자열:

  • value가 대문자 영어가 아닌 경우: 1개 이하의 공백이 연속된 대문자 영어로 입력해주세요.
  • value의 길이가 maxlength를 넘을 경우: ${maxLength}자 이내로 입력해주세요.

사용 예시:

const [cardHolder, setCardHolder] = useState('');
const { validationResult: holderValidationResult, handleCardHolderChange } = useCardHolderValidation();

<input
  type='text'
  value={cardHolder}
  onChange={(e) => {
    setCardHolder(e.target.value);
    handleCardHolderChange(e.target.value, 15);
  }}
/>;

useCardPasswordValidation

return { validationResult, handleCardPasswordChange }

validationResult {
  isValid: boolean;
  errorMessage?: string[];
}

handleCardPasswordChange(value: string, maxLength: number)

반환 에러 문자열:

  • value가 숫자가 아닌 경우: 숫자로 입력해주세요.
  • value의 길이가 maxLength가 아닌 경우: ${maxLength}자리 비밀번호를 입력해주세요.

사용 예시:

const [cardPassword, setCardPassword] = useState('');
const { validationResult: passwordValidationResult, handleCardPasswordChange } = useCardPasswordValidation();

<input
  type='text'
  value={cardPassword}
  maxLength={2}
  onChange={(e) => {
    setCardPassword(e.target.value);
    handleCardPasswordChange(e.target.value);
  }}
/>;

useCardType

  • (참고) useCardNumber 훅 내부에서 useCardType을 사용하고 있습니다. 일반적인 상황에서는 useCardNumber를 사용하세요.

return { handleCardTypeChange };

handleCardTypeChange = (value: string)

반환값:

  • value가 4로 시작하는 경우: Visa
  • value가 51~55 사이의 숫자로 시작하는 경우: Mastercard
  • value가 36으로 시작하는 경우: Diners
  • value가 34 또는 37로 시작하는 경우: AMEX
  • value가 622126~622925로 시작하거나, 624~626으로 시작하거나, 6282~6288로 시작하는 경우: Unionpay
  • 그 외: None