@standhigher/besttrack-page-extension 0.5.11 → 0.5.12

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.
@@ -2,7 +2,7 @@ import {
2
2
  isSafeTrackingPageUrl,
3
3
  isShopifyResourceReference,
4
4
  isValidTrackingNumber
5
- } from "./chunk-KEW42Y26.js";
5
+ } from "./chunk-KD7KFFFK.js";
6
6
 
7
7
  // src/validation.ts
8
8
  var textField = { field: "besttrack.validation.text", control: "text" };
@@ -78,7 +78,9 @@ var brandedContracts = [
78
78
  block("besttrack.branded.tracking-experience", 1, ["heading", "submitLabel", "trackAnotherLabel", "defaultTrackingNumber", "defaultOrderNumber", "defaultQueryMode", "trackingTabLabel", "orderTabLabel", "shipmentLabels", "heroImageUrl"], ["brand", "compact"], void 0, ["heroImageUrl"]),
79
79
  block("besttrack.branded.query", 1, ["heading", "submitLabel", "defaultTrackingNumber", "defaultOrderNumber", "defaultQueryMode", "trackingTabLabel", "orderTabLabel", "shipmentLabels", "heroImageUrl"], ["brand", "compact"], void 0, ["heroImageUrl"]),
80
80
  block("besttrack.branded.order-items", 1, ["heading"], ["brand", "minimal"]),
81
- block("besttrack.branded.recommendations", 1, ["heading", "hideWhenEmpty"], ["brand", "editorial"]),
81
+ // 服务端文档契约同步新增的商家选品字段,最后一项声明 products 控件,避免把商品数组当文本校验。
82
+ // hideWhenEmpty 继续接收旧文档数据;实际 Web 显隐已统一,不再受这个遗留值控制。
83
+ block("besttrack.branded.recommendations", 1, ["heading", "hideWhenEmpty", "products"], ["brand", "editorial"], void 0, [], [], ["products"]),
82
84
  block("besttrack.branded.quick-links", 1, ["heading", "primaryLabel", "primaryHref", "secondaryLabel", "secondaryHref"], ["brand"], void 0, ["primaryHref", "secondaryHref"]),
83
85
  block("besttrack.branded.blog", 1, ["heading", "articleTitle", "excerpt", "articleHref", "linkLabel"], ["brand"], void 0, ["articleHref"])
84
86
  ];
@@ -90,7 +92,8 @@ var salesContracts = [
90
92
  block("besttrack.sales.service-cards", 1, ["heading", "firstTitle", "firstDescription", "secondTitle", "secondDescription"], ["hero", "commerce"], textProps([["heading", 120], ["firstTitle", 120], ["firstDescription", 280], ["secondTitle", 120], ["secondDescription", 280]])),
91
93
  block("besttrack.sales.product-categories", 3, ["heading", "collection"], ["hero", "commerce", "grid"], validateCategories, [], ["collection"]),
92
94
  block("besttrack.sales.featured-product", 1, ["heading", "product"], ["hero", "commerce"], validateFeaturedProduct, [], ["product"]),
93
- block("besttrack.sales.recommendations", 1, ["heading"], ["hero", "commerce", "grid"], textProps([["heading", 120]]))
95
+ // 与 Sales 编辑器字段定义同步;只校验文档里的选品配置,不把 Runtime 推荐结果写入文档。
96
+ block("besttrack.sales.recommendations", 1, ["heading", "products"], ["hero", "commerce", "grid"], textProps([["heading", 120]]), [], [], ["products"])
94
97
  ];
95
98
  function template(id, version, requiredBlocks) {
96
99
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@standhigher/besttrack-page-extension",
3
- "version": "0.5.11",
3
+ "version": "0.5.12",
4
4
  "description": "BestTrack business extension entry point for @standhigher/puck-page-builder.",
5
5
  "type": "module",
6
6
  "files": [
@@ -22,7 +22,7 @@
22
22
  "dependencies": {
23
23
  "embla-carousel-autoplay": "^8.6.0",
24
24
  "embla-carousel-react": "^8.6.0",
25
- "@standhigher/puck-page-builder": "0.12.10"
25
+ "@standhigher/puck-page-builder": "0.12.12"
26
26
  },
27
27
  "devDependencies": {
28
28
  "tsup": "^8.5.1",
@@ -1,29 +1,3 @@
1
- // src/tracking-page-url.ts
2
- function hasControlCharacter(value) {
3
- return [...value].some((character) => character.charCodeAt(0) < 32);
4
- }
5
- function isLocalDevelopmentHost(hostname) {
6
- return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
7
- }
8
- function allowsLocalhostByDefault() {
9
- return typeof window !== "undefined" && isLocalDevelopmentHost(window.location.hostname);
10
- }
11
- function safeTrackingPageUrl(value, options = {}) {
12
- if (typeof value !== "string" || !value || value.trim() !== value || hasControlCharacter(value)) return void 0;
13
- try {
14
- const url = new URL(value);
15
- if (url.username || url.password) return void 0;
16
- if (url.protocol === "https:" && !isLocalDevelopmentHost(url.hostname)) return url.toString();
17
- if (url.protocol === "http:" && isLocalDevelopmentHost(url.hostname) && (options.allowLocalhost ?? allowsLocalhostByDefault())) return url.toString();
18
- return void 0;
19
- } catch {
20
- return void 0;
21
- }
22
- }
23
- function isSafeTrackingPageUrl(value, options) {
24
- return safeTrackingPageUrl(value, options) !== void 0;
25
- }
26
-
27
1
  // src/tracking-page-runtime.ts
28
2
  function isValidTrackingNumber(value) {
29
3
  return /^[A-Za-z0-9_-]{6,64}$/.test(value);
@@ -53,6 +27,32 @@ function formatTrackingPageMoney(value, locale = "en-US") {
53
27
  }
54
28
  }
55
29
 
30
+ // src/tracking-page-url.ts
31
+ function hasControlCharacter(value) {
32
+ return [...value].some((character) => character.charCodeAt(0) < 32);
33
+ }
34
+ function isLocalDevelopmentHost(hostname) {
35
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
36
+ }
37
+ function allowsLocalhostByDefault() {
38
+ return typeof window !== "undefined" && isLocalDevelopmentHost(window.location.hostname);
39
+ }
40
+ function safeTrackingPageUrl(value, options = {}) {
41
+ if (typeof value !== "string" || !value || value.trim() !== value || hasControlCharacter(value)) return void 0;
42
+ try {
43
+ const url = new URL(value);
44
+ if (url.username || url.password) return void 0;
45
+ if (url.protocol === "https:" && !isLocalDevelopmentHost(url.hostname)) return url.toString();
46
+ if (url.protocol === "http:" && isLocalDevelopmentHost(url.hostname) && (options.allowLocalhost ?? allowsLocalhostByDefault())) return url.toString();
47
+ return void 0;
48
+ } catch {
49
+ return void 0;
50
+ }
51
+ }
52
+ function isSafeTrackingPageUrl(value, options) {
53
+ return safeTrackingPageUrl(value, options) !== void 0;
54
+ }
55
+
56
56
  // src/shopify-resource-contract.ts
57
57
  var resourcePattern = /^gid:\/\/shopify\/(Product|Collection)\/[1-9]\d*$/;
58
58
  function isShopifyResourceReference(value, kind) {
@@ -112,14 +112,14 @@ function getShopifyResourceResolutionError(reference, resolution) {
112
112
  }
113
113
 
114
114
  export {
115
- safeTrackingPageUrl,
116
- isSafeTrackingPageUrl,
117
115
  isValidTrackingNumber,
118
116
  isValidOrderNumber,
119
117
  isValidOrderEmail,
120
118
  isEmptyTrackingPageResult,
121
119
  isTrackingPageResourceReference,
122
120
  formatTrackingPageMoney,
121
+ safeTrackingPageUrl,
122
+ isSafeTrackingPageUrl,
123
123
  isShopifyResourceReference,
124
124
  resolveShopifyResources,
125
125
  getResolvedShopifyResource,