@shopnex/cj-plugin 1.0.1 → 1.0.3
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/README.md +110 -0
- package/dist/CjConfig.d.ts +7 -0
- package/dist/CjConfig.js +93 -0
- package/dist/CjConfig.js.map +1 -0
- 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 +90 -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/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.js +3 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/rsc/ApiToken.d.ts +9 -0
- package/dist/rsc/ApiToken.js +21 -0
- package/dist/rsc/ApiToken.js.map +1 -0
- package/dist/rsc/ApiToken.scss +5 -0
- package/dist/sdk/access-token.d.ts +9 -0
- package/dist/sdk/access-token.js +24 -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 +70 -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 +148 -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/dist/util/manage-tokens.d.ts +4 -0
- package/dist/util/manage-tokens.js +41 -0
- package/dist/util/manage-tokens.js.map +1 -0
- package/package.json +1 -1
@@ -0,0 +1,70 @@
|
|
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.find({
|
8
|
+
collection: "cj-settings",
|
9
|
+
where: {
|
10
|
+
shop: {
|
11
|
+
equals: doc.shopId
|
12
|
+
}
|
13
|
+
}
|
14
|
+
});
|
15
|
+
const cjConfig = cjSettings?.docs[0];
|
16
|
+
const podProperties = cjConfig?.pod?.url ? [
|
17
|
+
{
|
18
|
+
areaName: "LogoArea",
|
19
|
+
links: [
|
20
|
+
cjConfig?.pod?.url
|
21
|
+
],
|
22
|
+
type: "1",
|
23
|
+
layer: []
|
24
|
+
}
|
25
|
+
] : [];
|
26
|
+
const result = await cjSdk.createOrder({
|
27
|
+
consigneeID: doc.billingAddress?.name || "",
|
28
|
+
email: doc.billingAddress?.email || "",
|
29
|
+
fromCountryCode: "CN",
|
30
|
+
houseNumber: doc.shippingAddress?.address?.line2 || "",
|
31
|
+
iossType: 1,
|
32
|
+
logisticName: "CJPacket Liquid US",
|
33
|
+
orderNumber: doc.orderId,
|
34
|
+
payType: 2,
|
35
|
+
products: doc.items.map((item)=>({
|
36
|
+
quantity: item.quantity,
|
37
|
+
vid: item.variant.variantId
|
38
|
+
})),
|
39
|
+
podProperties,
|
40
|
+
remark: "",
|
41
|
+
shippingAddress: doc.shippingAddress?.address?.line1 || "",
|
42
|
+
shippingAddress2: doc.shippingAddress?.address?.line2 || "",
|
43
|
+
shippingCity: doc.shippingAddress?.address?.city || "",
|
44
|
+
shippingCountry: doc.shippingAddress?.address?.country || "",
|
45
|
+
shippingCountryCode: doc.shippingAddress?.address?.country || "",
|
46
|
+
shippingCounty: doc.shippingAddress?.address?.city || "",
|
47
|
+
shippingCustomerName: doc.shippingAddress?.name || "",
|
48
|
+
shippingPhone: doc.shippingAddress?.phone || "+9999999999",
|
49
|
+
shippingProvince: doc.shippingAddress?.address?.state || "",
|
50
|
+
shippingZip: doc.shippingAddress?.address?.postal_code || "",
|
51
|
+
taxId: ""
|
52
|
+
});
|
53
|
+
const orderResult = await payload.update({
|
54
|
+
collection: "orders",
|
55
|
+
data: {
|
56
|
+
orderStatus: "shipped"
|
57
|
+
},
|
58
|
+
where: {
|
59
|
+
id: {
|
60
|
+
equals: doc.orderId
|
61
|
+
}
|
62
|
+
}
|
63
|
+
});
|
64
|
+
return {
|
65
|
+
cjResult: result,
|
66
|
+
orderResult
|
67
|
+
};
|
68
|
+
};
|
69
|
+
|
70
|
+
//# 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 = 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"}
|
@@ -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,148 @@
|
|
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
|
+
source: "cj",
|
81
|
+
pid: product.pid,
|
82
|
+
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
|
+
}))
|
92
|
+
};
|
93
|
+
}
|
94
|
+
const findProductById = async (productId)=>{
|
95
|
+
const result = await cjSdk.getProductDetails({
|
96
|
+
pid: productId
|
97
|
+
});
|
98
|
+
return result.data;
|
99
|
+
};
|
100
|
+
const createOrUpdateProduct = async (product, payload)=>{
|
101
|
+
const { totalDocs } = await payload.count({
|
102
|
+
collection: "products",
|
103
|
+
where: {
|
104
|
+
pid: {
|
105
|
+
equals: product.pid
|
106
|
+
}
|
107
|
+
}
|
108
|
+
});
|
109
|
+
if (totalDocs === 0) {
|
110
|
+
return payload.create({
|
111
|
+
collection: "products",
|
112
|
+
data: {
|
113
|
+
...product
|
114
|
+
}
|
115
|
+
});
|
116
|
+
}
|
117
|
+
};
|
118
|
+
export const fetchExchangeRates = async ()=>{
|
119
|
+
const response = await fetch("https://open.er-api.com/v6/latest/USD");
|
120
|
+
const data = await response.json();
|
121
|
+
return data;
|
122
|
+
};
|
123
|
+
export const syncProducts = async (productIds, payload)=>{
|
124
|
+
const exchangeRates = await fetchExchangeRates();
|
125
|
+
const storeSettings = await payload.findGlobal({
|
126
|
+
slug: "store-settings"
|
127
|
+
});
|
128
|
+
const rate = exchangeRates.rates[storeSettings.currency || "USD"];
|
129
|
+
const editorConfig = await editorConfigFactory.default({
|
130
|
+
config: payload.config
|
131
|
+
});
|
132
|
+
const products = [];
|
133
|
+
for (const productId of productIds){
|
134
|
+
const product = await findProductById(productId);
|
135
|
+
if (!product) {
|
136
|
+
continue;
|
137
|
+
}
|
138
|
+
products.push(product);
|
139
|
+
await delay(1010);
|
140
|
+
}
|
141
|
+
const mappedProducts = products.map((product)=>{
|
142
|
+
return mapMockProductToSchema(product, editorConfig, rate, payload);
|
143
|
+
});
|
144
|
+
await Promise.all(mappedProducts.map((product)=>createOrUpdateProduct(product, payload)));
|
145
|
+
return products;
|
146
|
+
};
|
147
|
+
|
148
|
+
//# 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 source: \"manual\" | \"cj\";\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\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 source: \"cj\",\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","source","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":"AAGA,SAASA,oBAAoB,EAAEC,mBAAmB,QAAQ,+BAA+B;AACzF,OAAOC,aAAa,aAAa;AACjC,SAASC,KAAK,QAAQ,QAAQ;AAI9B,YAAYC,WAAW,gBAAgB;AACvC,OAAOC,QAAQC,OAAO,QAAc,OAAO;AAC3C,OAAOC,QAAQ,KAAK;AACpB,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,QAAQ,QAAQ,SAAS;AAClC,SAASC,SAAS,QAAQ,cAAc;AACxC,SAASC,aAAa,QAAQ,MAAM;AAEpC,MAAMC,aAAaD,cAAc,YAAYE,GAAG;AAChD,MAAMC,YAAYR,QAAQM;AAE1B,MAAMG,iBAAiBP,UAAUC;AAejC,MAAMO,QAAQ,CAACC,KAAe,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AAE3E,MAAMI,WAAW,OAAOC,KAAaC;IACjC,IAAI;QACA,MAAMC,WAAW,MAAMC,MAAMH;QAE7B,IAAI,CAACE,SAASE,EAAE,EAAE;YACd,MAAM,IAAIC,MAAM,CAAC,gBAAgB,EAAEL,IAAI,EAAE,EAAEE,SAASI,UAAU,EAAE;QACpE;QAEA,MAAMC,cAAcL,SAASM,OAAO,CAACC,GAAG,CAAC;QACzC,MAAMC,gBAAgBR,SAASM,OAAO,CAACC,GAAG,CAAC;QAE3CE,QAAQC,GAAG,CAAC,iBAAiBL;QAC7BI,QAAQC,GAAG,CAAC,mBAAmBF;QAE/B,MAAMG,SAASC,OAAOC,IAAI,CAAC,MAAMb,SAASc,WAAW;QAErD,MAAM5B,UAAUa,UAAUY;QAE1BF,QAAQC,GAAG,CAAC,sBAAsBX;IACtC,EAAE,OAAOgB,OAAO;QACZN,QAAQM,KAAK,CAAC,2BAA2BA;IAC7C;AACJ;AAEA,eAAeC,qBAAqBC,GAAW,EAAEC,OAAoB;IACjE,MAAMC,eAAetC,KAAKuC,IAAI,CAAC9B,WAAW;IAE1C,IAAI;QACA,kBAAkB;QAClB,MAAMU,WAAW,MAAMC,MAAMgB;QAC7B,IAAI,CAACjB,SAASE,EAAE,EAAE,MAAM,IAAIC,MAAM,CAAC,uBAAuB,EAAEH,SAASI,UAAU,EAAE;QAEjF,+CAA+C;QAC/C,MAAMP,SAASoB,KAAKE;QAEpB,6CAA6C;QAC7C,MAAME,gBAAgB,MAAMH,QAAQI,MAAM,CAAC;YACvCC,YAAY;YACZC,MAAM;gBACFC,KAAK;YACT;YAEAC,UAAUP;QACd;QAEAV,QAAQC,GAAG,CAAC,4BAA4BW;QAExC,sCAAsC;QACtCtC,GAAG4C,MAAM,CAACR,cAAc,CAACS;YACrB,IAAIA,KAAKnB,QAAQM,KAAK,CAAC,kCAAkCa;QAC7D;QAEA,OAAO;YACHC,IAAIR,cAAcQ,EAAE;YACpBJ,KAAKJ,cAAcI,GAAG,IAAI;YAC1BK,QAAQ;YACRC,WAAWV,cAAcU,SAAS;YAClCC,WAAWX,cAAcW,SAAS;YAClC3C,KAAKgC,cAAchC,GAAG;YACtB4C,cAAcZ,cAAcY,YAAY,IAAI;YAC5ClC,UAAUsB,cAActB,QAAQ;YAChCmC,UAAUb,cAAca,QAAQ;YAChCC,UAAUd,cAAcc,QAAQ;YAChCC,OAAOf,cAAce,KAAK;YAC1BC,QAAQhB,cAAcgB,MAAM;YAC5BC,QAAQ;YACRC,QAAQ;QACZ;IACJ,EAAE,OAAOxB,OAAO;QACZN,QAAQM,KAAK,CAAC,0BAA0BA;IAC5C;AACJ;AACA,SAASyB,uBACLC,OAAuB,EACvBC,YAAiB,EACjBC,IAAY,EACZzB,OAAoB;IAEpB,OAAO;QACH0B,aAAapE,qBAAqB;YAC9BkE;YACAG,MAAMJ,QAAQG,WAAW,IAAI;YAC7BjE;QAIJ;QACAmE,QAAQ;QACRC,KAAKN,QAAQM,GAAG;QAChBC,OAAOP,QAAQQ,aAAa;QAC5BC,UAAUT,QAAQS,QAAQ,EAAEC,IAAI,CAACC,UAAa,CAAA;gBAC1CC,UAAUD,QAAQE,YAAY;gBAC9BC,SAASH,QAAQI,UAAU,EAAEC,MAAM,KAAKN,IAAI,CAACO,KAAKC,QAAW,CAAA;wBACzDC,QAAQD,UAAU,IAAI,UAAU;wBAChCE,OAAOH;oBACX,CAAA;gBACAI,OAAO,IAAIpF,QAAQ0E,QAAQW,gBAAgB,IAAI,GAAGC,GAAG,CAACrB,MAAMsB,QAAQ,GAAGC,OAAO,CAAC;gBAC/EC,KAAKf,QAAQe,GAAG;YACpB,CAAA;IACJ;AACJ;AAEA,MAAMC,kBAAkB,OAAOC;IAC3B,MAAMC,SAAS,MAAM1F,MAAM2F,iBAAiB,CAAC;QACzCxB,KAAKsB;IACT;IACA,OAAOC,OAAO9C,IAAI;AACtB;AAEA,MAAMgD,wBAAwB,OAC1B/B,SACAvB;IAEA,MAAM,EAAEuD,SAAS,EAAE,GAAG,MAAMvD,QAAQwD,KAAK,CAAC;QACtCnD,YAAY;QACZoD,OAAO;YACH5B,KAAK;gBACD6B,QAAQnC,QAAQM,GAAG;YACvB;QACJ;IACJ;IAEA,IAAI0B,cAAc,GAAG;QACjB,OAAOvD,QAAQI,MAAM,CAAC;YAClBC,YAAY;YACZC,MAAM;gBAAE,GAAGiB,OAAO;YAAC;QACvB;IACJ;AACJ;AAEA,OAAO,MAAMoC,qBAAqB;IAC9B,MAAM7E,WAAW,MAAMC,MAAM;IAC7B,MAAMuB,OAAO,MAAMxB,SAAS8E,IAAI;IAEhC,OAAOtD;AACX,EAAE;AAEF,OAAO,MAAMuD,eAAe,OAAOC,YAAsB9D;IACrD,MAAM+D,gBAAgB,MAAMJ;IAC5B,MAAMK,gBAAgB,MAAMhE,QAAQiE,UAAU,CAAC;QAC3CC,MAAM;IACV;IACA,MAAMzC,OAAOsC,cAAcI,KAAK,CAACH,cAAcI,QAAQ,IAAI,MAAM;IAEjE,MAAM5C,eAAe,MAAMjE,oBAAoB8G,OAAO,CAAC;QACnDC,QAAQtE,QAAQsE,MAAM;IAC1B;IACA,MAAMC,WAA6B,EAAE;IACrC,KAAK,MAAMpB,aAAaW,WAAY;QAChC,MAAMvC,UAAU,MAAM2B,gBAAgBC;QACtC,IAAI,CAAC5B,SAAS;YACV;QACJ;QACAgD,SAASC,IAAI,CAACjD;QACd,MAAMjD,MAAM;IAChB;IACA,MAAMmG,iBAAiBF,SAAStC,GAAG,CAAC,CAACV;QACjC,OAAOD,uBAAuBC,SAASC,cAAcC,MAAMzB;IAC/D;IAEA,MAAMxB,QAAQkG,GAAG,CACbD,eAAexC,GAAG,CAAC,CAACV,UAAY+B,sBAAsB/B,SAAgBvB;IAG1E,OAAOuE;AACX,EAAE"}
|
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":["export 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\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"],"names":[],"mappings":"AA2CA,WAiCC"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
2
|
+
import { Button, Modal } from '@payloadcms/ui';
|
3
|
+
import React from 'react';
|
4
|
+
const RefundButton = ({ data, payload })=>{
|
5
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
6
|
+
children: [
|
7
|
+
/*#__PURE__*/ _jsx(Modal, {
|
8
|
+
slug: "refundModal",
|
9
|
+
title: "Refund",
|
10
|
+
children: /*#__PURE__*/ _jsx("h1", {
|
11
|
+
children: "Refund"
|
12
|
+
})
|
13
|
+
}),
|
14
|
+
/*#__PURE__*/ _jsx(Button, {
|
15
|
+
buttonStyle: "secondary",
|
16
|
+
size: "small",
|
17
|
+
children: "Refund"
|
18
|
+
})
|
19
|
+
]
|
20
|
+
});
|
21
|
+
};
|
22
|
+
export default RefundButton;
|
23
|
+
|
24
|
+
//# sourceMappingURL=refund-button.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/ui/refund-button.tsx"],"sourcesContent":["import type { FieldServerComponent } from 'payload'\n\nimport { Button, Modal } from '@payloadcms/ui'\nimport React from 'react'\n\nconst RefundButton: FieldServerComponent = ({ data, payload }) => {\n return (\n <>\n <Modal slug=\"refundModal\" title=\"Refund\">\n <h1>Refund</h1>\n </Modal>\n <Button buttonStyle=\"secondary\" size=\"small\">\n Refund\n </Button>\n </>\n )\n}\n\nexport default RefundButton\n"],"names":["Button","Modal","React","RefundButton","data","payload","slug","title","h1","buttonStyle","size"],"mappings":";AAEA,SAASA,MAAM,EAAEC,KAAK,QAAQ,iBAAgB;AAC9C,OAAOC,WAAW,QAAO;AAEzB,MAAMC,eAAqC,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAE;IAC3D,qBACE;;0BACE,KAACJ;gBAAMK,MAAK;gBAAcC,OAAM;0BAC9B,cAAA,KAACC;8BAAG;;;0BAEN,KAACR;gBAAOS,aAAY;gBAAYC,MAAK;0BAAQ;;;;AAKnD;AAEA,eAAeP,aAAY"}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import crypto from "crypto";
|
2
|
+
const getKey = (rawKey)=>{
|
3
|
+
return crypto.createHash("sha256").update(rawKey).digest();
|
4
|
+
};
|
5
|
+
const getTenantSecret = (tenantId)=>{
|
6
|
+
const key = tenantId;
|
7
|
+
if (!key) throw new Error(`Missing secret for tenant: ${tenantId}`);
|
8
|
+
return Buffer.from(key, "hex");
|
9
|
+
};
|
10
|
+
export const encryptToken = (token)=>{
|
11
|
+
const key = getKey(process.env.ENCRYPTION_KEY);
|
12
|
+
const iv = crypto.randomBytes(12);
|
13
|
+
const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
|
14
|
+
const encrypted = Buffer.concat([
|
15
|
+
cipher.update(token, "utf8"),
|
16
|
+
cipher.final()
|
17
|
+
]);
|
18
|
+
const tag = cipher.getAuthTag();
|
19
|
+
const result = {
|
20
|
+
iv: iv.toString("hex"),
|
21
|
+
tag: tag.toString("hex"),
|
22
|
+
content: encrypted.toString("hex")
|
23
|
+
};
|
24
|
+
return Buffer.from(JSON.stringify(result)).toString("base64");
|
25
|
+
};
|
26
|
+
export const decryptToken = (encryptedToken)=>{
|
27
|
+
const key = getKey(process.env.ENCRYPTION_KEY);
|
28
|
+
const decoded = JSON.parse(Buffer.from(encryptedToken, "base64").toString("utf8"));
|
29
|
+
const iv = Buffer.from(decoded.iv, "hex");
|
30
|
+
const tag = Buffer.from(decoded.tag, "hex");
|
31
|
+
const content = Buffer.from(decoded.content, "hex");
|
32
|
+
const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
|
33
|
+
decipher.setAuthTag(tag);
|
34
|
+
const decrypted = Buffer.concat([
|
35
|
+
decipher.update(content),
|
36
|
+
decipher.final()
|
37
|
+
]);
|
38
|
+
return decrypted.toString("utf8");
|
39
|
+
};
|
40
|
+
|
41
|
+
//# sourceMappingURL=manage-tokens.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/util/manage-tokens.ts"],"sourcesContent":["import crypto from \"crypto\";\n\ntype TokenPayload = string;\ntype EncryptedData = {\n iv: string;\n tag: string;\n content: string;\n};\n\nconst getKey = (rawKey: string): Buffer => {\n return crypto.createHash(\"sha256\").update(rawKey).digest();\n};\n\nconst getTenantSecret = (tenantId: string): Buffer => {\n const key = tenantId;\n if (!key) throw new Error(`Missing secret for tenant: ${tenantId}`);\n return Buffer.from(key, \"hex\");\n};\n\nexport const encryptToken = (token: TokenPayload): string => {\n const key = getKey(process.env.ENCRYPTION_KEY!);\n const iv = crypto.randomBytes(12);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", key, iv);\n\n const encrypted = Buffer.concat([cipher.update(token, \"utf8\"), cipher.final()]);\n\n const tag = cipher.getAuthTag();\n\n const result: EncryptedData = {\n iv: iv.toString(\"hex\"),\n tag: tag.toString(\"hex\"),\n content: encrypted.toString(\"hex\"),\n };\n\n return Buffer.from(JSON.stringify(result)).toString(\"base64\");\n};\n\nexport const decryptToken = (encryptedToken: string): string => {\n const key = getKey(process.env.ENCRYPTION_KEY!);\n const decoded = JSON.parse(\n Buffer.from(encryptedToken, \"base64\").toString(\"utf8\"),\n ) as EncryptedData;\n\n const iv = Buffer.from(decoded.iv, \"hex\");\n const tag = Buffer.from(decoded.tag, \"hex\");\n const content = Buffer.from(decoded.content, \"hex\");\n\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", key, iv);\n decipher.setAuthTag(tag);\n\n const decrypted = Buffer.concat([decipher.update(content), decipher.final()]);\n\n return decrypted.toString(\"utf8\");\n};\n"],"names":["crypto","getKey","rawKey","createHash","update","digest","getTenantSecret","tenantId","key","Error","Buffer","from","encryptToken","token","process","env","ENCRYPTION_KEY","iv","randomBytes","cipher","createCipheriv","encrypted","concat","final","tag","getAuthTag","result","toString","content","JSON","stringify","decryptToken","encryptedToken","decoded","parse","decipher","createDecipheriv","setAuthTag","decrypted"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAS5B,MAAMC,SAAS,CAACC;IACZ,OAAOF,OAAOG,UAAU,CAAC,UAAUC,MAAM,CAACF,QAAQG,MAAM;AAC5D;AAEA,MAAMC,kBAAkB,CAACC;IACrB,MAAMC,MAAMD;IACZ,IAAI,CAACC,KAAK,MAAM,IAAIC,MAAM,CAAC,2BAA2B,EAAEF,UAAU;IAClE,OAAOG,OAAOC,IAAI,CAACH,KAAK;AAC5B;AAEA,OAAO,MAAMI,eAAe,CAACC;IACzB,MAAML,MAAMP,OAAOa,QAAQC,GAAG,CAACC,cAAc;IAC7C,MAAMC,KAAKjB,OAAOkB,WAAW,CAAC;IAC9B,MAAMC,SAASnB,OAAOoB,cAAc,CAAC,eAAeZ,KAAKS;IAEzD,MAAMI,YAAYX,OAAOY,MAAM,CAAC;QAACH,OAAOf,MAAM,CAACS,OAAO;QAASM,OAAOI,KAAK;KAAG;IAE9E,MAAMC,MAAML,OAAOM,UAAU;IAE7B,MAAMC,SAAwB;QAC1BT,IAAIA,GAAGU,QAAQ,CAAC;QAChBH,KAAKA,IAAIG,QAAQ,CAAC;QAClBC,SAASP,UAAUM,QAAQ,CAAC;IAChC;IAEA,OAAOjB,OAAOC,IAAI,CAACkB,KAAKC,SAAS,CAACJ,SAASC,QAAQ,CAAC;AACxD,EAAE;AAEF,OAAO,MAAMI,eAAe,CAACC;IACzB,MAAMxB,MAAMP,OAAOa,QAAQC,GAAG,CAACC,cAAc;IAC7C,MAAMiB,UAAUJ,KAAKK,KAAK,CACtBxB,OAAOC,IAAI,CAACqB,gBAAgB,UAAUL,QAAQ,CAAC;IAGnD,MAAMV,KAAKP,OAAOC,IAAI,CAACsB,QAAQhB,EAAE,EAAE;IACnC,MAAMO,MAAMd,OAAOC,IAAI,CAACsB,QAAQT,GAAG,EAAE;IACrC,MAAMI,UAAUlB,OAAOC,IAAI,CAACsB,QAAQL,OAAO,EAAE;IAE7C,MAAMO,WAAWnC,OAAOoC,gBAAgB,CAAC,eAAe5B,KAAKS;IAC7DkB,SAASE,UAAU,CAACb;IAEpB,MAAMc,YAAY5B,OAAOY,MAAM,CAAC;QAACa,SAAS/B,MAAM,CAACwB;QAAUO,SAASZ,KAAK;KAAG;IAE5E,OAAOe,UAAUX,QAAQ,CAAC;AAC9B,EAAE"}
|