@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
108 lines • 14 kB
JavaScript
/**
* @author pfontanet
* @since 0.9
*/
import { jsonPath2Value } from '@edugouvfr/ngx-dsfr';
//TODO: à déplacer dans la lib ngx-dsfr
export class DateUtils {
constructor() { }
/**
* Parse une chaine selon le format 'fr' si codeLang = 'fr', 'en'
* @returns Date ou undefined
*/
static parse(codeLang, dateStr) {
if (dateStr === undefined)
return undefined;
return codeLang === 'fr' ? DateUtils.parseDateFr(dateStr) : DateUtils.parseDateEn(dateStr);
}
/**
* Parse une chaîne au format `'mm/dd/yyyy'` (1 digit pour mois et jour accepté)
* @returns Date ou undefined
*/
static parseDateFr(dateStr) {
const regexp = /^(?<day>3[01]|0?[1-9]|[12][0-9])\/(?<month>1[0-2]|0?[1-9])\/(?<year>[0-9]{4})$/;
return DateUtils.parseDate(dateStr, regexp);
}
/**
* Parse une chaîne au format `'dd/mm/yyyy'` (1 digit pour mois et jour accepté)
* @returns Date ou undefined
*/
static parseDateEn(dateStr) {
const regexp = /^(?<month>1[0-2]|0?[1-9])\/(?<day>3[01]|0?[1-9]|[12][0-9])\/(?<year>[0-9]{4})$/;
return DateUtils.parseDate(dateStr, regexp);
}
/**
* Parse une chaîne au format ISO 8601
* @returns Date ou undefined
*/
static parseDateIso(dateStr) {
// https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html
const regexp = /^(?<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?<month>1[0-2]|0[1-9])-(?<day>3[01]|0[1-9]|[12][0-9])(T(?<hour>2[0-4]|[01][0-9]):(?<minute>[0-5][0-9]):(?<second>[0-5][0-9])(?<ms>\.[0-9]+)?(?<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?)?$/;
return DateUtils.parseDate(dateStr, regexp);
}
/**
* Retourne une Date UTC, sans heure, minute seconde, à partir d'une date
* @param date
*/
static date2Utc(date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
}
/**
* Retourne une Date UTC, sans heure, minute seconde, selon plusieurs formats en entrée
* @param value
*/
static dateUtcOf(value) {
let date = undefined;
if (typeof value === 'string')
date = DateUtils.parseDateIso(value);
else if (typeof value === 'number')
date = DateUtils.numberToDateUtc(value);
else if (value)
date = DateUtils.date2Utc(value);
return date;
}
static format(codeLang, date) {
if (date === undefined)
return '';
const code = codeLang === 'fr' ? codeLang : 'en';
return date.toLocaleDateString(code);
}
//FIXME: à relocaliser dans ngx-dsfr#I18nService
static arr(i18n, logger, jsonPath) {
let arr = jsonPath2Value(i18n.currentBundle, jsonPath);
if (!arr) {
logger.warn(`Aucune traduction pour '${jsonPath}'`);
arr = [];
}
return arr;
}
/** Date valide au format dd/mm/yyyy ou mm/dd/yyyy */
static isValidDefaultString(boundaryString) {
const dateRegex = /^\d{2}\/\d{2}\/\d{4}$/;
return dateRegex.test(boundaryString);
}
/**
* Parse la date en fonction d'une expression régulière
* @param dateStr String représentant la date
* @param regexp
* @return Date ou undefined si dateStr ne respecte pas la regexp
*/
static parseDate(dateStr, regexp) {
if (!dateStr)
return undefined;
const execArr = regexp.exec(dateStr);
const groups = execArr?.groups;
if (groups === undefined)
return undefined;
let year = Number(groups['year']);
const month = Number(groups['month']);
const day = Number(groups['day']);
const valid = Number.isInteger(year) && Number.isInteger(month) && Number.isInteger(day);
return !valid ? undefined : new Date(Date.UTC(year, month - 1, day));
}
static numberToDateUtc(n) {
const d = new Date(n);
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWV4dC9zcmMvbGliL3NoYXJlZC91dGlscy9kYXRlL2RhdGUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFtQixjQUFjLEVBQWlCLE1BQU0scUJBQXFCLENBQUM7QUFFckYsdUNBQXVDO0FBQ3ZDLE1BQU0sT0FBTyxTQUFTO0lBQ3BCLGdCQUF1QixDQUFDO0lBRXhCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxPQUEyQjtRQUN4RCxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUMsT0FBTyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsTUFBTSxNQUFNLEdBQUcsZ0ZBQWdGLENBQUM7UUFDaEcsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFlO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLGdGQUFnRixDQUFDO1FBQ2hHLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBZTtRQUNqQywrRkFBK0Y7UUFDL0YsTUFBTSxNQUFNLEdBQ1YsME9BQTBPLENBQUM7UUFFN08sT0FBTyxTQUFT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QVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQVM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBhdXRob3IgcGZvbnRhbmV0XG4gKiBAc2luY2UgMC45XG4gKi9cblxuaW1wb3J0IHsgRHNmckkxOG5TZXJ2aWNlLCBqc29uUGF0aDJWYWx1ZSwgTG9nZ2VyU2VydmljZSB9IGZyb20gJ0BlZHVnb3V2ZnIvbmd4LWRzZnInO1xuXG4vL1RPRE86IMOgIGTDqXBsYWNlciBkYW5zIGxhIGxpYiBuZ3gtZHNmclxuZXhwb3J0IGNsYXNzIERhdGVVdGlscyB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBQYXJzZSB1bmUgY2hhaW5lIHNlbG9uIGxlIGZvcm1hdCAnZnInIHNpIGNvZGVMYW5nID0gJ2ZyJywgJ2VuJ1xuICAgKiBAcmV0dXJucyBEYXRlIG91IHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIHBhcnNlKGNvZGVMYW5nOiBzdHJpbmcsIGRhdGVTdHI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmIChkYXRlU3RyID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvZGVMYW5nID09PSAnZnInID8gRGF0ZVV0aWxzLnBhcnNlRGF0ZUZyKGRhdGVTdHIpIDogRGF0ZVV0aWxzLnBhcnNlRGF0ZUVuKGRhdGVTdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHVuZSBjaGHDrm5lIGF1IGZvcm1hdCBgJ21tL2RkL3l5eXknYCAoMSBkaWdpdCBwb3VyIG1vaXMgZXQgam91ciBhY2NlcHTDqSlcbiAgICogQHJldHVybnMgRGF0ZSBvdSB1bmRlZmluZWRcbiAgICovXG4gIHN0YXRpYyBwYXJzZURhdGVGcihkYXRlU3RyOiBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWdleHAgPSAvXig/PGRheT4zWzAxXXwwP1sxLTldfFsxMl1bMC05XSlcXC8oPzxtb250aD4xWzAtMl18MD9bMS05XSlcXC8oPzx5ZWFyPlswLTldezR9KSQvO1xuICAgIHJldHVybiBEYXRlVXRpbHMucGFyc2VEYXRlKGRhdGVTdHIsIHJlZ2V4cCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdW5lIGNoYcOubmUgYXUgZm9ybWF0IGAnZGQvbW0veXl5eSdgICgxIGRpZ2l0IHBvdXIgbW9pcyBldCBqb3VyIGFjY2VwdMOpKVxuICAgKiBAcmV0dXJucyBEYXRlIG91IHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIHBhcnNlRGF0ZUVuKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC9eKD88bW9udGg+MVswLTJdfDA/WzEtOV0pXFwvKD88ZGF5PjNbMDFdfDA/WzEtOV18WzEyXVswLTldKVxcLyg/PHllYXI+WzAtOV17NH0pJC87XG4gICAgcmV0dXJuIERhdGVVdGlscy5wYXJzZURhdGUoZGF0ZVN0ciwgcmVnZXhwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSB1bmUgY2hhw65uZSBhdSBmb3JtYXQgSVNPIDg2MDFcbiAgICogQHJldHVybnMgRGF0ZSBvdSB1bmRlZmluZWRcbiAgICovXG4gIHN0YXRpYyBwYXJzZURhdGVJc28oZGF0ZVN0cjogc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gaHR0cHM6Ly93d3cub3JlaWxseS5jb20vbGlicmFyeS92aWV3L3JlZ3VsYXItZXhwcmVzc2lvbnMtY29va2Jvb2svOTc4MTQ0OTMyNzQ1My9jaDA0czA3Lmh0bWxcbiAgICBjb25zdCByZWdleHAgPVxuICAgICAgL14oPzx5ZWFyPi0/KD86WzEtOV1bMC05XSopP1swLTldezR9KS0oPzxtb250aD4xWzAtMl18MFsxLTldKS0oPzxkYXk+M1swMV18MFsxLTldfFsxMl1bMC05XSkoVCg/PGhvdXI+MlswLTRdfFswMV1bMC05XSk6KD88bWludXRlPlswLTVdWzAtOV0pOig/PHNlY29uZD5bMC01XVswLTldKSg/PG1zPlxcLlswLTldKyk/KD88dGltZXpvbmU+WnxbKy1dKD86MlswLTNdfFswMV1bMC05XSk6WzAtNV1bMC05XSk/KT8kLztcblxuICAgIHJldHVybiBEYXRlVXRpbHMucGFyc2VEYXRlKGRhdGVTdHIsIHJlZ2V4cCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgdW5lIERhdGUgVVRDLCBzYW5zIGhldXJlLCBtaW51dGUgc2Vjb25kZSwgw6AgcGFydGlyIGQndW5lIGRhdGVcbiAgICogQHBhcmFtIGRhdGVcbiAgICovXG4gIHN0YXRpYyBkYXRlMlV0YyhkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG91cm5lIHVuZSBEYXRlIFVUQywgc2FucyBoZXVyZSwgbWludXRlIHNlY29uZGUsIHNlbG9uIHBsdXNpZXVycyBmb3JtYXRzIGVuIGVudHLDqWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzdGF0aWMgZGF0ZVV0Y09mKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIGRhdGUgPSBEYXRlVXRpbHMucGFyc2VEYXRlSXNvKHZhbHVlKTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBkYXRlID0gRGF0ZVV0aWxzLm51bWJlclRvRGF0ZVV0Yyh2YWx1ZSk7XG4gICAgZWxzZSBpZiAodmFsdWUpIGRhdGUgPSBEYXRlVXRpbHMuZGF0ZTJVdGModmFsdWUpO1xuXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBzdGF0aWMgZm9ybWF0KGNvZGVMYW5nOiBzdHJpbmcsIGRhdGU6IERhdGUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmIChkYXRlID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBjb25zdCBjb2RlID0gY29kZUxhbmcgPT09ICdmcicgPyBjb2RlTGFuZyA6ICdlbic7XG4gICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGNvZGUpO1xuICB9XG5cbiAgLy9GSVhNRTogw6AgcmVsb2NhbGlzZXIgZGFucyBuZ3gtZHNmciNJMThuU2VydmljZVxuICBzdGF0aWMgYXJyKGkxOG46IERzZnJJMThuU2VydmljZSwgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLCBqc29uUGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIGxldCBhcnIgPSA8YW55W10+anNvblBhdGgyVmFsdWUoKDxhbnk+aTE4bikuY3VycmVudEJ1bmRsZSwganNvblBhdGgpO1xuICAgIGlmICghYXJyKSB7XG4gICAgICBsb2dnZXIud2FybihgQXVjdW5lIHRyYWR1Y3Rpb24gcG91ciAnJHtqc29uUGF0aH0nYCk7XG4gICAgICBhcnIgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgLyoqIERhdGUgdmFsaWRlIGF1IGZvcm1hdCBkZC9tbS95eXl5IG91IG1tL2RkL3l5eXkgKi9cbiAgc3RhdGljIGlzVmFsaWREZWZhdWx0U3RyaW5nKGJvdW5kYXJ5U3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRlUmVnZXggPSAvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fSQvO1xuXG4gICAgcmV0dXJuIGRhdGVSZWdleC50ZXN0KGJvdW5kYXJ5U3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBsYSBkYXRlIGVuIGZvbmN0aW9uIGQndW5lIGV4cHJlc3Npb24gcsOpZ3VsacOocmVcbiAgICogQHBhcmFtIGRhdGVTdHIgU3RyaW5nIHJlcHLDqXNlbnRhbnQgbGEgZGF0ZVxuICAgKiBAcGFyYW0gcmVnZXhwXG4gICAqIEByZXR1cm4gRGF0ZSBvdSB1bmRlZmluZWQgc2kgZGF0ZVN0ciBuZSByZXNwZWN0ZSBwYXMgbGEgcmVnZXhwXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGUoZGF0ZVN0cjogc3RyaW5nLCByZWdleHA6IFJlZ0V4cCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGV4ZWNBcnIgPSByZWdleHAuZXhlYyhkYXRlU3RyKTtcbiAgICBjb25zdCBncm91cHMgPSBleGVjQXJyPy5ncm91cHM7XG4gICAgaWYgKGdyb3VwcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgbGV0IHllYXIgPSBOdW1iZXIoZ3JvdXBzWyd5ZWFyJ10pO1xuICAgIGNvbnN0IG1vbnRoID0gTnVtYmVyKGdyb3Vwc1snbW9udGgnXSk7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGdyb3Vwc1snZGF5J10pO1xuICAgIGNvbnN0IHZhbGlkID0gTnVtYmVyLmlzSW50ZWdlcih5ZWFyKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKG1vbnRoKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRheSk7XG5cbiAgICByZXR1cm4gIXZhbGlkID8gdW5kZWZpbmVkIDogbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG51bWJlclRvRGF0ZVV0YyhuOiBudW1iZXIpOiBEYXRlIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUobik7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGQuZ2V0VVRDRnVsbFllYXIoKSwgZC5nZXRVVENNb250aCgpLCBkLmdldFVUQ0RhdGUoKSkpO1xuICB9XG59XG4iXX0=