@tagadapay/headless-sdk 1.2.0 → 1.3.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/dist/core/helpers/autocomplete.d.ts +89 -0
- package/dist/core/helpers/autocomplete.d.ts.map +1 -0
- package/dist/core/helpers/autocomplete.js +186 -0
- package/dist/core/helpers/autocomplete.js.map +1 -0
- package/dist/core/helpers/countries.d.ts +45 -0
- package/dist/core/helpers/countries.d.ts.map +1 -0
- package/dist/core/helpers/countries.js +65 -0
- package/dist/core/helpers/countries.js.map +1 -0
- package/dist/core/helpers/currency.d.ts +26 -0
- package/dist/core/helpers/currency.d.ts.map +1 -0
- package/dist/core/helpers/currency.js +72 -0
- package/dist/core/helpers/currency.js.map +1 -0
- package/dist/core/helpers/index.d.ts +5 -0
- package/dist/core/helpers/index.d.ts.map +1 -0
- package/dist/core/helpers/index.js +5 -0
- package/dist/core/helpers/index.js.map +1 -0
- package/dist/core/helpers/iso3166.d.ts +28 -0
- package/dist/core/helpers/iso3166.d.ts.map +1 -0
- package/dist/core/helpers/iso3166.js +84 -0
- package/dist/core/helpers/iso3166.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/react/hooks/useGoogleAutocomplete.d.ts +26 -0
- package/dist/react/hooks/useGoogleAutocomplete.d.ts.map +1 -0
- package/dist/react/hooks/useGoogleAutocomplete.js +70 -0
- package/dist/react/hooks/useGoogleAutocomplete.js.map +1 -0
- package/dist/react/hooks/useISOData.d.ts +23 -0
- package/dist/react/hooks/useISOData.d.ts.map +1 -0
- package/dist/react/hooks/useISOData.js +63 -0
- package/dist/react/hooks/useISOData.js.map +1 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +4 -0
- package/dist/react/index.js.map +1 -1
- package/dist/tagada-headless-react.min.js +2 -2
- package/dist/tagada-headless-react.min.js.map +4 -4
- package/dist/tagada-headless.js +470 -2
- package/dist/tagada-headless.min.js +2 -2
- package/dist/tagada-headless.min.js.map +4 -4
- package/package.json +1 -1
package/dist/tagada-headless.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @tagadapay/headless-sdk v1.
|
|
2
|
+
* @tagadapay/headless-sdk v1.3.0
|
|
3
3
|
* Headless checkout, payments, analytics, and CRM
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
@@ -43,11 +43,15 @@ var TagadaHeadlessBundle = (() => {
|
|
|
43
43
|
// src/core/index.ts
|
|
44
44
|
var core_exports = {};
|
|
45
45
|
__export(core_exports, {
|
|
46
|
+
AVAILABLE_LANGUAGES: () => AVAILABLE_LANGUAGES,
|
|
46
47
|
CatalogModule: () => CatalogModule,
|
|
47
48
|
CheckoutModule: () => CheckoutModule,
|
|
49
|
+
CurrencyUtils: () => CurrencyUtils,
|
|
48
50
|
CustomerModule: () => CustomerModule,
|
|
51
|
+
GoogleAutocompleteCore: () => GoogleAutocompleteCore,
|
|
49
52
|
HeadlessClient: () => HeadlessClient,
|
|
50
53
|
HttpClient: () => HttpClient,
|
|
54
|
+
ISODataCore: () => ISODataCore,
|
|
51
55
|
OffersModule: () => OffersModule,
|
|
52
56
|
PaymentModule: () => PaymentModule,
|
|
53
57
|
TagadaAuthError: () => TagadaAuthError,
|
|
@@ -57,7 +61,13 @@ var TagadaHeadlessBundle = (() => {
|
|
|
57
61
|
TagadaPaymentError: () => TagadaPaymentError,
|
|
58
62
|
TagadaRateLimitError: () => TagadaRateLimitError,
|
|
59
63
|
TagadaValidationError: () => TagadaValidationError,
|
|
60
|
-
createHeadlessClient: () => createHeadlessClient
|
|
64
|
+
createHeadlessClient: () => createHeadlessClient,
|
|
65
|
+
ensureGeoDataLoaded: () => ensureGeoDataLoaded,
|
|
66
|
+
formatMoney: () => formatMoney,
|
|
67
|
+
getCountries: () => getCountries,
|
|
68
|
+
getStatesForCountry: () => getStatesForCountry,
|
|
69
|
+
isLanguageLoaded: () => isLanguageLoaded,
|
|
70
|
+
loadGoogleMapsScript: () => loadGoogleMapsScript
|
|
61
71
|
});
|
|
62
72
|
|
|
63
73
|
// src/core/errors.ts
|
|
@@ -944,6 +954,464 @@ var TagadaHeadlessBundle = (() => {
|
|
|
944
954
|
function createHeadlessClient(config) {
|
|
945
955
|
return new HeadlessClient(config);
|
|
946
956
|
}
|
|
957
|
+
|
|
958
|
+
// src/core/helpers/autocomplete.ts
|
|
959
|
+
var scriptInjected = false;
|
|
960
|
+
var scriptReady = false;
|
|
961
|
+
var readyCallbacks = [];
|
|
962
|
+
function onScriptReady() {
|
|
963
|
+
scriptReady = true;
|
|
964
|
+
for (const cb of readyCallbacks)
|
|
965
|
+
cb();
|
|
966
|
+
readyCallbacks.length = 0;
|
|
967
|
+
}
|
|
968
|
+
function loadGoogleMapsScript(apiKey, opts = {}) {
|
|
969
|
+
var _a, _b;
|
|
970
|
+
if (scriptReady || ((_b = (_a = window.google) == null ? void 0 : _a.maps) == null ? void 0 : _b.places)) {
|
|
971
|
+
onScriptReady();
|
|
972
|
+
return Promise.resolve();
|
|
973
|
+
}
|
|
974
|
+
if (scriptInjected) {
|
|
975
|
+
return new Promise((resolve) => readyCallbacks.push(resolve));
|
|
976
|
+
}
|
|
977
|
+
scriptInjected = true;
|
|
978
|
+
return new Promise((resolve, reject) => {
|
|
979
|
+
readyCallbacks.push(resolve);
|
|
980
|
+
const existing = document.querySelector('script[src*="maps.googleapis.com"]');
|
|
981
|
+
if (existing) {
|
|
982
|
+
const poll = () => {
|
|
983
|
+
var _a2, _b2;
|
|
984
|
+
if ((_b2 = (_a2 = window.google) == null ? void 0 : _a2.maps) == null ? void 0 : _b2.places) {
|
|
985
|
+
onScriptReady();
|
|
986
|
+
} else {
|
|
987
|
+
setTimeout(poll, 100);
|
|
988
|
+
}
|
|
989
|
+
};
|
|
990
|
+
poll();
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
const params = new URLSearchParams({
|
|
994
|
+
key: apiKey,
|
|
995
|
+
libraries: "places",
|
|
996
|
+
v: opts.version ?? "weekly"
|
|
997
|
+
});
|
|
998
|
+
if (opts.language)
|
|
999
|
+
params.set("language", opts.language);
|
|
1000
|
+
if (opts.region)
|
|
1001
|
+
params.set("region", opts.region);
|
|
1002
|
+
const script = document.createElement("script");
|
|
1003
|
+
script.src = `https://maps.googleapis.com/maps/api/js?${params}`;
|
|
1004
|
+
script.async = true;
|
|
1005
|
+
script.defer = true;
|
|
1006
|
+
script.onload = () => onScriptReady();
|
|
1007
|
+
script.onerror = () => reject(new Error("Failed to load Google Maps script"));
|
|
1008
|
+
document.head.appendChild(script);
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
var GoogleAutocompleteCore = class _GoogleAutocompleteCore {
|
|
1012
|
+
/** Search for address predictions. */
|
|
1013
|
+
static async searchPlaces(input, options = {}) {
|
|
1014
|
+
var _a, _b;
|
|
1015
|
+
if (!((_b = (_a = window.google) == null ? void 0 : _a.maps) == null ? void 0 : _b.places) || !input.trim())
|
|
1016
|
+
return [];
|
|
1017
|
+
const service = new window.google.maps.places.AutocompleteService();
|
|
1018
|
+
return new Promise((resolve) => {
|
|
1019
|
+
service.getPlacePredictions(
|
|
1020
|
+
{ input, types: options.types ?? ["address"], componentRestrictions: options.componentRestrictions },
|
|
1021
|
+
(predictions, status) => {
|
|
1022
|
+
var _a2, _b2, _c;
|
|
1023
|
+
resolve(status === ((_c = (_b2 = (_a2 = window.google) == null ? void 0 : _a2.maps) == null ? void 0 : _b2.places) == null ? void 0 : _c.PlacesServiceStatus.OK) && predictions ? predictions : []);
|
|
1024
|
+
}
|
|
1025
|
+
);
|
|
1026
|
+
});
|
|
1027
|
+
}
|
|
1028
|
+
/** Get full place details by place_id. */
|
|
1029
|
+
static async getPlaceDetails(placeId) {
|
|
1030
|
+
var _a, _b;
|
|
1031
|
+
if (!((_b = (_a = window.google) == null ? void 0 : _a.maps) == null ? void 0 : _b.places))
|
|
1032
|
+
return null;
|
|
1033
|
+
const svc = new window.google.maps.places.PlacesService(document.createElement("div"));
|
|
1034
|
+
return new Promise((resolve) => {
|
|
1035
|
+
svc.getDetails(
|
|
1036
|
+
{ placeId, fields: ["place_id", "formatted_address", "address_components", "geometry"] },
|
|
1037
|
+
(place, status) => {
|
|
1038
|
+
var _a2, _b2, _c;
|
|
1039
|
+
resolve(status === ((_c = (_b2 = (_a2 = window.google) == null ? void 0 : _a2.maps) == null ? void 0 : _b2.places) == null ? void 0 : _c.PlacesServiceStatus.OK) && place ? place : null);
|
|
1040
|
+
}
|
|
1041
|
+
);
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
/** Extract structured address fields from a Google PlaceDetails result. */
|
|
1045
|
+
static extractAddressComponents(place) {
|
|
1046
|
+
const out = {
|
|
1047
|
+
subpremise: "",
|
|
1048
|
+
streetNumber: "",
|
|
1049
|
+
route: "",
|
|
1050
|
+
locality: "",
|
|
1051
|
+
administrativeAreaLevel1: "",
|
|
1052
|
+
administrativeAreaLevel1Long: "",
|
|
1053
|
+
administrativeAreaLevel2: "",
|
|
1054
|
+
administrativeAreaLevel2Long: "",
|
|
1055
|
+
country: "",
|
|
1056
|
+
postalCode: "",
|
|
1057
|
+
fullStreetAddress: ""
|
|
1058
|
+
};
|
|
1059
|
+
let premise = "";
|
|
1060
|
+
let neighborhood = "";
|
|
1061
|
+
let sublocality5 = "", sublocality4 = "", sublocality3 = "", sublocality2 = "", sublocality1 = "";
|
|
1062
|
+
let postalTown = "";
|
|
1063
|
+
for (const c of place.address_components ?? []) {
|
|
1064
|
+
const t = c.types;
|
|
1065
|
+
if (t.includes("subpremise"))
|
|
1066
|
+
out.subpremise = c.long_name;
|
|
1067
|
+
if (t.includes("street_number"))
|
|
1068
|
+
out.streetNumber = c.long_name;
|
|
1069
|
+
if (t.includes("premise"))
|
|
1070
|
+
premise = c.long_name;
|
|
1071
|
+
if (t.includes("route"))
|
|
1072
|
+
out.route = c.long_name;
|
|
1073
|
+
if (t.includes("neighborhood"))
|
|
1074
|
+
neighborhood = c.long_name;
|
|
1075
|
+
if (t.includes("sublocality_level_5"))
|
|
1076
|
+
sublocality5 = c.long_name;
|
|
1077
|
+
if (t.includes("sublocality_level_4"))
|
|
1078
|
+
sublocality4 = c.long_name;
|
|
1079
|
+
if (t.includes("sublocality_level_3"))
|
|
1080
|
+
sublocality3 = c.long_name;
|
|
1081
|
+
if (t.includes("sublocality_level_2"))
|
|
1082
|
+
sublocality2 = c.long_name;
|
|
1083
|
+
if (t.includes("sublocality_level_1"))
|
|
1084
|
+
sublocality1 = c.long_name;
|
|
1085
|
+
if (t.includes("locality"))
|
|
1086
|
+
out.locality = c.long_name;
|
|
1087
|
+
if (t.includes("postal_town"))
|
|
1088
|
+
postalTown = c.long_name;
|
|
1089
|
+
if (t.includes("administrative_area_level_2")) {
|
|
1090
|
+
out.administrativeAreaLevel2 = c.short_name;
|
|
1091
|
+
out.administrativeAreaLevel2Long = c.long_name;
|
|
1092
|
+
}
|
|
1093
|
+
if (t.includes("administrative_area_level_1")) {
|
|
1094
|
+
out.administrativeAreaLevel1 = c.short_name;
|
|
1095
|
+
out.administrativeAreaLevel1Long = c.long_name;
|
|
1096
|
+
}
|
|
1097
|
+
if (t.includes("country"))
|
|
1098
|
+
out.country = c.short_name;
|
|
1099
|
+
if (t.includes("postal_code"))
|
|
1100
|
+
out.postalCode = c.long_name;
|
|
1101
|
+
}
|
|
1102
|
+
if (!out.locality)
|
|
1103
|
+
out.locality = postalTown || sublocality2 || sublocality1 || "";
|
|
1104
|
+
if (!out.administrativeAreaLevel1 && out.administrativeAreaLevel2) {
|
|
1105
|
+
out.administrativeAreaLevel1 = out.administrativeAreaLevel2Long || out.administrativeAreaLevel2;
|
|
1106
|
+
out.administrativeAreaLevel1Long = out.administrativeAreaLevel2Long;
|
|
1107
|
+
}
|
|
1108
|
+
const buildingNumber = out.streetNumber || premise;
|
|
1109
|
+
const streetName = out.route || sublocality5 || sublocality4 || sublocality3 || neighborhood;
|
|
1110
|
+
if (out.subpremise && buildingNumber && streetName) {
|
|
1111
|
+
out.fullStreetAddress = `${out.subpremise}/${buildingNumber} ${streetName}`;
|
|
1112
|
+
} else if (buildingNumber && streetName) {
|
|
1113
|
+
if (premise && sublocality4 && sublocality3) {
|
|
1114
|
+
let addr = `${sublocality3}-${sublocality4}-${premise}`;
|
|
1115
|
+
if (sublocality2)
|
|
1116
|
+
addr = `${addr} ${sublocality2}`;
|
|
1117
|
+
out.fullStreetAddress = addr;
|
|
1118
|
+
} else {
|
|
1119
|
+
out.fullStreetAddress = `${buildingNumber} ${streetName}`;
|
|
1120
|
+
}
|
|
1121
|
+
} else if (streetName) {
|
|
1122
|
+
out.fullStreetAddress = streetName;
|
|
1123
|
+
} else if (buildingNumber) {
|
|
1124
|
+
out.fullStreetAddress = buildingNumber;
|
|
1125
|
+
}
|
|
1126
|
+
out.fullStreetAddress = out.fullStreetAddress.trim();
|
|
1127
|
+
return out;
|
|
1128
|
+
}
|
|
1129
|
+
/** Shorthand: extract into the flat shape used by address forms. */
|
|
1130
|
+
static extractFormattedAddress(place) {
|
|
1131
|
+
const a = _GoogleAutocompleteCore.extractAddressComponents(place);
|
|
1132
|
+
return {
|
|
1133
|
+
address1: a.fullStreetAddress,
|
|
1134
|
+
city: a.locality,
|
|
1135
|
+
country: a.country,
|
|
1136
|
+
state: a.administrativeAreaLevel1,
|
|
1137
|
+
postal: a.postalCode
|
|
1138
|
+
};
|
|
1139
|
+
}
|
|
1140
|
+
};
|
|
1141
|
+
|
|
1142
|
+
// src/core/helpers/iso3166.ts
|
|
1143
|
+
var GEODATA_CDN_BASE = "https://cvwnizdbugpz6jwk.public.blob.vercel-storage.com/geodata/v1";
|
|
1144
|
+
var AVAILABLE_LANGUAGES = ["en", "ru", "de", "da", "fr", "es", "zh", "hi", "pt", "ja", "ar", "it", "he"];
|
|
1145
|
+
var countriesCache = /* @__PURE__ */ new Map();
|
|
1146
|
+
var regionsCache = /* @__PURE__ */ new Map();
|
|
1147
|
+
var inflightCountries = /* @__PURE__ */ new Map();
|
|
1148
|
+
var inflightRegions = /* @__PURE__ */ new Map();
|
|
1149
|
+
async function fetchCountriesRaw(language) {
|
|
1150
|
+
const cached = countriesCache.get(language);
|
|
1151
|
+
if (cached)
|
|
1152
|
+
return cached;
|
|
1153
|
+
let inflight = inflightCountries.get(language);
|
|
1154
|
+
if (inflight)
|
|
1155
|
+
return inflight;
|
|
1156
|
+
inflight = (async () => {
|
|
1157
|
+
const url = `${GEODATA_CDN_BASE}/${language}/countries.json`;
|
|
1158
|
+
const res = await fetch(url);
|
|
1159
|
+
if (!res.ok)
|
|
1160
|
+
throw new Error(`Geodata fetch failed: ${url} (${res.status})`);
|
|
1161
|
+
const data = await res.json();
|
|
1162
|
+
countriesCache.set(language, data);
|
|
1163
|
+
inflightCountries.delete(language);
|
|
1164
|
+
return data;
|
|
1165
|
+
})();
|
|
1166
|
+
inflightCountries.set(language, inflight);
|
|
1167
|
+
return inflight;
|
|
1168
|
+
}
|
|
1169
|
+
async function fetchRegionsRaw(language) {
|
|
1170
|
+
const cached = regionsCache.get(language);
|
|
1171
|
+
if (cached)
|
|
1172
|
+
return cached;
|
|
1173
|
+
let inflight = inflightRegions.get(language);
|
|
1174
|
+
if (inflight)
|
|
1175
|
+
return inflight;
|
|
1176
|
+
inflight = (async () => {
|
|
1177
|
+
const url = `${GEODATA_CDN_BASE}/${language}/regions.json`;
|
|
1178
|
+
const res = await fetch(url);
|
|
1179
|
+
if (!res.ok)
|
|
1180
|
+
throw new Error(`Geodata fetch failed: ${url} (${res.status})`);
|
|
1181
|
+
const data = await res.json();
|
|
1182
|
+
regionsCache.set(language, data);
|
|
1183
|
+
inflightRegions.delete(language);
|
|
1184
|
+
return data;
|
|
1185
|
+
})();
|
|
1186
|
+
inflightRegions.set(language, inflight);
|
|
1187
|
+
return inflight;
|
|
1188
|
+
}
|
|
1189
|
+
function getCountriesCached(language) {
|
|
1190
|
+
return countriesCache.get(language) || countriesCache.get("en") || {};
|
|
1191
|
+
}
|
|
1192
|
+
function getRegionsCached(language) {
|
|
1193
|
+
return regionsCache.get(language) || regionsCache.get("en") || {};
|
|
1194
|
+
}
|
|
1195
|
+
async function ensureGeoDataLoaded(language = "en") {
|
|
1196
|
+
await Promise.all([fetchCountriesRaw(language), fetchRegionsRaw(language)]);
|
|
1197
|
+
}
|
|
1198
|
+
var getCountries = (language = "en") => {
|
|
1199
|
+
const raw = getCountriesCached(language);
|
|
1200
|
+
return Object.entries(raw).map(([code, c]) => ({ code, name: c.n, iso3: c.i3, numeric: c.nu })).sort((a, b) => a.name.localeCompare(b.name));
|
|
1201
|
+
};
|
|
1202
|
+
var getStatesForCountry = (countryCode, language = "en") => {
|
|
1203
|
+
const raw = getRegionsCached(language);
|
|
1204
|
+
const tuples = raw[countryCode];
|
|
1205
|
+
if (!tuples)
|
|
1206
|
+
return [];
|
|
1207
|
+
return tuples.map(([iso, name]) => ({ code: iso, name, countryCode })).sort((a, b) => a.name.localeCompare(b.name));
|
|
1208
|
+
};
|
|
1209
|
+
function isLanguageLoaded(language) {
|
|
1210
|
+
return countriesCache.has(language);
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
// src/core/helpers/countries.ts
|
|
1214
|
+
var ISODataCore = class _ISODataCore {
|
|
1215
|
+
/** Fetch countries + regions from CDN for a language. Call before sync getters. */
|
|
1216
|
+
static ensureLoaded(language = "en") {
|
|
1217
|
+
return ensureGeoDataLoaded(language);
|
|
1218
|
+
}
|
|
1219
|
+
/** Get all countries as a Record keyed by ISO code. */
|
|
1220
|
+
static getCountries(language = "en") {
|
|
1221
|
+
const arr = getCountries(language);
|
|
1222
|
+
const result = {};
|
|
1223
|
+
for (const c of arr) {
|
|
1224
|
+
result[c.code] = { iso: c.code, iso3: c.iso3 ?? "", numeric: c.numeric ?? 0, name: c.name };
|
|
1225
|
+
}
|
|
1226
|
+
return result;
|
|
1227
|
+
}
|
|
1228
|
+
/** Get all countries as a sorted array of { value, label } for select inputs. */
|
|
1229
|
+
static getCountryOptions(language = "en") {
|
|
1230
|
+
return getCountries(language).map((c) => ({ value: c.code, label: c.name }));
|
|
1231
|
+
}
|
|
1232
|
+
/** Get regions/states for a country. */
|
|
1233
|
+
static getRegions(countryCode, language = "en") {
|
|
1234
|
+
return getStatesForCountry(countryCode, language).map((s) => ({ iso: s.code, name: s.name }));
|
|
1235
|
+
}
|
|
1236
|
+
/** Get regions as a sorted array of { value, label } for select inputs. */
|
|
1237
|
+
static getRegionOptions(countryCode, language = "en") {
|
|
1238
|
+
return _ISODataCore.getRegions(countryCode, language).map((r) => ({ value: r.iso, label: r.name }));
|
|
1239
|
+
}
|
|
1240
|
+
/** Find a specific region by ISO code. */
|
|
1241
|
+
static findRegion(countryCode, regionCode, language = "en") {
|
|
1242
|
+
return _ISODataCore.getRegions(countryCode, language).find((r) => r.iso === regionCode) ?? null;
|
|
1243
|
+
}
|
|
1244
|
+
/**
|
|
1245
|
+
* Map a Google Places administrative_area to an ISO region.
|
|
1246
|
+
* Tries exact ISO match, then name match, then partial match.
|
|
1247
|
+
*/
|
|
1248
|
+
static mapGoogleToISO(googleState, googleStateLong, countryCode, language = "en") {
|
|
1249
|
+
const regions = _ISODataCore.getRegions(countryCode, language);
|
|
1250
|
+
if (regions.length === 0)
|
|
1251
|
+
return null;
|
|
1252
|
+
let match = regions.find((r) => r.iso === googleState);
|
|
1253
|
+
if (match)
|
|
1254
|
+
return match;
|
|
1255
|
+
match = regions.find((r) => r.name.toLowerCase() === googleState.toLowerCase());
|
|
1256
|
+
if (match)
|
|
1257
|
+
return match;
|
|
1258
|
+
match = regions.find((r) => r.name.toLowerCase() === googleStateLong.toLowerCase());
|
|
1259
|
+
if (match)
|
|
1260
|
+
return match;
|
|
1261
|
+
match = regions.find(
|
|
1262
|
+
(r) => r.name.toLowerCase().includes(googleStateLong.toLowerCase()) || googleStateLong.toLowerCase().includes(r.name.toLowerCase())
|
|
1263
|
+
);
|
|
1264
|
+
return match ?? null;
|
|
1265
|
+
}
|
|
1266
|
+
static isLanguageLoaded(language) {
|
|
1267
|
+
return isLanguageLoaded(language);
|
|
1268
|
+
}
|
|
1269
|
+
static getAvailableLanguages() {
|
|
1270
|
+
return AVAILABLE_LANGUAGES;
|
|
1271
|
+
}
|
|
1272
|
+
};
|
|
1273
|
+
|
|
1274
|
+
// src/core/helpers/currency.ts
|
|
1275
|
+
var SYMBOLS = {
|
|
1276
|
+
USD: "$",
|
|
1277
|
+
EUR: "\u20AC",
|
|
1278
|
+
GBP: "\xA3",
|
|
1279
|
+
JPY: "\xA5",
|
|
1280
|
+
CAD: "C$",
|
|
1281
|
+
AUD: "A$",
|
|
1282
|
+
CHF: "CHF",
|
|
1283
|
+
CNY: "\xA5",
|
|
1284
|
+
SEK: "kr",
|
|
1285
|
+
NOK: "kr",
|
|
1286
|
+
DKK: "kr",
|
|
1287
|
+
PLN: "z\u0142",
|
|
1288
|
+
CZK: "K\u010D",
|
|
1289
|
+
HUF: "Ft",
|
|
1290
|
+
RON: "lei",
|
|
1291
|
+
BGN: "\u043B\u0432",
|
|
1292
|
+
HRK: "kn",
|
|
1293
|
+
RUB: "\u20BD",
|
|
1294
|
+
UAH: "\u20B4",
|
|
1295
|
+
TRY: "\u20BA",
|
|
1296
|
+
BRL: "R$",
|
|
1297
|
+
MXN: "$",
|
|
1298
|
+
ZAR: "R",
|
|
1299
|
+
INR: "\u20B9",
|
|
1300
|
+
KRW: "\u20A9",
|
|
1301
|
+
THB: "\u0E3F",
|
|
1302
|
+
VND: "\u20AB",
|
|
1303
|
+
IDR: "Rp",
|
|
1304
|
+
MYR: "RM",
|
|
1305
|
+
SGD: "S$",
|
|
1306
|
+
PHP: "\u20B1",
|
|
1307
|
+
TWD: "NT$",
|
|
1308
|
+
HKD: "HK$",
|
|
1309
|
+
ILS: "\u20AA",
|
|
1310
|
+
AED: "\u062F.\u0625",
|
|
1311
|
+
SAR: "\u0631.\u0633",
|
|
1312
|
+
QAR: "\u0631.\u0642",
|
|
1313
|
+
KWD: "\u062F.\u0643",
|
|
1314
|
+
BHD: "\u062F.\u0628",
|
|
1315
|
+
OMR: "\u0631.\u0639.",
|
|
1316
|
+
EGP: "\xA3",
|
|
1317
|
+
NGN: "\u20A6",
|
|
1318
|
+
KES: "KSh",
|
|
1319
|
+
GHS: "\u20B5",
|
|
1320
|
+
COP: "$",
|
|
1321
|
+
ARS: "$",
|
|
1322
|
+
CLP: "$",
|
|
1323
|
+
PEN: "S/",
|
|
1324
|
+
CRC: "\u20A1",
|
|
1325
|
+
DOP: "RD$",
|
|
1326
|
+
JMD: "J$",
|
|
1327
|
+
BOB: "Bs",
|
|
1328
|
+
PYG: "\u20B2",
|
|
1329
|
+
GTQ: "Q",
|
|
1330
|
+
NIO: "C$",
|
|
1331
|
+
PAB: "B/.",
|
|
1332
|
+
PKR: "\u20A8",
|
|
1333
|
+
BDT: "\u09F3",
|
|
1334
|
+
LKR: "\u20A8",
|
|
1335
|
+
NPR: "\u20A8",
|
|
1336
|
+
GEL: "\u20BE",
|
|
1337
|
+
AMD: "\u058F",
|
|
1338
|
+
AZN: "\u20BC",
|
|
1339
|
+
KZT: "\u20B8"
|
|
1340
|
+
};
|
|
1341
|
+
var NAMES = {
|
|
1342
|
+
USD: "US Dollar",
|
|
1343
|
+
EUR: "Euro",
|
|
1344
|
+
GBP: "British Pound",
|
|
1345
|
+
JPY: "Japanese Yen",
|
|
1346
|
+
CAD: "Canadian Dollar",
|
|
1347
|
+
AUD: "Australian Dollar",
|
|
1348
|
+
CHF: "Swiss Franc",
|
|
1349
|
+
CNY: "Chinese Yuan",
|
|
1350
|
+
SEK: "Swedish Krona",
|
|
1351
|
+
NOK: "Norwegian Krone",
|
|
1352
|
+
DKK: "Danish Krone",
|
|
1353
|
+
PLN: "Polish Zloty",
|
|
1354
|
+
CZK: "Czech Koruna",
|
|
1355
|
+
HUF: "Hungarian Forint",
|
|
1356
|
+
BRL: "Brazilian Real",
|
|
1357
|
+
MXN: "Mexican Peso",
|
|
1358
|
+
INR: "Indian Rupee",
|
|
1359
|
+
KRW: "South Korean Won",
|
|
1360
|
+
THB: "Thai Baht",
|
|
1361
|
+
SGD: "Singapore Dollar",
|
|
1362
|
+
HKD: "Hong Kong Dollar",
|
|
1363
|
+
TWD: "Taiwan Dollar",
|
|
1364
|
+
ILS: "Israeli Shekel",
|
|
1365
|
+
AED: "UAE Dirham",
|
|
1366
|
+
SAR: "Saudi Riyal",
|
|
1367
|
+
ZAR: "South African Rand",
|
|
1368
|
+
TRY: "Turkish Lira",
|
|
1369
|
+
RUB: "Russian Ruble",
|
|
1370
|
+
NGN: "Nigerian Naira"
|
|
1371
|
+
};
|
|
1372
|
+
var ZERO_DECIMAL = /* @__PURE__ */ new Set([
|
|
1373
|
+
"JPY",
|
|
1374
|
+
"KRW",
|
|
1375
|
+
"VND",
|
|
1376
|
+
"IDR",
|
|
1377
|
+
"LAK",
|
|
1378
|
+
"KHR",
|
|
1379
|
+
"MMK",
|
|
1380
|
+
"PYG"
|
|
1381
|
+
]);
|
|
1382
|
+
var CurrencyUtils = class _CurrencyUtils {
|
|
1383
|
+
static getSymbol(code) {
|
|
1384
|
+
return SYMBOLS[code] ?? code;
|
|
1385
|
+
}
|
|
1386
|
+
static getName(code) {
|
|
1387
|
+
return NAMES[code] ?? code;
|
|
1388
|
+
}
|
|
1389
|
+
static getDecimalPlaces(code) {
|
|
1390
|
+
return ZERO_DECIMAL.has(code) ? 0 : 2;
|
|
1391
|
+
}
|
|
1392
|
+
static getCurrency(code) {
|
|
1393
|
+
return {
|
|
1394
|
+
code,
|
|
1395
|
+
symbol: _CurrencyUtils.getSymbol(code),
|
|
1396
|
+
name: _CurrencyUtils.getName(code),
|
|
1397
|
+
decimalPlaces: _CurrencyUtils.getDecimalPlaces(code)
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
};
|
|
1401
|
+
function formatMoney(amountMinorUnits, currencyCode = "USD", locale = "en-US") {
|
|
1402
|
+
const decimals = CurrencyUtils.getDecimalPlaces(currencyCode);
|
|
1403
|
+
const value = amountMinorUnits / (decimals === 0 ? 100 : Math.pow(10, decimals));
|
|
1404
|
+
try {
|
|
1405
|
+
return new Intl.NumberFormat(locale, {
|
|
1406
|
+
style: "currency",
|
|
1407
|
+
currency: currencyCode,
|
|
1408
|
+
minimumFractionDigits: decimals,
|
|
1409
|
+
maximumFractionDigits: decimals
|
|
1410
|
+
}).format(value);
|
|
1411
|
+
} catch {
|
|
1412
|
+
return `${CurrencyUtils.getSymbol(currencyCode)}${value.toFixed(decimals)}`;
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
947
1415
|
return __toCommonJS(core_exports);
|
|
948
1416
|
})();
|
|
949
1417
|
if(typeof window!=="undefined"&&TagadaHeadlessBundle){ window.TagadaHeadless=TagadaHeadlessBundle; window.TagadaHeadless.create=TagadaHeadlessBundle.createHeadlessClient;}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @tagadapay/headless-sdk v1.
|
|
2
|
+
* @tagadapay/headless-sdk v1.3.0
|
|
3
3
|
* Headless checkout, payments, analytics, and CRM
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
6
|
-
"use strict";var TagadaHeadlessBundle=(()=>{var H=Object.create;var x=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var z=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var L=(n,e)=>{for(var t in e)x(n,t,{get:e[t],enumerable:!0})},M=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _(e))!F.call(n,s)&&s!==t&&x(n,s,{get:()=>e[s],enumerable:!(r=j(e,s))||r.enumerable});return n};var B=(n,e,t)=>(t=n!=null?H(D(n)):{},M(e||!n||!n.__esModule?x(t,"default",{value:n,enumerable:!0}):t,n)),J=n=>M(x({},"__esModule",{value:!0}),n);var K={};L(K,{CatalogModule:()=>S,CheckoutModule:()=>v,CustomerModule:()=>b,HeadlessClient:()=>R,HttpClient:()=>g,OffersModule:()=>T,PaymentModule:()=>C,TagadaAuthError:()=>I,TagadaError:()=>c,TagadaNetworkError:()=>h,TagadaNotFoundError:()=>w,TagadaPaymentError:()=>E,TagadaRateLimitError:()=>P,TagadaValidationError:()=>k,createHeadlessClient:()=>N});var c=class extends Error{constructor(e,t,r,s){super(e),this.name="TagadaError",this.code=t,this.statusCode=r,this.details=s}},I=class extends c{constructor(e="Authentication failed. Check your API key or checkout token."){super(e,"auth_error",401),this.name="TagadaAuthError"}},k=class extends c{constructor(e,t=[]){super(e,"validation_error",422,{errors:t}),this.name="TagadaValidationError",this.errors=t}},w=class extends c{constructor(e,t){super(`${e} "${t}" not found.`,"not_found",404),this.name="TagadaNotFoundError"}},P=class extends c{constructor(e=1e3){super(`Rate limited. Retry after ${e}ms.`,"rate_limit",429),this.name="TagadaRateLimitError",this.retryAfterMs=e}},E=class extends c{constructor(e,t){super(e,"payment_error",void 0,t==null?void 0:t.details),this.name="TagadaPaymentError",this.paymentId=t==null?void 0:t.paymentId,this.requireAction=t==null?void 0:t.requireAction}},h=class extends c{constructor(e="Network request failed. Check your connection."){super(e,"network_error"),this.name="TagadaNetworkError"}};var q={production:"https://app.tagadapay.com",development:"https://app.dev.tagadapay.com",local:"http://localhost:3000"},g=class{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.timeout=e.timeout,this.apiKey=e.apiKey,this.getToken=e.getToken}static resolveBaseUrl(e,t){return t??q[e]??q.production}async request(e,t={}){var l;let{method:r="GET",body:s,headers:i={},params:o,token:a,signal:u}=t,m=`${this.baseUrl}${e}`;if(o){let d=new URLSearchParams;for(let[U,$]of Object.entries(o))$!==void 0&&d.set(U,String($));let O=d.toString();O&&(m+=`?${O}`)}let p={"Content-Type":"application/json",...i},y=a??this.apiKey??((l=this.getToken)==null?void 0:l.call(this));y&&(p["x-cms-token"]=y);let A=new AbortController,f=setTimeout(()=>A.abort(),this.timeout);try{let d=await fetch(m,{method:r,headers:p,body:s!=null?JSON.stringify(s):void 0,signal:u??A.signal});if(clearTimeout(f),d.ok){let O=await d.text();return O?JSON.parse(O):{}}throw await this.handleErrorResponse(d,e),new c("Unexpected error","unknown",d.status)}catch(d){throw clearTimeout(f),d instanceof c?d:d instanceof DOMException&&d.name==="AbortError"?new h(`Request to ${e} timed out after ${this.timeout}ms.`):new h(d instanceof Error?d.message:"Network request failed.")}}get(e,t){return this.request(e,{...t,method:"GET"})}post(e,t,r){return this.request(e,{...r,method:"POST",body:t})}patch(e,t,r){return this.request(e,{...r,method:"PATCH",body:t})}put(e,t,r){return this.request(e,{...r,method:"PUT",body:t})}delete(e,t){return this.request(e,{...t,method:"DELETE"})}async handleErrorResponse(e,t){let r={};try{r=await e.json()}catch{}let s=r.message??r.error??`Request failed: ${e.status} ${e.statusText} on ${t}`;switch(e.status){case 401:case 403:throw new I(s);case 404:throw new w(t,"");case 422:{let i=Array.isArray(r.errors)?r.errors:[];throw new k(s,i)}case 429:{let i=Number(e.headers.get("Retry-After")??"1")*1e3;throw new P(i)}default:throw new c(s,"api_error",e.status,r)}}};var v=class{constructor(e,t,r){this.http=e;this.storeId=t;this.onTokenChange=r}async loadSession(e,t){var s;t&&(this.sessionToken=t,(s=this.onTokenChange)==null||s.call(this,t));let r=await this.http.get(`/api/v1/checkout-sessions/${e}/v2`,{params:{skipAsyncWait:"false"},token:this.sessionToken});return this.normalizeSession(r)}async createSession(e){var a;let t=e.items.map(u=>({variantId:u.variantId,priceId:u.priceId,quantity:u.quantity})),r={storeId:this.storeId,lineItems:t};e.currency&&(r.currency=e.currency),e.returnUrl&&(r.returnUrl=e.returnUrl),e.customerEmail&&(r.customer={email:e.customerEmail,firstName:e.customerFirstName,lastName:e.customerLastName,currency:e.currency});let s=await this.http.post("/api/v1/checkout/session/init",r),o=new URL(s.checkoutUrl).searchParams.get("token")??"";return this.sessionToken=o,o&&((a=this.onTokenChange)==null||a.call(this,o)),{checkoutUrl:s.checkoutUrl,checkoutToken:s.checkoutToken,sessionToken:o,customerId:s.customerId}}async updateCart(e,t){return this.http.post(`/api/v1/checkout-sessions/${e}/line-items`,{items:t},{token:this.sessionToken})}async updateCustomer(e,t){await this.http.post(`/api/v1/checkout-sessions/${e}/customer-and-session-info`,{checkoutSessionId:e,partial:!0,customerData:{email:t.email},shippingAddress:{firstName:t.firstName,lastName:t.lastName,phone:t.phone},billingAddress:{},differentBillingAddress:!1},{token:this.sessionToken})}async updateAddress(e,t){let r=s=>{if(s)return{address1:s.line1,address2:s.line2,city:s.city,state:s.state,postal:s.postalCode,country:s.country}};await this.http.post(`/api/v1/checkout-sessions/${e}/address`,{checkoutSessionId:e,data:{shippingAddress:r(t.shippingAddress)??{},billingAddress:r(t.billingAddress)}},{token:this.sessionToken})}async applyPromoCode(e,t){await this.http.post(`/api/v1/checkout-sessions/${e}/promotions/apply`,{checkoutSessionId:e,code:t},{token:this.sessionToken})}async removePromoCode(e,t){let r=t??"default";await this.http.delete(`/api/v1/checkout-sessions/${e}/promotions/${r}`,{token:this.sessionToken})}async getShippingRates(e){return(await this.http.get(`/api/v1/checkout-sessions/${e}/shipping-rates`,{token:this.sessionToken})).rates??[]}async selectShippingRate(e,t){await this.http.post(`/api/v1/checkout-sessions/${e}/shipping-rate`,{checkoutSessionId:e,shippingRateId:t},{token:this.sessionToken})}normalizeSession(e){let t=e.checkoutSession,r=t.orderSummaries??[],s=e.summary??t.summary??r[0]??{},i=t.sessionLineItems??[],o=t.customer,a=i.map(m=>{let p=m.price,y=(p==null?void 0:p.variant)??{},A=y.product??{},f=(p==null?void 0:p.currencyOptions)??{},l=f.USD??f[Object.keys(f)[0]];return{id:m.id,variantId:m.variantId,priceId:m.priceId,productName:A.name??"",variantName:y.name??"",quantity:m.quantity??1,unitAmount:(l==null?void 0:l.amount)??0,totalAmount:((l==null?void 0:l.amount)??0)*(m.quantity??1),currency:t.selectedPresentmentCurrency??"USD",imageUrl:y.imageUrl??""}}),u=s.items??[];return{id:t.id,storeId:t.storeId,checkoutToken:t.checkoutToken,currency:t.selectedPresentmentCurrency??"USD",items:a,totals:{subtotal:s.subtotalAmount??0,discount:s.totalPromotionAmount??0,shipping:s.shippingCost??0,tax:s.totalTaxAmount??0,total:s.totalAmount??u.reduce((m,p)=>m+(p.amount??0),0),currency:s.currency??t.selectedPresentmentCurrency??"USD"},customer:o?{id:o.id,email:o.email,firstName:o.firstName,lastName:o.lastName}:void 0,shippingAddress:t.shippingAddress,billingAddress:t.billingAddress,metadata:t.metadata}}};var C=class{constructor(e,t,r){this.http=e;this.storeId=t;this.environment=r}async getPaymentSetup(e){let t=await this.http.get("/api/v1/payment-methods",{params:{checkoutSessionId:e}}),r={};for(let s of t.methods??[]){let i=s.provider?`${s.method}:${s.provider}`:s.method;r[i]=s}return r}async getExpressMethods(e){var s,i;let t=await this.getPaymentSetup(e),r={};for(let[,o]of Object.entries(t)){if(!o.enabled||!o.express)continue;let a=o.method,u={type:a,available:!0,processorId:o.processorId,publishableKey:o.publishableKey,metadata:o.metadata};if(a==="apple_pay"||o.type==="apple_pay"){let m=typeof window<"u"&&"ApplePaySession"in window&&((i=(s=window.ApplePaySession)==null?void 0:s.canMakePayments)==null?void 0:i.call(s));r.applePay={...u,available:!!m}}else a==="google_pay"||o.type==="google_pay"?r.googlePay=u:a==="paypal"?r.paypal=u:a==="klarna"||a==="klarna_express"?r.klarna=u:a==="link"&&(r.link=u)}return r}async getStoreConfig(){let e=await this.http.get("/api/v1/checkout/config",{params:{storeId:this.storeId}});return e.config??e}async getEnabledMethods(e){let t=await this.getPaymentSetup(e);return Object.entries(t).filter(([,r])=>r.enabled).map(([r])=>r)}async tokenizeCard(e){let t=await this.loadCoreJs(),r=new t.Tokenizer({environment:this.environment});await r.initialize();let s={cardNumber:e.cardNumber,expiryDate:e.expiryDate,cvc:e.cvc};e.cardholderName&&(s.cardholderName=e.cardholderName);let[i,o]=await Promise.all([r.tokenizeCard(s),r.tokenizeCardRaw(s)]);return{tagadaToken:i,rawToken:o}}async createInstrument(e){return this.http.post("/api/v1/payment/create-instrument-from-token",{tagadaToken:e.tagadaToken})}async create3dsSession(e){return this.http.post("/api/public/v1/threeds/create-session",{provider:e.provider??"basis_theory",storeId:this.storeId,paymentInstrumentId:e.paymentInstrumentId,sessionData:e.sessionData})}async pay(e){return e.tagadaToken&&!e.paymentInstrumentId?this.http.post("/api/v1/payment/pay-with-token",{tagadaToken:e.tagadaToken,checkoutSessionId:e.checkoutSessionId,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,metadata:e.metadata}):this.http.post("/api/public/v1/checkout/pay-v2",{checkoutSessionId:e.checkoutSessionId,paymentInstrumentId:e.paymentInstrumentId,storeId:this.storeId,paymentFlowId:e.paymentFlowId,threedsSessionId:e.threedsSessionId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,metadata:e.metadata})}async payDirect(e){return this.http.post("/api/public/v1/checkout/pay-v2",{checkoutSessionId:e.checkoutSessionId,paymentInstrumentId:e.paymentInstrumentId??"",storeId:this.storeId,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,threedsSessionId:e.threedsSessionId})}async processApplePay(e){let t=await this.loadCoreJs(),r=new t.Tokenizer({environment:this.environment});await r.initialize();let{tagadaToken:s}=await r.tokenizeApplePay(e.applePayToken);return this.pay({checkoutSessionId:e.checkoutSessionId,tagadaToken:s,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:"apple_pay",isExpress:!0})}async processGooglePay(e){let t=await this.loadCoreJs(),r=new t.Tokenizer({environment:this.environment});await r.initialize();let{tagadaToken:s}=await r.tokenizeGooglePay(e.googlePayToken);return this.pay({checkoutSessionId:e.checkoutSessionId,tagadaToken:s,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:"google_pay",isExpress:!0})}async processApm(e){return this.payDirect({checkoutSessionId:e.checkoutSessionId,paymentMethod:e.paymentMethod,processorId:e.processorId,paymentFlowId:e.paymentFlowId})}async getPaymentStatus(e){return this.http.get(`/api/v1/payments/${e}`)}async pollPaymentStatus(e,t){let r=(t==null?void 0:t.intervalMs)??1500,s=(t==null?void 0:t.timeoutMs)??6e4,i=Date.now();for(;Date.now()-i<s;){let o=await this.getPaymentStatus(e);if(o.status==="succeeded"||o.status==="failed"||o.status==="declined")return o;await new Promise(a=>setTimeout(a,r))}throw new Error(`Payment ${e} did not reach terminal status within ${s}ms.`)}async completeAfter3ds(e){return this.http.post("/api/v1/payments/complete-after-3ds",{paymentId:e})}async loadCoreJs(){try{return await import("@tagadapay/core-js")}catch{throw new Error("This method requires @tagadapay/core-js. Install it: npm install @tagadapay/core-js")}}};var T=class{constructor(e,t){this.http=e;this.storeId=t}async getOffer(e){return this.http.get(`/api/v1/offers/${e}`)}async listOffers(e){var i;let t=`/api/v1/stores/${this.storeId}/offers`,r=[];if(e!=null&&e.type&&r.push(`type=${encodeURIComponent(e.type)}`),(i=e==null?void 0:e.ids)!=null&&i.length)for(let o of e.ids)r.push(`ids=${encodeURIComponent(o)}`);return r.length&&(t+=`?${r.join("&")}`),(await this.http.get(t)).offers??[]}async previewOffer(e){return this.http.post(`/api/v1/offers/${e.offerId}/preview`,{offerId:e.offerId,currency:e.currency??"",lineItems:e.lineItems})}async payPreviewedOffer(e){return this.http.post(`/api/v1/offers/${e.offerId}/pay-preview`,{offerId:e.offerId,currency:e.currency??"",lineItems:e.lineItems,returnUrl:e.returnUrl??(typeof window<"u"?window.location.href:""),mainOrderId:e.mainOrderId,paymentInstrumentId:e.paymentInstrumentId})}async toggleOrderBump(e){return this.http.post(`/api/v1/checkout-sessions/${e.checkoutSessionId}/toggle-order-bump`,{orderBumpOfferId:e.orderBumpOfferId,selected:e.selected})}async listPostPurchaseOffers(e){let t=await this.http.get(`/api/v1/post-purchase/${e}/offers`);return Array.isArray(t)?t:[]}async acceptPostPurchaseOffer(e){return this.http.post(`/api/v1/orders/${e.orderId}/post-purchase-offers/${e.offerId}/accept`,{items:e.items??[]})}async declinePostPurchaseOffer(e){return this.http.post(`/api/v1/orders/${e.orderId}/post-purchase-offers/${e.offerId}/decline`)}};var b=class{constructor(e,t){this.http=e;this.storeId=t}async getProfile(e){return(await this.http.get(`/api/v1/customers/${e}`,{params:{storeId:this.storeId}})).customer}async getByEmail(e){try{return(await this.http.get("/api/v1/customers/by-email",{params:{email:e,storeId:this.storeId}})).customer}catch{return null}}async updateProfile(e,t){return(await this.http.patch(`/api/v1/customers/${e}`,{storeId:this.storeId,...t})).customer}async getOrders(e,t){return this.http.get(`/api/v1/customers/${e}/orders`,{params:{storeId:this.storeId,limit:t==null?void 0:t.limit,offset:t==null?void 0:t.offset}})}async getOrder(e){return(await this.http.get(`/api/v1/orders/${e}`,{params:{storeId:this.storeId}})).order}async getSubscriptions(e){return(await this.http.get(`/api/v1/customers/${e}/subscriptions`,{params:{storeId:this.storeId}})).subscriptions}async getSubscription(e){return(await this.http.get(`/api/v1/subscriptions/${e}`,{params:{storeId:this.storeId}})).subscription}};var S=class{constructor(e,t){this.http=e;this.storeId=t}async getProducts(e){var s,i;let t={storeId:this.storeId,includeVariants:!0,includePrices:!0};return(s=e==null?void 0:e.productIds)!=null&&s.length&&(t.productIds=e.productIds),(i=e==null?void 0:e.variantIds)!=null&&i.length&&(t.variantIds=e.variantIds),(await this.http.post("/api/v1/products",t)).items??[]}async getProduct(e){return(await this.getProducts({productIds:[e]}))[0]??null}};var R=class{constructor(e){let t=e.environment??"production",r=g.resolveBaseUrl(t,e.baseUrl);this.config={...e,environment:t,baseUrl:r,timeout:e.timeout??3e4},this.http=new g({baseUrl:r,timeout:this.config.timeout,apiKey:e.apiKey,getToken:()=>this._sessionToken});let s=i=>{this._sessionToken=i};this.checkout=new v(this.http,this.config.storeId,s),this.payment=new C(this.http,this.config.storeId,t),this.offers=new T(this.http,this.config.storeId),this.customer=new b(this.http,this.config.storeId),this.catalog=new S(this.http,this.config.storeId)}setSessionToken(e){this._sessionToken=e}};function N(n){return new R(n)}return J(K);})();
|
|
6
|
+
"use strict";var TagadaHeadlessBundle=(()=>{var re=Object.create;var G=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var ae=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var ce=(n,e)=>{for(var t in e)G(n,t,{get:e[t],enumerable:!0})},V=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ne(e))!ie.call(n,s)&&s!==t&&G(n,s,{get:()=>e[s],enumerable:!(r=se(e,s))||r.enumerable});return n};var de=(n,e,t)=>(t=n!=null?re(oe(n)):{},V(e||!n||!n.__esModule?G(t,"default",{value:n,enumerable:!0}):t,n)),ue=n=>V(G({},"__esModule",{value:!0}),n);var Ie={};ce(Ie,{AVAILABLE_LANGUAGES:()=>D,CatalogModule:()=>L,CheckoutModule:()=>C,CurrencyUtils:()=>w,CustomerModule:()=>R,GoogleAutocompleteCore:()=>E,HeadlessClient:()=>O,HttpClient:()=>I,ISODataCore:()=>U,OffersModule:()=>b,PaymentModule:()=>A,TagadaAuthError:()=>P,TagadaError:()=>y,TagadaNetworkError:()=>f,TagadaNotFoundError:()=>S,TagadaPaymentError:()=>H,TagadaRateLimitError:()=>v,TagadaValidationError:()=>k,createHeadlessClient:()=>Z,ensureGeoDataLoaded:()=>N,formatMoney:()=>J,getCountries:()=>T,getStatesForCountry:()=>_,isLanguageLoaded:()=>M,loadGoogleMapsScript:()=>B});var y=class extends Error{constructor(e,t,r,s){super(e),this.name="TagadaError",this.code=t,this.statusCode=r,this.details=s}},P=class extends y{constructor(e="Authentication failed. Check your API key or checkout token."){super(e,"auth_error",401),this.name="TagadaAuthError"}},k=class extends y{constructor(e,t=[]){super(e,"validation_error",422,{errors:t}),this.name="TagadaValidationError",this.errors=t}},S=class extends y{constructor(e,t){super(`${e} "${t}" not found.`,"not_found",404),this.name="TagadaNotFoundError"}},v=class extends y{constructor(e=1e3){super(`Rate limited. Retry after ${e}ms.`,"rate_limit",429),this.name="TagadaRateLimitError",this.retryAfterMs=e}},H=class extends y{constructor(e,t){super(e,"payment_error",void 0,t==null?void 0:t.details),this.name="TagadaPaymentError",this.paymentId=t==null?void 0:t.paymentId,this.requireAction=t==null?void 0:t.requireAction}},f=class extends y{constructor(e="Network request failed. Check your connection."){super(e,"network_error"),this.name="TagadaNetworkError"}};var W={production:"https://app.tagadapay.com",development:"https://app.dev.tagadapay.com",local:"http://localhost:3000"},I=class{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.timeout=e.timeout,this.apiKey=e.apiKey,this.getToken=e.getToken}static resolveBaseUrl(e,t){return t??W[e]??W.production}async request(e,t={}){var u;let{method:r="GET",body:s,headers:i={},params:o,token:a,signal:c}=t,l=`${this.baseUrl}${e}`;if(o){let g=new URLSearchParams;for(let[te,Y]of Object.entries(o))Y!==void 0&&g.set(te,String(Y));let x=g.toString();x&&(l+=`?${x}`)}let m={"Content-Type":"application/json",...i},p=a??this.apiKey??((u=this.getToken)==null?void 0:u.call(this));p&&(m["x-cms-token"]=p);let h=new AbortController,d=setTimeout(()=>h.abort(),this.timeout);try{let g=await fetch(l,{method:r,headers:m,body:s!=null?JSON.stringify(s):void 0,signal:c??h.signal});if(clearTimeout(d),g.ok){let x=await g.text();return x?JSON.parse(x):{}}throw await this.handleErrorResponse(g,e),new y("Unexpected error","unknown",g.status)}catch(g){throw clearTimeout(d),g instanceof y?g:g instanceof DOMException&&g.name==="AbortError"?new f(`Request to ${e} timed out after ${this.timeout}ms.`):new f(g instanceof Error?g.message:"Network request failed.")}}get(e,t){return this.request(e,{...t,method:"GET"})}post(e,t,r){return this.request(e,{...r,method:"POST",body:t})}patch(e,t,r){return this.request(e,{...r,method:"PATCH",body:t})}put(e,t,r){return this.request(e,{...r,method:"PUT",body:t})}delete(e,t){return this.request(e,{...t,method:"DELETE"})}async handleErrorResponse(e,t){let r={};try{r=await e.json()}catch{}let s=r.message??r.error??`Request failed: ${e.status} ${e.statusText} on ${t}`;switch(e.status){case 401:case 403:throw new P(s);case 404:throw new S(t,"");case 422:{let i=Array.isArray(r.errors)?r.errors:[];throw new k(s,i)}case 429:{let i=Number(e.headers.get("Retry-After")??"1")*1e3;throw new v(i)}default:throw new y(s,"api_error",e.status,r)}}};var C=class{constructor(e,t,r){this.http=e;this.storeId=t;this.onTokenChange=r}async loadSession(e,t){var s;t&&(this.sessionToken=t,(s=this.onTokenChange)==null||s.call(this,t));let r=await this.http.get(`/api/v1/checkout-sessions/${e}/v2`,{params:{skipAsyncWait:"false"},token:this.sessionToken});return this.normalizeSession(r)}async createSession(e){var a;let t=e.items.map(c=>({variantId:c.variantId,priceId:c.priceId,quantity:c.quantity})),r={storeId:this.storeId,lineItems:t};e.currency&&(r.currency=e.currency),e.returnUrl&&(r.returnUrl=e.returnUrl),e.customerEmail&&(r.customer={email:e.customerEmail,firstName:e.customerFirstName,lastName:e.customerLastName,currency:e.currency});let s=await this.http.post("/api/v1/checkout/session/init",r),o=new URL(s.checkoutUrl).searchParams.get("token")??"";return this.sessionToken=o,o&&((a=this.onTokenChange)==null||a.call(this,o)),{checkoutUrl:s.checkoutUrl,checkoutToken:s.checkoutToken,sessionToken:o,customerId:s.customerId}}async updateCart(e,t){return this.http.post(`/api/v1/checkout-sessions/${e}/line-items`,{items:t},{token:this.sessionToken})}async updateCustomer(e,t){await this.http.post(`/api/v1/checkout-sessions/${e}/customer-and-session-info`,{checkoutSessionId:e,partial:!0,customerData:{email:t.email},shippingAddress:{firstName:t.firstName,lastName:t.lastName,phone:t.phone},billingAddress:{},differentBillingAddress:!1},{token:this.sessionToken})}async updateAddress(e,t){let r=s=>{if(s)return{address1:s.line1,address2:s.line2,city:s.city,state:s.state,postal:s.postalCode,country:s.country}};await this.http.post(`/api/v1/checkout-sessions/${e}/address`,{checkoutSessionId:e,data:{shippingAddress:r(t.shippingAddress)??{},billingAddress:r(t.billingAddress)}},{token:this.sessionToken})}async applyPromoCode(e,t){await this.http.post(`/api/v1/checkout-sessions/${e}/promotions/apply`,{checkoutSessionId:e,code:t},{token:this.sessionToken})}async removePromoCode(e,t){let r=t??"default";await this.http.delete(`/api/v1/checkout-sessions/${e}/promotions/${r}`,{token:this.sessionToken})}async getShippingRates(e){return(await this.http.get(`/api/v1/checkout-sessions/${e}/shipping-rates`,{token:this.sessionToken})).rates??[]}async selectShippingRate(e,t){await this.http.post(`/api/v1/checkout-sessions/${e}/shipping-rate`,{checkoutSessionId:e,shippingRateId:t},{token:this.sessionToken})}normalizeSession(e){let t=e.checkoutSession,r=t.orderSummaries??[],s=e.summary??t.summary??r[0]??{},i=t.sessionLineItems??[],o=t.customer,a=i.map(l=>{let m=l.price,p=(m==null?void 0:m.variant)??{},h=p.product??{},d=(m==null?void 0:m.currencyOptions)??{},u=d.USD??d[Object.keys(d)[0]];return{id:l.id,variantId:l.variantId,priceId:l.priceId,productName:h.name??"",variantName:p.name??"",quantity:l.quantity??1,unitAmount:(u==null?void 0:u.amount)??0,totalAmount:((u==null?void 0:u.amount)??0)*(l.quantity??1),currency:t.selectedPresentmentCurrency??"USD",imageUrl:p.imageUrl??""}}),c=s.items??[];return{id:t.id,storeId:t.storeId,checkoutToken:t.checkoutToken,currency:t.selectedPresentmentCurrency??"USD",items:a,totals:{subtotal:s.subtotalAmount??0,discount:s.totalPromotionAmount??0,shipping:s.shippingCost??0,tax:s.totalTaxAmount??0,total:s.totalAmount??c.reduce((l,m)=>l+(m.amount??0),0),currency:s.currency??t.selectedPresentmentCurrency??"USD"},customer:o?{id:o.id,email:o.email,firstName:o.firstName,lastName:o.lastName}:void 0,shippingAddress:t.shippingAddress,billingAddress:t.billingAddress,metadata:t.metadata}}};var A=class{constructor(e,t,r){this.http=e;this.storeId=t;this.environment=r}async getPaymentSetup(e){let t=await this.http.get("/api/v1/payment-methods",{params:{checkoutSessionId:e}}),r={};for(let s of t.methods??[]){let i=s.provider?`${s.method}:${s.provider}`:s.method;r[i]=s}return r}async getExpressMethods(e){var s,i;let t=await this.getPaymentSetup(e),r={};for(let[,o]of Object.entries(t)){if(!o.enabled||!o.express)continue;let a=o.method,c={type:a,available:!0,processorId:o.processorId,publishableKey:o.publishableKey,metadata:o.metadata};if(a==="apple_pay"||o.type==="apple_pay"){let l=typeof window<"u"&&"ApplePaySession"in window&&((i=(s=window.ApplePaySession)==null?void 0:s.canMakePayments)==null?void 0:i.call(s));r.applePay={...c,available:!!l}}else a==="google_pay"||o.type==="google_pay"?r.googlePay=c:a==="paypal"?r.paypal=c:a==="klarna"||a==="klarna_express"?r.klarna=c:a==="link"&&(r.link=c)}return r}async getStoreConfig(){let e=await this.http.get("/api/v1/checkout/config",{params:{storeId:this.storeId}});return e.config??e}async getEnabledMethods(e){let t=await this.getPaymentSetup(e);return Object.entries(t).filter(([,r])=>r.enabled).map(([r])=>r)}async tokenizeCard(e){let t=await this.loadCoreJs(),r=new t.Tokenizer({environment:this.environment});await r.initialize();let s={cardNumber:e.cardNumber,expiryDate:e.expiryDate,cvc:e.cvc};e.cardholderName&&(s.cardholderName=e.cardholderName);let[i,o]=await Promise.all([r.tokenizeCard(s),r.tokenizeCardRaw(s)]);return{tagadaToken:i,rawToken:o}}async createInstrument(e){return this.http.post("/api/v1/payment/create-instrument-from-token",{tagadaToken:e.tagadaToken})}async create3dsSession(e){return this.http.post("/api/public/v1/threeds/create-session",{provider:e.provider??"basis_theory",storeId:this.storeId,paymentInstrumentId:e.paymentInstrumentId,sessionData:e.sessionData})}async pay(e){return e.tagadaToken&&!e.paymentInstrumentId?this.http.post("/api/v1/payment/pay-with-token",{tagadaToken:e.tagadaToken,checkoutSessionId:e.checkoutSessionId,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,metadata:e.metadata}):this.http.post("/api/public/v1/checkout/pay-v2",{checkoutSessionId:e.checkoutSessionId,paymentInstrumentId:e.paymentInstrumentId,storeId:this.storeId,paymentFlowId:e.paymentFlowId,threedsSessionId:e.threedsSessionId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,metadata:e.metadata})}async payDirect(e){return this.http.post("/api/public/v1/checkout/pay-v2",{checkoutSessionId:e.checkoutSessionId,paymentInstrumentId:e.paymentInstrumentId??"",storeId:this.storeId,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:e.paymentMethod,isExpress:e.isExpress,threedsSessionId:e.threedsSessionId})}async processApplePay(e){let t=await this.loadCoreJs(),r=new t.Tokenizer({environment:this.environment});await r.initialize();let{tagadaToken:s}=await r.tokenizeApplePay(e.applePayToken);return this.pay({checkoutSessionId:e.checkoutSessionId,tagadaToken:s,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:"apple_pay",isExpress:!0})}async processGooglePay(e){let t=await this.loadCoreJs(),r=new t.Tokenizer({environment:this.environment});await r.initialize();let{tagadaToken:s}=await r.tokenizeGooglePay(e.googlePayToken);return this.pay({checkoutSessionId:e.checkoutSessionId,tagadaToken:s,paymentFlowId:e.paymentFlowId,processorId:e.processorId,paymentMethod:"google_pay",isExpress:!0})}async processApm(e){return this.payDirect({checkoutSessionId:e.checkoutSessionId,paymentMethod:e.paymentMethod,processorId:e.processorId,paymentFlowId:e.paymentFlowId})}async getPaymentStatus(e){return this.http.get(`/api/v1/payments/${e}`)}async pollPaymentStatus(e,t){let r=(t==null?void 0:t.intervalMs)??1500,s=(t==null?void 0:t.timeoutMs)??6e4,i=Date.now();for(;Date.now()-i<s;){let o=await this.getPaymentStatus(e);if(o.status==="succeeded"||o.status==="failed"||o.status==="declined")return o;await new Promise(a=>setTimeout(a,r))}throw new Error(`Payment ${e} did not reach terminal status within ${s}ms.`)}async completeAfter3ds(e){return this.http.post("/api/v1/payments/complete-after-3ds",{paymentId:e})}async loadCoreJs(){try{return await import("@tagadapay/core-js")}catch{throw new Error("This method requires @tagadapay/core-js. Install it: npm install @tagadapay/core-js")}}};var b=class{constructor(e,t){this.http=e;this.storeId=t}async getOffer(e){return this.http.get(`/api/v1/offers/${e}`)}async listOffers(e){var i;let t=`/api/v1/stores/${this.storeId}/offers`,r=[];if(e!=null&&e.type&&r.push(`type=${encodeURIComponent(e.type)}`),(i=e==null?void 0:e.ids)!=null&&i.length)for(let o of e.ids)r.push(`ids=${encodeURIComponent(o)}`);return r.length&&(t+=`?${r.join("&")}`),(await this.http.get(t)).offers??[]}async previewOffer(e){return this.http.post(`/api/v1/offers/${e.offerId}/preview`,{offerId:e.offerId,currency:e.currency??"",lineItems:e.lineItems})}async payPreviewedOffer(e){return this.http.post(`/api/v1/offers/${e.offerId}/pay-preview`,{offerId:e.offerId,currency:e.currency??"",lineItems:e.lineItems,returnUrl:e.returnUrl??(typeof window<"u"?window.location.href:""),mainOrderId:e.mainOrderId,paymentInstrumentId:e.paymentInstrumentId})}async toggleOrderBump(e){return this.http.post(`/api/v1/checkout-sessions/${e.checkoutSessionId}/toggle-order-bump`,{orderBumpOfferId:e.orderBumpOfferId,selected:e.selected})}async listPostPurchaseOffers(e){let t=await this.http.get(`/api/v1/post-purchase/${e}/offers`);return Array.isArray(t)?t:[]}async acceptPostPurchaseOffer(e){return this.http.post(`/api/v1/orders/${e.orderId}/post-purchase-offers/${e.offerId}/accept`,{items:e.items??[]})}async declinePostPurchaseOffer(e){return this.http.post(`/api/v1/orders/${e.orderId}/post-purchase-offers/${e.offerId}/decline`)}};var R=class{constructor(e,t){this.http=e;this.storeId=t}async getProfile(e){return(await this.http.get(`/api/v1/customers/${e}`,{params:{storeId:this.storeId}})).customer}async getByEmail(e){try{return(await this.http.get("/api/v1/customers/by-email",{params:{email:e,storeId:this.storeId}})).customer}catch{return null}}async updateProfile(e,t){return(await this.http.patch(`/api/v1/customers/${e}`,{storeId:this.storeId,...t})).customer}async getOrders(e,t){return this.http.get(`/api/v1/customers/${e}/orders`,{params:{storeId:this.storeId,limit:t==null?void 0:t.limit,offset:t==null?void 0:t.offset}})}async getOrder(e){return(await this.http.get(`/api/v1/orders/${e}`,{params:{storeId:this.storeId}})).order}async getSubscriptions(e){return(await this.http.get(`/api/v1/customers/${e}/subscriptions`,{params:{storeId:this.storeId}})).subscriptions}async getSubscription(e){return(await this.http.get(`/api/v1/subscriptions/${e}`,{params:{storeId:this.storeId}})).subscription}};var L=class{constructor(e,t){this.http=e;this.storeId=t}async getProducts(e){var s,i;let t={storeId:this.storeId,includeVariants:!0,includePrices:!0};return(s=e==null?void 0:e.productIds)!=null&&s.length&&(t.productIds=e.productIds),(i=e==null?void 0:e.variantIds)!=null&&i.length&&(t.variantIds=e.variantIds),(await this.http.post("/api/v1/products",t)).items??[]}async getProduct(e){return(await this.getProducts({productIds:[e]}))[0]??null}};var O=class{constructor(e){let t=e.environment??"production",r=I.resolveBaseUrl(t,e.baseUrl);this.config={...e,environment:t,baseUrl:r,timeout:e.timeout??3e4},this.http=new I({baseUrl:r,timeout:this.config.timeout,apiKey:e.apiKey,getToken:()=>this._sessionToken});let s=i=>{this._sessionToken=i};this.checkout=new C(this.http,this.config.storeId,s),this.payment=new A(this.http,this.config.storeId,t),this.offers=new b(this.http,this.config.storeId),this.customer=new R(this.http,this.config.storeId),this.catalog=new L(this.http,this.config.storeId)}setSessionToken(e){this._sessionToken=e}};function Z(n){return new O(n)}var Q=!1,X=!1,K=[];function q(){X=!0;for(let n of K)n();K.length=0}function B(n,e={}){var t,r;return X||(r=(t=window.google)==null?void 0:t.maps)!=null&&r.places?(q(),Promise.resolve()):Q?new Promise(s=>K.push(s)):(Q=!0,new Promise((s,i)=>{if(K.push(s),document.querySelector('script[src*="maps.googleapis.com"]')){let l=()=>{var m,p;(p=(m=window.google)==null?void 0:m.maps)!=null&&p.places?q():setTimeout(l,100)};l();return}let a=new URLSearchParams({key:n,libraries:"places",v:e.version??"weekly"});e.language&&a.set("language",e.language),e.region&&a.set("region",e.region);let c=document.createElement("script");c.src=`https://maps.googleapis.com/maps/api/js?${a}`,c.async=!0,c.defer=!0,c.onload=()=>q(),c.onerror=()=>i(new Error("Failed to load Google Maps script")),document.head.appendChild(c)}))}var E=class n{static async searchPlaces(e,t={}){var s,i;if(!((i=(s=window.google)==null?void 0:s.maps)!=null&&i.places)||!e.trim())return[];let r=new window.google.maps.places.AutocompleteService;return new Promise(o=>{r.getPlacePredictions({input:e,types:t.types??["address"],componentRestrictions:t.componentRestrictions},(a,c)=>{var l,m,p;o(c===((p=(m=(l=window.google)==null?void 0:l.maps)==null?void 0:m.places)==null?void 0:p.PlacesServiceStatus.OK)&&a?a:[])})})}static async getPlaceDetails(e){var r,s;if(!((s=(r=window.google)==null?void 0:r.maps)!=null&&s.places))return null;let t=new window.google.maps.places.PlacesService(document.createElement("div"));return new Promise(i=>{t.getDetails({placeId:e,fields:["place_id","formatted_address","address_components","geometry"]},(o,a)=>{var c,l,m;i(a===((m=(l=(c=window.google)==null?void 0:c.maps)==null?void 0:l.places)==null?void 0:m.PlacesServiceStatus.OK)&&o?o:null)})})}static extractAddressComponents(e){let t={subpremise:"",streetNumber:"",route:"",locality:"",administrativeAreaLevel1:"",administrativeAreaLevel1Long:"",administrativeAreaLevel2:"",administrativeAreaLevel2Long:"",country:"",postalCode:"",fullStreetAddress:""},r="",s="",i="",o="",a="",c="",l="",m="";for(let d of e.address_components??[]){let u=d.types;u.includes("subpremise")&&(t.subpremise=d.long_name),u.includes("street_number")&&(t.streetNumber=d.long_name),u.includes("premise")&&(r=d.long_name),u.includes("route")&&(t.route=d.long_name),u.includes("neighborhood")&&(s=d.long_name),u.includes("sublocality_level_5")&&(i=d.long_name),u.includes("sublocality_level_4")&&(o=d.long_name),u.includes("sublocality_level_3")&&(a=d.long_name),u.includes("sublocality_level_2")&&(c=d.long_name),u.includes("sublocality_level_1")&&(l=d.long_name),u.includes("locality")&&(t.locality=d.long_name),u.includes("postal_town")&&(m=d.long_name),u.includes("administrative_area_level_2")&&(t.administrativeAreaLevel2=d.short_name,t.administrativeAreaLevel2Long=d.long_name),u.includes("administrative_area_level_1")&&(t.administrativeAreaLevel1=d.short_name,t.administrativeAreaLevel1Long=d.long_name),u.includes("country")&&(t.country=d.short_name),u.includes("postal_code")&&(t.postalCode=d.long_name)}t.locality||(t.locality=m||c||l||""),!t.administrativeAreaLevel1&&t.administrativeAreaLevel2&&(t.administrativeAreaLevel1=t.administrativeAreaLevel2Long||t.administrativeAreaLevel2,t.administrativeAreaLevel1Long=t.administrativeAreaLevel2Long);let p=t.streetNumber||r,h=t.route||i||o||a||s;if(t.subpremise&&p&&h)t.fullStreetAddress=`${t.subpremise}/${p} ${h}`;else if(p&&h)if(r&&o&&a){let d=`${a}-${o}-${r}`;c&&(d=`${d} ${c}`),t.fullStreetAddress=d}else t.fullStreetAddress=`${p} ${h}`;else h?t.fullStreetAddress=h:p&&(t.fullStreetAddress=p);return t.fullStreetAddress=t.fullStreetAddress.trim(),t}static extractFormattedAddress(e){let t=n.extractAddressComponents(e);return{address1:t.fullStreetAddress,city:t.locality,country:t.country,state:t.administrativeAreaLevel1,postal:t.postalCode}}};var ee="https://cvwnizdbugpz6jwk.public.blob.vercel-storage.com/geodata/v1",D=["en","ru","de","da","fr","es","zh","hi","pt","ja","ar","it","he"],$=new Map,F=new Map,j=new Map,z=new Map;async function le(n){let e=$.get(n);if(e)return e;let t=j.get(n);return t||(t=(async()=>{let r=`${ee}/${n}/countries.json`,s=await fetch(r);if(!s.ok)throw new Error(`Geodata fetch failed: ${r} (${s.status})`);let i=await s.json();return $.set(n,i),j.delete(n),i})(),j.set(n,t),t)}async function me(n){let e=F.get(n);if(e)return e;let t=z.get(n);return t||(t=(async()=>{let r=`${ee}/${n}/regions.json`,s=await fetch(r);if(!s.ok)throw new Error(`Geodata fetch failed: ${r} (${s.status})`);let i=await s.json();return F.set(n,i),z.delete(n),i})(),z.set(n,t),t)}function pe(n){return $.get(n)||$.get("en")||{}}function ge(n){return F.get(n)||F.get("en")||{}}async function N(n="en"){await Promise.all([le(n),me(n)])}var T=(n="en")=>{let e=pe(n);return Object.entries(e).map(([t,r])=>({code:t,name:r.n,iso3:r.i3,numeric:r.nu})).sort((t,r)=>t.name.localeCompare(r.name))},_=(n,e="en")=>{let r=ge(e)[n];return r?r.map(([s,i])=>({code:s,name:i,countryCode:n})).sort((s,i)=>s.name.localeCompare(i.name)):[]};function M(n){return $.has(n)}var U=class n{static ensureLoaded(e="en"){return N(e)}static getCountries(e="en"){let t=T(e),r={};for(let s of t)r[s.code]={iso:s.code,iso3:s.iso3??"",numeric:s.numeric??0,name:s.name};return r}static getCountryOptions(e="en"){return T(e).map(t=>({value:t.code,label:t.name}))}static getRegions(e,t="en"){return _(e,t).map(r=>({iso:r.code,name:r.name}))}static getRegionOptions(e,t="en"){return n.getRegions(e,t).map(r=>({value:r.iso,label:r.name}))}static findRegion(e,t,r="en"){return n.getRegions(e,r).find(s=>s.iso===t)??null}static mapGoogleToISO(e,t,r,s="en"){let i=n.getRegions(r,s);if(i.length===0)return null;let o=i.find(a=>a.iso===e);return o||(o=i.find(a=>a.name.toLowerCase()===e.toLowerCase()),o)||(o=i.find(a=>a.name.toLowerCase()===t.toLowerCase()),o)?o:(o=i.find(a=>a.name.toLowerCase().includes(t.toLowerCase())||t.toLowerCase().includes(a.name.toLowerCase())),o??null)}static isLanguageLoaded(e){return M(e)}static getAvailableLanguages(){return D}};var ye={USD:"$",EUR:"\u20AC",GBP:"\xA3",JPY:"\xA5",CAD:"C$",AUD:"A$",CHF:"CHF",CNY:"\xA5",SEK:"kr",NOK:"kr",DKK:"kr",PLN:"z\u0142",CZK:"K\u010D",HUF:"Ft",RON:"lei",BGN:"\u043B\u0432",HRK:"kn",RUB:"\u20BD",UAH:"\u20B4",TRY:"\u20BA",BRL:"R$",MXN:"$",ZAR:"R",INR:"\u20B9",KRW:"\u20A9",THB:"\u0E3F",VND:"\u20AB",IDR:"Rp",MYR:"RM",SGD:"S$",PHP:"\u20B1",TWD:"NT$",HKD:"HK$",ILS:"\u20AA",AED:"\u062F.\u0625",SAR:"\u0631.\u0633",QAR:"\u0631.\u0642",KWD:"\u062F.\u0643",BHD:"\u062F.\u0628",OMR:"\u0631.\u0639.",EGP:"\xA3",NGN:"\u20A6",KES:"KSh",GHS:"\u20B5",COP:"$",ARS:"$",CLP:"$",PEN:"S/",CRC:"\u20A1",DOP:"RD$",JMD:"J$",BOB:"Bs",PYG:"\u20B2",GTQ:"Q",NIO:"C$",PAB:"B/.",PKR:"\u20A8",BDT:"\u09F3",LKR:"\u20A8",NPR:"\u20A8",GEL:"\u20BE",AMD:"\u058F",AZN:"\u20BC",KZT:"\u20B8"},he={USD:"US Dollar",EUR:"Euro",GBP:"British Pound",JPY:"Japanese Yen",CAD:"Canadian Dollar",AUD:"Australian Dollar",CHF:"Swiss Franc",CNY:"Chinese Yuan",SEK:"Swedish Krona",NOK:"Norwegian Krone",DKK:"Danish Krone",PLN:"Polish Zloty",CZK:"Czech Koruna",HUF:"Hungarian Forint",BRL:"Brazilian Real",MXN:"Mexican Peso",INR:"Indian Rupee",KRW:"South Korean Won",THB:"Thai Baht",SGD:"Singapore Dollar",HKD:"Hong Kong Dollar",TWD:"Taiwan Dollar",ILS:"Israeli Shekel",AED:"UAE Dirham",SAR:"Saudi Riyal",ZAR:"South African Rand",TRY:"Turkish Lira",RUB:"Russian Ruble",NGN:"Nigerian Naira"},fe=new Set(["JPY","KRW","VND","IDR","LAK","KHR","MMK","PYG"]),w=class n{static getSymbol(e){return ye[e]??e}static getName(e){return he[e]??e}static getDecimalPlaces(e){return fe.has(e)?0:2}static getCurrency(e){return{code:e,symbol:n.getSymbol(e),name:n.getName(e),decimalPlaces:n.getDecimalPlaces(e)}}};function J(n,e="USD",t="en-US"){let r=w.getDecimalPlaces(e),s=n/(r===0?100:Math.pow(10,r));try{return new Intl.NumberFormat(t,{style:"currency",currency:e,minimumFractionDigits:r,maximumFractionDigits:r}).format(s)}catch{return`${w.getSymbol(e)}${s.toFixed(r)}`}}return ue(Ie);})();
|
|
7
7
|
if(typeof window!=="undefined"&&TagadaHeadlessBundle){ window.TagadaHeadless=TagadaHeadlessBundle; window.TagadaHeadless.create=TagadaHeadlessBundle.createHeadlessClient;}
|
|
8
8
|
//# sourceMappingURL=tagada-headless.min.js.map
|