@selwise/widget 0.0.1 → 0.0.2

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.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/npm/cjs/modules/contract/recommendation-contract.js +1 -1
  4. package/dist/npm/cjs/modules/contract/search-contract.js +1 -1
  5. package/dist/npm/cjs/modules/contract/tracking-contract.js +1 -1
  6. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/configs.js +164 -0
  7. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/configs.js.map +1 -0
  8. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/index.js +21 -0
  9. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/index.js.map +1 -0
  10. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/types.js +3 -0
  11. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/types.js.map +1 -0
  12. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/validators.js +107 -0
  13. package/dist/npm/cjs/modules/contract/vendor/recommendation-contract/validators.js.map +1 -0
  14. package/dist/npm/cjs/modules/contract/vendor/search-contract/configs.js +404 -0
  15. package/dist/npm/cjs/modules/contract/vendor/search-contract/configs.js.map +1 -0
  16. package/dist/npm/cjs/modules/contract/vendor/search-contract/index.js +21 -0
  17. package/dist/npm/cjs/modules/contract/vendor/search-contract/index.js.map +1 -0
  18. package/dist/npm/cjs/modules/contract/vendor/search-contract/types.js +8 -0
  19. package/dist/npm/cjs/modules/contract/vendor/search-contract/types.js.map +1 -0
  20. package/dist/npm/cjs/modules/contract/vendor/search-contract/validators.js +126 -0
  21. package/dist/npm/cjs/modules/contract/vendor/search-contract/validators.js.map +1 -0
  22. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/configs.js +133 -0
  23. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/configs.js.map +1 -0
  24. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/index.js +21 -0
  25. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/index.js.map +1 -0
  26. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/types.js +3 -0
  27. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/types.js.map +1 -0
  28. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/validators.js +154 -0
  29. package/dist/npm/cjs/modules/contract/vendor/tracking-contract/validators.js.map +1 -0
  30. package/dist/npm/cjs/modules/contract/vendor/widget-contract/configs.js +1481 -0
  31. package/dist/npm/cjs/modules/contract/vendor/widget-contract/configs.js.map +1 -0
  32. package/dist/npm/cjs/modules/contract/vendor/widget-contract/index.js +22 -0
  33. package/dist/npm/cjs/modules/contract/vendor/widget-contract/index.js.map +1 -0
  34. package/dist/npm/cjs/modules/contract/vendor/widget-contract/layout.js +21 -0
  35. package/dist/npm/cjs/modules/contract/vendor/widget-contract/layout.js.map +1 -0
  36. package/dist/npm/cjs/modules/contract/vendor/widget-contract/types.js +8 -0
  37. package/dist/npm/cjs/modules/contract/vendor/widget-contract/types.js.map +1 -0
  38. package/dist/npm/cjs/modules/contract/vendor/widget-contract/validators.js +139 -0
  39. package/dist/npm/cjs/modules/contract/vendor/widget-contract/validators.js.map +1 -0
  40. package/dist/npm/cjs/modules/contract/widget-contract.js +1 -1
  41. package/dist/npm/esm/modules/contract/recommendation-contract.d.ts +2 -2
  42. package/dist/npm/esm/modules/contract/recommendation-contract.js +1 -1
  43. package/dist/npm/esm/modules/contract/search-contract.d.ts +1 -1
  44. package/dist/npm/esm/modules/contract/search-contract.js +1 -1
  45. package/dist/npm/esm/modules/contract/tracking-contract.d.ts +1 -1
  46. package/dist/npm/esm/modules/contract/tracking-contract.js +1 -1
  47. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/configs.d.ts +8 -0
  48. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/configs.js +160 -0
  49. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/configs.js.map +1 -0
  50. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/index.d.ts +3 -0
  51. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/index.js +5 -0
  52. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/index.js.map +1 -0
  53. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/types.d.ts +56 -0
  54. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/types.js +2 -0
  55. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/types.js.map +1 -0
  56. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/validators.d.ts +3 -0
  57. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/validators.js +103 -0
  58. package/dist/npm/esm/modules/contract/vendor/recommendation-contract/validators.js.map +1 -0
  59. package/dist/npm/esm/modules/contract/vendor/search-contract/configs.d.ts +35 -0
  60. package/dist/npm/esm/modules/contract/vendor/search-contract/configs.js +396 -0
  61. package/dist/npm/esm/modules/contract/vendor/search-contract/configs.js.map +1 -0
  62. package/dist/npm/esm/modules/contract/vendor/search-contract/index.d.ts +3 -0
  63. package/dist/npm/esm/modules/contract/vendor/search-contract/index.js +5 -0
  64. package/dist/npm/esm/modules/contract/vendor/search-contract/index.js.map +1 -0
  65. package/dist/npm/esm/modules/contract/vendor/search-contract/types.d.ts +119 -0
  66. package/dist/npm/esm/modules/contract/vendor/search-contract/types.js +7 -0
  67. package/dist/npm/esm/modules/contract/vendor/search-contract/types.js.map +1 -0
  68. package/dist/npm/esm/modules/contract/vendor/search-contract/validators.d.ts +22 -0
  69. package/dist/npm/esm/modules/contract/vendor/search-contract/validators.js +118 -0
  70. package/dist/npm/esm/modules/contract/vendor/search-contract/validators.js.map +1 -0
  71. package/dist/npm/esm/modules/contract/vendor/tracking-contract/configs.d.ts +7 -0
  72. package/dist/npm/esm/modules/contract/vendor/tracking-contract/configs.js +130 -0
  73. package/dist/npm/esm/modules/contract/vendor/tracking-contract/configs.js.map +1 -0
  74. package/dist/npm/esm/modules/contract/vendor/tracking-contract/index.d.ts +3 -0
  75. package/dist/npm/esm/modules/contract/vendor/tracking-contract/index.js +5 -0
  76. package/dist/npm/esm/modules/contract/vendor/tracking-contract/index.js.map +1 -0
  77. package/dist/npm/esm/modules/contract/vendor/tracking-contract/types.d.ts +37 -0
  78. package/dist/npm/esm/modules/contract/vendor/tracking-contract/types.js +2 -0
  79. package/dist/npm/esm/modules/contract/vendor/tracking-contract/types.js.map +1 -0
  80. package/dist/npm/esm/modules/contract/vendor/tracking-contract/validators.d.ts +6 -0
  81. package/dist/npm/esm/modules/contract/vendor/tracking-contract/validators.js +147 -0
  82. package/dist/npm/esm/modules/contract/vendor/tracking-contract/validators.js.map +1 -0
  83. package/dist/npm/esm/modules/contract/vendor/widget-contract/configs.d.ts +22 -0
  84. package/dist/npm/esm/modules/contract/vendor/widget-contract/configs.js +1472 -0
  85. package/dist/npm/esm/modules/contract/vendor/widget-contract/configs.js.map +1 -0
  86. package/dist/npm/esm/modules/contract/vendor/widget-contract/index.d.ts +4 -0
  87. package/dist/npm/esm/modules/contract/vendor/widget-contract/index.js +6 -0
  88. package/dist/npm/esm/modules/contract/vendor/widget-contract/index.js.map +1 -0
  89. package/dist/npm/esm/modules/contract/vendor/widget-contract/layout.d.ts +14 -0
  90. package/dist/npm/esm/modules/contract/vendor/widget-contract/layout.js +18 -0
  91. package/dist/npm/esm/modules/contract/vendor/widget-contract/layout.js.map +1 -0
  92. package/dist/npm/esm/modules/contract/vendor/widget-contract/types.d.ts +128 -0
  93. package/dist/npm/esm/modules/contract/vendor/widget-contract/types.js +7 -0
  94. package/dist/npm/esm/modules/contract/vendor/widget-contract/types.js.map +1 -0
  95. package/dist/npm/esm/modules/contract/vendor/widget-contract/validators.d.ts +11 -0
  96. package/dist/npm/esm/modules/contract/vendor/widget-contract/validators.js +132 -0
  97. package/dist/npm/esm/modules/contract/vendor/widget-contract/validators.js.map +1 -0
  98. package/dist/npm/esm/modules/contract/widget-contract.d.ts +1 -1
  99. package/dist/npm/esm/modules/contract/widget-contract.js +1 -1
  100. package/dist/npm/esm/selwise.js +2 -2
  101. package/package.json +25 -9
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Search Configuration Type Definitions
3
+ * Single source of truth for all search configuration types
4
+ */
5
+ export type SearchPosition = 'inline' | 'modal' | 'floating' | 'sidebar' | 'fullscreen';
6
+ export type SearchFloatingPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
7
+ export type CategoryDisplayMode = 'none' | 'chips' | 'sidebar' | 'dropdown';
8
+ export type ResultLayout = 'list' | 'grid' | 'compact' | 'large';
9
+ export interface SearchPositionConfig {
10
+ value: SearchPosition;
11
+ label: string;
12
+ description: string;
13
+ icon: string;
14
+ requiresSelector?: boolean;
15
+ }
16
+ export interface StyleFieldConfig {
17
+ key: string;
18
+ label: string;
19
+ type: 'color' | 'select' | 'text' | 'toggle' | 'number' | 'range' | 'font' | 'textarea';
20
+ default: any;
21
+ options?: string[];
22
+ placeholder?: string;
23
+ min?: number;
24
+ max?: number;
25
+ step?: number;
26
+ }
27
+ export interface StyleSection {
28
+ id: string;
29
+ title: string;
30
+ icon?: string;
31
+ fields: StyleFieldConfig[];
32
+ }
33
+ export type SearchStyleFieldSpec = StyleFieldConfig;
34
+ export type SearchSuggestionStyleFieldSpec = StyleFieldConfig;
35
+ export interface CategoryConfig {
36
+ displayMode: CategoryDisplayMode;
37
+ showCount: boolean;
38
+ maxVisible: number;
39
+ expandable: boolean;
40
+ hierarchical: boolean;
41
+ }
42
+ export interface ResultItemConfig {
43
+ layout: ResultLayout;
44
+ showImage: boolean;
45
+ showDescription: boolean;
46
+ showPrice: boolean;
47
+ showOldPrice: boolean;
48
+ showDiscount: boolean;
49
+ showStock: boolean;
50
+ showCategory: boolean;
51
+ showRating: boolean;
52
+ imageSize: 'small' | 'medium' | 'large';
53
+ imagePosition: 'left' | 'top' | 'right';
54
+ truncateTitle: number;
55
+ truncateDescription: number;
56
+ }
57
+ export interface AnimationConfig {
58
+ type: 'none' | 'fade' | 'slide' | 'scale' | 'blur';
59
+ duration: number;
60
+ easing: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out';
61
+ }
62
+ export interface SearchConfigData {
63
+ isEnabled: boolean;
64
+ position: SearchPosition;
65
+ selector?: string;
66
+ placeholder: string;
67
+ minChars: number;
68
+ debounceMs: number;
69
+ maxResults: number;
70
+ category: CategoryConfig;
71
+ resultItem: ResultItemConfig;
72
+ styles: Record<string, any>;
73
+ animation: AnimationConfig;
74
+ hotkey?: string;
75
+ searchOnFocus: boolean;
76
+ keepOpen: boolean;
77
+ mobileFullscreen: boolean;
78
+ }
79
+ export interface SearchPreviewProps {
80
+ position: SearchPosition;
81
+ styles: Record<string, any>;
82
+ category: CategoryConfig;
83
+ resultItem: ResultItemConfig;
84
+ }
85
+ export type SuggestionSource = 'manual' | 'dynamic' | 'both';
86
+ export interface PopularCategoryItem {
87
+ name: string;
88
+ imageUrl?: string;
89
+ }
90
+ export interface RecentSearchesConfig {
91
+ enabled: boolean;
92
+ maxCount: number;
93
+ }
94
+ export interface PopularSearchesConfig {
95
+ enabled: boolean;
96
+ source: SuggestionSource;
97
+ manual: string[];
98
+ maxCount: number;
99
+ }
100
+ export interface PopularCategoriesConfig {
101
+ enabled: boolean;
102
+ source: SuggestionSource;
103
+ manual: PopularCategoryItem[];
104
+ maxCount: number;
105
+ }
106
+ export interface PopularProductsConfig {
107
+ enabled: boolean;
108
+ source: SuggestionSource;
109
+ manual: string[];
110
+ maxCount: number;
111
+ }
112
+ export interface ProductForSelection {
113
+ id: string;
114
+ sku: string;
115
+ name: string;
116
+ price: number;
117
+ imageUrl?: string;
118
+ categories?: string;
119
+ }
@@ -0,0 +1,7 @@
1
+ // AUTO-GENERATED FROM packages/search-contract/src/types.ts. DO NOT EDIT DIRECTLY.
2
+ /**
3
+ * Search Configuration Type Definitions
4
+ * Single source of truth for all search configuration types
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../src/modules/contract/vendor/search-contract/types.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF;;;GAGG"}
@@ -0,0 +1,22 @@
1
+ export interface SearchValidationResult {
2
+ valid: boolean;
3
+ message?: string;
4
+ invalidKeys?: string[];
5
+ }
6
+ export interface SearchConfigValidationInput {
7
+ position?: unknown;
8
+ floatingPosition?: unknown;
9
+ categoryDisplayMode?: unknown;
10
+ resultLayout?: unknown;
11
+ imageSize?: unknown;
12
+ imagePosition?: unknown;
13
+ animationType?: unknown;
14
+ stylesJson?: unknown;
15
+ suggestionStylesJson?: unknown;
16
+ }
17
+ export declare function getAllowedSearchStyleKeys(): string[];
18
+ export declare function getAllowedSuggestionStyleKeys(): string[];
19
+ export declare function validateSearchStyles(styles: unknown, suggestionStyles?: unknown): SearchValidationResult;
20
+ export declare function sanitizeSearchStyles(styles: unknown): Record<string, any>;
21
+ export declare function sanitizeSuggestionStyles(styles: unknown): Record<string, any>;
22
+ export declare function validateSearchConfig(config: SearchConfigValidationInput): SearchValidationResult;
@@ -0,0 +1,118 @@
1
+ // AUTO-GENERATED FROM packages/search-contract/src/validators.ts. DO NOT EDIT DIRECTLY.
2
+ import { CATEGORY_DISPLAY_MODES, SEARCH_FLOATING_POSITIONS, SEARCH_POSITIONS, SEARCH_STYLE_CONFIGS, SUGGESTION_STYLE_CONFIGS, getDefaultSearchStyles, getDefaultSuggestionStyles, } from './configs.js';
3
+ const RESULT_LAYOUTS = ['list', 'grid', 'compact', 'large'];
4
+ const IMAGE_SIZES = new Set(['small', 'medium', 'large']);
5
+ const IMAGE_POSITIONS = new Set(['left', 'top', 'right']);
6
+ const ANIMATION_TYPES = new Set(['none', 'fade', 'slide', 'scale']);
7
+ const SEARCH_POSITION_SET = new Set(SEARCH_POSITIONS.map((position) => position.value));
8
+ const SEARCH_FLOATING_POSITION_SET = new Set(SEARCH_FLOATING_POSITIONS.map((position) => position.value));
9
+ const CATEGORY_DISPLAY_MODE_SET = new Set(CATEGORY_DISPLAY_MODES.map((mode) => mode.value));
10
+ function isRecord(value) {
11
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
12
+ }
13
+ export function getAllowedSearchStyleKeys() {
14
+ return SEARCH_STYLE_CONFIGS.flatMap((section) => section.fields.map((field) => field.key));
15
+ }
16
+ export function getAllowedSuggestionStyleKeys() {
17
+ return SUGGESTION_STYLE_CONFIGS.flatMap((section) => section.fields.map((field) => field.key));
18
+ }
19
+ export function validateSearchStyles(styles, suggestionStyles) {
20
+ if (styles !== undefined) {
21
+ if (!isRecord(styles)) {
22
+ return { valid: false, message: 'invalid search style payload' };
23
+ }
24
+ const allowedStyleKeys = new Set(getAllowedSearchStyleKeys());
25
+ const invalidStyleKeys = Object.keys(styles).filter((key) => !allowedStyleKeys.has(key));
26
+ if (invalidStyleKeys.length > 0) {
27
+ return {
28
+ valid: false,
29
+ message: `invalid style key: ${invalidStyleKeys.join(', ')}`,
30
+ invalidKeys: invalidStyleKeys,
31
+ };
32
+ }
33
+ }
34
+ if (suggestionStyles !== undefined) {
35
+ if (!isRecord(suggestionStyles)) {
36
+ return { valid: false, message: 'invalid suggestion style payload' };
37
+ }
38
+ const allowedSuggestionStyleKeys = new Set(getAllowedSuggestionStyleKeys());
39
+ const invalidSuggestionStyleKeys = Object.keys(suggestionStyles).filter((key) => !allowedSuggestionStyleKeys.has(key));
40
+ if (invalidSuggestionStyleKeys.length > 0) {
41
+ return {
42
+ valid: false,
43
+ message: `invalid style key: ${invalidSuggestionStyleKeys.join(', ')}`,
44
+ invalidKeys: invalidSuggestionStyleKeys,
45
+ };
46
+ }
47
+ }
48
+ return { valid: true };
49
+ }
50
+ export function sanitizeSearchStyles(styles) {
51
+ const defaults = getDefaultSearchStyles();
52
+ if (!isRecord(styles)) {
53
+ return defaults;
54
+ }
55
+ const allowed = new Set(getAllowedSearchStyleKeys());
56
+ const sanitized = { ...defaults };
57
+ for (const [styleKey, styleValue] of Object.entries(styles)) {
58
+ if (allowed.has(styleKey)) {
59
+ sanitized[styleKey] = styleValue;
60
+ }
61
+ }
62
+ return sanitized;
63
+ }
64
+ export function sanitizeSuggestionStyles(styles) {
65
+ const defaults = getDefaultSuggestionStyles();
66
+ if (!isRecord(styles)) {
67
+ return defaults;
68
+ }
69
+ const allowed = new Set(getAllowedSuggestionStyleKeys());
70
+ const sanitized = { ...defaults };
71
+ for (const [styleKey, styleValue] of Object.entries(styles)) {
72
+ if (allowed.has(styleKey)) {
73
+ sanitized[styleKey] = styleValue;
74
+ }
75
+ }
76
+ return sanitized;
77
+ }
78
+ export function validateSearchConfig(config) {
79
+ if (config.position !== undefined) {
80
+ if (typeof config.position !== 'string' || !SEARCH_POSITION_SET.has(config.position)) {
81
+ return { valid: false, message: 'invalid search position' };
82
+ }
83
+ }
84
+ if (config.floatingPosition !== undefined) {
85
+ if (typeof config.floatingPosition !== 'string' ||
86
+ !SEARCH_FLOATING_POSITION_SET.has(config.floatingPosition)) {
87
+ return { valid: false, message: 'invalid floating position' };
88
+ }
89
+ }
90
+ if (config.categoryDisplayMode !== undefined) {
91
+ if (typeof config.categoryDisplayMode !== 'string' ||
92
+ !CATEGORY_DISPLAY_MODE_SET.has(config.categoryDisplayMode)) {
93
+ return { valid: false, message: 'invalid category display mode' };
94
+ }
95
+ }
96
+ if (config.resultLayout !== undefined) {
97
+ if (typeof config.resultLayout !== 'string' || !RESULT_LAYOUTS.includes(config.resultLayout)) {
98
+ return { valid: false, message: 'invalid result layout' };
99
+ }
100
+ }
101
+ if (config.imageSize !== undefined) {
102
+ if (typeof config.imageSize !== 'string' || !IMAGE_SIZES.has(config.imageSize)) {
103
+ return { valid: false, message: 'invalid image size' };
104
+ }
105
+ }
106
+ if (config.imagePosition !== undefined) {
107
+ if (typeof config.imagePosition !== 'string' || !IMAGE_POSITIONS.has(config.imagePosition)) {
108
+ return { valid: false, message: 'invalid image position' };
109
+ }
110
+ }
111
+ if (config.animationType !== undefined) {
112
+ if (typeof config.animationType !== 'string' || !ANIMATION_TYPES.has(config.animationType)) {
113
+ return { valid: false, message: 'invalid animation type' };
114
+ }
115
+ }
116
+ return validateSearchStyles(config.stylesJson, config.suggestionStylesJson);
117
+ }
118
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../../../../../src/modules/contract/vendor/search-contract/validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CanonicalEventName, CookieConsentDefaults, EventCategory, TrackingModuleConfig, TrackingModuleKey } from './types';
2
+ export declare const CANONICAL_EVENTS: CanonicalEventName[];
3
+ export declare const EVENT_CATEGORIES: Record<CanonicalEventName, EventCategory>;
4
+ export declare const DEFAULT_PAGE_TYPE_PATTERNS: Record<string, string>;
5
+ export declare const TRACKING_MODULES: Record<TrackingModuleKey, TrackingModuleConfig>;
6
+ export declare const COOKIE_CONSENT_DEFAULTS: CookieConsentDefaults;
7
+ export declare const FREQUENCY_CAP_INTERVALS: readonly ["", "15m", "30m", "1h", "2h", "6h", "12h", "1d", "1w"];
@@ -0,0 +1,130 @@
1
+ export const CANONICAL_EVENTS = [
2
+ 'page_view',
3
+ 'virtual_page_view',
4
+ 'widget_view',
5
+ 'category_view',
6
+ 'product_view',
7
+ 'product_click',
8
+ 'product_impression',
9
+ 'product_dwell_time',
10
+ 'add_to_cart',
11
+ 'remove_from_cart',
12
+ 'update_cart',
13
+ 'cart_abandon',
14
+ 'cart_restore',
15
+ 'checkout_begin',
16
+ 'checkout_progress',
17
+ 'checkout_option',
18
+ 'purchase',
19
+ 'user_signup',
20
+ 'user_login',
21
+ 'user_logout',
22
+ 'user_update',
23
+ 'search_instant_open',
24
+ 'search_query',
25
+ 'search_filter',
26
+ 'search_sort',
27
+ 'search_page',
28
+ 'search_results',
29
+ 'search_zero_results',
30
+ 'search_close',
31
+ 'impression',
32
+ 'click',
33
+ 'close',
34
+ 'view',
35
+ 'hover',
36
+ 'scroll',
37
+ 'slider_navigate',
38
+ 'slider_swipe',
39
+ 'widget_impression',
40
+ 'script_injected',
41
+ 'script_error',
42
+ 'identify',
43
+ 'category_filter',
44
+ 'recent_search_click',
45
+ 'popular_search_click',
46
+ 'popular_category_click',
47
+ 'popular_product_click',
48
+ 'wishlist',
49
+ 'custom_event',
50
+ ];
51
+ export const EVENT_CATEGORIES = {
52
+ page_view: 'page',
53
+ virtual_page_view: 'page',
54
+ widget_view: 'engagement',
55
+ category_view: 'commerce',
56
+ product_view: 'commerce',
57
+ product_click: 'search',
58
+ product_impression: 'commerce',
59
+ product_dwell_time: 'commerce',
60
+ add_to_cart: 'commerce',
61
+ remove_from_cart: 'commerce',
62
+ update_cart: 'commerce',
63
+ cart_abandon: 'commerce',
64
+ cart_restore: 'commerce',
65
+ checkout_begin: 'commerce',
66
+ checkout_progress: 'commerce',
67
+ checkout_option: 'commerce',
68
+ purchase: 'commerce',
69
+ user_signup: 'user',
70
+ user_login: 'user',
71
+ user_logout: 'user',
72
+ user_update: 'user',
73
+ search_instant_open: 'search',
74
+ search_query: 'search',
75
+ search_filter: 'search',
76
+ search_sort: 'search',
77
+ search_page: 'search',
78
+ search_results: 'search',
79
+ search_zero_results: 'search',
80
+ search_close: 'search',
81
+ impression: 'engagement',
82
+ click: 'engagement',
83
+ close: 'engagement',
84
+ view: 'engagement',
85
+ hover: 'engagement',
86
+ scroll: 'engagement',
87
+ slider_navigate: 'recommendation',
88
+ slider_swipe: 'recommendation',
89
+ widget_impression: 'recommendation',
90
+ script_injected: 'system',
91
+ script_error: 'system',
92
+ identify: 'user',
93
+ category_filter: 'search',
94
+ recent_search_click: 'search',
95
+ popular_search_click: 'search',
96
+ popular_category_click: 'search',
97
+ popular_product_click: 'search',
98
+ wishlist: 'commerce',
99
+ custom_event: 'engagement',
100
+ };
101
+ export const DEFAULT_PAGE_TYPE_PATTERNS = {
102
+ home: '^/$|\\/index\\.html?$',
103
+ product: '\\/(products?|p|item)s?\\/[a-z0-9-]+',
104
+ category: '\\/(categories?|c|collection)s?\\/[a-z0-9-]+',
105
+ search: '\\/(search|find)',
106
+ checkout: '\\/(checkout|payment|order)',
107
+ cart: '\\/(cart|basket)',
108
+ account: '\\/(account|profile|my-account)',
109
+ };
110
+ export const TRACKING_MODULES = {
111
+ page: { enabled: true },
112
+ product: { enabled: true },
113
+ basket: { enabled: true },
114
+ checkout: { enabled: true },
115
+ user: { enabled: false },
116
+ search: { enabled: false },
117
+ };
118
+ export const COOKIE_CONSENT_DEFAULTS = {
119
+ enabled: false,
120
+ variableName: '__wcmp_consent',
121
+ waitForConsent: false,
122
+ defaultConsent: true,
123
+ granularEnabled: false,
124
+ requiredCategories: ['necessary'],
125
+ timeoutMs: 5000,
126
+ storageKey: 'selwise_consent',
127
+ consentChangeCallback: '',
128
+ };
129
+ export const FREQUENCY_CAP_INTERVALS = ['', '15m', '30m', '1h', '2h', '6h', '12h', '1d', '1w'];
130
+ //# sourceMappingURL=configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.js","sourceRoot":"","sources":["../../../../../../../src/modules/contract/vendor/tracking-contract/configs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './configs';
3
+ export * from './validators';
@@ -0,0 +1,5 @@
1
+ // AUTO-GENERATED FROM packages/tracking-contract/src/index.ts. DO NOT EDIT DIRECTLY.
2
+ export * from './types.js';
3
+ export * from './configs.js';
4
+ export * from './validators.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/modules/contract/vendor/tracking-contract/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,37 @@
1
+ export type CanonicalEventName = 'page_view' | 'virtual_page_view' | 'widget_view' | 'category_view' | 'product_view' | 'product_click' | 'product_impression' | 'product_dwell_time' | 'add_to_cart' | 'remove_from_cart' | 'update_cart' | 'cart_abandon' | 'cart_restore' | 'checkout_begin' | 'checkout_progress' | 'checkout_option' | 'purchase' | 'user_signup' | 'user_login' | 'user_logout' | 'user_update' | 'search_instant_open' | 'search_query' | 'search_filter' | 'search_sort' | 'search_page' | 'search_results' | 'search_zero_results' | 'search_close' | 'impression' | 'click' | 'close' | 'view' | 'hover' | 'scroll' | 'slider_navigate' | 'slider_swipe' | 'widget_impression' | 'script_injected' | 'script_error' | 'identify' | 'category_filter' | 'recent_search_click' | 'popular_search_click' | 'popular_category_click' | 'popular_product_click' | 'wishlist' | 'custom_event';
2
+ export type EventCategory = 'page' | 'commerce' | 'search' | 'engagement' | 'recommendation' | 'user' | 'system';
3
+ export type TrackingModuleKey = 'page' | 'product' | 'basket' | 'checkout' | 'user' | 'search';
4
+ export interface TrackingModuleConfig {
5
+ enabled: boolean;
6
+ config?: Record<string, any>;
7
+ }
8
+ export interface CookieConsentDefaults {
9
+ enabled: boolean;
10
+ variableName: string;
11
+ waitForConsent: boolean;
12
+ defaultConsent: boolean;
13
+ granularEnabled: boolean;
14
+ requiredCategories: Array<'necessary' | 'analytics' | 'marketing' | 'preferences'>;
15
+ timeoutMs: number;
16
+ storageKey: string;
17
+ consentChangeCallback: string;
18
+ }
19
+ export interface DataLayerConfigInput {
20
+ enabled?: unknown;
21
+ variableName?: unknown;
22
+ pageDetection?: unknown;
23
+ autoPageTracking?: unknown;
24
+ cartAbandonmentTimeout?: unknown;
25
+ pageTypePatterns?: unknown;
26
+ debugMode?: unknown;
27
+ testMode?: unknown;
28
+ cookieConsent?: unknown;
29
+ trackingModules?: unknown;
30
+ bufferSize?: unknown;
31
+ flushInterval?: unknown;
32
+ }
33
+ export interface TrackingValidationResult {
34
+ valid: boolean;
35
+ message?: string;
36
+ invalidKeys?: string[];
37
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../src/modules/contract/vendor/tracking-contract/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { DataLayerConfigInput, TrackingValidationResult } from './types';
2
+ export declare function validateCanonicalEvent(eventName: string): boolean;
3
+ export declare function validateFrequencyInterval(interval: string): boolean;
4
+ export declare function validateFrequencyCapPayload(payload: unknown): TrackingValidationResult;
5
+ export declare function validateDataLayerConfig(config: DataLayerConfigInput): TrackingValidationResult;
6
+ export declare function sanitizeDataLayerConfig(config: DataLayerConfigInput): Record<string, any>;
@@ -0,0 +1,147 @@
1
+ // AUTO-GENERATED FROM packages/tracking-contract/src/validators.ts. DO NOT EDIT DIRECTLY.
2
+ import { CANONICAL_EVENTS, COOKIE_CONSENT_DEFAULTS, DEFAULT_PAGE_TYPE_PATTERNS, FREQUENCY_CAP_INTERVALS, TRACKING_MODULES, } from './configs.js';
3
+ const CANONICAL_EVENT_SET = new Set(CANONICAL_EVENTS);
4
+ const REQUIRED_CATEGORY_SET = new Set(['necessary', 'analytics', 'marketing', 'preferences']);
5
+ const PAGE_DETECTION_SET = new Set(['auto', 'manual', 'patterns']);
6
+ const FREQUENCY_INTERVAL_SET = new Set(FREQUENCY_CAP_INTERVALS);
7
+ const FREQUENCY_CAP_KEY_SET = new Set(['perSession', 'perDay', 'perWeek', 'total', 'minInterval']);
8
+ function isRecord(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ export function validateCanonicalEvent(eventName) {
12
+ return CANONICAL_EVENT_SET.has(eventName);
13
+ }
14
+ export function validateFrequencyInterval(interval) {
15
+ return FREQUENCY_INTERVAL_SET.has(interval);
16
+ }
17
+ export function validateFrequencyCapPayload(payload) {
18
+ if (payload === undefined || payload === null) {
19
+ return { valid: true };
20
+ }
21
+ if (!isRecord(payload)) {
22
+ return { valid: false, message: 'invalid frequency cap payload' };
23
+ }
24
+ const invalidKeys = Object.keys(payload).filter((key) => !FREQUENCY_CAP_KEY_SET.has(key));
25
+ if (invalidKeys.length > 0) {
26
+ return {
27
+ valid: false,
28
+ message: `invalid frequency cap key: ${invalidKeys.join(', ')}`,
29
+ invalidKeys,
30
+ };
31
+ }
32
+ for (const key of ['perSession', 'perDay', 'perWeek', 'total']) {
33
+ if (payload[key] !== undefined) {
34
+ if (!Number.isInteger(payload[key]) || payload[key] < 0) {
35
+ return { valid: false, message: `invalid frequency cap value: ${key}` };
36
+ }
37
+ }
38
+ }
39
+ if (payload.minInterval !== undefined) {
40
+ if (typeof payload.minInterval !== 'string' || !validateFrequencyInterval(payload.minInterval)) {
41
+ return { valid: false, message: 'invalid frequency cap minInterval' };
42
+ }
43
+ }
44
+ return { valid: true };
45
+ }
46
+ function validateTrackingModules(modules) {
47
+ if (modules === undefined) {
48
+ return { valid: true };
49
+ }
50
+ if (!isRecord(modules)) {
51
+ return { valid: false, message: 'invalid tracking modules payload' };
52
+ }
53
+ const allowedKeys = new Set(Object.keys(TRACKING_MODULES));
54
+ const invalidKeys = Object.keys(modules).filter((key) => !allowedKeys.has(key));
55
+ if (invalidKeys.length > 0) {
56
+ return {
57
+ valid: false,
58
+ message: `invalid tracking module key: ${invalidKeys.join(', ')}`,
59
+ invalidKeys,
60
+ };
61
+ }
62
+ for (const [key, value] of Object.entries(modules)) {
63
+ if (!isRecord(value)) {
64
+ return { valid: false, message: `invalid tracking module payload: ${key}` };
65
+ }
66
+ if ('enabled' in value && typeof value.enabled !== 'boolean') {
67
+ return { valid: false, message: `invalid tracking module enabled flag: ${key}` };
68
+ }
69
+ }
70
+ return { valid: true };
71
+ }
72
+ export function validateDataLayerConfig(config) {
73
+ if (!isRecord(config)) {
74
+ return { valid: false, message: 'invalid data layer config payload' };
75
+ }
76
+ if (config.pageDetection !== undefined) {
77
+ if (typeof config.pageDetection !== 'string' || !PAGE_DETECTION_SET.has(config.pageDetection)) {
78
+ return { valid: false, message: 'invalid page detection mode' };
79
+ }
80
+ }
81
+ if (config.pageTypePatterns !== undefined) {
82
+ if (!isRecord(config.pageTypePatterns)) {
83
+ return { valid: false, message: 'invalid page type patterns payload' };
84
+ }
85
+ const allowedPatternKeys = new Set(Object.keys(DEFAULT_PAGE_TYPE_PATTERNS));
86
+ const invalidPatternKeys = Object.keys(config.pageTypePatterns).filter((key) => !allowedPatternKeys.has(key));
87
+ if (invalidPatternKeys.length > 0) {
88
+ return {
89
+ valid: false,
90
+ message: `invalid page type pattern key: ${invalidPatternKeys.join(', ')}`,
91
+ invalidKeys: invalidPatternKeys,
92
+ };
93
+ }
94
+ }
95
+ if (config.cookieConsent !== undefined) {
96
+ if (!isRecord(config.cookieConsent)) {
97
+ return { valid: false, message: 'invalid cookie consent payload' };
98
+ }
99
+ if (config.cookieConsent.requiredCategories !== undefined) {
100
+ if (!Array.isArray(config.cookieConsent.requiredCategories)) {
101
+ return { valid: false, message: 'invalid required categories payload' };
102
+ }
103
+ const invalidCategories = config.cookieConsent.requiredCategories.filter((category) => typeof category !== 'string' || !REQUIRED_CATEGORY_SET.has(category));
104
+ if (invalidCategories.length > 0) {
105
+ return { valid: false, message: 'invalid required categories value' };
106
+ }
107
+ }
108
+ }
109
+ const moduleValidation = validateTrackingModules(config.trackingModules);
110
+ if (!moduleValidation.valid) {
111
+ return moduleValidation;
112
+ }
113
+ return { valid: true };
114
+ }
115
+ export function sanitizeDataLayerConfig(config) {
116
+ const baseTrackingModules = { ...TRACKING_MODULES };
117
+ const incomingTrackingModules = isRecord(config.trackingModules)
118
+ ? config.trackingModules
119
+ : {};
120
+ for (const moduleName of Object.keys(baseTrackingModules)) {
121
+ const incoming = incomingTrackingModules[moduleName];
122
+ if (isRecord(incoming) && typeof incoming.enabled === 'boolean') {
123
+ baseTrackingModules[moduleName] = {
124
+ enabled: incoming.enabled,
125
+ ...(isRecord(incoming.config) ? { config: incoming.config } : {}),
126
+ };
127
+ }
128
+ }
129
+ const cookieConsent = {
130
+ ...COOKIE_CONSENT_DEFAULTS,
131
+ ...(isRecord(config.cookieConsent) ? config.cookieConsent : {}),
132
+ };
133
+ if (Array.isArray(cookieConsent.requiredCategories)) {
134
+ cookieConsent.requiredCategories = cookieConsent.requiredCategories.filter((category) => typeof category === 'string' && REQUIRED_CATEGORY_SET.has(category));
135
+ }
136
+ if (!cookieConsent.requiredCategories || cookieConsent.requiredCategories.length === 0) {
137
+ cookieConsent.requiredCategories = COOKIE_CONSENT_DEFAULTS.requiredCategories;
138
+ }
139
+ return {
140
+ pageTypePatterns: isRecord(config.pageTypePatterns)
141
+ ? { ...DEFAULT_PAGE_TYPE_PATTERNS, ...config.pageTypePatterns }
142
+ : { ...DEFAULT_PAGE_TYPE_PATTERNS },
143
+ trackingModules: baseTrackingModules,
144
+ cookieConsent,
145
+ };
146
+ }
147
+ //# sourceMappingURL=validators.js.map