Getting Started
Installation
Install the package with your preferred package manager:
pnpm add @carry0987/utils
For Node.js-based workflows, the published package currently targets Node.js 22 or newer.
Choose the right entrypoint
Use the root entrypoint when your code must remain safe in SSR, Node.js, or mixed runtimes:
import { deepMerge, generateUUID, sendData } from '@carry0987/utils';
Use the browser entrypoint when you need DOM, storage, events, or stylesheet utilities:
import { getElem, storageUtils, dispatchEvent } from '@carry0987/utils/browser';
Import styles
Utils-JS supports both namespace imports and direct function imports.
Namespace imports
import { commonUtils, fetchUtils } from '@carry0987/utils';
import { storageUtils, domUtils } from '@carry0987/utils/browser';
const id = commonUtils.generateUUID();
const node = domUtils.getElem('#app');
storageUtils.setLocalValue('session-id', id);
Direct imports
import { generateUUID, sendData } from '@carry0987/utils';
import { getLocalValue, setLocalValue } from '@carry0987/utils/browser';
const requestId = generateUUID();
setLocalValue('request-id', requestId);
const savedId = getLocalValue<string>('request-id');
Direct imports are the best default when you want modern bundlers to tree-shake unused helpers.
In practice, this means bundlers such as Rollup, Vite, Webpack, or esbuild can keep the utilities you actually reference and drop the rest from the final bundle.
Prefer direct imports when:
- you only need a small number of helpers in a component, route, or feature module
- you care about keeping browser bundles lean
- you want the import list itself to document exactly which utilities a file depends on
Namespace imports are still useful when a module genuinely uses a larger group of related helpers, but they are less explicit as a default documentation pattern.
First universal example
import { deepMerge, getUrlParam, sendData } from '@carry0987/utils';
const payload = deepMerge(
{ page: 1, filters: { status: 'draft' } },
{ filters: { status: 'published' } }
);
const currentPage = getUrlParam('page', 'https://example.com/posts?page=2');
const result = await sendData<{ message: string }>({
url: 'https://example.com/api/posts',
data: payload,
});
First browser example
import {
createElem,
dispatchEvent,
getElem,
injectStylesheet,
setLocalValue,
} from '@carry0987/utils/browser';
injectStylesheet({
'.utils-card': {
padding: '12px',
borderRadius: '12px',
backgroundColor: '#f3f6fb',
},
});
const card = createElem('div', { class: 'utils-card' }, 'Hello from Utils-JS');
document.body.appendChild(card);
setLocalValue('last-card-text', card.textContent);
dispatchEvent('card:mounted', card, { mounted: true });
const mountedCard = getElem('.utils-card');
console.log(mountedCard?.textContent);
Type-only entrypoint
The package also exposes a type declaration entrypoint:
import type {} from '@carry0987/utils/types';
This path is useful when you want to reference the library's published declaration structure explicitly.
Next steps
Read Entrypoints if you are integrating the package into an SSR app, or jump to Browser Utilities if you are building interactive client-side features.