@shopnex/cj-plugin 1.1.0 → 1.2.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.
@@ -4,30 +4,54 @@ import { JSDOM } from "jsdom";
|
|
4
4
|
import { cjSdk } from "../sdk/cj-sdk";
|
5
5
|
import { retrieveAccessToken } from "./access-token";
|
6
6
|
const delay = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
|
7
|
+
const upsertImage = async ({ payload, imageUrl, filename, alt, shopId })=>{
|
8
|
+
const imageData = await payload.find({
|
9
|
+
collection: "media",
|
10
|
+
where: {
|
11
|
+
filename: {
|
12
|
+
equals: filename
|
13
|
+
},
|
14
|
+
shop: {
|
15
|
+
equals: shopId
|
16
|
+
}
|
17
|
+
},
|
18
|
+
limit: 1
|
19
|
+
});
|
20
|
+
if (imageData.totalDocs === 0) {
|
21
|
+
return payload.create({
|
22
|
+
collection: "media",
|
23
|
+
data: {
|
24
|
+
alt,
|
25
|
+
filename,
|
26
|
+
thumbnailURL: imageUrl,
|
27
|
+
url: imageUrl,
|
28
|
+
shop: shopId
|
29
|
+
}
|
30
|
+
});
|
31
|
+
}
|
32
|
+
return imageData.docs[0];
|
33
|
+
};
|
7
34
|
async function mapMockProductToSchema({ product, payload, shopId }) {
|
8
35
|
const variants = [];
|
9
36
|
for (const variant of product.variants || []){
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
// });
|
25
|
-
// } catch (error) {
|
26
|
-
// console.error("Error creating media:", error);
|
27
|
-
// }
|
28
|
-
// const imageId = imageData?.id;
|
37
|
+
const filename = variant?.variantImage?.split("/").pop();
|
38
|
+
if (!filename || !variant.variantImage) {
|
39
|
+
continue;
|
40
|
+
}
|
41
|
+
const alt = filename.split(".")[0];
|
42
|
+
const imageUrl = variant.variantImage;
|
43
|
+
const imageData = await upsertImage({
|
44
|
+
payload,
|
45
|
+
imageUrl,
|
46
|
+
filename,
|
47
|
+
alt,
|
48
|
+
shopId
|
49
|
+
});
|
50
|
+
const imageId = imageData.id;
|
29
51
|
variants.push({
|
30
|
-
|
52
|
+
gallery: [
|
53
|
+
imageId
|
54
|
+
],
|
31
55
|
options: variant.variantKey?.split("-").map((key, index)=>({
|
32
56
|
option: index === 0 ? "Color" : "Size",
|
33
57
|
value: key
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/service/sync-products.ts"],"sourcesContent":["import type {\n DefaultNodeTypes,\n TypedEditorState,\n} from \"@payloadcms/richtext-lexical\";\nimport type { BasePayload } from \"payload\";\n\nimport {\n convertHTMLToLexical,\n editorConfigFactory,\n} from \"@payloadcms/richtext-lexical\";\nimport decimal from \"decimal.js\";\nimport { JSDOM } from \"jsdom\";\n\nimport type { ProductDetails } from \"../sdk/products/product-types\";\n\nimport { cjSdk } from \"../sdk/cj-sdk\";\nimport { CjData } from \"../cj-settings\";\nimport { retrieveAccessToken } from \"./access-token\";\n\ninterface Product {\n description: TypedEditorState<DefaultNodeTypes>;\n pid: string;\n title: string;\n source: \"manual\" | \"cj\";\n variants?: Array<{\n gallery?: (string | number)[];\n imageUrl?: string;\n options?: Array<{ option: string; value: string }>;\n price?: number;\n vid: string;\n }>;\n}\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function mapMockProductToSchema({\n product,\n payload,\n shopId,\n}: {\n product: ProductDetails;\n payload: BasePayload;\n shopId?: string;\n}) {\n const variants: Product[\"variants\"] = [];\n\n for (const variant of product.variants || []) {\n
|
1
|
+
{"version":3,"sources":["../../src/service/sync-products.ts"],"sourcesContent":["import type {\n DefaultNodeTypes,\n TypedEditorState,\n} from \"@payloadcms/richtext-lexical\";\nimport type { BasePayload } from \"payload\";\n\nimport {\n convertHTMLToLexical,\n editorConfigFactory,\n} from \"@payloadcms/richtext-lexical\";\nimport decimal from \"decimal.js\";\nimport { JSDOM } from \"jsdom\";\n\nimport type { ProductDetails } from \"../sdk/products/product-types\";\n\nimport { cjSdk } from \"../sdk/cj-sdk\";\nimport { CjData } from \"../cj-settings\";\nimport { retrieveAccessToken } from \"./access-token\";\n\ninterface Product {\n description: TypedEditorState<DefaultNodeTypes>;\n pid: string;\n title: string;\n source: \"manual\" | \"cj\";\n variants?: Array<{\n gallery?: (string | number)[];\n imageUrl?: string;\n options?: Array<{ option: string; value: string }>;\n price?: number;\n vid: string;\n }>;\n}\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst upsertImage = async ({\n payload,\n imageUrl,\n filename,\n alt,\n shopId,\n}: {\n payload: BasePayload;\n imageUrl: string;\n filename: string;\n alt: string;\n shopId?: string;\n}) => {\n const imageData = await payload.find({\n collection: \"media\",\n where: {\n filename: {\n equals: filename,\n },\n shop: {\n equals: shopId,\n },\n },\n limit: 1,\n });\n if (imageData.totalDocs === 0) {\n return payload.create({\n collection: \"media\",\n data: {\n alt,\n filename,\n thumbnailURL: imageUrl,\n url: imageUrl,\n shop: shopId,\n },\n });\n }\n return imageData.docs[0];\n};\n\nasync function mapMockProductToSchema({\n product,\n payload,\n shopId,\n}: {\n product: ProductDetails;\n payload: BasePayload;\n shopId?: string;\n}) {\n const variants: Product[\"variants\"] = [];\n\n for (const variant of product.variants || []) {\n const filename = variant?.variantImage?.split(\"/\").pop();\n if (!filename || !variant.variantImage) {\n continue;\n }\n const alt = filename.split(\".\")[0];\n const imageUrl = variant.variantImage;\n const imageData = await upsertImage({\n payload,\n imageUrl,\n filename,\n alt,\n shopId,\n });\n\n const imageId = imageData.id;\n\n variants.push({\n gallery: [imageId],\n options: variant.variantKey?.split(\"-\").map((key, index) => ({\n option: index === 0 ? \"Color\" : \"Size\",\n value: key,\n })),\n price: Number(\n new decimal(variant.variantSellPrice || 0).toNumber().toFixed(2)\n ),\n vid: variant.vid,\n });\n }\n\n const cleanHtml = product.description?.replace(/<img[^>]*>/g, \"\");\n\n return {\n description: convertHTMLToLexical({\n editorConfig: await editorConfigFactory.default({\n config: payload.config, // Your Payload Config\n }),\n html: cleanHtml || \"<p></p>\",\n JSDOM, // Pass in the JSDOM import; it's not bundled to keep package size small\n }),\n source: \"cj\" as any,\n pid: product.pid,\n title: product.productNameEn,\n variants,\n };\n}\n\nconst findProductById = async (productId: string, accessToken: string) => {\n const sdk = cjSdk({ accessToken });\n const result = await sdk.products.getProductDetails({\n pid: productId,\n });\n\n return result.data;\n};\n\nconst createOrUpdateProduct = async ({\n product,\n payload,\n shopId,\n}: {\n product: Omit<Product, \"createdAt\" | \"id\" | \"updatedAt\">;\n payload: BasePayload;\n shopId?: string;\n}) => {\n const { totalDocs } = await payload.count({\n collection: \"products\" as any,\n where: {\n pid: {\n equals: product.pid,\n },\n },\n });\n\n if (totalDocs === 0) {\n return payload.create({\n collection: \"products\" as any,\n data: {\n ...product,\n shop: shopId,\n } as any,\n });\n }\n};\n\nexport const syncProducts = async ({\n productIds,\n payload,\n shopId,\n data,\n}: {\n productIds: string[];\n payload: BasePayload;\n shopId?: string;\n data: Partial<CjData>;\n}) => {\n const accessToken = await retrieveAccessToken(data);\n\n const fetchedProducts: ProductDetails[] = [];\n\n for (const productId of productIds) {\n const product = await findProductById(productId, accessToken);\n if (product) {\n fetchedProducts.push(product);\n }\n await delay(1010); // throttle CJ API requests\n }\n\n // Wait for all async mapping to resolve\n const mappedProducts: Product[] = await Promise.all(\n fetchedProducts.map((product) =>\n mapMockProductToSchema({ product, payload, shopId })\n )\n );\n\n // Create or update each mapped product\n await Promise.all(\n mappedProducts.map((product) =>\n createOrUpdateProduct({ product, payload, shopId })\n )\n );\n\n return fetchedProducts;\n};\n"],"names":["convertHTMLToLexical","editorConfigFactory","decimal","JSDOM","cjSdk","retrieveAccessToken","delay","ms","Promise","resolve","setTimeout","upsertImage","payload","imageUrl","filename","alt","shopId","imageData","find","collection","where","equals","shop","limit","totalDocs","create","data","thumbnailURL","url","docs","mapMockProductToSchema","product","variants","variant","variantImage","split","pop","imageId","id","push","gallery","options","variantKey","map","key","index","option","value","price","Number","variantSellPrice","toNumber","toFixed","vid","cleanHtml","description","replace","editorConfig","default","config","html","source","pid","title","productNameEn","findProductById","productId","accessToken","sdk","result","products","getProductDetails","createOrUpdateProduct","count","syncProducts","productIds","fetchedProducts","mappedProducts","all"],"mappings":"AAMA,SACIA,oBAAoB,EACpBC,mBAAmB,QAChB,+BAA+B;AACtC,OAAOC,aAAa,aAAa;AACjC,SAASC,KAAK,QAAQ,QAAQ;AAI9B,SAASC,KAAK,QAAQ,gBAAgB;AAEtC,SAASC,mBAAmB,QAAQ,iBAAiB;AAgBrD,MAAMC,QAAQ,CAACC,KAAe,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AAE3E,MAAMI,cAAc,OAAO,EACvBC,OAAO,EACPC,QAAQ,EACRC,QAAQ,EACRC,GAAG,EACHC,MAAM,EAOT;IACG,MAAMC,YAAY,MAAML,QAAQM,IAAI,CAAC;QACjCC,YAAY;QACZC,OAAO;YACHN,UAAU;gBACNO,QAAQP;YACZ;YACAQ,MAAM;gBACFD,QAAQL;YACZ;QACJ;QACAO,OAAO;IACX;IACA,IAAIN,UAAUO,SAAS,KAAK,GAAG;QAC3B,OAAOZ,QAAQa,MAAM,CAAC;YAClBN,YAAY;YACZO,MAAM;gBACFX;gBACAD;gBACAa,cAAcd;gBACde,KAAKf;gBACLS,MAAMN;YACV;QACJ;IACJ;IACA,OAAOC,UAAUY,IAAI,CAAC,EAAE;AAC5B;AAEA,eAAeC,uBAAuB,EAClCC,OAAO,EACPnB,OAAO,EACPI,MAAM,EAKT;IACG,MAAMgB,WAAgC,EAAE;IAExC,KAAK,MAAMC,WAAWF,QAAQC,QAAQ,IAAI,EAAE,CAAE;QAC1C,MAAMlB,WAAWmB,SAASC,cAAcC,MAAM,KAAKC;QACnD,IAAI,CAACtB,YAAY,CAACmB,QAAQC,YAAY,EAAE;YACpC;QACJ;QACA,MAAMnB,MAAMD,SAASqB,KAAK,CAAC,IAAI,CAAC,EAAE;QAClC,MAAMtB,WAAWoB,QAAQC,YAAY;QACrC,MAAMjB,YAAY,MAAMN,YAAY;YAChCC;YACAC;YACAC;YACAC;YACAC;QACJ;QAEA,MAAMqB,UAAUpB,UAAUqB,EAAE;QAE5BN,SAASO,IAAI,CAAC;YACVC,SAAS;gBAACH;aAAQ;YAClBI,SAASR,QAAQS,UAAU,EAAEP,MAAM,KAAKQ,IAAI,CAACC,KAAKC,QAAW,CAAA;oBACzDC,QAAQD,UAAU,IAAI,UAAU;oBAChCE,OAAOH;gBACX,CAAA;YACAI,OAAOC,OACH,IAAI/C,QAAQ+B,QAAQiB,gBAAgB,IAAI,GAAGC,QAAQ,GAAGC,OAAO,CAAC;YAElEC,KAAKpB,QAAQoB,GAAG;QACpB;IACJ;IAEA,MAAMC,YAAYvB,QAAQwB,WAAW,EAAEC,QAAQ,eAAe;IAE9D,OAAO;QACHD,aAAavD,qBAAqB;YAC9ByD,cAAc,MAAMxD,oBAAoByD,OAAO,CAAC;gBAC5CC,QAAQ/C,QAAQ+C,MAAM;YAC1B;YACAC,MAAMN,aAAa;YACnBnD;QACJ;QACA0D,QAAQ;QACRC,KAAK/B,QAAQ+B,GAAG;QAChBC,OAAOhC,QAAQiC,aAAa;QAC5BhC;IACJ;AACJ;AAEA,MAAMiC,kBAAkB,OAAOC,WAAmBC;IAC9C,MAAMC,MAAMhE,MAAM;QAAE+D;IAAY;IAChC,MAAME,SAAS,MAAMD,IAAIE,QAAQ,CAACC,iBAAiB,CAAC;QAChDT,KAAKI;IACT;IAEA,OAAOG,OAAO3C,IAAI;AACtB;AAEA,MAAM8C,wBAAwB,OAAO,EACjCzC,OAAO,EACPnB,OAAO,EACPI,MAAM,EAKT;IACG,MAAM,EAAEQ,SAAS,EAAE,GAAG,MAAMZ,QAAQ6D,KAAK,CAAC;QACtCtD,YAAY;QACZC,OAAO;YACH0C,KAAK;gBACDzC,QAAQU,QAAQ+B,GAAG;YACvB;QACJ;IACJ;IAEA,IAAItC,cAAc,GAAG;QACjB,OAAOZ,QAAQa,MAAM,CAAC;YAClBN,YAAY;YACZO,MAAM;gBACF,GAAGK,OAAO;gBACVT,MAAMN;YACV;QACJ;IACJ;AACJ;AAEA,OAAO,MAAM0D,eAAe,OAAO,EAC/BC,UAAU,EACV/D,OAAO,EACPI,MAAM,EACNU,IAAI,EAMP;IACG,MAAMyC,cAAc,MAAM9D,oBAAoBqB;IAE9C,MAAMkD,kBAAoC,EAAE;IAE5C,KAAK,MAAMV,aAAaS,WAAY;QAChC,MAAM5C,UAAU,MAAMkC,gBAAgBC,WAAWC;QACjD,IAAIpC,SAAS;YACT6C,gBAAgBrC,IAAI,CAACR;QACzB;QACA,MAAMzB,MAAM,OAAO,2BAA2B;IAClD;IAEA,wCAAwC;IACxC,MAAMuE,iBAA4B,MAAMrE,QAAQsE,GAAG,CAC/CF,gBAAgBjC,GAAG,CAAC,CAACZ,UACjBD,uBAAuB;YAAEC;YAASnB;YAASI;QAAO;IAI1D,uCAAuC;IACvC,MAAMR,QAAQsE,GAAG,CACbD,eAAelC,GAAG,CAAC,CAACZ,UAChByC,sBAAsB;YAAEzC;YAASnB;YAASI;QAAO;IAIzD,OAAO4D;AACX,EAAE"}
|