tsu 1.1.2 → 1.3.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 +1 -1
- package/README.md +4 -1
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +40 -11
- package/dist/index.js +1 -382
- package/package.json +35 -31
- package/dist/index.mjs +0 -308
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -17,6 +17,9 @@ Install with your favourite package manager:
|
|
|
17
17
|
# yarn
|
|
18
18
|
yarn add tsu
|
|
19
19
|
|
|
20
|
+
# pnpm
|
|
21
|
+
pnpm install tsu
|
|
22
|
+
|
|
20
23
|
# npm
|
|
21
24
|
npm install tsu
|
|
22
25
|
```
|
|
@@ -29,7 +32,7 @@ import { ... } from 'tsu'
|
|
|
29
32
|
|
|
30
33
|
## Documentation
|
|
31
34
|
|
|
32
|
-
Full documentation is available [here](https://tsu
|
|
35
|
+
Full documentation is available [here](https://tsu.eb3n.dev).
|
|
33
36
|
|
|
34
37
|
## Credits
|
|
35
38
|
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var j=(n,e)=>{for(var t in e)l(n,t,{get:e[t],enumerable:!0})},E=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of O(e))!F.call(n,o)&&o!==t&&l(n,o,{get:()=>e[o],enumerable:!(r=v(e,o))||r.enumerable});return n};var N=n=>E(l({},"__esModule",{value:!0}),n);var gn={};j(gn,{capitalise:()=>cn,chars:()=>ln,debounce:()=>W,deepMerge:()=>w,delay:()=>$,drop:()=>A,groupsOf:()=>S,head:()=>M,init:()=>C,isArray:()=>f,isBlank:()=>pn,isBoolean:()=>J,isBrowser:()=>g,isDefined:()=>K,isEmpty:()=>mn,isEmptyObject:()=>Y,isEven:()=>Q,isFunction:()=>Z,isNumber:()=>m,isObject:()=>u,isOdd:()=>X,isString:()=>c,isTouchDevice:()=>_,isWindow:()=>G,last:()=>U,max:()=>I,memoize:()=>k,min:()=>q,modulo:()=>nn,noop:()=>tn,once:()=>H,partition:()=>B,randomChance:()=>en,randomNumber:()=>h,scroll:()=>on,sleep:()=>rn,splitAt:()=>D,sum:()=>R,tail:()=>L,take:()=>P,throttle:()=>z,toArray:()=>V,toCamel:()=>an,toKebab:()=>bn,toNumber:()=>Tn,toOrdinal:()=>dn,truncate:()=>xn,uniq:()=>p});module.exports=N(gn);function A(n,e){return n<=0?[...e]:e.slice(n)}function S(n,e){if(n<=0)throw new Error("[tsu] Invalid group size. Is it greater than 0?");if(n>=e.length)return[[...e]];let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function M(n){return n[0]}function C(n){return n.slice(0,n.length-1)}function U(n){return n[n.length-1]}function I(n){if(!!n.length)return Math.max(...n)}function q(n){if(!!n.length)return Math.min(...n)}function B(n,e){return e.reduce(([t,r],o,i,s)=>n(o,i,s)?[[...t,o],r]:[t,[...r,o]],[[],[]])}function D(n,e){return n<=0?[[],[...e]]:[e.slice(0,n),e.slice(n)]}function R(n){return n.length?n.reduce((e,t)=>e+t,0):0}function L(n){return n.slice(1)}function P(n,e){return n<=0?[]:e.slice(0,n)}function V(n){return n?Array.isArray(n)?n:[n]:[]}function p(n){return Array.from(new Set(n))}function W(n,e){let t;return function(...r){clearTimeout(t),t=setTimeout(()=>{clearTimeout(t),n(...r)},e)}}function $(n,e){setTimeout(()=>{n()},e)}function k(n){let e={};return function(...t){let r=JSON.stringify(t);if(r in e)return e[r];let o=n(...t);return e[r]=o,o}}function H(n){let e=!1;return(...t)=>{e||(n(...t),e=!0)}}function z(n,e){let t=!1;return function(...r){t||(n(...r),t=!0,setTimeout(()=>{t=!1},e))}}function f(n){return Array.isArray(n)}function J(n){return typeof n=="boolean"}function g(){return typeof window<"u"}function K(n){return typeof n<"u"}function Y(n){if(!u(n))return!1;for(let e in n)return!1;return!0}function Z(n){return typeof n=="function"}function m(n){return typeof n=="number"}function u(n){return Object.prototype.toString.call(n)==="[object Object]"}function c(n){return typeof n=="string"}function _(){return"ontouchstart"in window||navigator.maxTouchPoints>0}function G(n){return g()&&toString.call(n)==="[object Window]"}function Q(n){return n%2===0}function X(n){return n%2!==0}function nn(n,e){return n-Math.floor(n/e)*e}function h(n,e=0){return Math.floor(Math.random()*(n-e))+e}function en(n){return h(n)===0}function tn(){}async function rn(n){return new Promise(e=>setTimeout(e,n))}function w(...n){return n.reduce((e,t)=>(Object.keys(t).forEach(r=>{f(e[r])&&f(t[r])?e[r]=p(e[r].concat(t[r])):u(e[r])&&u(t[r])?e[r]=w(e[r],t[r]):e[r]=t[r]}),e),{})}function on({to:n,offset:e=0,duration:t=1e3,container:r=null}){let o=c(n)?document.querySelector(n):n,i=c(r)?document.querySelector(r):r,s=(i==null?void 0:i.scrollTop)||(window==null?void 0:window.pageYOffset)||0,a=(m(o)?o:fn(o,s))+e,y=Date.now();function b(){let T=Date.now()-y,d=T<t,x=d?sn(s,a,T,t):a;d&&requestAnimationFrame(b),i?i.scrollTop=x:window.scrollTo(0,x)}b()}function un(n){return n<.5?4*Math.pow(n,3):(n-1)*(2*n-2)*(2*n-2)+1}function sn(n,e,t,r){return n+(e-n)*un(t/r)}function fn(n,e){return n.nodeName==="HTML"?-e:n.getBoundingClientRect().top+e}function cn(n,e=!1,t=" "){return e?n.split(t).map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(t):n.charAt(0).toUpperCase()+n.slice(1)}function ln(n){return n.split("")}function pn(n){return n.trim().length===0}function mn(n){return n.length===0}function an(n){let e=/-(\w)/g;return n.replace(e,(t,r)=>r?r.toUpperCase():"")}function bn(n){let e=/\B([A-Z])/g;return n.replace(e,"-$1").toLowerCase()}function Tn(n){return n.length?Number(n.replace(/[#£€$,%]/g,"")):NaN}function dn(n){if(typeof n=="string"&&(n.trim()===""||isNaN(parseFloat(n))))throw new Error("[tsu] invalid string. Does it contain only a number?");let r=["st","nd","rd"][(Number(n)/10%10^1&&Number(n)%10)-1]||"th";return`${n}${r}`}function xn(n,e,t="..."){return e<=0?t:n.slice(0,e)+t}0&&(module.exports={capitalise,chars,debounce,deepMerge,delay,drop,groupsOf,head,init,isArray,isBlank,isBoolean,isBrowser,isDefined,isEmpty,isEmptyObject,isEven,isFunction,isNumber,isObject,isOdd,isString,isTouchDevice,isWindow,last,max,memoize,min,modulo,noop,once,partition,randomChance,randomNumber,scroll,sleep,splitAt,sum,tail,take,throttle,toArray,toCamel,toKebab,toNumber,toOrdinal,truncate,uniq});
|
package/dist/index.d.ts
CHANGED
|
@@ -60,7 +60,7 @@ declare function min(array: readonly number[]): number | undefined;
|
|
|
60
60
|
*
|
|
61
61
|
* @param filter - The predicate function.
|
|
62
62
|
* @param array - The array.
|
|
63
|
-
* @returns The
|
|
63
|
+
* @returns The tuple of values that satisfy the predicate and those that don't.
|
|
64
64
|
*/
|
|
65
65
|
declare function partition<T>(filter: (x: T, idx: number, a: readonly T[]) => boolean, array: readonly T[]): [T[], T[]];
|
|
66
66
|
/**
|
|
@@ -68,11 +68,11 @@ declare function partition<T>(filter: (x: T, idx: number, a: readonly T[]) => bo
|
|
|
68
68
|
*
|
|
69
69
|
* @param i - The position to split at.
|
|
70
70
|
* @param array - The array.
|
|
71
|
-
* @returns The
|
|
71
|
+
* @returns The tuple of values before and after the split.
|
|
72
72
|
*/
|
|
73
73
|
declare function splitAt<T>(i: number, array: readonly T[]): [T[], T[]];
|
|
74
74
|
/**
|
|
75
|
-
* Returns the sum of
|
|
75
|
+
* Returns the sum of an array of numbers.
|
|
76
76
|
*
|
|
77
77
|
* @param array - The array of numbers.
|
|
78
78
|
* @returns The sum.
|
|
@@ -109,13 +109,20 @@ declare function toArray<T>(maybeArray: Nullable<Arrayable<T>>): T[];
|
|
|
109
109
|
declare function uniq<T>(array: readonly T[]): T[];
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
|
-
* Prevents
|
|
112
|
+
* Prevents function execution until it hasn't been called for a stated time period.
|
|
113
113
|
*
|
|
114
114
|
* @param fn - The function.
|
|
115
115
|
* @param delay - The time period (in ms).
|
|
116
116
|
* @returns The debounced function.
|
|
117
117
|
*/
|
|
118
118
|
declare function debounce(fn: Fn, delay: number): VoidFn;
|
|
119
|
+
/**
|
|
120
|
+
* Delays function execution until after a stated time period has passed.
|
|
121
|
+
*
|
|
122
|
+
* @param fn - The function.
|
|
123
|
+
* @param delay - The time period (in ms).
|
|
124
|
+
*/
|
|
125
|
+
declare function delay(fn: Fn, delay: number): void;
|
|
119
126
|
/**
|
|
120
127
|
* Optimises subsequent calls of a function by caching return values.
|
|
121
128
|
*
|
|
@@ -124,7 +131,14 @@ declare function debounce(fn: Fn, delay: number): VoidFn;
|
|
|
124
131
|
*/
|
|
125
132
|
declare function memoize<T>(fn: Fn<T>): Fn<T>;
|
|
126
133
|
/**
|
|
127
|
-
*
|
|
134
|
+
* Enforces that a function is only callable one time.
|
|
135
|
+
*
|
|
136
|
+
* @param fn - The function.
|
|
137
|
+
* @returns The one-time callable function.
|
|
138
|
+
*/
|
|
139
|
+
declare function once(fn: Fn): VoidFn;
|
|
140
|
+
/**
|
|
141
|
+
* Prevents function execution for a stated time period after it was last called.
|
|
128
142
|
*
|
|
129
143
|
* @param fn - The function.
|
|
130
144
|
* @param limit - The time period.
|
|
@@ -147,9 +161,9 @@ declare function isArray(val: unknown): val is any[];
|
|
|
147
161
|
*/
|
|
148
162
|
declare function isBoolean(val: unknown): val is boolean;
|
|
149
163
|
/**
|
|
150
|
-
* Identifies if the code is being run in
|
|
164
|
+
* Identifies if the code is being run in a browser.
|
|
151
165
|
*
|
|
152
|
-
* @returns If the code is being run
|
|
166
|
+
* @returns If the code is being run in a browser.
|
|
153
167
|
*/
|
|
154
168
|
declare function isBrowser(): boolean;
|
|
155
169
|
/**
|
|
@@ -159,6 +173,13 @@ declare function isBrowser(): boolean;
|
|
|
159
173
|
* @returns If the value is defined.
|
|
160
174
|
*/
|
|
161
175
|
declare function isDefined<T = unknown>(val?: T): val is T;
|
|
176
|
+
/**
|
|
177
|
+
* Identifies if a value is an empty object.
|
|
178
|
+
*
|
|
179
|
+
* @param val - The value.
|
|
180
|
+
* @returns If the value is an empty object.
|
|
181
|
+
*/
|
|
182
|
+
declare function isEmptyObject(val: unknown): val is Record<string, never>;
|
|
162
183
|
/**
|
|
163
184
|
* Identifies if a value is a function.
|
|
164
185
|
*
|
|
@@ -246,9 +267,9 @@ declare function randomChance(n: number): boolean;
|
|
|
246
267
|
*/
|
|
247
268
|
declare function noop(): void;
|
|
248
269
|
/**
|
|
249
|
-
* Halts
|
|
270
|
+
* Halts thread execution for a stated time period.
|
|
250
271
|
*
|
|
251
|
-
* @param duration - The time
|
|
272
|
+
* @param duration - The time period (in ms).
|
|
252
273
|
* @returns The halting promise.
|
|
253
274
|
*/
|
|
254
275
|
declare function sleep(duration: number): Promise<void>;
|
|
@@ -284,9 +305,10 @@ declare function scroll({ to, offset, duration, container }: ScrollConfig): void
|
|
|
284
305
|
*
|
|
285
306
|
* @param str - The string.
|
|
286
307
|
* @param allWords - If all words should be capitalised.
|
|
308
|
+
* @param delimiter - The delimiter to split the string by.
|
|
287
309
|
* @returns The capitalised string.
|
|
288
310
|
*/
|
|
289
|
-
declare function capitalise(str: string, allWords?: boolean): string;
|
|
311
|
+
declare function capitalise(str: string, allWords?: boolean, delimiter?: string): string;
|
|
290
312
|
/**
|
|
291
313
|
* Separates a string into an array of characters.
|
|
292
314
|
*
|
|
@@ -329,6 +351,13 @@ declare function toKebab(str: string): string;
|
|
|
329
351
|
* @returns The number.
|
|
330
352
|
*/
|
|
331
353
|
declare function toNumber(str: string): number;
|
|
354
|
+
/**
|
|
355
|
+
* Adds the respective ordinal suffix (-st, -nd, -rd or -th) to a number.
|
|
356
|
+
*
|
|
357
|
+
* @param n - The number.
|
|
358
|
+
* @returns The number with the ordinal suffix appended.
|
|
359
|
+
*/
|
|
360
|
+
declare function toOrdinal(n: number | string): string;
|
|
332
361
|
/**
|
|
333
362
|
* Truncates a string to a provided length.
|
|
334
363
|
*
|
|
@@ -339,4 +368,4 @@ declare function toNumber(str: string): number;
|
|
|
339
368
|
*/
|
|
340
369
|
declare function truncate(str: string, length: number, truncateStr?: string): string;
|
|
341
370
|
|
|
342
|
-
export { Arrayable, Fn, Nullable, Obj, VoidFn, capitalise, chars, debounce, deepMerge, drop, groupsOf, head, init, isArray, isBlank, isBoolean, isBrowser, isDefined, isEmpty, isEven, isFunction, isNumber, isObject, isOdd, isString, isTouchDevice, isWindow, last, max, memoize, min, modulo, noop, partition, randomChance, randomNumber, scroll, sleep, splitAt, sum, tail, take, throttle, toArray, toCamel, toKebab, toNumber, truncate, uniq };
|
|
371
|
+
export { Arrayable, Fn, Nullable, Obj, VoidFn, capitalise, chars, debounce, deepMerge, delay, drop, groupsOf, head, init, isArray, isBlank, isBoolean, isBrowser, isDefined, isEmpty, isEmptyObject, isEven, isFunction, isNumber, isObject, isOdd, isString, isTouchDevice, isWindow, last, max, memoize, min, modulo, noop, once, partition, randomChance, randomNumber, scroll, sleep, splitAt, sum, tail, take, throttle, toArray, toCamel, toKebab, toNumber, toOrdinal, truncate, uniq };
|
package/dist/index.js
CHANGED
|
@@ -1,382 +1 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __reExport = (target, module2, copyDefault, desc) => {
|
|
11
|
-
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(module2))
|
|
13
|
-
if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
|
|
14
|
-
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return target;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = /* @__PURE__ */ ((cache) => {
|
|
19
|
-
return (module2, temp) => {
|
|
20
|
-
return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
|
|
21
|
-
};
|
|
22
|
-
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
|
|
23
|
-
|
|
24
|
-
// src/index.ts
|
|
25
|
-
var src_exports = {};
|
|
26
|
-
__export(src_exports, {
|
|
27
|
-
capitalise: () => capitalise,
|
|
28
|
-
chars: () => chars,
|
|
29
|
-
debounce: () => debounce,
|
|
30
|
-
deepMerge: () => deepMerge,
|
|
31
|
-
drop: () => drop,
|
|
32
|
-
groupsOf: () => groupsOf,
|
|
33
|
-
head: () => head,
|
|
34
|
-
init: () => init,
|
|
35
|
-
isArray: () => isArray,
|
|
36
|
-
isBlank: () => isBlank,
|
|
37
|
-
isBoolean: () => isBoolean,
|
|
38
|
-
isBrowser: () => isBrowser,
|
|
39
|
-
isDefined: () => isDefined,
|
|
40
|
-
isEmpty: () => isEmpty,
|
|
41
|
-
isEven: () => isEven,
|
|
42
|
-
isFunction: () => isFunction,
|
|
43
|
-
isNumber: () => isNumber,
|
|
44
|
-
isObject: () => isObject,
|
|
45
|
-
isOdd: () => isOdd,
|
|
46
|
-
isString: () => isString,
|
|
47
|
-
isTouchDevice: () => isTouchDevice,
|
|
48
|
-
isWindow: () => isWindow,
|
|
49
|
-
last: () => last,
|
|
50
|
-
max: () => max,
|
|
51
|
-
memoize: () => memoize,
|
|
52
|
-
min: () => min,
|
|
53
|
-
modulo: () => modulo,
|
|
54
|
-
noop: () => noop,
|
|
55
|
-
partition: () => partition,
|
|
56
|
-
randomChance: () => randomChance,
|
|
57
|
-
randomNumber: () => randomNumber,
|
|
58
|
-
scroll: () => scroll,
|
|
59
|
-
sleep: () => sleep,
|
|
60
|
-
splitAt: () => splitAt,
|
|
61
|
-
sum: () => sum,
|
|
62
|
-
tail: () => tail,
|
|
63
|
-
take: () => take,
|
|
64
|
-
throttle: () => throttle,
|
|
65
|
-
toArray: () => toArray,
|
|
66
|
-
toCamel: () => toCamel,
|
|
67
|
-
toKebab: () => toKebab,
|
|
68
|
-
toNumber: () => toNumber,
|
|
69
|
-
truncate: () => truncate,
|
|
70
|
-
uniq: () => uniq
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// src/array.ts
|
|
74
|
-
function drop(n, array) {
|
|
75
|
-
if (n <= 0) {
|
|
76
|
-
return [...array];
|
|
77
|
-
}
|
|
78
|
-
return array.slice(n);
|
|
79
|
-
}
|
|
80
|
-
function groupsOf(s, array) {
|
|
81
|
-
if (s <= 0) {
|
|
82
|
-
throw new Error("[tsu] Invalid group size");
|
|
83
|
-
}
|
|
84
|
-
if (s >= array.length) {
|
|
85
|
-
return [[...array]];
|
|
86
|
-
}
|
|
87
|
-
const groupedArray = [];
|
|
88
|
-
for (let i = 0; i < array.length; i += s) {
|
|
89
|
-
groupedArray.push(array.slice(i, i + s));
|
|
90
|
-
}
|
|
91
|
-
return groupedArray;
|
|
92
|
-
}
|
|
93
|
-
function head(array) {
|
|
94
|
-
return array[0];
|
|
95
|
-
}
|
|
96
|
-
function init(array) {
|
|
97
|
-
return array.slice(0, array.length - 1);
|
|
98
|
-
}
|
|
99
|
-
function last(array) {
|
|
100
|
-
return array[array.length - 1];
|
|
101
|
-
}
|
|
102
|
-
function max(array) {
|
|
103
|
-
if (!array.length) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
return Math.max(...array);
|
|
107
|
-
}
|
|
108
|
-
function min(array) {
|
|
109
|
-
if (!array.length) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
return Math.min(...array);
|
|
113
|
-
}
|
|
114
|
-
function partition(filter, array) {
|
|
115
|
-
return array.reduce(([passed, failed], item, idx, arr) => {
|
|
116
|
-
if (filter(item, idx, arr)) {
|
|
117
|
-
return [[...passed, item], failed];
|
|
118
|
-
}
|
|
119
|
-
return [passed, [...failed, item]];
|
|
120
|
-
}, [[], []]);
|
|
121
|
-
}
|
|
122
|
-
function splitAt(i, array) {
|
|
123
|
-
if (i <= 0) {
|
|
124
|
-
return [[], [...array]];
|
|
125
|
-
}
|
|
126
|
-
return [array.slice(0, i), array.slice(i)];
|
|
127
|
-
}
|
|
128
|
-
function sum(array) {
|
|
129
|
-
if (!array.length) {
|
|
130
|
-
return 0;
|
|
131
|
-
}
|
|
132
|
-
return array.reduce((sum2, current) => sum2 + current, 0);
|
|
133
|
-
}
|
|
134
|
-
function tail(array) {
|
|
135
|
-
return array.slice(1);
|
|
136
|
-
}
|
|
137
|
-
function take(n, array) {
|
|
138
|
-
if (n <= 0) {
|
|
139
|
-
return [];
|
|
140
|
-
}
|
|
141
|
-
return array.slice(0, n);
|
|
142
|
-
}
|
|
143
|
-
function toArray(maybeArray) {
|
|
144
|
-
if (!maybeArray) {
|
|
145
|
-
return [];
|
|
146
|
-
}
|
|
147
|
-
return Array.isArray(maybeArray) ? maybeArray : [maybeArray];
|
|
148
|
-
}
|
|
149
|
-
function uniq(array) {
|
|
150
|
-
return Array.from(new Set(array));
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// src/function.ts
|
|
154
|
-
function debounce(fn, delay) {
|
|
155
|
-
let timeout;
|
|
156
|
-
return function(...args) {
|
|
157
|
-
clearTimeout(timeout);
|
|
158
|
-
timeout = setTimeout(() => {
|
|
159
|
-
clearTimeout(timeout);
|
|
160
|
-
fn(...args);
|
|
161
|
-
}, delay);
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
function memoize(fn) {
|
|
165
|
-
const cache = {};
|
|
166
|
-
return function(...args) {
|
|
167
|
-
const argsString = JSON.stringify(args);
|
|
168
|
-
if (argsString in cache) {
|
|
169
|
-
return cache[argsString];
|
|
170
|
-
}
|
|
171
|
-
const result = fn(...args);
|
|
172
|
-
cache[argsString] = result;
|
|
173
|
-
return result;
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
function throttle(fn, limit) {
|
|
177
|
-
let isWaiting = false;
|
|
178
|
-
return function(...args) {
|
|
179
|
-
if (!isWaiting) {
|
|
180
|
-
fn(...args);
|
|
181
|
-
isWaiting = true;
|
|
182
|
-
setTimeout(() => {
|
|
183
|
-
isWaiting = false;
|
|
184
|
-
}, limit);
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// src/is.ts
|
|
190
|
-
function isArray(val) {
|
|
191
|
-
return Array.isArray(val);
|
|
192
|
-
}
|
|
193
|
-
function isBoolean(val) {
|
|
194
|
-
return typeof val === "boolean";
|
|
195
|
-
}
|
|
196
|
-
function isBrowser() {
|
|
197
|
-
return typeof window !== "undefined";
|
|
198
|
-
}
|
|
199
|
-
function isDefined(val) {
|
|
200
|
-
return typeof val !== "undefined";
|
|
201
|
-
}
|
|
202
|
-
function isFunction(val) {
|
|
203
|
-
return typeof val === "function";
|
|
204
|
-
}
|
|
205
|
-
function isNumber(val) {
|
|
206
|
-
return typeof val === "number";
|
|
207
|
-
}
|
|
208
|
-
function isObject(val) {
|
|
209
|
-
return Object.prototype.toString.call(val) === "[object Object]";
|
|
210
|
-
}
|
|
211
|
-
function isString(val) {
|
|
212
|
-
return typeof val === "string";
|
|
213
|
-
}
|
|
214
|
-
function isTouchDevice() {
|
|
215
|
-
return "ontouchstart" in window || navigator.maxTouchPoints > 0;
|
|
216
|
-
}
|
|
217
|
-
function isWindow(val) {
|
|
218
|
-
return isBrowser() && toString.call(val) === "[object Window]";
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// src/maths.ts
|
|
222
|
-
function isEven(n) {
|
|
223
|
-
return n % 2 === 0;
|
|
224
|
-
}
|
|
225
|
-
function isOdd(n) {
|
|
226
|
-
return n % 2 !== 0;
|
|
227
|
-
}
|
|
228
|
-
function modulo(n, m) {
|
|
229
|
-
return n - Math.floor(n / m) * m;
|
|
230
|
-
}
|
|
231
|
-
function randomNumber(max2, min2 = 0) {
|
|
232
|
-
return Math.floor(Math.random() * (max2 - min2)) + min2;
|
|
233
|
-
}
|
|
234
|
-
function randomChance(n) {
|
|
235
|
-
return randomNumber(n) === 0;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// src/misc.ts
|
|
239
|
-
function noop() {
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
async function sleep(duration) {
|
|
243
|
-
return new Promise((resolve) => setTimeout(resolve, duration));
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// src/object.ts
|
|
247
|
-
function deepMerge(...objects) {
|
|
248
|
-
return objects.reduce((result, current) => {
|
|
249
|
-
Object.keys(current).forEach((key) => {
|
|
250
|
-
if (isArray(result[key]) && isArray(current[key])) {
|
|
251
|
-
result[key] = uniq(result[key].concat(current[key]));
|
|
252
|
-
} else if (isObject(result[key]) && isObject(current[key])) {
|
|
253
|
-
result[key] = deepMerge(result[key], current[key]);
|
|
254
|
-
} else {
|
|
255
|
-
result[key] = current[key];
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
return result;
|
|
259
|
-
}, {});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// src/scroll.ts
|
|
263
|
-
function scroll({
|
|
264
|
-
to,
|
|
265
|
-
offset = 0,
|
|
266
|
-
duration = 1e3,
|
|
267
|
-
container = null
|
|
268
|
-
}) {
|
|
269
|
-
const target = isString(to) ? document.querySelector(to) : to;
|
|
270
|
-
const _container = isString(container) ? document.querySelector(container) : container;
|
|
271
|
-
const start = (_container == null ? void 0 : _container.scrollTop) || (window == null ? void 0 : window.pageYOffset) || 0;
|
|
272
|
-
const end = (isNumber(target) ? target : getElTop(target, start)) + offset;
|
|
273
|
-
const startTime = Date.now();
|
|
274
|
-
function step() {
|
|
275
|
-
const timeElapsed = Date.now() - startTime;
|
|
276
|
-
const isScrolling = timeElapsed < duration;
|
|
277
|
-
const position = isScrolling ? getPosition(start, end, timeElapsed, duration) : end;
|
|
278
|
-
if (isScrolling) {
|
|
279
|
-
requestAnimationFrame(step);
|
|
280
|
-
}
|
|
281
|
-
if (_container) {
|
|
282
|
-
_container.scrollTop = position;
|
|
283
|
-
} else {
|
|
284
|
-
window.scrollTo(0, position);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
step();
|
|
288
|
-
}
|
|
289
|
-
function easing(t) {
|
|
290
|
-
return t < 0.5 ? 4 * Math.pow(t, 3) : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
|
|
291
|
-
}
|
|
292
|
-
function getPosition(s, e, t, d) {
|
|
293
|
-
return s + (e - s) * easing(t / d);
|
|
294
|
-
}
|
|
295
|
-
function getElTop(element, start) {
|
|
296
|
-
return element.nodeName === "HTML" ? -start : element.getBoundingClientRect().top + start;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// src/string.ts
|
|
300
|
-
function capitalise(str, allWords = false) {
|
|
301
|
-
if (!allWords) {
|
|
302
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
303
|
-
}
|
|
304
|
-
return str.split(" ").map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(" ");
|
|
305
|
-
}
|
|
306
|
-
function chars(str) {
|
|
307
|
-
return str.split("");
|
|
308
|
-
}
|
|
309
|
-
function isBlank(str) {
|
|
310
|
-
return str.trim().length === 0;
|
|
311
|
-
}
|
|
312
|
-
function isEmpty(str) {
|
|
313
|
-
return str.length === 0;
|
|
314
|
-
}
|
|
315
|
-
function toCamel(str) {
|
|
316
|
-
const RE = /-(\w)/g;
|
|
317
|
-
return str.replace(RE, (_, c) => c ? c.toUpperCase() : "");
|
|
318
|
-
}
|
|
319
|
-
function toKebab(str) {
|
|
320
|
-
const RE = /\B([A-Z])/g;
|
|
321
|
-
return str.replace(RE, "-$1").toLowerCase();
|
|
322
|
-
}
|
|
323
|
-
function toNumber(str) {
|
|
324
|
-
if (!str.length) {
|
|
325
|
-
return NaN;
|
|
326
|
-
}
|
|
327
|
-
return Number(str.replace(/[#£€$,%]/g, ""));
|
|
328
|
-
}
|
|
329
|
-
function truncate(str, length, truncateStr = "...") {
|
|
330
|
-
if (length <= 0) {
|
|
331
|
-
return truncateStr;
|
|
332
|
-
}
|
|
333
|
-
return str.slice(0, length) + truncateStr;
|
|
334
|
-
}
|
|
335
|
-
module.exports = __toCommonJS(src_exports);
|
|
336
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
337
|
-
0 && (module.exports = {
|
|
338
|
-
capitalise,
|
|
339
|
-
chars,
|
|
340
|
-
debounce,
|
|
341
|
-
deepMerge,
|
|
342
|
-
drop,
|
|
343
|
-
groupsOf,
|
|
344
|
-
head,
|
|
345
|
-
init,
|
|
346
|
-
isArray,
|
|
347
|
-
isBlank,
|
|
348
|
-
isBoolean,
|
|
349
|
-
isBrowser,
|
|
350
|
-
isDefined,
|
|
351
|
-
isEmpty,
|
|
352
|
-
isEven,
|
|
353
|
-
isFunction,
|
|
354
|
-
isNumber,
|
|
355
|
-
isObject,
|
|
356
|
-
isOdd,
|
|
357
|
-
isString,
|
|
358
|
-
isTouchDevice,
|
|
359
|
-
isWindow,
|
|
360
|
-
last,
|
|
361
|
-
max,
|
|
362
|
-
memoize,
|
|
363
|
-
min,
|
|
364
|
-
modulo,
|
|
365
|
-
noop,
|
|
366
|
-
partition,
|
|
367
|
-
randomChance,
|
|
368
|
-
randomNumber,
|
|
369
|
-
scroll,
|
|
370
|
-
sleep,
|
|
371
|
-
splitAt,
|
|
372
|
-
sum,
|
|
373
|
-
tail,
|
|
374
|
-
take,
|
|
375
|
-
throttle,
|
|
376
|
-
toArray,
|
|
377
|
-
toCamel,
|
|
378
|
-
toKebab,
|
|
379
|
-
toNumber,
|
|
380
|
-
truncate,
|
|
381
|
-
uniq
|
|
382
|
-
});
|
|
1
|
+
function F(n,e){return n<=0?[...e]:e.slice(n)}function j(n,e){if(n<=0)throw new Error("[tsu] Invalid group size. Is it greater than 0?");if(n>=e.length)return[[...e]];let r=[];for(let t=0;t<e.length;t+=n)r.push(e.slice(t,t+n));return r}function E(n){return n[0]}function N(n){return n.slice(0,n.length-1)}function A(n){return n[n.length-1]}function S(n){if(!!n.length)return Math.max(...n)}function M(n){if(!!n.length)return Math.min(...n)}function C(n,e){return e.reduce(([r,t],o,i,u)=>n(o,i,u)?[[...r,o],t]:[r,[...t,o]],[[],[]])}function U(n,e){return n<=0?[[],[...e]]:[e.slice(0,n),e.slice(n)]}function I(n){return n.length?n.reduce((e,r)=>e+r,0):0}function q(n){return n.slice(1)}function B(n,e){return n<=0?[]:e.slice(0,n)}function D(n){return n?Array.isArray(n)?n:[n]:[]}function T(n){return Array.from(new Set(n))}function L(n,e){let r;return function(...t){clearTimeout(r),r=setTimeout(()=>{clearTimeout(r),n(...t)},e)}}function P(n,e){setTimeout(()=>{n()},e)}function V(n){let e={};return function(...r){let t=JSON.stringify(r);if(t in e)return e[t];let o=n(...r);return e[t]=o,o}}function W(n){let e=!1;return(...r)=>{e||(n(...r),e=!0)}}function $(n,e){let r=!1;return function(...t){r||(n(...t),r=!0,setTimeout(()=>{r=!1},e))}}function f(n){return Array.isArray(n)}function H(n){return typeof n=="boolean"}function g(){return typeof window<"u"}function z(n){return typeof n<"u"}function J(n){if(!s(n))return!1;for(let e in n)return!1;return!0}function K(n){return typeof n=="function"}function d(n){return typeof n=="number"}function s(n){return Object.prototype.toString.call(n)==="[object Object]"}function c(n){return typeof n=="string"}function Y(){return"ontouchstart"in window||navigator.maxTouchPoints>0}function Z(n){return g()&&toString.call(n)==="[object Window]"}function G(n){return n%2===0}function Q(n){return n%2!==0}function X(n,e){return n-Math.floor(n/e)*e}function h(n,e=0){return Math.floor(Math.random()*(n-e))+e}function nn(n){return h(n)===0}function tn(){}async function rn(n){return new Promise(e=>setTimeout(e,n))}function w(...n){return n.reduce((e,r)=>(Object.keys(r).forEach(t=>{f(e[t])&&f(r[t])?e[t]=T(e[t].concat(r[t])):s(e[t])&&s(r[t])?e[t]=w(e[t],r[t]):e[t]=r[t]}),e),{})}function ln({to:n,offset:e=0,duration:r=1e3,container:t=null}){let o=c(n)?document.querySelector(n):n,i=c(t)?document.querySelector(t):t,u=(i==null?void 0:i.scrollTop)||(window==null?void 0:window.pageYOffset)||0,l=(d(o)?o:O(o,u))+e,x=Date.now();function p(){let m=Date.now()-x,a=m<r,b=a?v(u,l,m,r):l;a&&requestAnimationFrame(p),i?i.scrollTop=b:window.scrollTo(0,b)}p()}function y(n){return n<.5?4*Math.pow(n,3):(n-1)*(2*n-2)*(2*n-2)+1}function v(n,e,r,t){return n+(e-n)*y(r/t)}function O(n,e){return n.nodeName==="HTML"?-e:n.getBoundingClientRect().top+e}function mn(n,e=!1,r=" "){return e?n.split(r).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(r):n.charAt(0).toUpperCase()+n.slice(1)}function an(n){return n.split("")}function bn(n){return n.trim().length===0}function Tn(n){return n.length===0}function dn(n){let e=/-(\w)/g;return n.replace(e,(r,t)=>t?t.toUpperCase():"")}function xn(n){let e=/\B([A-Z])/g;return n.replace(e,"-$1").toLowerCase()}function gn(n){return n.length?Number(n.replace(/[#£€$,%]/g,"")):NaN}function hn(n){if(typeof n=="string"&&(n.trim()===""||isNaN(parseFloat(n))))throw new Error("[tsu] invalid string. Does it contain only a number?");let t=["st","nd","rd"][(Number(n)/10%10^1&&Number(n)%10)-1]||"th";return`${n}${t}`}function wn(n,e,r="..."){return e<=0?r:n.slice(0,e)+r}export{mn as capitalise,an as chars,L as debounce,w as deepMerge,P as delay,F as drop,j as groupsOf,E as head,N as init,f as isArray,bn as isBlank,H as isBoolean,g as isBrowser,z as isDefined,Tn as isEmpty,J as isEmptyObject,G as isEven,K as isFunction,d as isNumber,s as isObject,Q as isOdd,c as isString,Y as isTouchDevice,Z as isWindow,A as last,S as max,V as memoize,M as min,X as modulo,tn as noop,W as once,C as partition,nn as randomChance,h as randomNumber,ln as scroll,rn as sleep,U as splitAt,I as sum,q as tail,B as take,$ as throttle,D as toArray,dn as toCamel,xn as toKebab,gn as toNumber,hn as toOrdinal,wn as truncate,T as uniq};
|
package/package.json
CHANGED
|
@@ -1,47 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tsu",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "A collection of TypeScript utilities.",
|
|
6
|
+
"license": "MIT",
|
|
5
7
|
"author": "eb3n",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
6
21
|
"repository": {
|
|
7
22
|
"type": "git",
|
|
8
23
|
"url": "git+https://gitlab.com/eb3n/tsu.git"
|
|
9
24
|
},
|
|
10
|
-
"
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://gitlab.com/eb3n/tsu/issues"
|
|
27
|
+
},
|
|
11
28
|
"scripts": {
|
|
12
|
-
"build": "tsup
|
|
13
|
-
"watch": "
|
|
29
|
+
"build": "tsup",
|
|
30
|
+
"watch": "nr build --watch src",
|
|
14
31
|
"test": "jest",
|
|
15
|
-
"prepublishOnly": "
|
|
32
|
+
"prepublishOnly": "nr test; nr build",
|
|
16
33
|
"docs:dev": "vuepress dev docs",
|
|
17
34
|
"docs:build": "vuepress build docs"
|
|
18
35
|
},
|
|
19
|
-
"main": "./dist/index.js",
|
|
20
|
-
"module": "./dist/index.mjs",
|
|
21
|
-
"types": "./dist/index.d.ts",
|
|
22
|
-
"files": [
|
|
23
|
-
"dist"
|
|
24
|
-
],
|
|
25
|
-
"exports": {
|
|
26
|
-
".": {
|
|
27
|
-
"require": "./dist/index.js",
|
|
28
|
-
"import": "./dist/index.mjs",
|
|
29
|
-
"types": "./dist/index.d.ts"
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
36
|
"devDependencies": {
|
|
33
|
-
"@
|
|
34
|
-
"@
|
|
35
|
-
"@typescript-eslint/
|
|
36
|
-
"eslint": "^
|
|
37
|
+
"@antfu/ni": "^0.17.2",
|
|
38
|
+
"@types/jest": "^28.1.7",
|
|
39
|
+
"@typescript-eslint/eslint-plugin": "^5.33.0",
|
|
40
|
+
"@typescript-eslint/parser": "^5.33.0",
|
|
41
|
+
"eslint": "^8.22.0",
|
|
37
42
|
"eslint-config-prettier": "^8.5.0",
|
|
38
|
-
"eslint-plugin-prettier": "^4.
|
|
39
|
-
"jest": "^
|
|
40
|
-
"prettier": "^2.
|
|
41
|
-
"ts-jest": "^
|
|
42
|
-
"tsup": "^
|
|
43
|
-
"typescript": "^4.
|
|
44
|
-
"vuepress": "
|
|
45
|
-
}
|
|
46
|
-
"dependencies": {}
|
|
43
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
44
|
+
"jest": "^28.1.3",
|
|
45
|
+
"prettier": "^2.7.1",
|
|
46
|
+
"ts-jest": "^28.0.8",
|
|
47
|
+
"tsup": "^6.2.2",
|
|
48
|
+
"typescript": "^4.7.4",
|
|
49
|
+
"vuepress": "2.0.0-beta.41"
|
|
50
|
+
}
|
|
47
51
|
}
|
package/dist/index.mjs
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
// src/array.ts
|
|
2
|
-
function drop(n, array) {
|
|
3
|
-
if (n <= 0) {
|
|
4
|
-
return [...array];
|
|
5
|
-
}
|
|
6
|
-
return array.slice(n);
|
|
7
|
-
}
|
|
8
|
-
function groupsOf(s, array) {
|
|
9
|
-
if (s <= 0) {
|
|
10
|
-
throw new Error("[tsu] Invalid group size");
|
|
11
|
-
}
|
|
12
|
-
if (s >= array.length) {
|
|
13
|
-
return [[...array]];
|
|
14
|
-
}
|
|
15
|
-
const groupedArray = [];
|
|
16
|
-
for (let i = 0; i < array.length; i += s) {
|
|
17
|
-
groupedArray.push(array.slice(i, i + s));
|
|
18
|
-
}
|
|
19
|
-
return groupedArray;
|
|
20
|
-
}
|
|
21
|
-
function head(array) {
|
|
22
|
-
return array[0];
|
|
23
|
-
}
|
|
24
|
-
function init(array) {
|
|
25
|
-
return array.slice(0, array.length - 1);
|
|
26
|
-
}
|
|
27
|
-
function last(array) {
|
|
28
|
-
return array[array.length - 1];
|
|
29
|
-
}
|
|
30
|
-
function max(array) {
|
|
31
|
-
if (!array.length) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
return Math.max(...array);
|
|
35
|
-
}
|
|
36
|
-
function min(array) {
|
|
37
|
-
if (!array.length) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
return Math.min(...array);
|
|
41
|
-
}
|
|
42
|
-
function partition(filter, array) {
|
|
43
|
-
return array.reduce(([passed, failed], item, idx, arr) => {
|
|
44
|
-
if (filter(item, idx, arr)) {
|
|
45
|
-
return [[...passed, item], failed];
|
|
46
|
-
}
|
|
47
|
-
return [passed, [...failed, item]];
|
|
48
|
-
}, [[], []]);
|
|
49
|
-
}
|
|
50
|
-
function splitAt(i, array) {
|
|
51
|
-
if (i <= 0) {
|
|
52
|
-
return [[], [...array]];
|
|
53
|
-
}
|
|
54
|
-
return [array.slice(0, i), array.slice(i)];
|
|
55
|
-
}
|
|
56
|
-
function sum(array) {
|
|
57
|
-
if (!array.length) {
|
|
58
|
-
return 0;
|
|
59
|
-
}
|
|
60
|
-
return array.reduce((sum2, current) => sum2 + current, 0);
|
|
61
|
-
}
|
|
62
|
-
function tail(array) {
|
|
63
|
-
return array.slice(1);
|
|
64
|
-
}
|
|
65
|
-
function take(n, array) {
|
|
66
|
-
if (n <= 0) {
|
|
67
|
-
return [];
|
|
68
|
-
}
|
|
69
|
-
return array.slice(0, n);
|
|
70
|
-
}
|
|
71
|
-
function toArray(maybeArray) {
|
|
72
|
-
if (!maybeArray) {
|
|
73
|
-
return [];
|
|
74
|
-
}
|
|
75
|
-
return Array.isArray(maybeArray) ? maybeArray : [maybeArray];
|
|
76
|
-
}
|
|
77
|
-
function uniq(array) {
|
|
78
|
-
return Array.from(new Set(array));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// src/function.ts
|
|
82
|
-
function debounce(fn, delay) {
|
|
83
|
-
let timeout;
|
|
84
|
-
return function(...args) {
|
|
85
|
-
clearTimeout(timeout);
|
|
86
|
-
timeout = setTimeout(() => {
|
|
87
|
-
clearTimeout(timeout);
|
|
88
|
-
fn(...args);
|
|
89
|
-
}, delay);
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
function memoize(fn) {
|
|
93
|
-
const cache = {};
|
|
94
|
-
return function(...args) {
|
|
95
|
-
const argsString = JSON.stringify(args);
|
|
96
|
-
if (argsString in cache) {
|
|
97
|
-
return cache[argsString];
|
|
98
|
-
}
|
|
99
|
-
const result = fn(...args);
|
|
100
|
-
cache[argsString] = result;
|
|
101
|
-
return result;
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function throttle(fn, limit) {
|
|
105
|
-
let isWaiting = false;
|
|
106
|
-
return function(...args) {
|
|
107
|
-
if (!isWaiting) {
|
|
108
|
-
fn(...args);
|
|
109
|
-
isWaiting = true;
|
|
110
|
-
setTimeout(() => {
|
|
111
|
-
isWaiting = false;
|
|
112
|
-
}, limit);
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// src/is.ts
|
|
118
|
-
function isArray(val) {
|
|
119
|
-
return Array.isArray(val);
|
|
120
|
-
}
|
|
121
|
-
function isBoolean(val) {
|
|
122
|
-
return typeof val === "boolean";
|
|
123
|
-
}
|
|
124
|
-
function isBrowser() {
|
|
125
|
-
return typeof window !== "undefined";
|
|
126
|
-
}
|
|
127
|
-
function isDefined(val) {
|
|
128
|
-
return typeof val !== "undefined";
|
|
129
|
-
}
|
|
130
|
-
function isFunction(val) {
|
|
131
|
-
return typeof val === "function";
|
|
132
|
-
}
|
|
133
|
-
function isNumber(val) {
|
|
134
|
-
return typeof val === "number";
|
|
135
|
-
}
|
|
136
|
-
function isObject(val) {
|
|
137
|
-
return Object.prototype.toString.call(val) === "[object Object]";
|
|
138
|
-
}
|
|
139
|
-
function isString(val) {
|
|
140
|
-
return typeof val === "string";
|
|
141
|
-
}
|
|
142
|
-
function isTouchDevice() {
|
|
143
|
-
return "ontouchstart" in window || navigator.maxTouchPoints > 0;
|
|
144
|
-
}
|
|
145
|
-
function isWindow(val) {
|
|
146
|
-
return isBrowser() && toString.call(val) === "[object Window]";
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// src/maths.ts
|
|
150
|
-
function isEven(n) {
|
|
151
|
-
return n % 2 === 0;
|
|
152
|
-
}
|
|
153
|
-
function isOdd(n) {
|
|
154
|
-
return n % 2 !== 0;
|
|
155
|
-
}
|
|
156
|
-
function modulo(n, m) {
|
|
157
|
-
return n - Math.floor(n / m) * m;
|
|
158
|
-
}
|
|
159
|
-
function randomNumber(max2, min2 = 0) {
|
|
160
|
-
return Math.floor(Math.random() * (max2 - min2)) + min2;
|
|
161
|
-
}
|
|
162
|
-
function randomChance(n) {
|
|
163
|
-
return randomNumber(n) === 0;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// src/misc.ts
|
|
167
|
-
function noop() {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
async function sleep(duration) {
|
|
171
|
-
return new Promise((resolve) => setTimeout(resolve, duration));
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// src/object.ts
|
|
175
|
-
function deepMerge(...objects) {
|
|
176
|
-
return objects.reduce((result, current) => {
|
|
177
|
-
Object.keys(current).forEach((key) => {
|
|
178
|
-
if (isArray(result[key]) && isArray(current[key])) {
|
|
179
|
-
result[key] = uniq(result[key].concat(current[key]));
|
|
180
|
-
} else if (isObject(result[key]) && isObject(current[key])) {
|
|
181
|
-
result[key] = deepMerge(result[key], current[key]);
|
|
182
|
-
} else {
|
|
183
|
-
result[key] = current[key];
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
return result;
|
|
187
|
-
}, {});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// src/scroll.ts
|
|
191
|
-
function scroll({
|
|
192
|
-
to,
|
|
193
|
-
offset = 0,
|
|
194
|
-
duration = 1e3,
|
|
195
|
-
container = null
|
|
196
|
-
}) {
|
|
197
|
-
const target = isString(to) ? document.querySelector(to) : to;
|
|
198
|
-
const _container = isString(container) ? document.querySelector(container) : container;
|
|
199
|
-
const start = (_container == null ? void 0 : _container.scrollTop) || (window == null ? void 0 : window.pageYOffset) || 0;
|
|
200
|
-
const end = (isNumber(target) ? target : getElTop(target, start)) + offset;
|
|
201
|
-
const startTime = Date.now();
|
|
202
|
-
function step() {
|
|
203
|
-
const timeElapsed = Date.now() - startTime;
|
|
204
|
-
const isScrolling = timeElapsed < duration;
|
|
205
|
-
const position = isScrolling ? getPosition(start, end, timeElapsed, duration) : end;
|
|
206
|
-
if (isScrolling) {
|
|
207
|
-
requestAnimationFrame(step);
|
|
208
|
-
}
|
|
209
|
-
if (_container) {
|
|
210
|
-
_container.scrollTop = position;
|
|
211
|
-
} else {
|
|
212
|
-
window.scrollTo(0, position);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
step();
|
|
216
|
-
}
|
|
217
|
-
function easing(t) {
|
|
218
|
-
return t < 0.5 ? 4 * Math.pow(t, 3) : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
|
|
219
|
-
}
|
|
220
|
-
function getPosition(s, e, t, d) {
|
|
221
|
-
return s + (e - s) * easing(t / d);
|
|
222
|
-
}
|
|
223
|
-
function getElTop(element, start) {
|
|
224
|
-
return element.nodeName === "HTML" ? -start : element.getBoundingClientRect().top + start;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// src/string.ts
|
|
228
|
-
function capitalise(str, allWords = false) {
|
|
229
|
-
if (!allWords) {
|
|
230
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
231
|
-
}
|
|
232
|
-
return str.split(" ").map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(" ");
|
|
233
|
-
}
|
|
234
|
-
function chars(str) {
|
|
235
|
-
return str.split("");
|
|
236
|
-
}
|
|
237
|
-
function isBlank(str) {
|
|
238
|
-
return str.trim().length === 0;
|
|
239
|
-
}
|
|
240
|
-
function isEmpty(str) {
|
|
241
|
-
return str.length === 0;
|
|
242
|
-
}
|
|
243
|
-
function toCamel(str) {
|
|
244
|
-
const RE = /-(\w)/g;
|
|
245
|
-
return str.replace(RE, (_, c) => c ? c.toUpperCase() : "");
|
|
246
|
-
}
|
|
247
|
-
function toKebab(str) {
|
|
248
|
-
const RE = /\B([A-Z])/g;
|
|
249
|
-
return str.replace(RE, "-$1").toLowerCase();
|
|
250
|
-
}
|
|
251
|
-
function toNumber(str) {
|
|
252
|
-
if (!str.length) {
|
|
253
|
-
return NaN;
|
|
254
|
-
}
|
|
255
|
-
return Number(str.replace(/[#£€$,%]/g, ""));
|
|
256
|
-
}
|
|
257
|
-
function truncate(str, length, truncateStr = "...") {
|
|
258
|
-
if (length <= 0) {
|
|
259
|
-
return truncateStr;
|
|
260
|
-
}
|
|
261
|
-
return str.slice(0, length) + truncateStr;
|
|
262
|
-
}
|
|
263
|
-
export {
|
|
264
|
-
capitalise,
|
|
265
|
-
chars,
|
|
266
|
-
debounce,
|
|
267
|
-
deepMerge,
|
|
268
|
-
drop,
|
|
269
|
-
groupsOf,
|
|
270
|
-
head,
|
|
271
|
-
init,
|
|
272
|
-
isArray,
|
|
273
|
-
isBlank,
|
|
274
|
-
isBoolean,
|
|
275
|
-
isBrowser,
|
|
276
|
-
isDefined,
|
|
277
|
-
isEmpty,
|
|
278
|
-
isEven,
|
|
279
|
-
isFunction,
|
|
280
|
-
isNumber,
|
|
281
|
-
isObject,
|
|
282
|
-
isOdd,
|
|
283
|
-
isString,
|
|
284
|
-
isTouchDevice,
|
|
285
|
-
isWindow,
|
|
286
|
-
last,
|
|
287
|
-
max,
|
|
288
|
-
memoize,
|
|
289
|
-
min,
|
|
290
|
-
modulo,
|
|
291
|
-
noop,
|
|
292
|
-
partition,
|
|
293
|
-
randomChance,
|
|
294
|
-
randomNumber,
|
|
295
|
-
scroll,
|
|
296
|
-
sleep,
|
|
297
|
-
splitAt,
|
|
298
|
-
sum,
|
|
299
|
-
tail,
|
|
300
|
-
take,
|
|
301
|
-
throttle,
|
|
302
|
-
toArray,
|
|
303
|
-
toCamel,
|
|
304
|
-
toKebab,
|
|
305
|
-
toNumber,
|
|
306
|
-
truncate,
|
|
307
|
-
uniq
|
|
308
|
-
};
|