@unchainedshop/plugins 4.0.0-rc.13 → 4.0.0-rc.15
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/lib/filters/strict-equal.js +0 -18
- package/lib/filters/strict-equal.js.map +1 -1
- package/lib/payment/cryptopay/derive-eth-address.js +3 -3
- package/lib/payment/cryptopay/derive-eth-address.js.map +1 -1
- package/lib/payment/postfinance-checkout/api-client.d.ts.map +1 -1
- package/lib/payment/postfinance-checkout/api-client.js +7 -7
- package/lib/payment/postfinance-checkout/api-client.js.map +1 -1
- package/lib/pricing/product-catalog-price.d.ts.map +1 -1
- package/lib/pricing/product-catalog-price.js +24 -0
- package/lib/pricing/product-catalog-price.js.map +1 -1
- package/package.json +17 -17
- package/src/filters/strict-equal.ts +0 -21
- package/src/payment/cryptopay/derive-eth-address.ts +3 -3
- package/src/payment/postfinance-checkout/api-client.ts +13 -8
- package/src/pricing/product-catalog-price.ts +23 -0
|
@@ -8,24 +8,6 @@ const StrictQualFilter = {
|
|
|
8
8
|
actions: (params) => {
|
|
9
9
|
return {
|
|
10
10
|
...FilterAdapter.actions(params),
|
|
11
|
-
searchProducts: async ({ productIds }) => {
|
|
12
|
-
// Search Products
|
|
13
|
-
const { queryString } = params.searchQuery;
|
|
14
|
-
if (!queryString && !productIds) {
|
|
15
|
-
// If no query string is provided, return all product IDs
|
|
16
|
-
return params.modules.products.findProductIds({});
|
|
17
|
-
}
|
|
18
|
-
return productIds;
|
|
19
|
-
},
|
|
20
|
-
searchAssortments: async ({ assortmentIds }) => {
|
|
21
|
-
// Search Assortments
|
|
22
|
-
const { queryString } = params.searchQuery;
|
|
23
|
-
if (!queryString && !assortmentIds) {
|
|
24
|
-
// If no query string is provided, return all assortment IDs
|
|
25
|
-
return params.modules.assortments.findAssortmentIds({});
|
|
26
|
-
}
|
|
27
|
-
return assortmentIds;
|
|
28
|
-
},
|
|
29
11
|
transformProductSelector: async (lastSelector, options) => {
|
|
30
12
|
const { key, value } = options || {};
|
|
31
13
|
if (key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict-equal.js","sourceRoot":"","sources":["../../src/filters/strict-equal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,gBAAgB,GAAmB;IACvC,GAAG,aAAa;IAEhB,GAAG,EAAE,oCAAoC;IACzC,KAAK,EAAE,+BAA+B;IACtC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC;IAEb,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;QAClB,OAAO;YACL,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAEhC,
|
|
1
|
+
{"version":3,"file":"strict-equal.js","sourceRoot":"","sources":["../../src/filters/strict-equal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,gBAAgB,GAAmB;IACvC,GAAG,aAAa;IAEhB,GAAG,EAAE,oCAAoC;IACzC,KAAK,EAAE,+BAA+B;IACtC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC;IAEb,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;QAClB,OAAO;YACL,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAEhC,wBAAwB,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE;gBACxD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;gBAErC,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO;wBACL,GAAG,YAAY;wBACf,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;qBACvD,CAAC;gBACJ,CAAC;gBACD,OAAO,YAAY,CAAC;YACtB,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,cAAc,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HDKey } from '@scure/bip32';
|
|
2
|
-
import { keccak_256 } from '@noble/hashes/sha3';
|
|
3
|
-
import { secp256k1 } from '@noble/curves/secp256k1';
|
|
2
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
3
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
4
4
|
function getChecksumAddress(address) {
|
|
5
5
|
const chars = address.split('');
|
|
6
6
|
const expanded = new Uint8Array(40);
|
|
@@ -23,7 +23,7 @@ export default (xpub, index) => {
|
|
|
23
23
|
hardenedMaster.wipePrivateData(); // Neuter
|
|
24
24
|
const child = hardenedMaster.deriveChild(0).deriveChild(index);
|
|
25
25
|
// ETH Address (secp256k1 + keccak_256 + checksum)
|
|
26
|
-
const childSigningKey = secp256k1.
|
|
26
|
+
const childSigningKey = secp256k1.Point.fromBytes(child.publicKey).toBytes(false);
|
|
27
27
|
const address = Buffer.from(keccak_256(childSigningKey.slice(1)))
|
|
28
28
|
.toString('hex')
|
|
29
29
|
.substring(24);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-eth-address.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/derive-eth-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"derive-eth-address.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/derive-eth-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,SAAS,kBAAkB,CAAC,OAAO;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACnD,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,SAAS;IAE3C,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE/D,kDAAkD;IAClD,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9D,QAAQ,CAAC,KAAK,CAAC;SACf,SAAS,CAAC,EAAE,CAAC,CAAC;IAEjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../../src/payment/postfinance-checkout/api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../../src/payment/postfinance-checkout/api-client.ts"],"names":[],"mappings":"AAEA,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;YAIf,kBAAkB;IA8B1B,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IA+C1E,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;CAGlD"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import crypto from 'crypto';
|
|
2
1
|
const API_BASE_URL = 'https://checkout.postfinance.ch/api';
|
|
3
2
|
export class PostFinanceApiClient {
|
|
4
3
|
config;
|
|
5
4
|
constructor(config) {
|
|
6
5
|
this.config = config;
|
|
7
6
|
}
|
|
8
|
-
generateMacHeaders(method, path) {
|
|
7
|
+
async generateMacHeaders(method, path) {
|
|
9
8
|
const version = '1';
|
|
10
9
|
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
11
10
|
const userId = this.config.userId.toString();
|
|
12
11
|
// Use path as-is since it already includes /api from the URL
|
|
13
12
|
const resourcePath = path;
|
|
14
13
|
const dataToSign = [version, userId, timestamp, method, resourcePath].join('|');
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
// Use Web Crypto API instead of crypto.createHmac
|
|
15
|
+
const secretBytes = Uint8Array.from(atob(this.config.apiSecret), (c) => c.charCodeAt(0));
|
|
16
|
+
const key = await crypto.subtle.importKey('raw', secretBytes, { name: 'HMAC', hash: 'SHA-512' }, false, ['sign']);
|
|
17
|
+
const signature = await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(dataToSign));
|
|
18
|
+
const macValue = btoa(String.fromCharCode(...new Uint8Array(signature)));
|
|
19
19
|
return {
|
|
20
20
|
'x-mac-version': version,
|
|
21
21
|
'x-mac-userid': userId,
|
|
@@ -28,7 +28,7 @@ export class PostFinanceApiClient {
|
|
|
28
28
|
const urlObj = new URL(url);
|
|
29
29
|
// Include both pathname and search (query parameters) for MAC signature
|
|
30
30
|
const pathWithQuery = urlObj.pathname + urlObj.search;
|
|
31
|
-
const macHeaders = this.generateMacHeaders(method, pathWithQuery);
|
|
31
|
+
const macHeaders = await this.generateMacHeaders(method, pathWithQuery);
|
|
32
32
|
const headers = {
|
|
33
33
|
...macHeaders,
|
|
34
34
|
'Content-Type': 'application/json',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../src/payment/postfinance-checkout/api-client.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../src/payment/postfinance-checkout/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-catalog-price.d.ts","sourceRoot":"","sources":["../../src/pricing/product-catalog-price.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"product-catalog-price.d.ts","sourceRoot":"","sources":["../../src/pricing/product-catalog-price.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,YAAY,EAAE,sBA6D1B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ProductPricingDirector, ProductPricingAdapter, } from '@unchainedshop/core';
|
|
2
|
+
import { ProductTypes } from '@unchainedshop/core-products';
|
|
2
3
|
export const ProductPrice = {
|
|
3
4
|
...ProductPricingAdapter,
|
|
4
5
|
key: 'shop.unchained.pricing.product-price',
|
|
@@ -28,6 +29,29 @@ export const ProductPrice = {
|
|
|
28
29
|
meta: { adapter: ProductPrice.key },
|
|
29
30
|
});
|
|
30
31
|
}
|
|
32
|
+
else if (product.type === ProductTypes.BundleProduct) {
|
|
33
|
+
for (const bundleItem of product.bundleItems || []) {
|
|
34
|
+
const bundledProduct = await modules.products.findProduct({
|
|
35
|
+
productId: bundleItem.productId,
|
|
36
|
+
});
|
|
37
|
+
if (bundledProduct) {
|
|
38
|
+
const bundleItemPrice = await modules.products.prices.price(bundledProduct, {
|
|
39
|
+
countryCode,
|
|
40
|
+
currencyCode,
|
|
41
|
+
quantity: bundleItem.quantity * quantity,
|
|
42
|
+
});
|
|
43
|
+
if (bundleItemPrice) {
|
|
44
|
+
const bundleItemTotal = bundleItemPrice.amount * bundleItem.quantity * quantity;
|
|
45
|
+
pricingAdapter.resultSheet().addItem({
|
|
46
|
+
amount: bundleItemTotal,
|
|
47
|
+
isTaxable: bundleItemPrice.isTaxable,
|
|
48
|
+
isNetPrice: bundleItemPrice.isNetPrice,
|
|
49
|
+
meta: { adapter: ProductPrice.key },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
31
55
|
return pricingAdapter.calculate();
|
|
32
56
|
},
|
|
33
57
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-catalog-price.js","sourceRoot":"","sources":["../../src/pricing/product-catalog-price.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"product-catalog-price.js","sourceRoot":"","sources":["../../src/pricing/product-catalog-price.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,GAAG,qBAAqB;IAExB,GAAG,EAAE,sCAAsC;IAC3C,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,4BAA4B;IACnC,UAAU,EAAE,CAAC;IAEb,cAAc,EAAE,GAAG,EAAE;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;QAClB,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE7D,OAAO;YACL,GAAG,cAAc;YAEjB,SAAS,EAAE,KAAK,IAAI,EAAE;gBACpB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;gBACjF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;oBACzD,WAAW;oBACX,YAAY;oBACZ,QAAQ;iBACT,CAAC,CAAC;gBACH,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;oBAC1C,cAAc,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC;wBACnC,MAAM,EAAE,SAAS;wBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE;qBACpC,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,aAAa,EAAE,CAAC;oBACvD,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;wBACnD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;4BACxD,SAAS,EAAE,UAAU,CAAC,SAAS;yBAChC,CAAC,CAAC;wBACH,IAAI,cAAc,EAAE,CAAC;4BACnB,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE;gCAC1E,WAAW;gCACX,YAAY;gCACZ,QAAQ,EAAE,UAAU,CAAC,QAAQ,GAAG,QAAQ;6BACzC,CAAC,CAAC;4BACH,IAAI,eAAe,EAAE,CAAC;gCACpB,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,GAAG,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;gCAChF,cAAc,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC;oCACnC,MAAM,EAAE,eAAe;oCACvB,SAAS,EAAE,eAAe,CAAC,SAAS;oCACpC,UAAU,EAAE,eAAe,CAAC,UAAU;oCACtC,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE;iCACpC,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,cAAc,CAAC,SAAS,EAAE,CAAC;YACpC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/plugins",
|
|
3
|
-
"version": "4.0.0-rc.
|
|
3
|
+
"version": "4.0.0-rc.15",
|
|
4
4
|
"main": "lib/plugins-index.js",
|
|
5
5
|
"types": "lib/plugins-index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -34,18 +34,18 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@unchainedshop/api": "^4.0.0-rc.
|
|
38
|
-
"@unchainedshop/core-delivery": "^4.0.0-rc.
|
|
39
|
-
"@unchainedshop/core-enrollments": "^4.0.0-rc.
|
|
40
|
-
"@unchainedshop/core-orders": "^4.0.0-rc.
|
|
41
|
-
"@unchainedshop/core-payment": "^4.0.0-rc.
|
|
42
|
-
"@unchainedshop/core-products": "^4.0.0-rc.
|
|
43
|
-
"@unchainedshop/core-warehousing": "^4.0.0-rc.
|
|
44
|
-
"@unchainedshop/core-worker": "^4.0.0-rc.
|
|
45
|
-
"@unchainedshop/events": "^4.0.0-rc.
|
|
46
|
-
"@unchainedshop/file-upload": "^4.0.0-rc.
|
|
47
|
-
"@unchainedshop/logger": "^4.0.0-rc.
|
|
48
|
-
"@unchainedshop/utils": "^4.0.0-rc.
|
|
37
|
+
"@unchainedshop/api": "^4.0.0-rc.15",
|
|
38
|
+
"@unchainedshop/core-delivery": "^4.0.0-rc.15",
|
|
39
|
+
"@unchainedshop/core-enrollments": "^4.0.0-rc.15",
|
|
40
|
+
"@unchainedshop/core-orders": "^4.0.0-rc.15",
|
|
41
|
+
"@unchainedshop/core-payment": "^4.0.0-rc.15",
|
|
42
|
+
"@unchainedshop/core-products": "^4.0.0-rc.15",
|
|
43
|
+
"@unchainedshop/core-warehousing": "^4.0.0-rc.15",
|
|
44
|
+
"@unchainedshop/core-worker": "^4.0.0-rc.15",
|
|
45
|
+
"@unchainedshop/events": "^4.0.0-rc.15",
|
|
46
|
+
"@unchainedshop/file-upload": "^4.0.0-rc.15",
|
|
47
|
+
"@unchainedshop/logger": "^4.0.0-rc.15",
|
|
48
|
+
"@unchainedshop/utils": "^4.0.0-rc.15",
|
|
49
49
|
"event-iterator": "^2.0.0",
|
|
50
50
|
"JSONStream": "^1.3.5"
|
|
51
51
|
},
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"@breejs/later": "^4.2.0",
|
|
55
55
|
"@paypal/checkout-server-sdk": "1.x",
|
|
56
56
|
"@redis/client": ">= 1 < 6",
|
|
57
|
-
"@scure/bip32": ">=
|
|
58
|
-
"@scure/btc-signer": ">=
|
|
57
|
+
"@scure/bip32": ">= 2",
|
|
58
|
+
"@scure/btc-signer": ">= 2",
|
|
59
59
|
"expiry-map": "2.x",
|
|
60
60
|
"express": ">= 5 < 6",
|
|
61
61
|
"fastify": ">= 5.2 < 6",
|
|
@@ -125,8 +125,8 @@
|
|
|
125
125
|
"@breejs/later": "^4.2.0",
|
|
126
126
|
"@paypal/checkout-server-sdk": "^1.0.3",
|
|
127
127
|
"@redis/client": "^5.6.0",
|
|
128
|
-
"@scure/bip32": "^
|
|
129
|
-
"@scure/btc-signer": "^
|
|
128
|
+
"@scure/bip32": "^2.0.0",
|
|
129
|
+
"@scure/btc-signer": "^2.0.0",
|
|
130
130
|
"@types/breejs__later": "^4.1.5",
|
|
131
131
|
"@types/express": "^5.0.3",
|
|
132
132
|
"@types/node": "^24.0.13",
|
|
@@ -12,27 +12,6 @@ const StrictQualFilter: IFilterAdapter = {
|
|
|
12
12
|
return {
|
|
13
13
|
...FilterAdapter.actions(params),
|
|
14
14
|
|
|
15
|
-
searchProducts: async ({ productIds }) => {
|
|
16
|
-
// Search Products
|
|
17
|
-
const { queryString } = params.searchQuery;
|
|
18
|
-
|
|
19
|
-
if (!queryString && !productIds) {
|
|
20
|
-
// If no query string is provided, return all product IDs
|
|
21
|
-
return params.modules.products.findProductIds({});
|
|
22
|
-
}
|
|
23
|
-
return productIds;
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
searchAssortments: async ({ assortmentIds }) => {
|
|
27
|
-
// Search Assortments
|
|
28
|
-
const { queryString } = params.searchQuery;
|
|
29
|
-
if (!queryString && !assortmentIds) {
|
|
30
|
-
// If no query string is provided, return all assortment IDs
|
|
31
|
-
return params.modules.assortments.findAssortmentIds({});
|
|
32
|
-
}
|
|
33
|
-
return assortmentIds;
|
|
34
|
-
},
|
|
35
|
-
|
|
36
15
|
transformProductSelector: async (lastSelector, options) => {
|
|
37
16
|
const { key, value } = options || {};
|
|
38
17
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HDKey } from '@scure/bip32';
|
|
2
|
-
import { keccak_256 } from '@noble/hashes/sha3';
|
|
3
|
-
import { secp256k1 } from '@noble/curves/secp256k1';
|
|
2
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
3
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
4
4
|
|
|
5
5
|
function getChecksumAddress(address) {
|
|
6
6
|
const chars = address.split('');
|
|
@@ -29,7 +29,7 @@ export default (xpub, index) => {
|
|
|
29
29
|
const child = hardenedMaster.deriveChild(0).deriveChild(index);
|
|
30
30
|
|
|
31
31
|
// ETH Address (secp256k1 + keccak_256 + checksum)
|
|
32
|
-
const childSigningKey = secp256k1.
|
|
32
|
+
const childSigningKey = secp256k1.Point.fromBytes(child.publicKey).toBytes(false);
|
|
33
33
|
const address = Buffer.from(keccak_256(childSigningKey.slice(1)))
|
|
34
34
|
.toString('hex')
|
|
35
35
|
.substring(24);
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import crypto from 'crypto';
|
|
2
|
-
|
|
3
1
|
const API_BASE_URL = 'https://checkout.postfinance.ch/api';
|
|
4
2
|
|
|
5
3
|
interface ApiConfig {
|
|
@@ -22,7 +20,7 @@ export class PostFinanceApiClient {
|
|
|
22
20
|
this.config = config;
|
|
23
21
|
}
|
|
24
22
|
|
|
25
|
-
private generateMacHeaders(method: string, path: string): MacHeaders {
|
|
23
|
+
private async generateMacHeaders(method: string, path: string): Promise<MacHeaders> {
|
|
26
24
|
const version = '1';
|
|
27
25
|
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
28
26
|
const userId = this.config.userId.toString();
|
|
@@ -32,10 +30,17 @@ export class PostFinanceApiClient {
|
|
|
32
30
|
|
|
33
31
|
const dataToSign = [version, userId, timestamp, method, resourcePath].join('|');
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
// Use Web Crypto API instead of crypto.createHmac
|
|
34
|
+
const secretBytes = Uint8Array.from(atob(this.config.apiSecret), (c) => c.charCodeAt(0));
|
|
35
|
+
const key = await crypto.subtle.importKey(
|
|
36
|
+
'raw',
|
|
37
|
+
secretBytes,
|
|
38
|
+
{ name: 'HMAC', hash: 'SHA-512' },
|
|
39
|
+
false,
|
|
40
|
+
['sign'],
|
|
41
|
+
);
|
|
42
|
+
const signature = await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(dataToSign));
|
|
43
|
+
const macValue = btoa(String.fromCharCode(...new Uint8Array(signature)));
|
|
39
44
|
|
|
40
45
|
return {
|
|
41
46
|
'x-mac-version': version,
|
|
@@ -50,7 +55,7 @@ export class PostFinanceApiClient {
|
|
|
50
55
|
const urlObj = new URL(url);
|
|
51
56
|
// Include both pathname and search (query parameters) for MAC signature
|
|
52
57
|
const pathWithQuery = urlObj.pathname + urlObj.search;
|
|
53
|
-
const macHeaders = this.generateMacHeaders(method, pathWithQuery);
|
|
58
|
+
const macHeaders = await this.generateMacHeaders(method, pathWithQuery);
|
|
54
59
|
|
|
55
60
|
const headers: Record<string, string> = {
|
|
56
61
|
...macHeaders,
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
ProductPricingAdapter,
|
|
4
4
|
IProductPricingAdapter,
|
|
5
5
|
} from '@unchainedshop/core';
|
|
6
|
+
import { ProductTypes } from '@unchainedshop/core-products';
|
|
6
7
|
|
|
7
8
|
export const ProductPrice: IProductPricingAdapter = {
|
|
8
9
|
...ProductPricingAdapter,
|
|
@@ -37,6 +38,28 @@ export const ProductPrice: IProductPricingAdapter = {
|
|
|
37
38
|
isNetPrice: price.isNetPrice,
|
|
38
39
|
meta: { adapter: ProductPrice.key },
|
|
39
40
|
});
|
|
41
|
+
} else if (product.type === ProductTypes.BundleProduct) {
|
|
42
|
+
for (const bundleItem of product.bundleItems || []) {
|
|
43
|
+
const bundledProduct = await modules.products.findProduct({
|
|
44
|
+
productId: bundleItem.productId,
|
|
45
|
+
});
|
|
46
|
+
if (bundledProduct) {
|
|
47
|
+
const bundleItemPrice = await modules.products.prices.price(bundledProduct, {
|
|
48
|
+
countryCode,
|
|
49
|
+
currencyCode,
|
|
50
|
+
quantity: bundleItem.quantity * quantity,
|
|
51
|
+
});
|
|
52
|
+
if (bundleItemPrice) {
|
|
53
|
+
const bundleItemTotal = bundleItemPrice.amount * bundleItem.quantity * quantity;
|
|
54
|
+
pricingAdapter.resultSheet().addItem({
|
|
55
|
+
amount: bundleItemTotal,
|
|
56
|
+
isTaxable: bundleItemPrice.isTaxable,
|
|
57
|
+
isNetPrice: bundleItemPrice.isNetPrice,
|
|
58
|
+
meta: { adapter: ProductPrice.key },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
40
63
|
}
|
|
41
64
|
|
|
42
65
|
return pricingAdapter.calculate();
|