@ngx-pwa/local-storage 16.2.0 → 16.3.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/esm2022/lib/databases/local-database.mjs +2 -1
- package/esm2022/lib/storages/local-storage.service.mjs +2 -2
- package/esm2022/lib/validation/json-schema.mjs +1 -1
- package/esm2022/lib/validation/json-validator.mjs +2 -1
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/ngx-pwa-local-storage.mjs +3 -1
- package/fesm2022/ngx-pwa-local-storage.mjs.map +1 -1
- package/lib/databases/local-database.d.ts +1 -0
- package/lib/storages/local-storage.service.d.ts +1 -1
- package/lib/validation/json-schema.d.ts +7 -0
- package/lib/validation/json-validator.d.ts +1 -0
- package/package.json +1 -1
|
@@ -52,6 +52,7 @@ export function localDatabaseFactory() {
|
|
|
52
52
|
*/
|
|
53
53
|
return new MemoryDatabase();
|
|
54
54
|
}
|
|
55
|
+
/** @deprecated Will be removed in v17 */
|
|
55
56
|
class LocalDatabase {
|
|
56
57
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LocalDatabase, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
57
58
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LocalDatabase, providedIn: "root", useFactory: localDatabaseFactory }); }
|
|
@@ -64,4 +65,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
|
|
|
64
65
|
useFactory: localDatabaseFactory,
|
|
65
66
|
}]
|
|
66
67
|
}] });
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi9kYXRhYmFzZXMvbG9jYWwtZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFbkQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQjtJQUVsQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFdkM7OztPQUdHO0lBQ0gsSUFBSTtRQUVGLHFGQUFxRjtRQUNyRixJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFFO1lBRS9HOzs7Ozs7cUhBTXlHO1lBQ3pHLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1NBRWhDO2FBQU0sSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7ZUFDbkMsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLEVBQUU7WUFFM0Y7Ozs7Ozs7Ozs7Y0FVRTtZQUNGLE9BQU8sSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1NBRW5DO0tBRUY7SUFBQyxNQUFNO1FBQ04sZ0JBQWdCO0tBQ2pCO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUU5QixDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLE1BSXNCLGFBQWE7OEdBQWIsYUFBYTtrSEFBYixhQUFhLGNBSHJCLE1BQU0sY0FDTixvQkFBb0I7O1NBRVosYUFBYTsyRkFBYixhQUFhO2tCQUpsQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO29CQUNsQixVQUFVLEVBQUUsb0JBQW9CO2lCQUNqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBQTEFURk9STV9JRCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEluZGV4ZWREQkRhdGFiYXNlIH0gZnJvbSBcIi4vaW5kZXhlZGRiLWRhdGFiYXNlXCI7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VEYXRhYmFzZSB9IGZyb20gXCIuL2xvY2Fsc3RvcmFnZS1kYXRhYmFzZVwiO1xuaW1wb3J0IHsgTWVtb3J5RGF0YWJhc2UgfSBmcm9tIFwiLi9tZW1vcnktZGF0YWJhc2VcIjtcblxuLyoqXG4gKiBGYWN0b3J5IHRvIGNyZWF0ZSBhIHN0b3JhZ2UgYWNjb3JkaW5nIHRvIGJyb3dzZXIgc3VwcG9ydFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9CUk9XU0VSU19TVVBQT1JULm1kfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxEYXRhYmFzZUZhY3RvcnkoKTogTG9jYWxEYXRhYmFzZSB7XG5cbiAgY29uc3QgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG5cbiAgLyogV2hlbiBzdG9yYWdlIGlzIGZ1bGx5IGRpc2FibGVkIGluIGJyb3dzZXIgKHZpYSB0aGUgXCJCbG9jayBhbGwgY29va2llc1wiIG9wdGlvbiksXG4gICAqIGp1c3QgdHJ5aW5nIHRvIGNoZWNrIGBpbmRleGVkREJgIG9yIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlcyBjYXVzZXMgYSBzZWN1cml0eSBleGNlcHRpb24uXG4gICAqIFByZXZlbnRzIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzExOFxuICAgKi9cbiAgdHJ5IHtcblxuICAgIC8vIERvIG5vdCBleHBsaWNpdCBgd2luZG93YCBoZXJlLCBhcyB0aGUgZ2xvYmFsIG9iamVjdCBpcyBub3QgdGhlIHNhbWUgaW4gd2ViIHdvcmtlcnNcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCkgJiYgKGluZGV4ZWREQiAhPT0gdW5kZWZpbmVkKSAmJiAoaW5kZXhlZERCICE9PSBudWxsKSAmJiAoXCJvcGVuXCIgaW4gaW5kZXhlZERCKSkge1xuXG4gICAgICAvKiBDaGVjazpcbiAgICAgICogLSBpZiB3ZSBhcmUgaW4gYSBicm93c2VyIGNvbnRleHQgKGlzc3VlOiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcpXG4gICAgICAqIC0gaXQgY291bGQgZXhpc3QgYnV0IGJlIGB1bmRlZmluZWRgIG9yIGBudWxsYFxuICAgICAgKiAtIGl0IGNvdWxkIGV4aXN0cyBidXQgbm90IGhhdmluZyBhIHdvcmtpbmcgQVBJXG4gICAgICAqIFdpbGwgYmUgdGhlIGNhc2UgZm9yOlxuICAgICAgKiAtIEFsbCBvdGhlciBicm93c2VycyBpbiBub3JtYWwgbW9kZVxuICAgICAgKiAtIENocm9taXVtIC8gU2FmYXJpIHByaXZhdGUgbW9kZSwgYnV0IGluIHRoaXMgY2FzZSwgZGF0YSB3aWxsIGJlIHN3aXBlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgYXBwICovXG4gICAgICByZXR1cm4gbmV3IEluZGV4ZWREQkRhdGFiYXNlKCk7XG5cbiAgICB9IGVsc2UgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpXG4gICAgICAmJiAobG9jYWxTdG9yYWdlICE9PSB1bmRlZmluZWQpICYmIChsb2NhbFN0b3JhZ2UgIT09IG51bGwpICYmIChcImdldEl0ZW1cIiBpbiBsb2NhbFN0b3JhZ2UpKSB7XG5cbiAgICAgIC8qIENoZWNrOlxuICAgICAgKiAtIGlmIHdlIGFyZSBpbiBhIGJyb3dzZXIgY29udGV4dCAoaXNzdWU6IHNlcnZlci1zaWRlIHJlbmRlcmluZylcbiAgICAgICogLSBpZiBgbG9jYWxTdG9yYWdlYCBleGlzdHMgKHRvIGJlIHN1cmUpXG4gICAgICAqIC0gaXQgY291bGQgZXhpc3RzIGJ1dCBub3QgaGF2aW5nIGEgd29ya2luZyBBUElcbiAgICAgICogV2lsbCBiZSB0aGUgY2FzZSBmb3I6XG4gICAgICAqIC0gU2FmYXJpIGNyb3NzLW9yaWdpbiBpZnJhbWVzLCBkZXRlY3RlZCBsYXRlciBpbiBgSW5kZXhlZERCRGF0YWJhc2UuY29ubmVjdCgpYFxuICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2lzc3Vlcy80Mn1cbiAgICAgICogLSBGaXJlZm94IHByaXZhdGUgbW9kZSwgYnV0IGluIHRoaXMgY2FzZSwgZGF0YSB3aWxsIGJlIHN3aXBlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgYXBwXG4gICAgICAqIEZvciBGaXJlZm94LCBjYW4gb25seSBiZSBkZXRlY3RlZCBsYXRlciBpbiBgSW5kZXhlZERCRGF0YWJhc2UuY29ubmVjdCgpYFxuICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03ODE5ODJ9XG4gICAgICAqL1xuICAgICAgcmV0dXJuIG5ldyBMb2NhbFN0b3JhZ2VEYXRhYmFzZSgpO1xuXG4gICAgfVxuXG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vdGhpbmcgdG8gZG9cbiAgfVxuXG4gIC8qIFdpbGwgYmUgdGhlIGNhc2UgZm9yOlxuICAgKiAtIEluIGJyb3dzZXJzIGlmIHN0b3JhZ2UgaGFzIGJlZW4gZnVsbHkgZGlzYWJsZWQgKHZpYSB0aGUgXCJCbG9jayBhbGwgY29va2llc1wiIG9wdGlvbilcbiAgICogLSBTZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICogLSBBbGwgb3RoZXIgbm9uLWJyb3dzZXIgY29udGV4dFxuICAgKi9cbiAgcmV0dXJuIG5ldyBNZW1vcnlEYXRhYmFzZSgpO1xuXG59XG5cbi8qKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gdjE3ICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICB1c2VGYWN0b3J5OiBsb2NhbERhdGFiYXNlRmFjdG9yeSxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9jYWxEYXRhYmFzZSB7XG5cbiAgYWJzdHJhY3QgcmVhZG9ubHkgc2l6ZTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGFic3RyYWN0IGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93biB8IHVuZGVmaW5lZD47XG4gIGFic3RyYWN0IHNldChrZXk6IHN0cmluZywgZGF0YTogdW5rbm93bik6IE9ic2VydmFibGU8dW5kZWZpbmVkPjtcbiAgYWJzdHJhY3QgZGVsZXRlKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+O1xuICBhYnN0cmFjdCBjbGVhcigpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD47XG4gIGFic3RyYWN0IGtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBhYnN0cmFjdCBoYXMoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG59XG4iXX0=
|
|
@@ -3,7 +3,7 @@ import { map } from "rxjs/operators";
|
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "./storage-map.service";
|
|
5
5
|
/**
|
|
6
|
-
* @deprecated Will be removed in v17
|
|
6
|
+
* @deprecated Will be removed in v17, use `StorageMap`
|
|
7
7
|
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/MIGRATION_TO_V16.md}
|
|
8
8
|
*/
|
|
9
9
|
class LocalStorage {
|
|
@@ -82,4 +82,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
|
|
|
82
82
|
providedIn: "root"
|
|
83
83
|
}]
|
|
84
84
|
}], ctorParameters: function () { return [{ type: i1.StorageMap }]; } });
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9sb2NhbC1zdG9yYWdlL3NyYy9saWIvc3RvcmFnZXMvbG9jYWwtc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFTckM7OztHQUdHO0FBQ0gsTUFHYSxZQUFZO0lBRXZCOzs7Ozs7O09BT0c7SUFDSCxJQUFJLE1BQU07UUFFUixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBRTlCLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsWUFBK0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFHLENBQUM7SUErQ3pELE9BQU8sQ0FBYyxHQUFXLEVBQUUsTUFBeUQ7UUFFekYsSUFBSSxNQUFNLEVBQUU7WUFFViw4Q0FBOEM7WUFDOUMsTUFBTSxHQUFHLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FFeEQ7UUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNuRix3RUFBd0U7UUFDeEUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDckQsQ0FBQztJQUVKLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsT0FBTyxDQUFDLEdBQVcsRUFBRSxJQUFhLEVBQUUsTUFBbUI7UUFFckQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUk7UUFDaEQsMEVBQTBFO1FBQzFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDaEIsQ0FBQztJQUVKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFFcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJO1FBQ3JDLDBFQUEwRTtRQUMxRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ2hCLENBQUM7SUFFSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSztRQUVILE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJO1FBQ2pDLDBFQUEwRTtRQUMxRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ2hCLENBQUM7SUFFSixDQUFDOzhHQW5JVSxZQUFZO2tIQUFaLFlBQVksY0FGWCxNQUFNOztTQUVQLFlBQVk7MkZBQVosWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge1xuICBKU09OU2NoZW1hLFxuICBKU09OU2NoZW1hQXJyYXlPZixcbiAgSlNPTlNjaGVtYUJvb2xlYW4sIEpTT05TY2hlbWFJbnRlZ2VyLFxuICBKU09OU2NoZW1hTnVtYmVyLCBKU09OU2NoZW1hU3RyaW5nXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL2pzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBTdG9yYWdlTWFwIH0gZnJvbSBcIi4vc3RvcmFnZS1tYXAuc2VydmljZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTcsIHVzZSBgU3RvcmFnZU1hcGBcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvYmxvYi9tYWluL2RvY3MvTUlHUkFUSU9OX1RPX1YxNi5tZH1cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbFN0b3JhZ2Uge1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgaXRlbXMgaW4gc3RvcmFnZSB3cmFwcGVkIGluIGFuIGBPYnNlcnZhYmxlYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLmxvY2FsU3RvcmFnZS5sZW5ndGguc3Vic2NyaWJlKChsZW5ndGgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZyhsZW5ndGgpO1xuICAgKiB9KTtcbiAgICovXG4gIGdldCBsZW5ndGgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VNYXAuc2l6ZTtcblxuICB9XG5cbiAgLyogVXNlIHRoZSBgU3RvcmFnZU1hcGAgc2VydmljZSB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBzdG9yYWdlTWFwOiBTdG9yYWdlTWFwKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaXRlbSB2YWx1ZSBpbiBzdG9yYWdlLlxuICAgKiBUaGUgc2lnbmF0dXJlIGhhcyBtYW55IG92ZXJsb2FkcyBkdWUgdG8gdmFsaWRhdGlvbiwgKipwbGVhc2UgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24uKipcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kfVxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgSlNPTiBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGRhdGEuXG4gICAqICoqTm90ZSB5b3UgbXVzdCBwYXNzIHRoZSBzY2hlbWEgZGlyZWN0bHkgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4qKlxuICAgKiAqKlBhc3NpbmcgdGhlIHNjaGVtYSBpbiBhbiBvYmplY3QgYHsgc2NoZW1hIH1gIGlzIGRlcHJlY2F0ZWQgYW5kIG9ubHkgaGVyZSoqXG4gICAqICoqZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLioqXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtJ3MgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMsIGBudWxsYCBvdGhlcndpc2UsIHdyYXBwZWQgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLmxvY2FsU3RvcmFnZS5nZXQoJ2tleScsIHsgdHlwZTogJ3N0cmluZycgfSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICogICByZXN1bHQ7IC8vIHN0cmluZyBvciBudWxsXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmZhY2UgVXNlciB7XG4gICAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gICAqICAgbGFzdE5hbWU/OiBzdHJpbmc7XG4gICAqIH1cbiAgICpcbiAgICogY29uc3Qgc2NoZW1hID0ge1xuICAgKiAgIHR5cGU6ICdvYmplY3QnLFxuICAgKiAgIHByb3BlcnRpZXM6IHtcbiAgICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgKiAgICAgbGFzdE5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICogICB9LFxuICAgKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddXG4gICAqIH07XG4gICAqXG4gICAqIHRoaXMubG9jYWxTdG9yYWdlLmdldDxVc2VyPigndXNlcicsIHNjaGVtYSkuc3Vic2NyaWJlKCh1c2VyKSA9PiB7XG4gICAqICAgaWYgKHVzZXIpIHtcbiAgICogICAgIHVzZXIuZmlyc3ROYW1lO1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqL1xuICBnZXRJdGVtPFQgPSBzdHJpbmc+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFTdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBnZXRJdGVtPFQgPSBudW1iZXI+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGdldEl0ZW08VCA9IGJvb2xlYW4+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFCb29sZWFuKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgbnVsbD47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGdldEl0ZW08VCA9IHN0cmluZ1tdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hU3RyaW5nPik6IE9ic2VydmFibGU8c3RyaW5nW10gfCBudWxsPjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0SXRlbTxUID0gbnVtYmVyW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcj4pOiBPYnNlcnZhYmxlPG51bWJlcltdIHwgbnVsbD47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGdldEl0ZW08VCA9IGJvb2xlYW5bXT4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUJvb2xlYW4+KTogT2JzZXJ2YWJsZTxib29sZWFuW10gfCBudWxsPjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0SXRlbTxUID0gdW5rbm93bj4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYSB8IHsgc2NoZW1hOiBKU09OU2NoZW1hOyB9KTogT2JzZXJ2YWJsZTxUIHwgbnVsbD47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGdldEl0ZW08VCA9IHVua25vd24+KGtleTogc3RyaW5nLCBzY2hlbWE/OiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTx1bmtub3duPjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0SXRlbTxUID0gdW5rbm93bj4oa2V5OiBzdHJpbmcsIHNjaGVtYT86IEpTT05TY2hlbWEgfCB7IHNjaGVtYTogSlNPTlNjaGVtYTsgfSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuXG4gICAgaWYgKHNjaGVtYSkge1xuXG4gICAgICAvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiA8PSA3ICovXG4gICAgICBzY2hlbWEgPSAoXCJzY2hlbWFcIiBpbiBzY2hlbWEpID8gc2NoZW1hLnNjaGVtYSA6IHNjaGVtYTtcblxuICAgIH1cblxuICAgIHJldHVybiAoc2NoZW1hID8gdGhpcy5zdG9yYWdlTWFwLmdldDxUPihrZXksIHNjaGVtYSkgOiB0aGlzLnN0b3JhZ2VNYXAuZ2V0KGtleSkpLnBpcGUoXG4gICAgICAvKiBUcmFuc2Zvcm0gYHVuZGVmaW5lZGAgaW50byBgbnVsbGAgdG8gYWxpZ24gd2l0aCBgbG9jYWxTdG9yYWdlYCBBUEkgKi9cbiAgICAgIG1hcCgodmFsdWUpID0+ICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSA/IHZhbHVlIDogbnVsbCksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBpdGVtIGluIHN0b3JhZ2UuXG4gICAqIE5vdGUgdGhhdCBzZXR0aW5nIGBudWxsYCBvciBgdW5kZWZpbmVkYCB3aWxsIHJlbW92ZSB0aGUgaXRlbSB0byBhdm9pZCBzb21lIGJyb3dzZXJzIGlzc3Vlcy5cbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgaXRlbSdzIHZhbHVlXG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgSlNPTiBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGRhdGFcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCB0byB3YWl0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLmxvY2FsU3RvcmFnZS5zZXQoJ2tleScsICd2YWx1ZScpLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAqL1xuICBzZXRJdGVtKGtleTogc3RyaW5nLCBkYXRhOiB1bmtub3duLCBzY2hlbWE/OiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG5cbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlTWFwLnNldChrZXksIGRhdGEsIHNjaGVtYSkucGlwZShcbiAgICAgIC8qIFRyYW5zZm9ybSBgdW5kZWZpbmVkYCBpbnRvIGB0cnVlYCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHY3ICovXG4gICAgICBtYXAoKCkgPT4gdHJ1ZSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBpdGVtIGluIHN0b3JhZ2VcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcmV0dXJucyBBIFJ4SlMgYE9ic2VydmFibGVgIHRvIHdhaXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMubG9jYWxTdG9yYWdlLmRlbGV0ZSgna2V5Jykuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VNYXAuZGVsZXRlKGtleSkucGlwZShcbiAgICAgIC8qIFRyYW5zZm9ybSBgdW5kZWZpbmVkYCBpbnRvIGB0cnVlYCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHY3ICovXG4gICAgICBtYXAoKCkgPT4gdHJ1ZSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgaXRlbXMgaW4gc3RvcmFnZVxuICAgKiBAcmV0dXJucyBBIFJ4SlMgYE9ic2VydmFibGVgIHRvIHdhaXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMubG9jYWxTdG9yYWdlLmNsZWFyKCkuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIGNsZWFyKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hcC5jbGVhcigpLnBpcGUoXG4gICAgICAvKiBUcmFuc2Zvcm0gYHVuZGVmaW5lZGAgaW50byBgdHJ1ZWAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB2NyAqL1xuICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICk7XG5cbiAgfVxuXG59XG4iXX0=
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* to create a TypeScript discriminant union type.
|
|
3
3
|
* Avoid https://github.com/cyrilletuzi/angular-async-local-storage/issues/64 */
|
|
4
4
|
export {};
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi92YWxpZGF0aW9uL2pzb24tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztnRkFFZ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBBbGwgc2NoZW1hcyBpbnRlcmZhY2VzIG11c3QgaGF2ZSBhIHJlcXVpcmVkIGFuZCBkaWZmZXJlbnQgYHR5cGVgLFxuICogdG8gY3JlYXRlIGEgVHlwZVNjcmlwdCBkaXNjcmltaW5hbnQgdW5pb24gdHlwZS5cbiAqIEF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzY0ICovXG5cbi8qKlxuICogSlNPTiBTY2hlbWEgdG8gZGVzY3JpYmUgYSBib29sZWFuIHZhbHVlLlxuICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHYxNywgdXNlIHRoZSBnZW5lcmljIGBKU09OU2NoZW1hYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFCb29sZWFuIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogXCJib29sZWFuXCI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIHRoaXMuXG4gICAqL1xuICBjb25zdD86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhIG51bWJlciB2YWx1ZS5cbiAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTcsIHVzZSB0aGUgZ2VuZXJpYyBgSlNPTlNjaGVtYWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hTnVtYmVyIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBudW1lcmljIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogXCJudW1iZXJcIjtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgc3RyaWN0bHkgZXF1YWwgdG8gdGhpcy5cbiAgICovXG4gIGNvbnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byBvbmUgb2YgdGhlIHZhbHVlIG9mIGVudW0uXG4gICAqL1xuICBlbnVtPzogcmVhZG9ubHkgbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGEgbXVsdGlwbGUgb2YgeC5cbiAgICogTXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC5cbiAgICovXG4gIG11bHRpcGxlT2Y/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGxvd2VyIG9yIGVxdWFsIHRoYW4gdGhpcyBtYXhpbXVtLlxuICAgKi9cbiAgbWF4aW11bT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgc3RyaWN0bHkgbG93ZXIgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBleGNsdXNpdmVNYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgbWluaW11bT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHRoaXMgbWluaW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1pbmltdW0/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhbiBpbnRlZ2VyIHZhbHVlLlxuICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHYxNywgdXNlIHRoZSBnZW5lcmljIGBKU09OU2NoZW1hYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFJbnRlZ2VyIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gaW50ZWdlciB2YWx1ZS5cbiAgICovXG4gIHR5cGU6IFwiaW50ZWdlclwiO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIG9uZSBvZiB0aGUgdmFsdWUgb2YgZW51bS5cbiAgICovXG4gIGVudW0/OiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgYSBtdWx0aXBsZSBvZiB4LlxuICAgKiBNdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLlxuICAgKi9cbiAgbXVsdGlwbGVPZj86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBtYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoaXMgbWF4aW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1heGltdW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1pbmltdW0uXG4gICAqL1xuICBtaW5pbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgZXhjbHVzaXZlTWluaW11bT86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHZhbHVlLlxuICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHYxNywgdXNlIHRoZSBnZW5lcmljIGBKU09OU2NoZW1hYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFTdHJpbmcge1xuXG4gIC8qKlxuICAgKiBUeXBlIGZvciBhIHN0cmluZyB2YWx1ZS5cbiAgICovXG4gIHR5cGU6IFwic3RyaW5nXCI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIHRoaXMuXG4gICAqL1xuICBjb25zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgc3RyaWN0bHkgZXF1YWwgdG8gb25lIG9mIHRoZSB2YWx1ZSBvZiBlbnVtLlxuICAgKi9cbiAgZW51bT86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNYXhpdW0gbGVuZ3RoIGZvciBhIHN0cmluZy5cbiAgICogTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGxlbmd0aCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkxlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUGF0dGVybiB0byBtYXRjaCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sICp3aXRob3V0KiB0aGUgYC9gIGRlbGltaXRlcnMuXG4gICAqL1xuICBwYXR0ZXJuPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogSlNPTiBzY2hlbWEgdG8gZGVzY3JpYmUgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHYxNywgdXNlIHRoZSBnZW5lcmljIGBKU09OU2NoZW1hYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheSB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6IFwiYXJyYXlcIjtcblxuICAvKipcbiAgICogU2NoZW1hIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheS5cbiAgICovXG4gIGl0ZW1zOiBKU09OU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZSB2YWx1ZXM6XG4gKiAtIGFycmF5IG9mIGJvb2xlYW5zOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUJvb2xlYW4+YCxcbiAqIC0gYXJyYXkgb2YgbnVtYmVyczogYEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFOdW1iZXI+YCxcbiAqIC0gYXJyYXkgb2YgaW50ZWdlcnM6IGBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hSW50ZWdlcj5gLFxuICogLSBhcnJheSBvZiBzdHJpbmdzOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYVN0cmluZz5gLlxuICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHYxNywgdXNlIHRoZSBnZW5lcmljIGBKU09OU2NoZW1hYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheU9mPFQgZXh0ZW5kcyBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFOdW1iZXIgfCBKU09OU2NoZW1hSW50ZWdlciB8IEpTT05TY2hlbWFTdHJpbmc+IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICAgKi9cbiAgdHlwZTogXCJhcnJheVwiO1xuXG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHRoZSB2YWx1ZXMgb2YgYW4gYXJyYXkuXG4gICAqL1xuICBpdGVtczogVDtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgbGVuZ3RoIGlzIGxvd2VyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1heEl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIHZhbHVlLlxuICAgKiBNdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIuXG4gICAqL1xuICBtaW5JdGVtcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgb25seSBoYXZlIHVuaXF1ZSB2YWx1ZXMuXG4gICAqL1xuICB1bmlxdWVJdGVtcz86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIHNjaGVtYSB0byBkZXNjcmliZSBhIHR1cGxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFUdXBsZSB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6IFwiYXJyYXlcIjtcblxuICAvKipcbiAgICogU2NoZW1hIGZvciB0aGUgdmFsdWVzIG9mIHRoZSB0dXBsZS5cbiAgICovXG4gIGl0ZW1zPzogcmVhZG9ubHkgSlNPTlNjaGVtYVtdO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gc2NoZW1hIHRvIGRlc2NyaWJlIGFuIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTcsIHVzZSB0aGUgZ2VuZXJpYyBgSlNPTlNjaGVtYWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hT2JqZWN0IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gb2JqZWN0LlxuICAgKi9cbiAgdHlwZTogXCJvYmplY3RcIjtcblxuICAvKipcbiAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYW5kIHRoZWlyIGFzc29jaWF0ZWQgSlNPTiBzY2hlbWFzLlxuICAgKi9cbiAgcHJvcGVydGllczoge1xuICAgIFtrOiBzdHJpbmddOiBKU09OU2NoZW1hO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBuYW1lcyBvZiB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBmb3IgYW4gb2JqZWN0LlxuICAgKiBQcm9wZXJ0aWVzIHNldCBhcyByZXF1aXJlZCBzaG91bGQgYmUgcHJlc2VudCBpbiBgcHJvcGVydGllc2AgdG9vLlxuICAgKi9cbiAgcmVxdWlyZWQ/OiByZWFkb25seSBzdHJpbmdbXTtcblxufVxuXG4vKipcbiAqIFN1YnNldCBvZiB0aGUgSlNPTiBTY2hlbWEgc3RhbmRhcmQuXG4gKiBUeXBlcyBhcmUgZW5mb3JjZWQgdG8gdmFsaWRhdGUgZXZlcnl0aGluZzogZWFjaCB2YWx1ZSAqKm11c3QqKiBoYXZlIGEgYHR5cGVgLlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kfVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzY2hlbWE6IEpTT05TY2hlbWEgPSB7IHR5cGU6ICdzdHJpbmcnIH07XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYTogSlNPTlNjaGVtYSA9IHsgdHlwZTogJ251bWJlcicgfTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hOiBKU09OU2NoZW1hID0geyB0eXBlOiAnaW50ZWdlcicgfTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hOiBKU09OU2NoZW1hID0geyB0eXBlOiAnYm9vbGVhbicgfTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hOiBKU09OU2NoZW1hID0ge1xuICogICB0eXBlOiAnYXJyYXknLFxuICogICBpdGVtczogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogfTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hOiBKU09OU2NoZW1hID0ge1xuICogICB0eXBlOiAnb2JqZWN0JyxcbiAqICAgcHJvcGVydGllczoge1xuICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogICAgIGxhc3ROYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gKiAgIH0sXG4gKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddLFxuICogfTtcbiAqL1xuZXhwb3J0IHR5cGUgSlNPTlNjaGVtYSA9IEpTT05TY2hlbWFTdHJpbmcgfCBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFBcnJheSB8IEpTT05TY2hlbWFUdXBsZSB8IEpTT05TY2hlbWFPYmplY3Q7XG4iXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Injectable } from "@angular/core";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
+
/** @deprecated Will be removed in v17 */
|
|
3
4
|
class JSONValidator {
|
|
4
5
|
/**
|
|
5
6
|
* Validate a JSON data against a Jsubset of the JSON Schema standard.
|
|
@@ -244,4 +245,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
|
|
|
244
245
|
providedIn: "root"
|
|
245
246
|
}]
|
|
246
247
|
}] });
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi92YWxpZGF0aW9uL2pzb24tdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVzNDLE1BR2EsYUFBYTtJQUV4Qjs7Ozs7OztPQU9HO0lBQ0gsUUFBUSxDQUFDLElBQWEsRUFBRSxNQUFrQjtRQUV4QyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFFbkIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMzQyxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUU1QztJQUVILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGNBQWMsQ0FBQyxJQUFhLEVBQUUsTUFBd0I7UUFFOUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNyQyxPQUFPLEtBQUssQ0FBQztT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LENBQUM7U0FDYjtRQUVELDBFQUEwRTtRQUMxRSxPQUFPLENBQUUsTUFBTSxDQUFDLElBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFckQsQ0FBQzs4R0FoVVUsYUFBYTtrSEFBYixhQUFhLGNBRlosTUFBTTs7U0FFUCxhQUFhOzJGQUFiLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBKU09OU2NoZW1hLFxuICBKU09OU2NoZW1hQXJyYXksXG4gIEpTT05TY2hlbWFCb29sZWFuLFxuICBKU09OU2NoZW1hSW50ZWdlciwgSlNPTlNjaGVtYU51bWJlcixcbiAgSlNPTlNjaGVtYU9iamVjdCxcbiAgSlNPTlNjaGVtYVN0cmluZyxcbiAgSlNPTlNjaGVtYVR1cGxlXG59IGZyb20gXCIuL2pzb24tc2NoZW1hXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogXCJyb290XCJcbn0pXG5leHBvcnQgY2xhc3MgSlNPTlZhbGlkYXRvciB7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgSlNPTiBkYXRhIGFnYWluc3QgYSBKc3Vic2V0IG9mIHRoZSBKU09OIFNjaGVtYSBzdGFuZGFyZC5cbiAgICogVHlwZXMgYXJlIGVuZm9yY2VkIHRvIHZhbGlkYXRlIGV2ZXJ5dGhpbmc6IGVhY2ggc2NoZW1hIG11c3RcbiAgICogQHBhcmFtIGRhdGEgSlNPTiBkYXRhIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBzY2hlbWEgU3Vic2V0IG9mIEpTT04gU2NoZW1hLiBNdXN0IGhhdmUgYSBgdHlwZWAuXG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL1ZBTElEQVRJT04ubWR9XG4gICAqL1xuICB2YWxpZGF0ZShkYXRhOiB1bmtub3duLCBzY2hlbWE6IEpTT05TY2hlbWEpOiBib29sZWFuIHtcblxuICAgIHN3aXRjaCAoc2NoZW1hLnR5cGUpIHtcblxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVN0cmluZyhkYXRhLCBzY2hlbWEpO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVOdW1iZXIoZGF0YSwgc2NoZW1hKTtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQm9vbGVhbihkYXRhLCBzY2hlbWEpO1xuICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQXJyYXkoZGF0YSwgc2NoZW1hKTtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVPYmplY3QoZGF0YSwgc2NoZW1hKTtcblxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgc3RyaW5nXG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgc3RyaW5nXG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlU3RyaW5nKGRhdGE6IHVua25vd24sIHNjaGVtYTogSlNPTlNjaGVtYVN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlQ29uc3QoZGF0YSwgc2NoZW1hKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YS5sZW5ndGggPiBzY2hlbWEubWF4TGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YS5sZW5ndGggPCBzY2hlbWEubWluTGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEucGF0dGVybikge1xuXG4gICAgICBsZXQgcmVndWxhckV4cHJlc3Npb246IFJlZ0V4cCB8IG51bGwgPSBudWxsO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZWd1bGFyRXhwcmVzc2lvbiA9IG5ldyBSZWdFeHAoc2NoZW1hLnBhdHRlcm4pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG9cbiAgICAgIH1cblxuICAgICAgaWYgKHJlZ3VsYXJFeHByZXNzaW9uICYmICFyZWd1bGFyRXhwcmVzc2lvbi50ZXN0KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBudW1iZXIgb3IgYW4gaW50ZWdlclxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBzY2hlbWEgU2NoZW1hIGRlc2NyaWJpbmcgdGhlIG51bWJlciBvciBpbnRlZ2VyXG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlTnVtYmVyKGRhdGE6IHVua25vd24sIHNjaGVtYTogSlNPTlNjaGVtYU51bWJlciB8IEpTT05TY2hlbWFJbnRlZ2VyKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoKHNjaGVtYS50eXBlID09PSBcImludGVnZXJcIikgJiYgIU51bWJlci5pc0ludGVnZXIoZGF0YSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVDb25zdChkYXRhLCBzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRW51bShkYXRhLCBzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogVGVzdCBpcyBkb25lIHRoaXMgd2F5IHRvIG5vdCBkaXZpZGUgYnkgMCAqL1xuICAgIGlmIChzY2hlbWEubXVsdGlwbGVPZiAmJiAhTnVtYmVyLmlzSW50ZWdlcihkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2YpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChzY2hlbWEubWF4aW11bSAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YSA+IHNjaGVtYS5tYXhpbXVtKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gIT09IHVuZGVmaW5lZCkgJiYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBpZiAoKHNjaGVtYS5taW5pbXVtICE9PSB1bmRlZmluZWQpICYmIChkYXRhIDwgc2NoZW1hLm1pbmltdW0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBpZiAoKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSB1bmRlZmluZWQpICYmIChkYXRhIDw9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBib29sZWFuXG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgYm9vbGVhblxuICAgKiBAcmV0dXJucyBJZiBkYXRhIGlzIHZhbGlkOiBgdHJ1ZWAsIGlmIGl0IGlzIGludmFsaWQ6IGBmYWxzZWBcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUJvb2xlYW4oZGF0YTogdW5rbm93biwgc2NoZW1hOiBKU09OU2NoZW1hQm9vbGVhbik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUNvbnN0KGRhdGEsIHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGFycmF5XG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgYXJyYXlcbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVBcnJheShkYXRhOiB1bmtub3duLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheSB8IEpTT05TY2hlbWFUdXBsZSk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChzY2hlbWEubWF4SXRlbXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGEubGVuZ3RoID4gc2NoZW1hLm1heEl0ZW1zKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLm1pbkl0ZW1zICE9PSB1bmRlZmluZWQpICYmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5JdGVtcykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG5cbiAgICAgIC8qIENyZWF0ZSBhIHNldCB0byBlbGltaW5hdGUgdmFsdWVzIHdpdGggbXVsdGlwbGUgb2NjdXJlbmNlcyAqL1xuICAgICAgY29uc3QgZGF0YVNldCA9IG5ldyBTZXQoZGF0YSk7XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gZGF0YVNldC5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIC8qIFNwZWNpZmljIHRlc3QgZm9yIHR1cGxlcyAqL1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykgfHwgc2NoZW1hLml0ZW1zID09PSB1bmRlZmluZWQpIHtcblxuICAgICAgLy8gVE9ETzogY2FzdCBzaG91bGQgbm90IGJlIG5lZWRlZCBoZXJlXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVR1cGxlKGRhdGEsIHNjaGVtYS5pdGVtcyBhcyBKU09OU2NoZW1hW10gfCB1bmRlZmluZWQpO1xuXG4gICAgfVxuXG4gICAgLyogVmFsaWRhdGUgYWxsIHRoZSB2YWx1ZXMgaW4gYXJyYXkgKi9cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRhdGEpIHtcblxuICAgICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gVHlwZVNjcmlwdCA0LjEgaXMgYXZhaWxhYmxlXG4gICAgICAvLyAoY3VycmVudGx5IHRoZSBuYXJyb3dlZCB0eXBlIGZyb20gYEFycmF5LmlzQXJyYXkoKWAgaXMgbG9zdCBvbiByZWFkb25seSBhcnJheXMpXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGUodmFsdWUsIHNjaGVtYS5pdGVtcyBhcyBKU09OU2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgdHVwbGUgKGFycmF5IHdpdGggZml4ZWQgbGVuZ3RoIGFuZCBtdWx0aXBsZSB0eXBlcylcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gc2NoZW1hcyBTY2hlbWFzIGRlc2NyaWJpbmcgdGhlIHR1cGxlXG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHVwbGUoZGF0YTogdW5rbm93bltdLCBzY2hlbWFzOiBKU09OU2NoZW1hW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblxuICAgIGNvbnN0IGxlbmd0aFRvQ2hlY2sgPSBzY2hlbWFzID8gc2NoZW1hcy5sZW5ndGggOiAwO1xuXG4gICAgLyogVHVwbGVzIGhhdmUgYSBmaXhlZCBsZW5ndGggKi9cbiAgICBpZiAoZGF0YS5sZW5ndGggIT09IGxlbmd0aFRvQ2hlY2spIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYXMpIHtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSArPSAxKSB7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlKGRhdGFbaV0sIHNjaGVtYXNbaV0hKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIG9iamVjdFxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBzY2hlbWEgSlNPTiBzY2hlbWEgZGVzY3JpYmluZyB0aGUgb2JqZWN0XG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlT2JqZWN0KGRhdGE6IHVua25vd24sIHNjaGVtYTogSlNPTlNjaGVtYU9iamVjdCk6IGJvb2xlYW4ge1xuXG4gICAgLyogQ2hlY2sgdGhlIHR5cGUgYW5kIGlmIG5vdCBgbnVsbGAgYXMgYG51bGxgIGFsc28gaGF2ZSB0aGUgdHlwZSBgb2JqZWN0YCBpbiBvbGQgYnJvd3NlcnMgKi9cbiAgICBpZiAoKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKSB8fCAoZGF0YSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiBDaGVjayBpZiB0aGUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSBtb3JlIHByb3BlcnRpZXMgdGhhbiBleHBlY3RlZFxuICAgICAqIEVxdWl2YWxlbnQgb2YgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpLmxlbmd0aCA8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIFZhbGlkYXRlIHJlcXVpcmVkIHByb3BlcnRpZXMgKi9cbiAgICBpZiAoc2NoZW1hLnJlcXVpcmVkKSB7XG5cbiAgICAgIGZvciAoY29uc3QgcmVxdWlyZWRQcm9wIG9mIHNjaGVtYS5yZXF1aXJlZCkge1xuXG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIHJlcXVpcmVkUHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgYWxsIHByb3BlcnRpZXMgKi9cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHNjaGVtYS5wcm9wZXJ0aWVzKSB7XG5cbiAgICAgIC8qIEZpbHRlciB0byBrZWVwIG9ubHkgcmVhbCBwcm9wZXJ0aWVzIChubyBpbnRlcm5hbCBKUyBzdHVmZikgYW5kIGNoZWNrIGlmIHRoZSBkYXRhIGhhcyB0aGUgcHJvcGVydHkgdG9vICovXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYS5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIHByb3BlcnR5KSkge1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZSgoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcGVydHldLCBzY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0hKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgY29uc3RhbnRcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0YSB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gc2NoZW1hIEpTT04gc2NoZW1hIGRlc2NyaWJpbmcgdGhlIGNvbnN0YW50XG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ29uc3QoZGF0YTogdW5rbm93biwgc2NoZW1hOiBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlciB8IEpTT05TY2hlbWFTdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICghc2NoZW1hLmNvbnN0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGRhdGEgPT09IHNjaGVtYS5jb25zdCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbnVtXG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdGEgdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBKU09OIHNjaGVtYSBkZXNjcmliaW5nIHRoZSBlbnVtXG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlRW51bShkYXRhOiB1bmtub3duLCBzY2hlbWE6IEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlciB8IEpTT05TY2hlbWFTdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICghc2NoZW1hLmVudW0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIENhc3QgYXMgdGhlIGRhdGEgY2FuIGJlIG9mIG11bHRpcGxlIHR5cGVzLCBhbmQgc28gVHlwZVNjcmlwdCBpcyBsb3N0ICovXG4gICAgcmV0dXJuICgoc2NoZW1hLmVudW0gYXMgdW5rbm93bltdKS5pbmNsdWRlcyhkYXRhKSk7XG5cbiAgfVxuXG59XG4iXX0=
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi92YWxpZGF0aW9uL2pzb24tdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVzNDLHlDQUF5QztBQUN6QyxNQUdhLGFBQWE7SUFFeEI7Ozs7Ozs7T0FPRztJQUNILFFBQVEsQ0FBQyxJQUFhLEVBQUUsTUFBa0I7UUFFeEMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBRW5CLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FFNUM7SUFFSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxjQUFjLENBQUMsSUFBYSxFQUFFLE1BQXdCO1FBRTlELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzVCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDckMsT0FB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Q2hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCwwRUFBMEU7UUFDMUUsT0FBTyxDQUFFLE1BQU0sQ0FBQyxJQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXJELENBQUM7OEdBaFVVLGFBQWE7a0hBQWIsYUFBYSxjQUZaLE1BQU07O1NBRVAsYUFBYTsyRkFBYixhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgSlNPTlNjaGVtYSxcbiAgSlNPTlNjaGVtYUFycmF5LFxuICBKU09OU2NoZW1hQm9vbGVhbixcbiAgSlNPTlNjaGVtYUludGVnZXIsIEpTT05TY2hlbWFOdW1iZXIsXG4gIEpTT05TY2hlbWFPYmplY3QsXG4gIEpTT05TY2hlbWFTdHJpbmcsXG4gIEpTT05TY2hlbWFUdXBsZVxufSBmcm9tIFwiLi9qc29uLXNjaGVtYVwiO1xuXG4vKiogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHYxNyAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBKU09OVmFsaWRhdG9yIHtcblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBKU09OIGRhdGEgYWdhaW5zdCBhIEpzdWJzZXQgb2YgdGhlIEpTT04gU2NoZW1hIHN0YW5kYXJkLlxuICAgKiBUeXBlcyBhcmUgZW5mb3JjZWQgdG8gdmFsaWRhdGUgZXZlcnl0aGluZzogZWFjaCBzY2hlbWEgbXVzdFxuICAgKiBAcGFyYW0gZGF0YSBKU09OIGRhdGEgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBTdWJzZXQgb2YgSlNPTiBTY2hlbWEuIE11c3QgaGF2ZSBhIGB0eXBlYC5cbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvYmxvYi9tYWluL2RvY3MvVkFMSURBVElPTi5tZH1cbiAgICovXG4gIHZhbGlkYXRlKGRhdGE6IHVua25vd24sIHNjaGVtYTogSlNPTlNjaGVtYSk6IGJvb2xlYW4ge1xuXG4gICAgc3dpdGNoIChzY2hlbWEudHlwZSkge1xuXG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSk7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZU51bWJlcihkYXRhLCBzY2hlbWEpO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVCb29sZWFuKGRhdGEsIHNjaGVtYSk7XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBcnJheShkYXRhLCBzY2hlbWEpO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEpO1xuXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBzdHJpbmdcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gc2NoZW1hIFNjaGVtYSBkZXNjcmliaW5nIHRoZSBzdHJpbmdcbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVTdHJpbmcoZGF0YTogdW5rbm93biwgc2NoZW1hOiBKU09OU2NoZW1hU3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVDb25zdChkYXRhLCBzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRW51bShkYXRhLCBzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChzY2hlbWEubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpICYmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhMZW5ndGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChzY2hlbWEubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpICYmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5MZW5ndGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5wYXR0ZXJuKSB7XG5cbiAgICAgIGxldCByZWd1bGFyRXhwcmVzc2lvbjogUmVnRXhwIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlZ3VsYXJFeHByZXNzaW9uID0gbmV3IFJlZ0V4cChzY2hlbWEucGF0dGVybik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkb1xuICAgICAgfVxuXG4gICAgICBpZiAocmVndWxhckV4cHJlc3Npb24gJiYgIXJlZ3VsYXJFeHByZXNzaW9uLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIG51bWJlciBvciBhbiBpbnRlZ2VyXG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgbnVtYmVyIG9yIGludGVnZXJcbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVOdW1iZXIoZGF0YTogdW5rbm93biwgc2NoZW1hOiBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYUludGVnZXIpOiBib29sZWFuIHtcblxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLnR5cGUgPT09IFwiaW50ZWdlclwiKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52YWxpZGF0ZUNvbnN0KGRhdGEsIHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFbnVtKGRhdGEsIHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiBUZXN0IGlzIGRvbmUgdGhpcyB3YXkgdG8gbm90IGRpdmlkZSBieSAwICovXG4gICAgaWYgKHNjaGVtYS5tdWx0aXBsZU9mICYmICFOdW1iZXIuaXNJbnRlZ2VyKGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoKHNjaGVtYS5tYXhpbXVtICE9PSB1bmRlZmluZWQpICYmIChkYXRhID4gc2NoZW1hLm1heGltdW0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLm1pbmltdW0gIT09IHVuZGVmaW5lZCkgJiYgKGRhdGEgPCBzY2hlbWEubWluaW11bSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIH1cblxuICAgIGlmICgoc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gIT09IHVuZGVmaW5lZCkgJiYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGJvb2xlYW5cbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gc2NoZW1hIFNjaGVtYSBkZXNjcmliaW5nIHRoZSBib29sZWFuXG4gICAqIEByZXR1cm5zIElmIGRhdGEgaXMgdmFsaWQ6IGB0cnVlYCwgaWYgaXQgaXMgaW52YWxpZDogYGZhbHNlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQm9vbGVhbihkYXRhOiB1bmtub3duLCBzY2hlbWE6IEpTT05TY2hlbWFCb29sZWFuKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlQ29uc3QoZGF0YSwgc2NoZW1hKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gYXJyYXlcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gc2NoZW1hIFNjaGVtYSBkZXNjcmliaW5nIHRoZSBhcnJheVxuICAgKiBAcmV0dXJucyBJZiBkYXRhIGlzIHZhbGlkOiBgdHJ1ZWAsIGlmIGl0IGlzIGludmFsaWQ6IGBmYWxzZWBcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUFycmF5KGRhdGE6IHVua25vd24sIHNjaGVtYTogSlNPTlNjaGVtYUFycmF5IHwgSlNPTlNjaGVtYVR1cGxlKTogYm9vbGVhbiB7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoKHNjaGVtYS5tYXhJdGVtcyAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YS5sZW5ndGggPiBzY2hlbWEubWF4SXRlbXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKChzY2hlbWEubWluSXRlbXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGEubGVuZ3RoIDwgc2NoZW1hLm1pbkl0ZW1zKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHtcblxuICAgICAgLyogQ3JlYXRlIGEgc2V0IHRvIGVsaW1pbmF0ZSB2YWx1ZXMgd2l0aCBtdWx0aXBsZSBvY2N1cmVuY2VzICovXG4gICAgICBjb25zdCBkYXRhU2V0ID0gbmV3IFNldChkYXRhKTtcblxuICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSBkYXRhU2V0LnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyogU3BlY2lmaWMgdGVzdCBmb3IgdHVwbGVzICovXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLml0ZW1zKSB8fCBzY2hlbWEuaXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAvLyBUT0RPOiBjYXN0IHNob3VsZCBub3QgYmUgbmVlZGVkIGhlcmVcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVHVwbGUoZGF0YSwgc2NoZW1hLml0ZW1zIGFzIEpTT05TY2hlbWFbXSB8IHVuZGVmaW5lZCk7XG5cbiAgICB9XG5cbiAgICAvKiBWYWxpZGF0ZSBhbGwgdGhlIHZhbHVlcyBpbiBhcnJheSAqL1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGF0YSkge1xuXG4gICAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBUeXBlU2NyaXB0IDQuMSBpcyBhdmFpbGFibGVcbiAgICAgIC8vIChjdXJyZW50bHkgdGhlIG5hcnJvd2VkIHR5cGUgZnJvbSBgQXJyYXkuaXNBcnJheSgpYCBpcyBsb3N0IG9uIHJlYWRvbmx5IGFycmF5cylcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZSh2YWx1ZSwgc2NoZW1hLml0ZW1zIGFzIEpTT05TY2hlbWEpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSB0dXBsZSAoYXJyYXkgd2l0aCBmaXhlZCBsZW5ndGggYW5kIG11bHRpcGxlIHR5cGVzKVxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBzY2hlbWFzIFNjaGVtYXMgZGVzY3JpYmluZyB0aGUgdHVwbGVcbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVUdXBsZShkYXRhOiB1bmtub3duW10sIHNjaGVtYXM6IEpTT05TY2hlbWFbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXG4gICAgY29uc3QgbGVuZ3RoVG9DaGVjayA9IHNjaGVtYXMgPyBzY2hlbWFzLmxlbmd0aCA6IDA7XG5cbiAgICAvKiBUdXBsZXMgaGF2ZSBhIGZpeGVkIGxlbmd0aCAqL1xuICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gbGVuZ3RoVG9DaGVjaykge1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hcykge1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpICs9IDEpIHtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGUoZGF0YVtpXSwgc2NoZW1hc1tpXSEpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gb2JqZWN0XG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHNjaGVtYSBKU09OIHNjaGVtYSBkZXNjcmliaW5nIHRoZSBvYmplY3RcbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVPYmplY3QoZGF0YTogdW5rbm93biwgc2NoZW1hOiBKU09OU2NoZW1hT2JqZWN0KTogYm9vbGVhbiB7XG5cbiAgICAvKiBDaGVjayB0aGUgdHlwZSBhbmQgaWYgbm90IGBudWxsYCBhcyBgbnVsbGAgYWxzbyBoYXZlIHRoZSB0eXBlIGBvYmplY3RgIGluIG9sZCBicm93c2VycyAqL1xuICAgIGlmICgodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIpIHx8IChkYXRhID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIENoZWNrIGlmIHRoZSBvYmplY3QgZG9lc24ndCBoYXZlIG1vcmUgcHJvcGVydGllcyB0aGFuIGV4cGVjdGVkXG4gICAgICogRXF1aXZhbGVudCBvZiBgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlYFxuICAgICAqL1xuICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcykubGVuZ3RoIDwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogVmFsaWRhdGUgcmVxdWlyZWQgcHJvcGVydGllcyAqL1xuICAgIGlmIChzY2hlbWEucmVxdWlyZWQpIHtcblxuICAgICAgZm9yIChjb25zdCByZXF1aXJlZFByb3Agb2Ygc2NoZW1hLnJlcXVpcmVkKSB7XG5cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgcmVxdWlyZWRQcm9wKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9XG5cbiAgICAvKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSBhbGwgcHJvcGVydGllcyAqL1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc2NoZW1hLnByb3BlcnRpZXMpIHtcblxuICAgICAgLyogRmlsdGVyIHRvIGtlZXAgb25seSByZWFsIHByb3BlcnRpZXMgKG5vIGludGVybmFsIEpTIHN0dWZmKSBhbmQgY2hlY2sgaWYgdGhlIGRhdGEgaGFzIHRoZSBwcm9wZXJ0eSB0b28gKi9cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLnByb3BlcnRpZXMsIHByb3BlcnR5KSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgcHJvcGVydHkpKSB7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlKChkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wZXJ0eV0sIHNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSEpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBjb25zdGFudFxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRhIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBzY2hlbWEgSlNPTiBzY2hlbWEgZGVzY3JpYmluZyB0aGUgY29uc3RhbnRcbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVDb25zdChkYXRhOiB1bmtub3duLCBzY2hlbWE6IEpTT05TY2hlbWFCb29sZWFuIHwgSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYVN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKCFzY2hlbWEuY29uc3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAoZGF0YSA9PT0gc2NoZW1hLmNvbnN0KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVudW1cbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0YSB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gc2NoZW1hIEpTT04gc2NoZW1hIGRlc2NyaWJpbmcgdGhlIGVudW1cbiAgICogQHJldHVybnMgSWYgZGF0YSBpcyB2YWxpZDogYHRydWVgLCBpZiBpdCBpcyBpbnZhbGlkOiBgZmFsc2VgXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVFbnVtKGRhdGE6IHVua25vd24sIHNjaGVtYTogSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYVN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKCFzY2hlbWEuZW51bSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyogQ2FzdCBhcyB0aGUgZGF0YSBjYW4gYmUgb2YgbXVsdGlwbGUgdHlwZXMsIGFuZCBzbyBUeXBlU2NyaXB0IGlzIGxvc3QgKi9cbiAgICByZXR1cm4gKChzY2hlbWEuZW51bSBhcyB1bmtub3duW10pLmluY2x1ZGVzKGRhdGEpKTtcblxuICB9XG5cbn1cbiJdfQ==
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -9,4 +9,4 @@ export { VALIDATION_ERROR, ValidationError } from "./lib/storages/exceptions";
|
|
|
9
9
|
export { LocalStorage } from "./lib/storages/local-storage.service";
|
|
10
10
|
export { StorageMap } from "./lib/storages/storage-map.service";
|
|
11
11
|
export { JSONValidator } from "./lib/validation/json-validator";
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wd2EvbG9jYWwtc3RvcmFnZS9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsNEJBQTRCLEVBQUUsK0JBQStCLEVBQzdELHlCQUF5QixFQUFFLHlCQUF5QixFQUNyRCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUdoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGxvY2FsLXN0b3JhZ2VcbiAqL1xuXG5leHBvcnQgeyBTRVJJQUxJWkFUSU9OX0VSUk9SLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi9saWIvZGF0YWJhc2VzL2V4Y2VwdGlvbnNcIjtcbmV4cG9ydCB7IExvY2FsRGF0YWJhc2UgfSBmcm9tIFwiLi9saWIvZGF0YWJhc2VzL2xvY2FsLWRhdGFiYXNlXCI7XG5leHBvcnQge1xuICBwcm92aWRlSW5kZXhlZERCRGF0YUJhc2VOYW1lLCBwcm92aWRlSW5kZXhlZERCRGF0YUJhc2VWZXJzaW9uLFxuICBwcm92aWRlSW5kZXhlZERCU3RvcmVOYW1lLCBwcm92aWRlTG9jYWxTdG9yYWdlUHJlZml4XG59IGZyb20gXCIuL2xpYi9wcm92aWRlcnNcIjtcbmV4cG9ydCB7IFN0b3JhZ2VNb2R1bGUgfSBmcm9tIFwiLi9saWIvc3RvcmFnZS5tb2R1bGVcIjtcbmV4cG9ydCB7IFZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL2xpYi9zdG9yYWdlcy9leGNlcHRpb25zXCI7XG5leHBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi9saWIvc3RvcmFnZXMvbG9jYWwtc3RvcmFnZS5zZXJ2aWNlXCI7XG5leHBvcnQgeyBTdG9yYWdlTWFwIH0gZnJvbSBcIi4vbGliL3N0b3JhZ2VzL3N0b3JhZ2UtbWFwLnNlcnZpY2VcIjtcbmV4cG9ydCB7IFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi9saWIvdG9rZW5zXCI7XG5leHBvcnQgeyBKU09OU2NoZW1hLCBKU09OU2NoZW1hQXJyYXksIEpTT05TY2hlbWFBcnJheU9mLCBKU09OU2NoZW1hQm9vbGVhbiwgSlNPTlNjaGVtYUludGVnZXIsIEpTT05TY2hlbWFOdW1iZXIsIEpTT05TY2hlbWFPYmplY3QsIEpTT05TY2hlbWFTdHJpbmcgfSBmcm9tIFwiLi9saWIvdmFsaWRhdGlvbi9qc29uLXNjaGVtYVwiO1xuZXhwb3J0IHsgSlNPTlZhbGlkYXRvciB9IGZyb20gXCIuL2xpYi92YWxpZGF0aW9uL2pzb24tdmFsaWRhdG9yXCI7XG4iXX0=
|
|
@@ -669,6 +669,7 @@ function localDatabaseFactory() {
|
|
|
669
669
|
*/
|
|
670
670
|
return new MemoryDatabase();
|
|
671
671
|
}
|
|
672
|
+
/** @deprecated Will be removed in v17 */
|
|
672
673
|
class LocalDatabase {
|
|
673
674
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LocalDatabase, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
674
675
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LocalDatabase, providedIn: "root", useFactory: localDatabaseFactory }); }
|
|
@@ -804,6 +805,7 @@ class ValidationError extends Error {
|
|
|
804
805
|
}
|
|
805
806
|
}
|
|
806
807
|
|
|
808
|
+
/** @deprecated Will be removed in v17 */
|
|
807
809
|
class JSONValidator {
|
|
808
810
|
/**
|
|
809
811
|
* Validate a JSON data against a Jsubset of the JSON Schema standard.
|
|
@@ -1329,7 +1331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImpor
|
|
|
1329
1331
|
}], ctorParameters: function () { return [{ type: LocalDatabase }, { type: JSONValidator }]; } });
|
|
1330
1332
|
|
|
1331
1333
|
/**
|
|
1332
|
-
* @deprecated Will be removed in v17
|
|
1334
|
+
* @deprecated Will be removed in v17, use `StorageMap`
|
|
1333
1335
|
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/MIGRATION_TO_V16.md}
|
|
1334
1336
|
*/
|
|
1335
1337
|
class LocalStorage {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-pwa-local-storage.mjs","sources":["../../../../projects/ngx-pwa/local-storage/src/lib/databases/exceptions.ts","../../../../projects/ngx-pwa/local-storage/src/lib/tokens.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/indexeddb-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/localstorage-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/memory-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/local-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/providers.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storage.module.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storages/exceptions.ts","../../../../projects/ngx-pwa/local-storage/src/lib/validation/json-validator.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storages/storage-map.service.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storages/local-storage.service.ts","../../../../projects/ngx-pwa/local-storage/src/public-api.ts","../../../../projects/ngx-pwa/local-storage/src/ngx-pwa-local-storage.ts"],"sourcesContent":["/**\n * Exception message when `indexedDB` is not working\n */\nexport const IDB_BROKEN_ERROR = \"indexedDB is not working\";\n\n/**\n * Exception raised when `indexedDB` is not working\n */\nexport class IDBBrokenError extends Error {\n override message = IDB_BROKEN_ERROR;\n}\n\n/**\n * Exception message when a value can't be serialized for `localStorage`\n */\nexport const SERIALIZATION_ERROR = `The storage is currently localStorage,\nwhere data must be serialized, and the provided data can't be serialized.`;\n\n/**\n * Exception raised when a value can't be serialized for `localStorage`\n */\nexport class SerializationError extends Error {\n override message = SERIALIZATION_ERROR;\n}\n","import { InjectionToken } from \"@angular/core\";\n\n/**\n * Token to provide a prefix to `localStorage` keys.\n */\nexport const LS_PREFIX = new InjectionToken<string>(\"localStoragePrefix\", {\n providedIn: \"root\",\n factory: () => \"\"\n});\n\n/**\n * Default name used for `indexedDB` database.\n */\nexport const DEFAULT_IDB_DB_NAME = \"ngStorage\";\n\n/**\n * Token to provide `indexedDB` database name.\n */\nexport const IDB_DB_NAME = new InjectionToken<string>(\"localStorageIDBDBName\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_DB_NAME\n});\n\n/**\n * Default version used for `indexedDB` database.\n */\nexport const DEFAULT_IDB_DB_VERSION = 1;\n\n/**\n * Token to provide `indexedDB` database version.\n * Must be an unsigned **integer**.\n */\nexport const IDB_DB_VERSION = new InjectionToken<number>(\"localStorageIDBDBVersion\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_DB_VERSION\n});\n\n/**\n * Default name used for `indexedDB` object store.\n */\nexport const DEFAULT_IDB_STORE_NAME = \"localStorage\";\n\n/**\n * Token to provide `indexedDB` store name.\n * For backward compatibility, the default can't be set now, `IndexedDBDatabase` will do it at runtime.\n */\nexport const IDB_STORE_NAME = new InjectionToken<string>(\"localStorageIDBStoreName\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_STORE_NAME\n});\n\n/**\n * Default value for interoperability with native `indexedDB` and other storage libs,\n * by changing how values are stored in `indexedDB` database.\n */\nexport const DEFAULT_IDB_NO_WRAP = true;\n\n/**\n * Token to allow interoperability with native `indexedDB` and other storage libs,\n * by changing how values are stored in `indexedDB` database.\n * Defaults to `true`. Change to `false` for backward compatiblity in existing applications.\n * **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.\n */\nexport const IDB_NO_WRAP = new InjectionToken<boolean>(\"localStorageIDBWrap\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_NO_WRAP\n});\n\nexport interface StorageConfig {\n\n /**\n * @deprecated Use `provideLocalStoragePrefix()` method instead\n */\n LSPrefix?: string;\n\n /**\n * @deprecated Use `provideIndexedDBDataBaseName()` method instead\n */\n IDBDBName?: string;\n\n /**\n * @deprecated Use `provideIndexedDBStoreName()` method instead\n */\n IDBStoreName?: string;\n\n /**\n * @deprecated Use `provideIndexedDBDataBaseVersion()` method instead\n */\n IDBDBVersion?: number;\n\n /**\n * Allows interoperability with native `indexedDB` and other storage libs,\n * by changing how values are stored in `indexedDB` database.\n * Defaults to `true`. Change to `false` for backward compatiblity in existing applications.\n * **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.\n */\n IDBNoWrap?: boolean;\n\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { Observable, ReplaySubject, fromEvent, of, race, throwError } from \"rxjs\";\nimport { first, map, mergeMap, takeWhile, tap } from \"rxjs/operators\";\nimport { IDB_DB_NAME, IDB_DB_VERSION, IDB_NO_WRAP, IDB_STORE_NAME } from \"../tokens\";\nimport { IDBBrokenError } from \"./exceptions\";\nimport { LocalDatabase } from \"./local-database\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class IndexedDBDatabase implements LocalDatabase {\n\n /**\n * `indexedDB` database name\n */\n protected readonly dbName: string;\n\n /**\n * `indexedDB` object store name\n */\n protected readonly storeName: string;\n\n /**\n * `indexedDB` database version. Must be an unsigned **integer**\n */\n protected readonly dbVersion: number;\n\n /**\n * `indexedDB` database connection, wrapped in a RxJS `ReplaySubject` to be able to access the connection\n * even after the connection success event happened\n */\n protected readonly database = new ReplaySubject<IDBDatabase>(1);\n\n /**\n * Flag to not wrap `indexedDB` values for interoperability or to wrap for backward compatibility.\n */\n protected readonly noWrap: boolean;\n\n /**\n * Index used when wrapping value. *For backward compatibility only.*\n */\n protected readonly wrapIndex = \"value\";\n\n constructor() {\n\n this.dbName = inject(IDB_DB_NAME);\n this.storeName = inject(IDB_STORE_NAME);\n this.dbVersion = inject(IDB_DB_VERSION);\n this.noWrap = inject(IDB_NO_WRAP);\n\n /* Connect to `indexedDB`, with prefix if provided by the user */\n this.connect();\n\n }\n\n /**\n * Information about `indexedDB` connection. *Only useful for interoperability.*\n * @returns `indexedDB` database name, store name and database version\n */\n get backingStore(): { database: string, store: string, version: number; } {\n\n return {\n database: this.dbName,\n store: this.storeName,\n version: this.dbVersion,\n };\n\n }\n\n /**\n * Number of items in our `indexedDB` database and object store\n */\n get size(): Observable<number> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Request to know the number of items */\n const request = store.count();\n\n /* Return the result */\n return events.pipe(map(() => request.result));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Gets an item value in our `indexedDB` store\n * @param key The item's key\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in an RxJS `Observable`\n */\n get(key: string): Observable<unknown | undefined> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Request the value with the key provided by the user */\n const request = store.get(key);\n\n /* Listen events and return the result */\n return events.pipe(map((): unknown => {\n\n if ((request.result !== undefined) && (request.result !== null)) {\n\n /* Prior to v8, the value was wrapped in an `{ value: ...}` object */\n if (!this.noWrap && (typeof request.result === \"object\") && (this.wrapIndex in request.result) &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (request.result[this.wrapIndex] !== undefined) && (request.result[this.wrapIndex] !== null)) {\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return request.result[this.wrapIndex];\n\n } else {\n\n /* Cast to the wanted type */\n return request.result;\n\n }\n\n }\n\n /* Return `undefined` if the value is empty */\n return undefined;\n\n }));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Sets an item in our `indexedDB` store\n * @param key The item's key\n * @param data The item's value\n * @returns An RxJS `Observable` to wait the end of the operation\n */\n set(key: string, data: unknown): Observable<undefined> {\n\n /* Storing `undefined` in `indexedDb` can cause issues in some browsers so removing item instead */\n if (data === undefined) {\n return this.delete(key);\n }\n\n /* Open a transaction in write mode */\n return this.transaction(\"readwrite\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Prior to v8, data was wrapped in a `{ value: ... }` object */\n const dataToStore = this.noWrap ? data : { [this.wrapIndex]: data };\n\n /* Add if the item is not existing yet, or update otherwise */\n store.put(dataToStore, key);\n\n /* Listen to events and return `undefined` as no value is expected */\n return events.pipe(map(() => undefined));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Deletes an item in our `indexedDB` store\n * @param key The item's key\n * @returns An RxJS `Observable` to wait the end of the operation\n */\n delete(key: string): Observable<undefined> {\n\n /* Open a transaction in write mode */\n return this.transaction(\"readwrite\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Delete the item in store */\n store.delete(key);\n\n /* Listen to events and return `undefined` as no data is expected here */\n return events.pipe(map(() => undefined));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Deletes all items from our `indexedDB` objet store\n * @returns An RxJS `Observable` to wait the end of the operation\n */\n clear(): Observable<undefined> {\n\n /* Open a transaction in write mode */\n return this.transaction(\"readwrite\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Delete all items in object store */\n store.clear();\n\n /* Listen to events and return `undefined` as no data is expected here */\n return events.pipe(map(() => undefined));\n\n }),\n /* The observable will complete */\n first(),\n );\n\n }\n\n /**\n * Get all the keys in our `indexedDB` store\n * @returns An RxJS `Observable` iterating on each key\n */\n keys(): Observable<string> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n /* `first()` is used as the final operator in other methods to complete the `Observable`\n * (as it all starts from a `ReplaySubject` which never ends),\n * but as this method is iterating over multiple values, `first()` **must** be used here */\n first(),\n mergeMap((transactionData) => {\n\n const { store } = transactionData;\n\n /* Open a cursor on the store\n * Avoid issues like https://github.com/cyrilletuzi/angular-async-local-storage/issues/69 */\n const request = store.openKeyCursor();\n\n /* Listen to success event */\n const success$ = fromEvent(request, \"success\").pipe(\n /* Stop the `Observable` when the cursor is `null` */\n takeWhile(() => (request.result !== null)),\n /* This lib only allows string keys, but user could have added other types of keys from outside\n * It's OK to cast as the cursor as been tested in the previous operator */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n map(() => request.result!.key.toString()),\n /* Iterate on the cursor */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n tap(() => { request.result!.continue(); }),\n );\n\n /* Listen to error event and if so, throw an error */\n const error$ = this.listenError(request);\n\n /* Choose the first event to occur */\n return race([success$, error$]);\n\n }),\n );\n\n }\n\n /**\n * Check if a key exists in our `indexedDB` store\n * @returns An RxJS `Observable` telling if the key exists or not\n */\n has(key: string): Observable<boolean> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Check if the key exists in the store\n * Fixes https://github.com/cyrilletuzi/angular-async-local-storage/issues/69\n */\n const request = store.getKey(key);\n\n /* Listen to events and return `true` or `false` */\n return events.pipe(map(() => (request.result !== undefined) ? true : false));\n\n }),\n /* The observable will complete */\n first(),\n );\n\n }\n\n /**\n * Connects to `indexedDB` and creates the object store on first time\n */\n protected connect(): void {\n\n let request: IDBOpenDBRequest;\n\n /* Connect to `indexedDB`\n * Will fail in Safari cross-origin iframes\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42} */\n try {\n\n /* Do NOT explicit `window` here, as `indexedDB` could be used from a web worker too */\n request = indexedDB.open(this.dbName, this.dbVersion);\n\n } catch {\n\n this.database.error(new IDBBrokenError());\n\n return;\n\n }\n\n /* Create store on first connection */\n this.createStore(request);\n\n /* Listen to success and error events */\n const success$ = fromEvent(request, \"success\");\n const error$ = this.listenError(request);\n\n /* Choose the first to occur */\n race([success$, error$])\n /* The observable will complete */\n .pipe(first())\n .subscribe({\n next: () => {\n /* Register the database connection in the `ReplaySubject` for further access */\n this.database.next(request.result);\n },\n error: () => {\n /* Firefox private mode issue: fallback storage if IndexedDb connection is failing\n * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/26} */\n this.database.error(new IDBBrokenError());\n },\n });\n\n }\n\n /**\n * Create store on first use of `indexedDB`\n * @param request `indexedDB` database opening request\n */\n protected createStore(request: IDBOpenDBRequest): void {\n\n /* Listen to the event fired on first connection */\n fromEvent(request, \"upgradeneeded\")\n /* The observable will complete */\n .pipe(first())\n .subscribe({\n next: () => {\n\n /* Check if the store already exists, to avoid error */\n if (!request.result.objectStoreNames.contains(this.storeName)) {\n\n /* Create the object store */\n request.result.createObjectStore(this.storeName);\n\n }\n\n }\n });\n\n }\n\n /**\n * Open an `indexedDB` transaction and get our store\n * @param mode `readonly` or `readwrite`\n * @returns An `indexedDB` transaction store and events, wrapped in an RxJS `Observable`\n */\n protected transaction(mode: IDBTransactionMode): Observable<{\n store: IDBObjectStore;\n events: Observable<Event>;\n }> {\n\n /* From the `indexedDB` connection, open a transaction and get the store */\n return this.database\n .pipe(mergeMap((database) => {\n\n let transaction: IDBTransaction;\n\n try {\n\n transaction = database.transaction([this.storeName], mode);\n\n } catch (error) {\n\n /* The store could have been deleted from outside */\n return throwError(() => error as DOMException);\n\n }\n\n /* Get the store from the transaction */\n const store = transaction.objectStore(this.storeName);\n\n /* Listen transaction `complete` and `error` events */\n const events = this.listenTransactionEvents(transaction);\n\n return of({ store, events });\n\n }));\n\n }\n\n /**\n * Listen errors on a transaction or request, and throw if trigerred\n * @param transactionOrRequest `indexedDb` transaction or request to listen\n * @returns An `Observable` listening to errors\n */\n protected listenError(transactionOrRequest: IDBTransaction | IDBRequest): Observable<never> {\n\n return fromEvent(transactionOrRequest, \"error\").pipe(\n /* Throw on error to be able to catch errors in RxJS way.\n * Here `event.target` must be used, as `transactionOrRequest.error` will be `null`\n * if we are on the request and the error is only triggered later by the transaction */\n mergeMap((event) => throwError(() => (event.target as IDBTransaction | IDBRequest | null)?.error)),\n );\n\n }\n\n /**\n * Listen transaction `complete` and `error` events\n * @param transaction Transaction to listen\n * @returns An `Observable` listening to transaction `complete` and `error` events\n */\n protected listenTransactionEvents(transaction: IDBTransaction): Observable<Event> {\n\n /* Listen to the `complete` event */\n const complete$ = fromEvent(transaction, \"complete\");\n\n /* Listen to the `error` event */\n const error$ = this.listenError(transaction);\n\n /* Choose the first event to occur */\n return race([complete$, error$]);\n\n }\n\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { Observable, asyncScheduler, of, throwError } from \"rxjs\";\nimport { observeOn } from \"rxjs/operators\";\nimport { LS_PREFIX } from \"../tokens\";\nimport { SerializationError } from \"./exceptions\";\nimport { LocalDatabase } from \"./local-database\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class LocalStorageDatabase implements LocalDatabase {\n\n /**\n * Optional user prefix to avoid collision for multiple apps on the same subdomain\n */\n readonly prefix: string;\n\n constructor() {\n\n /* Prefix if asked, or no prefix otherwise */\n this.prefix = inject(LS_PREFIX) || \"\";\n\n }\n\n /**\n * Number of items in `localStorage`\n */\n get size(): Observable<number> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(localStorage.length);\n\n }\n\n /**\n * Gets an item value in `localStorage`\n * @param key The item's key\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in a RxJS `Observable`\n */\n get(key: string): Observable<unknown | undefined> {\n\n /* Get raw data */\n const unparsedData = localStorage.getItem(this.prefixKey(key));\n\n let parsedData: unknown;\n\n /* No need to parse if data is `null` or `undefined` */\n if ((unparsedData !== undefined) && (unparsedData !== null)) {\n\n /* Try to parse */\n try {\n parsedData = JSON.parse(unparsedData);\n } catch (error) {\n return throwError(() => error as SyntaxError);\n }\n\n }\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(parsedData);\n\n }\n\n /**\n * Store an item in `localStorage`\n * @param key The item's key\n * @param data The item's value\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n set(key: string, data: unknown): Observable<undefined> {\n\n let serializedData: string | null = null;\n\n /* Check if data can be serialized */\n const dataPrototype: unknown = Object.getPrototypeOf(data);\n if ((typeof data === \"object\") && (data !== null) && !Array.isArray(data) &&\n !((dataPrototype === Object.prototype) || (dataPrototype === null))) {\n return throwError(() => new SerializationError());\n }\n\n /* Try to stringify (can fail on circular references) */\n try {\n serializedData = JSON.stringify(data);\n } catch (error) {\n return throwError(() => error as TypeError);\n }\n\n /* Can fail if storage quota is exceeded */\n try {\n localStorage.setItem(this.prefixKey(key), serializedData);\n } catch (error) {\n return throwError(() => error as DOMException);\n }\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes an item in `localStorage`\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n delete(key: string): Observable<undefined> {\n\n localStorage.removeItem(this.prefixKey(key));\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes all items in `localStorage`\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n clear(): Observable<undefined> {\n\n localStorage.clear();\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Get all keys in `localStorage`\n * Note the order of the keys may be inconsistent in Firefox\n * @returns A RxJS `Observable` iterating on keys\n */\n keys(): Observable<string> {\n\n /* Create an `Observable` from keys */\n return new Observable<string>((subscriber) => {\n\n /* Iteretate over all the indexes */\n for (let index = 0; index < localStorage.length; index += 1) {\n\n /* Cast as we are sure in this case the key is not `null` */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n subscriber.next(this.getUnprefixedKey(index)!);\n\n }\n\n subscriber.complete();\n\n }).pipe(\n /* Required to work like other databases which are asynchronous */\n observeOn(asyncScheduler),\n );\n\n }\n\n /**\n * Check if a key exists in `localStorage`\n * @param key The item's key\n * @returns A RxJS `Observable` telling if the key exists or not\n */\n has(key: string): Observable<boolean> {\n\n /* Itérate over all indexes in storage */\n for (let index = 0; index < localStorage.length; index += 1) {\n\n if (key === this.getUnprefixedKey(index)) {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(true);\n\n }\n\n }\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(false);\n\n }\n\n /**\n * Get an unprefixed key\n * @param index Index of the key\n * @returns The unprefixed key name if exists, `null` otherwise\n */\n protected getUnprefixedKey(index: number): string | null {\n\n /* Get the key in storage: may have a prefix */\n const prefixedKey = localStorage.key(index);\n\n if (prefixedKey !== null) {\n\n /* If no prefix, the key is already good, otherwrite strip the prefix */\n return !this.prefix ? prefixedKey : prefixedKey.substring(this.prefix.length);\n\n }\n\n return null;\n\n }\n\n /**\n * Add the prefix to a key\n * @param key The key name\n * @returns The prefixed key name\n */\n protected prefixKey(key: string): string {\n\n return `${this.prefix}${key}`;\n\n }\n\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable, from, of } from \"rxjs\";\nimport { LocalDatabase } from \"./local-database\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class MemoryDatabase implements LocalDatabase {\n\n /**\n * Memory storage\n */\n protected readonly memoryStorage = new Map<string, unknown>();\n\n /**\n * Number of items in memory\n */\n get size(): Observable<number> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(this.memoryStorage.size);\n\n }\n\n /**\n * Gets an item value in memory\n * @param key The item's key\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in a RxJS `Observable`\n */\n get(key: string): Observable<unknown | undefined> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(this.memoryStorage.get(key));\n\n }\n\n /**\n * Sets an item in memory\n * @param key The item's key\n * @param data The item's value\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n set(key: string, data: unknown): Observable<undefined> {\n\n this.memoryStorage.set(key, data);\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes an item in memory\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n delete(key: string): Observable<undefined> {\n\n this.memoryStorage.delete(key);\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes all items in memory\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n clear(): Observable<undefined> {\n\n this.memoryStorage.clear();\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Get all keys in memory\n * @returns A RxJS `Observable` iterating on keys\n */\n keys(): Observable<string> {\n\n /* Create an `Observable` from keys */\n return from(this.memoryStorage.keys());\n\n }\n\n /**\n * Check if a key exists in memory\n * @param key Key name\n * @returns a RxJS `Observable` telling if the key exists or not\n */\n has(key: string): Observable<boolean> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(this.memoryStorage.has(key));\n\n }\n\n}\n","import { isPlatformBrowser } from \"@angular/common\";\nimport { inject, Injectable, PLATFORM_ID } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { IndexedDBDatabase } from \"./indexeddb-database\";\nimport { LocalStorageDatabase } from \"./localstorage-database\";\nimport { MemoryDatabase } from \"./memory-database\";\n\n/**\n * Factory to create a storage according to browser support\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/BROWSERS_SUPPORT.md}\n */\nexport function localDatabaseFactory(): LocalDatabase {\n\n const platformId = inject(PLATFORM_ID);\n\n /* When storage is fully disabled in browser (via the \"Block all cookies\" option),\n * just trying to check `indexedDB` or `localStorage` variables causes a security exception.\n * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118\n */\n try {\n\n // Do not explicit `window` here, as the global object is not the same in web workers\n if (isPlatformBrowser(platformId) && (indexedDB !== undefined) && (indexedDB !== null) && (\"open\" in indexedDB)) {\n\n /* Check:\n * - if we are in a browser context (issue: server-side rendering)\n * - it could exist but be `undefined` or `null`\n * - it could exists but not having a working API\n * Will be the case for:\n * - All other browsers in normal mode\n * - Chromium / Safari private mode, but in this case, data will be swiped when the user leaves the app */\n return new IndexedDBDatabase();\n\n } else if (isPlatformBrowser(platformId)\n && (localStorage !== undefined) && (localStorage !== null) && (\"getItem\" in localStorage)) {\n\n /* Check:\n * - if we are in a browser context (issue: server-side rendering)\n * - if `localStorage` exists (to be sure)\n * - it could exists but not having a working API\n * Will be the case for:\n * - Safari cross-origin iframes, detected later in `IndexedDBDatabase.connect()`\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42}\n * - Firefox private mode, but in this case, data will be swiped when the user leaves the app\n * For Firefox, can only be detected later in `IndexedDBDatabase.connect()`\n * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}\n */\n return new LocalStorageDatabase();\n\n }\n\n } catch {\n // Nothing to do\n }\n\n /* Will be the case for:\n * - In browsers if storage has been fully disabled (via the \"Block all cookies\" option)\n * - Server-side rendering\n * - All other non-browser context\n */\n return new MemoryDatabase();\n\n}\n\n@Injectable({\n providedIn: \"root\",\n useFactory: localDatabaseFactory,\n})\nexport abstract class LocalDatabase {\n\n abstract readonly size: Observable<number>;\n\n abstract get(key: string): Observable<unknown | undefined>;\n abstract set(key: string, data: unknown): Observable<undefined>;\n abstract delete(key: string): Observable<undefined>;\n abstract clear(): Observable<undefined>;\n abstract keys(): Observable<string>;\n abstract has(key: string): Observable<boolean>;\n\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\nimport { IDB_DB_NAME, IDB_DB_VERSION, IDB_STORE_NAME, LS_PREFIX } from \"./tokens\";\n\n/**\n * Allows to add a prefix before `localStorage` keys.\n * *Use only* for interoperability with other APIs or to avoid collision for multiple apps on the same subdomain.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideLocalStoragePrefix('custom_')]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideLocalStoragePrefix('custom_')]\n * })\n * export class AppModule\n */\nexport function provideLocalStoragePrefix(prefix: string): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: LS_PREFIX, useValue: prefix }]);\n\n}\n\n/**\n * Allows to change the name used for `indexedDB` database.\n * *Use only* for interoperability with other APIs or to avoid collision for multiple apps on the same subdomain.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideIndexedDBDataBaseName('custom')]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideIndexedDBDataBaseName('custom')]\n * })\n * export class AppModule\n */\nexport function provideIndexedDBDataBaseName(name: string): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: IDB_DB_NAME, useValue: name }]);\n\n}\n\n/**\n * Allows to change the database version used for `indexedDB` database.\n * Must be an unsigned **integer**.\n * **Use with caution as the creation of the store depends on the version.**\n * *Use only* for interoperability with other APIs or to avoid collision for multiple apps on the same subdomain.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideIndexedDBDataBaseVersion(2)]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideIndexedDBDataBaseVersion(2)]\n * })\n * export class AppModule\n */\nexport function provideIndexedDBDataBaseVersion(version: number): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: IDB_DB_VERSION, useValue: version }]);\n\n}\n\n/**\n * Allows to change the name used for `indexedDB` object store.\n * *Use only* for interoperability with other APIs.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideIndexedDBStoreName('custom')]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideIndexedDBStoreName('custom')]\n * })\n * export class AppModule\n */\nexport function provideIndexedDBStoreName(name: string): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: IDB_STORE_NAME, useValue: name }]);\n\n}\n","import { ModuleWithProviders, NgModule } from \"@angular/core\";\nimport { IDB_DB_NAME, IDB_DB_VERSION, IDB_NO_WRAP, IDB_STORE_NAME, LS_PREFIX, StorageConfig } from \"./tokens\";\n\n/**\n * This module is only here for backward compatibility, do not add it by yourself\n */\n@NgModule()\nexport class StorageModule {\n\n /**\n * Only useful to provide options, otherwise it does nothing.\n * **Must be used at initialization, ie. in `AppModule`, and must not be loaded again in another module.**\n * \n */\n static forRoot(config: StorageConfig): ModuleWithProviders<StorageModule> {\n return {\n ngModule: StorageModule,\n providers: [\n config.LSPrefix ? { provide: LS_PREFIX, useValue: config.LSPrefix } : [],\n config.IDBDBName ? { provide: IDB_DB_NAME, useValue: config.IDBDBName } : [],\n config.IDBStoreName ? { provide: IDB_STORE_NAME, useValue: config.IDBStoreName } : [],\n config.IDBDBVersion ? { provide: IDB_DB_VERSION, useValue: config.IDBDBVersion } : [],\n (config.IDBNoWrap === false) ? { provide: IDB_NO_WRAP, useValue: config.IDBNoWrap } : [],\n ],\n };\n }\n\n}\n","/**\n * Exception message when a value is not valid against the JSON schema\n */\nexport const VALIDATION_ERROR = `Data stored is not valid against the provided JSON schema.\nCheck your JSON schema, otherwise it means data has been corrupted.`;\n\n/**\n * Exception raised when a value is not valid against the JSON schema\n */\nexport class ValidationError extends Error {\n override message = VALIDATION_ERROR;\n}\n","import { Injectable } from \"@angular/core\";\nimport {\n JSONSchema,\n JSONSchemaArray,\n JSONSchemaBoolean,\n JSONSchemaInteger, JSONSchemaNumber,\n JSONSchemaObject,\n JSONSchemaString,\n JSONSchemaTuple\n} from \"./json-schema\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class JSONValidator {\n\n /**\n * Validate a JSON data against a Jsubset of the JSON Schema standard.\n * Types are enforced to validate everything: each schema must\n * @param data JSON data to validate\n * @param schema Subset of JSON Schema. Must have a `type`.\n * @returns If data is valid: `true`, if it is invalid: `false`\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md}\n */\n validate(data: unknown, schema: JSONSchema): boolean {\n\n switch (schema.type) {\n\n case \"string\":\n return this.validateString(data, schema);\n case \"number\":\n case \"integer\":\n return this.validateNumber(data, schema);\n case \"boolean\":\n return this.validateBoolean(data, schema);\n case \"array\":\n return this.validateArray(data, schema);\n case \"object\":\n return this.validateObject(data, schema);\n\n }\n\n }\n\n /**\n * Validate a string\n * @param data Data to validate\n * @param schema Schema describing the string\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateString(data: unknown, schema: JSONSchemaString): boolean {\n\n if (typeof data !== \"string\") {\n return false;\n }\n\n if (!this.validateConst(data, schema)) {\n return false;\n }\n\n if (!this.validateEnum(data, schema)) {\n return false;\n }\n\n if ((schema.maxLength !== undefined) && (data.length > schema.maxLength)) {\n return false;\n }\n\n if ((schema.minLength !== undefined) && (data.length < schema.minLength)) {\n return false;\n }\n\n if (schema.pattern) {\n\n let regularExpression: RegExp | null = null;\n\n try {\n regularExpression = new RegExp(schema.pattern);\n } catch {\n // Nothing to do\n }\n\n if (regularExpression && !regularExpression.test(data)) {\n return false;\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate a number or an integer\n * @param data Data to validate\n * @param schema Schema describing the number or integer\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateNumber(data: unknown, schema: JSONSchemaNumber | JSONSchemaInteger): boolean {\n\n if (typeof data !== \"number\") {\n return false;\n }\n\n if ((schema.type === \"integer\") && !Number.isInteger(data)) {\n return false;\n }\n\n if (!this.validateConst(data, schema)) {\n return false;\n }\n\n if (!this.validateEnum(data, schema)) {\n return false;\n }\n\n /* Test is done this way to not divide by 0 */\n if (schema.multipleOf && !Number.isInteger(data / schema.multipleOf)) {\n return false;\n }\n\n if ((schema.maximum !== undefined) && (data > schema.maximum)) {\n return false;\n }\n\n if ((schema.exclusiveMaximum !== undefined) && (data >= schema.exclusiveMaximum)) {\n return false;\n\n }\n\n if ((schema.minimum !== undefined) && (data < schema.minimum)) {\n return false;\n\n }\n\n if ((schema.exclusiveMinimum !== undefined) && (data <= schema.exclusiveMinimum)) {\n return false;\n }\n\n return true;\n\n }\n\n /**\n * Validate a boolean\n * @param data Data to validate\n * @param schema Schema describing the boolean\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateBoolean(data: unknown, schema: JSONSchemaBoolean): boolean {\n\n if (typeof data !== \"boolean\") {\n return false;\n }\n\n if (!this.validateConst(data, schema)) {\n return false;\n }\n\n return true;\n\n }\n\n /**\n * Validate an array\n * @param data Data to validate\n * @param schema Schema describing the array\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateArray(data: unknown, schema: JSONSchemaArray | JSONSchemaTuple): boolean {\n\n if (!Array.isArray(data)) {\n return false;\n }\n\n if ((schema.maxItems !== undefined) && (data.length > schema.maxItems)) {\n return false;\n }\n\n if ((schema.minItems !== undefined) && (data.length < schema.minItems)) {\n return false;\n }\n\n if (schema.uniqueItems) {\n\n /* Create a set to eliminate values with multiple occurences */\n const dataSet = new Set(data);\n\n if (data.length !== dataSet.size) {\n return false;\n }\n\n }\n\n /* Specific test for tuples */\n if (Array.isArray(schema.items) || schema.items === undefined) {\n\n // TODO: cast should not be needed here\n return this.validateTuple(data, schema.items as JSONSchema[] | undefined);\n\n }\n\n /* Validate all the values in array */\n for (const value of data) {\n\n // TODO: remove when TypeScript 4.1 is available\n // (currently the narrowed type from `Array.isArray()` is lost on readonly arrays)\n if (!this.validate(value, schema.items as JSONSchema)) {\n return false;\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate a tuple (array with fixed length and multiple types)\n * @param data Data to validate\n * @param schemas Schemas describing the tuple\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateTuple(data: unknown[], schemas: JSONSchema[] | undefined): boolean {\n\n const lengthToCheck = schemas ? schemas.length : 0;\n\n /* Tuples have a fixed length */\n if (data.length !== lengthToCheck) {\n\n return false;\n\n }\n\n if (schemas) {\n\n for (let i = 0; i < schemas.length; i += 1) {\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (!this.validate(data[i], schemas[i]!)) {\n return false;\n }\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate an object\n * @param data Data to validate\n * @param schema JSON schema describing the object\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateObject(data: unknown, schema: JSONSchemaObject): boolean {\n\n /* Check the type and if not `null` as `null` also have the type `object` in old browsers */\n if ((typeof data !== \"object\") || (data === null)) {\n return false;\n }\n\n /* Check if the object doesn't have more properties than expected\n * Equivalent of `additionalProperties: false`\n */\n if (Object.keys(schema.properties).length < Object.keys(data).length) {\n return false;\n }\n\n /* Validate required properties */\n if (schema.required) {\n\n for (const requiredProp of schema.required) {\n\n if (!Object.prototype.hasOwnProperty.call(data, requiredProp)) {\n return false;\n }\n\n }\n\n }\n\n /* Recursively validate all properties */\n for (const property in schema.properties) {\n\n /* Filter to keep only real properties (no internal JS stuff) and check if the data has the property too */\n if (Object.prototype.hasOwnProperty.call(schema.properties, property) && Object.prototype.hasOwnProperty.call(data, property)) {\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (!this.validate((data as Record<string, unknown>)[property], schema.properties[property]!)) {\n return false;\n }\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate a constant\n * @param data Data ta validate\n * @param schema JSON schema describing the constant\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateConst(data: unknown, schema: JSONSchemaBoolean | JSONSchemaInteger | JSONSchemaNumber | JSONSchemaString): boolean {\n\n if (!schema.const) {\n return true;\n }\n\n return (data === schema.const);\n\n }\n\n /**\n * Validate an enum\n * @param data Data ta validate\n * @param schema JSON schema describing the enum\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateEnum(data: unknown, schema: JSONSchemaInteger | JSONSchemaNumber | JSONSchemaString): boolean {\n\n if (!schema.enum) {\n return true;\n }\n\n /* Cast as the data can be of multiple types, and so TypeScript is lost */\n return ((schema.enum as unknown[]).includes(data));\n\n }\n\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable, OperatorFunction, ReplaySubject, of, throwError } from \"rxjs\";\nimport { catchError, mergeMap, tap } from \"rxjs/operators\";\nimport { IDB_BROKEN_ERROR } from \"../databases/exceptions\";\nimport { IndexedDBDatabase } from \"../databases/indexeddb-database\";\nimport { LocalDatabase } from \"../databases/local-database\";\nimport { LocalStorageDatabase } from \"../databases/localstorage-database\";\nimport { MemoryDatabase } from \"../databases/memory-database\";\nimport {\n JSONSchema,\n JSONSchemaArrayOf,\n JSONSchemaBoolean, JSONSchemaInteger,\n JSONSchemaNumber, JSONSchemaString\n} from \"../validation/json-schema\";\nimport { JSONValidator } from \"../validation/json-validator\";\nimport { ValidationError } from \"./exceptions\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class StorageMap {\n\n protected readonly notifiers = new Map<string, ReplaySubject<unknown>>();\n\n /**\n * Constructor params are provided by Angular (but can also be passed manually in tests)\n * @param database Storage to use\n * @param jsonValidator Validator service\n * @param LSPrefix Prefix for `localStorage` keys to avoid collision for multiple apps on the same subdomain or for interoperability\n */\n constructor(\n protected database: LocalDatabase,\n protected readonly jsonValidator: JSONValidator = new JSONValidator(),\n ) {}\n\n /**\n * **Number of items** in storage, wrapped in an `Observable`.\n *\n * @example\n * this.storageMap.size.subscribe((size) => {\n * console.log(size);\n * });\n */\n get size(): Observable<number> {\n\n return this.database.size\n /* Catch if `indexedDb` is broken */\n .pipe(this.catchIDBBroken(() => this.database.size));\n\n }\n\n /**\n * Tells you which storage engine is used. *Only useful for interoperability.*\n * Note that due to some browsers issues in some special contexts\n * (Firefox private mode and Safari cross-origin iframes),\n * **this information may be wrong at initialization,**\n * as the storage could fallback from `indexedDB` to `localStorage`\n * only after a first read or write operation.\n * @returns Storage engine used\n *\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}\n *\n * @example\n * if (this.storageMap.backingEngine === 'indexedDB') {}\n */\n get backingEngine(): \"indexedDB\" | \"localStorage\" | \"memory\" | \"unknown\" {\n\n if (this.database instanceof IndexedDBDatabase) {\n\n return \"indexedDB\";\n\n } else if (this.database instanceof LocalStorageDatabase) {\n\n return \"localStorage\";\n\n } else if (this.database instanceof MemoryDatabase) {\n\n return \"memory\";\n\n } else {\n\n return \"unknown\";\n\n }\n\n }\n\n /**\n * Info about `indexedDB` database. *Only useful for interoperability.*\n * @returns `indexedDB` database name, store name and database version.\n * **Values will be empty if the storage is not `indexedDB`,**\n * **so it should be used after an engine check**.\n *\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}\n *\n * @example\n * if (this.storageMap.backingEngine === 'indexedDB') {\n * const { database, store, version } = this.storageMap.backingStore;\n * }\n */\n get backingStore(): { database: string, store: string, version: number; } {\n\n return (this.database instanceof IndexedDBDatabase) ?\n this.database.backingStore :\n { database: \"\", store: \"\", version: 0 };\n\n }\n\n /**\n * Info about `localStorage` fallback storage. *Only useful for interoperability.*\n * @returns `localStorage` prefix.\n * **Values will be empty if the storage is not `localStorage`,**\n * **so it should be used after an engine check**.\n *\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}\n *\n * @example\n * if (this.storageMap.backingEngine === 'localStorage') {\n * const { prefix } = this.storageMap.fallbackBackingStore;\n * }\n */\n get fallbackBackingStore(): { prefix: string; } {\n\n return (this.database instanceof LocalStorageDatabase) ?\n { prefix: this.database.prefix } :\n { prefix: \"\" };\n\n }\n\n /**\n * Get an item value in storage.\n * The signature has many overloads due to validation, **please refer to the documentation.**\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md}\n * @param key The item's key\n * @param schema Optional JSON schema to validate the data\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in a RxJS `Observable`\n *\n * @example\n * this.storageMap.get('key', { type: 'string' }).subscribe((result) => {\n * result; // string or undefined\n * });\n *\n * @example\n * interface User {\n * firstName: string;\n * lastName?: string;\n * }\n *\n * const schema = {\n * type: 'object',\n * properties: {\n * firstName: { type: 'string' },\n * lastName: { type: 'string' },\n * },\n * required: ['firstName']\n * };\n *\n * this.storageMap.get<User>('user', schema).subscribe((user) => {\n * if (user) {\n * user.firstName;\n * }\n * });\n */\n get(key: string): Observable<unknown>;\n get<T extends string = string>(key: string, schema: JSONSchemaString): Observable<T | undefined>;\n get<T extends number = number>(key: string, schema: JSONSchemaInteger | JSONSchemaNumber): Observable<T | undefined>;\n get<T extends boolean = boolean>(key: string, schema: JSONSchemaBoolean): Observable<T | undefined>;\n get<T extends readonly string[] = string[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaString>): Observable<T | undefined>;\n get<T extends readonly number[] = number[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaInteger | JSONSchemaNumber>): Observable<T | undefined>; // eslint-disable-line max-len\n get<T extends readonly boolean[] = boolean[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaBoolean>): Observable<T | undefined>;\n get<T>(key: string, schema: JSONSchema): Observable<T | undefined>;\n get<T = unknown>(key: string, schema?: JSONSchema): Observable<unknown> {\n\n /* Get the data in storage */\n return this.database.get(key).pipe(\n /* Check if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.get(key)),\n mergeMap((data) => {\n\n /* No need to validate if the data is empty */\n if ((data === undefined) || (data === null)) {\n\n return of(undefined);\n\n } else if (schema) {\n\n /* Validate data against a JSON schema if provided */\n if (!this.jsonValidator.validate(data, schema)) {\n return throwError(() => new ValidationError());\n }\n\n /* Data have been checked, so it's OK to cast */\n return of(data as T | undefined);\n\n }\n\n /* Cast to unknown as the data wasn't checked */\n return of(data);\n\n }),\n );\n\n }\n\n /**\n * Set an item in storage.\n * Note that setting `null` or `undefined` will remove the item to avoid some browsers issues.\n * @param key The item's key\n * @param data The item's value\n * @param schema Optional JSON schema to validate the data\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.storageMap.set('key', 'value').subscribe(() => {});\n */\n set(key: string, data: unknown, schema?: JSONSchema): Observable<undefined> {\n\n /* Storing `undefined` or `null` is useless and can cause issues in `indexedDb` in some browsers,\n * so removing item instead for all storages to have a consistent API */\n if ((data === undefined) || (data === null)) {\n return this.delete(key);\n }\n\n /* Validate data against a JSON schema if provided */\n if (schema && !this.jsonValidator.validate(data, schema)) {\n return throwError(() => new ValidationError());\n }\n\n return this.database.set(key, data).pipe(\n /* Catch if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.set(key, data)),\n /* Notify watchers (must be last because it should only happen if the operation succeeds) */\n tap(() => { this.notify(key, data); }),\n );\n }\n\n /**\n * Delete an item in storage\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.storageMap.delete('key').subscribe(() => {});\n */\n delete(key: string): Observable<undefined> {\n\n return this.database.delete(key).pipe(\n /* Catch if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.delete(key)),\n /* Notify watchers (must be last because it should only happen if the operation succeeds) */\n tap(() => { this.notify(key, undefined); }),\n );\n\n }\n\n /**\n * Delete all items in storage\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.storageMap.clear().subscribe(() => {});\n */\n clear(): Observable<undefined> {\n\n return this.database.clear().pipe(\n /* Catch if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.clear()),\n /* Notify watchers (must be last because it should only happen if the operation succeeds) */\n tap(() => {\n for (const key of this.notifiers.keys()) {\n this.notify(key, undefined);\n }\n }),\n );\n\n }\n\n /**\n * Get all keys stored in storage. Note **this is an *iterating* `Observable`**:\n * * if there is no key, the `next` callback will not be invoked,\n * * if you need to wait the whole operation to end, be sure to act in the `complete` callback,\n * as this `Observable` can emit several values and so will invoke the `next` callback several times.\n * @returns A list of the keys wrapped in a RxJS `Observable`\n *\n * @example\n * this.storageMap.keys().subscribe({\n * next: (key) => { console.log(key); },\n * complete: () => { console.log('Done'); },\n * });\n */\n keys(): Observable<string> {\n\n return this.database.keys()\n /* Catch if `indexedDb` is broken */\n .pipe(this.catchIDBBroken(() => this.database.keys()));\n\n }\n\n /**\n * Tells if a key exists in storage\n * @returns A RxJS `Observable` telling if the key exists\n *\n * @example\n * this.storageMap.has('key').subscribe((hasKey) => {\n * if (hasKey) {}\n * });\n */\n has(key: string): Observable<boolean> {\n\n return this.database.has(key)\n /* Catch if `indexedDb` is broken */\n .pipe(this.catchIDBBroken(() => this.database.has(key)));\n\n }\n\n /**\n * Watch an item value in storage.\n * **Note only changes done via this lib will be watched**, external changes in storage can't be detected.\n * The signature has many overloads due to validation, **please refer to the documentation.**\n * @see https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md\n * @param key The item's key to watch\n * @param schema Optional JSON schema to validate the initial value\n * @returns An infinite `Observable` giving the current value\n */\n watch(key: string): Observable<unknown>;\n watch<T extends string = string>(key: string, schema: JSONSchemaString): Observable<T | undefined>;\n watch<T extends number = number>(key: string, schema: JSONSchemaInteger | JSONSchemaNumber): Observable<T | undefined>;\n watch<T extends boolean = boolean>(key: string, schema: JSONSchemaBoolean): Observable<T | undefined>;\n watch<T extends readonly string[] = string[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaString>): Observable<T | undefined>;\n watch<T extends readonly number[] = number[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaInteger | JSONSchemaNumber>): Observable<T | undefined>; // eslint-disable-line max-len\n watch<T extends readonly boolean[] = boolean[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaBoolean>): Observable<T | undefined>;\n watch<T>(key: string, schema: JSONSchema): Observable<T | undefined>;\n watch<T = unknown>(key: string, schema?: JSONSchema): Observable<unknown> {\n\n /* Check if there is already a notifier */\n if (!this.notifiers.has(key)) {\n this.notifiers.set(key, new ReplaySubject(1));\n }\n\n /* Non-null assertion is required because TypeScript doesn't narrow `.has()` yet */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const notifier = this.notifiers.get(key)!;\n\n /* Get the current item value */\n (schema ? this.get<T>(key, schema) : this.get(key)).subscribe({\n next: (result) => notifier.next(result),\n error: (error) => notifier.error(error),\n });\n\n /* Only the public API of the `Observable` should be returned */\n return (schema ?\n notifier.asObservable() as Observable<T | undefined> :\n notifier.asObservable()\n );\n\n }\n\n /**\n * Notify when a value changes\n * @param key The item's key\n * @param data The new value\n */\n protected notify(key: string, value: unknown): void {\n\n const notifier = this.notifiers.get(key);\n\n if (notifier) {\n notifier.next(value);\n }\n\n }\n\n /**\n * RxJS operator to catch if `indexedDB` is broken\n * @param operationCallback Callback with the operation to redo\n */\n protected catchIDBBroken<T>(operationCallback: () => Observable<T>): OperatorFunction<T, T> {\n\n return catchError((error) => {\n\n /* Check if `indexedDB` is broken based on error message (the specific error class seems to be lost in the process) */\n if ((error !== undefined) && (error !== null)\n && (typeof error === \"object\") && (\"message\" in error)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n && (error.message === IDB_BROKEN_ERROR)) {\n\n /* When storage is fully disabled in browser (via the \"Block all cookies\" option),\n * just trying to check `localStorage` variable causes a security exception.\n * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118\n */\n try {\n\n if (\"getItem\" in localStorage) {\n\n /* Fallback to `localStorage` if available */\n this.database = new LocalStorageDatabase();\n\n } else {\n\n /* Fallback to memory storage otherwise */\n this.database = new MemoryDatabase();\n\n }\n\n } catch {\n\n /* Fallback to memory storage otherwise */\n this.database = new MemoryDatabase();\n\n }\n\n /* Redo the operation */\n return operationCallback();\n\n } else {\n\n /* Otherwise, rethrow the error */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return throwError(() => error);\n\n }\n\n });\n\n }\n\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\nimport {\n JSONSchema,\n JSONSchemaArrayOf,\n JSONSchemaBoolean, JSONSchemaInteger,\n JSONSchemaNumber, JSONSchemaString\n} from \"../validation/json-schema\";\nimport { StorageMap } from \"./storage-map.service\";\n\n/**\n * @deprecated Will be removed in v17\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/MIGRATION_TO_V16.md}\n */\n@Injectable({\n providedIn: \"root\"\n})\nexport class LocalStorage {\n\n /**\n * Number of items in storage wrapped in an `Observable`\n *\n * @example\n * this.localStorage.length.subscribe((length) => {\n * console.log(length);\n * });\n */\n get length(): Observable<number> {\n\n return this.storageMap.size;\n\n }\n\n /* Use the `StorageMap` service to avoid code duplication */\n constructor(protected readonly storageMap: StorageMap) {}\n\n /**\n * Get an item value in storage.\n * The signature has many overloads due to validation, **please refer to the documentation.**\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md}\n * @param key The item's key\n * @param schema Optional JSON schema to validate the data.\n * **Note you must pass the schema directly as the second argument.**\n * **Passing the schema in an object `{ schema }` is deprecated and only here**\n * **for backward compatibility: it will be removed in a future version.**\n * @returns The item's value if the key exists, `null` otherwise, wrapped in a RxJS `Observable`\n *\n * @example\n * this.localStorage.get('key', { type: 'string' }).subscribe((result) => {\n * result; // string or null\n * });\n *\n * @example\n * interface User {\n * firstName: string;\n * lastName?: string;\n * }\n *\n * const schema = {\n * type: 'object',\n * properties: {\n * firstName: { type: 'string' },\n * lastName: { type: 'string' },\n * },\n * required: ['firstName']\n * };\n *\n * this.localStorage.get<User>('user', schema).subscribe((user) => {\n * if (user) {\n * user.firstName;\n * }\n * });\n */\n getItem<T = string>(key: string, schema: JSONSchemaString): Observable<string | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = number>(key: string, schema: JSONSchemaInteger | JSONSchemaNumber): Observable<number | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = boolean>(key: string, schema: JSONSchemaBoolean): Observable<boolean | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = string[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaString>): Observable<string[] | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = number[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaInteger | JSONSchemaNumber>): Observable<number[] | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = boolean[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaBoolean>): Observable<boolean[] | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = unknown>(key: string, schema: JSONSchema | { schema: JSONSchema; }): Observable<T | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = unknown>(key: string, schema?: JSONSchema): Observable<unknown>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = unknown>(key: string, schema?: JSONSchema | { schema: JSONSchema; } | undefined): Observable<unknown> {\n\n if (schema) {\n\n /* Backward compatibility with version <= 7 */\n schema = (\"schema\" in schema) ? schema.schema : schema;\n\n }\n\n return (schema ? this.storageMap.get<T>(key, schema) : this.storageMap.get(key)).pipe(\n /* Transform `undefined` into `null` to align with `localStorage` API */\n map((value) => (value !== undefined) ? value : null),\n );\n\n }\n\n /**\n * Set an item in storage.\n * Note that setting `null` or `undefined` will remove the item to avoid some browsers issues.\n * @param key The item's key\n * @param data The item's value\n * @param schema Optional JSON schema to validate the data\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.localStorage.set('key', 'value').subscribe(() => {});\n */\n setItem(key: string, data: unknown, schema?: JSONSchema): Observable<boolean> {\n\n return this.storageMap.set(key, data, schema).pipe(\n /* Transform `undefined` into `true` for backward compatibility with v7 */\n map(() => true),\n );\n\n }\n\n /**\n * Delete an item in storage\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.localStorage.delete('key').subscribe(() => {});\n */\n removeItem(key: string): Observable<boolean> {\n\n return this.storageMap.delete(key).pipe(\n /* Transform `undefined` into `true` for backward compatibility with v7 */\n map(() => true),\n );\n\n }\n\n /**\n * Delete all items in storage\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.localStorage.clear().subscribe(() => {});\n */\n clear(): Observable<boolean> {\n\n return this.storageMap.clear().pipe(\n /* Transform `undefined` into `true` for backward compatibility with v7 */\n map(() => true),\n );\n\n }\n\n}\n","/*\n * Public API Surface of local-storage\n */\n\nexport { SERIALIZATION_ERROR, SerializationError } from \"./lib/databases/exceptions\";\nexport { LocalDatabase } from \"./lib/databases/local-database\";\nexport {\n provideIndexedDBDataBaseName, provideIndexedDBDataBaseVersion,\n provideIndexedDBStoreName, provideLocalStoragePrefix\n} from \"./lib/providers\";\nexport { StorageModule } from \"./lib/storage.module\";\nexport { VALIDATION_ERROR, ValidationError } from \"./lib/storages/exceptions\";\nexport { LocalStorage } from \"./lib/storages/local-storage.service\";\nexport { StorageMap } from \"./lib/storages/storage-map.service\";\nexport { StorageConfig } from \"./lib/tokens\";\nexport {\n JSONSchema, JSONSchemaArray, JSONSchemaArrayOf, JSONSchemaBoolean, JSONSchemaInteger, JSONSchemaNumber, JSONSchemaObject, JSONSchemaString\n} from \"./lib/validation/json-schema\";\nexport { JSONValidator } from \"./lib/validation/json-validator\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LocalDatabase","i2.JSONValidator","i1.StorageMap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-pwa-local-storage.mjs","sources":["../../../../projects/ngx-pwa/local-storage/src/lib/databases/exceptions.ts","../../../../projects/ngx-pwa/local-storage/src/lib/tokens.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/indexeddb-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/localstorage-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/memory-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/databases/local-database.ts","../../../../projects/ngx-pwa/local-storage/src/lib/providers.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storage.module.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storages/exceptions.ts","../../../../projects/ngx-pwa/local-storage/src/lib/validation/json-validator.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storages/storage-map.service.ts","../../../../projects/ngx-pwa/local-storage/src/lib/storages/local-storage.service.ts","../../../../projects/ngx-pwa/local-storage/src/public-api.ts","../../../../projects/ngx-pwa/local-storage/src/ngx-pwa-local-storage.ts"],"sourcesContent":["/**\n * Exception message when `indexedDB` is not working\n */\nexport const IDB_BROKEN_ERROR = \"indexedDB is not working\";\n\n/**\n * Exception raised when `indexedDB` is not working\n */\nexport class IDBBrokenError extends Error {\n override message = IDB_BROKEN_ERROR;\n}\n\n/**\n * Exception message when a value can't be serialized for `localStorage`\n */\nexport const SERIALIZATION_ERROR = `The storage is currently localStorage,\nwhere data must be serialized, and the provided data can't be serialized.`;\n\n/**\n * Exception raised when a value can't be serialized for `localStorage`\n */\nexport class SerializationError extends Error {\n override message = SERIALIZATION_ERROR;\n}\n","import { InjectionToken } from \"@angular/core\";\n\n/**\n * Token to provide a prefix to `localStorage` keys.\n */\nexport const LS_PREFIX = new InjectionToken<string>(\"localStoragePrefix\", {\n providedIn: \"root\",\n factory: () => \"\"\n});\n\n/**\n * Default name used for `indexedDB` database.\n */\nexport const DEFAULT_IDB_DB_NAME = \"ngStorage\";\n\n/**\n * Token to provide `indexedDB` database name.\n */\nexport const IDB_DB_NAME = new InjectionToken<string>(\"localStorageIDBDBName\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_DB_NAME\n});\n\n/**\n * Default version used for `indexedDB` database.\n */\nexport const DEFAULT_IDB_DB_VERSION = 1;\n\n/**\n * Token to provide `indexedDB` database version.\n * Must be an unsigned **integer**.\n */\nexport const IDB_DB_VERSION = new InjectionToken<number>(\"localStorageIDBDBVersion\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_DB_VERSION\n});\n\n/**\n * Default name used for `indexedDB` object store.\n */\nexport const DEFAULT_IDB_STORE_NAME = \"localStorage\";\n\n/**\n * Token to provide `indexedDB` store name.\n * For backward compatibility, the default can't be set now, `IndexedDBDatabase` will do it at runtime.\n */\nexport const IDB_STORE_NAME = new InjectionToken<string>(\"localStorageIDBStoreName\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_STORE_NAME\n});\n\n/**\n * Default value for interoperability with native `indexedDB` and other storage libs,\n * by changing how values are stored in `indexedDB` database.\n */\nexport const DEFAULT_IDB_NO_WRAP = true;\n\n/**\n * Token to allow interoperability with native `indexedDB` and other storage libs,\n * by changing how values are stored in `indexedDB` database.\n * Defaults to `true`. Change to `false` for backward compatiblity in existing applications.\n * **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.\n */\nexport const IDB_NO_WRAP = new InjectionToken<boolean>(\"localStorageIDBWrap\", {\n providedIn: \"root\",\n factory: () => DEFAULT_IDB_NO_WRAP\n});\n\nexport interface StorageConfig {\n\n /**\n * @deprecated Use `provideLocalStoragePrefix()` method instead\n */\n LSPrefix?: string;\n\n /**\n * @deprecated Use `provideIndexedDBDataBaseName()` method instead\n */\n IDBDBName?: string;\n\n /**\n * @deprecated Use `provideIndexedDBStoreName()` method instead\n */\n IDBStoreName?: string;\n\n /**\n * @deprecated Use `provideIndexedDBDataBaseVersion()` method instead\n */\n IDBDBVersion?: number;\n\n /**\n * Allows interoperability with native `indexedDB` and other storage libs,\n * by changing how values are stored in `indexedDB` database.\n * Defaults to `true`. Change to `false` for backward compatiblity in existing applications.\n * **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.\n */\n IDBNoWrap?: boolean;\n\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { Observable, ReplaySubject, fromEvent, of, race, throwError } from \"rxjs\";\nimport { first, map, mergeMap, takeWhile, tap } from \"rxjs/operators\";\nimport { IDB_DB_NAME, IDB_DB_VERSION, IDB_NO_WRAP, IDB_STORE_NAME } from \"../tokens\";\nimport { IDBBrokenError } from \"./exceptions\";\nimport { LocalDatabase } from \"./local-database\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class IndexedDBDatabase implements LocalDatabase {\n\n /**\n * `indexedDB` database name\n */\n protected readonly dbName: string;\n\n /**\n * `indexedDB` object store name\n */\n protected readonly storeName: string;\n\n /**\n * `indexedDB` database version. Must be an unsigned **integer**\n */\n protected readonly dbVersion: number;\n\n /**\n * `indexedDB` database connection, wrapped in a RxJS `ReplaySubject` to be able to access the connection\n * even after the connection success event happened\n */\n protected readonly database = new ReplaySubject<IDBDatabase>(1);\n\n /**\n * Flag to not wrap `indexedDB` values for interoperability or to wrap for backward compatibility.\n */\n protected readonly noWrap: boolean;\n\n /**\n * Index used when wrapping value. *For backward compatibility only.*\n */\n protected readonly wrapIndex = \"value\";\n\n constructor() {\n\n this.dbName = inject(IDB_DB_NAME);\n this.storeName = inject(IDB_STORE_NAME);\n this.dbVersion = inject(IDB_DB_VERSION);\n this.noWrap = inject(IDB_NO_WRAP);\n\n /* Connect to `indexedDB`, with prefix if provided by the user */\n this.connect();\n\n }\n\n /**\n * Information about `indexedDB` connection. *Only useful for interoperability.*\n * @returns `indexedDB` database name, store name and database version\n */\n get backingStore(): { database: string, store: string, version: number; } {\n\n return {\n database: this.dbName,\n store: this.storeName,\n version: this.dbVersion,\n };\n\n }\n\n /**\n * Number of items in our `indexedDB` database and object store\n */\n get size(): Observable<number> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Request to know the number of items */\n const request = store.count();\n\n /* Return the result */\n return events.pipe(map(() => request.result));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Gets an item value in our `indexedDB` store\n * @param key The item's key\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in an RxJS `Observable`\n */\n get(key: string): Observable<unknown | undefined> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Request the value with the key provided by the user */\n const request = store.get(key);\n\n /* Listen events and return the result */\n return events.pipe(map((): unknown => {\n\n if ((request.result !== undefined) && (request.result !== null)) {\n\n /* Prior to v8, the value was wrapped in an `{ value: ...}` object */\n if (!this.noWrap && (typeof request.result === \"object\") && (this.wrapIndex in request.result) &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (request.result[this.wrapIndex] !== undefined) && (request.result[this.wrapIndex] !== null)) {\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return request.result[this.wrapIndex];\n\n } else {\n\n /* Cast to the wanted type */\n return request.result;\n\n }\n\n }\n\n /* Return `undefined` if the value is empty */\n return undefined;\n\n }));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Sets an item in our `indexedDB` store\n * @param key The item's key\n * @param data The item's value\n * @returns An RxJS `Observable` to wait the end of the operation\n */\n set(key: string, data: unknown): Observable<undefined> {\n\n /* Storing `undefined` in `indexedDb` can cause issues in some browsers so removing item instead */\n if (data === undefined) {\n return this.delete(key);\n }\n\n /* Open a transaction in write mode */\n return this.transaction(\"readwrite\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Prior to v8, data was wrapped in a `{ value: ... }` object */\n const dataToStore = this.noWrap ? data : { [this.wrapIndex]: data };\n\n /* Add if the item is not existing yet, or update otherwise */\n store.put(dataToStore, key);\n\n /* Listen to events and return `undefined` as no value is expected */\n return events.pipe(map(() => undefined));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Deletes an item in our `indexedDB` store\n * @param key The item's key\n * @returns An RxJS `Observable` to wait the end of the operation\n */\n delete(key: string): Observable<undefined> {\n\n /* Open a transaction in write mode */\n return this.transaction(\"readwrite\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Delete the item in store */\n store.delete(key);\n\n /* Listen to events and return `undefined` as no data is expected here */\n return events.pipe(map(() => undefined));\n\n }),\n /* The observable will complete after the first value */\n first(),\n );\n\n }\n\n /**\n * Deletes all items from our `indexedDB` objet store\n * @returns An RxJS `Observable` to wait the end of the operation\n */\n clear(): Observable<undefined> {\n\n /* Open a transaction in write mode */\n return this.transaction(\"readwrite\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Delete all items in object store */\n store.clear();\n\n /* Listen to events and return `undefined` as no data is expected here */\n return events.pipe(map(() => undefined));\n\n }),\n /* The observable will complete */\n first(),\n );\n\n }\n\n /**\n * Get all the keys in our `indexedDB` store\n * @returns An RxJS `Observable` iterating on each key\n */\n keys(): Observable<string> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n /* `first()` is used as the final operator in other methods to complete the `Observable`\n * (as it all starts from a `ReplaySubject` which never ends),\n * but as this method is iterating over multiple values, `first()` **must** be used here */\n first(),\n mergeMap((transactionData) => {\n\n const { store } = transactionData;\n\n /* Open a cursor on the store\n * Avoid issues like https://github.com/cyrilletuzi/angular-async-local-storage/issues/69 */\n const request = store.openKeyCursor();\n\n /* Listen to success event */\n const success$ = fromEvent(request, \"success\").pipe(\n /* Stop the `Observable` when the cursor is `null` */\n takeWhile(() => (request.result !== null)),\n /* This lib only allows string keys, but user could have added other types of keys from outside\n * It's OK to cast as the cursor as been tested in the previous operator */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n map(() => request.result!.key.toString()),\n /* Iterate on the cursor */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n tap(() => { request.result!.continue(); }),\n );\n\n /* Listen to error event and if so, throw an error */\n const error$ = this.listenError(request);\n\n /* Choose the first event to occur */\n return race([success$, error$]);\n\n }),\n );\n\n }\n\n /**\n * Check if a key exists in our `indexedDB` store\n * @returns An RxJS `Observable` telling if the key exists or not\n */\n has(key: string): Observable<boolean> {\n\n /* Open a transaction in read-only mode */\n return this.transaction(\"readonly\").pipe(\n mergeMap((transactionData) => {\n\n const { store, events } = transactionData;\n\n /* Check if the key exists in the store\n * Fixes https://github.com/cyrilletuzi/angular-async-local-storage/issues/69\n */\n const request = store.getKey(key);\n\n /* Listen to events and return `true` or `false` */\n return events.pipe(map(() => (request.result !== undefined) ? true : false));\n\n }),\n /* The observable will complete */\n first(),\n );\n\n }\n\n /**\n * Connects to `indexedDB` and creates the object store on first time\n */\n protected connect(): void {\n\n let request: IDBOpenDBRequest;\n\n /* Connect to `indexedDB`\n * Will fail in Safari cross-origin iframes\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42} */\n try {\n\n /* Do NOT explicit `window` here, as `indexedDB` could be used from a web worker too */\n request = indexedDB.open(this.dbName, this.dbVersion);\n\n } catch {\n\n this.database.error(new IDBBrokenError());\n\n return;\n\n }\n\n /* Create store on first connection */\n this.createStore(request);\n\n /* Listen to success and error events */\n const success$ = fromEvent(request, \"success\");\n const error$ = this.listenError(request);\n\n /* Choose the first to occur */\n race([success$, error$])\n /* The observable will complete */\n .pipe(first())\n .subscribe({\n next: () => {\n /* Register the database connection in the `ReplaySubject` for further access */\n this.database.next(request.result);\n },\n error: () => {\n /* Firefox private mode issue: fallback storage if IndexedDb connection is failing\n * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/26} */\n this.database.error(new IDBBrokenError());\n },\n });\n\n }\n\n /**\n * Create store on first use of `indexedDB`\n * @param request `indexedDB` database opening request\n */\n protected createStore(request: IDBOpenDBRequest): void {\n\n /* Listen to the event fired on first connection */\n fromEvent(request, \"upgradeneeded\")\n /* The observable will complete */\n .pipe(first())\n .subscribe({\n next: () => {\n\n /* Check if the store already exists, to avoid error */\n if (!request.result.objectStoreNames.contains(this.storeName)) {\n\n /* Create the object store */\n request.result.createObjectStore(this.storeName);\n\n }\n\n }\n });\n\n }\n\n /**\n * Open an `indexedDB` transaction and get our store\n * @param mode `readonly` or `readwrite`\n * @returns An `indexedDB` transaction store and events, wrapped in an RxJS `Observable`\n */\n protected transaction(mode: IDBTransactionMode): Observable<{\n store: IDBObjectStore;\n events: Observable<Event>;\n }> {\n\n /* From the `indexedDB` connection, open a transaction and get the store */\n return this.database\n .pipe(mergeMap((database) => {\n\n let transaction: IDBTransaction;\n\n try {\n\n transaction = database.transaction([this.storeName], mode);\n\n } catch (error) {\n\n /* The store could have been deleted from outside */\n return throwError(() => error as DOMException);\n\n }\n\n /* Get the store from the transaction */\n const store = transaction.objectStore(this.storeName);\n\n /* Listen transaction `complete` and `error` events */\n const events = this.listenTransactionEvents(transaction);\n\n return of({ store, events });\n\n }));\n\n }\n\n /**\n * Listen errors on a transaction or request, and throw if trigerred\n * @param transactionOrRequest `indexedDb` transaction or request to listen\n * @returns An `Observable` listening to errors\n */\n protected listenError(transactionOrRequest: IDBTransaction | IDBRequest): Observable<never> {\n\n return fromEvent(transactionOrRequest, \"error\").pipe(\n /* Throw on error to be able to catch errors in RxJS way.\n * Here `event.target` must be used, as `transactionOrRequest.error` will be `null`\n * if we are on the request and the error is only triggered later by the transaction */\n mergeMap((event) => throwError(() => (event.target as IDBTransaction | IDBRequest | null)?.error)),\n );\n\n }\n\n /**\n * Listen transaction `complete` and `error` events\n * @param transaction Transaction to listen\n * @returns An `Observable` listening to transaction `complete` and `error` events\n */\n protected listenTransactionEvents(transaction: IDBTransaction): Observable<Event> {\n\n /* Listen to the `complete` event */\n const complete$ = fromEvent(transaction, \"complete\");\n\n /* Listen to the `error` event */\n const error$ = this.listenError(transaction);\n\n /* Choose the first event to occur */\n return race([complete$, error$]);\n\n }\n\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { Observable, asyncScheduler, of, throwError } from \"rxjs\";\nimport { observeOn } from \"rxjs/operators\";\nimport { LS_PREFIX } from \"../tokens\";\nimport { SerializationError } from \"./exceptions\";\nimport { LocalDatabase } from \"./local-database\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class LocalStorageDatabase implements LocalDatabase {\n\n /**\n * Optional user prefix to avoid collision for multiple apps on the same subdomain\n */\n readonly prefix: string;\n\n constructor() {\n\n /* Prefix if asked, or no prefix otherwise */\n this.prefix = inject(LS_PREFIX) || \"\";\n\n }\n\n /**\n * Number of items in `localStorage`\n */\n get size(): Observable<number> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(localStorage.length);\n\n }\n\n /**\n * Gets an item value in `localStorage`\n * @param key The item's key\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in a RxJS `Observable`\n */\n get(key: string): Observable<unknown | undefined> {\n\n /* Get raw data */\n const unparsedData = localStorage.getItem(this.prefixKey(key));\n\n let parsedData: unknown;\n\n /* No need to parse if data is `null` or `undefined` */\n if ((unparsedData !== undefined) && (unparsedData !== null)) {\n\n /* Try to parse */\n try {\n parsedData = JSON.parse(unparsedData);\n } catch (error) {\n return throwError(() => error as SyntaxError);\n }\n\n }\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(parsedData);\n\n }\n\n /**\n * Store an item in `localStorage`\n * @param key The item's key\n * @param data The item's value\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n set(key: string, data: unknown): Observable<undefined> {\n\n let serializedData: string | null = null;\n\n /* Check if data can be serialized */\n const dataPrototype: unknown = Object.getPrototypeOf(data);\n if ((typeof data === \"object\") && (data !== null) && !Array.isArray(data) &&\n !((dataPrototype === Object.prototype) || (dataPrototype === null))) {\n return throwError(() => new SerializationError());\n }\n\n /* Try to stringify (can fail on circular references) */\n try {\n serializedData = JSON.stringify(data);\n } catch (error) {\n return throwError(() => error as TypeError);\n }\n\n /* Can fail if storage quota is exceeded */\n try {\n localStorage.setItem(this.prefixKey(key), serializedData);\n } catch (error) {\n return throwError(() => error as DOMException);\n }\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes an item in `localStorage`\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n delete(key: string): Observable<undefined> {\n\n localStorage.removeItem(this.prefixKey(key));\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes all items in `localStorage`\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n clear(): Observable<undefined> {\n\n localStorage.clear();\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Get all keys in `localStorage`\n * Note the order of the keys may be inconsistent in Firefox\n * @returns A RxJS `Observable` iterating on keys\n */\n keys(): Observable<string> {\n\n /* Create an `Observable` from keys */\n return new Observable<string>((subscriber) => {\n\n /* Iteretate over all the indexes */\n for (let index = 0; index < localStorage.length; index += 1) {\n\n /* Cast as we are sure in this case the key is not `null` */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n subscriber.next(this.getUnprefixedKey(index)!);\n\n }\n\n subscriber.complete();\n\n }).pipe(\n /* Required to work like other databases which are asynchronous */\n observeOn(asyncScheduler),\n );\n\n }\n\n /**\n * Check if a key exists in `localStorage`\n * @param key The item's key\n * @returns A RxJS `Observable` telling if the key exists or not\n */\n has(key: string): Observable<boolean> {\n\n /* Itérate over all indexes in storage */\n for (let index = 0; index < localStorage.length; index += 1) {\n\n if (key === this.getUnprefixedKey(index)) {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(true);\n\n }\n\n }\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(false);\n\n }\n\n /**\n * Get an unprefixed key\n * @param index Index of the key\n * @returns The unprefixed key name if exists, `null` otherwise\n */\n protected getUnprefixedKey(index: number): string | null {\n\n /* Get the key in storage: may have a prefix */\n const prefixedKey = localStorage.key(index);\n\n if (prefixedKey !== null) {\n\n /* If no prefix, the key is already good, otherwrite strip the prefix */\n return !this.prefix ? prefixedKey : prefixedKey.substring(this.prefix.length);\n\n }\n\n return null;\n\n }\n\n /**\n * Add the prefix to a key\n * @param key The key name\n * @returns The prefixed key name\n */\n protected prefixKey(key: string): string {\n\n return `${this.prefix}${key}`;\n\n }\n\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable, from, of } from \"rxjs\";\nimport { LocalDatabase } from \"./local-database\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class MemoryDatabase implements LocalDatabase {\n\n /**\n * Memory storage\n */\n protected readonly memoryStorage = new Map<string, unknown>();\n\n /**\n * Number of items in memory\n */\n get size(): Observable<number> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(this.memoryStorage.size);\n\n }\n\n /**\n * Gets an item value in memory\n * @param key The item's key\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in a RxJS `Observable`\n */\n get(key: string): Observable<unknown | undefined> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(this.memoryStorage.get(key));\n\n }\n\n /**\n * Sets an item in memory\n * @param key The item's key\n * @param data The item's value\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n set(key: string, data: unknown): Observable<undefined> {\n\n this.memoryStorage.set(key, data);\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes an item in memory\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n delete(key: string): Observable<undefined> {\n\n this.memoryStorage.delete(key);\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Deletes all items in memory\n * @returns A RxJS `Observable` to wait the end of the operation\n */\n clear(): Observable<undefined> {\n\n this.memoryStorage.clear();\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(undefined);\n\n }\n\n /**\n * Get all keys in memory\n * @returns A RxJS `Observable` iterating on keys\n */\n keys(): Observable<string> {\n\n /* Create an `Observable` from keys */\n return from(this.memoryStorage.keys());\n\n }\n\n /**\n * Check if a key exists in memory\n * @param key Key name\n * @returns a RxJS `Observable` telling if the key exists or not\n */\n has(key: string): Observable<boolean> {\n\n /* Wrap in a RxJS `Observable` to be consistent with other storages */\n return of(this.memoryStorage.has(key));\n\n }\n\n}\n","import { isPlatformBrowser } from \"@angular/common\";\nimport { inject, Injectable, PLATFORM_ID } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { IndexedDBDatabase } from \"./indexeddb-database\";\nimport { LocalStorageDatabase } from \"./localstorage-database\";\nimport { MemoryDatabase } from \"./memory-database\";\n\n/**\n * Factory to create a storage according to browser support\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/BROWSERS_SUPPORT.md}\n */\nexport function localDatabaseFactory(): LocalDatabase {\n\n const platformId = inject(PLATFORM_ID);\n\n /* When storage is fully disabled in browser (via the \"Block all cookies\" option),\n * just trying to check `indexedDB` or `localStorage` variables causes a security exception.\n * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118\n */\n try {\n\n // Do not explicit `window` here, as the global object is not the same in web workers\n if (isPlatformBrowser(platformId) && (indexedDB !== undefined) && (indexedDB !== null) && (\"open\" in indexedDB)) {\n\n /* Check:\n * - if we are in a browser context (issue: server-side rendering)\n * - it could exist but be `undefined` or `null`\n * - it could exists but not having a working API\n * Will be the case for:\n * - All other browsers in normal mode\n * - Chromium / Safari private mode, but in this case, data will be swiped when the user leaves the app */\n return new IndexedDBDatabase();\n\n } else if (isPlatformBrowser(platformId)\n && (localStorage !== undefined) && (localStorage !== null) && (\"getItem\" in localStorage)) {\n\n /* Check:\n * - if we are in a browser context (issue: server-side rendering)\n * - if `localStorage` exists (to be sure)\n * - it could exists but not having a working API\n * Will be the case for:\n * - Safari cross-origin iframes, detected later in `IndexedDBDatabase.connect()`\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42}\n * - Firefox private mode, but in this case, data will be swiped when the user leaves the app\n * For Firefox, can only be detected later in `IndexedDBDatabase.connect()`\n * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}\n */\n return new LocalStorageDatabase();\n\n }\n\n } catch {\n // Nothing to do\n }\n\n /* Will be the case for:\n * - In browsers if storage has been fully disabled (via the \"Block all cookies\" option)\n * - Server-side rendering\n * - All other non-browser context\n */\n return new MemoryDatabase();\n\n}\n\n/** @deprecated Will be removed in v17 */\n@Injectable({\n providedIn: \"root\",\n useFactory: localDatabaseFactory,\n})\nexport abstract class LocalDatabase {\n\n abstract readonly size: Observable<number>;\n\n abstract get(key: string): Observable<unknown | undefined>;\n abstract set(key: string, data: unknown): Observable<undefined>;\n abstract delete(key: string): Observable<undefined>;\n abstract clear(): Observable<undefined>;\n abstract keys(): Observable<string>;\n abstract has(key: string): Observable<boolean>;\n\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\nimport { IDB_DB_NAME, IDB_DB_VERSION, IDB_STORE_NAME, LS_PREFIX } from \"./tokens\";\n\n/**\n * Allows to add a prefix before `localStorage` keys.\n * *Use only* for interoperability with other APIs or to avoid collision for multiple apps on the same subdomain.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideLocalStoragePrefix('custom_')]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideLocalStoragePrefix('custom_')]\n * })\n * export class AppModule\n */\nexport function provideLocalStoragePrefix(prefix: string): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: LS_PREFIX, useValue: prefix }]);\n\n}\n\n/**\n * Allows to change the name used for `indexedDB` database.\n * *Use only* for interoperability with other APIs or to avoid collision for multiple apps on the same subdomain.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideIndexedDBDataBaseName('custom')]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideIndexedDBDataBaseName('custom')]\n * })\n * export class AppModule\n */\nexport function provideIndexedDBDataBaseName(name: string): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: IDB_DB_NAME, useValue: name }]);\n\n}\n\n/**\n * Allows to change the database version used for `indexedDB` database.\n * Must be an unsigned **integer**.\n * **Use with caution as the creation of the store depends on the version.**\n * *Use only* for interoperability with other APIs or to avoid collision for multiple apps on the same subdomain.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideIndexedDBDataBaseVersion(2)]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideIndexedDBDataBaseVersion(2)]\n * })\n * export class AppModule\n */\nexport function provideIndexedDBDataBaseVersion(version: number): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: IDB_DB_VERSION, useValue: version }]);\n\n}\n\n/**\n * Allows to change the name used for `indexedDB` object store.\n * *Use only* for interoperability with other APIs.\n * **WARNING: do not change this option in an app already deployed in production, as previously stored data would be lost.**\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideIndexedDBStoreName('custom')]\n * });\n *\n * @example\n * NgModule({\n * providers: [provideIndexedDBStoreName('custom')]\n * })\n * export class AppModule\n */\nexport function provideIndexedDBStoreName(name: string): EnvironmentProviders {\n\n return makeEnvironmentProviders([{ provide: IDB_STORE_NAME, useValue: name }]);\n\n}\n","import { ModuleWithProviders, NgModule } from \"@angular/core\";\nimport { IDB_DB_NAME, IDB_DB_VERSION, IDB_NO_WRAP, IDB_STORE_NAME, LS_PREFIX, StorageConfig } from \"./tokens\";\n\n/**\n * This module is only here for backward compatibility, do not add it by yourself\n */\n@NgModule()\nexport class StorageModule {\n\n /**\n * Only useful to provide options, otherwise it does nothing.\n * **Must be used at initialization, ie. in `AppModule`, and must not be loaded again in another module.**\n * \n */\n static forRoot(config: StorageConfig): ModuleWithProviders<StorageModule> {\n return {\n ngModule: StorageModule,\n providers: [\n config.LSPrefix ? { provide: LS_PREFIX, useValue: config.LSPrefix } : [],\n config.IDBDBName ? { provide: IDB_DB_NAME, useValue: config.IDBDBName } : [],\n config.IDBStoreName ? { provide: IDB_STORE_NAME, useValue: config.IDBStoreName } : [],\n config.IDBDBVersion ? { provide: IDB_DB_VERSION, useValue: config.IDBDBVersion } : [],\n (config.IDBNoWrap === false) ? { provide: IDB_NO_WRAP, useValue: config.IDBNoWrap } : [],\n ],\n };\n }\n\n}\n","/**\n * Exception message when a value is not valid against the JSON schema\n */\nexport const VALIDATION_ERROR = `Data stored is not valid against the provided JSON schema.\nCheck your JSON schema, otherwise it means data has been corrupted.`;\n\n/**\n * Exception raised when a value is not valid against the JSON schema\n */\nexport class ValidationError extends Error {\n override message = VALIDATION_ERROR;\n}\n","import { Injectable } from \"@angular/core\";\nimport {\n JSONSchema,\n JSONSchemaArray,\n JSONSchemaBoolean,\n JSONSchemaInteger, JSONSchemaNumber,\n JSONSchemaObject,\n JSONSchemaString,\n JSONSchemaTuple\n} from \"./json-schema\";\n\n/** @deprecated Will be removed in v17 */\n@Injectable({\n providedIn: \"root\"\n})\nexport class JSONValidator {\n\n /**\n * Validate a JSON data against a Jsubset of the JSON Schema standard.\n * Types are enforced to validate everything: each schema must\n * @param data JSON data to validate\n * @param schema Subset of JSON Schema. Must have a `type`.\n * @returns If data is valid: `true`, if it is invalid: `false`\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md}\n */\n validate(data: unknown, schema: JSONSchema): boolean {\n\n switch (schema.type) {\n\n case \"string\":\n return this.validateString(data, schema);\n case \"number\":\n case \"integer\":\n return this.validateNumber(data, schema);\n case \"boolean\":\n return this.validateBoolean(data, schema);\n case \"array\":\n return this.validateArray(data, schema);\n case \"object\":\n return this.validateObject(data, schema);\n\n }\n\n }\n\n /**\n * Validate a string\n * @param data Data to validate\n * @param schema Schema describing the string\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateString(data: unknown, schema: JSONSchemaString): boolean {\n\n if (typeof data !== \"string\") {\n return false;\n }\n\n if (!this.validateConst(data, schema)) {\n return false;\n }\n\n if (!this.validateEnum(data, schema)) {\n return false;\n }\n\n if ((schema.maxLength !== undefined) && (data.length > schema.maxLength)) {\n return false;\n }\n\n if ((schema.minLength !== undefined) && (data.length < schema.minLength)) {\n return false;\n }\n\n if (schema.pattern) {\n\n let regularExpression: RegExp | null = null;\n\n try {\n regularExpression = new RegExp(schema.pattern);\n } catch {\n // Nothing to do\n }\n\n if (regularExpression && !regularExpression.test(data)) {\n return false;\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate a number or an integer\n * @param data Data to validate\n * @param schema Schema describing the number or integer\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateNumber(data: unknown, schema: JSONSchemaNumber | JSONSchemaInteger): boolean {\n\n if (typeof data !== \"number\") {\n return false;\n }\n\n if ((schema.type === \"integer\") && !Number.isInteger(data)) {\n return false;\n }\n\n if (!this.validateConst(data, schema)) {\n return false;\n }\n\n if (!this.validateEnum(data, schema)) {\n return false;\n }\n\n /* Test is done this way to not divide by 0 */\n if (schema.multipleOf && !Number.isInteger(data / schema.multipleOf)) {\n return false;\n }\n\n if ((schema.maximum !== undefined) && (data > schema.maximum)) {\n return false;\n }\n\n if ((schema.exclusiveMaximum !== undefined) && (data >= schema.exclusiveMaximum)) {\n return false;\n\n }\n\n if ((schema.minimum !== undefined) && (data < schema.minimum)) {\n return false;\n\n }\n\n if ((schema.exclusiveMinimum !== undefined) && (data <= schema.exclusiveMinimum)) {\n return false;\n }\n\n return true;\n\n }\n\n /**\n * Validate a boolean\n * @param data Data to validate\n * @param schema Schema describing the boolean\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateBoolean(data: unknown, schema: JSONSchemaBoolean): boolean {\n\n if (typeof data !== \"boolean\") {\n return false;\n }\n\n if (!this.validateConst(data, schema)) {\n return false;\n }\n\n return true;\n\n }\n\n /**\n * Validate an array\n * @param data Data to validate\n * @param schema Schema describing the array\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateArray(data: unknown, schema: JSONSchemaArray | JSONSchemaTuple): boolean {\n\n if (!Array.isArray(data)) {\n return false;\n }\n\n if ((schema.maxItems !== undefined) && (data.length > schema.maxItems)) {\n return false;\n }\n\n if ((schema.minItems !== undefined) && (data.length < schema.minItems)) {\n return false;\n }\n\n if (schema.uniqueItems) {\n\n /* Create a set to eliminate values with multiple occurences */\n const dataSet = new Set(data);\n\n if (data.length !== dataSet.size) {\n return false;\n }\n\n }\n\n /* Specific test for tuples */\n if (Array.isArray(schema.items) || schema.items === undefined) {\n\n // TODO: cast should not be needed here\n return this.validateTuple(data, schema.items as JSONSchema[] | undefined);\n\n }\n\n /* Validate all the values in array */\n for (const value of data) {\n\n // TODO: remove when TypeScript 4.1 is available\n // (currently the narrowed type from `Array.isArray()` is lost on readonly arrays)\n if (!this.validate(value, schema.items as JSONSchema)) {\n return false;\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate a tuple (array with fixed length and multiple types)\n * @param data Data to validate\n * @param schemas Schemas describing the tuple\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateTuple(data: unknown[], schemas: JSONSchema[] | undefined): boolean {\n\n const lengthToCheck = schemas ? schemas.length : 0;\n\n /* Tuples have a fixed length */\n if (data.length !== lengthToCheck) {\n\n return false;\n\n }\n\n if (schemas) {\n\n for (let i = 0; i < schemas.length; i += 1) {\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (!this.validate(data[i], schemas[i]!)) {\n return false;\n }\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate an object\n * @param data Data to validate\n * @param schema JSON schema describing the object\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateObject(data: unknown, schema: JSONSchemaObject): boolean {\n\n /* Check the type and if not `null` as `null` also have the type `object` in old browsers */\n if ((typeof data !== \"object\") || (data === null)) {\n return false;\n }\n\n /* Check if the object doesn't have more properties than expected\n * Equivalent of `additionalProperties: false`\n */\n if (Object.keys(schema.properties).length < Object.keys(data).length) {\n return false;\n }\n\n /* Validate required properties */\n if (schema.required) {\n\n for (const requiredProp of schema.required) {\n\n if (!Object.prototype.hasOwnProperty.call(data, requiredProp)) {\n return false;\n }\n\n }\n\n }\n\n /* Recursively validate all properties */\n for (const property in schema.properties) {\n\n /* Filter to keep only real properties (no internal JS stuff) and check if the data has the property too */\n if (Object.prototype.hasOwnProperty.call(schema.properties, property) && Object.prototype.hasOwnProperty.call(data, property)) {\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (!this.validate((data as Record<string, unknown>)[property], schema.properties[property]!)) {\n return false;\n }\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * Validate a constant\n * @param data Data ta validate\n * @param schema JSON schema describing the constant\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateConst(data: unknown, schema: JSONSchemaBoolean | JSONSchemaInteger | JSONSchemaNumber | JSONSchemaString): boolean {\n\n if (!schema.const) {\n return true;\n }\n\n return (data === schema.const);\n\n }\n\n /**\n * Validate an enum\n * @param data Data ta validate\n * @param schema JSON schema describing the enum\n * @returns If data is valid: `true`, if it is invalid: `false`\n */\n protected validateEnum(data: unknown, schema: JSONSchemaInteger | JSONSchemaNumber | JSONSchemaString): boolean {\n\n if (!schema.enum) {\n return true;\n }\n\n /* Cast as the data can be of multiple types, and so TypeScript is lost */\n return ((schema.enum as unknown[]).includes(data));\n\n }\n\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable, OperatorFunction, ReplaySubject, of, throwError } from \"rxjs\";\nimport { catchError, mergeMap, tap } from \"rxjs/operators\";\nimport { IDB_BROKEN_ERROR } from \"../databases/exceptions\";\nimport { IndexedDBDatabase } from \"../databases/indexeddb-database\";\nimport { LocalDatabase } from \"../databases/local-database\";\nimport { LocalStorageDatabase } from \"../databases/localstorage-database\";\nimport { MemoryDatabase } from \"../databases/memory-database\";\nimport {\n JSONSchema,\n JSONSchemaArrayOf,\n JSONSchemaBoolean, JSONSchemaInteger,\n JSONSchemaNumber, JSONSchemaString\n} from \"../validation/json-schema\";\nimport { JSONValidator } from \"../validation/json-validator\";\nimport { ValidationError } from \"./exceptions\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class StorageMap {\n\n protected readonly notifiers = new Map<string, ReplaySubject<unknown>>();\n\n /**\n * Constructor params are provided by Angular (but can also be passed manually in tests)\n * @param database Storage to use\n * @param jsonValidator Validator service\n * @param LSPrefix Prefix for `localStorage` keys to avoid collision for multiple apps on the same subdomain or for interoperability\n */\n constructor(\n protected database: LocalDatabase,\n protected readonly jsonValidator: JSONValidator = new JSONValidator(),\n ) {}\n\n /**\n * **Number of items** in storage, wrapped in an `Observable`.\n *\n * @example\n * this.storageMap.size.subscribe((size) => {\n * console.log(size);\n * });\n */\n get size(): Observable<number> {\n\n return this.database.size\n /* Catch if `indexedDb` is broken */\n .pipe(this.catchIDBBroken(() => this.database.size));\n\n }\n\n /**\n * Tells you which storage engine is used. *Only useful for interoperability.*\n * Note that due to some browsers issues in some special contexts\n * (Firefox private mode and Safari cross-origin iframes),\n * **this information may be wrong at initialization,**\n * as the storage could fallback from `indexedDB` to `localStorage`\n * only after a first read or write operation.\n * @returns Storage engine used\n *\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}\n *\n * @example\n * if (this.storageMap.backingEngine === 'indexedDB') {}\n */\n get backingEngine(): \"indexedDB\" | \"localStorage\" | \"memory\" | \"unknown\" {\n\n if (this.database instanceof IndexedDBDatabase) {\n\n return \"indexedDB\";\n\n } else if (this.database instanceof LocalStorageDatabase) {\n\n return \"localStorage\";\n\n } else if (this.database instanceof MemoryDatabase) {\n\n return \"memory\";\n\n } else {\n\n return \"unknown\";\n\n }\n\n }\n\n /**\n * Info about `indexedDB` database. *Only useful for interoperability.*\n * @returns `indexedDB` database name, store name and database version.\n * **Values will be empty if the storage is not `indexedDB`,**\n * **so it should be used after an engine check**.\n *\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}\n *\n * @example\n * if (this.storageMap.backingEngine === 'indexedDB') {\n * const { database, store, version } = this.storageMap.backingStore;\n * }\n */\n get backingStore(): { database: string, store: string, version: number; } {\n\n return (this.database instanceof IndexedDBDatabase) ?\n this.database.backingStore :\n { database: \"\", store: \"\", version: 0 };\n\n }\n\n /**\n * Info about `localStorage` fallback storage. *Only useful for interoperability.*\n * @returns `localStorage` prefix.\n * **Values will be empty if the storage is not `localStorage`,**\n * **so it should be used after an engine check**.\n *\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}\n *\n * @example\n * if (this.storageMap.backingEngine === 'localStorage') {\n * const { prefix } = this.storageMap.fallbackBackingStore;\n * }\n */\n get fallbackBackingStore(): { prefix: string; } {\n\n return (this.database instanceof LocalStorageDatabase) ?\n { prefix: this.database.prefix } :\n { prefix: \"\" };\n\n }\n\n /**\n * Get an item value in storage.\n * The signature has many overloads due to validation, **please refer to the documentation.**\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md}\n * @param key The item's key\n * @param schema Optional JSON schema to validate the data\n * @returns The item's value if the key exists, `undefined` otherwise, wrapped in a RxJS `Observable`\n *\n * @example\n * this.storageMap.get('key', { type: 'string' }).subscribe((result) => {\n * result; // string or undefined\n * });\n *\n * @example\n * interface User {\n * firstName: string;\n * lastName?: string;\n * }\n *\n * const schema = {\n * type: 'object',\n * properties: {\n * firstName: { type: 'string' },\n * lastName: { type: 'string' },\n * },\n * required: ['firstName']\n * };\n *\n * this.storageMap.get<User>('user', schema).subscribe((user) => {\n * if (user) {\n * user.firstName;\n * }\n * });\n */\n get(key: string): Observable<unknown>;\n get<T extends string = string>(key: string, schema: JSONSchemaString): Observable<T | undefined>;\n get<T extends number = number>(key: string, schema: JSONSchemaInteger | JSONSchemaNumber): Observable<T | undefined>;\n get<T extends boolean = boolean>(key: string, schema: JSONSchemaBoolean): Observable<T | undefined>;\n get<T extends readonly string[] = string[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaString>): Observable<T | undefined>;\n get<T extends readonly number[] = number[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaInteger | JSONSchemaNumber>): Observable<T | undefined>; // eslint-disable-line max-len\n get<T extends readonly boolean[] = boolean[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaBoolean>): Observable<T | undefined>;\n get<T>(key: string, schema: JSONSchema): Observable<T | undefined>;\n get<T = unknown>(key: string, schema?: JSONSchema): Observable<unknown> {\n\n /* Get the data in storage */\n return this.database.get(key).pipe(\n /* Check if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.get(key)),\n mergeMap((data) => {\n\n /* No need to validate if the data is empty */\n if ((data === undefined) || (data === null)) {\n\n return of(undefined);\n\n } else if (schema) {\n\n /* Validate data against a JSON schema if provided */\n if (!this.jsonValidator.validate(data, schema)) {\n return throwError(() => new ValidationError());\n }\n\n /* Data have been checked, so it's OK to cast */\n return of(data as T | undefined);\n\n }\n\n /* Cast to unknown as the data wasn't checked */\n return of(data);\n\n }),\n );\n\n }\n\n /**\n * Set an item in storage.\n * Note that setting `null` or `undefined` will remove the item to avoid some browsers issues.\n * @param key The item's key\n * @param data The item's value\n * @param schema Optional JSON schema to validate the data\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.storageMap.set('key', 'value').subscribe(() => {});\n */\n set(key: string, data: unknown, schema?: JSONSchema): Observable<undefined> {\n\n /* Storing `undefined` or `null` is useless and can cause issues in `indexedDb` in some browsers,\n * so removing item instead for all storages to have a consistent API */\n if ((data === undefined) || (data === null)) {\n return this.delete(key);\n }\n\n /* Validate data against a JSON schema if provided */\n if (schema && !this.jsonValidator.validate(data, schema)) {\n return throwError(() => new ValidationError());\n }\n\n return this.database.set(key, data).pipe(\n /* Catch if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.set(key, data)),\n /* Notify watchers (must be last because it should only happen if the operation succeeds) */\n tap(() => { this.notify(key, data); }),\n );\n }\n\n /**\n * Delete an item in storage\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.storageMap.delete('key').subscribe(() => {});\n */\n delete(key: string): Observable<undefined> {\n\n return this.database.delete(key).pipe(\n /* Catch if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.delete(key)),\n /* Notify watchers (must be last because it should only happen if the operation succeeds) */\n tap(() => { this.notify(key, undefined); }),\n );\n\n }\n\n /**\n * Delete all items in storage\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.storageMap.clear().subscribe(() => {});\n */\n clear(): Observable<undefined> {\n\n return this.database.clear().pipe(\n /* Catch if `indexedDb` is broken */\n this.catchIDBBroken(() => this.database.clear()),\n /* Notify watchers (must be last because it should only happen if the operation succeeds) */\n tap(() => {\n for (const key of this.notifiers.keys()) {\n this.notify(key, undefined);\n }\n }),\n );\n\n }\n\n /**\n * Get all keys stored in storage. Note **this is an *iterating* `Observable`**:\n * * if there is no key, the `next` callback will not be invoked,\n * * if you need to wait the whole operation to end, be sure to act in the `complete` callback,\n * as this `Observable` can emit several values and so will invoke the `next` callback several times.\n * @returns A list of the keys wrapped in a RxJS `Observable`\n *\n * @example\n * this.storageMap.keys().subscribe({\n * next: (key) => { console.log(key); },\n * complete: () => { console.log('Done'); },\n * });\n */\n keys(): Observable<string> {\n\n return this.database.keys()\n /* Catch if `indexedDb` is broken */\n .pipe(this.catchIDBBroken(() => this.database.keys()));\n\n }\n\n /**\n * Tells if a key exists in storage\n * @returns A RxJS `Observable` telling if the key exists\n *\n * @example\n * this.storageMap.has('key').subscribe((hasKey) => {\n * if (hasKey) {}\n * });\n */\n has(key: string): Observable<boolean> {\n\n return this.database.has(key)\n /* Catch if `indexedDb` is broken */\n .pipe(this.catchIDBBroken(() => this.database.has(key)));\n\n }\n\n /**\n * Watch an item value in storage.\n * **Note only changes done via this lib will be watched**, external changes in storage can't be detected.\n * The signature has many overloads due to validation, **please refer to the documentation.**\n * @see https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md\n * @param key The item's key to watch\n * @param schema Optional JSON schema to validate the initial value\n * @returns An infinite `Observable` giving the current value\n */\n watch(key: string): Observable<unknown>;\n watch<T extends string = string>(key: string, schema: JSONSchemaString): Observable<T | undefined>;\n watch<T extends number = number>(key: string, schema: JSONSchemaInteger | JSONSchemaNumber): Observable<T | undefined>;\n watch<T extends boolean = boolean>(key: string, schema: JSONSchemaBoolean): Observable<T | undefined>;\n watch<T extends readonly string[] = string[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaString>): Observable<T | undefined>;\n watch<T extends readonly number[] = number[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaInteger | JSONSchemaNumber>): Observable<T | undefined>; // eslint-disable-line max-len\n watch<T extends readonly boolean[] = boolean[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaBoolean>): Observable<T | undefined>;\n watch<T>(key: string, schema: JSONSchema): Observable<T | undefined>;\n watch<T = unknown>(key: string, schema?: JSONSchema): Observable<unknown> {\n\n /* Check if there is already a notifier */\n if (!this.notifiers.has(key)) {\n this.notifiers.set(key, new ReplaySubject(1));\n }\n\n /* Non-null assertion is required because TypeScript doesn't narrow `.has()` yet */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const notifier = this.notifiers.get(key)!;\n\n /* Get the current item value */\n (schema ? this.get<T>(key, schema) : this.get(key)).subscribe({\n next: (result) => notifier.next(result),\n error: (error) => notifier.error(error),\n });\n\n /* Only the public API of the `Observable` should be returned */\n return (schema ?\n notifier.asObservable() as Observable<T | undefined> :\n notifier.asObservable()\n );\n\n }\n\n /**\n * Notify when a value changes\n * @param key The item's key\n * @param data The new value\n */\n protected notify(key: string, value: unknown): void {\n\n const notifier = this.notifiers.get(key);\n\n if (notifier) {\n notifier.next(value);\n }\n\n }\n\n /**\n * RxJS operator to catch if `indexedDB` is broken\n * @param operationCallback Callback with the operation to redo\n */\n protected catchIDBBroken<T>(operationCallback: () => Observable<T>): OperatorFunction<T, T> {\n\n return catchError((error) => {\n\n /* Check if `indexedDB` is broken based on error message (the specific error class seems to be lost in the process) */\n if ((error !== undefined) && (error !== null)\n && (typeof error === \"object\") && (\"message\" in error)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n && (error.message === IDB_BROKEN_ERROR)) {\n\n /* When storage is fully disabled in browser (via the \"Block all cookies\" option),\n * just trying to check `localStorage` variable causes a security exception.\n * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118\n */\n try {\n\n if (\"getItem\" in localStorage) {\n\n /* Fallback to `localStorage` if available */\n this.database = new LocalStorageDatabase();\n\n } else {\n\n /* Fallback to memory storage otherwise */\n this.database = new MemoryDatabase();\n\n }\n\n } catch {\n\n /* Fallback to memory storage otherwise */\n this.database = new MemoryDatabase();\n\n }\n\n /* Redo the operation */\n return operationCallback();\n\n } else {\n\n /* Otherwise, rethrow the error */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return throwError(() => error);\n\n }\n\n });\n\n }\n\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\nimport {\n JSONSchema,\n JSONSchemaArrayOf,\n JSONSchemaBoolean, JSONSchemaInteger,\n JSONSchemaNumber, JSONSchemaString\n} from \"../validation/json-schema\";\nimport { StorageMap } from \"./storage-map.service\";\n\n/**\n * @deprecated Will be removed in v17, use `StorageMap`\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/MIGRATION_TO_V16.md}\n */\n@Injectable({\n providedIn: \"root\"\n})\nexport class LocalStorage {\n\n /**\n * Number of items in storage wrapped in an `Observable`\n *\n * @example\n * this.localStorage.length.subscribe((length) => {\n * console.log(length);\n * });\n */\n get length(): Observable<number> {\n\n return this.storageMap.size;\n\n }\n\n /* Use the `StorageMap` service to avoid code duplication */\n constructor(protected readonly storageMap: StorageMap) {}\n\n /**\n * Get an item value in storage.\n * The signature has many overloads due to validation, **please refer to the documentation.**\n * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/VALIDATION.md}\n * @param key The item's key\n * @param schema Optional JSON schema to validate the data.\n * **Note you must pass the schema directly as the second argument.**\n * **Passing the schema in an object `{ schema }` is deprecated and only here**\n * **for backward compatibility: it will be removed in a future version.**\n * @returns The item's value if the key exists, `null` otherwise, wrapped in a RxJS `Observable`\n *\n * @example\n * this.localStorage.get('key', { type: 'string' }).subscribe((result) => {\n * result; // string or null\n * });\n *\n * @example\n * interface User {\n * firstName: string;\n * lastName?: string;\n * }\n *\n * const schema = {\n * type: 'object',\n * properties: {\n * firstName: { type: 'string' },\n * lastName: { type: 'string' },\n * },\n * required: ['firstName']\n * };\n *\n * this.localStorage.get<User>('user', schema).subscribe((user) => {\n * if (user) {\n * user.firstName;\n * }\n * });\n */\n getItem<T = string>(key: string, schema: JSONSchemaString): Observable<string | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = number>(key: string, schema: JSONSchemaInteger | JSONSchemaNumber): Observable<number | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = boolean>(key: string, schema: JSONSchemaBoolean): Observable<boolean | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = string[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaString>): Observable<string[] | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = number[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaInteger | JSONSchemaNumber>): Observable<number[] | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = boolean[]>(key: string, schema: JSONSchemaArrayOf<JSONSchemaBoolean>): Observable<boolean[] | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = unknown>(key: string, schema: JSONSchema | { schema: JSONSchema; }): Observable<T | null>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = unknown>(key: string, schema?: JSONSchema): Observable<unknown>; // eslint-disable-line @typescript-eslint/no-unused-vars\n getItem<T = unknown>(key: string, schema?: JSONSchema | { schema: JSONSchema; } | undefined): Observable<unknown> {\n\n if (schema) {\n\n /* Backward compatibility with version <= 7 */\n schema = (\"schema\" in schema) ? schema.schema : schema;\n\n }\n\n return (schema ? this.storageMap.get<T>(key, schema) : this.storageMap.get(key)).pipe(\n /* Transform `undefined` into `null` to align with `localStorage` API */\n map((value) => (value !== undefined) ? value : null),\n );\n\n }\n\n /**\n * Set an item in storage.\n * Note that setting `null` or `undefined` will remove the item to avoid some browsers issues.\n * @param key The item's key\n * @param data The item's value\n * @param schema Optional JSON schema to validate the data\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.localStorage.set('key', 'value').subscribe(() => {});\n */\n setItem(key: string, data: unknown, schema?: JSONSchema): Observable<boolean> {\n\n return this.storageMap.set(key, data, schema).pipe(\n /* Transform `undefined` into `true` for backward compatibility with v7 */\n map(() => true),\n );\n\n }\n\n /**\n * Delete an item in storage\n * @param key The item's key\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.localStorage.delete('key').subscribe(() => {});\n */\n removeItem(key: string): Observable<boolean> {\n\n return this.storageMap.delete(key).pipe(\n /* Transform `undefined` into `true` for backward compatibility with v7 */\n map(() => true),\n );\n\n }\n\n /**\n * Delete all items in storage\n * @returns A RxJS `Observable` to wait the end of the operation\n *\n * @example\n * this.localStorage.clear().subscribe(() => {});\n */\n clear(): Observable<boolean> {\n\n return this.storageMap.clear().pipe(\n /* Transform `undefined` into `true` for backward compatibility with v7 */\n map(() => true),\n );\n\n }\n\n}\n","/*\n * Public API Surface of local-storage\n */\n\nexport { SERIALIZATION_ERROR, SerializationError } from \"./lib/databases/exceptions\";\nexport { LocalDatabase } from \"./lib/databases/local-database\";\nexport {\n provideIndexedDBDataBaseName, provideIndexedDBDataBaseVersion,\n provideIndexedDBStoreName, provideLocalStoragePrefix\n} from \"./lib/providers\";\nexport { StorageModule } from \"./lib/storage.module\";\nexport { VALIDATION_ERROR, ValidationError } from \"./lib/storages/exceptions\";\nexport { LocalStorage } from \"./lib/storages/local-storage.service\";\nexport { StorageMap } from \"./lib/storages/storage-map.service\";\nexport { StorageConfig } from \"./lib/tokens\";\nexport { JSONSchema, JSONSchemaArray, JSONSchemaArrayOf, JSONSchemaBoolean, JSONSchemaInteger, JSONSchemaNumber, JSONSchemaObject, JSONSchemaString } from \"./lib/validation/json-schema\";\nexport { JSONValidator } from \"./lib/validation/json-validator\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LocalDatabase","i2.JSONValidator","i1.StorageMap"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import * as i0 from "@angular/core";
|
|
|
5
5
|
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/BROWSERS_SUPPORT.md}
|
|
6
6
|
*/
|
|
7
7
|
export declare function localDatabaseFactory(): LocalDatabase;
|
|
8
|
+
/** @deprecated Will be removed in v17 */
|
|
8
9
|
export declare abstract class LocalDatabase {
|
|
9
10
|
abstract readonly size: Observable<number>;
|
|
10
11
|
abstract get(key: string): Observable<unknown | undefined>;
|
|
@@ -3,7 +3,7 @@ import { JSONSchema, JSONSchemaArrayOf, JSONSchemaBoolean, JSONSchemaInteger, JS
|
|
|
3
3
|
import { StorageMap } from "./storage-map.service";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
/**
|
|
6
|
-
* @deprecated Will be removed in v17
|
|
6
|
+
* @deprecated Will be removed in v17, use `StorageMap`
|
|
7
7
|
* @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/MIGRATION_TO_V16.md}
|
|
8
8
|
*/
|
|
9
9
|
export declare class LocalStorage {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* JSON Schema to describe a boolean value.
|
|
3
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
3
4
|
*/
|
|
4
5
|
export interface JSONSchemaBoolean {
|
|
5
6
|
/**
|
|
@@ -13,6 +14,7 @@ export interface JSONSchemaBoolean {
|
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
16
|
* JSON Schema to describe a number value.
|
|
17
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
16
18
|
*/
|
|
17
19
|
export interface JSONSchemaNumber {
|
|
18
20
|
/**
|
|
@@ -51,6 +53,7 @@ export interface JSONSchemaNumber {
|
|
|
51
53
|
}
|
|
52
54
|
/**
|
|
53
55
|
* JSON Schema to describe an integer value.
|
|
56
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
54
57
|
*/
|
|
55
58
|
export interface JSONSchemaInteger {
|
|
56
59
|
/**
|
|
@@ -89,6 +92,7 @@ export interface JSONSchemaInteger {
|
|
|
89
92
|
}
|
|
90
93
|
/**
|
|
91
94
|
* JSON Schema to describe a string value.
|
|
95
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
92
96
|
*/
|
|
93
97
|
export interface JSONSchemaString {
|
|
94
98
|
/**
|
|
@@ -121,6 +125,7 @@ export interface JSONSchemaString {
|
|
|
121
125
|
}
|
|
122
126
|
/**
|
|
123
127
|
* JSON schema to describe an array of values.
|
|
128
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
124
129
|
*/
|
|
125
130
|
export interface JSONSchemaArray {
|
|
126
131
|
/**
|
|
@@ -152,6 +157,7 @@ export interface JSONSchemaArray {
|
|
|
152
157
|
* - array of numbers: `JSONSchemaArrayOf<JSONSchemaNumber>`,
|
|
153
158
|
* - array of integers: `JSONSchemaArrayOf<JSONSchemaInteger>`,
|
|
154
159
|
* - array of strings: `JSONSchemaArrayOf<JSONSchemaString>`.
|
|
160
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
155
161
|
*/
|
|
156
162
|
export interface JSONSchemaArrayOf<T extends JSONSchemaBoolean | JSONSchemaNumber | JSONSchemaInteger | JSONSchemaString> {
|
|
157
163
|
/**
|
|
@@ -206,6 +212,7 @@ export interface JSONSchemaTuple {
|
|
|
206
212
|
}
|
|
207
213
|
/**
|
|
208
214
|
* JSON schema to describe an object.
|
|
215
|
+
* @deprecated Will be removed in v17, use the generic `JSONSchema`
|
|
209
216
|
*/
|
|
210
217
|
export interface JSONSchemaObject {
|
|
211
218
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JSONSchema, JSONSchemaArray, JSONSchemaBoolean, JSONSchemaInteger, JSONSchemaNumber, JSONSchemaObject, JSONSchemaString, JSONSchemaTuple } from "./json-schema";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
+
/** @deprecated Will be removed in v17 */
|
|
3
4
|
export declare class JSONValidator {
|
|
4
5
|
/**
|
|
5
6
|
* Validate a JSON data against a Jsubset of the JSON Schema standard.
|