@ntnyq/utils 0.0.3 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022-PRESENT ntnyq <https://github.com/ntnyq>
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,21 +1,27 @@
1
1
  # @ntnyq/utils
2
2
 
3
+ [![CI](https://github.com/ntnyq/utils/workflows/CI/badge.svg)](https://github.com/ntnyq/utils/actions)
3
4
  [![NPM VERSION](https://img.shields.io/npm/v/@ntnyq/utils.svg)](https://www.npmjs.com/package/@ntnyq/utils)
5
+ [![NPM DOWNLOADS](https://img.shields.io/npm/dy/@ntnyq/utils.svg)](https://www.npmjs.com/package/@ntnyq/utils)
6
+ [![CODECOV](https://codecov.io/github/ntnyq/utils/branch/main/graph/badge.svg)](https://codecov.io/github/ntnyq/utils)
7
+ [![LICENSE](https://img.shields.io/github/license/ntnyq/utils.svg)](https://github.com/ntnyq/utils/blob/main/LICENSE)
8
+
9
+ > Common used utils.
4
10
 
5
11
  ## Install
6
12
 
7
13
  ```bash
8
- pnpm add @ntnyq/utils -D
14
+ npm install @ntnyq/utils
9
15
  ```
10
16
 
11
- ## Utils
12
-
13
- - [camelCase](./src/camelCase.ts)
14
- - [capitalize](./src/capitalize.ts)
15
- - [kekabCase](./src/kekabCase.ts)
17
+ ```bash
18
+ yarn add @ntnyq/utils
19
+ ```
16
20
 
17
- - [waitFor](./src/waitFor.ts)
21
+ ```bash
22
+ pnpm add @ntnyq/utils
23
+ ```
18
24
 
19
25
  ## License
20
26
 
21
- [MIT](./LICENSE) License © 2022-PRESENT [ntnyq](https://github.com/ntnyq)
27
+ [MIT](./LICENSE) License © 2024-PRESENT [ntnyq](https://github.com/ntnyq)
package/dist/index.cjs CHANGED
@@ -1,30 +1,141 @@
1
- 'use strict';
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
- function kekabCase(input) {
4
- return input.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
5
- }
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);
6
49
 
7
- function camelCase(input) {
8
- return input.replace(/[._-](\w)/g, (_, c) => c ? c.toUpperCase() : "");
9
- }
50
+ // src/env/isBrowser.ts
51
+ var isBrowser = () => typeof document !== "undefined";
10
52
 
11
- function capitalize(input) {
12
- return `${input.charAt(0).toUpperCase()}${input.slice(1)}`;
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();
13
61
  }
14
-
15
- function waitFor(ms) {
16
- return new Promise((resolve) => setTimeout(resolve, ms));
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;
17
101
  }
18
-
19
- function toArray(val) {
20
- val = val ?? [];
21
- return Array.isArray(val) ? val : [val];
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));
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(" ");
22
131
  }
23
132
 
24
- const isBrowser = () => typeof document !== "undefined";
133
+ // src/case.ts
134
+ var capitalize = upperFirst;
25
135
 
26
- const root = isBrowser() ? window : global;
27
- let prev = Date.now();
136
+ // src/misc/raf.ts
137
+ var root = isBrowser() ? window : globalThis;
138
+ var prev = Date.now();
28
139
  function mockRAF(fn) {
29
140
  const curr = Date.now();
30
141
  const ms = Math.max(0, 16 - (curr - prev));
@@ -41,11 +152,77 @@ function cAF(id) {
41
152
  return caf.call(root, id);
42
153
  }
43
154
 
44
- exports.cAF = cAF;
45
- exports.camelCase = camelCase;
46
- exports.capitalize = capitalize;
47
- exports.isBrowser = isBrowser;
48
- exports.kekabCase = kekabCase;
49
- exports.rAF = rAF;
50
- exports.toArray = toArray;
51
- exports.waitFor = waitFor;
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
+ };
191
+
192
+ // src/array/unique.ts
193
+ function unique(val) {
194
+ return Array.from(new Set(val));
195
+ }
196
+
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 CHANGED
@@ -1,73 +1,25 @@
1
- import { Nullable, Arrayable } from '@ntnyq/types';
1
+ import { upperFirst } from 'scule';
2
+ export * from 'scule';
2
3
 
3
4
  /**
4
- * transform given string to kekabCase
5
- *
6
- * @param input given string
7
- * @returns string in kekabCase
8
- *
9
- * @example
10
- * ```
11
- * import { kekabCase } from '@ntnyq/utils'
12
- * kekabCase('FooBarBaz') // foo-bar-baz
13
- * ```
14
- */
15
- declare function kekabCase(input: string): string;
16
-
17
- /**
18
- * transform given string to camelCase
19
- *
20
- * @param input given string
21
- * @returns string in camelCase
22
- *
23
- * @example
24
- * ```
25
- * import { camelCase } from '@ntnyq/utils'
26
- * camelCase('foo-bar-baz') // fooBarBaz
27
- * ```
5
+ * @file env.ts
28
6
  */
29
- declare function camelCase(input: string): string;
30
-
31
7
  /**
32
- * capitalize the given string's first letter
33
- *
34
- * @param input given string
35
- * @returns string first letter capitalize
8
+ * Checks if the code is running in a browser
36
9
  *
37
- * @example
38
- * ```
39
- * import { capitalize } from '@ntnyq/utils'
40
- * capitalize('fooBarBaz') // FooBarBaz
41
- * ```
10
+ * @returns boolean - true if the code is running in a browser
42
11
  */
43
- declare function capitalize(input: string): string;
12
+ declare const isBrowser: () => boolean;
44
13
 
45
14
  /**
46
- * Wait for a number of milliseconds
47
- *
48
- * @param ms millseconds to wait
49
- * @returns a promise that resolves after ms milliseconds
50
- *
51
- * @example
52
- * ```
53
- * import { waitFor } from '@ntnyq/utils'
54
- * await waitFor(3e3)
55
- * // do somthing after 3 seconds
56
- * ```
15
+ * @file case utils
16
+ * @category Case
57
17
  */
58
- declare function waitFor(ms: number): Promise<unknown>;
59
-
60
- declare function toArray<T>(val?: Nullable<Arrayable<T>>): Arrayable<T>;
61
18
 
62
19
  /**
63
- * @file env.ts
64
- */
65
- /**
66
- * Checks if the code is running in a browser
67
- *
68
- * @returns boolean - true if the code is running in a browser
20
+ * @deprecated use upperFirst instead
69
21
  */
70
- declare const isBrowser: () => boolean;
22
+ declare const capitalize: typeof upperFirst;
71
23
 
72
24
  /**
73
25
  * @file raf.ts
@@ -87,4 +39,41 @@ declare function rAF(fn: FrameRequestCallback): number;
87
39
  */
88
40
  declare function cAF(id: number): void;
89
41
 
90
- export { cAF, camelCase, capitalize, isBrowser, kekabCase, rAF, toArray, waitFor };
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,73 +1,25 @@
1
- import { Nullable, Arrayable } from '@ntnyq/types';
1
+ import { upperFirst } from 'scule';
2
+ export * from 'scule';
2
3
 
3
4
  /**
4
- * transform given string to kekabCase
5
- *
6
- * @param input given string
7
- * @returns string in kekabCase
8
- *
9
- * @example
10
- * ```
11
- * import { kekabCase } from '@ntnyq/utils'
12
- * kekabCase('FooBarBaz') // foo-bar-baz
13
- * ```
14
- */
15
- declare function kekabCase(input: string): string;
16
-
17
- /**
18
- * transform given string to camelCase
19
- *
20
- * @param input given string
21
- * @returns string in camelCase
22
- *
23
- * @example
24
- * ```
25
- * import { camelCase } from '@ntnyq/utils'
26
- * camelCase('foo-bar-baz') // fooBarBaz
27
- * ```
5
+ * @file env.ts
28
6
  */
29
- declare function camelCase(input: string): string;
30
-
31
7
  /**
32
- * capitalize the given string's first letter
33
- *
34
- * @param input given string
35
- * @returns string first letter capitalize
8
+ * Checks if the code is running in a browser
36
9
  *
37
- * @example
38
- * ```
39
- * import { capitalize } from '@ntnyq/utils'
40
- * capitalize('fooBarBaz') // FooBarBaz
41
- * ```
10
+ * @returns boolean - true if the code is running in a browser
42
11
  */
43
- declare function capitalize(input: string): string;
12
+ declare const isBrowser: () => boolean;
44
13
 
45
14
  /**
46
- * Wait for a number of milliseconds
47
- *
48
- * @param ms millseconds to wait
49
- * @returns a promise that resolves after ms milliseconds
50
- *
51
- * @example
52
- * ```
53
- * import { waitFor } from '@ntnyq/utils'
54
- * await waitFor(3e3)
55
- * // do somthing after 3 seconds
56
- * ```
15
+ * @file case utils
16
+ * @category Case
57
17
  */
58
- declare function waitFor(ms: number): Promise<unknown>;
59
-
60
- declare function toArray<T>(val?: Nullable<Arrayable<T>>): Arrayable<T>;
61
18
 
62
19
  /**
63
- * @file env.ts
64
- */
65
- /**
66
- * Checks if the code is running in a browser
67
- *
68
- * @returns boolean - true if the code is running in a browser
20
+ * @deprecated use upperFirst instead
69
21
  */
70
- declare const isBrowser: () => boolean;
22
+ declare const capitalize: typeof upperFirst;
71
23
 
72
24
  /**
73
25
  * @file raf.ts
@@ -87,4 +39,41 @@ declare function rAF(fn: FrameRequestCallback): number;
87
39
  */
88
40
  declare function cAF(id: number): void;
89
41
 
90
- export { cAF, camelCase, capitalize, isBrowser, kekabCase, rAF, toArray, waitFor };
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.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,28 +1,27 @@
1
1
  {
2
2
  "name": "@ntnyq/utils",
3
- "version": "0.0.3",
4
- "publishConfig": {
5
- "access": "public"
6
- },
7
- "description": "",
8
- "keywords": [],
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/ntnyq-utils#readme",
15
- "repository": {
16
- "type": "git",
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": {
21
20
  "./package.json": "./package.json",
22
21
  ".": {
23
22
  "import": {
24
- "types": "./dist/index.d.mts",
25
- "default": "./dist/index.mjs"
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
26
25
  },
27
26
  "require": {
28
27
  "types": "./dist/index.d.cts",
@@ -30,29 +29,47 @@
30
29
  }
31
30
  }
32
31
  },
33
- "main": "./dist/index.cjs",
34
- "module": "./dist/index.mjs",
32
+ "main": "./dist/index.js",
33
+ "module": "./dist/index.js",
35
34
  "types": "./dist/index.d.ts",
36
- "typesVersions": {
37
- "*": {
38
- "*": [
39
- "./dist/*",
40
- "./dist/index.d.ts"
41
- ]
42
- }
43
- },
44
35
  "files": [
45
36
  "dist"
46
37
  ],
47
38
  "sideEffects": false,
48
- "bugs": {
49
- "url": "https://github.com/ntnyq/ntnyq-utils/issues"
50
- },
51
39
  "dependencies": {
52
- "@ntnyq/types": "0.0.2"
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"
53
63
  },
54
64
  "scripts": {
55
- "build": "unbuild",
56
- "dev": "unbuild --stub"
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"
57
74
  }
58
75
  }
package/dist/index.d.mts DELETED
@@ -1,90 +0,0 @@
1
- import { Nullable, Arrayable } from '@ntnyq/types';
2
-
3
- /**
4
- * transform given string to kekabCase
5
- *
6
- * @param input given string
7
- * @returns string in kekabCase
8
- *
9
- * @example
10
- * ```
11
- * import { kekabCase } from '@ntnyq/utils'
12
- * kekabCase('FooBarBaz') // foo-bar-baz
13
- * ```
14
- */
15
- declare function kekabCase(input: string): string;
16
-
17
- /**
18
- * transform given string to camelCase
19
- *
20
- * @param input given string
21
- * @returns string in camelCase
22
- *
23
- * @example
24
- * ```
25
- * import { camelCase } from '@ntnyq/utils'
26
- * camelCase('foo-bar-baz') // fooBarBaz
27
- * ```
28
- */
29
- declare function camelCase(input: string): string;
30
-
31
- /**
32
- * capitalize the given string's first letter
33
- *
34
- * @param input given string
35
- * @returns string first letter capitalize
36
- *
37
- * @example
38
- * ```
39
- * import { capitalize } from '@ntnyq/utils'
40
- * capitalize('fooBarBaz') // FooBarBaz
41
- * ```
42
- */
43
- declare function capitalize(input: string): string;
44
-
45
- /**
46
- * Wait for a number of milliseconds
47
- *
48
- * @param ms millseconds to wait
49
- * @returns a promise that resolves after ms milliseconds
50
- *
51
- * @example
52
- * ```
53
- * import { waitFor } from '@ntnyq/utils'
54
- * await waitFor(3e3)
55
- * // do somthing after 3 seconds
56
- * ```
57
- */
58
- declare function waitFor(ms: number): Promise<unknown>;
59
-
60
- declare function toArray<T>(val?: Nullable<Arrayable<T>>): Arrayable<T>;
61
-
62
- /**
63
- * @file env.ts
64
- */
65
- /**
66
- * Checks if the code is running in a browser
67
- *
68
- * @returns boolean - true if the code is running in a browser
69
- */
70
- declare const isBrowser: () => boolean;
71
-
72
- /**
73
- * @file raf.ts
74
- */
75
- /**
76
- * Request animation frame
77
- *
78
- * @param fn callback
79
- * @returns id
80
- */
81
- declare function rAF(fn: FrameRequestCallback): number;
82
- /**
83
- * Cancel animation frame
84
- *
85
- * @param id id
86
- * @returns void
87
- */
88
- declare function cAF(id: number): void;
89
-
90
- export { cAF, camelCase, capitalize, isBrowser, kekabCase, rAF, toArray, waitFor };
package/dist/index.mjs DELETED
@@ -1,42 +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
- function waitFor(ms) {
14
- return new Promise((resolve) => setTimeout(resolve, ms));
15
- }
16
-
17
- function toArray(val) {
18
- val = val ?? [];
19
- return Array.isArray(val) ? val : [val];
20
- }
21
-
22
- const isBrowser = () => typeof document !== "undefined";
23
-
24
- const root = isBrowser() ? window : global;
25
- let prev = Date.now();
26
- function mockRAF(fn) {
27
- const curr = Date.now();
28
- const ms = Math.max(0, 16 - (curr - prev));
29
- const id = setTimeout(fn, ms);
30
- prev = curr + ms;
31
- return id;
32
- }
33
- function rAF(fn) {
34
- const raf = root.requestAnimationFrame || mockRAF;
35
- return raf.call(root, fn);
36
- }
37
- function cAF(id) {
38
- const caf = root.cancelAnimationFrame || root.clearTimeout;
39
- return caf.call(root, id);
40
- }
41
-
42
- export { cAF, camelCase, capitalize, isBrowser, kekabCase, rAF, toArray, waitFor };