ngforage
Version:
localForage bindings for Angular
153 lines • 15.3 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import 'localforage';
import { InstanceFactory } from '../instance-factory';
import { NgForageConfig } from './ng-forage-config.service';
import * as i0 from "@angular/core";
import * as i1 from "./ng-forage-config.service";
import * as i2 from "../instance-factory";
/** @internal */
const store$ = Symbol('Store');
/**
* Abstract service-level configuration layer for NgForage
*/
export class BaseConfigurableImpl {
/** @internal */
baseConfig;
/** @internal */
config = {};
/** @internal */
fact;
/** @internal */
storeNeedsRecalc = true;
/** @internal */
[store$];
/** @internal */
constructor(config, instanceFactory) {
this.baseConfig = config;
this.fact = instanceFactory;
}
/**
* A description of the database, essentially for developer usage.
* @default ""
*/
get description() {
return this.config.description || this.baseConfig.description;
}
set description(v) {
this.config.description = v;
this.storeNeedsRecalc = true;
}
/**
* The preferred driver(s) to use.
* @default IndexedDB, WebSQL and localStorage
*/
get driver() {
return this.config.driver ?? this.baseConfig.driver;
}
set driver(v) {
this.config.driver = v;
this.storeNeedsRecalc = true;
}
/**
* The name of the database. May appear during storage limit prompts. Useful to use the name of your app here.
* In localStorage, this is used as a key prefix for all keys stored in localStorage.
* @default ngForage
*/
get name() {
return this.config.name || this.baseConfig.name;
}
set name(v) {
this.config.name = v;
this.storeNeedsRecalc = true;
}
/**
* The size of the database in bytes. Used only in WebSQL for now.
* @default 4980736
*/
get size() {
return this.config.size ?? this.baseConfig.size;
}
set size(v) {
this.config.size = v;
this.storeNeedsRecalc = true;
}
/**
* The name of the datastore.
* In IndexedDB this is the dataStore,
* in WebSQL this is the name of the key/value table in the database.
* Must be alphanumeric, with underscores.
* Any non-alphanumeric characters will be converted to underscores.
* @default ng_forage
*/
get storeName() {
return this.config.storeName ?? this.baseConfig.storeName;
}
set storeName(v) {
this.config.storeName = v;
this.storeNeedsRecalc = true;
}
/**
* The version of your database. May be used for upgrades in the future; currently unused.
* @default 1.0
*/
get version() {
return this.config?.version ?? this.baseConfig.version;
}
set version(v) {
this.config.version = v;
this.storeNeedsRecalc = true;
}
/** @internal */
get finalConfig() {
return {
...this.baseConfig.config,
...this.config,
};
}
/** @internal */
get store() {
if (this.storeNeedsRecalc || !this[store$]) {
this[store$] = this.fact.getInstance(this.finalConfig);
this.storeNeedsRecalc = false;
}
return this[store$];
}
/**
* Bulk-set configuration options
* @param opts The configuration
*/
configure(opts) {
opts = opts || {};
if (Array.isArray(opts.driver)) {
opts.driver = opts.driver.slice();
}
Object.assign(this.config, opts);
this.storeNeedsRecalc = true;
return this;
}
toJSON() {
return {
description: this.description,
driver: this.driver,
name: this.name,
size: this.size,
storeName: this.storeName,
version: this.version
};
}
toString() {
return JSON.stringify(this.toJSON());
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: BaseConfigurableImpl, deps: [{ token: NgForageConfig }, { token: InstanceFactory }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: BaseConfigurableImpl });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: BaseConfigurableImpl, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.NgForageConfig, decorators: [{
type: Inject,
args: [NgForageConfig]
}] }, { type: i2.InstanceFactory, decorators: [{
type: Inject,
args: [InstanceFactory]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb25maWd1cmFibGUtaW1wbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdmb3JhZ2Uvc3JjL2xpYi9jb25maWcvYmFzZS1jb25maWd1cmFibGUtaW1wbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUdwRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFHMUQsZ0JBQWdCO0FBQ2hCLE1BQU0sTUFBTSxHQUFrQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFOUM7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLG9CQUFvQjtJQUV4QyxnQkFBZ0I7SUFDRyxVQUFVLENBQWlCO0lBRTlDLGdCQUFnQjtJQUNHLE1BQU0sR0FBb0IsRUFBRSxDQUFDO0lBRWhELGdCQUFnQjtJQUNHLElBQUksQ0FBa0I7SUFFekMsZ0JBQWdCO0lBQ04sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBRWxDLGdCQUFnQjtJQUNSLENBQUMsTUFBTSxDQUFDLENBQWM7SUFFOUIsZ0JBQWdCO0lBQ2hCLFlBQzBCLE1BQXNCLEVBQ3JCLGVBQWdDO1FBRXpELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBVyxXQUFXLENBQUMsQ0FBUztRQUM5QixJQUFJLENBQUMsTUFB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bkM7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUU3QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQzt1R0E3Sm1CLG9CQUFvQixrQkFtQjlCLGNBQWMsYUFDZCxlQUFlOzJHQXBCTCxvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRHpDLFVBQVU7OzBCQW9CTixNQUFNOzJCQUFDLGNBQWM7OzBCQUNyQixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgJ2xvY2FsZm9yYWdlJztcbmltcG9ydCB7SW5zdGFuY2VGYWN0b3J5fSBmcm9tICcuLi9pbnN0YW5jZS1mYWN0b3J5JztcbmltcG9ydCB0eXBlIHtEcml2ZXJUeXBlfSBmcm9tICcuLi9taXNjL2RyaXZlci10eXBlLnR5cGUnO1xuaW1wb3J0IHR5cGUge0Jhc2VDb25maWd1cmFibGV9IGZyb20gJy4vYmFzZS1jb25maWd1cmFibGUnO1xuaW1wb3J0IHtOZ0ZvcmFnZUNvbmZpZ30gZnJvbSAnLi9uZy1mb3JhZ2UtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHR5cGUge05nRm9yYWdlT3B0aW9uc30gZnJvbSAnLi9uZy1mb3JhZ2Utb3B0aW9ucyc7XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IHN0b3JlJDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnU3RvcmUnKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBzZXJ2aWNlLWxldmVsIGNvbmZpZ3VyYXRpb24gbGF5ZXIgZm9yIE5nRm9yYWdlXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29uZmlndXJhYmxlSW1wbCBpbXBsZW1lbnRzIEJhc2VDb25maWd1cmFibGUge1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhc2VDb25maWc6IE5nRm9yYWdlQ29uZmlnO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZzogTmdGb3JhZ2VPcHRpb25zID0ge307XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFjdDogSW5zdGFuY2VGYWN0b3J5O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHN0b3JlTmVlZHNSZWNhbGMgPSB0cnVlO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBbc3RvcmUkXTogTG9jYWxGb3JhZ2U7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOZ0ZvcmFnZUNvbmZpZykgY29uZmlnOiBOZ0ZvcmFnZUNvbmZpZyxcbiAgICBASW5qZWN0KEluc3RhbmNlRmFjdG9yeSkgaW5zdGFuY2VGYWN0b3J5OiBJbnN0YW5jZUZhY3RvcnlcbiAgKSB7XG4gICAgdGhpcy5iYXNlQ29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuZmFjdCA9IGluc3RhbmNlRmFjdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhYmFzZSwgZXNzZW50aWFsbHkgZm9yIGRldmVsb3BlciB1c2FnZS5cbiAgICogQGRlZmF1bHQgXCJcIlxuICAgKi9cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmJhc2VDb25maWcuZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHY6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlnLmRlc2NyaXB0aW9uID0gdjtcbiAgICB0aGlzLnN0b3JlTmVlZHNSZWNhbGMgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJyZWQgZHJpdmVyKHMpIHRvIHVzZS5cbiAgICogQGRlZmF1bHQgSW5kZXhlZERCLCBXZWJTUUwgYW5kIGxvY2FsU3RvcmFnZVxuICAgKi9cbiAgcHVibGljIGdldCBkcml2ZXIoKTogRHJpdmVyVHlwZSB8IERyaXZlclR5cGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRyaXZlciA/PyB0aGlzLmJhc2VDb25maWcuZHJpdmVyO1xuICB9XG5cbiAgcHVibGljIHNldCBkcml2ZXIodjogRHJpdmVyVHlwZSB8IERyaXZlclR5cGVbXSkge1xuICAgIHRoaXMuY29uZmlnLmRyaXZlciA9IHY7XG4gICAgdGhpcy5zdG9yZU5lZWRzUmVjYWxjID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UuIE1heSBhcHBlYXIgZHVyaW5nIHN0b3JhZ2UgbGltaXQgcHJvbXB0cy4gVXNlZnVsIHRvIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGFwcCBoZXJlLlxuICAgKiBJbiBsb2NhbFN0b3JhZ2UsIHRoaXMgaXMgdXNlZCBhcyBhIGtleSBwcmVmaXggZm9yIGFsbCBrZXlzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gICAqIEBkZWZhdWx0IG5nRm9yYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubmFtZSB8fCB0aGlzLmJhc2VDb25maWcubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZy5uYW1lID0gdjtcbiAgICB0aGlzLnN0b3JlTmVlZHNSZWNhbGMgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBkYXRhYmFzZSBpbiBieXRlcy4gVXNlZCBvbmx5IGluIFdlYlNRTCBmb3Igbm93LlxuICAgKiBAZGVmYXVsdCA0OTgwNzM2XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2l6ZSA/PyB0aGlzLmJhc2VDb25maWcuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2l6ZSh2OiBudW1iZXIpIHtcbiAgICB0aGlzLmNvbmZpZy5zaXplID0gdjtcbiAgICB0aGlzLnN0b3JlTmVlZHNSZWNhbGMgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBkYXRhc3RvcmUuXG4gICAqIEluIEluZGV4ZWREQiB0aGlzIGlzIHRoZSBkYXRhU3RvcmUsXG4gICAqIGluIFdlYlNRTCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBrZXkvdmFsdWUgdGFibGUgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBNdXN0IGJlIGFscGhhbnVtZXJpYywgd2l0aCB1bmRlcnNjb3Jlcy5cbiAgICogQW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0byB1bmRlcnNjb3Jlcy5cbiAgICogQGRlZmF1bHQgbmdfZm9yYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zdG9yZU5hbWUgPz8gdGhpcy5iYXNlQ29uZmlnLnN0b3JlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc3RvcmVOYW1lKHY6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlnLnN0b3JlTmFtZSA9IHY7XG4gICAgdGhpcy5zdG9yZU5lZWRzUmVjYWxjID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB5b3VyIGRhdGFiYXNlLiBNYXkgYmUgdXNlZCBmb3IgdXBncmFkZXMgaW4gdGhlIGZ1dHVyZTsgY3VycmVudGx5IHVudXNlZC5cbiAgICogQGRlZmF1bHQgMS4wXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LnZlcnNpb24gPz8gdGhpcy5iYXNlQ29uZmlnLnZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IHZlcnNpb24odjogbnVtYmVyKSB7XG4gICAgdGhpcy5jb25maWcudmVyc2lvbiA9IHY7XG4gICAgdGhpcy5zdG9yZU5lZWRzUmVjYWxjID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGdldCBmaW5hbENvbmZpZygpOiBOZ0ZvcmFnZU9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJhc2VDb25maWcuY29uZmlnLFxuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGdldCBzdG9yZSgpOiBMb2NhbEZvcmFnZSB7XG4gICAgaWYgKHRoaXMuc3RvcmVOZWVkc1JlY2FsYyB8fCAhdGhpc1tzdG9yZSRdKSB7XG4gICAgICB0aGlzW3N0b3JlJF0gPSB0aGlzLmZhY3QuZ2V0SW5zdGFuY2UodGhpcy5maW5hbENvbmZpZyk7XG4gICAgICB0aGlzLnN0b3JlTmVlZHNSZWNhbGMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1tzdG9yZSRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGstc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0cyBUaGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZShvcHRzOiBOZ0ZvcmFnZU9wdGlvbnMpOiB0aGlzIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuZHJpdmVyKSkge1xuICAgICAgb3B0cy5kcml2ZXIgPSBvcHRzLmRyaXZlci5zbGljZSgpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcsIG9wdHMpO1xuICAgIHRoaXMuc3RvcmVOZWVkc1JlY2FsYyA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKTogUGFydGlhbDxOZ0ZvcmFnZU9wdGlvbnM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBkcml2ZXI6IHRoaXMuZHJpdmVyLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgc2l6ZTogdGhpcy5zaXplLFxuICAgICAgc3RvcmVOYW1lOiB0aGlzLnN0b3JlTmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvblxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSk7XG4gIH1cbn1cbiJdfQ==