From 415b2999345b330db1e849503967f74c95c689d7 Mon Sep 17 00:00:00 2001 From: Daniel Ruf Date: Fri, 4 May 2018 08:15:48 +0200 Subject: [PATCH 01/24] chore: add Node.js 8 and 10 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 663f6d4d5..c7637b2ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,8 @@ cache: - ~/.npm - node_modules node_js: + - '10' + - '8' - '6' install: - npm install -g codecov From f66aa7a8f0cae7035c382503229bbf5eab655fe6 Mon Sep 17 00:00:00 2001 From: zazzaz Date: Sat, 5 May 2018 12:33:37 +0800 Subject: [PATCH 02/24] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8507a41fe..0f2441e3a 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ API will always return a new `Dayjs` object if not specified. * [Year](#year) * [Month](#month) * [Date of Month](#date-of-month) + * [Day of Week](#day-of-week) * [Hour](#hour) * [Minute](#minute) * [Second](#second) From ad486175cf1b065d8bf7196f418cf194ab133eda Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 17:35:34 +0800 Subject: [PATCH 03/24] ci: change deploy-once --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index c7637b2ca..99e37fe25 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,10 +16,8 @@ script: - codecov after_success: - if [ "$TRAVIS_BRANCH" == "master" ]; then - npm run build; - nvm install v8.10.0 && nvm use v8.10.0; - npm install -g travis-deploy-once semantic-release; - travis-deploy-once "semantic-release"; + npm install -g travis-deploy-once; + travis-deploy-once && npm run build && npx semantic-release; fi branches: except: From 249ed159878bd66a2df6f495f8d22ed201409b3b Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 17:38:02 +0800 Subject: [PATCH 04/24] ci: test only --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 99e37fe25..ff8e86585 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ script: - npm test - codecov after_success: - - if [ "$TRAVIS_BRANCH" == "master" ]; then + - if [ "$TRAVIS_BRANCH" == "feature/saucelab" ]; then npm install -g travis-deploy-once; travis-deploy-once && npm run build && npx semantic-release; fi From f7693083d44ce7364e80a253931509d2111e1f60 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 17:44:08 +0800 Subject: [PATCH 05/24] ci: update travis.yml --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff8e86585..0a4f74bac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,9 @@ script: - codecov after_success: - if [ "$TRAVIS_BRANCH" == "feature/saucelab" ]; then - npm install -g travis-deploy-once; - travis-deploy-once && npm run build && npx semantic-release; + npx travis-deploy-once; + npm run build; + npx semantic-release; fi branches: except: From 40cc91da55a35f8b7abb399c1e37393578acc5a8 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 18:32:58 +0800 Subject: [PATCH 06/24] test: inti browser test --- .travis.yml | 4 +- karma.sauce.conf.js | 97 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 12 ++++-- test/browser.spec.js | 11 +++++ 4 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 karma.sauce.conf.js create mode 100644 test/browser.spec.js diff --git a/.travis.yml b/.travis.yml index 0a4f74bac..3343431b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,9 +16,7 @@ script: - codecov after_success: - if [ "$TRAVIS_BRANCH" == "feature/saucelab" ]; then - npx travis-deploy-once; - npm run build; - npx semantic-release; + npx travis-deploy-once && npm run build && npx semantic-release && npm run test:sauce; fi branches: except: diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js new file mode 100644 index 000000000..3318372cc --- /dev/null +++ b/karma.sauce.conf.js @@ -0,0 +1,97 @@ +module.exports = function (config) { + + var batches = [ + { + sl_chrome: { + base: 'SauceLabs', + browserName: 'chrome', + version: '26' + }, + sl_firefox: { + base: 'SauceLabs', + browserName: 'firefox', + version: '4' + }, + sl_mac_safari: { + base: 'SauceLabs', + browserName: 'safari', + version: '8' + } + }, + // ie family + { + sl_ie_9: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows 7', + version: '9' + }, + sl_edge: { + base: 'SauceLabs', + browserName: 'MicrosoftEdge', + platform: 'Windows 10', + version: '13' + } + }, + // mobile + { + sl_ios_safari_9: { + base: 'SauceLabs', + browserName: 'iphone', + version: '9.3' + }, + sl_android_6_0: { + base: 'SauceLabs', + browserName: 'android', + version: '4.4' + } + } + ]; + + var batch = batches[process.argv[4] || 0] + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + + // list of files / patterns to load in the browser + files: [ + 'dist/*.js', + 'test/*spec.js' + ], + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['dots', 'saucelabs'], + + + // web server port + port: 9876, + + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + sauceLabs: { + testName: 'Day.js', + "build": "build-0004" + }, + captureTimeout: 120000, + customLaunchers: batch, + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: Object.keys(batch), + singleRun: true + }); +}; diff --git a/package.json b/package.json index 6fb542ca7..8a499c3b7 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,15 @@ "scripts": { "test": "jest", "lint": "./node_modules/.bin/eslint src/* test/*", - "build": "BABEL_ENV=build rollup -c" + "build": "BABEL_ENV=build rollup -c", + "sauce": "npx karma start karma.sauce.conf.js", + "test:sauce": "npm run sauce -- 0 && npm run sauce -- 1 && npm run sauce -- 2" }, "pre-commit": [ "lint" ], "jest": { + "testRegex": "test/.*test.js$", "coverageDirectory": "./coverage/", "collectCoverage": true, "collectCoverageFrom": [ @@ -36,7 +39,11 @@ "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.10.0", "eslint-plugin-jest": "^21.15.0", + "jasmine-core": "^2.5.2", "jest": "^22.4.3", + "karma": "^1.4.1", + "karma-jasmine": "~1.1.0", + "karma-sauce-launcher": "~1.1.0", "mockdate": "^2.0.2", "moment": "^2.22.0", "pre-commit": "^1.2.2", @@ -44,6 +51,5 @@ "rollup-plugin-babel": "^4.0.0-beta.4", "rollup-plugin-uglify": "^3.0.0" }, - "dependencies": { - } + "dependencies": {} } diff --git a/test/browser.spec.js b/test/browser.spec.js new file mode 100644 index 000000000..811801cd5 --- /dev/null +++ b/test/browser.spec.js @@ -0,0 +1,11 @@ +describe('Day.js init', function () { + it('window.dayjs ', function () { + if (!window.dayjs) throw new Error('No window.dayjs') + }) +}) + +describe('dayjs', function () { + it('dayjs init', function () { + expect(dayjs(1523520536000).valueOf()).toBe(1523520536000); + }) +}) \ No newline at end of file From dd4b72752f383b74699206995ad09f824a610759 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 18:41:53 +0800 Subject: [PATCH 07/24] test: fix lint --- .eslintrc.json | 4 ++++ karma.sauce.conf.js | 3 +-- test/browser.spec.js | 12 ++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 39b5b6789..e94537ef9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,6 +6,10 @@ "env": { "jest/globals": true }, + "globals": { + "window": true, + "dayjs": true + }, "rules": { "semi": [ 2, diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js index 3318372cc..25efac3ed 100644 --- a/karma.sauce.conf.js +++ b/karma.sauce.conf.js @@ -83,8 +83,7 @@ module.exports = function (config) { logLevel: config.LOG_INFO, sauceLabs: { - testName: 'Day.js', - "build": "build-0004" + testName: 'Day.js' }, captureTimeout: 120000, customLaunchers: batch, diff --git a/test/browser.spec.js b/test/browser.spec.js index 811801cd5..9d04501e5 100644 --- a/test/browser.spec.js +++ b/test/browser.spec.js @@ -1,11 +1,11 @@ -describe('Day.js init', function () { - it('window.dayjs ', function () { +describe('Day.js init', () => { + it('window.dayjs ', () => { if (!window.dayjs) throw new Error('No window.dayjs') }) }) -describe('dayjs', function () { - it('dayjs init', function () { - expect(dayjs(1523520536000).valueOf()).toBe(1523520536000); +describe('dayjs', () => { + it('dayjs init', () => { + expect(dayjs(1523520536000).valueOf()).toBe(1523520536000) }) -}) \ No newline at end of file +}) From 4b85cdb05859ceb2cecbe53d876eccf632912e8d Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 18:57:57 +0800 Subject: [PATCH 08/24] test: fix browser test arrow func --- test/browser.spec.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/browser.spec.js b/test/browser.spec.js index 9d04501e5..b15c1d7e1 100644 --- a/test/browser.spec.js +++ b/test/browser.spec.js @@ -1,11 +1,12 @@ -describe('Day.js init', () => { - it('window.dayjs ', () => { +/* eslint-disable prefer-arrow-callback,func-names */ +describe('Day.js init', function () { + it('window.dayjs ', function () { if (!window.dayjs) throw new Error('No window.dayjs') }) }) -describe('dayjs', () => { - it('dayjs init', () => { +describe('dayjs', function () { + it('dayjs init', function () { expect(dayjs(1523520536000).valueOf()).toBe(1523520536000) }) }) From bf883f4e58417c7c5785aa3d1187175b1956d47a Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 18:59:53 +0800 Subject: [PATCH 09/24] test: add platforms --- karma.sauce.conf.js | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js index 25efac3ed..fd04b505c 100644 --- a/karma.sauce.conf.js +++ b/karma.sauce.conf.js @@ -2,23 +2,34 @@ module.exports = function (config) { var batches = [ { - sl_chrome: { + sl_chrome_26: { base: 'SauceLabs', browserName: 'chrome', version: '26' }, - sl_firefox: { + sl_chrome: { + base: 'SauceLabs', + browserName: 'chrome' + }, + sl_firefox_4: { base: 'SauceLabs', browserName: 'firefox', version: '4' }, - sl_mac_safari: { + sl_firefox: { + base: 'SauceLabs', + browserName: 'firefox' + }, + sl_mac_safari_8: { base: 'SauceLabs', browserName: 'safari', version: '8' + }, + sl_mac_safari: { + base: 'SauceLabs', + browserName: 'safari' } }, - // ie family { sl_ie_9: { base: 'SauceLabs', @@ -26,24 +37,39 @@ module.exports = function (config) { platform: 'Windows 7', version: '9' }, - sl_edge: { + sl_ie: { + base: 'SauceLabs', + browserName: 'internet explorer' + }, + sl_edge_13: { base: 'SauceLabs', browserName: 'MicrosoftEdge', platform: 'Windows 10', version: '13' + }, + sl_edge: { + base: 'SauceLabs', + browserName: 'MicrosoftEdge' } }, - // mobile { sl_ios_safari_9: { base: 'SauceLabs', browserName: 'iphone', version: '9.3' }, - sl_android_6_0: { + sl_ios_safari: { + base: 'SauceLabs', + browserName: 'iphone' + }, + sl_android_4_4: { base: 'SauceLabs', browserName: 'android', version: '4.4' + }, + sl_android: { + base: 'SauceLabs', + browserName: 'android' } } ]; From 079d2c6d5c10f23ef3f8e647c12e952456e6fc3e Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 19:36:26 +0800 Subject: [PATCH 10/24] ci: add sauce connect --- .travis.yml | 2 ++ karma.sauce.conf.js | 4 ++-- package.json | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3343431b3..27e783431 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,3 +21,5 @@ after_success: branches: except: - /^v\d+\.\d+\.\d+$/ +addons: + sauce_connect: true diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js index fd04b505c..a1dac302b 100644 --- a/karma.sauce.conf.js +++ b/karma.sauce.conf.js @@ -31,11 +31,11 @@ module.exports = function (config) { } }, { - sl_ie_9: { + sl_ie_8: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', - version: '9' + version: '8' }, sl_ie: { base: 'SauceLabs', diff --git a/package.json b/package.json index 8a499c3b7..166d1caa8 100644 --- a/package.json +++ b/package.json @@ -39,11 +39,11 @@ "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.10.0", "eslint-plugin-jest": "^21.15.0", - "jasmine-core": "^2.5.2", + "jasmine-core": "^2.99.1", "jest": "^22.4.3", - "karma": "^1.4.1", - "karma-jasmine": "~1.1.0", - "karma-sauce-launcher": "~1.1.0", + "karma": "^2.0.2", + "karma-jasmine": "^1.1.2", + "karma-sauce-launcher": "^1.1.0", "mockdate": "^2.0.2", "moment": "^2.22.0", "pre-commit": "^1.2.2", From e83d86c3d1cf3430d8096eca5b9067356cd017f1 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 19:41:49 +0800 Subject: [PATCH 11/24] ci: fix sauce error --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 27e783431..3343431b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,5 +21,3 @@ after_success: branches: except: - /^v\d+\.\d+\.\d+$/ -addons: - sauce_connect: true From 179e22410bb6f6d981ed5778915437442565aae2 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 21:19:08 +0800 Subject: [PATCH 12/24] test: add platforms --- karma.sauce.conf.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js index a1dac302b..841d60bfa 100644 --- a/karma.sauce.conf.js +++ b/karma.sauce.conf.js @@ -23,11 +23,13 @@ module.exports = function (config) { sl_mac_safari_8: { base: 'SauceLabs', browserName: 'safari', - version: '8' + version: '8', + platform: 'OS X 10.10' }, sl_mac_safari: { base: 'SauceLabs', - browserName: 'safari' + browserName: 'safari', + platform: 'macOS 10.13' } }, { From 5347c0d49db39680b7d4e3ed0f2b498ff72a5fc9 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sat, 5 May 2018 23:20:18 +0800 Subject: [PATCH 13/24] chore: --- karma.sauce.conf.js | 27 +-------------------------- package.json | 3 ++- test/browser.spec.js | 2 ++ 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js index 841d60bfa..a5bdcddb3 100644 --- a/karma.sauce.conf.js +++ b/karma.sauce.conf.js @@ -78,46 +78,21 @@ module.exports = function (config) { var batch = batches[process.argv[4] || 0] config.set({ - - // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '', - - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ['jasmine'], - - - // list of files / patterns to load in the browser files: [ 'dist/*.js', 'test/*spec.js' ], - - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter reporters: ['dots', 'saucelabs'], - - - // web server port port: 9876, - colors: true, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - + logLevel: config.LOG_DEBUG, sauceLabs: { testName: 'Day.js' }, captureTimeout: 120000, customLaunchers: batch, - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: Object.keys(batch), singleRun: true }); diff --git a/package.json b/package.json index 166d1caa8..fc8268960 100644 --- a/package.json +++ b/package.json @@ -51,5 +51,6 @@ "rollup-plugin-babel": "^4.0.0-beta.4", "rollup-plugin-uglify": "^3.0.0" }, - "dependencies": {} + "dependencies": { + } } diff --git a/test/browser.spec.js b/test/browser.spec.js index b15c1d7e1..ecebb5475 100644 --- a/test/browser.spec.js +++ b/test/browser.spec.js @@ -1,4 +1,6 @@ /* eslint-disable prefer-arrow-callback,func-names */ +// Please do NOT modify or change this file +// Checkout our unit test files in test/*.test.js describe('Day.js init', function () { it('window.dayjs ', function () { if (!window.dayjs) throw new Error('No window.dayjs') From fe5f15d5bc1f3c1d129506e5690762ef905ce58a Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 00:18:07 +0800 Subject: [PATCH 14/24] chore: not check input --- package.json | 2 -- src/index.js | 1 - src/utils.js | 2 -- test/get-set.test.js | 6 ------ 4 files changed, 11 deletions(-) diff --git a/package.json b/package.json index fc8268960..81c9d704a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,5 @@ "rollup": "^0.57.1", "rollup-plugin-babel": "^4.0.0-beta.4", "rollup-plugin-uglify": "^3.0.0" - }, - "dependencies": { } } diff --git a/src/index.js b/src/index.js index aee68dbb6..85cfeddc7 100644 --- a/src/index.js +++ b/src/index.js @@ -169,7 +169,6 @@ class Dayjs { } set(string, int) { - if (!Utils.isNumber(int)) return this return this.clone().mSet(string, int) } diff --git a/src/utils.js b/src/utils.js index 6ba532f48..50bfc3754 100644 --- a/src/utils.js +++ b/src/utils.js @@ -15,8 +15,6 @@ export const padZoneStr = (negHour) => { return padStart(String(hour).replace(/^(.)?(\d)/, replacer), 5, '+') } -export const isNumber = n => (!Number.isNaN(parseFloat(n)) && Number.isFinite(n)) - export const monthDiff = (a, b) => { // function from moment.js in order to keep the same result const wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()) diff --git a/test/get-set.test.js b/test/get-set.test.js index c266984b7..db3ab75e4 100644 --- a/test/get-set.test.js +++ b/test/get-set.test.js @@ -76,12 +76,6 @@ it('Set Unknown String', () => { .toBe(moment().set('Unknown String', 1).valueOf()) }) -it('Set Not Int', () => { - const newDate = dayjs().set('year', 'Not Int') - expect(newDate.valueOf()) - .toBe(moment().set('year', 'Not Int').valueOf()) -}) - it('Immutable Set', () => { const dayjsA = dayjs() const dayjsB = dayjsA.set('year', 2011) From c73254b35b9ed8c580b8a6ea529c686901bbce3a Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 00:25:31 +0800 Subject: [PATCH 15/24] fix: add ms support (format should support all date parts) --- src/constant.js | 2 +- src/index.js | 2 ++ test/display.test.js | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/constant.js b/src/constant.js index 2bdd63aa5..665dc1161 100644 --- a/src/constant.js +++ b/src/constant.js @@ -27,4 +27,4 @@ export const FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ' // regex export const REGEX_PARSE = /^(\d{4})-?(\d{2})-?(\d{1,2})$/ -export const REGEX_FORMAT = /Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}/g +export const REGEX_FORMAT = /Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g diff --git a/src/index.js b/src/index.js index 85cfeddc7..9b7ccb0bb 100644 --- a/src/index.js +++ b/src/index.js @@ -255,6 +255,8 @@ class Dayjs { return String(this.$s) case 'ss': return Utils.padStart(this.$s, 2, '0') + case 'SSS': + return Utils.padStart(this.$ms, 3, '0') case 'Z': return `${this.$zoneStr.slice(0, -2)}:00` default: // 'ZZ' diff --git a/test/display.test.js b/test/display.test.js index 607f0544b..e8d385f66 100644 --- a/test/display.test.js +++ b/test/display.test.js @@ -73,6 +73,9 @@ it('Format Minute m mm', () => { it('Format Second s sss', () => { expect(dayjs().format('s')).toBe(moment().format('s')) expect(dayjs().format('ss')).toBe(moment().format('ss')) + expect(dayjs().format('SSS')).toBe(moment().format('SSS')) + const date = '2011-11-05T14:48:01.002Z' + expect(dayjs(date).format('s-ss-SSS')).toBe(moment(date).format('s-ss-SSS')) }) it('Format Time Zone ZZ', () => { From 547e8e1a8a90eb870127f01b67c76b63dd09a8e5 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 00:26:25 +0800 Subject: [PATCH 16/24] docs: ms --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0f2441e3a..fd09bc796 100644 --- a/README.md +++ b/README.md @@ -358,6 +358,7 @@ List of all available formats: | `mm` | 00-59 | The minute, 2-digits | | `s` | 0-59 | The second | | `ss` | 00-59 | The second, 2-digits | +| `SSS` | 000-999 | The millisecond, 3-digits | | `Z` | +5:00 | The offset from UTC | | `ZZ` | +0500 | The offset from UTC, 2-digits | | `A` | AM PM | | From c9c0abda7b4438cd4a592fb746fc7e2b6820ab87 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 01:39:46 +0800 Subject: [PATCH 17/24] fix: format allow escaping char --- src/constant.js | 2 +- src/index.js | 1 + test/display.test.js | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/constant.js b/src/constant.js index 665dc1161..8585346f9 100644 --- a/src/constant.js +++ b/src/constant.js @@ -27,4 +27,4 @@ export const FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ' // regex export const REGEX_PARSE = /^(\d{4})-?(\d{2})-?(\d{1,2})$/ -export const REGEX_FORMAT = /Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g +export const REGEX_FORMAT = /\[.*?\]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g diff --git a/src/index.js b/src/index.js index 9b7ccb0bb..4f53a5b6a 100644 --- a/src/index.js +++ b/src/index.js @@ -214,6 +214,7 @@ class Dayjs { format(formatStr) { const str = formatStr || C.FORMAT_DEFAULT return str.replace(C.REGEX_FORMAT, (match) => { + if (match.indexOf('[') > -1) return match.replace(/\[|\]/g, '') switch (match) { case 'YY': return String(this.$y).slice(-2) diff --git a/test/display.test.js b/test/display.test.js index e8d385f66..ebeb870b7 100644 --- a/test/display.test.js +++ b/test/display.test.js @@ -97,6 +97,11 @@ it('Format Complex with other string - : / ', () => { expect(dayjs().format(string)).toBe(moment().format(string)) }) +it('Format Escaping characters', () => { + const string = '[Z] Z' + expect(dayjs().format(string)).toBe(moment().format(string)) +}) + describe('Difference', () => { it('empty -> default milliseconds', () => { const dateString = '20110101' From 0315f3cde999480dd2dcc46955f935bb07234934 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 10:55:33 +0800 Subject: [PATCH 18/24] fix: add YYYY-MM-DD hh:mm:ss support --- src/constant.js | 2 +- src/index.js | 5 ++++- test/parse.test.js | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/constant.js b/src/constant.js index 8585346f9..8cc8db2b8 100644 --- a/src/constant.js +++ b/src/constant.js @@ -26,5 +26,5 @@ export const MONTHS = 'January.February.March.April.May.June.July.August.Septemb export const FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ' // regex -export const REGEX_PARSE = /^(\d{4})-?(\d{2})-?(\d{1,2})$/ +export const REGEX_PARSE = /^(\d{4})-?(\d{2})-?(\d{1,2})(.*(\d{2}):(\d{2}):(\d{2}))?.?(\d{3})?$/ export const REGEX_FORMAT = /\[.*?\]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g diff --git a/src/index.js b/src/index.js index 4f53a5b6a..a2d0c5038 100644 --- a/src/index.js +++ b/src/index.js @@ -9,7 +9,7 @@ const parseConfig = (config) => { // eslint-disable-next-line no-cond-assign if (reg = String(config).match(C.REGEX_PARSE)) { // 2018-08-08 or 20180808 - return new Date(reg[1], reg[2] - 1, reg[3]) + return new Date(reg[1], reg[2] - 1, reg[3], reg[5], reg[6], reg[7], reg[8] || 0) } return new Date(config) // timestamp } @@ -324,6 +324,9 @@ class Dayjs { } toISOString() { + // ie 8 return + // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000) + // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') return this.toDate().toISOString() } diff --git a/test/parse.test.js b/test/parse.test.js index efca391cb..4e01cc55f 100644 --- a/test/parse.test.js +++ b/test/parse.test.js @@ -16,7 +16,7 @@ describe('Parse', () => { }) it('String 20130208', () => { - const timeArr = ['20130108', '2018-04-24'] + const timeArr = ['20130108', '2018-04-24', '2018-05-02 11:12:13', '2018-05-02 11:12:13.998'] timeArr.forEach((t) => { expect(dayjs(t).valueOf()).toBe(moment(t).valueOf()) }) From 3138f6b4268a325b98e02527458bad2dd0ff8f9c Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 10:59:54 +0800 Subject: [PATCH 19/24] chore: check gzip size --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 81c9d704a..262f11a8d 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,10 @@ "scripts": { "test": "jest", "lint": "./node_modules/.bin/eslint src/* test/*", - "build": "BABEL_ENV=build rollup -c", + "build": "BABEL_ENV=build rollup -c && npm run gzip-size", "sauce": "npx karma start karma.sauce.conf.js", - "test:sauce": "npm run sauce -- 0 && npm run sauce -- 1 && npm run sauce -- 2" + "test:sauce": "npm run sauce -- 0 && npm run sauce -- 1 && npm run sauce -- 2", + "gzip-size": "gzip-size ./dist/*.min.js" }, "pre-commit": [ "lint" @@ -39,6 +40,7 @@ "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.10.0", "eslint-plugin-jest": "^21.15.0", + "gzip-size-cli": "^2.1.0", "jasmine-core": "^2.99.1", "jest": "^22.4.3", "karma": "^2.0.2", From 7f1c33e5b448e4487529c8580d33805b9c932f07 Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 6 May 2018 11:00:37 +0800 Subject: [PATCH 20/24] chore: no gzip in ci --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 262f11a8d..37830afc7 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "test": "jest", "lint": "./node_modules/.bin/eslint src/* test/*", - "build": "BABEL_ENV=build rollup -c && npm run gzip-size", + "build": "BABEL_ENV=build rollup -c", "sauce": "npx karma start karma.sauce.conf.js", "test:sauce": "npm run sauce -- 0 && npm run sauce -- 1 && npm run sauce -- 2", "gzip-size": "gzip-size ./dist/*.min.js" From be8c89ff91a10344127a44a97f54e5a2cb9b4629 Mon Sep 17 00:00:00 2001 From: iamkun Date: Mon, 7 May 2018 00:26:51 +0800 Subject: [PATCH 21/24] test: add browser test --- karma.sauce.conf.js | 5 ++--- test/browser.spec.js | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/karma.sauce.conf.js b/karma.sauce.conf.js index a5bdcddb3..5b29c4799 100644 --- a/karma.sauce.conf.js +++ b/karma.sauce.conf.js @@ -33,11 +33,10 @@ module.exports = function (config) { } }, { - sl_ie_8: { + sl_ie_9: { base: 'SauceLabs', browserName: 'internet explorer', - platform: 'Windows 7', - version: '8' + version: '9' }, sl_ie: { base: 'SauceLabs', diff --git a/test/browser.spec.js b/test/browser.spec.js index ecebb5475..ddca844f5 100644 --- a/test/browser.spec.js +++ b/test/browser.spec.js @@ -1,14 +1,22 @@ /* eslint-disable prefer-arrow-callback,func-names */ // Please do NOT modify or change this file // Checkout our unit test files in test/*.test.js -describe('Day.js init', function () { +describe('Install', function () { it('window.dayjs ', function () { if (!window.dayjs) throw new Error('No window.dayjs') }) }) -describe('dayjs', function () { - it('dayjs init', function () { - expect(dayjs(1523520536000).valueOf()).toBe(1523520536000) +describe('Core APIs', function () { + it('Chain Methods', function () { + expect(dayjs('2011-02-05T14:48:00.000Z') + .clone() + .set('month', 3) + .set('second', 30) + .endOf('month') + .startOf('week') + .add(1, 'day') + .subtract(1, 'year') + .format('{YYYY} MM-DDTHH:mm:ss')).toBe('{2010} 04-25T00:00:00') }) }) From f12f90dcc2ef5694ce278a5e981cadd1da162290 Mon Sep 17 00:00:00 2001 From: iamkun Date: Mon, 7 May 2018 00:35:25 +0800 Subject: [PATCH 22/24] ci: ci sauce --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3343431b3..e079332aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ script: - npm test - codecov after_success: - - if [ "$TRAVIS_BRANCH" == "feature/saucelab" ]; then + - if [ "$TRAVIS_BRANCH" == "master" ]; then npx travis-deploy-once && npm run build && npx semantic-release && npm run test:sauce; fi branches: From 837dd686c6726595b19a1361f14d99edf7f9829e Mon Sep 17 00:00:00 2001 From: iamkun Date: Mon, 7 May 2018 00:40:16 +0800 Subject: [PATCH 23/24] docs: add escape docs --- README.md | 4 +++- README.zh-CN.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd09bc796..2a2a4407f 100644 --- a/README.md +++ b/README.md @@ -333,9 +333,11 @@ Takes a string of tokens and replaces them with their corresponding date values. ```js dayjs().format(String); dayjs().format(); // "2014-09-08T08:02:17-05:00" (ISO 8601, no fractional seconds) -dayjs().format('[YYYY] MM-DDTHH:mm:ssZ'); // "[2014] 09-08T08:02:17-05:00" +dayjs().format('{YYYY} MM-DDTHH:mm:ssZ[Z]'); // "{2014} 09-08T08:02:17-05:00Z" ``` +* To escape characters in string, wrap the characters in square brackets (e.g. [Z]). + List of all available formats: | Format | Output | Description | diff --git a/README.zh-CN.md b/README.zh-CN.md index 1084baf1d..8fe264c57 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -245,7 +245,7 @@ dayjs().endOf('month'); ```js dayjs().format(String); dayjs().format(); // "2014-09-08T08:02:17-05:00" (ISO 8601, no fractional seconds) -dayjs().format("[YYYY] MM-DDTHH:mm:ssZ"); // "[2014] 09-08T08:02:17-05:00" +dayjs().format("{YYYY} MM-DDTHH:mm:ssZ[Z]"); // "{2014} 09-08T08:02:17-05:00Z" ``` 详情如下: From 0a78369157a62c8c748b03d69d5d080794a47c84 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 6 May 2018 16:33:38 +0400 Subject: [PATCH 24/24] Fix #105 padZoneStr function from utils.js file was been rewritten to support timezones with non-zero minutes. GMT +5:30 for example. --- src/index.js | 6 +++--- src/utils.js | 16 +++++++--------- test/utils.test.js | 11 ++++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/index.js b/src/index.js index aee68dbb6..d1d2e30cc 100644 --- a/src/index.js +++ b/src/index.js @@ -21,7 +21,7 @@ class Dayjs { } init() { - this.$zone = this.$d.getTimezoneOffset() / 60 + this.$zone = this.$d.getTimezoneOffset() this.$zoneStr = Utils.padZoneStr(this.$zone) this.$y = this.$d.getFullYear() this.$M = this.$d.getMonth() @@ -257,9 +257,9 @@ class Dayjs { case 'ss': return Utils.padStart(this.$s, 2, '0') case 'Z': - return `${this.$zoneStr.slice(0, -2)}:00` - default: // 'ZZ' return this.$zoneStr + default: // 'ZZ' + return this.$zoneStr.replace(':', '') } }) } diff --git a/src/utils.js b/src/utils.js index 6ba532f48..8fb72ae7f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -4,15 +4,13 @@ export const padStart = (string, length, pad) => { return `${Array((length + 1) - s.length).join(pad)}${string}` } -export const padZoneStr = (negHour) => { - const hour = negHour * -1 - let replacer = '' - if (hour > -10 && hour < 10) { - replacer = '$10$200' - } else { - replacer = '$1$200' - } - return padStart(String(hour).replace(/^(.)?(\d)/, replacer), 5, '+') +export const padZoneStr = (negMinuts) => { + const minutes = Math.abs(negMinuts) + const sign = negMinuts <= 0 ? '+' : '-' + const hourOffset = Math.floor(minutes / 60) + const minuteOffset = minutes % 60 + + return `${sign}${padStart(hourOffset, 2, '0')}:${padStart(minuteOffset, 2, '0')}` } export const isNumber = n => (!Number.isNaN(parseFloat(n)) && Number.isFinite(n)) diff --git a/test/utils.test.js b/test/utils.test.js index 067693d0a..5ab21fddc 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -14,11 +14,12 @@ it('PrettyUnit', () => { }) it('PadZoneStr', () => { - expect(padZoneStr('+0')).toBe('+0000') - expect(padZoneStr('+1')).toBe('-0100') - expect(padZoneStr('-1')).toBe('+0100') - expect(padZoneStr('-10')).toBe('+1000') - expect(padZoneStr('+10')).toBe('-1000') + expect(padZoneStr(0)).toBe('+00:00') + expect(padZoneStr(1 * 60)).toBe('-01:00') + expect(padZoneStr(-1 * 60)).toBe('+01:00') + expect(padZoneStr(-10 * 60)).toBe('+10:00') + expect(padZoneStr(10 * 60)).toBe('-10:00') + expect(padZoneStr((-5 * 60) - 30)).toBe('+05:30') }) it('PadStart', () => {