@ntnyq/utils 0.0.2 → 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 +1 -1
- package/README.md +14 -6
- package/dist/index.cjs +221 -10
- package/dist/index.d.cts +79 -0
- package/dist/index.d.ts +62 -26
- package/dist/index.js +178 -0
- package/package.json +55 -30
- package/dist/index.mjs +0 -13
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2024-PRESENT ntnyq <https://github.com/ntnyq>
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
# @ntnyq/utils
|
|
2
2
|
|
|
3
|
+
[](https://github.com/ntnyq/utils/actions)
|
|
3
4
|
[](https://www.npmjs.com/package/@ntnyq/utils)
|
|
5
|
+
[](https://www.npmjs.com/package/@ntnyq/utils)
|
|
6
|
+
[](https://codecov.io/github/ntnyq/utils)
|
|
7
|
+
[](https://github.com/ntnyq/utils/blob/main/LICENSE)
|
|
8
|
+
|
|
9
|
+
> Common used utils.
|
|
4
10
|
|
|
5
11
|
## Install
|
|
6
12
|
|
|
7
13
|
```bash
|
|
8
|
-
|
|
14
|
+
npm install @ntnyq/utils
|
|
9
15
|
```
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
```bash
|
|
18
|
+
yarn add @ntnyq/utils
|
|
19
|
+
```
|
|
12
20
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
21
|
+
```bash
|
|
22
|
+
pnpm add @ntnyq/utils
|
|
23
|
+
```
|
|
16
24
|
|
|
17
25
|
## License
|
|
18
26
|
|
|
19
|
-
[MIT](./LICENSE) License ©
|
|
27
|
+
[MIT](./LICENSE) License © 2024-PRESENT [ntnyq](https://github.com/ntnyq)
|
package/dist/index.cjs
CHANGED
|
@@ -1,17 +1,228 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
2
19
|
|
|
3
|
-
|
|
4
|
-
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
cAF: () => cAF,
|
|
24
|
+
camelCase: () => camelCase,
|
|
25
|
+
capitalize: () => capitalize,
|
|
26
|
+
days: () => days,
|
|
27
|
+
flatCase: () => flatCase,
|
|
28
|
+
hours: () => hours,
|
|
29
|
+
isBrowser: () => isBrowser,
|
|
30
|
+
isUppercase: () => isUppercase,
|
|
31
|
+
kebabCase: () => kebabCase,
|
|
32
|
+
lowerFirst: () => lowerFirst,
|
|
33
|
+
minutes: () => minutes,
|
|
34
|
+
pascalCase: () => pascalCase,
|
|
35
|
+
rAF: () => rAF,
|
|
36
|
+
seconds: () => seconds,
|
|
37
|
+
snakeCase: () => snakeCase,
|
|
38
|
+
splitByCase: () => splitByCase,
|
|
39
|
+
titleCase: () => titleCase,
|
|
40
|
+
toArray: () => toArray,
|
|
41
|
+
trainCase: () => trainCase,
|
|
42
|
+
unique: () => unique,
|
|
43
|
+
upperFirst: () => upperFirst,
|
|
44
|
+
waitFor: () => waitFor,
|
|
45
|
+
warnOnce: () => warnOnce,
|
|
46
|
+
weeks: () => weeks
|
|
47
|
+
});
|
|
48
|
+
module.exports = __toCommonJS(src_exports);
|
|
49
|
+
|
|
50
|
+
// src/env/isBrowser.ts
|
|
51
|
+
var isBrowser = () => typeof document !== "undefined";
|
|
52
|
+
|
|
53
|
+
// node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs
|
|
54
|
+
var NUMBER_CHAR_RE = /\d/;
|
|
55
|
+
var STR_SPLITTERS = ["-", "_", "/", "."];
|
|
56
|
+
function isUppercase(char = "") {
|
|
57
|
+
if (NUMBER_CHAR_RE.test(char)) {
|
|
58
|
+
return void 0;
|
|
59
|
+
}
|
|
60
|
+
return char !== char.toLowerCase();
|
|
61
|
+
}
|
|
62
|
+
function splitByCase(str, separators) {
|
|
63
|
+
const splitters = separators ?? STR_SPLITTERS;
|
|
64
|
+
const parts = [];
|
|
65
|
+
if (!str || typeof str !== "string") {
|
|
66
|
+
return parts;
|
|
67
|
+
}
|
|
68
|
+
let buff = "";
|
|
69
|
+
let previousUpper;
|
|
70
|
+
let previousSplitter;
|
|
71
|
+
for (const char of str) {
|
|
72
|
+
const isSplitter = splitters.includes(char);
|
|
73
|
+
if (isSplitter === true) {
|
|
74
|
+
parts.push(buff);
|
|
75
|
+
buff = "";
|
|
76
|
+
previousUpper = void 0;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const isUpper = isUppercase(char);
|
|
80
|
+
if (previousSplitter === false) {
|
|
81
|
+
if (previousUpper === false && isUpper === true) {
|
|
82
|
+
parts.push(buff);
|
|
83
|
+
buff = char;
|
|
84
|
+
previousUpper = isUpper;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (previousUpper === true && isUpper === false && buff.length > 1) {
|
|
88
|
+
const lastChar = buff.at(-1);
|
|
89
|
+
parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
|
|
90
|
+
buff = lastChar + char;
|
|
91
|
+
previousUpper = isUpper;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
buff += char;
|
|
96
|
+
previousUpper = isUpper;
|
|
97
|
+
previousSplitter = isSplitter;
|
|
98
|
+
}
|
|
99
|
+
parts.push(buff);
|
|
100
|
+
return parts;
|
|
101
|
+
}
|
|
102
|
+
function upperFirst(str) {
|
|
103
|
+
return str ? str[0].toUpperCase() + str.slice(1) : "";
|
|
104
|
+
}
|
|
105
|
+
function lowerFirst(str) {
|
|
106
|
+
return str ? str[0].toLowerCase() + str.slice(1) : "";
|
|
107
|
+
}
|
|
108
|
+
function pascalCase(str, opts) {
|
|
109
|
+
return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("") : "";
|
|
110
|
+
}
|
|
111
|
+
function camelCase(str, opts) {
|
|
112
|
+
return lowerFirst(pascalCase(str || "", opts));
|
|
5
113
|
}
|
|
114
|
+
function kebabCase(str, joiner) {
|
|
115
|
+
return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? "-") : "";
|
|
116
|
+
}
|
|
117
|
+
function snakeCase(str) {
|
|
118
|
+
return kebabCase(str || "", "_");
|
|
119
|
+
}
|
|
120
|
+
function flatCase(str) {
|
|
121
|
+
return kebabCase(str || "", "");
|
|
122
|
+
}
|
|
123
|
+
function trainCase(str, opts) {
|
|
124
|
+
return (Array.isArray(str) ? str : splitByCase(str)).filter(Boolean).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("-");
|
|
125
|
+
}
|
|
126
|
+
var titleCaseExceptions = /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;
|
|
127
|
+
function titleCase(str, opts) {
|
|
128
|
+
return (Array.isArray(str) ? str : splitByCase(str)).filter(Boolean).map(
|
|
129
|
+
(p) => titleCaseExceptions.test(p) ? p.toLowerCase() : upperFirst(opts?.normalize ? p.toLowerCase() : p)
|
|
130
|
+
).join(" ");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// src/case.ts
|
|
134
|
+
var capitalize = upperFirst;
|
|
6
135
|
|
|
7
|
-
|
|
8
|
-
|
|
136
|
+
// src/misc/raf.ts
|
|
137
|
+
var root = isBrowser() ? window : globalThis;
|
|
138
|
+
var prev = Date.now();
|
|
139
|
+
function mockRAF(fn) {
|
|
140
|
+
const curr = Date.now();
|
|
141
|
+
const ms = Math.max(0, 16 - (curr - prev));
|
|
142
|
+
const id = setTimeout(fn, ms);
|
|
143
|
+
prev = curr + ms;
|
|
144
|
+
return id;
|
|
9
145
|
}
|
|
146
|
+
function rAF(fn) {
|
|
147
|
+
const raf = root.requestAnimationFrame || mockRAF;
|
|
148
|
+
return raf.call(root, fn);
|
|
149
|
+
}
|
|
150
|
+
function cAF(id) {
|
|
151
|
+
const caf = root.cancelAnimationFrame || root.clearTimeout;
|
|
152
|
+
return caf.call(root, id);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// src/misc/time.ts
|
|
156
|
+
var ONE_SECOND = 1e3;
|
|
157
|
+
var ONE_MINUTE = 60 * ONE_SECOND;
|
|
158
|
+
var ONE_HOUR = 60 * ONE_MINUTE;
|
|
159
|
+
var ONE_DAY = 24 * ONE_HOUR;
|
|
160
|
+
var ONE_WEEK = 7 * ONE_DAY;
|
|
161
|
+
function seconds(count) {
|
|
162
|
+
return count * ONE_SECOND;
|
|
163
|
+
}
|
|
164
|
+
function minutes(count) {
|
|
165
|
+
return count * ONE_MINUTE;
|
|
166
|
+
}
|
|
167
|
+
function hours(count) {
|
|
168
|
+
return count * ONE_HOUR;
|
|
169
|
+
}
|
|
170
|
+
function days(count) {
|
|
171
|
+
return count * ONE_DAY;
|
|
172
|
+
}
|
|
173
|
+
function weeks(count) {
|
|
174
|
+
return count * ONE_WEEK;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// src/misc/waitFor.ts
|
|
178
|
+
function waitFor(ms) {
|
|
179
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/misc/warnOnce.ts
|
|
183
|
+
var warned = /* @__PURE__ */ new Set();
|
|
184
|
+
var warnOnce = (message) => {
|
|
185
|
+
if (warned.has(message)) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
warned.add(message);
|
|
189
|
+
console.warn(message);
|
|
190
|
+
};
|
|
10
191
|
|
|
11
|
-
|
|
12
|
-
|
|
192
|
+
// src/array/unique.ts
|
|
193
|
+
function unique(val) {
|
|
194
|
+
return Array.from(new Set(val));
|
|
13
195
|
}
|
|
14
196
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
197
|
+
// src/array/toArray.ts
|
|
198
|
+
function toArray(val) {
|
|
199
|
+
val = val ?? [];
|
|
200
|
+
return Array.isArray(val) ? val : [val];
|
|
201
|
+
}
|
|
202
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
203
|
+
0 && (module.exports = {
|
|
204
|
+
cAF,
|
|
205
|
+
camelCase,
|
|
206
|
+
capitalize,
|
|
207
|
+
days,
|
|
208
|
+
flatCase,
|
|
209
|
+
hours,
|
|
210
|
+
isBrowser,
|
|
211
|
+
isUppercase,
|
|
212
|
+
kebabCase,
|
|
213
|
+
lowerFirst,
|
|
214
|
+
minutes,
|
|
215
|
+
pascalCase,
|
|
216
|
+
rAF,
|
|
217
|
+
seconds,
|
|
218
|
+
snakeCase,
|
|
219
|
+
splitByCase,
|
|
220
|
+
titleCase,
|
|
221
|
+
toArray,
|
|
222
|
+
trainCase,
|
|
223
|
+
unique,
|
|
224
|
+
upperFirst,
|
|
225
|
+
waitFor,
|
|
226
|
+
warnOnce,
|
|
227
|
+
weeks
|
|
228
|
+
});
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { upperFirst } from 'scule';
|
|
2
|
+
export * from 'scule';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file env.ts
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Checks if the code is running in a browser
|
|
9
|
+
*
|
|
10
|
+
* @returns boolean - true if the code is running in a browser
|
|
11
|
+
*/
|
|
12
|
+
declare const isBrowser: () => boolean;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @file case utils
|
|
16
|
+
* @category Case
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated use upperFirst instead
|
|
21
|
+
*/
|
|
22
|
+
declare const capitalize: typeof upperFirst;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @file raf.ts
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Request animation frame
|
|
29
|
+
*
|
|
30
|
+
* @param fn callback
|
|
31
|
+
* @returns id
|
|
32
|
+
*/
|
|
33
|
+
declare function rAF(fn: FrameRequestCallback): number;
|
|
34
|
+
/**
|
|
35
|
+
* Cancel animation frame
|
|
36
|
+
*
|
|
37
|
+
* @param id id
|
|
38
|
+
* @returns void
|
|
39
|
+
*/
|
|
40
|
+
declare function cAF(id: number): void;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @category Utils - time
|
|
44
|
+
*/
|
|
45
|
+
declare function seconds(count: number): number;
|
|
46
|
+
declare function minutes(count: number): number;
|
|
47
|
+
declare function hours(count: number): number;
|
|
48
|
+
declare function days(count: number): number;
|
|
49
|
+
declare function weeks(count: number): number;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Wait for a number of milliseconds
|
|
53
|
+
*
|
|
54
|
+
* @param ms millseconds to wait
|
|
55
|
+
* @returns a promise that resolves after ms milliseconds
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```
|
|
59
|
+
* import { waitFor } from '@ntnyq/utils'
|
|
60
|
+
* await waitFor(3e3)
|
|
61
|
+
* // do somthing after 3 seconds
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
declare function waitFor(ms: number): Promise<unknown>;
|
|
65
|
+
|
|
66
|
+
declare const warnOnce: (message: string) => void;
|
|
67
|
+
|
|
68
|
+
declare function unique<T>(val: T[]): T[];
|
|
69
|
+
|
|
70
|
+
type Nullable<T> = T | null;
|
|
71
|
+
type MayBe<T> = T | undefined;
|
|
72
|
+
type AnyFn<T = any, R = any> = (...args: T[]) => R;
|
|
73
|
+
type Arrayable<T> = T | T[];
|
|
74
|
+
type Awaitable<T> = T | Promise<T>;
|
|
75
|
+
type Prettify<T> = Omit<T, never>;
|
|
76
|
+
|
|
77
|
+
declare function toArray<T>(val?: Nullable<Arrayable<T>>): Arrayable<T>;
|
|
78
|
+
|
|
79
|
+
export { type AnyFn, type Arrayable, type Awaitable, type MayBe, type Nullable, type Prettify, cAF, capitalize, days, hours, isBrowser, minutes, rAF, seconds, toArray, unique, waitFor, warnOnce, weeks };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,43 +1,79 @@
|
|
|
1
|
+
import { upperFirst } from 'scule';
|
|
2
|
+
export * from 'scule';
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
5
|
+
* @file env.ts
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Checks if the code is running in a browser
|
|
6
9
|
*
|
|
7
|
-
* @
|
|
8
|
-
* ```
|
|
9
|
-
* import { kekabCase } from '@ntnyq/utils'
|
|
10
|
-
* kekabCase('FooBarBaz') // foo-bar-baz
|
|
11
|
-
* ```
|
|
10
|
+
* @returns boolean - true if the code is running in a browser
|
|
12
11
|
*/
|
|
13
|
-
declare
|
|
12
|
+
declare const isBrowser: () => boolean;
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
|
-
*
|
|
15
|
+
* @file case utils
|
|
16
|
+
* @category Case
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated use upperFirst instead
|
|
21
|
+
*/
|
|
22
|
+
declare const capitalize: typeof upperFirst;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @file raf.ts
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Request animation frame
|
|
17
29
|
*
|
|
18
|
-
* @param
|
|
19
|
-
* @returns
|
|
30
|
+
* @param fn callback
|
|
31
|
+
* @returns id
|
|
32
|
+
*/
|
|
33
|
+
declare function rAF(fn: FrameRequestCallback): number;
|
|
34
|
+
/**
|
|
35
|
+
* Cancel animation frame
|
|
20
36
|
*
|
|
21
|
-
* @
|
|
22
|
-
*
|
|
23
|
-
* import { camelCase } from '@ntnyq/utils'
|
|
24
|
-
* camelCase('foo-bar-baz') // fooBarBaz
|
|
25
|
-
* ```
|
|
37
|
+
* @param id id
|
|
38
|
+
* @returns void
|
|
26
39
|
*/
|
|
27
|
-
declare function
|
|
40
|
+
declare function cAF(id: number): void;
|
|
28
41
|
|
|
29
42
|
/**
|
|
30
|
-
*
|
|
43
|
+
* @category Utils - time
|
|
44
|
+
*/
|
|
45
|
+
declare function seconds(count: number): number;
|
|
46
|
+
declare function minutes(count: number): number;
|
|
47
|
+
declare function hours(count: number): number;
|
|
48
|
+
declare function days(count: number): number;
|
|
49
|
+
declare function weeks(count: number): number;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Wait for a number of milliseconds
|
|
31
53
|
*
|
|
32
|
-
* @param
|
|
33
|
-
* @returns
|
|
54
|
+
* @param ms millseconds to wait
|
|
55
|
+
* @returns a promise that resolves after ms milliseconds
|
|
34
56
|
*
|
|
35
57
|
* @example
|
|
36
58
|
* ```
|
|
37
|
-
* import {
|
|
38
|
-
*
|
|
59
|
+
* import { waitFor } from '@ntnyq/utils'
|
|
60
|
+
* await waitFor(3e3)
|
|
61
|
+
* // do somthing after 3 seconds
|
|
39
62
|
* ```
|
|
40
63
|
*/
|
|
41
|
-
declare function
|
|
64
|
+
declare function waitFor(ms: number): Promise<unknown>;
|
|
65
|
+
|
|
66
|
+
declare const warnOnce: (message: string) => void;
|
|
67
|
+
|
|
68
|
+
declare function unique<T>(val: T[]): T[];
|
|
69
|
+
|
|
70
|
+
type Nullable<T> = T | null;
|
|
71
|
+
type MayBe<T> = T | undefined;
|
|
72
|
+
type AnyFn<T = any, R = any> = (...args: T[]) => R;
|
|
73
|
+
type Arrayable<T> = T | T[];
|
|
74
|
+
type Awaitable<T> = T | Promise<T>;
|
|
75
|
+
type Prettify<T> = Omit<T, never>;
|
|
76
|
+
|
|
77
|
+
declare function toArray<T>(val?: Nullable<Arrayable<T>>): Arrayable<T>;
|
|
42
78
|
|
|
43
|
-
export {
|
|
79
|
+
export { type AnyFn, type Arrayable, type Awaitable, type MayBe, type Nullable, type Prettify, cAF, capitalize, days, hours, isBrowser, minutes, rAF, seconds, toArray, unique, waitFor, warnOnce, weeks };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// src/env/isBrowser.ts
|
|
2
|
+
var isBrowser = () => typeof document !== "undefined";
|
|
3
|
+
|
|
4
|
+
// node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs
|
|
5
|
+
var NUMBER_CHAR_RE = /\d/;
|
|
6
|
+
var STR_SPLITTERS = ["-", "_", "/", "."];
|
|
7
|
+
function isUppercase(char = "") {
|
|
8
|
+
if (NUMBER_CHAR_RE.test(char)) {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
return char !== char.toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
function splitByCase(str, separators) {
|
|
14
|
+
const splitters = separators ?? STR_SPLITTERS;
|
|
15
|
+
const parts = [];
|
|
16
|
+
if (!str || typeof str !== "string") {
|
|
17
|
+
return parts;
|
|
18
|
+
}
|
|
19
|
+
let buff = "";
|
|
20
|
+
let previousUpper;
|
|
21
|
+
let previousSplitter;
|
|
22
|
+
for (const char of str) {
|
|
23
|
+
const isSplitter = splitters.includes(char);
|
|
24
|
+
if (isSplitter === true) {
|
|
25
|
+
parts.push(buff);
|
|
26
|
+
buff = "";
|
|
27
|
+
previousUpper = void 0;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const isUpper = isUppercase(char);
|
|
31
|
+
if (previousSplitter === false) {
|
|
32
|
+
if (previousUpper === false && isUpper === true) {
|
|
33
|
+
parts.push(buff);
|
|
34
|
+
buff = char;
|
|
35
|
+
previousUpper = isUpper;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (previousUpper === true && isUpper === false && buff.length > 1) {
|
|
39
|
+
const lastChar = buff.at(-1);
|
|
40
|
+
parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
|
|
41
|
+
buff = lastChar + char;
|
|
42
|
+
previousUpper = isUpper;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
buff += char;
|
|
47
|
+
previousUpper = isUpper;
|
|
48
|
+
previousSplitter = isSplitter;
|
|
49
|
+
}
|
|
50
|
+
parts.push(buff);
|
|
51
|
+
return parts;
|
|
52
|
+
}
|
|
53
|
+
function upperFirst(str) {
|
|
54
|
+
return str ? str[0].toUpperCase() + str.slice(1) : "";
|
|
55
|
+
}
|
|
56
|
+
function lowerFirst(str) {
|
|
57
|
+
return str ? str[0].toLowerCase() + str.slice(1) : "";
|
|
58
|
+
}
|
|
59
|
+
function pascalCase(str, opts) {
|
|
60
|
+
return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("") : "";
|
|
61
|
+
}
|
|
62
|
+
function camelCase(str, opts) {
|
|
63
|
+
return lowerFirst(pascalCase(str || "", opts));
|
|
64
|
+
}
|
|
65
|
+
function kebabCase(str, joiner) {
|
|
66
|
+
return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? "-") : "";
|
|
67
|
+
}
|
|
68
|
+
function snakeCase(str) {
|
|
69
|
+
return kebabCase(str || "", "_");
|
|
70
|
+
}
|
|
71
|
+
function flatCase(str) {
|
|
72
|
+
return kebabCase(str || "", "");
|
|
73
|
+
}
|
|
74
|
+
function trainCase(str, opts) {
|
|
75
|
+
return (Array.isArray(str) ? str : splitByCase(str)).filter(Boolean).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("-");
|
|
76
|
+
}
|
|
77
|
+
var titleCaseExceptions = /^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;
|
|
78
|
+
function titleCase(str, opts) {
|
|
79
|
+
return (Array.isArray(str) ? str : splitByCase(str)).filter(Boolean).map(
|
|
80
|
+
(p) => titleCaseExceptions.test(p) ? p.toLowerCase() : upperFirst(opts?.normalize ? p.toLowerCase() : p)
|
|
81
|
+
).join(" ");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/case.ts
|
|
85
|
+
var capitalize = upperFirst;
|
|
86
|
+
|
|
87
|
+
// src/misc/raf.ts
|
|
88
|
+
var root = isBrowser() ? window : globalThis;
|
|
89
|
+
var prev = Date.now();
|
|
90
|
+
function mockRAF(fn) {
|
|
91
|
+
const curr = Date.now();
|
|
92
|
+
const ms = Math.max(0, 16 - (curr - prev));
|
|
93
|
+
const id = setTimeout(fn, ms);
|
|
94
|
+
prev = curr + ms;
|
|
95
|
+
return id;
|
|
96
|
+
}
|
|
97
|
+
function rAF(fn) {
|
|
98
|
+
const raf = root.requestAnimationFrame || mockRAF;
|
|
99
|
+
return raf.call(root, fn);
|
|
100
|
+
}
|
|
101
|
+
function cAF(id) {
|
|
102
|
+
const caf = root.cancelAnimationFrame || root.clearTimeout;
|
|
103
|
+
return caf.call(root, id);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// src/misc/time.ts
|
|
107
|
+
var ONE_SECOND = 1e3;
|
|
108
|
+
var ONE_MINUTE = 60 * ONE_SECOND;
|
|
109
|
+
var ONE_HOUR = 60 * ONE_MINUTE;
|
|
110
|
+
var ONE_DAY = 24 * ONE_HOUR;
|
|
111
|
+
var ONE_WEEK = 7 * ONE_DAY;
|
|
112
|
+
function seconds(count) {
|
|
113
|
+
return count * ONE_SECOND;
|
|
114
|
+
}
|
|
115
|
+
function minutes(count) {
|
|
116
|
+
return count * ONE_MINUTE;
|
|
117
|
+
}
|
|
118
|
+
function hours(count) {
|
|
119
|
+
return count * ONE_HOUR;
|
|
120
|
+
}
|
|
121
|
+
function days(count) {
|
|
122
|
+
return count * ONE_DAY;
|
|
123
|
+
}
|
|
124
|
+
function weeks(count) {
|
|
125
|
+
return count * ONE_WEEK;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/misc/waitFor.ts
|
|
129
|
+
function waitFor(ms) {
|
|
130
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// src/misc/warnOnce.ts
|
|
134
|
+
var warned = /* @__PURE__ */ new Set();
|
|
135
|
+
var warnOnce = (message) => {
|
|
136
|
+
if (warned.has(message)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
warned.add(message);
|
|
140
|
+
console.warn(message);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// src/array/unique.ts
|
|
144
|
+
function unique(val) {
|
|
145
|
+
return Array.from(new Set(val));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/array/toArray.ts
|
|
149
|
+
function toArray(val) {
|
|
150
|
+
val = val ?? [];
|
|
151
|
+
return Array.isArray(val) ? val : [val];
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
cAF,
|
|
155
|
+
camelCase,
|
|
156
|
+
capitalize,
|
|
157
|
+
days,
|
|
158
|
+
flatCase,
|
|
159
|
+
hours,
|
|
160
|
+
isBrowser,
|
|
161
|
+
isUppercase,
|
|
162
|
+
kebabCase,
|
|
163
|
+
lowerFirst,
|
|
164
|
+
minutes,
|
|
165
|
+
pascalCase,
|
|
166
|
+
rAF,
|
|
167
|
+
seconds,
|
|
168
|
+
snakeCase,
|
|
169
|
+
splitByCase,
|
|
170
|
+
titleCase,
|
|
171
|
+
toArray,
|
|
172
|
+
trainCase,
|
|
173
|
+
unique,
|
|
174
|
+
upperFirst,
|
|
175
|
+
waitFor,
|
|
176
|
+
warnOnce,
|
|
177
|
+
weeks
|
|
178
|
+
};
|
package/package.json
CHANGED
|
@@ -1,50 +1,75 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ntnyq/utils",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Common used utils.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"utils"
|
|
8
|
+
],
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"author": {
|
|
11
11
|
"name": "ntnyq",
|
|
12
12
|
"email": "ntnyq13@gmail.com"
|
|
13
13
|
},
|
|
14
|
-
"homepage": "https://github.com/ntnyq/
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"url": "ntnyq/ntnyq-utils",
|
|
18
|
-
"directory": "packages/utils"
|
|
14
|
+
"homepage": "https://github.com/ntnyq/utils#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/ntnyq/utils/issues"
|
|
19
17
|
},
|
|
18
|
+
"repository": "ntnyq/utils",
|
|
20
19
|
"exports": {
|
|
20
|
+
"./package.json": "./package.json",
|
|
21
21
|
".": {
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"types": "./dist/index.d.ts",
|
|
31
|
-
"typesVersions": {
|
|
32
|
-
"*": {
|
|
33
|
-
"*": [
|
|
34
|
-
"./dist/*",
|
|
35
|
-
"./dist/index.d.ts"
|
|
36
|
-
]
|
|
22
|
+
"import": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"require": {
|
|
27
|
+
"types": "./dist/index.d.cts",
|
|
28
|
+
"default": "./dist/index.cjs"
|
|
29
|
+
}
|
|
37
30
|
}
|
|
38
31
|
},
|
|
32
|
+
"main": "./dist/index.js",
|
|
33
|
+
"module": "./dist/index.js",
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
39
35
|
"files": [
|
|
40
36
|
"dist"
|
|
41
37
|
],
|
|
42
38
|
"sideEffects": false,
|
|
43
|
-
"
|
|
44
|
-
"
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"scule": "^1.3.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@ntnyq/eslint-config": "^3.0.0-beta.13",
|
|
44
|
+
"@ntnyq/prettier-config": "^1.21.3",
|
|
45
|
+
"@vitest/coverage-v8": "^2.1.1",
|
|
46
|
+
"bumpp": "^9.5.2",
|
|
47
|
+
"eslint": "^9.10.0",
|
|
48
|
+
"husky": "^9.1.6",
|
|
49
|
+
"nano-staged": "^0.8.0",
|
|
50
|
+
"npm-run-all2": "^6.2.3",
|
|
51
|
+
"pnpm": "^9.10.0",
|
|
52
|
+
"prettier": "^3.3.3",
|
|
53
|
+
"tsup": "^8.3.0",
|
|
54
|
+
"typescript": "^5.6.2",
|
|
55
|
+
"vitest": "^2.1.1"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18.18.0"
|
|
59
|
+
},
|
|
60
|
+
"prettier": "@ntnyq/prettier-config",
|
|
61
|
+
"nano-staged": {
|
|
62
|
+
"*.{js,ts,mjs,cjs,json,md,yml,yaml}": "eslint --fix"
|
|
45
63
|
},
|
|
46
64
|
"scripts": {
|
|
47
|
-
"build": "
|
|
48
|
-
"
|
|
65
|
+
"build": "tsup",
|
|
66
|
+
"coverage": "vitest --coverage",
|
|
67
|
+
"dev": "tsup --watch src",
|
|
68
|
+
"lint": "eslint .",
|
|
69
|
+
"release": "run-s release:check release:publish",
|
|
70
|
+
"release:check": "run-s lint typecheck test",
|
|
71
|
+
"release:publish": "bumpp && pnpm publish",
|
|
72
|
+
"test": "vitest",
|
|
73
|
+
"typecheck": "tsc --noEmit"
|
|
49
74
|
}
|
|
50
75
|
}
|
package/dist/index.mjs
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
function kekabCase(input) {
|
|
2
|
-
return input.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
function camelCase(input) {
|
|
6
|
-
return input.replace(/[._-](\w)/g, (_, c) => c ? c.toUpperCase() : "");
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function capitalize(input) {
|
|
10
|
-
return `${input.charAt(0).toUpperCase()}${input.slice(1)}`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export { camelCase, capitalize, kekabCase };
|