[d565449] | 1 | # file-entry-cache
|
---|
| 2 | > Super simple cache for file metadata, useful for process that work o a given series of files
|
---|
| 3 | > and that only need to repeat the job on the changed ones since the previous run of the process — Edit
|
---|
| 4 |
|
---|
| 5 | [![NPM Version](http://img.shields.io/npm/v/file-entry-cache.svg?style=flat)](https://npmjs.org/package/file-entry-cache)
|
---|
| 6 | [![Build Status](http://img.shields.io/travis/royriojas/file-entry-cache.svg?style=flat)](https://travis-ci.org/royriojas/file-entry-cache)
|
---|
| 7 |
|
---|
| 8 | ## install
|
---|
| 9 |
|
---|
| 10 | ```bash
|
---|
| 11 | npm i --save file-entry-cache
|
---|
| 12 | ```
|
---|
| 13 |
|
---|
| 14 | ## Usage
|
---|
| 15 |
|
---|
| 16 | The module exposes two functions `create` and `createFromFile`.
|
---|
| 17 |
|
---|
| 18 | ## `create(cacheName, [directory, useCheckSum])`
|
---|
| 19 | - **cacheName**: the name of the cache to be created
|
---|
| 20 | - **directory**: Optional the directory to load the cache from
|
---|
| 21 | - **usecheckSum**: Whether to use md5 checksum to verify if file changed. If false the default will be to use the mtime and size of the file.
|
---|
| 22 |
|
---|
| 23 | ## `createFromFile(pathToCache, [useCheckSum])`
|
---|
| 24 | - **pathToCache**: the path to the cache file (this combines the cache name and directory)
|
---|
| 25 | - **useCheckSum**: Whether to use md5 checksum to verify if file changed. If false the default will be to use the mtime and size of the file.
|
---|
| 26 |
|
---|
| 27 | ```js
|
---|
| 28 | // loads the cache, if one does not exists for the given
|
---|
| 29 | // Id a new one will be prepared to be created
|
---|
| 30 | var fileEntryCache = require('file-entry-cache');
|
---|
| 31 |
|
---|
| 32 | var cache = fileEntryCache.create('testCache');
|
---|
| 33 |
|
---|
| 34 | var files = expand('../fixtures/*.txt');
|
---|
| 35 |
|
---|
| 36 | // the first time this method is called, will return all the files
|
---|
| 37 | var oFiles = cache.getUpdatedFiles(files);
|
---|
| 38 |
|
---|
| 39 | // this will persist this to disk checking each file stats and
|
---|
| 40 | // updating the meta attributes `size` and `mtime`.
|
---|
| 41 | // custom fields could also be added to the meta object and will be persisted
|
---|
| 42 | // in order to retrieve them later
|
---|
| 43 | cache.reconcile();
|
---|
| 44 |
|
---|
| 45 | // use this if you want the non visited file entries to be kept in the cache
|
---|
| 46 | // for more than one execution
|
---|
| 47 | //
|
---|
| 48 | // cache.reconcile( true /* noPrune */)
|
---|
| 49 |
|
---|
| 50 | // on a second run
|
---|
| 51 | var cache2 = fileEntryCache.create('testCache');
|
---|
| 52 |
|
---|
| 53 | // will return now only the files that were modified or none
|
---|
| 54 | // if no files were modified previous to the execution of this function
|
---|
| 55 | var oFiles = cache.getUpdatedFiles(files);
|
---|
| 56 |
|
---|
| 57 | // if you want to prevent a file from being considered non modified
|
---|
| 58 | // something useful if a file failed some sort of validation
|
---|
| 59 | // you can then remove the entry from the cache doing
|
---|
| 60 | cache.removeEntry('path/to/file'); // path to file should be the same path of the file received on `getUpdatedFiles`
|
---|
| 61 | // that will effectively make the file to appear again as modified until the validation is passed. In that
|
---|
| 62 | // case you should not remove it from the cache
|
---|
| 63 |
|
---|
| 64 | // if you need all the files, so you can determine what to do with the changed ones
|
---|
| 65 | // you can call
|
---|
| 66 | var oFiles = cache.normalizeEntries(files);
|
---|
| 67 |
|
---|
| 68 | // oFiles will be an array of objects like the following
|
---|
| 69 | entry = {
|
---|
| 70 | key: 'some/name/file', the path to the file
|
---|
| 71 | changed: true, // if the file was changed since previous run
|
---|
| 72 | meta: {
|
---|
| 73 | size: 3242, // the size of the file
|
---|
| 74 | mtime: 231231231, // the modification time of the file
|
---|
| 75 | data: {} // some extra field stored for this file (useful to save the result of a transformation on the file
|
---|
| 76 | }
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | ```
|
---|
| 80 |
|
---|
| 81 | ## Motivation for this module
|
---|
| 82 |
|
---|
| 83 | I needed a super simple and dumb **in-memory cache** with optional disk persistence (write-back cache) in order to make
|
---|
| 84 | a script that will beautify files with `esformatter` to execute only on the files that were changed since the last run.
|
---|
| 85 |
|
---|
| 86 | In doing so the process of beautifying files was reduced from several seconds to a small fraction of a second.
|
---|
| 87 |
|
---|
| 88 | This module uses [flat-cache](https://www.npmjs.com/package/flat-cache) a super simple `key/value` cache storage with
|
---|
| 89 | optional file persistance.
|
---|
| 90 |
|
---|
| 91 | The main idea is to read the files when the task begins, apply the transforms required, and if the process succeed,
|
---|
| 92 | then store the new state of the files. The next time this module request for `getChangedFiles` will return only
|
---|
| 93 | the files that were modified. Making the process to end faster.
|
---|
| 94 |
|
---|
| 95 | This module could also be used by processes that modify the files applying a transform, in that case the result of the
|
---|
| 96 | transform could be stored in the `meta` field, of the entries. Anything added to the meta field will be persisted.
|
---|
| 97 | Those processes won't need to call `getChangedFiles` they will instead call `normalizeEntries` that will return the
|
---|
| 98 | entries with a `changed` field that can be used to determine if the file was changed or not. If it was not changed
|
---|
| 99 | the transformed stored data could be used instead of actually applying the transformation, saving time in case of only
|
---|
| 100 | a few files changed.
|
---|
| 101 |
|
---|
| 102 | In the worst case scenario all the files will be processed. In the best case scenario only a few of them will be processed.
|
---|
| 103 |
|
---|
| 104 | ## Important notes
|
---|
| 105 | - The values set on the meta attribute of the entries should be `stringify-able` ones if possible, flat-cache uses `circular-json` to try to persist circular structures, but this should be considered experimental. The best results are always obtained with non circular values
|
---|
| 106 | - All the changes to the cache state are done to memory first and only persisted after reconcile.
|
---|
| 107 |
|
---|
| 108 | ## License
|
---|
| 109 |
|
---|
| 110 | MIT
|
---|
| 111 |
|
---|
| 112 |
|
---|