From 1d1b4cb9ef5d6dc95e8818bfa834a7b36a999eb4 Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 11:11:10 +0800 Subject: [PATCH 01/10] init: dayjs generate --- package.json | 1 + src/generate/dayjs.ts | 106 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/generate/dayjs.ts diff --git a/package.json b/package.json index d1d80e521..baba5e570 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "dependencies": { "classnames": "^2.2.1", + "dayjs": "^1.8.18", "moment": "^2.24.0", "rc-trigger": "^4.0.0-alpha.6", "rc-util": "^4.15.7" diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts new file mode 100644 index 000000000..bf13b15bd --- /dev/null +++ b/src/generate/dayjs.ts @@ -0,0 +1,106 @@ +import dayjs, { Dayjs } from 'dayjs'; +import { noteOnce } from 'rc-util/lib/warning'; +import weekday from 'dayjs/plugin/weekday' +import localeData from 'dayjs/plugin/localeData' +import weekOfYear from 'dayjs/plugin/weekOfYear' +import customParseFormat from 'dayjs/plugin/customParseFormat' +import { GenerateConfig } from '.'; + +dayjs.extend(customParseFormat); +dayjs.extend(weekday); +dayjs.extend(localeData); +dayjs.extend(weekOfYear); + +type IlocaleMapObject = { [key: string]: string }; +const localeMap: IlocaleMapObject = { + en_GB: 'en-gb', + en_US: 'en', + zh_CN: 'zh-cn', + zh_TW: 'zh-tw', +} + +const parseLocale = (locale: string) => { + const mapLocale = localeMap[locale] + return mapLocale || locale.split('_')[0] +} + +const generateConfig: GenerateConfig = { + // get + getNow: () => dayjs(), + getWeekDay: date => date.weekday(), + getYear: date => date.year(), + getMonth: date => date.month(), + getDate: date => date.date(), + getHour: date => date.hour(), + getMinute: date => date.minute(), + getSecond: date => date.second(), + + // set + addYear: (date, diff) => date.add(diff, 'year'), + addMonth: (date, diff) => date.add(diff, 'month'), + addDate: (date, diff) => date.add(diff, 'day'), + setYear: (date, year) => date.year(year), + setMonth: (date, month) => date.month(month), + setDate: (date, num) => date.date(num), + setHour: (date, hour) => date.hour(hour), + setMinute: (date, minute) => date.minute(minute), + setSecond: (date, second) => date.second(second), + + // Compare + isAfter: (date1, date2) => date1.isAfter(date2), + isValidate: date => date.isValid(), + + locale: { + getWeekFirstDay: locale => { + const date = dayjs().locale(parseLocale(locale)); + return date.localeData().firstDayOfWeek(); + }, + getWeek: (locale, date) => date.locale(parseLocale(locale)).week(), + getShortWeekDays: locale => dayjs().locale(parseLocale(locale)).localeData().weekdaysMin(), + getShortMonths: locale => dayjs().locale(parseLocale(locale)).localeData().monthsShort(), + format: (locale, date, format) => date.locale(parseLocale(locale)).format(format), + parse: (locale, text, formats) => { + const fallbackFormatList: string[] = []; + + for (let i = 0; i < formats.length; i += 1) { + let format = formats[i]; + let formatText = text; + + if (format.includes('o')) { + const matchFormat = format.match(/[YyMmDdHhSsWw]+/g); + const matchText = formatText.match(/\d+/g); + + if (matchFormat && matchText) { + format = matchFormat.join(''); + formatText = matchText.join(''); + } else { + fallbackFormatList.push(format.replace(/o/g, '')); + } + } + + const date = dayjs(formatText, format, parseLocale(locale)); + if (date.isValid()) { + return date; + } + } + + // Fallback to fuzzy matching, this should always not reach match or need fire a issue + for (let i = 0; i < fallbackFormatList.length; i += 1) { + const date = dayjs(text, fallbackFormatList[i], parseLocale(locale)); + + /* istanbul ignore next */ + if (date.isValid()) { + noteOnce( + false, + 'Not match any format strictly and fallback to fuzzy match. Please help to fire a issue about this.', + ); + return date; + } + } + + return null; + }, + }, +}; + +export default generateConfig; From f407a4f4aa5aa543dba447a954d026f8cc4972ce Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 11:31:45 +0800 Subject: [PATCH 02/10] fix: update dayjs generate --- src/generate/dayjs.ts | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index bf13b15bd..3a818f73c 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -1,28 +1,40 @@ import dayjs, { Dayjs } from 'dayjs'; import { noteOnce } from 'rc-util/lib/warning'; -import weekday from 'dayjs/plugin/weekday' -import localeData from 'dayjs/plugin/localeData' -import weekOfYear from 'dayjs/plugin/weekOfYear' -import customParseFormat from 'dayjs/plugin/customParseFormat' +import weekday from 'dayjs/plugin/weekday'; +import localeData from 'dayjs/plugin/localeData'; +import weekOfYear from 'dayjs/plugin/weekOfYear'; +import advancedFormat from 'dayjs/plugin/advancedFormat'; +import customParseFormat from 'dayjs/plugin/customParseFormat'; import { GenerateConfig } from '.'; dayjs.extend(customParseFormat); +dayjs.extend(advancedFormat); dayjs.extend(weekday); dayjs.extend(localeData); dayjs.extend(weekOfYear); +dayjs.extend((o, c) => { + // todo support Wo (ISO week) + const proto = c.prototype; + const oldFormat = proto.format; + proto.format = function(formatStr: string) { + const str = formatStr.replace('Wo', 'wo'); + return oldFormat.bind(this)(str); + }; +}); + type IlocaleMapObject = { [key: string]: string }; const localeMap: IlocaleMapObject = { en_GB: 'en-gb', en_US: 'en', zh_CN: 'zh-cn', zh_TW: 'zh-tw', -} +}; const parseLocale = (locale: string) => { - const mapLocale = localeMap[locale] - return mapLocale || locale.split('_')[0] -} + const mapLocale = localeMap[locale]; + return mapLocale || locale.split('_')[0]; +}; const generateConfig: GenerateConfig = { // get @@ -56,9 +68,18 @@ const generateConfig: GenerateConfig = { return date.localeData().firstDayOfWeek(); }, getWeek: (locale, date) => date.locale(parseLocale(locale)).week(), - getShortWeekDays: locale => dayjs().locale(parseLocale(locale)).localeData().weekdaysMin(), - getShortMonths: locale => dayjs().locale(parseLocale(locale)).localeData().monthsShort(), - format: (locale, date, format) => date.locale(parseLocale(locale)).format(format), + getShortWeekDays: locale => + dayjs() + .locale(parseLocale(locale)) + .localeData() + .weekdaysMin(), + getShortMonths: locale => + dayjs() + .locale(parseLocale(locale)) + .localeData() + .monthsShort(), + format: (locale, date, format) => + date.locale(parseLocale(locale)).format(format), parse: (locale, text, formats) => { const fallbackFormatList: string[] = []; From f6e22dff7ab0b57944084203a4d80a9ec3eaacea Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 11:32:33 +0800 Subject: [PATCH 03/10] chore: update lint --- src/generate/dayjs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index 3a818f73c..d405ab9d9 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -17,7 +17,7 @@ dayjs.extend((o, c) => { // todo support Wo (ISO week) const proto = c.prototype; const oldFormat = proto.format; - proto.format = function(formatStr: string) { + proto.format = function f(formatStr: string) { const str = formatStr.replace('Wo', 'wo'); return oldFormat.bind(this)(str); }; From 27e9a9f18684996b97081b13faadcbe23dcd391c Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 11:55:54 +0800 Subject: [PATCH 04/10] test: add dayjs test --- src/generate/dayjs.ts | 9 +- tests/generate.spec.tsx | 233 +++++++++++++++++++++------------------- 2 files changed, 130 insertions(+), 112 deletions(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index d405ab9d9..054af8be1 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -63,10 +63,11 @@ const generateConfig: GenerateConfig = { isValidate: date => date.isValid(), locale: { - getWeekFirstDay: locale => { - const date = dayjs().locale(parseLocale(locale)); - return date.localeData().firstDayOfWeek(); - }, + getWeekFirstDay: locale => + dayjs() + .locale(parseLocale(locale)) + .localeData() + .firstDayOfWeek(), getWeek: (locale, date) => date.locale(parseLocale(locale)).week(), getShortWeekDays: locale => dayjs() diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index ce0065092..332647afa 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -1,7 +1,10 @@ import MockDate from 'mockdate'; import momentGenerateConfig from '../src/generate/moment'; +import dayjsGenerateConfig from '../src/generate/dayjs'; import { getMoment } from './util/commonUtil'; +import 'dayjs/locale/zh-cn'; + describe('Picker.Generate', () => { beforeAll(() => { MockDate.set(getMoment('1990-09-03 01:02:03').toDate()); @@ -11,132 +14,146 @@ describe('Picker.Generate', () => { MockDate.reset(); }); - [{ name: 'moment', generateConfig: momentGenerateConfig }].forEach( - ({ name, generateConfig }) => { - describe(name, () => { - it('get', () => { - const now = generateConfig.getNow(); - expect(generateConfig.getWeekDay(now)).toEqual(1); - expect(generateConfig.getSecond(now)).toEqual(3); - expect(generateConfig.getMinute(now)).toEqual(2); - expect(generateConfig.getHour(now)).toEqual(1); - expect(generateConfig.getDate(now)).toEqual(3); - expect(generateConfig.getMonth(now)).toEqual(8); - expect(generateConfig.getYear(now)).toEqual(1990); - }); - - it('set', () => { - let date = generateConfig.getNow(); - date = generateConfig.setYear(date, 2020); - date = generateConfig.setMonth(date, 9); - date = generateConfig.setDate(date, 23); - date = generateConfig.setHour(date, 2); - date = generateConfig.setMinute(date, 3); - date = generateConfig.setSecond(date, 5); - - expect( - generateConfig.locale.format('en_US', date, 'YYYY-MM-DD HH:mm:ss'), - ).toEqual('2020-10-23 02:03:05'); - }); - - it('add', () => { - let date = generateConfig.getNow(); - date = generateConfig.addYear(date, 2); - date = generateConfig.addMonth(date, 2); - date = generateConfig.addDate(date, 2); - expect( - generateConfig.locale.format('en_US', date, 'YYYY-MM-DD'), - ).toEqual('1992-11-05'); - }); + [ + { name: 'moment', generateConfig: momentGenerateConfig }, + { name: 'dayjs', generateConfig: dayjsGenerateConfig }, + ].forEach(({ name, generateConfig }) => { + describe(name, () => { + it('get', () => { + const now = generateConfig.getNow(); + expect(generateConfig.getWeekDay(now)).toEqual(1); + expect(generateConfig.getSecond(now)).toEqual(3); + expect(generateConfig.getMinute(now)).toEqual(2); + expect(generateConfig.getHour(now)).toEqual(1); + expect(generateConfig.getDate(now)).toEqual(3); + expect(generateConfig.getMonth(now)).toEqual(8); + expect(generateConfig.getYear(now)).toEqual(1990); + }); - it('isAfter', () => { - const now = generateConfig.getNow(); - const prev = generateConfig.addDate(now, -1); - const next = generateConfig.addDate(now, 1); - expect(generateConfig.isAfter(now, prev)).toBeTruthy(); - expect(generateConfig.isAfter(next, now)).toBeTruthy(); - }); + it('set', () => { + let date = generateConfig.getNow(); + date = generateConfig.setYear(date, 2020); + date = generateConfig.setMonth(date, 9); + date = generateConfig.setDate(date, 23); + date = generateConfig.setHour(date, 2); + date = generateConfig.setMinute(date, 3); + date = generateConfig.setSecond(date, 5); - it('isValidate', () => { - expect( - generateConfig.isValidate(generateConfig.getNow()), - ).toBeTruthy(); - }); + expect( + generateConfig.locale.format('en_US', date, 'YYYY-MM-DD HH:mm:ss'), + ).toEqual('2020-10-23 02:03:05'); + }); - describe('locale', () => { - describe('parse', () => { - it('basic', () => { - ['2000-01-02', '02/01/2000'].forEach(str => { - const date = generateConfig.locale.parse('en_US', str, [ - 'YYYY-MM-DD', - 'DD/MM/YYYY', - ]); - - expect( - generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD'), - ).toEqual('2000-01-02'); - }); - }); + it('add', () => { + let date = generateConfig.getNow(); + date = generateConfig.addYear(date, 2); + date = generateConfig.addMonth(date, 2); + date = generateConfig.addDate(date, 2); + expect( + generateConfig.locale.format('en_US', date, 'YYYY-MM-DD'), + ).toEqual('1992-11-05'); + }); - it('week', () => { - expect( - generateConfig.locale.format( - 'en_US', - generateConfig.locale.parse('en_US', '2019-1st', [ - 'gggg-wo', - ])!, - 'gggg-wo', - ), - ).toEqual('2019-1st'); + it('isAfter', () => { + const now = generateConfig.getNow(); + const prev = generateConfig.addDate(now, -1); + const next = generateConfig.addDate(now, 1); + expect(generateConfig.isAfter(now, prev)).toBeTruthy(); + expect(generateConfig.isAfter(next, now)).toBeTruthy(); + }); - expect( - generateConfig.locale.format( - 'zh_CN', - generateConfig.locale.parse('zh_CN', '2019-45周', [ - 'gggg-wo', - ])!, - 'gggg-wo', - ), - ).toEqual('2019-45周'); - }); - }); + it('isValidate', () => { + expect(generateConfig.isValidate(generateConfig.getNow())).toBeTruthy(); + }); - it('getWeekFirstDay', () => { - expect(generateConfig.locale.getWeekFirstDay('en_US')).toEqual(0); - expect(generateConfig.locale.getWeekFirstDay('zh_CN')).toEqual(1); + describe('locale', () => { + describe('parse', () => { + it('basic', () => { + ['2000-01-02', '02/01/2000'].forEach(str => { + const date = generateConfig.locale.parse('en_US', str, [ + 'YYYY-MM-DD', + 'DD/MM/YYYY', + ]); - // Should keep same weekday - ['en_US', 'zh_CN'].forEach(() => { expect( - generateConfig.getWeekDay( - generateConfig.locale.parse('en_US', '2000-01-01', [ - 'YYYY-MM-DD', - ])!, - ), - ).toEqual(6); + generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD'), + ).toEqual('2000-01-02'); }); }); - it('getWeek', () => { + it('week', () => { expect( - generateConfig.locale.getWeek( - 'zh_CN', - generateConfig.locale.parse('zh_CN', '2019-12-08', [ - 'YYYY-MM-DD', + generateConfig.locale.format( + 'en_US', + generateConfig.locale.parse('en_US', '2019-1st', [ + 'gggg-wo', ])!, + 'gggg-wo', ), - ).toEqual(49); + ).toEqual('2019-1st'); + expect( - generateConfig.locale.getWeek( - 'en_US', - generateConfig.locale.parse('en_US', '2019-12-08', [ - 'YYYY-MM-DD', + generateConfig.locale.format( + 'zh_CN', + generateConfig.locale.parse('zh_CN', '2019-45周', [ + 'gggg-wo', ])!, + 'gggg-wo', ), - ).toEqual(50); + ).toEqual('2019-45周'); + }); + }); + }); + + it('getWeekFirstDay', () => { + expect(generateConfig.locale.getWeekFirstDay('en_US')).toEqual(0); + expect(generateConfig.locale.getWeekFirstDay('zh_CN')).toEqual(1); + + // Should keep same weekday + ['en_US', 'zh_CN'].forEach(() => { + expect( + generateConfig.getWeekDay( + generateConfig.locale.parse('en_US', '2000-01-01', [ + 'YYYY-MM-DD', + ])!, + ), + ).toEqual(6); + }); + }); + + describe('locale', () => { + it('parse', () => { + ['2000-01-02', '02/01/2000'].forEach(str => { + const date = generateConfig.locale.parse('en_US', str, [ + 'YYYY-MM-DD', + 'DD/MM/YYYY', + ]); + + expect( + generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD'), + ).toEqual('2000-01-02'); }); }); + }) + + it('getWeek', () => { + expect( + generateConfig.locale.getWeek( + 'zh_CN', + generateConfig.locale.parse('zh_CN', '2019-12-08', [ + 'YYYY-MM-DD', + ])!, + ), + ).toEqual(49); + expect( + generateConfig.locale.getWeek( + 'en_US', + generateConfig.locale.parse('en_US', '2019-12-08', [ + 'YYYY-MM-DD', + ])!, + ), + ).toEqual(50); }); - }, - ); + }); + }); }); From cb48a3ed1e534c3c1e5e84b025d671b6b7d4b891 Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 13:14:40 +0800 Subject: [PATCH 05/10] test: add dayjs test2 --- tests/generate.spec.tsx | 62 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index 332647afa..736f426e4 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -121,6 +121,68 @@ describe('Picker.Generate', () => { }); }); + it('getShortWeekDays', () => { + expect(generateConfig.locale.getShortWeekDays('zh_CN')).toEqual([ + '日', + '一', + '二', + '三', + '四', + '五', + '六', + ]); + expect(generateConfig.locale.getShortWeekDays('en_US')).toEqual([ + 'Su', + 'Mo', + 'Tu', + 'We', + 'Th', + 'Fr', + 'Sa', + ]); + }); + + it('getShortMonths', () => { + expect(generateConfig.locale.getShortMonths('zh_CN')).toEqual([ + '1月', + '2月', + '3月', + '4月', + '5月', + '6月', + '7月', + '8月', + '9月', + '10月', + '11月', + '12月', + ]); + expect(generateConfig.locale.getShortMonths('en_US')).toEqual([ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]); + }); + + it('getWeek', () => { + expect( + generateConfig.locale.getWeek( + 'zh_CN', + generateConfig.locale.parse('zh_CN', '2019-12-08', [ + 'YYYY-MM-DD', + ])!, + ), + ).toEqual(49); + describe('locale', () => { it('parse', () => { ['2000-01-02', '02/01/2000'].forEach(str => { From 4894a44692657d078f78b8ff3c6563e614d03ac8 Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 13:27:51 +0800 Subject: [PATCH 06/10] update --- src/generate/dayjs.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index 054af8be1..62843ceb4 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -106,19 +106,11 @@ const generateConfig: GenerateConfig = { } } - // Fallback to fuzzy matching, this should always not reach match or need fire a issue - for (let i = 0; i < fallbackFormatList.length; i += 1) { - const date = dayjs(text, fallbackFormatList[i], parseLocale(locale)); - - /* istanbul ignore next */ - if (date.isValid()) { - noteOnce( - false, - 'Not match any format strictly and fallback to fuzzy match. Please help to fire a issue about this.', - ); - return date; - } - } + /* istanbul ignore next */ + noteOnce( + false, + 'Not match any format. Please help to fire a issue about this.', + ); return null; }, From 426759580a878d0f6c3a07059cbd8ae5b7fc9e25 Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 13:34:03 +0800 Subject: [PATCH 07/10] update --- src/generate/dayjs.ts | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index 62843ceb4..b63ddfa37 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -82,24 +82,9 @@ const generateConfig: GenerateConfig = { format: (locale, date, format) => date.locale(parseLocale(locale)).format(format), parse: (locale, text, formats) => { - const fallbackFormatList: string[] = []; - for (let i = 0; i < formats.length; i += 1) { - let format = formats[i]; - let formatText = text; - - if (format.includes('o')) { - const matchFormat = format.match(/[YyMmDdHhSsWw]+/g); - const matchText = formatText.match(/\d+/g); - - if (matchFormat && matchText) { - format = matchFormat.join(''); - formatText = matchText.join(''); - } else { - fallbackFormatList.push(format.replace(/o/g, '')); - } - } - + const format = formats[i]; + const formatText = text; const date = dayjs(formatText, format, parseLocale(locale)); if (date.isValid()) { return date; From f4a2b881cd4adb1372ea03fcc77a40ffe5b972e7 Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 13:57:40 +0800 Subject: [PATCH 08/10] update test --- src/generate/dayjs.ts | 33 +++++++++++++++++++++++++-------- tests/generate.spec.tsx | 18 ++++++++++++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index b63ddfa37..fe407037c 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -18,7 +18,7 @@ dayjs.extend((o, c) => { const proto = c.prototype; const oldFormat = proto.format; proto.format = function f(formatStr: string) { - const str = formatStr.replace('Wo', 'wo'); + const str = (formatStr || '').replace('Wo', 'wo'); return oldFormat.bind(this)(str); }; }); @@ -36,6 +36,14 @@ const parseLocale = (locale: string) => { return mapLocale || locale.split('_')[0]; }; +const parseNoMatchNotice = () => { + /* istanbul ignore next */ + noteOnce( + false, + 'Not match any format. Please help to fire a issue about this.', + ); +} + const generateConfig: GenerateConfig = { // get getNow: () => dayjs(), @@ -82,21 +90,30 @@ const generateConfig: GenerateConfig = { format: (locale, date, format) => date.locale(parseLocale(locale)).format(format), parse: (locale, text, formats) => { + const localeStr = parseLocale(locale) for (let i = 0; i < formats.length; i += 1) { const format = formats[i]; const formatText = text; - const date = dayjs(formatText, format, parseLocale(locale)); + if (format.indexOf('Wo') > -1) { // parse Wo + const year = formatText.split('-')[0] + const weekStr = formatText.split('-')[1] + const firstWeek = dayjs(year, 'YYYY').startOf('year').locale(localeStr) + for (let j = 0; j <= 52; j += 1) { + const nextWeek = firstWeek.add(j, 'week') + if (nextWeek.format('Wo') === weekStr) { + return nextWeek + } + } + parseNoMatchNotice() + return null; + } + const date = dayjs(formatText, format).locale(localeStr); if (date.isValid()) { return date; } } - /* istanbul ignore next */ - noteOnce( - false, - 'Not match any format. Please help to fire a issue about this.', - ); - + parseNoMatchNotice() return null; }, }, diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index 736f426e4..048888628 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -119,6 +119,24 @@ describe('Picker.Generate', () => { ), ).toEqual(6); }); + + + it('Parse format Wo', () => { + expect( + generateConfig.locale.parse( + 'en_US', + '2012-51st', + ['YYYY-Wo'], + )?.format('Wo'), + ).toEqual('51st'); + expect( + generateConfig.locale.parse( + 'zh_CN', + '2012-1周', + ['YYYY-Wo'], + )?.format('Wo'), + ).toEqual('1周'); + }); }); it('getShortWeekDays', () => { From b9087317563820594d788c09c0b51eba68cd519a Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 17:04:52 +0800 Subject: [PATCH 09/10] update test --- src/generate/dayjs.ts | 4 ++- tests/generate.spec.tsx | 64 ++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index fe407037c..0be1d9cc7 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -3,6 +3,7 @@ import { noteOnce } from 'rc-util/lib/warning'; import weekday from 'dayjs/plugin/weekday'; import localeData from 'dayjs/plugin/localeData'; import weekOfYear from 'dayjs/plugin/weekOfYear'; +import weekYear from 'dayjs/plugin/weekYear'; import advancedFormat from 'dayjs/plugin/advancedFormat'; import customParseFormat from 'dayjs/plugin/customParseFormat'; import { GenerateConfig } from '.'; @@ -12,6 +13,7 @@ dayjs.extend(advancedFormat); dayjs.extend(weekday); dayjs.extend(localeData); dayjs.extend(weekOfYear); +dayjs.extend(weekYear); dayjs.extend((o, c) => { // todo support Wo (ISO week) @@ -94,7 +96,7 @@ const generateConfig: GenerateConfig = { for (let i = 0; i < formats.length; i += 1) { const format = formats[i]; const formatText = text; - if (format.indexOf('Wo') > -1) { // parse Wo + if (format.includes('wo') || format.includes('Wo')) { // parse Wo const year = formatText.split('-')[0] const weekStr = formatText.split('-')[1] const firstWeek = dayjs(year, 'YYYY').startOf('year').locale(localeStr) diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index 048888628..e406e347c 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -105,6 +105,21 @@ describe('Picker.Generate', () => { }); }); + describe('locale', () => { + it('parse', () => { + ['2000-01-02', '02/01/2000'].forEach(str => { + const date = generateConfig.locale.parse('en_US', str, [ + 'YYYY-MM-DD', + 'DD/MM/YYYY', + ]); + + expect( + generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD'), + ).toEqual('2000-01-02'); + }); + }); + }) + it('getWeekFirstDay', () => { expect(generateConfig.locale.getWeekFirstDay('en_US')).toEqual(0); expect(generateConfig.locale.getWeekFirstDay('zh_CN')).toEqual(1); @@ -119,24 +134,23 @@ describe('Picker.Generate', () => { ), ).toEqual(6); }); + }); - - it('Parse format Wo', () => { - expect( - generateConfig.locale.parse( - 'en_US', - '2012-51st', - ['YYYY-Wo'], - )?.format('Wo'), - ).toEqual('51st'); - expect( - generateConfig.locale.parse( - 'zh_CN', - '2012-1周', - ['YYYY-Wo'], - )?.format('Wo'), - ).toEqual('1周'); - }); + it('Parse format Wo', () => { + expect( + generateConfig.locale.parse( + 'en_US', + '2012-51st', + ['YYYY-Wo'], + )?.format('Wo'), + ).toEqual('51st'); + expect( + generateConfig.locale.parse( + 'zh_CN', + '2012-1周', + ['YYYY-Wo'], + )?.format('Wo'), + ).toEqual('1周'); }); it('getShortWeekDays', () => { @@ -200,21 +214,7 @@ describe('Picker.Generate', () => { ])!, ), ).toEqual(49); - - describe('locale', () => { - it('parse', () => { - ['2000-01-02', '02/01/2000'].forEach(str => { - const date = generateConfig.locale.parse('en_US', str, [ - 'YYYY-MM-DD', - 'DD/MM/YYYY', - ]); - - expect( - generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD'), - ).toEqual('2000-01-02'); - }); - }); - }) + }); it('getWeek', () => { expect( From 2ea0bc514630b19faf75d2e381168051455596ed Mon Sep 17 00:00:00 2001 From: iamkun Date: Thu, 19 Dec 2019 17:14:39 +0800 Subject: [PATCH 10/10] update test --- tests/generate.spec.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index e406e347c..2d25c8ede 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -153,6 +153,23 @@ describe('Picker.Generate', () => { ).toEqual('1周'); }); + it('Parse format faild', () => { + expect( + generateConfig.locale.parse( + 'en_US', + 'invalid string', + ['invalid string'], + ), + ).toEqual(null); + expect( + generateConfig.locale.parse( + 'en_US', + 'invalid string', + ['invalid string-Wo'], + ), + ).toEqual(null); + }); + it('getShortWeekDays', () => { expect(generateConfig.locale.getShortWeekDays('zh_CN')).toEqual([ '日',