@planarcat/js-toolkit 1.0.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/dist/date/formatDate.d.ts +41 -0
- package/dist/date/formatDate.d.ts.map +1 -0
- package/dist/date/formatDate.js +165 -0
- package/dist/date/formatDate.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/types/date.d.ts +38 -0
- package/dist/types/date.d.ts.map +1 -0
- package/dist/types/date.js +3 -0
- package/dist/types/date.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/constants.d.ts +14 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +20 -0
- package/dist/utils/constants.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DateInput, DateFormatOptions } from '../types/date';
|
|
2
|
+
/**
|
|
3
|
+
* 格式化日期对象
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { formatDate } from '@planarcat/js-toolkit';
|
|
8
|
+
*
|
|
9
|
+
* // 基本使用
|
|
10
|
+
* formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss');
|
|
11
|
+
* // 返回: "2023-12-25 14:30:45"
|
|
12
|
+
*
|
|
13
|
+
* // 自定义格式
|
|
14
|
+
* formatDate('2023-12-25', 'YYYY年MM月DD日');
|
|
15
|
+
* // 返回: "2023年12月25日"
|
|
16
|
+
*
|
|
17
|
+
* // 显示周几
|
|
18
|
+
* formatDate(new Date(), 'HH:mm', { showWeekday: true });
|
|
19
|
+
* // 返回: "周一 14:30"
|
|
20
|
+
*
|
|
21
|
+
* // 英文环境
|
|
22
|
+
* formatDate(new Date(), 'dd', { locale: 'en-US' });
|
|
23
|
+
* // 返回: "Mon"
|
|
24
|
+
*
|
|
25
|
+
* // 自定义格式化器
|
|
26
|
+
* formatDate(new Date(), '第Q季度', {
|
|
27
|
+
* customFormatters: {
|
|
28
|
+
* '第Q季度': (date) => `第${Math.floor((date.getMonth() + 3) / 3)}季度`
|
|
29
|
+
* }
|
|
30
|
+
* });
|
|
31
|
+
* // 返回: "第4季度"
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @param input - 要格式化的日期输入,可以是 Date 对象、时间戳、日期字符串
|
|
35
|
+
* @param formatStr - 格式化字符串,支持 YYYY-MM-DD HH:mm:ss 等标记
|
|
36
|
+
* @param options - 格式化选项
|
|
37
|
+
* @returns 格式化后的日期字符串
|
|
38
|
+
*/
|
|
39
|
+
declare function formatDate(input: DateInput, formatStr?: string, options?: Partial<DateFormatOptions>): string;
|
|
40
|
+
export default formatDate;
|
|
41
|
+
//# sourceMappingURL=formatDate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatDate.d.ts","sourceRoot":"","sources":["../../src/date/formatDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA2D7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,iBAAS,UAAU,CACjB,KAAK,EAAE,SAAS,EAChB,SAAS,GAAE,MAA8B,EACzC,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACvC,MAAM,CAwFR;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const constants_1 = require("../utils/constants");
|
|
4
|
+
/**
|
|
5
|
+
* 将各种输入类型安全地转换为 Date 对象
|
|
6
|
+
* @param input - 日期输入
|
|
7
|
+
* @returns 转换后的 Date 对象,无效输入返回当前时间
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
function safeParseDate(input) {
|
|
11
|
+
if (input instanceof Date && !isNaN(input.getTime())) {
|
|
12
|
+
return input;
|
|
13
|
+
}
|
|
14
|
+
if (typeof input === 'string' || typeof input === 'number') {
|
|
15
|
+
const date = new Date(input);
|
|
16
|
+
if (!isNaN(date.getTime())) {
|
|
17
|
+
return date;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// 无效输入返回当前时间
|
|
21
|
+
console.warn(`Invalid date input: ${input}, using current date instead.`);
|
|
22
|
+
return new Date();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 计算一年中的第几周 (ISO 8601)
|
|
26
|
+
* @param date - 日期对象
|
|
27
|
+
* @returns 周数
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
function getWeekNumber(date) {
|
|
31
|
+
const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
|
|
32
|
+
const dayNum = d.getUTCDay() || 7;
|
|
33
|
+
d.setUTCDate(d.getUTCDate() + 4 - dayNum);
|
|
34
|
+
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
35
|
+
return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 获取本地化的星期几
|
|
39
|
+
* @param weekday - 星期几 (0-6)
|
|
40
|
+
* @param options - 格式化选项
|
|
41
|
+
* @returns 本地化的星期几字符串
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
function getLocalizedWeekday(weekday, options) {
|
|
45
|
+
const lang = options.locale?.split('-')[0] || 'zh';
|
|
46
|
+
return constants_1.WEEKDAY_MAP[lang]?.[weekday]
|
|
47
|
+
|| constants_1.WEEKDAY_MAP.zh[weekday];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 格式化日期对象
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* import { formatDate } from '@planarcat/js-toolkit';
|
|
55
|
+
*
|
|
56
|
+
* // 基本使用
|
|
57
|
+
* formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss');
|
|
58
|
+
* // 返回: "2023-12-25 14:30:45"
|
|
59
|
+
*
|
|
60
|
+
* // 自定义格式
|
|
61
|
+
* formatDate('2023-12-25', 'YYYY年MM月DD日');
|
|
62
|
+
* // 返回: "2023年12月25日"
|
|
63
|
+
*
|
|
64
|
+
* // 显示周几
|
|
65
|
+
* formatDate(new Date(), 'HH:mm', { showWeekday: true });
|
|
66
|
+
* // 返回: "周一 14:30"
|
|
67
|
+
*
|
|
68
|
+
* // 英文环境
|
|
69
|
+
* formatDate(new Date(), 'dd', { locale: 'en-US' });
|
|
70
|
+
* // 返回: "Mon"
|
|
71
|
+
*
|
|
72
|
+
* // 自定义格式化器
|
|
73
|
+
* formatDate(new Date(), '第Q季度', {
|
|
74
|
+
* customFormatters: {
|
|
75
|
+
* '第Q季度': (date) => `第${Math.floor((date.getMonth() + 3) / 3)}季度`
|
|
76
|
+
* }
|
|
77
|
+
* });
|
|
78
|
+
* // 返回: "第4季度"
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* @param input - 要格式化的日期输入,可以是 Date 对象、时间戳、日期字符串
|
|
82
|
+
* @param formatStr - 格式化字符串,支持 YYYY-MM-DD HH:mm:ss 等标记
|
|
83
|
+
* @param options - 格式化选项
|
|
84
|
+
* @returns 格式化后的日期字符串
|
|
85
|
+
*/
|
|
86
|
+
function formatDate(input, formatStr = 'YYYY-MM-DD HH:mm:ss', options = {}) {
|
|
87
|
+
const date = safeParseDate(input);
|
|
88
|
+
const mergedOptions = { ...constants_1.DEFAULT_DATE_FORMAT_OPTIONS, ...options };
|
|
89
|
+
// 获取日期各部分
|
|
90
|
+
const year = date.getFullYear();
|
|
91
|
+
const month = date.getMonth() + 1;
|
|
92
|
+
const day = date.getDate();
|
|
93
|
+
const hours = date.getHours();
|
|
94
|
+
const minutes = date.getMinutes();
|
|
95
|
+
const seconds = date.getSeconds();
|
|
96
|
+
const milliseconds = date.getMilliseconds();
|
|
97
|
+
const weekday = date.getDay();
|
|
98
|
+
const quarter = Math.floor((date.getMonth() + 3) / 3);
|
|
99
|
+
const weekNumber = getWeekNumber(date);
|
|
100
|
+
// 12小时制
|
|
101
|
+
const hours12 = hours % 12 || 12;
|
|
102
|
+
const ampm = hours < 12 ? 'AM' : 'PM';
|
|
103
|
+
const ampmLower = ampm.toLowerCase();
|
|
104
|
+
// 1. 首先处理完整的单词标记(如 timestamp)
|
|
105
|
+
let result = formatStr;
|
|
106
|
+
// 优先替换 timestamp,避免被拆解
|
|
107
|
+
if (result.includes('timestamp')) {
|
|
108
|
+
result = result.replace(/timestamp/g, date.getTime().toString());
|
|
109
|
+
}
|
|
110
|
+
// 2. 应用自定义格式化器(优先级最高)
|
|
111
|
+
if (mergedOptions.customFormatters) {
|
|
112
|
+
Object.entries(mergedOptions.customFormatters).forEach(([token, formatter]) => {
|
|
113
|
+
const escapedToken = token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
114
|
+
const regex = new RegExp(`(?<![a-zA-Z0-9])${escapedToken}(?![a-zA-Z0-9])`, 'g');
|
|
115
|
+
result = result.replace(regex, formatter(date));
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// 3. 替换多字符标记(2-4个字符)
|
|
119
|
+
const multiCharReplacements = {
|
|
120
|
+
'YYYY': year.toString().padStart(4, '0'),
|
|
121
|
+
'YY': year.toString().slice(-2),
|
|
122
|
+
'MM': month.toString().padStart(2, '0'),
|
|
123
|
+
'DD': day.toString().padStart(2, '0'),
|
|
124
|
+
'HH': hours.toString().padStart(2, '0'),
|
|
125
|
+
'hh': hours12.toString().padStart(2, '0'),
|
|
126
|
+
'mm': minutes.toString().padStart(2, '0'),
|
|
127
|
+
'ss': seconds.toString().padStart(2, '0'),
|
|
128
|
+
'SSS': milliseconds.toString().padStart(3, '0'),
|
|
129
|
+
'WW': weekNumber.toString().padStart(2, '0'),
|
|
130
|
+
'dd': getLocalizedWeekday(weekday, mergedOptions),
|
|
131
|
+
};
|
|
132
|
+
Object.entries(multiCharReplacements).forEach(([token, value]) => {
|
|
133
|
+
// 使用单词边界或字符串边界来确保精确匹配
|
|
134
|
+
const regex = new RegExp(`\\b${token}\\b|${token}(?![a-zA-Z0-9])`, 'g');
|
|
135
|
+
result = result.replace(regex, value);
|
|
136
|
+
});
|
|
137
|
+
// 4. 替换单字符标记(使用更精确的匹配)
|
|
138
|
+
const singleCharReplacements = {
|
|
139
|
+
'Y': year.toString(),
|
|
140
|
+
'M': month.toString(),
|
|
141
|
+
'D': day.toString(),
|
|
142
|
+
'H': hours.toString(),
|
|
143
|
+
'h': hours12.toString(),
|
|
144
|
+
'm': minutes.toString(),
|
|
145
|
+
's': seconds.toString(),
|
|
146
|
+
'W': weekNumber.toString(),
|
|
147
|
+
'd': weekday.toString(),
|
|
148
|
+
'Q': quarter.toString(),
|
|
149
|
+
'A': ampm,
|
|
150
|
+
'a': ampmLower,
|
|
151
|
+
};
|
|
152
|
+
Object.entries(singleCharReplacements).forEach(([token, value]) => {
|
|
153
|
+
// 单字符需要更精确的匹配:前面是边界或特定字符,后面不是相同字符
|
|
154
|
+
const regex = new RegExp(`(?<![a-zA-Z0-9])${token}(?![a-zA-Z0-9])`, 'g');
|
|
155
|
+
result = result.replace(regex, value);
|
|
156
|
+
});
|
|
157
|
+
// 添加周几前缀
|
|
158
|
+
if (mergedOptions.showWeekday) {
|
|
159
|
+
const weekdayStr = getLocalizedWeekday(weekday, mergedOptions);
|
|
160
|
+
result = `${mergedOptions.weekdayFormat}${weekdayStr} ${result}`;
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
exports.default = formatDate;
|
|
165
|
+
//# sourceMappingURL=formatDate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatDate.js","sourceRoot":"","sources":["../../src/date/formatDate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @planarcat/js-toolkit - 现代化的 JavaScript/TypeScript 工具库
|
|
3
|
+
*
|
|
4
|
+
* @module @planarcat/js-toolkit
|
|
5
|
+
*/
|
|
6
|
+
export { default as formatDate } from './date/formatDate';
|
|
7
|
+
export type { DateFormatOptions, DateInput } from './types/date';
|
|
8
|
+
export declare const VERSION = "__VERSION__";
|
|
9
|
+
export declare const LIBRARY_NAME = "@planarcat/js-toolkit";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGjE,eAAO,MAAM,OAAO,gBAAgB,CAAC;AACrC,eAAO,MAAM,YAAY,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @planarcat/js-toolkit - 现代化的 JavaScript/TypeScript 工具库
|
|
4
|
+
*
|
|
5
|
+
* @module @planarcat/js-toolkit
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.LIBRARY_NAME = exports.VERSION = exports.formatDate = void 0;
|
|
12
|
+
// 日期相关工具
|
|
13
|
+
var formatDate_1 = require("./date/formatDate");
|
|
14
|
+
Object.defineProperty(exports, "formatDate", { enumerable: true, get: function () { return __importDefault(formatDate_1).default; } });
|
|
15
|
+
// 工具库元数据
|
|
16
|
+
exports.VERSION = '__VERSION__'; // 构建时替换
|
|
17
|
+
exports.LIBRARY_NAME = '@planarcat/js-toolkit';
|
|
18
|
+
// 工具函数(后续添加)
|
|
19
|
+
// export { default as toNumber } from './number/toNumber';
|
|
20
|
+
// export { default as debounce } from './function/debounce';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,SAAS;AACT,gDAA0D;AAAjD,yHAAA,OAAO,OAAc;AAG9B,SAAS;AACI,QAAA,OAAO,GAAG,aAAa,CAAC,CAAC,QAAQ;AACjC,QAAA,YAAY,GAAG,uBAAuB,CAAC;AAEpD,aAAa;AACb,2DAA2D;AAC3D,6DAA6D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日期格式化选项接口
|
|
3
|
+
*/
|
|
4
|
+
export interface DateFormatOptions {
|
|
5
|
+
/**
|
|
6
|
+
* 时区设置
|
|
7
|
+
* @default 'local'
|
|
8
|
+
*/
|
|
9
|
+
timeZone?: 'local' | 'utc';
|
|
10
|
+
/**
|
|
11
|
+
* 语言环境
|
|
12
|
+
* @default 'zh-CN'
|
|
13
|
+
*/
|
|
14
|
+
locale?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 是否显示周几
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
showWeekday?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 自定义周几显示格式
|
|
22
|
+
* @default '周'
|
|
23
|
+
*/
|
|
24
|
+
weekdayFormat?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 自定义格式化处理器
|
|
27
|
+
*/
|
|
28
|
+
customFormatters?: Record<string, (date: Date) => string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 支持的格式化标记
|
|
32
|
+
*/
|
|
33
|
+
export type DateFormatToken = 'YYYY' | 'YY' | 'MM' | 'M' | 'DD' | 'D' | 'HH' | 'H' | 'hh' | 'h' | 'mm' | 'm' | 'ss' | 's' | 'SSS' | 'A' | 'a' | 'd' | 'dd' | 'WW' | 'W' | 'Q' | 'timestamp';
|
|
34
|
+
/**
|
|
35
|
+
* 可接受的日期输入类型
|
|
36
|
+
*/
|
|
37
|
+
export type DateInput = Date | string | number | null | undefined;
|
|
38
|
+
//# sourceMappingURL=date.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/types/date.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GAAG,IAAI,GACb,IAAI,GAAG,GAAG,GACV,IAAI,GAAG,GAAG,GACV,IAAI,GAAG,GAAG,GACV,IAAI,GAAG,GAAG,GACV,IAAI,GAAG,GAAG,GACV,IAAI,GAAG,GAAG,GACV,KAAK,GACL,GAAG,GAAG,GAAG,GACT,GAAG,GACH,IAAI,GACJ,IAAI,GAAG,GAAG,GACV,GAAG,GACH,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,IAAI,GACJ,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/types/date.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// 导出所有类型
|
|
18
|
+
__exportStar(require("./date"), exports);
|
|
19
|
+
// 后续添加更多类型
|
|
20
|
+
// export * from './number';
|
|
21
|
+
// export * from './function';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS;AACT,yCAAuB;AACvB,WAAW;AACX,4BAA4B;AAC5B,8BAA8B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 默认格式化选项
|
|
3
|
+
*/
|
|
4
|
+
export declare const DEFAULT_DATE_FORMAT_OPTIONS: {
|
|
5
|
+
timeZone: "local";
|
|
6
|
+
locale: string;
|
|
7
|
+
showWeekday: boolean;
|
|
8
|
+
weekdayFormat: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 周几中英文映射
|
|
12
|
+
*/
|
|
13
|
+
export declare const WEEKDAY_MAP: Record<string, string[]>;
|
|
14
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;CAKvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAGhD,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WEEKDAY_MAP = exports.DEFAULT_DATE_FORMAT_OPTIONS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 默认格式化选项
|
|
6
|
+
*/
|
|
7
|
+
exports.DEFAULT_DATE_FORMAT_OPTIONS = {
|
|
8
|
+
timeZone: 'local',
|
|
9
|
+
locale: 'zh-CN',
|
|
10
|
+
showWeekday: false,
|
|
11
|
+
weekdayFormat: '周',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* 周几中英文映射
|
|
15
|
+
*/
|
|
16
|
+
exports.WEEKDAY_MAP = {
|
|
17
|
+
zh: ['日', '一', '二', '三', '四', '五', '六'],
|
|
18
|
+
en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,2BAA2B,GAAG;IACzC,QAAQ,EAAE,OAAgB;IAC1B,MAAM,EAAE,OAAO;IACf,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,GAAG;CACnB,CAAC;AAEF;;GAEG;AACU,QAAA,WAAW,GAA6B;IACnD,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACvC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;CACtD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@planarcat/js-toolkit",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "一个自用的带学习性质的(目前)现代化的 JavaScript/TypeScript 实用工具库,提供类型安全、高性能的常用函数,包括对象转换、日期处理、函数优化等开发常用工具。",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"build:watch": "tsc --watch",
|
|
15
|
+
"test": "jest",
|
|
16
|
+
"test:watch": "jest --watch",
|
|
17
|
+
"test:coverage": "jest --coverage",
|
|
18
|
+
"lint": "eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"",
|
|
19
|
+
"lint:fix": "eslint \"src/**/*.ts\" \"__tests__/**/*.ts\" --fix",
|
|
20
|
+
"format": "prettier --write \"src/**/*.ts\" \"__tests__/**/*.ts\"",
|
|
21
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"__tests__/**/*.ts\"",
|
|
22
|
+
"prepare": "husky",
|
|
23
|
+
"prepublishOnly": "npm run lint && npm test && npm run build",
|
|
24
|
+
"clean": "rimraf dist coverage"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"javascript",
|
|
28
|
+
"typescript",
|
|
29
|
+
"utility",
|
|
30
|
+
"toolkit",
|
|
31
|
+
"format-date",
|
|
32
|
+
"type-safe"
|
|
33
|
+
],
|
|
34
|
+
"author": "planarcat",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/planarcat/js-toolkit.git"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/planarcat/js-toolkit/issues"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/planarcat/js-toolkit#readme",
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/jest": "^29.5.14",
|
|
46
|
+
"@types/node": "^25.0.7",
|
|
47
|
+
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
48
|
+
"@typescript-eslint/parser": "^6.21.0",
|
|
49
|
+
"eslint": "^8.57.1",
|
|
50
|
+
"eslint-config-prettier": "^9.1.2",
|
|
51
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
52
|
+
"husky": "^9.1.7",
|
|
53
|
+
"jest": "^29.7.0",
|
|
54
|
+
"lint-staged": "^13.3.0",
|
|
55
|
+
"prettier": "^3.7.4",
|
|
56
|
+
"rimraf": "^5.0.10",
|
|
57
|
+
"ts-jest": "^29.4.6",
|
|
58
|
+
"ts-node": "^10.9.2",
|
|
59
|
+
"ts-node-dev": "^2.0.0",
|
|
60
|
+
"typescript": "^5.3.3"
|
|
61
|
+
},
|
|
62
|
+
"lint-staged": {
|
|
63
|
+
"*.{js,ts,tsx}": [
|
|
64
|
+
"eslint --fix",
|
|
65
|
+
"prettier --write"
|
|
66
|
+
],
|
|
67
|
+
"\"*.{js,ts,tsx}\"": "[\"eslint --fix\", \"prettier --write\"]"
|
|
68
|
+
},
|
|
69
|
+
"publishConfig": {
|
|
70
|
+
"access": "public"
|
|
71
|
+
}
|
|
72
|
+
}
|