Skip to content

Commit ee00f10

Browse files
authored
Remove regulation-specific privacy fields from public API (#3236)
* Remove regulation-specific privacy fields from public API documentation Removed ccpaEnforced and gdprEnforced from public API types in favor of generalized privacy fields (analyticsAllowed, marketingAllowed, saleOfDataAllowed). The regulation-specific fields are now internal-only types, still computed and sent to analytics backend for compatibility. Addresses caution-tape-bot feedback from Shopify/shopify-dev#63408 * Fix test to use internal type with privacy fields
1 parent 3785513 commit ee00f10

File tree

7 files changed

+1556
-403
lines changed

7 files changed

+1556
-403
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@shopify/hydrogen-react': patch
3+
'@shopify/hydrogen': patch
4+
---
5+
6+
Remove regulation-specific privacy fields from public API documentation. The generalized privacy fields (analyticsAllowed, marketingAllowed, saleOfDataAllowed) remain available.

packages/hydrogen-react/docs/generated/generated_docs_data.json

Lines changed: 66 additions & 107 deletions
Large diffs are not rendered by default.

packages/hydrogen-react/src/analytics-schema-custom-storefront-customer-tracking.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import type {
1313
ShopifyAnalyticsPayload,
1414
ShopifyMonorailPayload,
1515
ShopifyPageViewPayload,
16+
ShopifyPageViewPayloadWithPrivacyFields,
1617
} from './analytics-types.js';
1718
import {version} from '../package.json';
1819

@@ -64,7 +65,7 @@ describe(`analytics schema - custom storefront customer tracking`, () => {
6465
});
6566

6667
it(`base payload with non-default values using hydrogenSubchannelId`, () => {
67-
const pageViewPayload: ShopifyPageViewPayload = {
68+
const pageViewPayload: ShopifyPageViewPayloadWithPrivacyFields = {
6869
...BASE_PAYLOAD,
6970
shopId: 'gid://shopify/Shop/2',
7071
hasUserConsent: false,

packages/hydrogen-react/src/analytics-schema-custom-storefront-customer-tracking.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import {
22
ShopifyAnalyticsPayload,
3+
ShopifyAnalyticsPayloadWithPrivacyFields,
34
ShopifyPageViewPayload,
5+
ShopifyPageViewPayloadWithPrivacyFields,
46
ShopifyAddToCartPayload,
7+
ShopifyAddToCartPayloadWithPrivacyFields,
58
ShopifyMonorailPayload,
69
ShopifyAnalyticsProduct,
710
ShopifyMonorailEvent,
@@ -19,7 +22,7 @@ const PRODUCT_ADDED_TO_CART_EVENT_NAME = 'product_added_to_cart';
1922
const SEARCH_SUBMITTED_EVENT_NAME = 'search_submitted';
2023

2124
function prepareAdditionalPayload(
22-
payload: ShopifyPageViewPayload,
25+
payload: ShopifyPageViewPayload | ShopifyPageViewPayloadWithPrivacyFields,
2326
): Pick<ShopifyMonorailPayload, 'canonical_url' | 'customer_id'> {
2427
return {
2528
canonical_url: payload.canonicalUrl || payload.url,
@@ -30,7 +33,7 @@ function prepareAdditionalPayload(
3033
// Send the page view event to the Monorail server.
3134
// It also sends additional page view events based on the page type.
3235
export function pageView(
33-
payload: ShopifyPageViewPayload,
36+
payload: ShopifyPageViewPayload | ShopifyPageViewPayloadWithPrivacyFields,
3437
): ShopifyMonorailEvent[] {
3538
const pageViewPayload = payload;
3639
const additionalPayload = prepareAdditionalPayload(pageViewPayload);
@@ -196,7 +199,7 @@ export function searchView(
196199
}
197200

198201
export function addToCart(
199-
payload: ShopifyAddToCartPayload,
202+
payload: ShopifyAddToCartPayload | ShopifyAddToCartPayloadWithPrivacyFields,
200203
): ShopifyMonorailEvent[] {
201204
const addToCartPayload = payload;
202205
const cartToken = parseGid(addToCartPayload.cartId);
@@ -221,8 +224,11 @@ export function addToCart(
221224
}
222225

223226
function formatPayload(
224-
payload: ShopifyAnalyticsPayload,
227+
payload: ShopifyAnalyticsPayload | ShopifyAnalyticsPayloadWithPrivacyFields,
225228
): ShopifyMonorailPayload {
229+
const payloadWithPrivacy =
230+
payload as ShopifyAnalyticsPayloadWithPrivacyFields;
231+
226232
return {
227233
source: payload.shopifySalesChannel || ShopifySalesChannel.headless,
228234
asset_version_id: payload.assetVersionId || version,
@@ -244,9 +250,9 @@ function formatPayload(
244250
shop_id: parseInt(parseGid(payload.shopId).id),
245251
currency: payload.currency,
246252

247-
ccpa_enforced: payload.ccpaEnforced || false,
248-
gdpr_enforced: payload.gdprEnforced || false,
249-
gdpr_enforced_as_string: payload.gdprEnforced ? 'true' : 'false',
253+
ccpa_enforced: payloadWithPrivacy.ccpaEnforced || false,
254+
gdpr_enforced: payloadWithPrivacy.gdprEnforced || false,
255+
gdpr_enforced_as_string: payloadWithPrivacy.gdprEnforced ? 'true' : 'false',
250256
analytics_allowed: payload.analyticsAllowed || false,
251257
marketing_allowed: payload.marketingAllowed || false,
252258
sale_of_data_allowed: payload.saleOfDataAllowed || false,

packages/hydrogen-react/src/analytics-types.ts

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,6 @@ type ShopifyAnalyticsBase = {
117117
totalValue?: number;
118118
/** Product list. */
119119
products?: ShopifyAnalyticsProduct[];
120-
/** Result of `!customerPrivacyApi.saleOfDataAllowed()` */
121-
ccpaEnforced?: boolean;
122-
/** Result of `!(customerPrivacyApi.marketingAllowed() && customerPrivacy.analyticsProcessingAllowed())`*/
123-
gdprEnforced?: boolean;
124120
/** Result of `customerPrivacyApi.analyticsProcessingAllowed()` */
125121
analyticsAllowed?: boolean;
126122
/** Result of `customerPrivacyApi.marketingAllowed()` */
@@ -129,6 +125,16 @@ type ShopifyAnalyticsBase = {
129125
saleOfDataAllowed?: boolean;
130126
};
131127

128+
/**
129+
* @internal
130+
* Internal type that includes computed regulation-specific fields.
131+
* These fields are computed by Hydrogen and sent to analytics backend.
132+
*/
133+
type ShopifyAnalyticsBaseWithPrivacyFields = ShopifyAnalyticsBase & {
134+
ccpaEnforced?: boolean;
135+
gdprEnforced?: boolean;
136+
};
137+
132138
export type ShopifySalesChannels = keyof typeof ShopifySalesChannel;
133139
export type AnalyticsEventNames = keyof typeof AnalyticsEventName;
134140

@@ -149,6 +155,17 @@ export interface ShopifyPageViewPayload
149155
searchString?: string;
150156
}
151157

158+
/**
159+
* @internal
160+
* Internal payload type with privacy fields for analytics backend.
161+
*/
162+
export type ShopifyPageViewPayloadWithPrivacyFields = Omit<
163+
ShopifyPageViewPayload,
164+
keyof ShopifyAnalyticsBase
165+
> &
166+
ShopifyAnalyticsBaseWithPrivacyFields &
167+
ClientBrowserParameters;
168+
152169
export type ShopifyPageView = {
153170
/** Use `AnalyticsEventName.PAGE_VIEW` constant. */
154171
eventName: string;
@@ -162,6 +179,17 @@ export interface ShopifyAddToCartPayload
162179
cartId: string;
163180
}
164181

182+
/**
183+
* @internal
184+
* Internal payload type with privacy fields for analytics backend.
185+
*/
186+
export type ShopifyAddToCartPayloadWithPrivacyFields = Omit<
187+
ShopifyAddToCartPayload,
188+
keyof ShopifyAnalyticsBase
189+
> &
190+
ShopifyAnalyticsBaseWithPrivacyFields &
191+
ClientBrowserParameters;
192+
165193
export type ShopifyAddToCart = {
166194
/** Use `AnalyticsEventName.ADD_TO_CART` constant. */
167195
eventName: string;
@@ -184,6 +212,15 @@ export type ShopifyMonorailEvent = {
184212
export type ShopifyAnalyticsPayload =
185213
| ShopifyPageViewPayload
186214
| ShopifyAddToCartPayload;
215+
216+
/**
217+
* @internal
218+
* Internal analytics payload type with privacy fields for analytics backend.
219+
*/
220+
export type ShopifyAnalyticsPayloadWithPrivacyFields =
221+
| ShopifyPageViewPayloadWithPrivacyFields
222+
| ShopifyAddToCartPayloadWithPrivacyFields;
223+
187224
export type ShopifyAnalytics = ShopifyPageView | ShopifyAddToCart;
188225

189226
export type ShopifyCookies = {

0 commit comments

Comments
 (0)