@salesforce/storefront-next-runtime 1.0.0-alpha.0 → 1.0.0-alpha.1
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/ComponentContext.js +199 -4
- package/dist/ComponentContext.js.map +1 -1
- package/dist/DesignComponent.js +2 -2
- package/dist/DesignRegion.js +2 -2
- package/dist/RegionContext.js +9 -0
- package/dist/RegionContext.js.map +1 -0
- package/dist/component.types.d.ts +1 -1
- package/dist/config.d.ts +6 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/data-store.d.ts +3 -3
- package/dist/data-store.d.ts.map +1 -1
- package/dist/defaults.d.ts +106 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +67 -0
- package/dist/defaults.js.map +1 -0
- package/dist/design-data.d.ts +10 -332
- package/dist/design-data.d.ts.map +1 -1
- package/dist/design-data.js +67 -23
- package/dist/design-data.js.map +1 -1
- package/dist/design-react-core.d.ts +5 -15
- package/dist/design-react-core.d.ts.map +1 -1
- package/dist/design-react-core.js +2 -2
- package/dist/design-react.d.ts +2 -2
- package/dist/design.d.ts +2 -2
- package/dist/scapi.d.ts.map +1 -1
- package/dist/security-react.d.ts +34 -0
- package/dist/security-react.d.ts.map +1 -0
- package/dist/security-react.js +21 -0
- package/dist/security-react.js.map +1 -0
- package/dist/security.d.ts +61 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +304 -0
- package/dist/security.js.map +1 -0
- package/dist/site-context.d.ts +2 -2
- package/dist/types3.d.ts +1 -35
- package/dist/types3.d.ts.map +1 -1
- package/package.json +15 -2
- package/dist/DesignFrame.js +0 -204
- package/dist/DesignFrame.js.map +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
//#region src/security/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2026 Salesforce, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Security response headers configuration. Plumb into the template's
|
|
19
|
+
* `Config` via `AppConfig.security`; the SDK fills in defaults for any
|
|
20
|
+
* field omitted.
|
|
21
|
+
*
|
|
22
|
+
* Setting any directive on `csp.directives` fully replaces the SDK
|
|
23
|
+
* default for that directive — copy from `defaultCspDirectives` to extend.
|
|
24
|
+
*/
|
|
25
|
+
interface SecurityConfig {
|
|
26
|
+
/** Master toggle. When false, the middleware is a no-op. Default: true. */
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
/** CSP configuration. Set to false to disable CSP only. */
|
|
29
|
+
csp?: CspConfig | false;
|
|
30
|
+
/** HSTS configuration. Set to false to disable HSTS only. */
|
|
31
|
+
hsts?: HstsConfig | false;
|
|
32
|
+
/** X-Frame-Options. Set to false to disable. Default: 'SAMEORIGIN'. */
|
|
33
|
+
frameOptions?: 'DENY' | 'SAMEORIGIN' | false;
|
|
34
|
+
/** X-Content-Type-Options. Set to false to disable. Default: 'nosniff'. */
|
|
35
|
+
contentTypeOptions?: 'nosniff' | false;
|
|
36
|
+
/** Referrer-Policy. Set to false to disable. Default: 'strict-origin-when-cross-origin'. */
|
|
37
|
+
referrerPolicy?: ReferrerPolicyValue | false;
|
|
38
|
+
/** Permissions-Policy. Set to false to disable. Default: deny camera/microphone/geolocation. */
|
|
39
|
+
permissionsPolicy?: Record<string, string[]> | false;
|
|
40
|
+
}
|
|
41
|
+
interface CspConfig {
|
|
42
|
+
/** Map of CSP directive name → array of source values. Each directive fully replaces the SDK default. */
|
|
43
|
+
directives?: CspDirectives;
|
|
44
|
+
/**
|
|
45
|
+
* Send 'Content-Security-Policy-Report-Only' instead of 'Content-Security-Policy'.
|
|
46
|
+
* Logs a boot warning. For migration only — flip to false for production. Default: false.
|
|
47
|
+
*/
|
|
48
|
+
reportOnly?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* CSP directive map. `'upgrade-insecure-requests'` is a no-value directive
|
|
52
|
+
* (its presence is the signal); all others take an array of source expressions.
|
|
53
|
+
*/
|
|
54
|
+
type CspDirectives = Partial<Record<'default-src' | 'script-src' | 'style-src' | 'img-src' | 'font-src' | 'connect-src' | 'frame-src' | 'frame-ancestors' | 'form-action' | 'base-uri' | 'object-src' | 'manifest-src' | 'media-src' | 'worker-src' | 'child-src' | 'report-uri' | 'report-to', string[]> & {
|
|
55
|
+
'upgrade-insecure-requests'?: true;
|
|
56
|
+
}>;
|
|
57
|
+
interface HstsConfig {
|
|
58
|
+
/** Max age in seconds. Default: 15552000 (180 days). */
|
|
59
|
+
maxAge?: number;
|
|
60
|
+
/** Default: true. */
|
|
61
|
+
includeSubDomains?: boolean;
|
|
62
|
+
/** Default: false. Setting true is a one-way decision (requires hstspreload.org submission). */
|
|
63
|
+
preload?: boolean;
|
|
64
|
+
}
|
|
65
|
+
type ReferrerPolicyValue = 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';
|
|
66
|
+
/**
|
|
67
|
+
* Fully resolved (post-merge) security config — every field non-optional.
|
|
68
|
+
* Used internally by the middleware after applying defaults to customer config.
|
|
69
|
+
*/
|
|
70
|
+
interface ResolvedSecurityConfig {
|
|
71
|
+
enabled: boolean;
|
|
72
|
+
csp: {
|
|
73
|
+
directives: CspDirectives;
|
|
74
|
+
reportOnly: boolean;
|
|
75
|
+
} | false;
|
|
76
|
+
hsts: Required<HstsConfig> | false;
|
|
77
|
+
frameOptions: 'DENY' | 'SAMEORIGIN' | false;
|
|
78
|
+
contentTypeOptions: 'nosniff' | false;
|
|
79
|
+
referrerPolicy: ReferrerPolicyValue | false;
|
|
80
|
+
permissionsPolicy: Record<string, string[]> | false;
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region src/security/defaults.d.ts
|
|
84
|
+
/**
|
|
85
|
+
* SDK default CSP directives. Customers extending CSP should spread this:
|
|
86
|
+
*
|
|
87
|
+
* ```ts
|
|
88
|
+
* import { defaultCspDirectives } from '@salesforce/storefront-next-runtime/security';
|
|
89
|
+
* security: {
|
|
90
|
+
* csp: {
|
|
91
|
+
* directives: {
|
|
92
|
+
* ...defaultCspDirectives,
|
|
93
|
+
* 'script-src': [...defaultCspDirectives['script-src']!, 'https://cdn.foo.com'],
|
|
94
|
+
* },
|
|
95
|
+
* },
|
|
96
|
+
* }
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* The per-request nonce is appended to `script-src` at request time; it is
|
|
100
|
+
* NOT in this static map.
|
|
101
|
+
*/
|
|
102
|
+
declare const defaultCspDirectives: CspDirectives;
|
|
103
|
+
declare const defaultSecurityHeaders: ResolvedSecurityConfig;
|
|
104
|
+
//#endregion
|
|
105
|
+
export { HstsConfig as a, SecurityConfig as c, CspDirectives as i, defaultSecurityHeaders as n, ReferrerPolicyValue as o, CspConfig as r, ResolvedSecurityConfig as s, defaultCspDirectives as t };
|
|
106
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","names":[],"sources":["../src/security/types.ts","../src/security/defaults.ts"],"sourcesContent":[],"mappings":";;AAwBA;;;;;;AAiBA;AAcA;AAuBA;AASA;AAcA;;;;;;;;;;AClEA;AA4BA;UDvCiB,cAAA;;;;QAIP;;SAEC;;;;;;mBAMU;;sBAEG;;UAGP,SAAA;;eAEA;;;;;;;;;;;KAYL,aAAA,GAAgB,QACxB;;;UAsBa,UAAA;;;;;;;;KASL,mBAAA;;;;;UAcK,sBAAA;;;gBAEM;;;QACb,SAAS;;;kBAGC;qBACG;;;;;;;;;ACzEvB;AA4BA;;;;;;;;;;;;cA5Ba,sBAAsB;cA4BtB,wBAAwB"}
|
package/dist/defaults.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//#region src/security/defaults.ts
|
|
2
|
+
/**
|
|
3
|
+
* SDK default CSP directives. Customers extending CSP should spread this:
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { defaultCspDirectives } from '@salesforce/storefront-next-runtime/security';
|
|
7
|
+
* security: {
|
|
8
|
+
* csp: {
|
|
9
|
+
* directives: {
|
|
10
|
+
* ...defaultCspDirectives,
|
|
11
|
+
* 'script-src': [...defaultCspDirectives['script-src']!, 'https://cdn.foo.com'],
|
|
12
|
+
* },
|
|
13
|
+
* },
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* The per-request nonce is appended to `script-src` at request time; it is
|
|
18
|
+
* NOT in this static map.
|
|
19
|
+
*/
|
|
20
|
+
const defaultCspDirectives = {
|
|
21
|
+
"default-src": ["'self'"],
|
|
22
|
+
"script-src": ["'self'", "https://challenges.cloudflare.com"],
|
|
23
|
+
"style-src": ["'self'", "'unsafe-inline'"],
|
|
24
|
+
"img-src": [
|
|
25
|
+
"'self'",
|
|
26
|
+
"data:",
|
|
27
|
+
"https://*.commercecloud.salesforce.com",
|
|
28
|
+
"https://*.demandware.net"
|
|
29
|
+
],
|
|
30
|
+
"font-src": ["'self'", "data:"],
|
|
31
|
+
"connect-src": [
|
|
32
|
+
"'self'",
|
|
33
|
+
"https://*.commercecloud.salesforce.com",
|
|
34
|
+
"https://*.demandware.net",
|
|
35
|
+
"https://challenges.cloudflare.com"
|
|
36
|
+
],
|
|
37
|
+
"frame-src": ["https://challenges.cloudflare.com"],
|
|
38
|
+
"frame-ancestors": ["'self'"],
|
|
39
|
+
"form-action": ["'self'"],
|
|
40
|
+
"base-uri": ["'self'"],
|
|
41
|
+
"object-src": ["'none'"],
|
|
42
|
+
"upgrade-insecure-requests": true
|
|
43
|
+
};
|
|
44
|
+
const defaultSecurityHeaders = {
|
|
45
|
+
enabled: true,
|
|
46
|
+
csp: {
|
|
47
|
+
directives: defaultCspDirectives,
|
|
48
|
+
reportOnly: false
|
|
49
|
+
},
|
|
50
|
+
hsts: {
|
|
51
|
+
maxAge: 15552e3,
|
|
52
|
+
includeSubDomains: true,
|
|
53
|
+
preload: false
|
|
54
|
+
},
|
|
55
|
+
frameOptions: "SAMEORIGIN",
|
|
56
|
+
contentTypeOptions: "nosniff",
|
|
57
|
+
referrerPolicy: "strict-origin-when-cross-origin",
|
|
58
|
+
permissionsPolicy: {
|
|
59
|
+
camera: [],
|
|
60
|
+
microphone: [],
|
|
61
|
+
geolocation: []
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { defaultSecurityHeaders as n, defaultCspDirectives as t };
|
|
67
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","names":["defaultCspDirectives: CspDirectives","defaultSecurityHeaders: ResolvedSecurityConfig"],"sources":["../src/security/defaults.ts"],"sourcesContent":["/**\n * Copyright 2026 Salesforce, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { CspDirectives, ResolvedSecurityConfig } from './types.js';\n\n/**\n * SDK default CSP directives. Customers extending CSP should spread this:\n *\n * ```ts\n * import { defaultCspDirectives } from '@salesforce/storefront-next-runtime/security';\n * security: {\n * csp: {\n * directives: {\n * ...defaultCspDirectives,\n * 'script-src': [...defaultCspDirectives['script-src']!, 'https://cdn.foo.com'],\n * },\n * },\n * }\n * ```\n *\n * The per-request nonce is appended to `script-src` at request time; it is\n * NOT in this static map.\n */\nexport const defaultCspDirectives: CspDirectives = {\n 'default-src': [\"'self'\"],\n 'script-src': [\"'self'\", 'https://challenges.cloudflare.com'],\n // Tailwind v4 + shadcn rely on inline styles. Removing 'unsafe-inline'\n // breaks the design system out of the box.\n 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n 'img-src': [\"'self'\", 'data:', 'https://*.commercecloud.salesforce.com', 'https://*.demandware.net'],\n 'font-src': [\"'self'\", 'data:'],\n 'connect-src': [\n \"'self'\",\n 'https://*.commercecloud.salesforce.com',\n 'https://*.demandware.net',\n // Browser-initiated XHR/fetch from the Cloudflare Turnstile widget after\n // its api.js loads. (The server-side siteverify call is not subject to CSP.)\n 'https://challenges.cloudflare.com',\n ],\n // Cloudflare Turnstile widget iframe.\n 'frame-src': ['https://challenges.cloudflare.com'],\n // Modern equivalent of X-Frame-Options.\n 'frame-ancestors': [\"'self'\"],\n // Restrict form submissions to same-origin. CSP3 does NOT fall back to\n // default-src for form-action; without this, forms could POST anywhere.\n 'form-action': [\"'self'\"],\n 'base-uri': [\"'self'\"],\n 'object-src': [\"'none'\"],\n 'upgrade-insecure-requests': true,\n};\n\nexport const defaultSecurityHeaders: ResolvedSecurityConfig = {\n enabled: true,\n csp: { directives: defaultCspDirectives, reportOnly: false },\n hsts: { maxAge: 15552000, includeSubDomains: true, preload: false },\n frameOptions: 'SAMEORIGIN',\n contentTypeOptions: 'nosniff',\n referrerPolicy: 'strict-origin-when-cross-origin',\n permissionsPolicy: { camera: [], microphone: [], geolocation: [] },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmCA,MAAaA,uBAAsC;CAC/C,eAAe,CAAC,SAAS;CACzB,cAAc,CAAC,UAAU,oCAAoC;CAG7D,aAAa,CAAC,UAAU,kBAAkB;CAC1C,WAAW;EAAC;EAAU;EAAS;EAA0C;EAA2B;CACpG,YAAY,CAAC,UAAU,QAAQ;CAC/B,eAAe;EACX;EACA;EACA;EAGA;EACH;CAED,aAAa,CAAC,oCAAoC;CAElD,mBAAmB,CAAC,SAAS;CAG7B,eAAe,CAAC,SAAS;CACzB,YAAY,CAAC,SAAS;CACtB,cAAc,CAAC,SAAS;CACxB,6BAA6B;CAChC;AAED,MAAaC,yBAAiD;CAC1D,SAAS;CACT,KAAK;EAAE,YAAY;EAAsB,YAAY;EAAO;CAC5D,MAAM;EAAE,QAAQ;EAAU,mBAAmB;EAAM,SAAS;EAAO;CACnE,cAAc;CACd,oBAAoB;CACpB,gBAAgB;CAChB,mBAAmB;EAAE,QAAQ,EAAE;EAAE,YAAY,EAAE;EAAE,aAAa,EAAE;EAAE;CACrE"}
|
package/dist/design-data.d.ts
CHANGED
|
@@ -127,36 +127,6 @@ interface AttributeDefinition {
|
|
|
127
127
|
*/
|
|
128
128
|
defaultValue?: unknown;
|
|
129
129
|
}
|
|
130
|
-
/**
|
|
131
|
-
* Resolves every attribute on a component's `data` map to the wire shape
|
|
132
|
-
* SCAPI `getPage` would have returned.
|
|
133
|
-
*
|
|
134
|
-
* Dispatch is type-driven when {@code typeAttributeDefinitions} is supplied.
|
|
135
|
-
* Otherwise the resolver inspects each value structurally — it recognizes
|
|
136
|
-
* the image envelope by the presence of `media.libraryDomain` and
|
|
137
|
-
* `media.path` and passes everything else through unchanged.
|
|
138
|
-
*
|
|
139
|
-
* Forward-compatibility (Q9): unknown attribute types pass through. Each
|
|
140
|
-
* `(typeId, attrId, attrType)` triple is logged once per process via a
|
|
141
|
-
* module-scoped dedup set.
|
|
142
|
-
*
|
|
143
|
-
* @param data attribute map to resolve, already
|
|
144
|
-
* locale-merged + data-binding-resolved by
|
|
145
|
-
* {@link processPage}.
|
|
146
|
-
* @param typeId component type identifier, used as part
|
|
147
|
-
* of the dedup key for warnings. Empty
|
|
148
|
-
* string is acceptable for anonymous
|
|
149
|
-
* callers (page-level data).
|
|
150
|
-
* @param typeAttributeDefinitions attribute definitions for {@code typeId}
|
|
151
|
-
* from `manifest.componentTypes`. When
|
|
152
|
-
* omitted, falls back to structural
|
|
153
|
-
* detection of the image envelope.
|
|
154
|
-
* @param ctx per-request resolution surface.
|
|
155
|
-
* @returns a new map with each attribute's value replaced by the resolved
|
|
156
|
-
* wire shape; pass-through for any attribute type the resolver
|
|
157
|
-
* doesn't yet recognize.
|
|
158
|
-
*/
|
|
159
|
-
declare function resolveAttributeValues(data: Record<string, unknown> | undefined | null, typeId: string, typeAttributeDefinitions: Record<string, AttributeDefinition> | undefined, ctx: AttributeResolutionContext): Record<string, unknown>;
|
|
160
130
|
//#endregion
|
|
161
131
|
//#region src/design/data/types.d.ts
|
|
162
132
|
|
|
@@ -404,12 +374,6 @@ interface VisibilityRuleDef {
|
|
|
404
374
|
* is typically resolved lazily — only fetched when a rule actually needs it.
|
|
405
375
|
*/
|
|
406
376
|
type QualifierContext = ShopperExperience.schemas['QualifierResolveResponse'];
|
|
407
|
-
/**
|
|
408
|
-
* A resolved data binding object containing the fields returned by the data
|
|
409
|
-
* provider for a specific record. For example, a resolved `content_asset`
|
|
410
|
-
* might contain `{ title: "Winter Sale", body: "<div>…</div>" }`.
|
|
411
|
-
*/
|
|
412
|
-
type ResolvedDataBinding = ShopperExperience.schemas['ResolvedDataBinding'];
|
|
413
377
|
/**
|
|
414
378
|
* The type of identifier used to look up a page. Determines how the ID is
|
|
415
379
|
* resolved to a page manifest:
|
|
@@ -762,88 +726,6 @@ declare class RequiredError extends Error {
|
|
|
762
726
|
static assert<TValue>(value: TValue, message: string, isEmpty?: (value: TValue) => boolean): asserts value is NonNullable<TValue>;
|
|
763
727
|
}
|
|
764
728
|
//#endregion
|
|
765
|
-
//#region src/design/data/page/resolve-data-bindings.d.ts
|
|
766
|
-
/**
|
|
767
|
-
* Parses a binding expression string into its provider type and field name.
|
|
768
|
-
* Supports the bare `type.field` format.
|
|
769
|
-
*
|
|
770
|
-
* @param expression - The expression string to parse.
|
|
771
|
-
* @returns The parsed type and field, or `null` if the expression is invalid.
|
|
772
|
-
*
|
|
773
|
-
* @example
|
|
774
|
-
* ```ts
|
|
775
|
-
* parseExpression('content_asset.title'); // { type: 'content_asset', field: 'title' }
|
|
776
|
-
* parseExpression('invalid'); // null
|
|
777
|
-
* ```
|
|
778
|
-
*/
|
|
779
|
-
declare function parseExpression(expression: string): {
|
|
780
|
-
type: string;
|
|
781
|
-
field: string;
|
|
782
|
-
} | null;
|
|
783
|
-
/**
|
|
784
|
-
* Resolves a single binding expression against the component's data contexts
|
|
785
|
-
* and the resolved data bindings from context resolution.
|
|
786
|
-
*
|
|
787
|
-
* Returns the resolved field value, or an empty string if the expression is
|
|
788
|
-
* invalid, the matching context or record is not found, or the field does not
|
|
789
|
-
* exist on the resolved record.
|
|
790
|
-
*
|
|
791
|
-
* @param expression - The expression string (e.g. `"content_asset.body"`).
|
|
792
|
-
* @param contexts - The component's data binding contexts.
|
|
793
|
-
* @param dataBindings - The resolved data bindings from {@link QualifierContext}.
|
|
794
|
-
* @returns The resolved value, or `''` if resolution fails.
|
|
795
|
-
*/
|
|
796
|
-
declare function resolveExpression(expression: string, contexts: DataBindingRequirement[], dataBindings: NonNullable<QualifierContext['dataBindings']>): unknown;
|
|
797
|
-
/**
|
|
798
|
-
* Resolves data binding expressions for a single component. Replaces attribute
|
|
799
|
-
* values in the component's `data` with the resolved values from context
|
|
800
|
-
* resolution. Attributes without a matching expression are preserved as-is.
|
|
801
|
-
* When an expression cannot be resolved, the attribute value is set to an
|
|
802
|
-
* empty string.
|
|
803
|
-
*
|
|
804
|
-
* Returns the component unchanged if it has no data binding metadata or if
|
|
805
|
-
* `dataBindings` is `undefined`.
|
|
806
|
-
*
|
|
807
|
-
* @param component - The component to resolve data bindings for.
|
|
808
|
-
* @param binding - The component's data binding metadata from the page manifest's `componentInfo`, or `null`/`undefined` if not bound.
|
|
809
|
-
* @param dataBindings - The resolved data bindings from {@link QualifierContext}, or `undefined` if no bindings were resolved.
|
|
810
|
-
* @returns The component with resolved attribute values, or the original component if no bindings apply.
|
|
811
|
-
*
|
|
812
|
-
* @example
|
|
813
|
-
* ```ts
|
|
814
|
-
* import { resolveComponentDataBindings } from '@salesforce/storefront-next-runtime/design/data';
|
|
815
|
-
*
|
|
816
|
-
* const component = {
|
|
817
|
-
* id: 'banner',
|
|
818
|
-
* typeId: 'commerce_assets.contentBanner',
|
|
819
|
-
* data: { heading: 'Fallback Title', body: 'Fallback Body' },
|
|
820
|
-
* regions: [],
|
|
821
|
-
* };
|
|
822
|
-
*
|
|
823
|
-
* const binding = {
|
|
824
|
-
* expressions: {
|
|
825
|
-
* heading: 'content_asset.title',
|
|
826
|
-
* body: 'content_asset.body',
|
|
827
|
-
* },
|
|
828
|
-
* contexts: [{ type: 'content_asset', id: 'winter-sale-uuid' }],
|
|
829
|
-
* };
|
|
830
|
-
*
|
|
831
|
-
* const dataBindings = {
|
|
832
|
-
* content_asset: {
|
|
833
|
-
* 'winter-sale-uuid': {
|
|
834
|
-
* title: 'Winter Sale',
|
|
835
|
-
* body: '<div>Free Shipping on all orders!</div>',
|
|
836
|
-
* },
|
|
837
|
-
* },
|
|
838
|
-
* };
|
|
839
|
-
*
|
|
840
|
-
* const resolved = resolveComponentDataBindings(component, binding, dataBindings);
|
|
841
|
-
* // resolved.data.heading === 'Winter Sale'
|
|
842
|
-
* // resolved.data.body === '<div>Free Shipping on all orders!</div>'
|
|
843
|
-
* ```
|
|
844
|
-
*/
|
|
845
|
-
declare function resolveComponentDataBindings(component: ShopperExperience.schemas['Component'], binding: ComponentDataBinding | null | undefined, dataBindings: QualifierContext['dataBindings']): ShopperExperience.schemas['Component'];
|
|
846
|
-
//#endregion
|
|
847
729
|
//#region src/design/data/page/resolve-page.d.ts
|
|
848
730
|
/**
|
|
849
731
|
* Main entry point for the page resolution pipeline. Orchestrates the full flow:
|
|
@@ -865,6 +747,7 @@ declare function resolveComponentDataBindings(component: ShopperExperience.schem
|
|
|
865
747
|
* @param options.manifestStorage - Storage implementation for fetching manifests.
|
|
866
748
|
* @param options.contextResolver - Optional async function that returns the shopper's qualifier context. Only called if a visibility rule needs it.
|
|
867
749
|
* @param options.aspectType - The aspect type to resolve the page for when the identifier type is `'product'` or `'category'`.
|
|
750
|
+
* @param options.categoryId - Optional fallback category ID (or a Promise resolving to one) used only when `identifierType` is `'product'` and the product has no content assignment for the requested aspect type. The promise is awaited lazily — the happy path never pays for it.
|
|
868
751
|
* @param options.pruneInvisible - When `true` (default), invisible and overflow components are removed. When `false`, they are kept but marked `visible: false` for design/preview mode.
|
|
869
752
|
* @returns The fully resolved and filtered page, or `null`.
|
|
870
753
|
*
|
|
@@ -906,6 +789,7 @@ declare function resolvePage({
|
|
|
906
789
|
id,
|
|
907
790
|
identifierType,
|
|
908
791
|
aspectType,
|
|
792
|
+
categoryId,
|
|
909
793
|
locale,
|
|
910
794
|
defaultLocale,
|
|
911
795
|
manifestStorage,
|
|
@@ -916,6 +800,13 @@ declare function resolvePage({
|
|
|
916
800
|
id: string;
|
|
917
801
|
identifierType: IdentifierType;
|
|
918
802
|
aspectType?: string;
|
|
803
|
+
/**
|
|
804
|
+
* Fallback category ID (or a Promise resolving to one) consulted only
|
|
805
|
+
* when `identifierType === 'product'` and the product has no content
|
|
806
|
+
* assignment for the requested aspect type. Awaited lazily — the happy
|
|
807
|
+
* path skips it.
|
|
808
|
+
*/
|
|
809
|
+
categoryId?: string | Promise<string | null | undefined> | null;
|
|
919
810
|
locale: string;
|
|
920
811
|
defaultLocale: string;
|
|
921
812
|
manifestStorage: ManifestStorage;
|
|
@@ -931,212 +822,6 @@ declare function resolvePage({
|
|
|
931
822
|
pruneInvisible?: boolean;
|
|
932
823
|
}): Promise<ShopperExperience.schemas['Page'] | null>;
|
|
933
824
|
//#endregion
|
|
934
|
-
//#region src/design/data/manifest/resolve-dynamic-page-id.d.ts
|
|
935
|
-
/**
|
|
936
|
-
* Converts a product or category identifier into a page ID by looking up
|
|
937
|
-
* content assignments in the site manifest. For categories, the lookup
|
|
938
|
-
* traverses the category hierarchy from the given category up to the root,
|
|
939
|
-
* returning the first matching assignment.
|
|
940
|
-
*
|
|
941
|
-
* Returns `null` if no content assignment is found for the identifier or if
|
|
942
|
-
* the identifier type has no registered resolver.
|
|
943
|
-
*
|
|
944
|
-
* @param options - The resolution options.
|
|
945
|
-
* @param options.id - The identifier to resolve (product ID, category ID, or page ID).
|
|
946
|
-
* @param options.identifierType - The type of identifier: `'product'`, `'category'`, or `'page'`.
|
|
947
|
-
* @param options.siteManifest - The site manifest containing content assignments and category hierarchy.
|
|
948
|
-
* @returns The resolved page ID, or `null` if no assignment was found.
|
|
949
|
-
*
|
|
950
|
-
* @example
|
|
951
|
-
* ```ts
|
|
952
|
-
* import { resolveDynamicPageId } from '@salesforce/storefront-next-runtime/design/data';
|
|
953
|
-
*
|
|
954
|
-
* const siteManifest = {
|
|
955
|
-
* contentObjectAssignments: {
|
|
956
|
-
* plp: {
|
|
957
|
-
* category: {
|
|
958
|
-
* 'mens-shoes': {
|
|
959
|
-
* lookupMode: 'category-explicit',
|
|
960
|
-
* contentId: 'page-mens-shoes-plp',
|
|
961
|
-
* },
|
|
962
|
-
* },
|
|
963
|
-
* },
|
|
964
|
-
* },
|
|
965
|
-
* categories: {
|
|
966
|
-
* 'mens-running-shoes': { name: 'Running Shoes', parentCategory: 'mens-shoes' },
|
|
967
|
-
* 'mens-shoes': { name: "Men's Shoes" },
|
|
968
|
-
* },
|
|
969
|
-
* };
|
|
970
|
-
*
|
|
971
|
-
* // Direct match
|
|
972
|
-
* resolveDynamicPageId({ id: 'mens-shoes', identifierType: 'category', siteManifest });
|
|
973
|
-
* // => 'page-mens-shoes-plp'
|
|
974
|
-
*
|
|
975
|
-
* // Inherited from parent category
|
|
976
|
-
* resolveDynamicPageId({ id: 'mens-running-shoes', identifierType: 'category', siteManifest });
|
|
977
|
-
* // => 'page-mens-shoes-plp' (found via parent traversal)
|
|
978
|
-
*
|
|
979
|
-
* // No assignment found
|
|
980
|
-
* resolveDynamicPageId({ id: 'womens-shoes', identifierType: 'category', siteManifest });
|
|
981
|
-
* // => null
|
|
982
|
-
* ```
|
|
983
|
-
*/
|
|
984
|
-
declare function resolveDynamicPageId<TIdentifier extends IdentifierType = IdentifierType>({
|
|
985
|
-
id,
|
|
986
|
-
identifierType,
|
|
987
|
-
siteManifest,
|
|
988
|
-
aspectType
|
|
989
|
-
}: {
|
|
990
|
-
id: string;
|
|
991
|
-
identifierType: TIdentifier;
|
|
992
|
-
aspectType: string;
|
|
993
|
-
siteManifest?: SiteManifest | null;
|
|
994
|
-
}): string | null;
|
|
995
|
-
//#endregion
|
|
996
|
-
//#region src/design/data/manifest/get-page.d.ts
|
|
997
|
-
/**
|
|
998
|
-
* Selects the appropriate page variation from a manifest by evaluating each
|
|
999
|
-
* variation's visibility rule in order. Returns the first variation whose rule
|
|
1000
|
-
* passes, or falls back to the manifest's default variation.
|
|
1001
|
-
*
|
|
1002
|
-
* The qualifier context is resolved lazily — the `contextResolver` is only
|
|
1003
|
-
* called when a variation's `ruleRequiresContext` flag is `true`, and only
|
|
1004
|
-
* once (the result is cached for subsequent variations).
|
|
1005
|
-
*
|
|
1006
|
-
* @param manifest - The page manifest containing all variations.
|
|
1007
|
-
* @param options - Resolution options.
|
|
1008
|
-
* @param options.contextResolver - Optional async function that returns the shopper's qualifier context. Only called if a variation's rule needs it.
|
|
1009
|
-
* @param options.locale - The current locale (e.g. `"en_US"`). Used to evaluate locale-based visibility rules.
|
|
1010
|
-
* @returns The selected variation entry and resolved context, or `null` if no variation (including default) exists.
|
|
1011
|
-
*
|
|
1012
|
-
* @example
|
|
1013
|
-
* ```ts
|
|
1014
|
-
* import { getPageFromManifest } from '@salesforce/storefront-next-runtime/design/data';
|
|
1015
|
-
*
|
|
1016
|
-
* const manifest = {
|
|
1017
|
-
* pageId: 'homepage',
|
|
1018
|
-
* context: { campaignQualifiers: [], customerGroups: ['vip-customers'], dataBindings: [] },
|
|
1019
|
-
* variationOrder: ['vip-homepage', 'holiday-homepage'],
|
|
1020
|
-
* variations: {
|
|
1021
|
-
* 'vip-homepage': {
|
|
1022
|
-
* ruleRequiresContext: true,
|
|
1023
|
-
* pageRequiresContext: false,
|
|
1024
|
-
* visibilityRule: { activeLocales: ['en-US'], customerGroups: ['vip-customers'] },
|
|
1025
|
-
* page: { id: 'homepage', typeId: 'storePage', regions: [] },
|
|
1026
|
-
* regions: {},
|
|
1027
|
-
* },
|
|
1028
|
-
* 'holiday-homepage': {
|
|
1029
|
-
* ruleRequiresContext: false,
|
|
1030
|
-
* pageRequiresContext: false,
|
|
1031
|
-
* visibilityRule: {
|
|
1032
|
-
* activeLocales: ['en-US'],
|
|
1033
|
-
* schedule: {
|
|
1034
|
-
* start: new Date('2026-12-01').toISOString(),
|
|
1035
|
-
* end: new Date('2026-12-31').toISOString(),
|
|
1036
|
-
* },
|
|
1037
|
-
* },
|
|
1038
|
-
* page: { id: 'homepage', typeId: 'storePage', regions: [] },
|
|
1039
|
-
* regions: {},
|
|
1040
|
-
* },
|
|
1041
|
-
* 'default-homepage': {
|
|
1042
|
-
* ruleRequiresContext: false,
|
|
1043
|
-
* pageRequiresContext: false,
|
|
1044
|
-
* page: { id: 'homepage', typeId: 'storePage', regions: [] },
|
|
1045
|
-
* regions: {},
|
|
1046
|
-
* },
|
|
1047
|
-
* },
|
|
1048
|
-
* defaultVariation: 'default-homepage',
|
|
1049
|
-
* componentInfo: {},
|
|
1050
|
-
* };
|
|
1051
|
-
*
|
|
1052
|
-
* // VIP shopper — matches first variation
|
|
1053
|
-
* const result = await getPageFromManifest(manifest, {
|
|
1054
|
-
* locale: 'en-US',
|
|
1055
|
-
* contextResolver: async () => ({
|
|
1056
|
-
* customerGroups: { 'vip-customers': true },
|
|
1057
|
-
* campaignQualifiers: {},
|
|
1058
|
-
* }),
|
|
1059
|
-
* });
|
|
1060
|
-
* // result.entry === manifest.variations['vip-homepage']
|
|
1061
|
-
*
|
|
1062
|
-
* // Non-VIP shopper outside holiday window — falls back to default
|
|
1063
|
-
* const fallback = await getPageFromManifest(manifest, {
|
|
1064
|
-
* locale: 'en-US',
|
|
1065
|
-
* contextResolver: async () => ({
|
|
1066
|
-
* customerGroups: {},
|
|
1067
|
-
* campaignQualifiers: {},
|
|
1068
|
-
* }),
|
|
1069
|
-
* });
|
|
1070
|
-
* // fallback.entry === manifest.variations['default-homepage']
|
|
1071
|
-
* ```
|
|
1072
|
-
*/
|
|
1073
|
-
declare function getPageFromManifest(manifest: PageManifest, {
|
|
1074
|
-
contextResolver,
|
|
1075
|
-
locale
|
|
1076
|
-
}: {
|
|
1077
|
-
contextResolver?: ContextResolver;
|
|
1078
|
-
locale: string;
|
|
1079
|
-
}): Promise<{
|
|
1080
|
-
entry: VariationEntry;
|
|
1081
|
-
context: QualifierContext | null;
|
|
1082
|
-
} | null>;
|
|
1083
|
-
//#endregion
|
|
1084
|
-
//#region src/design/data/manifest/content-assignment-resolvers.d.ts
|
|
1085
|
-
/**
|
|
1086
|
-
* The result of resolving an identifier through a content assignment resolver.
|
|
1087
|
-
* Contains the object type, aspect type, and ordered list of keys to search
|
|
1088
|
-
* in the site manifest's content assignments.
|
|
1089
|
-
*/
|
|
1090
|
-
interface ResolvedContentAssignmentLookup {
|
|
1091
|
-
/** The type of commerce object (e.g. `'product'`, `'category'`). */
|
|
1092
|
-
objectType: string;
|
|
1093
|
-
/** Ordered list of object IDs to search in the site manifest's content assignments. */
|
|
1094
|
-
keys: string[];
|
|
1095
|
-
}
|
|
1096
|
-
/**
|
|
1097
|
-
* A function that converts an identifier key (e.g., a product or category ID)
|
|
1098
|
-
* into a {@link ResolvedContentAssignmentLookup} describing where to search
|
|
1099
|
-
* in the site manifest for the assigned page ID.
|
|
1100
|
-
*/
|
|
1101
|
-
type ContentAssignmentResolver = (key: string, manifest?: SiteManifest | null) => ResolvedContentAssignmentLookup;
|
|
1102
|
-
/**
|
|
1103
|
-
* Registry of content assignment resolvers keyed by {@link IdentifierType}.
|
|
1104
|
-
* Each resolver knows how to convert its identifier type into a set of lookup
|
|
1105
|
-
* keys for the site manifest.
|
|
1106
|
-
*
|
|
1107
|
-
* Built-in resolvers:
|
|
1108
|
-
* - **`'product'`** — Maps a product ID to a single PDP lookup key.
|
|
1109
|
-
* - **`'category'`** — Maps a category ID to an ordered list of keys that
|
|
1110
|
-
* traverses the category hierarchy from child to root, enabling inherited
|
|
1111
|
-
* page assignments.
|
|
1112
|
-
*
|
|
1113
|
-
* The `'page'` identifier type has no resolver — page IDs are used directly.
|
|
1114
|
-
*
|
|
1115
|
-
* @example
|
|
1116
|
-
* ```ts
|
|
1117
|
-
* import { ContentAssignmentResolvers } from '@salesforce/storefront-next-runtime/design/data';
|
|
1118
|
-
*
|
|
1119
|
-
* // Resolve a product identifier for PDP lookup
|
|
1120
|
-
* const productResolver = ContentAssignmentResolvers.get('product');
|
|
1121
|
-
* productResolver('nike-air-max-90');
|
|
1122
|
-
* // => { objectType: 'product', aspectType: 'pdp', keys: ['nike-air-max-90'] }
|
|
1123
|
-
*
|
|
1124
|
-
* // Resolve a category identifier — traverses hierarchy to find inherited assignments
|
|
1125
|
-
* const categoryResolver = ContentAssignmentResolvers.get('category');
|
|
1126
|
-
* const siteManifest = {
|
|
1127
|
-
* categories: {
|
|
1128
|
-
* 'mens-running-shoes': { name: 'Running Shoes', parentCategory: 'mens-shoes' },
|
|
1129
|
-
* 'mens-shoes': { name: "Men's Shoes", parentCategory: 'mens' },
|
|
1130
|
-
* 'mens': { name: 'Men' },
|
|
1131
|
-
* },
|
|
1132
|
-
* contentObjectAssignments: {},
|
|
1133
|
-
* };
|
|
1134
|
-
* categoryResolver('mens-running-shoes', siteManifest);
|
|
1135
|
-
* // => { objectType: 'category', aspectType: 'plp', keys: ['mens-running-shoes', 'mens-shoes', 'mens'] }
|
|
1136
|
-
* ```
|
|
1137
|
-
*/
|
|
1138
|
-
declare const ContentAssignmentResolvers: Map<string, ContentAssignmentResolver>;
|
|
1139
|
-
//#endregion
|
|
1140
825
|
//#region src/design/data/validate-rule.d.ts
|
|
1141
826
|
/**
|
|
1142
827
|
* Evaluates a visibility rule against a shopper's qualifier context.
|
|
@@ -1183,12 +868,5 @@ declare const ContentAssignmentResolvers: Map<string, ContentAssignmentResolver>
|
|
|
1183
868
|
*/
|
|
1184
869
|
declare function validateRule(rule: VisibilityRuleDef, locale: string, context?: QualifierContext | null): boolean;
|
|
1185
870
|
//#endregion
|
|
1186
|
-
|
|
1187
|
-
/**
|
|
1188
|
-
* Rewrites `?$staticlink$` placeholders in markup to fully-qualified
|
|
1189
|
-
* static-content URLs. Pipeline-action placeholders pass through unchanged.
|
|
1190
|
-
*/
|
|
1191
|
-
declare function rewriteMarkup(source: string, ctx: AttributeResolutionContext): string;
|
|
1192
|
-
//#endregion
|
|
1193
|
-
export { type AttributeDefinition, type AttributeResolutionContext, type AttributeResolutionWarning, CampaignQualifier, ComponentDataBinding, ContentAssignmentResolvers, ContextResolver, DataBindingRequirement, IdentifierType, InferNodeFromType, ManifestStorage, PageManifest, PageManifestContext, PageMetadataOverlay, type PageProcessorContext, type PageVisitor, QualifierContext, RegionInfo, RequiredError, ResolvedDataBinding, SiteManifest, VariationEntry, VisibilityRuleDef, type VisitorContext, VisitorContextType, getPageFromManifest, parseExpression, processPage, resolveAttributeValues, resolveComponentDataBindings, resolveDynamicPageId, resolveExpression, resolvePage, rewriteMarkup, transformComponent, transformPage, transformRegion, validateRule };
|
|
871
|
+
export { type AttributeResolutionContext, type AttributeResolutionWarning, type ContextResolver, type IdentifierType, type InferNodeFromType, type ManifestStorage, type PageManifest, type PageProcessorContext, type PageVisitor, type QualifierContext, RequiredError, type SiteManifest, type VisibilityRuleDef, type VisitorContext, type VisitorContextType, processPage, resolvePage, transformComponent, transformPage, transformRegion, validateRule };
|
|
1194
872
|
//# sourceMappingURL=design-data.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-data.d.ts","names":[],"sources":["../src/design/data/page/attribute-resolution.ts","../src/design/data/types.ts","../src/design/data/page/process-page.ts","../src/design/data/page/transform.ts","../src/design/data/errors/required.ts","../src/design/data/page/resolve-
|
|
1
|
+
{"version":3,"file":"design-data.d.ts","names":[],"sources":["../src/design/data/page/attribute-resolution.ts","../src/design/data/types.ts","../src/design/data/page/process-page.ts","../src/design/data/page/transform.ts","../src/design/data/errors/required.ts","../src/design/data/page/resolve-page.ts","../src/design/data/validate-rule.ts"],"sourcesContent":[],"mappings":"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"}
|