@shopnex/cj-plugin 1.0.1 → 1.0.2
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/api-client.d.ts +2 -0
- package/dist/api-client.js +27 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth.d.ts +15 -0
- package/dist/auth.js +47 -0
- package/dist/auth.js.map +1 -0
- package/dist/cj-settings.d.ts +2 -0
- package/dist/cj-settings.js +51 -0
- package/dist/cj-settings.js.map +1 -0
- package/dist/error-handler.d.ts +12 -0
- package/dist/error-handler.js +41 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/error-types.d.ts +20 -0
- package/dist/error-types.js +7 -0
- package/dist/error-types.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk/access-token.d.ts +8 -0
- package/dist/sdk/access-token.js +22 -0
- package/dist/sdk/access-token.js.map +1 -0
- package/dist/sdk/cj-sdk.d.ts +4 -0
- package/dist/sdk/cj-sdk.js +6 -0
- package/dist/sdk/cj-sdk.js.map +1 -0
- package/dist/sdk/dispute/dispute-types.d.ts +64 -0
- package/dist/sdk/dispute/dispute-types.js +4 -0
- package/dist/sdk/dispute/dispute-types.js.map +1 -0
- package/dist/sdk/dispute/dispute.d.ts +4 -0
- package/dist/sdk/dispute/dispute.js +52 -0
- package/dist/sdk/dispute/dispute.js.map +1 -0
- package/dist/sdk/inventory/inventory-types.d.ts +7 -0
- package/dist/sdk/inventory/inventory-types.js +3 -0
- package/dist/sdk/inventory/inventory-types.js.map +1 -0
- package/dist/sdk/inventory/inventory.d.ts +3 -0
- package/dist/sdk/inventory/inventory.js +41 -0
- package/dist/sdk/inventory/inventory.js.map +1 -0
- package/dist/sdk/orders/order-types.d.ts +135 -0
- package/dist/sdk/orders/order-types.js +3 -0
- package/dist/sdk/orders/order-types.js.map +1 -0
- package/dist/sdk/orders/orders.d.ts +16 -0
- package/dist/sdk/orders/orders.js +167 -0
- package/dist/sdk/orders/orders.js.map +1 -0
- package/dist/sdk/products/product-types.d.ts +186 -0
- package/dist/sdk/products/product-types.js +5 -0
- package/dist/sdk/products/product-types.js.map +1 -0
- package/dist/sdk/products/products.d.ts +9 -0
- package/dist/sdk/products/products.js +96 -0
- package/dist/sdk/products/products.js.map +1 -0
- package/dist/sdk/settings/settings-api.d.ts +2 -0
- package/dist/sdk/settings/settings-api.js +20 -0
- package/dist/sdk/settings/settings-api.js.map +1 -0
- package/dist/sdk/settings/settings-types.d.ts +22 -0
- package/dist/sdk/settings/settings-types.js +3 -0
- package/dist/sdk/settings/settings-types.js.map +1 -0
- package/dist/sdk/variants/variant-types.d.ts +18 -0
- package/dist/sdk/variants/variant-types.js +3 -0
- package/dist/sdk/variants/variant-types.js.map +1 -0
- package/dist/sdk/variants/variants.d.ts +8 -0
- package/dist/sdk/variants/variants.js +76 -0
- package/dist/sdk/variants/variants.js.map +1 -0
- package/dist/service/convert-html-to-lexical.d.ts +0 -0
- package/dist/service/convert-html-to-lexical.js +75 -0
- package/dist/service/convert-html-to-lexical.js.map +1 -0
- package/dist/service/create-order.hook.d.ts +12 -0
- package/dist/service/create-order.hook.js +64 -0
- package/dist/service/create-order.hook.js.map +1 -0
- package/dist/service/sync-products.d.ts +4 -0
- package/dist/service/sync-products.js +147 -0
- package/dist/service/sync-products.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/refund-button.d.ts +3 -0
- package/dist/ui/refund-button.js +24 -0
- package/dist/ui/refund-button.js.map +1 -0
- package/package.json +1 -1
@@ -0,0 +1,20 @@
|
|
1
|
+
import { cjApiClient } from '../../api-client';
|
2
|
+
export async function getSettings(accessToken) {
|
3
|
+
try {
|
4
|
+
const response = await cjApiClient.get('setting/get', {
|
5
|
+
headers: {
|
6
|
+
'CJ-Access-Token': accessToken
|
7
|
+
}
|
8
|
+
});
|
9
|
+
const result = response.data.data;
|
10
|
+
if (!result) {
|
11
|
+
throw new Error('No settings found');
|
12
|
+
}
|
13
|
+
return result;
|
14
|
+
} catch (error) {
|
15
|
+
console.error(`Error fetching settings [${error.code}]: ${error.message}`);
|
16
|
+
throw error;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
//# sourceMappingURL=settings-api.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../../src/sdk/settings/settings-api.ts"],"sourcesContent":["import type { CJApiResponse } from '../../types'\nimport type { AccountSettings } from './settings-types'\n\nimport { cjApiClient } from '../../api-client'\n\nexport async function getSettings(accessToken: string): Promise<AccountSettings> {\n try {\n const response = await cjApiClient.get<CJApiResponse<AccountSettings>>('setting/get', {\n headers: { 'CJ-Access-Token': accessToken },\n })\n\n const result = response.data.data\n if (!result) {\n throw new Error('No settings found')\n }\n\n return result\n } catch (error: any) {\n console.error(`Error fetching settings [${error.code}]: ${error.message}`)\n throw error\n }\n}\n"],"names":["cjApiClient","getSettings","accessToken","response","get","headers","result","data","Error","error","console","code","message"],"mappings":"AAGA,SAASA,WAAW,QAAQ,mBAAkB;AAE9C,OAAO,eAAeC,YAAYC,WAAmB;IACnD,IAAI;QACF,MAAMC,WAAW,MAAMH,YAAYI,GAAG,CAAiC,eAAe;YACpFC,SAAS;gBAAE,mBAAmBH;YAAY;QAC5C;QAEA,MAAMI,SAASH,SAASI,IAAI,CAACA,IAAI;QACjC,IAAI,CAACD,QAAQ;YACX,MAAM,IAAIE,MAAM;QAClB;QAEA,OAAOF;IACT,EAAE,OAAOG,OAAY;QACnBC,QAAQD,KAAK,CAAC,CAAC,yBAAyB,EAAEA,MAAME,IAAI,CAAC,GAAG,EAAEF,MAAMG,OAAO,EAAE;QACzE,MAAMH;IACR;AACF"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
export interface QuotaLimit {
|
2
|
+
quotaLimit: number;
|
3
|
+
quotaType: number;
|
4
|
+
quotaUrl: string;
|
5
|
+
}
|
6
|
+
export interface Setting {
|
7
|
+
qpsLimit: number;
|
8
|
+
quotaLimits: QuotaLimit[];
|
9
|
+
}
|
10
|
+
export interface Callback {
|
11
|
+
productCallbackUrls: string[];
|
12
|
+
productType: string;
|
13
|
+
}
|
14
|
+
export interface AccountSettings {
|
15
|
+
callback: Callback;
|
16
|
+
isSandbox: boolean;
|
17
|
+
openEmail: string;
|
18
|
+
openId: string;
|
19
|
+
openName: string;
|
20
|
+
root: string;
|
21
|
+
setting: Setting;
|
22
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../../src/sdk/settings/settings-types.ts"],"sourcesContent":["export interface QuotaLimit {\n quotaLimit: number\n quotaType: number\n quotaUrl: string\n}\n\nexport interface Setting {\n qpsLimit: number\n quotaLimits: QuotaLimit[]\n}\n\nexport interface Callback {\n productCallbackUrls: string[]\n productType: string\n}\n\nexport interface AccountSettings {\n callback: Callback\n isSandbox: boolean\n openEmail: string\n openId: string\n openName: string\n root: string\n setting: Setting\n}\n"],"names":[],"mappings":"AAgBA,WAQC"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
export interface Variant {
|
2
|
+
createTime: null | string;
|
3
|
+
pid: string;
|
4
|
+
variantHeight: number;
|
5
|
+
variantKey: string;
|
6
|
+
variantLength: number;
|
7
|
+
variantName: null | string;
|
8
|
+
variantNameEn: null | string;
|
9
|
+
variantProperty: null | string;
|
10
|
+
variantSellPrice: number;
|
11
|
+
variantSku: string;
|
12
|
+
variantStandard: null | string;
|
13
|
+
variantUnit: null | string;
|
14
|
+
variantVolume: number;
|
15
|
+
variantWeight: number;
|
16
|
+
variantWidth: number;
|
17
|
+
vid: string;
|
18
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../../src/sdk/variants/variant-types.ts"],"sourcesContent":["export interface Variant {\n createTime: null | string\n pid: string\n variantHeight: number\n variantKey: string\n variantLength: number\n variantName: null | string\n variantNameEn: null | string\n variantProperty: null | string\n variantSellPrice: number\n variantSku: string\n variantStandard: null | string\n variantUnit: null | string\n variantVolume: number\n variantWeight: number\n variantWidth: number\n vid: string\n}\n"],"names":[],"mappings":"AAAA,WAiBC"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import type { APIResponse } from '../../error-types';
|
2
|
+
import type { Variant } from './variant-types.js';
|
3
|
+
export declare function getAllVariants(queryParams: {
|
4
|
+
pid?: string;
|
5
|
+
productSku?: string;
|
6
|
+
variantSku?: string;
|
7
|
+
}): Promise<APIResponse<Variant[]>>;
|
8
|
+
export declare function getVariantById(vid: string): Promise<APIResponse<Variant>>;
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import { cjApiClient } from '../../api-client';
|
2
|
+
import { getCurrentAccessToken } from '../access-token';
|
3
|
+
export async function getAllVariants(queryParams) {
|
4
|
+
if (!queryParams.pid && !queryParams.productSku && !queryParams.variantSku) {
|
5
|
+
return {
|
6
|
+
error: 'One of pid, productSku, or variantSku must be provided.'
|
7
|
+
};
|
8
|
+
}
|
9
|
+
try {
|
10
|
+
const accessToken = await getCurrentAccessToken() // Ensure you populate this with a valid token
|
11
|
+
;
|
12
|
+
const response = await cjApiClient.get('product/variant/query', {
|
13
|
+
headers: {
|
14
|
+
'CJ-Access-Token': accessToken
|
15
|
+
},
|
16
|
+
params: queryParams
|
17
|
+
});
|
18
|
+
if (!response.data.result) {
|
19
|
+
return {
|
20
|
+
error: response.data.message || 'Failed to fetch variants'
|
21
|
+
};
|
22
|
+
}
|
23
|
+
if (!response.data.data) {
|
24
|
+
return {
|
25
|
+
error: 'No variants found'
|
26
|
+
};
|
27
|
+
}
|
28
|
+
return {
|
29
|
+
data: response.data.data
|
30
|
+
};
|
31
|
+
} catch (error) {
|
32
|
+
console.error(`Error fetching all variants [${error.code}]: ${error.message}`);
|
33
|
+
return {
|
34
|
+
error: error.message || 'An unknown error occurred'
|
35
|
+
};
|
36
|
+
}
|
37
|
+
}
|
38
|
+
export async function getVariantById(vid) {
|
39
|
+
if (!vid) {
|
40
|
+
return {
|
41
|
+
error: 'vid must be provided.'
|
42
|
+
};
|
43
|
+
}
|
44
|
+
try {
|
45
|
+
const accessToken = await getCurrentAccessToken() // Ensure you populate this with a valid token
|
46
|
+
;
|
47
|
+
const response = await cjApiClient.get('product/variant/queryByVid', {
|
48
|
+
headers: {
|
49
|
+
'CJ-Access-Token': accessToken
|
50
|
+
},
|
51
|
+
params: {
|
52
|
+
vid
|
53
|
+
}
|
54
|
+
});
|
55
|
+
if (!response.data.result) {
|
56
|
+
return {
|
57
|
+
error: response.data.message || 'Failed to fetch variant by ID'
|
58
|
+
};
|
59
|
+
}
|
60
|
+
if (!response.data.data) {
|
61
|
+
return {
|
62
|
+
error: 'No variant found'
|
63
|
+
};
|
64
|
+
}
|
65
|
+
return {
|
66
|
+
data: response.data.data
|
67
|
+
};
|
68
|
+
} catch (error) {
|
69
|
+
console.error(`Error fetching variant by ID [${error.code}]: ${error.message}`);
|
70
|
+
return {
|
71
|
+
error: error.message || 'An unknown error occurred'
|
72
|
+
};
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
//# sourceMappingURL=variants.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../../src/sdk/variants/variants.ts"],"sourcesContent":["import type { APIResponse } from '../../error-types'\nimport type { CJApiResponse } from '../../types'\nimport type { Variant } from './variant-types.js'\n\nimport { cjApiClient } from '../../api-client'\nimport { getCurrentAccessToken } from '../access-token'\n\nexport async function getAllVariants(queryParams: {\n pid?: string\n productSku?: string\n variantSku?: string\n}): Promise<APIResponse<Variant[]>> {\n if (!queryParams.pid && !queryParams.productSku && !queryParams.variantSku) {\n return {\n error: 'One of pid, productSku, or variantSku must be provided.',\n }\n }\n\n try {\n const accessToken = await getCurrentAccessToken() // Ensure you populate this with a valid token\n const response = await cjApiClient.get<CJApiResponse<Variant[]>>('product/variant/query', {\n headers: {\n 'CJ-Access-Token': accessToken,\n },\n params: queryParams,\n })\n\n if (!response.data.result) {\n return {\n error: response.data.message || 'Failed to fetch variants',\n }\n }\n\n if (!response.data.data) {\n return { error: 'No variants found' }\n }\n\n return { data: response.data.data }\n } catch (error: any) {\n console.error(`Error fetching all variants [${error.code}]: ${error.message}`)\n return { error: error.message || 'An unknown error occurred' }\n }\n}\n\nexport async function getVariantById(vid: string): Promise<APIResponse<Variant>> {\n if (!vid) {\n return { error: 'vid must be provided.' }\n }\n\n try {\n const accessToken = await getCurrentAccessToken() // Ensure you populate this with a valid token\n const response = await cjApiClient.get<CJApiResponse<Variant>>('product/variant/queryByVid', {\n headers: {\n 'CJ-Access-Token': accessToken,\n },\n params: { vid },\n })\n\n if (!response.data.result) {\n return {\n error: response.data.message || 'Failed to fetch variant by ID',\n }\n }\n\n if (!response.data.data) {\n return { error: 'No variant found' }\n }\n\n return { data: response.data.data }\n } catch (error: any) {\n console.error(`Error fetching variant by ID [${error.code}]: ${error.message}`)\n return { error: error.message || 'An unknown error occurred' }\n }\n}\n"],"names":["cjApiClient","getCurrentAccessToken","getAllVariants","queryParams","pid","productSku","variantSku","error","accessToken","response","get","headers","params","data","result","message","console","code","getVariantById","vid"],"mappings":"AAIA,SAASA,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,qBAAqB,QAAQ,kBAAiB;AAEvD,OAAO,eAAeC,eAAeC,WAIpC;IACC,IAAI,CAACA,YAAYC,GAAG,IAAI,CAACD,YAAYE,UAAU,IAAI,CAACF,YAAYG,UAAU,EAAE;QAC1E,OAAO;YACLC,OAAO;QACT;IACF;IAEA,IAAI;QACF,MAAMC,cAAc,MAAMP,wBAAwB,8CAA8C;;QAChG,MAAMQ,WAAW,MAAMT,YAAYU,GAAG,CAA2B,yBAAyB;YACxFC,SAAS;gBACP,mBAAmBH;YACrB;YACAI,QAAQT;QACV;QAEA,IAAI,CAACM,SAASI,IAAI,CAACC,MAAM,EAAE;YACzB,OAAO;gBACLP,OAAOE,SAASI,IAAI,CAACE,OAAO,IAAI;YAClC;QACF;QAEA,IAAI,CAACN,SAASI,IAAI,CAACA,IAAI,EAAE;YACvB,OAAO;gBAAEN,OAAO;YAAoB;QACtC;QAEA,OAAO;YAAEM,MAAMJ,SAASI,IAAI,CAACA,IAAI;QAAC;IACpC,EAAE,OAAON,OAAY;QACnBS,QAAQT,KAAK,CAAC,CAAC,6BAA6B,EAAEA,MAAMU,IAAI,CAAC,GAAG,EAAEV,MAAMQ,OAAO,EAAE;QAC7E,OAAO;YAAER,OAAOA,MAAMQ,OAAO,IAAI;QAA4B;IAC/D;AACF;AAEA,OAAO,eAAeG,eAAeC,GAAW;IAC9C,IAAI,CAACA,KAAK;QACR,OAAO;YAAEZ,OAAO;QAAwB;IAC1C;IAEA,IAAI;QACF,MAAMC,cAAc,MAAMP,wBAAwB,8CAA8C;;QAChG,MAAMQ,WAAW,MAAMT,YAAYU,GAAG,CAAyB,8BAA8B;YAC3FC,SAAS;gBACP,mBAAmBH;YACrB;YACAI,QAAQ;gBAAEO;YAAI;QAChB;QAEA,IAAI,CAACV,SAASI,IAAI,CAACC,MAAM,EAAE;YACzB,OAAO;gBACLP,OAAOE,SAASI,IAAI,CAACE,OAAO,IAAI;YAClC;QACF;QAEA,IAAI,CAACN,SAASI,IAAI,CAACA,IAAI,EAAE;YACvB,OAAO;gBAAEN,OAAO;YAAmB;QACrC;QAEA,OAAO;YAAEM,MAAMJ,SAASI,IAAI,CAACA,IAAI;QAAC;IACpC,EAAE,OAAON,OAAY;QACnBS,QAAQT,KAAK,CAAC,CAAC,8BAA8B,EAAEA,MAAMU,IAAI,CAAC,GAAG,EAAEV,MAAMQ,OAAO,EAAE;QAC9E,OAAO;YAAER,OAAOA,MAAMQ,OAAO,IAAI;QAA4B;IAC/D;AACF"}
|
File without changes
|
@@ -0,0 +1,75 @@
|
|
1
|
+
// import {
|
2
|
+
// DefaultNodeTypes,
|
3
|
+
// SanitizedServerEditorConfig,
|
4
|
+
// TypedEditorState,
|
5
|
+
// getEnabledNodes,
|
6
|
+
// } from "@payloadcms/richtext-lexical";
|
7
|
+
// import { UploadNode } from "@payloadcms/richtext-lexical/client";
|
8
|
+
// import { createHeadlessEditor } from "@lexical/headless";
|
9
|
+
// import { $generateNodesFromDOM } from "@lexical/html";
|
10
|
+
// import { $getRoot, $getSelection, type SerializedLexicalNode } from "lexical";
|
11
|
+
// export const customConvertHTMLToLexical = async <
|
12
|
+
// TNodeTypes extends SerializedLexicalNode = DefaultNodeTypes,
|
13
|
+
// >({
|
14
|
+
// editorConfig,
|
15
|
+
// html,
|
16
|
+
// JSDOM,
|
17
|
+
// uploadImage, // Function to upload image
|
18
|
+
// }: {
|
19
|
+
// editorConfig: SanitizedServerEditorConfig;
|
20
|
+
// html: string;
|
21
|
+
// JSDOM: new (html: string) => {
|
22
|
+
// window: {
|
23
|
+
// document: Document;
|
24
|
+
// };
|
25
|
+
// };
|
26
|
+
// uploadImage: (src: string) => Promise<any>; // Upload function returns the uploaded image object
|
27
|
+
// }): Promise<TypedEditorState<TNodeTypes>> => {
|
28
|
+
// const dom = new JSDOM(html);
|
29
|
+
// const document = dom.window.document;
|
30
|
+
// const images = Array.from(document.querySelectorAll("img"));
|
31
|
+
// // Store image replacement data
|
32
|
+
// const imageReplacements = new Map<string, any>();
|
33
|
+
// // Upload images and store their Payload data
|
34
|
+
// await Promise.all(
|
35
|
+
// images.map(async (img) => {
|
36
|
+
// if (img.src) {
|
37
|
+
// const uploadedImage = await uploadImage(img.src);
|
38
|
+
// imageReplacements.set(img.src, uploadedImage);
|
39
|
+
// }
|
40
|
+
// }),
|
41
|
+
// );
|
42
|
+
// // Create a headless editor
|
43
|
+
// const headlessEditor = createHeadlessEditor({
|
44
|
+
// nodes: getEnabledNodes({ editorConfig }),
|
45
|
+
// });
|
46
|
+
// // Convert updated HTML into Lexical nodes
|
47
|
+
// headlessEditor.update(
|
48
|
+
// () => {
|
49
|
+
// const nodes = $generateNodesFromDOM(headlessEditor, document);
|
50
|
+
// // Replace <img> nodes with custom upload nodes
|
51
|
+
// nodes.forEach((node, index) => {
|
52
|
+
// if (node.getType() === "image") {
|
53
|
+
// const src = (node as any).__src; // Get original image src
|
54
|
+
// const uploadedImage = imageReplacements.get(src);
|
55
|
+
// if (uploadedImage) {
|
56
|
+
// // Replace image node with upload node
|
57
|
+
// // const uploadNode = new UploadNode(uploadedImage);
|
58
|
+
// // nodes[index] = uploadNode;
|
59
|
+
// }
|
60
|
+
// }
|
61
|
+
// });
|
62
|
+
// $getRoot().select();
|
63
|
+
// const selection = $getSelection();
|
64
|
+
// if (selection === null) {
|
65
|
+
// throw new Error("Selection is null");
|
66
|
+
// }
|
67
|
+
// selection.insertNodes(nodes);
|
68
|
+
// },
|
69
|
+
// { discrete: true },
|
70
|
+
// );
|
71
|
+
// // Return the Lexical JSON state
|
72
|
+
// return headlessEditor.getEditorState().toJSON() as TypedEditorState<TNodeTypes>;
|
73
|
+
// };
|
74
|
+
|
75
|
+
//# sourceMappingURL=convert-html-to-lexical.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/service/convert-html-to-lexical.ts"],"sourcesContent":["// import {\n// DefaultNodeTypes,\n// SanitizedServerEditorConfig,\n// TypedEditorState,\n// getEnabledNodes,\n// } from \"@payloadcms/richtext-lexical\";\n// import { UploadNode } from \"@payloadcms/richtext-lexical/client\";\n// import { createHeadlessEditor } from \"@lexical/headless\";\n// import { $generateNodesFromDOM } from \"@lexical/html\";\n// import { $getRoot, $getSelection, type SerializedLexicalNode } from \"lexical\";\n\n// export const customConvertHTMLToLexical = async <\n// TNodeTypes extends SerializedLexicalNode = DefaultNodeTypes,\n// >({\n// editorConfig,\n// html,\n// JSDOM,\n// uploadImage, // Function to upload image\n// }: {\n// editorConfig: SanitizedServerEditorConfig;\n// html: string;\n// JSDOM: new (html: string) => {\n// window: {\n// document: Document;\n// };\n// };\n// uploadImage: (src: string) => Promise<any>; // Upload function returns the uploaded image object\n// }): Promise<TypedEditorState<TNodeTypes>> => {\n// const dom = new JSDOM(html);\n// const document = dom.window.document;\n// const images = Array.from(document.querySelectorAll(\"img\"));\n\n// // Store image replacement data\n// const imageReplacements = new Map<string, any>();\n\n// // Upload images and store their Payload data\n// await Promise.all(\n// images.map(async (img) => {\n// if (img.src) {\n// const uploadedImage = await uploadImage(img.src);\n// imageReplacements.set(img.src, uploadedImage);\n// }\n// }),\n// );\n\n// // Create a headless editor\n// const headlessEditor = createHeadlessEditor({\n// nodes: getEnabledNodes({ editorConfig }),\n// });\n\n// // Convert updated HTML into Lexical nodes\n// headlessEditor.update(\n// () => {\n// const nodes = $generateNodesFromDOM(headlessEditor, document);\n\n// // Replace <img> nodes with custom upload nodes\n// nodes.forEach((node, index) => {\n// if (node.getType() === \"image\") {\n// const src = (node as any).__src; // Get original image src\n// const uploadedImage = imageReplacements.get(src);\n\n// if (uploadedImage) {\n// // Replace image node with upload node\n// // const uploadNode = new UploadNode(uploadedImage);\n// // nodes[index] = uploadNode;\n// }\n// }\n// });\n\n// $getRoot().select();\n// const selection = $getSelection();\n// if (selection === null) {\n// throw new Error(\"Selection is null\");\n// }\n// selection.insertNodes(nodes);\n// },\n// { discrete: true },\n// );\n\n// // Return the Lexical JSON state\n// return headlessEditor.getEditorState().toJSON() as TypedEditorState<TNodeTypes>;\n// };\n"],"names":[],"mappings":"AAAA,WAAW;AACX,wBAAwB;AACxB,mCAAmC;AACnC,wBAAwB;AACxB,uBAAuB;AACvB,yCAAyC;AACzC,oEAAoE;AACpE,4DAA4D;AAC5D,yDAAyD;AACzD,iFAAiF;AAEjF,oDAAoD;AACpD,mEAAmE;AACnE,MAAM;AACN,oBAAoB;AACpB,YAAY;AACZ,aAAa;AACb,+CAA+C;AAC/C,OAAO;AACP,iDAAiD;AACjD,oBAAoB;AACpB,qCAAqC;AACrC,oBAAoB;AACpB,kCAAkC;AAClC,aAAa;AACb,SAAS;AACT,uGAAuG;AACvG,iDAAiD;AACjD,mCAAmC;AACnC,4CAA4C;AAC5C,mEAAmE;AAEnE,sCAAsC;AACtC,wDAAwD;AAExD,oDAAoD;AACpD,yBAAyB;AACzB,sCAAsC;AACtC,6BAA6B;AAC7B,oEAAoE;AACpE,iEAAiE;AACjE,gBAAgB;AAChB,cAAc;AACd,SAAS;AAET,kCAAkC;AAClC,oDAAoD;AACpD,oDAAoD;AACpD,UAAU;AAEV,iDAAiD;AACjD,6BAA6B;AAC7B,kBAAkB;AAClB,6EAA6E;AAE7E,8DAA8D;AAC9D,+CAA+C;AAC/C,oDAAoD;AACpD,iFAAiF;AACjF,wEAAwE;AAExE,2CAA2C;AAC3C,iEAAiE;AACjE,+EAA+E;AAC/E,wDAAwD;AACxD,wBAAwB;AACxB,oBAAoB;AACpB,kBAAkB;AAElB,mCAAmC;AACnC,iDAAiD;AACjD,wCAAwC;AACxC,wDAAwD;AACxD,gBAAgB;AAChB,4CAA4C;AAC5C,aAAa;AACb,8BAA8B;AAC9B,SAAS;AAET,uCAAuC;AACvC,uFAAuF;AACvF,KAAK"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import type { CollectionAfterChangeHook, Document } from "payload";
|
2
|
+
export interface Orders extends Document {
|
3
|
+
id: string;
|
4
|
+
items: Array<{
|
5
|
+
productUrl: string;
|
6
|
+
quantity: number;
|
7
|
+
variant: {
|
8
|
+
variantId: string;
|
9
|
+
};
|
10
|
+
}>;
|
11
|
+
}
|
12
|
+
export declare const createOrderHook: CollectionAfterChangeHook<Orders>;
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import * as cjSdk from "../sdk/cj-sdk";
|
2
|
+
export const createOrderHook = async ({ doc, req })=>{
|
3
|
+
if (doc.orderStatus !== "processing") {
|
4
|
+
return;
|
5
|
+
}
|
6
|
+
const payload = req.payload;
|
7
|
+
const cjSettings = await payload.findGlobal({
|
8
|
+
slug: "cj-settings"
|
9
|
+
});
|
10
|
+
const podProperties = cjSettings?.pod?.url ? [
|
11
|
+
{
|
12
|
+
areaName: "LogoArea",
|
13
|
+
links: [
|
14
|
+
cjSettings?.pod?.url
|
15
|
+
],
|
16
|
+
type: "1",
|
17
|
+
layer: []
|
18
|
+
}
|
19
|
+
] : [];
|
20
|
+
const result = await cjSdk.createOrder({
|
21
|
+
consigneeID: doc.billingAddress?.name || "",
|
22
|
+
email: doc.billingAddress?.email || "",
|
23
|
+
fromCountryCode: "CN",
|
24
|
+
houseNumber: doc.shippingAddress?.address?.line2 || "",
|
25
|
+
iossType: 1,
|
26
|
+
logisticName: "CJPacket Liquid US",
|
27
|
+
orderNumber: doc.orderId,
|
28
|
+
payType: 2,
|
29
|
+
products: doc.items.map((item)=>({
|
30
|
+
quantity: item.quantity,
|
31
|
+
vid: item.variant.variantId
|
32
|
+
})),
|
33
|
+
podProperties,
|
34
|
+
remark: "",
|
35
|
+
shippingAddress: doc.shippingAddress?.address?.line1 || "",
|
36
|
+
shippingAddress2: doc.shippingAddress?.address?.line2 || "",
|
37
|
+
shippingCity: doc.shippingAddress?.address?.city || "",
|
38
|
+
shippingCountry: doc.shippingAddress?.address?.country || "",
|
39
|
+
shippingCountryCode: doc.shippingAddress?.address?.country || "",
|
40
|
+
shippingCounty: doc.shippingAddress?.address?.city || "",
|
41
|
+
shippingCustomerName: doc.shippingAddress?.name || "",
|
42
|
+
shippingPhone: doc.shippingAddress?.phone || "+9999999999",
|
43
|
+
shippingProvince: doc.shippingAddress?.address?.state || "",
|
44
|
+
shippingZip: doc.shippingAddress?.address?.postal_code || "",
|
45
|
+
taxId: ""
|
46
|
+
});
|
47
|
+
const orderResult = await payload.update({
|
48
|
+
collection: "orders",
|
49
|
+
data: {
|
50
|
+
orderStatus: "shipped"
|
51
|
+
},
|
52
|
+
where: {
|
53
|
+
id: {
|
54
|
+
equals: doc.orderId
|
55
|
+
}
|
56
|
+
}
|
57
|
+
});
|
58
|
+
return {
|
59
|
+
cjResult: result,
|
60
|
+
orderResult
|
61
|
+
};
|
62
|
+
};
|
63
|
+
|
64
|
+
//# sourceMappingURL=create-order.hook.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/service/create-order.hook.ts"],"sourcesContent":["import type { BasePayload, CollectionAfterChangeHook, Document } from \"payload\";\n\nimport * as cjSdk from \"../sdk/cj-sdk\";\n\nexport interface Orders extends Document {\n id: string;\n items: Array<{\n productUrl: string;\n quantity: number;\n variant: {\n variantId: string;\n };\n }>;\n}\n\nexport const createOrderHook: CollectionAfterChangeHook<Orders> = async ({ doc, req }) => {\n if (doc.orderStatus !== \"processing\") {\n return;\n }\n const payload: BasePayload = req.payload;\n const cjSettings: any = await payload.findGlobal({\n slug: \"cj-settings\",\n });\n const podProperties = cjSettings?.pod?.url\n ? [\n {\n areaName: \"LogoArea\",\n links: [cjSettings?.pod?.url],\n type: \"1\",\n layer: [],\n },\n ]\n : [];\n const result = await cjSdk.createOrder({\n consigneeID: doc.billingAddress?.name || \"\",\n email: doc.billingAddress?.email || \"\",\n fromCountryCode: \"CN\",\n houseNumber: doc.shippingAddress?.address?.line2 || \"\",\n iossType: 1,\n logisticName: \"CJPacket Liquid US\",\n orderNumber: doc.orderId,\n payType: 2,\n products: doc.items.map((item) => ({\n quantity: item.quantity,\n vid: item.variant.variantId,\n })),\n podProperties,\n remark: \"\",\n shippingAddress: doc.shippingAddress?.address?.line1 || \"\",\n shippingAddress2: doc.shippingAddress?.address?.line2 || \"\",\n shippingCity: doc.shippingAddress?.address?.city || \"\",\n shippingCountry: doc.shippingAddress?.address?.country || \"\",\n shippingCountryCode: doc.shippingAddress?.address?.country || \"\",\n shippingCounty: doc.shippingAddress?.address?.city || \"\",\n shippingCustomerName: doc.shippingAddress?.name || \"\",\n shippingPhone: doc.shippingAddress?.phone || \"+9999999999\",\n shippingProvince: doc.shippingAddress?.address?.state || \"\",\n shippingZip: doc.shippingAddress?.address?.postal_code || \"\",\n taxId: \"\",\n });\n\n const orderResult = await payload.update({\n collection: \"orders\",\n data: {\n orderStatus: \"shipped\",\n },\n where: {\n id: {\n equals: doc.orderId,\n },\n },\n });\n\n return {\n cjResult: result,\n orderResult,\n };\n};\n"],"names":["cjSdk","createOrderHook","doc","req","orderStatus","payload","cjSettings","findGlobal","slug","podProperties","pod","url","areaName","links","type","layer","result","createOrder","consigneeID","billingAddress","name","email","fromCountryCode","houseNumber","shippingAddress","address","line2","iossType","logisticName","orderNumber","orderId","payType","products","items","map","item","quantity","vid","variant","variantId","remark","line1","shippingAddress2","shippingCity","city","shippingCountry","country","shippingCountryCode","shippingCounty","shippingCustomerName","shippingPhone","phone","shippingProvince","state","shippingZip","postal_code","taxId","orderResult","update","collection","data","where","id","equals","cjResult"],"mappings":"AAEA,YAAYA,WAAW,gBAAgB;AAavC,OAAO,MAAMC,kBAAqD,OAAO,EAAEC,GAAG,EAAEC,GAAG,EAAE;IACjF,IAAID,IAAIE,WAAW,KAAK,cAAc;QAClC;IACJ;IACA,MAAMC,UAAuBF,IAAIE,OAAO;IACxC,MAAMC,aAAkB,MAAMD,QAAQE,UAAU,CAAC;QAC7CC,MAAM;IACV;IACA,MAAMC,gBAAgBH,YAAYI,KAAKC,MACjC;QACI;YACIC,UAAU;YACVC,OAAO;gBAACP,YAAYI,KAAKC;aAAI;YAC7BG,MAAM;YACNC,OAAO,EAAE;QACb;KACH,GACD,EAAE;IACR,MAAMC,SAAS,MAAMhB,MAAMiB,WAAW,CAAC;QACnCC,aAAahB,IAAIiB,cAAc,EAAEC,QAAQ;QACzCC,OAAOnB,IAAIiB,cAAc,EAAEE,SAAS;QACpCC,iBAAiB;QACjBC,aAAarB,IAAIsB,eAAe,EAAEC,SAASC,SAAS;QACpDC,UAAU;QACVC,cAAc;QACdC,aAAa3B,IAAI4B,OAAO;QACxBC,SAAS;QACTC,UAAU9B,IAAI+B,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,CAAA;gBAC/BC,UAAUD,KAAKC,QAAQ;gBACvBC,KAAKF,KAAKG,OAAO,CAACC,SAAS;YAC/B,CAAA;QACA9B;QACA+B,QAAQ;QACRhB,iBAAiBtB,IAAIsB,eAAe,EAAEC,SAASgB,SAAS;QACxDC,kBAAkBxC,IAAIsB,eAAe,EAAEC,SAASC,SAAS;QACzDiB,cAAczC,IAAIsB,eAAe,EAAEC,SAASmB,QAAQ;QACpDC,iBAAiB3C,IAAIsB,eAAe,EAAEC,SAASqB,WAAW;QAC1DC,qBAAqB7C,IAAIsB,eAAe,EAAEC,SAASqB,WAAW;QAC9DE,gBAAgB9C,IAAIsB,eAAe,EAAEC,SAASmB,QAAQ;QACtDK,sBAAsB/C,IAAIsB,eAAe,EAAEJ,QAAQ;QACnD8B,eAAehD,IAAIsB,eAAe,EAAE2B,SAAS;QAC7CC,kBAAkBlD,IAAIsB,eAAe,EAAEC,SAAS4B,SAAS;QACzDC,aAAapD,IAAIsB,eAAe,EAAEC,SAAS8B,eAAe;QAC1DC,OAAO;IACX;IAEA,MAAMC,cAAc,MAAMpD,QAAQqD,MAAM,CAAC;QACrCC,YAAY;QACZC,MAAM;YACFxD,aAAa;QACjB;QACAyD,OAAO;YACHC,IAAI;gBACAC,QAAQ7D,IAAI4B,OAAO;YACvB;QACJ;IACJ;IAEA,OAAO;QACHkC,UAAUhD;QACVyC;IACJ;AACJ,EAAE"}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import type { BasePayload } from "payload";
|
2
|
+
import type { ProductDetails } from "../sdk/products/product-types";
|
3
|
+
export declare const fetchExchangeRates: () => Promise<any>;
|
4
|
+
export declare const syncProducts: (productIds: string[], payload: BasePayload) => Promise<ProductDetails[]>;
|
@@ -0,0 +1,147 @@
|
|
1
|
+
import { convertHTMLToLexical, editorConfigFactory } from "@payloadcms/richtext-lexical";
|
2
|
+
import decimal from "decimal.js";
|
3
|
+
import { JSDOM } from "jsdom";
|
4
|
+
import * as cjSdk from "../sdk/cj-sdk";
|
5
|
+
import path, { dirname } from "path";
|
6
|
+
import fs from "fs";
|
7
|
+
import { promisify } from "util";
|
8
|
+
import { pipeline } from "stream";
|
9
|
+
import { writeFile } from "fs/promises";
|
10
|
+
import { fileURLToPath } from "url";
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
12
|
+
const __dirname = dirname(__filename);
|
13
|
+
const streamPipeline = promisify(pipeline);
|
14
|
+
const delay = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
|
15
|
+
const download = async (uri, filename)=>{
|
16
|
+
try {
|
17
|
+
const response = await fetch(uri);
|
18
|
+
if (!response.ok) {
|
19
|
+
throw new Error(`Failed to fetch ${uri}: ${response.statusText}`);
|
20
|
+
}
|
21
|
+
const contentType = response.headers.get("content-type");
|
22
|
+
const contentLength = response.headers.get("content-length");
|
23
|
+
console.log("content-type:", contentType);
|
24
|
+
console.log("content-length:", contentLength);
|
25
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
26
|
+
await writeFile(filename, buffer);
|
27
|
+
console.log("Download complete:", filename);
|
28
|
+
} catch (error) {
|
29
|
+
console.error("Error downloading file:", error);
|
30
|
+
}
|
31
|
+
};
|
32
|
+
async function uploadImageToPayload(src, payload) {
|
33
|
+
const tempFilePath = path.join(__dirname, "temp-image.jpg");
|
34
|
+
try {
|
35
|
+
// Fetch the image
|
36
|
+
const response = await fetch(src);
|
37
|
+
if (!response.ok) throw new Error(`Failed to fetch image: ${response.statusText}`);
|
38
|
+
// Stream the response body to a temporary file
|
39
|
+
await download(src, tempFilePath);
|
40
|
+
// Upload the image using Payload's Local API
|
41
|
+
const uploadedImage = await payload.create({
|
42
|
+
collection: "media",
|
43
|
+
data: {
|
44
|
+
alt: "Some alt text"
|
45
|
+
},
|
46
|
+
filePath: tempFilePath
|
47
|
+
});
|
48
|
+
console.log("Uploaded media document:", uploadedImage);
|
49
|
+
// Clean up: delete the temporary file
|
50
|
+
fs.unlink(tempFilePath, (err)=>{
|
51
|
+
if (err) console.error("Error deleting temporary file:", err);
|
52
|
+
});
|
53
|
+
return {
|
54
|
+
id: uploadedImage.id,
|
55
|
+
alt: uploadedImage.alt || "",
|
56
|
+
prefix: "media",
|
57
|
+
updatedAt: uploadedImage.updatedAt,
|
58
|
+
createdAt: uploadedImage.createdAt,
|
59
|
+
url: uploadedImage.url,
|
60
|
+
thumbnailURL: uploadedImage.thumbnailURL || null,
|
61
|
+
filename: uploadedImage.filename,
|
62
|
+
mimeType: uploadedImage.mimeType,
|
63
|
+
filesize: uploadedImage.filesize,
|
64
|
+
width: uploadedImage.width,
|
65
|
+
height: uploadedImage.height,
|
66
|
+
focalX: 50,
|
67
|
+
focalY: 50
|
68
|
+
};
|
69
|
+
} catch (error) {
|
70
|
+
console.error("Error uploading image:", error);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
function mapMockProductToSchema(product, editorConfig, rate, payload) {
|
74
|
+
return {
|
75
|
+
description: convertHTMLToLexical({
|
76
|
+
editorConfig,
|
77
|
+
html: product.description || "",
|
78
|
+
JSDOM
|
79
|
+
}),
|
80
|
+
pid: product.pid,
|
81
|
+
title: product.productNameEn,
|
82
|
+
variants: product.variants?.map((variant)=>({
|
83
|
+
imageUrl: variant.variantImage,
|
84
|
+
options: variant.variantKey?.split("-").map((key, index)=>({
|
85
|
+
option: index === 0 ? "Color" : "Size",
|
86
|
+
value: key
|
87
|
+
})),
|
88
|
+
price: new decimal(variant.variantSellPrice || 0).mul(rate).toNumber().toFixed(2),
|
89
|
+
vid: variant.vid
|
90
|
+
}))
|
91
|
+
};
|
92
|
+
}
|
93
|
+
const findProductById = async (productId)=>{
|
94
|
+
const result = await cjSdk.getProductDetails({
|
95
|
+
pid: productId
|
96
|
+
});
|
97
|
+
return result.data;
|
98
|
+
};
|
99
|
+
const createOrUpdateProduct = async (product, payload)=>{
|
100
|
+
const { totalDocs } = await payload.count({
|
101
|
+
collection: "products",
|
102
|
+
where: {
|
103
|
+
pid: {
|
104
|
+
equals: product.pid
|
105
|
+
}
|
106
|
+
}
|
107
|
+
});
|
108
|
+
if (totalDocs === 0) {
|
109
|
+
return payload.create({
|
110
|
+
collection: "products",
|
111
|
+
data: {
|
112
|
+
...product
|
113
|
+
}
|
114
|
+
});
|
115
|
+
}
|
116
|
+
};
|
117
|
+
export const fetchExchangeRates = async ()=>{
|
118
|
+
const response = await fetch("https://open.er-api.com/v6/latest/USD");
|
119
|
+
const data = await response.json();
|
120
|
+
return data;
|
121
|
+
};
|
122
|
+
export const syncProducts = async (productIds, payload)=>{
|
123
|
+
const exchangeRates = await fetchExchangeRates();
|
124
|
+
const storeSettings = await payload.findGlobal({
|
125
|
+
slug: "store-settings"
|
126
|
+
});
|
127
|
+
const rate = exchangeRates.rates[storeSettings.currency || "USD"];
|
128
|
+
const editorConfig = await editorConfigFactory.default({
|
129
|
+
config: payload.config
|
130
|
+
});
|
131
|
+
const products = [];
|
132
|
+
for (const productId of productIds){
|
133
|
+
const product = await findProductById(productId);
|
134
|
+
if (!product) {
|
135
|
+
continue;
|
136
|
+
}
|
137
|
+
products.push(product);
|
138
|
+
await delay(1010);
|
139
|
+
}
|
140
|
+
const mappedProducts = products.map((product)=>{
|
141
|
+
return mapMockProductToSchema(product, editorConfig, rate, payload);
|
142
|
+
});
|
143
|
+
await Promise.all(mappedProducts.map((product)=>createOrUpdateProduct(product, payload)));
|
144
|
+
return products;
|
145
|
+
};
|
146
|
+
|
147
|
+
//# sourceMappingURL=sync-products.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/service/sync-products.ts"],"sourcesContent":["import type { DefaultNodeTypes, TypedEditorState } from \"@payloadcms/richtext-lexical\";\nimport type { BasePayload } from \"payload\";\n\nimport { convertHTMLToLexical, editorConfigFactory } from \"@payloadcms/richtext-lexical\";\nimport decimal from \"decimal.js\";\nimport { JSDOM } from \"jsdom\";\n\nimport type { ProductDetails } from \"../sdk/products/product-types\";\n\nimport * as cjSdk from \"../sdk/cj-sdk\";\nimport path, { dirname, join } from \"path\";\nimport fs from \"fs\";\nimport { promisify } from \"util\";\nimport { pipeline } from \"stream\";\nimport { writeFile } from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst streamPipeline = promisify(pipeline);\n\ninterface Product {\n description: TypedEditorState<DefaultNodeTypes>;\n pid: string;\n title: string;\n variants?: Array<{\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 download = async (uri: string, filename: string): Promise<void> => {\n try {\n const response = await fetch(uri);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${uri}: ${response.statusText}`);\n }\n\n const contentType = response.headers.get(\"content-type\");\n const contentLength = response.headers.get(\"content-length\");\n\n console.log(\"content-type:\", contentType);\n console.log(\"content-length:\", contentLength);\n\n const buffer = Buffer.from(await response.arrayBuffer());\n\n await writeFile(filename, buffer);\n\n console.log(\"Download complete:\", filename);\n } catch (error) {\n console.error(\"Error downloading file:\", error);\n }\n};\n\n\nasync function uploadImageToPayload(src: string, payload: BasePayload): Promise<any | null> {\n const tempFilePath = path.join(__dirname, \"temp-image.jpg\");\n\n try {\n // Fetch the image\n const response = await fetch(src);\n if (!response.ok) throw new Error(`Failed to fetch image: ${response.statusText}`);\n\n // Stream the response body to a temporary file\n await download(src, tempFilePath);\n\n // Upload the image using Payload's Local API\n const uploadedImage = await payload.create({\n collection: \"media\",\n data: {\n alt: \"Some alt text\",\n },\n\n filePath: tempFilePath,\n });\n\n console.log(\"Uploaded media document:\", uploadedImage);\n\n // Clean up: delete the temporary file\n fs.unlink(tempFilePath, (err) => {\n if (err) console.error(\"Error deleting temporary file:\", err);\n });\n\n return {\n id: uploadedImage.id,\n alt: uploadedImage.alt || \"\",\n prefix: \"media\",\n updatedAt: uploadedImage.updatedAt,\n createdAt: uploadedImage.createdAt,\n url: uploadedImage.url,\n thumbnailURL: uploadedImage.thumbnailURL || null,\n filename: uploadedImage.filename,\n mimeType: uploadedImage.mimeType,\n filesize: uploadedImage.filesize,\n width: uploadedImage.width,\n height: uploadedImage.height,\n focalX: 50,\n focalY: 50,\n };\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n }\n}\nfunction mapMockProductToSchema(\n product: ProductDetails,\n editorConfig: any,\n rate: number,\n payload: BasePayload,\n) {\n return {\n description: convertHTMLToLexical({\n editorConfig,\n html: product.description || \"\",\n JSDOM,\n // uploadImage: async (src: string) => {\n // return uploadImageToPayload(src, payload);\n // },\n }),\n pid: product.pid,\n title: product.productNameEn,\n variants: product.variants?.map((variant) => ({\n imageUrl: variant.variantImage, // Map image URL to 'id' if using media collection\n options: variant.variantKey?.split(\"-\").map((key, index) => ({\n option: index === 0 ? \"Color\" : \"Size\", // Assuming 'Color' and 'Size', adjust keys if needed\n value: key,\n })),\n price: new decimal(variant.variantSellPrice || 0).mul(rate).toNumber().toFixed(2),\n vid: variant.vid,\n })),\n };\n}\n\nconst findProductById = async (productId: string) => {\n const result = await cjSdk.getProductDetails({\n pid: productId,\n });\n return result.data;\n};\n\nconst createOrUpdateProduct = async (\n product: Omit<Product, \"createdAt\" | \"id\" | \"updatedAt\">,\n payload: BasePayload,\n) => {\n const { totalDocs } = await payload.count({\n collection: \"products\",\n where: {\n pid: {\n equals: product.pid,\n },\n },\n });\n\n if (totalDocs === 0) {\n return payload.create({\n collection: \"products\",\n data: { ...product } as any,\n });\n }\n};\n\nexport const fetchExchangeRates = async () => {\n const response = await fetch(\"https://open.er-api.com/v6/latest/USD\");\n const data = await response.json();\n\n return data;\n};\n\nexport const syncProducts = async (productIds: string[], payload: BasePayload) => {\n const exchangeRates = await fetchExchangeRates();\n const storeSettings = await payload.findGlobal({\n slug: \"store-settings\",\n });\n const rate = exchangeRates.rates[storeSettings.currency || \"USD\"];\n\n const editorConfig = await editorConfigFactory.default({\n config: payload.config,\n });\n const products: ProductDetails[] = [];\n for (const productId of productIds) {\n const product = await findProductById(productId);\n if (!product) {\n continue;\n }\n products.push(product);\n await delay(1010);\n }\n const mappedProducts = products.map((product) => {\n return mapMockProductToSchema(product, editorConfig, rate, payload);\n });\n\n await Promise.all(\n mappedProducts.map((product) => createOrUpdateProduct(product as any, payload)),\n );\n\n return products;\n};\n"],"names":["convertHTMLToLexical","editorConfigFactory","decimal","JSDOM","cjSdk","path","dirname","fs","promisify","pipeline","writeFile","fileURLToPath","__filename","url","__dirname","streamPipeline","delay","ms","Promise","resolve","setTimeout","download","uri","filename","response","fetch","ok","Error","statusText","contentType","headers","get","contentLength","console","log","buffer","Buffer","from","arrayBuffer","error","uploadImageToPayload","src","payload","tempFilePath","join","uploadedImage","create","collection","data","alt","filePath","unlink","err","id","prefix","updatedAt","createdAt","thumbnailURL","mimeType","filesize","width","height","focalX","focalY","mapMockProductToSchema","product","editorConfig","rate","description","html","pid","title","productNameEn","variants","map","variant","imageUrl","variantImage","options","variantKey","split","key","index","option","value","price","variantSellPrice","mul","toNumber","toFixed","vid","findProductById","productId","result","getProductDetails","createOrUpdateProduct","totalDocs","count","where","equals","fetchExchangeRates","json","syncProducts","productIds","exchangeRates","storeSettings","findGlobal","slug","rates","currency","default","config","products","push","mappedProducts","all"],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
export interface CJApiResponse<T> {
|
2
|
+
code: number;
|
3
|
+
result: boolean;
|
4
|
+
message: string;
|
5
|
+
data: T | null;
|
6
|
+
requestId: string;
|
7
|
+
}
|
8
|
+
export interface AccessTokenResponse {
|
9
|
+
code: number;
|
10
|
+
result: boolean;
|
11
|
+
message: string;
|
12
|
+
data: {
|
13
|
+
accessToken: string;
|
14
|
+
accessTokenExpiryDate: string | Date;
|
15
|
+
refreshToken: string;
|
16
|
+
refreshTokenExpiryDate: string | Date;
|
17
|
+
createDate: string;
|
18
|
+
} | null;
|
19
|
+
requestId: string;
|
20
|
+
}
|
21
|
+
export interface Variant {
|
22
|
+
vid: string;
|
23
|
+
pid: string;
|
24
|
+
variantName: string | null;
|
25
|
+
variantNameEn: string | null;
|
26
|
+
variantSku: string;
|
27
|
+
variantImage: string | null;
|
28
|
+
variantStandard: string | null;
|
29
|
+
variantUnit: string | null;
|
30
|
+
variantProperty: string | null;
|
31
|
+
variantKey: string;
|
32
|
+
variantLength: number;
|
33
|
+
variantWidth: number;
|
34
|
+
variantHeight: number;
|
35
|
+
variantVolume: number;
|
36
|
+
variantWeight: number;
|
37
|
+
variantSellPrice: number;
|
38
|
+
variantSugSellPrice: number;
|
39
|
+
createTime: string;
|
40
|
+
}
|
41
|
+
export interface ProductDetailResponseData {
|
42
|
+
pid: string;
|
43
|
+
productName: string[];
|
44
|
+
productNameEn: string;
|
45
|
+
productSku: string;
|
46
|
+
productImage: string;
|
47
|
+
productWeight: number;
|
48
|
+
productUnit: string;
|
49
|
+
productType: string;
|
50
|
+
categoryId: string;
|
51
|
+
categoryName: string;
|
52
|
+
entryCode: string;
|
53
|
+
entryName: string;
|
54
|
+
entryNameEn: string;
|
55
|
+
materialName: string[];
|
56
|
+
materialNameEn: string[];
|
57
|
+
materialKey: string[];
|
58
|
+
packingWeight: number;
|
59
|
+
packingName: string[];
|
60
|
+
packingNameEn: string[];
|
61
|
+
packingKey: string[];
|
62
|
+
productKey: string[];
|
63
|
+
productKeyEn: string;
|
64
|
+
sellPrice: number;
|
65
|
+
sourceFrom: number;
|
66
|
+
description: string;
|
67
|
+
suggestSellPrice: string;
|
68
|
+
listedNum: number;
|
69
|
+
status: string;
|
70
|
+
supplierName: string;
|
71
|
+
supplierId: string;
|
72
|
+
variants: Variant[];
|
73
|
+
createrTime: string;
|
74
|
+
}
|
package/dist/types.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["\nexport interface CJApiResponse<T> {\n code: number;\n result: boolean;\n message: string;\n data: T | null;\n requestId: string;\n}\n\nexport interface AccessTokenResponse {\n code: number;\n result: boolean;\n message: string;\n data: {\n accessToken: string;\n accessTokenExpiryDate: string | Date;\n refreshToken: string;\n refreshTokenExpiryDate: string | Date;\n createDate: string;\n } | null;\n requestId: string;\n}\n\n\n\nexport interface Variant {\n vid: string;\n pid: string;\n variantName: string | null;\n variantNameEn: string | null;\n variantSku: string;\n variantImage: string | null;\n variantStandard: string | null;\n variantUnit: string | null;\n variantProperty: string | null;\n variantKey: string;\n variantLength: number;\n variantWidth: number;\n variantHeight: number;\n variantVolume: number;\n variantWeight: number;\n variantSellPrice: number;\n variantSugSellPrice: number;\n createTime: string;\n}\n\nexport interface ProductDetailResponseData {\n pid: string;\n productName: string[];\n productNameEn: string;\n productSku: string;\n productImage: string;\n productWeight: number;\n productUnit: string;\n productType: string;\n categoryId: string;\n categoryName: string;\n entryCode: string;\n entryName: string;\n entryNameEn: string;\n materialName: string[];\n materialNameEn: string[];\n materialKey: string[];\n packingWeight: number;\n packingName: string[];\n packingNameEn: string[];\n packingKey: string[];\n productKey: string[];\n productKeyEn: string;\n sellPrice: number;\n sourceFrom: number;\n description: string;\n suggestSellPrice: string;\n listedNum: number;\n status: string;\n supplierName: string;\n supplierId: string;\n variants: Variant[];\n createrTime: string;\n}\n\n"],"names":[],"mappings":"AA8CA,WAiCC"}
|