@aimidy/util 1.2.1 → 1.2.2
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 +60 -2
- package/dist/help/index.d.mts +10 -1
- package/dist/help/index.d.ts +10 -1
- package/dist/help/index.js +20 -0
- package/dist/help/index.js.map +1 -1
- package/dist/help/index.mjs +19 -0
- 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 +20 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -103,11 +103,11 @@ parameterMerge({ a: 1 }, { b: 2 }); // { a: 1, b: 2 }
|
|
|
103
103
|
|
|
104
104
|
#### `convertCase(input, to)`
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
將字串在不同命名風格間轉換,支持混合命名風格的拆解(如連續大寫字母、數字等)。
|
|
107
107
|
|
|
108
108
|
**參數:**
|
|
109
109
|
|
|
110
|
-
- `input`:
|
|
110
|
+
- `input`: 輸入字串(支持 PascalCase、camelCase、snake_case、kebab-case、混雜風格)
|
|
111
111
|
- `to`: 目標格式 (`'pascal'` | `'camel'` | `'snake'` | `'kebab'`)
|
|
112
112
|
|
|
113
113
|
**範例:**
|
|
@@ -116,6 +116,24 @@ parameterMerge({ a: 1 }, { b: 2 }); // { a: 1, b: 2 }
|
|
|
116
116
|
convertCase('user_name', 'camel'); // 'userName'
|
|
117
117
|
convertCase('UserName', 'snake'); // 'user_name'
|
|
118
118
|
convertCase('user-name', 'pascal'); // 'UserName'
|
|
119
|
+
convertCase('JSONDataAPI', 'camel'); // 'jsonDataApi'
|
|
120
|
+
convertCase('API2Version', 'snake'); // 'api_2_version'
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### `convertAllCases(input)`
|
|
124
|
+
|
|
125
|
+
一次轉換字串成所有四種命名風格。
|
|
126
|
+
|
|
127
|
+
**範例:**
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
convertAllCases('user_name');
|
|
131
|
+
// {
|
|
132
|
+
// pascal: 'UserName',
|
|
133
|
+
// camel: 'userName',
|
|
134
|
+
// snake: 'user_name',
|
|
135
|
+
// kebab: 'user-name'
|
|
136
|
+
// }
|
|
119
137
|
```
|
|
120
138
|
|
|
121
139
|
#### `strToHump(str)`
|
|
@@ -145,6 +163,46 @@ strToConvert('userName'); // 'user_name'
|
|
|
145
163
|
strToConvert('userName', '-'); // 'user-name'
|
|
146
164
|
```
|
|
147
165
|
|
|
166
|
+
#### `replacePathParams(str, data, prefix?)`
|
|
167
|
+
|
|
168
|
+
替換路徑中的參數佔位符,支持自定義前綴。
|
|
169
|
+
|
|
170
|
+
**參數:**
|
|
171
|
+
|
|
172
|
+
- `str`: 路徑字串
|
|
173
|
+
- `data`: 參數物件
|
|
174
|
+
- `prefix`: 佔位符前綴 (預設為 `':'`),支持 `'{}'`、`'$'`、`'#'`、`'@'` 等
|
|
175
|
+
|
|
176
|
+
**範例:**
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// 預設使用 : 前綴
|
|
180
|
+
replacePathParams('/abc/:id', { id: '1' }); // '/abc/1'
|
|
181
|
+
replacePathParams('/user/:userId/post/:postId', { userId: '123', postId: '456' });
|
|
182
|
+
// '/user/123/post/456'
|
|
183
|
+
|
|
184
|
+
// 使用 {} 包裹語法
|
|
185
|
+
replacePathParams('/abc/{id}', { id: '1' }, '{}'); // '/abc/1'
|
|
186
|
+
replacePathParams('/user/{userId}/post/{postId}', { userId: '123', postId: '456' }, '{}');
|
|
187
|
+
// '/user/123/post/456'
|
|
188
|
+
|
|
189
|
+
// 使用 $ 前綴
|
|
190
|
+
replacePathParams('/abc/$id', { id: '1' }, '$'); // '/abc/1'
|
|
191
|
+
|
|
192
|
+
// 使用 # 前綴
|
|
193
|
+
replacePathParams('/page/#pageNum', { pageNum: '5' }, '#'); // '/page/5'
|
|
194
|
+
|
|
195
|
+
// 使用 @ 前綴
|
|
196
|
+
replacePathParams('/user/@username', { username: 'john' }, '@'); // '/user/john'
|
|
197
|
+
|
|
198
|
+
// 參數不存在時保留原樣
|
|
199
|
+
replacePathParams('/abc/:id/:name', { id: '1' }); // '/abc/1/:name'
|
|
200
|
+
|
|
201
|
+
// 混合前綴不會互相干擾
|
|
202
|
+
replacePathParams('/api/:version/user/{id}', { version: 'v1', id: '123' }, ':');
|
|
203
|
+
// '/api/v1/user/{id}'
|
|
204
|
+
```
|
|
205
|
+
|
|
148
206
|
### 📋 陣列操作
|
|
149
207
|
|
|
150
208
|
#### `head<T>(arr)`
|
package/dist/help/index.d.mts
CHANGED
|
@@ -144,4 +144,13 @@ declare function convertAllCases(input: string): {
|
|
|
144
144
|
kebab: string;
|
|
145
145
|
};
|
|
146
146
|
|
|
147
|
-
|
|
147
|
+
/**
|
|
148
|
+
* 替換路徑中的參數佔位符
|
|
149
|
+
* @param str 路徑字串,例如 "/abc/:id" 或 "/abc/{id}"
|
|
150
|
+
* @param data 參數物件,例如 { id: "1" }
|
|
151
|
+
* @param prefix 佔位符前綴,預設為 ":",也可以使用 "{}" 或其他字符
|
|
152
|
+
* @returns 替換後的路徑字串
|
|
153
|
+
*/
|
|
154
|
+
declare function replacePathParams(str: string, data: Record<string, string | number>, prefix?: string): string;
|
|
155
|
+
|
|
156
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, replacePathParams, searchInStr, strToConvert, strToHump };
|
package/dist/help/index.d.ts
CHANGED
|
@@ -144,4 +144,13 @@ declare function convertAllCases(input: string): {
|
|
|
144
144
|
kebab: string;
|
|
145
145
|
};
|
|
146
146
|
|
|
147
|
-
|
|
147
|
+
/**
|
|
148
|
+
* 替換路徑中的參數佔位符
|
|
149
|
+
* @param str 路徑字串,例如 "/abc/:id" 或 "/abc/{id}"
|
|
150
|
+
* @param data 參數物件,例如 { id: "1" }
|
|
151
|
+
* @param prefix 佔位符前綴,預設為 ":",也可以使用 "{}" 或其他字符
|
|
152
|
+
* @returns 替換後的路徑字串
|
|
153
|
+
*/
|
|
154
|
+
declare function replacePathParams(str: string, data: Record<string, string | number>, prefix?: string): string;
|
|
155
|
+
|
|
156
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, replacePathParams, searchInStr, strToConvert, strToHump };
|
package/dist/help/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __export(help_exports, {
|
|
|
34
34
|
range: () => range,
|
|
35
35
|
recursiveDeepCopy: () => recursiveDeepCopy,
|
|
36
36
|
remove: () => remove,
|
|
37
|
+
replacePathParams: () => replacePathParams,
|
|
37
38
|
searchInStr: () => searchInStr,
|
|
38
39
|
strToConvert: () => strToConvert,
|
|
39
40
|
strToHump: () => strToHump
|
|
@@ -274,6 +275,24 @@ function convertAllCases(input) {
|
|
|
274
275
|
kebab: convertCase(input, "kebab")
|
|
275
276
|
};
|
|
276
277
|
}
|
|
278
|
+
|
|
279
|
+
// src/help/replacePathParams/replacePathParams.ts
|
|
280
|
+
function replacePathParams(str, data, prefix = ":") {
|
|
281
|
+
if (!str) return str;
|
|
282
|
+
if (!data || typeof data !== "object") return str;
|
|
283
|
+
if (prefix === "{}") {
|
|
284
|
+
return str.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, (match, paramName) => {
|
|
285
|
+
const value = data[paramName];
|
|
286
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
const escapedPrefix = prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
290
|
+
const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, "g");
|
|
291
|
+
return str.replace(regex, (match, paramName) => {
|
|
292
|
+
const value = data[paramName];
|
|
293
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
294
|
+
});
|
|
295
|
+
}
|
|
277
296
|
// Annotate the CommonJS export names for ESM import in node:
|
|
278
297
|
0 && (module.exports = {
|
|
279
298
|
convertAllCases,
|
|
@@ -290,6 +309,7 @@ function convertAllCases(input) {
|
|
|
290
309
|
range,
|
|
291
310
|
recursiveDeepCopy,
|
|
292
311
|
remove,
|
|
312
|
+
replacePathParams,
|
|
293
313
|
searchInStr,
|
|
294
314
|
strToConvert,
|
|
295
315
|
strToHump
|
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","../../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"]}
|
|
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","../../src/help/replacePathParams/replacePathParams.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\nexport * from './replacePathParams/replacePathParams';\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","/**\r\n * 替換路徑中的參數佔位符\r\n * @param str 路徑字串,例如 \"/abc/:id\" 或 \"/abc/{id}\"\r\n * @param data 參數物件,例如 { id: \"1\" }\r\n * @param prefix 佔位符前綴,預設為 \":\",也可以使用 \"{}\" 或其他字符\r\n * @returns 替換後的路徑字串\r\n */\r\nexport function replacePathParams(\r\n str: string,\r\n data: Record<string, string | number>,\r\n prefix: string = ':',\r\n): string {\r\n if (!str) return str;\r\n if (!data || typeof data !== 'object') return str;\r\n\r\n // 處理 {} 包裹的情況\r\n if (prefix === '{}') {\r\n return str.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n }\r\n\r\n // 處理其他前綴字符(如 :, $, # 等)\r\n const escapedPrefix = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, 'g');\r\n\r\n return str.replace(regex, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/dist/help/index.mjs
CHANGED
|
@@ -232,6 +232,24 @@ function convertAllCases(input) {
|
|
|
232
232
|
kebab: convertCase(input, "kebab")
|
|
233
233
|
};
|
|
234
234
|
}
|
|
235
|
+
|
|
236
|
+
// src/help/replacePathParams/replacePathParams.ts
|
|
237
|
+
function replacePathParams(str, data, prefix = ":") {
|
|
238
|
+
if (!str) return str;
|
|
239
|
+
if (!data || typeof data !== "object") return str;
|
|
240
|
+
if (prefix === "{}") {
|
|
241
|
+
return str.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, (match, paramName) => {
|
|
242
|
+
const value = data[paramName];
|
|
243
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
const escapedPrefix = prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
247
|
+
const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, "g");
|
|
248
|
+
return str.replace(regex, (match, paramName) => {
|
|
249
|
+
const value = data[paramName];
|
|
250
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
251
|
+
});
|
|
252
|
+
}
|
|
235
253
|
export {
|
|
236
254
|
convertAllCases,
|
|
237
255
|
convertCase,
|
|
@@ -247,6 +265,7 @@ export {
|
|
|
247
265
|
range,
|
|
248
266
|
recursiveDeepCopy,
|
|
249
267
|
remove,
|
|
268
|
+
replacePathParams,
|
|
250
269
|
searchInStr,
|
|
251
270
|
strToConvert,
|
|
252
271
|
strToHump
|
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","../../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"]}
|
|
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","../../src/help/replacePathParams/replacePathParams.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","/**\r\n * 替換路徑中的參數佔位符\r\n * @param str 路徑字串,例如 \"/abc/:id\" 或 \"/abc/{id}\"\r\n * @param data 參數物件,例如 { id: \"1\" }\r\n * @param prefix 佔位符前綴,預設為 \":\",也可以使用 \"{}\" 或其他字符\r\n * @returns 替換後的路徑字串\r\n */\r\nexport function replacePathParams(\r\n str: string,\r\n data: Record<string, string | number>,\r\n prefix: string = ':',\r\n): string {\r\n if (!str) return str;\r\n if (!data || typeof data !== 'object') return str;\r\n\r\n // 處理 {} 包裹的情況\r\n if (prefix === '{}') {\r\n return str.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n }\r\n\r\n // 處理其他前綴字符(如 :, $, # 等)\r\n const escapedPrefix = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, 'g');\r\n\r\n return str.replace(regex, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
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';
|
|
1
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, replacePathParams, searchInStr, strToConvert, strToHump } from './help/index.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
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';
|
|
1
|
+
export { convertAllCases, convertCase, data_get, data_set, deepAssign, deepCloneWithJson, emptyData, fieldSorter, gettype, head, parameterMerge, range, recursiveDeepCopy, remove, replacePathParams, searchInStr, strToConvert, strToHump } from './help/index.js';
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __export(index_exports, {
|
|
|
34
34
|
range: () => range,
|
|
35
35
|
recursiveDeepCopy: () => recursiveDeepCopy,
|
|
36
36
|
remove: () => remove,
|
|
37
|
+
replacePathParams: () => replacePathParams,
|
|
37
38
|
searchInStr: () => searchInStr,
|
|
38
39
|
strToConvert: () => strToConvert,
|
|
39
40
|
strToHump: () => strToHump
|
|
@@ -274,6 +275,24 @@ function convertAllCases(input) {
|
|
|
274
275
|
kebab: convertCase(input, "kebab")
|
|
275
276
|
};
|
|
276
277
|
}
|
|
278
|
+
|
|
279
|
+
// src/help/replacePathParams/replacePathParams.ts
|
|
280
|
+
function replacePathParams(str, data, prefix = ":") {
|
|
281
|
+
if (!str) return str;
|
|
282
|
+
if (!data || typeof data !== "object") return str;
|
|
283
|
+
if (prefix === "{}") {
|
|
284
|
+
return str.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, (match, paramName) => {
|
|
285
|
+
const value = data[paramName];
|
|
286
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
const escapedPrefix = prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
290
|
+
const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, "g");
|
|
291
|
+
return str.replace(regex, (match, paramName) => {
|
|
292
|
+
const value = data[paramName];
|
|
293
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
294
|
+
});
|
|
295
|
+
}
|
|
277
296
|
// Annotate the CommonJS export names for ESM import in node:
|
|
278
297
|
0 && (module.exports = {
|
|
279
298
|
convertAllCases,
|
|
@@ -290,6 +309,7 @@ function convertAllCases(input) {
|
|
|
290
309
|
range,
|
|
291
310
|
recursiveDeepCopy,
|
|
292
311
|
remove,
|
|
312
|
+
replacePathParams,
|
|
293
313
|
searchInStr,
|
|
294
314
|
strToConvert,
|
|
295
315
|
strToHump
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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","../src/help/replacePathParams/replacePathParams.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","/**\r\n * 替換路徑中的參數佔位符\r\n * @param str 路徑字串,例如 \"/abc/:id\" 或 \"/abc/{id}\"\r\n * @param data 參數物件,例如 { id: \"1\" }\r\n * @param prefix 佔位符前綴,預設為 \":\",也可以使用 \"{}\" 或其他字符\r\n * @returns 替換後的路徑字串\r\n */\r\nexport function replacePathParams(\r\n str: string,\r\n data: Record<string, string | number>,\r\n prefix: string = ':',\r\n): string {\r\n if (!str) return str;\r\n if (!data || typeof data !== 'object') return str;\r\n\r\n // 處理 {} 包裹的情況\r\n if (prefix === '{}') {\r\n return str.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n }\r\n\r\n // 處理其他前綴字符(如 :, $, # 等)\r\n const escapedPrefix = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, 'g');\r\n\r\n return str.replace(regex, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n}\r\n"],"mappings":"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","names":["range"]}
|
package/dist/index.mjs
CHANGED
|
@@ -232,6 +232,24 @@ function convertAllCases(input) {
|
|
|
232
232
|
kebab: convertCase(input, "kebab")
|
|
233
233
|
};
|
|
234
234
|
}
|
|
235
|
+
|
|
236
|
+
// src/help/replacePathParams/replacePathParams.ts
|
|
237
|
+
function replacePathParams(str, data, prefix = ":") {
|
|
238
|
+
if (!str) return str;
|
|
239
|
+
if (!data || typeof data !== "object") return str;
|
|
240
|
+
if (prefix === "{}") {
|
|
241
|
+
return str.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, (match, paramName) => {
|
|
242
|
+
const value = data[paramName];
|
|
243
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
const escapedPrefix = prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
247
|
+
const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, "g");
|
|
248
|
+
return str.replace(regex, (match, paramName) => {
|
|
249
|
+
const value = data[paramName];
|
|
250
|
+
return value !== void 0 && value !== null ? String(value) : match;
|
|
251
|
+
});
|
|
252
|
+
}
|
|
235
253
|
export {
|
|
236
254
|
convertAllCases,
|
|
237
255
|
convertCase,
|
|
@@ -247,6 +265,7 @@ export {
|
|
|
247
265
|
range,
|
|
248
266
|
recursiveDeepCopy,
|
|
249
267
|
remove,
|
|
268
|
+
replacePathParams,
|
|
250
269
|
searchInStr,
|
|
251
270
|
strToConvert,
|
|
252
271
|
strToHump
|
package/dist/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","../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"]}
|
|
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","../src/help/replacePathParams/replacePathParams.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","/**\r\n * 替換路徑中的參數佔位符\r\n * @param str 路徑字串,例如 \"/abc/:id\" 或 \"/abc/{id}\"\r\n * @param data 參數物件,例如 { id: \"1\" }\r\n * @param prefix 佔位符前綴,預設為 \":\",也可以使用 \"{}\" 或其他字符\r\n * @returns 替換後的路徑字串\r\n */\r\nexport function replacePathParams(\r\n str: string,\r\n data: Record<string, string | number>,\r\n prefix: string = ':',\r\n): string {\r\n if (!str) return str;\r\n if (!data || typeof data !== 'object') return str;\r\n\r\n // 處理 {} 包裹的情況\r\n if (prefix === '{}') {\r\n return str.replace(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\r\n });\r\n }\r\n\r\n // 處理其他前綴字符(如 :, $, # 等)\r\n const escapedPrefix = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`${escapedPrefix}([a-zA-Z_][a-zA-Z0-9_]*)`, 'g');\r\n\r\n return str.replace(regex, (match, paramName) => {\r\n const value = data[paramName];\r\n return value !== undefined && value !== null ? String(value) : match;\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.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -20,7 +20,13 @@
|
|
|
20
20
|
"keywords": [
|
|
21
21
|
"util",
|
|
22
22
|
"typescript",
|
|
23
|
-
"npm"
|
|
23
|
+
"npm",
|
|
24
|
+
"library",
|
|
25
|
+
"tool",
|
|
26
|
+
"helper",
|
|
27
|
+
"aimidy",
|
|
28
|
+
"front-end",
|
|
29
|
+
"backend"
|
|
24
30
|
],
|
|
25
31
|
"author": "aimidy",
|
|
26
32
|
"license": "ISC",
|