@igo2/sdg-core 1.0.0-next.64 → 1.0.0-next.65

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.
@@ -21,10 +21,10 @@ class BreakpointService {
21
21
  this._isHandset.set(result.matches);
22
22
  });
23
23
  }
24
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: BreakpointService, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Injectable });
25
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: BreakpointService, providedIn: 'root' });
24
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BreakpointService, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Injectable });
25
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BreakpointService, providedIn: 'root' });
26
26
  }
27
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: BreakpointService, decorators: [{
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BreakpointService, decorators: [{
28
28
  type: Injectable,
29
29
  args: [{
30
30
  providedIn: 'root'
@@ -41,9 +41,6 @@ function resolveTitle(config, titleResolver) {
41
41
  return config.title;
42
42
  }
43
43
  else {
44
- if (config.data?.[RouteTitleKey]) {
45
- return config.data[RouteTitleKey];
46
- }
47
44
  return (titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key
48
45
  );
49
46
  }
@@ -60,10 +57,10 @@ class TitleResolverPipe {
60
57
  transform(value) {
61
58
  return resolveTitle(value, this.titleResolver);
62
59
  }
63
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolverPipe, deps: [{ token: TitleResolver, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
64
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.7", ngImport: i0, type: TitleResolverPipe, isStandalone: true, name: "titleResolver" });
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TitleResolverPipe, deps: [{ token: TitleResolver, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
61
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: TitleResolverPipe, isStandalone: true, name: "titleResolver" });
65
62
  }
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolverPipe, decorators: [{
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TitleResolverPipe, decorators: [{
67
64
  type: Pipe,
68
65
  args: [{
69
66
  name: 'titleResolver',
@@ -81,31 +78,6 @@ function pathIsExternal(path) {
81
78
  class TranslationService {
82
79
  }
83
80
 
84
- function readQueryParamLanguage() {
85
- if (!window) {
86
- return undefined;
87
- }
88
- const queryParams = window.location.search.slice(1);
89
- const params = queryParams.split('&');
90
- const langParams = params.find((param) => param.includes('lang'));
91
- if (langParams) {
92
- return langParams.split('=').pop();
93
- }
94
- return undefined;
95
- }
96
- function parseUrlWithLanguage(routerUrl, lang) {
97
- const [url, params] = routerUrl.split('?');
98
- let urlSegements = `lang=${lang}`;
99
- if (params) {
100
- const segments = params.split('&');
101
- const segmentsFiltered = segments.filter((segement) => !segement.includes('lang='));
102
- if (segmentsFiltered.length) {
103
- urlSegements += segmentsFiltered.join('&');
104
- }
105
- }
106
- return [url, urlSegements];
107
- }
108
-
109
81
  var TranslationFeatureKind;
110
82
  (function (TranslationFeatureKind) {
111
83
  TranslationFeatureKind[TranslationFeatureKind["Translation"] = 0] = "Translation";
@@ -119,13 +91,12 @@ function provideTranslation(...features) {
119
91
  return makeEnvironmentProviders(providers);
120
92
  }
121
93
  /** Base on the @ngx-translate library with the IgoLanguageModule */
122
- function withIgo2Translation(options, service) {
123
- const paramLanguage = readQueryParamLanguage();
94
+ function withIgo2Translation(options, service, defaultLanguage) {
124
95
  return {
125
96
  kind: TranslationFeatureKind.Translation,
126
97
  providers: [
127
- provideTranslation$1(withStaticConfig(options, paramLanguage)),
128
- { provide: TranslationService, useClass: service }
98
+ { provide: TranslationService, useClass: service },
99
+ provideTranslation$1(withStaticConfig(options, defaultLanguage))
129
100
  ]
130
101
  };
131
102
  }
@@ -140,8 +111,7 @@ function withRouterTitleResolver(resolver) {
140
111
  providers: [
141
112
  {
142
113
  provide: (TitleResolver),
143
- useClass: resolver,
144
- deps: [TranslationService]
114
+ useClass: resolver
145
115
  }
146
116
  ]
147
117
  };
@@ -169,6 +139,23 @@ class TranslationServiceMock {
169
139
  }
170
140
  }
171
141
 
142
+ /**
143
+ *
144
+ * @param routerUrl
145
+ * @param lang
146
+ * @param strategy default to 'segment' set the first segment of the path (e.g., '/en/alerts' => 'en')
147
+ */
148
+ function parseUrlWithLanguage(routerUrl, lang) {
149
+ // eslint-disable-next-line prefer-const
150
+ let [url, params] = routerUrl.split('?');
151
+ const urlParts = url.split('/');
152
+ if (urlParts.length > 1) {
153
+ urlParts[1] = lang;
154
+ }
155
+ url = urlParts.join('/');
156
+ return [url, params];
157
+ }
158
+
172
159
  function labelAttribute(value, defaultValue = {}) {
173
160
  return value ? { ...defaultValue, ...value } : defaultValue;
174
161
  }
@@ -177,5 +164,5 @@ function labelAttribute(value, defaultValue = {}) {
177
164
  * Generated bundle index. Do not edit.
178
165
  */
179
166
 
180
- export { BreakpointService, RouteTitleKey, RouteTranslateKey, TitleResolver, TitleResolverPipe, TranslationFeatureKind, TranslationService, TranslationServiceMock, labelAttribute, parseUrlWithLanguage, pathIsExternal, provideTranslation, readQueryParamLanguage, resolveTitle, withIgo2Translation, withIgo2TranslationMock, withRouterTitleResolver };
167
+ export { BreakpointService, RouteTitleKey, RouteTranslateKey, TitleResolver, TitleResolverPipe, TranslationFeatureKind, TranslationService, TranslationServiceMock, labelAttribute, parseUrlWithLanguage, pathIsExternal, provideTranslation, resolveTitle, withIgo2Translation, withIgo2TranslationMock, withRouterTitleResolver };
181
168
  //# sourceMappingURL=igo2-sdg-core.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"igo2-sdg-core.mjs","sources":["../../../packages/core/src/layout/breakpoint/breakpoint.service.ts","../../../packages/core/src/router/router.ts","../../../packages/core/src/router/title-resolver/title-resolver.ts","../../../packages/core/src/router/title-resolver/title-resolver.pipe.ts","../../../packages/core/src/router/route.utils.ts","../../../packages/core/src/translation/translation.service.ts","../../../packages/core/src/translation/translation.utils.ts","../../../packages/core/src/translation/translation.provider.ts","../../../packages/core/src/translation/translation-mock.provider.ts","../../../packages/core/src/utils/coercion.ts","../../../packages/core/src/igo2-sdg-core.ts"],"sourcesContent":["import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Injectable, Signal, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreakpointService {\n private _isHandset = signal(false);\n\n get isHandset(): Signal<boolean> {\n return this._isHandset.asReadonly();\n }\n\n constructor(private breakpointObserver: BreakpointObserver) {\n this.handleBreakpoint();\n }\n\n private handleBreakpoint(): void {\n this.breakpointObserver\n .observe('(max-width: 575px)')\n .subscribe((result) => {\n this._isHandset.set(result.matches);\n });\n }\n}\n","import { Route } from '@angular/router';\n\nimport { TitleResolver } from './title-resolver/title-resolver';\n\nexport const RouteTitleKey = 'RouteTitle';\nexport const RouteTranslateKey = 'TranslateKey';\n\nfunction hasStaticTitle(config: Route): boolean {\n return typeof config.title === 'string' || config.title === null;\n}\n\nexport function resolveTitle(\n config: Route,\n titleResolver?: TitleResolver\n): string | undefined {\n if (hasStaticTitle(config)) {\n return config.title as string;\n } else {\n if (config.data?.[RouteTitleKey]) {\n return config.data[RouteTitleKey];\n }\n\n return (\n titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key\n );\n }\n}\n","import {\n ActivatedRouteSnapshot,\n MaybeAsync,\n Resolve,\n Route,\n RouterStateSnapshot\n} from '@angular/router';\n\nexport abstract class TitleResolver<T = string> implements Resolve<T> {\n abstract resolve(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): MaybeAsync<T>;\n abstract resolveStatic(route: Route): string | undefined;\n}\n","import { Optional, Pipe, PipeTransform } from '@angular/core';\n\nimport { SdgRoute } from '../route.interface';\nimport { resolveTitle } from '../router';\nimport { TitleResolver } from './title-resolver';\n\n@Pipe({\n name: 'titleResolver',\n standalone: true\n})\nexport class TitleResolverPipe implements PipeTransform {\n constructor(@Optional() private titleResolver: TitleResolver) {}\n\n transform(value: SdgRoute): string | undefined {\n return resolveTitle(value, this.titleResolver);\n }\n}\n","export function pathIsExternal(path: string): boolean {\n const regex = /^https?:\\/\\//;\n return regex.test(path);\n}\n","import { WritableSignal } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { Language } from './translation.interface';\n\nexport type Translation =\n | string\n | Translation[]\n | TranslationObject\n\n // required to prevent error \"Type instantiation is excessively deep and possibly infinite.\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | any;\n\n// using Record<> does not work because TS does not support recursive definitions\nexport interface TranslationObject {\n [key: string]: Translation;\n}\n\nexport abstract class TranslationService {\n abstract lang: WritableSignal<Language>;\n\n abstract get(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Translation | TranslationObject;\n\n abstract getAsync(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Observable<Translation | TranslationObject>;\n\n abstract setLanguage(lang: Language): void;\n}\n","export function readQueryParamLanguage(): string | undefined {\n if (!window) {\n return undefined;\n }\n const queryParams = window.location.search.slice(1);\n const params = queryParams.split('&');\n const langParams = params.find((param) => param.includes('lang'));\n if (langParams) {\n return langParams.split('=').pop();\n }\n\n return undefined;\n}\n\nexport function parseUrlWithLanguage(\n routerUrl: string,\n lang: string\n): [url: string, params: string | undefined] {\n const [url, params] = routerUrl.split('?');\n\n let urlSegements = `lang=${lang}`;\n if (params) {\n const segments = params.split('&');\n const segmentsFiltered = segments.filter(\n (segement) => !segement.includes('lang=')\n );\n if (segmentsFiltered.length) {\n urlSegements += segmentsFiltered.join('&');\n }\n }\n\n return [url, urlSegements];\n}\n","import {\n EnvironmentProviders,\n Provider,\n Type,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { LanguageOptions, withStaticConfig } from '@igo2/core/language';\nimport { provideTranslation as provideIgo2Translation } from '@igo2/core/language';\n\nimport { TitleResolver } from '../router';\nimport { TranslationService } from './translation.service';\nimport { readQueryParamLanguage } from './translation.utils';\n\nexport interface TranslationFeature<KindT extends TranslationFeatureKind> {\n kind: KindT;\n providers: (Provider | EnvironmentProviders)[];\n}\n\nexport enum TranslationFeatureKind {\n Translation = 0,\n RouterTitleResolver = 1\n}\n\nexport function provideTranslation(\n ...features: TranslationFeature<TranslationFeatureKind>[]\n) {\n const providers: (Provider | EnvironmentProviders)[] = [];\n\n for (const feature of features) {\n providers.push(...feature.providers);\n }\n\n return makeEnvironmentProviders(providers);\n}\n\n/** Base on the @ngx-translate library with the IgoLanguageModule */\nexport function withIgo2Translation(\n options: LanguageOptions,\n service: Type<TranslationService>\n): TranslationFeature<TranslationFeatureKind.Translation> {\n const paramLanguage = readQueryParamLanguage();\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n provideIgo2Translation(withStaticConfig(options, paramLanguage)),\n { provide: TranslationService, useClass: service }\n ]\n };\n}\n\n/**\n * Provide a translater for the Route title.\n * Some components is base on the title of the route and\n * this Resolver will allow to automatically resolve the translation\n **/\nexport function withRouterTitleResolver<T>(\n resolver: Type<TitleResolver<T>>\n): TranslationFeature<TranslationFeatureKind.RouterTitleResolver> {\n return {\n kind: TranslationFeatureKind.RouterTitleResolver,\n providers: [\n {\n provide: TitleResolver<T>,\n useClass: resolver,\n deps: [TranslationService]\n }\n ]\n };\n}\n","import { WritableSignal, signal } from '@angular/core';\n\nimport { provideMockTranslation } from '@igo2/core/language';\n\nimport { Observable, of } from 'rxjs';\n\nimport { Language } from './translation.interface';\nimport {\n TranslationFeature,\n TranslationFeatureKind\n} from './translation.provider';\nimport { TranslationService } from './translation.service';\n\nexport function withIgo2TranslationMock(): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n provideMockTranslation(),\n { provide: TranslationService, useClass: TranslationServiceMock }\n ]\n };\n}\n\nexport class TranslationServiceMock implements TranslationService {\n lang: WritableSignal<Language> = signal('fr');\n\n get(key: string | string[]): string {\n return Array.isArray(key) ? key[0] : key;\n }\n\n getAsync(key: string | string[]): Observable<string> {\n return of(Array.isArray(key) ? key[0] : key);\n }\n\n setLanguage() {\n window.location.reload();\n }\n}\n","import { Translation, TranslationObject } from '../translation';\n\nexport function labelAttribute(\n value: Translation | TranslationObject,\n defaultValue: Translation | TranslationObject = {}\n): Translation | TranslationObject {\n return value ? { ...defaultValue, ...value } : defaultValue;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TitleResolver","provideIgo2Translation"],"mappings":"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"}
1
+ {"version":3,"file":"igo2-sdg-core.mjs","sources":["../../../packages/core/src/layout/breakpoint/breakpoint.service.ts","../../../packages/core/src/router/router.ts","../../../packages/core/src/router/title-resolver/title-resolver.ts","../../../packages/core/src/router/title-resolver/title-resolver.pipe.ts","../../../packages/core/src/router/route.utils.ts","../../../packages/core/src/translation/translation.service.ts","../../../packages/core/src/translation/translation.provider.ts","../../../packages/core/src/translation/translation-mock.provider.ts","../../../packages/core/src/translation/translation.utils.ts","../../../packages/core/src/utils/coercion.ts","../../../packages/core/src/igo2-sdg-core.ts"],"sourcesContent":["import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Injectable, Signal, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreakpointService {\n private _isHandset = signal(false);\n\n get isHandset(): Signal<boolean> {\n return this._isHandset.asReadonly();\n }\n\n constructor(private breakpointObserver: BreakpointObserver) {\n this.handleBreakpoint();\n }\n\n private handleBreakpoint(): void {\n this.breakpointObserver\n .observe('(max-width: 575px)')\n .subscribe((result) => {\n this._isHandset.set(result.matches);\n });\n }\n}\n","import { Route } from '@angular/router';\n\nimport { TitleResolver } from './title-resolver/title-resolver';\n\nexport const RouteTitleKey = 'RouteTitle';\nexport const RouteTranslateKey = 'TranslateKey';\n\nfunction hasStaticTitle(config: Route): boolean {\n return typeof config.title === 'string' || config.title === null;\n}\n\nexport function resolveTitle(\n config: Route,\n titleResolver?: TitleResolver\n): string | undefined {\n if (hasStaticTitle(config)) {\n return config.title as string;\n } else {\n return (\n titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key\n );\n }\n}\n","import {\n ActivatedRouteSnapshot,\n MaybeAsync,\n Resolve,\n Route,\n RouterStateSnapshot\n} from '@angular/router';\n\nexport abstract class TitleResolver<T = string> implements Resolve<T> {\n abstract resolve(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): MaybeAsync<T>;\n abstract resolveStatic(route: Route): string | undefined;\n}\n","import { Optional, Pipe, PipeTransform } from '@angular/core';\n\nimport { SdgRoute } from '../route.interface';\nimport { resolveTitle } from '../router';\nimport { TitleResolver } from './title-resolver';\n\n@Pipe({\n name: 'titleResolver',\n standalone: true\n})\nexport class TitleResolverPipe implements PipeTransform {\n constructor(@Optional() private titleResolver: TitleResolver) {}\n\n transform(value: SdgRoute): string | undefined {\n return resolveTitle(value, this.titleResolver);\n }\n}\n","export function pathIsExternal(path: string): boolean {\n const regex = /^https?:\\/\\//;\n return regex.test(path);\n}\n","import { WritableSignal } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { Language } from './translation.interface';\n\nexport type Translation =\n | string\n | Translation[]\n | TranslationObject\n\n // required to prevent error \"Type instantiation is excessively deep and possibly infinite.\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | any;\n\n// using Record<> does not work because TS does not support recursive definitions\nexport interface TranslationObject {\n [key: string]: Translation;\n}\n\nexport abstract class TranslationService {\n abstract lang: WritableSignal<Language>;\n\n abstract get(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Translation | TranslationObject;\n\n abstract getAsync(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Observable<Translation | TranslationObject>;\n\n abstract setLanguage(lang: Language): void;\n}\n","import {\n EnvironmentProviders,\n Provider,\n Type,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { LanguageOptions, withStaticConfig } from '@igo2/core/language';\nimport { provideTranslation as provideIgo2Translation } from '@igo2/core/language';\n\nimport { TitleResolver } from '../router';\nimport { TranslationService } from './translation.service';\n\nexport interface TranslationFeature<KindT extends TranslationFeatureKind> {\n kind: KindT;\n providers: (Provider | EnvironmentProviders)[];\n}\n\nexport enum TranslationFeatureKind {\n Translation = 0,\n RouterTitleResolver = 1\n}\n\nexport function provideTranslation(\n ...features: TranslationFeature<TranslationFeatureKind>[]\n) {\n const providers: (Provider | EnvironmentProviders)[] = [];\n\n for (const feature of features) {\n providers.push(...feature.providers);\n }\n\n return makeEnvironmentProviders(providers);\n}\n\n/** Base on the @ngx-translate library with the IgoLanguageModule */\nexport function withIgo2Translation(\n options: LanguageOptions,\n service: Type<TranslationService>,\n defaultLanguage?: string\n): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n { provide: TranslationService, useClass: service },\n provideIgo2Translation(withStaticConfig(options, defaultLanguage))\n ]\n };\n}\n\n/**\n * Provide a translater for the Route title.\n * Some components is base on the title of the route and\n * this Resolver will allow to automatically resolve the translation\n **/\nexport function withRouterTitleResolver<T>(\n resolver: Type<TitleResolver<T>>\n): TranslationFeature<TranslationFeatureKind.RouterTitleResolver> {\n return {\n kind: TranslationFeatureKind.RouterTitleResolver,\n providers: [\n {\n provide: TitleResolver<T>,\n useClass: resolver\n }\n ]\n };\n}\n","import { WritableSignal, signal } from '@angular/core';\n\nimport { provideMockTranslation } from '@igo2/core/language';\n\nimport { Observable, of } from 'rxjs';\n\nimport { Language } from './translation.interface';\nimport {\n TranslationFeature,\n TranslationFeatureKind\n} from './translation.provider';\nimport { TranslationService } from './translation.service';\n\nexport function withIgo2TranslationMock(): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n provideMockTranslation(),\n { provide: TranslationService, useClass: TranslationServiceMock }\n ]\n };\n}\n\nexport class TranslationServiceMock implements TranslationService {\n lang: WritableSignal<Language> = signal('fr');\n\n get(key: string | string[]): string {\n return Array.isArray(key) ? key[0] : key;\n }\n\n getAsync(key: string | string[]): Observable<string> {\n return of(Array.isArray(key) ? key[0] : key);\n }\n\n setLanguage() {\n window.location.reload();\n }\n}\n","/**\n *\n * @param routerUrl\n * @param lang\n * @param strategy default to 'segment' set the first segment of the path (e.g., '/en/alerts' => 'en')\n */\nexport function parseUrlWithLanguage(\n routerUrl: string,\n lang: string\n): [url: string, params: string | undefined] {\n // eslint-disable-next-line prefer-const\n let [url, params] = routerUrl.split('?');\n\n const urlParts = url.split('/');\n if (urlParts.length > 1) {\n urlParts[1] = lang;\n }\n\n url = urlParts.join('/');\n\n return [url, params];\n}\n","import { Translation, TranslationObject } from '../translation';\n\nexport function labelAttribute(\n value: Translation | TranslationObject,\n defaultValue: Translation | TranslationObject = {}\n): Translation | TranslationObject {\n return value ? { ...defaultValue, ...value } : defaultValue;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TitleResolver","provideIgo2Translation"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igo2/sdg-core",
3
- "version": "1.0.0-next.64",
3
+ "version": "1.0.0-next.65",
4
4
  "license": "LiLiQ-R",
5
5
  "repository": {
6
6
  "type": "git",
@@ -3,6 +3,7 @@ export type SdgRoutes = SdgRoute[];
3
3
  export interface SdgRoute extends Route {
4
4
  isHome?: boolean;
5
5
  description?: string;
6
- /** Hidden in the primary tabs navigation */
6
+ children?: SdgRoutes;
7
+ /** Hidden in the primary tabs navigation and in the breadcrumbs */
7
8
  hidden?: boolean;
8
9
  }
@@ -12,7 +12,7 @@ export declare enum TranslationFeatureKind {
12
12
  }
13
13
  export declare function provideTranslation(...features: TranslationFeature<TranslationFeatureKind>[]): EnvironmentProviders;
14
14
  /** Base on the @ngx-translate library with the IgoLanguageModule */
15
- export declare function withIgo2Translation(options: LanguageOptions, service: Type<TranslationService>): TranslationFeature<TranslationFeatureKind.Translation>;
15
+ export declare function withIgo2Translation(options: LanguageOptions, service: Type<TranslationService>, defaultLanguage?: string): TranslationFeature<TranslationFeatureKind.Translation>;
16
16
  /**
17
17
  * Provide a translater for the Route title.
18
18
  * Some components is base on the title of the route and
@@ -1,2 +1,7 @@
1
- export declare function readQueryParamLanguage(): string | undefined;
1
+ /**
2
+ *
3
+ * @param routerUrl
4
+ * @param lang
5
+ * @param strategy default to 'segment' set the first segment of the path (e.g., '/en/alerts' => 'en')
6
+ */
2
7
  export declare function parseUrlWithLanguage(routerUrl: string, lang: string): [url: string, params: string | undefined];