feed-common 1.77.0 → 1.77.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 (108) hide show
  1. package/.vscode/settings.json +1 -1
  2. package/CHANGELOG.md +14 -0
  3. package/dist/constants/profile.constants.d.ts +14 -1
  4. package/dist/constants/profile.constants.d.ts.map +1 -1
  5. package/dist/constants/profile.constants.js +40 -1
  6. package/dist/constants/profile.constants.js.map +1 -1
  7. package/dist/index.d.ts +11 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +11 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/sources/country.source.d.ts +5 -0
  12. package/dist/sources/country.source.d.ts.map +1 -0
  13. package/dist/sources/country.source.js +78 -0
  14. package/dist/sources/country.source.js.map +1 -0
  15. package/dist/sources/currency.source.d.ts.map +1 -1
  16. package/dist/sources/currency.source.js +0 -1
  17. package/dist/sources/currency.source.js.map +1 -1
  18. package/dist/sources/ebay-gallery-type.source.d.ts +5 -0
  19. package/dist/sources/ebay-gallery-type.source.d.ts.map +1 -0
  20. package/dist/sources/ebay-gallery-type.source.js +5 -0
  21. package/dist/sources/ebay-gallery-type.source.js.map +1 -0
  22. package/dist/sources/ebay-inventory-tracking.source.d.ts +3 -0
  23. package/dist/sources/ebay-inventory-tracking.source.d.ts.map +1 -0
  24. package/dist/sources/ebay-inventory-tracking.source.js +11 -0
  25. package/dist/sources/ebay-inventory-tracking.source.js.map +1 -0
  26. package/dist/sources/ebay-listing-type.source.d.ts +5 -0
  27. package/dist/sources/ebay-listing-type.source.d.ts.map +1 -0
  28. package/dist/sources/ebay-listing-type.source.js +5 -0
  29. package/dist/sources/ebay-listing-type.source.js.map +1 -0
  30. package/dist/sources/ebay-yes-no.source.d.ts +5 -0
  31. package/dist/sources/ebay-yes-no.source.d.ts.map +1 -0
  32. package/dist/sources/ebay-yes-no.source.js +2 -0
  33. package/dist/sources/ebay-yes-no.source.js.map +1 -0
  34. package/dist/sources/google-availability.source.d.ts +5 -0
  35. package/dist/sources/google-availability.source.d.ts.map +1 -0
  36. package/dist/sources/google-availability.source.js +7 -0
  37. package/dist/sources/google-availability.source.js.map +1 -0
  38. package/dist/sources/language.source.d.ts +5 -0
  39. package/dist/sources/language.source.d.ts.map +1 -0
  40. package/dist/sources/language.source.js +31 -0
  41. package/dist/sources/language.source.js.map +1 -0
  42. package/dist/utils/feed-templates/{index.d.ts → common-schemas.d.ts} +24 -29
  43. package/dist/utils/feed-templates/common-schemas.d.ts.map +1 -0
  44. package/dist/utils/feed-templates/{index.js → common-schemas.js} +668 -173
  45. package/dist/utils/feed-templates/common-schemas.js.map +1 -0
  46. package/dist/utils/feed-templates/common.d.ts +20 -0
  47. package/dist/utils/feed-templates/common.d.ts.map +1 -0
  48. package/dist/utils/feed-templates/common.js +60 -0
  49. package/dist/utils/feed-templates/common.js.map +1 -0
  50. package/dist/utils/feed-templates/ebay.template.d.ts +2 -2
  51. package/dist/utils/feed-templates/ebay.template.d.ts.map +1 -1
  52. package/dist/utils/feed-templates/ebay.template.js +190 -3
  53. package/dist/utils/feed-templates/ebay.template.js.map +1 -1
  54. package/dist/utils/feed-templates/facebook.template.d.ts.map +1 -1
  55. package/dist/utils/feed-templates/facebook.template.js +2 -1
  56. package/dist/utils/feed-templates/facebook.template.js.map +1 -1
  57. package/dist/utils/feed-templates/google-api.template.d.ts.map +1 -1
  58. package/dist/utils/feed-templates/google-api.template.js +19 -7
  59. package/dist/utils/feed-templates/google-api.template.js.map +1 -1
  60. package/dist/utils/feed-templates/google.template.d.ts.map +1 -1
  61. package/dist/utils/feed-templates/google.template.js +7 -15
  62. package/dist/utils/feed-templates/google.template.js.map +1 -1
  63. package/dist/utils/feed-templates/microsoft.template.d.ts.map +1 -1
  64. package/dist/utils/feed-templates/microsoft.template.js +11 -7
  65. package/dist/utils/feed-templates/microsoft.template.js.map +1 -1
  66. package/dist/utils/feed-templates/template-utils.d.ts +4 -0
  67. package/dist/utils/feed-templates/template-utils.d.ts.map +1 -0
  68. package/dist/utils/feed-templates/template-utils.js +29 -0
  69. package/dist/utils/feed-templates/template-utils.js.map +1 -0
  70. package/dist/utils/feed-templates/tiktok.template.d.ts.map +1 -1
  71. package/dist/utils/feed-templates/tiktok.template.js +2 -1
  72. package/dist/utils/feed-templates/tiktok.template.js.map +1 -1
  73. package/dist/utils/profile.d.ts +2 -1
  74. package/dist/utils/profile.d.ts.map +1 -1
  75. package/dist/utils/profile.js +82 -1
  76. package/dist/utils/profile.js.map +1 -1
  77. package/dist/utils/utils.d.ts +2 -0
  78. package/dist/utils/utils.d.ts.map +1 -1
  79. package/dist/utils/utils.js +23 -3
  80. package/dist/utils/utils.js.map +1 -1
  81. package/package.json +5 -4
  82. package/src/constants/profile.constants.ts +40 -1
  83. package/src/index.ts +11 -1
  84. package/src/sources/country.source.ts +77 -0
  85. package/src/sources/currency.source.ts +0 -1
  86. package/src/sources/ebay-gallery-type.source.ts +4 -0
  87. package/src/sources/ebay-inventory-tracking.source.ts +12 -0
  88. package/src/sources/ebay-listing-type.source.ts +4 -0
  89. package/src/sources/ebay-yes-no.source.ts +1 -0
  90. package/src/sources/google-availability.source.ts +6 -0
  91. package/src/sources/language.source.ts +30 -0
  92. package/src/utils/feed-templates/common-schemas.ts +1014 -0
  93. package/src/utils/feed-templates/common.ts +82 -0
  94. package/src/utils/feed-templates/ebay.template.ts +216 -5
  95. package/src/utils/feed-templates/facebook.template.ts +2 -1
  96. package/src/utils/feed-templates/google-api.template.ts +54 -29
  97. package/src/utils/feed-templates/google.template.ts +46 -52
  98. package/src/utils/feed-templates/microsoft.template.ts +26 -21
  99. package/src/utils/feed-templates/template-utils.ts +30 -0
  100. package/src/utils/feed-templates/tiktok.template.ts +4 -2
  101. package/src/utils/profile.ts +116 -2
  102. package/src/utils/utils.ts +25 -5
  103. package/tests/company.spec.ts +39 -39
  104. package/tests/profile-utils.spec.ts +38 -0
  105. package/tests/validator.spec.ts +1 -5
  106. package/dist/utils/feed-templates/index.d.ts.map +0 -1
  107. package/dist/utils/feed-templates/index.js.map +0 -1
  108. package/src/utils/feed-templates/index.ts +0 -511
@@ -1,49 +1,5 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  import { z } from 'zod';
3
- import { SOURCE_FB_CATEGORY, SOURCE_GOOGLE_PRODUCT_HIGHLIGHT, XMLFeedType } from '../../constants/profile.constants.js';
4
- import { customFeedTemplate } from './custom.template.js';
5
- import { facebookFeedTemplate } from './facebook.template.js';
6
- import { googleFeedTemplate } from './google.template.js';
7
- import { tiktokFeedTemplate } from './tiktok.template.js';
8
- import { microsoftTemplate } from './microsoft.template.js';
9
- import { googleApiTemplate } from './google-api.template.js';
10
- import { getSourceTagValue } from '../utils.js';
11
- export const hasMacro = (v) => /{{[^}]+}}/.test(v.replaceAll(/{{source\..+?}}/g, ''));
12
- export const removeMacro = (v) => v.replaceAll(/{{.+?}}/g, '');
13
- export function validate(value, validator, skipEmpty = true) {
14
- let valueToValidate = value;
15
- if (typeof value === 'string') {
16
- valueToValidate = removeMacro(value);
17
- }
18
- if (!value && skipEmpty) {
19
- return { success: true, data: value };
20
- }
21
- return validator.safeParse(valueToValidate);
22
- }
23
- export function validateIfNoMacro(value, validator) {
24
- if (typeof value === 'string' && hasMacro(value)) {
25
- return { success: true, data: value };
26
- }
27
- if (Array.isArray(validator)) {
28
- for (const v of validator) {
29
- const result = v.safeParse(resolveSourceMacro(value));
30
- if (!result.success) {
31
- return result;
32
- }
33
- }
34
- return { success: true, data: value };
35
- }
36
- return validator.safeParse(resolveSourceMacro(value));
37
- }
38
- export function resolveSourceMacro(macro) {
39
- if (typeof macro !== 'string') {
40
- return macro;
41
- }
42
- return macro.replace(/{{source\..+?}}/g, (macro) => {
43
- const { tag, value } = getSourceTagValue(macro.slice(2, -2));
44
- return value?.map(v => v.value)?.join(getSourceValueSeparator(tag)) ?? '';
45
- });
46
- }
2
+ import { resolveSourceMacro } from '../utils';
47
3
  export const dateRangeSchema = z
48
4
  .string()
49
5
  .refine(v => !v || v.split('/').length === 2, {
@@ -58,7 +14,6 @@ export const dateRangeSchema = z
58
14
  .refine(v => !v || new Date(v.split('/')[1]) > new Date(v.split('/')[0]), {
59
15
  message: 'Date to should be greater than date from',
60
16
  });
61
- const unitMeasureRegex = /^(?<quantity>[\d.,]+)\s*(?<units>\w+)$/;
62
17
  export const measureUnitsSchema = (units) => z.string().superRefine((v, ctx) => {
63
18
  if (!v) {
64
19
  return true;
@@ -96,79 +51,631 @@ export const sameUnitScheme = (other, errorMessage) => z.string().superRefine((v
96
51
  export const optionalUrlSchema = z
97
52
  .string()
98
53
  .refine(v => !v || z.string().url().safeParse(v).success, { message: 'invalid URL' });
99
- export function getTemplate(type) {
100
- switch (type) {
101
- case XMLFeedType.Custom:
102
- return customFeedTemplate;
103
- case XMLFeedType.Facebook:
104
- return facebookFeedTemplate;
105
- case XMLFeedType.Google:
106
- return googleFeedTemplate;
107
- case XMLFeedType.TikTok:
108
- return tiktokFeedTemplate;
109
- case XMLFeedType.Microsoft:
110
- return microsoftTemplate;
111
- case XMLFeedType.GMC_API:
112
- return googleApiTemplate;
113
- default:
114
- throw new Error(`Invalid feed type: ${type}`);
115
- }
116
- }
117
54
  export const currencySchema = z.enum([
118
- 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD',
119
- 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP',
120
- 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU',
121
- 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB',
122
- 'EUR', 'FJD', 'FKP', 'FOK', 'GBP', 'GEL', 'GGP', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ',
123
- 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'IMP', 'INR', 'IQD', 'IRR',
124
- 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KID', 'KMF', 'KRW', 'KWD', 'KYD',
125
- 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK',
126
- 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN',
127
- 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG',
128
- 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP',
129
- 'SLE', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND',
130
- 'TOP', 'TRY', 'TTD', 'TVD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU',
131
- 'UYW', 'UZS', 'VED', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB',
132
- 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX',
133
- 'YER', 'ZAR', 'ZMW', 'ZWL'
55
+ 'AED',
56
+ 'AFN',
57
+ 'ALL',
58
+ 'AMD',
59
+ 'ANG',
60
+ 'AOA',
61
+ 'ARS',
62
+ 'AUD',
63
+ 'AWG',
64
+ 'AZN',
65
+ 'BAM',
66
+ 'BBD',
67
+ 'BDT',
68
+ 'BGN',
69
+ 'BHD',
70
+ 'BIF',
71
+ 'BMD',
72
+ 'BND',
73
+ 'BOB',
74
+ 'BOV',
75
+ 'BRL',
76
+ 'BSD',
77
+ 'BTN',
78
+ 'BWP',
79
+ 'BYN',
80
+ 'BZD',
81
+ 'CAD',
82
+ 'CDF',
83
+ 'CHE',
84
+ 'CHF',
85
+ 'CHW',
86
+ 'CLF',
87
+ 'CLP',
88
+ 'CNY',
89
+ 'COP',
90
+ 'COU',
91
+ 'CRC',
92
+ 'CUC',
93
+ 'CUP',
94
+ 'CVE',
95
+ 'CZK',
96
+ 'DJF',
97
+ 'DKK',
98
+ 'DOP',
99
+ 'DZD',
100
+ 'EGP',
101
+ 'ERN',
102
+ 'ETB',
103
+ 'EUR',
104
+ 'FJD',
105
+ 'FKP',
106
+ 'FOK',
107
+ 'GBP',
108
+ 'GEL',
109
+ 'GGP',
110
+ 'GHS',
111
+ 'GIP',
112
+ 'GMD',
113
+ 'GNF',
114
+ 'GTQ',
115
+ 'GYD',
116
+ 'HKD',
117
+ 'HNL',
118
+ 'HRK',
119
+ 'HTG',
120
+ 'HUF',
121
+ 'IDR',
122
+ 'ILS',
123
+ 'IMP',
124
+ 'INR',
125
+ 'IQD',
126
+ 'IRR',
127
+ 'ISK',
128
+ 'JMD',
129
+ 'JOD',
130
+ 'JPY',
131
+ 'KES',
132
+ 'KGS',
133
+ 'KHR',
134
+ 'KID',
135
+ 'KMF',
136
+ 'KRW',
137
+ 'KWD',
138
+ 'KYD',
139
+ 'KZT',
140
+ 'LAK',
141
+ 'LBP',
142
+ 'LKR',
143
+ 'LRD',
144
+ 'LSL',
145
+ 'LYD',
146
+ 'MAD',
147
+ 'MDL',
148
+ 'MGA',
149
+ 'MKD',
150
+ 'MMK',
151
+ 'MNT',
152
+ 'MOP',
153
+ 'MRU',
154
+ 'MUR',
155
+ 'MVR',
156
+ 'MWK',
157
+ 'MXN',
158
+ 'MXV',
159
+ 'MYR',
160
+ 'MZN',
161
+ 'NAD',
162
+ 'NGN',
163
+ 'NIO',
164
+ 'NOK',
165
+ 'NPR',
166
+ 'NZD',
167
+ 'OMR',
168
+ 'PAB',
169
+ 'PEN',
170
+ 'PGK',
171
+ 'PHP',
172
+ 'PKR',
173
+ 'PLN',
174
+ 'PYG',
175
+ 'QAR',
176
+ 'RON',
177
+ 'RSD',
178
+ 'RUB',
179
+ 'RWF',
180
+ 'SAR',
181
+ 'SBD',
182
+ 'SCR',
183
+ 'SDG',
184
+ 'SEK',
185
+ 'SGD',
186
+ 'SHP',
187
+ 'SLE',
188
+ 'SLL',
189
+ 'SOS',
190
+ 'SRD',
191
+ 'SSP',
192
+ 'STN',
193
+ 'SYP',
194
+ 'SZL',
195
+ 'THB',
196
+ 'TJS',
197
+ 'TMT',
198
+ 'TND',
199
+ 'TOP',
200
+ 'TRY',
201
+ 'TTD',
202
+ 'TVD',
203
+ 'TWD',
204
+ 'TZS',
205
+ 'UAH',
206
+ 'UGX',
207
+ 'USD',
208
+ 'USN',
209
+ 'UYI',
210
+ 'UYU',
211
+ 'UYW',
212
+ 'UZS',
213
+ 'VED',
214
+ 'VES',
215
+ 'VND',
216
+ 'VUV',
217
+ 'WST',
218
+ 'XAF',
219
+ 'XAG',
220
+ 'XAU',
221
+ 'XBA',
222
+ 'XBB',
223
+ 'XBC',
224
+ 'XBD',
225
+ 'XCD',
226
+ 'XDR',
227
+ 'XOF',
228
+ 'XPD',
229
+ 'XPF',
230
+ 'XPT',
231
+ 'XSU',
232
+ 'XTS',
233
+ 'XUA',
234
+ 'XXX',
235
+ 'YER',
236
+ 'ZAR',
237
+ 'ZMW',
238
+ 'ZWL',
134
239
  ]);
135
- export const languageSchema = z.string().refine(v => !v || [
136
- 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az',
137
- 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce',
138
- 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee',
139
- 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr',
140
- 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr',
141
- 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'io', 'is',
142
- 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn',
143
- 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln',
144
- 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms',
145
- 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv',
146
- 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu',
147
- 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'si', 'sk',
148
- 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta',
149
- 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw',
150
- 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi',
151
- 'yo', 'za', 'zh', 'zu'
152
- ].includes(v.toLowerCase()), { message: 'Invalid language code' });
153
- export const countrySchema = z.string().refine(v => !v || [
154
- 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ',
155
- 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS',
156
- 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN',
157
- 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE',
158
- 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG',
159
- 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR',
160
- 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP',
161
- 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK',
162
- 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM',
163
- 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE',
164
- 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK',
165
- 'PL', 'PM', 'PN', 'PR', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC',
166
- 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX',
167
- 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV',
168
- 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS',
169
- 'YE', 'YT', 'ZA', 'ZM', 'ZW'
170
- ].includes(v.toUpperCase()), { message: 'Invalid country code' });
171
- export const priceRegex = /^(?<value>\d+(?:\.\d{1,2})?)\s*(?<currency>\w+)$/;
240
+ export const languageSchema = z
241
+ .string()
242
+ .refine(v => !v ||
243
+ [
244
+ 'aa',
245
+ 'ab',
246
+ 'ae',
247
+ 'af',
248
+ 'ak',
249
+ 'am',
250
+ 'an',
251
+ 'ar',
252
+ 'as',
253
+ 'av',
254
+ 'ay',
255
+ 'az',
256
+ 'ba',
257
+ 'be',
258
+ 'bg',
259
+ 'bh',
260
+ 'bi',
261
+ 'bm',
262
+ 'bn',
263
+ 'bo',
264
+ 'br',
265
+ 'bs',
266
+ 'ca',
267
+ 'ce',
268
+ 'ch',
269
+ 'co',
270
+ 'cr',
271
+ 'cs',
272
+ 'cu',
273
+ 'cv',
274
+ 'cy',
275
+ 'da',
276
+ 'de',
277
+ 'dv',
278
+ 'dz',
279
+ 'ee',
280
+ 'el',
281
+ 'en',
282
+ 'eo',
283
+ 'es',
284
+ 'et',
285
+ 'eu',
286
+ 'fa',
287
+ 'ff',
288
+ 'fi',
289
+ 'fj',
290
+ 'fo',
291
+ 'fr',
292
+ 'fy',
293
+ 'ga',
294
+ 'gd',
295
+ 'gl',
296
+ 'gn',
297
+ 'gu',
298
+ 'gv',
299
+ 'ha',
300
+ 'he',
301
+ 'hi',
302
+ 'ho',
303
+ 'hr',
304
+ 'ht',
305
+ 'hu',
306
+ 'hy',
307
+ 'hz',
308
+ 'ia',
309
+ 'id',
310
+ 'ie',
311
+ 'ig',
312
+ 'ii',
313
+ 'ik',
314
+ 'io',
315
+ 'is',
316
+ 'it',
317
+ 'iu',
318
+ 'ja',
319
+ 'jv',
320
+ 'ka',
321
+ 'kg',
322
+ 'ki',
323
+ 'kj',
324
+ 'kk',
325
+ 'kl',
326
+ 'km',
327
+ 'kn',
328
+ 'ko',
329
+ 'kr',
330
+ 'ks',
331
+ 'ku',
332
+ 'kv',
333
+ 'kw',
334
+ 'ky',
335
+ 'la',
336
+ 'lb',
337
+ 'lg',
338
+ 'li',
339
+ 'ln',
340
+ 'lo',
341
+ 'lt',
342
+ 'lu',
343
+ 'lv',
344
+ 'mg',
345
+ 'mh',
346
+ 'mi',
347
+ 'mk',
348
+ 'ml',
349
+ 'mn',
350
+ 'mr',
351
+ 'ms',
352
+ 'mt',
353
+ 'my',
354
+ 'na',
355
+ 'nb',
356
+ 'nd',
357
+ 'ne',
358
+ 'ng',
359
+ 'nl',
360
+ 'nn',
361
+ 'no',
362
+ 'nr',
363
+ 'nv',
364
+ 'ny',
365
+ 'oc',
366
+ 'oj',
367
+ 'om',
368
+ 'or',
369
+ 'os',
370
+ 'pa',
371
+ 'pi',
372
+ 'pl',
373
+ 'ps',
374
+ 'pt',
375
+ 'qu',
376
+ 'rm',
377
+ 'rn',
378
+ 'ro',
379
+ 'ru',
380
+ 'rw',
381
+ 'sa',
382
+ 'sc',
383
+ 'sd',
384
+ 'se',
385
+ 'sg',
386
+ 'si',
387
+ 'sk',
388
+ 'sl',
389
+ 'sm',
390
+ 'sn',
391
+ 'so',
392
+ 'sq',
393
+ 'sr',
394
+ 'ss',
395
+ 'st',
396
+ 'su',
397
+ 'sv',
398
+ 'sw',
399
+ 'ta',
400
+ 'te',
401
+ 'tg',
402
+ 'th',
403
+ 'ti',
404
+ 'tk',
405
+ 'tl',
406
+ 'tn',
407
+ 'to',
408
+ 'tr',
409
+ 'ts',
410
+ 'tt',
411
+ 'tw',
412
+ 'ty',
413
+ 'ug',
414
+ 'uk',
415
+ 'ur',
416
+ 'uz',
417
+ 've',
418
+ 'vi',
419
+ 'vo',
420
+ 'wa',
421
+ 'wo',
422
+ 'xh',
423
+ 'yi',
424
+ 'yo',
425
+ 'za',
426
+ 'zh',
427
+ 'zu',
428
+ ].includes(v.toLowerCase()), { message: 'Invalid language code' });
429
+ export const countrySchema = z
430
+ .string()
431
+ .refine(v => !v ||
432
+ [
433
+ 'AD',
434
+ 'AE',
435
+ 'AF',
436
+ 'AG',
437
+ 'AI',
438
+ 'AL',
439
+ 'AM',
440
+ 'AO',
441
+ 'AQ',
442
+ 'AR',
443
+ 'AS',
444
+ 'AT',
445
+ 'AU',
446
+ 'AW',
447
+ 'AX',
448
+ 'AZ',
449
+ 'BA',
450
+ 'BB',
451
+ 'BD',
452
+ 'BE',
453
+ 'BF',
454
+ 'BG',
455
+ 'BH',
456
+ 'BI',
457
+ 'BJ',
458
+ 'BL',
459
+ 'BM',
460
+ 'BN',
461
+ 'BO',
462
+ 'BQ',
463
+ 'BR',
464
+ 'BS',
465
+ 'BT',
466
+ 'BV',
467
+ 'BW',
468
+ 'BY',
469
+ 'BZ',
470
+ 'CA',
471
+ 'CC',
472
+ 'CD',
473
+ 'CF',
474
+ 'CG',
475
+ 'CH',
476
+ 'CI',
477
+ 'CK',
478
+ 'CL',
479
+ 'CM',
480
+ 'CN',
481
+ 'CO',
482
+ 'CR',
483
+ 'CU',
484
+ 'CV',
485
+ 'CW',
486
+ 'CX',
487
+ 'CY',
488
+ 'CZ',
489
+ 'DE',
490
+ 'DJ',
491
+ 'DK',
492
+ 'DM',
493
+ 'DO',
494
+ 'DZ',
495
+ 'EC',
496
+ 'EE',
497
+ 'EG',
498
+ 'EH',
499
+ 'ER',
500
+ 'ES',
501
+ 'ET',
502
+ 'FI',
503
+ 'FJ',
504
+ 'FM',
505
+ 'FO',
506
+ 'FR',
507
+ 'GA',
508
+ 'GB',
509
+ 'GD',
510
+ 'GE',
511
+ 'GF',
512
+ 'GG',
513
+ 'GH',
514
+ 'GI',
515
+ 'GL',
516
+ 'GM',
517
+ 'GN',
518
+ 'GP',
519
+ 'GQ',
520
+ 'GR',
521
+ 'GT',
522
+ 'GU',
523
+ 'GW',
524
+ 'GY',
525
+ 'HK',
526
+ 'HM',
527
+ 'HN',
528
+ 'HR',
529
+ 'HT',
530
+ 'HU',
531
+ 'ID',
532
+ 'IE',
533
+ 'IL',
534
+ 'IM',
535
+ 'IN',
536
+ 'IO',
537
+ 'IQ',
538
+ 'IR',
539
+ 'IS',
540
+ 'IT',
541
+ 'JE',
542
+ 'JM',
543
+ 'JO',
544
+ 'JP',
545
+ 'KE',
546
+ 'KG',
547
+ 'KH',
548
+ 'KI',
549
+ 'KM',
550
+ 'KN',
551
+ 'KP',
552
+ 'KR',
553
+ 'KW',
554
+ 'KY',
555
+ 'KZ',
556
+ 'LA',
557
+ 'LB',
558
+ 'LC',
559
+ 'LI',
560
+ 'LK',
561
+ 'LR',
562
+ 'LS',
563
+ 'LT',
564
+ 'LU',
565
+ 'LV',
566
+ 'LY',
567
+ 'MA',
568
+ 'MC',
569
+ 'MD',
570
+ 'ME',
571
+ 'MF',
572
+ 'MG',
573
+ 'MH',
574
+ 'MK',
575
+ 'ML',
576
+ 'MM',
577
+ 'MN',
578
+ 'MO',
579
+ 'MP',
580
+ 'MQ',
581
+ 'MR',
582
+ 'MS',
583
+ 'MT',
584
+ 'MU',
585
+ 'MV',
586
+ 'MW',
587
+ 'MX',
588
+ 'MY',
589
+ 'MZ',
590
+ 'NA',
591
+ 'NC',
592
+ 'NE',
593
+ 'NF',
594
+ 'NG',
595
+ 'NI',
596
+ 'NL',
597
+ 'NO',
598
+ 'NP',
599
+ 'NR',
600
+ 'NU',
601
+ 'NZ',
602
+ 'OM',
603
+ 'PA',
604
+ 'PE',
605
+ 'PF',
606
+ 'PG',
607
+ 'PH',
608
+ 'PK',
609
+ 'PL',
610
+ 'PM',
611
+ 'PN',
612
+ 'PR',
613
+ 'PT',
614
+ 'PW',
615
+ 'PY',
616
+ 'QA',
617
+ 'RE',
618
+ 'RO',
619
+ 'RS',
620
+ 'RU',
621
+ 'RW',
622
+ 'SA',
623
+ 'SB',
624
+ 'SC',
625
+ 'SD',
626
+ 'SE',
627
+ 'SG',
628
+ 'SH',
629
+ 'SI',
630
+ 'SJ',
631
+ 'SK',
632
+ 'SL',
633
+ 'SM',
634
+ 'SN',
635
+ 'SO',
636
+ 'SR',
637
+ 'SS',
638
+ 'ST',
639
+ 'SV',
640
+ 'SX',
641
+ 'SY',
642
+ 'SZ',
643
+ 'TC',
644
+ 'TD',
645
+ 'TF',
646
+ 'TG',
647
+ 'TH',
648
+ 'TJ',
649
+ 'TK',
650
+ 'TL',
651
+ 'TM',
652
+ 'TN',
653
+ 'TO',
654
+ 'TR',
655
+ 'TT',
656
+ 'TV',
657
+ 'TZ',
658
+ 'UA',
659
+ 'UG',
660
+ 'UM',
661
+ 'US',
662
+ 'UY',
663
+ 'UZ',
664
+ 'VA',
665
+ 'VC',
666
+ 'VE',
667
+ 'VG',
668
+ 'VI',
669
+ 'VN',
670
+ 'VU',
671
+ 'WF',
672
+ 'WS',
673
+ 'YE',
674
+ 'YT',
675
+ 'ZA',
676
+ 'ZM',
677
+ 'ZW',
678
+ ].includes(v.toUpperCase()), { message: 'Invalid country code' });
172
679
  export const priceSchema = ({ min = 0, max = 1000000 } = {}) => z.string().superRefine((v, ctx) => {
173
680
  if (!v) {
174
681
  return true;
@@ -219,21 +726,6 @@ export const salePriceSchema = ({ min = 0, max = 1000000, price = '' } = {}) =>
219
726
  });
220
727
  }
221
728
  });
222
- const ee = ['A+++', 'A++', 'A+', 'A', 'B', 'C', 'D', 'E', 'F', 'G',];
223
- /**
224
- * Check if minEfficiency is less or equal to maxEfficiency
225
- * @param minEfficiency
226
- * @param maxEfficiency
227
- * @returns
228
- */
229
- const compareEfficiency = (minEfficiency, maxEfficiency) => {
230
- const minIndex = ee.findIndex(e => e === minEfficiency);
231
- const maxIndex = ee.findIndex(e => e === maxEfficiency);
232
- if (minIndex === -1 || maxIndex === -1) {
233
- return false;
234
- }
235
- return minIndex >= maxIndex;
236
- };
237
729
  export const energyEfficiencyClassSchema = ({ minEfficiency = '', maxEfficiency } = {}) => {
238
730
  return z.string().superRefine((v, ctx) => {
239
731
  if (!v) {
@@ -342,7 +834,7 @@ export const maxEnergyEfficiencyClassSchema = ({ efficiency = '', minEfficiency
342
834
  return true;
343
835
  });
344
836
  };
345
- export const gtinSchema = z.string().refine((gtin) => {
837
+ export const gtinSchema = z.string().refine(gtin => {
346
838
  if (!gtin) {
347
839
  return true;
348
840
  }
@@ -368,14 +860,10 @@ export const requiredIfOtherPresentSchema = (other, errorMessage) => z.string().
368
860
  });
369
861
  }
370
862
  });
371
- export function splitByCommaAndTrim(str) {
372
- return typeof str === 'string'
373
- ? str
374
- .split(',')
375
- .map(s => s.trim())
376
- .filter(Boolean)
377
- : [];
378
- }
863
+ export const oneOfSchema = (values) => z.string().refine(v => values.map(v => v.value).includes(v), {
864
+ message: `Invalid value. Valid values are: ${values.map(v => v.label).join(', ')}`,
865
+ });
866
+ export const oneOfOptionalSchema = (values) => z.string().refine(v => !v || oneOfSchema(values).parse(v));
379
867
  export function parsePriceString({ price, min = 0, max = 1000000 }) {
380
868
  const match = priceRegex.exec(price);
381
869
  if (!match) {
@@ -391,42 +879,49 @@ export function parsePriceString({ price, min = 0, max = 1000000 }) {
391
879
  }
392
880
  return { value: match.groups?.value, currency: match.groups?.currency };
393
881
  }
882
+ export const unitMeasureRegex = /^(?<quantity>[\d.,]+)\s*(?<units>\w+)$/;
883
+ export const priceRegex = /^(?<value>\d+(?:\.\d{1,2})?)\s*(?<currency>\w+)$/;
884
+ export const hasMacro = (v) => /{{[^}]+}}/.test(v.replaceAll(/{{source\..+?}}/g, ''));
885
+ export const removeMacro = (v) => v.replaceAll(/{{.+?}}/g, '');
394
886
  export const dimensionRegex = /^(?<value>[\d.,]+)\s*(?<unit>\w+)$/;
395
- export function parseDimensionString({ dimension, min = 0, max = 1000000 }) {
396
- const match = dimensionRegex.exec(dimension);
397
- if (!match) {
398
- throw new Error('Invalid format');
399
- }
400
- else if (!Number.isFinite(Number(match.groups?.value)) ||
401
- Number(match.groups?.value) < min ||
402
- Number(match.groups?.value) > max) {
403
- throw new Error(`Value should be between ${min} and ${max}`);
887
+ export const ee = ['A+++', 'A++', 'A+', 'A', 'B', 'C', 'D', 'E', 'F', 'G'];
888
+ /**
889
+ * Check if minEfficiency is less or equal to maxEfficiency
890
+ * @param minEfficiency
891
+ * @param maxEfficiency
892
+ * @returns
893
+ */
894
+ export const compareEfficiency = (minEfficiency, maxEfficiency) => {
895
+ const minIndex = ee.findIndex(e => e === minEfficiency);
896
+ const maxIndex = ee.findIndex(e => e === maxEfficiency);
897
+ if (minIndex === -1 || maxIndex === -1) {
898
+ return false;
404
899
  }
405
- return { value: match.groups?.value, unit: match.groups?.unit };
406
- }
407
- export function convertToBoolean(value) {
408
- if (value === 'true') {
409
- return true;
900
+ return minIndex >= maxIndex;
901
+ };
902
+ export function validate(value, validator, skipEmpty = true) {
903
+ let valueToValidate = value;
904
+ if (typeof value === 'string') {
905
+ valueToValidate = removeMacro(value);
410
906
  }
411
- if (value === 'false') {
412
- return false;
907
+ if (!value && skipEmpty) {
908
+ return { success: true, data: value };
413
909
  }
414
- throw new Error('Invalid boolean value');
415
- }
416
- export function castToArray(value) {
417
- return Array.isArray(value) ? value : [value];
418
- }
419
- export function castToInt(value) {
420
- return typeof value === 'string' ? parseInt(value, 10) : value;
910
+ return validator.safeParse(valueToValidate);
421
911
  }
422
- export function getSourceValueSeparator(source = '') {
423
- switch (source) {
424
- case SOURCE_GOOGLE_PRODUCT_HIGHLIGHT:
425
- return '|';
426
- case SOURCE_FB_CATEGORY:
427
- return ':';
428
- default:
429
- return ',';
912
+ export function validateIfNoMacro(value, validator) {
913
+ if (typeof value === 'string' && hasMacro(value)) {
914
+ return { success: true, data: value };
915
+ }
916
+ if (Array.isArray(validator)) {
917
+ for (const v of validator) {
918
+ const result = v.safeParse(resolveSourceMacro(value));
919
+ if (!result.success) {
920
+ return result;
921
+ }
922
+ }
923
+ return { success: true, data: value };
430
924
  }
925
+ return validator.safeParse(resolveSourceMacro(value));
431
926
  }
432
- //# sourceMappingURL=index.js.map
927
+ //# sourceMappingURL=common-schemas.js.map