Skip to content

Commit e1747ac

Browse files
authored
docs(core): add @example blocks to core module exports (#170)
* feat(paths): add fromUnixPath to convert MSYS paths to native Windows format * docs(utils): add @example blocks to utility module exports * docs(core): add @example blocks to core module exports
1 parent cb06f20 commit e1747ac

10 files changed

Lines changed: 313 additions & 0 deletions

File tree

src/abort.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44

55
/**
66
* Create a composite AbortSignal from multiple signals.
7+
*
8+
* @example
9+
* ```typescript
10+
* const ac1 = new AbortController()
11+
* const ac2 = new AbortController()
12+
* const signal = createCompositeAbortSignal(ac1.signal, ac2.signal)
13+
* ```
714
*/
815
export function createCompositeAbortSignal(
916
...signals: Array<AbortSignal | null | undefined>
@@ -33,6 +40,12 @@ export function createCompositeAbortSignal(
3340

3441
/**
3542
* Create an AbortSignal that triggers after a timeout.
43+
*
44+
* @example
45+
* ```typescript
46+
* const signal = createTimeoutSignal(5000) // aborts after 5 seconds
47+
* fetch('https://example.com', { signal })
48+
* ```
3649
*/
3750
export function createTimeoutSignal(ms: number): AbortSignal {
3851
if (typeof ms !== 'number' || Number.isNaN(ms)) {

src/ansi.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ const ANSI_REGEX = /\x1b\[[0-9;]*m/g
2222
* https://socket.dev/npm/package/ansi-regexp/overview/6.2.2
2323
* MIT License
2424
* Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
25+
*
26+
* @example
27+
* ```typescript
28+
* const regex = ansiRegex()
29+
* '\u001b[31mHello\u001b[0m'.match(regex) // ['\u001b[31m', '\u001b[0m']
30+
* ansiRegex({ onlyFirst: true }) // matches only the first code
31+
* ```
2532
*/
2633
/*@__NO_SIDE_EFFECTS__*/
2734
export function ansiRegex(options?: { onlyFirst?: boolean }): RegExp {
@@ -40,6 +47,12 @@ export function ansiRegex(options?: { onlyFirst?: boolean }): RegExp {
4047
/**
4148
* Strip ANSI escape codes from text.
4249
* Uses the inlined ansi-regex for matching.
50+
*
51+
* @example
52+
* ```typescript
53+
* stripAnsi('\u001b[31mError\u001b[0m') // 'Error'
54+
* stripAnsi('\u001b[1mBold\u001b[0m') // 'Bold'
55+
* ```
4356
*/
4457
/*@__NO_SIDE_EFFECTS__*/
4558
export function stripAnsi(text: string): string {

src/cache-with-ttl.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,13 @@ const DEFAULT_PREFIX = 'ttl-cache'
158158

159159
/**
160160
* Create a TTL-based cache instance.
161+
*
162+
* @example
163+
* ```typescript
164+
* const cache = createTtlCache({ ttl: 60_000, prefix: 'my-app' })
165+
* await cache.set('key', { value: 42 })
166+
* const data = await cache.get('key') // { value: 42 }
167+
* ```
161168
*/
162169
export function createTtlCache(options?: TtlCacheOptions): TtlCache {
163170
const opts = {

src/colors.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ const colorToRgb: Record<ColorName, ColorRgb> = {
6868
* Type guard to check if a color value is an RGB tuple.
6969
* @param value - Color value to check
7070
* @returns `true` if value is an RGB tuple, `false` if it's a color name
71+
*
72+
* @example
73+
* ```typescript
74+
* isRgbTuple([255, 0, 0]) // true
75+
* isRgbTuple('red') // false
76+
* ```
7177
*/
7278
export function isRgbTuple(value: ColorValue): value is ColorRgb {
7379
return Array.isArray(value)
@@ -78,6 +84,12 @@ export function isRgbTuple(value: ColorValue): value is ColorRgb {
7884
* Named colors are looked up in the `colorToRgb` map, RGB tuples are returned as-is.
7985
* @param color - Color name or RGB tuple
8086
* @returns RGB tuple with values 0-255
87+
*
88+
* @example
89+
* ```typescript
90+
* toRgb('red') // [255, 0, 0]
91+
* toRgb([0, 128, 0]) // [0, 128, 0]
92+
* ```
8193
*/
8294
export function toRgb(color: ColorValue): ColorRgb {
8395
if (isRgbTuple(color)) {

src/functions.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,25 @@ export type AnyFunction = (...args: unknown[]) => unknown
1111

1212
/**
1313
* A no-op function that does nothing.
14+
*
15+
* @example
16+
* ```typescript
17+
* const callback = noop
18+
* callback() // does nothing
19+
* ```
1420
*/
1521
/*@__NO_SIDE_EFFECTS__*/
1622
export function noop(): void {}
1723

1824
/**
1925
* Create a function that only executes once.
26+
*
27+
* @example
28+
* ```typescript
29+
* const init = once(() => Math.random())
30+
* init() // 0.456 (random value)
31+
* init() // 0.456 (same value, not recalculated)
32+
* ```
2033
*/
2134
/*@__NO_SIDE_EFFECTS__*/
2235
export function once<T extends AnyFunction>(fn: T): T {
@@ -36,6 +49,15 @@ export function once<T extends AnyFunction>(fn: T): T {
3649

3750
/**
3851
* Wrap an async function to silently catch and ignore errors.
52+
*
53+
* @example
54+
* ```typescript
55+
* const safeFetch = silentWrapAsync(async (url: string) => {
56+
* const res = await fetch(url)
57+
* return res.json()
58+
* })
59+
* await safeFetch('https://example.com') // result or undefined on error
60+
* ```
3961
*/
4062
/*@__NO_SIDE_EFFECTS__*/
4163
export function silentWrapAsync<TArgs extends unknown[], TResult>(
@@ -52,6 +74,14 @@ export function silentWrapAsync<TArgs extends unknown[], TResult>(
5274

5375
/**
5476
* Execute a function with tail call optimization via trampoline.
77+
*
78+
* @example
79+
* ```typescript
80+
* const factorial = trampoline((n: number, acc = 1): any =>
81+
* n <= 1 ? acc : () => factorial(n - 1, n * acc)
82+
* )
83+
* factorial(5) // 120
84+
* ```
5585
*/
5686
/*@__NO_SIDE_EFFECTS__*/
5787
export function trampoline<T extends AnyFunction>(fn: T): T {

src/regexps.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010

1111
/**
1212
* Escape special characters in a string for use in a regular expression.
13+
*
14+
* @example
15+
* ```typescript
16+
* escapeRegExp('foo.bar') // 'foo\\.bar'
17+
* escapeRegExp('a+b*c?') // 'a\\+b\\*c\\?'
18+
* new RegExp(escapeRegExp('[test]')) // /\[test\]/
19+
* ```
1320
*/
1421
/*@__NO_SIDE_EFFECTS__*/
1522
export function escapeRegExp(str: string): string {

src/sorts.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ function getFastSort() {
2424

2525
/**
2626
* Compare semantic versions.
27+
*
28+
* @example
29+
* ```typescript
30+
* compareSemver('1.0.0', '2.0.0') // -1
31+
* compareSemver('2.0.0', '1.0.0') // 1
32+
* compareSemver('1.0.0', '1.0.0') // 0
33+
* ```
2734
*/
2835
/*@__NO_SIDE_EFFECTS__*/
2936
export function compareSemver(a: string, b: string): number {
@@ -47,6 +54,13 @@ export function compareSemver(a: string, b: string): number {
4754

4855
/**
4956
* Simple string comparison.
57+
*
58+
* @example
59+
* ```typescript
60+
* compareStr('a', 'b') // -1
61+
* compareStr('b', 'a') // 1
62+
* compareStr('a', 'a') // 0
63+
* ```
5064
*/
5165
/*@__NO_SIDE_EFFECTS__*/
5266
export function compareStr(a: string, b: string): number {
@@ -56,6 +70,13 @@ export function compareStr(a: string, b: string): number {
5670
let _localeCompare: ((x: string, y: string) => number) | undefined
5771
/**
5872
* Compare two strings using locale-aware comparison.
73+
*
74+
* @example
75+
* ```typescript
76+
* localeCompare('a', 'b') // -1
77+
* localeCompare('b', 'a') // 1
78+
* localeCompare('a', 'a') // 0
79+
* ```
5980
*/
6081
/*@__NO_SIDE_EFFECTS__*/
6182
export function localeCompare(x: string, y: string): number {
@@ -69,6 +90,12 @@ export function localeCompare(x: string, y: string): number {
6990
let _naturalCompare: ((x: string, y: string) => number) | undefined
7091
/**
7192
* Compare two strings using natural sorting (numeric-aware, case-insensitive).
93+
*
94+
* @example
95+
* ```typescript
96+
* naturalCompare('file2', 'file10') // negative (file2 before file10)
97+
* naturalCompare('img10', 'img2') // positive (img10 after img2)
98+
* ```
7299
*/
73100
/*@__NO_SIDE_EFFECTS__*/
74101
export function naturalCompare(x: string, y: string): number {
@@ -100,6 +127,12 @@ type FastSortFunction = ReturnType<
100127
let _naturalSorter: FastSortFunction | undefined
101128
/**
102129
* Sort an array using natural comparison.
130+
*
131+
* @example
132+
* ```typescript
133+
* naturalSorter(['file10', 'file2', 'file1']).asc()
134+
* // ['file1', 'file2', 'file10']
135+
* ```
103136
*/
104137
/*@__NO_SIDE_EFFECTS__*/
105138
export function naturalSorter<T>(

src/url.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ const UrlCtor = URL
88

99
/**
1010
* Check if a value is a valid URL.
11+
*
12+
* @example
13+
* ```typescript
14+
* isUrl('https://example.com') // true
15+
* isUrl('not a url') // false
16+
* isUrl(null) // false
17+
* ```
1118
*/
1219
/*@__NO_SIDE_EFFECTS__*/
1320
export function isUrl(value: string | URL | null | undefined): boolean {
@@ -20,6 +27,12 @@ export function isUrl(value: string | URL | null | undefined): boolean {
2027

2128
/**
2229
* Parse a value as a URL.
30+
*
31+
* @example
32+
* ```typescript
33+
* parseUrl('https://example.com') // URL { href: 'https://example.com/' }
34+
* parseUrl('invalid') // undefined
35+
* ```
2336
*/
2437
/*@__NO_SIDE_EFFECTS__*/
2538
export function parseUrl(value: string | URL): URL | undefined {
@@ -31,6 +44,12 @@ export function parseUrl(value: string | URL): URL | undefined {
3144

3245
/**
3346
* Convert a URL search parameter to an array.
47+
*
48+
* @example
49+
* ```typescript
50+
* urlSearchParamAsArray('a, b, c') // ['a', 'b', 'c']
51+
* urlSearchParamAsArray(null) // []
52+
* ```
3453
*/
3554
/*@__NO_SIDE_EFFECTS__*/
3655
export function urlSearchParamAsArray(
@@ -51,6 +70,13 @@ export interface UrlSearchParamAsBooleanOptions {
5170

5271
/**
5372
* Convert a URL search parameter to a boolean.
73+
*
74+
* @example
75+
* ```typescript
76+
* urlSearchParamAsBoolean('true') // true
77+
* urlSearchParamAsBoolean('0') // false
78+
* urlSearchParamAsBoolean(null) // false
79+
* ```
5480
*/
5581
/*@__NO_SIDE_EFFECTS__*/
5682
export function urlSearchParamAsBoolean(
@@ -73,6 +99,12 @@ export function urlSearchParamAsBoolean(
7399

74100
/**
75101
* Helper to get array from URLSearchParams.
102+
*
103+
* @example
104+
* ```typescript
105+
* const params = new URLSearchParams('tags=a,b,c')
106+
* urlSearchParamsGetArray(params, 'tags') // ['a', 'b', 'c']
107+
* ```
76108
*/
77109
/*@__NO_SIDE_EFFECTS__*/
78110
export function urlSearchParamsGetArray(
@@ -97,6 +129,13 @@ export interface UrlSearchParamsGetBooleanOptions {
97129

98130
/**
99131
* Helper to get boolean from URLSearchParams.
132+
*
133+
* @example
134+
* ```typescript
135+
* const params = new URLSearchParams('debug=true')
136+
* urlSearchParamsGetBoolean(params, 'debug') // true
137+
* urlSearchParamsGetBoolean(params, 'other') // false
138+
* ```
100139
*/
101140
/*@__NO_SIDE_EFFECTS__*/
102141
export function urlSearchParamsGetBoolean(
@@ -123,6 +162,12 @@ export interface CreateRelativeUrlOptions {
123162

124163
/**
125164
* Create a relative URL for testing.
165+
*
166+
* @example
167+
* ```typescript
168+
* createRelativeUrl('/api/test') // 'api/test'
169+
* createRelativeUrl('/api/test', { base: 'https://example.com' }) // 'https://example.com/api/test'
170+
* ```
126171
*/
127172
/*@__NO_SIDE_EFFECTS__*/
128173
export function createRelativeUrl(
@@ -153,6 +198,13 @@ export interface UrlSearchParamAsStringOptions {
153198

154199
/**
155200
* Get string value from URLSearchParams with a default.
201+
*
202+
* @example
203+
* ```typescript
204+
* const params = new URLSearchParams('name=socket')
205+
* urlSearchParamAsString(params, 'name') // 'socket'
206+
* urlSearchParamAsString(params, 'other') // ''
207+
* ```
156208
*/
157209
/*@__NO_SIDE_EFFECTS__*/
158210
export function urlSearchParamAsString(
@@ -177,6 +229,13 @@ export interface UrlSearchParamAsNumberOptions {
177229

178230
/**
179231
* Get number value from URLSearchParams with a default.
232+
*
233+
* @example
234+
* ```typescript
235+
* const params = new URLSearchParams('limit=10')
236+
* urlSearchParamAsNumber(params, 'limit') // 10
237+
* urlSearchParamAsNumber(params, 'other') // 0
238+
* ```
180239
*/
181240
/*@__NO_SIDE_EFFECTS__*/
182241
export function urlSearchParamAsNumber(

0 commit comments

Comments
 (0)