@endora-commerce/contracts 0.100.0
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/LICENSE +21 -0
- package/README.md +34 -0
- package/dist/actor.d.ts +79 -0
- package/dist/actor.d.ts.map +1 -0
- package/dist/actor.js +41 -0
- package/dist/actor.js.map +1 -0
- package/dist/addresses.d.ts +134 -0
- package/dist/addresses.d.ts.map +1 -0
- package/dist/addresses.js +16 -0
- package/dist/addresses.js.map +1 -0
- package/dist/admin-actions.d.ts +367 -0
- package/dist/admin-actions.d.ts.map +1 -0
- package/dist/admin-actions.js +287 -0
- package/dist/admin-actions.js.map +1 -0
- package/dist/admin-contributions.d.ts +518 -0
- package/dist/admin-contributions.d.ts.map +1 -0
- package/dist/admin-contributions.js +495 -0
- package/dist/admin-contributions.js.map +1 -0
- package/dist/admin-i18n.d.ts +135 -0
- package/dist/admin-i18n.d.ts.map +1 -0
- package/dist/admin-i18n.js +72 -0
- package/dist/admin-i18n.js.map +1 -0
- package/dist/admin-notifications.d.ts +55 -0
- package/dist/admin-notifications.d.ts.map +1 -0
- package/dist/admin-notifications.js +16 -0
- package/dist/admin-notifications.js.map +1 -0
- package/dist/admin-roles.d.ts +125 -0
- package/dist/admin-roles.d.ts.map +1 -0
- package/dist/admin-roles.js +2 -0
- package/dist/admin-roles.js.map +1 -0
- package/dist/admin-users.d.ts +178 -0
- package/dist/admin-users.d.ts.map +1 -0
- package/dist/admin-users.js +14 -0
- package/dist/admin-users.js.map +1 -0
- package/dist/admin.d.ts +243 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +246 -0
- package/dist/admin.js.map +1 -0
- package/dist/analytics.d.ts +123 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +68 -0
- package/dist/analytics.js.map +1 -0
- package/dist/api-keys.d.ts +97 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +64 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/assets-library.d.ts +684 -0
- package/dist/assets-library.d.ts.map +1 -0
- package/dist/assets-library.js +181 -0
- package/dist/assets-library.js.map +1 -0
- package/dist/audit-logs.d.ts +141 -0
- package/dist/audit-logs.d.ts.map +1 -0
- package/dist/audit-logs.js +31 -0
- package/dist/audit-logs.js.map +1 -0
- package/dist/auth.d.ts +174 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +27 -0
- package/dist/auth.js.map +1 -0
- package/dist/blog.d.ts +669 -0
- package/dist/blog.d.ts.map +1 -0
- package/dist/blog.js +360 -0
- package/dist/blog.js.map +1 -0
- package/dist/capabilities.d.ts +40 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +38 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/carts.d.ts +1367 -0
- package/dist/carts.d.ts.map +1 -0
- package/dist/carts.js +405 -0
- package/dist/carts.js.map +1 -0
- package/dist/catalog.d.ts +2855 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +1543 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cms.d.ts +872 -0
- package/dist/cms.d.ts.map +1 -0
- package/dist/cms.js +468 -0
- package/dist/cms.js.map +1 -0
- package/dist/common.d.ts +82 -0
- package/dist/common.d.ts.map +1 -0
- package/dist/common.js +72 -0
- package/dist/common.js.map +1 -0
- package/dist/comparisons.d.ts +487 -0
- package/dist/comparisons.d.ts.map +1 -0
- package/dist/comparisons.js +221 -0
- package/dist/comparisons.js.map +1 -0
- package/dist/credentials.d.ts +292 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +142 -0
- package/dist/credentials.js.map +1 -0
- package/dist/credit-limits.d.ts +111 -0
- package/dist/credit-limits.d.ts.map +1 -0
- package/dist/credit-limits.js +35 -0
- package/dist/credit-limits.js.map +1 -0
- package/dist/currencies.d.ts +127 -0
- package/dist/currencies.d.ts.map +1 -0
- package/dist/currencies.js +20 -0
- package/dist/currencies.js.map +1 -0
- package/dist/custom-fields.d.ts +345 -0
- package/dist/custom-fields.d.ts.map +1 -0
- package/dist/custom-fields.js +185 -0
- package/dist/custom-fields.js.map +1 -0
- package/dist/customer-accounts.d.ts +690 -0
- package/dist/customer-accounts.d.ts.map +1 -0
- package/dist/customer-accounts.js +41 -0
- package/dist/customer-accounts.js.map +1 -0
- package/dist/customers.d.ts +305 -0
- package/dist/customers.d.ts.map +1 -0
- package/dist/customers.js +158 -0
- package/dist/customers.js.map +1 -0
- package/dist/dictionary.d.ts +580 -0
- package/dist/dictionary.d.ts.map +1 -0
- package/dist/dictionary.js +297 -0
- package/dist/dictionary.js.map +1 -0
- package/dist/email-address.d.ts +62 -0
- package/dist/email-address.d.ts.map +1 -0
- package/dist/email-address.js +64 -0
- package/dist/email-address.js.map +1 -0
- package/dist/email.d.ts +175 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +45 -0
- package/dist/email.js.map +1 -0
- package/dist/envelopes.d.ts +15 -0
- package/dist/envelopes.d.ts.map +1 -0
- package/dist/envelopes.js +16 -0
- package/dist/envelopes.js.map +1 -0
- package/dist/environment-inputs.d.ts +306 -0
- package/dist/environment-inputs.d.ts.map +1 -0
- package/dist/environment-inputs.js +277 -0
- package/dist/environment-inputs.js.map +1 -0
- package/dist/erp-connector.d.ts +52 -0
- package/dist/erp-connector.d.ts.map +1 -0
- package/dist/erp-connector.js +34 -0
- package/dist/erp-connector.js.map +1 -0
- package/dist/errors.d.ts +455 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +532 -0
- package/dist/errors.js.map +1 -0
- package/dist/google-analytics.d.ts +181 -0
- package/dist/google-analytics.d.ts.map +1 -0
- package/dist/google-analytics.js +176 -0
- package/dist/google-analytics.js.map +1 -0
- package/dist/google-tag-manager.d.ts +111 -0
- package/dist/google-tag-manager.d.ts.map +1 -0
- package/dist/google-tag-manager.js +129 -0
- package/dist/google-tag-manager.js.map +1 -0
- package/dist/i18n.d.ts +69 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +59 -0
- package/dist/i18n.js.map +1 -0
- package/dist/import-export.d.ts +63 -0
- package/dist/import-export.d.ts.map +1 -0
- package/dist/import-export.js +37 -0
- package/dist/import-export.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +126 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory.d.ts +673 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/inventory.js +412 -0
- package/dist/inventory.js.map +1 -0
- package/dist/invoice-ledger.d.ts +366 -0
- package/dist/invoice-ledger.d.ts.map +1 -0
- package/dist/invoice-ledger.js +114 -0
- package/dist/invoice-ledger.js.map +1 -0
- package/dist/invoices.d.ts +845 -0
- package/dist/invoices.d.ts.map +1 -0
- package/dist/invoices.js +314 -0
- package/dist/invoices.js.map +1 -0
- package/dist/kernel.d.ts +49 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +19 -0
- package/dist/kernel.js.map +1 -0
- package/dist/languages.d.ts +122 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +24 -0
- package/dist/languages.js.map +1 -0
- package/dist/linkedin-ads.d.ts +167 -0
- package/dist/linkedin-ads.d.ts.map +1 -0
- package/dist/linkedin-ads.js +156 -0
- package/dist/linkedin-ads.js.map +1 -0
- package/dist/megamenu.d.ts +556 -0
- package/dist/megamenu.d.ts.map +1 -0
- package/dist/megamenu.js +186 -0
- package/dist/megamenu.js.map +1 -0
- package/dist/meta-ads.d.ts +126 -0
- package/dist/meta-ads.d.ts.map +1 -0
- package/dist/meta-ads.js +112 -0
- package/dist/meta-ads.js.map +1 -0
- package/dist/mfa.d.ts +274 -0
- package/dist/mfa.d.ts.map +1 -0
- package/dist/mfa.js +187 -0
- package/dist/mfa.js.map +1 -0
- package/dist/modules.d.ts +1706 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +1390 -0
- package/dist/modules.js.map +1 -0
- package/dist/newsletter.d.ts +611 -0
- package/dist/newsletter.d.ts.map +1 -0
- package/dist/newsletter.js +345 -0
- package/dist/newsletter.js.map +1 -0
- package/dist/orders.d.ts +1175 -0
- package/dist/orders.d.ts.map +1 -0
- package/dist/orders.js +630 -0
- package/dist/orders.js.map +1 -0
- package/dist/organizations.d.ts +938 -0
- package/dist/organizations.d.ts.map +1 -0
- package/dist/organizations.js +418 -0
- package/dist/organizations.js.map +1 -0
- package/dist/pagination.d.ts +21 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +22 -0
- package/dist/pagination.js.map +1 -0
- package/dist/payment-methods.d.ts +472 -0
- package/dist/payment-methods.d.ts.map +1 -0
- package/dist/payment-methods.js +175 -0
- package/dist/payment-methods.js.map +1 -0
- package/dist/payment-return-url.d.ts +53 -0
- package/dist/payment-return-url.d.ts.map +1 -0
- package/dist/payment-return-url.js +35 -0
- package/dist/payment-return-url.js.map +1 -0
- package/dist/payments.d.ts +386 -0
- package/dist/payments.d.ts.map +1 -0
- package/dist/payments.js +84 -0
- package/dist/payments.js.map +1 -0
- package/dist/pim-connector.d.ts +60 -0
- package/dist/pim-connector.d.ts.map +1 -0
- package/dist/pim-connector.js +43 -0
- package/dist/pim-connector.js.map +1 -0
- package/dist/pim-field-path.d.ts +6 -0
- package/dist/pim-field-path.d.ts.map +1 -0
- package/dist/pim-field-path.js +101 -0
- package/dist/pim-field-path.js.map +1 -0
- package/dist/platform-language.d.ts +20 -0
- package/dist/platform-language.d.ts.map +1 -0
- package/dist/platform-language.js +22 -0
- package/dist/platform-language.js.map +1 -0
- package/dist/price-lists.d.ts +685 -0
- package/dist/price-lists.d.ts.map +1 -0
- package/dist/price-lists.js +330 -0
- package/dist/price-lists.js.map +1 -0
- package/dist/product-feeds.d.ts +2837 -0
- package/dist/product-feeds.d.ts.map +1 -0
- package/dist/product-feeds.js +1504 -0
- package/dist/product-feeds.js.map +1 -0
- package/dist/product-scope-overrides.d.ts +134 -0
- package/dist/product-scope-overrides.d.ts.map +1 -0
- package/dist/product-scope-overrides.js +82 -0
- package/dist/product-scope-overrides.js.map +1 -0
- package/dist/product-value-resolver.d.ts +88 -0
- package/dist/product-value-resolver.d.ts.map +1 -0
- package/dist/product-value-resolver.js +128 -0
- package/dist/product-value-resolver.js.map +1 -0
- package/dist/promotions.d.ts +678 -0
- package/dist/promotions.d.ts.map +1 -0
- package/dist/promotions.js +479 -0
- package/dist/promotions.js.map +1 -0
- package/dist/prompt-actions.d.ts +582 -0
- package/dist/prompt-actions.d.ts.map +1 -0
- package/dist/prompt-actions.js +221 -0
- package/dist/prompt-actions.js.map +1 -0
- package/dist/pwa.d.ts +293 -0
- package/dist/pwa.d.ts.map +1 -0
- package/dist/pwa.js +204 -0
- package/dist/pwa.js.map +1 -0
- package/dist/quick-order.d.ts +340 -0
- package/dist/quick-order.d.ts.map +1 -0
- package/dist/quick-order.js +177 -0
- package/dist/quick-order.js.map +1 -0
- package/dist/quote-requests.d.ts +538 -0
- package/dist/quote-requests.d.ts.map +1 -0
- package/dist/quote-requests.js +308 -0
- package/dist/quote-requests.js.map +1 -0
- package/dist/returns.d.ts +774 -0
- package/dist/returns.d.ts.map +1 -0
- package/dist/returns.js +389 -0
- package/dist/returns.js.map +1 -0
- package/dist/sales-channels.d.ts +392 -0
- package/dist/sales-channels.d.ts.map +1 -0
- package/dist/sales-channels.js +285 -0
- package/dist/sales-channels.js.map +1 -0
- package/dist/scope-notice.d.ts +60 -0
- package/dist/scope-notice.d.ts.map +1 -0
- package/dist/scope-notice.js +56 -0
- package/dist/scope-notice.js.map +1 -0
- package/dist/search.d.ts +321 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +160 -0
- package/dist/search.js.map +1 -0
- package/dist/seo.d.ts +113 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +63 -0
- package/dist/seo.js.map +1 -0
- package/dist/settings.d.ts +453 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +337 -0
- package/dist/settings.js.map +1 -0
- package/dist/shipments.d.ts +140 -0
- package/dist/shipments.d.ts.map +1 -0
- package/dist/shipments.js +14 -0
- package/dist/shipments.js.map +1 -0
- package/dist/shipping-methods.d.ts +350 -0
- package/dist/shipping-methods.d.ts.map +1 -0
- package/dist/shipping-methods.js +99 -0
- package/dist/shipping-methods.js.map +1 -0
- package/dist/shopping-lists.d.ts +122 -0
- package/dist/shopping-lists.d.ts.map +1 -0
- package/dist/shopping-lists.js +92 -0
- package/dist/shopping-lists.js.map +1 -0
- package/dist/taxes.d.ts +106 -0
- package/dist/taxes.d.ts.map +1 -0
- package/dist/taxes.js +80 -0
- package/dist/taxes.js.map +1 -0
- package/dist/text-normalization.d.ts +199 -0
- package/dist/text-normalization.d.ts.map +1 -0
- package/dist/text-normalization.js +205 -0
- package/dist/text-normalization.js.map +1 -0
- package/dist/transactional-emails.d.ts +459 -0
- package/dist/transactional-emails.d.ts.map +1 -0
- package/dist/transactional-emails.js +212 -0
- package/dist/transactional-emails.js.map +1 -0
- package/dist/webhooks.d.ts +69 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +53 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Storefront interactions a custom event can be bound to. All are client-side
|
|
4
|
+
* observable; every listed payload is available in the browser at trigger time
|
|
5
|
+
* (research §R5).
|
|
6
|
+
*/
|
|
7
|
+
export declare const gaTriggerActionSchema: z.ZodEnum<{
|
|
8
|
+
contact_form_submitted: "contact_form_submitted";
|
|
9
|
+
place_order_clicked: "place_order_clicked";
|
|
10
|
+
add_to_cart: "add_to_cart";
|
|
11
|
+
add_to_quote_request: "add_to_quote_request";
|
|
12
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
13
|
+
button_click_by_id: "button_click_by_id";
|
|
14
|
+
}>;
|
|
15
|
+
export type GaTriggerAction = z.infer<typeof gaTriggerActionSchema>;
|
|
16
|
+
/**
|
|
17
|
+
* Per-action available payload fields. `static` is the closed set offered as
|
|
18
|
+
* checkboxes in the admin; `null` means the field set is dynamic/free-form
|
|
19
|
+
* (form fields, order payload keys, button `data-*` names) and the admin adds
|
|
20
|
+
* keys by hand. `contact_form_submitted` never exposes file uploads (FR-018).
|
|
21
|
+
*/
|
|
22
|
+
export declare const GA_ACTION_FIELD_CATALOGUE: Record<GaTriggerAction, {
|
|
23
|
+
static: readonly string[] | null;
|
|
24
|
+
}>;
|
|
25
|
+
/** GA4 event-name shape: starts with a letter, letters/digits/underscore, ≤40. */
|
|
26
|
+
export declare const gaEventNameSchema: z.ZodString;
|
|
27
|
+
/** GA4 param-name shape: starts with a letter, letters/digits/underscore, ≤128. */
|
|
28
|
+
export declare const gaParamKeySchema: z.ZodString;
|
|
29
|
+
export declare const gaCustomEventFieldSchema: z.ZodObject<{
|
|
30
|
+
fieldKey: z.ZodString;
|
|
31
|
+
payloadKey: z.ZodOptional<z.ZodString>;
|
|
32
|
+
position: z.ZodNumber;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
export type GaCustomEventField = z.infer<typeof gaCustomEventFieldSchema>;
|
|
35
|
+
export declare const gaCustomEventCreateSchema: z.ZodObject<{
|
|
36
|
+
salesChannelCode: z.ZodOptional<z.ZodString>;
|
|
37
|
+
eventName: z.ZodString;
|
|
38
|
+
triggerAction: z.ZodEnum<{
|
|
39
|
+
contact_form_submitted: "contact_form_submitted";
|
|
40
|
+
place_order_clicked: "place_order_clicked";
|
|
41
|
+
add_to_cart: "add_to_cart";
|
|
42
|
+
add_to_quote_request: "add_to_quote_request";
|
|
43
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
44
|
+
button_click_by_id: "button_click_by_id";
|
|
45
|
+
}>;
|
|
46
|
+
buttonId: z.ZodOptional<z.ZodString>;
|
|
47
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
48
|
+
fields: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
49
|
+
fieldKey: z.ZodString;
|
|
50
|
+
payloadKey: z.ZodOptional<z.ZodString>;
|
|
51
|
+
position: z.ZodNumber;
|
|
52
|
+
}, z.core.$strip>>>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
export type GaCustomEventCreate = z.infer<typeof gaCustomEventCreateSchema>;
|
|
55
|
+
export declare const gaCustomEventUpdateSchema: z.ZodObject<{
|
|
56
|
+
salesChannelCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
57
|
+
eventName: z.ZodOptional<z.ZodString>;
|
|
58
|
+
triggerAction: z.ZodOptional<z.ZodEnum<{
|
|
59
|
+
contact_form_submitted: "contact_form_submitted";
|
|
60
|
+
place_order_clicked: "place_order_clicked";
|
|
61
|
+
add_to_cart: "add_to_cart";
|
|
62
|
+
add_to_quote_request: "add_to_quote_request";
|
|
63
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
64
|
+
button_click_by_id: "button_click_by_id";
|
|
65
|
+
}>>;
|
|
66
|
+
buttonId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
67
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
68
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
69
|
+
fieldKey: z.ZodString;
|
|
70
|
+
payloadKey: z.ZodOptional<z.ZodString>;
|
|
71
|
+
position: z.ZodNumber;
|
|
72
|
+
}, z.core.$strip>>>;
|
|
73
|
+
version: z.ZodNumber;
|
|
74
|
+
}, z.core.$strip>;
|
|
75
|
+
export type GaCustomEventUpdate = z.infer<typeof gaCustomEventUpdateSchema>;
|
|
76
|
+
export declare const gaCustomEventResponseSchema: z.ZodObject<{
|
|
77
|
+
id: z.ZodUUID;
|
|
78
|
+
salesChannelCode: z.ZodNullable<z.ZodString>;
|
|
79
|
+
eventName: z.ZodString;
|
|
80
|
+
triggerAction: z.ZodEnum<{
|
|
81
|
+
contact_form_submitted: "contact_form_submitted";
|
|
82
|
+
place_order_clicked: "place_order_clicked";
|
|
83
|
+
add_to_cart: "add_to_cart";
|
|
84
|
+
add_to_quote_request: "add_to_quote_request";
|
|
85
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
86
|
+
button_click_by_id: "button_click_by_id";
|
|
87
|
+
}>;
|
|
88
|
+
buttonId: z.ZodNullable<z.ZodString>;
|
|
89
|
+
enabled: z.ZodBoolean;
|
|
90
|
+
fields: z.ZodArray<z.ZodObject<{
|
|
91
|
+
fieldKey: z.ZodString;
|
|
92
|
+
payloadKey: z.ZodOptional<z.ZodString>;
|
|
93
|
+
position: z.ZodNumber;
|
|
94
|
+
}, z.core.$strip>>;
|
|
95
|
+
createdAt: z.ZodISODateTime;
|
|
96
|
+
updatedAt: z.ZodISODateTime;
|
|
97
|
+
version: z.ZodNumber;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
export type GaCustomEventResponse = z.infer<typeof gaCustomEventResponseSchema>;
|
|
100
|
+
export declare const gaCustomEventListQuerySchema: z.ZodObject<{
|
|
101
|
+
salesChannelCode: z.ZodOptional<z.ZodString>;
|
|
102
|
+
triggerAction: z.ZodOptional<z.ZodEnum<{
|
|
103
|
+
contact_form_submitted: "contact_form_submitted";
|
|
104
|
+
place_order_clicked: "place_order_clicked";
|
|
105
|
+
add_to_cart: "add_to_cart";
|
|
106
|
+
add_to_quote_request: "add_to_quote_request";
|
|
107
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
108
|
+
button_click_by_id: "button_click_by_id";
|
|
109
|
+
}>>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
export type GaCustomEventListQuery = z.infer<typeof gaCustomEventListQuerySchema>;
|
|
112
|
+
export declare const gaStorefrontCustomEventSchema: z.ZodObject<{
|
|
113
|
+
eventName: z.ZodString;
|
|
114
|
+
triggerAction: z.ZodEnum<{
|
|
115
|
+
contact_form_submitted: "contact_form_submitted";
|
|
116
|
+
place_order_clicked: "place_order_clicked";
|
|
117
|
+
add_to_cart: "add_to_cart";
|
|
118
|
+
add_to_quote_request: "add_to_quote_request";
|
|
119
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
120
|
+
button_click_by_id: "button_click_by_id";
|
|
121
|
+
}>;
|
|
122
|
+
buttonId: z.ZodNullable<z.ZodString>;
|
|
123
|
+
fields: z.ZodArray<z.ZodObject<{
|
|
124
|
+
fieldKey: z.ZodString;
|
|
125
|
+
payloadKey: z.ZodString;
|
|
126
|
+
}, z.core.$strip>>;
|
|
127
|
+
}, z.core.$strip>;
|
|
128
|
+
export type GaStorefrontCustomEvent = z.infer<typeof gaStorefrontCustomEventSchema>;
|
|
129
|
+
export declare const gaStorefrontConfigSchema: z.ZodObject<{
|
|
130
|
+
enabled: z.ZodBoolean;
|
|
131
|
+
measurementId: z.ZodNullable<z.ZodString>;
|
|
132
|
+
enhancedEcommerce: z.ZodBoolean;
|
|
133
|
+
serverSide: z.ZodBoolean;
|
|
134
|
+
requireConsent: z.ZodBoolean;
|
|
135
|
+
customEvents: z.ZodArray<z.ZodObject<{
|
|
136
|
+
eventName: z.ZodString;
|
|
137
|
+
triggerAction: z.ZodEnum<{
|
|
138
|
+
contact_form_submitted: "contact_form_submitted";
|
|
139
|
+
place_order_clicked: "place_order_clicked";
|
|
140
|
+
add_to_cart: "add_to_cart";
|
|
141
|
+
add_to_quote_request: "add_to_quote_request";
|
|
142
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
143
|
+
button_click_by_id: "button_click_by_id";
|
|
144
|
+
}>;
|
|
145
|
+
buttonId: z.ZodNullable<z.ZodString>;
|
|
146
|
+
fields: z.ZodArray<z.ZodObject<{
|
|
147
|
+
fieldKey: z.ZodString;
|
|
148
|
+
payloadKey: z.ZodString;
|
|
149
|
+
}, z.core.$strip>>;
|
|
150
|
+
}, z.core.$strip>>;
|
|
151
|
+
}, z.core.$strip>;
|
|
152
|
+
export type GaStorefrontConfig = z.infer<typeof gaStorefrontConfigSchema>;
|
|
153
|
+
export declare const gaCollectEventSchema: z.ZodObject<{
|
|
154
|
+
name: z.ZodString;
|
|
155
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
156
|
+
}, z.core.$strip>;
|
|
157
|
+
export type GaCollectEvent = z.infer<typeof gaCollectEventSchema>;
|
|
158
|
+
export declare const gaCollectRequestSchema: z.ZodObject<{
|
|
159
|
+
clientId: z.ZodString;
|
|
160
|
+
consent: z.ZodObject<{
|
|
161
|
+
analyticsStorage: z.ZodEnum<{
|
|
162
|
+
granted: "granted";
|
|
163
|
+
denied: "denied";
|
|
164
|
+
}>;
|
|
165
|
+
}, z.core.$strip>;
|
|
166
|
+
events: z.ZodArray<z.ZodObject<{
|
|
167
|
+
name: z.ZodString;
|
|
168
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
169
|
+
}, z.core.$strip>>;
|
|
170
|
+
}, z.core.$strip>;
|
|
171
|
+
export type GaCollectRequest = z.infer<typeof gaCollectRequestSchema>;
|
|
172
|
+
export declare const GOOGLE_ANALYTICS_SETTING_CODES: {
|
|
173
|
+
readonly ENABLED: "google_analytics.enabled";
|
|
174
|
+
readonly MEASUREMENT_ID: "google_analytics.measurement_id";
|
|
175
|
+
readonly ENHANCED_ECOMMERCE_ENABLED: "google_analytics.enhanced_ecommerce_enabled";
|
|
176
|
+
readonly SERVER_SIDE_ENABLED: "google_analytics.server_side_enabled";
|
|
177
|
+
readonly SERVER_SIDE_ENDPOINT: "google_analytics.server_side_endpoint";
|
|
178
|
+
readonly SERVER_SIDE_API_SECRET: "google_analytics.server_side_api_secret";
|
|
179
|
+
readonly REQUIRE_CONSENT: "google_analytics.require_consent";
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=google-analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-analytics.d.ts","sourceRoot":"","sources":["../src/google-analytics.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;EAOhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAMpE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,eAAe,EACf;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAQrC,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,aAEoC,CAAC;AAEnE,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,aAE0C,CAAC;AAMxE,eAAO,MAAM,wBAAwB;;;;iBAInC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAyB1E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;iBAgBlC,CAAC;AACL,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;iBAiBlC,CAAC;AACL,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;iBAWtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,4BAA4B;;;;;;;;;;iBAGvC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAMlF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;iBAKxC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;iBAUnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAM1E,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;iBAMjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAMtE,eAAO,MAAM,8BAA8B;;;;;;;;CAQjC,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Google Analytics module — feature 049 contract surface.
|
|
2
|
+
//
|
|
3
|
+
// Holds the Zod request/response schemas for the admin custom-events CRUD, the
|
|
4
|
+
// storefront per-channel config read, the server-side collect (producer) ingest,
|
|
5
|
+
// the trigger-action enum + field catalogue shared by the admin field-picker and
|
|
6
|
+
// the storefront collector, and the `GOOGLE_ANALYTICS_SETTING_CODES` const shared
|
|
7
|
+
// between the settings manifest and the module's services.
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// (1) Enumerations
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Storefront interactions a custom event can be bound to. All are client-side
|
|
14
|
+
* observable; every listed payload is available in the browser at trigger time
|
|
15
|
+
* (research §R5).
|
|
16
|
+
*/
|
|
17
|
+
export const gaTriggerActionSchema = z.enum([
|
|
18
|
+
'contact_form_submitted',
|
|
19
|
+
'place_order_clicked',
|
|
20
|
+
'add_to_cart',
|
|
21
|
+
'add_to_quote_request',
|
|
22
|
+
'add_to_shopping_list',
|
|
23
|
+
'button_click_by_id',
|
|
24
|
+
]);
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// (2) Field catalogue (shared: admin field-picker + storefront collector)
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Per-action available payload fields. `static` is the closed set offered as
|
|
30
|
+
* checkboxes in the admin; `null` means the field set is dynamic/free-form
|
|
31
|
+
* (form fields, order payload keys, button `data-*` names) and the admin adds
|
|
32
|
+
* keys by hand. `contact_form_submitted` never exposes file uploads (FR-018).
|
|
33
|
+
*/
|
|
34
|
+
export const GA_ACTION_FIELD_CATALOGUE = {
|
|
35
|
+
contact_form_submitted: { static: null },
|
|
36
|
+
place_order_clicked: { static: null },
|
|
37
|
+
add_to_cart: { static: ['sku', 'name', 'price', 'quantity'] },
|
|
38
|
+
add_to_quote_request: { static: ['sku', 'name', 'price', 'quantity'] },
|
|
39
|
+
add_to_shopping_list: { static: ['sku', 'name', 'price', 'quantity'] },
|
|
40
|
+
button_click_by_id: { static: null },
|
|
41
|
+
};
|
|
42
|
+
/** GA4 event-name shape: starts with a letter, letters/digits/underscore, ≤40. */
|
|
43
|
+
export const gaEventNameSchema = z
|
|
44
|
+
.string()
|
|
45
|
+
.regex(/^[A-Za-z][A-Za-z0-9_]{0,39}$/, 'Invalid GA4 event name');
|
|
46
|
+
/** GA4 param-name shape: starts with a letter, letters/digits/underscore, ≤128. */
|
|
47
|
+
export const gaParamKeySchema = z
|
|
48
|
+
.string()
|
|
49
|
+
.regex(/^[A-Za-z][A-Za-z0-9_]{0,127}$/, 'Invalid GA4 parameter name');
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// (3) Custom event — admin DTOs
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
export const gaCustomEventFieldSchema = z.object({
|
|
54
|
+
fieldKey: gaParamKeySchema,
|
|
55
|
+
payloadKey: gaParamKeySchema.optional(),
|
|
56
|
+
position: z.number().int().min(0),
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* `buttonId` is required iff the action is `button_click_by_id` and forbidden
|
|
60
|
+
* otherwise; static-set actions restrict `fields[].fieldKey` to the catalogue.
|
|
61
|
+
* Applied inline on each schema (a shared generic helper trips
|
|
62
|
+
* exactOptionalPropertyTypes).
|
|
63
|
+
*/
|
|
64
|
+
function buttonIdOk(action, buttonId) {
|
|
65
|
+
if (action === undefined)
|
|
66
|
+
return true;
|
|
67
|
+
return action === 'button_click_by_id'
|
|
68
|
+
? typeof buttonId === 'string' && buttonId.length > 0
|
|
69
|
+
: buttonId === undefined || buttonId === null;
|
|
70
|
+
}
|
|
71
|
+
function fieldsOk(action, fields) {
|
|
72
|
+
if (action === undefined || fields === undefined)
|
|
73
|
+
return true;
|
|
74
|
+
const allowed = GA_ACTION_FIELD_CATALOGUE[action].static;
|
|
75
|
+
if (allowed === null)
|
|
76
|
+
return true;
|
|
77
|
+
return fields.every((f) => allowed.includes(f.fieldKey));
|
|
78
|
+
}
|
|
79
|
+
export const gaCustomEventCreateSchema = z
|
|
80
|
+
.object({
|
|
81
|
+
salesChannelCode: z.string().optional(),
|
|
82
|
+
eventName: gaEventNameSchema,
|
|
83
|
+
triggerAction: gaTriggerActionSchema,
|
|
84
|
+
buttonId: z.string().max(128).optional(),
|
|
85
|
+
enabled: z.boolean().default(true),
|
|
86
|
+
fields: z.array(gaCustomEventFieldSchema).default([]),
|
|
87
|
+
})
|
|
88
|
+
.refine((v) => buttonIdOk(v.triggerAction, v.buttonId), {
|
|
89
|
+
message: 'buttonId is required for button_click_by_id and forbidden otherwise',
|
|
90
|
+
path: ['buttonId'],
|
|
91
|
+
})
|
|
92
|
+
.refine((v) => fieldsOk(v.triggerAction, v.fields), {
|
|
93
|
+
message: 'A selected field is not available for this action',
|
|
94
|
+
path: ['fields'],
|
|
95
|
+
});
|
|
96
|
+
export const gaCustomEventUpdateSchema = z
|
|
97
|
+
.object({
|
|
98
|
+
salesChannelCode: z.string().nullable().optional(),
|
|
99
|
+
eventName: gaEventNameSchema.optional(),
|
|
100
|
+
triggerAction: gaTriggerActionSchema.optional(),
|
|
101
|
+
buttonId: z.string().max(128).nullable().optional(),
|
|
102
|
+
enabled: z.boolean().optional(),
|
|
103
|
+
fields: z.array(gaCustomEventFieldSchema).optional(),
|
|
104
|
+
version: z.number().int().min(1),
|
|
105
|
+
})
|
|
106
|
+
.refine((v) => buttonIdOk(v.triggerAction, v.buttonId), {
|
|
107
|
+
message: 'buttonId is required for button_click_by_id and forbidden otherwise',
|
|
108
|
+
path: ['buttonId'],
|
|
109
|
+
})
|
|
110
|
+
.refine((v) => fieldsOk(v.triggerAction, v.fields), {
|
|
111
|
+
message: 'A selected field is not available for this action',
|
|
112
|
+
path: ['fields'],
|
|
113
|
+
});
|
|
114
|
+
export const gaCustomEventResponseSchema = z.object({
|
|
115
|
+
id: z.uuid(),
|
|
116
|
+
salesChannelCode: z.string().nullable(),
|
|
117
|
+
eventName: z.string(),
|
|
118
|
+
triggerAction: gaTriggerActionSchema,
|
|
119
|
+
buttonId: z.string().nullable(),
|
|
120
|
+
enabled: z.boolean(),
|
|
121
|
+
fields: z.array(gaCustomEventFieldSchema),
|
|
122
|
+
createdAt: z.iso.datetime(),
|
|
123
|
+
updatedAt: z.iso.datetime(),
|
|
124
|
+
version: z.number().int(),
|
|
125
|
+
});
|
|
126
|
+
export const gaCustomEventListQuerySchema = z.object({
|
|
127
|
+
salesChannelCode: z.string().optional(),
|
|
128
|
+
triggerAction: gaTriggerActionSchema.optional(),
|
|
129
|
+
});
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// (4) Storefront — per-channel public config
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
export const gaStorefrontCustomEventSchema = z.object({
|
|
134
|
+
eventName: z.string(),
|
|
135
|
+
triggerAction: gaTriggerActionSchema,
|
|
136
|
+
buttonId: z.string().nullable(),
|
|
137
|
+
fields: z.array(z.object({ fieldKey: z.string(), payloadKey: z.string() })),
|
|
138
|
+
});
|
|
139
|
+
export const gaStorefrontConfigSchema = z.object({
|
|
140
|
+
/** Master switch AND measurement-id presence resolved server-side. */
|
|
141
|
+
enabled: z.boolean(),
|
|
142
|
+
measurementId: z.string().nullable(),
|
|
143
|
+
enhancedEcommerce: z.boolean(),
|
|
144
|
+
/** When true the browser routes events to /collect instead of gtag (no double count). */
|
|
145
|
+
serverSide: z.boolean(),
|
|
146
|
+
/** Drives Consent Mode v2 default state. */
|
|
147
|
+
requireConsent: z.boolean(),
|
|
148
|
+
customEvents: z.array(gaStorefrontCustomEventSchema),
|
|
149
|
+
});
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// (5) Storefront — server-side collect (producer ingest)
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
export const gaCollectEventSchema = z.object({
|
|
154
|
+
name: z.string().min(1).max(64),
|
|
155
|
+
params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).default({}),
|
|
156
|
+
});
|
|
157
|
+
export const gaCollectRequestSchema = z.object({
|
|
158
|
+
clientId: z.string().min(1).max(128),
|
|
159
|
+
consent: z.object({
|
|
160
|
+
analyticsStorage: z.enum(['granted', 'denied']),
|
|
161
|
+
}),
|
|
162
|
+
events: z.array(gaCollectEventSchema).min(1).max(25),
|
|
163
|
+
});
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// (6) Setting codes (shared between manifest + services)
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
export const GOOGLE_ANALYTICS_SETTING_CODES = {
|
|
168
|
+
ENABLED: 'google_analytics.enabled',
|
|
169
|
+
MEASUREMENT_ID: 'google_analytics.measurement_id',
|
|
170
|
+
ENHANCED_ECOMMERCE_ENABLED: 'google_analytics.enhanced_ecommerce_enabled',
|
|
171
|
+
SERVER_SIDE_ENABLED: 'google_analytics.server_side_enabled',
|
|
172
|
+
SERVER_SIDE_ENDPOINT: 'google_analytics.server_side_endpoint',
|
|
173
|
+
SERVER_SIDE_API_SECRET: 'google_analytics.server_side_api_secret',
|
|
174
|
+
REQUIRE_CONSENT: 'google_analytics.require_consent',
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=google-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-analytics.js","sourceRoot":"","sources":["../src/google-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const GOOGLE_TAG_MANAGER_SETTING_CODES: {
|
|
3
|
+
readonly ENABLED: "google_tag_manager.enabled";
|
|
4
|
+
readonly CONTAINER_ID: "google_tag_manager.container_id";
|
|
5
|
+
readonly REQUIRE_CONSENT: "google_tag_manager.require_consent";
|
|
6
|
+
readonly SERVER_SIDE_ENABLED: "google_tag_manager.server_side_enabled";
|
|
7
|
+
readonly SERVER_CONTAINER_URL: "google_tag_manager.server_container_url";
|
|
8
|
+
readonly SERVER_INGEST_PATH: "google_tag_manager.server_ingest_path";
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* GTM container ID. Google issues `GTM-` plus 5-7 uppercase alphanumerics
|
|
12
|
+
* today; the 4-10 window absorbs historical and future widths without
|
|
13
|
+
* accepting free text. A `GT-…` Google tag id is deliberately not accepted —
|
|
14
|
+
* it is not a container and would load nothing (research §R15).
|
|
15
|
+
*/
|
|
16
|
+
export declare const gtmContainerIdSchema: z.ZodString;
|
|
17
|
+
/**
|
|
18
|
+
* The closed allow-list of events the platform emits and may relay to a
|
|
19
|
+
* server-side container. The ingest route rejects anything outside it, which is
|
|
20
|
+
* what makes FR-024 structural rather than a matter of caller discipline.
|
|
21
|
+
*/
|
|
22
|
+
export declare const GTM_RELAY_ELIGIBLE_EVENTS: readonly ["page_view", "view_search_results", "view_item", "add_to_cart", "add_to_quote_request", "add_to_shopping_list", "begin_checkout", "place_order_clicked", "purchase", "contact_form_submitted"];
|
|
23
|
+
export type GtmRelayEligibleEvent = (typeof GTM_RELAY_ELIGIBLE_EVENTS)[number];
|
|
24
|
+
/**
|
|
25
|
+
* Events that depend on browser-only state (viewport, live DOM, wall-clock
|
|
26
|
+
* dwell time) or are generated by the container itself. The platform gives them
|
|
27
|
+
* no server-side path and no implementation at all: the GTM container stays
|
|
28
|
+
* loaded in the browser even in server-side mode, so its own triggers keep
|
|
29
|
+
* handling them (research §R5). Listed here for documentation and as the
|
|
30
|
+
* negative test fixture for the ingest validator.
|
|
31
|
+
*/
|
|
32
|
+
export declare const GTM_CLIENT_ONLY_EVENTS: readonly ["scroll", "click", "file_download", "form_start", "form_submit", "gtm.js", "gtm.dom", "gtm.load"];
|
|
33
|
+
export type GtmClientOnlyEvent = (typeof GTM_CLIENT_ONLY_EVENTS)[number];
|
|
34
|
+
/** An event name the platform is willing to relay. */
|
|
35
|
+
export declare const gtmEventNameSchema: z.ZodEnum<{
|
|
36
|
+
contact_form_submitted: "contact_form_submitted";
|
|
37
|
+
place_order_clicked: "place_order_clicked";
|
|
38
|
+
add_to_cart: "add_to_cart";
|
|
39
|
+
add_to_quote_request: "add_to_quote_request";
|
|
40
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
41
|
+
page_view: "page_view";
|
|
42
|
+
view_search_results: "view_search_results";
|
|
43
|
+
view_item: "view_item";
|
|
44
|
+
begin_checkout: "begin_checkout";
|
|
45
|
+
purchase: "purchase";
|
|
46
|
+
}>;
|
|
47
|
+
export declare const gtmStorefrontConfigSchema: z.ZodObject<{
|
|
48
|
+
enabled: z.ZodBoolean;
|
|
49
|
+
containerId: z.ZodNullable<z.ZodString>;
|
|
50
|
+
requireConsent: z.ZodBoolean;
|
|
51
|
+
serverSide: z.ZodBoolean;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
export type GtmStorefrontConfig = z.infer<typeof gtmStorefrontConfigSchema>;
|
|
54
|
+
/** Fully-off config — the shape every failure path degrades to. */
|
|
55
|
+
export declare const GTM_DISABLED_CONFIG: GtmStorefrontConfig;
|
|
56
|
+
export declare const gtmRelayEventSchema: z.ZodObject<{
|
|
57
|
+
name: z.ZodEnum<{
|
|
58
|
+
contact_form_submitted: "contact_form_submitted";
|
|
59
|
+
place_order_clicked: "place_order_clicked";
|
|
60
|
+
add_to_cart: "add_to_cart";
|
|
61
|
+
add_to_quote_request: "add_to_quote_request";
|
|
62
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
63
|
+
page_view: "page_view";
|
|
64
|
+
view_search_results: "view_search_results";
|
|
65
|
+
view_item: "view_item";
|
|
66
|
+
begin_checkout: "begin_checkout";
|
|
67
|
+
purchase: "purchase";
|
|
68
|
+
}>;
|
|
69
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
export type GtmRelayEvent = z.infer<typeof gtmRelayEventSchema>;
|
|
72
|
+
/** Page context as observed in the browser at emit time. */
|
|
73
|
+
export declare const gtmPageContextSchema: z.ZodObject<{
|
|
74
|
+
location: z.ZodString;
|
|
75
|
+
referrer: z.ZodOptional<z.ZodString>;
|
|
76
|
+
title: z.ZodOptional<z.ZodString>;
|
|
77
|
+
language: z.ZodOptional<z.ZodString>;
|
|
78
|
+
}, z.core.$strip>;
|
|
79
|
+
export type GtmPageContext = z.infer<typeof gtmPageContextSchema>;
|
|
80
|
+
export declare const gtmCollectRequestSchema: z.ZodObject<{
|
|
81
|
+
clientId: z.ZodString;
|
|
82
|
+
consent: z.ZodObject<{
|
|
83
|
+
analyticsStorage: z.ZodEnum<{
|
|
84
|
+
granted: "granted";
|
|
85
|
+
denied: "denied";
|
|
86
|
+
}>;
|
|
87
|
+
}, z.core.$strip>;
|
|
88
|
+
page: z.ZodObject<{
|
|
89
|
+
location: z.ZodString;
|
|
90
|
+
referrer: z.ZodOptional<z.ZodString>;
|
|
91
|
+
title: z.ZodOptional<z.ZodString>;
|
|
92
|
+
language: z.ZodOptional<z.ZodString>;
|
|
93
|
+
}, z.core.$strip>;
|
|
94
|
+
events: z.ZodArray<z.ZodObject<{
|
|
95
|
+
name: z.ZodEnum<{
|
|
96
|
+
contact_form_submitted: "contact_form_submitted";
|
|
97
|
+
place_order_clicked: "place_order_clicked";
|
|
98
|
+
add_to_cart: "add_to_cart";
|
|
99
|
+
add_to_quote_request: "add_to_quote_request";
|
|
100
|
+
add_to_shopping_list: "add_to_shopping_list";
|
|
101
|
+
page_view: "page_view";
|
|
102
|
+
view_search_results: "view_search_results";
|
|
103
|
+
view_item: "view_item";
|
|
104
|
+
begin_checkout: "begin_checkout";
|
|
105
|
+
purchase: "purchase";
|
|
106
|
+
}>;
|
|
107
|
+
params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
108
|
+
}, z.core.$strip>>;
|
|
109
|
+
}, z.core.$strip>;
|
|
110
|
+
export type GtmCollectRequest = z.infer<typeof gtmCollectRequestSchema>;
|
|
111
|
+
//# sourceMappingURL=google-tag-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-tag-manager.d.ts","sourceRoot":"","sources":["../src/google-tag-manager.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,gCAAgC;;;;;;;CAOnC,CAAC;AAMX;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,aAE0C,CAAC;AAM5E;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,0MAW5B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,6GASzB,CAAC;AACX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,sDAAsD;AACtD,eAAO,MAAM,kBAAkB;;;;;;;;;;;EAAoC,CAAC;AAMpE,eAAO,MAAM,yBAAyB;;;;;iBAapC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,EAAE,mBAKjC,CAAC;AAMF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;iBAU9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB;;;;;iBAK/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAOlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Google Tag Manager module — feature 066 contract surface.
|
|
2
|
+
//
|
|
3
|
+
// Holds the per-channel setting codes, the container-ID shape, the closed
|
|
4
|
+
// event vocabulary shared by the storefront emitter / the backend ingest
|
|
5
|
+
// validator / the docs, the storefront config read model, and the server-side
|
|
6
|
+
// relay ingest request.
|
|
7
|
+
//
|
|
8
|
+
// The snake_case body the backend posts to the operator's server container is
|
|
9
|
+
// deliberately NOT modelled here: it is an external vendor's wire format,
|
|
10
|
+
// constructed in exactly one place and never parsed back, so it lives as a
|
|
11
|
+
// plain TypeScript interface in the module's `sgtm-client.ts` (research §R6).
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// (1) Setting codes (shared between manifest + services)
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export const GOOGLE_TAG_MANAGER_SETTING_CODES = {
|
|
17
|
+
ENABLED: 'google_tag_manager.enabled',
|
|
18
|
+
CONTAINER_ID: 'google_tag_manager.container_id',
|
|
19
|
+
REQUIRE_CONSENT: 'google_tag_manager.require_consent',
|
|
20
|
+
SERVER_SIDE_ENABLED: 'google_tag_manager.server_side_enabled',
|
|
21
|
+
SERVER_CONTAINER_URL: 'google_tag_manager.server_container_url',
|
|
22
|
+
SERVER_INGEST_PATH: 'google_tag_manager.server_ingest_path',
|
|
23
|
+
};
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// (2) Container ID
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* GTM container ID. Google issues `GTM-` plus 5-7 uppercase alphanumerics
|
|
29
|
+
* today; the 4-10 window absorbs historical and future widths without
|
|
30
|
+
* accepting free text. A `GT-…` Google tag id is deliberately not accepted —
|
|
31
|
+
* it is not a container and would load nothing (research §R15).
|
|
32
|
+
*/
|
|
33
|
+
export const gtmContainerIdSchema = z
|
|
34
|
+
.string()
|
|
35
|
+
.regex(/^GTM-[A-Z0-9]{4,10}$/, 'Container ID must look like GTM-XXXXXXX');
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// (3) The event vocabulary
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/**
|
|
40
|
+
* The closed allow-list of events the platform emits and may relay to a
|
|
41
|
+
* server-side container. The ingest route rejects anything outside it, which is
|
|
42
|
+
* what makes FR-024 structural rather than a matter of caller discipline.
|
|
43
|
+
*/
|
|
44
|
+
export const GTM_RELAY_ELIGIBLE_EVENTS = [
|
|
45
|
+
'page_view',
|
|
46
|
+
'view_search_results',
|
|
47
|
+
'view_item',
|
|
48
|
+
'add_to_cart',
|
|
49
|
+
'add_to_quote_request',
|
|
50
|
+
'add_to_shopping_list',
|
|
51
|
+
'begin_checkout',
|
|
52
|
+
'place_order_clicked',
|
|
53
|
+
'purchase',
|
|
54
|
+
'contact_form_submitted',
|
|
55
|
+
];
|
|
56
|
+
/**
|
|
57
|
+
* Events that depend on browser-only state (viewport, live DOM, wall-clock
|
|
58
|
+
* dwell time) or are generated by the container itself. The platform gives them
|
|
59
|
+
* no server-side path and no implementation at all: the GTM container stays
|
|
60
|
+
* loaded in the browser even in server-side mode, so its own triggers keep
|
|
61
|
+
* handling them (research §R5). Listed here for documentation and as the
|
|
62
|
+
* negative test fixture for the ingest validator.
|
|
63
|
+
*/
|
|
64
|
+
export const GTM_CLIENT_ONLY_EVENTS = [
|
|
65
|
+
'scroll',
|
|
66
|
+
'click',
|
|
67
|
+
'file_download',
|
|
68
|
+
'form_start',
|
|
69
|
+
'form_submit',
|
|
70
|
+
'gtm.js',
|
|
71
|
+
'gtm.dom',
|
|
72
|
+
'gtm.load',
|
|
73
|
+
];
|
|
74
|
+
/** An event name the platform is willing to relay. */
|
|
75
|
+
export const gtmEventNameSchema = z.enum(GTM_RELAY_ELIGIBLE_EVENTS);
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// (4) Storefront — per-channel public config
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
export const gtmStorefrontConfigSchema = z.object({
|
|
80
|
+
/** Master switch AND a valid container ID, resolved server-side. */
|
|
81
|
+
enabled: z.boolean(),
|
|
82
|
+
/** `null` when the channel is untracked (blank or malformed value). */
|
|
83
|
+
containerId: z.string().nullable(),
|
|
84
|
+
/** Drives the Consent Mode v2 default state and the shared consent gate. */
|
|
85
|
+
requireConsent: z.boolean(),
|
|
86
|
+
/**
|
|
87
|
+
* True only when server-side tagging is on AND a server container URL is
|
|
88
|
+
* configured. Drives the storefront dispatch switch; the container address
|
|
89
|
+
* itself never leaves the backend.
|
|
90
|
+
*/
|
|
91
|
+
serverSide: z.boolean(),
|
|
92
|
+
});
|
|
93
|
+
/** Fully-off config — the shape every failure path degrades to. */
|
|
94
|
+
export const GTM_DISABLED_CONFIG = {
|
|
95
|
+
enabled: false,
|
|
96
|
+
containerId: null,
|
|
97
|
+
requireConsent: true,
|
|
98
|
+
serverSide: false,
|
|
99
|
+
};
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// (5) Storefront — server-side relay ingest (producer)
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
export const gtmRelayEventSchema = z.object({
|
|
104
|
+
name: gtmEventNameSchema,
|
|
105
|
+
/**
|
|
106
|
+
* Scalars only. `items[]` is serialised by the caller with `JSON.stringify`,
|
|
107
|
+
* exactly as the storefront choke point already does for GA — which is also
|
|
108
|
+
* why a file upload cannot be expressed here at all (FR-021).
|
|
109
|
+
*/
|
|
110
|
+
params: z
|
|
111
|
+
.record(z.string(), z.union([z.string(), z.number(), z.boolean()]))
|
|
112
|
+
.default({}),
|
|
113
|
+
});
|
|
114
|
+
/** Page context as observed in the browser at emit time. */
|
|
115
|
+
export const gtmPageContextSchema = z.object({
|
|
116
|
+
location: z.string().min(1).max(2048),
|
|
117
|
+
referrer: z.string().max(2048).optional(),
|
|
118
|
+
title: z.string().max(512).optional(),
|
|
119
|
+
language: z.string().max(16).optional(),
|
|
120
|
+
});
|
|
121
|
+
export const gtmCollectRequestSchema = z.object({
|
|
122
|
+
clientId: z.string().min(1).max(128),
|
|
123
|
+
consent: z.object({
|
|
124
|
+
analyticsStorage: z.enum(['granted', 'denied']),
|
|
125
|
+
}),
|
|
126
|
+
page: gtmPageContextSchema,
|
|
127
|
+
events: z.array(gtmRelayEventSchema).min(1).max(25),
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=google-tag-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-tag-manager.js","sourceRoot":"","sources":["../src/google-tag-manager.ts"],"names":[],"mappings":"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"}
|