@repobit/dex-store 0.1.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.
Files changed (36) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +11 -0
  3. package/dist/src/adaptors/adaptor.base.d.ts +58 -0
  4. package/dist/src/adaptors/adaptor.base.js +89 -0
  5. package/dist/src/adaptors/adaptor.base.js.map +1 -0
  6. package/dist/src/format-price.d.ts +6 -0
  7. package/dist/src/format-price.js +17 -0
  8. package/dist/src/format-price.js.map +1 -0
  9. package/dist/src/index.d.ts +4 -0
  10. package/dist/src/index.js +5 -0
  11. package/dist/src/index.js.map +1 -0
  12. package/dist/src/product-options/option.base.d.ts +52 -0
  13. package/dist/src/product-options/option.base.js +72 -0
  14. package/dist/src/product-options/option.base.js.map +1 -0
  15. package/dist/src/products/product.base.d.ts +114 -0
  16. package/dist/src/products/product.base.js +235 -0
  17. package/dist/src/products/product.base.js.map +1 -0
  18. package/dist/src/products/product.init-selector.d.ts +10 -0
  19. package/dist/src/products/product.init-selector.js +77 -0
  20. package/dist/src/products/product.init-selector.js.map +1 -0
  21. package/dist/src/products/product.vlaicu.d.ts +6 -0
  22. package/dist/src/products/product.vlaicu.js +29 -0
  23. package/dist/src/products/product.vlaicu.js.map +1 -0
  24. package/dist/src/providers/provider.init-selector.d.ts +68 -0
  25. package/dist/src/providers/provider.init-selector.js +131 -0
  26. package/dist/src/providers/provider.init-selector.js.map +1 -0
  27. package/dist/src/providers/provider.interface.d.ts +9 -0
  28. package/dist/src/providers/provider.interface.js +2 -0
  29. package/dist/src/providers/provider.interface.js.map +1 -0
  30. package/dist/src/providers/provider.vlaicu.d.ts +7 -0
  31. package/dist/src/providers/provider.vlaicu.js +10 -0
  32. package/dist/src/providers/provider.vlaicu.js.map +1 -0
  33. package/dist/src/store.d.ts +45 -0
  34. package/dist/src/store.js +103 -0
  35. package/dist/src/store.js.map +1 -0
  36. package/package.json +53 -0
@@ -0,0 +1,45 @@
1
+ import { Adaptor } from "./adaptors/adaptor.base.js";
2
+ import { Product, UnboundProductOptionData } from "./products/product.base.js";
3
+ import { InitSelectorProvider } from "./providers/provider.init-selector.js";
4
+ import { Provider, ProviderData } from "./providers/provider.interface.js";
5
+ import { VlaicuProvider } from "./providers/provider.vlaicu.js";
6
+ export type ProductSelector = {
7
+ id: string;
8
+ campaign?: string;
9
+ };
10
+ export type Locale = `${string}-${string}`;
11
+ type ProviderCtor = new (param: ProviderData) => Provider;
12
+ declare const BuiltInProviders: {
13
+ readonly init: typeof InitSelectorProvider;
14
+ readonly vlaicu: typeof VlaicuProvider;
15
+ };
16
+ type ProviderSelector = {
17
+ name: keyof typeof BuiltInProviders | ProviderCtor;
18
+ };
19
+ type StoreConfig = {
20
+ provider: ProviderSelector;
21
+ locale: Locale;
22
+ getCampaign: (param?: ProductSelector) => Promise<string | undefined>;
23
+ transformers?: {
24
+ product?: {
25
+ getOption?: (option: UnboundProductOptionData) => Promise<UnboundProductOptionData>;
26
+ };
27
+ options?: {
28
+ getBuyLink?: (buylink: string) => string;
29
+ };
30
+ };
31
+ };
32
+ export declare class Store {
33
+ private _locale;
34
+ private cache;
35
+ private _adaptor;
36
+ readonly getCampaign: StoreConfig["getCampaign"];
37
+ readonly transformers: StoreConfig["transformers"];
38
+ constructor(config: StoreConfig);
39
+ get locale(): `${string}-${string}`;
40
+ get adaptor(): Promise<Adaptor>;
41
+ getProduct(param: ProductSelector): Promise<Product | undefined>;
42
+ getProduct(param: ProductSelector[]): Promise<(Product | undefined)[]>;
43
+ private getProvider;
44
+ }
45
+ export {};
@@ -0,0 +1,103 @@
1
+ import { Adaptor } from "./adaptors/adaptor.base.js";
2
+ import { setOption } from "./products/product.base.js";
3
+ import { InitSelectorProvider } from "./providers/provider.init-selector.js";
4
+ import { VlaicuProvider } from "./providers/provider.vlaicu.js";
5
+ const BuiltInProviders = {
6
+ init: InitSelectorProvider,
7
+ vlaicu: VlaicuProvider
8
+ };
9
+ class Cache {
10
+ products;
11
+ provider;
12
+ store;
13
+ constructor(param) {
14
+ this.products = new Map();
15
+ this.provider = param.provider;
16
+ this.store = param.store;
17
+ }
18
+ async get({ id, campaign }) {
19
+ const adaptor = await this.store.adaptor;
20
+ const { id: adaptedId } = await adaptor.adaptTo({ id });
21
+ const productKey = `${adaptedId}-${campaign}`;
22
+ // Check if we already have a cached entry.
23
+ const cacheEntry = this.products.get(productKey);
24
+ if (cacheEntry) {
25
+ // If this id has already been added, simply return the cached product.
26
+ if (cacheEntry.ids.has(id)) {
27
+ return await cacheEntry.base;
28
+ }
29
+ // Otherwise, add the new id and update the cached base promise.
30
+ cacheEntry.ids.add(id);
31
+ // Create an updated promise that aggregates new options.
32
+ const updatedProductPromise = (async () => {
33
+ const baseProduct = await cacheEntry.base;
34
+ // Get the new product option for the new id.
35
+ const newProduct = await this.provider.getProduct({ id, campaign });
36
+ // If both exist, aggregate the new options into the base product.
37
+ if (baseProduct && newProduct) {
38
+ // This assumes that setOption aggregates the options into baseProduct.
39
+ baseProduct[setOption]({ options: await newProduct.getOption() });
40
+ }
41
+ return baseProduct;
42
+ })();
43
+ // Update the cached promise so that future calls will wait for aggregation.
44
+ cacheEntry.base = updatedProductPromise;
45
+ return await updatedProductPromise;
46
+ }
47
+ // If no cache entry exists, call the provider and cache the result.
48
+ const productPromise = this.provider.getProduct({ id, campaign });
49
+ this.products.set(productKey, { base: productPromise, ids: new Set([id]) });
50
+ return await productPromise;
51
+ }
52
+ }
53
+ export class Store {
54
+ _locale;
55
+ cache;
56
+ _adaptor;
57
+ getCampaign;
58
+ transformers;
59
+ constructor(config) {
60
+ this._adaptor = Adaptor.create();
61
+ this.cache = new Cache({
62
+ provider: this.getProvider(config.provider),
63
+ store: this
64
+ });
65
+ this._locale = config.locale;
66
+ this.getCampaign = config.getCampaign;
67
+ this.transformers = config.transformers;
68
+ }
69
+ get locale() {
70
+ return this._locale;
71
+ }
72
+ get adaptor() {
73
+ return this._adaptor;
74
+ }
75
+ async getProduct(param) {
76
+ const productListToFetch = Array.isArray(param) ? param : [param];
77
+ const productListToReturn = productListToFetch.map(product => this.cache.get(product));
78
+ const products = (await Promise.allSettled(productListToReturn))
79
+ .filter((promise) => promise.status === "fulfilled" && !!promise.value)
80
+ .map(promise => promise.value);
81
+ if (Array.isArray(param)) {
82
+ return products;
83
+ }
84
+ else {
85
+ return products.pop();
86
+ }
87
+ }
88
+ getProvider(param) {
89
+ // If provider is a string, use the corresponding built‑in constructor.
90
+ const { name: provider } = param ?? {};
91
+ if (typeof provider === "string") {
92
+ const ctor = BuiltInProviders[provider];
93
+ if (ctor) {
94
+ return new ctor({ store: this });
95
+ }
96
+ throw new Error(`Unknown provider string: ${provider}`);
97
+ }
98
+ // Otherwise, assume provider is a constructor (a class definition).
99
+ // This must be a concrete subclass of the abstract Provider.
100
+ return new provider({ store: this });
101
+ }
102
+ }
103
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@repobit/dex-store",
3
+ "version": "0.1.0",
4
+ "description": "Client for pricing API",
5
+ "author": "Buga Adrian Alexandru <abuga@bitdefender.com>",
6
+ "homepage": "https://github.com/bitdefender/dex-core#readme",
7
+ "license": "ISC",
8
+ "type": "module",
9
+ "main": "dist/src/index.js",
10
+ "module": "dist/src/index.js",
11
+ "types": "dist/src/index.d.ts",
12
+ "directories": {
13
+ "src": "dist/src"
14
+ },
15
+ "files": [
16
+ "dist/src",
17
+ "README.md",
18
+ "CHANGELOG.md",
19
+ "LICENSE"
20
+ ],
21
+ "exports": {
22
+ ".": "./dist/src/index.js"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/bitdefender/dex-core.git"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc && tsc-alias",
33
+ "test": "jest"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/bitdefender/dex-core/issues"
37
+ },
38
+ "devDependencies": {
39
+ "@eslint/js": "^9.19.0",
40
+ "@stylistic/eslint-plugin": "^3.0.1",
41
+ "@types/jest": "^29.5.14",
42
+ "eslint": "^9.19.0",
43
+ "globals": "^15.14.0",
44
+ "jest": "^29.7.0",
45
+ "jiti": "^2.4.2",
46
+ "ts-jest": "^29.2.5",
47
+ "ts-node": "^10.9.2",
48
+ "tsc-alias": "^1.8.11",
49
+ "typescript": "^5.7.3",
50
+ "typescript-eslint": "^8.23.0"
51
+ },
52
+ "gitHead": "d93fde85701f3b37988b3f33e453c1dbdb17301e"
53
+ }