module.exports = function (grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), env: { sauceLabs: grunt.file.exists('.sauce-labs.creds') ? grunt.file.readJSON('.sauce-labs.creds') : {}, }, karma: { options: { browserNoActivityTimeout: 60000, browserDisconnectTimeout: 10000, browserDisconnectTolerance: 2, frameworks: ['qunit'], files: ['min/moment-with-locales.js', 'min/tests.js'], sauceLabs: { startConnect: true, testName: 'MomentJS', }, customLaunchers: { slChromeWinXp: { base: 'SauceLabs', browserName: 'chrome', platform: 'Windows XP', }, slIe10Win7: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '10', }, slIe9Win7: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '9', }, slIe8Win7: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '8', }, slIe11Win10: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 10', version: '11', }, slME25Win10: { base: 'SauceLabs', browserName: 'MicrosoftEdge', platform: 'Windows 10', version: '20.10240', }, slFfLinux: { base: 'SauceLabs', browserName: 'firefox', platform: 'Linux', }, slSafariOsx: { base: 'SauceLabs', browserName: 'safari', platform: 'OS X 10.8', }, slSafariOsx11: { base: 'SauceLabs', browserName: 'safari', platform: 'OS X 10.11', }, }, }, server: { browsers: [], }, chrome: { singleRun: true, browsers: ['Chrome'], }, firefox: { singleRun: true, browsers: ['Firefox'], }, sauce: { options: { reporters: ['dots'], }, singleRun: true, browsers: [ 'slChromeWinXp', 'slIe10Win7', 'slIe9Win7', 'slIe8Win7', 'slIe11Win10', 'slME25Win10', 'slFfLinux', 'slSafariOsx', ], }, }, uglify: { main: { files: { 'min/moment-with-locales.min.js': 'min/moment-with-locales.js', 'min/locales.min.js': 'min/locales.js', 'min/moment.min.js': 'moment.js', }, }, options: { sourceMap: true, mangle: true, compress: { dead_code: false, }, output: { ascii_only: true, }, report: 'min', preserveComments: /^!|@preserve|@license|@cc_on/i, }, }, watch: { test: { files: ['src/**/*.js'], tasks: ['test'], }, }, benchmark: { compare: { src: ['benchmarks/compare.js'] }, startOf: { src: ['benchmarks/startOf.js'] }, endOf: { src: ['benchmarks/endOf.js'] }, get: { src: ['benchmarks/get.js'] }, set: { src: ['benchmarks/set.js'] }, all: { src: ['benchmarks/*.js'] }, }, exec: { 'meteor-init': { // Make sure Meteor is installed, per https://meteor.com/install. // The curl'ed script is safe; takes 2 minutes to read source & check. command: 'type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; }', }, 'meteor-publish': { command: 'cd meteor && meteor publish', }, 'typescript-test': { command: 'npm run typescript-test', }, 'ts3.1-typescript-test': { command: 'npm run ts3.1-typescript-test', }, coveralls: { command: 'npm run coveralls', }, eslint: { command: 'npm run eslint', }, checkMonthsParseIssue: { // Each locale should have all (3) or none (0) of monthsParse: configs. command: 'if [ $(ls src/locale/* | while read -r line; do grep -i "monthsParse:" $line | wc -l; done | sort | uniq | wc -l) -ne 2 ]; then echo "Months parse issue: see https://github.com/moment/moment/issues/2754"; exit 1; fi', }, 'prettier-fmt': { command: function () { var nodeMajor = parseInt( process.version.slice(1).split('.')[0], 10 ); if (nodeMajor < 10) { return "echo 'NOT running prettier on node < v10'"; } return 'npm run prettier-fmt'; }, }, 'prettier-check': { command: function () { var nodeMajor = parseInt( process.version.slice(1).split('.')[0], 10 ); if (nodeMajor < 10) { return "echo 'NOT running prettier on node < v10'"; } return 'npm run prettier-check'; }, }, }, }); grunt.loadTasks('tasks'); // These plugins provide necessary tasks. require('load-grunt-tasks')(grunt); // Default task. grunt.registerTask('default', ['lint', 'test']); // linting grunt.registerTask('lint', [ 'exec:eslint', 'exec:prettier-check', 'exec:checkMonthsParseIssue', ]); // test tasks grunt.registerTask('test', [ 'test:node', 'test:typescript', 'test:typescript-3.1', ]); grunt.registerTask('test:node', ['transpile', 'qtest']); grunt.registerTask('test:typescript', ['exec:typescript-test']); grunt.registerTask('test:typescript-3.1', ['exec:ts3.1-typescript-test']); // TODO: For some weird reason karma doesn't like the files in // build/umd/min/* but works with min/*, so update-index, then git checkout grunt.registerTask('test:server', [ 'transpile', 'update-index', 'karma:server', ]); grunt.registerTask('test:browser', [ 'transpile', 'update-index', 'karma:chrome', 'karma:firefox', ]); grunt.registerTask('test:sauce-browser', [ 'transpile', 'update-index', 'env:sauceLabs', 'karma:sauce', ]); grunt.registerTask('test:meteor', [ 'exec:meteor-init', 'exec:meteor-test', 'exec:meteor-cleanup', ]); // travis build task grunt.registerTask('build:travis', ['lint', 'exec:coveralls']); grunt.registerTask('meteor-publish', [ 'exec:meteor-init', 'exec:meteor-publish', 'exec:meteor-cleanup', ]); // Task to be run when releasing a new version grunt.registerTask('release', [ 'default', 'update-index', 'component', 'uglify:main', ]); };