Публичный npm-пакет @rshval/back-kit с серверными утилитами для Node.js/TypeScript проектов.
Репозиторий используется для внутренних проектов автора. Любое использование третьими лицами выполняется на их страх и риск.
npm i @rshval/back-kitПакет ESM-only ("type": "module"). Для CommonJS используйте динамический import().
Ниже перечислены все публичные экспорты из пакета (через src/index.ts) и короткие примеры.
Создаёт объект параметров письма для nodemailer. Поддерживает to как строку (обычная отправка) или объект формы (MailOptionsBody) для заявок/обратной связи.
import { createMailOptions } from '@rshval/back-kit'
const options = createMailOptions({
from: 'robot@example.com',
to: 'user@example.com',
subject: 'Hello',
text: 'Welcome!'
})Создаёт transport через nodemailer, отправляет письмо и возвращает строку с результатом отправки.
import { sendEmailWithConfig } from '@rshval/back-kit'
await sendEmailWithConfig({
nodemailerConfig: {
host: 'smtp.example.com',
port: 465,
secure: true,
auth: { user: 'robot@example.com', pass: '***' }
},
to: 'user@example.com',
subject: 'Reset password',
text: 'Code: 123456'
})Строит base URL по конфигу приложения. В development добавляет :port.
import { getBaseUrlByConfig } from '@rshval/back-kit'
const base = getBaseUrlByConfig(
{
NODE_ENV: 'development',
server: { domain: 'localhost', port: 3000 },
jwt: {}
},
'/api'
)
// //localhost:3000/apiСоздаёт JWT-токен на основе config.jwt.JWT_KEY (или JWT_KEY_NO_ENV).
import { createTokenByConfig } from '@rshval/back-kit'
const token = createTokenByConfig({
config: {
server: { domain: 'example.com' },
jwt: { JWT_KEY: 'super-secret' }
},
user: { _id: '64a...' },
expiresIn: '7d'
})Генерирует случайный числовой PIN в диапазоне (10000..99990 по умолчанию).
import { createPinCode } from '@rshval/back-kit'
const pin = createPinCode()Пытается определить IP клиента из req.ip, сокетов и x-forwarded-for.
import { getIp } from '@rshval/back-kit'
const ip = await getIp(req)Транслитерирует строку в URL-friendly slug (-, lower-case).
import { translitUrl } from '@rshval/back-kit'
const slug = translitUrl('Пример страницы')
// primer-stranicyВозвращает RegExp для проверки email.
Возвращает RegExp для пароля (минимум 8 символов, буквы + цифры).
Проверяет корректность email.
Проверяет номер телефона через libphonenumber-js.
Проверяет длину кода.
Проверяет пустую строку (trim) или пустой объект.
import {
patternEmail,
patternPassword,
isValidEmail,
isValidPhoneNumber,
isValidCode,
isEmpty
} from '@rshval/back-kit'
const emailRegex = patternEmail()
const passwordRegex = patternPassword()
isValidEmail('user@example.com') // true
isValidPhoneNumber('+79991234567') // true/false
isValidCode('123456', 6) // true
isEmpty(' ') // true
isEmpty({}) // trueВозвращает функцию (baseUrl?) => string.
Возвращает функцию создания JWT с уже «зашитым» конфигом.
Возвращает функцию отправки email с уже «зашитым» SMTP-конфигом.
import {
buildGetBaseUrl,
buildCreateToken,
buildSendEmail
} from '@rshval/back-kit'
const getBaseUrl = buildGetBaseUrl({
NODE_ENV: 'production',
server: { domain: 'example.com' },
jwt: { JWT_KEY: 'secret' }
})
const createToken = buildCreateToken({
server: { domain: 'example.com' },
jwt: { JWT_KEY: 'secret' }
})
const sendEmail = buildSendEmail({
host: 'smtp.example.com',
port: 465,
secure: true,
auth: { user: 'robot@example.com', pass: '***' }
})Запускает подключение к MongoDB через mongoose, логирует статусы и умеет ретраить подключение.
import { startMongoDatabase } from '@rshval/back-kit'
await startMongoDatabase({
config: {
name: 'main',
connect: process.env.MONGO_URI,
params: {}
},
logger: console
})Создаёт LRU cache-сервис с методами:
get(key)set(key, data, compareKey?, compareValue?, ttlMs?)delete(key)getId(val)keys()clear()entries()(еслиexposeEntries: true)values()(еслиexposeValues: true)
import { createCacheService } from '@rshval/back-kit'
const cache = createCacheService({ ttl: 60_000 })
const key = cache.getId({ service: 'users', page: 1 })
await cache.set(key, [{ s: 'state', data: [1, 2, 3] }])
const value = await cache.get(key)Создаёт middleware-обёртку над cache-сервисом с методами:
get(id)set(id, data, expDataTime)del(id)delByPrefix(prefix)(еслиincludeDelByPrefix: true)
import { createCacheService, createCacheMiddleware } from '@rshval/back-kit'
const cache = createCacheService({ supportTtlInSet: true })
const cm = createCacheMiddleware({
cache,
passTtlToCacheSet: true,
includeDelByPrefix: true
})
await cm.set('users:list', [{ id: 1 }], 60_000)
const cached = await cm.get('users:list')
await cm.delByPrefix?.('users:')Возвращает фабрику логгеров. Для каждого namespace (std) пишет:
logs/<std>/stdout.loglogs/<std>/stderr.log
import { createLoggerService } from '@rshval/back-kit'
const makeLogger = createLoggerService({ rootdir: process.cwd() })
const logger = makeLogger('api')
logger.log('started')Создаёт сервис клиента socket.io с методами:
doSocketClient()— старт подключенияgetSocketClient()— вернуть текущий инстанс
import { createSocketClientService } from '@rshval/back-kit'
const ws = createSocketClientService({
wsName: 'worker',
socketBase: 'https://example.com',
logger: console,
runWorkers: () => {
// jobs
}
})
ws.doSocketClient()Создаёт сервис с методами:
createPaymentLink({...})— сформировать ссылку на оплатуvalidateCallback(payload, rawBody?)— проверить подпись callbackparseCallback(payload)— нормализовать callback в удобный объект
import { createPaymasterService } from '@rshval/back-kit'
const paymaster = createPaymasterService({
paymaster: {
merchantId: 'merchant-id',
secretKey: 'secret',
checkoutUrl: 'https://paymaster.ru/Payment/Init',
checkSignature: true
},
clientServer: 'https://site.example.com',
serverBaseUrl: 'https://api.example.com'
})
const link = paymaster.createPaymentLink({
requestId: 'order_123',
amount: 1499,
description: 'Order #123'
})Создаёт сервис шаблонов email с методами:
extractVariables(template)— список{{variables}}renderTemplate(template, context?)— рендер subject/bodysendByKey({ key, to, context? })— найти шаблон, отрендерить и отправить
import { createMailTemplateService } from '@rshval/back-kit'
const mailTemplates = createMailTemplateService({
findTemplate: async ({ key }) =>
key === 'welcome'
? { subject: 'Hi, {{user.name}}', bodyText: 'Hello {{user.name}}!' }
: null,
sendEmail: async (to, subject, text) => {
console.log('send', to, subject, text)
}
})
await mailTemplates.sendByKey({
key: 'welcome',
to: 'user@example.com',
context: { user: { name: 'Alex' } }
})Сравнивает данные «до/после» и возвращает массив изменений по выбранным полям.
Создаёт запись аудита через переданную функцию save. Если изменений нет — возвращает null.
import { buildAuditChanges, createAuditLog } from '@rshval/back-kit'
const changes = buildAuditChanges({
beforeData: { name: 'Old', role: 'user' },
afterData: { name: 'New', role: 'user' },
fieldsToCheck: ['name', 'role'],
protectedFields: ['role']
})
await createAuditLog({
entityType: 'user',
entityId: '507f1f77bcf86cd799439011',
action: 'update',
changedBy: '507f191e810c19729de860ea',
changes,
save: async (payload) => payload
})Возвращает методы:
checkDatabaseIsConnected()— проверяет состояние БД через кэшsetSeedData(SeedModel, arr)— добавляет seed-данные после подтверждения подключения
import { createSeedFunctions, createCacheService } from '@rshval/back-kit'
const cache = createCacheService()
const { setSeedData } = createSeedFunctions({ cache })
// await setSeedData(UserModel, [{ name: 'Admin' }])Возвращает HTTP-клиент с методами:
get(path, token?)getXml(path, token?)del(path, token?)post(path, data, token?, xml?, contentType?)put(path, data, token)
import { createApiService } from '@rshval/back-kit'
const api = createApiService({ userAgent: 'my-service/1.0.0', logger: console })
const users = await api.get('https://api.example.com/users')
const created = await api.post('https://api.example.com/users', { name: 'Alex' })Также экспортируется тип токена:
import type { Token } from '@rshval/back-kit'Возвращает сумму двух чисел.
Логирует 99 и возвращает 8.
import { add, test2 } from '@rshval/back-kit'
add(2, 3) // 5
test2() // 8См. подробную инструкцию: docs/publishing.md.
npm install
npm run build- ESM:
dist/index.js - Типы:
dist/index.d.ts