weekstart
Version:
Library to get first day of week.
90 lines (84 loc) • 3.05 kB
JavaScript
/**
* Functions to get first day of week.
*
* @module api
*/
/**
* Return first day of week for country/region code.
*
* @example
* getWeekStartByRegion('PNG', {}); // 1
* getWeekStartByRegion('png', {BR: 0, PNG: 3, EG: 6}); // 3
* getWeekStartByRegion('qa', {QA: 6}); // 6
* getWeekStartByRegion(50, {BD: 5, 50: 5, SD: 6}); // 5
*
* @param {number | string} regionCode
* ISO 3166 Alpha-2, Alpha-3 or numeric code.
* @param {object} regionDayMap
* Mapping of country/region code to first day of week that should be used to get result.
* Country codes should be in upper case.
* @return {number}
* Code of first day of week for the given country/region code:
* 0 - Sunday, 1 - Monday, 2 - Tuesday, 3 - Wednesday, 4 - Thursday, 5 - Friday, 6 - Saturday.
* @alias module:api.getWeekStartByRegion
*/
export function getWeekStartByRegion(regionCode, regionDayMap) {
/* eslint-disable indent */
const code = regionDayMap[typeof regionCode === 'string'
? regionCode.toUpperCase()
: regionCode];
/* eslint-enable indent */
return typeof code === 'number'
? code
: 1;
}
/**
* Return first day of week for locale identifier.
*
* @example
* getWeekStartByLocale('no', {}, {}); // 1
* getWeekStartByLocale('no', {no: 'abc'}, {ABC: 3}); // 3
* getWeekStartByLocale('KK_arab', {kk_arab: 'CN'}, {CN: 0}); // 0
* getWeekStartByLocale('fr-DZ', {fr: 'FR'}, {FR: 1, DZ: 6}); // 6
*
* @param {string} locale
* Locale identifier.
* @param {object} langRegionMap
* Mapping of language code to country/region code that should be used to get result.
* Language codes should be in lower case.
* @param {object} regionDayMap
* Mapping of country/region code to first day of week that should be used to get result.
* Country codes should be in upper case.
* @return {number}
* Code of first day of week for the given locale identifier:
* 0 - Sunday, 1 - Monday, 2 - Tuesday, 3 - Wednesday, 4 - Thursday, 5 - Friday, 6 - Saturday.
* @alias module:api.getWeekStartByLocale
*/
export function getWeekStartByLocale(locale, langRegionMap, regionDayMap) {
if (locale) {
// Locale form: http://www.unicode.org/reports/tr35/tr35.html#Unicode_Language_and_Locale_Identifiers
const data = locale.toLowerCase().split(/[-_]/);
const langTag = data[0];
let language = langTag;
let country;
if (data[1] && data[1].length === 4) {
language += `_${data[1]}`;
country = data[2];
}
else {
country = data[1];
}
if (! country) {
country = langRegionMap[language] || langRegionMap[langTag];
}
if (country) {
return getWeekStartByRegion(
country.match(/^\d+$/)
? Number(country)
: country,
regionDayMap
);
}
}
return 1;
}