UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)

108 lines 14 kB
/** * @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=