@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.
Files changed (183) hide show
  1. package/.medusa/server/src/admin/index.js +7481 -5872
  2. package/.medusa/server/src/admin/index.mjs +7482 -5873
  3. package/.medusa/server/src/api/admin/arukereso/marketplace-preview/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/arukereso/marketplace-preview/route.js +26 -0
  5. package/.medusa/server/src/api/admin/billingo/advance/route.d.ts +8 -0
  6. package/.medusa/server/src/api/admin/billingo/advance/route.js +55 -0
  7. package/.medusa/server/src/api/admin/billingo/partial-credit/route.d.ts +8 -0
  8. package/.medusa/server/src/api/admin/billingo/partial-credit/route.js +69 -0
  9. package/.medusa/server/src/api/admin/documents/[id]/route.d.ts +22 -0
  10. package/.medusa/server/src/api/admin/documents/[id]/route.js +107 -0
  11. package/.medusa/server/src/api/admin/documents/route.d.ts +21 -0
  12. package/.medusa/server/src/api/admin/documents/route.js +117 -0
  13. package/.medusa/server/src/api/admin/google-ads/diagnostics/route.d.ts +2 -0
  14. package/.medusa/server/src/api/admin/google-ads/diagnostics/route.js +26 -0
  15. package/.medusa/server/src/api/admin/google-ads/oauth/start/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/google-ads/oauth/start/route.js +27 -0
  17. package/.medusa/server/src/api/admin/google-merchant/data-source/sync/route.d.ts +2 -0
  18. package/.medusa/server/src/api/admin/google-merchant/data-source/sync/route.js +69 -0
  19. package/.medusa/server/src/api/admin/google-merchant/diagnostics/route.d.ts +2 -0
  20. package/.medusa/server/src/api/admin/google-merchant/diagnostics/route.js +26 -0
  21. package/.medusa/server/src/api/admin/google-merchant/oauth/start/route.d.ts +2 -0
  22. package/.medusa/server/src/api/admin/google-merchant/oauth/start/route.js +25 -0
  23. package/.medusa/server/src/api/admin/orders/[id]/shipping/route.js +28 -28
  24. package/.medusa/server/src/api/admin/shipping/mpl/close/route.d.ts +1 -1
  25. package/.medusa/server/src/api/admin/shipping/mpl/close/route.js +48 -70
  26. package/.medusa/server/src/api/auth/google-ads/callback/route.d.ts +2 -0
  27. package/.medusa/server/src/api/auth/google-ads/callback/route.js +58 -0
  28. package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.d.ts +2 -0
  29. package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.js +33 -0
  30. package/.medusa/server/src/api/feeds/google-merchant.xml/route.js +5 -3
  31. package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.d.ts +2 -0
  32. package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.js +211 -0
  33. package/.medusa/server/src/api/hooks/simplepay/ipn/route.js +113 -23
  34. package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.d.ts +2 -0
  35. package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.js +113 -0
  36. package/.medusa/server/src/api/store/arukereso/backlink/route.d.ts +2 -0
  37. package/.medusa/server/src/api/store/arukereso/backlink/route.js +73 -0
  38. package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.d.ts +2 -0
  39. package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.js +84 -0
  40. package/.medusa/server/src/api/store/arukereso/widget/route.d.ts +2 -0
  41. package/.medusa/server/src/api/store/arukereso/widget/route.js +64 -0
  42. package/.medusa/server/src/api/store/documents/route.d.ts +2 -0
  43. package/.medusa/server/src/api/store/documents/route.js +84 -0
  44. package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.d.ts +2 -0
  45. package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.js +50 -0
  46. package/.medusa/server/src/config.d.ts +3 -3
  47. package/.medusa/server/src/config.js +64 -87
  48. package/.medusa/server/src/core/documents.d.ts +31 -0
  49. package/.medusa/server/src/core/documents.js +47 -0
  50. package/.medusa/server/src/core/version.d.ts +2 -2
  51. package/.medusa/server/src/core/version.js +2 -2
  52. package/.medusa/server/src/lib/modules/arukereso/index.d.ts +1 -0
  53. package/.medusa/server/src/lib/modules/arukereso/index.js +2 -1
  54. package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.d.ts +19 -0
  55. package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.js +100 -0
  56. package/.medusa/server/src/lib/modules/billingo/actions.js +42 -12
  57. package/.medusa/server/src/lib/modules/billingo/advance.d.ts +68 -0
  58. package/.medusa/server/src/lib/modules/billingo/advance.js +309 -0
  59. package/.medusa/server/src/lib/modules/billingo/automation.js +49 -9
  60. package/.medusa/server/src/lib/modules/billingo/client.d.ts +5 -1
  61. package/.medusa/server/src/lib/modules/billingo/client.js +12 -6
  62. package/.medusa/server/src/lib/modules/billingo/index.d.ts +2 -0
  63. package/.medusa/server/src/lib/modules/billingo/index.js +3 -1
  64. package/.medusa/server/src/lib/modules/billingo/mapper.d.ts +38 -1
  65. package/.medusa/server/src/lib/modules/billingo/mapper.js +32 -1
  66. package/.medusa/server/src/lib/modules/billingo/partial-credit.d.ts +55 -0
  67. package/.medusa/server/src/lib/modules/billingo/partial-credit.js +338 -0
  68. package/.medusa/server/src/lib/modules/billingo/types.d.ts +7 -2
  69. package/.medusa/server/src/lib/modules/google-ads/adjustments.d.ts +21 -0
  70. package/.medusa/server/src/lib/modules/google-ads/adjustments.js +146 -0
  71. package/.medusa/server/src/lib/modules/google-ads/api.d.ts +23 -0
  72. package/.medusa/server/src/lib/modules/google-ads/api.js +171 -0
  73. package/.medusa/server/src/lib/modules/google-ads/diagnostics.d.ts +47 -0
  74. package/.medusa/server/src/lib/modules/google-ads/diagnostics.js +164 -0
  75. package/.medusa/server/src/lib/modules/google-merchant/category-fields.d.ts +7 -0
  76. package/.medusa/server/src/lib/modules/google-merchant/category-fields.js +210 -0
  77. package/.medusa/server/src/lib/modules/google-merchant/data-source.d.ts +17 -0
  78. package/.medusa/server/src/lib/modules/google-merchant/data-source.js +132 -0
  79. package/.medusa/server/src/lib/modules/google-merchant/diagnostics.d.ts +33 -0
  80. package/.medusa/server/src/lib/modules/google-merchant/diagnostics.js +113 -0
  81. package/.medusa/server/src/lib/modules/google-merchant/index.d.ts +5 -0
  82. package/.medusa/server/src/lib/modules/google-merchant/index.js +6 -1
  83. package/.medusa/server/src/lib/modules/google-merchant/merchant-api.d.ts +18 -0
  84. package/.medusa/server/src/lib/modules/google-merchant/merchant-api.js +120 -0
  85. package/.medusa/server/src/lib/modules/google-merchant/shipping.d.ts +13 -0
  86. package/.medusa/server/src/lib/modules/google-merchant/shipping.js +97 -0
  87. package/.medusa/server/src/lib/modules/google-tag-manager/api.d.ts +1 -0
  88. package/.medusa/server/src/lib/modules/google-tag-manager/api.js +3 -0
  89. package/.medusa/server/src/lib/modules/google-tag-manager/index.d.ts +1 -0
  90. package/.medusa/server/src/lib/modules/google-tag-manager/index.js +3 -0
  91. package/.medusa/server/src/lib/modules/google-tag-manager/sync.d.ts +1 -0
  92. package/.medusa/server/src/lib/modules/google-tag-manager/sync.js +3 -0
  93. package/.medusa/server/src/lib/modules/shipping/actions.js +163 -352
  94. package/.medusa/server/src/lib/modules/shipping/durable-create.d.ts +2 -1
  95. package/.medusa/server/src/lib/modules/shipping/durable-create.js +33 -5
  96. package/.medusa/server/src/lib/modules/shipping/idempotency.js +4 -2
  97. package/.medusa/server/src/lib/modules/shipping/types.d.ts +1 -1
  98. package/.medusa/server/src/modules/core-documents/index.d.ts +38 -0
  99. package/.medusa/server/src/modules/core-documents/index.js +18 -0
  100. package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.d.ts +5 -0
  101. package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.js +22 -0
  102. package/.medusa/server/src/modules/core-documents/models/core-document-assignment.d.ts +9 -0
  103. package/.medusa/server/src/modules/core-documents/models/core-document-assignment.js +18 -0
  104. package/.medusa/server/src/modules/core-documents/models/core-document.d.ts +18 -0
  105. package/.medusa/server/src/modules/core-documents/models/core-document.js +27 -0
  106. package/.medusa/server/src/modules/core-documents/service.d.ts +38 -0
  107. package/.medusa/server/src/modules/core-documents/service.js +13 -0
  108. package/.medusa/server/src/modules/integration-operation/state.d.ts +1 -0
  109. package/.medusa/server/src/modules/integration-operation/state.js +11 -50
  110. package/.medusa/server/src/modules/integration-operation/types.d.ts +1 -1
  111. package/.medusa/server/src/modules/integration-settings/arukereso-registration.js +19 -2
  112. package/.medusa/server/src/modules/integration-settings/connection-test.js +14 -1
  113. package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.d.ts +2 -0
  114. package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.js +49 -0
  115. package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.d.ts +1 -0
  116. package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.js +35 -0
  117. package/.medusa/server/src/modules/integration-settings/google-merchant-registration.js +23 -2
  118. package/.medusa/server/src/modules/integration-settings/hot-reload-registration.d.ts +1 -0
  119. package/.medusa/server/src/modules/integration-settings/hot-reload-registration.js +23 -0
  120. package/.medusa/server/src/modules/integration-settings/index.d.ts +4 -0
  121. package/.medusa/server/src/modules/integration-settings/index.js +5 -1
  122. package/.medusa/server/src/modules/integration-settings/manager.js +38 -4
  123. package/.medusa/server/src/modules/integration-settings/reloadable.d.ts +10 -0
  124. package/.medusa/server/src/modules/integration-settings/reloadable.js +58 -0
  125. package/.medusa/server/src/modules/integration-settings/runtime-snapshot.d.ts +9 -0
  126. package/.medusa/server/src/modules/integration-settings/runtime-snapshot.js +48 -3
  127. package/.medusa/server/src/modules/integration-settings/simplepay-registration.d.ts +1 -0
  128. package/.medusa/server/src/modules/integration-settings/simplepay-registration.js +18 -0
  129. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -5
  130. package/.medusa/server/src/providers/csomagpiac/client.d.ts +25 -0
  131. package/.medusa/server/src/providers/csomagpiac/client.js +144 -0
  132. package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.d.ts +45 -0
  133. package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.js +221 -0
  134. package/.medusa/server/src/providers/csomagpiac/index.d.ts +7 -0
  135. package/.medusa/server/src/providers/csomagpiac/index.js +30 -0
  136. package/.medusa/server/src/providers/csomagpiac/service.d.ts +46 -0
  137. package/.medusa/server/src/providers/csomagpiac/service.js +226 -0
  138. package/.medusa/server/src/providers/csomagpiac/types.d.ts +65 -0
  139. package/.medusa/server/src/providers/csomagpiac/types.js +27 -0
  140. package/.medusa/server/src/providers/dpd/fulfillment-provider.d.ts +2 -1
  141. package/.medusa/server/src/providers/dpd/fulfillment-provider.js +83 -25
  142. package/.medusa/server/src/providers/dpd/service.js +5 -3
  143. package/.medusa/server/src/providers/email/service.d.ts +7 -6
  144. package/.medusa/server/src/providers/email/service.js +51 -25
  145. package/.medusa/server/src/providers/foxpost/foxpost-service.js +5 -9
  146. package/.medusa/server/src/providers/foxpost/fulfillment-provider.d.ts +1 -0
  147. package/.medusa/server/src/providers/foxpost/fulfillment-provider.js +76 -66
  148. package/.medusa/server/src/providers/gls/fulfillment-provider.d.ts +1 -0
  149. package/.medusa/server/src/providers/gls/fulfillment-provider.js +76 -13
  150. package/.medusa/server/src/providers/gls/gls-service.d.ts +16 -0
  151. package/.medusa/server/src/providers/gls/gls-service.js +26 -65
  152. package/.medusa/server/src/providers/gls/types.d.ts +15 -0
  153. package/.medusa/server/src/providers/mpl/fulfillment-provider.d.ts +1 -0
  154. package/.medusa/server/src/providers/mpl/fulfillment-provider.js +61 -186
  155. package/.medusa/server/src/providers/mpl/index.d.ts +2 -0
  156. package/.medusa/server/src/providers/mpl/index.js +7 -2
  157. package/.medusa/server/src/providers/mpl/service.d.ts +35 -1
  158. package/.medusa/server/src/providers/mpl/service.js +82 -370
  159. package/.medusa/server/src/providers/mpl/types.d.ts +18 -0
  160. package/.medusa/server/src/providers/mpl/types.js +1 -1
  161. package/.medusa/server/src/providers/packeta/client.d.ts +2 -1
  162. package/.medusa/server/src/providers/packeta/client.js +24 -2
  163. package/.medusa/server/src/providers/packeta/fulfillment-provider.d.ts +1 -0
  164. package/.medusa/server/src/providers/packeta/fulfillment-provider.js +73 -5
  165. package/.medusa/server/src/providers/packeta/service.d.ts +1 -0
  166. package/.medusa/server/src/providers/packeta/service.js +85 -22
  167. package/.medusa/server/src/providers/packeta/types.d.ts +26 -0
  168. package/.medusa/server/src/providers/packeta/types.js +1 -1
  169. package/.medusa/server/src/providers/resilient-stripe/index.d.ts +19 -1
  170. package/.medusa/server/src/providers/resilient-stripe/index.js +55 -3
  171. package/.medusa/server/src/providers/simplepay/config.js +11 -1
  172. package/.medusa/server/src/providers/simplepay/index.d.ts +2 -0
  173. package/.medusa/server/src/providers/simplepay/index.js +5 -3
  174. package/.medusa/server/src/providers/simplepay/runtime-service.d.ts +13 -0
  175. package/.medusa/server/src/providers/simplepay/runtime-service.js +55 -0
  176. package/.medusa/server/src/providers/simplepay/service.d.ts +2 -0
  177. package/.medusa/server/src/providers/simplepay/service.js +40 -5
  178. package/.medusa/server/src/subscribers/google-ads-order-canceled.d.ts +7 -0
  179. package/.medusa/server/src/subscribers/google-ads-order-canceled.js +50 -0
  180. package/.medusa/server/src/subscribers/google-ads-payment-refunded.d.ts +7 -0
  181. package/.medusa/server/src/subscribers/google-ads-payment-refunded.js +181 -0
  182. package/.medusa/server/src/subscribers/simplepay-paid-order-recovery.js +14 -1
  183. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L2RpYWdub3N0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUNBLG9FQWlCQztBQWxERCxpREFBd0Y7QUFFeEYsTUFBTSxpQkFBaUIsR0FBRyxvQ0FBb0MsQ0FBQTtBQStCdkQsS0FBSyxVQUFVLDRCQUE0QixDQUFDLEdBQXlCO0lBQzFFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSwyQ0FBNEIsRUFBQyxHQUFHLENBQUMsQ0FBQTtJQUMzRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUNsRSxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMscUNBQXFDLEVBQUUsSUFBSSxFQUFFLElBQUksaUJBQWlCLENBQUE7SUFFdkYsTUFBTSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkQsaUJBQWlCLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNyRSxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUM5QyxDQUFDLENBQUE7SUFFRixPQUFPO1FBQ0wsYUFBYTtRQUNiLGFBQWEsRUFBRSxhQUFhLENBQUMsTUFBTTtRQUNuQyxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7UUFDOUMsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO0tBQ0YsQ0FBQTtBQUN2QyxDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFp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
@@ -1,2 +1,7 @@
1
1
  export * from "./config";
2
2
  export * from "./feed";
3
+ export * from "./shipping";
4
+ export * from "./category-fields";
5
+ export * from "./merchant-api";
6
+ export * from "./data-source";
7
+ export * from "./diagnostics";
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBd0I7QUFDeEIseUNBQXNCIn0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyY2hhbnQtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2R1bGVzL2dvb2dsZS1tZXJjaGFudC9tZXJjaGFudC1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0Esa0ZBYUM7QUFFRCwwRkE2QkM7QUFFRCxvRUF3QkM7QUFFRCw0REFpQkM7QUFFRCx3RUFPQztBQUVELHdFQXFCQztBQWxJRCw2Q0FBeUQ7QUFFNUMsUUFBQSxxQkFBcUIsR0FBRyx5Q0FBeUMsQ0FBQTtBQUM5RSxNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQTtBQUN0RSxNQUFNLGdCQUFnQixHQUFHLHFDQUFxQyxDQUFBO0FBQzlELE1BQU0saUJBQWlCLEdBQUcsb0NBQW9DLENBQUE7QUFJOUQsU0FBZ0IsbUNBQW1DLENBQUMsR0FBeUIsRUFBRSxLQUFhO0lBQzFGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUMsQ0FBQTtJQUMvRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLGtDQUFrQyxDQUFDLENBQUE7SUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDcEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNqRCxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDN0MsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDZCQUFxQixDQUFDLENBQUE7SUFDcEQsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQzlDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN6QyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN0RCxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDcEMsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDdkIsQ0FBQztBQUVNLEtBQUssVUFBVSx1Q0FBdUMsQ0FDM0QsR0FBeUIsRUFDekIsSUFBWTtJQUVaLE1BQU0sSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDO1FBQy9CLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLCtCQUErQixDQUFDO1FBQ3pELGFBQWEsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLG1DQUFtQyxDQUFDO1FBQ2pFLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLGtDQUFrQyxDQUFDO1FBQy9ELElBQUk7UUFDSixVQUFVLEVBQUUsb0JBQW9CO0tBQ2pDLENBQUMsQ0FBQTtJQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixFQUFFO1FBQzdDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLG1DQUFtQyxFQUFFO1FBQ2hFLElBQUk7UUFDSixNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7S0FDbkMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUtwRCxDQUFBO0lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYixJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSw4Q0FBOEMsQ0FDdkYsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFTSxLQUFLLFVBQVUsNEJBQTRCLENBQUMsR0FBeUI7SUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUM7UUFDL0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUM7UUFDekQsYUFBYSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUM7UUFDakUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUM7UUFDakUsVUFBVSxFQUFFLGVBQWU7S0FDNUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7UUFDN0MsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsbUNBQW1DLEVBQUU7UUFDaEUsSUFBSTtRQUNKLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDLENBQUE7SUFDRixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBSXBELENBQUE7SUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksS0FBSyxDQUNiLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLDZDQUE2QyxDQUN0RixDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtBQUMxQixDQUFDO0FBRU0sS0FBSyxVQUFVLHdCQUF3QixDQUFDLEdBQXlCO0lBQ3RFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLE1BQU0sV0FBVyxHQUFHLE1BQU0sNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQzFCLEdBQUcsaUJBQWlCLHlCQUF5QixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUM1RTtRQUNFLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLFdBQVcsRUFBRSxFQUFFO1FBQ25ELE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUNGLENBQUE7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQXdCLENBQUE7SUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHNCQUFzQixRQUFRLENBQUMsTUFBTSxJQUFJLENBQ2xFLENBQUE7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsU0FBZ0IsOEJBQThCLENBQUMsS0FBa0M7SUFDL0UsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQTtJQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUNuRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFBLHdCQUFVLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDbEYsT0FBTyxHQUFHLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQTtBQUNsQyxDQUFDO0FBRUQsU0FBZ0IsOEJBQThCLENBQUMsS0FBYTtJQUMxRCxNQUFNLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsaUJBQWlCO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQy9FLE1BQU0sUUFBUSxHQUFHLElBQUEsd0JBQVUsRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNsRixJQUFJLFFBQWdCLENBQUE7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFBLDZCQUFlLEVBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FHM0UsQ0FBQTtJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUF5QixFQUFFLEdBQVc7SUFDdEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMzQyxJQUFJLENBQUMsS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDNUUsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0I7SUFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3ZGLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFBO0lBQ3pHLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyJ9
@@ -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, "&amp;")
92
+ .replace(/</g, "&lt;")
93
+ .replace(/>/g, "&gt;")
94
+ .replace(/"/g, "&quot;")
95
+ .replace(/'/g, "&apos;");
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLW1lcmNoYW50L3NoaXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUJBLGtFQWNDO0FBL0JELGdGQUk4QztBQWF2QyxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLFNBQTZDLEVBQzdDLEdBQVc7SUFFWCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUM3QixrREFBMkIsQ0FDVyxDQUFBO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxxREFBOEIsRUFBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUMvRSxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFFakMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0MsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxHQUFHLFFBQVEsU0FBUyxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsR0FBMkI7SUFDcEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGdDQUFnQyxLQUFLLE1BQU0sQ0FBQTtJQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQ3BCLEdBQUcsQ0FBQyxnQ0FBZ0M7UUFDbEMsR0FBRyxDQUFDLDRCQUE0QjtRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtRQUNqQyxJQUFJLENBQ1A7U0FDRSxJQUFJLEVBQUU7U0FDTixXQUFXLEVBQUUsQ0FBQTtJQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQ3JCLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFz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
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2R1bGVzL2dvb2dsZS10YWctbWFuYWdlci9hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLXRhZy1tYW5hZ2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbW9kdWxlcy9nb29nbGUtdGFnLW1hbmFnZXIvc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=