@aimidy/util 1.1.0 → 1.2.1
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/README.md +262 -17
- package/dist/help/index.d.mts +12 -20
- package/dist/help/index.d.ts +12 -20
- package/dist/help/index.js +56 -1
- package/dist/help/index.js.map +1 -1
- package/dist/help/index.mjs +54 -1
- package/dist/help/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +72 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +69 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -6
package/README.md
CHANGED
|
@@ -1,33 +1,278 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @aimidy/util ⚡
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一個實用的 TypeScript 工具函數庫,提供常用的資料處理、物件操作、字串轉換等功能。✨
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 📦 安裝
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
```bash
|
|
8
|
+
npm install @aimidy/util
|
|
9
|
+
```
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
## 🚀 使用方式
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
```typescript
|
|
14
|
+
import { data_get, deepAssign, strToHump } from '@aimidy/util';
|
|
15
|
+
```
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
## 📚 API 文件
|
|
14
18
|
|
|
15
|
-
###
|
|
19
|
+
### 🗄️ 資料存取
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
#### `data_get<T>(data, key, defaultValue?)`
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
從巢狀物件或陣列中安全地獲取資料。
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
**參數:**
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
- `data`: 資料集 (物件、陣列或 null/undefined)
|
|
28
|
+
- `key`: 資料路徑,使用點號分隔 (例如:`'app.column.name'`)
|
|
29
|
+
- `defaultValue`: 取不到值時的預設值 (預設為 `null`)
|
|
24
30
|
|
|
25
|
-
|
|
31
|
+
**範例:**
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
```typescript
|
|
34
|
+
const data = { a: [{ b: 'value1' }, { b: 'value2' }] };
|
|
35
|
+
data_get(data, 'a.b'); // ['value1', 'value2']
|
|
36
|
+
```
|
|
28
37
|
|
|
29
|
-
|
|
38
|
+
#### `data_set(data, key, value)`
|
|
30
39
|
|
|
31
|
-
|
|
40
|
+
動態設定多層物件的參數。
|
|
32
41
|
|
|
33
|
-
|
|
42
|
+
**參數:**
|
|
43
|
+
|
|
44
|
+
- `data`: 被設定的物件
|
|
45
|
+
- `key`: 位置 (使用點號分隔)
|
|
46
|
+
- `value`: 要設定的值
|
|
47
|
+
|
|
48
|
+
**範例:**
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const obj = {};
|
|
52
|
+
data_set(obj, 'user.profile.name', 'John');
|
|
53
|
+
// { user: { profile: { name: 'John' } } }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 🔧 物件操作
|
|
57
|
+
|
|
58
|
+
#### `deepAssign(...objects)`
|
|
59
|
+
|
|
60
|
+
深度合併多個物件。
|
|
61
|
+
|
|
62
|
+
**範例:**
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
const obj1 = { a: { b: 1 } };
|
|
66
|
+
const obj2 = { a: { c: 2 } };
|
|
67
|
+
deepAssign(obj1, obj2); // { a: { b: 1, c: 2 } }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### `recursiveDeepCopy<T>(obj)`
|
|
71
|
+
|
|
72
|
+
透過遞迴深度複製物件或陣列。
|
|
73
|
+
|
|
74
|
+
**範例:**
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
const original = { a: [1, 2], b: { c: 3 } };
|
|
78
|
+
const copy = recursiveDeepCopy(original);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### `deepCloneWithJson<T>(obj)`
|
|
82
|
+
|
|
83
|
+
透過 JSON 序列化/反序列化複製物件(速度較快但有限制)。
|
|
84
|
+
|
|
85
|
+
**範例:**
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
const clone = deepCloneWithJson({ a: 1, b: { c: 2 } });
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
#### `parameterMerge(value1?, value2?)`
|
|
92
|
+
|
|
93
|
+
合併兩個參數(物件或陣列)。
|
|
94
|
+
|
|
95
|
+
**範例:**
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
parameterMerge([1, 2], [3, 4]); // [1, 2, 3, 4]
|
|
99
|
+
parameterMerge({ a: 1 }, { b: 2 }); // { a: 1, b: 2 }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 🔤 字串轉換
|
|
103
|
+
|
|
104
|
+
#### `convertCase(input, to)`
|
|
105
|
+
|
|
106
|
+
將字串在不同命名風格間轉換。
|
|
107
|
+
|
|
108
|
+
**參數:**
|
|
109
|
+
|
|
110
|
+
- `input`: 輸入字串
|
|
111
|
+
- `to`: 目標格式 (`'pascal'` | `'camel'` | `'snake'` | `'kebab'`)
|
|
112
|
+
|
|
113
|
+
**範例:**
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
convertCase('user_name', 'camel'); // 'userName'
|
|
117
|
+
convertCase('UserName', 'snake'); // 'user_name'
|
|
118
|
+
convertCase('user-name', 'pascal'); // 'UserName'
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### `strToHump(str)`
|
|
122
|
+
|
|
123
|
+
底線轉駝峰命名。
|
|
124
|
+
|
|
125
|
+
**範例:**
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
strToHump('user_name'); // 'userName'
|
|
129
|
+
strToHump('_user_name'); // 'userName'
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### `strToConvert(str, convert?)`
|
|
133
|
+
|
|
134
|
+
駝峰轉小寫+分隔符(預設為底線)。
|
|
135
|
+
|
|
136
|
+
**參數:**
|
|
137
|
+
|
|
138
|
+
- `str`: 輸入字串
|
|
139
|
+
- `convert`: 分隔符號 (預設為 `'_'`)
|
|
140
|
+
|
|
141
|
+
**範例:**
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
strToConvert('userName'); // 'user_name'
|
|
145
|
+
strToConvert('userName', '-'); // 'user-name'
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 📋 陣列操作
|
|
149
|
+
|
|
150
|
+
#### `head<T>(arr)`
|
|
151
|
+
|
|
152
|
+
回傳陣列的第一個值或 null。
|
|
153
|
+
|
|
154
|
+
**範例:**
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
head([1, 2, 3]); // 1
|
|
158
|
+
head([]); // null
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
#### `remove(arr, item)`
|
|
162
|
+
|
|
163
|
+
移除陣列中指定的值。
|
|
164
|
+
|
|
165
|
+
**參數:**
|
|
166
|
+
|
|
167
|
+
- `arr`: 字串或數字陣列
|
|
168
|
+
- `item`: 要移除的值
|
|
169
|
+
|
|
170
|
+
**範例:**
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
remove([1, 2, 3, 2], 2); // [1, 3, 2]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
#### `fieldSorter(sort)`
|
|
177
|
+
|
|
178
|
+
多欄位排序函數。
|
|
179
|
+
|
|
180
|
+
**參數:**
|
|
181
|
+
|
|
182
|
+
- `sort.isDesc`: 是否降冪排序
|
|
183
|
+
- `sort.fields`: 欄位設定陣列
|
|
184
|
+
- `key`: 欄位名稱
|
|
185
|
+
- `isNumber`: 是否為數字
|
|
186
|
+
- `isDesc`: 該欄位是否降冪
|
|
187
|
+
|
|
188
|
+
**範例:**
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
const data = [
|
|
192
|
+
{ name: 'John', age: 30 },
|
|
193
|
+
{ name: 'Jane', age: 25 },
|
|
194
|
+
];
|
|
195
|
+
data.sort(
|
|
196
|
+
fieldSorter({
|
|
197
|
+
fields: [{ key: 'age', isNumber: true, isDesc: true }],
|
|
198
|
+
}),
|
|
199
|
+
);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
#### `range(start, stop, step)`
|
|
203
|
+
|
|
204
|
+
取得數值區間的陣列。
|
|
205
|
+
|
|
206
|
+
**範例:**
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
range(1, 5, 1); // [1, 2, 3, 4, 5]
|
|
210
|
+
range(0, 10, 2); // [0, 2, 4, 6, 8, 10]
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 🛠️ 工具函數
|
|
214
|
+
|
|
215
|
+
#### `gettype(obj)`
|
|
216
|
+
|
|
217
|
+
回傳物件的精確型態。
|
|
218
|
+
|
|
219
|
+
**回傳值:** `'array'` | `'date'` | `'null'` | `'undefined'` | `'object'` | `'string'` | `'number'` | `'boolean'` 等
|
|
220
|
+
|
|
221
|
+
**範例:**
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
gettype([]); // 'array'
|
|
225
|
+
gettype(null); // 'null'
|
|
226
|
+
gettype(new Date()); // 'date'
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### `emptyData(data)`
|
|
230
|
+
|
|
231
|
+
判斷資料是否為空值(`undefined` 或 `null`)。
|
|
232
|
+
|
|
233
|
+
**範例:**
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
emptyData(null); // true
|
|
237
|
+
emptyData(undefined); // true
|
|
238
|
+
emptyData(0); // false
|
|
239
|
+
emptyData(''); // false
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
#### `searchInStr(str, key)`
|
|
243
|
+
|
|
244
|
+
尋找字串內是否有符合的值,並移除後回傳結果。
|
|
245
|
+
|
|
246
|
+
**回傳值:** `[boolean, string]`
|
|
247
|
+
|
|
248
|
+
**範例:**
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
searchInStr('hello world', 'world'); // [true, 'hello ']
|
|
252
|
+
searchInStr('hello', 'bye'); // [false, 'hello']
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## 💻 開發
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# 執行測試
|
|
259
|
+
npm test
|
|
260
|
+
|
|
261
|
+
# 建置專案
|
|
262
|
+
npm run build
|
|
263
|
+
|
|
264
|
+
# 發布套件
|
|
265
|
+
npm run push
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 📄 授權
|
|
269
|
+
|
|
270
|
+
ISC
|
|
271
|
+
|
|
272
|
+
## 👤 作者
|
|
273
|
+
|
|
274
|
+
aimidy
|
|
275
|
+
|
|
276
|
+
## 🔗 Repository
|
|
277
|
+
|
|
278
|
+
<https://github.com/aimidy/util>
|
package/dist/help/index.d.mts
CHANGED
|
@@ -133,23 +133,15 @@ declare function fieldSorter(sort: {
|
|
|
133
133
|
*/
|
|
134
134
|
declare function range(start: number, stop: number, step: number): number[];
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
declare
|
|
139
|
-
|
|
140
|
-
declare
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
declare const index_searchInStr: typeof searchInStr;
|
|
149
|
-
declare const index_strToConvert: typeof strToConvert;
|
|
150
|
-
declare const index_strToHump: typeof strToHump;
|
|
151
|
-
declare namespace index {
|
|
152
|
-
export { index_data_get as data_get, index_data_set as data_set, index_deepAssign as deepAssign, index_deepCloneWithJson as deepCloneWithJson, index_emptyData as emptyData, index_fieldSorter as fieldSorter, index_gettype as gettype, index_head as head, index_parameterMerge as parameterMerge, index_range as range, index_recursiveDeepCopy as recursiveDeepCopy, index_remove as remove, index_searchInStr as searchInStr, index_strToConvert as strToConvert, index_strToHump as strToHump };
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export { data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, index as i, parameterMerge, range, recursiveDeepCopy, remove, searchInStr, strToConvert, strToHump };
|
|
136
|
+
type CaseStyle = "pascal" | "camel" | "snake" | "kebab";
|
|
137
|
+
/** 主轉換函式:把 input 轉成指定命名風格 */
|
|
138
|
+
declare function convertCase(input: string, to: CaseStyle): string;
|
|
139
|
+
/** 也提供一次拿到全部格式 */
|
|
140
|
+
declare function convertAllCases(input: string): {
|
|
141
|
+
pascal: string;
|
|
142
|
+
camel: string;
|
|
143
|
+
snake: string;
|
|
144
|
+
kebab: string;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, searchInStr, strToConvert, strToHump };
|
package/dist/help/index.d.ts
CHANGED
|
@@ -133,23 +133,15 @@ declare function fieldSorter(sort: {
|
|
|
133
133
|
*/
|
|
134
134
|
declare function range(start: number, stop: number, step: number): number[];
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
declare
|
|
139
|
-
|
|
140
|
-
declare
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
declare const index_searchInStr: typeof searchInStr;
|
|
149
|
-
declare const index_strToConvert: typeof strToConvert;
|
|
150
|
-
declare const index_strToHump: typeof strToHump;
|
|
151
|
-
declare namespace index {
|
|
152
|
-
export { index_data_get as data_get, index_data_set as data_set, index_deepAssign as deepAssign, index_deepCloneWithJson as deepCloneWithJson, index_emptyData as emptyData, index_fieldSorter as fieldSorter, index_gettype as gettype, index_head as head, index_parameterMerge as parameterMerge, index_range as range, index_recursiveDeepCopy as recursiveDeepCopy, index_remove as remove, index_searchInStr as searchInStr, index_strToConvert as strToConvert, index_strToHump as strToHump };
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export { data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, index as i, parameterMerge, range, recursiveDeepCopy, remove, searchInStr, strToConvert, strToHump };
|
|
136
|
+
type CaseStyle = "pascal" | "camel" | "snake" | "kebab";
|
|
137
|
+
/** 主轉換函式:把 input 轉成指定命名風格 */
|
|
138
|
+
declare function convertCase(input: string, to: CaseStyle): string;
|
|
139
|
+
/** 也提供一次拿到全部格式 */
|
|
140
|
+
declare function convertAllCases(input: string): {
|
|
141
|
+
pascal: string;
|
|
142
|
+
camel: string;
|
|
143
|
+
snake: string;
|
|
144
|
+
kebab: string;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, searchInStr, strToConvert, strToHump };
|
package/dist/help/index.js
CHANGED
|
@@ -20,6 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/help/index.ts
|
|
21
21
|
var help_exports = {};
|
|
22
22
|
__export(help_exports, {
|
|
23
|
+
convertAllCases: () => convertAllCases,
|
|
24
|
+
convertCase: () => convertCase,
|
|
23
25
|
data_get: () => data_get,
|
|
24
26
|
data_set: () => data_set,
|
|
25
27
|
deepAssign: () => deepAssign,
|
|
@@ -103,7 +105,19 @@ function recursiveDeepCopy(o) {
|
|
|
103
105
|
|
|
104
106
|
// src/help/emptyData/emptyData.ts
|
|
105
107
|
function emptyData(data) {
|
|
106
|
-
|
|
108
|
+
if (data === void 0 || data === null) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (typeof data === "string") {
|
|
112
|
+
return data === "";
|
|
113
|
+
}
|
|
114
|
+
if (Array.isArray(data)) {
|
|
115
|
+
return data.length === 0;
|
|
116
|
+
}
|
|
117
|
+
if (typeof data === "object") {
|
|
118
|
+
return Object.keys(data).length === 0;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
107
121
|
}
|
|
108
122
|
|
|
109
123
|
// src/help/gettype/gettype.ts
|
|
@@ -221,8 +235,49 @@ function range(start, stop, step) {
|
|
|
221
235
|
const range2 = { length: (stop - start) / step + 1 };
|
|
222
236
|
return Array.from(range2, (_, i) => start + i * step);
|
|
223
237
|
}
|
|
238
|
+
|
|
239
|
+
// src/help/convertCase/convertCase.ts
|
|
240
|
+
function tokenize(input) {
|
|
241
|
+
if (!input) return [];
|
|
242
|
+
const normalized = input.replace(/[_-]+/g, " ").replace(/[^A-Za-z0-9 ]+/g, " ").trim();
|
|
243
|
+
if (!normalized) return [];
|
|
244
|
+
const roughParts = normalized.split(/\s+/);
|
|
245
|
+
const tokens = [];
|
|
246
|
+
for (const part of roughParts) {
|
|
247
|
+
const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);
|
|
248
|
+
if (sub) tokens.push(...sub);
|
|
249
|
+
}
|
|
250
|
+
return tokens.map((t) => t.toLowerCase());
|
|
251
|
+
}
|
|
252
|
+
function capitalize(s) {
|
|
253
|
+
return s ? s[0].toUpperCase() + s.slice(1) : s;
|
|
254
|
+
}
|
|
255
|
+
function convertCase(input, to) {
|
|
256
|
+
const tokens = tokenize(input);
|
|
257
|
+
if (tokens.length === 0) return "";
|
|
258
|
+
switch (to) {
|
|
259
|
+
case "snake":
|
|
260
|
+
return tokens.join("_");
|
|
261
|
+
case "kebab":
|
|
262
|
+
return tokens.join("-");
|
|
263
|
+
case "camel":
|
|
264
|
+
return tokens[0] + tokens.slice(1).map(capitalize).join("");
|
|
265
|
+
case "pascal":
|
|
266
|
+
return tokens.map(capitalize).join("");
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function convertAllCases(input) {
|
|
270
|
+
return {
|
|
271
|
+
pascal: convertCase(input, "pascal"),
|
|
272
|
+
camel: convertCase(input, "camel"),
|
|
273
|
+
snake: convertCase(input, "snake"),
|
|
274
|
+
kebab: convertCase(input, "kebab")
|
|
275
|
+
};
|
|
276
|
+
}
|
|
224
277
|
// Annotate the CommonJS export names for ESM import in node:
|
|
225
278
|
0 && (module.exports = {
|
|
279
|
+
convertAllCases,
|
|
280
|
+
convertCase,
|
|
226
281
|
data_get,
|
|
227
282
|
data_set,
|
|
228
283
|
deepAssign,
|
package/dist/help/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/help/index.ts","../../src/help/data_set/data_set.ts","../../src/help/data_get/data_get.ts","../../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../../src/help/emptyData/emptyData.ts","../../src/help/gettype/gettype.ts","../../src/help/parameterMerge/parameterMerge.ts","../../src/help/head/head.ts","../../src/help/deepCloneWithJson/deepCloneWithJson.ts","../../src/help/remove/remove.ts","../../src/help/searchInStr/searchInStr.ts","../../src/help/strToConvert/strToConvert.ts","../../src/help/strToHump/strToHump.ts","../../src/help/deepAssign/deepAssign.ts","../../src/help/fieldSorter/fieldSorter.ts","../../src/help/range/range.ts"],"sourcesContent":["export * from './data_set/data_set';\r\nexport * from './data_get/data_get';\r\nexport * from './recursiveDeepCopy/recursiveDeepCopy';\r\nexport * from './emptyData/emptyData';\r\nexport * from './gettype/gettype';\r\nexport * from './parameterMerge/parameterMerge';\r\nexport * from './head/head';\r\nexport * from './deepCloneWithJson/deepCloneWithJson';\r\nexport * from './remove/remove';\r\nexport * from './searchInStr/searchInStr';\r\nexport * from './strToConvert/strToConvert';\r\nexport * from './strToHump/strToHump';\r\nexport * from './deepAssign/deepAssign';\r\nexport * from './fieldSorter/fieldSorter';\r\nexport * from \"./range/range\";","/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data \r\n * @returns \r\n */\r\nexport function emptyData(data: any) {\r\n return typeof data === \"undefined\" || data === null\r\n}","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};"],"mappings":"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","names":["range"]}
|
|
1
|
+
{"version":3,"sources":["../../src/help/index.ts","../../src/help/data_set/data_set.ts","../../src/help/data_get/data_get.ts","../../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../../src/help/emptyData/emptyData.ts","../../src/help/gettype/gettype.ts","../../src/help/parameterMerge/parameterMerge.ts","../../src/help/head/head.ts","../../src/help/deepCloneWithJson/deepCloneWithJson.ts","../../src/help/remove/remove.ts","../../src/help/searchInStr/searchInStr.ts","../../src/help/strToConvert/strToConvert.ts","../../src/help/strToHump/strToHump.ts","../../src/help/deepAssign/deepAssign.ts","../../src/help/fieldSorter/fieldSorter.ts","../../src/help/range/range.ts","../../src/help/convertCase/convertCase.ts"],"sourcesContent":["export * from './data_set/data_set';\r\nexport * from './data_get/data_get';\r\nexport * from './recursiveDeepCopy/recursiveDeepCopy';\r\nexport * from './emptyData/emptyData';\r\nexport * from './gettype/gettype';\r\nexport * from './parameterMerge/parameterMerge';\r\nexport * from './head/head';\r\nexport * from './deepCloneWithJson/deepCloneWithJson';\r\nexport * from './remove/remove';\r\nexport * from './searchInStr/searchInStr';\r\nexport * from './strToConvert/strToConvert';\r\nexport * from './strToHump/strToHump';\r\nexport * from './deepAssign/deepAssign';\r\nexport * from './fieldSorter/fieldSorter';\r\nexport * from './range/range';\r\nexport * from './convertCase/convertCase';\r\n","/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data\r\n * @returns\r\n */\r\nexport function emptyData(data: any) {\r\n if (data === undefined || data === null) {\r\n return true;\r\n }\r\n\r\n if (typeof data === 'string') {\r\n return data === '';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return data.length === 0;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n return Object.keys(data).length === 0;\r\n }\r\n\r\n return false;\r\n}\r\n","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};","type CaseStyle = \"pascal\" | \"camel\" | \"snake\" | \"kebab\";\r\n\r\n/** 把各種命名(Pascal/camel/snake/kebab/混雜)拆成單字 tokens */\r\nfunction tokenize(input: string): string[] {\r\n if (!input) return [];\r\n\r\n // 先把 - 與 _ 轉成空白,再把其他非字母數字當分隔\r\n const normalized = input\r\n .replace(/[_-]+/g, \" \")\r\n .replace(/[^A-Za-z0-9 ]+/g, \" \")\r\n .trim();\r\n\r\n if (!normalized) return [];\r\n\r\n const roughParts = normalized.split(/\\s+/);\r\n\r\n const tokens: string[] = [];\r\n for (const part of roughParts) {\r\n // 在大小寫/數字邊界切開\r\n // 例: \"JSONDataAPI2\" -> [\"JSON\", \"Data\", \"API\", \"2\"]\r\n const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);\r\n if (sub) tokens.push(...sub);\r\n }\r\n\r\n // 統一成小寫 tokens(組裝時再決定大小寫)\r\n return tokens.map((t) => t.toLowerCase());\r\n}\r\n\r\nfunction capitalize(s: string): string {\r\n return s ? s[0].toUpperCase() + s.slice(1) : s;\r\n}\r\n\r\n/** 主轉換函式:把 input 轉成指定命名風格 */\r\nexport function convertCase(input: string, to: CaseStyle): string {\r\n const tokens = tokenize(input);\r\n if (tokens.length === 0) return \"\";\r\n\r\n switch (to) {\r\n case \"snake\":\r\n return tokens.join(\"_\");\r\n case \"kebab\":\r\n return tokens.join(\"-\");\r\n case \"camel\":\r\n return tokens[0] + tokens.slice(1).map(capitalize).join(\"\");\r\n case \"pascal\":\r\n return tokens.map(capitalize).join(\"\");\r\n }\r\n}\r\n\r\n/** 也提供一次拿到全部格式 */\r\nexport function convertAllCases(input: string) {\r\n return {\r\n pascal: convertCase(input, \"pascal\"),\r\n camel: convertCase(input, \"camel\"),\r\n snake: convertCase(input, \"snake\"),\r\n kebab: convertCase(input, \"kebab\"),\r\n };\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/dist/help/index.mjs
CHANGED
|
@@ -63,7 +63,19 @@ function recursiveDeepCopy(o) {
|
|
|
63
63
|
|
|
64
64
|
// src/help/emptyData/emptyData.ts
|
|
65
65
|
function emptyData(data) {
|
|
66
|
-
|
|
66
|
+
if (data === void 0 || data === null) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (typeof data === "string") {
|
|
70
|
+
return data === "";
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(data)) {
|
|
73
|
+
return data.length === 0;
|
|
74
|
+
}
|
|
75
|
+
if (typeof data === "object") {
|
|
76
|
+
return Object.keys(data).length === 0;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
67
79
|
}
|
|
68
80
|
|
|
69
81
|
// src/help/gettype/gettype.ts
|
|
@@ -181,7 +193,48 @@ function range(start, stop, step) {
|
|
|
181
193
|
const range2 = { length: (stop - start) / step + 1 };
|
|
182
194
|
return Array.from(range2, (_, i) => start + i * step);
|
|
183
195
|
}
|
|
196
|
+
|
|
197
|
+
// src/help/convertCase/convertCase.ts
|
|
198
|
+
function tokenize(input) {
|
|
199
|
+
if (!input) return [];
|
|
200
|
+
const normalized = input.replace(/[_-]+/g, " ").replace(/[^A-Za-z0-9 ]+/g, " ").trim();
|
|
201
|
+
if (!normalized) return [];
|
|
202
|
+
const roughParts = normalized.split(/\s+/);
|
|
203
|
+
const tokens = [];
|
|
204
|
+
for (const part of roughParts) {
|
|
205
|
+
const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);
|
|
206
|
+
if (sub) tokens.push(...sub);
|
|
207
|
+
}
|
|
208
|
+
return tokens.map((t) => t.toLowerCase());
|
|
209
|
+
}
|
|
210
|
+
function capitalize(s) {
|
|
211
|
+
return s ? s[0].toUpperCase() + s.slice(1) : s;
|
|
212
|
+
}
|
|
213
|
+
function convertCase(input, to) {
|
|
214
|
+
const tokens = tokenize(input);
|
|
215
|
+
if (tokens.length === 0) return "";
|
|
216
|
+
switch (to) {
|
|
217
|
+
case "snake":
|
|
218
|
+
return tokens.join("_");
|
|
219
|
+
case "kebab":
|
|
220
|
+
return tokens.join("-");
|
|
221
|
+
case "camel":
|
|
222
|
+
return tokens[0] + tokens.slice(1).map(capitalize).join("");
|
|
223
|
+
case "pascal":
|
|
224
|
+
return tokens.map(capitalize).join("");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function convertAllCases(input) {
|
|
228
|
+
return {
|
|
229
|
+
pascal: convertCase(input, "pascal"),
|
|
230
|
+
camel: convertCase(input, "camel"),
|
|
231
|
+
snake: convertCase(input, "snake"),
|
|
232
|
+
kebab: convertCase(input, "kebab")
|
|
233
|
+
};
|
|
234
|
+
}
|
|
184
235
|
export {
|
|
236
|
+
convertAllCases,
|
|
237
|
+
convertCase,
|
|
185
238
|
data_get,
|
|
186
239
|
data_set,
|
|
187
240
|
deepAssign,
|
package/dist/help/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/help/data_set/data_set.ts","../../src/help/data_get/data_get.ts","../../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../../src/help/emptyData/emptyData.ts","../../src/help/gettype/gettype.ts","../../src/help/parameterMerge/parameterMerge.ts","../../src/help/head/head.ts","../../src/help/deepCloneWithJson/deepCloneWithJson.ts","../../src/help/remove/remove.ts","../../src/help/searchInStr/searchInStr.ts","../../src/help/strToConvert/strToConvert.ts","../../src/help/strToHump/strToHump.ts","../../src/help/deepAssign/deepAssign.ts","../../src/help/fieldSorter/fieldSorter.ts","../../src/help/range/range.ts"],"sourcesContent":["/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data \r\n * @returns \r\n */\r\nexport function emptyData(data: any) {\r\n return typeof data === \"undefined\" || data === null\r\n}","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};"],"mappings":";AAOO,SAAS,SAAS,MAAW,KAAa,OAAY;AACzD,QAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,QAAM,WAAW,KAAK,MAAM;AAC5B,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,KAAK,SAAS,GAAG;AACjB,SAAK,QAAQ,IAAI;AACjB,WAAO;AAAA,EACX;AAEA,OAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK;AACnD,SAAO;AACX;;;ACPO,SAAS,SAAkB,MAAyD,KAAa,eAAoB,MAAU;AAClI,UAAQ,QAAQ,IAAI,GAAG;AAAA,IACnB,KAAK;AACD,YAAM,WAAW,kBAAkB,IAAI;AACvC,YAAM,WAAW,OAAO,KAAK,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;AACtE,UAAI,SAAS,SAAS,EAAG,QAAO;AAEhC,YAAM,UAAU,SAAS,WAAW,IAAI,SAAS,CAAC,IAAI,YAAY,UAAU,GAAG;AAC/E,UAAI,YAAY,KAAM,QAAO;AAE7B,YAAM,YAAY,MAAM,KAAK,IAAI,QAAQ,UAAU,KAAK,EAAE;AAC1D,UAAI,QAAQ,GAAI,QAAO,SAAS,OAAO;AAEvC,aAAO,SAAS,SAAS,OAAO,GAAG,KAAK,YAAY;AAAA,IAExD,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAQ,KAAe,IAAI,CAAC,UAAe,SAAS,OAAO,KAAK,YAAY,CAAC;AAAA,IACjF;AACI,aAAO;AAAA,EACf;AACJ;AAQA,SAAS,YAAY,SAAmB,KAA4B;AAChE,QAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,SAAO,QAAQ,KAAK,YAAU;AAC1B,UAAM,WAAW,OAAO,MAAM,GAAG;AACjC,WAAO,KAAK,MAAM,CAAC,GAAG,UAAU,MAAM,SAAS,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EACnH,CAAC,KAAK;AACV;;;AC5CO,SAAS,kBAA2B,GAAS;AAChD,UAAQ,OAAO,UAAU,SAAS,MAAM,CAAC,GAAG;AAAA,IACxC,KAAK;AACD,YAAM,WAAgB,CAAC;AACvB,MAAC,EAAiB,QAAQ,WAAS;AAC/B,QAAC,SAAwB,KAAK,kBAAkB,KAAK,CAAC;AAAA,MAC1D,CAAC;AACD,aAAO;AAAA,IACX,KAAK;AACD,YAAM,QAAa,CAAC;AACpB,aAAO,KAAK,CAAW,EAAE,QAAQ,SAAO;AACpC,YAAI,OAAO,UAAU,eAAe,KAAK,GAAG,GAAG;AAC3C,gBAAM,GAAG,IAAI,kBAAmB,EAA2B,GAAG,CAAC;AAAA,MACvE,CAAC;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;;;AClBO,SAAS,UAAU,MAAW;AACjC,SAAO,OAAO,SAAS,eAAe,SAAS;AACnD;;;ACFO,SAAS,QAAiB,KAAQ;AACrC,UAAQ,MAAM;AAAA,IACV,KAAK,eAAe;AAChB,aAAO;AAAA,IACX,KAAK,eAAe;AAChB,aAAO;AAAA,IACX,KAAK,QAAQ;AACT,aAAO;AAAA,IACX;AACI,aAAO,OAAO;AAAA,EACtB;AACJ;;;ACPO,SAAS,eAAe,QAAc,QAAc;AACvD,QAAM,QAAQ,QAAQ,MAAM;AAC5B,QAAM,QAAQ,QAAQ,MAAM;AAE5B,UAAQ,MAAM;AAAA,IACV,OAAM,UAAU,eAAe,UAAU,WAAW,CAAC,CAAC;AAClD,aAAO;AAAA,IACX,OAAM,UAAU,eAAe,UAAU,WAAW,CAAC,CAAC;AAClD,aAAO;AAAA,IACX,MAAK,UAAU,WAAW,UAAU;AAChC,aAAO,CAAC,GAAG,QAAQ,GAAG,MAAM;AAAA,IAChC,MAAK,UAAU,YAAY,UAAU;AACjC,aAAO,OAAO,OAAO,kBAAkB,MAAM,GAAG,MAAM;AAAA,IAC1D;AACI,aAAO,CAAC;AAAA,EAChB;AACJ;;;AClBO,SAAS,KAAc,KAAyB;AACnD,MAAI,QAAQ,GAAG,MAAM,QAAS,QAAO;AACrC,SAAO,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI;AACrC;;;ACLO,SAAS,kBAAqB,KAAQ;AACzC,SAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AACvC;;;ACCK,SAAS,OAAO,KAAqB,MAAoB;AAC5D,MAAI,IAAI,WAAW,EAAG,QAAO,CAAC;AAE9B,QAAM,QAAQ,IAAI,QAAQ,IAAI;AAC9B,MAAI,UAAU,GAAI,QAAO;AAEzB,SAAO,CAAC,GAAG,IAAI,MAAM,GAAG,KAAK,GAAG,GAAG,IAAI,MAAM,QAAQ,CAAC,CAAC;AAC3D;;;ACTO,SAAS,YAAY,KAAa,KAAgC;AACrE,SAAO,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,EAAE,CAAC;AAC/E;;;ACHO,SAAS,aAAa,KAAa,UAAkB,KAAK;AAC7D,SAAO,IAAI,QAAQ,cAAc,GAAG,OAAO,IAAI,EAAE,YAAY;AACjE;;;ACFO,SAAS,UAAU,KAAa;AACrC,MAAI,IAAI,WAAW,GAAG,EAAG,OAAM,IAAI,MAAM,CAAC;AAE1C,SAAO,IAAI,QAAQ,uBAAuB,SAAU,IAAI,IAAI,IAAI;AAC9D,WAAO,KAAK,GAAG,YAAY;AAAA,EAC7B,CAAC;AACH;;;ACHO,SAAS,cAAc,OAA6C;AACvE,MAAI,OAAc,MAAM,OAAO,OAAK,QAAQ,CAAC,MAAM,QAAQ;AAC3D,MAAI,KAAK,SAAS,EAAG,QAAO,CAAC;AAE7B,MAAI,SAAS,OAAO,OAAO,CAAC,GAAG,GAAG,IAAI;AAEtC,WAAS,QAAQ,MAAM;AACnB,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAa,IAAI,GAAG;AAChD,UAAI,QAAQ,GAAG,MAAM,UAAU;AAC3B,eAAO,GAAG,IAAI,WAAW,OAAO,GAAG,GAAG,GAAG;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;;;ACjBO,SAAS,YAAY,MAOzB;AACC,SAAO,CAAC,GAAyB,MAA4B;AACzD,UAAM,OAAO,KAAK,OACb,IAAI,WAAS;AACV,UAAI,MAAM;AACV,UAAI,MAAM,QAAQ;AACd,cAAM;AAAA,MACV;AAEA,UAAI,SAAS,EAAE,MAAM,GAAG;AACxB,UAAI,SAAS,EAAE,MAAM,GAAG;AAExB,UAAI,CAAC,UAAU,CAAC;AACZ,eAAO;AAEX,UAAI,MAAM,UAAU;AAChB,iBAAS,OAAO,MAAM;AACtB,iBAAS,OAAO,MAAM;AAEtB,YAAI,OAAO,MAAM,MAAM,KAAK,OAAO,MAAM,MAAM;AAC3C,iBAAO;AAAA,MACf;AAEA,aAAO,SAAS,SAAS,MAAM,SAAS,SAAS,CAAE,MAAO;AAAA,IAC9D,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC;AAEpC,QAAI,KAAK;AACL,aAAO;AAEX,WAAO;AAAA,EACX;AACJ;;;ACpCO,SAAS,MAAM,OAAe,MAAc,MAAc;AAC7D,QAAMA,SAAQ,EAAE,SAAS,OAAO,SAAS,OAAO,EAAE;AAElD,SAAO,MAAM,KAAKA,QAAO,CAAC,GAAG,MAAM,QAAS,IAAI,IAAK;AACzD;","names":["range"]}
|
|
1
|
+
{"version":3,"sources":["../../src/help/data_set/data_set.ts","../../src/help/data_get/data_get.ts","../../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../../src/help/emptyData/emptyData.ts","../../src/help/gettype/gettype.ts","../../src/help/parameterMerge/parameterMerge.ts","../../src/help/head/head.ts","../../src/help/deepCloneWithJson/deepCloneWithJson.ts","../../src/help/remove/remove.ts","../../src/help/searchInStr/searchInStr.ts","../../src/help/strToConvert/strToConvert.ts","../../src/help/strToHump/strToHump.ts","../../src/help/deepAssign/deepAssign.ts","../../src/help/fieldSorter/fieldSorter.ts","../../src/help/range/range.ts","../../src/help/convertCase/convertCase.ts"],"sourcesContent":["/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data\r\n * @returns\r\n */\r\nexport function emptyData(data: any) {\r\n if (data === undefined || data === null) {\r\n return true;\r\n }\r\n\r\n if (typeof data === 'string') {\r\n return data === '';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return data.length === 0;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n return Object.keys(data).length === 0;\r\n }\r\n\r\n return false;\r\n}\r\n","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};","type CaseStyle = \"pascal\" | \"camel\" | \"snake\" | \"kebab\";\r\n\r\n/** 把各種命名(Pascal/camel/snake/kebab/混雜)拆成單字 tokens */\r\nfunction tokenize(input: string): string[] {\r\n if (!input) return [];\r\n\r\n // 先把 - 與 _ 轉成空白,再把其他非字母數字當分隔\r\n const normalized = input\r\n .replace(/[_-]+/g, \" \")\r\n .replace(/[^A-Za-z0-9 ]+/g, \" \")\r\n .trim();\r\n\r\n if (!normalized) return [];\r\n\r\n const roughParts = normalized.split(/\\s+/);\r\n\r\n const tokens: string[] = [];\r\n for (const part of roughParts) {\r\n // 在大小寫/數字邊界切開\r\n // 例: \"JSONDataAPI2\" -> [\"JSON\", \"Data\", \"API\", \"2\"]\r\n const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);\r\n if (sub) tokens.push(...sub);\r\n }\r\n\r\n // 統一成小寫 tokens(組裝時再決定大小寫)\r\n return tokens.map((t) => t.toLowerCase());\r\n}\r\n\r\nfunction capitalize(s: string): string {\r\n return s ? s[0].toUpperCase() + s.slice(1) : s;\r\n}\r\n\r\n/** 主轉換函式:把 input 轉成指定命名風格 */\r\nexport function convertCase(input: string, to: CaseStyle): string {\r\n const tokens = tokenize(input);\r\n if (tokens.length === 0) return \"\";\r\n\r\n switch (to) {\r\n case \"snake\":\r\n return tokens.join(\"_\");\r\n case \"kebab\":\r\n return tokens.join(\"-\");\r\n case \"camel\":\r\n return tokens[0] + tokens.slice(1).map(capitalize).join(\"\");\r\n case \"pascal\":\r\n return tokens.map(capitalize).join(\"\");\r\n }\r\n}\r\n\r\n/** 也提供一次拿到全部格式 */\r\nexport function convertAllCases(input: string) {\r\n return {\r\n pascal: convertCase(input, \"pascal\"),\r\n camel: convertCase(input, \"camel\"),\r\n snake: convertCase(input, \"snake\"),\r\n kebab: convertCase(input, \"kebab\"),\r\n };\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, searchInStr, strToConvert, strToHump } from './help/index.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, searchInStr, strToConvert, strToHump } from './help/index.js';
|
package/dist/index.js
CHANGED
|
@@ -20,13 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
module.exports = __toCommonJS(index_exports);
|
|
26
|
-
|
|
27
|
-
// src/help/index.ts
|
|
28
|
-
var help_exports = {};
|
|
29
|
-
__export(help_exports, {
|
|
23
|
+
convertAllCases: () => convertAllCases,
|
|
24
|
+
convertCase: () => convertCase,
|
|
30
25
|
data_get: () => data_get,
|
|
31
26
|
data_set: () => data_set,
|
|
32
27
|
deepAssign: () => deepAssign,
|
|
@@ -43,6 +38,7 @@ __export(help_exports, {
|
|
|
43
38
|
strToConvert: () => strToConvert,
|
|
44
39
|
strToHump: () => strToHump
|
|
45
40
|
});
|
|
41
|
+
module.exports = __toCommonJS(index_exports);
|
|
46
42
|
|
|
47
43
|
// src/help/data_set/data_set.ts
|
|
48
44
|
function data_set(data, key, value) {
|
|
@@ -109,7 +105,19 @@ function recursiveDeepCopy(o) {
|
|
|
109
105
|
|
|
110
106
|
// src/help/emptyData/emptyData.ts
|
|
111
107
|
function emptyData(data) {
|
|
112
|
-
|
|
108
|
+
if (data === void 0 || data === null) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
if (typeof data === "string") {
|
|
112
|
+
return data === "";
|
|
113
|
+
}
|
|
114
|
+
if (Array.isArray(data)) {
|
|
115
|
+
return data.length === 0;
|
|
116
|
+
}
|
|
117
|
+
if (typeof data === "object") {
|
|
118
|
+
return Object.keys(data).length === 0;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
113
121
|
}
|
|
114
122
|
|
|
115
123
|
// src/help/gettype/gettype.ts
|
|
@@ -227,8 +235,63 @@ function range(start, stop, step) {
|
|
|
227
235
|
const range2 = { length: (stop - start) / step + 1 };
|
|
228
236
|
return Array.from(range2, (_, i) => start + i * step);
|
|
229
237
|
}
|
|
238
|
+
|
|
239
|
+
// src/help/convertCase/convertCase.ts
|
|
240
|
+
function tokenize(input) {
|
|
241
|
+
if (!input) return [];
|
|
242
|
+
const normalized = input.replace(/[_-]+/g, " ").replace(/[^A-Za-z0-9 ]+/g, " ").trim();
|
|
243
|
+
if (!normalized) return [];
|
|
244
|
+
const roughParts = normalized.split(/\s+/);
|
|
245
|
+
const tokens = [];
|
|
246
|
+
for (const part of roughParts) {
|
|
247
|
+
const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);
|
|
248
|
+
if (sub) tokens.push(...sub);
|
|
249
|
+
}
|
|
250
|
+
return tokens.map((t) => t.toLowerCase());
|
|
251
|
+
}
|
|
252
|
+
function capitalize(s) {
|
|
253
|
+
return s ? s[0].toUpperCase() + s.slice(1) : s;
|
|
254
|
+
}
|
|
255
|
+
function convertCase(input, to) {
|
|
256
|
+
const tokens = tokenize(input);
|
|
257
|
+
if (tokens.length === 0) return "";
|
|
258
|
+
switch (to) {
|
|
259
|
+
case "snake":
|
|
260
|
+
return tokens.join("_");
|
|
261
|
+
case "kebab":
|
|
262
|
+
return tokens.join("-");
|
|
263
|
+
case "camel":
|
|
264
|
+
return tokens[0] + tokens.slice(1).map(capitalize).join("");
|
|
265
|
+
case "pascal":
|
|
266
|
+
return tokens.map(capitalize).join("");
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function convertAllCases(input) {
|
|
270
|
+
return {
|
|
271
|
+
pascal: convertCase(input, "pascal"),
|
|
272
|
+
camel: convertCase(input, "camel"),
|
|
273
|
+
snake: convertCase(input, "snake"),
|
|
274
|
+
kebab: convertCase(input, "kebab")
|
|
275
|
+
};
|
|
276
|
+
}
|
|
230
277
|
// Annotate the CommonJS export names for ESM import in node:
|
|
231
278
|
0 && (module.exports = {
|
|
232
|
-
|
|
279
|
+
convertAllCases,
|
|
280
|
+
convertCase,
|
|
281
|
+
data_get,
|
|
282
|
+
data_set,
|
|
283
|
+
deepAssign,
|
|
284
|
+
deepCloneWithJson,
|
|
285
|
+
emptyData,
|
|
286
|
+
fieldSorter,
|
|
287
|
+
gettype,
|
|
288
|
+
head,
|
|
289
|
+
parameterMerge,
|
|
290
|
+
range,
|
|
291
|
+
recursiveDeepCopy,
|
|
292
|
+
remove,
|
|
293
|
+
searchInStr,
|
|
294
|
+
strToConvert,
|
|
295
|
+
strToHump
|
|
233
296
|
});
|
|
234
297
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/help/index.ts","../src/help/data_set/data_set.ts","../src/help/data_get/data_get.ts","../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../src/help/emptyData/emptyData.ts","../src/help/gettype/gettype.ts","../src/help/parameterMerge/parameterMerge.ts","../src/help/head/head.ts","../src/help/deepCloneWithJson/deepCloneWithJson.ts","../src/help/remove/remove.ts","../src/help/searchInStr/searchInStr.ts","../src/help/strToConvert/strToConvert.ts","../src/help/strToHump/strToHump.ts","../src/help/deepAssign/deepAssign.ts","../src/help/fieldSorter/fieldSorter.ts","../src/help/range/range.ts"],"sourcesContent":["import * as help from './help';\r\n\r\nexport { help }","export * from './data_set/data_set';\r\nexport * from './data_get/data_get';\r\nexport * from './recursiveDeepCopy/recursiveDeepCopy';\r\nexport * from './emptyData/emptyData';\r\nexport * from './gettype/gettype';\r\nexport * from './parameterMerge/parameterMerge';\r\nexport * from './head/head';\r\nexport * from './deepCloneWithJson/deepCloneWithJson';\r\nexport * from './remove/remove';\r\nexport * from './searchInStr/searchInStr';\r\nexport * from './strToConvert/strToConvert';\r\nexport * from './strToHump/strToHump';\r\nexport * from './deepAssign/deepAssign';\r\nexport * from './fieldSorter/fieldSorter';\r\nexport * from \"./range/range\";","/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data \r\n * @returns \r\n */\r\nexport function emptyData(data: any) {\r\n return typeof data === \"undefined\" || data === null\r\n}","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};"],"mappings":"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","names":["range"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/help/data_set/data_set.ts","../src/help/data_get/data_get.ts","../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../src/help/emptyData/emptyData.ts","../src/help/gettype/gettype.ts","../src/help/parameterMerge/parameterMerge.ts","../src/help/head/head.ts","../src/help/deepCloneWithJson/deepCloneWithJson.ts","../src/help/remove/remove.ts","../src/help/searchInStr/searchInStr.ts","../src/help/strToConvert/strToConvert.ts","../src/help/strToHump/strToHump.ts","../src/help/deepAssign/deepAssign.ts","../src/help/fieldSorter/fieldSorter.ts","../src/help/range/range.ts","../src/help/convertCase/convertCase.ts"],"sourcesContent":["export * from \"./help\";\r\n","/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data\r\n * @returns\r\n */\r\nexport function emptyData(data: any) {\r\n if (data === undefined || data === null) {\r\n return true;\r\n }\r\n\r\n if (typeof data === 'string') {\r\n return data === '';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return data.length === 0;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n return Object.keys(data).length === 0;\r\n }\r\n\r\n return false;\r\n}\r\n","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};","type CaseStyle = \"pascal\" | \"camel\" | \"snake\" | \"kebab\";\r\n\r\n/** 把各種命名(Pascal/camel/snake/kebab/混雜)拆成單字 tokens */\r\nfunction tokenize(input: string): string[] {\r\n if (!input) return [];\r\n\r\n // 先把 - 與 _ 轉成空白,再把其他非字母數字當分隔\r\n const normalized = input\r\n .replace(/[_-]+/g, \" \")\r\n .replace(/[^A-Za-z0-9 ]+/g, \" \")\r\n .trim();\r\n\r\n if (!normalized) return [];\r\n\r\n const roughParts = normalized.split(/\\s+/);\r\n\r\n const tokens: string[] = [];\r\n for (const part of roughParts) {\r\n // 在大小寫/數字邊界切開\r\n // 例: \"JSONDataAPI2\" -> [\"JSON\", \"Data\", \"API\", \"2\"]\r\n const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);\r\n if (sub) tokens.push(...sub);\r\n }\r\n\r\n // 統一成小寫 tokens(組裝時再決定大小寫)\r\n return tokens.map((t) => t.toLowerCase());\r\n}\r\n\r\nfunction capitalize(s: string): string {\r\n return s ? s[0].toUpperCase() + s.slice(1) : s;\r\n}\r\n\r\n/** 主轉換函式:把 input 轉成指定命名風格 */\r\nexport function convertCase(input: string, to: CaseStyle): string {\r\n const tokens = tokenize(input);\r\n if (tokens.length === 0) return \"\";\r\n\r\n switch (to) {\r\n case \"snake\":\r\n return tokens.join(\"_\");\r\n case \"kebab\":\r\n return tokens.join(\"-\");\r\n case \"camel\":\r\n return tokens[0] + tokens.slice(1).map(capitalize).join(\"\");\r\n case \"pascal\":\r\n return tokens.map(capitalize).join(\"\");\r\n }\r\n}\r\n\r\n/** 也提供一次拿到全部格式 */\r\nexport function convertAllCases(input: string) {\r\n return {\r\n pascal: convertCase(input, \"pascal\"),\r\n camel: convertCase(input, \"camel\"),\r\n snake: convertCase(input, \"snake\"),\r\n kebab: convertCase(input, \"kebab\"),\r\n };\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,29 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __export = (target, all) => {
|
|
3
|
-
for (var name in all)
|
|
4
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
// src/help/index.ts
|
|
8
|
-
var help_exports = {};
|
|
9
|
-
__export(help_exports, {
|
|
10
|
-
data_get: () => data_get,
|
|
11
|
-
data_set: () => data_set,
|
|
12
|
-
deepAssign: () => deepAssign,
|
|
13
|
-
deepCloneWithJson: () => deepCloneWithJson,
|
|
14
|
-
emptyData: () => emptyData,
|
|
15
|
-
fieldSorter: () => fieldSorter,
|
|
16
|
-
gettype: () => gettype,
|
|
17
|
-
head: () => head,
|
|
18
|
-
parameterMerge: () => parameterMerge,
|
|
19
|
-
range: () => range,
|
|
20
|
-
recursiveDeepCopy: () => recursiveDeepCopy,
|
|
21
|
-
remove: () => remove,
|
|
22
|
-
searchInStr: () => searchInStr,
|
|
23
|
-
strToConvert: () => strToConvert,
|
|
24
|
-
strToHump: () => strToHump
|
|
25
|
-
});
|
|
26
|
-
|
|
27
1
|
// src/help/data_set/data_set.ts
|
|
28
2
|
function data_set(data, key, value) {
|
|
29
3
|
const keys = key.split(".");
|
|
@@ -89,7 +63,19 @@ function recursiveDeepCopy(o) {
|
|
|
89
63
|
|
|
90
64
|
// src/help/emptyData/emptyData.ts
|
|
91
65
|
function emptyData(data) {
|
|
92
|
-
|
|
66
|
+
if (data === void 0 || data === null) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (typeof data === "string") {
|
|
70
|
+
return data === "";
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(data)) {
|
|
73
|
+
return data.length === 0;
|
|
74
|
+
}
|
|
75
|
+
if (typeof data === "object") {
|
|
76
|
+
return Object.keys(data).length === 0;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
93
79
|
}
|
|
94
80
|
|
|
95
81
|
// src/help/gettype/gettype.ts
|
|
@@ -207,7 +193,62 @@ function range(start, stop, step) {
|
|
|
207
193
|
const range2 = { length: (stop - start) / step + 1 };
|
|
208
194
|
return Array.from(range2, (_, i) => start + i * step);
|
|
209
195
|
}
|
|
196
|
+
|
|
197
|
+
// src/help/convertCase/convertCase.ts
|
|
198
|
+
function tokenize(input) {
|
|
199
|
+
if (!input) return [];
|
|
200
|
+
const normalized = input.replace(/[_-]+/g, " ").replace(/[^A-Za-z0-9 ]+/g, " ").trim();
|
|
201
|
+
if (!normalized) return [];
|
|
202
|
+
const roughParts = normalized.split(/\s+/);
|
|
203
|
+
const tokens = [];
|
|
204
|
+
for (const part of roughParts) {
|
|
205
|
+
const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);
|
|
206
|
+
if (sub) tokens.push(...sub);
|
|
207
|
+
}
|
|
208
|
+
return tokens.map((t) => t.toLowerCase());
|
|
209
|
+
}
|
|
210
|
+
function capitalize(s) {
|
|
211
|
+
return s ? s[0].toUpperCase() + s.slice(1) : s;
|
|
212
|
+
}
|
|
213
|
+
function convertCase(input, to) {
|
|
214
|
+
const tokens = tokenize(input);
|
|
215
|
+
if (tokens.length === 0) return "";
|
|
216
|
+
switch (to) {
|
|
217
|
+
case "snake":
|
|
218
|
+
return tokens.join("_");
|
|
219
|
+
case "kebab":
|
|
220
|
+
return tokens.join("-");
|
|
221
|
+
case "camel":
|
|
222
|
+
return tokens[0] + tokens.slice(1).map(capitalize).join("");
|
|
223
|
+
case "pascal":
|
|
224
|
+
return tokens.map(capitalize).join("");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function convertAllCases(input) {
|
|
228
|
+
return {
|
|
229
|
+
pascal: convertCase(input, "pascal"),
|
|
230
|
+
camel: convertCase(input, "camel"),
|
|
231
|
+
snake: convertCase(input, "snake"),
|
|
232
|
+
kebab: convertCase(input, "kebab")
|
|
233
|
+
};
|
|
234
|
+
}
|
|
210
235
|
export {
|
|
211
|
-
|
|
236
|
+
convertAllCases,
|
|
237
|
+
convertCase,
|
|
238
|
+
data_get,
|
|
239
|
+
data_set,
|
|
240
|
+
deepAssign,
|
|
241
|
+
deepCloneWithJson,
|
|
242
|
+
emptyData,
|
|
243
|
+
fieldSorter,
|
|
244
|
+
gettype,
|
|
245
|
+
head,
|
|
246
|
+
parameterMerge,
|
|
247
|
+
range,
|
|
248
|
+
recursiveDeepCopy,
|
|
249
|
+
remove,
|
|
250
|
+
searchInStr,
|
|
251
|
+
strToConvert,
|
|
252
|
+
strToHump
|
|
212
253
|
};
|
|
213
254
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/help/index.ts","../src/help/data_set/data_set.ts","../src/help/data_get/data_get.ts","../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../src/help/emptyData/emptyData.ts","../src/help/gettype/gettype.ts","../src/help/parameterMerge/parameterMerge.ts","../src/help/head/head.ts","../src/help/deepCloneWithJson/deepCloneWithJson.ts","../src/help/remove/remove.ts","../src/help/searchInStr/searchInStr.ts","../src/help/strToConvert/strToConvert.ts","../src/help/strToHump/strToHump.ts","../src/help/deepAssign/deepAssign.ts","../src/help/fieldSorter/fieldSorter.ts","../src/help/range/range.ts"],"sourcesContent":["export * from './data_set/data_set';\r\nexport * from './data_get/data_get';\r\nexport * from './recursiveDeepCopy/recursiveDeepCopy';\r\nexport * from './emptyData/emptyData';\r\nexport * from './gettype/gettype';\r\nexport * from './parameterMerge/parameterMerge';\r\nexport * from './head/head';\r\nexport * from './deepCloneWithJson/deepCloneWithJson';\r\nexport * from './remove/remove';\r\nexport * from './searchInStr/searchInStr';\r\nexport * from './strToConvert/strToConvert';\r\nexport * from './strToHump/strToHump';\r\nexport * from './deepAssign/deepAssign';\r\nexport * from './fieldSorter/fieldSorter';\r\nexport * from \"./range/range\";","/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data \r\n * @returns \r\n */\r\nexport function emptyData(data: any) {\r\n return typeof data === \"undefined\" || data === null\r\n}","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};"],"mappings":"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","names":["range"]}
|
|
1
|
+
{"version":3,"sources":["../src/help/data_set/data_set.ts","../src/help/data_get/data_get.ts","../src/help/recursiveDeepCopy/recursiveDeepCopy.ts","../src/help/emptyData/emptyData.ts","../src/help/gettype/gettype.ts","../src/help/parameterMerge/parameterMerge.ts","../src/help/head/head.ts","../src/help/deepCloneWithJson/deepCloneWithJson.ts","../src/help/remove/remove.ts","../src/help/searchInStr/searchInStr.ts","../src/help/strToConvert/strToConvert.ts","../src/help/strToHump/strToHump.ts","../src/help/deepAssign/deepAssign.ts","../src/help/fieldSorter/fieldSorter.ts","../src/help/range/range.ts","../src/help/convertCase/convertCase.ts"],"sourcesContent":["/**\r\n * 動態設定多層物件的參數\r\n * @param data 被設定的物件\r\n * @param key 位置\r\n * @param value 參數\r\n * @returns \r\n */\r\nexport function data_set(data: any, key: string, value: any) {\r\n const keys = key.split(\".\");\r\n const firstKey = keys.shift();\r\n if (!firstKey) return data;\r\n\r\n if (keys.length < 1) {\r\n data[firstKey] = value;\r\n return data;\r\n }\r\n\r\n data[firstKey] = data_set({}, keys.join(\".\"), value);\r\n return data;\r\n}","import { deepCloneWithJson, gettype } from \"..\";\r\n\r\n/**\r\n * 獲取資料 \r\n * {a:[{b:a},{b:a}]} \r\n * a.b = [a,a]\r\n * @param data 資料集 {key:value} \r\n * @param key 資料對應的位置 app.column.name\r\n * @param defaultValue 如果取不到值要給予什麼參數,預設 null\r\n * @returns \r\n * @default null\r\n */\r\nexport function data_get<T = any>(data: { [key: string]: any } | any[] | null | undefined, key: string, defaultValue: any = null,): T {\r\n switch (gettype(data)) {\r\n case \"object\":\r\n const copyData = deepCloneWithJson(data);\r\n const findKeys = Object.keys(copyData).filter((k) => key.startsWith(k));\r\n if (findKeys.length < 1) return defaultValue;\r\n\r\n const findKey = findKeys.length === 1 ? findKeys[0] : findOnlyKey(findKeys, key);\r\n if (findKey === null) return defaultValue;\r\n\r\n key = findKey === key ? '' : key.replace(findKey + '.', '');\r\n if (key === '') return copyData[findKey];\r\n\r\n return data_get(copyData[findKey], key, defaultValue);\r\n\r\n case 'undefined':\r\n case 'null':\r\n return defaultValue;\r\n case 'array':\r\n return (data as any[]).map((value: any) => data_get(value, key, defaultValue)) as any;\r\n default:\r\n return data as any;\r\n }\r\n}\r\n\r\n/**\r\n * 當有多個key時,找出唯一的key\r\n * @param objKeys \r\n * @param key \r\n * @returns \r\n */\r\nfunction findOnlyKey(objKeys: string[], key: string): string | null {\r\n const keys = key.split('.');\r\n return objKeys.find(objKey => {\r\n const keyParts = objKey.split('.');\r\n return keys.every((k, index) => k === keyParts[index] || keyParts[index] === keys.slice(0, index + 1).join('.'));\r\n }) || null;\r\n}","/**\r\n* 透過遞迴複製物件\r\n* @param o \r\n* @returns \r\n*/\r\nexport function recursiveDeepCopy<T = any>(o: T): T {\r\n switch (Object.prototype.toString.apply(o)) {\r\n case \"[object Array]\":\r\n const tempArry: any = [];\r\n (o as Array<any>).forEach(value => {\r\n (tempArry as Array<any>).push(recursiveDeepCopy(value));\r\n })\r\n return tempArry;\r\n case \"[object Object]\":\r\n const tempO: any = {};\r\n Object.keys(o as Object).forEach(key => {\r\n if (Object.prototype.hasOwnProperty.call(o, key))\r\n tempO[key] = recursiveDeepCopy((o as { [_: string]: any })[key]);\r\n })\r\n return tempO;\r\n default:\r\n return o;\r\n }\r\n}","/**\r\n * 判斷資料是否為空值\r\n * @param data\r\n * @returns\r\n */\r\nexport function emptyData(data: any) {\r\n if (data === undefined || data === null) {\r\n return true;\r\n }\r\n\r\n if (typeof data === 'string') {\r\n return data === '';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n return data.length === 0;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n return Object.keys(data).length === 0;\r\n }\r\n\r\n return false;\r\n}\r\n","/**\r\n * 回傳物體的型態\r\n * @param obj \r\n * @returns \r\n */\r\nexport function gettype<T = any>(obj: T) {\r\n switch (true) {\r\n case obj instanceof Array:\r\n return 'array';\r\n case obj instanceof Date:\r\n return 'date';\r\n case obj === null:\r\n return 'null';\r\n default:\r\n return typeof obj;\r\n }\r\n}","import { gettype, recursiveDeepCopy } from \"..\";\r\n\r\n/**\r\n * 兩個參數的合併(只能是物件或者陣列)\r\n * 如果是空值就回傳空物件\r\n * @param value1 \r\n * @param value2 \r\n * @returns \r\n */\r\nexport function parameterMerge(value1?: any, value2?: any) {\r\n const type1 = gettype(value1);\r\n const type2 = gettype(value2);\r\n\r\n switch (true) {\r\n case (type1 === \"undefined\" || type1 === \"null\") && !!value2:\r\n return value2;\r\n case (type2 === \"undefined\" || type2 === \"null\") && !!value1:\r\n return value1;\r\n case type1 === \"array\" && type1 === type2:\r\n return [...value1, ...value2];\r\n case type1 === \"object\" && type1 === type2:\r\n return Object.assign(recursiveDeepCopy(value1), value2);\r\n default:\r\n return {};\r\n }\r\n}","import { gettype } from \"..\";\r\n\r\n/**\r\n * 回傳物件的第一個值或者空值\r\n * @param arr\r\n * @returns\r\n */\r\nexport function head<T = any>(arr: Array<T>): T | null {\r\n if (gettype(arr) !== 'array') return null;\r\n return arr.length > 0 ? arr[0] : null;\r\n}\r\n\r\n\r\n","/**\r\n * 透過 JSON 複製物件\r\n * @param obj 要複製的物件\r\n * @returns\r\n */\r\nexport function deepCloneWithJson<T>(obj: T) {\r\n return JSON.parse(JSON.stringify(obj));\r\n }\r\n ","type TremoveValeu = string | number\r\n\r\n/**\r\n * 移除陣列某一個位置的值\r\n * @param arr 陣列\r\n * @param item 要移除的值\r\n * @returns\r\n */\r\nexport function remove(arr: TremoveValeu[], item: TremoveValeu) {\r\n if (arr.length === 0) return [];\r\n\r\n const index = arr.indexOf(item);\r\n if (index === -1) return arr;\r\n\r\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\r\n}","/**\r\n * 尋找字串內是否有符合的值,並移除後回傳結果\r\n * @param str 字串\r\n * @param key 要搜尋的文字\r\n * @returns [boolean,string]\r\n */\r\nexport function searchInStr(str: string, key: string): [boolean, string] {\r\n return str.indexOf(key) === -1 ? [false, str] : [true, str.replace(key, '')];\r\n}","/**\r\n * 駝峰轉小寫+convert(default:底線)\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToConvert(str: string, convert: string = \"_\") {\r\n return str.replace(/\\B([A-Z])/g, `${convert}$1`).toLowerCase();\r\n}","/**\r\n * 底線轉駝峰\r\n * @param str\r\n * @returns\r\n */\r\nexport function strToHump(str: string) {\r\n if (str.startsWith('_')) str = str.slice(1);\r\n\r\n return str.replace(/([^_])(?:_+([^_]))/g, function ($0, $1, $2) {\r\n return $1 + $2.toUpperCase();\r\n });\r\n}","import { gettype } from \"../gettype/gettype\";\r\n\r\n/**\r\n * 物件深度合併\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport function deepAssign(...param: ({ [_: string]: any } | undefined)[]) {\r\n let temp: any[] = param.filter(v => gettype(v) === \"object\")\r\n if (temp.length < 1) return {};\r\n \r\n let result = Object.assign({}, ...temp);\r\n\r\n for (let item of temp) {\r\n for (const [idx, val] of Object.entries<any>(item)) {\r\n if (gettype(val) === \"object\") {\r\n result[idx] = deepAssign(result[idx], val);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * 多欄位排序\r\n * @param sort \r\n * @returns \r\n */\r\nexport function fieldSorter(sort: {\r\n isDesc?: boolean,\r\n fields: {\r\n key: string,\r\n isNumber?: boolean,\r\n isDesc?: boolean\r\n }[]\r\n}) {\r\n return (a: { [_: string]: any }, b: { [_: string]: any }) => {\r\n const data = sort.fields\r\n .map(filed => {\r\n let dir = 1;\r\n if (filed.isDesc) {\r\n dir = -1;\r\n }\r\n\r\n let valueA = a[filed.key];\r\n let valueB = b[filed.key];\r\n\r\n if (!valueA || !valueB)\r\n return 0;\r\n\r\n if (filed.isNumber) {\r\n valueA = Number(valueA);\r\n valueB = Number(valueB);\r\n\r\n if (Number.isNaN(valueA) || Number.isNaN(valueB))\r\n return 0\r\n }\r\n\r\n return valueA > valueB ? dir : valueA < valueB ? -(dir) : 0;\r\n }).reduce((p, n) => p ? p : n, 0);\r\n\r\n if (sort.isDesc)\r\n data * -1;\r\n\r\n return data;\r\n };\r\n};","/**\r\n * 取得區間的數值\r\n * @param start 開始時間\r\n * @param stop 結束時間\r\n * @param step 間隔\r\n * @returns \r\n */\r\nexport function range(start: number, stop: number, step: number) {\r\n const range = { length: (stop - start) / step + 1 };\r\n\r\n return Array.from(range, (_, i) => start + (i * step));\r\n};","type CaseStyle = \"pascal\" | \"camel\" | \"snake\" | \"kebab\";\r\n\r\n/** 把各種命名(Pascal/camel/snake/kebab/混雜)拆成單字 tokens */\r\nfunction tokenize(input: string): string[] {\r\n if (!input) return [];\r\n\r\n // 先把 - 與 _ 轉成空白,再把其他非字母數字當分隔\r\n const normalized = input\r\n .replace(/[_-]+/g, \" \")\r\n .replace(/[^A-Za-z0-9 ]+/g, \" \")\r\n .trim();\r\n\r\n if (!normalized) return [];\r\n\r\n const roughParts = normalized.split(/\\s+/);\r\n\r\n const tokens: string[] = [];\r\n for (const part of roughParts) {\r\n // 在大小寫/數字邊界切開\r\n // 例: \"JSONDataAPI2\" -> [\"JSON\", \"Data\", \"API\", \"2\"]\r\n const sub = part.match(/[A-Z]+(?=[A-Z][a-z]|[0-9]|$)|[A-Z]?[a-z]+|[0-9]+/g);\r\n if (sub) tokens.push(...sub);\r\n }\r\n\r\n // 統一成小寫 tokens(組裝時再決定大小寫)\r\n return tokens.map((t) => t.toLowerCase());\r\n}\r\n\r\nfunction capitalize(s: string): string {\r\n return s ? s[0].toUpperCase() + s.slice(1) : s;\r\n}\r\n\r\n/** 主轉換函式:把 input 轉成指定命名風格 */\r\nexport function convertCase(input: string, to: CaseStyle): string {\r\n const tokens = tokenize(input);\r\n if (tokens.length === 0) return \"\";\r\n\r\n switch (to) {\r\n case \"snake\":\r\n return tokens.join(\"_\");\r\n case \"kebab\":\r\n return tokens.join(\"-\");\r\n case \"camel\":\r\n return tokens[0] + tokens.slice(1).map(capitalize).join(\"\");\r\n case \"pascal\":\r\n return tokens.map(capitalize).join(\"\");\r\n }\r\n}\r\n\r\n/** 也提供一次拿到全部格式 */\r\nexport function convertAllCases(input: string) {\r\n return {\r\n pascal: convertCase(input, \"pascal\"),\r\n camel: convertCase(input, \"camel\"),\r\n snake: convertCase(input, \"snake\"),\r\n kebab: convertCase(input, \"kebab\"),\r\n };\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aimidy/util",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -25,11 +25,12 @@
|
|
|
25
25
|
"author": "aimidy",
|
|
26
26
|
"license": "ISC",
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@types/jest": "^
|
|
29
|
-
"jest": "^
|
|
30
|
-
"
|
|
28
|
+
"@types/jest": "^30.0.0",
|
|
29
|
+
"jest": "^30.2.0",
|
|
30
|
+
"prettier": "^3.7.4",
|
|
31
|
+
"ts-jest": "^29.4.6",
|
|
31
32
|
"ts-node": "^10.9.2",
|
|
32
|
-
"tsup": "^8.5.
|
|
33
|
-
"typescript": "^5.
|
|
33
|
+
"tsup": "^8.5.1",
|
|
34
|
+
"typescript": "^5.9.3"
|
|
34
35
|
}
|
|
35
36
|
}
|