@shopnex/cj-plugin 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/CjCollection.d.ts +21 -0
  2. package/dist/CjCollection.js +113 -0
  3. package/dist/CjCollection.js.map +1 -0
  4. package/dist/api-client.d.ts +1 -1
  5. package/dist/api-client.js +5 -5
  6. package/dist/api-client.js.map +1 -1
  7. package/dist/error-handler.js.map +1 -1
  8. package/dist/error-types.js.map +1 -1
  9. package/dist/index.d.ts +1 -3
  10. package/dist/index.js +8 -24
  11. package/dist/index.js.map +1 -1
  12. package/dist/rsc/ApiToken.d.ts +1 -1
  13. package/dist/rsc/ApiToken.js.map +1 -1
  14. package/dist/rsc/ApiToken.scss +1 -2
  15. package/dist/sdk/access-token.d.ts +1 -1
  16. package/dist/sdk/access-token.js +11 -11
  17. package/dist/sdk/access-token.js.map +1 -1
  18. package/dist/{auth.js → sdk/auth.js} +11 -12
  19. package/dist/sdk/auth.js.map +1 -0
  20. package/dist/sdk/cj-sdk.d.ts +18 -4
  21. package/dist/sdk/cj-sdk.js +42 -4
  22. package/dist/sdk/cj-sdk.js.map +1 -1
  23. package/dist/sdk/dispute/dispute-types.js.map +1 -1
  24. package/dist/sdk/dispute/dispute.d.ts +2 -2
  25. package/dist/sdk/dispute/dispute.js +12 -14
  26. package/dist/sdk/dispute/dispute.js.map +1 -1
  27. package/dist/sdk/inventory/inventory-types.js.map +1 -1
  28. package/dist/sdk/inventory/inventory.d.ts +2 -2
  29. package/dist/sdk/inventory/inventory.js +9 -10
  30. package/dist/sdk/inventory/inventory.js.map +1 -1
  31. package/dist/sdk/orders/orders.d.ts +2 -2
  32. package/dist/sdk/orders/orders.js +32 -32
  33. package/dist/sdk/orders/orders.js.map +1 -1
  34. package/dist/sdk/products/product-types.d.ts +14 -3
  35. package/dist/sdk/products/product-types.js +1 -3
  36. package/dist/sdk/products/product-types.js.map +1 -1
  37. package/dist/sdk/products/products.d.ts +7 -1
  38. package/dist/sdk/products/products.js +51 -2
  39. package/dist/sdk/products/products.js.map +1 -1
  40. package/dist/sdk/settings/settings-api.d.ts +1 -1
  41. package/dist/sdk/settings/settings-api.js +4 -4
  42. package/dist/sdk/settings/settings-api.js.map +1 -1
  43. package/dist/sdk/settings/settings-types.js.map +1 -1
  44. package/dist/sdk/variants/variant-types.js.map +1 -1
  45. package/dist/sdk/variants/variants.d.ts +2 -2
  46. package/dist/sdk/variants/variants.js +16 -18
  47. package/dist/sdk/variants/variants.js.map +1 -1
  48. package/dist/service/access-token.d.ts +2 -0
  49. package/dist/service/access-token.js +53 -0
  50. package/dist/service/access-token.js.map +1 -0
  51. package/dist/service/create-order.hook.js +5 -2
  52. package/dist/service/create-order.hook.js.map +1 -1
  53. package/dist/service/sync-products.d.ts +7 -2
  54. package/dist/service/sync-products.js +99 -100
  55. package/dist/service/sync-products.js.map +1 -1
  56. package/dist/ui/refund-button.d.ts +1 -1
  57. package/dist/ui/refund-button.js +2 -2
  58. package/dist/ui/refund-button.js.map +1 -1
  59. package/dist/util/get-product-id.d.ts +1 -0
  60. package/dist/util/get-product-id.js +10 -0
  61. package/dist/util/get-product-id.js.map +1 -0
  62. package/dist/util/manage-tokens.js.map +1 -1
  63. package/package.json +5 -2
  64. package/LICENSE.md +0 -9
  65. package/dist/auth.js.map +0 -1
  66. package/dist/cj-settings.d.ts +0 -9
  67. package/dist/cj-settings.js +0 -99
  68. package/dist/cj-settings.js.map +0 -1
  69. /package/dist/{auth.d.ts → sdk/auth.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sdk/products/products.ts"],"sourcesContent":["import type { APIResponse } from \"../../error-types\";\nimport type {\n CategoryFirstLevel,\n CategoryListResponse,\n Product,\n ProductDetails,\n ProductListResponse,\n} from \"./product-types.ts\";\n\nimport { cjApiClient } from \"../../api-client\";\nimport { getCurrentAccessToken } from \"../access-token\";\n\nexport async function getProductCategory(\n accessToken: string,\n params: any,\n): Promise<APIResponse<CategoryFirstLevel[]>> {\n try {\n const response = await cjApiClient.get<CategoryListResponse>(\"/product/getCategory\", {\n headers: { \"CJ-Access-Token\": accessToken },\n params,\n });\n\n const data = response.data.data;\n if (!data) {\n return { error: \"No categories found\" };\n }\n\n return { data };\n } catch (error: any) {\n console.error(`Error fetching categories [${error.code}]: ${error.message}`);\n return { error: error.message || \"Failed to fetch categories\" };\n }\n}\n\nexport async function getProductList(\n params: Record<string, any> = {},\n): Promise<APIResponse<Product[]>> {\n const defaultParams = {\n pageNum: 1,\n pageSize: 20,\n };\n const query = { ...defaultParams, ...params };\n\n try {\n const accessToken = await getCurrentAccessToken();\n const response = await cjApiClient.get<ProductListResponse>(\n \"https://developers.cjdropshipping.com/api2.0/v1/product/list\",\n {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: query,\n },\n );\n\n const data = response.data;\n\n if (!data.result) {\n return { error: data.message || \"Failed to fetch product list\" };\n }\n\n if (!data.data?.list) {\n return { error: \"No products found\" };\n }\n\n return { data: data.data.list };\n } catch (error: any) {\n console.error(`Error fetching product list [${error.code}]: ${error.message}`);\n return { error: error.message || \"Failed to fetch product list\" };\n }\n}\n\nexport async function getProductDetails(queryParams: {\n pid?: string;\n productSku?: string;\n variantSku?: string;\n}): Promise<APIResponse<ProductDetails>> {\n const { pid, productSku, variantSku } = queryParams;\n if (!pid && !productSku && !variantSku) {\n return {\n error: \"One of pid, productSku, or variantSku must be provided.\",\n };\n }\n\n try {\n const accessToken = await getCurrentAccessToken();\n const response = await cjApiClient.get<{\n code: number;\n data: ProductDetails;\n message: string;\n result: boolean;\n }>(\"https://developers.cjdropshipping.com/api2.0/v1/product/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 product details\",\n };\n }\n\n return { data: response.data.data };\n } catch (error: any) {\n console.error(`Error fetching product details [${error.code}]: ${error.message}`);\n throw new Error(error.message);\n }\n}\n"],"names":["cjApiClient","getCurrentAccessToken","getProductCategory","accessToken","params","response","get","headers","data","error","console","code","message","getProductList","defaultParams","pageNum","pageSize","query","result","list","getProductDetails","queryParams","pid","productSku","variantSku","Error"],"mappings":"AASA,SAASA,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,qBAAqB,QAAQ,kBAAkB;AAExD,OAAO,eAAeC,mBAClBC,WAAmB,EACnBC,MAAW;IAEX,IAAI;QACA,MAAMC,WAAW,MAAML,YAAYM,GAAG,CAAuB,wBAAwB;YACjFC,SAAS;gBAAE,mBAAmBJ;YAAY;YAC1CC;QACJ;QAEA,MAAMI,OAAOH,SAASG,IAAI,CAACA,IAAI;QAC/B,IAAI,CAACA,MAAM;YACP,OAAO;gBAAEC,OAAO;YAAsB;QAC1C;QAEA,OAAO;YAAED;QAAK;IAClB,EAAE,OAAOC,OAAY;QACjBC,QAAQD,KAAK,CAAC,CAAC,2BAA2B,EAAEA,MAAME,IAAI,CAAC,GAAG,EAAEF,MAAMG,OAAO,EAAE;QAC3E,OAAO;YAAEH,OAAOA,MAAMG,OAAO,IAAI;QAA6B;IAClE;AACJ;AAEA,OAAO,eAAeC,eAClBT,SAA8B,CAAC,CAAC;IAEhC,MAAMU,gBAAgB;QAClBC,SAAS;QACTC,UAAU;IACd;IACA,MAAMC,QAAQ;QAAE,GAAGH,aAAa;QAAE,GAAGV,MAAM;IAAC;IAE5C,IAAI;QACA,MAAMD,cAAc,MAAMF;QAC1B,MAAMI,WAAW,MAAML,YAAYM,GAAG,CAClC,gEACA;YACIC,SAAS;gBACL,mBAAmBJ;YACvB;YACAC,QAAQa;QACZ;QAGJ,MAAMT,OAAOH,SAASG,IAAI;QAE1B,IAAI,CAACA,KAAKU,MAAM,EAAE;YACd,OAAO;gBAAET,OAAOD,KAAKI,OAAO,IAAI;YAA+B;QACnE;QAEA,IAAI,CAACJ,KAAKA,IAAI,EAAEW,MAAM;YAClB,OAAO;gBAAEV,OAAO;YAAoB;QACxC;QAEA,OAAO;YAAED,MAAMA,KAAKA,IAAI,CAACW,IAAI;QAAC;IAClC,EAAE,OAAOV,OAAY;QACjBC,QAAQD,KAAK,CAAC,CAAC,6BAA6B,EAAEA,MAAME,IAAI,CAAC,GAAG,EAAEF,MAAMG,OAAO,EAAE;QAC7E,OAAO;YAAEH,OAAOA,MAAMG,OAAO,IAAI;QAA+B;IACpE;AACJ;AAEA,OAAO,eAAeQ,kBAAkBC,WAIvC;IACG,MAAM,EAAEC,GAAG,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGH;IACxC,IAAI,CAACC,OAAO,CAACC,cAAc,CAACC,YAAY;QACpC,OAAO;YACHf,OAAO;QACX;IACJ;IAEA,IAAI;QACA,MAAMN,cAAc,MAAMF;QAC1B,MAAMI,WAAW,MAAML,YAAYM,GAAG,CAKnC,iEAAiE;YAChEC,SAAS;gBACL,mBAAmBJ;YACvB;YACAC,QAAQiB;QACZ;QAEA,IAAI,CAAChB,SAASG,IAAI,CAACU,MAAM,EAAE;YACvB,OAAO;gBACHT,OAAOJ,SAASG,IAAI,CAACI,OAAO,IAAI;YACpC;QACJ;QAEA,OAAO;YAAEJ,MAAMH,SAASG,IAAI,CAACA,IAAI;QAAC;IACtC,EAAE,OAAOC,OAAY;QACjBC,QAAQD,KAAK,CAAC,CAAC,gCAAgC,EAAEA,MAAME,IAAI,CAAC,GAAG,EAAEF,MAAMG,OAAO,EAAE;QAChF,MAAM,IAAIa,MAAMhB,MAAMG,OAAO;IACjC;AACJ"}
1
+ {"version":3,"sources":["../../../src/sdk/products/products.ts"],"sourcesContent":["import type { APIResponse } from \"../../error-types\";\nimport type {\n CategoryFirstLevel,\n CategoryListResponse,\n Product,\n ProductDetails,\n ProductListResponse,\n StockInfo,\n} from \"./product-types.ts\";\n\nimport { cjApiClient } from \"../../api-client\";\nimport { getCurrentAccessToken } from \"../access-token\";\n\nexport async function getProductCategory(\n accessToken: string,\n params: any\n): Promise<APIResponse<CategoryFirstLevel[]>> {\n try {\n const response = await cjApiClient.get<CategoryListResponse>(\n \"/product/getCategory\",\n {\n headers: { \"CJ-Access-Token\": accessToken },\n params,\n }\n );\n\n const data = response.data.data;\n if (!data) {\n return { error: \"No categories found\" };\n }\n\n return { data };\n } catch (error: any) {\n console.error(\n `Error fetching categories [${error.code}]: ${error.message}`\n );\n return { error: error.message || \"Failed to fetch categories\" };\n }\n}\n\nexport async function getProductList(\n params: Record<string, any> = {}\n): Promise<APIResponse<Product[]>> {\n const defaultParams = {\n pageNum: 1,\n pageSize: 20,\n };\n const query = { ...defaultParams, ...params };\n\n try {\n const accessToken = await getCurrentAccessToken();\n const response = await cjApiClient.get<ProductListResponse>(\n \"https://developers.cjdropshipping.com/api2.0/v1/product/list\",\n {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: query,\n }\n );\n\n const data = response.data;\n\n if (!data.result) {\n return { error: data.message || \"Failed to fetch product list\" };\n }\n\n if (!data.data?.list) {\n return { error: \"No products found\" };\n }\n\n return { data: data.data.list };\n } catch (error: any) {\n console.error(\n `Error fetching product list [${error.code}]: ${error.message}`\n );\n return { error: error.message || \"Failed to fetch product list\" };\n }\n}\n\nexport async function getProductDetails(queryParams: {\n accessToken: string;\n pid?: string;\n productSku?: string;\n variantSku?: string;\n}): Promise<APIResponse<ProductDetails>> {\n const { pid, productSku, variantSku, accessToken } = queryParams;\n if (!pid && !productSku && !variantSku) {\n return {\n error: \"One of pid, productSku, or variantSku must be provided.\",\n };\n }\n\n try {\n const response = await cjApiClient.get<{\n code: number;\n data: ProductDetails;\n message: string;\n result: boolean;\n }>(\"https://developers.cjdropshipping.com/api2.0/v1/product/query\", {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: queryParams,\n });\n\n if (!response.data.result) {\n return {\n error:\n response.data.message || \"Failed to fetch product details\",\n };\n }\n\n return { data: response.data.data };\n } catch (error: any) {\n console.error(\n `Error fetching product details [${error.code}]: ${error.message}`\n );\n throw new Error(error.message);\n }\n}\n\nexport async function getProductStockByVid({\n vid,\n accessToken,\n}: {\n vid: string;\n accessToken: string;\n}): Promise<APIResponse<StockInfo[]>> {\n try {\n const response = await cjApiClient.get<{\n code: number;\n result: boolean;\n message: string;\n data: StockInfo[];\n }>(\"/product/stock/queryByVid\", {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: { vid },\n });\n\n if (!response.data.result) {\n return {\n error:\n response.data.message ||\n \"Failed to fetch stock information\",\n };\n }\n\n return { data: response.data.data };\n } catch (error: any) {\n console.error(\n `Error fetching stock by VID [${error.code}]: ${error.message}`\n );\n return { error: error.message || \"Failed to fetch stock information\" };\n }\n}\n\nexport async function getProductStockBySku(\n sku: string,\n accessToken: string\n): Promise<APIResponse<StockInfo[]>> {\n try {\n const response = await cjApiClient.get<{\n code: number;\n result: boolean;\n message: string;\n data: StockInfo[];\n }>(\"/product/stock/queryBySku\", {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: { sku },\n });\n\n if (!response.data.result) {\n return {\n error:\n response.data.message ||\n \"Failed to fetch stock information\",\n };\n }\n\n return { data: response.data.data };\n } catch (error: any) {\n console.error(\n `Error fetching stock by SKU [${error.code}]: ${error.message}`\n );\n return { error: error.message || \"Failed to fetch stock information\" };\n }\n}\n"],"names":["cjApiClient","getCurrentAccessToken","getProductCategory","accessToken","params","response","get","headers","data","error","console","code","message","getProductList","defaultParams","pageNum","pageSize","query","result","list","getProductDetails","queryParams","pid","productSku","variantSku","Error","getProductStockByVid","vid","getProductStockBySku","sku"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import type { AccountSettings } from './settings-types';
1
+ import type { AccountSettings } from "./settings-types";
2
2
  export declare function getSettings(accessToken: string): Promise<AccountSettings>;
@@ -1,14 +1,14 @@
1
- import { cjApiClient } from '../../api-client';
1
+ import { cjApiClient } from "../../api-client";
2
2
  export async function getSettings(accessToken) {
3
3
  try {
4
- const response = await cjApiClient.get('setting/get', {
4
+ const response = await cjApiClient.get("setting/get", {
5
5
  headers: {
6
- 'CJ-Access-Token': accessToken
6
+ "CJ-Access-Token": accessToken
7
7
  }
8
8
  });
9
9
  const result = response.data.data;
10
10
  if (!result) {
11
- throw new Error('No settings found');
11
+ throw new Error("No settings found");
12
12
  }
13
13
  return result;
14
14
  } catch (error) {
@@ -1 +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"}
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(\n accessToken: string\n): Promise<AccountSettings> {\n try {\n const response = await cjApiClient.get<CJApiResponse<AccountSettings>>(\n \"setting/get\",\n {\n headers: { \"CJ-Access-Token\": accessToken },\n }\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(\n `Error fetching settings [${error.code}]: ${error.message}`\n );\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,mBAAmB;AAE/C,OAAO,eAAeC,YAClBC,WAAmB;IAEnB,IAAI;QACA,MAAMC,WAAW,MAAMH,YAAYI,GAAG,CAClC,eACA;YACIC,SAAS;gBAAE,mBAAmBH;YAAY;QAC9C;QAGJ,MAAMI,SAASH,SAASI,IAAI,CAACA,IAAI;QACjC,IAAI,CAACD,QAAQ;YACT,MAAM,IAAIE,MAAM;QACpB;QAEA,OAAOF;IACX,EAAE,OAAOG,OAAY;QACjBC,QAAQD,KAAK,CACT,CAAC,yBAAyB,EAAEA,MAAME,IAAI,CAAC,GAAG,EAAEF,MAAMG,OAAO,EAAE;QAE/D,MAAMH;IACV;AACJ"}
@@ -1 +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"}
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"}
@@ -1 +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"}
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"}
@@ -1,5 +1,5 @@
1
- import type { APIResponse } from '../../error-types';
2
- import type { Variant } from './variant-types.js';
1
+ import type { APIResponse } from "../../error-types";
2
+ import type { Variant } from "./variant-types.js";
3
3
  export declare function getAllVariants(queryParams: {
4
4
  pid?: string;
5
5
  productSku?: string;
@@ -1,28 +1,27 @@
1
- import { cjApiClient } from '../../api-client';
2
- import { getCurrentAccessToken } from '../access-token';
1
+ import { cjApiClient } from "../../api-client";
2
+ import { getCurrentAccessToken } from "../access-token";
3
3
  export async function getAllVariants(queryParams) {
4
4
  if (!queryParams.pid && !queryParams.productSku && !queryParams.variantSku) {
5
5
  return {
6
- error: 'One of pid, productSku, or variantSku must be provided.'
6
+ error: "One of pid, productSku, or variantSku must be provided."
7
7
  };
8
8
  }
9
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', {
10
+ const accessToken = await getCurrentAccessToken(); // Ensure you populate this with a valid token
11
+ const response = await cjApiClient.get("product/variant/query", {
13
12
  headers: {
14
- 'CJ-Access-Token': accessToken
13
+ "CJ-Access-Token": accessToken
15
14
  },
16
15
  params: queryParams
17
16
  });
18
17
  if (!response.data.result) {
19
18
  return {
20
- error: response.data.message || 'Failed to fetch variants'
19
+ error: response.data.message || "Failed to fetch variants"
21
20
  };
22
21
  }
23
22
  if (!response.data.data) {
24
23
  return {
25
- error: 'No variants found'
24
+ error: "No variants found"
26
25
  };
27
26
  }
28
27
  return {
@@ -31,22 +30,21 @@ export async function getAllVariants(queryParams) {
31
30
  } catch (error) {
32
31
  console.error(`Error fetching all variants [${error.code}]: ${error.message}`);
33
32
  return {
34
- error: error.message || 'An unknown error occurred'
33
+ error: error.message || "An unknown error occurred"
35
34
  };
36
35
  }
37
36
  }
38
37
  export async function getVariantById(vid) {
39
38
  if (!vid) {
40
39
  return {
41
- error: 'vid must be provided.'
40
+ error: "vid must be provided."
42
41
  };
43
42
  }
44
43
  try {
45
- const accessToken = await getCurrentAccessToken() // Ensure you populate this with a valid token
46
- ;
47
- const response = await cjApiClient.get('product/variant/queryByVid', {
44
+ const accessToken = await getCurrentAccessToken(); // Ensure you populate this with a valid token
45
+ const response = await cjApiClient.get("product/variant/queryByVid", {
48
46
  headers: {
49
- 'CJ-Access-Token': accessToken
47
+ "CJ-Access-Token": accessToken
50
48
  },
51
49
  params: {
52
50
  vid
@@ -54,12 +52,12 @@ export async function getVariantById(vid) {
54
52
  });
55
53
  if (!response.data.result) {
56
54
  return {
57
- error: response.data.message || 'Failed to fetch variant by ID'
55
+ error: response.data.message || "Failed to fetch variant by ID"
58
56
  };
59
57
  }
60
58
  if (!response.data.data) {
61
59
  return {
62
- error: 'No variant found'
60
+ error: "No variant found"
63
61
  };
64
62
  }
65
63
  return {
@@ -68,7 +66,7 @@ export async function getVariantById(vid) {
68
66
  } catch (error) {
69
67
  console.error(`Error fetching variant by ID [${error.code}]: ${error.message}`);
70
68
  return {
71
- error: error.message || 'An unknown error occurred'
69
+ error: error.message || "An unknown error occurred"
72
70
  };
73
71
  }
74
72
  }
@@ -1 +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"}
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 (\n !queryParams.pid &&\n !queryParams.productSku &&\n !queryParams.variantSku\n ) {\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[]>>(\n \"product/variant/query\",\n {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: queryParams,\n }\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(\n `Error fetching all variants [${error.code}]: ${error.message}`\n );\n return { error: error.message || \"An unknown error occurred\" };\n }\n}\n\nexport async function getVariantById(\n vid: string\n): 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>>(\n \"product/variant/queryByVid\",\n {\n headers: {\n \"CJ-Access-Token\": accessToken,\n },\n params: { vid },\n }\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(\n `Error fetching variant by ID [${error.code}]: ${error.message}`\n );\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,mBAAmB;AAC/C,SAASC,qBAAqB,QAAQ,kBAAkB;AAExD,OAAO,eAAeC,eAAeC,WAIpC;IACG,IACI,CAACA,YAAYC,GAAG,IAChB,CAACD,YAAYE,UAAU,IACvB,CAACF,YAAYG,UAAU,EACzB;QACE,OAAO;YACHC,OAAO;QACX;IACJ;IAEA,IAAI;QACA,MAAMC,cAAc,MAAMP,yBAAyB,8CAA8C;QACjG,MAAMQ,WAAW,MAAMT,YAAYU,GAAG,CAClC,yBACA;YACIC,SAAS;gBACL,mBAAmBH;YACvB;YACAI,QAAQT;QACZ;QAGJ,IAAI,CAACM,SAASI,IAAI,CAACC,MAAM,EAAE;YACvB,OAAO;gBACHP,OAAOE,SAASI,IAAI,CAACE,OAAO,IAAI;YACpC;QACJ;QAEA,IAAI,CAACN,SAASI,IAAI,CAACA,IAAI,EAAE;YACrB,OAAO;gBAAEN,OAAO;YAAoB;QACxC;QAEA,OAAO;YAAEM,MAAMJ,SAASI,IAAI,CAACA,IAAI;QAAC;IACtC,EAAE,OAAON,OAAY;QACjBS,QAAQT,KAAK,CACT,CAAC,6BAA6B,EAAEA,MAAMU,IAAI,CAAC,GAAG,EAAEV,MAAMQ,OAAO,EAAE;QAEnE,OAAO;YAAER,OAAOA,MAAMQ,OAAO,IAAI;QAA4B;IACjE;AACJ;AAEA,OAAO,eAAeG,eAClBC,GAAW;IAEX,IAAI,CAACA,KAAK;QACN,OAAO;YAAEZ,OAAO;QAAwB;IAC5C;IAEA,IAAI;QACA,MAAMC,cAAc,MAAMP,yBAAyB,8CAA8C;QACjG,MAAMQ,WAAW,MAAMT,YAAYU,GAAG,CAClC,8BACA;YACIC,SAAS;gBACL,mBAAmBH;YACvB;YACAI,QAAQ;gBAAEO;YAAI;QAClB;QAGJ,IAAI,CAACV,SAASI,IAAI,CAACC,MAAM,EAAE;YACvB,OAAO;gBACHP,OAAOE,SAASI,IAAI,CAACE,OAAO,IAAI;YACpC;QACJ;QAEA,IAAI,CAACN,SAASI,IAAI,CAACA,IAAI,EAAE;YACrB,OAAO;gBAAEN,OAAO;YAAmB;QACvC;QAEA,OAAO;YAAEM,MAAMJ,SAASI,IAAI,CAACA,IAAI;QAAC;IACtC,EAAE,OAAON,OAAY;QACjBS,QAAQT,KAAK,CACT,CAAC,8BAA8B,EAAEA,MAAMU,IAAI,CAAC,GAAG,EAAEV,MAAMQ,OAAO,EAAE;QAEpE,OAAO;YAAER,OAAOA,MAAMQ,OAAO,IAAI;QAA4B;IACjE;AACJ"}
@@ -0,0 +1,2 @@
1
+ import { CjData } from "../CjCollection";
2
+ export declare const retrieveAccessToken: (data: Partial<CjData>) => Promise<string>;
@@ -0,0 +1,53 @@
1
+ import { getAccessToken, refreshAccessToken } from "../sdk/auth";
2
+ const ONE_HOUR_MS = 60 * 60 * 1000;
3
+ const ONE_DAY_MS = 24 * ONE_HOUR_MS;
4
+ const TOKEN_EXPIRY = {
5
+ ACCESS: 15 * ONE_DAY_MS,
6
+ REFRESH: 180 * ONE_DAY_MS
7
+ };
8
+ const isTokenExpiring = async (expiryDate)=>{
9
+ const now = new Date();
10
+ const oneHourFromNow = new Date(now.getTime() + ONE_HOUR_MS);
11
+ const expiryDateTime = new Date(expiryDate);
12
+ return expiryDateTime.getTime() < oneHourFromNow.getTime();
13
+ };
14
+ const updateTokenData = (data, tokenResponse)=>{
15
+ const now = new Date().getTime();
16
+ data.accessToken = tokenResponse.accessToken;
17
+ data.refreshToken = tokenResponse.refreshToken;
18
+ data.accessTokenExpiry = new Date(now + TOKEN_EXPIRY.ACCESS);
19
+ data.refreshTokenExpiry = new Date(now + TOKEN_EXPIRY.REFRESH);
20
+ };
21
+ const validateCredentials = (apiToken, email)=>{
22
+ if (!apiToken || !email) {
23
+ throw new Error("Missing API token or email address");
24
+ }
25
+ };
26
+ const handleRefreshToken = async (data, refreshToken)=>{
27
+ const refreshedTokens = await refreshAccessToken(refreshToken);
28
+ updateTokenData(data, refreshedTokens);
29
+ return refreshedTokens.accessToken;
30
+ };
31
+ const getNewTokens = async (data, email, apiToken)=>{
32
+ const newTokens = await getAccessToken(email, apiToken);
33
+ updateTokenData(data, newTokens);
34
+ return newTokens.accessToken;
35
+ };
36
+ export const retrieveAccessToken = async (data)=>{
37
+ const apiToken = data.apiToken || process.env.CJ_API_TOKEN;
38
+ const email = data.emailAddress || process.env.CJ_EMAIL_ADDRESS;
39
+ validateCredentials(apiToken, email);
40
+ const { accessToken, accessTokenExpiry, refreshToken, refreshTokenExpiry } = data;
41
+ // Check if current access token is valid
42
+ if (accessToken && accessTokenExpiry && !await isTokenExpiring(accessTokenExpiry)) {
43
+ return accessToken;
44
+ }
45
+ // Try refresh token if available
46
+ if (refreshToken && refreshTokenExpiry && !await isTokenExpiring(refreshTokenExpiry)) {
47
+ return handleRefreshToken(data, refreshToken);
48
+ }
49
+ // Get new tokens if everything is expired or missing
50
+ return getNewTokens(data, email, apiToken);
51
+ };
52
+
53
+ //# sourceMappingURL=access-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/service/access-token.ts"],"sourcesContent":["import { CjData } from \"../CjCollection\";\nimport { getAccessToken, refreshAccessToken } from \"../sdk/auth\";\n\ninterface TokenResponse {\n accessToken: string;\n refreshToken: string;\n}\n\nconst ONE_HOUR_MS = 60 * 60 * 1000;\nconst ONE_DAY_MS = 24 * ONE_HOUR_MS;\nconst TOKEN_EXPIRY = {\n ACCESS: 15 * ONE_DAY_MS, // 15 days\n REFRESH: 180 * ONE_DAY_MS, // 180 days\n};\n\nconst isTokenExpiring = async (expiryDate: string | Date): Promise<boolean> => {\n const now = new Date();\n const oneHourFromNow = new Date(now.getTime() + ONE_HOUR_MS);\n const expiryDateTime = new Date(expiryDate);\n return expiryDateTime.getTime() < oneHourFromNow.getTime();\n};\n\nconst updateTokenData = (\n data: Partial<CjData>,\n tokenResponse: TokenResponse\n): void => {\n const now = new Date().getTime();\n\n data.accessToken = tokenResponse.accessToken;\n data.refreshToken = tokenResponse.refreshToken;\n data.accessTokenExpiry = new Date(now + TOKEN_EXPIRY.ACCESS);\n data.refreshTokenExpiry = new Date(now + TOKEN_EXPIRY.REFRESH);\n};\n\nconst validateCredentials = (\n apiToken: string | undefined,\n email: string | undefined\n): void => {\n if (!apiToken || !email) {\n throw new Error(\"Missing API token or email address\");\n }\n};\n\nconst handleRefreshToken = async (\n data: Partial<CjData>,\n refreshToken: string\n): Promise<string> => {\n const refreshedTokens = await refreshAccessToken(refreshToken);\n updateTokenData(data, refreshedTokens);\n return refreshedTokens.accessToken;\n};\n\nconst getNewTokens = async (\n data: Partial<CjData>,\n email: string,\n apiToken: string\n): Promise<string> => {\n const newTokens = await getAccessToken(email, apiToken);\n updateTokenData(data, newTokens);\n return newTokens.accessToken;\n};\n\nexport const retrieveAccessToken = async (\n data: Partial<CjData>\n): Promise<string> => {\n const apiToken = data.apiToken || process.env.CJ_API_TOKEN;\n const email = data.emailAddress || process.env.CJ_EMAIL_ADDRESS;\n\n validateCredentials(apiToken, email);\n\n const { accessToken, accessTokenExpiry, refreshToken, refreshTokenExpiry } =\n data;\n\n // Check if current access token is valid\n if (\n accessToken &&\n accessTokenExpiry &&\n !(await isTokenExpiring(accessTokenExpiry))\n ) {\n return accessToken;\n }\n\n // Try refresh token if available\n if (\n refreshToken &&\n refreshTokenExpiry &&\n !(await isTokenExpiring(refreshTokenExpiry))\n ) {\n return handleRefreshToken(data, refreshToken);\n }\n\n // Get new tokens if everything is expired or missing\n return getNewTokens(data, email!, apiToken!);\n};\n"],"names":["getAccessToken","refreshAccessToken","ONE_HOUR_MS","ONE_DAY_MS","TOKEN_EXPIRY","ACCESS","REFRESH","isTokenExpiring","expiryDate","now","Date","oneHourFromNow","getTime","expiryDateTime","updateTokenData","data","tokenResponse","accessToken","refreshToken","accessTokenExpiry","refreshTokenExpiry","validateCredentials","apiToken","email","Error","handleRefreshToken","refreshedTokens","getNewTokens","newTokens","retrieveAccessToken","process","env","CJ_API_TOKEN","emailAddress","CJ_EMAIL_ADDRESS"],"mappings":"AACA,SAASA,cAAc,EAAEC,kBAAkB,QAAQ,cAAc;AAOjE,MAAMC,cAAc,KAAK,KAAK;AAC9B,MAAMC,aAAa,KAAKD;AACxB,MAAME,eAAe;IACjBC,QAAQ,KAAKF;IACbG,SAAS,MAAMH;AACnB;AAEA,MAAMI,kBAAkB,OAAOC;IAC3B,MAAMC,MAAM,IAAIC;IAChB,MAAMC,iBAAiB,IAAID,KAAKD,IAAIG,OAAO,KAAKV;IAChD,MAAMW,iBAAiB,IAAIH,KAAKF;IAChC,OAAOK,eAAeD,OAAO,KAAKD,eAAeC,OAAO;AAC5D;AAEA,MAAME,kBAAkB,CACpBC,MACAC;IAEA,MAAMP,MAAM,IAAIC,OAAOE,OAAO;IAE9BG,KAAKE,WAAW,GAAGD,cAAcC,WAAW;IAC5CF,KAAKG,YAAY,GAAGF,cAAcE,YAAY;IAC9CH,KAAKI,iBAAiB,GAAG,IAAIT,KAAKD,MAAML,aAAaC,MAAM;IAC3DU,KAAKK,kBAAkB,GAAG,IAAIV,KAAKD,MAAML,aAAaE,OAAO;AACjE;AAEA,MAAMe,sBAAsB,CACxBC,UACAC;IAEA,IAAI,CAACD,YAAY,CAACC,OAAO;QACrB,MAAM,IAAIC,MAAM;IACpB;AACJ;AAEA,MAAMC,qBAAqB,OACvBV,MACAG;IAEA,MAAMQ,kBAAkB,MAAMzB,mBAAmBiB;IACjDJ,gBAAgBC,MAAMW;IACtB,OAAOA,gBAAgBT,WAAW;AACtC;AAEA,MAAMU,eAAe,OACjBZ,MACAQ,OACAD;IAEA,MAAMM,YAAY,MAAM5B,eAAeuB,OAAOD;IAC9CR,gBAAgBC,MAAMa;IACtB,OAAOA,UAAUX,WAAW;AAChC;AAEA,OAAO,MAAMY,sBAAsB,OAC/Bd;IAEA,MAAMO,WAAWP,KAAKO,QAAQ,IAAIQ,QAAQC,GAAG,CAACC,YAAY;IAC1D,MAAMT,QAAQR,KAAKkB,YAAY,IAAIH,QAAQC,GAAG,CAACG,gBAAgB;IAE/Db,oBAAoBC,UAAUC;IAE9B,MAAM,EAAEN,WAAW,EAAEE,iBAAiB,EAAED,YAAY,EAAEE,kBAAkB,EAAE,GACtEL;IAEJ,yCAAyC;IACzC,IACIE,eACAE,qBACA,CAAE,MAAMZ,gBAAgBY,oBAC1B;QACE,OAAOF;IACX;IAEA,iCAAiC;IACjC,IACIC,gBACAE,sBACA,CAAE,MAAMb,gBAAgBa,qBAC1B;QACE,OAAOK,mBAAmBV,MAAMG;IACpC;IAEA,qDAAqD;IACrD,OAAOS,aAAaZ,MAAMQ,OAAQD;AACtC,EAAE"}
@@ -1,4 +1,4 @@
1
- import * as cjSdk from "../sdk/cj-sdk";
1
+ import { cjSdk } from "../sdk/cj-sdk";
2
2
  export const createOrderHook = async ({ doc, req })=>{
3
3
  if (doc.orderStatus !== "processing") {
4
4
  return;
@@ -23,7 +23,10 @@ export const createOrderHook = async ({ doc, req })=>{
23
23
  layer: []
24
24
  }
25
25
  ] : [];
26
- const result = await cjSdk.createOrder({
26
+ const sdk = cjSdk({
27
+ accessToken: cjConfig?.accessToken
28
+ });
29
+ const result = await sdk.orders.createOrder({
27
30
  consigneeID: doc.billingAddress?.name || "",
28
31
  email: doc.billingAddress?.email || "",
29
32
  fromCountryCode: "CN",
@@ -1 +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 = await payload.find({\n collection: \"cj-settings\",\n where: {\n shop: {\n equals: doc.shopId,\n },\n },\n });\n const cjConfig: any = cjSettings?.docs[0];\n const podProperties = cjConfig?.pod?.url\n ? [\n {\n areaName: \"LogoArea\",\n links: [cjConfig?.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","find","collection","where","shop","equals","shopId","cjConfig","docs","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","data","id","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,aAAa,MAAMD,QAAQE,IAAI,CAAC;QAClCC,YAAY;QACZC,OAAO;YACHC,MAAM;gBACFC,QAAQT,IAAIU,MAAM;YACtB;QACJ;IACJ;IACA,MAAMC,WAAgBP,YAAYQ,IAAI,CAAC,EAAE;IACzC,MAAMC,gBAAgBF,UAAUG,KAAKC,MAC/B;QACI;YACIC,UAAU;YACVC,OAAO;gBAACN,UAAUG,KAAKC;aAAI;YAC3BG,MAAM;YACNC,OAAO,EAAE;QACb;KACH,GACD,EAAE;IACR,MAAMC,SAAS,MAAMtB,MAAMuB,WAAW,CAAC;QACnCC,aAAatB,IAAIuB,cAAc,EAAEC,QAAQ;QACzCC,OAAOzB,IAAIuB,cAAc,EAAEE,SAAS;QACpCC,iBAAiB;QACjBC,aAAa3B,IAAI4B,eAAe,EAAEC,SAASC,SAAS;QACpDC,UAAU;QACVC,cAAc;QACdC,aAAajC,IAAIkC,OAAO;QACxBC,SAAS;QACTC,UAAUpC,IAAIqC,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,iBAAiB5B,IAAI4B,eAAe,EAAEC,SAASgB,SAAS;QACxDC,kBAAkB9C,IAAI4B,eAAe,EAAEC,SAASC,SAAS;QACzDiB,cAAc/C,IAAI4B,eAAe,EAAEC,SAASmB,QAAQ;QACpDC,iBAAiBjD,IAAI4B,eAAe,EAAEC,SAASqB,WAAW;QAC1DC,qBAAqBnD,IAAI4B,eAAe,EAAEC,SAASqB,WAAW;QAC9DE,gBAAgBpD,IAAI4B,eAAe,EAAEC,SAASmB,QAAQ;QACtDK,sBAAsBrD,IAAI4B,eAAe,EAAEJ,QAAQ;QACnD8B,eAAetD,IAAI4B,eAAe,EAAE2B,SAAS;QAC7CC,kBAAkBxD,IAAI4B,eAAe,EAAEC,SAAS4B,SAAS;QACzDC,aAAa1D,IAAI4B,eAAe,EAAEC,SAAS8B,eAAe;QAC1DC,OAAO;IACX;IAEA,MAAMC,cAAc,MAAM1D,QAAQ2D,MAAM,CAAC;QACrCxD,YAAY;QACZyD,MAAM;YACF7D,aAAa;QACjB;QACAK,OAAO;YACHyD,IAAI;gBACAvD,QAAQT,IAAIkC,OAAO;YACvB;QACJ;IACJ;IAEA,OAAO;QACH+B,UAAU7C;QACVyC;IACJ;AACJ,EAAE"}
1
+ {"version":3,"sources":["../../src/service/create-order.hook.ts"],"sourcesContent":["import type { BasePayload, CollectionAfterChangeHook, Document } from \"payload\";\nimport { 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 ({\n doc,\n req,\n}) => {\n if (doc.orderStatus !== \"processing\") {\n return;\n }\n const payload: BasePayload = req.payload;\n const cjSettings = await payload.find({\n collection: \"cj-settings\" as any,\n where: {\n shop: {\n equals: doc.shopId,\n },\n },\n });\n const cjConfig: any = cjSettings?.docs[0];\n const podProperties = cjConfig?.pod?.url\n ? [\n {\n areaName: \"LogoArea\",\n links: [cjConfig?.pod?.url],\n type: \"1\",\n layer: [],\n },\n ]\n : [];\n const sdk = cjSdk({ accessToken: cjConfig?.accessToken });\n const result = await sdk.orders.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\" as any,\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","find","collection","where","shop","equals","shopId","cjConfig","docs","podProperties","pod","url","areaName","links","type","layer","sdk","accessToken","result","orders","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","data","id","cjResult"],"mappings":"AACA,SAASA,KAAK,QAAQ,gBAAgB;AAatC,OAAO,MAAMC,kBAAqD,OAAO,EACrEC,GAAG,EACHC,GAAG,EACN;IACG,IAAID,IAAIE,WAAW,KAAK,cAAc;QAClC;IACJ;IACA,MAAMC,UAAuBF,IAAIE,OAAO;IACxC,MAAMC,aAAa,MAAMD,QAAQE,IAAI,CAAC;QAClCC,YAAY;QACZC,OAAO;YACHC,MAAM;gBACFC,QAAQT,IAAIU,MAAM;YACtB;QACJ;IACJ;IACA,MAAMC,WAAgBP,YAAYQ,IAAI,CAAC,EAAE;IACzC,MAAMC,gBAAgBF,UAAUG,KAAKC,MAC/B;QACI;YACIC,UAAU;YACVC,OAAO;gBAACN,UAAUG,KAAKC;aAAI;YAC3BG,MAAM;YACNC,OAAO,EAAE;QACb;KACH,GACD,EAAE;IACR,MAAMC,MAAMtB,MAAM;QAAEuB,aAAaV,UAAUU;IAAY;IACvD,MAAMC,SAAS,MAAMF,IAAIG,MAAM,CAACC,WAAW,CAAC;QACxCC,aAAazB,IAAI0B,cAAc,EAAEC,QAAQ;QACzCC,OAAO5B,IAAI0B,cAAc,EAAEE,SAAS;QACpCC,iBAAiB;QACjBC,aAAa9B,IAAI+B,eAAe,EAAEC,SAASC,SAAS;QACpDC,UAAU;QACVC,cAAc;QACdC,aAAapC,IAAIqC,OAAO;QACxBC,SAAS;QACTC,UAAUvC,IAAIwC,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,CAAA;gBAC/BC,UAAUD,KAAKC,QAAQ;gBACvBC,KAAKF,KAAKG,OAAO,CAACC,SAAS;YAC/B,CAAA;QACAjC;QACAkC,QAAQ;QACRhB,iBAAiB/B,IAAI+B,eAAe,EAAEC,SAASgB,SAAS;QACxDC,kBAAkBjD,IAAI+B,eAAe,EAAEC,SAASC,SAAS;QACzDiB,cAAclD,IAAI+B,eAAe,EAAEC,SAASmB,QAAQ;QACpDC,iBAAiBpD,IAAI+B,eAAe,EAAEC,SAASqB,WAAW;QAC1DC,qBAAqBtD,IAAI+B,eAAe,EAAEC,SAASqB,WAAW;QAC9DE,gBAAgBvD,IAAI+B,eAAe,EAAEC,SAASmB,QAAQ;QACtDK,sBAAsBxD,IAAI+B,eAAe,EAAEJ,QAAQ;QACnD8B,eAAezD,IAAI+B,eAAe,EAAE2B,SAAS;QAC7CC,kBAAkB3D,IAAI+B,eAAe,EAAEC,SAAS4B,SAAS;QACzDC,aAAa7D,IAAI+B,eAAe,EAAEC,SAAS8B,eAAe;QAC1DC,OAAO;IACX;IAEA,MAAMC,cAAc,MAAM7D,QAAQ8D,MAAM,CAAC;QACrC3D,YAAY;QACZ4D,MAAM;YACFhE,aAAa;QACjB;QACAK,OAAO;YACH4D,IAAI;gBACA1D,QAAQT,IAAIqC,OAAO;YACvB;QACJ;IACJ;IAEA,OAAO;QACH+B,UAAU9C;QACV0C;IACJ;AACJ,EAAE"}
@@ -1,4 +1,9 @@
1
1
  import type { BasePayload } from "payload";
2
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, shopId?: string) => Promise<ProductDetails[]>;
3
+ import { CjData } from "../CjCollection";
4
+ export declare const syncProducts: ({ productIds, payload, shopId, data, }: {
5
+ productIds: string[];
6
+ payload: BasePayload;
7
+ shopId?: number;
8
+ data: Partial<CjData>;
9
+ }) => Promise<ProductDetails[]>;
@@ -1,108 +1,108 @@
1
1
  import { convertHTMLToLexical, editorConfigFactory } from "@payloadcms/richtext-lexical";
2
2
  import decimal from "decimal.js";
3
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);
4
+ import { cjSdk } from "../sdk/cj-sdk";
5
+ import { retrieveAccessToken } from "./access-token";
14
6
  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}`);
7
+ const upsertImage = async ({ payload, imageUrl, filename, alt, shopId })=>{
8
+ const whereClause = {
9
+ filename: {
10
+ equals: filename
20
11
  }
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);
12
+ };
13
+ if (shopId !== undefined) {
14
+ whereClause.shop = {
15
+ equals: shopId
16
+ };
30
17
  }
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({
18
+ const imageData = await payload.find({
19
+ collection: "media",
20
+ where: whereClause,
21
+ limit: 1
22
+ });
23
+ if (imageData.totalDocs === 0) {
24
+ return payload.create({
42
25
  collection: "media",
43
26
  data: {
44
- alt: "Some alt text"
45
- },
46
- filePath: tempFilePath
27
+ alt,
28
+ filename,
29
+ thumbnailURL: imageUrl,
30
+ url: imageUrl,
31
+ shop: shopId
32
+ }
33
+ });
34
+ }
35
+ return imageData.docs[0];
36
+ };
37
+ async function mapMockProductToSchema({ product, payload, shopId, sdk }) {
38
+ const variants = [];
39
+ for (const variant of product.variants || []){
40
+ const filename = `${shopId}-${variant?.variantImage?.split("/").pop()}`;
41
+ if (!filename || !variant.variantImage) {
42
+ continue;
43
+ }
44
+ const alt = filename.split(".")[0];
45
+ const imageUrl = variant.variantImage;
46
+ const imageData = await upsertImage({
47
+ payload,
48
+ imageUrl,
49
+ filename,
50
+ alt,
51
+ shopId
47
52
  });
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);
53
+ const imageId = imageData.id;
54
+ const data = await sdk.products.getProductStockByVid({
55
+ vid: variant.vid
56
+ });
57
+ if (!data.data) {
58
+ throw new Error("Failed to fetch stock information");
59
+ }
60
+ const cjInventoryNum = data.data.reduce((sum, item)=>sum + (item?.cjInventoryNum || 0), 0);
61
+ variants.push({
62
+ gallery: [
63
+ imageId
64
+ ],
65
+ options: variant.variantKey?.split("-").map((key, index)=>({
66
+ option: index === 0 ? "Color" : "Size",
67
+ value: key
68
+ })),
69
+ price: Number(new decimal(variant.variantSellPrice || 0).toNumber().toFixed(2)),
70
+ vid: variant.vid,
71
+ stockCount: cjInventoryNum
52
72
  });
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
73
  }
72
- }
73
- function mapMockProductToSchema(product, editorConfig, rate, payload) {
74
+ const cleanHtml = product.description?.replace(/<img[^>]*>/g, "");
74
75
  return {
75
76
  description: convertHTMLToLexical({
76
- editorConfig,
77
- html: product.description || "",
77
+ editorConfig: await editorConfigFactory.default({
78
+ config: payload.config
79
+ }),
80
+ html: cleanHtml || "<p></p>",
78
81
  JSDOM
79
82
  }),
80
83
  source: "cj",
81
84
  pid: product.pid,
82
85
  title: product.productNameEn,
83
- variants: product.variants?.map((variant)=>({
84
- imageUrl: variant.variantImage,
85
- options: variant.variantKey?.split("-").map((key, index)=>({
86
- option: index === 0 ? "Color" : "Size",
87
- value: key
88
- })),
89
- price: new decimal(variant.variantSellPrice || 0).mul(rate).toNumber().toFixed(2),
90
- vid: variant.vid
91
- }))
86
+ variants
92
87
  };
93
88
  }
94
- const findProductById = async (productId)=>{
95
- const result = await cjSdk.getProductDetails({
89
+ const findProductById = async (productId, sdk)=>{
90
+ const result = await sdk.products.getProductDetails({
96
91
  pid: productId
97
92
  });
98
93
  return result.data;
99
94
  };
100
- const createOrUpdateProduct = async (product, payload, shopId)=>{
95
+ const createOrUpdateProduct = async ({ product, payload, shopId })=>{
101
96
  const { totalDocs } = await payload.count({
102
97
  collection: "products",
103
98
  where: {
104
99
  pid: {
105
100
  equals: product.pid
101
+ },
102
+ ...shopId && {
103
+ shop: {
104
+ equals: shopId
105
+ }
106
106
  }
107
107
  }
108
108
  });
@@ -116,34 +116,33 @@ const createOrUpdateProduct = async (product, payload, shopId)=>{
116
116
  });
117
117
  }
118
118
  };
119
- export const fetchExchangeRates = async ()=>{
120
- const response = await fetch("https://open.er-api.com/v6/latest/USD");
121
- const data = await response.json();
122
- return data;
123
- };
124
- export const syncProducts = async (productIds, payload, shopId)=>{
125
- const exchangeRates = await fetchExchangeRates();
126
- const storeSettings = await payload.findGlobal({
127
- slug: "store-settings"
128
- });
129
- const rate = exchangeRates.rates[storeSettings.currency || "USD"];
130
- const editorConfig = await editorConfigFactory.default({
131
- config: payload.config
119
+ export const syncProducts = async ({ productIds, payload, shopId, data })=>{
120
+ const accessToken = await retrieveAccessToken(data);
121
+ const sdk = cjSdk({
122
+ accessToken
132
123
  });
133
- const products = [];
124
+ const fetchedProducts = [];
134
125
  for (const productId of productIds){
135
- const product = await findProductById(productId);
136
- if (!product) {
137
- continue;
126
+ const product = await findProductById(productId, sdk);
127
+ if (product) {
128
+ fetchedProducts.push(product);
138
129
  }
139
- products.push(product);
140
- await delay(1010);
130
+ await delay(1010); // throttle CJ API requests
141
131
  }
142
- const mappedProducts = products.map((product)=>{
143
- return mapMockProductToSchema(product, editorConfig, rate, payload);
144
- });
145
- await Promise.all(mappedProducts.map((product)=>createOrUpdateProduct(product, payload, shopId)));
146
- return products;
132
+ // Wait for all async mapping to resolve
133
+ const mappedProducts = await Promise.all(fetchedProducts.map((product)=>mapMockProductToSchema({
134
+ product,
135
+ payload,
136
+ shopId,
137
+ sdk
138
+ })));
139
+ // Create or update each mapped product
140
+ await Promise.all(mappedProducts.map((product)=>createOrUpdateProduct({
141
+ product,
142
+ payload,
143
+ shopId
144
+ })));
145
+ return fetchedProducts;
147
146
  };
148
147
 
149
148
  //# sourceMappingURL=sync-products.js.map