iana-tz-json-generator-and-importer
Version:
Quickly get timezone names and metadata from the IANA into your application in the format you want.
55 lines (45 loc) • 1.68 kB
text/typescript
//@ts-ignore
import * as decompressTargz from 'decompress-targz';
import fetch from 'node-fetch';
import {removeLineBreaks} from '../util/util';
export interface getIANATzDataParams {
url?: string
filesToExtract?: string[]
fileEncoding?: BufferEncoding
}
interface IANAFileResult {
data: Buffer
mode: number
mtime: Date
path: string
type: string
}
export interface IANATzDataFiles {
version: string
[key: string]: string
}
export async function getIANATzData(params?: getIANATzDataParams, _fetch: any=fetch): Promise<IANATzDataFiles> {
const defaults = {
url: 'https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz',
filesToExtract: ['zone.tab', 'zone1970.tab'],
fileEncoding: 'utf8'
};
const {url, filesToExtract, fileEncoding} = Object.assign(defaults, params);
const result = await _fetch(url);
if(!result.ok) {
throw new Error(`Fetch failed: ${result.status}`)
}
const buffer = await result.buffer();
const decompressed: IANAFileResult[] = await decompressTargz()(buffer);
const IANATzDataFiles: IANATzDataFiles = decompressed.reduce((acc: IANATzDataFiles, file) => {
const fileName = file.path;
if(filesToExtract.includes(fileName) || fileName === 'version') {
const document = file.data.toString(fileEncoding);
acc[fileName] = document
}
return acc
}, {version: 'no version file found'});
// replace line break so they don't show up in the handlebars template and break JSON parsing
IANATzDataFiles.version = removeLineBreaks(IANATzDataFiles.version);
return IANATzDataFiles
}