fetch-json-cache 1.6.3 → 1.7.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.
@@ -1,12 +1,12 @@
1
1
  import type { CacheOptions, ClearCallback, GetCallback, GetOptions } from './types.js';
2
- export default class Cache {
2
+ export default class Cache<TWire = unknown, TStored = TWire> {
3
3
  cachePath: string;
4
- options: CacheOptions;
5
- constructor(cachePath: string, options?: CacheOptions);
6
- get<T>(endpoint: string, callback: GetCallback<T>): void;
7
- get<T>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;
8
- get<T>(endpoint: string, options?: GetOptions): Promise<T | null>;
9
- getSync<T>(endpoint: string): T | null;
4
+ options: CacheOptions<TWire, TStored>;
5
+ constructor(cachePath: string, options?: CacheOptions<TWire, TStored>);
6
+ get<T = TStored>(endpoint: string, callback: GetCallback<T>): void;
7
+ get<T = TStored>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;
8
+ get<T = TStored>(endpoint: string, options?: GetOptions): Promise<T | null>;
9
+ getSync<T = TStored>(endpoint: string): T | null;
10
10
  clear(callback: ClearCallback): void;
11
11
  clear(): Promise<void>;
12
12
  }
@@ -1,12 +1,12 @@
1
1
  import type { CacheOptions, ClearCallback, GetCallback, GetOptions } from './types.js';
2
- export default class Cache {
2
+ export default class Cache<TWire = unknown, TStored = TWire> {
3
3
  cachePath: string;
4
- options: CacheOptions;
5
- constructor(cachePath: string, options?: CacheOptions);
6
- get<T>(endpoint: string, callback: GetCallback<T>): void;
7
- get<T>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;
8
- get<T>(endpoint: string, options?: GetOptions): Promise<T | null>;
9
- getSync<T>(endpoint: string): T | null;
4
+ options: CacheOptions<TWire, TStored>;
5
+ constructor(cachePath: string, options?: CacheOptions<TWire, TStored>);
6
+ get<T = TStored>(endpoint: string, callback: GetCallback<T>): void;
7
+ get<T = TStored>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;
8
+ get<T = TStored>(endpoint: string, options?: GetOptions): Promise<T | null>;
9
+ getSync<T = TStored>(endpoint: string): T | null;
10
10
  clear(callback: ClearCallback): void;
11
11
  clear(): Promise<void>;
12
12
  }
package/dist/cjs/Cache.js CHANGED
@@ -14,17 +14,13 @@ var _getSyncts = /*#__PURE__*/ _interop_require_default(require("./getSync.js"))
14
14
  var _hashts = /*#__PURE__*/ _interop_require_default(require("./hash.js"));
15
15
  var _updatets = /*#__PURE__*/ _interop_require_default(require("./update.js"));
16
16
  function _class_call_check(instance, Constructor) {
17
- if (!(instance instanceof Constructor)) {
18
- throw new TypeError("Cannot call a class as a function");
19
- }
17
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
20
18
  }
21
19
  function _instanceof(left, right) {
22
20
  "@swc/helpers - instanceof";
23
21
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
24
22
  return !!right[Symbol.hasInstance](left);
25
- } else {
26
- return left instanceof right;
27
- }
23
+ } else return left instanceof right;
28
24
  }
29
25
  function _interop_require_default(obj) {
30
26
  return obj && obj.__esModule ? obj : {
@@ -48,7 +44,8 @@ var Cache = /*#__PURE__*/ function() {
48
44
  callback = typeof options === 'function' ? options : callback;
49
45
  options = typeof options === 'function' ? {} : options || {};
50
46
  var worker = function worker(endpoint, options, callback) {
51
- options.force ? _updatets.default.call(_this, endpoint, callback) : _getts.default.call(_this, endpoint, callback);
47
+ var context = _this;
48
+ options.force ? _updatets.default.call(context, endpoint, callback) : _getts.default.call(context, endpoint, callback);
52
49
  };
53
50
  if (typeof callback === 'function') return worker(endpoint, options, callback);
54
51
  return new Promise(function(resolve, reject) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/Cache.ts"],"sourcesContent":["import { safeRm } from 'fs-remove-compat';\n\nimport get from './get.ts';\nimport getSync from './getSync.ts';\nimport hash from './hash.ts';\nimport type { CacheOptions, ClearCallback, GetCallback, GetOptions, UpdateCallback } from './types.ts';\nimport update from './update.ts';\n\nexport default class Cache {\n cachePath: string;\n options: CacheOptions;\n\n constructor(cachePath: string, options: CacheOptions = {}) {\n if (!(this instanceof Cache)) throw new Error('Cache needs to be called with new');\n if (!cachePath) throw new Error('Cache needs cachePath');\n this.cachePath = cachePath;\n this.options = options;\n if (!this.options.hash) this.options.hash = hash;\n }\n\n get<T>(endpoint: string, callback: GetCallback<T>): void;\n get<T>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;\n get<T>(endpoint: string, options?: GetOptions): Promise<T | null>;\n get<T>(endpoint: string, options?: GetOptions | GetCallback<T>, callback?: GetCallback<T>): void | Promise<T | null> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as GetOptions);\n\n const worker = (endpoint: string, options: GetOptions, callback: GetCallback<T>) => {\n options.force ? update.call(this, endpoint, callback as unknown as UpdateCallback<unknown>) : get.call(this, endpoint, callback as unknown as GetCallback<unknown>);\n };\n\n if (typeof callback === 'function') return worker(endpoint, options, callback);\n return new Promise((resolve, reject) => worker(endpoint, options as GetOptions, (err, json) => (err ? reject(err) : resolve(json as T | null))));\n }\n\n getSync<T>(endpoint: string): T | null {\n return getSync.call(this, endpoint) as T | null;\n }\n\n clear(callback: ClearCallback): void;\n clear(): Promise<void>;\n clear(callback?: ClearCallback): void | Promise<void> {\n const worker = (callback: ClearCallback) => {\n safeRm(this.cachePath, () => callback());\n };\n\n if (typeof callback === 'function') return worker(callback);\n return new Promise((resolve, reject) => worker((err) => (err ? reject(err) : resolve())));\n }\n}\n"],"names":["Cache","cachePath","options","Error","hash","get","endpoint","callback","worker","force","update","call","Promise","resolve","reject","err","json","getSync","clear","safeRm"],"mappings":";;;;;;;eAQqBA;;;8BARE;4DAEP;gEACI;6DACH;+DAEE;;;;;;;;;;;;;;;;;;;AAEJ,IAAA,AAAMA,sBAAN;;aAAMA,MAIPC,SAAiB;YAAEC,UAAAA,iEAAwB,CAAC;gCAJrCF;QAKjB,IAAI,CAAE,AAAI,YAAJ,IAAI,EALOA,QAKa,MAAM,IAAIG,MAAM;QAC9C,IAAI,CAACF,WAAW,MAAM,IAAIE,MAAM;QAChC,IAAI,CAACF,SAAS,GAAGA;QACjB,IAAI,CAACC,OAAO,GAAGA;QACf,IAAI,CAAC,IAAI,CAACA,OAAO,CAACE,IAAI,EAAE,IAAI,CAACF,OAAO,CAACE,IAAI,GAAGA,eAAI;;iBAT/BJ;IAenBK,OAAAA,GAUC,GAVDA,SAAAA,IAAOC,QAAgB,EAAEJ,OAAqC,EAAEK,QAAyB;;QACvFA,WAAW,OAAOL,YAAY,aAAaA,UAAUK;QACrDL,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAMM,SAAS,gBAACF,UAAkBJ,SAAqBK;YACrDL,QAAQO,KAAK,GAAGC,iBAAM,CAACC,IAAI,QAAOL,UAAUC,YAAkDF,cAAG,CAACM,IAAI,QAAOL,UAAUC;QACzH;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOF,UAAUJ,SAASK;QACrE,OAAO,IAAIK,QAAQ,SAACC,SAASC;mBAAWN,OAAOF,UAAUJ,SAAuB,SAACa,KAAKC;uBAAUD,MAAMD,OAAOC,OAAOF,QAAQG;;;IAC9H;IAEAC,OAAAA,OAEC,GAFDA,SAAAA,QAAWX,QAAgB;QACzB,OAAOW,kBAAO,CAACN,IAAI,CAAC,IAAI,EAAEL;IAC5B;IAIAY,OAAAA,KAOC,GAPDA,SAAAA,MAAMX,QAAwB;;QAC5B,IAAMC,SAAS,gBAACD;YACdY,IAAAA,sBAAM,EAAC,MAAKlB,SAAS,EAAE;uBAAMM;;QAC/B;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOD;QAClD,OAAO,IAAIK,QAAQ,SAACC,SAASC;mBAAWN,OAAO,SAACO;uBAASA,MAAMD,OAAOC,OAAOF;;;IAC/E;WAxCmBb"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/Cache.ts"],"sourcesContent":["import { safeRm } from 'fs-remove-compat';\n\nimport get from './get.ts';\nimport getSync from './getSync.ts';\nimport hash from './hash.ts';\nimport type { CacheContext, CacheOptions, ClearCallback, GetCallback, GetOptions, UpdateCallback } from './types.ts';\nimport update from './update.ts';\n\nexport default class Cache<TWire = unknown, TStored = TWire> {\n cachePath: string;\n options: CacheOptions<TWire, TStored>;\n\n constructor(cachePath: string, options: CacheOptions<TWire, TStored> = {}) {\n if (!(this instanceof Cache)) throw new Error('Cache needs to be called with new');\n if (!cachePath) throw new Error('Cache needs cachePath');\n this.cachePath = cachePath;\n this.options = options;\n if (!this.options.hash) this.options.hash = hash;\n }\n\n get<T = TStored>(endpoint: string, callback: GetCallback<T>): void;\n get<T = TStored>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;\n get<T = TStored>(endpoint: string, options?: GetOptions): Promise<T | null>;\n get<T = TStored>(endpoint: string, options?: GetOptions | GetCallback<T>, callback?: GetCallback<T>): void | Promise<T | null> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as GetOptions);\n\n const worker = (endpoint: string, options: GetOptions, callback: GetCallback<T>) => {\n const context = this as unknown as CacheContext;\n options.force ? update.call(context, endpoint, callback as unknown as UpdateCallback<unknown>) : get.call(context, endpoint, callback as unknown as GetCallback<unknown>);\n };\n\n if (typeof callback === 'function') return worker(endpoint, options, callback);\n return new Promise((resolve, reject) => worker(endpoint, options as GetOptions, (err, json) => (err ? reject(err) : resolve(json as T | null))));\n }\n\n getSync<T = TStored>(endpoint: string): T | null {\n return getSync.call(this as unknown as CacheContext, endpoint) as T | null;\n }\n\n clear(callback: ClearCallback): void;\n clear(): Promise<void>;\n clear(callback?: ClearCallback): void | Promise<void> {\n const worker = (callback: ClearCallback) => {\n safeRm(this.cachePath, () => callback());\n };\n\n if (typeof callback === 'function') return worker(callback);\n return new Promise((resolve, reject) => worker((err) => (err ? reject(err) : resolve())));\n }\n}\n"],"names":["Cache","cachePath","options","Error","hash","get","endpoint","callback","worker","context","force","update","call","Promise","resolve","reject","err","json","getSync","clear","safeRm"],"mappings":";;;;;;;eAQqBA;;;8BARE;4DAEP;gEACI;6DACH;+DAEE;;;;;;;;;;;;;;;AAEJ,IAAA,AAAMA,sBAAN;;aAAMA,MAIPC,SAAiB;YAAEC,UAAAA,iEAAwC,CAAC;gCAJrDF;QAKjB,IAAI,CAAE,AAAI,YAAJ,IAAI,EALOA,QAKa,MAAM,IAAIG,MAAM;QAC9C,IAAI,CAACF,WAAW,MAAM,IAAIE,MAAM;QAChC,IAAI,CAACF,SAAS,GAAGA;QACjB,IAAI,CAACC,OAAO,GAAGA;QACf,IAAI,CAAC,IAAI,CAACA,OAAO,CAACE,IAAI,EAAE,IAAI,CAACF,OAAO,CAACE,IAAI,GAAGA,eAAI;;iBAT/BJ;IAenBK,OAAAA,GAWC,GAXDA,SAAAA,IAAiBC,QAAgB,EAAEJ,OAAqC,EAAEK,QAAyB;;QACjGA,WAAW,OAAOL,YAAY,aAAaA,UAAUK;QACrDL,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAMM,SAAS,gBAACF,UAAkBJ,SAAqBK;YACrD,IAAME;YACNP,QAAQQ,KAAK,GAAGC,iBAAM,CAACC,IAAI,CAACH,SAASH,UAAUC,YAAkDF,cAAG,CAACO,IAAI,CAACH,SAASH,UAAUC;QAC/H;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOF,UAAUJ,SAASK;QACrE,OAAO,IAAIM,QAAQ,SAACC,SAASC;mBAAWP,OAAOF,UAAUJ,SAAuB,SAACc,KAAKC;uBAAUD,MAAMD,OAAOC,OAAOF,QAAQG;;;IAC9H;IAEAC,OAAAA,OAEC,GAFDA,SAAAA,QAAqBZ,QAAgB;QACnC,OAAOY,kBAAO,CAACN,IAAI,CAAC,IAAI,EAA6BN;IACvD;IAIAa,OAAAA,KAOC,GAPDA,SAAAA,MAAMZ,QAAwB;;QAC5B,IAAMC,SAAS,gBAACD;YACda,IAAAA,sBAAM,EAAC,MAAKnB,SAAS,EAAE;uBAAMM;;QAC/B;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOD;QAClD,OAAO,IAAIM,QAAQ,SAACC,SAASC;mBAAWP,OAAO,SAACQ;uBAASA,MAAMD,OAAOC,OAAOF;;;IAC/E;WAzCmBd"}
package/dist/cjs/get.js CHANGED
@@ -35,7 +35,8 @@ function getCache(endpoint, callback) {
35
35
  if (err.code === 'ENOTFOUND' || err.message.indexOf('routines:SSL23_GET_SERVER_HELLO') >= 0) return callback(undefined, record.body);
36
36
  return callback(err);
37
37
  }
38
- if ((res === null || res === void 0 ? void 0 : res.headers).etag === record.headers.etag) return callback(undefined, record.body);
38
+ var headers = res === null || res === void 0 ? void 0 : res.headers;
39
+ if ((headers === null || headers === void 0 ? void 0 : headers.etag) === record.headers.etag) return callback(undefined, record.body);
39
40
  _updatets.default.call(_this, endpoint, function(err, json) {
40
41
  err ? callback(err) : callback(undefined, json);
41
42
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/get.ts"],"sourcesContent":["import fs from 'fs';\nimport { head } from 'get-file-compat';\nimport path from 'path';\n\nimport update from './update.ts';\n\ninterface GetError {\n code?: string;\n}\n\ninterface GetHeaders {\n etag?: string;\n}\n\nimport type { CacheContext, GetCallback } from './types.ts';\n\nexport default function getCache<T>(this: CacheContext, endpoint: string, callback: GetCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n fs.readFile(fullPath, (err, contents) => {\n // doesn't exist so create\n if (err) {\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n }\n // check existing if etag changed and if so, recache\n else {\n const record = JSON.parse(contents.toString());\n head(endpoint, (err, res) => {\n // not accessible\n if (err) {\n if ((err as GetError).code === 'ENOTFOUND' || err.message.indexOf('routines:SSL23_GET_SERVER_HELLO') >= 0) return callback(undefined, record.body);\n return callback(err);\n }\n if ((res?.headers as GetHeaders).etag === record.headers.etag) return callback(undefined, record.body);\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n });\n }\n });\n}\n"],"names":["getCache","endpoint","callback","fullPath","path","join","cachePath","options","hash","fs","readFile","err","contents","update","call","json","undefined","record","JSON","parse","toString","head","res","code","message","indexOf","body","headers","etag"],"mappings":";;;;+BAgBA;;;eAAwBA;;;yDAhBT;6BACM;2DACJ;+DAEE;;;;;;AAYJ,SAASA,SAAgCC,QAAgB,EAAEC,QAAwB;;QAClD,oBAAA;IAA9C,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,AAAC,GAAgC,QAA9B,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBP,WAAU;IAC5EQ,WAAE,CAACC,QAAQ,CAACP,UAAU,SAACQ,KAAKC;QAC1B,0BAA0B;QAC1B,IAAID,KAAK;YACPE,iBAAM,CAACC,IAAI,QAAOb,UAAU,SAACU,KAAKI;gBAChCJ,MAAMT,SAASS,OAAOT,SAASc,WAAWD;YAC5C;QACF,OAEK;YACH,IAAME,SAASC,KAAKC,KAAK,CAACP,SAASQ,QAAQ;YAC3CC,IAAAA,mBAAI,EAACpB,UAAU,SAACU,KAAKW;gBACnB,iBAAiB;gBACjB,IAAIX,KAAK;oBACP,IAAI,AAACA,IAAiBY,IAAI,KAAK,eAAeZ,IAAIa,OAAO,CAACC,OAAO,CAAC,sCAAsC,GAAG,OAAOvB,SAASc,WAAWC,OAAOS,IAAI;oBACjJ,OAAOxB,SAASS;gBAClB;gBACA,IAAI,CAACW,gBAAAA,0BAAAA,IAAKK,OAAO,EAAgBC,IAAI,KAAKX,OAAOU,OAAO,CAACC,IAAI,EAAE,OAAO1B,SAASc,WAAWC,OAAOS,IAAI;gBACrGb,iBAAM,CAACC,IAAI,QAAOb,UAAU,SAACU,KAAKI;oBAChCJ,MAAMT,SAASS,OAAOT,SAASc,WAAWD;gBAC5C;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/get.ts"],"sourcesContent":["import fs from 'fs';\nimport { head } from 'get-file-compat';\nimport path from 'path';\n\nimport update from './update.ts';\n\ninterface GetError {\n code?: string;\n}\n\ninterface GetHeaders {\n etag?: string;\n}\n\nimport type { CacheContext, GetCallback } from './types.ts';\n\nexport default function getCache<T>(this: CacheContext, endpoint: string, callback: GetCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n fs.readFile(fullPath, (err, contents) => {\n // doesn't exist so create\n if (err) {\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n }\n // check existing if etag changed and if so, recache\n else {\n const record = JSON.parse(contents.toString());\n head(endpoint, (err, res) => {\n // not accessible\n if (err) {\n if ((err as GetError).code === 'ENOTFOUND' || err.message.indexOf('routines:SSL23_GET_SERVER_HELLO') >= 0) return callback(undefined, record.body);\n return callback(err);\n }\n const headers = res?.headers as GetHeaders | undefined;\n if (headers?.etag === record.headers.etag) return callback(undefined, record.body);\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n });\n }\n });\n}\n"],"names":["getCache","endpoint","callback","fullPath","path","join","cachePath","options","hash","fs","readFile","err","contents","update","call","json","undefined","record","JSON","parse","toString","head","res","code","message","indexOf","body","headers","etag"],"mappings":";;;;+BAgBA;;;eAAwBA;;;yDAhBT;6BACM;2DACJ;+DAEE;;;;;;AAYJ,SAASA,SAAgCC,QAAgB,EAAEC,QAAwB;;QAClD,oBAAA;IAA9C,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,AAAC,GAAgC,QAA9B,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBP,WAAU;IAC5EQ,WAAE,CAACC,QAAQ,CAACP,UAAU,SAACQ,KAAKC;QAC1B,0BAA0B;QAC1B,IAAID,KAAK;YACPE,iBAAM,CAACC,IAAI,QAAOb,UAAU,SAACU,KAAKI;gBAChCJ,MAAMT,SAASS,OAAOT,SAASc,WAAWD;YAC5C;QACF,OAEK;YACH,IAAME,SAASC,KAAKC,KAAK,CAACP,SAASQ,QAAQ;YAC3CC,IAAAA,mBAAI,EAACpB,UAAU,SAACU,KAAKW;gBACnB,iBAAiB;gBACjB,IAAIX,KAAK;oBACP,IAAI,AAACA,IAAiBY,IAAI,KAAK,eAAeZ,IAAIa,OAAO,CAACC,OAAO,CAAC,sCAAsC,GAAG,OAAOvB,SAASc,WAAWC,OAAOS,IAAI;oBACjJ,OAAOxB,SAASS;gBAClB;gBACA,IAAMgB,UAAUL,gBAAAA,0BAAAA,IAAKK,OAAO;gBAC5B,IAAIA,CAAAA,oBAAAA,8BAAAA,QAASC,IAAI,MAAKX,OAAOU,OAAO,CAACC,IAAI,EAAE,OAAO1B,SAASc,WAAWC,OAAOS,IAAI;gBACjFb,iBAAM,CAACC,IAAI,QAAOb,UAAU,SAACU,KAAKI;oBAChCJ,MAAMT,SAASS,OAAOT,SAASc,WAAWD;gBAC5C;YACF;QACF;IACF;AACF"}
@@ -2,12 +2,13 @@ export interface Record<T> {
2
2
  headers: object;
3
3
  body: T;
4
4
  }
5
- export interface CacheOptions {
5
+ export interface CacheOptions<TWire = unknown, TStored = TWire> {
6
6
  hash?: (string: string) => string;
7
+ transform?: (body: TWire, endpoint: string) => TStored;
7
8
  }
8
9
  export interface CacheContext {
9
10
  cachePath: string;
10
- options: CacheOptions;
11
+ options: CacheOptions<unknown, unknown>;
11
12
  }
12
13
  export interface GetOptions {
13
14
  force?: boolean;
@@ -2,12 +2,13 @@ export interface Record<T> {
2
2
  headers: object;
3
3
  body: T;
4
4
  }
5
- export interface CacheOptions {
5
+ export interface CacheOptions<TWire = unknown, TStored = TWire> {
6
6
  hash?: (string: string) => string;
7
+ transform?: (body: TWire, endpoint: string) => TStored;
7
8
  }
8
9
  export interface CacheContext {
9
10
  cachePath: string;
10
- options: CacheOptions;
11
+ options: CacheOptions<unknown, unknown>;
11
12
  }
12
13
  export interface GetOptions {
13
14
  force?: boolean;
@@ -21,6 +21,7 @@ function _interop_require_default(obj) {
21
21
  };
22
22
  }
23
23
  function update(endpoint, callback) {
24
+ var _this = this;
24
25
  var _this_options_hash, _this_options;
25
26
  var fullPath = _path.default.join(this.cachePath, "".concat((_this_options_hash = (_this_options = this.options).hash) === null || _this_options_hash === void 0 ? void 0 : _this_options_hash.call(_this_options, endpoint), ".json"));
26
27
  (0, _mkdirpclassic.default)(this.cachePath, function(err) {
@@ -29,7 +30,8 @@ function update(endpoint, callback) {
29
30
  if (err) return callback(err);
30
31
  try {
31
32
  var _ref, _ref1;
32
- var body = JSON.parse((_ref = res === null || res === void 0 ? void 0 : res.content) !== null && _ref !== void 0 ? _ref : 'null');
33
+ var parsed = JSON.parse((_ref = res === null || res === void 0 ? void 0 : res.content) !== null && _ref !== void 0 ? _ref : 'null');
34
+ var body = _this.options.transform ? _this.options.transform(parsed, endpoint) : parsed;
33
35
  var record = {
34
36
  headers: (_ref1 = res === null || res === void 0 ? void 0 : res.headers) !== null && _ref1 !== void 0 ? _ref1 : {},
35
37
  body: body
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/update.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport { getContent } from 'get-file-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport tempSuffix from 'temp-suffix';\n\nimport type { CacheContext, Record, UpdateCallback } from './types.ts';\n\nexport default function update<T>(this: CacheContext, endpoint: string, callback: UpdateCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n\n mkdirp(this.cachePath, (err) => {\n if (err && (err as NodeJS.ErrnoException).code !== 'EEXIST') return callback(err);\n\n getContent(endpoint, 'utf8', (err, res) => {\n if (err) return callback(err);\n\n try {\n const body = JSON.parse(res?.content ?? 'null');\n const record = { headers: res?.headers ?? {}, body } as Record<T>;\n const tempFile = `${fullPath}-${tempSuffix()}`;\n\n const queue = new Queue(1);\n queue.defer((cb) => fs.writeFile(tempFile, JSON.stringify(record), 'utf8', (err) => cb(err)));\n queue.defer((cb) => rm(fullPath, { force: true }, (err?: NodeJS.ErrnoException | null) => cb(err)));\n queue.defer((cb) => fs.rename(tempFile, fullPath, (err) => cb(err)));\n queue.await((err) => {\n if (!err) return callback(undefined, record.body);\n rm(tempFile, () => callback(err));\n });\n } catch (err) {\n return callback(err as Error);\n }\n });\n });\n}\n"],"names":["update","endpoint","callback","fullPath","path","join","cachePath","options","hash","mkdirp","err","code","getContent","res","body","JSON","parse","content","record","headers","tempFile","tempSuffix","queue","Queue","defer","cb","fs","writeFile","stringify","rm","force","rename","await","undefined"],"mappings":";;;;+BAUA;;;eAAwBA;;;yDAVT;8BACI;6BACQ;oEACR;2DACF;8DACC;iEACK;;;;;;AAIR,SAASA,OAA8BC,QAAgB,EAAEC,QAA2B;QACnD,oBAAA;IAA9C,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,AAAC,GAAgC,QAA9B,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBP,WAAU;IAE5EQ,IAAAA,sBAAM,EAAC,IAAI,CAACH,SAAS,EAAE,SAACI;QACtB,IAAIA,OAAO,AAACA,IAA8BC,IAAI,KAAK,UAAU,OAAOT,SAASQ;QAE7EE,IAAAA,yBAAU,EAACX,UAAU,QAAQ,SAACS,KAAKG;YACjC,IAAIH,KAAK,OAAOR,SAASQ;YAEzB,IAAI;;gBACF,IAAMI,OAAOC,KAAKC,KAAK,SAACH,gBAAAA,0BAAAA,IAAKI,OAAO,uCAAI;gBACxC,IAAMC,SAAS;oBAAEC,OAAO,WAAEN,gBAAAA,0BAAAA,IAAKM,OAAO,yCAAI,CAAC;oBAAGL,MAAAA;gBAAK;gBACnD,IAAMM,WAAW,AAAC,GAAcC,OAAZlB,UAAS,KAAgB,OAAbkB,IAAAA,mBAAU;gBAE1C,IAAMC,QAAQ,IAAIC,gBAAK,CAAC;gBACxBD,MAAME,KAAK,CAAC,SAACC;2BAAOC,WAAE,CAACC,SAAS,CAACP,UAAUL,KAAKa,SAAS,CAACV,SAAS,QAAQ,SAACR;+BAAQe,GAAGf;;;gBACvFY,MAAME,KAAK,CAAC,SAACC;2BAAOI,IAAAA,kBAAE,EAAC1B,UAAU;wBAAE2B,OAAO;oBAAK,GAAG,SAACpB;+BAAuCe,GAAGf;;;gBAC7FY,MAAME,KAAK,CAAC,SAACC;2BAAOC,WAAE,CAACK,MAAM,CAACX,UAAUjB,UAAU,SAACO;+BAAQe,GAAGf;;;gBAC9DY,MAAMU,KAAK,CAAC,SAACtB;oBACX,IAAI,CAACA,KAAK,OAAOR,SAAS+B,WAAWf,OAAOJ,IAAI;oBAChDe,IAAAA,kBAAE,EAACT,UAAU;+BAAMlB,SAASQ;;gBAC9B;YACF,EAAE,OAAOA,KAAK;gBACZ,OAAOR,SAASQ;YAClB;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/update.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport { getContent } from 'get-file-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport tempSuffix from 'temp-suffix';\n\nimport type { CacheContext, Record, UpdateCallback } from './types.ts';\n\nexport default function update<T>(this: CacheContext, endpoint: string, callback: UpdateCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n\n mkdirp(this.cachePath, (err) => {\n if (err && (err as NodeJS.ErrnoException).code !== 'EEXIST') return callback(err);\n\n getContent(endpoint, 'utf8', (err, res) => {\n if (err) return callback(err);\n\n try {\n const parsed = JSON.parse(res?.content ?? 'null');\n const body = this.options.transform ? this.options.transform(parsed, endpoint) : parsed;\n const record = { headers: res?.headers ?? {}, body } as Record<T>;\n const tempFile = `${fullPath}-${tempSuffix()}`;\n\n const queue = new Queue(1);\n queue.defer((cb) => fs.writeFile(tempFile, JSON.stringify(record), 'utf8', (err) => cb(err)));\n queue.defer((cb) => rm(fullPath, { force: true }, (err?: NodeJS.ErrnoException | null) => cb(err)));\n queue.defer((cb) => fs.rename(tempFile, fullPath, (err) => cb(err)));\n queue.await((err) => {\n if (!err) return callback(undefined, record.body);\n rm(tempFile, () => callback(err));\n });\n } catch (err) {\n return callback(err as Error);\n }\n });\n });\n}\n"],"names":["update","endpoint","callback","fullPath","path","join","cachePath","options","hash","mkdirp","err","code","getContent","res","parsed","JSON","parse","content","body","transform","record","headers","tempFile","tempSuffix","queue","Queue","defer","cb","fs","writeFile","stringify","rm","force","rename","await","undefined"],"mappings":";;;;+BAUA;;;eAAwBA;;;yDAVT;8BACI;6BACQ;oEACR;2DACF;8DACC;iEACK;;;;;;AAIR,SAASA,OAA8BC,QAAgB,EAAEC,QAA2B;;QACnD,oBAAA;IAA9C,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,AAAC,GAAgC,QAA9B,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBP,WAAU;IAE5EQ,IAAAA,sBAAM,EAAC,IAAI,CAACH,SAAS,EAAE,SAACI;QACtB,IAAIA,OAAO,AAACA,IAA8BC,IAAI,KAAK,UAAU,OAAOT,SAASQ;QAE7EE,IAAAA,yBAAU,EAACX,UAAU,QAAQ,SAACS,KAAKG;YACjC,IAAIH,KAAK,OAAOR,SAASQ;YAEzB,IAAI;;gBACF,IAAMI,SAASC,KAAKC,KAAK,SAACH,gBAAAA,0BAAAA,IAAKI,OAAO,uCAAI;gBAC1C,IAAMC,OAAO,MAAKX,OAAO,CAACY,SAAS,GAAG,MAAKZ,OAAO,CAACY,SAAS,CAACL,QAAQb,YAAYa;gBACjF,IAAMM,SAAS;oBAAEC,OAAO,WAAER,gBAAAA,0BAAAA,IAAKQ,OAAO,yCAAI,CAAC;oBAAGH,MAAAA;gBAAK;gBACnD,IAAMI,WAAW,AAAC,GAAcC,OAAZpB,UAAS,KAAgB,OAAboB,IAAAA,mBAAU;gBAE1C,IAAMC,QAAQ,IAAIC,gBAAK,CAAC;gBACxBD,MAAME,KAAK,CAAC,SAACC;2BAAOC,WAAE,CAACC,SAAS,CAACP,UAAUP,KAAKe,SAAS,CAACV,SAAS,QAAQ,SAACV;+BAAQiB,GAAGjB;;;gBACvFc,MAAME,KAAK,CAAC,SAACC;2BAAOI,IAAAA,kBAAE,EAAC5B,UAAU;wBAAE6B,OAAO;oBAAK,GAAG,SAACtB;+BAAuCiB,GAAGjB;;;gBAC7Fc,MAAME,KAAK,CAAC,SAACC;2BAAOC,WAAE,CAACK,MAAM,CAACX,UAAUnB,UAAU,SAACO;+BAAQiB,GAAGjB;;;gBAC9Dc,MAAMU,KAAK,CAAC,SAACxB;oBACX,IAAI,CAACA,KAAK,OAAOR,SAASiC,WAAWf,OAAOF,IAAI;oBAChDa,IAAAA,kBAAE,EAACT,UAAU;+BAAMpB,SAASQ;;gBAC9B;YACF,EAAE,OAAOA,KAAK;gBACZ,OAAOR,SAASQ;YAClB;QACF;IACF;AACF"}
@@ -1,12 +1,12 @@
1
1
  import type { CacheOptions, ClearCallback, GetCallback, GetOptions } from './types.js';
2
- export default class Cache {
2
+ export default class Cache<TWire = unknown, TStored = TWire> {
3
3
  cachePath: string;
4
- options: CacheOptions;
5
- constructor(cachePath: string, options?: CacheOptions);
6
- get<T>(endpoint: string, callback: GetCallback<T>): void;
7
- get<T>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;
8
- get<T>(endpoint: string, options?: GetOptions): Promise<T | null>;
9
- getSync<T>(endpoint: string): T | null;
4
+ options: CacheOptions<TWire, TStored>;
5
+ constructor(cachePath: string, options?: CacheOptions<TWire, TStored>);
6
+ get<T = TStored>(endpoint: string, callback: GetCallback<T>): void;
7
+ get<T = TStored>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;
8
+ get<T = TStored>(endpoint: string, options?: GetOptions): Promise<T | null>;
9
+ getSync<T = TStored>(endpoint: string): T | null;
10
10
  clear(callback: ClearCallback): void;
11
11
  clear(): Promise<void>;
12
12
  }
package/dist/esm/Cache.js CHANGED
@@ -8,7 +8,8 @@ let Cache = class Cache {
8
8
  callback = typeof options === 'function' ? options : callback;
9
9
  options = typeof options === 'function' ? {} : options || {};
10
10
  const worker = (endpoint, options, callback)=>{
11
- options.force ? update.call(this, endpoint, callback) : get.call(this, endpoint, callback);
11
+ const context = this;
12
+ options.force ? update.call(context, endpoint, callback) : get.call(context, endpoint, callback);
12
13
  };
13
14
  if (typeof callback === 'function') return worker(endpoint, options, callback);
14
15
  return new Promise((resolve, reject)=>worker(endpoint, options, (err, json)=>err ? reject(err) : resolve(json)));
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/Cache.ts"],"sourcesContent":["import { safeRm } from 'fs-remove-compat';\n\nimport get from './get.ts';\nimport getSync from './getSync.ts';\nimport hash from './hash.ts';\nimport type { CacheOptions, ClearCallback, GetCallback, GetOptions, UpdateCallback } from './types.ts';\nimport update from './update.ts';\n\nexport default class Cache {\n cachePath: string;\n options: CacheOptions;\n\n constructor(cachePath: string, options: CacheOptions = {}) {\n if (!(this instanceof Cache)) throw new Error('Cache needs to be called with new');\n if (!cachePath) throw new Error('Cache needs cachePath');\n this.cachePath = cachePath;\n this.options = options;\n if (!this.options.hash) this.options.hash = hash;\n }\n\n get<T>(endpoint: string, callback: GetCallback<T>): void;\n get<T>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;\n get<T>(endpoint: string, options?: GetOptions): Promise<T | null>;\n get<T>(endpoint: string, options?: GetOptions | GetCallback<T>, callback?: GetCallback<T>): void | Promise<T | null> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as GetOptions);\n\n const worker = (endpoint: string, options: GetOptions, callback: GetCallback<T>) => {\n options.force ? update.call(this, endpoint, callback as unknown as UpdateCallback<unknown>) : get.call(this, endpoint, callback as unknown as GetCallback<unknown>);\n };\n\n if (typeof callback === 'function') return worker(endpoint, options, callback);\n return new Promise((resolve, reject) => worker(endpoint, options as GetOptions, (err, json) => (err ? reject(err) : resolve(json as T | null))));\n }\n\n getSync<T>(endpoint: string): T | null {\n return getSync.call(this, endpoint) as T | null;\n }\n\n clear(callback: ClearCallback): void;\n clear(): Promise<void>;\n clear(callback?: ClearCallback): void | Promise<void> {\n const worker = (callback: ClearCallback) => {\n safeRm(this.cachePath, () => callback());\n };\n\n if (typeof callback === 'function') return worker(callback);\n return new Promise((resolve, reject) => worker((err) => (err ? reject(err) : resolve())));\n }\n}\n"],"names":["safeRm","get","getSync","hash","update","Cache","endpoint","options","callback","worker","force","call","Promise","resolve","reject","err","json","clear","cachePath","Error"],"mappings":"AAAA,SAASA,MAAM,QAAQ,mBAAmB;AAE1C,OAAOC,SAAS,WAAW;AAC3B,OAAOC,aAAa,eAAe;AACnC,OAAOC,UAAU,YAAY;AAE7B,OAAOC,YAAY,cAAc;AAElB,IAAA,AAAMC,QAAN,MAAMA;IAenBJ,IAAOK,QAAgB,EAAEC,OAAqC,EAAEC,QAAyB,EAA4B;QACnHA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,MAAME,SAAS,CAACH,UAAkBC,SAAqBC;YACrDD,QAAQG,KAAK,GAAGN,OAAOO,IAAI,CAAC,IAAI,EAAEL,UAAUE,YAAkDP,IAAIU,IAAI,CAAC,IAAI,EAAEL,UAAUE;QACzH;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOH,UAAUC,SAASC;QACrE,OAAO,IAAII,QAAQ,CAACC,SAASC,SAAWL,OAAOH,UAAUC,SAAuB,CAACQ,KAAKC,OAAUD,MAAMD,OAAOC,OAAOF,QAAQG;IAC9H;IAEAd,QAAWI,QAAgB,EAAY;QACrC,OAAOJ,QAAQS,IAAI,CAAC,IAAI,EAAEL;IAC5B;IAIAW,MAAMT,QAAwB,EAAwB;QACpD,MAAMC,SAAS,CAACD;YACdR,OAAO,IAAI,CAACkB,SAAS,EAAE,IAAMV;QAC/B;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOD;QAClD,OAAO,IAAII,QAAQ,CAACC,SAASC,SAAWL,OAAO,CAACM,MAASA,MAAMD,OAAOC,OAAOF;IAC/E;IApCA,YAAYK,SAAiB,EAAEX,UAAwB,CAAC,CAAC,CAAE;QACzD,IAAI,CAAE,CAAA,IAAI,YAAYF,KAAI,GAAI,MAAM,IAAIc,MAAM;QAC9C,IAAI,CAACD,WAAW,MAAM,IAAIC,MAAM;QAChC,IAAI,CAACD,SAAS,GAAGA;QACjB,IAAI,CAACX,OAAO,GAAGA;QACf,IAAI,CAAC,IAAI,CAACA,OAAO,CAACJ,IAAI,EAAE,IAAI,CAACI,OAAO,CAACJ,IAAI,GAAGA;IAC9C;AA+BF;AAzCA,SAAqBE,mBAyCpB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/Cache.ts"],"sourcesContent":["import { safeRm } from 'fs-remove-compat';\n\nimport get from './get.ts';\nimport getSync from './getSync.ts';\nimport hash from './hash.ts';\nimport type { CacheContext, CacheOptions, ClearCallback, GetCallback, GetOptions, UpdateCallback } from './types.ts';\nimport update from './update.ts';\n\nexport default class Cache<TWire = unknown, TStored = TWire> {\n cachePath: string;\n options: CacheOptions<TWire, TStored>;\n\n constructor(cachePath: string, options: CacheOptions<TWire, TStored> = {}) {\n if (!(this instanceof Cache)) throw new Error('Cache needs to be called with new');\n if (!cachePath) throw new Error('Cache needs cachePath');\n this.cachePath = cachePath;\n this.options = options;\n if (!this.options.hash) this.options.hash = hash;\n }\n\n get<T = TStored>(endpoint: string, callback: GetCallback<T>): void;\n get<T = TStored>(endpoint: string, options: GetOptions, callback: GetCallback<T>): void;\n get<T = TStored>(endpoint: string, options?: GetOptions): Promise<T | null>;\n get<T = TStored>(endpoint: string, options?: GetOptions | GetCallback<T>, callback?: GetCallback<T>): void | Promise<T | null> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as GetOptions);\n\n const worker = (endpoint: string, options: GetOptions, callback: GetCallback<T>) => {\n const context = this as unknown as CacheContext;\n options.force ? update.call(context, endpoint, callback as unknown as UpdateCallback<unknown>) : get.call(context, endpoint, callback as unknown as GetCallback<unknown>);\n };\n\n if (typeof callback === 'function') return worker(endpoint, options, callback);\n return new Promise((resolve, reject) => worker(endpoint, options as GetOptions, (err, json) => (err ? reject(err) : resolve(json as T | null))));\n }\n\n getSync<T = TStored>(endpoint: string): T | null {\n return getSync.call(this as unknown as CacheContext, endpoint) as T | null;\n }\n\n clear(callback: ClearCallback): void;\n clear(): Promise<void>;\n clear(callback?: ClearCallback): void | Promise<void> {\n const worker = (callback: ClearCallback) => {\n safeRm(this.cachePath, () => callback());\n };\n\n if (typeof callback === 'function') return worker(callback);\n return new Promise((resolve, reject) => worker((err) => (err ? reject(err) : resolve())));\n }\n}\n"],"names":["safeRm","get","getSync","hash","update","Cache","endpoint","options","callback","worker","context","force","call","Promise","resolve","reject","err","json","clear","cachePath","Error"],"mappings":"AAAA,SAASA,MAAM,QAAQ,mBAAmB;AAE1C,OAAOC,SAAS,WAAW;AAC3B,OAAOC,aAAa,eAAe;AACnC,OAAOC,UAAU,YAAY;AAE7B,OAAOC,YAAY,cAAc;AAElB,IAAA,AAAMC,QAAN,MAAMA;IAenBJ,IAAiBK,QAAgB,EAAEC,OAAqC,EAAEC,QAAyB,EAA4B;QAC7HA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,MAAME,SAAS,CAACH,UAAkBC,SAAqBC;YACrD,MAAME,UAAU,IAAI;YACpBH,QAAQI,KAAK,GAAGP,OAAOQ,IAAI,CAACF,SAASJ,UAAUE,YAAkDP,IAAIW,IAAI,CAACF,SAASJ,UAAUE;QAC/H;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOH,UAAUC,SAASC;QACrE,OAAO,IAAIK,QAAQ,CAACC,SAASC,SAAWN,OAAOH,UAAUC,SAAuB,CAACS,KAAKC,OAAUD,MAAMD,OAAOC,OAAOF,QAAQG;IAC9H;IAEAf,QAAqBI,QAAgB,EAAY;QAC/C,OAAOJ,QAAQU,IAAI,CAAC,IAAI,EAA6BN;IACvD;IAIAY,MAAMV,QAAwB,EAAwB;QACpD,MAAMC,SAAS,CAACD;YACdR,OAAO,IAAI,CAACmB,SAAS,EAAE,IAAMX;QAC/B;QAEA,IAAI,OAAOA,aAAa,YAAY,OAAOC,OAAOD;QAClD,OAAO,IAAIK,QAAQ,CAACC,SAASC,SAAWN,OAAO,CAACO,MAASA,MAAMD,OAAOC,OAAOF;IAC/E;IArCA,YAAYK,SAAiB,EAAEZ,UAAwC,CAAC,CAAC,CAAE;QACzE,IAAI,CAAE,CAAA,IAAI,YAAYF,KAAI,GAAI,MAAM,IAAIe,MAAM;QAC9C,IAAI,CAACD,WAAW,MAAM,IAAIC,MAAM;QAChC,IAAI,CAACD,SAAS,GAAGA;QACjB,IAAI,CAACZ,OAAO,GAAGA;QACf,IAAI,CAAC,IAAI,CAACA,OAAO,CAACJ,IAAI,EAAE,IAAI,CAACI,OAAO,CAACJ,IAAI,GAAGA;IAC9C;AAgCF;AA1CA,SAAqBE,mBA0CpB"}
package/dist/esm/get.js CHANGED
@@ -19,7 +19,8 @@ export default function getCache(endpoint, callback) {
19
19
  if (err.code === 'ENOTFOUND' || err.message.indexOf('routines:SSL23_GET_SERVER_HELLO') >= 0) return callback(undefined, record.body);
20
20
  return callback(err);
21
21
  }
22
- if ((res === null || res === void 0 ? void 0 : res.headers).etag === record.headers.etag) return callback(undefined, record.body);
22
+ const headers = res === null || res === void 0 ? void 0 : res.headers;
23
+ if ((headers === null || headers === void 0 ? void 0 : headers.etag) === record.headers.etag) return callback(undefined, record.body);
23
24
  update.call(this, endpoint, (err, json)=>{
24
25
  err ? callback(err) : callback(undefined, json);
25
26
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/get.ts"],"sourcesContent":["import fs from 'fs';\nimport { head } from 'get-file-compat';\nimport path from 'path';\n\nimport update from './update.ts';\n\ninterface GetError {\n code?: string;\n}\n\ninterface GetHeaders {\n etag?: string;\n}\n\nimport type { CacheContext, GetCallback } from './types.ts';\n\nexport default function getCache<T>(this: CacheContext, endpoint: string, callback: GetCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n fs.readFile(fullPath, (err, contents) => {\n // doesn't exist so create\n if (err) {\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n }\n // check existing if etag changed and if so, recache\n else {\n const record = JSON.parse(contents.toString());\n head(endpoint, (err, res) => {\n // not accessible\n if (err) {\n if ((err as GetError).code === 'ENOTFOUND' || err.message.indexOf('routines:SSL23_GET_SERVER_HELLO') >= 0) return callback(undefined, record.body);\n return callback(err);\n }\n if ((res?.headers as GetHeaders).etag === record.headers.etag) return callback(undefined, record.body);\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n });\n }\n });\n}\n"],"names":["fs","head","path","update","getCache","endpoint","callback","fullPath","join","cachePath","options","hash","readFile","err","contents","call","json","undefined","record","JSON","parse","toString","res","code","message","indexOf","body","headers","etag"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,IAAI,QAAQ,kBAAkB;AACvC,OAAOC,UAAU,OAAO;AAExB,OAAOC,YAAY,cAAc;AAYjC,eAAe,SAASC,SAAgCC,QAAgB,EAAEC,QAAwB;QAClD,oBAAA;IAA9C,MAAMC,WAAWL,KAAKM,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,IAAG,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBN,UAAU,KAAK,CAAC;IAClFL,GAAGY,QAAQ,CAACL,UAAU,CAACM,KAAKC;QAC1B,0BAA0B;QAC1B,IAAID,KAAK;YACPV,OAAOY,IAAI,CAAC,IAAI,EAAEV,UAAU,CAACQ,KAAKG;gBAChCH,MAAMP,SAASO,OAAOP,SAASW,WAAWD;YAC5C;QACF,OAEK;YACH,MAAME,SAASC,KAAKC,KAAK,CAACN,SAASO,QAAQ;YAC3CpB,KAAKI,UAAU,CAACQ,KAAKS;gBACnB,iBAAiB;gBACjB,IAAIT,KAAK;oBACP,IAAI,AAACA,IAAiBU,IAAI,KAAK,eAAeV,IAAIW,OAAO,CAACC,OAAO,CAAC,sCAAsC,GAAG,OAAOnB,SAASW,WAAWC,OAAOQ,IAAI;oBACjJ,OAAOpB,SAASO;gBAClB;gBACA,IAAI,CAACS,gBAAAA,0BAAAA,IAAKK,OAAO,EAAgBC,IAAI,KAAKV,OAAOS,OAAO,CAACC,IAAI,EAAE,OAAOtB,SAASW,WAAWC,OAAOQ,IAAI;gBACrGvB,OAAOY,IAAI,CAAC,IAAI,EAAEV,UAAU,CAACQ,KAAKG;oBAChCH,MAAMP,SAASO,OAAOP,SAASW,WAAWD;gBAC5C;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/get.ts"],"sourcesContent":["import fs from 'fs';\nimport { head } from 'get-file-compat';\nimport path from 'path';\n\nimport update from './update.ts';\n\ninterface GetError {\n code?: string;\n}\n\ninterface GetHeaders {\n etag?: string;\n}\n\nimport type { CacheContext, GetCallback } from './types.ts';\n\nexport default function getCache<T>(this: CacheContext, endpoint: string, callback: GetCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n fs.readFile(fullPath, (err, contents) => {\n // doesn't exist so create\n if (err) {\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n }\n // check existing if etag changed and if so, recache\n else {\n const record = JSON.parse(contents.toString());\n head(endpoint, (err, res) => {\n // not accessible\n if (err) {\n if ((err as GetError).code === 'ENOTFOUND' || err.message.indexOf('routines:SSL23_GET_SERVER_HELLO') >= 0) return callback(undefined, record.body);\n return callback(err);\n }\n const headers = res?.headers as GetHeaders | undefined;\n if (headers?.etag === record.headers.etag) return callback(undefined, record.body);\n update.call(this, endpoint, (err, json) => {\n err ? callback(err) : callback(undefined, json as T | undefined);\n });\n });\n }\n });\n}\n"],"names":["fs","head","path","update","getCache","endpoint","callback","fullPath","join","cachePath","options","hash","readFile","err","contents","call","json","undefined","record","JSON","parse","toString","res","code","message","indexOf","body","headers","etag"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,IAAI,QAAQ,kBAAkB;AACvC,OAAOC,UAAU,OAAO;AAExB,OAAOC,YAAY,cAAc;AAYjC,eAAe,SAASC,SAAgCC,QAAgB,EAAEC,QAAwB;QAClD,oBAAA;IAA9C,MAAMC,WAAWL,KAAKM,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,IAAG,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBN,UAAU,KAAK,CAAC;IAClFL,GAAGY,QAAQ,CAACL,UAAU,CAACM,KAAKC;QAC1B,0BAA0B;QAC1B,IAAID,KAAK;YACPV,OAAOY,IAAI,CAAC,IAAI,EAAEV,UAAU,CAACQ,KAAKG;gBAChCH,MAAMP,SAASO,OAAOP,SAASW,WAAWD;YAC5C;QACF,OAEK;YACH,MAAME,SAASC,KAAKC,KAAK,CAACN,SAASO,QAAQ;YAC3CpB,KAAKI,UAAU,CAACQ,KAAKS;gBACnB,iBAAiB;gBACjB,IAAIT,KAAK;oBACP,IAAI,AAACA,IAAiBU,IAAI,KAAK,eAAeV,IAAIW,OAAO,CAACC,OAAO,CAAC,sCAAsC,GAAG,OAAOnB,SAASW,WAAWC,OAAOQ,IAAI;oBACjJ,OAAOpB,SAASO;gBAClB;gBACA,MAAMc,UAAUL,gBAAAA,0BAAAA,IAAKK,OAAO;gBAC5B,IAAIA,CAAAA,oBAAAA,8BAAAA,QAASC,IAAI,MAAKV,OAAOS,OAAO,CAACC,IAAI,EAAE,OAAOtB,SAASW,WAAWC,OAAOQ,IAAI;gBACjFvB,OAAOY,IAAI,CAAC,IAAI,EAAEV,UAAU,CAACQ,KAAKG;oBAChCH,MAAMP,SAASO,OAAOP,SAASW,WAAWD;gBAC5C;YACF;QACF;IACF;AACF"}
@@ -2,12 +2,13 @@ export interface Record<T> {
2
2
  headers: object;
3
3
  body: T;
4
4
  }
5
- export interface CacheOptions {
5
+ export interface CacheOptions<TWire = unknown, TStored = TWire> {
6
6
  hash?: (string: string) => string;
7
+ transform?: (body: TWire, endpoint: string) => TStored;
7
8
  }
8
9
  export interface CacheContext {
9
10
  cachePath: string;
10
- options: CacheOptions;
11
+ options: CacheOptions<unknown, unknown>;
11
12
  }
12
13
  export interface GetOptions {
13
14
  force?: boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/types.ts"],"sourcesContent":["export interface Record<T> {\n headers: object;\n body: T;\n}\n\nexport interface CacheOptions {\n hash?: (string: string) => string;\n}\n\nexport interface CacheContext {\n cachePath: string;\n options: CacheOptions;\n}\n\nexport interface GetOptions {\n force?: boolean;\n}\nexport type GetCallback<T> = (error?: Error | null, result?: T) => void;\nexport type ClearCallback = (error?: Error | null) => void;\nexport type UpdateCallback<T> = (error?: Error | null, result?: T) => void;\n"],"names":[],"mappings":"AAmBA,WAA2E"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/types.ts"],"sourcesContent":["export interface Record<T> {\n headers: object;\n body: T;\n}\n\nexport interface CacheOptions<TWire = unknown, TStored = TWire> {\n hash?: (string: string) => string;\n // Applied to every body before it is stored, so the cached shape is the same whichever call wrote it\n transform?: (body: TWire, endpoint: string) => TStored;\n}\n\n// Internal view: the helpers only need to call transform, not know the caller's types\nexport interface CacheContext {\n cachePath: string;\n options: CacheOptions<unknown, unknown>;\n}\n\nexport interface GetOptions {\n force?: boolean;\n}\nexport type GetCallback<T> = (error?: Error | null, result?: T) => void;\nexport type ClearCallback = (error?: Error | null) => void;\nexport type UpdateCallback<T> = (error?: Error | null, result?: T) => void;\n"],"names":[],"mappings":"AAsBA,WAA2E"}
@@ -14,7 +14,8 @@ export default function update(endpoint, callback) {
14
14
  if (err) return callback(err);
15
15
  try {
16
16
  var _ref, _ref1;
17
- const body = JSON.parse((_ref = res === null || res === void 0 ? void 0 : res.content) !== null && _ref !== void 0 ? _ref : 'null');
17
+ const parsed = JSON.parse((_ref = res === null || res === void 0 ? void 0 : res.content) !== null && _ref !== void 0 ? _ref : 'null');
18
+ const body = this.options.transform ? this.options.transform(parsed, endpoint) : parsed;
18
19
  const record = {
19
20
  headers: (_ref1 = res === null || res === void 0 ? void 0 : res.headers) !== null && _ref1 !== void 0 ? _ref1 : {},
20
21
  body
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/update.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport { getContent } from 'get-file-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport tempSuffix from 'temp-suffix';\n\nimport type { CacheContext, Record, UpdateCallback } from './types.ts';\n\nexport default function update<T>(this: CacheContext, endpoint: string, callback: UpdateCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n\n mkdirp(this.cachePath, (err) => {\n if (err && (err as NodeJS.ErrnoException).code !== 'EEXIST') return callback(err);\n\n getContent(endpoint, 'utf8', (err, res) => {\n if (err) return callback(err);\n\n try {\n const body = JSON.parse(res?.content ?? 'null');\n const record = { headers: res?.headers ?? {}, body } as Record<T>;\n const tempFile = `${fullPath}-${tempSuffix()}`;\n\n const queue = new Queue(1);\n queue.defer((cb) => fs.writeFile(tempFile, JSON.stringify(record), 'utf8', (err) => cb(err)));\n queue.defer((cb) => rm(fullPath, { force: true }, (err?: NodeJS.ErrnoException | null) => cb(err)));\n queue.defer((cb) => fs.rename(tempFile, fullPath, (err) => cb(err)));\n queue.await((err) => {\n if (!err) return callback(undefined, record.body);\n rm(tempFile, () => callback(err));\n });\n } catch (err) {\n return callback(err as Error);\n }\n });\n });\n}\n"],"names":["fs","rm","getContent","mkdirp","path","Queue","tempSuffix","update","endpoint","callback","fullPath","join","cachePath","options","hash","err","code","res","body","JSON","parse","content","record","headers","tempFile","queue","defer","cb","writeFile","stringify","force","rename","await","undefined"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,EAAE,QAAQ,mBAAmB;AACtC,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,OAAOC,YAAY,iBAAiB;AACpC,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,WAAW;AAC7B,OAAOC,gBAAgB,cAAc;AAIrC,eAAe,SAASC,OAA8BC,QAAgB,EAAEC,QAA2B;QACnD,oBAAA;IAA9C,MAAMC,WAAWN,KAAKO,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,IAAG,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBN,UAAU,KAAK,CAAC;IAElFL,OAAO,IAAI,CAACS,SAAS,EAAE,CAACG;QACtB,IAAIA,OAAO,AAACA,IAA8BC,IAAI,KAAK,UAAU,OAAOP,SAASM;QAE7Eb,WAAWM,UAAU,QAAQ,CAACO,KAAKE;YACjC,IAAIF,KAAK,OAAON,SAASM;YAEzB,IAAI;;gBACF,MAAMG,OAAOC,KAAKC,KAAK,SAACH,gBAAAA,0BAAAA,IAAKI,OAAO,uCAAI;gBACxC,MAAMC,SAAS;oBAAEC,OAAO,WAAEN,gBAAAA,0BAAAA,IAAKM,OAAO,yCAAI,CAAC;oBAAGL;gBAAK;gBACnD,MAAMM,WAAW,GAAGd,SAAS,CAAC,EAAEJ,cAAc;gBAE9C,MAAMmB,QAAQ,IAAIpB,MAAM;gBACxBoB,MAAMC,KAAK,CAAC,CAACC,KAAO3B,GAAG4B,SAAS,CAACJ,UAAUL,KAAKU,SAAS,CAACP,SAAS,QAAQ,CAACP,MAAQY,GAAGZ;gBACvFU,MAAMC,KAAK,CAAC,CAACC,KAAO1B,GAAGS,UAAU;wBAAEoB,OAAO;oBAAK,GAAG,CAACf,MAAuCY,GAAGZ;gBAC7FU,MAAMC,KAAK,CAAC,CAACC,KAAO3B,GAAG+B,MAAM,CAACP,UAAUd,UAAU,CAACK,MAAQY,GAAGZ;gBAC9DU,MAAMO,KAAK,CAAC,CAACjB;oBACX,IAAI,CAACA,KAAK,OAAON,SAASwB,WAAWX,OAAOJ,IAAI;oBAChDjB,GAAGuB,UAAU,IAAMf,SAASM;gBAC9B;YACF,EAAE,OAAOA,KAAK;gBACZ,OAAON,SAASM;YAClB;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/fetch-json-cache/src/update.ts"],"sourcesContent":["import fs from 'fs';\nimport { rm } from 'fs-remove-compat';\nimport { getContent } from 'get-file-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport tempSuffix from 'temp-suffix';\n\nimport type { CacheContext, Record, UpdateCallback } from './types.ts';\n\nexport default function update<T>(this: CacheContext, endpoint: string, callback: UpdateCallback<T>): void {\n const fullPath = path.join(this.cachePath, `${this.options.hash?.(endpoint)}.json`);\n\n mkdirp(this.cachePath, (err) => {\n if (err && (err as NodeJS.ErrnoException).code !== 'EEXIST') return callback(err);\n\n getContent(endpoint, 'utf8', (err, res) => {\n if (err) return callback(err);\n\n try {\n const parsed = JSON.parse(res?.content ?? 'null');\n const body = this.options.transform ? this.options.transform(parsed, endpoint) : parsed;\n const record = { headers: res?.headers ?? {}, body } as Record<T>;\n const tempFile = `${fullPath}-${tempSuffix()}`;\n\n const queue = new Queue(1);\n queue.defer((cb) => fs.writeFile(tempFile, JSON.stringify(record), 'utf8', (err) => cb(err)));\n queue.defer((cb) => rm(fullPath, { force: true }, (err?: NodeJS.ErrnoException | null) => cb(err)));\n queue.defer((cb) => fs.rename(tempFile, fullPath, (err) => cb(err)));\n queue.await((err) => {\n if (!err) return callback(undefined, record.body);\n rm(tempFile, () => callback(err));\n });\n } catch (err) {\n return callback(err as Error);\n }\n });\n });\n}\n"],"names":["fs","rm","getContent","mkdirp","path","Queue","tempSuffix","update","endpoint","callback","fullPath","join","cachePath","options","hash","err","code","res","parsed","JSON","parse","content","body","transform","record","headers","tempFile","queue","defer","cb","writeFile","stringify","force","rename","await","undefined"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,EAAE,QAAQ,mBAAmB;AACtC,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,OAAOC,YAAY,iBAAiB;AACpC,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,WAAW;AAC7B,OAAOC,gBAAgB,cAAc;AAIrC,eAAe,SAASC,OAA8BC,QAAgB,EAAEC,QAA2B;QACnD,oBAAA;IAA9C,MAAMC,WAAWN,KAAKO,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE,IAAG,qBAAA,CAAA,gBAAA,IAAI,CAACC,OAAO,EAACC,IAAI,cAAjB,yCAAA,wBAAA,eAAoBN,UAAU,KAAK,CAAC;IAElFL,OAAO,IAAI,CAACS,SAAS,EAAE,CAACG;QACtB,IAAIA,OAAO,AAACA,IAA8BC,IAAI,KAAK,UAAU,OAAOP,SAASM;QAE7Eb,WAAWM,UAAU,QAAQ,CAACO,KAAKE;YACjC,IAAIF,KAAK,OAAON,SAASM;YAEzB,IAAI;;gBACF,MAAMG,SAASC,KAAKC,KAAK,SAACH,gBAAAA,0BAAAA,IAAKI,OAAO,uCAAI;gBAC1C,MAAMC,OAAO,IAAI,CAACT,OAAO,CAACU,SAAS,GAAG,IAAI,CAACV,OAAO,CAACU,SAAS,CAACL,QAAQV,YAAYU;gBACjF,MAAMM,SAAS;oBAAEC,OAAO,WAAER,gBAAAA,0BAAAA,IAAKQ,OAAO,yCAAI,CAAC;oBAAGH;gBAAK;gBACnD,MAAMI,WAAW,GAAGhB,SAAS,CAAC,EAAEJ,cAAc;gBAE9C,MAAMqB,QAAQ,IAAItB,MAAM;gBACxBsB,MAAMC,KAAK,CAAC,CAACC,KAAO7B,GAAG8B,SAAS,CAACJ,UAAUP,KAAKY,SAAS,CAACP,SAAS,QAAQ,CAACT,MAAQc,GAAGd;gBACvFY,MAAMC,KAAK,CAAC,CAACC,KAAO5B,GAAGS,UAAU;wBAAEsB,OAAO;oBAAK,GAAG,CAACjB,MAAuCc,GAAGd;gBAC7FY,MAAMC,KAAK,CAAC,CAACC,KAAO7B,GAAGiC,MAAM,CAACP,UAAUhB,UAAU,CAACK,MAAQc,GAAGd;gBAC9DY,MAAMO,KAAK,CAAC,CAACnB;oBACX,IAAI,CAACA,KAAK,OAAON,SAAS0B,WAAWX,OAAOF,IAAI;oBAChDrB,GAAGyB,UAAU,IAAMjB,SAASM;gBAC9B;YACF,EAAE,OAAOA,KAAK;gBACZ,OAAON,SAASM;YAClB;QACF;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fetch-json-cache",
3
- "version": "1.6.3",
3
+ "version": "1.7.0",
4
4
  "description": "Caches fetched json. Updates when etag changes and is uses cache regardless if endpoint unreachable. Uses write-file-atomic for safe updates",
5
5
  "keywords": [
6
6
  "every",
@@ -47,7 +47,6 @@
47
47
  "devDependencies": {
48
48
  "@types/mocha": "*",
49
49
  "@types/node": "*",
50
- "fs-exists-sync": "^0.1.0",
51
50
  "node-version-use": "*",
52
51
  "pinkie-promise": "*",
53
52
  "ts-dev-stack": "*",
@@ -55,5 +54,11 @@
55
54
  },
56
55
  "engines": {
57
56
  "node": ">=0.8"
57
+ },
58
+ "allowScripts": {
59
+ "node-filename-to-dist-paths": true,
60
+ "node-semvers": true,
61
+ "node-version-use": true,
62
+ "thread-sleep-compat": true
58
63
  }
59
64
  }