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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@devim-front/helper

v1.0.1

Published

Содержит реализацию шаблона проектирования 'помощник'.

Readme

Devim Front: Helper

Содержит реализацию шаблона проектирования "помощник".

Установка

Подключите этот пакет в зависимости:

npm i -S @devim-front/helper

Общие концепции

Помощник или хэлпер - класс, содержащий статические методы или свойства, которые имеющие только геттер. В помощниках запрещено использование не статических методов, объявление статических переменных или использование свойств, имеющих сеттеры. Также запрещено создавать экземпляры класса. Все методы, представленные в хэлпере, должны быть чистыми. Также следует помнить, что помощник не может обращаться к нечистым методам других классов, например, к сервисам или хранилищам. Если специфика решаемой задачи требует нарушить одно из представленных выше правил, вместо помощника следует использовать сервис.

Помощник служит для того, чтобы предоставлять функционал, не требующий сохранения промежуточного состояния (рассчёты по формулам, форматирование значений и тому подобное). Нормальная практика - группировать помощники по типам сущностей, с которыми они работают (StringHelper, DateHelper, AmountHelper). Единственный Helper на весь проект, содержащий десятки методов - это грубая архитектурная ошибка.

API

Документация находится в этом разделе.

Пример

Давайте спроектируем собственный простой помощник.

Допустим, в нашем проекте есть работа с телефонными номерами. Во-первых, договоримся, что внутренный формат телефонного номера выглядит как "+70000000000". Придя к единому формату мы исключим ошибки при преобразовании данных, когда, например, форма ввода телефоннного номера ожидает человекопонятный формат "+7 (000) 000-00-00", а модуль общения с API оперирует целыми одинадцатизначными числами вида 70000000000.

Таким образом, в помощнике мы должны предоставить функционал для:

  • валидации обоих форматов номера;
  • приведения обоих форматов к служебному;
  • преобразования номера из служебного формата в человекопонятный и числовой.

В этой реализации мы воспрользуемся встроенными ошибками из библиотеки @devim-front/error.

// PhoneHelper.ts
import { Helper as Base } from '@devim-front/helper';
import { UnreachableError, ExpectationError } from '@devim-front/error';

export class PhoneHelper extends Base {
  public static validateNumber(value: number) {
    return /^7\d{10}$/.test(String(value));
  }

  public static validateDisplay(value: string) {
    return /^\+7\s\(\d{3}\)\s\d{3}-\d{2}-\d{2}$/.test(value);
  }

  public static parseNumber(value: number) {
    const isValid = this.validateNumber(value);

    if (!isValid) {
      throw new ExpectationError(
        'PhoneHelper.parseNumber(value)',
        'in format 70000000000',
        value
      );
    }

    return `+${value}`;
  }

  public static parseDisplay(value: string) {
    const isValid = this.validateDisplay(value);

    if (!isValid) {
      throw new ExpectationError(
        'PhoneHelper.parseDisplay(value)',
        'in format "+70000000000"',
        value
      );
    }

    const match = value.match(/^\+7\s\((\d{3})\)\s(\d{3})-(\d{2})-(\d{2})$/);

    if (match == null) {
      throw new UnreachableError();
    }

    const [, partA, partB, partC, partD] = match;
    return `+7${partA}${partB}${partC}${partD}`;
  }

  public static formatNumber(phone: string) {
    const text = phone.substr(1);
    return Number(text);
  }

  public static formatDisplay(phone: string) {
    const match = phone.match(/^\+7(\d{3})(\d{3})(\d{2})(\d{2})^/);

    if (match == null) {
      throw new UnreachableError();
    }

    const [, partA, partB, partC, partD] = match;
    return `+7 (${partA}) ${partB}-${partC}-${partD}`;
  }
}

Собственно, это и есть базовый функционал помощника по работе с телефонными номерами.