@hszrdm/core 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +7481 -5872
- package/.medusa/server/src/admin/index.mjs +7482 -5873
- package/.medusa/server/src/api/admin/arukereso/marketplace-preview/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/arukereso/marketplace-preview/route.js +26 -0
- package/.medusa/server/src/api/admin/billingo/advance/route.d.ts +8 -0
- package/.medusa/server/src/api/admin/billingo/advance/route.js +55 -0
- package/.medusa/server/src/api/admin/billingo/partial-credit/route.d.ts +8 -0
- package/.medusa/server/src/api/admin/billingo/partial-credit/route.js +69 -0
- package/.medusa/server/src/api/admin/documents/[id]/route.d.ts +22 -0
- package/.medusa/server/src/api/admin/documents/[id]/route.js +107 -0
- package/.medusa/server/src/api/admin/documents/route.d.ts +21 -0
- package/.medusa/server/src/api/admin/documents/route.js +117 -0
- package/.medusa/server/src/api/admin/google-ads/diagnostics/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/google-ads/diagnostics/route.js +26 -0
- package/.medusa/server/src/api/admin/google-ads/oauth/start/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/google-ads/oauth/start/route.js +27 -0
- package/.medusa/server/src/api/admin/google-merchant/data-source/sync/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/google-merchant/data-source/sync/route.js +69 -0
- package/.medusa/server/src/api/admin/google-merchant/diagnostics/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/google-merchant/diagnostics/route.js +26 -0
- package/.medusa/server/src/api/admin/google-merchant/oauth/start/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/google-merchant/oauth/start/route.js +25 -0
- package/.medusa/server/src/api/admin/orders/[id]/shipping/route.js +28 -28
- package/.medusa/server/src/api/admin/shipping/mpl/close/route.d.ts +1 -1
- package/.medusa/server/src/api/admin/shipping/mpl/close/route.js +48 -70
- package/.medusa/server/src/api/auth/google-ads/callback/route.d.ts +2 -0
- package/.medusa/server/src/api/auth/google-ads/callback/route.js +58 -0
- package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.d.ts +2 -0
- package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.js +33 -0
- package/.medusa/server/src/api/feeds/google-merchant.xml/route.js +5 -3
- package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.d.ts +2 -0
- package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.js +211 -0
- package/.medusa/server/src/api/hooks/simplepay/ipn/route.js +113 -23
- package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.d.ts +2 -0
- package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.js +113 -0
- package/.medusa/server/src/api/store/arukereso/backlink/route.d.ts +2 -0
- package/.medusa/server/src/api/store/arukereso/backlink/route.js +73 -0
- package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.d.ts +2 -0
- package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.js +84 -0
- package/.medusa/server/src/api/store/arukereso/widget/route.d.ts +2 -0
- package/.medusa/server/src/api/store/arukereso/widget/route.js +64 -0
- package/.medusa/server/src/api/store/documents/route.d.ts +2 -0
- package/.medusa/server/src/api/store/documents/route.js +84 -0
- package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.d.ts +2 -0
- package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.js +50 -0
- package/.medusa/server/src/config.d.ts +3 -3
- package/.medusa/server/src/config.js +64 -87
- package/.medusa/server/src/core/documents.d.ts +31 -0
- package/.medusa/server/src/core/documents.js +47 -0
- package/.medusa/server/src/core/version.d.ts +2 -2
- package/.medusa/server/src/core/version.js +2 -2
- package/.medusa/server/src/lib/modules/arukereso/index.d.ts +1 -0
- package/.medusa/server/src/lib/modules/arukereso/index.js +2 -1
- package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.d.ts +19 -0
- package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.js +100 -0
- package/.medusa/server/src/lib/modules/billingo/actions.js +42 -12
- package/.medusa/server/src/lib/modules/billingo/advance.d.ts +68 -0
- package/.medusa/server/src/lib/modules/billingo/advance.js +309 -0
- package/.medusa/server/src/lib/modules/billingo/automation.js +49 -9
- package/.medusa/server/src/lib/modules/billingo/client.d.ts +5 -1
- package/.medusa/server/src/lib/modules/billingo/client.js +12 -6
- package/.medusa/server/src/lib/modules/billingo/index.d.ts +2 -0
- package/.medusa/server/src/lib/modules/billingo/index.js +3 -1
- package/.medusa/server/src/lib/modules/billingo/mapper.d.ts +38 -1
- package/.medusa/server/src/lib/modules/billingo/mapper.js +32 -1
- package/.medusa/server/src/lib/modules/billingo/partial-credit.d.ts +55 -0
- package/.medusa/server/src/lib/modules/billingo/partial-credit.js +338 -0
- package/.medusa/server/src/lib/modules/billingo/types.d.ts +7 -2
- package/.medusa/server/src/lib/modules/google-ads/adjustments.d.ts +21 -0
- package/.medusa/server/src/lib/modules/google-ads/adjustments.js +146 -0
- package/.medusa/server/src/lib/modules/google-ads/api.d.ts +23 -0
- package/.medusa/server/src/lib/modules/google-ads/api.js +171 -0
- package/.medusa/server/src/lib/modules/google-ads/diagnostics.d.ts +47 -0
- package/.medusa/server/src/lib/modules/google-ads/diagnostics.js +164 -0
- package/.medusa/server/src/lib/modules/google-merchant/category-fields.d.ts +7 -0
- package/.medusa/server/src/lib/modules/google-merchant/category-fields.js +210 -0
- package/.medusa/server/src/lib/modules/google-merchant/data-source.d.ts +17 -0
- package/.medusa/server/src/lib/modules/google-merchant/data-source.js +132 -0
- package/.medusa/server/src/lib/modules/google-merchant/diagnostics.d.ts +33 -0
- package/.medusa/server/src/lib/modules/google-merchant/diagnostics.js +113 -0
- package/.medusa/server/src/lib/modules/google-merchant/index.d.ts +5 -0
- package/.medusa/server/src/lib/modules/google-merchant/index.js +6 -1
- package/.medusa/server/src/lib/modules/google-merchant/merchant-api.d.ts +18 -0
- package/.medusa/server/src/lib/modules/google-merchant/merchant-api.js +120 -0
- package/.medusa/server/src/lib/modules/google-merchant/shipping.d.ts +13 -0
- package/.medusa/server/src/lib/modules/google-merchant/shipping.js +97 -0
- package/.medusa/server/src/lib/modules/google-tag-manager/api.d.ts +1 -0
- package/.medusa/server/src/lib/modules/google-tag-manager/api.js +3 -0
- package/.medusa/server/src/lib/modules/google-tag-manager/index.d.ts +1 -0
- package/.medusa/server/src/lib/modules/google-tag-manager/index.js +3 -0
- package/.medusa/server/src/lib/modules/google-tag-manager/sync.d.ts +1 -0
- package/.medusa/server/src/lib/modules/google-tag-manager/sync.js +3 -0
- package/.medusa/server/src/lib/modules/shipping/actions.js +163 -352
- package/.medusa/server/src/lib/modules/shipping/durable-create.d.ts +2 -1
- package/.medusa/server/src/lib/modules/shipping/durable-create.js +33 -5
- package/.medusa/server/src/lib/modules/shipping/idempotency.js +4 -2
- package/.medusa/server/src/lib/modules/shipping/types.d.ts +1 -1
- package/.medusa/server/src/modules/core-documents/index.d.ts +38 -0
- package/.medusa/server/src/modules/core-documents/index.js +18 -0
- package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.d.ts +5 -0
- package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.js +22 -0
- package/.medusa/server/src/modules/core-documents/models/core-document-assignment.d.ts +9 -0
- package/.medusa/server/src/modules/core-documents/models/core-document-assignment.js +18 -0
- package/.medusa/server/src/modules/core-documents/models/core-document.d.ts +18 -0
- package/.medusa/server/src/modules/core-documents/models/core-document.js +27 -0
- package/.medusa/server/src/modules/core-documents/service.d.ts +38 -0
- package/.medusa/server/src/modules/core-documents/service.js +13 -0
- package/.medusa/server/src/modules/integration-operation/state.d.ts +1 -0
- package/.medusa/server/src/modules/integration-operation/state.js +11 -50
- package/.medusa/server/src/modules/integration-operation/types.d.ts +1 -1
- package/.medusa/server/src/modules/integration-settings/arukereso-registration.js +19 -2
- package/.medusa/server/src/modules/integration-settings/connection-test.js +14 -1
- package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.d.ts +2 -0
- package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.js +49 -0
- package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.js +35 -0
- package/.medusa/server/src/modules/integration-settings/google-merchant-registration.js +23 -2
- package/.medusa/server/src/modules/integration-settings/hot-reload-registration.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/hot-reload-registration.js +23 -0
- package/.medusa/server/src/modules/integration-settings/index.d.ts +4 -0
- package/.medusa/server/src/modules/integration-settings/index.js +5 -1
- package/.medusa/server/src/modules/integration-settings/manager.js +38 -4
- package/.medusa/server/src/modules/integration-settings/reloadable.d.ts +10 -0
- package/.medusa/server/src/modules/integration-settings/reloadable.js +58 -0
- package/.medusa/server/src/modules/integration-settings/runtime-snapshot.d.ts +9 -0
- package/.medusa/server/src/modules/integration-settings/runtime-snapshot.js +48 -3
- package/.medusa/server/src/modules/integration-settings/simplepay-registration.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/simplepay-registration.js +18 -0
- package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -5
- package/.medusa/server/src/providers/csomagpiac/client.d.ts +25 -0
- package/.medusa/server/src/providers/csomagpiac/client.js +144 -0
- package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.d.ts +45 -0
- package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.js +221 -0
- package/.medusa/server/src/providers/csomagpiac/index.d.ts +7 -0
- package/.medusa/server/src/providers/csomagpiac/index.js +30 -0
- package/.medusa/server/src/providers/csomagpiac/service.d.ts +46 -0
- package/.medusa/server/src/providers/csomagpiac/service.js +226 -0
- package/.medusa/server/src/providers/csomagpiac/types.d.ts +65 -0
- package/.medusa/server/src/providers/csomagpiac/types.js +27 -0
- package/.medusa/server/src/providers/dpd/fulfillment-provider.d.ts +2 -1
- package/.medusa/server/src/providers/dpd/fulfillment-provider.js +83 -25
- package/.medusa/server/src/providers/dpd/service.js +5 -3
- package/.medusa/server/src/providers/email/service.d.ts +7 -6
- package/.medusa/server/src/providers/email/service.js +51 -25
- package/.medusa/server/src/providers/foxpost/foxpost-service.js +5 -9
- package/.medusa/server/src/providers/foxpost/fulfillment-provider.d.ts +1 -0
- package/.medusa/server/src/providers/foxpost/fulfillment-provider.js +76 -66
- package/.medusa/server/src/providers/gls/fulfillment-provider.d.ts +1 -0
- package/.medusa/server/src/providers/gls/fulfillment-provider.js +76 -13
- package/.medusa/server/src/providers/gls/gls-service.d.ts +16 -0
- package/.medusa/server/src/providers/gls/gls-service.js +26 -65
- package/.medusa/server/src/providers/gls/types.d.ts +15 -0
- package/.medusa/server/src/providers/mpl/fulfillment-provider.d.ts +1 -0
- package/.medusa/server/src/providers/mpl/fulfillment-provider.js +61 -186
- package/.medusa/server/src/providers/mpl/index.d.ts +2 -0
- package/.medusa/server/src/providers/mpl/index.js +7 -2
- package/.medusa/server/src/providers/mpl/service.d.ts +35 -1
- package/.medusa/server/src/providers/mpl/service.js +82 -370
- package/.medusa/server/src/providers/mpl/types.d.ts +18 -0
- package/.medusa/server/src/providers/mpl/types.js +1 -1
- package/.medusa/server/src/providers/packeta/client.d.ts +2 -1
- package/.medusa/server/src/providers/packeta/client.js +24 -2
- package/.medusa/server/src/providers/packeta/fulfillment-provider.d.ts +1 -0
- package/.medusa/server/src/providers/packeta/fulfillment-provider.js +73 -5
- package/.medusa/server/src/providers/packeta/service.d.ts +1 -0
- package/.medusa/server/src/providers/packeta/service.js +85 -22
- package/.medusa/server/src/providers/packeta/types.d.ts +26 -0
- package/.medusa/server/src/providers/packeta/types.js +1 -1
- package/.medusa/server/src/providers/resilient-stripe/index.d.ts +19 -1
- package/.medusa/server/src/providers/resilient-stripe/index.js +55 -3
- package/.medusa/server/src/providers/simplepay/config.js +11 -1
- package/.medusa/server/src/providers/simplepay/index.d.ts +2 -0
- package/.medusa/server/src/providers/simplepay/index.js +5 -3
- package/.medusa/server/src/providers/simplepay/runtime-service.d.ts +13 -0
- package/.medusa/server/src/providers/simplepay/runtime-service.js +55 -0
- package/.medusa/server/src/providers/simplepay/service.d.ts +2 -0
- package/.medusa/server/src/providers/simplepay/service.js +40 -5
- package/.medusa/server/src/subscribers/google-ads-order-canceled.d.ts +7 -0
- package/.medusa/server/src/subscribers/google-ads-order-canceled.js +50 -0
- package/.medusa/server/src/subscribers/google-ads-payment-refunded.d.ts +7 -0
- package/.medusa/server/src/subscribers/google-ads-payment-refunded.js +181 -0
- package/.medusa/server/src/subscribers/simplepay-paid-order-recovery.js +14 -1
- package/package.json +6 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type GoogleMerchantApiEnv } from "./merchant-api";
|
|
2
|
+
export type GoogleMerchantDataSourceSyncInput = {
|
|
3
|
+
env: GoogleMerchantApiEnv;
|
|
4
|
+
feedUrl: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
countryCode: string;
|
|
7
|
+
contentLanguage: string;
|
|
8
|
+
fetchHour: number;
|
|
9
|
+
timeZone: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function syncGoogleMerchantDataSource(input: GoogleMerchantDataSourceSyncInput): Promise<{
|
|
12
|
+
action: "created" | "updated";
|
|
13
|
+
dataSourceId: string;
|
|
14
|
+
name: string;
|
|
15
|
+
displayName: string;
|
|
16
|
+
feedUrl: string;
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncGoogleMerchantDataSource = syncGoogleMerchantDataSource;
|
|
4
|
+
const merchant_api_1 = require("./merchant-api");
|
|
5
|
+
const DATA_SOURCES_BASE = "https://merchantapi.googleapis.com/datasources/v1";
|
|
6
|
+
async function syncGoogleMerchantDataSource(input) {
|
|
7
|
+
const accountId = required(input.env, "GOOGLE_MERCHANT_ACCOUNT_ID").replace(/^accounts\//, "");
|
|
8
|
+
validateInput(input);
|
|
9
|
+
const accessToken = await (0, merchant_api_1.getGoogleMerchantAccessToken)(input.env);
|
|
10
|
+
const parent = `accounts/${accountId}`;
|
|
11
|
+
const payload = buildPayload(input);
|
|
12
|
+
let dataSource = await resolveExistingDataSource({
|
|
13
|
+
accessToken,
|
|
14
|
+
parent,
|
|
15
|
+
configuredId: input.env.GOOGLE_MERCHANT_DATA_SOURCE_ID,
|
|
16
|
+
displayName: input.displayName,
|
|
17
|
+
});
|
|
18
|
+
let action;
|
|
19
|
+
if (dataSource?.name) {
|
|
20
|
+
dataSource = await merchantRequest(`${DATA_SOURCES_BASE}/${dataSource.name}?updateMask=${encodeURIComponent("displayName,primaryProductDataSource,fileInput")}`, accessToken, { method: "PATCH", body: payload });
|
|
21
|
+
action = "updated";
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
dataSource = await merchantRequest(`${DATA_SOURCES_BASE}/${parent}/dataSources`, accessToken, { method: "POST", body: payload });
|
|
25
|
+
action = "created";
|
|
26
|
+
}
|
|
27
|
+
if (!dataSource?.name || !dataSource?.dataSourceId) {
|
|
28
|
+
throw new Error("A Google Merchant API nem adott vissza data source azonosítót.");
|
|
29
|
+
}
|
|
30
|
+
await merchantRequest(`${DATA_SOURCES_BASE}/${dataSource.name}:fetch`, accessToken, { method: "POST" });
|
|
31
|
+
return {
|
|
32
|
+
action,
|
|
33
|
+
dataSourceId: String(dataSource.dataSourceId),
|
|
34
|
+
name: dataSource.name,
|
|
35
|
+
displayName: dataSource.displayName || input.displayName,
|
|
36
|
+
feedUrl: input.feedUrl,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function resolveExistingDataSource(input) {
|
|
40
|
+
const configuredId = String(input.configuredId || "").trim();
|
|
41
|
+
if (configuredId) {
|
|
42
|
+
try {
|
|
43
|
+
return await merchantRequest(`${DATA_SOURCES_BASE}/${input.parent}/dataSources/${encodeURIComponent(configuredId)}`, input.accessToken);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (!isNotFound(error))
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
let pageToken = "";
|
|
51
|
+
do {
|
|
52
|
+
const query = pageToken ? `?pageToken=${encodeURIComponent(pageToken)}` : "";
|
|
53
|
+
const page = await merchantRequest(`${DATA_SOURCES_BASE}/${input.parent}/dataSources${query}`, input.accessToken);
|
|
54
|
+
const match = (page.dataSources || []).find((source) => source.displayName === input.displayName && source.input === "FILE");
|
|
55
|
+
if (match)
|
|
56
|
+
return match;
|
|
57
|
+
pageToken = page.nextPageToken || "";
|
|
58
|
+
} while (pageToken);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function buildPayload(input) {
|
|
62
|
+
return {
|
|
63
|
+
displayName: input.displayName,
|
|
64
|
+
primaryProductDataSource: {
|
|
65
|
+
channel: "ONLINE_PRODUCTS",
|
|
66
|
+
contentLanguage: input.contentLanguage.toLowerCase(),
|
|
67
|
+
feedLabel: input.countryCode.toUpperCase(),
|
|
68
|
+
countries: [input.countryCode.toUpperCase()],
|
|
69
|
+
},
|
|
70
|
+
fileInput: {
|
|
71
|
+
fetchSettings: {
|
|
72
|
+
enabled: true,
|
|
73
|
+
timeOfDay: { hours: input.fetchHour },
|
|
74
|
+
timeZone: input.timeZone,
|
|
75
|
+
frequency: "FREQUENCY_DAILY",
|
|
76
|
+
fetchUri: input.feedUrl,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async function merchantRequest(url, accessToken, options = {}) {
|
|
82
|
+
const response = await fetch(url, {
|
|
83
|
+
method: options.method || "GET",
|
|
84
|
+
headers: {
|
|
85
|
+
Authorization: `Bearer ${accessToken}`,
|
|
86
|
+
...(options.body ? { "Content-Type": "application/json" } : {}),
|
|
87
|
+
},
|
|
88
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
89
|
+
signal: AbortSignal.timeout(15000),
|
|
90
|
+
});
|
|
91
|
+
const data = (await response.json().catch(() => ({})));
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
const message = data?.error?.message || `Merchant Data Sources API hiba (${response.status}).`;
|
|
94
|
+
const error = new Error(message);
|
|
95
|
+
error.status = response.status;
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
return data;
|
|
99
|
+
}
|
|
100
|
+
function validateInput(input) {
|
|
101
|
+
let feedUrl;
|
|
102
|
+
try {
|
|
103
|
+
feedUrl = new URL(input.feedUrl);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
throw new Error("Érvénytelen Google Merchant feed URL.");
|
|
107
|
+
}
|
|
108
|
+
if (feedUrl.protocol !== "https:") {
|
|
109
|
+
throw new Error("Az automatikus Google Merchant data source feed URL-je HTTPS legyen.");
|
|
110
|
+
}
|
|
111
|
+
if (!input.displayName.trim())
|
|
112
|
+
throw new Error("A Merchant data source neve kötelező.");
|
|
113
|
+
if (!/^[A-Za-z]{2}$/.test(input.countryCode))
|
|
114
|
+
throw new Error("Érvénytelen data source célország.");
|
|
115
|
+
if (!/^[a-z]{2}$/i.test(input.contentLanguage))
|
|
116
|
+
throw new Error("Érvénytelen data source tartalomnyelv.");
|
|
117
|
+
if (!Number.isInteger(input.fetchHour) || input.fetchHour < 0 || input.fetchHour > 23) {
|
|
118
|
+
throw new Error("A Merchant data source lekérési órája 0 és 23 közötti egész szám legyen.");
|
|
119
|
+
}
|
|
120
|
+
if (!input.timeZone.trim())
|
|
121
|
+
throw new Error("A Merchant data source időzónája kötelező.");
|
|
122
|
+
}
|
|
123
|
+
function isNotFound(error) {
|
|
124
|
+
return Boolean(error && typeof error === "object" && error.status === 404);
|
|
125
|
+
}
|
|
126
|
+
function required(env, key) {
|
|
127
|
+
const value = String(env[key] || "").trim();
|
|
128
|
+
if (!value)
|
|
129
|
+
throw new Error(`Hiányzó Google Merchant API beállítás: ${key}`);
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L2RhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLG9FQWdEQztBQTlFRCxpREFBd0Y7QUFFeEYsTUFBTSxpQkFBaUIsR0FBRyxtREFBbUQsQ0FBQTtBQTRCdEUsS0FBSyxVQUFVLDRCQUE0QixDQUFDLEtBQXdDO0lBQ3pGLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLDRCQUE0QixDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5RixhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLDJDQUE0QixFQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqRSxNQUFNLE1BQU0sR0FBRyxZQUFZLFNBQVMsRUFBRSxDQUFBO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVuQyxJQUFJLFVBQVUsR0FBRyxNQUFNLHlCQUF5QixDQUFDO1FBQy9DLFdBQVc7UUFDWCxNQUFNO1FBQ04sWUFBWSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsOEJBQThCO1FBQ3RELFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztLQUMvQixDQUFDLENBQUE7SUFDRixJQUFJLE1BQTZCLENBQUE7SUFFakMsSUFBSSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDckIsVUFBVSxHQUFHLE1BQU0sZUFBZSxDQUNoQyxHQUFHLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxJQUFJLGVBQWUsa0JBQWtCLENBQUMsZ0RBQWdELENBQUMsRUFBRSxFQUM1SCxXQUFXLEVBQ1gsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFP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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type GoogleMerchantApiEnv } from "./merchant-api";
|
|
2
|
+
export type MerchantAccountIssue = {
|
|
3
|
+
name: string;
|
|
4
|
+
title: string;
|
|
5
|
+
detail?: string;
|
|
6
|
+
severity?: string;
|
|
7
|
+
documentationUri?: string;
|
|
8
|
+
impactedDestinations: Array<Record<string, unknown>>;
|
|
9
|
+
};
|
|
10
|
+
export type MerchantProductIssue = {
|
|
11
|
+
productName: string;
|
|
12
|
+
offerId?: string;
|
|
13
|
+
title: string;
|
|
14
|
+
detail?: string;
|
|
15
|
+
severity?: string;
|
|
16
|
+
code?: string;
|
|
17
|
+
attribute?: string;
|
|
18
|
+
documentationUri?: string;
|
|
19
|
+
destination?: string;
|
|
20
|
+
resolution?: string;
|
|
21
|
+
};
|
|
22
|
+
export type GoogleMerchantDiagnostics = {
|
|
23
|
+
accountIssues: MerchantAccountIssue[];
|
|
24
|
+
productIssues: MerchantProductIssue[];
|
|
25
|
+
productsScanned: number;
|
|
26
|
+
generatedAt: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function getGoogleMerchantDiagnostics(env: GoogleMerchantApiEnv): Promise<{
|
|
29
|
+
accountIssues: MerchantAccountIssue[];
|
|
30
|
+
productIssues: MerchantProductIssue[];
|
|
31
|
+
productsScanned: number;
|
|
32
|
+
generatedAt: string;
|
|
33
|
+
}>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGoogleMerchantDiagnostics = getGoogleMerchantDiagnostics;
|
|
4
|
+
const merchant_api_1 = require("./merchant-api");
|
|
5
|
+
const MERCHANT_API_BASE = "https://merchantapi.googleapis.com";
|
|
6
|
+
async function getGoogleMerchantDiagnostics(env) {
|
|
7
|
+
const accountId = required(env, "GOOGLE_MERCHANT_ACCOUNT_ID").replace(/^accounts\//, "");
|
|
8
|
+
const accessToken = await (0, merchant_api_1.getGoogleMerchantAccessToken)(env);
|
|
9
|
+
const languageCode = normalizeLanguage(env.GOOGLE_MERCHANT_LOCALE);
|
|
10
|
+
const timeZone = env.GOOGLE_MERCHANT_DATA_SOURCE_TIME_ZONE?.trim() || "Europe/Budapest";
|
|
11
|
+
const [accountIssues, productResult] = await Promise.all([
|
|
12
|
+
listAccountIssues({ accountId, accessToken, languageCode, timeZone }),
|
|
13
|
+
listProductIssues({ accountId, accessToken }),
|
|
14
|
+
]);
|
|
15
|
+
return {
|
|
16
|
+
accountIssues,
|
|
17
|
+
productIssues: productResult.issues,
|
|
18
|
+
productsScanned: productResult.productsScanned,
|
|
19
|
+
generatedAt: new Date().toISOString(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function listAccountIssues(input) {
|
|
23
|
+
const out = [];
|
|
24
|
+
let pageToken = "";
|
|
25
|
+
do {
|
|
26
|
+
const url = new URL(`${MERCHANT_API_BASE}/accounts/v1/accounts/${encodeURIComponent(input.accountId)}/issues`);
|
|
27
|
+
url.searchParams.set("page_size", "1000");
|
|
28
|
+
url.searchParams.set("language_code", input.languageCode);
|
|
29
|
+
url.searchParams.set("time_zone.id", input.timeZone);
|
|
30
|
+
if (pageToken)
|
|
31
|
+
url.searchParams.set("page_token", pageToken);
|
|
32
|
+
const data = await merchantGet(url.toString(), input.accessToken);
|
|
33
|
+
const issues = Array.isArray(data.accountIssues) ? data.accountIssues : [];
|
|
34
|
+
for (const issue of issues) {
|
|
35
|
+
out.push({
|
|
36
|
+
name: String(issue?.name || ""),
|
|
37
|
+
title: String(issue?.title || issue?.name || "Merchant account issue"),
|
|
38
|
+
detail: stringValue(issue?.detail),
|
|
39
|
+
severity: stringValue(issue?.severity),
|
|
40
|
+
documentationUri: stringValue(issue?.documentationUri),
|
|
41
|
+
impactedDestinations: Array.isArray(issue?.impactedDestinations)
|
|
42
|
+
? issue.impactedDestinations
|
|
43
|
+
: [],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
pageToken = String(data.nextPageToken || "");
|
|
47
|
+
} while (pageToken);
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
async function listProductIssues(input) {
|
|
51
|
+
const issues = [];
|
|
52
|
+
let productsScanned = 0;
|
|
53
|
+
let pageToken = "";
|
|
54
|
+
do {
|
|
55
|
+
const url = new URL(`${MERCHANT_API_BASE}/products/v1/accounts/${encodeURIComponent(input.accountId)}/products`);
|
|
56
|
+
url.searchParams.set("pageSize", "250");
|
|
57
|
+
if (pageToken)
|
|
58
|
+
url.searchParams.set("pageToken", pageToken);
|
|
59
|
+
const data = await merchantGet(url.toString(), input.accessToken);
|
|
60
|
+
const products = Array.isArray(data.products) ? data.products : [];
|
|
61
|
+
productsScanned += products.length;
|
|
62
|
+
for (const product of products) {
|
|
63
|
+
const productName = String(product?.name || product?.productName || "");
|
|
64
|
+
const offerId = stringValue(product?.offerId || product?.productInput?.offerId || product?.offer_id);
|
|
65
|
+
const itemLevelIssues = Array.isArray(product?.productStatus?.itemLevelIssues)
|
|
66
|
+
? product.productStatus.itemLevelIssues
|
|
67
|
+
: Array.isArray(product?.itemLevelIssues)
|
|
68
|
+
? product.itemLevelIssues
|
|
69
|
+
: [];
|
|
70
|
+
for (const issue of itemLevelIssues) {
|
|
71
|
+
issues.push({
|
|
72
|
+
productName,
|
|
73
|
+
offerId,
|
|
74
|
+
title: String(issue?.description || issue?.detail || issue?.code || "Product issue"),
|
|
75
|
+
detail: stringValue(issue?.detail || issue?.description),
|
|
76
|
+
severity: stringValue(issue?.severity),
|
|
77
|
+
code: stringValue(issue?.code),
|
|
78
|
+
attribute: stringValue(issue?.attribute),
|
|
79
|
+
documentationUri: stringValue(issue?.documentationUri),
|
|
80
|
+
destination: stringValue(issue?.destination),
|
|
81
|
+
resolution: stringValue(issue?.resolution),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
pageToken = String(data.nextPageToken || "");
|
|
86
|
+
} while (pageToken);
|
|
87
|
+
return { issues, productsScanned };
|
|
88
|
+
}
|
|
89
|
+
async function merchantGet(url, accessToken) {
|
|
90
|
+
const response = await fetch(url, {
|
|
91
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
92
|
+
signal: AbortSignal.timeout(15000),
|
|
93
|
+
});
|
|
94
|
+
const data = (await response.json().catch(() => ({})));
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
throw new Error(data?.error?.message || `Merchant API hiba (${response.status}).`);
|
|
97
|
+
}
|
|
98
|
+
return data;
|
|
99
|
+
}
|
|
100
|
+
function normalizeLanguage(value) {
|
|
101
|
+
const raw = String(value || "hu-HU").trim();
|
|
102
|
+
return raw || "hu-HU";
|
|
103
|
+
}
|
|
104
|
+
function required(env, key) {
|
|
105
|
+
const value = String(env[key] || "").trim();
|
|
106
|
+
if (!value)
|
|
107
|
+
throw new Error(`Hiányzó Google Merchant API beállítás: ${key}`);
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
function stringValue(value) {
|
|
111
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L2RpYWdub3N0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUNBLG9FQWlCQztBQWxERCxpREFBd0Y7QUFFeEYsTUFBTSxpQkFBaUIsR0FBRyxvQ0FBb0MsQ0FBQTtBQStCdkQsS0FBSyxVQUFVLDRCQUE0QixDQUFDLEdBQXlCO0lBQzFFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSwyQ0FBNEIsRUFBQyxHQUFHLENBQUMsQ0FBQTtJQUMzRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUNsRSxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMscUNBQXFDLEVBQUUsSUFBSSxFQUFFLElBQUksaUJBQWlCLENBQUE7SUFFdkYsTUFBTSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkQsaUJBQWlCLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNyRSxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUM5QyxDQUFDLENBQUE7SUFFRixPQUFPO1FBQ0wsYUFBYTtRQUNiLGFBQWEsRUFBRSxhQUFhLENBQUMsTUFBTTtRQUNuQyxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7UUFDOUMsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO0tBQ0YsQ0FBQTtBQUN2QyxDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEtBS2hDO0lBQ0MsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQTtJQUN0QyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUE7SUFFbEIsR0FBRyxDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQ2pCLEdBQUcsaUJBQWlCLHlCQUF5QixrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDMUYsQ0FBQTtRQUNELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN6QyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3pELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEQsSUFBSSxTQUFTO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRTVELE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDakUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUMxRSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJLElBQUksd0JBQXdCLENBQUM7Z0JBQ3RFLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztnQkFDbEMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO2dCQUN0QyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDO2dCQUN0RCxvQkFBb0IsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQztvQkFDOUQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7b0JBQzVCLENBQUMsQ0FBQyxFQUFFO2FBQ1AsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDLFFBQVEsU0FBUyxFQUFDO0lBRW5CLE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQztBQUVELEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxLQUFpRDtJQUNoRixNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFBO0lBQ3pDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQTtJQUN2QixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUE7SUFFbEIsR0FBRyxDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQ2pCLEdBQUcsaUJBQWlCLHlCQUF5QixrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FDNUYsQ0FBQTtRQUNELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN2QyxJQUFJLFNBQVM7WUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNqRSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2xFLGVBQWUsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFBO1FBRWxDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUN2RSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQ3pCLE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FDeEUsQ0FBQTtZQUNELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUM7Z0JBQzVFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGVBQWU7Z0JBQ3ZDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZTtvQkFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUVSLEtBQUssTUFBTSxLQUFLLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsV0FBVztvQkFDWCxPQUFPO29CQUNQLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsSUFBSSxLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssRUFBRSxJQUFJLElBQUksZUFBZSxDQUFDO29CQUNwRixNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxFQUFFLFdBQVcsQ0FBQztvQkFDeEQsUUFBUSxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO29CQUN0QyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7b0JBQzlCLFNBQVMsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztvQkFDeEMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQztvQkFDdEQsV0FBVyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO29CQUM1QyxVQUFVLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7aUJBQzNDLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQzlDLENBQUMsUUFBUSxTQUFTLEVBQUM7SUFFbkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQTtBQUNwQyxDQUFDO0FBRUQsS0FBSyxVQUFVLFdBQVcsQ0FBQyxHQUFXLEVBQUUsV0FBbUI7SUFDekQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2hDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLFdBQVcsRUFBRSxFQUFFO1FBQ25ELE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQXdCLENBQUE7SUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHNCQUFzQixRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtJQUNwRixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxLQUFjO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDM0MsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFBO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUF5QixFQUFFLEdBQVc7SUFDdEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMzQyxJQUFJLENBQUMsS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDNUUsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQzdFLENBQUMifQ==
|
|
@@ -16,4 +16,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./config"), exports);
|
|
18
18
|
__exportStar(require("./feed"), exports);
|
|
19
|
-
|
|
19
|
+
__exportStar(require("./shipping"), exports);
|
|
20
|
+
__exportStar(require("./category-fields"), exports);
|
|
21
|
+
__exportStar(require("./merchant-api"), exports);
|
|
22
|
+
__exportStar(require("./data-source"), exports);
|
|
23
|
+
__exportStar(require("./diagnostics"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBd0I7QUFDeEIseUNBQXNCO0FBQ3RCLDZDQUEwQjtBQUMxQixvREFBaUM7QUFDakMsaURBQThCO0FBQzlCLGdEQUE2QjtBQUM3QixnREFBNkIifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const GOOGLE_MERCHANT_SCOPE = "https://www.googleapis.com/auth/content";
|
|
2
|
+
export type GoogleMerchantApiEnv = Record<string, string>;
|
|
3
|
+
export declare function buildGoogleMerchantAuthorizationUrl(env: GoogleMerchantApiEnv, state: string): string;
|
|
4
|
+
export declare function exchangeGoogleMerchantAuthorizationCode(env: GoogleMerchantApiEnv, code: string): Promise<{
|
|
5
|
+
access_token?: string;
|
|
6
|
+
refresh_token?: string;
|
|
7
|
+
error?: string;
|
|
8
|
+
error_description?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function getGoogleMerchantAccessToken(env: GoogleMerchantApiEnv): Promise<string>;
|
|
11
|
+
export declare function getGoogleMerchantAccount(env: GoogleMerchantApiEnv): Promise<Record<string, any>>;
|
|
12
|
+
export declare function createGoogleMerchantOAuthState(input: {
|
|
13
|
+
actorId?: string | null;
|
|
14
|
+
}): string;
|
|
15
|
+
export declare function verifyGoogleMerchantOAuthState(state: string): {
|
|
16
|
+
ts?: number;
|
|
17
|
+
actorId?: string | null;
|
|
18
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GOOGLE_MERCHANT_SCOPE = void 0;
|
|
4
|
+
exports.buildGoogleMerchantAuthorizationUrl = buildGoogleMerchantAuthorizationUrl;
|
|
5
|
+
exports.exchangeGoogleMerchantAuthorizationCode = exchangeGoogleMerchantAuthorizationCode;
|
|
6
|
+
exports.getGoogleMerchantAccessToken = getGoogleMerchantAccessToken;
|
|
7
|
+
exports.getGoogleMerchantAccount = getGoogleMerchantAccount;
|
|
8
|
+
exports.createGoogleMerchantOAuthState = createGoogleMerchantOAuthState;
|
|
9
|
+
exports.verifyGoogleMerchantOAuthState = verifyGoogleMerchantOAuthState;
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
exports.GOOGLE_MERCHANT_SCOPE = "https://www.googleapis.com/auth/content";
|
|
12
|
+
const GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
13
|
+
const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
14
|
+
const MERCHANT_API_BASE = "https://merchantapi.googleapis.com";
|
|
15
|
+
function buildGoogleMerchantAuthorizationUrl(env, state) {
|
|
16
|
+
const clientId = required(env, "GOOGLE_MERCHANT_API_CLIENT_ID");
|
|
17
|
+
const redirectUri = required(env, "GOOGLE_MERCHANT_API_REDIRECT_URI");
|
|
18
|
+
const url = new URL(GOOGLE_AUTH_URL);
|
|
19
|
+
url.searchParams.set("client_id", clientId);
|
|
20
|
+
url.searchParams.set("redirect_uri", redirectUri);
|
|
21
|
+
url.searchParams.set("response_type", "code");
|
|
22
|
+
url.searchParams.set("scope", exports.GOOGLE_MERCHANT_SCOPE);
|
|
23
|
+
url.searchParams.set("access_type", "offline");
|
|
24
|
+
url.searchParams.set("prompt", "consent");
|
|
25
|
+
url.searchParams.set("include_granted_scopes", "true");
|
|
26
|
+
url.searchParams.set("state", state);
|
|
27
|
+
return url.toString();
|
|
28
|
+
}
|
|
29
|
+
async function exchangeGoogleMerchantAuthorizationCode(env, code) {
|
|
30
|
+
const body = new URLSearchParams({
|
|
31
|
+
client_id: required(env, "GOOGLE_MERCHANT_API_CLIENT_ID"),
|
|
32
|
+
client_secret: required(env, "GOOGLE_MERCHANT_API_CLIENT_SECRET"),
|
|
33
|
+
redirect_uri: required(env, "GOOGLE_MERCHANT_API_REDIRECT_URI"),
|
|
34
|
+
code,
|
|
35
|
+
grant_type: "authorization_code",
|
|
36
|
+
});
|
|
37
|
+
const response = await fetch(GOOGLE_TOKEN_URL, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
40
|
+
body,
|
|
41
|
+
signal: AbortSignal.timeout(10000),
|
|
42
|
+
});
|
|
43
|
+
const data = (await response.json().catch(() => ({})));
|
|
44
|
+
if (!response.ok || !data.refresh_token) {
|
|
45
|
+
throw new Error(data.error_description || data.error || "A Google OAuth refresh token nem kérhető le.");
|
|
46
|
+
}
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
async function getGoogleMerchantAccessToken(env) {
|
|
50
|
+
const body = new URLSearchParams({
|
|
51
|
+
client_id: required(env, "GOOGLE_MERCHANT_API_CLIENT_ID"),
|
|
52
|
+
client_secret: required(env, "GOOGLE_MERCHANT_API_CLIENT_SECRET"),
|
|
53
|
+
refresh_token: required(env, "GOOGLE_MERCHANT_API_REFRESH_TOKEN"),
|
|
54
|
+
grant_type: "refresh_token",
|
|
55
|
+
});
|
|
56
|
+
const response = await fetch(GOOGLE_TOKEN_URL, {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
59
|
+
body,
|
|
60
|
+
signal: AbortSignal.timeout(10000),
|
|
61
|
+
});
|
|
62
|
+
const data = (await response.json().catch(() => ({})));
|
|
63
|
+
if (!response.ok || !data.access_token) {
|
|
64
|
+
throw new Error(data.error_description || data.error || "A Google OAuth access token nem kérhető le.");
|
|
65
|
+
}
|
|
66
|
+
return data.access_token;
|
|
67
|
+
}
|
|
68
|
+
async function getGoogleMerchantAccount(env) {
|
|
69
|
+
const accountId = required(env, "GOOGLE_MERCHANT_ACCOUNT_ID").replace(/^accounts\//, "");
|
|
70
|
+
const accessToken = await getGoogleMerchantAccessToken(env);
|
|
71
|
+
const response = await fetch(`${MERCHANT_API_BASE}/accounts/v1/accounts/${encodeURIComponent(accountId)}`, {
|
|
72
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
73
|
+
signal: AbortSignal.timeout(10000),
|
|
74
|
+
});
|
|
75
|
+
const data = (await response.json().catch(() => ({})));
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
throw new Error(data?.error?.message || `Merchant API hiba (${response.status}).`);
|
|
78
|
+
}
|
|
79
|
+
return data;
|
|
80
|
+
}
|
|
81
|
+
function createGoogleMerchantOAuthState(input) {
|
|
82
|
+
const secret = oauthStateSecret();
|
|
83
|
+
const payload = Buffer.from(JSON.stringify({ ts: Date.now(), actorId: input.actorId || null })).toString("base64url");
|
|
84
|
+
const signature = (0, node_crypto_1.createHmac)("sha256", secret).update(payload).digest("base64url");
|
|
85
|
+
return `${payload}.${signature}`;
|
|
86
|
+
}
|
|
87
|
+
function verifyGoogleMerchantOAuthState(state) {
|
|
88
|
+
const [payload, suppliedSignature] = state.split(".");
|
|
89
|
+
if (!payload || !suppliedSignature)
|
|
90
|
+
throw new Error("Érvénytelen OAuth state.");
|
|
91
|
+
const expected = (0, node_crypto_1.createHmac)("sha256", oauthStateSecret()).update(payload).digest();
|
|
92
|
+
let supplied;
|
|
93
|
+
try {
|
|
94
|
+
supplied = Buffer.from(suppliedSignature, "base64url");
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new Error("Érvénytelen OAuth state.");
|
|
98
|
+
}
|
|
99
|
+
if (expected.length !== supplied.length || !(0, node_crypto_1.timingSafeEqual)(expected, supplied)) {
|
|
100
|
+
throw new Error("Érvénytelen OAuth state aláírás.");
|
|
101
|
+
}
|
|
102
|
+
const parsed = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
|
|
103
|
+
if (!parsed.ts || Date.now() - parsed.ts > 10 * 60 * 1000) {
|
|
104
|
+
throw new Error("Az OAuth state lejárt.");
|
|
105
|
+
}
|
|
106
|
+
return parsed;
|
|
107
|
+
}
|
|
108
|
+
function required(env, key) {
|
|
109
|
+
const value = String(env[key] || "").trim();
|
|
110
|
+
if (!value)
|
|
111
|
+
throw new Error(`Hiányzó Google Merchant API beállítás: ${key}`);
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
function oauthStateSecret() {
|
|
115
|
+
const secret = String(process.env.COOKIE_SECRET || process.env.JWT_SECRET || "").trim();
|
|
116
|
+
if (!secret)
|
|
117
|
+
throw new Error("COOKIE_SECRET vagy JWT_SECRET szükséges a Google OAuth state aláírásához.");
|
|
118
|
+
return secret;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyY2hhbnQtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2R1bGVzL2dvb2dsZS1tZXJjaGFudC9tZXJjaGFudC1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0Esa0ZBYUM7QUFFRCwwRkE2QkM7QUFFRCxvRUF3QkM7QUFFRCw0REFpQkM7QUFFRCx3RUFPQztBQUVELHdFQXFCQztBQWxJRCw2Q0FBeUQ7QUFFNUMsUUFBQSxxQkFBcUIsR0FBRyx5Q0FBeUMsQ0FBQTtBQUM5RSxNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQTtBQUN0RSxNQUFNLGdCQUFnQixHQUFHLHFDQUFxQyxDQUFBO0FBQzlELE1BQU0saUJBQWlCLEdBQUcsb0NBQW9DLENBQUE7QUFJOUQsU0FBZ0IsbUNBQW1DLENBQUMsR0FBeUIsRUFBRSxLQUFhO0lBQzFGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUMsQ0FBQTtJQUMvRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLGtDQUFrQyxDQUFDLENBQUE7SUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDcEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNqRCxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDN0MsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDZCQUFxQixDQUFDLENBQUE7SUFDcEQsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQzlD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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type GoogleMerchantShippingConfig = {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
country: string;
|
|
4
|
+
service?: string;
|
|
5
|
+
price: string;
|
|
6
|
+
minHandlingTime?: number;
|
|
7
|
+
maxHandlingTime?: number;
|
|
8
|
+
minTransitTime?: number;
|
|
9
|
+
maxTransitTime?: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function applyGoogleMerchantShipping(container: {
|
|
12
|
+
resolve(name: string): unknown;
|
|
13
|
+
}, xml: string): Promise<string>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyGoogleMerchantShipping = applyGoogleMerchantShipping;
|
|
4
|
+
const integration_settings_1 = require("../../../modules/integration-settings");
|
|
5
|
+
async function applyGoogleMerchantShipping(container, xml) {
|
|
6
|
+
const store = container.resolve(integration_settings_1.INTEGRATION_SETTINGS_MODULE);
|
|
7
|
+
const resolved = await (0, integration_settings_1.resolvedIntegrationEnvironment)(store, "google-merchant");
|
|
8
|
+
const shipping = getShippingConfig(resolved.env);
|
|
9
|
+
if (!shipping.enabled)
|
|
10
|
+
return xml;
|
|
11
|
+
const fragment = buildShippingXml(shipping);
|
|
12
|
+
return xml.replaceAll("</item>", `${fragment}</item>`);
|
|
13
|
+
}
|
|
14
|
+
function getShippingConfig(env) {
|
|
15
|
+
const enabled = env.GOOGLE_MERCHANT_SHIPPING_ENABLED === "true";
|
|
16
|
+
const country = String(env.GOOGLE_MERCHANT_SHIPPING_COUNTRY ||
|
|
17
|
+
env.GOOGLE_MERCHANT_COUNTRY_CODE ||
|
|
18
|
+
process.env.STORE_DEFAULT_COUNTRY ||
|
|
19
|
+
"HU")
|
|
20
|
+
.trim()
|
|
21
|
+
.toUpperCase();
|
|
22
|
+
const currency = String(env.GOOGLE_MERCHANT_CURRENCY_CODE || process.env.STORE_DEFAULT_CURRENCY || "HUF")
|
|
23
|
+
.trim()
|
|
24
|
+
.toUpperCase();
|
|
25
|
+
const rawPrice = String(env.GOOGLE_MERCHANT_SHIPPING_PRICE || "").trim();
|
|
26
|
+
const service = String(env.GOOGLE_MERCHANT_SHIPPING_SERVICE || "").trim() || undefined;
|
|
27
|
+
if (!enabled) {
|
|
28
|
+
return { enabled: false, country, price: "" };
|
|
29
|
+
}
|
|
30
|
+
if (!/^[A-Z]{2}$/.test(country)) {
|
|
31
|
+
throw new Error("A Google Merchant szállítási célország kétbetűs ISO kód legyen, például HU.");
|
|
32
|
+
}
|
|
33
|
+
if (!/^[A-Z]{3}$/.test(currency)) {
|
|
34
|
+
throw new Error("A Google Merchant szállítás pénzneme hárombetűs ISO kód legyen, például HUF.");
|
|
35
|
+
}
|
|
36
|
+
const amount = Number(rawPrice.replace(",", "."));
|
|
37
|
+
if (!rawPrice || !Number.isFinite(amount) || amount < 0) {
|
|
38
|
+
throw new Error("Bekapcsolt Merchant szállításnál érvényes, nem negatív szállítási díj szükséges.");
|
|
39
|
+
}
|
|
40
|
+
const minHandlingTime = optionalNonNegativeInteger(env.GOOGLE_MERCHANT_MIN_HANDLING_TIME, "minimum kezelési idő");
|
|
41
|
+
const maxHandlingTime = optionalNonNegativeInteger(env.GOOGLE_MERCHANT_MAX_HANDLING_TIME, "maximum kezelési idő");
|
|
42
|
+
const minTransitTime = optionalNonNegativeInteger(env.GOOGLE_MERCHANT_MIN_TRANSIT_TIME, "minimum szállítási idő");
|
|
43
|
+
const maxTransitTime = optionalNonNegativeInteger(env.GOOGLE_MERCHANT_MAX_TRANSIT_TIME, "maximum szállítási idő");
|
|
44
|
+
if (minHandlingTime != null &&
|
|
45
|
+
maxHandlingTime != null &&
|
|
46
|
+
minHandlingTime > maxHandlingTime) {
|
|
47
|
+
throw new Error("A minimum kezelési idő nem lehet nagyobb a maximumnál.");
|
|
48
|
+
}
|
|
49
|
+
if (minTransitTime != null &&
|
|
50
|
+
maxTransitTime != null &&
|
|
51
|
+
minTransitTime > maxTransitTime) {
|
|
52
|
+
throw new Error("A minimum szállítási idő nem lehet nagyobb a maximumnál.");
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
enabled: true,
|
|
56
|
+
country,
|
|
57
|
+
service,
|
|
58
|
+
price: `${amount.toFixed(2)} ${currency}`,
|
|
59
|
+
minHandlingTime,
|
|
60
|
+
maxHandlingTime,
|
|
61
|
+
minTransitTime,
|
|
62
|
+
maxTransitTime,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function buildShippingXml(config) {
|
|
66
|
+
const optional = (name, value) => value === undefined || value === ""
|
|
67
|
+
? ""
|
|
68
|
+
: `<g:${name}>${xmlEscape(String(value))}</g:${name}>`;
|
|
69
|
+
return (`<g:shipping>` +
|
|
70
|
+
`<g:country>${xmlEscape(config.country)}</g:country>` +
|
|
71
|
+
optional("service", config.service) +
|
|
72
|
+
`<g:price>${xmlEscape(config.price)}</g:price>` +
|
|
73
|
+
optional("min_handling_time", config.minHandlingTime) +
|
|
74
|
+
optional("max_handling_time", config.maxHandlingTime) +
|
|
75
|
+
optional("min_transit_time", config.minTransitTime) +
|
|
76
|
+
optional("max_transit_time", config.maxTransitTime) +
|
|
77
|
+
`</g:shipping>`);
|
|
78
|
+
}
|
|
79
|
+
function optionalNonNegativeInteger(value, label) {
|
|
80
|
+
const raw = String(value || "").trim();
|
|
81
|
+
if (!raw)
|
|
82
|
+
return undefined;
|
|
83
|
+
const parsed = Number(raw);
|
|
84
|
+
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
85
|
+
throw new Error(`A Google Merchant ${label} csak nem negatív egész szám lehet.`);
|
|
86
|
+
}
|
|
87
|
+
return parsed;
|
|
88
|
+
}
|
|
89
|
+
function xmlEscape(value) {
|
|
90
|
+
return value
|
|
91
|
+
.replace(/&/g, "&")
|
|
92
|
+
.replace(/</g, "<")
|
|
93
|
+
.replace(/>/g, ">")
|
|
94
|
+
.replace(/"/g, """)
|
|
95
|
+
.replace(/'/g, "'");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L3NoaXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUJBLGtFQWNDO0FBL0JELGdGQUk4QztBQWF2QyxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLFNBQTZDLEVBQzdDLEdBQVc7SUFFWCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUM3QixrREFBMkIsQ0FDVyxDQUFBO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxxREFBOEIsRUFBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUMvRSxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFFakMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0MsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxHQUFHLFFBQVEsU0FBUyxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsR0FBMkI7SUFDcEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGdDQUFnQyxLQUFLLE1BQU0sQ0FBQTtJQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQ3BCLEdBQUcsQ0FBQyxnQ0FBZ0M7UUFDbEMsR0FBRyxDQUFDLDRCQUE0QjtRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtRQUNqQyxJQUFJLENBQ1A7U0FDRSxJQUFJLEVBQUU7U0FDTixXQUFXLEVBQUUsQ0FBQTtJQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQ3JCLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFz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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2R1bGVzL2dvb2dsZS10YWctbWFuYWdlci9hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLXRhZy1tYW5hZ2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbW9kdWxlcy9nb29nbGUtdGFnLW1hbmFnZXIvc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|