@odx/angular 4.1.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -1
- package/breakpoints/lib/breakpoints.config.d.ts +1 -1
- package/components/calendar/lib/calendar.config.d.ts +2 -2
- package/components/datepicker/lib/datepicker.config.d.ts +2 -2
- package/components/error-page/lib/error-page.config.d.ts +1 -1
- package/components/form-field/lib/form-field.config.d.ts +1 -1
- package/components/icon/lib/icon.config.d.ts +1 -1
- package/components/main-menu/lib/main-menu.config.d.ts +1 -1
- package/components/main-menu/lib/main-menu.i18n.d.ts +2 -2
- package/components/modal/lib/modal.config.d.ts +1 -1
- package/components/paginator/lib/paginator.config.d.ts +2 -2
- package/components/toast/lib/toast.config.d.ts +1 -1
- package/esm2022/components/main-menu/lib/main-menu.i18n.mjs +1 -1
- package/esm2022/index.mjs +1 -2
- package/esm2022/internal/index.mjs +4 -3
- package/esm2022/internal/lib/decorators/css-component.mjs +19 -0
- package/esm2022/internal/lib/decorators/css-modifier.mjs +49 -0
- package/esm2022/internal/lib/decorators/index.mjs +3 -0
- package/esm2022/internal/lib/helpers/camel-to-kebab-case.mjs +12 -0
- package/esm2022/internal/lib/helpers/decorator-property-name.mjs +4 -0
- package/esm2022/internal/lib/helpers/deepmerge.mjs +6 -0
- package/esm2022/internal/lib/helpers/get-css-variables.mjs +22 -0
- package/esm2022/internal/lib/helpers/get-enum-values.mjs +6 -0
- package/esm2022/internal/lib/helpers/index.mjs +6 -0
- package/esm2022/internal/lib/logger.mjs +42 -0
- package/esm2022/internal/translate/index.mjs +1 -3
- package/esm2022/internal/translate/lib/models/index.mjs +2 -2
- package/esm2022/internal/translate/lib/models/translation-object.mjs +2 -0
- package/esm2022/internal/translate/lib/translate.config.mjs +1 -8
- package/esm2022/internal/translate/lib/translate.service.mjs +19 -12
- package/esm2022/lib/services/window-ref.mjs +4 -3
- package/esm2022/localization/index.mjs +6 -0
- package/esm2022/localization/lib/features/index.mjs +3 -0
- package/esm2022/localization/lib/features/with-http-language-header.mjs +23 -0
- package/esm2022/localization/lib/features/with-http-language-query-param.mjs +23 -0
- package/esm2022/localization/lib/loaders/browser-language-loader.mjs +6 -0
- package/esm2022/localization/lib/loaders/index.mjs +2 -0
- package/esm2022/localization/lib/localization.config.mjs +21 -0
- package/esm2022/localization/lib/localization.service.mjs +45 -0
- package/esm2022/localization/lib/models/index.mjs +3 -0
- package/esm2022/localization/lib/models/language-loader-fn.mjs +2 -0
- package/esm2022/localization/lib/models/localization-feature.mjs +4 -0
- package/esm2022/localization/odx-angular-localization.mjs +5 -0
- package/esm2022/sdk/lib/application-environment.mjs +4 -2
- package/esm2022/utils/lib/helpers/cache-storage-client.mjs +53 -0
- package/esm2022/utils/lib/helpers/get-language-code.mjs +5 -0
- package/esm2022/utils/lib/helpers/index.mjs +4 -1
- package/esm2022/utils/lib/helpers/match-url.mjs +8 -0
- package/esm2022/utils/lib/helpers/provide-config.mjs +21 -9
- package/fesm2022/odx-angular-components-main-menu.mjs.map +1 -1
- package/fesm2022/odx-angular-internal-translate.mjs +27 -44
- package/fesm2022/odx-angular-internal-translate.mjs.map +1 -1
- package/fesm2022/odx-angular-internal.mjs +43 -1
- package/fesm2022/odx-angular-internal.mjs.map +1 -1
- package/fesm2022/odx-angular-localization.mjs +113 -0
- package/fesm2022/odx-angular-localization.mjs.map +1 -0
- package/fesm2022/odx-angular-sdk.mjs +3 -1
- package/fesm2022/odx-angular-sdk.mjs.map +1 -1
- package/fesm2022/odx-angular-utils.mjs +86 -9
- package/fesm2022/odx-angular-utils.mjs.map +1 -1
- package/fesm2022/odx-angular.mjs +3 -4
- package/fesm2022/odx-angular.mjs.map +1 -1
- package/index.d.ts +0 -1
- package/internal/index.d.ts +3 -2
- package/internal/lib/logger.d.ts +15 -0
- package/internal/translate/index.d.ts +0 -2
- package/internal/translate/lib/models/index.d.ts +1 -1
- package/internal/translate/lib/models/translation-object.d.ts +1 -0
- package/internal/translate/lib/translate.config.d.ts +2 -5
- package/internal/translate/lib/translate.service.d.ts +5 -6
- package/localization/README.md +3 -0
- package/localization/index.d.ts +5 -0
- package/localization/lib/features/index.d.ts +2 -0
- package/localization/lib/features/with-http-language-header.d.ts +9 -0
- package/localization/lib/features/with-http-language-query-param.d.ts +9 -0
- package/localization/lib/loaders/browser-language-loader.d.ts +2 -0
- package/localization/lib/loaders/index.d.ts +1 -0
- package/localization/lib/localization.config.d.ts +9 -0
- package/localization/lib/localization.service.d.ts +15 -0
- package/localization/lib/models/index.d.ts +2 -0
- package/localization/lib/models/language-loader-fn.d.ts +2 -0
- package/localization/lib/models/localization-feature.d.ts +5 -0
- package/package.json +7 -1
- package/sdk/lib/application-environment.d.ts +2 -1
- package/theming/lib/theming.config.d.ts +1 -1
- package/utils/lib/helpers/cache-storage-client.d.ts +14 -0
- package/utils/lib/helpers/index.d.ts +3 -0
- package/utils/lib/helpers/match-url.d.ts +2 -0
- package/utils/lib/helpers/provide-config.d.ts +3 -2
- package/esm2022/internal/decorators/css-component.mjs +0 -19
- package/esm2022/internal/decorators/css-modifier.mjs +0 -49
- package/esm2022/internal/decorators/index.mjs +0 -3
- package/esm2022/internal/helpers/camel-to-kebab-case.mjs +0 -12
- package/esm2022/internal/helpers/decorator-property-name.mjs +0 -4
- package/esm2022/internal/helpers/deepmerge.mjs +0 -6
- package/esm2022/internal/helpers/get-css-variables.mjs +0 -22
- package/esm2022/internal/helpers/get-enum-values.mjs +0 -6
- package/esm2022/internal/helpers/index.mjs +0 -6
- package/esm2022/internal/translate/lib/helpers/get-language-code.mjs +0 -6
- package/esm2022/internal/translate/lib/helpers/index.mjs +0 -2
- package/esm2022/internal/translate/lib/models/translation.mjs +0 -2
- package/esm2022/internal/translate/lib/services/index.mjs +0 -2
- package/esm2022/internal/translate/lib/services/language.service.mjs +0 -21
- package/internal/translate/lib/helpers/index.d.ts +0 -1
- package/internal/translate/lib/models/translation.d.ts +0 -2
- package/internal/translate/lib/services/index.d.ts +0 -1
- package/internal/translate/lib/services/language.service.d.ts +0 -8
- /package/internal/{decorators → lib/decorators}/css-component.d.ts +0 -0
- /package/internal/{decorators → lib/decorators}/css-modifier.d.ts +0 -0
- /package/internal/{decorators → lib/decorators}/index.d.ts +0 -0
- /package/internal/{helpers → lib/helpers}/camel-to-kebab-case.d.ts +0 -0
- /package/internal/{helpers → lib/helpers}/decorator-property-name.d.ts +0 -0
- /package/internal/{helpers → lib/helpers}/deepmerge.d.ts +0 -0
- /package/internal/{helpers → lib/helpers}/get-css-variables.d.ts +0 -0
- /package/internal/{helpers → lib/helpers}/get-enum-values.d.ts +0 -0
- /package/internal/{helpers → lib/helpers}/index.d.ts +0 -0
- /package/{internal/translate → utils}/lib/helpers/get-language-code.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-internal-translate.mjs","sources":["../../../../libs/angular/internal/translate/src/lib/
|
|
1
|
+
{"version":3,"file":"odx-angular-internal-translate.mjs","sources":["../../../../libs/angular/internal/translate/src/lib/translate.service.ts","../../../../libs/angular/internal/translate/src/lib/pipes/translate.pipe.ts","../../../../libs/angular/internal/translate/src/lib/translate.config.ts","../../../../libs/angular/internal/translate/src/odx-angular-internal-translate.ts"],"sourcesContent":["import { inject } from '@angular/core';\nimport { LocalizationService } from '@odx/angular/localization';\nimport { getLanguageCode } from '@odx/angular/utils';\nimport { distinctUntilChanged, map, Observable, shareReplay, startWith } from 'rxjs';\nimport { TranslationObject } from './models';\n\nexport class TranslateService {\n private readonly localizationService = inject(LocalizationService);\n\n public readonly activeTranslation$ = this.localizationService.activeLanguage$.pipe(\n startWith(this.localizationService.defaultLanguage),\n distinctUntilChanged(),\n map((language) => {\n const languageCode = getLanguageCode(language);\n if (this.translations[language]) {\n return this.translations[language];\n }\n if (this.translations[languageCode]) {\n return this.translations[languageCode];\n }\n return this.translations[this.localizationService.defaultLanguage];\n }),\n shareReplay({ refCount: true }),\n );\n\n constructor(private readonly translations: TranslationObject) {}\n\n public translate(key: string, data: Record<string, string> = {}): Observable<string> {\n return this.activeTranslation$.pipe(\n map((translation) =>\n Object.entries(data).reduce((acc, [variableName, variable]) => {\n const variableRegex = RegExp(`{{\\\\s*${variableName}\\\\s*}}`, 'g');\n return acc.replace(variableRegex, variable);\n }, translation[key] ?? ''),\n ),\n );\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { TranslateService } from '../translate.service';\n\n@Pipe({\n standalone: true,\n name: 'odxTranslate',\n pure: true,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n public transform(key: string, placeholder: Record<string, string> = {}): Observable<string> {\n return this.translateService.translate(key, placeholder);\n }\n}\n","import { TranslationObject } from './models';\nimport { TranslateService } from './translate.service';\n\nexport function provideTranslations(translations: TranslationObject) {\n return {\n provide: TranslateService,\n useFactory: () => new TranslateService(translations),\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAMa,gBAAgB,CAAA;AAmB3B,IAAA,WAAA,CAA6B,YAA+B,EAAA;QAA/B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAmB;AAlB3C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAEnD,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAChF,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EACnD,oBAAoB,EAAE,EACtB,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC/C,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AAC/B,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACpC,aAAA;AACD,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;AACnC,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;AACxC,aAAA;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;SACpE,CAAC,EACF,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAChC,CAAC;KAE8D;AAEzD,IAAA,SAAS,CAAC,GAAW,EAAE,IAAA,GAA+B,EAAE,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CACjC,GAAG,CAAC,CAAC,WAAW,KACd,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAI;YAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,CAAA,MAAA,EAAS,YAAY,CAAQ,MAAA,CAAA,EAAE,GAAG,CAAC,CAAC;YACjE,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;SAC7C,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAC3B,CACF,CAAC;KACH;AACF;;MC5BY,aAAa,CAAA;AAL1B,IAAA,WAAA,GAAA;AAMmB,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAK9D,KAAA;AAHQ,IAAA,SAAS,CAAC,GAAW,EAAE,WAAA,GAAsC,EAAE,EAAA;QACpE,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;KAC1D;+GALU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;6GAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA,CAAA,CAAA,EAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBALzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,IAAI,EAAE,IAAI;AACX,iBAAA,CAAA;;;ACLK,SAAU,mBAAmB,CAAC,YAA+B,EAAA;IACjE,OAAO;AACL,QAAA,OAAO,EAAE,gBAAgB;QACzB,UAAU,EAAE,MAAM,IAAI,gBAAgB,CAAC,YAAY,CAAC;KACrD,CAAC;AACJ;;ACRA;;AAEG;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { deepmergeCustom } from 'deepmerge-ts';
|
|
2
|
+
import { isDevMode } from '@angular/core';
|
|
2
3
|
|
|
3
4
|
/** @internal */
|
|
4
5
|
/* istanbul ignore next */
|
|
@@ -114,9 +115,50 @@ function CSSModifier(options) {
|
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
117
|
|
|
118
|
+
class Logger {
|
|
119
|
+
constructor(name) {
|
|
120
|
+
this.name = name;
|
|
121
|
+
this.prefix = `[${this.name}]`;
|
|
122
|
+
this.isEnabled = isDevMode();
|
|
123
|
+
}
|
|
124
|
+
log(...data) {
|
|
125
|
+
this.handle('log', data);
|
|
126
|
+
}
|
|
127
|
+
info(...data) {
|
|
128
|
+
this.handle('info', data);
|
|
129
|
+
}
|
|
130
|
+
warn(...data) {
|
|
131
|
+
this.handle('warn', data);
|
|
132
|
+
}
|
|
133
|
+
error(...data) {
|
|
134
|
+
this.handle('error', data);
|
|
135
|
+
}
|
|
136
|
+
debug(...data) {
|
|
137
|
+
this.handle('debug', data);
|
|
138
|
+
}
|
|
139
|
+
group(name, groupHandler, collapsed = true) {
|
|
140
|
+
if (!this.isEnabled)
|
|
141
|
+
return;
|
|
142
|
+
console[collapsed ? 'groupCollapsed' : 'group'](this.prefix, name);
|
|
143
|
+
groupHandler.apply(this, [console.info]);
|
|
144
|
+
console.groupEnd();
|
|
145
|
+
}
|
|
146
|
+
enable() {
|
|
147
|
+
this.isEnabled = true;
|
|
148
|
+
}
|
|
149
|
+
disable() {
|
|
150
|
+
this.isEnabled = false;
|
|
151
|
+
}
|
|
152
|
+
handle(method, data) {
|
|
153
|
+
if (!this.isEnabled)
|
|
154
|
+
return;
|
|
155
|
+
console[method](this.prefix, ...data);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
117
159
|
/**
|
|
118
160
|
* Generated bundle index. Do not edit.
|
|
119
161
|
*/
|
|
120
162
|
|
|
121
|
-
export { CSSComponent, CSSModifier, CSS_COMPONENT_NAME, camelToKebabCase, decoratorPropertyName, deepmerge, getCSSVariables, getEnumValues };
|
|
163
|
+
export { CSSComponent, CSSModifier, CSS_COMPONENT_NAME, Logger, camelToKebabCase, decoratorPropertyName, deepmerge, getCSSVariables, getEnumValues };
|
|
122
164
|
//# sourceMappingURL=odx-angular-internal.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-internal.mjs","sources":["../../../../libs/angular/internal/src/helpers/camel-to-kebab-case.ts","../../../../libs/angular/internal/src/helpers/decorator-property-name.ts","../../../../libs/angular/internal/src/helpers/deepmerge.ts","../../../../libs/angular/internal/src/helpers/get-css-variables.ts","../../../../libs/angular/internal/src/helpers/get-enum-values.ts","../../../../libs/angular/internal/src/decorators/css-component.ts","../../../../libs/angular/internal/src/decorators/css-modifier.ts","../../../../libs/angular/internal/src/odx-angular-internal.ts"],"sourcesContent":["/** @internal */\n/* istanbul ignore next */\nexport function camelToKebabCase(value: string): string {\n if (value !== value.toLowerCase()) {\n return value.replace(/[A-Z]/g, (match, index) => {\n const char = match.toLowerCase();\n\n return index === 0 ? char : `-${char}`;\n });\n }\n return value;\n}\n","export function decoratorPropertyName<D extends string, T extends string>(decoratorName: D, propertyName: T): `__ODX_${D}_${T}__` {\n return `__ODX_${decoratorName}_${propertyName}__`;\n}\n","import { deepmergeCustom, DeepMergeLeafURI } from 'deepmerge-ts';\n\nexport const deepmerge = deepmergeCustom<{ DeepMergeArraysURI: DeepMergeLeafURI }>({\n mergeArrays: false,\n mergeSets: false,\n});\n","interface CSSVariableDefinition {\n name: string;\n value: string;\n}\n\n/* istanbul ignore next */\nfunction isSameDomain({ href }: StyleSheet): boolean {\n return !href || href.startsWith(window.location.origin);\n}\n\n/** @internal */\n/* istanbul ignore next */\nexport function getCSSVariables(filter: RegExp, selector = 'body'): CSSVariableDefinition[] {\n const stylesheets = Array.from(document.styleSheets).filter(isSameDomain);\n\n return stylesheets.reduce<CSSVariableDefinition[]>((variables, { cssRules }) => {\n const rules = Array.from(cssRules).filter(({ type }) => type === CSSRule.STYLE_RULE) as CSSStyleRule[];\n for (const { style, selectorText } of rules) {\n for (const propName of Array.from(style)) {\n const name = propName.trim();\n if (!name.startsWith('--') || !filter.test(name) || (selector && selectorText !== selector)) continue;\n variables.push({ name, value: style.getPropertyValue(propName).trim() });\n }\n }\n return variables;\n }, []);\n}\n","/** @internal */\nexport function getEnumValues<TEnum, TKeys extends string>(e: { [key in TKeys]: TEnum }): TEnum[] {\n const keys = Object.keys(e) as TKeys[];\n return keys.filter((key) => e[key] !== undefined).map((key) => e[key]);\n}\n","import { ElementRef, Type } from '@angular/core';\nimport { decoratorPropertyName } from '../helpers';\n\nexport const CSS_COMPONENT_NAME = decoratorPropertyName('CSSComponent', 'name');\n\n/** @internal */\nexport interface CSSComponent {\n readonly element: ElementRef<HTMLElement>;\n}\n\n/** @internal */\n/* istanbul ignore next */\nexport function CSSComponent(name: string, prefix = 'odx') {\n return (target: Type<CSSComponent>) => {\n const cssClass = `${prefix}-${name}`;\n Object.defineProperty(target.prototype, CSS_COMPONENT_NAME, {\n value: cssClass,\n });\n\n (function (this: unknown, ngOnInit?: () => void) {\n target.prototype.ngOnInit = function (this: CSSComponent) {\n this.element.nativeElement.classList.add(cssClass);\n ngOnInit?.call(this);\n };\n })(target.prototype.ngOnInit);\n };\n}\n","import { camelToKebabCase, decoratorPropertyName } from '../helpers';\nimport { CSSComponent, CSS_COMPONENT_NAME } from './css-component';\n\n/** @internal */\ninterface CSSModifierOptions {\n withComponentPrefix?: boolean;\n withPrefix?: boolean;\n}\n\ntype CSSComponentInstance = CSSComponent & Record<string, unknown>;\n\n/** @internal */\n/* istanbul ignore next */\nexport function CSSModifier(options?: CSSModifierOptions) {\n return (target: CSSComponent, propertyKey: PropertyKey) => {\n const propertyKeyName = propertyKey.toString();\n const propertyKeyKebabCase = camelToKebabCase(propertyKeyName);\n const propertySymbol = decoratorPropertyName('CSSModifier', propertyKeyName);\n const propertyDefaultValue = decoratorPropertyName('CSSModifier', `${propertyKeyName}_default`);\n\n function createModifierClass(this: CSSComponentInstance, value: unknown) {\n if (typeof value === 'boolean' || (typeof value === 'string' && value.length > 0)) {\n let modifier = typeof value === 'boolean' ? propertyKeyKebabCase : value;\n if (options?.withPrefix) {\n modifier = `${propertyKeyName}-${modifier}`;\n }\n if (options?.withComponentPrefix ?? true) {\n return `${this[CSS_COMPONENT_NAME]}--${modifier}`;\n }\n return modifier;\n }\n return null;\n }\n\n function getter(this: CSSComponentInstance) {\n return this[propertySymbol];\n }\n\n function setter(this: CSSComponentInstance, value: unknown) {\n this[propertyDefaultValue] ??= value;\n const currentValue = this[propertySymbol] ?? null;\n const nextValue = value ?? this[propertyDefaultValue] ?? null;\n\n if (nextValue !== currentValue) {\n const currentModifierClass = createModifierClass.call(this, currentValue);\n if (currentModifierClass !== null) {\n this.element.nativeElement.classList.remove(currentModifierClass);\n }\n const newModifierClass = createModifierClass.call(this, nextValue);\n if (newModifierClass !== null && (typeof nextValue === 'boolean' ? nextValue : true)) {\n this.element.nativeElement.classList.add(newModifierClass);\n }\n }\n this[propertySymbol] = nextValue;\n }\n Object.defineProperty(target, propertyKey, {\n get: getter,\n set: setter,\n });\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAAA;AACA;AACM,SAAU,gBAAgB,CAAC,KAAa,EAAA;AAC5C,IAAA,IAAI,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,EAAE;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAI;AAC9C,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;AAEjC,YAAA,OAAO,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;AACzC,SAAC,CAAC,CAAC;AACJ,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACf;;ACXgB,SAAA,qBAAqB,CAAqC,aAAgB,EAAE,YAAe,EAAA;AACzG,IAAA,OAAO,CAAS,MAAA,EAAA,aAAa,CAAI,CAAA,EAAA,YAAY,IAAI,CAAC;AACpD;;ACAO,MAAM,SAAS,GAAG,eAAe,CAA2C;AACjF,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,SAAS,EAAE,KAAK;AACjB,CAAA;;ACAD;AACA,SAAS,YAAY,CAAC,EAAE,IAAI,EAAc,EAAA;AACxC,IAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED;AACA;SACgB,eAAe,CAAC,MAAc,EAAE,QAAQ,GAAG,MAAM,EAAA;AAC/D,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAE1E,OAAO,WAAW,CAAC,MAAM,CAA0B,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAI;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC,UAAU,CAAmB,CAAC;QACvG,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,KAAK,EAAE;YAC3C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACxC,gBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,YAAY,KAAK,QAAQ,CAAC;oBAAE,SAAS;AACtG,gBAAA,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1E,aAAA;AACF,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;KAClB,EAAE,EAAE,CAAC,CAAC;AACT;;AC1BA;AACM,SAAU,aAAa,CAA8B,CAA4B,EAAA;IACrF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAY,CAAC;AACvC,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzE;;ACDa,MAAA,kBAAkB,GAAG,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE;AAOhF;AACA;SACgB,YAAY,CAAC,IAAY,EAAE,MAAM,GAAG,KAAK,EAAA;IACvD,OAAO,CAAC,MAA0B,KAAI;AACpC,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,MAAM,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE;AAC1D,YAAA,KAAK,EAAE,QAAQ;AAChB,SAAA,CAAC,CAAC;AAEH,QAAA,CAAC,UAAyB,QAAqB,EAAA;AAC7C,YAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAA;gBAC1B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnD,gBAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACvB,aAAC,CAAC;SACH,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAChC,KAAC,CAAC;AACJ;;ACfA;AACA;AACM,SAAU,WAAW,CAAC,OAA4B,EAAA;AACtD,IAAA,OAAO,CAAC,MAAoB,EAAE,WAAwB,KAAI;AACxD,QAAA,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;AAC/C,QAAA,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAC7E,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,aAAa,EAAE,CAAG,EAAA,eAAe,CAAU,QAAA,CAAA,CAAC,CAAC;QAEhG,SAAS,mBAAmB,CAA6B,KAAc,EAAA;AACrE,YAAA,IAAI,OAAO,KAAK,KAAK,SAAS,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;AACjF,gBAAA,IAAI,QAAQ,GAAG,OAAO,KAAK,KAAK,SAAS,GAAG,oBAAoB,GAAG,KAAK,CAAC;gBACzE,IAAI,OAAO,EAAE,UAAU,EAAE;AACvB,oBAAA,QAAQ,GAAG,CAAG,EAAA,eAAe,CAAI,CAAA,EAAA,QAAQ,EAAE,CAAC;AAC7C,iBAAA;AACD,gBAAA,IAAI,OAAO,EAAE,mBAAmB,IAAI,IAAI,EAAE;oBACxC,OAAO,CAAA,EAAG,IAAI,CAAC,kBAAkB,CAAC,CAAK,EAAA,EAAA,QAAQ,EAAE,CAAC;AACnD,iBAAA;AACD,gBAAA,OAAO,QAAQ,CAAC;AACjB,aAAA;AACD,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,SAAS,MAAM,GAAA;AACb,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;SAC7B;QAED,SAAS,MAAM,CAA6B,KAAc,EAAA;AACxD,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,KAAK,CAAC;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;YAClD,MAAM,SAAS,GAAG,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;YAE9D,IAAI,SAAS,KAAK,YAAY,EAAE;gBAC9B,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAC1E,IAAI,oBAAoB,KAAK,IAAI,EAAE;oBACjC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnE,iBAAA;gBACD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACnE,gBAAA,IAAI,gBAAgB,KAAK,IAAI,KAAK,OAAO,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE;oBACpF,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC5D,iBAAA;AACF,aAAA;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;SAClC;AACD,QAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE;AACzC,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,GAAG,EAAE,MAAM;AACZ,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACJ;;AC5DA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"odx-angular-internal.mjs","sources":["../../../../libs/angular/internal/src/lib/helpers/camel-to-kebab-case.ts","../../../../libs/angular/internal/src/lib/helpers/decorator-property-name.ts","../../../../libs/angular/internal/src/lib/helpers/deepmerge.ts","../../../../libs/angular/internal/src/lib/helpers/get-css-variables.ts","../../../../libs/angular/internal/src/lib/helpers/get-enum-values.ts","../../../../libs/angular/internal/src/lib/decorators/css-component.ts","../../../../libs/angular/internal/src/lib/decorators/css-modifier.ts","../../../../libs/angular/internal/src/lib/logger.ts","../../../../libs/angular/internal/src/odx-angular-internal.ts"],"sourcesContent":["/** @internal */\n/* istanbul ignore next */\nexport function camelToKebabCase(value: string): string {\n if (value !== value.toLowerCase()) {\n return value.replace(/[A-Z]/g, (match, index) => {\n const char = match.toLowerCase();\n\n return index === 0 ? char : `-${char}`;\n });\n }\n return value;\n}\n","export function decoratorPropertyName<D extends string, T extends string>(decoratorName: D, propertyName: T): `__ODX_${D}_${T}__` {\n return `__ODX_${decoratorName}_${propertyName}__`;\n}\n","import { deepmergeCustom, DeepMergeLeafURI } from 'deepmerge-ts';\n\nexport const deepmerge = deepmergeCustom<{ DeepMergeArraysURI: DeepMergeLeafURI }>({\n mergeArrays: false,\n mergeSets: false,\n});\n","interface CSSVariableDefinition {\n name: string;\n value: string;\n}\n\n/* istanbul ignore next */\nfunction isSameDomain({ href }: StyleSheet): boolean {\n return !href || href.startsWith(window.location.origin);\n}\n\n/** @internal */\n/* istanbul ignore next */\nexport function getCSSVariables(filter: RegExp, selector = 'body'): CSSVariableDefinition[] {\n const stylesheets = Array.from(document.styleSheets).filter(isSameDomain);\n\n return stylesheets.reduce<CSSVariableDefinition[]>((variables, { cssRules }) => {\n const rules = Array.from(cssRules).filter(({ type }) => type === CSSRule.STYLE_RULE) as CSSStyleRule[];\n for (const { style, selectorText } of rules) {\n for (const propName of Array.from(style)) {\n const name = propName.trim();\n if (!name.startsWith('--') || !filter.test(name) || (selector && selectorText !== selector)) continue;\n variables.push({ name, value: style.getPropertyValue(propName).trim() });\n }\n }\n return variables;\n }, []);\n}\n","/** @internal */\nexport function getEnumValues<TEnum, TKeys extends string>(e: { [key in TKeys]: TEnum }): TEnum[] {\n const keys = Object.keys(e) as TKeys[];\n return keys.filter((key) => e[key] !== undefined).map((key) => e[key]);\n}\n","import { ElementRef, Type } from '@angular/core';\nimport { decoratorPropertyName } from '../helpers';\n\nexport const CSS_COMPONENT_NAME = decoratorPropertyName('CSSComponent', 'name');\n\n/** @internal */\nexport interface CSSComponent {\n readonly element: ElementRef<HTMLElement>;\n}\n\n/** @internal */\n/* istanbul ignore next */\nexport function CSSComponent(name: string, prefix = 'odx') {\n return (target: Type<CSSComponent>) => {\n const cssClass = `${prefix}-${name}`;\n Object.defineProperty(target.prototype, CSS_COMPONENT_NAME, {\n value: cssClass,\n });\n\n (function (this: unknown, ngOnInit?: () => void) {\n target.prototype.ngOnInit = function (this: CSSComponent) {\n this.element.nativeElement.classList.add(cssClass);\n ngOnInit?.call(this);\n };\n })(target.prototype.ngOnInit);\n };\n}\n","import { camelToKebabCase, decoratorPropertyName } from '../helpers';\nimport { CSSComponent, CSS_COMPONENT_NAME } from './css-component';\n\n/** @internal */\ninterface CSSModifierOptions {\n withComponentPrefix?: boolean;\n withPrefix?: boolean;\n}\n\ntype CSSComponentInstance = CSSComponent & Record<string, unknown>;\n\n/** @internal */\n/* istanbul ignore next */\nexport function CSSModifier(options?: CSSModifierOptions) {\n return (target: CSSComponent, propertyKey: PropertyKey) => {\n const propertyKeyName = propertyKey.toString();\n const propertyKeyKebabCase = camelToKebabCase(propertyKeyName);\n const propertySymbol = decoratorPropertyName('CSSModifier', propertyKeyName);\n const propertyDefaultValue = decoratorPropertyName('CSSModifier', `${propertyKeyName}_default`);\n\n function createModifierClass(this: CSSComponentInstance, value: unknown) {\n if (typeof value === 'boolean' || (typeof value === 'string' && value.length > 0)) {\n let modifier = typeof value === 'boolean' ? propertyKeyKebabCase : value;\n if (options?.withPrefix) {\n modifier = `${propertyKeyName}-${modifier}`;\n }\n if (options?.withComponentPrefix ?? true) {\n return `${this[CSS_COMPONENT_NAME]}--${modifier}`;\n }\n return modifier;\n }\n return null;\n }\n\n function getter(this: CSSComponentInstance) {\n return this[propertySymbol];\n }\n\n function setter(this: CSSComponentInstance, value: unknown) {\n this[propertyDefaultValue] ??= value;\n const currentValue = this[propertySymbol] ?? null;\n const nextValue = value ?? this[propertyDefaultValue] ?? null;\n\n if (nextValue !== currentValue) {\n const currentModifierClass = createModifierClass.call(this, currentValue);\n if (currentModifierClass !== null) {\n this.element.nativeElement.classList.remove(currentModifierClass);\n }\n const newModifierClass = createModifierClass.call(this, nextValue);\n if (newModifierClass !== null && (typeof nextValue === 'boolean' ? nextValue : true)) {\n this.element.nativeElement.classList.add(newModifierClass);\n }\n }\n this[propertySymbol] = nextValue;\n }\n Object.defineProperty(target, propertyKey, {\n get: getter,\n set: setter,\n });\n };\n}\n","import { isDevMode } from '@angular/core';\n\nexport class Logger {\n private isEnabled: boolean;\n private readonly name: string;\n private readonly prefix: string;\n\n constructor(name: string) {\n this.name = name;\n this.prefix = `[${this.name}]`;\n this.isEnabled = isDevMode();\n }\n\n public log(...data: unknown[]): void {\n this.handle('log', data);\n }\n\n public info(...data: unknown[]): void {\n this.handle('info', data);\n }\n\n public warn(...data: unknown[]): void {\n this.handle('warn', data);\n }\n\n public error(...data: unknown[]): void {\n this.handle('error', data);\n }\n\n public debug(...data: unknown[]): void {\n this.handle('debug', data);\n }\n\n public group(name: string, groupHandler: (this: Logger, log: (...data: unknown[]) => void) => void, collapsed = true): void {\n if (!this.isEnabled) return;\n console[collapsed ? 'groupCollapsed' : 'group'](this.prefix, name);\n groupHandler.apply(this, [console.info]);\n console.groupEnd();\n }\n\n public enable(): void {\n this.isEnabled = true;\n }\n\n public disable(): void {\n this.isEnabled = false;\n }\n\n protected handle(method: 'debug' | 'log' | 'info' | 'warn' | 'error', data: unknown[]): void {\n if (!this.isEnabled) return;\n console[method](this.prefix, ...data);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { provideHttpClient, withInterceptors } from '@angular/common/http';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { makeEnvironmentProviders, APP_INITIALIZER, inject, Injector, runInInjectionContext, Injectable } from '@angular/core';
|
|
4
|
+
import { createConfigTokens, getLanguageCode, matchUrl } from '@odx/angular/utils';
|
|
5
|
+
import { BehaviorSubject, filter, distinctUntilChanged, shareReplay, from, firstValueFrom, take, switchMap } from 'rxjs';
|
|
6
|
+
import { WindowRef } from '@odx/angular';
|
|
7
|
+
|
|
8
|
+
const DEFAULT_AVAILABLE_LANGUAGES = ['en', 'de', 'es', 'fr', 'ja'];
|
|
9
|
+
const { LocalizationConfig, LocalizationDefaultConfig, injectLocalizationConfig, provideLocalizationConfig } = createConfigTokens('Localization', '@odx/angular/internal/translate', {
|
|
10
|
+
availableLanguages: DEFAULT_AVAILABLE_LANGUAGES,
|
|
11
|
+
availableLocales: DEFAULT_AVAILABLE_LANGUAGES,
|
|
12
|
+
});
|
|
13
|
+
function provideLocalization(config, ...features) {
|
|
14
|
+
return makeEnvironmentProviders([
|
|
15
|
+
provideLocalizationConfig(config),
|
|
16
|
+
{
|
|
17
|
+
provide: APP_INITIALIZER,
|
|
18
|
+
useFactory: (localizationService) => () => localizationService.loadActiveLanguage(),
|
|
19
|
+
deps: [LocalizationService],
|
|
20
|
+
multi: true,
|
|
21
|
+
},
|
|
22
|
+
features,
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
class LocalizationService {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.injector = inject(Injector);
|
|
29
|
+
this.localizationConfig = injectLocalizationConfig();
|
|
30
|
+
this.availableLanguageSet = new Set(this.localizationConfig.availableLanguages);
|
|
31
|
+
this.activeLanguage$$ = new BehaviorSubject(undefined);
|
|
32
|
+
this.activeLanguage$ = this.activeLanguage$$.pipe(filter(Boolean), distinctUntilChanged(), shareReplay({ refCount: true }));
|
|
33
|
+
this.availableLanguages = Array.from(this.availableLanguageSet);
|
|
34
|
+
this.defaultLanguage = this.availableLanguages[0];
|
|
35
|
+
}
|
|
36
|
+
getActiveLanguage() {
|
|
37
|
+
return this.activeLanguage$$.getValue() ?? this.defaultLanguage;
|
|
38
|
+
}
|
|
39
|
+
setActiveLanguage(language) {
|
|
40
|
+
if (this.availableLanguageSet.has(language)) {
|
|
41
|
+
this.activeLanguage$$.next(language);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const languageCode = getLanguageCode(language);
|
|
45
|
+
if (this.availableLanguageSet.has(languageCode)) {
|
|
46
|
+
this.activeLanguage$$.next(languageCode);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.activeLanguage$$.next(this.defaultLanguage);
|
|
50
|
+
}
|
|
51
|
+
async loadActiveLanguage() {
|
|
52
|
+
return runInInjectionContext(this.injector, async () => {
|
|
53
|
+
const activeLanguageLoader$ = from(this.localizationConfig.activeLanguageLoader?.() ?? []);
|
|
54
|
+
const activeLanguage = await firstValueFrom(activeLanguageLoader$).catch(() => null);
|
|
55
|
+
this.setActiveLanguage(activeLanguage ?? this.defaultLanguage);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
59
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalizationService, providedIn: 'root' }); }
|
|
60
|
+
}
|
|
61
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalizationService, decorators: [{
|
|
62
|
+
type: Injectable,
|
|
63
|
+
args: [{ providedIn: 'root' }]
|
|
64
|
+
}] });
|
|
65
|
+
|
|
66
|
+
function makeLocalizationFeature(provider) {
|
|
67
|
+
return provider;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const HTTP_LANGUAGE_HEADER = 'Accept-Language';
|
|
71
|
+
function httpLanguageHeaderInterceptor({ allowedUrls, headerName }) {
|
|
72
|
+
return (req, next) => {
|
|
73
|
+
const language$ = inject(LocalizationService).activeLanguage$.pipe(take(1));
|
|
74
|
+
for (const allowedUrl of allowedUrls) {
|
|
75
|
+
if (!matchUrl(req.url, allowedUrl))
|
|
76
|
+
continue;
|
|
77
|
+
return language$.pipe(switchMap((language) => next(req.clone({ setHeaders: { [headerName ?? HTTP_LANGUAGE_HEADER]: language } }))));
|
|
78
|
+
}
|
|
79
|
+
return next(req);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function withHttpLanguageHeader(config) {
|
|
83
|
+
const providers = provideHttpClient(withInterceptors([httpLanguageHeaderInterceptor(config)]));
|
|
84
|
+
return makeLocalizationFeature(providers);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const HTTP_LANGUAGE_QUERY = 'language';
|
|
88
|
+
function withHttpLanguageQueryParamInterceptor({ allowedUrls, queryParamName }) {
|
|
89
|
+
return (req, next) => {
|
|
90
|
+
const language$ = inject(LocalizationService).activeLanguage$.pipe(take(1));
|
|
91
|
+
for (const allowedUrl of allowedUrls) {
|
|
92
|
+
if (!matchUrl(req.url, allowedUrl))
|
|
93
|
+
continue;
|
|
94
|
+
return language$.pipe(switchMap((language) => next(req.clone({ setParams: { [queryParamName ?? HTTP_LANGUAGE_QUERY]: language } }))));
|
|
95
|
+
}
|
|
96
|
+
return next(req);
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function withHttpLanguageQueryParam(config) {
|
|
100
|
+
const providers = provideHttpClient(withInterceptors([withHttpLanguageQueryParamInterceptor(config)]));
|
|
101
|
+
return makeLocalizationFeature(providers);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const browserLanguageLoader = async () => {
|
|
105
|
+
return inject(WindowRef).getLanguage();
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Generated bundle index. Do not edit.
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
export { DEFAULT_AVAILABLE_LANGUAGES, HTTP_LANGUAGE_HEADER, HTTP_LANGUAGE_QUERY, LocalizationConfig, LocalizationDefaultConfig, LocalizationService, browserLanguageLoader, httpLanguageHeaderInterceptor, injectLocalizationConfig, makeLocalizationFeature, provideLocalization, provideLocalizationConfig, withHttpLanguageHeader, withHttpLanguageQueryParam, withHttpLanguageQueryParamInterceptor };
|
|
113
|
+
//# sourceMappingURL=odx-angular-localization.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odx-angular-localization.mjs","sources":["../../../../libs/angular/localization/src/lib/localization.config.ts","../../../../libs/angular/localization/src/lib/localization.service.ts","../../../../libs/angular/localization/src/lib/models/localization-feature.ts","../../../../libs/angular/localization/src/lib/features/with-http-language-header.ts","../../../../libs/angular/localization/src/lib/features/with-http-language-query-param.ts","../../../../libs/angular/localization/src/lib/loaders/browser-language-loader.ts","../../../../libs/angular/localization/src/odx-angular-localization.ts"],"sourcesContent":["import { APP_INITIALIZER, EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { createConfigTokens } from '@odx/angular/utils';\nimport { LocalizationService } from './localization.service';\nimport { LanguageLoaderFn, LocalizationFeature } from './models';\n\nexport const DEFAULT_AVAILABLE_LANGUAGES = ['en', 'de', 'es', 'fr', 'ja'];\n\nexport interface LocalizationConfig {\n activeLanguageLoader?: LanguageLoaderFn;\n availableLanguages: string[];\n}\n\nexport const { LocalizationConfig, LocalizationDefaultConfig, injectLocalizationConfig, provideLocalizationConfig } = createConfigTokens(\n 'Localization',\n '@odx/angular/internal/translate',\n {\n availableLanguages: DEFAULT_AVAILABLE_LANGUAGES,\n availableLocales: DEFAULT_AVAILABLE_LANGUAGES,\n } as LocalizationConfig,\n);\n\nexport function provideLocalization(config: Partial<LocalizationConfig>, ...features: LocalizationFeature[]): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideLocalizationConfig(config),\n {\n provide: APP_INITIALIZER,\n useFactory: (localizationService: LocalizationService) => () => localizationService.loadActiveLanguage(),\n deps: [LocalizationService],\n multi: true,\n },\n features,\n ]);\n}\n","import { Injectable, Injector, inject, runInInjectionContext } from '@angular/core';\nimport { getLanguageCode } from '@odx/angular/utils';\nimport { BehaviorSubject, distinctUntilChanged, filter, firstValueFrom, from, shareReplay } from 'rxjs';\nimport { injectLocalizationConfig } from './localization.config';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalizationService {\n private readonly injector = inject(Injector);\n private readonly localizationConfig = injectLocalizationConfig();\n private readonly availableLanguageSet = new Set(this.localizationConfig.availableLanguages);\n private readonly activeLanguage$$ = new BehaviorSubject<string | undefined>(undefined);\n\n public readonly activeLanguage$ = this.activeLanguage$$.pipe(filter(Boolean), distinctUntilChanged(), shareReplay({ refCount: true }));\n public readonly availableLanguages = Array.from(this.availableLanguageSet);\n public readonly defaultLanguage = this.availableLanguages[0];\n\n public getActiveLanguage(): string {\n return this.activeLanguage$$.getValue() ?? this.defaultLanguage;\n }\n\n public setActiveLanguage(language: string): void {\n if (this.availableLanguageSet.has(language)) {\n this.activeLanguage$$.next(language);\n return;\n }\n const languageCode = getLanguageCode(language);\n if (this.availableLanguageSet.has(languageCode)) {\n this.activeLanguage$$.next(languageCode);\n return;\n }\n this.activeLanguage$$.next(this.defaultLanguage);\n }\n\n public async loadActiveLanguage(): Promise<void> {\n return runInInjectionContext(this.injector, async () => {\n const activeLanguageLoader$ = from(this.localizationConfig.activeLanguageLoader?.() ?? []);\n const activeLanguage = await firstValueFrom(activeLanguageLoader$).catch(() => null);\n this.setActiveLanguage(activeLanguage ?? this.defaultLanguage);\n });\n }\n}\n","import { EnvironmentProviders, Provider } from '@angular/core';\n\nexport type LocalizationFeature = EnvironmentProviders & { ɵodxBrand: '@odx/angular/localization::LocalizationFeature' };\n\nexport function makeLocalizationFeature(provider: Provider[] | EnvironmentProviders): LocalizationFeature {\n return provider as never as LocalizationFeature;\n}\n","import { HttpInterceptorFn, provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { matchUrl } from '@odx/angular/utils';\nimport { switchMap, take } from 'rxjs';\nimport { LocalizationService } from '../localization.service';\nimport { LocalizationFeature, makeLocalizationFeature } from '../models';\n\nexport const HTTP_LANGUAGE_HEADER = 'Accept-Language';\n\nexport interface HttpLanguageHeaderInterceptorConfig {\n allowedUrls: Array<string | RegExp>;\n headerName?: string;\n}\n\nexport function httpLanguageHeaderInterceptor({ allowedUrls, headerName }: HttpLanguageHeaderInterceptorConfig): HttpInterceptorFn {\n return (req, next) => {\n const language$ = inject(LocalizationService).activeLanguage$.pipe(take(1));\n for (const allowedUrl of allowedUrls) {\n if (!matchUrl(req.url, allowedUrl)) continue;\n return language$.pipe(switchMap((language) => next(req.clone({ setHeaders: { [headerName ?? HTTP_LANGUAGE_HEADER]: language } }))));\n }\n return next(req);\n };\n}\n\nexport function withHttpLanguageHeader(config: HttpLanguageHeaderInterceptorConfig): LocalizationFeature {\n const providers = provideHttpClient(withInterceptors([httpLanguageHeaderInterceptor(config)]));\n\n return makeLocalizationFeature(providers);\n}\n","import { HttpInterceptorFn, provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { matchUrl } from '@odx/angular/utils';\nimport { switchMap, take } from 'rxjs';\nimport { LocalizationService } from '../localization.service';\nimport { LocalizationFeature, makeLocalizationFeature } from '../models';\n\nexport const HTTP_LANGUAGE_QUERY = 'language';\n\nexport interface HttpLanguageQueryParamInterceptorConfig {\n allowedUrls: Array<string | RegExp>;\n queryParamName?: string;\n}\n\nexport function withHttpLanguageQueryParamInterceptor({ allowedUrls, queryParamName }: HttpLanguageQueryParamInterceptorConfig): HttpInterceptorFn {\n return (req, next) => {\n const language$ = inject(LocalizationService).activeLanguage$.pipe(take(1));\n for (const allowedUrl of allowedUrls) {\n if (!matchUrl(req.url, allowedUrl)) continue;\n return language$.pipe(switchMap((language) => next(req.clone({ setParams: { [queryParamName ?? HTTP_LANGUAGE_QUERY]: language } }))));\n }\n return next(req);\n };\n}\n\nexport function withHttpLanguageQueryParam(config: HttpLanguageQueryParamInterceptorConfig): LocalizationFeature {\n const providers = provideHttpClient(withInterceptors([withHttpLanguageQueryParamInterceptor(config)]));\n\n return makeLocalizationFeature(providers);\n}\n","import { inject } from '@angular/core';\nimport { WindowRef } from '@odx/angular';\nimport { LanguageLoaderFn } from '../models';\n\nexport const browserLanguageLoader: LanguageLoaderFn = async () => {\n return inject(WindowRef).getLanguage();\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { InjectionToken, inject } from '@angular/core';
|
|
2
2
|
import { bootstrapApplication } from '@angular/platform-browser';
|
|
3
|
+
import { CacheStorageClient } from '@odx/angular/utils';
|
|
3
4
|
|
|
4
5
|
function createHttpApplicationEnvironmentLoader(handler) {
|
|
5
|
-
|
|
6
|
+
const cache = new CacheStorageClient('@odx/angular/sdk::ApplicationEnvironment');
|
|
7
|
+
return (...args) => cache.request(...args).then((dto) => handler(dto));
|
|
6
8
|
}
|
|
7
9
|
function createApplicationEnvironment(loader) {
|
|
8
10
|
let environment;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-sdk.mjs","sources":["../../../../libs/angular/sdk/src/lib/application-environment.ts","../../../../libs/angular/sdk/src/odx-angular-sdk.ts"],"sourcesContent":["import { ApplicationRef, inject, InjectionToken } from '@angular/core';\nimport { bootstrapApplication } from '@angular/platform-browser';\n\nexport type ApplicationEnvironmentLoader<EnvironmentData, Params extends unknown[]> = (...args: Params) => Promise<EnvironmentData>;\n\nexport function createHttpApplicationEnvironmentLoader<Data>(\n handler: (
|
|
1
|
+
{"version":3,"file":"odx-angular-sdk.mjs","sources":["../../../../libs/angular/sdk/src/lib/application-environment.ts","../../../../libs/angular/sdk/src/odx-angular-sdk.ts"],"sourcesContent":["import { ApplicationRef, inject, InjectionToken } from '@angular/core';\nimport { bootstrapApplication } from '@angular/platform-browser';\nimport { CacheStorageClient } from '@odx/angular/utils';\n\nexport type ApplicationEnvironmentLoader<EnvironmentData, Params extends unknown[]> = (...args: Params) => Promise<EnvironmentData>;\n\nexport function createHttpApplicationEnvironmentLoader<Data>(\n handler: (dto: unknown) => Promise<Data>,\n): ApplicationEnvironmentLoader<Data, Parameters<CacheStorageClient['request']>> {\n const cache = new CacheStorageClient('@odx/angular/sdk::ApplicationEnvironment');\n\n return (...args: Parameters<CacheStorageClient['request']>) => cache.request<unknown>(...args).then((dto) => handler(dto!));\n}\n\nexport function createApplicationEnvironment<Data, Params extends unknown[]>(loader: ApplicationEnvironmentLoader<Data, Params>) {\n let environment: Data;\n const APPLICATION_ENVIRONMENT = new InjectionToken<Data>('@odx/angular/sdk::ApplicationEnvironment', {\n providedIn: 'root',\n factory: () => environment as Data,\n });\n\n function injectApplicationEnvironment(): Data {\n return inject(APPLICATION_ENVIRONMENT);\n }\n\n async function loadApplicationEnvironment(...args: Parameters<typeof loader>): Promise<Data> {\n environment = await loader(...args);\n if (!environment) {\n throw new Error('[@odx/angular/sdk] Failed load application environment');\n }\n return environment;\n }\n\n async function bootstrapApplicationWithEnvironment(\n params: Parameters<typeof loader>,\n ...args: Parameters<typeof bootstrapApplication>\n ): Promise<ApplicationRef> {\n await loadApplicationEnvironment(...params);\n\n return bootstrapApplication(...args);\n }\n\n return {\n APPLICATION_ENVIRONMENT,\n injectApplicationEnvironment,\n bootstrapApplicationWithEnvironment,\n loadApplicationEnvironment,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAMM,SAAU,sCAAsC,CACpD,OAAwC,EAAA;AAExC,IAAA,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,0CAA0C,CAAC,CAAC;IAEjF,OAAO,CAAC,GAAG,IAA+C,KAAK,KAAK,CAAC,OAAO,CAAU,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAI,CAAC,CAAC,CAAC;AAC9H,CAAC;AAEK,SAAU,4BAA4B,CAAiC,MAAkD,EAAA;AAC7H,IAAA,IAAI,WAAiB,CAAC;AACtB,IAAA,MAAM,uBAAuB,GAAG,IAAI,cAAc,CAAO,0CAA0C,EAAE;AACnG,QAAA,UAAU,EAAE,MAAM;AAClB,QAAA,OAAO,EAAE,MAAM,WAAmB;AACnC,KAAA,CAAC,CAAC;AAEH,IAAA,SAAS,4BAA4B,GAAA;AACnC,QAAA,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC;KACxC;AAED,IAAA,eAAe,0BAA0B,CAAC,GAAG,IAA+B,EAAA;AAC1E,QAAA,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAC3E,SAAA;AACD,QAAA,OAAO,WAAW,CAAC;KACpB;AAED,IAAA,eAAe,mCAAmC,CAChD,MAAiC,EACjC,GAAG,IAA6C,EAAA;AAEhD,QAAA,MAAM,0BAA0B,CAAC,GAAG,MAAM,CAAC,CAAC;AAE5C,QAAA,OAAO,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAC;KACtC;IAED,OAAO;QACL,uBAAuB;QACvB,4BAA4B;QAC5B,mCAAmC;QACnC,0BAA0B;KAC3B,CAAC;AACJ;;AChDA;;AAEG;;;;"}
|
|
@@ -185,6 +185,59 @@ function buildWebsiteUrl(...segments) {
|
|
|
185
185
|
return buildUrl(DRAEGER_WEBSITE_URL, ...segments);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
+
const HTTP_ETAG_HEADER = 'Etag';
|
|
189
|
+
const HTTP_IF_NONE_MATCH_HEADER = 'If-None-Match';
|
|
190
|
+
const HTTP_CACHE_CONTROL_HEADER = 'Cache-Control';
|
|
191
|
+
class CacheStorageClient {
|
|
192
|
+
constructor(cacheKey, cacheStorage = window.caches) {
|
|
193
|
+
this.cacheKey = cacheKey;
|
|
194
|
+
this.cacheStorage = cacheStorage;
|
|
195
|
+
}
|
|
196
|
+
async delete(request) {
|
|
197
|
+
const cache = await this.getCache();
|
|
198
|
+
return cache.delete(request);
|
|
199
|
+
}
|
|
200
|
+
async deleteAll() {
|
|
201
|
+
const cache = await this.getCache();
|
|
202
|
+
for (const key of await cache.keys()) {
|
|
203
|
+
await cache.delete(key);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async request(requestInfo, shouldDelete = ({ status }) => status >= 400 && status < 500) {
|
|
207
|
+
const cache = await this.getCache();
|
|
208
|
+
const request = await this.prepareRequest(cache, requestInfo);
|
|
209
|
+
const response = await this.sendRequest(cache, request);
|
|
210
|
+
if (response && shouldDelete?.(response)) {
|
|
211
|
+
await cache.delete(request);
|
|
212
|
+
}
|
|
213
|
+
return response?.json() ?? null;
|
|
214
|
+
}
|
|
215
|
+
async getCache() {
|
|
216
|
+
return this.cacheStorage.open(this.cacheKey);
|
|
217
|
+
}
|
|
218
|
+
async prepareRequest(cache, requestInfo) {
|
|
219
|
+
const cachedResponse = await cache.match(requestInfo);
|
|
220
|
+
const etag = cachedResponse?.headers?.get(HTTP_ETAG_HEADER) ?? null;
|
|
221
|
+
const request = new Request(requestInfo);
|
|
222
|
+
if (etag) {
|
|
223
|
+
request.headers.set(HTTP_IF_NONE_MATCH_HEADER, etag);
|
|
224
|
+
}
|
|
225
|
+
return request;
|
|
226
|
+
}
|
|
227
|
+
async sendRequest(cache, request) {
|
|
228
|
+
const response = await fetch(request).catch(() => null);
|
|
229
|
+
const cacheControl = response?.headers?.get(HTTP_CACHE_CONTROL_HEADER);
|
|
230
|
+
if (cacheControl === 'no-cache') {
|
|
231
|
+
await cache.delete(request);
|
|
232
|
+
return response;
|
|
233
|
+
}
|
|
234
|
+
if (response?.ok) {
|
|
235
|
+
await cache.put(request, response).catch(() => null);
|
|
236
|
+
}
|
|
237
|
+
return cache.match(request).then((res) => res ?? null);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
188
241
|
function arrayAttribute(value) {
|
|
189
242
|
return coerceArray(value);
|
|
190
243
|
}
|
|
@@ -284,6 +337,11 @@ function getAxis(position) {
|
|
|
284
337
|
}
|
|
285
338
|
}
|
|
286
339
|
|
|
340
|
+
function getLanguageCode(language) {
|
|
341
|
+
const [languageCode] = language.split(/-|_/);
|
|
342
|
+
return languageCode?.toLowerCase();
|
|
343
|
+
}
|
|
344
|
+
|
|
287
345
|
function getOppositeSide(position) {
|
|
288
346
|
switch (getSide(position)) {
|
|
289
347
|
case Side.TOP:
|
|
@@ -306,6 +364,13 @@ function clearUniqueIdCache() {
|
|
|
306
364
|
uniqueIdCache = {};
|
|
307
365
|
}
|
|
308
366
|
|
|
367
|
+
function isUrlMatcher(value) {
|
|
368
|
+
return isString(value) || value instanceof RegExp;
|
|
369
|
+
}
|
|
370
|
+
function matchUrl(url, filter) {
|
|
371
|
+
return isString(filter) ? url.startsWith(filter) : !!url.match(filter);
|
|
372
|
+
}
|
|
373
|
+
|
|
309
374
|
function hasChanged(changes, keyOrKeys, ignoreFirstChange = true) {
|
|
310
375
|
if (Array.isArray(keyOrKeys)) {
|
|
311
376
|
for (const key of keyOrKeys) {
|
|
@@ -320,13 +385,27 @@ function hasChanged(changes, keyOrKeys, ignoreFirstChange = true) {
|
|
|
320
385
|
}
|
|
321
386
|
}
|
|
322
387
|
|
|
323
|
-
function provideConfig(token, config) {
|
|
388
|
+
function provideConfig(token, config, transform = () => ({})) {
|
|
389
|
+
const prepareConfig = (value) => deepmerge(value, transform(value));
|
|
324
390
|
if ('useFactory' in config) {
|
|
325
|
-
return {
|
|
391
|
+
return {
|
|
392
|
+
provide: token,
|
|
393
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
394
|
+
useFactory: (...args) => prepareConfig(config.useFactory(...args)),
|
|
395
|
+
deps: config.deps,
|
|
396
|
+
};
|
|
326
397
|
}
|
|
327
|
-
return {
|
|
398
|
+
return {
|
|
399
|
+
provide: token,
|
|
400
|
+
useFactory: () => prepareConfig(config),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
function mergeConfig(token, defaultValue) {
|
|
404
|
+
const config = inject(token);
|
|
405
|
+
const parentConfig = inject(token, { skipSelf: true, optional: true }) ?? {};
|
|
406
|
+
return deepmerge(defaultValue, parentConfig, config);
|
|
328
407
|
}
|
|
329
|
-
function createConfigTokens(name, prefix, defaultValue) {
|
|
408
|
+
function createConfigTokens(name, prefix, defaultValue, transform) {
|
|
330
409
|
const configName = `${name}Config`;
|
|
331
410
|
const defaultConfigName = `${name}DefaultConfig`;
|
|
332
411
|
const injectConfigName = `inject${name}Config`;
|
|
@@ -336,10 +415,8 @@ function createConfigTokens(name, prefix, defaultValue) {
|
|
|
336
415
|
return {
|
|
337
416
|
[configName]: token,
|
|
338
417
|
[defaultConfigName]: defaultValue,
|
|
339
|
-
[injectConfigName]: () =>
|
|
340
|
-
[provideConfigName]: (config) =>
|
|
341
|
-
return provideConfig(token, config);
|
|
342
|
-
},
|
|
418
|
+
[injectConfigName]: () => mergeConfig(token, defaultValue),
|
|
419
|
+
[provideConfigName]: ((config) => provideConfig(token, config, transform)),
|
|
343
420
|
};
|
|
344
421
|
}
|
|
345
422
|
|
|
@@ -394,5 +471,5 @@ class Queue {
|
|
|
394
471
|
* Generated bundle index. Do not edit.
|
|
395
472
|
*/
|
|
396
473
|
|
|
397
|
-
export { Axis, DRAEGER_WEBSITE_URL, EventManager, Position, Pure, Queue, Side, applyStyles, arrayAttribute, booleanToAttributeString, booleanToOptionalAttributeString, buildUrl, buildWebsiteUrl, clearUniqueIdCache, containsElement, createConfigTokens, createMutationObserver, createResizeObserver, cssTranslate, debounce, deferFn, disableCSSTransitions, forceLayoutReflow, getAxis, getOppositeSide, getSide, getUniqueId, hasChanged, injectElement, isBoolean, isComponent, isFunction, isNonEmptyString, isNumber, isPresent, isString, isTemplateRef, isViewContainer, pluckFromArray, provideConfig, px, reactiveAttributeBinding, reactiveClassBinding, setAttribute, trackById, trackByIndex, untilDestroyed };
|
|
474
|
+
export { Axis, CacheStorageClient, DRAEGER_WEBSITE_URL, EventManager, HTTP_CACHE_CONTROL_HEADER, HTTP_ETAG_HEADER, HTTP_IF_NONE_MATCH_HEADER, Position, Pure, Queue, Side, applyStyles, arrayAttribute, booleanToAttributeString, booleanToOptionalAttributeString, buildUrl, buildWebsiteUrl, clearUniqueIdCache, containsElement, createConfigTokens, createMutationObserver, createResizeObserver, cssTranslate, debounce, deferFn, disableCSSTransitions, forceLayoutReflow, getAxis, getLanguageCode, getOppositeSide, getSide, getUniqueId, hasChanged, injectElement, isBoolean, isComponent, isFunction, isNonEmptyString, isNumber, isPresent, isString, isTemplateRef, isUrlMatcher, isViewContainer, matchUrl, pluckFromArray, provideConfig, px, reactiveAttributeBinding, reactiveClassBinding, setAttribute, trackById, trackByIndex, untilDestroyed };
|
|
398
475
|
//# sourceMappingURL=odx-angular-utils.mjs.map
|