@cooljs123/easyjs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Thomas Boerdam
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,602 @@
1
+ # EasyJS
2
+
3
+ One import with a bunch of small, everyday JavaScript helpers. Written in vanilla JS with no external libraries.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm i @cooljs123/easyjs
9
+ ```
10
+
11
+ ## Use
12
+
13
+ ```js
14
+ const easyJS = require("@cooljs123/easyjs");
15
+
16
+ // Run once to add prototype helpers (Array/String/Object methods like .shuffle(), .toTitleCase(), .mapKeys()).
17
+ // Use this only if you want prototype sugar; it changes global prototypes.
18
+ easyJS.install();
19
+
20
+ easyJS.anyOf("tom", ["thomas", "tommy", "tom"]); // true
21
+ easyJS.normalizeString(" ToM "); // "tom"
22
+ easyJS.safeGet({ a: { b: 2 } }, "a.b", 0); // 2
23
+ easyJS.safeSet({}, "a.b", 3); // { a: { b: 3 } }
24
+ ```
25
+
26
+ ## Examples (All 100 Functions)
27
+
28
+ - `identity`:
29
+ ```js
30
+ easyJS.identity(5) // 5
31
+ ```
32
+ - `noop`:
33
+ ```js
34
+ easyJS.noop() // undefined
35
+ ```
36
+ - `isNil`:
37
+ ```js
38
+ easyJS.isNil(null) // true
39
+ ```
40
+ - `isEmpty`:
41
+ ```js
42
+ easyJS.isEmpty([]) // true
43
+ ```
44
+ - `defaultTo`:
45
+ ```js
46
+ easyJS.defaultTo(null, 10) // 10
47
+ ```
48
+ - `toLower`:
49
+ ```js
50
+ easyJS.toLower("Hi") // "hi"
51
+ ```
52
+ - `toUpper`:
53
+ ```js
54
+ easyJS.toUpper("Hi") // "HI"
55
+ ```
56
+ - `capitalize`:
57
+ ```js
58
+ easyJS.capitalize("hello") // "Hello"
59
+ ```
60
+ - `trim`:
61
+ ```js
62
+ easyJS.trim(" hi ") // "hi"
63
+ ```
64
+ - `normalizeString`:
65
+ ```js
66
+ easyJS.normalizeString(" ToM ") // "tom"
67
+ ```
68
+ - `slugify`:
69
+ ```js
70
+ easyJS.slugify("Hello World!") // "hello-world"
71
+ ```
72
+ - `padLeft`:
73
+ ```js
74
+ easyJS.padLeft("7", 3, "0") // "007"
75
+ ```
76
+ - `padRight`:
77
+ ```js
78
+ easyJS.padRight("7", 3, "0") // "700"
79
+ ```
80
+ - `repeat`:
81
+ ```js
82
+ easyJS.repeat("ha", 3) // "hahaha"
83
+ ```
84
+ - `stripNonAlpha`:
85
+ ```js
86
+ easyJS.stripNonAlpha("a-b_c") // "abc"
87
+ ```
88
+ - `isBlank`:
89
+ ```js
90
+ easyJS.isBlank(" ") // true
91
+ ```
92
+ - `asArray`:
93
+ ```js
94
+ easyJS.asArray(5) // [5]
95
+ ```
96
+ - `anyOf`:
97
+ ```js
98
+ easyJS.anyOf("tom", ["thomas", "tom"]) // true
99
+ ```
100
+ - `eqAny`:
101
+ ```js
102
+ easyJS.eqAny("x", "a", "x") // true
103
+ ```
104
+ - `inArray`:
105
+ ```js
106
+ easyJS.inArray(2, [1, 2, 3]) // true
107
+ ```
108
+ - `clamp`:
109
+ ```js
110
+ easyJS.clamp(12, 0, 10) // 10
111
+ ```
112
+ - `between`:
113
+ ```js
114
+ easyJS.between(5, 1, 10) // true
115
+ ```
116
+ - `toInt`:
117
+ ```js
118
+ easyJS.toInt("42") // 42
119
+ ```
120
+ - `toFloat`:
121
+ ```js
122
+ easyJS.toFloat("3.14") // 3.14
123
+ ```
124
+ - `toNumber`:
125
+ ```js
126
+ easyJS.toNumber("9") // 9
127
+ ```
128
+ - `isNumber`:
129
+ ```js
130
+ easyJS.isNumber(3.5) // true
131
+ ```
132
+ - `isInt`:
133
+ ```js
134
+ easyJS.isInt(3) // true
135
+ ```
136
+ - `compact`:
137
+ ```js
138
+ easyJS.compact([0, null, 2]) // [0, 2]
139
+ ```
140
+ - `uniq`:
141
+ ```js
142
+ easyJS.uniq([1, 2, 2]) // [1, 2]
143
+ ```
144
+ - `flatten`:
145
+ ```js
146
+ easyJS.flatten([1, [2, 3]]) // [1, 2, 3]
147
+ ```
148
+ - `chunk`:
149
+ ```js
150
+ easyJS.chunk([1, 2, 3], 2) // [[1, 2], [3]]
151
+ ```
152
+ - `range`:
153
+ ```js
154
+ easyJS.range(3) // [0, 1, 2]
155
+ ```
156
+ - `min`:
157
+ ```js
158
+ easyJS.min([2, 5, 1]) // 1
159
+ ```
160
+ - `max`:
161
+ ```js
162
+ easyJS.max([2, 5, 1]) // 5
163
+ ```
164
+ - `sum`:
165
+ ```js
166
+ easyJS.sum([1, 2, 3]) // 6
167
+ ```
168
+ - `avg`:
169
+ ```js
170
+ easyJS.avg([2, 4]) // 3
171
+ ```
172
+ - `median`:
173
+ ```js
174
+ easyJS.median([1, 3, 2]) // 2
175
+ ```
176
+ - `mode`:
177
+ ```js
178
+ easyJS.mode([1, 2, 2, 3]) // 2
179
+ ```
180
+ - `percentile`:
181
+ ```js
182
+ easyJS.percentile([1, 2, 3, 4, 5], 50) // 3
183
+ ```
184
+ - `groupBy`:
185
+ ```js
186
+ easyJS.groupBy([1, 2, 3, 4], x => x % 2) // { 0: [2, 4], 1: [1, 3] }
187
+ ```
188
+ - `first`:
189
+ ```js
190
+ easyJS.first([9, 8, 7]) // 9
191
+ ```
192
+ - `last`:
193
+ ```js
194
+ easyJS.last([9, 8, 7]) // 7
195
+ ```
196
+ - `take`:
197
+ ```js
198
+ easyJS.take([1, 2, 3], 2) // [1, 2]
199
+ ```
200
+ - `takeRight`:
201
+ ```js
202
+ easyJS.takeRight([1, 2, 3], 2) // [2, 3]
203
+ ```
204
+ - `drop`:
205
+ ```js
206
+ easyJS.drop([1, 2, 3], 1) // [2, 3]
207
+ ```
208
+ - `dropRight`:
209
+ ```js
210
+ easyJS.dropRight([1, 2, 3], 1) // [1, 2]
211
+ ```
212
+ - `zip`:
213
+ ```js
214
+ easyJS.zip([[1, 2], ["a", "b"]]) // [[1, "a"], [2, "b"]]
215
+ ```
216
+ - `unzip`:
217
+ ```js
218
+ easyJS.unzip([[1, "a"], [2, "b"]]) // [[1, 2], ["a", "b"]]
219
+ ```
220
+ - `intersection`:
221
+ ```js
222
+ easyJS.intersection([1, 2, 3], [2, 3, 4]) // [2, 3]
223
+ ```
224
+ - `difference`:
225
+ ```js
226
+ easyJS.difference([1, 2, 3], [2]) // [1, 3]
227
+ ```
228
+ - `union`:
229
+ ```js
230
+ easyJS.union([1, 2], [2, 3]) // [1, 2, 3]
231
+ ```
232
+ - `pick`:
233
+ ```js
234
+ easyJS.pick({ a: 1, b: 2 }, ["a"]) // { a: 1 }
235
+ ```
236
+ - `omit`:
237
+ ```js
238
+ easyJS.omit({ a: 1, b: 2 }, ["b"]) // { a: 1 }
239
+ ```
240
+ - `has`:
241
+ ```js
242
+ easyJS.has({ a: 1 }, "a") // true
243
+ ```
244
+ - `keys`:
245
+ ```js
246
+ easyJS.keys({ a: 1, b: 2 }) // ["a", "b"]
247
+ ```
248
+ - `values`:
249
+ ```js
250
+ easyJS.values({ a: 1, b: 2 }) // [1, 2]
251
+ ```
252
+ - `entries`:
253
+ ```js
254
+ easyJS.entries({ a: 1 }) // [["a", 1]]
255
+ ```
256
+ - `fromEntries`:
257
+ ```js
258
+ easyJS.fromEntries([["a", 1]]) // { a: 1 }
259
+ ```
260
+ - `merge`:
261
+ ```js
262
+ easyJS.merge({ a: 1 }, { b: 2 }) // { a: 1, b: 2 }
263
+ ```
264
+ - `deepMerge`:
265
+ ```js
266
+ easyJS.deepMerge({ a: { b: 1 } }, { a: { c: 2 } }) // { a: { b: 1, c: 2 } }
267
+ ```
268
+ - `isObject`:
269
+ ```js
270
+ easyJS.isObject({}) // true
271
+ ```
272
+ - `size`:
273
+ ```js
274
+ easyJS.size([1, 2, 3]) // 3
275
+ ```
276
+ - `safeGet`:
277
+ ```js
278
+ easyJS.safeGet({ a: { b: 2 } }, "a.b", 0) // 2
279
+ ```
280
+ - `safeSet`:
281
+ ```js
282
+ easyJS.safeSet({}, "a.b", 3) // { a: { b: 3 } }
283
+ ```
284
+ - `tryCatch`:
285
+ ```js
286
+ easyJS.tryCatch(() => JSON.parse("x"), {}) // {}
287
+ ```
288
+ - `tap`:
289
+ ```js
290
+ easyJS.tap(5, v => console.log(v)) // 5 (and logs 5)
291
+ ```
292
+ - `sleep`:
293
+ ```js
294
+ easyJS.sleep(100) // Promise (resolves after ~100ms)
295
+ ```
296
+ - `containsAny`:
297
+ ```js
298
+ easyJS.containsAny("hello", ["ell"]) // true
299
+ ```
300
+ - `startsWithAny`:
301
+ ```js
302
+ easyJS.startsWithAny("hello", ["he"]) // true
303
+ ```
304
+ - `endsWithAny`:
305
+ ```js
306
+ easyJS.endsWithAny("hello", ["lo"]) // true
307
+ ```
308
+ - `safeJsonParse`:
309
+ ```js
310
+ easyJS.safeJsonParse("{\"a\":1}", {}) // { a: 1 }
311
+ ```
312
+ - `once`:
313
+ ```js
314
+ easyJS.once(() => 1)() // 1
315
+ ```
316
+ - `debounce`:
317
+ ```js
318
+ easyJS.debounce(() => {}, 100) // function
319
+ ```
320
+ - `throttle`:
321
+ ```js
322
+ easyJS.throttle(() => {}, 100) // function
323
+ ```
324
+ - `uniqueBy`:
325
+ ```js
326
+ easyJS.uniqueBy([{ id: 1 }, { id: 1 }], "id") // [{ id: 1 }]
327
+ ```
328
+ - `pluck`:
329
+ ```js
330
+ easyJS.pluck([{ a: 1 }, { a: 2 }], "a") // [1, 2]
331
+ ```
332
+ - `sortBy`:
333
+ ```js
334
+ easyJS.sortBy([{ n: 2 }, { n: 1 }], "n") // [{ n: 1 }, { n: 2 }]
335
+ ```
336
+ - `roundTo`:
337
+ ```js
338
+ easyJS.roundTo(1.234, 2) // 1.23
339
+ ```
340
+ - `roundDecimal`:
341
+ ```js
342
+ easyJS.roundDecimal(1.234, "hundredths") // 1.23
343
+ ```
344
+ - `roundDown`:
345
+ ```js
346
+ easyJS.roundDown(1.9) // 1
347
+ ```
348
+ - `roundUp`:
349
+ ```js
350
+ easyJS.roundUp(1.1) // 2
351
+ ```
352
+ - `lerp`:
353
+ ```js
354
+ easyJS.lerp(0, 10, 0.5) // 5
355
+ ```
356
+ - `percent`:
357
+ ```js
358
+ easyJS.percent(1, 4) // 25
359
+ ```
360
+ - `clamp01`:
361
+ ```js
362
+ easyJS.clamp01(1.5) // 1
363
+ ```
364
+ - `randomInt`:
365
+ ```js
366
+ easyJS.randomInt(1, 3) // 1..3 (random)
367
+ ```
368
+ - `randomFloat`:
369
+ ```js
370
+ easyJS.randomFloat(1, 2) // 1..2 (random)
371
+ ```
372
+ - `shuffle`:
373
+ ```js
374
+ easyJS.shuffle([1, 2, 3]) // random order
375
+ ```
376
+ - `sample`:
377
+ ```js
378
+ easyJS.sample([1, 2, 3]) // 1..3 (random)
379
+ ```
380
+ - `deepClone`:
381
+ ```js
382
+ easyJS.deepClone({ a: 1 }) // { a: 1 }
383
+ ```
384
+ - `safeJsonStringify`:
385
+ ```js
386
+ easyJS.safeJsonStringify({ a: 1 }) // "{\"a\":1}"
387
+ ```
388
+ - `move`:
389
+ ```js
390
+ easyJS.move([1, 2, 3], 0, 2) // [2, 3, 1]
391
+ ```
392
+ - `arrayGroupBy`:
393
+ ```js
394
+ easyJS.arrayGroupBy([1, 2, 3, 4], x => x % 2) // { 0: [2, 4], 1: [1, 3] }
395
+ ```
396
+ - `mapKeys`:
397
+ ```js
398
+ easyJS.mapKeys({ a: 1 }, k => k.toUpperCase()) // { A: 1 }
399
+ ```
400
+ - `invert`:
401
+ ```js
402
+ easyJS.invert({ a: 1 }) // { "1": "a" }
403
+ ```
404
+ - `objectCompact`:
405
+ ```js
406
+ easyJS.objectCompact({ a: null, b: 2 }) // { b: 2 }
407
+ ```
408
+ - `toTitleCase`:
409
+ ```js
410
+ easyJS.toTitleCase("hello world") // "Hello World"
411
+ ```
412
+ - `truncate`:
413
+ ```js
414
+ easyJS.truncate("hello world", 8) // "hello..."
415
+ ```
416
+ - `replaceAll`:
417
+ ```js
418
+ easyJS.replaceAll("a-b", "-", "_") // "a_b"
419
+ ```
420
+ - `countWords`:
421
+ ```js
422
+ easyJS.countWords("hi there") // 2
423
+ ```
424
+ - `install`:
425
+ ```js
426
+ easyJS.install() // adds prototype helpers
427
+ ```
428
+
429
+ ## Prototype Helpers (Only After `easyJS.install()`)
430
+
431
+ These methods are added to built-in prototypes and only work after running `easyJS.install()`.
432
+
433
+ ### Array
434
+ - `.shuffle()`:
435
+ ```js
436
+ easyJS.install()
437
+ [1, 2, 3].shuffle() // random order
438
+ ```
439
+ - `.unique()`:
440
+ ```js
441
+ easyJS.install()
442
+ [1, 2, 2].unique() // [1, 2]
443
+ ```
444
+ - `.chunk(size)`:
445
+ ```js
446
+ easyJS.install()
447
+ [1, 2, 3, 4].chunk(2) // [[1, 2], [3, 4]]
448
+ ```
449
+ - `.move(from, to)`:
450
+ ```js
451
+ easyJS.install()
452
+ [1, 2, 3].move(0, 2) // [2, 3, 1]
453
+ ```
454
+ - `.groupBy(fn)`:
455
+ ```js
456
+ easyJS.install()
457
+ [1, 2, 3, 4].groupBy(x => x % 2) // { 0: [2, 4], 1: [1, 3] }
458
+ ```
459
+ - `.compact(fn?)`:
460
+ ```js
461
+ easyJS.install()
462
+ [0, null, 2].compact() // [0, 2]
463
+ ```
464
+ - `.flatten()`:
465
+ ```js
466
+ easyJS.install()
467
+ [1, [2, 3]].flatten() // [1, 2, 3]
468
+ ```
469
+ - `.first()`:
470
+ ```js
471
+ easyJS.install()
472
+ [9, 8, 7].first() // 9
473
+ ```
474
+ - `.last()`:
475
+ ```js
476
+ easyJS.install()
477
+ [9, 8, 7].last() // 7
478
+ ```
479
+ - `.take(n)`:
480
+ ```js
481
+ easyJS.install()
482
+ [1, 2, 3].take(2) // [1, 2]
483
+ ```
484
+ - `.takeRight(n)`:
485
+ ```js
486
+ easyJS.install()
487
+ [1, 2, 3].takeRight(2) // [2, 3]
488
+ ```
489
+ - `.drop(n)`:
490
+ ```js
491
+ easyJS.install()
492
+ [1, 2, 3].drop(1) // [2, 3]
493
+ ```
494
+ - `.dropRight(n)`:
495
+ ```js
496
+ easyJS.install()
497
+ [1, 2, 3].dropRight(1) // [1, 2]
498
+ ```
499
+
500
+ ### Object
501
+ - `.mapKeys(fn)`:
502
+ ```js
503
+ easyJS.install()
504
+ ({ a: 1, b: 2 }).mapKeys(k => k.toUpperCase()) // { A: 1, B: 2 }
505
+ ```
506
+ - `.pick(keys)`:
507
+ ```js
508
+ easyJS.install()
509
+ ({ a: 1, b: 2 }).pick(["a"]) // { a: 1 }
510
+ ```
511
+ - `.invert()`:
512
+ ```js
513
+ easyJS.install()
514
+ ({ a: 1 }).invert() // { "1": "a" }
515
+ ```
516
+ - `.compact()`:
517
+ ```js
518
+ easyJS.install()
519
+ ({ a: null, b: 2 }).compact() // { b: 2 }
520
+ ```
521
+ - `.omit(keys)`:
522
+ ```js
523
+ easyJS.install()
524
+ ({ a: 1, b: 2 }).omit(["b"]) // { a: 1 }
525
+ ```
526
+ - `.has(key)`:
527
+ ```js
528
+ easyJS.install()
529
+ ({ a: 1 }).has("a") // true
530
+ ```
531
+ - `.merge(...objs)`:
532
+ ```js
533
+ easyJS.install()
534
+ ({ a: 1 }).merge({ b: 2 }) // { a: 1, b: 2 }
535
+ ```
536
+ - `.deepMerge(...objs)`:
537
+ ```js
538
+ easyJS.install()
539
+ ({ a: { b: 1 } }).deepMerge({ a: { c: 2 } }) // { a: { b: 1, c: 2 } }
540
+ ```
541
+ - `.size()`:
542
+ ```js
543
+ easyJS.install()
544
+ ({ a: 1, b: 2 }).size() // 2
545
+ ```
546
+
547
+ ### String
548
+ - `.toTitleCase()`:
549
+ ```js
550
+ easyJS.install()
551
+ "hello world".toTitleCase() // "Hello World"
552
+ ```
553
+ - `.truncate(len)`:
554
+ ```js
555
+ easyJS.install()
556
+ "hello world".truncate(8) // "hello..."
557
+ ```
558
+ - `.replaceAllEasy(sub, rep)`:
559
+ ```js
560
+ easyJS.install()
561
+ "a-b".replaceAllEasy("-", "_") // "a_b"
562
+ ```
563
+ - `.countWords()`:
564
+ ```js
565
+ easyJS.install()
566
+ "hi there".countWords() // 2
567
+ ```
568
+ - `.slugify()`:
569
+ ```js
570
+ easyJS.install()
571
+ "Hello World!".slugify() // "hello-world"
572
+ ```
573
+ - `.padLeft(len, ch?)`:
574
+ ```js
575
+ easyJS.install()
576
+ "7".padLeft(3, "0") // "007"
577
+ ```
578
+ - `.padRight(len, ch?)`:
579
+ ```js
580
+ easyJS.install()
581
+ "7".padRight(3, "0") // "700"
582
+ ```
583
+ - `.repeatEasy(n)`:
584
+ ```js
585
+ easyJS.install()
586
+ "ha".repeatEasy(3) // "hahaha"
587
+ ```
588
+ - `.stripNonAlpha()`:
589
+ ```js
590
+ easyJS.install()
591
+ "a-b_c".stripNonAlpha() // "abc"
592
+ ```
593
+ - `.isBlank()`:
594
+ ```js
595
+ easyJS.install()
596
+ " ".isBlank() // true
597
+ ```
598
+ - `.normalizeString()`:
599
+ ```js
600
+ easyJS.install()
601
+ " ToM ".normalizeString() // "tom"
602
+ ```
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@cooljs123/easyjs",
3
+ "version": "0.1.0",
4
+ "description": "One import with 100+ small, everyday JavaScript helpers.",
5
+ "keywords": [
6
+ "javascript",
7
+ "easy",
8
+ "js"
9
+ ],
10
+ "license": "ISC",
11
+ "author": "Thomas Boerdam",
12
+ "type": "commonjs",
13
+ "main": "src/index.js",
14
+ "files": [
15
+ "src"
16
+ ],
17
+ "scripts": {
18
+ "test": "node --test ./tests/*.test.js --test-reporter spec"
19
+ }
20
+ }