@jsverse/transloco-persist-translations 7.0.0

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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019-2021 Netanel Basal, Shahar Kazaz, and Itay Oded.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Transloco Persist Translations
2
+
3
+ Please visit the [official Transloco docs](https://jsverse.github.io/transloco/docs/plugins/persist-translations).
@@ -0,0 +1,4 @@
1
+ export { TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG, TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, } from './lib/transloco-persist-translations.config';
2
+ export { TranslocoPersistTranslations } from './lib/transloco-persist-translations.service';
3
+ export { provideTranslocoPersistTranslations } from './lib/transloco-persist-translations.providers';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDZDQUE2QyxFQUM3QyxxQ0FBcUMsRUFDckMsc0NBQXNDLEdBR3ZDLE1BQU0sNkNBQTZDLENBQUM7QUFFckQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDNUYsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sZ0RBQWdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRV9DT05GSUcsXG4gIFRSQU5TTE9DT19QRVJTSVNUX1RSQU5TTEFUSU9OU19MT0FERVIsXG4gIFRSQU5TTE9DT19QRVJTSVNUX1RSQU5TTEFUSU9OU19TVE9SQUdFLFxuICBTdG9yYWdlQ29uZmlnLFxuICBUcmFuc2xvY29QZXJzaXN0VHJhbnNsYXRpb25zQ29uZmlnLFxufSBmcm9tICcuL2xpYi90cmFuc2xvY28tcGVyc2lzdC10cmFuc2xhdGlvbnMuY29uZmlnJztcbmV4cG9ydCB7IE1heWJlQXN5bmNTdG9yYWdlLCBNYXliZUFzeW5jIH0gZnJvbSAnLi9saWIvdHJhbnNsb2NvLnN0b3JhZ2UnO1xuZXhwb3J0IHsgVHJhbnNsb2NvUGVyc2lzdFRyYW5zbGF0aW9ucyB9IGZyb20gJy4vbGliL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy5zZXJ2aWNlJztcbmV4cG9ydCB7IHByb3ZpZGVUcmFuc2xvY29QZXJzaXN0VHJhbnNsYXRpb25zIH0gZnJvbSAnLi9saWIvdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLnByb3ZpZGVycyc7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianN2ZXJzZS10cmFuc2xvY28tcGVyc2lzdC10cmFuc2xhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy9zcmMvanN2ZXJzZS10cmFuc2xvY28tcGVyc2lzdC10cmFuc2xhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { isObservable, from, of } from 'rxjs';
2
+ import { isFunction } from '@jsverse/transloco';
3
+ export function isPromise(v) {
4
+ return v && isFunction(v.then);
5
+ }
6
+ export function observify(asyncOrValue) {
7
+ if (isPromise(asyncOrValue) || isObservable(asyncOrValue)) {
8
+ return from(asyncOrValue);
9
+ }
10
+ return of(asyncOrValue);
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zL3NyYy9saWIvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBTTtJQUM5QixPQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLFlBQWlCO0lBQ3pDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUN6RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUMzQjtJQUVELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc09ic2VydmFibGUsIGZyb20sIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZSh2OiBhbnkpOiB2IGlzIFByb21pc2U8YW55PiB7XG4gIHJldHVybiB2ICYmIGlzRnVuY3Rpb24odi50aGVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmlmeShhc3luY09yVmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIGlmIChpc1Byb21pc2UoYXN5bmNPclZhbHVlKSB8fCBpc09ic2VydmFibGUoYXN5bmNPclZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tKGFzeW5jT3JWYWx1ZSk7XG4gIH1cblxuICByZXR1cm4gb2YoYXN5bmNPclZhbHVlKTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { InjectionToken, } from '@angular/core';
2
+ const dayInMilliseconds = 86400;
3
+ export const defaultConfig = {
4
+ ttl: dayInMilliseconds,
5
+ storageKey: '@transloco/translations',
6
+ };
7
+ export const TRANSLOCO_PERSIST_TRANSLATIONS_LOADER = new InjectionToken('TRANSLOCO_PERSIST_TRANSLATIONS_LOADER');
8
+ export const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE = new InjectionToken('The storage to use for the persistance behavior');
9
+ export const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG = new InjectionToken('Configuration for the storage behavior');
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zL3NyYy9saWIvdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsY0FBYyxHQUdmLE1BQU0sZUFBZSxDQUFDO0FBcUJ2QixNQUFNLGlCQUFpQixHQUFHLEtBQU0sQ0FBQztBQUNqQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWtCO0lBQzFDLEdBQUcsRUFBRSxpQkFBaUI7SUFDdEIsVUFBVSxFQUFFLHlCQUF5QjtDQUN0QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQ2hELElBQUksY0FBYyxDQUFrQix1Q0FBdUMsQ0FBQyxDQUFDO0FBRS9FLE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUNqRCxJQUFJLGNBQWMsQ0FDaEIsaURBQWlELENBQ2xELENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSw2Q0FBNkMsR0FDeEQsSUFBSSxjQUFjLENBQWdCLHdDQUF3QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbGFzc1Byb3ZpZGVyLFxuICBFeGlzdGluZ1Byb3ZpZGVyLFxuICBGYWN0b3J5UHJvdmlkZXIsXG4gIEluamVjdGlvblRva2VuLFxuICBUeXBlLFxuICBWYWx1ZVByb3ZpZGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbG9jb0xvYWRlciB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5cbmltcG9ydCB7IE1heWJlQXN5bmNTdG9yYWdlIH0gZnJvbSAnLi90cmFuc2xvY28uc3RvcmFnZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUNvbmZpZyB7XG4gIHR0bDogbnVtYmVyO1xuICBzdG9yYWdlS2V5OiBzdHJpbmc7XG59XG5cbnR5cGUgcHJvdmlkZXJWYWx1ZSA9XG4gIHwgUGljazxWYWx1ZVByb3ZpZGVyLCAndXNlVmFsdWUnPlxuICB8IFBpY2s8Q2xhc3NQcm92aWRlciwgJ3VzZUNsYXNzJz5cbiAgfCBQaWNrPEV4aXN0aW5nUHJvdmlkZXIsICd1c2VFeGlzdGluZyc+XG4gIHwgUGljazxGYWN0b3J5UHJvdmlkZXIsICd1c2VGYWN0b3J5JyB8ICdkZXBzJz47XG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1BlcnNpc3RUcmFuc2xhdGlvbnNDb25maWdcbiAgZXh0ZW5kcyBQYXJ0aWFsPFN0b3JhZ2VDb25maWc+IHtcbiAgbG9hZGVyOiBUeXBlPFRyYW5zbG9jb0xvYWRlcj47XG4gIHN0b3JhZ2U6IHByb3ZpZGVyVmFsdWU7XG59XG5cbmNvbnN0IGRheUluTWlsbGlzZWNvbmRzID0gODZfNDAwO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWc6IFN0b3JhZ2VDb25maWcgPSB7XG4gIHR0bDogZGF5SW5NaWxsaXNlY29uZHMsXG4gIHN0b3JhZ2VLZXk6ICdAdHJhbnNsb2NvL3RyYW5zbGF0aW9ucycsXG59O1xuXG5leHBvcnQgY29uc3QgVFJBTlNMT0NPX1BFUlNJU1RfVFJBTlNMQVRJT05TX0xPQURFUiA9XG4gIG5ldyBJbmplY3Rpb25Ub2tlbjxUcmFuc2xvY29Mb2FkZXI+KCdUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfTE9BREVSJyk7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRSA9XG4gIG5ldyBJbmplY3Rpb25Ub2tlbjxNYXliZUFzeW5jU3RvcmFnZT4oXG4gICAgJ1RoZSBzdG9yYWdlIHRvIHVzZSBmb3IgdGhlIHBlcnNpc3RhbmNlIGJlaGF2aW9yJ1xuICApO1xuXG5leHBvcnQgY29uc3QgVFJBTlNMT0NPX1BFUlNJU1RfVFJBTlNMQVRJT05TX1NUT1JBR0VfQ09ORklHID1cbiAgbmV3IEluamVjdGlvblRva2VuPFN0b3JhZ2VDb25maWc+KCdDb25maWd1cmF0aW9uIGZvciB0aGUgc3RvcmFnZSBiZWhhdmlvcicpO1xuIl19
@@ -0,0 +1,22 @@
1
+ import { makeEnvironmentProviders } from '@angular/core';
2
+ import { TRANSLOCO_LOADER } from '@jsverse/transloco';
3
+ import { TranslocoPersistTranslations } from './transloco-persist-translations.service';
4
+ import { defaultConfig, TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG, } from './transloco-persist-translations.config';
5
+ export function provideTranslocoPersistTranslations({ storage, loader, ...storageConfig }) {
6
+ return makeEnvironmentProviders([
7
+ { provide: TRANSLOCO_LOADER, useClass: TranslocoPersistTranslations },
8
+ provideTranslocoPersistTranslationsConfig(storageConfig),
9
+ { provide: TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, useClass: loader },
10
+ { provide: TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, ...storage },
11
+ ]);
12
+ }
13
+ export function provideTranslocoPersistTranslationsConfig(config) {
14
+ return {
15
+ provide: TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG,
16
+ useValue: {
17
+ ...defaultConfig,
18
+ ...config,
19
+ },
20
+ };
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLnByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zL3NyYy9saWIvdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLnByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEYsT0FBTyxFQUNMLGFBQWEsRUFFYixxQ0FBcUMsRUFDckMsc0NBQXNDLEVBQ3RDLDZDQUE2QyxHQUU5QyxNQUFNLHlDQUF5QyxDQUFDO0FBRWpELE1BQU0sVUFBVSxtQ0FBbUMsQ0FBQyxFQUNsRCxPQUFPLEVBQ1AsTUFBTSxFQUNOLEdBQUcsYUFBYSxFQUNtQjtJQUNuQyxPQUFPLHdCQUF3QixDQUFDO1FBQzlCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSw0QkFBNEIsRUFBRTtRQUNyRSx5Q0FBeUMsQ0FBQyxhQUFhLENBQUM7UUFDeEQsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtRQUNwRSxFQUFFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxHQUFHLE9BQU8sRUFBRTtLQUNoRSxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLHlDQUF5QyxDQUN2RCxNQUErQjtJQUUvQixPQUFPO1FBQ0wsT0FBTyxFQUFFLDZDQUE2QztRQUN0RCxRQUFRLEVBQUU7WUFDUixHQUFHLGFBQWE7WUFDaEIsR0FBRyxNQUFNO1NBQ1Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVFJBTlNMT0NPX0xPQURFUiB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5cbmltcG9ydCB7IFRyYW5zbG9jb1BlcnNpc3RUcmFuc2xhdGlvbnMgfSBmcm9tICcuL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGRlZmF1bHRDb25maWcsXG4gIFN0b3JhZ2VDb25maWcsXG4gIFRSQU5TTE9DT19QRVJTSVNUX1RSQU5TTEFUSU9OU19MT0FERVIsXG4gIFRSQU5TTE9DT19QRVJTSVNUX1RSQU5TTEFUSU9OU19TVE9SQUdFLFxuICBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRV9DT05GSUcsXG4gIFRyYW5zbG9jb1BlcnNpc3RUcmFuc2xhdGlvbnNDb25maWcsXG59IGZyb20gJy4vdHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLmNvbmZpZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVHJhbnNsb2NvUGVyc2lzdFRyYW5zbGF0aW9ucyh7XG4gIHN0b3JhZ2UsXG4gIGxvYWRlcixcbiAgLi4uc3RvcmFnZUNvbmZpZ1xufTogVHJhbnNsb2NvUGVyc2lzdFRyYW5zbGF0aW9uc0NvbmZpZykge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7IHByb3ZpZGU6IFRSQU5TTE9DT19MT0FERVIsIHVzZUNsYXNzOiBUcmFuc2xvY29QZXJzaXN0VHJhbnNsYXRpb25zIH0sXG4gICAgcHJvdmlkZVRyYW5zbG9jb1BlcnNpc3RUcmFuc2xhdGlvbnNDb25maWcoc3RvcmFnZUNvbmZpZyksXG4gICAgeyBwcm92aWRlOiBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfTE9BREVSLCB1c2VDbGFzczogbG9hZGVyIH0sXG4gICAgeyBwcm92aWRlOiBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRSwgLi4uc3RvcmFnZSB9LFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVUcmFuc2xvY29QZXJzaXN0VHJhbnNsYXRpb25zQ29uZmlnKFxuICBjb25maWc/OiBQYXJ0aWFsPFN0b3JhZ2VDb25maWc+XG4pIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlOiBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRV9DT05GSUcsXG4gICAgdXNlVmFsdWU6IHtcbiAgICAgIC4uLmRlZmF1bHRDb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,98 @@
1
+ import { isObject, isString, } from '@jsverse/transloco';
2
+ import { from, of } from 'rxjs';
3
+ import { filter, map, switchMap, take, tap } from 'rxjs/operators';
4
+ import { inject, Injectable } from '@angular/core';
5
+ import { observify } from './helpers';
6
+ import { TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG, } from './transloco-persist-translations.config';
7
+ import * as i0 from "@angular/core";
8
+ export function getTimestampKey(key) {
9
+ return `${key}/timestamp`;
10
+ }
11
+ export class TranslocoPersistTranslations {
12
+ loader = inject(TRANSLOCO_PERSIST_TRANSLATIONS_LOADER);
13
+ storage = inject(TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE);
14
+ config = inject(TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG);
15
+ subscription = this.clearCurrentStorage().subscribe();
16
+ cache = null;
17
+ getTranslation(lang) {
18
+ const storageKey = this.config.storageKey;
19
+ return this.getCached(storageKey).pipe(switchMap((translations) => {
20
+ if (translations?.[lang]) {
21
+ return of(translations[lang]);
22
+ }
23
+ return from(this.loader.getTranslation(lang)).pipe(tap((translation) => this.setCache(storageKey, lang, translation)));
24
+ }));
25
+ }
26
+ clearCache() {
27
+ this.clearTimestamp(this.config.storageKey);
28
+ this.clearTranslations();
29
+ this.cache = null;
30
+ }
31
+ getCached(key) {
32
+ return this.cache
33
+ ? of(this.cache)
34
+ : observify(this.storage.getItem(key)).pipe(map((item) => {
35
+ return item ? this.decode(key, item) : null;
36
+ }), tap((item) => {
37
+ this.cache = item;
38
+ }), take(1));
39
+ }
40
+ setCache(key, lang, translation) {
41
+ const translations = this.cache || {};
42
+ translations[lang] = translation;
43
+ this.setTimestamp(key);
44
+ this.storage.setItem(key, this.encode(translations));
45
+ this.cache = translations;
46
+ }
47
+ encode(value) {
48
+ return JSON.stringify(value);
49
+ }
50
+ decode(key, item) {
51
+ if (isObject(item)) {
52
+ return item;
53
+ }
54
+ else if (isString(item)) {
55
+ try {
56
+ return JSON.parse(item);
57
+ }
58
+ catch (e) {
59
+ console.error(`storage key: ${key} is not serializable`);
60
+ return null;
61
+ }
62
+ }
63
+ return null;
64
+ }
65
+ setTimestamp(key) {
66
+ this.storage.setItem(getTimestampKey(key), Date.now());
67
+ }
68
+ getTimestamp(key) {
69
+ return observify(this.storage.getItem(getTimestampKey(key))).pipe(map(parseInt));
70
+ }
71
+ clearTimestamp(key) {
72
+ this.storage.removeItem(getTimestampKey(key));
73
+ }
74
+ clearTranslations() {
75
+ this.storage.removeItem(this.config.storageKey);
76
+ }
77
+ clearCurrentStorage() {
78
+ const storageKey = this.config.storageKey;
79
+ return this.getTimestamp(storageKey).pipe(filter(Boolean), tap((time) => {
80
+ const isExpired = Date.now() - time >= this.config.ttl;
81
+ if (isExpired) {
82
+ this.storage.removeItem(storageKey);
83
+ }
84
+ }));
85
+ }
86
+ ngOnDestroy() {
87
+ this.subscription?.unsubscribe();
88
+ // Caretaker note: it's important to clean up references to subscriptions since they save the `next`
89
+ // callback within its `destination` property, preventing classes from being GC'd.
90
+ this.subscription = null;
91
+ }
92
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: TranslocoPersistTranslations, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
93
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: TranslocoPersistTranslations });
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: TranslocoPersistTranslations, decorators: [{
96
+ type: Injectable
97
+ }] });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLXBlcnNpc3QtdHJhbnNsYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy9zcmMvbGliL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsUUFBUSxHQUdULE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQ0wscUNBQXFDLEVBQ3JDLHNDQUFzQyxFQUN0Qyw2Q0FBNkMsR0FDOUMsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFFakQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFXO0lBQ3pDLE9BQU8sR0FBRyxHQUFHLFlBQVksQ0FBQztBQUM1QixDQUFDO0FBR0QsTUFBTSxPQUFPLDRCQUE0QjtJQUcvQixNQUFNLEdBQUcsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxHQUFHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sR0FBRyxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUUvRCxZQUFZLEdBQ2xCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBRXpDLGNBQWMsQ0FBQyxJQUFZ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QUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO3VHQTlHVSw0QkFBNEI7MkdBQTVCLDRCQUE0Qjs7MkZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgVHJhbnNsYXRpb24sXG4gIFRyYW5zbG9jb0xvYWRlcixcbn0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IG9ic2VydmlmeSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge1xuICBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfTE9BREVSLFxuICBUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRSxcbiAgVFJBTlNMT0NPX1BFUlNJU1RfVFJBTlNMQVRJT05TX1NUT1JBR0VfQ09ORklHLFxufSBmcm9tICcuL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy5jb25maWcnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXN0YW1wS2V5KGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtrZXl9L3RpbWVzdGFtcGA7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmFuc2xvY29QZXJzaXN0VHJhbnNsYXRpb25zXG4gIGltcGxlbWVudHMgVHJhbnNsb2NvTG9hZGVyLCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBsb2FkZXIgPSBpbmplY3QoVFJBTlNMT0NPX1BFUlNJU1RfVFJBTlNMQVRJT05TX0xPQURFUik7XG4gIHByaXZhdGUgc3RvcmFnZSA9IGluamVjdChUUkFOU0xPQ09fUEVSU0lTVF9UUkFOU0xBVElPTlNfU1RPUkFHRSk7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KFRSQU5TTE9DT19QRVJTSVNUX1RSQU5TTEFUSU9OU19TVE9SQUdFX0NPTkZJRyk7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPVxuICAgIHRoaXMuY2xlYXJDdXJyZW50U3RvcmFnZSgpLnN1YnNjcmliZSgpO1xuICBwcml2YXRlIGNhY2hlOiBUcmFuc2xhdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGdldFRyYW5zbGF0aW9uKGxhbmc6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24+IHtcbiAgICBjb25zdCBzdG9yYWdlS2V5ID0gdGhpcy5jb25maWcuc3RvcmFnZUtleTtcblxuICAgIHJldHVybiB0aGlzLmdldENhY2hlZChzdG9yYWdlS2V5KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCh0cmFuc2xhdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKHRyYW5zbGF0aW9ucz8uW2xhbmddKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHRyYW5zbGF0aW9uc1tsYW5nXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmxvYWRlci5nZXRUcmFuc2xhdGlvbihsYW5nKSkucGlwZShcbiAgICAgICAgICB0YXAoKHRyYW5zbGF0aW9uKSA9PiB0aGlzLnNldENhY2hlKHN0b3JhZ2VLZXksIGxhbmcsIHRyYW5zbGF0aW9uKSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5jbGVhclRpbWVzdGFtcCh0aGlzLmNvbmZpZy5zdG9yYWdlS2V5KTtcbiAgICB0aGlzLmNsZWFyVHJhbnNsYXRpb25zKCk7XG4gICAgdGhpcy5jYWNoZSA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVcbiAgICAgID8gb2YodGhpcy5jYWNoZSlcbiAgICAgIDogb2JzZXJ2aWZ5KHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSkpLnBpcGUoXG4gICAgICAgICAgbWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbSA/IHRoaXMuZGVjb2RlPFRyYW5zbGF0aW9uPihrZXksIGl0ZW0pIDogbnVsbDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2FjaGUoa2V5OiBzdHJpbmcsIGxhbmc6IHN0cmluZywgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uKSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy5jYWNoZSB8fCB7fTtcbiAgICB0cmFuc2xhdGlvbnNbbGFuZ10gPSB0cmFuc2xhdGlvbjtcbiAgICB0aGlzLnNldFRpbWVzdGFtcChrZXkpO1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGtleSwgdGhpcy5lbmNvZGUodHJhbnNsYXRpb25zKSk7XG4gICAgdGhpcy5jYWNoZSA9IHRyYW5zbGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZW5jb2RlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGU8VD4oa2V5OiBzdHJpbmcsIGl0ZW06IGFueSk6IFQgfCBudWxsIHtcbiAgICBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBzdG9yYWdlIGtleTogJHtrZXl9IGlzIG5vdCBzZXJpYWxpemFibGVgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUaW1lc3RhbXAoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShnZXRUaW1lc3RhbXBLZXkoa2V5KSwgRGF0ZS5ub3coKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpbWVzdGFtcChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG9ic2VydmlmeSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShnZXRUaW1lc3RhbXBLZXkoa2V5KSkpLnBpcGUoXG4gICAgICBtYXAocGFyc2VJbnQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJUaW1lc3RhbXAoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShnZXRUaW1lc3RhbXBLZXkoa2V5KSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyVHJhbnNsYXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuY29uZmlnLnN0b3JhZ2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckN1cnJlbnRTdG9yYWdlKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuY29uZmlnLnN0b3JhZ2VLZXk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUaW1lc3RhbXAoc3RvcmFnZUtleSkucGlwZShcbiAgICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICAgIHRhcCgodGltZSkgPT4ge1xuICAgICAgICBjb25zdCBpc0V4cGlyZWQgPSBEYXRlLm5vdygpIC0gdGltZSA+PSB0aGlzLmNvbmZpZy50dGw7XG4gICAgICAgIGlmIChpc0V4cGlyZWQpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgLy8gQ2FyZXRha2VyIG5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIGNsZWFuIHVwIHJlZmVyZW5jZXMgdG8gc3Vic2NyaXB0aW9ucyBzaW5jZSB0aGV5IHNhdmUgdGhlIGBuZXh0YFxuICAgIC8vIGNhbGxiYWNrIHdpdGhpbiBpdHMgYGRlc3RpbmF0aW9uYCBwcm9wZXJ0eSwgcHJldmVudGluZyBjbGFzc2VzIGZyb20gYmVpbmcgR0MnZC5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby1wZXJzaXN0LXRyYW5zbGF0aW9ucy9zcmMvbGliL3RyYW5zbG9jby5zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIE1heWJlQXN5bmM8VCA9IGFueT4gPSBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPiB8IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF5YmVBc3luY1N0b3JhZ2Uge1xuICBnZXRJdGVtKGtleTogc3RyaW5nKTogTWF5YmVBc3luYztcblxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZDtcblxuICByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogdm9pZDtcbn1cbiJdfQ==
@@ -0,0 +1,140 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, Injectable, makeEnvironmentProviders } from '@angular/core';
3
+ import { isFunction, isObject, isString, TRANSLOCO_LOADER } from '@jsverse/transloco';
4
+ import { isObservable, from, of } from 'rxjs';
5
+ import { switchMap, tap, map, take, filter } from 'rxjs/operators';
6
+
7
+ const dayInMilliseconds = 86400;
8
+ const defaultConfig = {
9
+ ttl: dayInMilliseconds,
10
+ storageKey: '@transloco/translations',
11
+ };
12
+ const TRANSLOCO_PERSIST_TRANSLATIONS_LOADER = new InjectionToken('TRANSLOCO_PERSIST_TRANSLATIONS_LOADER');
13
+ const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE = new InjectionToken('The storage to use for the persistance behavior');
14
+ const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG = new InjectionToken('Configuration for the storage behavior');
15
+
16
+ function isPromise(v) {
17
+ return v && isFunction(v.then);
18
+ }
19
+ function observify(asyncOrValue) {
20
+ if (isPromise(asyncOrValue) || isObservable(asyncOrValue)) {
21
+ return from(asyncOrValue);
22
+ }
23
+ return of(asyncOrValue);
24
+ }
25
+
26
+ function getTimestampKey(key) {
27
+ return `${key}/timestamp`;
28
+ }
29
+ class TranslocoPersistTranslations {
30
+ loader = inject(TRANSLOCO_PERSIST_TRANSLATIONS_LOADER);
31
+ storage = inject(TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE);
32
+ config = inject(TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG);
33
+ subscription = this.clearCurrentStorage().subscribe();
34
+ cache = null;
35
+ getTranslation(lang) {
36
+ const storageKey = this.config.storageKey;
37
+ return this.getCached(storageKey).pipe(switchMap((translations) => {
38
+ if (translations?.[lang]) {
39
+ return of(translations[lang]);
40
+ }
41
+ return from(this.loader.getTranslation(lang)).pipe(tap((translation) => this.setCache(storageKey, lang, translation)));
42
+ }));
43
+ }
44
+ clearCache() {
45
+ this.clearTimestamp(this.config.storageKey);
46
+ this.clearTranslations();
47
+ this.cache = null;
48
+ }
49
+ getCached(key) {
50
+ return this.cache
51
+ ? of(this.cache)
52
+ : observify(this.storage.getItem(key)).pipe(map((item) => {
53
+ return item ? this.decode(key, item) : null;
54
+ }), tap((item) => {
55
+ this.cache = item;
56
+ }), take(1));
57
+ }
58
+ setCache(key, lang, translation) {
59
+ const translations = this.cache || {};
60
+ translations[lang] = translation;
61
+ this.setTimestamp(key);
62
+ this.storage.setItem(key, this.encode(translations));
63
+ this.cache = translations;
64
+ }
65
+ encode(value) {
66
+ return JSON.stringify(value);
67
+ }
68
+ decode(key, item) {
69
+ if (isObject(item)) {
70
+ return item;
71
+ }
72
+ else if (isString(item)) {
73
+ try {
74
+ return JSON.parse(item);
75
+ }
76
+ catch (e) {
77
+ console.error(`storage key: ${key} is not serializable`);
78
+ return null;
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ setTimestamp(key) {
84
+ this.storage.setItem(getTimestampKey(key), Date.now());
85
+ }
86
+ getTimestamp(key) {
87
+ return observify(this.storage.getItem(getTimestampKey(key))).pipe(map(parseInt));
88
+ }
89
+ clearTimestamp(key) {
90
+ this.storage.removeItem(getTimestampKey(key));
91
+ }
92
+ clearTranslations() {
93
+ this.storage.removeItem(this.config.storageKey);
94
+ }
95
+ clearCurrentStorage() {
96
+ const storageKey = this.config.storageKey;
97
+ return this.getTimestamp(storageKey).pipe(filter(Boolean), tap((time) => {
98
+ const isExpired = Date.now() - time >= this.config.ttl;
99
+ if (isExpired) {
100
+ this.storage.removeItem(storageKey);
101
+ }
102
+ }));
103
+ }
104
+ ngOnDestroy() {
105
+ this.subscription?.unsubscribe();
106
+ // Caretaker note: it's important to clean up references to subscriptions since they save the `next`
107
+ // callback within its `destination` property, preventing classes from being GC'd.
108
+ this.subscription = null;
109
+ }
110
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: TranslocoPersistTranslations, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
111
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: TranslocoPersistTranslations });
112
+ }
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: TranslocoPersistTranslations, decorators: [{
114
+ type: Injectable
115
+ }] });
116
+
117
+ function provideTranslocoPersistTranslations({ storage, loader, ...storageConfig }) {
118
+ return makeEnvironmentProviders([
119
+ { provide: TRANSLOCO_LOADER, useClass: TranslocoPersistTranslations },
120
+ provideTranslocoPersistTranslationsConfig(storageConfig),
121
+ { provide: TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, useClass: loader },
122
+ { provide: TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, ...storage },
123
+ ]);
124
+ }
125
+ function provideTranslocoPersistTranslationsConfig(config) {
126
+ return {
127
+ provide: TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG,
128
+ useValue: {
129
+ ...defaultConfig,
130
+ ...config,
131
+ },
132
+ };
133
+ }
134
+
135
+ /**
136
+ * Generated bundle index. Do not edit.
137
+ */
138
+
139
+ export { TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG, TranslocoPersistTranslations, provideTranslocoPersistTranslations };
140
+ //# sourceMappingURL=jsverse-transloco-persist-translations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsverse-transloco-persist-translations.mjs","sources":["../../../../libs/transloco-persist-translations/src/lib/transloco-persist-translations.config.ts","../../../../libs/transloco-persist-translations/src/lib/helpers.ts","../../../../libs/transloco-persist-translations/src/lib/transloco-persist-translations.service.ts","../../../../libs/transloco-persist-translations/src/lib/transloco-persist-translations.providers.ts","../../../../libs/transloco-persist-translations/src/jsverse-transloco-persist-translations.ts"],"sourcesContent":["import {\n ClassProvider,\n ExistingProvider,\n FactoryProvider,\n InjectionToken,\n Type,\n ValueProvider,\n} from '@angular/core';\nimport { TranslocoLoader } from '@jsverse/transloco';\n\nimport { MaybeAsyncStorage } from './transloco.storage';\n\nexport interface StorageConfig {\n ttl: number;\n storageKey: string;\n}\n\ntype providerValue =\n | Pick<ValueProvider, 'useValue'>\n | Pick<ClassProvider, 'useClass'>\n | Pick<ExistingProvider, 'useExisting'>\n | Pick<FactoryProvider, 'useFactory' | 'deps'>;\nexport interface TranslocoPersistTranslationsConfig\n extends Partial<StorageConfig> {\n loader: Type<TranslocoLoader>;\n storage: providerValue;\n}\n\nconst dayInMilliseconds = 86_400;\nexport const defaultConfig: StorageConfig = {\n ttl: dayInMilliseconds,\n storageKey: '@transloco/translations',\n};\n\nexport const TRANSLOCO_PERSIST_TRANSLATIONS_LOADER =\n new InjectionToken<TranslocoLoader>('TRANSLOCO_PERSIST_TRANSLATIONS_LOADER');\n\nexport const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE =\n new InjectionToken<MaybeAsyncStorage>(\n 'The storage to use for the persistance behavior'\n );\n\nexport const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG =\n new InjectionToken<StorageConfig>('Configuration for the storage behavior');\n","import { isObservable, from, of, Observable } from 'rxjs';\nimport { isFunction } from '@jsverse/transloco';\n\nexport function isPromise(v: any): v is Promise<any> {\n return v && isFunction(v.then);\n}\n\nexport function observify(asyncOrValue: any): Observable<any> {\n if (isPromise(asyncOrValue) || isObservable(asyncOrValue)) {\n return from(asyncOrValue);\n }\n\n return of(asyncOrValue);\n}\n","import {\n isObject,\n isString,\n Translation,\n TranslocoLoader,\n} from '@jsverse/transloco';\nimport { from, Observable, of, Subscription } from 'rxjs';\nimport { filter, map, switchMap, take, tap } from 'rxjs/operators';\nimport { inject, Injectable, OnDestroy } from '@angular/core';\n\nimport { observify } from './helpers';\nimport {\n TRANSLOCO_PERSIST_TRANSLATIONS_LOADER,\n TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE,\n TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG,\n} from './transloco-persist-translations.config';\n\nexport function getTimestampKey(key: string) {\n return `${key}/timestamp`;\n}\n\n@Injectable()\nexport class TranslocoPersistTranslations\n implements TranslocoLoader, OnDestroy\n{\n private loader = inject(TRANSLOCO_PERSIST_TRANSLATIONS_LOADER);\n private storage = inject(TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE);\n private config = inject(TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG);\n\n private subscription: Subscription | null =\n this.clearCurrentStorage().subscribe();\n private cache: Translation | null = null;\n\n getTranslation(lang: string): Observable<Translation> {\n const storageKey = this.config.storageKey;\n\n return this.getCached(storageKey).pipe(\n switchMap((translations) => {\n if (translations?.[lang]) {\n return of(translations[lang]);\n }\n\n return from(this.loader.getTranslation(lang)).pipe(\n tap((translation) => this.setCache(storageKey, lang, translation))\n );\n })\n );\n }\n\n clearCache() {\n this.clearTimestamp(this.config.storageKey);\n this.clearTranslations();\n this.cache = null;\n }\n\n private getCached(key: string): Observable<Translation | null> {\n return this.cache\n ? of(this.cache)\n : observify(this.storage.getItem(key)).pipe(\n map((item) => {\n return item ? this.decode<Translation>(key, item) : null;\n }),\n tap((item) => {\n this.cache = item;\n }),\n take(1)\n );\n }\n\n private setCache(key: string, lang: string, translation: Translation) {\n const translations = this.cache || {};\n translations[lang] = translation;\n this.setTimestamp(key);\n this.storage.setItem(key, this.encode(translations));\n this.cache = translations;\n }\n\n private encode(value: unknown): string {\n return JSON.stringify(value);\n }\n\n private decode<T>(key: string, item: any): T | null {\n if (isObject(item)) {\n return item;\n } else if (isString(item)) {\n try {\n return JSON.parse(item);\n } catch (e) {\n console.error(`storage key: ${key} is not serializable`);\n return null;\n }\n }\n return null;\n }\n\n private setTimestamp(key: string): void {\n this.storage.setItem(getTimestampKey(key), Date.now());\n }\n\n private getTimestamp(key: string): Observable<number> {\n return observify(this.storage.getItem(getTimestampKey(key))).pipe(\n map(parseInt)\n );\n }\n\n private clearTimestamp(key: string): void {\n this.storage.removeItem(getTimestampKey(key));\n }\n\n private clearTranslations(): void {\n this.storage.removeItem(this.config.storageKey);\n }\n\n private clearCurrentStorage(): Observable<number> {\n const storageKey = this.config.storageKey;\n\n return this.getTimestamp(storageKey).pipe(\n filter(Boolean),\n tap((time) => {\n const isExpired = Date.now() - time >= this.config.ttl;\n if (isExpired) {\n this.storage.removeItem(storageKey);\n }\n })\n );\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n // Caretaker note: it's important to clean up references to subscriptions since they save the `next`\n // callback within its `destination` property, preventing classes from being GC'd.\n this.subscription = null;\n }\n}\n","import { makeEnvironmentProviders } from '@angular/core';\nimport { TRANSLOCO_LOADER } from '@jsverse/transloco';\n\nimport { TranslocoPersistTranslations } from './transloco-persist-translations.service';\nimport {\n defaultConfig,\n StorageConfig,\n TRANSLOCO_PERSIST_TRANSLATIONS_LOADER,\n TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE,\n TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG,\n TranslocoPersistTranslationsConfig,\n} from './transloco-persist-translations.config';\n\nexport function provideTranslocoPersistTranslations({\n storage,\n loader,\n ...storageConfig\n}: TranslocoPersistTranslationsConfig) {\n return makeEnvironmentProviders([\n { provide: TRANSLOCO_LOADER, useClass: TranslocoPersistTranslations },\n provideTranslocoPersistTranslationsConfig(storageConfig),\n { provide: TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, useClass: loader },\n { provide: TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, ...storage },\n ]);\n}\n\nexport function provideTranslocoPersistTranslationsConfig(\n config?: Partial<StorageConfig>\n) {\n return {\n provide: TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG,\n useValue: {\n ...defaultConfig,\n ...config,\n },\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG, TRANSLOCO_PERSIST_TRANSLATIONS_LOADER, TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE, StorageConfig, TranslocoPersistTranslationsConfig, } from './lib/transloco-persist-translations.config';
2
+ export { MaybeAsyncStorage, MaybeAsync } from './lib/transloco.storage';
3
+ export { TranslocoPersistTranslations } from './lib/transloco-persist-translations.service';
4
+ export { provideTranslocoPersistTranslations } from './lib/transloco-persist-translations.providers';
@@ -0,0 +1,3 @@
1
+ import { Observable } from 'rxjs';
2
+ export declare function isPromise(v: any): v is Promise<any>;
3
+ export declare function observify(asyncOrValue: any): Observable<any>;
@@ -0,0 +1,17 @@
1
+ import { ClassProvider, ExistingProvider, FactoryProvider, InjectionToken, Type, ValueProvider } from '@angular/core';
2
+ import { TranslocoLoader } from '@jsverse/transloco';
3
+ import { MaybeAsyncStorage } from './transloco.storage';
4
+ export interface StorageConfig {
5
+ ttl: number;
6
+ storageKey: string;
7
+ }
8
+ type providerValue = Pick<ValueProvider, 'useValue'> | Pick<ClassProvider, 'useClass'> | Pick<ExistingProvider, 'useExisting'> | Pick<FactoryProvider, 'useFactory' | 'deps'>;
9
+ export interface TranslocoPersistTranslationsConfig extends Partial<StorageConfig> {
10
+ loader: Type<TranslocoLoader>;
11
+ storage: providerValue;
12
+ }
13
+ export declare const defaultConfig: StorageConfig;
14
+ export declare const TRANSLOCO_PERSIST_TRANSLATIONS_LOADER: InjectionToken<TranslocoLoader>;
15
+ export declare const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE: InjectionToken<MaybeAsyncStorage>;
16
+ export declare const TRANSLOCO_PERSIST_TRANSLATIONS_STORAGE_CONFIG: InjectionToken<StorageConfig>;
17
+ export {};
@@ -0,0 +1,9 @@
1
+ import { StorageConfig, TranslocoPersistTranslationsConfig } from './transloco-persist-translations.config';
2
+ export declare function provideTranslocoPersistTranslations({ storage, loader, ...storageConfig }: TranslocoPersistTranslationsConfig): import("@angular/core").EnvironmentProviders;
3
+ export declare function provideTranslocoPersistTranslationsConfig(config?: Partial<StorageConfig>): {
4
+ provide: import("@angular/core").InjectionToken<StorageConfig>;
5
+ useValue: {
6
+ ttl: number;
7
+ storageKey: string;
8
+ };
9
+ };
@@ -0,0 +1,26 @@
1
+ import { Translation, TranslocoLoader } from '@jsverse/transloco';
2
+ import { Observable } from 'rxjs';
3
+ import { OnDestroy } from '@angular/core';
4
+ import * as i0 from "@angular/core";
5
+ export declare function getTimestampKey(key: string): string;
6
+ export declare class TranslocoPersistTranslations implements TranslocoLoader, OnDestroy {
7
+ private loader;
8
+ private storage;
9
+ private config;
10
+ private subscription;
11
+ private cache;
12
+ getTranslation(lang: string): Observable<Translation>;
13
+ clearCache(): void;
14
+ private getCached;
15
+ private setCache;
16
+ private encode;
17
+ private decode;
18
+ private setTimestamp;
19
+ private getTimestamp;
20
+ private clearTimestamp;
21
+ private clearTranslations;
22
+ private clearCurrentStorage;
23
+ ngOnDestroy(): void;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<TranslocoPersistTranslations, never>;
25
+ static ɵprov: i0.ɵɵInjectableDeclaration<TranslocoPersistTranslations>;
26
+ }
@@ -0,0 +1,7 @@
1
+ import { Observable } from 'rxjs';
2
+ export type MaybeAsync<T = any> = Promise<T> | Observable<T> | T;
3
+ export interface MaybeAsyncStorage {
4
+ getItem(key: string): MaybeAsync;
5
+ setItem(key: string, value: any): void;
6
+ removeItem(key: string): void;
7
+ }
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@jsverse/transloco-persist-translations",
3
+ "version": "7.0.0",
4
+ "description": "Transloco persist translations",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "bugs": {
9
+ "url": "https://github.com/jsverse/transloco/issues"
10
+ },
11
+ "homepage": "https://jsverse.github.io/transloco/docs/plugins/persist-translations",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/jsverse/transloco"
15
+ },
16
+ "keywords": [
17
+ "angular",
18
+ "angular 2",
19
+ "i18n",
20
+ "transloco",
21
+ "translate",
22
+ "persist",
23
+ "storage"
24
+ ],
25
+ "license": "MIT",
26
+ "peerDependencies": {
27
+ "@angular/core": ">=16.0.0",
28
+ "@jsverse/transloco": ">=7.0.0"
29
+ },
30
+ "dependencies": {
31
+ "tslib": "^2.2.0"
32
+ },
33
+ "module": "fesm2022/jsverse-transloco-persist-translations.mjs",
34
+ "typings": "index.d.ts",
35
+ "exports": {
36
+ "./package.json": {
37
+ "default": "./package.json"
38
+ },
39
+ ".": {
40
+ "types": "./index.d.ts",
41
+ "esm2022": "./esm2022/jsverse-transloco-persist-translations.mjs",
42
+ "esm": "./esm2022/jsverse-transloco-persist-translations.mjs",
43
+ "default": "./fesm2022/jsverse-transloco-persist-translations.mjs"
44
+ }
45
+ },
46
+ "sideEffects": false
47
+ }