Skip to content

Commit 8d7f30d

Browse files
1o1w1XiFenggemini-code-assist[bot]
authored
feat: Use internal dayjs instance to avoid implicit dependency on pl… (#958)
* feat: Use internal dayjs instance to avoid implicit dependency on plugins extended by external dayjs versions * fix: use valueof Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * fix: compat dayjs v1.x * feat: add getUDayjs test case --------- Co-authored-by: XiFeng <lwq427385@alibaba-inc.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent 6514d60 commit 8d7f30d

File tree

2 files changed

+46
-24
lines changed

2 files changed

+46
-24
lines changed

src/generate/dayjs.ts

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ const parseNoMatchNotice = () => {
108108
// noteOnce(false, 'Not match any format. Please help to fire a issue about this.');
109109
};
110110

111+
// Use internal dayjs instance to avoid implicit dependency on plugins extended by external dayjs versions
112+
const getUDayjs = (value) => {
113+
if (!dayjs.isDayjs(value) || value instanceof dayjs) {
114+
return value;
115+
}
116+
117+
return dayjs(value.valueOf());
118+
};
119+
111120
const generateConfig: GenerateConfig<Dayjs> = {
112121
// get
113122
getNow: () => {
@@ -119,42 +128,42 @@ const generateConfig: GenerateConfig<Dayjs> = {
119128
return now;
120129
},
121130
getFixedDate: (string) => dayjs(string, ['YYYY-M-DD', 'YYYY-MM-DD']),
122-
getEndDate: (date) => date.endOf('month'),
131+
getEndDate: (date) => getUDayjs(date).endOf('month'),
123132
getWeekDay: (date) => {
124-
const clone = date.locale('en');
133+
const clone = getUDayjs(date).locale('en');
125134
return clone.weekday() + clone.localeData().firstDayOfWeek();
126135
},
127-
getYear: (date) => date.year(),
128-
getMonth: (date) => date.month(),
129-
getDate: (date) => date.date(),
130-
getHour: (date) => date.hour(),
131-
getMinute: (date) => date.minute(),
132-
getSecond: (date) => date.second(),
133-
getMillisecond: (date) => date.millisecond(),
136+
getYear: (date) => getUDayjs(date).year(),
137+
getMonth: (date) => getUDayjs(date).month(),
138+
getDate: (date) => getUDayjs(date).date(),
139+
getHour: (date) => getUDayjs(date).hour(),
140+
getMinute: (date) => getUDayjs(date).minute(),
141+
getSecond: (date) => getUDayjs(date).second(),
142+
getMillisecond: (date) => getUDayjs(date).millisecond(),
134143

135144
// set
136-
addYear: (date, diff) => date.add(diff, 'year'),
137-
addMonth: (date, diff) => date.add(diff, 'month'),
138-
addDate: (date, diff) => date.add(diff, 'day'),
139-
setYear: (date, year) => date.year(year),
140-
setMonth: (date, month) => date.month(month),
141-
setDate: (date, num) => date.date(num),
142-
setHour: (date, hour) => date.hour(hour),
143-
setMinute: (date, minute) => date.minute(minute),
144-
setSecond: (date, second) => date.second(second),
145-
setMillisecond: (date, milliseconds) => date.millisecond(milliseconds),
145+
addYear: (date, diff) => getUDayjs(date).add(diff, 'year'),
146+
addMonth: (date, diff) => getUDayjs(date).add(diff, 'month'),
147+
addDate: (date, diff) => getUDayjs(date).add(diff, 'day'),
148+
setYear: (date, year) => getUDayjs(date).year(year),
149+
setMonth: (date, month) => getUDayjs(date).month(month),
150+
setDate: (date, num) => getUDayjs(date).date(num),
151+
setHour: (date, hour) => getUDayjs(date).hour(hour),
152+
setMinute: (date, minute) => getUDayjs(date).minute(minute),
153+
setSecond: (date, second) => getUDayjs(date).second(second),
154+
setMillisecond: (date, milliseconds) => getUDayjs(date).millisecond(milliseconds),
146155

147156
// Compare
148-
isAfter: (date1, date2) => date1.isAfter(date2),
149-
isValidate: (date) => date.isValid(),
157+
isAfter: (date1, date2) => getUDayjs(date1).isAfter(getUDayjs(date2)),
158+
isValidate: (date) => getUDayjs(date).isValid(),
150159

151160
locale: {
152161
getWeekFirstDay: (locale) => dayjs().locale(parseLocale(locale)).localeData().firstDayOfWeek(),
153-
getWeekFirstDate: (locale, date) => date.locale(parseLocale(locale)).weekday(0),
154-
getWeek: (locale, date) => date.locale(parseLocale(locale)).week(),
162+
getWeekFirstDate: (locale, date) => getUDayjs(date).locale(parseLocale(locale)).weekday(0),
163+
getWeek: (locale, date) => getUDayjs(date).locale(parseLocale(locale)).week(),
155164
getShortWeekDays: (locale) => dayjs().locale(parseLocale(locale)).localeData().weekdaysMin(),
156165
getShortMonths: (locale) => dayjs().locale(parseLocale(locale)).localeData().monthsShort(),
157-
format: (locale, date, format) => date.locale(parseLocale(locale)).format(format),
166+
format: (locale, date, format) => getUDayjs(date).locale(parseLocale(locale)).format(format),
158167
parse: (locale, text, formats) => {
159168
const localeStr = parseLocale(locale);
160169
for (let i = 0; i < formats.length; i += 1) {

tests/generate.spec.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,19 @@ describe('Generate:dayjs', () => {
308308
const dateb = dayjsGenerateConfig.locale.format('en_US', timeb, 'YYYY-MM-DD HH:mm');
309309
expect(dateb).toEqual('2022-11-23 13:05');
310310
});
311+
312+
it('should convert external dayjs instance via getUDayjs', () => {
313+
// Mock an external dayjs object that passes isDayjs() but fails instanceof check
314+
// This covers line 117: return dayjs(value.valueOf())
315+
const mockExternalDayjs = {
316+
$isDayjsObject: true,
317+
valueOf: () => new Date('2023-06-20T00:00:00').getTime(),
318+
};
319+
320+
expect(dayjsGenerateConfig.getYear(mockExternalDayjs as any)).toEqual(2023);
321+
expect(dayjsGenerateConfig.getMonth(mockExternalDayjs as any)).toEqual(5);
322+
expect(dayjsGenerateConfig.getDate(mockExternalDayjs as any)).toEqual(20);
323+
});
311324
});
312325

313326
describe('Generate:date-fns', () => {

0 commit comments

Comments
 (0)