@saasquatch/squatch-js 2.8.2-1 → 2.8.2-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.8.1] - 2025-11-17
11
+
12
+ ### Fixed
13
+
14
+ - Prevent overriding of API domain with auto popups
15
+
10
16
  ## [2.8.0] - 2025-10-22
11
17
 
12
18
  ### Added
@@ -387,7 +393,8 @@ No release notes.
387
393
 
388
394
  No release notes.
389
395
 
390
- [unreleased]: https://github.com/saasquatch/squatch-js/compare/@saasquatch%2Fsquatch-js@2.8.0...HEAD
396
+ [unreleased]: https://github.com/saasquatch/squatch-js/compare/@saasquatch%2Fsquatch-js@2.8.1...HEAD
397
+ [2.8.1]: https://github.com/saasquatch/squatch-js/compare/@saasquatch%2Fsquatch-js@2.7.0...@saasquatch%2Fsquatch-js@2.8.1
391
398
  [2.8.0]: https://github.com/saasquatch/squatch-js/compare/@saasquatch%2Fsquatch-js@2.7.0...@saasquatch%2Fsquatch-js@2.8.0
392
399
  [2.7.0]: https://github.com/saasquatch/squatch-js/compare/@saasquatch%2Fsquatch-js@2.6.3...@saasquatch%2Fsquatch-js@2.7.0
393
400
  [2.6.3]: https://github.com/saasquatch/squatch-js/compare/@saasquatch%2Fsquatch-js@2.6.2...@saasquatch%2Fsquatch-js@2.6.3
package/README.md CHANGED
@@ -197,19 +197,11 @@ squatch.api().upsertUser({...});
197
197
  ### `squatch-popup`
198
198
 
199
199
  ```html
200
- <squatch-embed
201
- widget="WIDGET_TYPE"
202
- [
203
- open
204
- |
205
- container="#selector"
206
- |
207
- locale="en_US"
208
- ]
209
- >
200
+ <squatch-popup
201
+ widget="WIDGET_TYPE" [ open | container="#selector" | locale="en_US" ]>
210
202
  <!-- Clicking a child of squatch-popup opens the popup -->
211
203
  <button>Click me to open</button>
212
- </squatch-embed>
204
+ </squatch-popup>
213
205
  ```
214
206
 
215
207
  - `widget: string`: Specifies the SaaSquatch `widgetType` identifier of the desired widget
@@ -702,6 +702,7 @@ class WidgetApi {
702
702
  const raw = params;
703
703
  const clean = validatePasswordlessConfig(raw);
704
704
  const { widgetType, engagementMedium = "POPUP", jwt, user } = clean;
705
+ console.log({ params });
705
706
  const tenantAlias = encodeURIComponent(this.tenantAlias);
706
707
  const accountId = (user == null ? void 0 : user.accountId) ? encodeURIComponent(user.accountId) : null;
707
708
  const userId = (user == null ? void 0 : user.id) ? encodeURIComponent(user.id) : null;
@@ -1107,19 +1108,369 @@ function delay(duration) {
1107
1108
  setTimeout(resolve, duration);
1108
1109
  });
1109
1110
  }
1111
+ const getSkeleton = ({
1112
+ height = "500px",
1113
+ skeletonBackgroundColor = "#e0e0e0",
1114
+ skeletonShimmerColor = "#f5f5f5",
1115
+ borderColor = "#ccc"
1116
+ }) => {
1117
+ return `
1118
+ <style>
1119
+ * {
1120
+ box-sizing: border-box;
1121
+ padding: 0;
1122
+ margin: 0;
1123
+ }
1124
+
1125
+ .widget-container {
1126
+ background: white;
1127
+ width: 100%;
1128
+ max-width: 900px;
1129
+ padding: 40px;
1130
+ border-radius: 12px;
1131
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
1132
+ box-sizing: border-box;
1133
+ }
1134
+
1135
+ @keyframes shimmer {
1136
+ 0% {
1137
+ background-position: -100% 0;
1138
+ }
1139
+ 100% {
1140
+ background-position: 100% 0;
1141
+ }
1142
+ }
1143
+
1144
+ .skeleton {
1145
+ background: ${skeletonBackgroundColor};
1146
+ background: linear-gradient(
1147
+ 90deg,
1148
+ ${skeletonBackgroundColor} 25%,
1149
+ ${skeletonShimmerColor} 50%,
1150
+ ${skeletonBackgroundColor} 75%
1151
+ );
1152
+ background-size: 200% 100%;
1153
+ animation: shimmer 1.5s infinite linear;
1154
+ border-radius: 6px;
1155
+ margin-bottom: 12px;
1156
+ }
1157
+
1158
+ .sk-title-lg {
1159
+ height: 36px;
1160
+ width: 50%;
1161
+ margin-bottom: 16px;
1162
+ }
1163
+ .sk-title-md {
1164
+ height: 28px;
1165
+ width: 30%;
1166
+ margin-bottom: 20px;
1167
+ margin-top: 40px;
1168
+ }
1169
+ .sk-text {
1170
+ height: 16px;
1171
+ width: 80%;
1172
+ margin-bottom: 8px;
1173
+ }
1174
+ .sk-text-short {
1175
+ width: 40%;
1176
+ }
1177
+ .sk-label {
1178
+ height: 14px;
1179
+ width: 25%;
1180
+ margin-bottom: 10px;
1181
+ }
1182
+
1183
+ .hero-section {
1184
+ display: flex;
1185
+ gap: 40px;
1186
+ margin-bottom: 40px;
1187
+ border-bottom: 1px solid ${borderColor};
1188
+ padding-bottom: 40px;
1189
+ flex-direction: row;
1190
+ }
1191
+ .hero-content {
1192
+ flex: 1;
1193
+ display: flex;
1194
+ flex-direction: column;
1195
+ justify-content: center;
1196
+ }
1197
+ .hero-image {
1198
+ flex: 1;
1199
+ height: 300px;
1200
+ border-radius: 12px;
1201
+ }
1202
+
1203
+ .share-section {
1204
+ margin-bottom: 40px;
1205
+ }
1206
+ .sk-input {
1207
+ height: 50px;
1208
+ width: 100%;
1209
+ border-radius: 8px;
1210
+ margin-bottom: 16px;
1211
+ }
1212
+ .social-buttons {
1213
+ display: flex;
1214
+ gap: 12px;
1215
+ }
1216
+ .sk-btn-social {
1217
+ flex: 1;
1218
+ height: 50px;
1219
+ border-radius: 8px;
1220
+ }
1221
+
1222
+ .stats-section {
1223
+ display: flex;
1224
+ gap: 24px;
1225
+ margin-bottom: 40px;
1226
+ padding: 30px 0;
1227
+ border-top: 1px solid ${borderColor};
1228
+ border-bottom: 1px solid ${borderColor};
1229
+ }
1230
+ .stat-card {
1231
+ flex: 1;
1232
+ display: flex;
1233
+ flex-direction: column;
1234
+ align-items: center;
1235
+ }
1236
+ .stat-divider {
1237
+ padding-left: 24px;
1238
+ }
1239
+
1240
+ .sk-stat-num {
1241
+ height: 48px;
1242
+ width: 120px;
1243
+ margin-bottom: 8px;
1244
+ }
1245
+ .sk-stat-label {
1246
+ height: 18px;
1247
+ width: 80px;
1248
+ }
1249
+
1250
+ .table-header {
1251
+ display: flex;
1252
+ gap: 16px;
1253
+ margin-bottom: 16px;
1254
+ }
1255
+ .sk-th {
1256
+ height: 16px;
1257
+ }
1258
+ .table-row {
1259
+ display: flex;
1260
+ align-items: center;
1261
+ gap: 16px;
1262
+ padding: 16px 0;
1263
+ border-bottom: 1px solid ${borderColor};
1264
+ }
1265
+
1266
+ .col-user {
1267
+ flex: 2;
1268
+ }
1269
+ .col-status {
1270
+ flex: 1;
1271
+ }
1272
+ .col-reward {
1273
+ flex: 2;
1274
+ }
1275
+ .col-date {
1276
+ flex: 1;
1277
+ }
1278
+
1279
+ .sk-badge {
1280
+ height: 28px;
1281
+ width: 90px;
1282
+ border-radius: 14px;
1283
+ }
1284
+ .sk-reward-block {
1285
+ height: 36px;
1286
+ width: 100%;
1287
+ border-radius: 6px;
1288
+ }
1289
+
1290
+ .pagination {
1291
+ display: flex;
1292
+ justify-content: flex-end;
1293
+ gap: 8px;
1294
+ margin-top: 24px;
1295
+ }
1296
+ .sk-btn-page {
1297
+ height: 36px;
1298
+ width: 64px;
1299
+ border-radius: 6px;
1300
+ margin-bottom: 0;
1301
+ }
1302
+
1303
+ @media (max-width: 768px) {
1304
+ body {
1305
+ padding: 20px;
1306
+ }
1307
+ .widget-container {
1308
+ padding: 24px;
1309
+ }
1310
+
1311
+ .hero-section {
1312
+ flex-direction: column-reverse;
1313
+ gap: 24px;
1314
+ }
1315
+ .hero-image {
1316
+ height: 220px;
1317
+ width: 100%;
1318
+ }
1319
+ .sk-title-lg {
1320
+ width: 80%;
1321
+ }
1322
+
1323
+ .col-date {
1324
+ display: none;
1325
+ }
1326
+ }
1327
+
1328
+ @media (max-width: 480px) {
1329
+ body {
1330
+ padding: 10px;
1331
+ }
1332
+ .widget-container {
1333
+ padding: 16px;
1334
+ }
1335
+
1336
+ .sk-stat-num {
1337
+ width: 80px;
1338
+ height: 40px;
1339
+ }
1340
+
1341
+ .col-reward {
1342
+ display: none;
1343
+ }
1344
+
1345
+ .col-user {
1346
+ flex: 3;
1347
+ }
1348
+ .col-status {
1349
+ flex: 2;
1350
+ display: flex;
1351
+ justify-content: flex-end;
1352
+ }
1353
+ }
1354
+ </style>
1355
+
1356
+ <div class="widget-container">
1357
+ <div class="hero-section">
1358
+ <div class="hero-content">
1359
+ <div class="skeleton sk-title-lg"></div>
1360
+ <div class="skeleton sk-text"></div>
1361
+ <div class="skeleton sk-text sk-text-short"></div>
1362
+ </div>
1363
+ <div class="skeleton hero-image"></div>
1364
+ </div>
1365
+
1366
+ <div class="share-section">
1367
+ <div class="skeleton sk-label"></div>
1368
+ <div class="skeleton sk-input"></div>
1369
+ <div class="social-buttons">
1370
+ <div class="skeleton sk-btn-social"></div>
1371
+ <div class="skeleton sk-btn-social"></div>
1372
+ <div class="skeleton sk-btn-social"></div>
1373
+ <div class="skeleton sk-btn-social"></div>
1374
+ </div>
1375
+ </div>
1376
+
1377
+ <div
1378
+ class="skeleton sk-title-md"
1379
+ style="margin-top: 0; width: 30%; margin-left: auto; margin-right: auto"
1380
+ ></div>
1381
+ <div
1382
+ class="skeleton sk-text"
1383
+ style="width: 60%; margin-left: auto; margin-right: auto"
1384
+ ></div>
1385
+
1386
+ <div class="stats-section">
1387
+ <div class="stat-card">
1388
+ <div class="skeleton sk-stat-num"></div>
1389
+ <div class="skeleton sk-stat-label"></div>
1390
+ </div>
1391
+ <div class="stat-card stat-divider">
1392
+ <div class="skeleton sk-stat-num"></div>
1393
+ <div class="skeleton sk-stat-label"></div>
1394
+ </div>
1395
+ </div>
1396
+
1397
+ <div class="skeleton sk-title-md"></div>
1398
+
1399
+ <div class="table-header">
1400
+ <div class="skeleton sk-th col-user"></div>
1401
+ <div class="skeleton sk-th col-status"></div>
1402
+ <div class="skeleton sk-th col-reward"></div>
1403
+ <div class="skeleton sk-th col-date"></div>
1404
+ </div>
1405
+
1406
+ <div class="table-row">
1407
+ <div class="col-user">
1408
+ <div class="skeleton sk-text" style="width: 70%; margin: 0"></div>
1409
+ </div>
1410
+ <div class="col-status">
1411
+ <div class="skeleton sk-badge" style="margin: 0"></div>
1412
+ </div>
1413
+ <div class="col-reward">
1414
+ <div class="skeleton sk-reward-block" style="margin: 0"></div>
1415
+ </div>
1416
+ <div class="col-date">
1417
+ <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1418
+ </div>
1419
+ </div>
1420
+ <div class="table-row">
1421
+ <div class="col-user">
1422
+ <div class="skeleton sk-text" style="width: 60%; margin: 0"></div>
1423
+ </div>
1424
+ <div class="col-status">
1425
+ <div class="skeleton sk-badge" style="margin: 0"></div>
1426
+ </div>
1427
+ <div class="col-reward">
1428
+ <div class="skeleton sk-reward-block" style="margin: 0"></div>
1429
+ </div>
1430
+ <div class="col-date">
1431
+ <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1432
+ </div>
1433
+ </div>
1434
+ <div class="table-row">
1435
+ <div class="col-user">
1436
+ <div class="skeleton sk-text" style="width: 75%; margin: 0"></div>
1437
+ </div>
1438
+ <div class="col-status">
1439
+ <div class="skeleton sk-badge" style="margin: 0"></div>
1440
+ </div>
1441
+ <div class="col-reward">
1442
+ <div class="skeleton sk-reward-block" style="margin: 0"></div>
1443
+ </div>
1444
+ <div class="col-date">
1445
+ <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1446
+ </div>
1447
+ </div>
1448
+
1449
+ <div class="pagination">
1450
+ <div class="skeleton sk-btn-page"></div>
1451
+ <div class="skeleton sk-btn-page"></div>
1452
+ </div>
1453
+ </div>
1454
+ `;
1455
+ };
1110
1456
  const _log$7 = browserExports.debug("squatch-js:EMBEDwidget");
1111
1457
  class EmbedWidget extends Widget {
1112
1458
  constructor(params, container) {
1113
1459
  super(params);
1114
1460
  __publicField(this, "show", this.open);
1115
1461
  __publicField(this, "hide", this.close);
1116
- if (container) this.container = container;
1462
+ if (container) {
1463
+ this.container = container;
1464
+ }
1117
1465
  }
1118
1466
  async load() {
1119
- var _a2, _b, _c, _d, _e, _f, _g, _h;
1467
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1120
1468
  const brandingConfig = (_b = (_a2 = this.context.widgetConfig) == null ? void 0 : _a2.values) == null ? void 0 : _b.brandingConfig;
1121
- const initialHeight = (_e = (_d = (_c = this.context.widgetConfig) == null ? void 0 : _c.values) == null ? void 0 : _d.brandingConfig) == null ? void 0 : _e.loadingHeight;
1122
- const sizes = (_f = brandingConfig == null ? void 0 : brandingConfig.widgetSize) == null ? void 0 : _f.embeddedWidgets;
1469
+ const initialHeight = brandingConfig == null ? void 0 : brandingConfig.loadingHeight;
1470
+ const skeletonBackgroundColor = (_d = (_c = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _c.loadingSkeleton) == null ? void 0 : _d.background;
1471
+ const skeletonShimmerColor = (_f = (_e = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _e.loadingSkeleton) == null ? void 0 : _f.animationBackground;
1472
+ const borderColor = (_g = brandingConfig == null ? void 0 : brandingConfig.border) == null ? void 0 : _g.borderColor;
1473
+ const sizes = (_h = brandingConfig == null ? void 0 : brandingConfig.widgetSize) == null ? void 0 : _h.embeddedWidgets;
1123
1474
  const maxWidth = (sizes == null ? void 0 : sizes.maxWidth) ? formatWidth(sizes.maxWidth) : "";
1124
1475
  const minWidth = (sizes == null ? void 0 : sizes.minWidth) ? formatWidth(sizes.minWidth) : "";
1125
1476
  console.log({
@@ -1127,31 +1478,46 @@ class EmbedWidget extends Widget {
1127
1478
  initialHeight,
1128
1479
  widgetConfig: this.context.widgetConfig
1129
1480
  });
1481
+ const skeletonHTML = getSkeleton({
1482
+ height: initialHeight,
1483
+ skeletonBackgroundColor,
1484
+ skeletonShimmerColor,
1485
+ borderColor
1486
+ });
1487
+ const skeletonContainer = document.createElement("div");
1488
+ skeletonContainer.innerHTML = skeletonHTML;
1130
1489
  const frame = this._createFrame({
1131
1490
  minWidth,
1132
1491
  maxWidth,
1133
1492
  initialHeight
1134
1493
  });
1135
1494
  const element = this._findElement();
1136
- if ((_g = this.context) == null ? void 0 : _g.container) {
1495
+ element.innerHTML = skeletonHTML;
1496
+ frame.style.display = "none";
1497
+ const injectContents = (target) => {
1498
+ target.appendChild(skeletonContainer);
1499
+ target.appendChild(frame);
1500
+ };
1501
+ if ((_i = this.context) == null ? void 0 : _i.container) {
1137
1502
  element.style.visibility = "hidden";
1138
1503
  element.style.height = "0";
1139
1504
  element.style["overflow-y"] = "hidden";
1140
1505
  }
1141
1506
  if (this.container) {
1142
1507
  if (element.shadowRoot) {
1143
- if (((_h = element.shadowRoot.lastChild) == null ? void 0 : _h.nodeName) === "IFRAME") {
1508
+ if (((_j = element.shadowRoot.lastChild) == null ? void 0 : _j.nodeName) === "IFRAME") {
1144
1509
  element.shadowRoot.replaceChild(frame, element.shadowRoot.lastChild);
1145
1510
  } else {
1146
- element.shadowRoot.appendChild(frame);
1511
+ injectContents(element.shadowRoot);
1147
1512
  }
1148
1513
  } else if (element.firstChild) {
1149
- element.replaceChild(frame, element.firstChild);
1514
+ element.innerHTML = "";
1515
+ injectContents(element);
1150
1516
  } else {
1151
- element.appendChild(frame);
1517
+ injectContents(element);
1152
1518
  }
1153
1519
  } else if (!element.firstChild || element.firstChild.nodeName === "#text") {
1154
- element.appendChild(frame);
1520
+ injectContents(element);
1155
1521
  }
1156
1522
  const { contentWindow } = frame;
1157
1523
  if (!contentWindow) {
@@ -1159,16 +1525,29 @@ class EmbedWidget extends Widget {
1159
1525
  }
1160
1526
  const frameDoc = contentWindow.document;
1161
1527
  frameDoc.open();
1162
- console.log({ content: this.content });
1528
+ console.log({ content: this.content, context: this.context, this: this });
1529
+ const domain = this.widgetApi.domain;
1163
1530
  frameDoc.write(`
1531
+ ${((_k = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _k.brandFont) && `
1532
+ <link rel="preconnect" href="https://fast${domain === "https://staging.referralsaasquatch.com" && "-staging"}.ssqt.io">
1533
+ <link rel="preconnect" href="https://fonts.gstatic.com">
1534
+ <link rel="preconnect" href="https://fonts.googleapis.com">
1535
+ <link rel="preload" href="https://fonts.googleapis.com/css2?family=${encodeURIComponent(
1536
+ (_l = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _l.brandFont
1537
+ )}" as="style">`}
1164
1538
  <script src="${this.npmCdn}/resize-observer-polyfill@1.5.x"><\/script>
1165
- ${this.content}
1166
- <style data-styles>
1167
- html:not(.hydrated) { visibility:hidden; }
1539
+ <style data-styles>
1540
+ html { visibility:hidden;}
1168
1541
  </style>
1542
+ ${this.content}
1543
+
1169
1544
  `);
1170
1545
  frameDoc.close();
1171
1546
  domready(frameDoc, async () => {
1547
+ if (skeletonContainer && skeletonContainer.parentNode) {
1548
+ skeletonContainer.parentNode.removeChild(skeletonContainer);
1549
+ }
1550
+ frame.style.display = "block";
1172
1551
  const _sqh = contentWindow.squatch || contentWindow.widgetIdent;
1173
1552
  frame.height = initialHeight || frameDoc.body.scrollHeight;
1174
1553
  console.log({ height: frameDoc.body.scrollHeight });
@@ -1807,7 +2186,8 @@ function _pushCookie() {
1807
2186
  }
1808
2187
  }
1809
2188
  const _log$3 = browserExports.debug("squatch-js");
1810
- function _getAutoConfig(configIn) {
2189
+ function _getAutoConfig() {
2190
+ var _a2;
1811
2191
  const queryString = window.location.search;
1812
2192
  const urlParams = new URLSearchParams(queryString);
1813
2193
  const refParam = urlParams.get("_saasquatchExtra") || "";
@@ -1815,6 +2195,13 @@ function _getAutoConfig(configIn) {
1815
2195
  _log$3("No _saasquatchExtra param");
1816
2196
  return;
1817
2197
  }
2198
+ const config = validateConfig({
2199
+ tenantAlias: "UNKNOWN"
2200
+ });
2201
+ if (!config.domain) {
2202
+ _log$3("domain must be provided in config to use _saasquatchExtra");
2203
+ return;
2204
+ }
1818
2205
  let raw;
1819
2206
  try {
1820
2207
  raw = JSON.parse(b64decode(refParam));
@@ -1822,8 +2209,13 @@ function _getAutoConfig(configIn) {
1822
2209
  _log$3("Unable to decode _saasquatchExtra config");
1823
2210
  return;
1824
2211
  }
1825
- const { domain, tenantAlias, widgetConfig } = convertExtraToConfig(raw);
1826
- if (!domain || !tenantAlias || !widgetConfig) {
2212
+ function normalizeDomain(domain) {
2213
+ return domain.replace(/^https?:\/\//, "");
2214
+ }
2215
+ const normalizedDomain = normalizeDomain(config.domain);
2216
+ const tenantAlias = Object.keys((raw == null ? void 0 : raw[normalizedDomain]) || {})[0];
2217
+ const widgetConfig = (_a2 = raw == null ? void 0 : raw[normalizedDomain]) == null ? void 0 : _a2[tenantAlias];
2218
+ if (!widgetConfig) {
1827
2219
  _log$3("_saasquatchExtra did not have an expected structure");
1828
2220
  return void 0;
1829
2221
  }
@@ -1835,20 +2227,11 @@ function _getAutoConfig(configIn) {
1835
2227
  ...rest
1836
2228
  },
1837
2229
  squatchConfig: {
1838
- ...configIn ? { configIn } : {},
1839
- domain,
2230
+ ...config,
1840
2231
  tenantAlias
1841
2232
  }
1842
2233
  };
1843
2234
  }
1844
- function convertExtraToConfig(obj) {
1845
- var _a2;
1846
- const _domain = Object.keys(obj || {})[0];
1847
- const tenantAlias = Object.keys((obj == null ? void 0 : obj[_domain]) || {})[0];
1848
- const widgetConfig = (_a2 = obj == null ? void 0 : obj[_domain]) == null ? void 0 : _a2[tenantAlias];
1849
- const domain = _domain ? `https://${_domain}` : void 0;
1850
- return { domain, tenantAlias, widgetConfig };
1851
- }
1852
2235
  const _log$2 = browserExports.debug("squatch-js:decodeUserJwt");
1853
2236
  function decodeUserJwt(tokenStr) {
1854
2237
  var _a2;
@@ -2161,9 +2544,9 @@ function widget(widgetConfig) {
2161
2544
  var _a2;
2162
2545
  return (_a2 = widgets()) == null ? void 0 : _a2.render(widgetConfig);
2163
2546
  }
2164
- function _auto(configIn) {
2547
+ function _auto() {
2165
2548
  var _a2;
2166
- const configs = _getAutoConfig(configIn);
2549
+ const configs = _getAutoConfig();
2167
2550
  if (configs) {
2168
2551
  const { squatchConfig, widgetConfig } = configs;
2169
2552
  init(squatchConfig);