@angular/common
Version:
Angular - commonly needed directives and services
1,568 lines (1,559 loc) • 102 kB
JavaScript
/**
* @license Angular v21.0.6
* (c) 2010-2025 Google LLC. https://angular.dev/
* License: MIT
*/
import * as i0 from '@angular/core';
import { Injectable, Optional, Inject, ɵfindLocaleData as _findLocaleData, ɵLocaleDataIndex as _LocaleDataIndex, ɵgetLocaleCurrencyCode as _getLocaleCurrencyCode, ɵgetLocalePluralCase as _getLocalePluralCase, ɵRuntimeError as _RuntimeError, ɵformatRuntimeError as _formatRuntimeError, inject, LOCALE_ID, ɵstringify as _stringify, Directive, Input, createNgModule, NgModuleRef, Host, Attribute, RendererStyleFlags2, ɵINTERNAL_APPLICATION_ERROR_HANDLER as _INTERNAL_APPLICATION_ERROR_HANDLER, ɵisPromise as _isPromise, ɵisSubscribable as _isSubscribable, Pipe, untracked, InjectionToken, DEFAULT_CURRENCY_CODE, NgModule } from '@angular/core';
import { LocationStrategy, joinWithSlash, normalizeQueryParams, APP_BASE_HREF } from './_location-chunk.mjs';
import { PlatformLocation } from './_platform_location-chunk.mjs';
class HashLocationStrategy extends LocationStrategy {
_platformLocation;
_baseHref = '';
_removeListenerFns = [];
constructor(_platformLocation, _baseHref) {
super();
this._platformLocation = _platformLocation;
if (_baseHref != null) {
this._baseHref = _baseHref;
}
}
ngOnDestroy() {
while (this._removeListenerFns.length) {
this._removeListenerFns.pop()();
}
}
onPopState(fn) {
this._removeListenerFns.push(this._platformLocation.onPopState(fn), this._platformLocation.onHashChange(fn));
}
getBaseHref() {
return this._baseHref;
}
path(includeHash = false) {
const path = this._platformLocation.hash ?? '#';
return path.length > 0 ? path.substring(1) : path;
}
prepareExternalUrl(internal) {
const url = joinWithSlash(this._baseHref, internal);
return url.length > 0 ? '#' + url : url;
}
pushState(state, title, path, queryParams) {
const url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) || this._platformLocation.pathname;
this._platformLocation.pushState(state, title, url);
}
replaceState(state, title, path, queryParams) {
const url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) || this._platformLocation.pathname;
this._platformLocation.replaceState(state, title, url);
}
forward() {
this._platformLocation.forward();
}
back() {
this._platformLocation.back();
}
getState() {
return this._platformLocation.getState();
}
historyGo(relativePosition = 0) {
this._platformLocation.historyGo?.(relativePosition);
}
static ɵfac = i0.ɵɵngDeclareFactory({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: HashLocationStrategy,
deps: [{
token: PlatformLocation
}, {
token: APP_BASE_HREF,
optional: true
}],
target: i0.ɵɵFactoryTarget.Injectable
});
static ɵprov = i0.ɵɵngDeclareInjectable({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: HashLocationStrategy
});
}
i0.ɵɵngDeclareClassMetadata({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: HashLocationStrategy,
decorators: [{
type: Injectable
}],
ctorParameters: () => [{
type: PlatformLocation
}, {
type: undefined,
decorators: [{
type: Optional
}, {
type: Inject,
args: [APP_BASE_HREF]
}]
}]
});
const CURRENCIES_EN = {
"ADP": [undefined, undefined, 0],
"AFN": [undefined, "؋", 0],
"ALL": [undefined, undefined, 0],
"AMD": [undefined, "֏", 2],
"AOA": [undefined, "Kz"],
"ARS": [undefined, "$"],
"AUD": ["A$", "$"],
"AZN": [undefined, "₼"],
"BAM": [undefined, "KM"],
"BBD": [undefined, "$"],
"BDT": [undefined, "৳"],
"BHD": [undefined, undefined, 3],
"BIF": [undefined, undefined, 0],
"BMD": [undefined, "$"],
"BND": [undefined, "$"],
"BOB": [undefined, "Bs"],
"BRL": ["R$"],
"BSD": [undefined, "$"],
"BWP": [undefined, "P"],
"BYN": [undefined, undefined, 2],
"BYR": [undefined, undefined, 0],
"BZD": [undefined, "$"],
"CAD": ["CA$", "$", 2],
"CHF": [undefined, undefined, 2],
"CLF": [undefined, undefined, 4],
"CLP": [undefined, "$", 0],
"CNY": ["CN¥", "¥"],
"COP": [undefined, "$", 2],
"CRC": [undefined, "₡", 2],
"CUC": [undefined, "$"],
"CUP": [undefined, "$"],
"CZK": [undefined, "Kč", 2],
"DJF": [undefined, undefined, 0],
"DKK": [undefined, "kr", 2],
"DOP": [undefined, "$"],
"EGP": [undefined, "E£"],
"ESP": [undefined, "₧", 0],
"EUR": ["€"],
"FJD": [undefined, "$"],
"FKP": [undefined, "£"],
"GBP": ["£"],
"GEL": [undefined, "₾"],
"GHS": [undefined, "GH₵"],
"GIP": [undefined, "£"],
"GNF": [undefined, "FG", 0],
"GTQ": [undefined, "Q"],
"GYD": [undefined, "$", 2],
"HKD": ["HK$", "$"],
"HNL": [undefined, "L"],
"HRK": [undefined, "kn"],
"HUF": [undefined, "Ft", 2],
"IDR": [undefined, "Rp", 2],
"ILS": ["₪"],
"INR": ["₹"],
"IQD": [undefined, undefined, 0],
"IRR": [undefined, undefined, 0],
"ISK": [undefined, "kr", 0],
"ITL": [undefined, undefined, 0],
"JMD": [undefined, "$"],
"JOD": [undefined, undefined, 3],
"JPY": ["¥", undefined, 0],
"KGS": [undefined, "⃀"],
"KHR": [undefined, "៛"],
"KMF": [undefined, "CF", 0],
"KPW": [undefined, "₩", 0],
"KRW": ["₩", undefined, 0],
"KWD": [undefined, undefined, 3],
"KYD": [undefined, "$"],
"KZT": [undefined, "₸"],
"LAK": [undefined, "₭", 0],
"LBP": [undefined, "L£", 0],
"LKR": [undefined, "Rs"],
"LRD": [undefined, "$"],
"LTL": [undefined, "Lt"],
"LUF": [undefined, undefined, 0],
"LVL": [undefined, "Ls"],
"LYD": [undefined, undefined, 3],
"MGA": [undefined, "Ar", 0],
"MGF": [undefined, undefined, 0],
"MMK": [undefined, "K", 0],
"MNT": [undefined, "₮", 2],
"MRO": [undefined, undefined, 0],
"MUR": [undefined, "Rs", 2],
"MXN": ["MX$", "$"],
"MYR": [undefined, "RM"],
"NAD": [undefined, "$"],
"NGN": [undefined, "₦"],
"NIO": [undefined, "C$"],
"NOK": [undefined, "kr", 2],
"NPR": [undefined, "Rs"],
"NZD": ["NZ$", "$"],
"OMR": [undefined, undefined, 3],
"PHP": ["₱"],
"PKR": [undefined, "Rs", 2],
"PLN": [undefined, "zł"],
"PYG": [undefined, "₲", 0],
"RON": [undefined, "lei"],
"RSD": [undefined, undefined, 0],
"RUB": [undefined, "₽"],
"RWF": [undefined, "RF", 0],
"SBD": [undefined, "$"],
"SEK": [undefined, "kr", 2],
"SGD": [undefined, "$"],
"SHP": [undefined, "£"],
"SLE": [undefined, undefined, 2],
"SLL": [undefined, undefined, 0],
"SOS": [undefined, undefined, 0],
"SRD": [undefined, "$"],
"SSP": [undefined, "£"],
"STD": [undefined, undefined, 0],
"STN": [undefined, "Db"],
"SYP": [undefined, "£", 0],
"THB": [undefined, "฿"],
"TMM": [undefined, undefined, 0],
"TND": [undefined, undefined, 3],
"TOP": [undefined, "T$"],
"TRL": [undefined, undefined, 0],
"TRY": [undefined, "₺"],
"TTD": [undefined, "$"],
"TWD": ["NT$", "$", 2],
"TZS": [undefined, undefined, 2],
"UAH": [undefined, "₴"],
"UGX": [undefined, undefined, 0],
"USD": ["$"],
"UYI": [undefined, undefined, 0],
"UYU": [undefined, "$"],
"UYW": [undefined, undefined, 4],
"UZS": [undefined, undefined, 2],
"VEF": [undefined, "Bs", 2],
"VND": ["₫", undefined, 0],
"VUV": [undefined, undefined, 0],
"XAF": ["FCFA", undefined, 0],
"XCD": ["EC$", "$"],
"XCG": ["Cg."],
"XOF": ["F CFA", undefined, 0],
"XPF": ["CFPF", undefined, 0],
"XXX": ["¤"],
"YER": [undefined, undefined, 0],
"ZAR": [undefined, "R"],
"ZMK": [undefined, undefined, 0],
"ZMW": [undefined, "ZK"],
"ZWD": [undefined, undefined, 0]
};
var NumberFormatStyle;
(function (NumberFormatStyle) {
NumberFormatStyle[NumberFormatStyle["Decimal"] = 0] = "Decimal";
NumberFormatStyle[NumberFormatStyle["Percent"] = 1] = "Percent";
NumberFormatStyle[NumberFormatStyle["Currency"] = 2] = "Currency";
NumberFormatStyle[NumberFormatStyle["Scientific"] = 3] = "Scientific";
})(NumberFormatStyle || (NumberFormatStyle = {}));
var Plural;
(function (Plural) {
Plural[Plural["Zero"] = 0] = "Zero";
Plural[Plural["One"] = 1] = "One";
Plural[Plural["Two"] = 2] = "Two";
Plural[Plural["Few"] = 3] = "Few";
Plural[Plural["Many"] = 4] = "Many";
Plural[Plural["Other"] = 5] = "Other";
})(Plural || (Plural = {}));
var FormStyle;
(function (FormStyle) {
FormStyle[FormStyle["Format"] = 0] = "Format";
FormStyle[FormStyle["Standalone"] = 1] = "Standalone";
})(FormStyle || (FormStyle = {}));
var TranslationWidth;
(function (TranslationWidth) {
TranslationWidth[TranslationWidth["Narrow"] = 0] = "Narrow";
TranslationWidth[TranslationWidth["Abbreviated"] = 1] = "Abbreviated";
TranslationWidth[TranslationWidth["Wide"] = 2] = "Wide";
TranslationWidth[TranslationWidth["Short"] = 3] = "Short";
})(TranslationWidth || (TranslationWidth = {}));
var FormatWidth;
(function (FormatWidth) {
FormatWidth[FormatWidth["Short"] = 0] = "Short";
FormatWidth[FormatWidth["Medium"] = 1] = "Medium";
FormatWidth[FormatWidth["Long"] = 2] = "Long";
FormatWidth[FormatWidth["Full"] = 3] = "Full";
})(FormatWidth || (FormatWidth = {}));
const NumberSymbol = {
Decimal: 0,
Group: 1,
List: 2,
PercentSign: 3,
PlusSign: 4,
MinusSign: 5,
Exponential: 6,
SuperscriptingExponent: 7,
PerMille: 8,
Infinity: 9,
NaN: 10,
TimeSeparator: 11,
CurrencyDecimal: 12,
CurrencyGroup: 13
};
var WeekDay;
(function (WeekDay) {
WeekDay[WeekDay["Sunday"] = 0] = "Sunday";
WeekDay[WeekDay["Monday"] = 1] = "Monday";
WeekDay[WeekDay["Tuesday"] = 2] = "Tuesday";
WeekDay[WeekDay["Wednesday"] = 3] = "Wednesday";
WeekDay[WeekDay["Thursday"] = 4] = "Thursday";
WeekDay[WeekDay["Friday"] = 5] = "Friday";
WeekDay[WeekDay["Saturday"] = 6] = "Saturday";
})(WeekDay || (WeekDay = {}));
function getLocaleId(locale) {
return _findLocaleData(locale)[_LocaleDataIndex.LocaleId];
}
function getLocaleDayPeriods(locale, formStyle, width) {
const data = _findLocaleData(locale);
const amPmData = [data[_LocaleDataIndex.DayPeriodsFormat], data[_LocaleDataIndex.DayPeriodsStandalone]];
const amPm = getLastDefinedValue(amPmData, formStyle);
return getLastDefinedValue(amPm, width);
}
function getLocaleDayNames(locale, formStyle, width) {
const data = _findLocaleData(locale);
const daysData = [data[_LocaleDataIndex.DaysFormat], data[_LocaleDataIndex.DaysStandalone]];
const days = getLastDefinedValue(daysData, formStyle);
return getLastDefinedValue(days, width);
}
function getLocaleMonthNames(locale, formStyle, width) {
const data = _findLocaleData(locale);
const monthsData = [data[_LocaleDataIndex.MonthsFormat], data[_LocaleDataIndex.MonthsStandalone]];
const months = getLastDefinedValue(monthsData, formStyle);
return getLastDefinedValue(months, width);
}
function getLocaleEraNames(locale, width) {
const data = _findLocaleData(locale);
const erasData = data[_LocaleDataIndex.Eras];
return getLastDefinedValue(erasData, width);
}
function getLocaleFirstDayOfWeek(locale) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.FirstDayOfWeek];
}
function getLocaleWeekEndRange(locale) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.WeekendRange];
}
function getLocaleDateFormat(locale, width) {
const data = _findLocaleData(locale);
return getLastDefinedValue(data[_LocaleDataIndex.DateFormat], width);
}
function getLocaleTimeFormat(locale, width) {
const data = _findLocaleData(locale);
return getLastDefinedValue(data[_LocaleDataIndex.TimeFormat], width);
}
function getLocaleDateTimeFormat(locale, width) {
const data = _findLocaleData(locale);
const dateTimeFormatData = data[_LocaleDataIndex.DateTimeFormat];
return getLastDefinedValue(dateTimeFormatData, width);
}
function getLocaleNumberSymbol(locale, symbol) {
const data = _findLocaleData(locale);
const res = data[_LocaleDataIndex.NumberSymbols][symbol];
if (typeof res === 'undefined') {
if (symbol === NumberSymbol.CurrencyDecimal) {
return data[_LocaleDataIndex.NumberSymbols][NumberSymbol.Decimal];
} else if (symbol === NumberSymbol.CurrencyGroup) {
return data[_LocaleDataIndex.NumberSymbols][NumberSymbol.Group];
}
}
return res;
}
function getLocaleNumberFormat(locale, type) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.NumberFormats][type];
}
function getLocaleCurrencySymbol(locale) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.CurrencySymbol] || null;
}
function getLocaleCurrencyName(locale) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.CurrencyName] || null;
}
function getLocaleCurrencyCode(locale) {
return _getLocaleCurrencyCode(locale);
}
function getLocaleCurrencies(locale) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.Currencies];
}
const getLocalePluralCase = _getLocalePluralCase;
function checkFullData(data) {
if (!data[_LocaleDataIndex.ExtraData]) {
throw new _RuntimeError(2303, ngDevMode && `Missing extra locale data for the locale "${data[_LocaleDataIndex.LocaleId]}". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.`);
}
}
function getLocaleExtraDayPeriodRules(locale) {
const data = _findLocaleData(locale);
checkFullData(data);
const rules = data[_LocaleDataIndex.ExtraData][2] || [];
return rules.map(rule => {
if (typeof rule === 'string') {
return extractTime(rule);
}
return [extractTime(rule[0]), extractTime(rule[1])];
});
}
function getLocaleExtraDayPeriods(locale, formStyle, width) {
const data = _findLocaleData(locale);
checkFullData(data);
const dayPeriodsData = [data[_LocaleDataIndex.ExtraData][0], data[_LocaleDataIndex.ExtraData][1]];
const dayPeriods = getLastDefinedValue(dayPeriodsData, formStyle) || [];
return getLastDefinedValue(dayPeriods, width) || [];
}
function getLocaleDirection(locale) {
const data = _findLocaleData(locale);
return data[_LocaleDataIndex.Directionality];
}
function getLastDefinedValue(data, index) {
for (let i = index; i > -1; i--) {
if (typeof data[i] !== 'undefined') {
return data[i];
}
}
throw new _RuntimeError(2304, ngDevMode && 'Locale data API: locale data undefined');
}
function extractTime(time) {
const [h, m] = time.split(':');
return {
hours: +h,
minutes: +m
};
}
function getCurrencySymbol(code, format, locale = 'en') {
const currency = getLocaleCurrencies(locale)[code] || CURRENCIES_EN[code] || [];
const symbolNarrow = currency[1];
if (format === 'narrow' && typeof symbolNarrow === 'string') {
return symbolNarrow;
}
return currency[0] || code;
}
const DEFAULT_NB_OF_CURRENCY_DIGITS = 2;
function getNumberOfCurrencyDigits(code) {
let digits;
const currency = CURRENCIES_EN[code];
if (currency) {
digits = currency[2];
}
return typeof digits === 'number' ? digits : DEFAULT_NB_OF_CURRENCY_DIGITS;
}
const ISO8601_DATE_REGEX = /^(\d{4,})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
const NAMED_FORMATS = {};
const DATE_FORMATS_SPLIT = /((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;
function formatDate(value, format, locale, timezone) {
let date = toDate(value);
const namedFormat = getNamedFormat(locale, format);
format = namedFormat || format;
let parts = [];
let match;
while (format) {
match = DATE_FORMATS_SPLIT.exec(format);
if (match) {
parts = parts.concat(match.slice(1));
const part = parts.pop();
if (!part) {
break;
}
format = part;
} else {
parts.push(format);
break;
}
}
if (typeof ngDevMode === 'undefined' || ngDevMode) {
assertValidDateFormat(parts);
}
let dateTimezoneOffset = date.getTimezoneOffset();
if (timezone) {
dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
date = convertTimezoneToLocal(date, timezone);
}
let text = '';
parts.forEach(value => {
const dateFormatter = getDateFormatter(value);
text += dateFormatter ? dateFormatter(date, locale, dateTimezoneOffset) : value === "''" ? "'" : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
});
return text;
}
function assertValidDateFormat(parts) {
if (parts.some(part => /^Y+$/.test(part)) && !parts.some(part => /^w+$/.test(part))) {
const message = `Suspicious use of week-based year "Y" in date pattern "${parts.join('')}". Did you mean to use calendar year "y" instead?`;
if (parts.length === 1) {
console.error(_formatRuntimeError(2300, message));
} else {
throw new _RuntimeError(2300, message);
}
}
}
function createDate(year, month, date) {
const newDate = new Date(0);
newDate.setFullYear(year, month, date);
newDate.setHours(0, 0, 0);
return newDate;
}
function getNamedFormat(locale, format) {
const localeId = getLocaleId(locale);
NAMED_FORMATS[localeId] ??= {};
if (NAMED_FORMATS[localeId][format]) {
return NAMED_FORMATS[localeId][format];
}
let formatValue = '';
switch (format) {
case 'shortDate':
formatValue = getLocaleDateFormat(locale, FormatWidth.Short);
break;
case 'mediumDate':
formatValue = getLocaleDateFormat(locale, FormatWidth.Medium);
break;
case 'longDate':
formatValue = getLocaleDateFormat(locale, FormatWidth.Long);
break;
case 'fullDate':
formatValue = getLocaleDateFormat(locale, FormatWidth.Full);
break;
case 'shortTime':
formatValue = getLocaleTimeFormat(locale, FormatWidth.Short);
break;
case 'mediumTime':
formatValue = getLocaleTimeFormat(locale, FormatWidth.Medium);
break;
case 'longTime':
formatValue = getLocaleTimeFormat(locale, FormatWidth.Long);
break;
case 'fullTime':
formatValue = getLocaleTimeFormat(locale, FormatWidth.Full);
break;
case 'short':
const shortTime = getNamedFormat(locale, 'shortTime');
const shortDate = getNamedFormat(locale, 'shortDate');
formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Short), [shortTime, shortDate]);
break;
case 'medium':
const mediumTime = getNamedFormat(locale, 'mediumTime');
const mediumDate = getNamedFormat(locale, 'mediumDate');
formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Medium), [mediumTime, mediumDate]);
break;
case 'long':
const longTime = getNamedFormat(locale, 'longTime');
const longDate = getNamedFormat(locale, 'longDate');
formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Long), [longTime, longDate]);
break;
case 'full':
const fullTime = getNamedFormat(locale, 'fullTime');
const fullDate = getNamedFormat(locale, 'fullDate');
formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Full), [fullTime, fullDate]);
break;
}
if (formatValue) {
NAMED_FORMATS[localeId][format] = formatValue;
}
return formatValue;
}
function formatDateTime(str, opt_values) {
if (opt_values) {
str = str.replace(/\{([^}]+)}/g, function (match, key) {
return opt_values != null && key in opt_values ? opt_values[key] : match;
});
}
return str;
}
function padNumber(num, digits, minusSign = '-', trim, negWrap) {
let neg = '';
if (num < 0 || negWrap && num <= 0) {
if (negWrap) {
num = -num + 1;
} else {
num = -num;
neg = minusSign;
}
}
let strNum = String(num);
while (strNum.length < digits) {
strNum = '0' + strNum;
}
if (trim) {
strNum = strNum.slice(strNum.length - digits);
}
return neg + strNum;
}
function formatFractionalSeconds(milliseconds, digits) {
const strMs = padNumber(milliseconds, 3);
return strMs.substring(0, digits);
}
function dateGetter(name, size, offset = 0, trim = false, negWrap = false) {
return function (date, locale) {
let part = getDatePart(name, date);
if (offset > 0 || part > -offset) {
part += offset;
}
if (name === 3) {
if (part === 0 && offset === -12) {
part = 12;
}
} else if (name === 6) {
return formatFractionalSeconds(part, size);
}
const localeMinus = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);
return padNumber(part, size, localeMinus, trim, negWrap);
};
}
function getDatePart(part, date) {
switch (part) {
case 0:
return date.getFullYear();
case 1:
return date.getMonth();
case 2:
return date.getDate();
case 3:
return date.getHours();
case 4:
return date.getMinutes();
case 5:
return date.getSeconds();
case 6:
return date.getMilliseconds();
case 7:
return date.getDay();
default:
throw new _RuntimeError(2301, ngDevMode && `Unknown DateType value "${part}".`);
}
}
function dateStrGetter(name, width, form = FormStyle.Format, extended = false) {
return function (date, locale) {
return getDateTranslation(date, locale, name, width, form, extended);
};
}
function getDateTranslation(date, locale, name, width, form, extended) {
switch (name) {
case 2:
return getLocaleMonthNames(locale, form, width)[date.getMonth()];
case 1:
return getLocaleDayNames(locale, form, width)[date.getDay()];
case 0:
const currentHours = date.getHours();
const currentMinutes = date.getMinutes();
if (extended) {
const rules = getLocaleExtraDayPeriodRules(locale);
const dayPeriods = getLocaleExtraDayPeriods(locale, form, width);
const index = rules.findIndex(rule => {
if (Array.isArray(rule)) {
const [from, to] = rule;
const afterFrom = currentHours >= from.hours && currentMinutes >= from.minutes;
const beforeTo = currentHours < to.hours || currentHours === to.hours && currentMinutes < to.minutes;
if (from.hours < to.hours) {
if (afterFrom && beforeTo) {
return true;
}
} else if (afterFrom || beforeTo) {
return true;
}
} else {
if (rule.hours === currentHours && rule.minutes === currentMinutes) {
return true;
}
}
return false;
});
if (index !== -1) {
return dayPeriods[index];
}
}
return getLocaleDayPeriods(locale, form, width)[currentHours < 12 ? 0 : 1];
case 3:
return getLocaleEraNames(locale, width)[date.getFullYear() <= 0 ? 0 : 1];
default:
const unexpected = name;
throw new _RuntimeError(2302, ngDevMode && `unexpected translation type ${unexpected}`);
}
}
function timeZoneGetter(width) {
return function (date, locale, offset) {
const zone = -1 * offset;
const minusSign = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);
const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60);
switch (width) {
case 0:
return (zone >= 0 ? '+' : '') + padNumber(hours, 2, minusSign) + padNumber(Math.abs(zone % 60), 2, minusSign);
case 1:
return 'GMT' + (zone >= 0 ? '+' : '') + padNumber(hours, 1, minusSign);
case 2:
return 'GMT' + (zone >= 0 ? '+' : '') + padNumber(hours, 2, minusSign) + ':' + padNumber(Math.abs(zone % 60), 2, minusSign);
case 3:
if (offset === 0) {
return 'Z';
} else {
return (zone >= 0 ? '+' : '') + padNumber(hours, 2, minusSign) + ':' + padNumber(Math.abs(zone % 60), 2, minusSign);
}
default:
throw new _RuntimeError(2310, ngDevMode && `Unknown zone width "${width}"`);
}
};
}
const JANUARY = 0;
const THURSDAY = 4;
function getFirstThursdayOfYear(year) {
const firstDayOfYear = createDate(year, JANUARY, 1).getDay();
return createDate(year, 0, 1 + (firstDayOfYear <= THURSDAY ? THURSDAY : THURSDAY + 7) - firstDayOfYear);
}
function getThursdayThisIsoWeek(datetime) {
const currentDay = datetime.getDay();
const deltaToThursday = currentDay === 0 ? -3 : THURSDAY - currentDay;
return createDate(datetime.getFullYear(), datetime.getMonth(), datetime.getDate() + deltaToThursday);
}
function weekGetter(size, monthBased = false) {
return function (date, locale) {
let result;
if (monthBased) {
const nbDaysBefore1stDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1;
const today = date.getDate();
result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7);
} else {
const thisThurs = getThursdayThisIsoWeek(date);
const firstThurs = getFirstThursdayOfYear(thisThurs.getFullYear());
const diff = thisThurs.getTime() - firstThurs.getTime();
result = 1 + Math.round(diff / 6.048e8);
}
return padNumber(result, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
};
}
function weekNumberingYearGetter(size, trim = false) {
return function (date, locale) {
const thisThurs = getThursdayThisIsoWeek(date);
const weekNumberingYear = thisThurs.getFullYear();
return padNumber(weekNumberingYear, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign), trim);
};
}
const DATE_FORMATS = {};
function getDateFormatter(format) {
if (DATE_FORMATS[format]) {
return DATE_FORMATS[format];
}
let formatter;
switch (format) {
case 'G':
case 'GG':
case 'GGG':
formatter = dateStrGetter(3, TranslationWidth.Abbreviated);
break;
case 'GGGG':
formatter = dateStrGetter(3, TranslationWidth.Wide);
break;
case 'GGGGG':
formatter = dateStrGetter(3, TranslationWidth.Narrow);
break;
case 'y':
formatter = dateGetter(0, 1, 0, false, true);
break;
case 'yy':
formatter = dateGetter(0, 2, 0, true, true);
break;
case 'yyy':
formatter = dateGetter(0, 3, 0, false, true);
break;
case 'yyyy':
formatter = dateGetter(0, 4, 0, false, true);
break;
case 'Y':
formatter = weekNumberingYearGetter(1);
break;
case 'YY':
formatter = weekNumberingYearGetter(2, true);
break;
case 'YYY':
formatter = weekNumberingYearGetter(3);
break;
case 'YYYY':
formatter = weekNumberingYearGetter(4);
break;
case 'M':
case 'L':
formatter = dateGetter(1, 1, 1);
break;
case 'MM':
case 'LL':
formatter = dateGetter(1, 2, 1);
break;
case 'MMM':
formatter = dateStrGetter(2, TranslationWidth.Abbreviated);
break;
case 'MMMM':
formatter = dateStrGetter(2, TranslationWidth.Wide);
break;
case 'MMMMM':
formatter = dateStrGetter(2, TranslationWidth.Narrow);
break;
case 'LLL':
formatter = dateStrGetter(2, TranslationWidth.Abbreviated, FormStyle.Standalone);
break;
case 'LLLL':
formatter = dateStrGetter(2, TranslationWidth.Wide, FormStyle.Standalone);
break;
case 'LLLLL':
formatter = dateStrGetter(2, TranslationWidth.Narrow, FormStyle.Standalone);
break;
case 'w':
formatter = weekGetter(1);
break;
case 'ww':
formatter = weekGetter(2);
break;
case 'W':
formatter = weekGetter(1, true);
break;
case 'd':
formatter = dateGetter(2, 1);
break;
case 'dd':
formatter = dateGetter(2, 2);
break;
case 'c':
case 'cc':
formatter = dateGetter(7, 1);
break;
case 'ccc':
formatter = dateStrGetter(1, TranslationWidth.Abbreviated, FormStyle.Standalone);
break;
case 'cccc':
formatter = dateStrGetter(1, TranslationWidth.Wide, FormStyle.Standalone);
break;
case 'ccccc':
formatter = dateStrGetter(1, TranslationWidth.Narrow, FormStyle.Standalone);
break;
case 'cccccc':
formatter = dateStrGetter(1, TranslationWidth.Short, FormStyle.Standalone);
break;
case 'E':
case 'EE':
case 'EEE':
formatter = dateStrGetter(1, TranslationWidth.Abbreviated);
break;
case 'EEEE':
formatter = dateStrGetter(1, TranslationWidth.Wide);
break;
case 'EEEEE':
formatter = dateStrGetter(1, TranslationWidth.Narrow);
break;
case 'EEEEEE':
formatter = dateStrGetter(1, TranslationWidth.Short);
break;
case 'a':
case 'aa':
case 'aaa':
formatter = dateStrGetter(0, TranslationWidth.Abbreviated);
break;
case 'aaaa':
formatter = dateStrGetter(0, TranslationWidth.Wide);
break;
case 'aaaaa':
formatter = dateStrGetter(0, TranslationWidth.Narrow);
break;
case 'b':
case 'bb':
case 'bbb':
formatter = dateStrGetter(0, TranslationWidth.Abbreviated, FormStyle.Standalone, true);
break;
case 'bbbb':
formatter = dateStrGetter(0, TranslationWidth.Wide, FormStyle.Standalone, true);
break;
case 'bbbbb':
formatter = dateStrGetter(0, TranslationWidth.Narrow, FormStyle.Standalone, true);
break;
case 'B':
case 'BB':
case 'BBB':
formatter = dateStrGetter(0, TranslationWidth.Abbreviated, FormStyle.Format, true);
break;
case 'BBBB':
formatter = dateStrGetter(0, TranslationWidth.Wide, FormStyle.Format, true);
break;
case 'BBBBB':
formatter = dateStrGetter(0, TranslationWidth.Narrow, FormStyle.Format, true);
break;
case 'h':
formatter = dateGetter(3, 1, -12);
break;
case 'hh':
formatter = dateGetter(3, 2, -12);
break;
case 'H':
formatter = dateGetter(3, 1);
break;
case 'HH':
formatter = dateGetter(3, 2);
break;
case 'm':
formatter = dateGetter(4, 1);
break;
case 'mm':
formatter = dateGetter(4, 2);
break;
case 's':
formatter = dateGetter(5, 1);
break;
case 'ss':
formatter = dateGetter(5, 2);
break;
case 'S':
formatter = dateGetter(6, 1);
break;
case 'SS':
formatter = dateGetter(6, 2);
break;
case 'SSS':
formatter = dateGetter(6, 3);
break;
case 'Z':
case 'ZZ':
case 'ZZZ':
formatter = timeZoneGetter(0);
break;
case 'ZZZZZ':
formatter = timeZoneGetter(3);
break;
case 'O':
case 'OO':
case 'OOO':
case 'z':
case 'zz':
case 'zzz':
formatter = timeZoneGetter(1);
break;
case 'OOOO':
case 'ZZZZ':
case 'zzzz':
formatter = timeZoneGetter(2);
break;
default:
return null;
}
DATE_FORMATS[format] = formatter;
return formatter;
}
function timezoneToOffset(timezone, fallback) {
timezone = timezone.replace(/:/g, '');
const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
}
function addDateMinutes(date, minutes) {
date = new Date(date.getTime());
date.setMinutes(date.getMinutes() + minutes);
return date;
}
function convertTimezoneToLocal(date, timezone, reverse) {
const reverseValue = -1 ;
const dateTimezoneOffset = date.getTimezoneOffset();
const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
return addDateMinutes(date, reverseValue * (timezoneOffset - dateTimezoneOffset));
}
function toDate(value) {
if (isDate(value)) {
return value;
}
if (typeof value === 'number' && !isNaN(value)) {
return new Date(value);
}
if (typeof value === 'string') {
value = value.trim();
if (/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(value)) {
const [y, m = 1, d = 1] = value.split('-').map(val => +val);
return createDate(y, m - 1, d);
}
const parsedNb = parseFloat(value);
if (!isNaN(value - parsedNb)) {
return new Date(parsedNb);
}
let match;
if (match = value.match(ISO8601_DATE_REGEX)) {
return isoStringToDate(match);
}
}
const date = new Date(value);
if (!isDate(date)) {
throw new _RuntimeError(2311, ngDevMode && `Unable to convert "${value}" into a date`);
}
return date;
}
function isoStringToDate(match) {
const date = new Date(0);
let tzHour = 0;
let tzMin = 0;
const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;
const timeSetter = match[8] ? date.setUTCHours : date.setHours;
if (match[9]) {
tzHour = Number(match[9] + match[10]);
tzMin = Number(match[9] + match[11]);
}
dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3]));
const h = Number(match[4] || 0) - tzHour;
const m = Number(match[5] || 0) - tzMin;
const s = Number(match[6] || 0);
const ms = Math.floor(parseFloat('0.' + (match[7] || 0)) * 1000);
timeSetter.call(date, h, m, s, ms);
return date;
}
function isDate(value) {
return value instanceof Date && !isNaN(value.valueOf());
}
const NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(-(\d+))?)?$/;
const MAX_DIGITS = 22;
const DECIMAL_SEP = '.';
const ZERO_CHAR = '0';
const PATTERN_SEP = ';';
const GROUP_SEP = ',';
const DIGIT_CHAR = '#';
const CURRENCY_CHAR = '¤';
const PERCENT_CHAR = '%';
function formatNumberToLocaleString(value, pattern, locale, groupSymbol, decimalSymbol, digitsInfo, isPercent = false) {
let formattedText = '';
let isZero = false;
if (!isFinite(value)) {
formattedText = getLocaleNumberSymbol(locale, NumberSymbol.Infinity);
} else {
let parsedNumber = parseNumber(value);
if (isPercent) {
parsedNumber = toPercent(parsedNumber);
}
let minInt = pattern.minInt;
let minFraction = pattern.minFrac;
let maxFraction = pattern.maxFrac;
if (digitsInfo) {
const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);
if (parts === null) {
throw new _RuntimeError(2306, ngDevMode && `${digitsInfo} is not a valid digit info`);
}
const minIntPart = parts[1];
const minFractionPart = parts[3];
const maxFractionPart = parts[5];
if (minIntPart != null) {
minInt = parseIntAutoRadix(minIntPart);
}
if (minFractionPart != null) {
minFraction = parseIntAutoRadix(minFractionPart);
}
if (maxFractionPart != null) {
maxFraction = parseIntAutoRadix(maxFractionPart);
} else if (minFractionPart != null && minFraction > maxFraction) {
maxFraction = minFraction;
}
}
roundNumber(parsedNumber, minFraction, maxFraction);
let digits = parsedNumber.digits;
let integerLen = parsedNumber.integerLen;
const exponent = parsedNumber.exponent;
let decimals = [];
isZero = digits.every(d => !d);
for (; integerLen < minInt; integerLen++) {
digits.unshift(0);
}
for (; integerLen < 0; integerLen++) {
digits.unshift(0);
}
if (integerLen > 0) {
decimals = digits.splice(integerLen, digits.length);
} else {
decimals = digits;
digits = [0];
}
const groups = [];
if (digits.length >= pattern.lgSize) {
groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));
}
while (digits.length > pattern.gSize) {
groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));
}
if (digits.length) {
groups.unshift(digits.join(''));
}
formattedText = groups.join(getLocaleNumberSymbol(locale, groupSymbol));
if (decimals.length) {
formattedText += getLocaleNumberSymbol(locale, decimalSymbol) + decimals.join('');
}
if (exponent) {
formattedText += getLocaleNumberSymbol(locale, NumberSymbol.Exponential) + '+' + exponent;
}
}
if (value < 0 && !isZero) {
formattedText = pattern.negPre + formattedText + pattern.negSuf;
} else {
formattedText = pattern.posPre + formattedText + pattern.posSuf;
}
return formattedText;
}
function formatCurrency(value, locale, currency, currencyCode, digitsInfo) {
const format = getLocaleNumberFormat(locale, NumberFormatStyle.Currency);
const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
pattern.minFrac = getNumberOfCurrencyDigits(currencyCode);
pattern.maxFrac = pattern.minFrac;
const res = formatNumberToLocaleString(value, pattern, locale, NumberSymbol.CurrencyGroup, NumberSymbol.CurrencyDecimal, digitsInfo);
return res.replace(CURRENCY_CHAR, currency).replace(CURRENCY_CHAR, '').trim();
}
function formatPercent(value, locale, digitsInfo) {
const format = getLocaleNumberFormat(locale, NumberFormatStyle.Percent);
const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
const res = formatNumberToLocaleString(value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo, true);
return res.replace(new RegExp(PERCENT_CHAR, 'g'), getLocaleNumberSymbol(locale, NumberSymbol.PercentSign));
}
function formatNumber(value, locale, digitsInfo) {
const format = getLocaleNumberFormat(locale, NumberFormatStyle.Decimal);
const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
return formatNumberToLocaleString(value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo);
}
function parseNumberFormat(format, minusSign = '-') {
const p = {
minInt: 1,
minFrac: 0,
maxFrac: 0,
posPre: '',
posSuf: '',
negPre: '',
negSuf: '',
gSize: 0,
lgSize: 0
};
const patternParts = format.split(PATTERN_SEP);
const positive = patternParts[0];
const negative = patternParts[1];
const positiveParts = positive.indexOf(DECIMAL_SEP) !== -1 ? positive.split(DECIMAL_SEP) : [positive.substring(0, positive.lastIndexOf(ZERO_CHAR) + 1), positive.substring(positive.lastIndexOf(ZERO_CHAR) + 1)],
integer = positiveParts[0],
fraction = positiveParts[1] || '';
p.posPre = integer.substring(0, integer.indexOf(DIGIT_CHAR));
for (let i = 0; i < fraction.length; i++) {
const ch = fraction.charAt(i);
if (ch === ZERO_CHAR) {
p.minFrac = p.maxFrac = i + 1;
} else if (ch === DIGIT_CHAR) {
p.maxFrac = i + 1;
} else {
p.posSuf += ch;
}
}
const groups = integer.split(GROUP_SEP);
p.gSize = groups[1] ? groups[1].length : 0;
p.lgSize = groups[2] || groups[1] ? (groups[2] || groups[1]).length : 0;
if (negative) {
const trunkLen = positive.length - p.posPre.length - p.posSuf.length,
pos = negative.indexOf(DIGIT_CHAR);
p.negPre = negative.substring(0, pos).replace(/'/g, '');
p.negSuf = negative.slice(pos + trunkLen).replace(/'/g, '');
} else {
p.negPre = minusSign + p.posPre;
p.negSuf = p.posSuf;
}
return p;
}
function toPercent(parsedNumber) {
if (parsedNumber.digits[0] === 0) {
return parsedNumber;
}
const fractionLen = parsedNumber.digits.length - parsedNumber.integerLen;
if (parsedNumber.exponent) {
parsedNumber.exponent += 2;
} else {
if (fractionLen === 0) {
parsedNumber.digits.push(0, 0);
} else if (fractionLen === 1) {
parsedNumber.digits.push(0);
}
parsedNumber.integerLen += 2;
}
return parsedNumber;
}
function parseNumber(num) {
let numStr = Math.abs(num) + '';
let exponent = 0,
digits,
integerLen;
let i, j, zeros;
if ((integerLen = numStr.indexOf(DECIMAL_SEP)) > -1) {
numStr = numStr.replace(DECIMAL_SEP, '');
}
if ((i = numStr.search(/e/i)) > 0) {
if (integerLen < 0) integerLen = i;
integerLen += +numStr.slice(i + 1);
numStr = numStr.substring(0, i);
} else if (integerLen < 0) {
integerLen = numStr.length;
}
for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) {}
if (i === (zeros = numStr.length)) {
digits = [0];
integerLen = 1;
} else {
zeros--;
while (numStr.charAt(zeros) === ZERO_CHAR) zeros--;
integerLen -= i;
digits = [];
for (j = 0; i <= zeros; i++, j++) {
digits[j] = Number(numStr.charAt(i));
}
}
if (integerLen > MAX_DIGITS) {
digits = digits.splice(0, MAX_DIGITS - 1);
exponent = integerLen - 1;
integerLen = 1;
}
return {
digits,
exponent,
integerLen
};
}
function roundNumber(parsedNumber, minFrac, maxFrac) {
if (minFrac > maxFrac) {
throw new _RuntimeError(2307, ngDevMode && `The minimum number of digits after fraction (${minFrac}) is higher than the maximum (${maxFrac}).`);
}
let digits = parsedNumber.digits;
let fractionLen = digits.length - parsedNumber.integerLen;
const fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);
let roundAt = fractionSize + parsedNumber.integerLen;
let digit = digits[roundAt];
if (roundAt > 0) {
digits.splice(Math.max(parsedNumber.integerLen, roundAt));
for (let j = roundAt; j < digits.length; j++) {
digits[j] = 0;
}
} else {
fractionLen = Math.max(0, fractionLen);
parsedNumber.integerLen = 1;
digits.length = Math.max(1, roundAt = fractionSize + 1);
digits[0] = 0;
for (let i = 1; i < roundAt; i++) digits[i] = 0;
}
if (digit >= 5) {
if (roundAt - 1 < 0) {
for (let k = 0; k > roundAt; k--) {
digits.unshift(0);
parsedNumber.integerLen++;
}
digits.unshift(1);
parsedNumber.integerLen++;
} else {
digits[roundAt - 1]++;
}
}
for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);
let dropTrailingZeros = fractionSize !== 0;
const minLen = minFrac + parsedNumber.integerLen;
const carry = digits.reduceRight(function (carry, d, i, digits) {
d = d + carry;
digits[i] = d < 10 ? d : d - 10;
if (dropTrailingZeros) {
if (digits[i] === 0 && i >= minLen) {
digits.pop();
} else {
dropTrailingZeros = false;
}
}
return d >= 10 ? 1 : 0;
}, 0);
if (carry) {
digits.unshift(carry);
parsedNumber.integerLen++;
}
}
function parseIntAutoRadix(text) {
const result = parseInt(text);
if (isNaN(result)) {
throw new _RuntimeError(2305, ngDevMode && 'Invalid integer literal when parsing ' + text);
}
return result;
}
class NgLocalization {
static ɵfac = i0.ɵɵngDeclareFactory({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgLocalization,
deps: [],
target: i0.ɵɵFactoryTarget.Injectable
});
static ɵprov = i0.ɵɵngDeclareInjectable({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgLocalization,
providedIn: 'root',
useFactory: () => new NgLocaleLocalization(inject(LOCALE_ID))
});
}
i0.ɵɵngDeclareClassMetadata({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgLocalization,
decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
useFactory: () => new NgLocaleLocalization(inject(LOCALE_ID))
}]
}]
});
function getPluralCategory(value, cases, ngLocalization, locale) {
let key = `=${value}`;
if (cases.indexOf(key) > -1) {
return key;
}
key = ngLocalization.getPluralCategory(value, locale);
if (cases.indexOf(key) > -1) {
return key;
}
if (cases.indexOf('other') > -1) {
return 'other';
}
throw new _RuntimeError(2308, ngDevMode && `No plural message found for value "${value}"`);
}
class NgLocaleLocalization extends NgLocalization {
locale;
constructor(locale) {
super();
this.locale = locale;
}
getPluralCategory(value, locale) {
const plural = getLocalePluralCase(locale || this.locale)(value);
switch (plural) {
case Plural.Zero:
return 'zero';
case Plural.One:
return 'one';
case Plural.Two:
return 'two';
case Plural.Few:
return 'few';
case Plural.Many:
return 'many';
default:
return 'other';
}
}
static ɵfac = i0.ɵɵngDeclareFactory({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgLocaleLocalization,
deps: [{
token: LOCALE_ID
}],
target: i0.ɵɵFactoryTarget.Injectable
});
static ɵprov = i0.ɵɵngDeclareInjectable({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgLocaleLocalization
});
}
i0.ɵɵngDeclareClassMetadata({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgLocaleLocalization,
decorators: [{
type: Injectable
}],
ctorParameters: () => [{
type: undefined,
decorators: [{
type: Inject,
args: [LOCALE_ID]
}]
}]
});
const WS_REGEXP = /\s+/;
const EMPTY_ARRAY = [];
class NgClass {
_ngEl;
_renderer;
initialClasses = EMPTY_ARRAY;
rawClass;
stateMap = new Map();
constructor(_ngEl, _renderer) {
this._ngEl = _ngEl;
this._renderer = _renderer;
}
set klass(value) {
this.initialClasses = value != null ? value.trim().split(WS_REGEXP) : EMPTY_ARRAY;
}
set ngClass(value) {
this.rawClass = typeof value === 'string' ? value.trim().split(WS_REGEXP) : value;
}
ngDoCheck() {
for (const klass of this.initialClasses) {
this._updateState(klass, true);
}
const rawClass = this.rawClass;
if (Array.isArray(rawClass) || rawClass instanceof Set) {
for (const klass of rawClass) {
this._updateState(klass, true);
}
} else if (rawClass != null) {
for (const klass of Object.keys(rawClass)) {
this._updateState(klass, Boolean(rawClass[klass]));
}
}
this._applyStateDiff();
}
_updateState(klass, nextEnabled) {
const state = this.stateMap.get(klass);
if (state !== undefined) {
if (state.enabled !== nextEnabled) {
state.changed = true;
state.enabled = nextEnabled;
}
state.touched = true;
} else {
this.stateMap.set(klass, {
enabled: nextEnabled,
changed: true,
touched: true
});
}
}
_applyStateDiff() {
for (const stateEntry of this.stateMap) {
const klass = stateEntry[0];
const state = stateEntry[1];
if (state.changed) {
this._toggleClass(klass, state.enabled);
state.changed = false;
} else if (!state.touched) {
if (state.enabled) {
this._toggleClass(klass, false);
}
this.stateMap.delete(klass);
}
state.touched = false;
}
}
_toggleClass(klass, enabled) {
if (ngDevMode) {
if (typeof klass !== 'string') {
throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${_stringify(klass)}`);
}
}
klass = klass.trim();
if (klass.length > 0) {
klass.split(WS_REGEXP).forEach(klass => {
if (enabled) {
this._renderer.addClass(this._ngEl.nativeElement, klass);
} else {
this._renderer.removeClass(this._ngEl.nativeElement, klass);
}
});
}
}
static ɵfac = i0.ɵɵngDeclareFactory({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgClass,
deps: [{
token: i0.ElementRef
}, {
token: i0.Renderer2
}],
target: i0.ɵɵFactoryTarget.Directive
});
static ɵdir = i0.ɵɵngDeclareDirective({
minVersion: "14.0.0",
version: "21.0.6",
type: NgClass,
isStandalone: true,
selector: "[ngClass]",
inputs: {
klass: ["class", "klass"],
ngClass: "ngClass"
},
ngImport: i0
});
}
i0.ɵɵngDeclareClassMetadata({
minVersion: "12.0.0",
version: "21.0.6",
ngImport: i0,
type: NgClass,
decorators: [{
type: Directive,
args: [{
selector: '[ngClass]'
}]
}],
ctorParameters: () => [{
type: i0.ElementRef
}, {
type: i0.Renderer2
}],
propDecorators: {
klass: [{
type: Input,
args: ['class']
}],
ngClass: [{
type: Input,
args: ['ngClass']
}]
}
});
class NgComponentOutlet {
_viewContainerRef;
ngComponentOutlet = null;
ngComponentOutletInputs;
ngComponentOutletInjector;
ngComponentOutletEnvironmentInjector;
ngComponentOutletContent;
ngComponentOutletNgModule;
_componentRef;
_moduleRef;
_inputsUsed = new Map();
get componentInstance() {
return this._componentRef?.instance ?? null;
}
constructor(_viewContainerRef) {
this._viewContainerRef = _viewContainerRef;
}
_needToReCreateNgModuleInstance(changes) {
return changes['ngComponentOutletNgModule'] !== undefined;
}
_needToReCreateComponentInstance(changes) {
return changes['ngComponentOutlet'] !== undefined || changes['ngComponentOutletContent'] !== undefined || changes['ngComponentOutletInjector'] !== undefined || changes['ngComponentOutletEnvironmentInjector'] !== undefined || this._needToReCreateNgModuleInstance(changes);
}
ngOnChanges(changes) {
if (this._needToReCreateComponentInstance(changes)) {
this._viewContainerRef.clear();
this._inputsUsed.clear();
this._componentRef = undefined;
if (this.ngComponentOutlet) {
const injector = this.ngComponentOutletInjector || this._viewContainerRef.parentInjector;
if (this._needToReCreateNgModuleInstance(changes)) {
this._moduleRef?.destroy();
if (this.ngComponentOutletNgModule) {
this._moduleRef = createNgModule(this.ngComponentOutletNgModule, getParentInjector(injector));
} else {
this._moduleRef = undefined;
}
}
this._componentRef = this._viewContainerRef.createComponent(this.ngComponentOutlet, {
injector,
ngModuleRef: this._moduleRef,
projectableNodes: this.ngComponentOutletContent,
environmentInjector: this.ngComponentOutletEnvironmentInjector
});
}
}
}
ngDoCheck() {
if (this._componentRef) {
if (this.ngComponentOutletInputs) {
for (const inputName of Object.keys(this.ngComponentOutletInputs)) {
this._inputsUsed.set(inputName, true);
}
}
this._applyInputStateDiff(this._componentRef);
}
}
ngOnDestroy() {
this._moduleRef?.des