Skip to content

Commit 731e1be

Browse files
committed
feat: Introduce command-line generator for custom time zone data
1 parent be02f21 commit 731e1be

2 files changed

Lines changed: 123 additions & 0 deletions

File tree

bin/create-timezone-data

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env node
2+
3+
'use strict'
4+
5+
const commander = require('commander')
6+
const { createTimeZoneData } = require('../util/data-creator')
7+
const pkg = require('../package.json')
8+
9+
commander.version(pkg.version)
10+
.description('Generates time zone data for a selected year range.')
11+
.usage('[options] <first year> <last year>')
12+
.option('-a, --all-years', 'includes all available years')
13+
.option('-c, --as-cjs-module', 'format the time zone data as a CommonJS module')
14+
.option('-d, --as-amd-module', 'format the time zone data as an AMD module')
15+
.option('-m, --as-module', 'format the time zone data as a JavaScript module')
16+
.option('-n, --umd-name <name>', 'UMD global export name, if not "timeZoneData"')
17+
.option('-o, --output-file <file>', 'write the time zone data to a file')
18+
.option('-u, --as-umd-module', 'format the time zone data as an UMD module')
19+
.option('-o, --output-file <file>', 'write the time zone data to a file')
20+
21+
commander.on('--help', function () {
22+
console.log()
23+
console.log(' Time zone data are printed on the standard output as JSON by default.')
24+
console.log()
25+
console.log(' Examples:')
26+
console.log()
27+
console.log(' $ create-timezone-data 2012 2022')
28+
console.log(' $ create-timezone-data -m -o custom-data.js 1970 2038')
29+
})
30+
31+
commander.parse(process.argv)
32+
const [ firstYear, lastYear ] = commander.args
33+
if (!(firstYear && lastYear) && !commander.allYears) {
34+
commander.help()
35+
}
36+
37+
const {
38+
asModule, asCjsModule, asAmdModule, asUmdModule, umdName, outputFile
39+
} = commander
40+
createTimeZoneData({
41+
firstYear,
42+
lastYear,
43+
asModule,
44+
asCjsModule,
45+
asAmdModule,
46+
asUmdModule,
47+
umdName,
48+
outputFile
49+
})
50+
.then(timeZoneData => {
51+
if (!outputFile) {
52+
console.log(timeZoneData)
53+
}
54+
})
55+
.catch(error => {
56+
console.error(error.message)
57+
process.exitCode = 1
58+
})

util/data-creator.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
const { outputFile: writeFile } = require('fs-extra')
2+
const tz = require('../node_modules/moment-timezone/moment-timezone-utils').tz
3+
const groupLeaders = require('./data/group-leaders.json')
4+
const unpackedTimeZoneData = require('./data/unpacked.json')
5+
const packedTimeZoneData = require('./data/packed.json')
6+
7+
function limitData (firstYear, lastYear) {
8+
return firstYear && lastYear
9+
? tz.filterLinkPack(unpackedTimeZoneData, firstYear, lastYear, groupLeaders)
10+
: packedTimeZoneData
11+
}
12+
13+
function formatES6Module (content) {
14+
return `export default ${content}`
15+
}
16+
17+
function formatCJSModule (content) {
18+
return `module.exports = ${content}`
19+
}
20+
21+
function formatAMDModule (content) {
22+
return `define(function () {
23+
return ${content}
24+
})`
25+
}
26+
27+
function formatUMDModule (content, umdName) {
28+
return `(function (global, factory) {
29+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
30+
typeof define === 'function' && define.amd ? define(['exports'], factory) :
31+
factory(global.${umdName || 'timeZoneData'} = {})
32+
} (this, (function (exports) {
33+
Object.assign(exports, ${content})
34+
Object.defineProperty(exports, '__esModule', { value: true })
35+
})))`
36+
}
37+
38+
function createTimeZoneData (options = {}) {
39+
const {
40+
asModule, asCjsModule, asAmdModule, asUmdModule, umdName,
41+
firstYear, lastYear, outputFile
42+
} = options
43+
const data = limitData(firstYear, lastYear)
44+
let content = JSON.stringify(data, undefined, 2)
45+
if (asModule) {
46+
content = formatES6Module(content)
47+
} else if (asCjsModule) {
48+
content = formatCJSModule(content)
49+
} else if (asAmdModule) {
50+
content = formatAMDModule(content)
51+
} else if (asUmdModule) {
52+
content = formatUMDModule(content, umdName)
53+
}
54+
if (outputFile) {
55+
if (firstYear && lastYear) {
56+
console.log(`Writing time zone data for ${firstYear}-${lastYear} to "${outputFile}"...`)
57+
} else {
58+
console.log(`Writing all time zone data to "${outputFile}"...`)
59+
}
60+
return writeFile(outputFile, content)
61+
}
62+
return Promise.resolve(content)
63+
}
64+
65+
exports.createTimeZoneData = createTimeZoneData

0 commit comments

Comments
 (0)