@zdepot/utils 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,206 +1,207 @@
1
- # @zdepot/utils
2
-
3
- 安全类型转换工具库,提供带兜底值的类型判断与转换方法,确保你的代码永远不会因类型问题而抛异常。
4
-
5
- ## 特性
6
-
7
- **类型安全** - 基于 `Object.prototype.toString` 的精确类型判断
8
- **兜底保护** - 所有转换方法都有默认兜底值,避免运行时错误
9
- ✅ **JSON 解析** - 智能 JSON 解析,自动判断类型
10
- **循环引用** - 安全的 JSON 序列化,自动处理循环引用和函数
11
- ✅ **TypeScript 支持** - 完整的 TypeScript 类型定义
12
- ✅ **Tree-shaking** - 无副作用,支持打包器优化
13
-
14
- ## 安装
15
-
16
- ```bash
17
- npm install @zdepot/utils
18
- ```
19
-
20
- ## 使用
21
-
22
- ```ts
23
- import safe from '@zdepot/utils'
24
-
25
- // 或按需引入
26
- import { safe } from '@zdepot/utils'
27
- ```
28
-
29
- ## API
30
-
31
- ### isSameType(a, b)
32
-
33
- 判断两个值是否为相同类型,基于 `Object.prototype.toString` 精确判断。
34
-
35
- ```ts
36
- safe.isSameType([], []) // true
37
- safe.isSameType({}, []) // false
38
- safe.isSameType(1, '1') // false
39
- ```
40
-
41
- ### array(value)
42
-
43
- 确保返回数组。如果输入是数组则直接返回;如果是 JSON 字符串则自动 parse;否则返回空数组 `[]`。
44
-
45
- ```ts
46
- safe.array([1, 2]) // [1, 2]
47
- safe.array('[1,2]') // [1, 2]
48
- safe.array('hello') // []
49
- safe.array(null) // []
50
- ```
51
-
52
- ### string(value, fallback?)
53
-
54
- 确保返回字符串。如果输入是字符串则直接返回,否则返回兜底值(默认 `""`)。
55
-
56
- ```ts
57
- safe.string('hello') // 'hello'
58
- safe.string(123) // ''
59
- safe.string(123, 'default') // 'default'
60
- ```
61
-
62
- ### number(value, fallback?)
63
-
64
- 确保返回数字。用 `Number()` 转换,如果结果为 NaN 或 Infinity 则返回兜底值(默认 `0`)。
65
-
66
- ```ts
67
- safe.number(123) // 123
68
- safe.number('456') // 456
69
- safe.number('abc') // 0
70
- safe.number('abc', -1) // -1
71
- safe.number(Infinity) // 0
72
- ```
73
-
74
- ### jsonParse(value, fallback)
75
-
76
- 带兜底值的 `JSON.parse`。解析失败或结果类型与兜底值不一致时返回兜底值。
77
-
78
- ```ts
79
- safe.jsonParse('{"a":1}', {}) // { a: 1 }
80
- safe.jsonParse('invalid', {}) // {}
81
- safe.jsonParse('"hello"', []) // [] (类型不匹配)
82
- safe.jsonParse(null, {}) // {}
83
- ```
84
-
85
- ### jsonParseObj(value, fallback)
86
-
87
- 增强版 `jsonParse`,只处理以 `[` 或 `{` 开头的字符串(对象/数组),否则直接返回兜底值。内置长度限制防止 DoS 攻击。
88
-
89
- ```ts
90
- safe.jsonParseObj('{"a":1}', {}) // { a: 1 }
91
- safe.jsonParseObj('[1,2]', []) // [1, 2]
92
- safe.jsonParseObj('"hello"', {}) // {} (不以 [ 或 { 开头)
93
- safe.jsonParseObj('invalid', {}) // {}
94
- ```
95
-
96
- ### split(value, splitStr)
97
-
98
- 安全的 `String.split`。空字符串返回 `[]` 避免 `['']`,异常也返回 `[]`。
99
-
100
- ```ts
101
- safe.split('a,b,c', ',') // ['a', 'b', 'c']
102
- safe.split('', ',') // []
103
- safe.split(null, ',') // []
104
- ```
105
-
106
- ### boolean(value, fallback?)
107
-
108
- 确保返回布尔值。支持 `true/false` 字符串(大小写不敏感)和 `0/1` 数字。
109
-
110
- ```ts
111
- safe.boolean(true) // true
112
- safe.boolean('TRUE') // true
113
- safe.boolean(1) // true
114
- safe.boolean('false') // false
115
- safe.boolean(0) // false
116
- safe.boolean('hello') // false (兜底值)
117
- ```
118
-
119
- ### date(value, fallback?)
120
-
121
- 确保返回日期对象。支持 Date 对象、时间戳和日期字符串。
122
-
123
- ```ts
124
- safe.date(new Date()) // 原样返回
125
- safe.date(1700000000000) // new Date(1700000000000)
126
- safe.date('2023-01-01') // new Date('2023-01-01')
127
- safe.date('invalid') // new Date() (当前时间)
128
- safe.date('invalid', fallback) // fallback
129
- ```
130
-
131
- ### function(value, fallback?)
132
-
133
- 确保返回函数。如果输入是函数则直接返回,否则返回兜底值(默认空函数)。
134
-
135
- ```ts
136
- safe.function(fn) // fn
137
- safe.function(null) // () => undefined
138
- safe.function(null, () => 'hi') // () => 'hi'
139
- ```
140
-
141
- ### nonEmptyString(value, fallback?)
142
-
143
- 确保返回非空字符串。如果是非空字符串则返回,否则返回兜底值。
144
-
145
- ```ts
146
- safe.nonEmptyString('hello') // 'hello'
147
- safe.nonEmptyString(' ') // '' (纯空白)
148
- safe.nonEmptyString('') // ''
149
- safe.nonEmptyString(123, 'N/A') // 'N/A'
150
- ```
151
-
152
- ### email(value, fallback?)
153
-
154
- 确保返回有效的 email 字符串。
155
-
156
- ```ts
157
- safe.email('user@example.com') // 'user@example.com'
158
- safe.email('invalid') // ''
159
- safe.email('bad', 'a@b.com') // 'a@b.com'
160
- ```
161
-
162
- ### timestamp(value, fallback?)
163
-
164
- 确保返回有效的时间戳。
165
-
166
- ```ts
167
- safe.timestamp(1700000000000) // 1700000000000
168
- safe.timestamp(new Date()) // date.getTime()
169
- safe.timestamp('2023-01-01') // 1672531200000
170
- safe.timestamp('invalid', 0) // 0
171
- ```
172
-
173
- ### jsonStringify(value, indent?)
174
-
175
- 安全的 JSON 序列化。自动处理循环引用和函数,避免抛异常。
176
-
177
- ```ts
178
- safe.jsonStringify({ a: 1 }) // '{"a":1}'
179
- safe.jsonStringify({ fn: () => {} }) // '{"fn":"[Function]"}'
180
-
181
- const obj: any = { name: 'test' }
182
- obj.self = obj
183
- safe.jsonStringify(obj) // '{"name":"test","self":"[Circular]"}'
184
- ```
185
-
186
- ## 使用场景
187
-
188
- ```ts
189
- // API 响应处理
190
- const data = safe.jsonParse(response.data, defaultValue)
191
- const items = safe.array(data.items)
192
-
193
- // 配置文件解析
194
- const config = safe.jsonParseObj(fs.readFileSync('config.json', 'utf-8'), {})
195
-
196
- // 用户输入处理
197
- const username = safe.string(input.username, 'guest')
198
- const age = safe.number(input.age, 0)
199
-
200
- // 字符串分割
201
- const parts = safe.split(input.tags, ',') // 避免 split(',a', ',') 得到 ['', 'a']
202
- ```
203
-
204
- ## License
205
-
206
- MIT
1
+ # @zdepot/utils
2
+
3
+ Safe type conversion tool library, which provides the method of type judgment and conversion with bottom value, to ensure that your code will not throw exceptions because of type problems.
4
+
5
+ ## Features
6
+
7
+ **Type Safety** - Accurate type detection based on `Object.prototype.toString`
8
+ **Fallback Protection** - All conversion methods have default fallback values to prevent runtime errors
9
+ ✅ **JSON Parsing** - Smart JSON parsing with automatic type detection
10
+ **Circular References** - Safe JSON serialization with automatic circular reference and function handling
11
+ ✅ **TypeScript Support** - Complete TypeScript type definitions
12
+ ✅ **Tree-shaking** - Side-effect free, compatible with bundler optimization
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @zdepot/utils
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ```ts
23
+ // 默认导入
24
+ import safe from '@zdepot/utils'
25
+
26
+ // 或命名导入
27
+ import { safe } from '@zdepot/utils'
28
+ ```
29
+
30
+ ## API
31
+
32
+ ### isSameType(a, b)
33
+
34
+ Checks if two values are of the same type, using `Object.prototype.toString` for precise detection.
35
+
36
+ ```ts
37
+ safe.isSameType([], []) // true
38
+ safe.isSameType({}, []) // false
39
+ safe.isSameType(1, '1') // false
40
+ ```
41
+
42
+ ### array(value)
43
+
44
+ Ensures an array is returned. Returns the input directly if it's an array; parses JSON strings automatically; otherwise returns an empty array `[]`.
45
+
46
+ ```ts
47
+ safe.array([1, 2]) // [1, 2]
48
+ safe.array('[1,2]') // [1, 2]
49
+ safe.array('hello') // []
50
+ safe.array(null) // []
51
+ ```
52
+
53
+ ### string(value, fallback?)
54
+
55
+ Ensures a string is returned. Returns the input directly if it's a string, otherwise returns the fallback value (default `""`).
56
+
57
+ ```ts
58
+ safe.string('hello') // 'hello'
59
+ safe.string(123) // ''
60
+ safe.string(123, 'default') // 'default'
61
+ ```
62
+
63
+ ### number(value, fallback?)
64
+
65
+ Ensures a number is returned. Uses `Number()` for conversion, returns fallback value (default `0`) if result is NaN or Infinity.
66
+
67
+ ```ts
68
+ safe.number(123) // 123
69
+ safe.number('456') // 456
70
+ safe.number('abc') // 0
71
+ safe.number('abc', -1) // -1
72
+ safe.number(Infinity) // 0
73
+ ```
74
+
75
+ ### jsonParse(value, fallback)
76
+
77
+ `JSON.parse` with fallback value. Returns fallback if parsing fails or result type doesn't match fallback type.
78
+
79
+ ```ts
80
+ safe.jsonParse('{"a":1}', {}) // { a: 1 }
81
+ safe.jsonParse('invalid', {}) // {}
82
+ safe.jsonParse('"hello"', []) // [] (type mismatch)
83
+ safe.jsonParse(null, {}) // {}
84
+ ```
85
+
86
+ ### jsonParseObj(value, fallback)
87
+
88
+ Enhanced `jsonParse` that only processes strings starting with `[` or `{` (objects/arrays), otherwise returns fallback directly. Built-in length limit prevents DoS attacks.
89
+
90
+ ```ts
91
+ safe.jsonParseObj('{"a":1}', {}) // { a: 1 }
92
+ safe.jsonParseObj('[1,2]', []) // [1, 2]
93
+ safe.jsonParseObj('"hello"', {}) // {} (doesn't start with [ or {)
94
+ safe.jsonParseObj('invalid', {}) // {}
95
+ ```
96
+
97
+ ### split(value, splitStr)
98
+
99
+ Safe `String.split`. Empty strings return `[]` instead of `['']`, errors also return `[]`.
100
+
101
+ ```ts
102
+ safe.split('a,b,c', ',') // ['a', 'b', 'c']
103
+ safe.split('', ',') // []
104
+ safe.split(null, ',') // []
105
+ ```
106
+
107
+ ### boolean(value, fallback?)
108
+
109
+ Ensures a boolean is returned. Supports `true/false` strings (case-insensitive) and `0/1` numbers.
110
+
111
+ ```ts
112
+ safe.boolean(true) // true
113
+ safe.boolean('TRUE') // true
114
+ safe.boolean(1) // true
115
+ safe.boolean('false') // false
116
+ safe.boolean(0) // false
117
+ safe.boolean('hello') // false (fallback value)
118
+ ```
119
+
120
+ ### date(value, fallback?)
121
+
122
+ Ensures a Date object is returned. Supports Date objects, timestamps, and date strings.
123
+
124
+ ```ts
125
+ safe.date(new Date()) // returns as-is
126
+ safe.date(1700000000000) // new Date(1700000000000)
127
+ safe.date('2023-01-01') // new Date('2023-01-01')
128
+ safe.date('invalid') // new Date() (current time)
129
+ safe.date('invalid', fallback) // fallback
130
+ ```
131
+
132
+ ### function(value, fallback?)
133
+
134
+ Ensures a function is returned. Returns the input directly if it's a function, otherwise returns the fallback value (default empty function).
135
+
136
+ ```ts
137
+ safe.function(fn) // fn
138
+ safe.function(null) // () => undefined
139
+ safe.function(null, () => 'hi') // () => 'hi'
140
+ ```
141
+
142
+ ### nonEmptyString(value, fallback?)
143
+
144
+ Ensures a non-empty string is returned. Returns the input if it's a non-empty string, otherwise returns the fallback value.
145
+
146
+ ```ts
147
+ safe.nonEmptyString('hello') // 'hello'
148
+ safe.nonEmptyString(' ') // '' (whitespace only)
149
+ safe.nonEmptyString('') // ''
150
+ safe.nonEmptyString(123, 'N/A') // 'N/A'
151
+ ```
152
+
153
+ ### email(value, fallback?)
154
+
155
+ Ensures a valid email string is returned.
156
+
157
+ ```ts
158
+ safe.email('user@example.com') // 'user@example.com'
159
+ safe.email('invalid') // ''
160
+ safe.email('bad', 'a@b.com') // 'a@b.com'
161
+ ```
162
+
163
+ ### timestamp(value, fallback?)
164
+
165
+ Ensures a valid timestamp is returned.
166
+
167
+ ```ts
168
+ safe.timestamp(1700000000000) // 1700000000000
169
+ safe.timestamp(new Date()) // date.getTime()
170
+ safe.timestamp('2023-01-01') // 1672531200000
171
+ safe.timestamp('invalid', 0) // 0
172
+ ```
173
+
174
+ ### jsonStringify(value, indent?)
175
+
176
+ Safe JSON serialization. Automatically handles circular references and functions without throwing.
177
+
178
+ ```ts
179
+ safe.jsonStringify({ a: 1 }) // '{"a":1}'
180
+ safe.jsonStringify({ fn: () => {} }) // '{"fn":"[Function]"}'
181
+
182
+ const obj: any = { name: 'test' }
183
+ obj.self = obj
184
+ safe.jsonStringify(obj) // '{"name":"test","self":"[Circular]"}'
185
+ ```
186
+
187
+ ## Use Cases
188
+
189
+ ```ts
190
+ // API response handling
191
+ const data = safe.jsonParse(response.data, defaultValue)
192
+ const items = safe.array(data.items)
193
+
194
+ // Config file parsing
195
+ const config = safe.jsonParseObj(fs.readFileSync('config.json', 'utf-8'), {})
196
+
197
+ // User input processing
198
+ const username = safe.string(input.username, 'guest')
199
+ const age = safe.number(input.age, 0)
200
+
201
+ // String splitting
202
+ const parts = safe.split(input.tags, ',') // avoids split(',a', ',') returning ['', 'a']
203
+ ```
204
+
205
+ ## License
206
+
207
+ MIT
package/dist/index.d.ts CHANGED
@@ -67,7 +67,7 @@ interface SafeUtils {
67
67
  * @param fallback 兜底值
68
68
  * @returns 函数
69
69
  */
70
- function: <T extends (...args: any[]) => any>(value: unknown, fallback?: T) => T;
70
+ function: <T extends (...args: unknown[]) => unknown>(value: unknown, fallback?: T) => T;
71
71
  /**
72
72
  * 确保返回非空字符串。如果是非空字符串则返回,否则返回兜底值。
73
73
  * @param value 输入值
@@ -96,6 +96,20 @@ interface SafeUtils {
96
96
  * @returns 序列化后的字符串
97
97
  */
98
98
  jsonStringify: (value: unknown, indent?: number) => string;
99
+ /**
100
+ * 确保返回正数。如果输入是正数则返回,否则返回兜底值(默认 1)。
101
+ * @param value 输入值
102
+ * @param fallback 兜底值
103
+ * @returns 正数或兜底值
104
+ */
105
+ positive: (value: unknown, fallback?: number) => number;
106
+ /**
107
+ * 确保返回有效的 URL 字符串。如果是有效 URL 则返回,否则返回兜底值(默认 "")。
108
+ * @param value 输入值
109
+ * @param fallback 兜底值
110
+ * @returns 有效的 URL 字符串
111
+ */
112
+ url: (value: unknown, fallback?: string) => string;
99
113
  }
100
114
 
101
115
  declare const safe: SafeUtils;
@@ -0,0 +1 @@
1
+ "use strict";var safeUtils=(()=>{var u=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var d=(n,t)=>{for(var r in t)u(n,r,{get:t[r],enumerable:!0})},N=(n,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of y(t))!m.call(n,e)&&e!==r&&u(n,e,{get:()=>t[e],enumerable:!(s=T(t,e))||s.enumerable});return n};var S=n=>N(u({},"__esModule",{value:!0}),n);var R={};d(R,{default:()=>P,safe:()=>w});var k=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,h=/^[\[{]/,x=()=>{},c=n=>Object.prototype.toString.call(n),o=(n,t)=>c(n)===c(t),f=(n,t)=>{if(n==null||typeof n!="string")return t;try{let r=JSON.parse(n);return o(r,t)?r:t}catch{return t}},D=(n,t)=>{if(typeof n!="string"||n.length>10485760||n.length<2||!h.test(n))return t;try{let r=JSON.parse(n);return o(r,t)?r:t}catch{return t}},O=n=>o(n,[])?n:o(n,"")?f(n,[]):[],i=(n,t="")=>typeof n=="string"?n:t,g=(n,t=0)=>{let r=Number(n);return Number.isFinite(r)?r:Number.isFinite(t)?t:0},E=(n,t)=>typeof n!="string"||n===""?[]:n.split(t),_=(n,t=!1)=>{if(n===!0||n===1)return!0;if(n===!1||n===0)return!1;let r=String(n).toLowerCase();return r==="true"?!0:r==="false"?!1:t},p=(n,t)=>{if(n instanceof Date)return n;if(typeof n=="number"||typeof n=="string"){let r=new Date(n);return isNaN(r.getTime())?t??new Date:r}return t??new Date},F=(n,t=x)=>typeof n=="function"?n:t,J=(n,t="")=>{let r=i(n,t);return r.trim()!==""?r:t},b=(n,t="")=>{let r=i(n,t);return k.test(r)?r:t},j=(n,t=Date.now())=>{let r=Number.isFinite(t)?t:Date.now();return p(n,new Date(r)).getTime()},a=(n,t)=>{let r=new WeakSet;try{return JSON.stringify(n,(s,e)=>{if(typeof e=="function")return"[Function]";if(typeof e=="object"&&e!==null){if(r.has(e))return"[Circular]";r.add(e)}return e},t)}catch{return"{}"}},L=(n,t=1)=>{let r=g(n,NaN);return r>0?r:t},M=(n,t="")=>{let r=i(n,t);try{let s=new URL(r);return s.protocol==="http:"||s.protocol==="https:"?r:t}catch{return t}},w={isSameType:o,array:O,string:i,number:g,jsonParse:f,jsonParseObj:D,split:E,boolean:_,date:p,function:F,nonEmptyString:J,email:b,timestamp:j,jsonStringify:a,positive:L,url:M},P=w;return S(R);})();
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var o=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var a=(e,n)=>{for(var t in n)o(e,t,{get:n[t],enumerable:!0})},p=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of g(n))!y.call(e,s)&&s!==t&&o(e,s,{get:()=>n[s],enumerable:!(r=c(n,s))||r.enumerable});return e};var T=e=>p(o({},"__esModule",{value:!0}),e);var d={};a(d,{default:()=>S,safe:()=>f});module.exports=T(d);var m=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,w=/^[\[{]/;function u(e){return Object.prototype.toString.call(e)}var f={isSameType:function(n,t){return u(n)===u(t)},array:function(n){return this.isSameType(n,[])?n:this.isSameType(n,"")?this.jsonParse(n,[]):[]},string:function(n,t=""){return typeof n=="string"?n:t??""},number:function(n,t=0){let r=Number(n);return Number.isFinite(r)?r:Number.isFinite(t)?t:0},jsonParse:function(n,t){if(n==null)return t;try{let r=JSON.parse(n);return this.isSameType(r,t)?r:t}catch{return t}},jsonParseObj:function(n,t){if(typeof n!="string"||n.length>10485760||n.length<2)return t;try{if(!w.test(n))throw new Error;let r=JSON.parse(n);return this.isSameType(r,t)?r:t}catch{return t}},split:function(n,t){if(typeof n!="string"||n==="")return[];try{return n.split(t)}catch{return[]}},boolean:function(n,t=!1){return n===!0||String(n).toLowerCase()==="true"||n===1?!0:n===!1||String(n).toLowerCase()==="false"||n===0?!1:t},date:function(n,t){let r=t??new Date;if(n instanceof Date)return n;if(typeof n=="number"||typeof n=="string"){let s=new Date(n);return isNaN(s.getTime())?r:s}return r},function:function(e,n=(()=>{})){return typeof e=="function"?e:n},nonEmptyString:function(n,t=""){let r=this.string(n,t);return r.trim()!==""?r:t},email:function(n,t=""){let r=this.string(n,t);return m.test(r)?r:t},timestamp:function(n,t=Date.now()){return this.date(n,new Date(t)).getTime()},jsonStringify:function(n,t){let r=new WeakSet;try{return JSON.stringify(n,(s,i)=>{if(typeof i=="function")return"[Function]";if(typeof i=="object"&&i!==null){if(r.has(i))return"[Circular]";r.add(i)}return i},t)}catch{return"{}"}}},S=f;0&&(module.exports={safe});
1
+ "use strict";var u=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var d=(n,t)=>{for(var r in t)u(n,r,{get:t[r],enumerable:!0})},N=(n,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of y(t))!m.call(n,e)&&e!==r&&u(n,e,{get:()=>t[e],enumerable:!(s=T(t,e))||s.enumerable});return n};var S=n=>N(u({},"__esModule",{value:!0}),n);var R={};d(R,{default:()=>P,safe:()=>w});module.exports=S(R);var k=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,h=/^[\[{]/,x=()=>{},c=n=>Object.prototype.toString.call(n),o=(n,t)=>c(n)===c(t),f=(n,t)=>{if(n==null||typeof n!="string")return t;try{let r=JSON.parse(n);return o(r,t)?r:t}catch{return t}},D=(n,t)=>{if(typeof n!="string"||n.length>10485760||n.length<2||!h.test(n))return t;try{let r=JSON.parse(n);return o(r,t)?r:t}catch{return t}},O=n=>o(n,[])?n:o(n,"")?f(n,[]):[],i=(n,t="")=>typeof n=="string"?n:t,g=(n,t=0)=>{let r=Number(n);return Number.isFinite(r)?r:Number.isFinite(t)?t:0},E=(n,t)=>typeof n!="string"||n===""?[]:n.split(t),_=(n,t=!1)=>{if(n===!0||n===1)return!0;if(n===!1||n===0)return!1;let r=String(n).toLowerCase();return r==="true"?!0:r==="false"?!1:t},p=(n,t)=>{if(n instanceof Date)return n;if(typeof n=="number"||typeof n=="string"){let r=new Date(n);return isNaN(r.getTime())?t??new Date:r}return t??new Date},F=(n,t=x)=>typeof n=="function"?n:t,J=(n,t="")=>{let r=i(n,t);return r.trim()!==""?r:t},b=(n,t="")=>{let r=i(n,t);return k.test(r)?r:t},j=(n,t=Date.now())=>{let r=Number.isFinite(t)?t:Date.now();return p(n,new Date(r)).getTime()},a=(n,t)=>{let r=new WeakSet;try{return JSON.stringify(n,(s,e)=>{if(typeof e=="function")return"[Function]";if(typeof e=="object"&&e!==null){if(r.has(e))return"[Circular]";r.add(e)}return e},t)}catch{return"{}"}},L=(n,t=1)=>{let r=g(n,NaN);return r>0?r:t},M=(n,t="")=>{let r=i(n,t);try{let s=new URL(r);return s.protocol==="http:"||s.protocol==="https:"?r:t}catch{return t}},w={isSameType:o,array:O,string:i,number:g,jsonParse:f,jsonParseObj:D,split:E,boolean:_,date:p,function:F,nonEmptyString:J,email:b,timestamp:j,jsonStringify:a,positive:L,url:M},P=w;0&&(module.exports={safe});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var u=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,f=/^[\[{]/;function o(e){return Object.prototype.toString.call(e)}var c={isSameType:function(n,t){return o(n)===o(t)},array:function(n){return this.isSameType(n,[])?n:this.isSameType(n,"")?this.jsonParse(n,[]):[]},string:function(n,t=""){return typeof n=="string"?n:t??""},number:function(n,t=0){let r=Number(n);return Number.isFinite(r)?r:Number.isFinite(t)?t:0},jsonParse:function(n,t){if(n==null)return t;try{let r=JSON.parse(n);return this.isSameType(r,t)?r:t}catch{return t}},jsonParseObj:function(n,t){if(typeof n!="string"||n.length>10485760||n.length<2)return t;try{if(!f.test(n))throw new Error;let r=JSON.parse(n);return this.isSameType(r,t)?r:t}catch{return t}},split:function(n,t){if(typeof n!="string"||n==="")return[];try{return n.split(t)}catch{return[]}},boolean:function(n,t=!1){return n===!0||String(n).toLowerCase()==="true"||n===1?!0:n===!1||String(n).toLowerCase()==="false"||n===0?!1:t},date:function(n,t){let r=t??new Date;if(n instanceof Date)return n;if(typeof n=="number"||typeof n=="string"){let i=new Date(n);return isNaN(i.getTime())?r:i}return r},function:function(e,n=(()=>{})){return typeof e=="function"?e:n},nonEmptyString:function(n,t=""){let r=this.string(n,t);return r.trim()!==""?r:t},email:function(n,t=""){let r=this.string(n,t);return u.test(r)?r:t},timestamp:function(n,t=Date.now()){return this.date(n,new Date(t)).getTime()},jsonStringify:function(n,t){let r=new WeakSet;try{return JSON.stringify(n,(i,s)=>{if(typeof s=="function")return"[Function]";if(typeof s=="object"&&s!==null){if(r.has(s))return"[Circular]";r.add(s)}return s},t)}catch{return"{}"}}},g=c;export{g as default,c as safe};
1
+ var p=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,w=/^[\[{]/,T=()=>{},u=n=>Object.prototype.toString.call(n),s=(n,t)=>u(n)===u(t),c=(n,t)=>{if(n==null||typeof n!="string")return t;try{let r=JSON.parse(n);return s(r,t)?r:t}catch{return t}},y=(n,t)=>{if(typeof n!="string"||n.length>10485760||n.length<2||!w.test(n))return t;try{let r=JSON.parse(n);return s(r,t)?r:t}catch{return t}},m=n=>s(n,[])?n:s(n,"")?c(n,[]):[],i=(n,t="")=>typeof n=="string"?n:t,f=(n,t=0)=>{let r=Number(n);return Number.isFinite(r)?r:Number.isFinite(t)?t:0},d=(n,t)=>typeof n!="string"||n===""?[]:n.split(t),N=(n,t=!1)=>{if(n===!0||n===1)return!0;if(n===!1||n===0)return!1;let r=String(n).toLowerCase();return r==="true"?!0:r==="false"?!1:t},g=(n,t)=>{if(n instanceof Date)return n;if(typeof n=="number"||typeof n=="string"){let r=new Date(n);return isNaN(r.getTime())?t??new Date:r}return t??new Date},S=(n,t=T)=>typeof n=="function"?n:t,k=(n,t="")=>{let r=i(n,t);return r.trim()!==""?r:t},h=(n,t="")=>{let r=i(n,t);return p.test(r)?r:t},x=(n,t=Date.now())=>{let r=Number.isFinite(t)?t:Date.now();return g(n,new Date(r)).getTime()},D=(n,t)=>{let r=new WeakSet;try{return JSON.stringify(n,(o,e)=>{if(typeof e=="function")return"[Function]";if(typeof e=="object"&&e!==null){if(r.has(e))return"[Circular]";r.add(e)}return e},t)}catch{return"{}"}},O=(n,t=1)=>{let r=f(n,NaN);return r>0?r:t},E=(n,t="")=>{let r=i(n,t);try{let o=new URL(r);return o.protocol==="http:"||o.protocol==="https:"?r:t}catch{return t}},_={isSameType:s,array:m,string:i,number:f,jsonParse:c,jsonParseObj:y,split:d,boolean:N,date:g,function:S,nonEmptyString:k,email:h,timestamp:x,jsonStringify:D,positive:O,url:E},F=_;export{F as default,_ as safe};
package/package.json CHANGED
@@ -1,64 +1,67 @@
1
- {
2
- "name": "@zdepot/utils",
3
- "version": "1.0.2",
4
- "description": "安全类型转换工具库,提供带兜底值的类型判断与转换方法",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.mjs",
12
- "require": "./dist/index.js"
13
- }
14
- },
15
- "files": [
16
- "dist"
17
- ],
18
- "sideEffects": false,
19
- "publishConfig": {
20
- "access": "public"
21
- },
22
- "scripts": {
23
- "build": "tsup --config tsup.config.ts && node scripts/clean-dmts.js",
24
- "prepublishOnly": "npm run build",
25
- "test": "vitest",
26
- "test:coverage": "vitest run --coverage",
27
- "test:coverage:report": "vitest run --coverage --reporter=text --reporter=html",
28
- "lint": "eslint src --ext .ts",
29
- "lint:fix": "eslint src --ext .ts --fix",
30
- "format": "prettier --write src/**/*.ts"
31
- },
32
- "keywords": [
33
- "utils",
34
- "safe",
35
- "type-check",
36
- "fallback",
37
- "json-parse",
38
- "type-conversion",
39
- "typescript",
40
- "ts"
41
- ],
42
- "author": "dalongzhu",
43
- "license": "MIT",
44
- "repository": {
45
- "type": "git",
46
- "url": "https://github.com/dalongzhu/z-tools.git",
47
- "directory": ""
48
- },
49
- "devDependencies": {
50
- "@types/node": "^20.0.0",
51
- "@typescript-eslint/eslint-plugin": "^6.0.0",
52
- "@typescript-eslint/parser": "^6.0.0",
53
- "@vitest/coverage-v8": "^1.0.0",
54
- "eslint": "^8.0.0",
55
- "jsdom": "^29.1.1",
56
- "prettier": "^3.0.0",
57
- "tsup": "^8.0.0",
58
- "typescript": "^5.4.0",
59
- "vitest": "^1.0.0"
60
- },
61
- "engines": {
62
- "node": ">=14.0.0"
63
- }
64
- }
1
+ {
2
+ "name": "@zdepot/utils",
3
+ "version": "1.2.0",
4
+ "description": "Safety Type Conversion Utility Library, providing type judgment and conversion methods with fallback values",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "browser": "dist/index.global.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "browser": "./dist/index.global.js",
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.mjs",
14
+ "require": "./dist/index.js",
15
+ "default": "./dist/index.mjs"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "sideEffects": false,
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "build": "tsup --config tsup.config.ts && node scripts/clean-dmts.js",
27
+ "prepublishOnly": "npm run build",
28
+ "test": "vitest",
29
+ "test:coverage": "vitest run --coverage",
30
+ "test:coverage:report": "vitest run --coverage --reporter=text --reporter=html",
31
+ "lint": "eslint src --ext .ts",
32
+ "lint:fix": "eslint src --ext .ts --fix",
33
+ "format": "prettier --write src/**/*.ts"
34
+ },
35
+ "keywords": [
36
+ "utils",
37
+ "safe",
38
+ "type-check",
39
+ "fallback",
40
+ "json-parse",
41
+ "type-conversion",
42
+ "typescript",
43
+ "ts"
44
+ ],
45
+ "author": "dalongzhu",
46
+ "license": "MIT",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "",
50
+ "directory": ""
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^20.0.0",
54
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
55
+ "@typescript-eslint/parser": "^6.0.0",
56
+ "@vitest/coverage-v8": "^1.0.0",
57
+ "eslint": "^8.0.0",
58
+ "jsdom": "^29.1.1",
59
+ "prettier": "^3.0.0",
60
+ "tsup": "^8.0.0",
61
+ "typescript": "^5.4.0",
62
+ "vitest": "^1.0.0"
63
+ },
64
+ "engines": {
65
+ "node": ">=14.0.0"
66
+ }
67
+ }