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

@bemedev/types

v0.4.2

Published

Type definitions for Bemedev projects

Readme

@bemedev/types

A comprehensive collection of utility TypeScript types and functions for advanced type manipulation and runtime validation in modern TypeScript applications.

Installation

npm install @bemedev/types
# or
yarn add @bemedev/types
# or
pnpm add @bemedev/types

Features

  • Castings: Runtime functions for type casting, validation, and manipulation

  • Transform: Schema-based object transformation with custom and partial support

  • Typings: Compile-time type utilities for type-level operations

  • Types: Advanced TypeScript utility types for complex type manipulations

  • Complete support for arrays, objects, strings, numbers, booleans, and nullable values

  • Deep readonly, partial, and required type transformations

  • Union and intersection type utilities

Usage

Basic Import

import { castings, transform, typings, types } from '@bemedev/types';

Castings Module

The castings module provides runtime functions for type validation and manipulation:

Arrays

import { castings } from '@bemedev/types';

// Array validation and casting
const isArray = castings.arrays.is([1, 2, 3]); // true
const arrayLength = castings.arrays.lengthOf(1, 2, 3); // 3
const reversed = castings.arrays.reverse(1, 2, 3); // [3, 2, 1]

// Tuple operations
const tuple = castings.arrays.tupleOf('a', 'b', 'c'); // ['a', 'b', 'c']
const fixedTuple = castings.arrays.tupleOf.number('item', 3); // ['item', 'item', 'item']

// Array filtering
const extracted = castings.arrays.extract([1, 2, 3, 4], 2, 4); // [2, 4]
const excluded = castings.arrays.exclude([1, 2, 3, 4], 2, 4); // [1, 3]

Objects

// Object validation and manipulation
const isObject = castings.objects.is({ key: 'value' }); // true
const frozenObj = castings.objects.readonly({ mutable: true }); // Readonly<{mutable: true}>

// Deep operations
const deepReadonly = castings.objects.readonly.deep({
  nested: { value: 'test' },
}); // DeepReadonly<...>

// Object filtering
const picked = castings.objects.pick({ a: 1, b: 2, c: 3 }, 'a', 'c'); // { a: 1, c: 3 }
const omitted = castings.objects.omit({ a: 1, b: 2, c: 3 }, 'b'); // { a: 1, c: 3 }

Strings

// String validation and manipulation
const isString = castings.strings.is('hello'); // true
const length = castings.strings.getLength('hello'); // 5
const uppercase = castings.strings.toUpperCase('hello'); // 'HELLO'
const lowercase = castings.strings.toLowerCase('WORLD'); // 'world'

// String composition
const joined = castings.strings.join(' ', 'hello', 'world'); // 'hello world'
const split = castings.strings.splitBy('a.b.c', '.'); // ['a', 'b', 'c']

// Letter validation
const isLetters = castings.strings.letters.is('abc'); // true
const isLowerLetters = castings.strings.letters.lower.is('abc'); // true

Numbers and Booleans

// Number operations
const isNumber = castings.numbers.is(42); // true
const isDigit = castings.numbers.digit.is(5); // true
const numberString = castings.numbers.getString(123); // '123'

// Boolean operations
const isBoolean = castings.booleans.is(true); // true
const isTrue = castings.booleans.true.is(true); // true
const isFalse = castings.booleans.false.is(false); // true

Common Utilities

// Type checking and casting
const isDefined = castings.commons.isDefined(value); // boolean
const isFunction = castings.commons.function.is(fn); // boolean

// Deep cloning
const cloned = castings.commons.clone(complexObject);

// Const assertion
const readonly = castings.commons.const({ key: 'value' }); // { readonly key: 'value' }

// Partial and required
const partial = castings.commons.partial.deep(obj); // DeepPartial<typeof obj>
const required = castings.commons.required.deep(obj); // DeepRequired<typeof obj>

Transform Module

The transform module provides schema-based object transformation:

import { transform } from '@bemedev/types';

// Basic schema transformation
const userSchema = {
  name: 'string',
  age: 'number',
  active: 'boolean',
};

const result = transform(userSchema);
// Returns: { name: undefined, age: undefined, active: undefined }

// Nested object transformation
const nestedSchema = {
  user: {
    profile: {
      name: 'string',
      settings: {
        theme: 'string',
        notifications: 'boolean',
      },
    },
  },
};

const nestedResult = transform(nestedSchema);
// Returns nested structure with undefined values

// Array transformation
const arraySchema = [
  { id: 'number', name: 'string' },
  { active: 'boolean', config: 'object' },
];

const arrayResult = transform(arraySchema as any);
// Returns array with transformed objects

// Custom values with transform.custom
const customSchema = {
  id: 'number',
  user: transform.custom({
    name: 'John',
    email: '[email protected]',
  }),
  settings: transform.custom(['option1', 'option2']),
};

const customResult = transform(customSchema as any);
// Custom values are wrapped but preserved

// Partial transformation with transform.partial
const partialSchema = transform.partial({
  name: 'string',
  age: 'number',
  preferences: transform.custom(['dark', 'light']),
});

const partialResult = transform(partialSchema);
// Maintains original schema structure

Typings Module

The typings module provides compile-time type utilities: All functions return "undefined" or object with props undefined. Just use it for typings.

import { typings } from '@bemedev/types';

// Array type operations (returns undefined but provides type information)
const arrayType = typings.arrays('a', 'b', 'c'); // Type: string[]
const tupleType = typings.arrays.tupleOf('a', 'b', 'c'); // Type: ['a', 'b', 'c']
const indexesType = typings.arrays.indexes('a', 'b', 'c'); // Type: [0, 1, 2]
const lengthType = typings.arrays.lengthOf(['a', 'b', 'c']); // Type: 3

// Object type operations
const objectType = typings.objects({ key: 'value' }); // Type: {key: string}
const keysType = typings.objects.keys({ a: 1, b: 2 }); // Type: ('a' | 'b')[]
const valuesType = typings.objects.values({ a: 1, b: 'test' }); // Type: (number | string)[]

// String type operations
const stringType = typings.strings('hello'); // Type: string
const lengthStringType = typings.strings.getLength('hello'); // Type: 5
const uppercaseType = typings.strings.toUpperCase('hello'); // Type: 'HELLO'

// Common type utilities
const partialType = typings.commons.partial({ a: 1, b: 'test' }); // Type: Partial<{a: number, b: string}>
const readonlyType = typings.commons.readonly({ mutable: true }); // Type: Readonly<{mutable: boolean}>
const requiredType = typings.commons.required({ optional?: string }); // Type: Required<{optional?: string}>

Types Module

The types module exports advanced TypeScript utility types:

import type { types } from '@bemedev/types';

// Array utility types
type Indices = types.IndexesOfArray<['a', 'b', 'c']>; // 0 | 1 | 2
type Reversed = types.ReverseArray<['a', 'b', 'c']>; // ['c', 'b', 'a']
type TupleLength = types.LengthOfArray<[1, 2, 3]>; // 3
type ArrayElement = types.ElementOfArray<string[]>; // string

// Object utility types
type ObjectKeys = types.KeysOfObject<{ a: 1; b: 2 }>; // 'a' | 'b'
type ObjectValues = types.ValuesOfObject<{ a: 1; b: 'test' }>; // 1 | 'test'
type DeepReadonly = types.DeepReadonly<{ nested: { value: string } }>;
type DeepPartial = types.DeepPartial<{ required: { field: string } }>;

// String utility types
type StringLength = types.LengthOfString<'hello'>; // 5
type Uppercase = types.Uppercase<'hello'>; // 'HELLO'
type Lowercase = types.Lowercase<'WORLD'>; // 'world'
type Split = types.Split<'a.b.c', '.'>; // ['a', 'b', 'c']

// Union and intersection types
type UnionToTuple = types.UnionToTuple<'a' | 'b' | 'c'>; // ['a', 'b', 'c']
type TupleToUnion = types.TupleToUnion<['a', 'b', 'c']>; // 'a' | 'b' | 'c'

// Utility types for complex operations
type Primitive = types.Primitive; // string | number | boolean | null | undefined
type NonNullable = types.NonNullable<string | null>; // string
type Defaulted = types.Defaulted<string | undefined, 'default'>; // string | 'default'

// Function types
type Checker<T> = types.Checker<T>; // (value: unknown) => value is T
type AsyncFunction = types.Fn<[string, number], Promise<boolean>>; // (arg1: string, arg2: number) => Promise<boolean>

Complete Example

import { castings, transform, typings, types } from '@bemedev/types';

// Define a user schema for transformation
const userSchema = {
  id: 'number',
  profile: {
    name: 'string',
    email: 'string',
    preferences: transform.custom({
      theme: 'dark',
      language: 'en',
    }),
  },
  roles: ['string'],
  metadata: transform.partial({
    createdAt: 'date',
    updatedAt: 'date',
  }),
};

// Transform the schema to get default structure
const defaultUser = transform(userSchema as any);

// Use castings for runtime validation
const validateUser = (data: unknown) => {
  if (!castings.objects.is(data)) return false;

  const obj = data as Record<string, any>;
  return (
    castings.numbers.is(obj.id) &&
    castings.objects.is(obj.profile) &&
    castings.strings.is(obj.profile.name) &&
    castings.arrays.is(obj.roles)
  );
};

// Use typings for type-level operations
type UserType = typeof userSchema;
type UserKeys = types.KeysOfObject<UserType>; // 'id' | 'profile' | 'roles' | 'metadata'

// Create a strongly typed user object
const createUser = (data: Partial<UserType>): UserType => {
  return castings.commons.defaulted(data, defaultUser) as UserType;
};

CHANGE_LOG

CHANGE_LOG.md

License

MIT

Author

chlbri ([email protected])

GitHub Profile

Links


Made with ❤️ by bemedev