123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- var path = require( 'path' );
- var fs = require( 'graceful-fs' );
- var utils = require( './utils' );
- var del = require( './del' );
- var writeJSON = utils.writeJSON;
-
- var cache = {
- /**
- * Load a cache identified by the given Id. If the element does not exists, then initialize an empty
- * cache storage. If specified `cacheDir` will be used as the directory to persist the data to. If omitted
- * then the cache module directory `./cache` will be used instead
- *
- * @method load
- * @param docId {String} the id of the cache, would also be used as the name of the file cache
- * @param [cacheDir] {String} directory for the cache entry
- */
- load: function ( docId, cacheDir ) {
- var me = this;
-
- me._visited = { };
- me._persisted = { };
- me._pathToFile = cacheDir ? path.resolve( cacheDir, docId ) : path.resolve( __dirname, './.cache/', docId );
-
- if ( fs.existsSync( me._pathToFile ) ) {
- me._persisted = utils.tryParse( me._pathToFile, { } );
- }
- },
-
- /**
- * Load the cache from the provided file
- * @method loadFile
- * @param {String} pathToFile the path to the file containing the info for the cache
- */
- loadFile: function ( pathToFile ) {
- var me = this;
- var dir = path.dirname( pathToFile );
- var fName = path.basename( pathToFile );
-
- me.load( fName, dir );
- },
-
- /**
- * Returns the entire persisted object
- * @method all
- * @returns {*}
- */
- all: function () {
- return this._persisted;
- },
-
- keys: function () {
- return Object.keys( this._persisted );
- },
- /**
- * sets a key to a given value
- * @method setKey
- * @param key {string} the key to set
- * @param value {object} the value of the key. Could be any object that can be serialized with JSON.stringify
- */
- setKey: function ( key, value ) {
- this._visited[ key ] = true;
- this._persisted[ key ] = value;
- },
- /**
- * remove a given key from the cache
- * @method removeKey
- * @param key {String} the key to remove from the object
- */
- removeKey: function ( key ) {
- delete this._visited[ key ]; // esfmt-ignore-line
- delete this._persisted[ key ]; // esfmt-ignore-line
- },
- /**
- * Return the value of the provided key
- * @method getKey
- * @param key {String} the name of the key to retrieve
- * @returns {*} the value from the key
- */
- getKey: function ( key ) {
- this._visited[ key ] = true;
- return this._persisted[ key ];
- },
-
- /**
- * Remove keys that were not accessed/set since the
- * last time the `prune` method was called.
- * @method _prune
- * @private
- */
- _prune: function () {
- var me = this;
- var obj = { };
-
- var keys = Object.keys( me._visited );
-
- // no keys visited for either get or set value
- if ( keys.length === 0 ) {
- return;
- }
-
- keys.forEach( function ( key ) {
- obj[ key ] = me._persisted[ key ];
- } );
-
- me._visited = { };
- me._persisted = obj;
- },
-
- /**
- * Save the state of the cache identified by the docId to disk
- * as a JSON structure
- * @param [noPrune=false] {Boolean} whether to remove from cache the non visited files
- * @method save
- */
- save: function ( noPrune ) {
- var me = this;
-
- (!noPrune) && me._prune();
- writeJSON( me._pathToFile, me._persisted );
- },
-
- /**
- * remove the file where the cache is persisted
- * @method removeCacheFile
- * @return {Boolean} true or false if the file was successfully deleted
- */
- removeCacheFile: function () {
- return del( this._pathToFile );
- },
- /**
- * Destroy the file cache and cache content.
- * @method destroy
- */
- destroy: function () {
- var me = this;
- me._visited = { };
- me._persisted = { };
-
- me.removeCacheFile();
- }
- };
-
- module.exports = {
- /**
- * Alias for create. Should be considered depreacted. Will be removed in next releases
- *
- * @method load
- * @param docId {String} the id of the cache, would also be used as the name of the file cache
- * @param [cacheDir] {String} directory for the cache entry
- * @returns {cache} cache instance
- */
- load: function ( docId, cacheDir ) {
- return this.create( docId, cacheDir );
- },
-
- /**
- * Load a cache identified by the given Id. If the element does not exists, then initialize an empty
- * cache storage.
- *
- * @method create
- * @param docId {String} the id of the cache, would also be used as the name of the file cache
- * @param [cacheDir] {String} directory for the cache entry
- * @returns {cache} cache instance
- */
- create: function ( docId, cacheDir ) {
- var obj = Object.create( cache );
- obj.load( docId, cacheDir );
- return obj;
- },
-
- createFromFile: function ( filePath ) {
- var obj = Object.create( cache );
- obj.loadFile( filePath );
- return obj;
- },
- /**
- * Clear the cache identified by the given id. Caches stored in a different cache directory can be deleted directly
- *
- * @method clearCache
- * @param docId {String} the id of the cache, would also be used as the name of the file cache
- * @param cacheDir {String} the directory where the cache file was written
- * @returns {Boolean} true if the cache folder was deleted. False otherwise
- */
- clearCacheById: function ( docId, cacheDir ) {
- var filePath = cacheDir ? path.resolve( cacheDir, docId ) : path.resolve( __dirname, './.cache/', docId );
- return del( filePath );
- },
- /**
- * Remove all cache stored in the cache directory
- * @method clearAll
- * @returns {Boolean} true if the cache folder was deleted. False otherwise
- */
- clearAll: function ( cacheDir ) {
- var filePath = cacheDir ? path.resolve( cacheDir ) : path.resolve( __dirname, './.cache/' );
- return del( filePath );
- }
- };
|