@swell/apps-sdk 1.0.183 → 1.0.185
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/index.cjs +105 -75
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +105 -75
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +105 -75
- package/dist/index.mjs.map +2 -2
- package/dist/src/cache/html-cache/html-cache.d.ts +45 -14
- package/package.json +2 -4
package/dist/index.mjs
CHANGED
|
@@ -2903,7 +2903,7 @@ var LANG_TO_COUNTRY_CODES = {
|
|
|
2903
2903
|
var CURRENCY_COUNTRIES = Object.freeze({
|
|
2904
2904
|
USD: { name: "United States", iso: "US" },
|
|
2905
2905
|
EUR: { name: "Europe", iso: "EU" },
|
|
2906
|
-
GBP: { name: "United Kingdom", iso: "
|
|
2906
|
+
GBP: { name: "United Kingdom", iso: "GB" },
|
|
2907
2907
|
JPY: { name: "Japan", iso: "JP" },
|
|
2908
2908
|
CAD: { name: "Canada", iso: "CA" },
|
|
2909
2909
|
AUD: { name: "Australia", iso: "AU" },
|
|
@@ -4629,7 +4629,7 @@ function getSelectedSubscriptionPurchaseOptionPlan(selectedPurchaseOptionType, s
|
|
|
4629
4629
|
return selectedPlan || subscriptionPurchaseOption.plans[0];
|
|
4630
4630
|
}
|
|
4631
4631
|
var SORT_OPTIONS = Object.freeze([
|
|
4632
|
-
{ value: "", name: "Featured" },
|
|
4632
|
+
{ value: "manual", name: "Featured" },
|
|
4633
4633
|
{ value: "popularity", name: "Popularity", query: "popularity desc" },
|
|
4634
4634
|
{ value: "price_asc", name: "Price, low to high", query: "price asc" },
|
|
4635
4635
|
{ value: "price_desc", name: "Price, high to low", query: "price desc" },
|
|
@@ -4639,7 +4639,7 @@ var SORT_OPTIONS = Object.freeze([
|
|
|
4639
4639
|
{ value: "name_desc", name: "Product name, Z-A", query: "name desc" }
|
|
4640
4640
|
]);
|
|
4641
4641
|
async function getProductFilters(swell, productQuery) {
|
|
4642
|
-
const sortBy = swell.queryParams.sort || "";
|
|
4642
|
+
const sortBy = swell.queryParams.sort || "manual";
|
|
4643
4643
|
const filterQuery = productQueryWithFilters(swell, productQuery);
|
|
4644
4644
|
return {
|
|
4645
4645
|
filter_options: await getProductFiltersByQuery(swell, filterQuery),
|
|
@@ -4686,7 +4686,7 @@ function productQueryWithFilters(swell, query) {
|
|
|
4686
4686
|
},
|
|
4687
4687
|
{}
|
|
4688
4688
|
);
|
|
4689
|
-
const sortBy = swell.queryParams.sort || "";
|
|
4689
|
+
const sortBy = swell.queryParams.sort || "manual";
|
|
4690
4690
|
return {
|
|
4691
4691
|
sort: SORT_OPTIONS.find((option) => option.value === sortBy)?.query || void 0,
|
|
4692
4692
|
$filters: filters2,
|
|
@@ -17441,14 +17441,14 @@ function getRobotsGlobals(canonicalUrl) {
|
|
|
17441
17441
|
default_groups: [
|
|
17442
17442
|
{
|
|
17443
17443
|
user_agent: RobotsRule.from("User-agent", "*"),
|
|
17444
|
-
|
|
17444
|
+
sitemap: RobotsRule.from("Sitemap", sitemapUrl),
|
|
17445
17445
|
rules: defaultRules.map(
|
|
17446
17446
|
(rule) => RobotsRule.from(rule.directive, rule.value)
|
|
17447
17447
|
)
|
|
17448
17448
|
},
|
|
17449
17449
|
{
|
|
17450
17450
|
user_agent: RobotsRule.from("User-agent", "AhrefsBot"),
|
|
17451
|
-
|
|
17451
|
+
sitemap: RobotsRule.from("Sitemap", sitemapUrl),
|
|
17452
17452
|
rules: [
|
|
17453
17453
|
RobotsRule.from("Crawl-delay", "10"),
|
|
17454
17454
|
...defaultRules.map(
|
|
@@ -17458,7 +17458,7 @@ function getRobotsGlobals(canonicalUrl) {
|
|
|
17458
17458
|
},
|
|
17459
17459
|
{
|
|
17460
17460
|
user_agent: RobotsRule.from("User-agent", "AhrefsSiteAudit"),
|
|
17461
|
-
|
|
17461
|
+
sitemap: RobotsRule.from("Sitemap", sitemapUrl),
|
|
17462
17462
|
rules: [
|
|
17463
17463
|
RobotsRule.from("Crawl-delay", "10"),
|
|
17464
17464
|
...defaultRules.map(
|
|
@@ -19418,6 +19418,35 @@ var DEFAULT_CACHE_RULES = {
|
|
|
19418
19418
|
},
|
|
19419
19419
|
pathRules: [{ path: "/checkout/*", skip: true }]
|
|
19420
19420
|
};
|
|
19421
|
+
var SANITIZE_CLIENT_HEADERS = Object.freeze([
|
|
19422
|
+
"connection",
|
|
19423
|
+
"proxy-connection",
|
|
19424
|
+
"keep-alive",
|
|
19425
|
+
"transfer-encoding",
|
|
19426
|
+
"upgrade",
|
|
19427
|
+
"proxy-authenticate",
|
|
19428
|
+
"proxy-authorization",
|
|
19429
|
+
"te",
|
|
19430
|
+
"trailers",
|
|
19431
|
+
"via",
|
|
19432
|
+
"alt-svc",
|
|
19433
|
+
"content-length",
|
|
19434
|
+
"content-encoding",
|
|
19435
|
+
// Also strip any legacy internal metadata keys
|
|
19436
|
+
"x-original-ttl",
|
|
19437
|
+
"x-original-swr",
|
|
19438
|
+
"x-cache-time"
|
|
19439
|
+
]);
|
|
19440
|
+
var CACHE_KEY_HEADERS = Object.freeze([
|
|
19441
|
+
"cookie",
|
|
19442
|
+
"swell-storefront-id",
|
|
19443
|
+
"swell-app-id",
|
|
19444
|
+
"swell-access-token",
|
|
19445
|
+
"swell-theme-version-hash",
|
|
19446
|
+
"swell-cache-modified",
|
|
19447
|
+
"x-locale",
|
|
19448
|
+
"swell-storefront-context"
|
|
19449
|
+
]);
|
|
19421
19450
|
var HtmlCache = class {
|
|
19422
19451
|
epoch;
|
|
19423
19452
|
backend;
|
|
@@ -19425,7 +19454,23 @@ var HtmlCache = class {
|
|
|
19425
19454
|
constructor(epoch, backend, cacheRules = DEFAULT_CACHE_RULES) {
|
|
19426
19455
|
this.epoch = epoch;
|
|
19427
19456
|
this.backend = backend;
|
|
19428
|
-
this.cacheRules =
|
|
19457
|
+
this.cacheRules = {
|
|
19458
|
+
...cacheRules,
|
|
19459
|
+
pathRules: cacheRules.pathRules?.map((rule) => ({
|
|
19460
|
+
...rule,
|
|
19461
|
+
regex: this.convertPathToRegex(rule.path)
|
|
19462
|
+
}))
|
|
19463
|
+
};
|
|
19464
|
+
}
|
|
19465
|
+
/**
|
|
19466
|
+
* Converts wildcard pattern to regex and tests against path.
|
|
19467
|
+
*
|
|
19468
|
+
* - `*` matches any characters except `/`
|
|
19469
|
+
* - `**` matches any characters including `/`
|
|
19470
|
+
*/
|
|
19471
|
+
convertPathToRegex(pattern) {
|
|
19472
|
+
const regex = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "___DOUBLE_STAR___").replace(/\*/g, "[^/]*").replace(/___DOUBLE_STAR___/g, ".*");
|
|
19473
|
+
return new RegExp(`^${regex}$`);
|
|
19429
19474
|
}
|
|
19430
19475
|
async get(request) {
|
|
19431
19476
|
const trace = createTraceId();
|
|
@@ -19516,18 +19561,18 @@ var HtmlCache = class {
|
|
|
19516
19561
|
);
|
|
19517
19562
|
return;
|
|
19518
19563
|
}
|
|
19519
|
-
const
|
|
19564
|
+
const date = /* @__PURE__ */ new Date();
|
|
19520
19565
|
const headers = this.normalizeHeaders(response.headers);
|
|
19521
19566
|
const entry = {
|
|
19522
19567
|
status: response.status,
|
|
19523
19568
|
statusText: response.statusText,
|
|
19524
19569
|
headers,
|
|
19525
19570
|
body,
|
|
19526
|
-
cacheTimeISO,
|
|
19571
|
+
cacheTimeISO: date.toISOString(),
|
|
19527
19572
|
ttl,
|
|
19528
19573
|
swr,
|
|
19529
19574
|
etag: this.quoteETag(headers["etag"] || md5(body)),
|
|
19530
|
-
lastModifiedUTC: headers["last-modified"] ||
|
|
19575
|
+
lastModifiedUTC: headers["last-modified"] || date.toUTCString()
|
|
19531
19576
|
};
|
|
19532
19577
|
const hardExpireSeconds = ttl + swr;
|
|
19533
19578
|
await this.backend.write(cacheKey, entry, hardExpireSeconds);
|
|
@@ -19552,8 +19597,13 @@ var HtmlCache = class {
|
|
|
19552
19597
|
}
|
|
19553
19598
|
}
|
|
19554
19599
|
canReadFromCache(request) {
|
|
19555
|
-
|
|
19556
|
-
|
|
19600
|
+
switch (request.method.toUpperCase()) {
|
|
19601
|
+
case "GET":
|
|
19602
|
+
case "HEAD":
|
|
19603
|
+
break;
|
|
19604
|
+
default:
|
|
19605
|
+
return false;
|
|
19606
|
+
}
|
|
19557
19607
|
const res = this.resolvePathRule(request);
|
|
19558
19608
|
if (res.skip) return false;
|
|
19559
19609
|
return this.isRequestCacheable(request);
|
|
@@ -19619,7 +19669,7 @@ var HtmlCache = class {
|
|
|
19619
19669
|
try {
|
|
19620
19670
|
const ifModDate = new Date(ifModifiedSince);
|
|
19621
19671
|
const lastModDate = new Date(lastModified);
|
|
19622
|
-
if (isNaN(ifModDate.getTime()) || isNaN(lastModDate.getTime())) {
|
|
19672
|
+
if (Number.isNaN(ifModDate.getTime()) || Number.isNaN(lastModDate.getTime())) {
|
|
19623
19673
|
return false;
|
|
19624
19674
|
}
|
|
19625
19675
|
return ifModDate >= lastModDate;
|
|
@@ -19649,31 +19699,25 @@ var HtmlCache = class {
|
|
|
19649
19699
|
return `"${value}"`;
|
|
19650
19700
|
}
|
|
19651
19701
|
sanitizeClientHeaders(headers) {
|
|
19652
|
-
const
|
|
19653
|
-
|
|
19654
|
-
|
|
19655
|
-
|
|
19656
|
-
|
|
19657
|
-
|
|
19658
|
-
|
|
19659
|
-
|
|
19660
|
-
|
|
19661
|
-
|
|
19662
|
-
|
|
19663
|
-
|
|
19664
|
-
|
|
19665
|
-
];
|
|
19666
|
-
for (const h of HOP_BY_HOP) headers.delete(h);
|
|
19667
|
-
headers.delete("content-encoding");
|
|
19668
|
-
headers.delete("x-original-ttl");
|
|
19669
|
-
headers.delete("x-original-swr");
|
|
19670
|
-
headers.delete("x-cache-time");
|
|
19702
|
+
for (const name of SANITIZE_CLIENT_HEADERS) {
|
|
19703
|
+
headers.delete(name);
|
|
19704
|
+
}
|
|
19705
|
+
}
|
|
19706
|
+
getCacheKeyHeaders(headers) {
|
|
19707
|
+
const acc = new Headers();
|
|
19708
|
+
for (const name of CACHE_KEY_HEADERS) {
|
|
19709
|
+
const value = headers.get(name);
|
|
19710
|
+
if (value) {
|
|
19711
|
+
acc.set(name, value);
|
|
19712
|
+
}
|
|
19713
|
+
}
|
|
19714
|
+
return acc;
|
|
19671
19715
|
}
|
|
19672
19716
|
generateVersionHash(headers) {
|
|
19673
|
-
const swellData = this.extractSwellData(headers);
|
|
19717
|
+
const swellData = this.extractSwellData(headers.get("cookie"));
|
|
19674
19718
|
const versionFactors = {
|
|
19675
19719
|
store: headers.get("swell-storefront-id") || "",
|
|
19676
|
-
app:
|
|
19720
|
+
app: headers.get("swell-app-id") || "",
|
|
19677
19721
|
auth: headers.get("swell-access-token") || "",
|
|
19678
19722
|
theme: headers.get("swell-theme-version-hash") || "",
|
|
19679
19723
|
modified: headers.get("swell-cache-modified") || "",
|
|
@@ -19684,8 +19728,7 @@ var HtmlCache = class {
|
|
|
19684
19728
|
};
|
|
19685
19729
|
return md5(JSON.stringify(versionFactors));
|
|
19686
19730
|
}
|
|
19687
|
-
extractSwellData(
|
|
19688
|
-
const cookie = headers.get("cookie");
|
|
19731
|
+
extractSwellData(cookie) {
|
|
19689
19732
|
if (!cookie) return {};
|
|
19690
19733
|
const swellDataMatch = cookie.match(/swell-data=([^;]+)/);
|
|
19691
19734
|
if (!swellDataMatch) return {};
|
|
@@ -19737,15 +19780,6 @@ var HtmlCache = class {
|
|
|
19737
19780
|
const age = (Date.now() - t) / 1e3;
|
|
19738
19781
|
return age < 0 ? 0 : age;
|
|
19739
19782
|
}
|
|
19740
|
-
/**
|
|
19741
|
-
* Converts wildcard pattern to regex and tests against path.
|
|
19742
|
-
* - * matches any characters except /
|
|
19743
|
-
* - ** matches any characters including /
|
|
19744
|
-
*/
|
|
19745
|
-
pathMatches(pattern, path) {
|
|
19746
|
-
const regex = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "___DOUBLE_STAR___").replace(/\*/g, "[^/]*").replace(/___DOUBLE_STAR___/g, ".*");
|
|
19747
|
-
return new RegExp(`^${regex}$`).test(path);
|
|
19748
|
-
}
|
|
19749
19783
|
normalizeHeaders(headers) {
|
|
19750
19784
|
const normalized = {};
|
|
19751
19785
|
headers.forEach((value, key) => {
|
|
@@ -19756,16 +19790,10 @@ var HtmlCache = class {
|
|
|
19756
19790
|
resolvePathRule(request) {
|
|
19757
19791
|
const url = new URL(request.url);
|
|
19758
19792
|
const mode = this.getDeploymentMode(request.headers);
|
|
19759
|
-
const defaults = this.cacheRules.defaults?.[mode] ?? DEFAULT_CACHE_RULES.defaults[mode];
|
|
19760
|
-
|
|
19761
|
-
|
|
19762
|
-
|
|
19763
|
-
if (this.pathMatches(r.path, url.pathname)) {
|
|
19764
|
-
rule = r;
|
|
19765
|
-
break;
|
|
19766
|
-
}
|
|
19767
|
-
}
|
|
19768
|
-
}
|
|
19793
|
+
const defaults = this.cacheRules.defaults?.[mode] ?? DEFAULT_CACHE_RULES.defaults?.[mode];
|
|
19794
|
+
const rule = this.cacheRules.pathRules?.find(
|
|
19795
|
+
(r) => r.regex.test(url.pathname)
|
|
19796
|
+
);
|
|
19769
19797
|
const effectiveTTL = (rule?.ttl !== void 0 ? rule.ttl : defaults?.ttl) ?? defaults.ttl;
|
|
19770
19798
|
const effectiveSWR = (rule?.swr !== void 0 ? rule.swr : defaults?.swr) ?? defaults.swr;
|
|
19771
19799
|
return {
|
|
@@ -19777,27 +19805,29 @@ var HtmlCache = class {
|
|
|
19777
19805
|
};
|
|
19778
19806
|
}
|
|
19779
19807
|
normalizeSearchParams(searchParams) {
|
|
19780
|
-
const ignoredParams = [
|
|
19781
|
-
"utm_source",
|
|
19782
|
-
"utm_medium",
|
|
19783
|
-
"utm_campaign",
|
|
19784
|
-
"utm_content",
|
|
19785
|
-
"utm_term",
|
|
19786
|
-
"fbclid",
|
|
19787
|
-
"gclid",
|
|
19788
|
-
"gbraid",
|
|
19789
|
-
"wbraid",
|
|
19790
|
-
"ref",
|
|
19791
|
-
"source",
|
|
19792
|
-
"mc_cid",
|
|
19793
|
-
"mc_eid"
|
|
19794
|
-
];
|
|
19795
19808
|
const relevantParams = [];
|
|
19796
19809
|
searchParams.forEach((value, key) => {
|
|
19797
|
-
|
|
19798
|
-
|
|
19799
|
-
|
|
19800
|
-
|
|
19810
|
+
switch (key) {
|
|
19811
|
+
case "utm_source":
|
|
19812
|
+
case "utm_medium":
|
|
19813
|
+
case "utm_campaign":
|
|
19814
|
+
case "utm_content":
|
|
19815
|
+
case "utm_term":
|
|
19816
|
+
case "fbclid":
|
|
19817
|
+
case "gclid":
|
|
19818
|
+
case "gbraid":
|
|
19819
|
+
case "wbraid":
|
|
19820
|
+
case "ref":
|
|
19821
|
+
case "source":
|
|
19822
|
+
case "mc_cid":
|
|
19823
|
+
case "mc_eid":
|
|
19824
|
+
break;
|
|
19825
|
+
default: {
|
|
19826
|
+
relevantParams.push(
|
|
19827
|
+
`${encodeURIComponent(key)}=${encodeURIComponent(value)}`
|
|
19828
|
+
);
|
|
19829
|
+
break;
|
|
19830
|
+
}
|
|
19801
19831
|
}
|
|
19802
19832
|
});
|
|
19803
19833
|
return relevantParams.sort().join("&");
|