@repobit/dex-store 1.3.39 → 1.3.40

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/CHANGELOG.md CHANGED
@@ -3,6 +3,13 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.3.40](https://github.com/bitdefender/dex-core/compare/@repobit/dex-store@1.3.39...@repobit/dex-store@1.3.40) (2026-06-08)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **DEX-27633:** update platform ID retrieval in ProductLoadedEvent and VlaicuProvider
11
+
12
+
6
13
  ## [1.3.39](https://github.com/bitdefender/dex-core/compare/@repobit/dex-store@1.3.38...@repobit/dex-store@1.3.39) (2026-06-05)
7
14
 
8
15
  **Note:** Version bump only for package @repobit/dex-store
@@ -44,7 +44,7 @@ export class VlaicuProvider extends Provider {
44
44
  campaignType: fetchResponse.campaignType || '',
45
45
  buyLinkBaseUrl: fetchResponse.buyLinkBaseUrl,
46
46
  currency,
47
- platformId: fetchResponse.platformProductId,
47
+ platformId: fetchResponse.platformProductId || fetchResponse.product.productId,
48
48
  options
49
49
  }
50
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"provider.vlaicu.js","sourceRoot":"","sources":["../../../src/providers/provider.vlaicu.ts"],"names":[],"mappings":"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","sourcesContent":["import { Product, UnboundProductData, UnboundProductOptionData } from \"@/products/product.base.js\";\nimport { VlaicuProduct } from \"@/products/product.vlaicu.js\";\nimport { STORE_LOCALE } from \"@/store.constants\";\nimport type { Locale, ProductSelector } from \"@/store.js\";\nimport { FetchedProduct, INGNORE_CAMPAIGN, Provider, ProviderData } from \"./provider.base.js\";\n\nexport interface FetchResponse {\n code : number;\n message : string;\n campaign : string;\n campaignType : string;\n platformProductId : string;\n buyLinkBaseUrl? : string;\n verifoneProductCode: string;\n product : ProductData;\n}\n\nexport interface ProductData {\n productId : string;\n productName : string;\n buyLinkBaseUrl?: string;\n options : OptionData[];\n}\n\nexport interface OptionData {\n slots : number;\n months : number;\n currency : string;\n price : number;\n discountedPrice : number;\n discountAmount : number;\n discountPercentage : number;\n buyLink : string;\n verifoneOptionCode? : string;\n verifoneProductId? : string;\n coupon? : string;\n checkoutPaymentPeriod?: string;\n optionCode? : string\n}\nexport class VlaicuProvider extends Provider {\n constructor(param: ProviderData) {\n super(param)\n }\n\n protected _getProduct(product: UnboundProductData | undefined): Product | undefined {\n return product ? new VlaicuProduct({ ...product, store: this.store }) : product;\n }\n\n async fetch({ id, campaign }: ProductSelector): Promise<FetchedProduct | undefined> {\n const adaptedId = (await this.adaptTo({ id })).id;\n const computedCampaign = await this.getCampaign(adaptedId, campaign)\n const apiURL = this.buildApiURL(adaptedId, this.store[STORE_LOCALE], computedCampaign);\n\n let fetchResponse: FetchResponse;\n try {\n const response = await fetch(apiURL.href, {\n method : \"get\",\n headers: {\n \"Content-Type\": \"application/json\"\n }\n });\n\n if (!response.ok) return undefined;\n\n fetchResponse = await response.json();\n } catch (error) {\n console.error(\"Failed to fetch product:\", error);\n return undefined;\n }\n\n // Process variations into option data.\n const { options, currency } = await this.processVariations(\n adaptedId,\n fetchResponse.product.options\n );\n\n // Return an UnboundProductData.\n return {\n overrides: {\n oldCampaign: campaign,\n newCampaign: computedCampaign\n },\n product: {\n id : adaptedId,\n alias : id,\n name : fetchResponse.product.productName,\n campaign : computedCampaign || fetchResponse.campaign,\n campaignType : fetchResponse.campaignType || '',\n buyLinkBaseUrl: fetchResponse.buyLinkBaseUrl,\n currency,\n platformId : fetchResponse.platformProductId,\n options\n }\n }\n }\n\n private buildApiURL(id: string, locale: Locale, campaign?: string): URL {\n const apiParams = [\"products\", id, \"locale\", locale];\n if (campaign) {\n apiParams.push(\"campaign\", INGNORE_CAMPAIGN.includes(String(campaign)) ? \"null\" : campaign);\n }\n const url = new URL(`https://www.bitdefender.com/p-api/v1/${apiParams.join(\"/\")}`);\n return url;\n }\n\n private async processVariations(\n id: string,\n variations: OptionData[]\n ): Promise<{ options: Map<string, UnboundProductOptionData>; currency: string }> {\n const options = new Map<string, UnboundProductOptionData>();\n let currency = \"\";\n\n // Loop through devices and subscriptions.\n for (const variation of variations) {\n const variationData: UnboundProductOptionData = {\n devices : variation.slots,\n subscription : variation.months,\n price : Number(variation.price),\n discountedPrice : Number(variation.price === variation.discountedPrice ? NaN : variation.discountedPrice),\n buyLink : variation.buyLink,\n verifoneOptionCode : variation.verifoneOptionCode,\n verifoneProductId : variation.verifoneProductId,\n coupon : variation.coupon,\n checkoutPaymentPeriod: variation.checkoutPaymentPeriod,\n bundle : []\n };\n\n // Capture common info.\n currency = variation.currency;\n\n options.set(`${variation.slots}-${variation.months}`, variationData);\n }\n return { options, currency };\n }\n}\n"]}
1
+ {"version":3,"file":"provider.vlaicu.js","sourceRoot":"","sources":["../../../src/providers/provider.vlaicu.ts"],"names":[],"mappings":"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","sourcesContent":["import { Product, UnboundProductData, UnboundProductOptionData } from \"@/products/product.base.js\";\nimport { VlaicuProduct } from \"@/products/product.vlaicu.js\";\nimport { STORE_LOCALE } from \"@/store.constants\";\nimport type { Locale, ProductSelector } from \"@/store.js\";\nimport { FetchedProduct, INGNORE_CAMPAIGN, Provider, ProviderData } from \"./provider.base.js\";\n\nexport interface FetchResponse {\n code : number;\n message : string;\n campaign : string;\n campaignType : string;\n platformProductId : string;\n buyLinkBaseUrl? : string;\n verifoneProductCode: string;\n product : ProductData;\n}\n\nexport interface ProductData {\n productId : string;\n productName : string;\n buyLinkBaseUrl?: string;\n options : OptionData[];\n}\n\nexport interface OptionData {\n slots : number;\n months : number;\n currency : string;\n price : number;\n discountedPrice : number;\n discountAmount : number;\n discountPercentage : number;\n buyLink : string;\n verifoneOptionCode? : string;\n verifoneProductId? : string;\n coupon? : string;\n checkoutPaymentPeriod?: string;\n optionCode? : string\n}\nexport class VlaicuProvider extends Provider {\n constructor(param: ProviderData) {\n super(param)\n }\n\n protected _getProduct(product: UnboundProductData | undefined): Product | undefined {\n return product ? new VlaicuProduct({ ...product, store: this.store }) : product;\n }\n\n async fetch({ id, campaign }: ProductSelector): Promise<FetchedProduct | undefined> {\n const adaptedId = (await this.adaptTo({ id })).id;\n const computedCampaign = await this.getCampaign(adaptedId, campaign)\n const apiURL = this.buildApiURL(adaptedId, this.store[STORE_LOCALE], computedCampaign);\n\n let fetchResponse: FetchResponse;\n try {\n const response = await fetch(apiURL.href, {\n method : \"get\",\n headers: {\n \"Content-Type\": \"application/json\"\n }\n });\n\n if (!response.ok) return undefined;\n\n fetchResponse = await response.json();\n } catch (error) {\n console.error(\"Failed to fetch product:\", error);\n return undefined;\n }\n\n // Process variations into option data.\n const { options, currency } = await this.processVariations(\n adaptedId,\n fetchResponse.product.options\n );\n\n // Return an UnboundProductData.\n return {\n overrides: {\n oldCampaign: campaign,\n newCampaign: computedCampaign\n },\n product: {\n id : adaptedId,\n alias : id,\n name : fetchResponse.product.productName,\n campaign : computedCampaign || fetchResponse.campaign,\n campaignType : fetchResponse.campaignType || '',\n buyLinkBaseUrl: fetchResponse.buyLinkBaseUrl,\n currency,\n platformId : fetchResponse.platformProductId || fetchResponse.product.productId,\n options\n }\n }\n }\n\n private buildApiURL(id: string, locale: Locale, campaign?: string): URL {\n const apiParams = [\"products\", id, \"locale\", locale];\n if (campaign) {\n apiParams.push(\"campaign\", INGNORE_CAMPAIGN.includes(String(campaign)) ? \"null\" : campaign);\n }\n const url = new URL(`https://www.bitdefender.com/p-api/v1/${apiParams.join(\"/\")}`);\n return url;\n }\n\n private async processVariations(\n id: string,\n variations: OptionData[]\n ): Promise<{ options: Map<string, UnboundProductOptionData>; currency: string }> {\n const options = new Map<string, UnboundProductOptionData>();\n let currency = \"\";\n\n // Loop through devices and subscriptions.\n for (const variation of variations) {\n const variationData: UnboundProductOptionData = {\n devices : variation.slots,\n subscription : variation.months,\n price : Number(variation.price),\n discountedPrice : Number(variation.price === variation.discountedPrice ? NaN : variation.discountedPrice),\n buyLink : variation.buyLink,\n verifoneOptionCode : variation.verifoneOptionCode,\n verifoneProductId : variation.verifoneProductId,\n coupon : variation.coupon,\n checkoutPaymentPeriod: variation.checkoutPaymentPeriod,\n bundle : []\n };\n\n // Capture common info.\n currency = variation.currency;\n\n options.set(`${variation.slots}-${variation.months}`, variationData);\n }\n return { options, currency };\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@repobit/dex-store",
3
- "version": "1.3.39",
3
+ "version": "1.3.40",
4
4
  "description": "Client for pricing API",
5
5
  "author": "Buga Adrian Alexandru <abuga@bitdefender.com>",
6
6
  "homepage": "https://github.com/bitdefender/dex-core#readme",
@@ -39,7 +39,7 @@
39
39
  "node": "24.14.0"
40
40
  },
41
41
  "dependencies": {
42
- "@repobit/dex-constants": "2.1.26"
42
+ "@repobit/dex-constants": "2.1.27"
43
43
  },
44
- "gitHead": "5a0d002cb047281b51cf86d7e428704f9358a0bf"
44
+ "gitHead": "303379a04658dd5f00780100c7e2c33a543fe2d9"
45
45
  }