store-scrapper-js-common 1.0.203 → 1.0.204
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/utils/product.utils.js +5 -1
- package/dist/utils/product.utils.js.map +1 -1
- package/dist/utils/string-utils.d.ts +1 -0
- package/dist/utils/string-utils.js +23 -1
- package/dist/utils/string-utils.js.map +1 -1
- package/package.json +1 -1
- package/src/utils/product.utils.ts +7 -1
- package/src/utils/string-utils.ts +29 -0
|
@@ -94,9 +94,13 @@ const parseProductDtoToTypesenseDocument = (product) => {
|
|
|
94
94
|
});
|
|
95
95
|
foundCategories = foundCategories.filter((category) => category !== entities_1.CATEGORY_ENUM.CATEGORY_NOT_FOUND);
|
|
96
96
|
}
|
|
97
|
+
let inferredCategories = [];
|
|
98
|
+
if (!(0, array_utils_1.isArrayEmpty)(ref.inferredCategories)) {
|
|
99
|
+
inferredCategories = (0, string_utils_1.getStringsAsStrArr)(ref.inferredCategories);
|
|
100
|
+
}
|
|
97
101
|
const updatedAtDate = new Date(ref.updatedAt || ref.extractedAt || Date.now());
|
|
98
102
|
const bucketData = (0, time_utils_1.getBucketTime)(customBucketTimeDate || updatedAtDate);
|
|
99
|
-
return Object.assign(Object.assign({ id: ref._id }, priceStats), { storeRef: ref.storeRef, storeName: ref.storeName || 'no store name', isMarketplace: ref.isMarketplace === true, name: ref.name || 'no name', sku: ref.sku, ean: ref.ean, url: ref.url, image: ref.image, brandName: ref.brandName ? (0, string_utils_1.normalizeString)(ref.brandName) : undefined, sellerName: ref.sellerName, category: ref.category, categoryPath: ref.categoryPath, price: ref.price, bestPrice: ref.bestPrice, conditionalPrice: ref.conditionalPrice, priceHistory: ref.priceHistory, currency: ref.currency || entities_1.CurrencyEnum.CLP, enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null, categoryKeywordNames: foundCategories, updateReasons: (ref.updateReason || []).filter((e) => e), updatedAt: updatedAtDate.getTime(), priceUpdatedAt: priceUpdatedAt, bucketTime: bucketData && bucketData.bucketTime ? bucketData.bucketTime : undefined, bucketDate: bucketData && bucketData.bucketDate ? bucketData.bucketDate : undefined });
|
|
103
|
+
return Object.assign(Object.assign({ id: ref._id }, priceStats), { storeRef: ref.storeRef, storeName: ref.storeName || 'no store name', isMarketplace: ref.isMarketplace === true, name: ref.name || 'no name', sku: ref.sku, ean: ref.ean, url: ref.url, image: ref.image, brandName: ref.brandName ? (0, string_utils_1.normalizeString)(ref.brandName) : undefined, sellerName: ref.sellerName, category: ref.category, categoryPath: ref.categoryPath, price: ref.price, bestPrice: ref.bestPrice, conditionalPrice: ref.conditionalPrice, priceHistory: ref.priceHistory, currency: ref.currency || entities_1.CurrencyEnum.CLP, enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null, categoryKeywordNames: foundCategories, inferredCategories: inferredCategories, updateReasons: (ref.updateReason || []).filter((e) => e), updatedAt: updatedAtDate.getTime(), priceUpdatedAt: priceUpdatedAt, bucketTime: bucketData && bucketData.bucketTime ? bucketData.bucketTime : undefined, bucketDate: bucketData && bucketData.bucketDate ? bucketData.bucketDate : undefined });
|
|
100
104
|
};
|
|
101
105
|
exports.parseProductDtoToTypesenseDocument = parseProductDtoToTypesenseDocument;
|
|
102
106
|
//# sourceMappingURL=product.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.utils.js","sourceRoot":"/","sources":["utils/product.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {hasElementInArray, isArrayEmpty} from './array-utils';\nimport {CATEGORY_ENUM, CurrencyEnum, Product, Store, UpdateReasonEnum} from '../entities';\nimport {ObjectLiteral} from \"../classes\";\nimport {getMinPrice} from \"./price-utils\";\nimport {getCategoryFacetLabel} from \"./facet-categories-map\";\nimport {getBucketTime} from \"./time-utils\";\nimport {normalizeString} from \"./string-utils\";\n\nexport const getStoreName = (product: Product, stores: Store[]): string => {\n if ((!stores || stores.length === 0) && product) {\n return product.storeName;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n const store = stores.find((storeElement) => storeElement._id.toString() === product.storeRef);\n if (store) {\n return store.displayName || store.name;\n }\n\n return null;\n};\n\nexport const hasUpdateReason = (enums: UpdateReasonEnum[], search: UpdateReasonEnum[]): boolean => hasElementInArray<UpdateReasonEnum>(enums, search);\n\nexport const parseProductDtoToTypesenseDocument = (product: Product): ObjectLiteral => {\n if (!product) {\n return null;\n }\n\n const ref: Product = JSON.parse(JSON.stringify(product));\n\n let priceStats = null;\n\n let priceUpdatedAt = new Date(\n ref.price.updatedAt || ref.price.createdAt || ref.extractedAt || ref.updatedAt,\n ).getTime();\n\n if (ref.priceStats) {\n // TODO: Search how to look for specific pivot prices in Typesense search\n // Slice 3 pivot prices\n const pivotPrices = (ref.priceStats.pivotPrices || []).slice(0, 3);\n\n // Add max discount single field\n // Prioritize Current Offer and Conditional Price\n // If neither of those exists then use previous price\n let maxDiscount = 0;\n if (ref.priceStats.currentMinPriceMaxPriceDiffPct > 0) {\n maxDiscount = ref.priceStats.currentMinPriceMaxPriceDiffPct;\n }\n\n // TODO: Was updated to use currentMaxPrice, update or create a new field\n if (ref.priceStats.conditionalPriceMinPriceDiffPct) {\n if (\n maxDiscount === 0 ||\n ref.priceStats.conditionalPriceMinPriceDiffPct > ref.priceStats.currentMinPriceMaxPriceDiffPct\n ) {\n maxDiscount = ref.priceStats.conditionalPriceMinPriceDiffPct;\n const useDate =\n ref.conditionalPrice && ref.conditionalPrice.createdAt ? ref.conditionalPrice.createdAt : ref.extractedAt;\n if (useDate) {\n priceUpdatedAt = new Date(useDate).getTime();\n }\n }\n }\n\n if (maxDiscount === 0 && ref.priceStats.currentPricePrevPriceDiffPct > 0) {\n let hasFakePrevPrice = false;\n\n // Pedidos Ya CL set to only use current price\n if (product.storeRef === '634b4c2ebf4c49e4b3672aba') {\n hasFakePrevPrice = true;\n }\n\n if (!hasFakePrevPrice && (!product.currency || product.currency === CurrencyEnum.CLP)) {\n const minPrevPrice = getMinPrice(ref.previousPrice);\n const minPrevPriceStr = minPrevPrice.toString();\n if (minPrevPrice > 0) {\n if (product.isMarketplace && minPrevPriceStr.endsWith('000')) {\n hasFakePrevPrice = true;\n }\n\n if (minPrevPrice === 9999999 || minPrevPrice === 10000000) {\n hasFakePrevPrice = true;\n }\n } else {\n hasFakePrevPrice = true;\n }\n }\n\n if (!hasFakePrevPrice) {\n maxDiscount = ref.priceStats.currentPricePrevPriceDiffPct;\n }\n }\n\n priceStats = {\n priceStats_pricesCount: ref.priceStats.pricesCount,\n priceStats_avgMinPrice: ref.priceStats.avgMinPrice,\n priceStats_currentMinPrice: ref.priceStats.currentMinPrice,\n priceStats_currentMaxPrice: ref.priceStats.currentMaxPrice,\n priceStats_currentPriceBestPriceDiffPct: ref.priceStats.currentPriceBestPriceDiffPct,\n priceStats_currentPricePrevPriceDiffPct: ref.priceStats.currentPricePrevPriceDiffPct,\n priceStats_currentMinPriceMaxPriceDiffPct: ref.priceStats.currentMinPriceMaxPriceDiffPct,\n priceStats_conditionalPriceMinPriceDiffPct: ref.priceStats.conditionalPriceMinPriceDiffPct || 0,\n priceStats_currentPriceAvgMinPriceDiffPct: ref.priceStats.currentPriceAvgMinPriceDiffPct,\n priceStats_maxDiscountPct: maxDiscount,\n priceStats_pivotPrices: pivotPrices,\n };\n }\n\n // If it doesn't have a price down or relisted or new listing then use current time - 30m to show to all users in web\n let customBucketTimeDate: Date | null = null;\n if (\n !hasUpdateReason(\n [UpdateReasonEnum.PRICE_DOWN, UpdateReasonEnum.RE_LISTING, UpdateReasonEnum.NEW_LISTING],\n product.updateReason,\n )\n ) {\n customBucketTimeDate = new Date(Date.now() - 1000 * 60 * 30);\n }\n\n // TODO: Append inferred categories to ref.categoryKeywordNames\n // TODO: Only append categories found in categoriesEnEsMap\n let foundCategories: string[] = [...(ref.categoryKeywordNames || [])];\n if (!isArrayEmpty(ref.inferredCategories)) {\n ref.inferredCategories.forEach((inferredCategory) => {\n if (getCategoryFacetLabel({ key: inferredCategory })) {\n foundCategories.push(inferredCategory);\n }\n });\n\n // remove CATEGORY_NOT_FOUND\n // as it found inferred categories\n foundCategories = foundCategories.filter((category) => category !== CATEGORY_ENUM.CATEGORY_NOT_FOUND);\n }\n\n const updatedAtDate = new Date(ref.updatedAt || ref.extractedAt || Date.now());\n const bucketData = getBucketTime(customBucketTimeDate || updatedAtDate);\n\n return <ObjectLiteral>{\n id: ref._id,\n ...priceStats,\n storeRef: ref.storeRef,\n storeName: ref.storeName || 'no store name',\n isMarketplace: ref.isMarketplace === true,\n name: ref.name || 'no name',\n sku: ref.sku,\n ean: ref.ean,\n url: ref.url,\n image: ref.image,\n brandName: ref.brandName ? normalizeString(ref.brandName) : undefined,\n sellerName: ref.sellerName,\n // priceStats: priceStats,\n category: ref.category,\n categoryPath: ref.categoryPath,\n price: ref.price,\n bestPrice: ref.bestPrice,\n conditionalPrice: ref.conditionalPrice,\n priceHistory: ref.priceHistory,\n currency: ref.currency || CurrencyEnum.CLP,\n enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null,\n categoryKeywordNames: foundCategories, // ref.categoryKeywordNames,\n updateReasons: (ref.updateReason || []).filter((e) => e),\n updatedAt: updatedAtDate.getTime(),\n priceUpdatedAt: priceUpdatedAt,\n bucketTime: bucketData && bucketData.bucketTime ? bucketData.bucketTime : undefined,\n bucketDate: bucketData && bucketData.bucketDate ? bucketData.bucketDate : undefined,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"product.utils.js","sourceRoot":"/","sources":["utils/product.utils.ts"],"names":[],"mappings":";;;AAAA,+CAA8D;AAC9D,0CAA0F;AAE1F,+CAA0C;AAC1C,iEAA6D;AAC7D,6CAA2C;AAC3C,iDAAmE;AAE5D,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,MAAe,EAAU,EAAE;IACxE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,SAAS,CAAC;IAC3B,CAAC;IAGD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9F,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAZW,QAAA,YAAY,gBAYvB;AAEK,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAE,MAA0B,EAAW,EAAE,CAAC,IAAA,+BAAiB,EAAmB,KAAK,EAAE,MAAM,CAAC,CAAC;AAAzI,QAAA,eAAe,mBAA0H;AAE/I,MAAM,kCAAkC,GAAG,CAAC,OAAgB,EAAiB,EAAE;IACpF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzD,IAAI,UAAU,GAAG,IAAI,CAAC;IAEtB,IAAI,cAAc,GAAG,IAAI,IAAI,CACzB,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CACjF,CAAC,OAAO,EAAE,CAAC;IAEZ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAGnB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAKnE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,8BAA8B,GAAG,CAAC,EAAE,CAAC;YACtD,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAC9D,CAAC;QAGD,IAAI,GAAG,CAAC,UAAU,CAAC,+BAA+B,EAAE,CAAC;YACnD,IACI,WAAW,KAAK,CAAC;gBACjB,GAAG,CAAC,UAAU,CAAC,+BAA+B,GAAG,GAAG,CAAC,UAAU,CAAC,8BAA8B,EAChG,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,+BAA+B,CAAC;gBAC7D,MAAM,OAAO,GACT,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC9G,IAAI,OAAO,EAAE,CAAC;oBACZ,cAAc,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,WAAW,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,4BAA4B,GAAG,CAAC,EAAE,CAAC;YACzE,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAG7B,IAAI,OAAO,CAAC,QAAQ,KAAK,0BAA0B,EAAE,CAAC;gBACpD,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,uBAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtF,MAAM,YAAY,GAAG,IAAA,yBAAW,EAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAChD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACrB,IAAI,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7D,gBAAgB,GAAG,IAAI,CAAC;oBAC1B,CAAC;oBAED,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;wBAC1D,gBAAgB,GAAG,IAAI,CAAC;oBAC1B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,gBAAgB,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,4BAA4B,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,UAAU,GAAG;YACX,sBAAsB,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;YAClD,sBAAsB,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;YAClD,0BAA0B,EAAE,GAAG,CAAC,UAAU,CAAC,eAAe;YAC1D,0BAA0B,EAAE,GAAG,CAAC,UAAU,CAAC,eAAe;YAC1D,uCAAuC,EAAE,GAAG,CAAC,UAAU,CAAC,4BAA4B;YACpF,uCAAuC,EAAE,GAAG,CAAC,UAAU,CAAC,4BAA4B;YACpF,yCAAyC,EAAE,GAAG,CAAC,UAAU,CAAC,8BAA8B;YACxF,0CAA0C,EAAE,GAAG,CAAC,UAAU,CAAC,+BAA+B,IAAI,CAAC;YAC/F,yCAAyC,EAAE,GAAG,CAAC,UAAU,CAAC,8BAA8B;YACxF,yBAAyB,EAAE,WAAW;YACtC,sBAAsB,EAAE,WAAW;SACpC,CAAC;IACJ,CAAC;IAGD,IAAI,oBAAoB,GAAgB,IAAI,CAAC;IAC7C,IACI,CAAC,IAAA,uBAAe,EACZ,CAAC,2BAAgB,CAAC,UAAU,EAAE,2BAAgB,CAAC,UAAU,EAAE,2BAAgB,CAAC,WAAW,CAAC,EACxF,OAAO,CAAC,YAAY,CACvB,EACH,CAAC;QACD,oBAAoB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAID,IAAI,eAAe,GAAa,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,IAAA,0BAAY,EAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,EAAE;YAClD,IAAI,IAAA,4CAAqB,EAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;gBACrD,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAIH,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,wBAAa,CAAC,kBAAkB,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,kBAAkB,GAAa,EAAE,CAAC;IACtC,IAAI,CAAC,IAAA,0BAAY,EAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,kBAAkB,GAAG,IAAA,iCAAkB,EAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,IAAA,0BAAa,EAAC,oBAAoB,IAAI,aAAa,CAAC,CAAC;IAExE,OAAO,8BACL,EAAE,EAAE,GAAG,CAAC,GAAG,IACR,UAAU,KACb,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,eAAe,EAC3C,aAAa,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,EACzC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS,EAC3B,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,8BAAe,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EACrE,UAAU,EAAE,GAAG,CAAC,UAAU,EAE1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EACtC,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,uBAAY,CAAC,GAAG,EAC1C,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAC3F,oBAAoB,EAAE,eAAe,EACrC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EACxD,SAAS,EAAE,aAAa,CAAC,OAAO,EAAE,EAClC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EACnF,UAAU,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,GACpF,CAAC;AACJ,CAAC,CAAC;AArJW,QAAA,kCAAkC,sCAqJ7C","sourcesContent":["import {hasElementInArray, isArrayEmpty} from './array-utils';\nimport {CATEGORY_ENUM, CurrencyEnum, Product, Store, UpdateReasonEnum} from '../entities';\nimport {ObjectLiteral} from \"../classes\";\nimport {getMinPrice} from \"./price-utils\";\nimport {getCategoryFacetLabel} from \"./facet-categories-map\";\nimport {getBucketTime} from \"./time-utils\";\nimport {getStringsAsStrArr, normalizeString} from \"./string-utils\";\n\nexport const getStoreName = (product: Product, stores: Store[]): string => {\n if ((!stores || stores.length === 0) && product) {\n return product.storeName;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n const store = stores.find((storeElement) => storeElement._id.toString() === product.storeRef);\n if (store) {\n return store.displayName || store.name;\n }\n\n return null;\n};\n\nexport const hasUpdateReason = (enums: UpdateReasonEnum[], search: UpdateReasonEnum[]): boolean => hasElementInArray<UpdateReasonEnum>(enums, search);\n\nexport const parseProductDtoToTypesenseDocument = (product: Product): ObjectLiteral => {\n if (!product) {\n return null;\n }\n\n const ref: Product = JSON.parse(JSON.stringify(product));\n\n let priceStats = null;\n\n let priceUpdatedAt = new Date(\n ref.price.updatedAt || ref.price.createdAt || ref.extractedAt || ref.updatedAt,\n ).getTime();\n\n if (ref.priceStats) {\n // TODO: Search how to look for specific pivot prices in Typesense search\n // Slice 3 pivot prices\n const pivotPrices = (ref.priceStats.pivotPrices || []).slice(0, 3);\n\n // Add max discount single field\n // Prioritize Current Offer and Conditional Price\n // If neither of those exists then use previous price\n let maxDiscount = 0;\n if (ref.priceStats.currentMinPriceMaxPriceDiffPct > 0) {\n maxDiscount = ref.priceStats.currentMinPriceMaxPriceDiffPct;\n }\n\n // TODO: Was updated to use currentMaxPrice, update or create a new field\n if (ref.priceStats.conditionalPriceMinPriceDiffPct) {\n if (\n maxDiscount === 0 ||\n ref.priceStats.conditionalPriceMinPriceDiffPct > ref.priceStats.currentMinPriceMaxPriceDiffPct\n ) {\n maxDiscount = ref.priceStats.conditionalPriceMinPriceDiffPct;\n const useDate =\n ref.conditionalPrice && ref.conditionalPrice.createdAt ? ref.conditionalPrice.createdAt : ref.extractedAt;\n if (useDate) {\n priceUpdatedAt = new Date(useDate).getTime();\n }\n }\n }\n\n if (maxDiscount === 0 && ref.priceStats.currentPricePrevPriceDiffPct > 0) {\n let hasFakePrevPrice = false;\n\n // Pedidos Ya CL set to only use current price\n if (product.storeRef === '634b4c2ebf4c49e4b3672aba') {\n hasFakePrevPrice = true;\n }\n\n if (!hasFakePrevPrice && (!product.currency || product.currency === CurrencyEnum.CLP)) {\n const minPrevPrice = getMinPrice(ref.previousPrice);\n const minPrevPriceStr = minPrevPrice.toString();\n if (minPrevPrice > 0) {\n if (product.isMarketplace && minPrevPriceStr.endsWith('000')) {\n hasFakePrevPrice = true;\n }\n\n if (minPrevPrice === 9999999 || minPrevPrice === 10000000) {\n hasFakePrevPrice = true;\n }\n } else {\n hasFakePrevPrice = true;\n }\n }\n\n if (!hasFakePrevPrice) {\n maxDiscount = ref.priceStats.currentPricePrevPriceDiffPct;\n }\n }\n\n priceStats = {\n priceStats_pricesCount: ref.priceStats.pricesCount,\n priceStats_avgMinPrice: ref.priceStats.avgMinPrice,\n priceStats_currentMinPrice: ref.priceStats.currentMinPrice,\n priceStats_currentMaxPrice: ref.priceStats.currentMaxPrice,\n priceStats_currentPriceBestPriceDiffPct: ref.priceStats.currentPriceBestPriceDiffPct,\n priceStats_currentPricePrevPriceDiffPct: ref.priceStats.currentPricePrevPriceDiffPct,\n priceStats_currentMinPriceMaxPriceDiffPct: ref.priceStats.currentMinPriceMaxPriceDiffPct,\n priceStats_conditionalPriceMinPriceDiffPct: ref.priceStats.conditionalPriceMinPriceDiffPct || 0,\n priceStats_currentPriceAvgMinPriceDiffPct: ref.priceStats.currentPriceAvgMinPriceDiffPct,\n priceStats_maxDiscountPct: maxDiscount,\n priceStats_pivotPrices: pivotPrices,\n };\n }\n\n // If it doesn't have a price down or relisted or new listing then use current time - 30m to show to all users in web\n let customBucketTimeDate: Date | null = null;\n if (\n !hasUpdateReason(\n [UpdateReasonEnum.PRICE_DOWN, UpdateReasonEnum.RE_LISTING, UpdateReasonEnum.NEW_LISTING],\n product.updateReason,\n )\n ) {\n customBucketTimeDate = new Date(Date.now() - 1000 * 60 * 30);\n }\n\n // TODO: Append inferred categories to ref.categoryKeywordNames\n // TODO: Only append categories found in categoriesEnEsMap\n let foundCategories: string[] = [...(ref.categoryKeywordNames || [])];\n if (!isArrayEmpty(ref.inferredCategories)) {\n ref.inferredCategories.forEach((inferredCategory) => {\n if (getCategoryFacetLabel({ key: inferredCategory })) {\n foundCategories.push(inferredCategory);\n }\n });\n\n // remove CATEGORY_NOT_FOUND\n // as it found inferred categories\n foundCategories = foundCategories.filter((category) => category !== CATEGORY_ENUM.CATEGORY_NOT_FOUND);\n }\n\n let inferredCategories: string[] = [];\n if (!isArrayEmpty(ref.inferredCategories)) {\n inferredCategories = getStringsAsStrArr(ref.inferredCategories);\n }\n\n const updatedAtDate = new Date(ref.updatedAt || ref.extractedAt || Date.now());\n const bucketData = getBucketTime(customBucketTimeDate || updatedAtDate);\n\n return <ObjectLiteral>{\n id: ref._id,\n ...priceStats,\n storeRef: ref.storeRef,\n storeName: ref.storeName || 'no store name',\n isMarketplace: ref.isMarketplace === true,\n name: ref.name || 'no name',\n sku: ref.sku,\n ean: ref.ean,\n url: ref.url,\n image: ref.image,\n brandName: ref.brandName ? normalizeString(ref.brandName) : undefined,\n sellerName: ref.sellerName,\n // priceStats: priceStats,\n category: ref.category,\n categoryPath: ref.categoryPath,\n price: ref.price,\n bestPrice: ref.bestPrice,\n conditionalPrice: ref.conditionalPrice,\n priceHistory: ref.priceHistory,\n currency: ref.currency || CurrencyEnum.CLP,\n enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null,\n categoryKeywordNames: foundCategories, // ref.categoryKeywordNames,\n inferredCategories: inferredCategories,\n updateReasons: (ref.updateReason || []).filter((e) => e),\n updatedAt: updatedAtDate.getTime(),\n priceUpdatedAt: priceUpdatedAt,\n bucketTime: bucketData && bucketData.bucketTime ? bucketData.bucketTime : undefined,\n bucketDate: bucketData && bucketData.bucketDate ? bucketData.bucketDate : undefined,\n };\n};\n"]}
|
|
@@ -14,3 +14,4 @@ export declare const compareNormalizedText: (str: string, str2: string, options?
|
|
|
14
14
|
}) => boolean;
|
|
15
15
|
export declare const capitalize: (s: string) => string;
|
|
16
16
|
export declare const normalizeString: (s: string) => string;
|
|
17
|
+
export declare const getStringsAsStrArr: (paths: string[], splitBy?: string) => string[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.normalizeString = exports.capitalize = exports.compareNormalizedText = exports.normalizeText = exports.includesStringArray = exports.removeIfEndsWith = exports.replaceMultipleSpacesByOne = exports.removeNewLines = exports.getLastAfter = exports.reverseString = void 0;
|
|
3
|
+
exports.getStringsAsStrArr = exports.normalizeString = exports.capitalize = exports.compareNormalizedText = exports.normalizeText = exports.includesStringArray = exports.removeIfEndsWith = exports.replaceMultipleSpacesByOne = exports.removeNewLines = exports.getLastAfter = exports.reverseString = void 0;
|
|
4
4
|
const reverseString = (str) => {
|
|
5
5
|
if (!str) {
|
|
6
6
|
return null;
|
|
@@ -85,4 +85,26 @@ const normalizeString = (s) => {
|
|
|
85
85
|
return s;
|
|
86
86
|
};
|
|
87
87
|
exports.normalizeString = normalizeString;
|
|
88
|
+
const getStringsAsStrArr = (paths, splitBy = '/') => {
|
|
89
|
+
const root = {};
|
|
90
|
+
const hash = {};
|
|
91
|
+
const values = [];
|
|
92
|
+
const sortedPaths = [...paths].sort((a, b) => a.split(splitBy).length - b.split(splitBy).length);
|
|
93
|
+
sortedPaths.forEach((path) => {
|
|
94
|
+
const parts = path.split(splitBy);
|
|
95
|
+
let current = root;
|
|
96
|
+
for (const part of parts) {
|
|
97
|
+
if (!current[part]) {
|
|
98
|
+
current[part] = {};
|
|
99
|
+
}
|
|
100
|
+
current = current[part];
|
|
101
|
+
if (!hash[part]) {
|
|
102
|
+
hash[part] = true;
|
|
103
|
+
values.push(part);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
return values;
|
|
108
|
+
};
|
|
109
|
+
exports.getStringsAsStrArr = getStringsAsStrArr;
|
|
88
110
|
//# sourceMappingURL=string-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.js","sourceRoot":"/","sources":["utils/string-utils.ts"],"names":[],"mappings":"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","sourcesContent":["export const reverseString = (str: string): string => {\n if (!str) {\n return null;\n }\n\n return str.split('').reverse().join('');\n};\n\nexport const getLastAfter = (str: string, after: string): string => {\n if (!str) {\n return null;\n }\n\n const reverseSplit = reverseString(str).split(after);\n if (reverseSplit && reverseSplit.length > 0) {\n return reverseString(reverseSplit[0]);\n }\n\n return null;\n};\n\nexport const removeNewLines = (str: string): string => {\n if (!str) {\n return null;\n }\n return str.replace(/\\r?\\n|\\r/g, '');\n};\n\nexport const replaceMultipleSpacesByOne = (str: string): string => {\n if (!str) {\n return null;\n }\n\n return str.replace(/\\s\\s+/g, ' ');\n};\n\nexport const removeIfEndsWith = (str: string, search: string): string => {\n const removedNewLines = removeNewLines(str);\n const trimmed = removedNewLines ? removedNewLines.trim() : null;\n if (trimmed && trimmed.endsWith(search) && trimmed !== search) {\n const reversed = reverseString(str);\n const substr = reversed.substr(reversed.indexOf(search) + 1, reversed.length);\n return reverseString(substr);\n }\n\n return str;\n};\n\nexport const includesStringArray = (str: string, search: string[]): boolean => {\n if (!str || !search) {\n return false;\n }\n\n return !!search.find((s) => str.toLowerCase().includes(s.toLowerCase()));\n};\n\nexport const normalizeText = (str: string, options = { trim: false, lowerCase: false }): string => {\n if (!str) {\n return null;\n }\n\n let normalized = str.normalize('NFD')\n .replace(/([aeio])\\u0301|(u)[\\u0301\\u0308]/gi, '$1$2')\n .normalize();\n\n if (options.trim) {\n normalized = normalized.trim();\n }\n\n if (options.lowerCase) {\n normalized = normalized.toLowerCase();\n }\n\n return normalized;\n};\n\nexport const compareNormalizedText = (str: string, str2: string, options = {\n trim: true,\n lowerCase: true,\n}): boolean => normalizeText(str, options) === normalizeText(str2, options);\n\n\nexport const capitalize = (s: string) => s && String(s[0]).toUpperCase() + String(s.toLowerCase()).slice(1);\n\n// Used in ts parse\nexport const normalizeString = (s: string) => {\n if (s) {\n const normalized = capitalize(normalizeText(s));\n if (normalized === 'Generica') {\n return 'Generico';\n }\n\n return normalized;\n }\n\n return s;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"string-utils.js","sourceRoot":"/","sources":["utils/string-utils.ts"],"names":[],"mappings":"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","sourcesContent":["export const reverseString = (str: string): string => {\n if (!str) {\n return null;\n }\n\n return str.split('').reverse().join('');\n};\n\nexport const getLastAfter = (str: string, after: string): string => {\n if (!str) {\n return null;\n }\n\n const reverseSplit = reverseString(str).split(after);\n if (reverseSplit && reverseSplit.length > 0) {\n return reverseString(reverseSplit[0]);\n }\n\n return null;\n};\n\nexport const removeNewLines = (str: string): string => {\n if (!str) {\n return null;\n }\n return str.replace(/\\r?\\n|\\r/g, '');\n};\n\nexport const replaceMultipleSpacesByOne = (str: string): string => {\n if (!str) {\n return null;\n }\n\n return str.replace(/\\s\\s+/g, ' ');\n};\n\nexport const removeIfEndsWith = (str: string, search: string): string => {\n const removedNewLines = removeNewLines(str);\n const trimmed = removedNewLines ? removedNewLines.trim() : null;\n if (trimmed && trimmed.endsWith(search) && trimmed !== search) {\n const reversed = reverseString(str);\n const substr = reversed.substr(reversed.indexOf(search) + 1, reversed.length);\n return reverseString(substr);\n }\n\n return str;\n};\n\nexport const includesStringArray = (str: string, search: string[]): boolean => {\n if (!str || !search) {\n return false;\n }\n\n return !!search.find((s) => str.toLowerCase().includes(s.toLowerCase()));\n};\n\nexport const normalizeText = (str: string, options = { trim: false, lowerCase: false }): string => {\n if (!str) {\n return null;\n }\n\n let normalized = str.normalize('NFD')\n .replace(/([aeio])\\u0301|(u)[\\u0301\\u0308]/gi, '$1$2')\n .normalize();\n\n if (options.trim) {\n normalized = normalized.trim();\n }\n\n if (options.lowerCase) {\n normalized = normalized.toLowerCase();\n }\n\n return normalized;\n};\n\nexport const compareNormalizedText = (str: string, str2: string, options = {\n trim: true,\n lowerCase: true,\n}): boolean => normalizeText(str, options) === normalizeText(str2, options);\n\n\nexport const capitalize = (s: string) => s && String(s[0]).toUpperCase() + String(s.toLowerCase()).slice(1);\n\n// Used in ts parse\nexport const normalizeString = (s: string) => {\n if (s) {\n const normalized = capitalize(normalizeText(s));\n if (normalized === 'Generica') {\n return 'Generico';\n }\n\n return normalized;\n }\n\n return s;\n};\n\nexport const getStringsAsStrArr = (paths: string[], splitBy = '/'): string[] => {\n const root = {};\n\n const hash = {};\n const values: string[] = [];\n\n // Sort paths by hierarchy depth (shallow to deep)\n const sortedPaths = [...paths].sort((a, b) => a.split(splitBy).length - b.split(splitBy).length);\n\n sortedPaths.forEach((path) => {\n const parts = path.split(splitBy);\n let current = root;\n\n for (const part of parts) {\n if (!current[part]) {\n current[part] = {};\n }\n current = current[part];\n\n if (!hash[part]) {\n hash[part] = true;\n values.push(part);\n }\n }\n });\n\n return values;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ import {ObjectLiteral} from "../classes";
|
|
|
4
4
|
import {getMinPrice} from "./price-utils";
|
|
5
5
|
import {getCategoryFacetLabel} from "./facet-categories-map";
|
|
6
6
|
import {getBucketTime} from "./time-utils";
|
|
7
|
-
import {normalizeString} from "./string-utils";
|
|
7
|
+
import {getStringsAsStrArr, normalizeString} from "./string-utils";
|
|
8
8
|
|
|
9
9
|
export const getStoreName = (product: Product, stores: Store[]): string => {
|
|
10
10
|
if ((!stores || stores.length === 0) && product) {
|
|
@@ -133,6 +133,11 @@ export const parseProductDtoToTypesenseDocument = (product: Product): ObjectLite
|
|
|
133
133
|
foundCategories = foundCategories.filter((category) => category !== CATEGORY_ENUM.CATEGORY_NOT_FOUND);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
let inferredCategories: string[] = [];
|
|
137
|
+
if (!isArrayEmpty(ref.inferredCategories)) {
|
|
138
|
+
inferredCategories = getStringsAsStrArr(ref.inferredCategories);
|
|
139
|
+
}
|
|
140
|
+
|
|
136
141
|
const updatedAtDate = new Date(ref.updatedAt || ref.extractedAt || Date.now());
|
|
137
142
|
const bucketData = getBucketTime(customBucketTimeDate || updatedAtDate);
|
|
138
143
|
|
|
@@ -159,6 +164,7 @@ export const parseProductDtoToTypesenseDocument = (product: Product): ObjectLite
|
|
|
159
164
|
currency: ref.currency || CurrencyEnum.CLP,
|
|
160
165
|
enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null,
|
|
161
166
|
categoryKeywordNames: foundCategories, // ref.categoryKeywordNames,
|
|
167
|
+
inferredCategories: inferredCategories,
|
|
162
168
|
updateReasons: (ref.updateReason || []).filter((e) => e),
|
|
163
169
|
updatedAt: updatedAtDate.getTime(),
|
|
164
170
|
priceUpdatedAt: priceUpdatedAt,
|
|
@@ -95,3 +95,32 @@ export const normalizeString = (s: string) => {
|
|
|
95
95
|
|
|
96
96
|
return s;
|
|
97
97
|
};
|
|
98
|
+
|
|
99
|
+
export const getStringsAsStrArr = (paths: string[], splitBy = '/'): string[] => {
|
|
100
|
+
const root = {};
|
|
101
|
+
|
|
102
|
+
const hash = {};
|
|
103
|
+
const values: string[] = [];
|
|
104
|
+
|
|
105
|
+
// Sort paths by hierarchy depth (shallow to deep)
|
|
106
|
+
const sortedPaths = [...paths].sort((a, b) => a.split(splitBy).length - b.split(splitBy).length);
|
|
107
|
+
|
|
108
|
+
sortedPaths.forEach((path) => {
|
|
109
|
+
const parts = path.split(splitBy);
|
|
110
|
+
let current = root;
|
|
111
|
+
|
|
112
|
+
for (const part of parts) {
|
|
113
|
+
if (!current[part]) {
|
|
114
|
+
current[part] = {};
|
|
115
|
+
}
|
|
116
|
+
current = current[part];
|
|
117
|
+
|
|
118
|
+
if (!hash[part]) {
|
|
119
|
+
hash[part] = true;
|
|
120
|
+
values.push(part);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
return values;
|
|
126
|
+
};
|