@autofleet/settings 2.0.1-beta-context → 3.0.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/dist/index.cjs ADDED
@@ -0,0 +1,3 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var p=require('@autofleet/network'),k=require('@autofleet/logger'),V=require('node-cache'),v=require('node:events'),y=require('moment'),S=require('h3-js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var p__default=/*#__PURE__*/_interopDefault(p);var k__default=/*#__PURE__*/_interopDefault(k);var V__default=/*#__PURE__*/_interopDefault(V);var v__default=/*#__PURE__*/_interopDefault(v);var y__default=/*#__PURE__*/_interopDefault(y);var S__default=/*#__PURE__*/_interopDefault(S);var C=60*5,f="waitingToNetwork",L=g=>g||(process.env.SETTING_MS_SERVICE_HOST?`http://${process.env.SETTING_MS_SERVICE_HOST}/`:void 0)||(process.env.NODE_ENV!=="test"?"http://setting-ms.autofleet.io/":"http://localhost:9999/"),d=class extends Error{},E=class g{constructor({serviceUrl:s,ttl:i=C,disableTestEnvCheck:o=false,logger:c=k__default.default()}={}){this.settingsCache=new V__default.default;this.networkEvents=new v__default.default;this.NEVER_DEFAULT_VALUE=g.NEVER_DEFAULT_VALUE;let t=L(s);this.#t=c,this.ttl=i,this.disableTestEnvCheck=o,this.network=new p__default.default({serviceUrl:t,logger:c});}#t;static get NEVER_DEFAULT_VALUE(){return "NEVER_DEFAULT_VALUE"}static readNetworkValue(s,i,o,c){let t=s;if(typeof s>"u"&&(t=i,c.info("Setting falling back to default as network value was defined",{key:o,defaultValue:i})),t===g.NEVER_DEFAULT_VALUE)throw new Error("Cannot find value from network or cache, default value is set to never");return t}async get(s,i,o=[],{timeout:c=5e3,rejectOnFail:t=false}={}){if(typeof i>"u")throw new Error("Can't get a key without defaultValue");let a=this.getCacheKey(s,o),h=this.settingsCache.get(a);if(h!==void 0){if(this.#t.info("setting found in cache",{cacheKey:a}),f===h){let[r]=await v.once(this.networkEvents,a);if(r instanceof Error&&t)throw r;return g.readNetworkValue(r,i,s,this.#t)}return h}if(!this.disableTestEnvCheck&&process.env.NODE_ENV==="test")return this.#t.info("returning default value setting in TEST mode",{cacheKey:a}),i;let l;try{this.settingsCache.set(a,f,this.ttl),l=(await this.network.get(`/api/v1/settings/get-setting/${s}`,{params:{labels:o.map(e=>JSON.stringify(e))},timeout:c})).data.value;}catch(r){if(this.#t.error("Cant get setting from network",{error:r,rejectOnFail:t,key:s}),t){let e=new d;throw this.networkEvents.emit(a,e),e}}this.networkEvents.emit(a,l);let n;try{n=g.readNetworkValue(l,i,s,this.#t);}catch(r){throw this.settingsCache.del(a),r}return this.settingsCache.set(a,n,this.ttl),n}async getMultiple(s,i,{timeout:o=5e3,rejectOnFail:c=false}={}){let t=new Map,a=new Map,h=new Set,l=new Set;if(s.forEach(n=>{let r=this.getCacheKey(n.key,i);t.set(n.key,r);let e=this.settingsCache.get(r);if(e===void 0){h.add(n.key);return}if(e===f){l.add(n.key);return}a.set(n.key,e);}),process.env.NODE_ENV==="test")return s.map(n=>a.get(n.key)??n.defaultValue);if(l.size){let n=Array.from(l);(await Promise.all(n.map(e=>v.once(this.networkEvents,t.get(e))))).forEach(([e])=>{if(e instanceof Error&&c)throw e;a.set(n.shift(),e);});}if(h.size){let n=Array.from(h);try{n.forEach(e=>this.settingsCache.set(t.get(e),f,this.ttl));let{data:r}=await this.network.post("/api/v1/settings/get-settings/_multiple",{keys:n,labels:i,skipEntityQueryAddition:!0},{timeout:o});n.forEach((e,u)=>{let{value:w}=r[u];a.set(e,w),this.networkEvents.emit(t.get(e),w);});}catch(r){if(this.#t.error("Cant get setting from network",{err:r,settingsToFetch:h,labels:i}),c){let e=new d;throw h.forEach(u=>this.networkEvents.emit(t.get(u),e)),e}}}return s.map(n=>{let r=t.get(n.key),e;try{e=g.readNetworkValue(a.get(n.key),n.defaultValue,n.key,this.#t);}catch(u){throw this.settingsCache.del(r),u}return h.has(n.key)&&this.settingsCache.set(r,e,this.ttl),e})}setLocal(s,i,o){let c=this.getCacheKey(s,i);this.settingsCache.set(c,o,this.ttl);}flush(){return this.settingsCache.flushAll()}getCacheKey(s,i){let o=i.map(t=>{if(t.time)return {...t,time:y__default.default(t.time).startOf("hour").format(),day:y__default.default(t.time).day()};if(t.location?.lat&&t.location?.lng){let a=S__default.default.latLngToCell(t.location.lat,t.location.lng,8);return {...t,location:a}}return t});return `${s}_${JSON.stringify(o)}`}},K=E;
2
+ exports.CannotGetNetworkValueError=d;exports.default=K;//# sourceMappingURL=index.cjs.map
3
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["fiveMinutes","waitingToNetwork","findUrl","serviceUrl","CannotGetNetworkValueError","SettingsManager","_SettingsManager","ttl","disableTestEnvCheck","logger","Logger","NodeCache","EventEmitter","localServiceUrl","#logger","Network","networkValue","defaultValue","key","returnValue","labels","timeout","rejectOnFail","cacheKey","cacheValue","once","label","error","errorToThrow","e","settingsToGet","cacheKeyCache","settingsToReturn","settingsToFetch","cachedSettingsToAwait","obj","keys","values","index","value","err","setting","newLabels","l","moment","h3Index","h3","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport Network from '@autofleet/network';\nimport Logger, { LoggerInstanceManager } from '@autofleet/logger';\nimport NodeCache from 'node-cache';\nimport EventEmitter, { once } from 'node:events';\nimport moment from 'moment';\nimport h3 from 'h3-js';\n\nconst fiveMinutes = 60 * 5;\nconst waitingToNetwork = 'waitingToNetwork';\n\nconst findUrl = (serviceUrl?: string) => serviceUrl\n || (process.env.SETTING_MS_SERVICE_HOST ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)\n /* c8 ignore next */\n || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');\n\ninterface SettingsClassOptions {\n serviceUrl?: string;\n ttl?: number;\n disableTestEnvCheck?: boolean;\n logger?: LoggerInstanceManager;\n}\n\ntype SettingValue = string | boolean | number | any[] | any;\n\ninterface Location {\n lat: number;\n lng: number;\n}\nexport interface Label {\n businessModelId?: string;\n demandSourceId?: string;\n fleetId?: string;\n vendorId?: string;\n time?: string | Date;\n location?: Location;\n contextId?: string;\n}\n\ninterface GetSettingOption {\n timeout?: number;\n rejectOnFail?: boolean;\n}\n\nexport class CannotGetNetworkValueError extends Error {}\n\nclass SettingsManager {\n readonly ttl: number;\n\n readonly settingsCache = new NodeCache();\n\n readonly networkEvents = new EventEmitter();\n\n readonly network: Network;\n\n readonly NEVER_DEFAULT_VALUE = SettingsManager.NEVER_DEFAULT_VALUE;\n\n readonly disableTestEnvCheck: boolean;\n\n readonly #logger: LoggerInstanceManager;\n\n static get NEVER_DEFAULT_VALUE(): 'NEVER_DEFAULT_VALUE' {\n return 'NEVER_DEFAULT_VALUE';\n }\n\n static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue {\n let returnValue = networkValue;\n if (typeof networkValue === 'undefined') {\n returnValue = defaultValue;\n logger.info('Setting falling back to default as network value was defined', { key, defaultValue });\n }\n\n if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {\n throw new Error('Cannot find value from network or cache, default value is set to never');\n }\n\n return returnValue;\n }\n\n constructor({\n serviceUrl, ttl = fiveMinutes, disableTestEnvCheck = false, logger = Logger(),\n }: SettingsClassOptions = {}) {\n const localServiceUrl = findUrl(serviceUrl);\n\n this.#logger = logger;\n this.ttl = ttl;\n this.disableTestEnvCheck = disableTestEnvCheck;\n this.network = new Network({\n serviceUrl: localServiceUrl, logger,\n });\n }\n\n async get(\n key: SettingValue,\n defaultValue?: SettingValue,\n labels: Label[] = [],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue> {\n if (typeof defaultValue === 'undefined') {\n throw new Error('Can\\'t get a key without defaultValue');\n }\n\n const cacheKey = this.getCacheKey(key, labels);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue !== undefined) {\n this.#logger.info('setting found in cache', { cacheKey });\n if (waitingToNetwork === cacheValue) {\n const [networkValue] = await once(this.networkEvents, cacheKey);\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n return SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n }\n return cacheValue;\n }\n\n if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {\n this.#logger.info('returning default value setting in TEST mode', { cacheKey });\n return defaultValue;\n }\n\n let networkValue;\n try {\n this.settingsCache.set(cacheKey, waitingToNetwork, this.ttl);\n const networkResponse = await this.network.get(`/api/v1/settings/get-setting/${key}`, {\n params: {\n labels: labels.map((label) => JSON.stringify(label)),\n },\n timeout,\n });\n networkValue = networkResponse.data.value;\n } catch (error) {\n this.#logger.error('Cant get setting from network', { error, rejectOnFail, key });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n this.networkEvents.emit(cacheKey, errorToThrow);\n throw errorToThrow;\n }\n }\n\n this.networkEvents.emit(cacheKey, networkValue);\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n } catch (e) {\n this.settingsCache.del(cacheKey);\n throw e;\n }\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n return returnValue;\n }\n\n async getMultiple(\n settingsToGet: { key: string; defaultValue: SettingValue; }[],\n labels: Label[],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue[]> {\n const cacheKeyCache = new Map<string, string>();\n const settingsToReturn = new Map();\n const settingsToFetch = new Set<string>();\n const cachedSettingsToAwait = new Set<string>();\n\n settingsToGet.forEach((obj) => {\n const cacheKey = this.getCacheKey(obj.key, labels);\n cacheKeyCache.set(obj.key, cacheKey);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue === undefined) {\n settingsToFetch.add(obj.key);\n return;\n }\n if (cacheValue === waitingToNetwork) {\n cachedSettingsToAwait.add(obj.key);\n return;\n }\n settingsToReturn.set(obj.key, cacheValue);\n });\n\n if (process.env.NODE_ENV === 'test') {\n return settingsToGet.map((obj) => settingsToReturn.get(obj.key) ?? obj.defaultValue);\n }\n\n if (cachedSettingsToAwait.size) {\n const keys = Array.from(cachedSettingsToAwait);\n const cached = await Promise.all(keys.map((key) => once(this.networkEvents, cacheKeyCache.get(key)!)));\n cached.forEach(([networkValue]) => {\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n settingsToReturn.set(keys.shift()!, networkValue);\n });\n }\n\n if (settingsToFetch.size) {\n const keys = Array.from(settingsToFetch);\n try {\n keys.forEach((key) => this.settingsCache.set(cacheKeyCache.get(key)!, waitingToNetwork, this.ttl));\n const { data: values } = await this.network.post<SettingValue[]>('/api/v1/settings/get-settings/_multiple', {\n keys,\n labels,\n skipEntityQueryAddition: true,\n }, {\n timeout,\n });\n\n keys.forEach((key, index) => {\n const { value } = values[index];\n settingsToReturn.set(key, value);\n this.networkEvents.emit(cacheKeyCache.get(key)!, value);\n });\n } catch (err) {\n this.#logger.error('Cant get setting from network', { err, settingsToFetch, labels });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n settingsToFetch.forEach((key) => this.networkEvents.emit(cacheKeyCache.get(key)!, errorToThrow));\n throw errorToThrow;\n }\n }\n }\n\n return settingsToGet.map((setting) => {\n const cacheKey = cacheKeyCache.get(setting.key)!;\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key, this.#logger);\n } catch (err) {\n this.settingsCache.del(cacheKey);\n throw err;\n }\n if (settingsToFetch.has(setting.key)) {\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n }\n return returnValue;\n });\n }\n\n setLocal(key: string, labels: Label[], value: SettingValue): void {\n const cacheKey = this.getCacheKey(key, labels);\n this.settingsCache.set<SettingValue>(cacheKey, value, this.ttl);\n }\n\n flush(): void {\n return this.settingsCache.flushAll();\n }\n\n getCacheKey(key: SettingValue, labels: Label[]): string {\n const newLabels = labels.map((l) => {\n if (l.time) {\n return {\n ...l,\n time: moment(l.time).startOf('hour').format(),\n day: moment(l.time).day(),\n };\n }\n\n if (l.location?.lat && l.location?.lng) {\n const h3Index = h3.latLngToCell(l.location.lat, l.location.lng, 8);\n return {\n ...l,\n location: h3Index,\n };\n }\n\n return l;\n });\n\n const cacheKey = `${key}_${JSON.stringify(newLabels)}`;\n return cacheKey;\n }\n}\n\nexport default SettingsManager;\n"]}
@@ -0,0 +1,53 @@
1
+ import Network from '@autofleet/network';
2
+ import { LoggerInstanceManager } from '@autofleet/logger';
3
+ import NodeCache from 'node-cache';
4
+ import EventEmitter from 'node:events';
5
+
6
+ interface SettingsClassOptions {
7
+ serviceUrl?: string;
8
+ ttl?: number;
9
+ disableTestEnvCheck?: boolean;
10
+ logger?: LoggerInstanceManager;
11
+ }
12
+ type SettingValue = string | boolean | number | any[] | any;
13
+ interface Location {
14
+ lat: number;
15
+ lng: number;
16
+ }
17
+ interface Label {
18
+ businessModelId?: string;
19
+ demandSourceId?: string;
20
+ fleetId?: string;
21
+ vendorId?: string;
22
+ time?: string | Date;
23
+ location?: Location;
24
+ contextId?: string;
25
+ }
26
+ interface GetSettingOption {
27
+ timeout?: number;
28
+ rejectOnFail?: boolean;
29
+ }
30
+ declare class CannotGetNetworkValueError extends Error {
31
+ }
32
+ declare class SettingsManager {
33
+ #private;
34
+ readonly ttl: number;
35
+ readonly settingsCache: NodeCache;
36
+ readonly networkEvents: EventEmitter<[never]>;
37
+ readonly network: Network;
38
+ readonly NEVER_DEFAULT_VALUE: "NEVER_DEFAULT_VALUE";
39
+ readonly disableTestEnvCheck: boolean;
40
+ static get NEVER_DEFAULT_VALUE(): 'NEVER_DEFAULT_VALUE';
41
+ static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue;
42
+ constructor({ serviceUrl, ttl, disableTestEnvCheck, logger, }?: SettingsClassOptions);
43
+ get(key: SettingValue, defaultValue?: SettingValue, labels?: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue>;
44
+ getMultiple(settingsToGet: {
45
+ key: string;
46
+ defaultValue: SettingValue;
47
+ }[], labels: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue[]>;
48
+ setLocal(key: string, labels: Label[], value: SettingValue): void;
49
+ flush(): void;
50
+ getCacheKey(key: SettingValue, labels: Label[]): string;
51
+ }
52
+
53
+ export { CannotGetNetworkValueError, type Label, SettingsManager as default };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,13 @@
1
+ import Network from '@autofleet/network';
2
+ import { LoggerInstanceManager } from '@autofleet/logger';
1
3
  import NodeCache from 'node-cache';
2
- import EventEmitter from 'events';
4
+ import EventEmitter from 'node:events';
5
+
3
6
  interface SettingsClassOptions {
4
7
  serviceUrl?: string;
5
8
  ttl?: number;
6
9
  disableTestEnvCheck?: boolean;
10
+ logger?: LoggerInstanceManager;
7
11
  }
8
12
  type SettingValue = string | boolean | number | any[] | any;
9
13
  interface Location {
@@ -13,34 +17,37 @@ interface Location {
13
17
  interface Label {
14
18
  businessModelId?: string;
15
19
  demandSourceId?: string;
16
- contextId?: string;
17
20
  fleetId?: string;
18
21
  vendorId?: string;
19
22
  time?: string | Date;
20
23
  location?: Location;
24
+ contextId?: string;
21
25
  }
22
- type LabelsArray = Label[];
23
26
  interface GetSettingOption {
24
27
  timeout?: number;
25
28
  rejectOnFail?: boolean;
26
29
  }
30
+ declare class CannotGetNetworkValueError extends Error {
31
+ }
27
32
  declare class SettingsManager {
28
- ttl: number;
29
- settingsCache: NodeCache;
30
- networkEvents: EventEmitter;
31
- network: any;
32
- NEVER_DEFAULT_VALUE: string;
33
- disableTestEnvCheck: boolean;
33
+ #private;
34
+ readonly ttl: number;
35
+ readonly settingsCache: NodeCache;
36
+ readonly networkEvents: EventEmitter<[never]>;
37
+ readonly network: Network;
38
+ readonly NEVER_DEFAULT_VALUE: "NEVER_DEFAULT_VALUE";
39
+ readonly disableTestEnvCheck: boolean;
34
40
  static get NEVER_DEFAULT_VALUE(): 'NEVER_DEFAULT_VALUE';
35
- static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string): any;
36
- constructor({ serviceUrl, ttl, disableTestEnvCheck }?: SettingsClassOptions);
37
- get(key: SettingValue, defaultValue?: SettingValue, labels?: LabelsArray, { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue>;
41
+ static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue;
42
+ constructor({ serviceUrl, ttl, disableTestEnvCheck, logger, }?: SettingsClassOptions);
43
+ get(key: SettingValue, defaultValue?: SettingValue, labels?: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue>;
38
44
  getMultiple(settingsToGet: {
39
- key: SettingValue;
40
- defaultValue: any;
41
- }[], labels: LabelsArray, { timeout, rejectOnFail }?: GetSettingOption): Promise<any>;
42
- setLocal(key: string, labels: LabelsArray, value: SettingValue): void;
45
+ key: string;
46
+ defaultValue: SettingValue;
47
+ }[], labels: Label[], { timeout, rejectOnFail }?: GetSettingOption): Promise<SettingValue[]>;
48
+ setLocal(key: string, labels: Label[], value: SettingValue): void;
43
49
  flush(): void;
44
- getCacheKey(key: SettingValue, labels: LabelsArray): string;
50
+ getCacheKey(key: SettingValue, labels: Label[]): string;
45
51
  }
46
- export default SettingsManager;
52
+
53
+ export { CannotGetNetworkValueError, type Label, SettingsManager as default };
package/dist/index.js CHANGED
@@ -1,215 +1,3 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- // eslint-disable-next-line max-classes-per-file
39
- const dotenv_1 = __importDefault(require("dotenv"));
40
- const network_1 = __importDefault(require("@autofleet/network"));
41
- const logger_1 = __importDefault(require("@autofleet/logger"));
42
- const node_cache_1 = __importDefault(require("node-cache"));
43
- const events_1 = __importStar(require("events"));
44
- const moment_1 = __importDefault(require("moment"));
45
- const h3_js_1 = __importDefault(require("h3-js"));
46
- dotenv_1.default.config();
47
- const logger = (0, logger_1.default)();
48
- const fiveMinutes = 60 * 5;
49
- const waitingToNetwork = 'waitingToNetwork';
50
- const findUrl = (serviceUrl) => serviceUrl
51
- || (process.env.SETTING_MS_SERVICE_HOST && process.env.SETTING_MS_SERVICE_HOST.length > 0 ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)
52
- || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');
53
- class CannotGetNetworkValueError extends Error {
54
- }
55
- class SettingsManager {
56
- static get NEVER_DEFAULT_VALUE() {
57
- return 'NEVER_DEFAULT_VALUE';
58
- }
59
- static readNetworkValue(networkValue, defaultValue, key) {
60
- let returnValue = networkValue;
61
- if (typeof networkValue === 'undefined') {
62
- returnValue = defaultValue;
63
- logger.info('Setting falling back to default as network value was defined', { key, defaultValue });
64
- }
65
- if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {
66
- throw new Error('Cannot find value from network or cache, default value is set to never');
67
- }
68
- return returnValue;
69
- }
70
- constructor({ serviceUrl, ttl = fiveMinutes, disableTestEnvCheck = false } = {}) {
71
- const localServiceUrl = findUrl(serviceUrl);
72
- this.NEVER_DEFAULT_VALUE = SettingsManager.NEVER_DEFAULT_VALUE;
73
- this.ttl = ttl;
74
- this.disableTestEnvCheck = disableTestEnvCheck;
75
- this.settingsCache = new node_cache_1.default();
76
- this.networkEvents = new events_1.default();
77
- this.network = new network_1.default({
78
- serviceUrl: localServiceUrl,
79
- });
80
- }
81
- get(key_1, defaultValue_1) {
82
- return __awaiter(this, arguments, void 0, function* (key, defaultValue, labels = [], { timeout = 5000, rejectOnFail = false } = {}) {
83
- if (typeof defaultValue === 'undefined') {
84
- throw new Error('Can\'t get a key without defaultValue');
85
- }
86
- const cacheKey = this.getCacheKey(key, labels);
87
- const cacheValue = this.settingsCache.get(cacheKey);
88
- if (cacheValue !== undefined) {
89
- logger.info('setting found in cache', { cacheKey });
90
- if (waitingToNetwork === cacheValue) {
91
- yield Promise.resolve();
92
- const [networkValue] = yield (0, events_1.once)(this.networkEvents, cacheKey);
93
- if (networkValue instanceof Error && rejectOnFail) {
94
- throw networkValue;
95
- }
96
- return SettingsManager.readNetworkValue(networkValue, defaultValue, key);
97
- }
98
- return cacheValue;
99
- }
100
- if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {
101
- logger.info('returning default value setting in TEST mode', { cacheKey });
102
- return defaultValue;
103
- }
104
- let networkValue;
105
- try {
106
- this.settingsCache.set(cacheKey, waitingToNetwork, this.ttl);
107
- const networkResponse = yield this.network.get(`/api/v1/settings/get-setting/${key}`, {
108
- params: {
109
- labels: labels.map((label) => JSON.stringify(label)),
110
- },
111
- timeout,
112
- });
113
- networkValue = networkResponse.data.value;
114
- }
115
- catch (error) {
116
- logger.error('Cant get setting from network', { error, rejectOnFail, key });
117
- if (rejectOnFail) {
118
- const errorToThrow = new CannotGetNetworkValueError();
119
- this.networkEvents.emit(cacheKey, errorToThrow);
120
- throw errorToThrow;
121
- }
122
- }
123
- this.networkEvents.emit(cacheKey, networkValue);
124
- let returnValue;
125
- try {
126
- returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key);
127
- }
128
- catch (e) {
129
- this.settingsCache.del(cacheKey);
130
- throw e;
131
- }
132
- this.settingsCache.set(cacheKey, returnValue, this.ttl);
133
- return returnValue;
134
- });
135
- }
136
- getMultiple(settingsToGet_1, labels_1) {
137
- return __awaiter(this, arguments, void 0, function* (settingsToGet, labels, { timeout = 5000, rejectOnFail = false } = {}) {
138
- const settingsToReturn = new Map();
139
- const settingsToFetch = [];
140
- settingsToGet.forEach((obj) => {
141
- const cacheKey = this.getCacheKey(obj.key, labels);
142
- const cacheValue = this.settingsCache.get(cacheKey);
143
- if (cacheValue !== undefined && cacheValue !== waitingToNetwork) {
144
- settingsToReturn.set(obj.key, cacheValue);
145
- }
146
- else {
147
- settingsToFetch.push(obj.key);
148
- }
149
- });
150
- if (process.env.NODE_ENV === 'test') {
151
- return settingsToGet.map((obj) => (settingsToReturn.get(obj.key) !== undefined ? settingsToReturn.get(obj.key) : obj.defaultValue));
152
- }
153
- if (settingsToFetch.length > 0) {
154
- let values;
155
- try {
156
- const { data } = yield this.network.post('/api/v1/settings/get-settings/_multiple', {
157
- keys: settingsToFetch,
158
- labels,
159
- skipEntityQueryAddition: true,
160
- }, {
161
- timeout,
162
- });
163
- values = data;
164
- settingsToFetch.forEach((key, index) => {
165
- settingsToReturn.set(key, values[index].value);
166
- });
167
- }
168
- catch (err) {
169
- logger.error('Cant get setting from network', { err, settingsToFetch, labels });
170
- if (rejectOnFail) {
171
- throw new CannotGetNetworkValueError();
172
- }
173
- }
174
- }
175
- return settingsToGet.map((setting) => {
176
- const cacheKey = this.getCacheKey(setting.key, labels);
177
- let returnValue;
178
- try {
179
- returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key);
180
- }
181
- catch (err) {
182
- this.settingsCache.del(cacheKey);
183
- throw err;
184
- }
185
- if (settingsToFetch.indexOf(setting.key) !== -1) {
186
- this.settingsCache.set(cacheKey, returnValue, this.ttl);
187
- }
188
- return returnValue;
189
- });
190
- });
191
- }
192
- setLocal(key, labels, value) {
193
- const cacheKey = this.getCacheKey(key, labels);
194
- this.settingsCache.set(cacheKey, value, this.ttl);
195
- }
196
- flush() {
197
- return this.settingsCache.flushAll();
198
- }
199
- getCacheKey(key, labels) {
200
- const newLabels = labels.map((l) => {
201
- var _a, _b;
202
- if (l.time) {
203
- return Object.assign(Object.assign({}, l), { time: (0, moment_1.default)(l.time).startOf('hour').format(), day: (0, moment_1.default)(l.time).day() });
204
- }
205
- if (((_a = l.location) === null || _a === void 0 ? void 0 : _a.lat) && ((_b = l.location) === null || _b === void 0 ? void 0 : _b.lng)) {
206
- const h3Index = h3_js_1.default.latLngToCell(l.location.lat, l.location.lng, 8);
207
- return Object.assign(Object.assign({}, l), { location: h3Index });
208
- }
209
- return l;
210
- });
211
- const cacheKey = `${key}_${JSON.stringify(newLabels)}`;
212
- return cacheKey;
213
- }
214
- }
215
- exports.default = SettingsManager;
1
+ import p from'@autofleet/network';import k from'@autofleet/logger';import V from'node-cache';import v,{once}from'node:events';import y from'moment';import S from'h3-js';var C=60*5,f="waitingToNetwork",L=g=>g||(process.env.SETTING_MS_SERVICE_HOST?`http://${process.env.SETTING_MS_SERVICE_HOST}/`:void 0)||(process.env.NODE_ENV!=="test"?"http://setting-ms.autofleet.io/":"http://localhost:9999/"),d=class extends Error{},E=class g{constructor({serviceUrl:s,ttl:i=C,disableTestEnvCheck:o=false,logger:c=k()}={}){this.settingsCache=new V;this.networkEvents=new v;this.NEVER_DEFAULT_VALUE=g.NEVER_DEFAULT_VALUE;let t=L(s);this.#t=c,this.ttl=i,this.disableTestEnvCheck=o,this.network=new p({serviceUrl:t,logger:c});}#t;static get NEVER_DEFAULT_VALUE(){return "NEVER_DEFAULT_VALUE"}static readNetworkValue(s,i,o,c){let t=s;if(typeof s>"u"&&(t=i,c.info("Setting falling back to default as network value was defined",{key:o,defaultValue:i})),t===g.NEVER_DEFAULT_VALUE)throw new Error("Cannot find value from network or cache, default value is set to never");return t}async get(s,i,o=[],{timeout:c=5e3,rejectOnFail:t=false}={}){if(typeof i>"u")throw new Error("Can't get a key without defaultValue");let a=this.getCacheKey(s,o),h=this.settingsCache.get(a);if(h!==void 0){if(this.#t.info("setting found in cache",{cacheKey:a}),f===h){let[r]=await once(this.networkEvents,a);if(r instanceof Error&&t)throw r;return g.readNetworkValue(r,i,s,this.#t)}return h}if(!this.disableTestEnvCheck&&process.env.NODE_ENV==="test")return this.#t.info("returning default value setting in TEST mode",{cacheKey:a}),i;let l;try{this.settingsCache.set(a,f,this.ttl),l=(await this.network.get(`/api/v1/settings/get-setting/${s}`,{params:{labels:o.map(e=>JSON.stringify(e))},timeout:c})).data.value;}catch(r){if(this.#t.error("Cant get setting from network",{error:r,rejectOnFail:t,key:s}),t){let e=new d;throw this.networkEvents.emit(a,e),e}}this.networkEvents.emit(a,l);let n;try{n=g.readNetworkValue(l,i,s,this.#t);}catch(r){throw this.settingsCache.del(a),r}return this.settingsCache.set(a,n,this.ttl),n}async getMultiple(s,i,{timeout:o=5e3,rejectOnFail:c=false}={}){let t=new Map,a=new Map,h=new Set,l=new Set;if(s.forEach(n=>{let r=this.getCacheKey(n.key,i);t.set(n.key,r);let e=this.settingsCache.get(r);if(e===void 0){h.add(n.key);return}if(e===f){l.add(n.key);return}a.set(n.key,e);}),process.env.NODE_ENV==="test")return s.map(n=>a.get(n.key)??n.defaultValue);if(l.size){let n=Array.from(l);(await Promise.all(n.map(e=>once(this.networkEvents,t.get(e))))).forEach(([e])=>{if(e instanceof Error&&c)throw e;a.set(n.shift(),e);});}if(h.size){let n=Array.from(h);try{n.forEach(e=>this.settingsCache.set(t.get(e),f,this.ttl));let{data:r}=await this.network.post("/api/v1/settings/get-settings/_multiple",{keys:n,labels:i,skipEntityQueryAddition:!0},{timeout:o});n.forEach((e,u)=>{let{value:w}=r[u];a.set(e,w),this.networkEvents.emit(t.get(e),w);});}catch(r){if(this.#t.error("Cant get setting from network",{err:r,settingsToFetch:h,labels:i}),c){let e=new d;throw h.forEach(u=>this.networkEvents.emit(t.get(u),e)),e}}}return s.map(n=>{let r=t.get(n.key),e;try{e=g.readNetworkValue(a.get(n.key),n.defaultValue,n.key,this.#t);}catch(u){throw this.settingsCache.del(r),u}return h.has(n.key)&&this.settingsCache.set(r,e,this.ttl),e})}setLocal(s,i,o){let c=this.getCacheKey(s,i);this.settingsCache.set(c,o,this.ttl);}flush(){return this.settingsCache.flushAll()}getCacheKey(s,i){let o=i.map(t=>{if(t.time)return {...t,time:y(t.time).startOf("hour").format(),day:y(t.time).day()};if(t.location?.lat&&t.location?.lng){let a=S.latLngToCell(t.location.lat,t.location.lng,8);return {...t,location:a}}return t});return `${s}_${JSON.stringify(o)}`}},K=E;
2
+ export{d as CannotGetNetworkValueError,K as default};//# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["fiveMinutes","waitingToNetwork","findUrl","serviceUrl","CannotGetNetworkValueError","SettingsManager","_SettingsManager","ttl","disableTestEnvCheck","logger","Logger","NodeCache","EventEmitter","localServiceUrl","#logger","Network","networkValue","defaultValue","key","returnValue","labels","timeout","rejectOnFail","cacheKey","cacheValue","once","label","error","errorToThrow","e","settingsToGet","cacheKeyCache","settingsToReturn","settingsToFetch","cachedSettingsToAwait","obj","keys","values","index","value","err","setting","newLabels","l","moment","h3Index","h3","index_default"],"mappings":"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","file":"index.js","sourcesContent":["// eslint-disable-next-line max-classes-per-file\nimport Network from '@autofleet/network';\nimport Logger, { LoggerInstanceManager } from '@autofleet/logger';\nimport NodeCache from 'node-cache';\nimport EventEmitter, { once } from 'node:events';\nimport moment from 'moment';\nimport h3 from 'h3-js';\n\nconst fiveMinutes = 60 * 5;\nconst waitingToNetwork = 'waitingToNetwork';\n\nconst findUrl = (serviceUrl?: string) => serviceUrl\n || (process.env.SETTING_MS_SERVICE_HOST ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)\n /* c8 ignore next */\n || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');\n\ninterface SettingsClassOptions {\n serviceUrl?: string;\n ttl?: number;\n disableTestEnvCheck?: boolean;\n logger?: LoggerInstanceManager;\n}\n\ntype SettingValue = string | boolean | number | any[] | any;\n\ninterface Location {\n lat: number;\n lng: number;\n}\nexport interface Label {\n businessModelId?: string;\n demandSourceId?: string;\n fleetId?: string;\n vendorId?: string;\n time?: string | Date;\n location?: Location;\n contextId?: string;\n}\n\ninterface GetSettingOption {\n timeout?: number;\n rejectOnFail?: boolean;\n}\n\nexport class CannotGetNetworkValueError extends Error {}\n\nclass SettingsManager {\n readonly ttl: number;\n\n readonly settingsCache = new NodeCache();\n\n readonly networkEvents = new EventEmitter();\n\n readonly network: Network;\n\n readonly NEVER_DEFAULT_VALUE = SettingsManager.NEVER_DEFAULT_VALUE;\n\n readonly disableTestEnvCheck: boolean;\n\n readonly #logger: LoggerInstanceManager;\n\n static get NEVER_DEFAULT_VALUE(): 'NEVER_DEFAULT_VALUE' {\n return 'NEVER_DEFAULT_VALUE';\n }\n\n static readNetworkValue(networkValue: SettingValue, defaultValue: SettingValue, key: string, logger: LoggerInstanceManager): SettingValue {\n let returnValue = networkValue;\n if (typeof networkValue === 'undefined') {\n returnValue = defaultValue;\n logger.info('Setting falling back to default as network value was defined', { key, defaultValue });\n }\n\n if (returnValue === SettingsManager.NEVER_DEFAULT_VALUE) {\n throw new Error('Cannot find value from network or cache, default value is set to never');\n }\n\n return returnValue;\n }\n\n constructor({\n serviceUrl, ttl = fiveMinutes, disableTestEnvCheck = false, logger = Logger(),\n }: SettingsClassOptions = {}) {\n const localServiceUrl = findUrl(serviceUrl);\n\n this.#logger = logger;\n this.ttl = ttl;\n this.disableTestEnvCheck = disableTestEnvCheck;\n this.network = new Network({\n serviceUrl: localServiceUrl, logger,\n });\n }\n\n async get(\n key: SettingValue,\n defaultValue?: SettingValue,\n labels: Label[] = [],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue> {\n if (typeof defaultValue === 'undefined') {\n throw new Error('Can\\'t get a key without defaultValue');\n }\n\n const cacheKey = this.getCacheKey(key, labels);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue !== undefined) {\n this.#logger.info('setting found in cache', { cacheKey });\n if (waitingToNetwork === cacheValue) {\n const [networkValue] = await once(this.networkEvents, cacheKey);\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n return SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n }\n return cacheValue;\n }\n\n if (!this.disableTestEnvCheck && process.env.NODE_ENV === 'test') {\n this.#logger.info('returning default value setting in TEST mode', { cacheKey });\n return defaultValue;\n }\n\n let networkValue;\n try {\n this.settingsCache.set(cacheKey, waitingToNetwork, this.ttl);\n const networkResponse = await this.network.get(`/api/v1/settings/get-setting/${key}`, {\n params: {\n labels: labels.map((label) => JSON.stringify(label)),\n },\n timeout,\n });\n networkValue = networkResponse.data.value;\n } catch (error) {\n this.#logger.error('Cant get setting from network', { error, rejectOnFail, key });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n this.networkEvents.emit(cacheKey, errorToThrow);\n throw errorToThrow;\n }\n }\n\n this.networkEvents.emit(cacheKey, networkValue);\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(networkValue, defaultValue, key, this.#logger);\n } catch (e) {\n this.settingsCache.del(cacheKey);\n throw e;\n }\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n return returnValue;\n }\n\n async getMultiple(\n settingsToGet: { key: string; defaultValue: SettingValue; }[],\n labels: Label[],\n { timeout = 5000, rejectOnFail = false }: GetSettingOption = {},\n ): Promise<SettingValue[]> {\n const cacheKeyCache = new Map<string, string>();\n const settingsToReturn = new Map();\n const settingsToFetch = new Set<string>();\n const cachedSettingsToAwait = new Set<string>();\n\n settingsToGet.forEach((obj) => {\n const cacheKey = this.getCacheKey(obj.key, labels);\n cacheKeyCache.set(obj.key, cacheKey);\n const cacheValue = this.settingsCache.get(cacheKey);\n if (cacheValue === undefined) {\n settingsToFetch.add(obj.key);\n return;\n }\n if (cacheValue === waitingToNetwork) {\n cachedSettingsToAwait.add(obj.key);\n return;\n }\n settingsToReturn.set(obj.key, cacheValue);\n });\n\n if (process.env.NODE_ENV === 'test') {\n return settingsToGet.map((obj) => settingsToReturn.get(obj.key) ?? obj.defaultValue);\n }\n\n if (cachedSettingsToAwait.size) {\n const keys = Array.from(cachedSettingsToAwait);\n const cached = await Promise.all(keys.map((key) => once(this.networkEvents, cacheKeyCache.get(key)!)));\n cached.forEach(([networkValue]) => {\n if (networkValue instanceof Error && rejectOnFail) {\n throw networkValue;\n }\n settingsToReturn.set(keys.shift()!, networkValue);\n });\n }\n\n if (settingsToFetch.size) {\n const keys = Array.from(settingsToFetch);\n try {\n keys.forEach((key) => this.settingsCache.set(cacheKeyCache.get(key)!, waitingToNetwork, this.ttl));\n const { data: values } = await this.network.post<SettingValue[]>('/api/v1/settings/get-settings/_multiple', {\n keys,\n labels,\n skipEntityQueryAddition: true,\n }, {\n timeout,\n });\n\n keys.forEach((key, index) => {\n const { value } = values[index];\n settingsToReturn.set(key, value);\n this.networkEvents.emit(cacheKeyCache.get(key)!, value);\n });\n } catch (err) {\n this.#logger.error('Cant get setting from network', { err, settingsToFetch, labels });\n if (rejectOnFail) {\n const errorToThrow = new CannotGetNetworkValueError();\n settingsToFetch.forEach((key) => this.networkEvents.emit(cacheKeyCache.get(key)!, errorToThrow));\n throw errorToThrow;\n }\n }\n }\n\n return settingsToGet.map((setting) => {\n const cacheKey = cacheKeyCache.get(setting.key)!;\n let returnValue;\n try {\n returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue, setting.key, this.#logger);\n } catch (err) {\n this.settingsCache.del(cacheKey);\n throw err;\n }\n if (settingsToFetch.has(setting.key)) {\n this.settingsCache.set(cacheKey, returnValue, this.ttl);\n }\n return returnValue;\n });\n }\n\n setLocal(key: string, labels: Label[], value: SettingValue): void {\n const cacheKey = this.getCacheKey(key, labels);\n this.settingsCache.set<SettingValue>(cacheKey, value, this.ttl);\n }\n\n flush(): void {\n return this.settingsCache.flushAll();\n }\n\n getCacheKey(key: SettingValue, labels: Label[]): string {\n const newLabels = labels.map((l) => {\n if (l.time) {\n return {\n ...l,\n time: moment(l.time).startOf('hour').format(),\n day: moment(l.time).day(),\n };\n }\n\n if (l.location?.lat && l.location?.lng) {\n const h3Index = h3.latLngToCell(l.location.lat, l.location.lng, 8);\n return {\n ...l,\n location: h3Index,\n };\n }\n\n return l;\n });\n\n const cacheKey = `${key}_${JSON.stringify(newLabels)}`;\n return cacheKey;\n }\n}\n\nexport default SettingsManager;\n"]}
package/package.json CHANGED
@@ -1,45 +1,62 @@
1
1
  {
2
2
  "name": "@autofleet/settings",
3
- "version": "2.0.1-beta-context",
3
+ "version": "3.0.0",
4
4
  "description": "",
5
- "main": "dist/index.js",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "readme.md"
24
+ ],
6
25
  "scripts": {
7
26
  "start": "ts-node src/index.ts",
8
- "example": "ts-node src/example.ts",
9
- "build": "tsc",
10
- "prepublish": "npm run build",
11
- "linter": "./node_modules/.bin/eslint .",
12
- "test": "jest --forceExit",
13
- "coverage": "jest --coverage --forceExit --runInBand && rm -rf ./coverage",
27
+ "build": "tsup",
28
+ "prepublish": "node --run build",
29
+ "linter": "eslint .",
30
+ "test": "vitest",
31
+ "coverage": "vitest --coverage",
14
32
  "dev": "nodemon"
15
33
  },
16
34
  "engines": {
17
- "node": ">=16.0.0"
35
+ "node": ">=18.0.0"
18
36
  },
19
37
  "peerDependencies": {
20
- "@autofleet/logger": ">=4.0.0"
38
+ "@autofleet/logger": ">=4.2.0"
21
39
  },
22
40
  "dependencies": {
23
- "@autofleet/network": "^1.4.2",
24
- "dotenv": "^8.2.0",
41
+ "@autofleet/network": "^1.7.5",
25
42
  "h3-js": "^4.1.0",
26
- "moment": "^2.29.1",
43
+ "moment": "^2.30.1",
27
44
  "node-cache": "^5.1.2"
28
45
  },
29
46
  "devDependencies": {
30
- "@autofleet/logger": "^4.0.6",
31
- "@types/jest": "^29.5.12",
32
- "@types/nock": "^10.0.3",
33
- "@types/node": "^16.18.108",
47
+ "@autofleet/logger": "^4.2.0",
48
+ "@types/nock": "^11.1.0",
49
+ "@types/node": "^18.19.75",
34
50
  "@typescript-eslint/eslint-plugin": "^7.18.0",
51
+ "@vitest/coverage-v8": "^3.0.5",
35
52
  "eslint": "^8.56.0",
36
53
  "eslint-config-airbnb-typescript": "^18.0.0",
37
- "eslint-plugin-import": "^2.30.0",
38
- "jest": "^29.7.0",
39
- "nock": "^10.0.2",
40
- "ts-jest": "^29.2.3",
54
+ "eslint-plugin-import": "^2.31.0",
55
+ "nock": "^14.0.1",
41
56
  "ts-node": "^8.6.2",
42
- "typescript": "^5.5.3"
57
+ "tsup": "^8.3.6",
58
+ "typescript": "^5.5.3",
59
+ "vitest": "^3.0.5"
43
60
  },
44
61
  "author": "",
45
62
  "license": "ISC"
package/.eslintrc.json DELETED
@@ -1,68 +0,0 @@
1
- {
2
- "root": true,
3
- "env": {
4
- "node": true,
5
- "jest": true
6
- },
7
- "extends": [
8
- "airbnb-base",
9
- "plugin:@typescript-eslint/recommended"
10
- ],
11
- "rules": {
12
- "import/extensions": [
13
- "error",
14
- "ignorePackages",
15
- {
16
- "js": "never",
17
- "jsx": "never",
18
- "ts": "never",
19
- "tsx": "never"
20
- }
21
- ],
22
- "@typescript-eslint/no-unused-vars": ["error"],
23
- "@typescript-eslint/no-var-requires": ["off"],
24
- "@typescript-eslint/no-explicit-any": "warn",
25
- "@typescript-eslint/camelcase": ["off"],
26
- "max-len": ["off"],
27
- "@typescript-eslint/explicit-function-return-type": ["off"],
28
- "class-methods-use-this": "off"
29
- },
30
- "overrides": [
31
- {
32
- // enable the rule specifically for TypeScript files
33
- "files": ["src/**.js", "src/**.ts"],
34
- "rules": {
35
- "@typescript-eslint/explicit-function-return-type": ["off"],
36
- "@typescript-eslint/no-var-requires": ["off"],
37
- "@typescript-eslint/camelcase": ["off"]
38
- }
39
- }
40
- ],
41
- "parser": "@typescript-eslint/parser",
42
- "parserOptions": {
43
- "project": "./tsconfig.json",
44
- "sourceType": "module"
45
- },
46
- "ignorePatterns": ["dist/*", "node_modules/", "jest.config.js", "migrations/*", "newrelic.js"],
47
- "plugins": ["@typescript-eslint"],
48
- "settings": {
49
- "import/extensions": [
50
- "error",
51
- "ignorePackages",
52
- {
53
- "js": "never",
54
- "jsx": "never",
55
- "ts": "never",
56
- "tsx": "never"
57
- }
58
- ],
59
- "import/parsers": {
60
- "@typescript-eslint/parser": [".ts",".tsx"]
61
- },
62
- "import/resolver": {
63
- "node": {
64
- "extensions": [".js",".jsx",".ts",".tsx", ".json"]
65
- }
66
- }
67
- }
68
- }
@@ -1 +0,0 @@
1
- export {};