@remnawave/subscription-page-types 0.1.2 → 0.1.4

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 (21) hide show
  1. package/build/backend/constants/index.d.ts +1 -0
  2. package/build/backend/constants/index.d.ts.map +1 -1
  3. package/build/backend/constants/index.js +1 -0
  4. package/build/backend/constants/language-codes.constant.d.ts +770 -0
  5. package/build/backend/constants/language-codes.constant.d.ts.map +1 -0
  6. package/build/backend/constants/language-codes.constant.js +242 -0
  7. package/build/backend/constants/subscription-page-config/subscription-page-config.contants.d.ts +2 -2
  8. package/build/backend/constants/subscription-page-config/subscription-page-config.contants.d.ts.map +1 -1
  9. package/build/backend/constants/subscription-page-config/subscription-page-config.contants.js +3 -2
  10. package/build/backend/models/subscription-page-config/subscription-page-config.schema.d.ts +363 -1166
  11. package/build/backend/models/subscription-page-config/subscription-page-config.schema.d.ts.map +1 -1
  12. package/build/backend/models/subscription-page-config/subscription-page-config.schema.js +27 -8
  13. package/build/backend/models/subscription-page-config/subscription-page-config.validator.d.ts +19 -3
  14. package/build/backend/models/subscription-page-config/subscription-page-config.validator.d.ts.map +1 -1
  15. package/build/backend/models/subscription-page-config/subscription-page-config.validator.js +64 -25
  16. package/build/frontend/constants/index.js +1 -0
  17. package/build/frontend/constants/language-codes.constant.js +239 -0
  18. package/build/frontend/constants/subscription-page-config/subscription-page-config.contants.js +3 -2
  19. package/build/frontend/models/subscription-page-config/subscription-page-config.schema.js +27 -8
  20. package/build/frontend/models/subscription-page-config/subscription-page-config.validator.js +64 -25
  21. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-page-config.schema.d.ts","sourceRoot":"","sources":["../../../../models/subscription-page-config/subscription-page-config.schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscription-page-config.schema.d.ts","sourceRoot":"","sources":["../../../../models/subscription-page-config/subscription-page-config.schema.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,10 @@ exports.SubscriptionPageRawConfigSchema = exports.LocalizedTextSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const constants_1 = require("../../constants");
6
6
  const subscription_page_config_validator_1 = require("./subscription-page-config.validator");
7
- exports.LocalizedTextSchema = zod_1.z.object({
8
- en: zod_1.z.string(),
9
- ru: zod_1.z.string().optional(),
10
- zh: zod_1.z.string().optional(),
11
- fa: zod_1.z.string().optional(),
12
- fr: zod_1.z.string().optional(),
7
+ exports.LocalizedTextSchema = zod_1.z
8
+ .record(zod_1.z.enum(constants_1.LANGUAGE_CODES), zod_1.z.string())
9
+ .refine((obj) => Object.keys(obj).length > 0, {
10
+ message: 'At least one language must be specified',
13
11
  });
14
12
  const SvgLibrarySchema = zod_1.z.record(zod_1.z.string().regex(/^[A-Za-z]+$/, { message: 'Only latin characters, no spaces allowed' }), zod_1.z.string());
15
13
  const ButtonSchema = zod_1.z.object({
@@ -46,6 +44,7 @@ const BlockSchema = zod_1.z.object({
46
44
  });
47
45
  const PlatformAppSchema = zod_1.z.object({
48
46
  name: zod_1.z.string(),
47
+ svgIconKey: zod_1.z.optional(zod_1.z.string()),
49
48
  featured: zod_1.z.boolean(),
50
49
  blocks: zod_1.z.array(BlockSchema),
51
50
  });
@@ -73,16 +72,36 @@ const UiConfigSchema = zod_1.z.object({
73
72
  headerText: exports.LocalizedTextSchema,
74
73
  }),
75
74
  });
75
+ const SubscriptionPageTranslateKeysSchema = zod_1.z.object({
76
+ linkCopied: exports.LocalizedTextSchema,
77
+ linkCopiedToClipboard: exports.LocalizedTextSchema,
78
+ getLink: exports.LocalizedTextSchema,
79
+ scanQrCode: exports.LocalizedTextSchema,
80
+ scanQrCodeDescription: exports.LocalizedTextSchema,
81
+ copyLink: exports.LocalizedTextSchema,
82
+ name: exports.LocalizedTextSchema,
83
+ status: exports.LocalizedTextSchema,
84
+ active: exports.LocalizedTextSchema,
85
+ inactive: exports.LocalizedTextSchema,
86
+ expires: exports.LocalizedTextSchema,
87
+ bandwidth: exports.LocalizedTextSchema,
88
+ scanToImport: exports.LocalizedTextSchema,
89
+ expiresIn: exports.LocalizedTextSchema,
90
+ expired: exports.LocalizedTextSchema,
91
+ unknown: exports.LocalizedTextSchema,
92
+ indefinitely: exports.LocalizedTextSchema,
93
+ });
76
94
  exports.SubscriptionPageRawConfigSchema = zod_1.z
77
95
  .object({
78
96
  version: zod_1.z.nativeEnum(constants_1.SUBSCRIPTION_PAGE_CONFIG_VERSION),
79
- additionalLocales: zod_1.z.array(zod_1.z.enum(constants_1.SUBSCRIPTION_PAGE_CONFIG_ADDITIONAL_LOCALES)),
97
+ locales: zod_1.z.array(zod_1.z.enum(constants_1.LANGUAGE_CODES)).min(1, 'At least one locale must be specified'),
80
98
  brandingSettings: BrandingSettingsSchema,
81
99
  uiConfig: UiConfigSchema,
100
+ baseTranslations: SubscriptionPageTranslateKeysSchema,
82
101
  svgLibrary: SvgLibrarySchema,
83
102
  platforms: zod_1.z.record(zod_1.z.nativeEnum(constants_1.SUBSCRIPTION_PAGE_CONFIG_PLATFORM_TYPES), PlatformSchema),
84
103
  })
85
104
  .superRefine((data, ctx) => {
86
- (0, subscription_page_config_validator_1.validateLocalizedTexts)(data.platforms, data.additionalLocales, 'platforms', ctx);
105
+ (0, subscription_page_config_validator_1.validateLocalizedTexts)(data, data.locales, ctx);
87
106
  (0, subscription_page_config_validator_1.validateSvgReferences)(data, ctx);
88
107
  });
@@ -1,9 +1,25 @@
1
1
  import { z } from 'zod';
2
- import { TSubscriptionPageConfigAdditionalLocales } from '../../constants';
3
- export declare const validateLocalizedTexts: (obj: unknown, requiredLocales: TSubscriptionPageConfigAdditionalLocales[], path: string, ctx: z.RefinementCtx) => void;
2
+ import { TLanguageCode } from '../../constants';
3
+ /**
4
+ * Валидирует что все обязательные локали присутствуют в LocalizedText полях
5
+ */
6
+ export declare const validateLocalizedTexts: (data: {
7
+ locales: TLanguageCode[];
8
+ platforms: Record<string, unknown>;
9
+ uiConfig: unknown;
10
+ }, requiredLocales: TLanguageCode[], ctx: z.RefinementCtx) => void;
11
+ /**
12
+ * Валидирует что все svgIconKey ссылаются на существующие ключи в svgLibrary
13
+ */
4
14
  export declare const validateSvgReferences: (data: {
5
15
  svgLibrary: Record<string, string>;
6
16
  platforms: Record<string, unknown>;
7
17
  }, ctx: z.RefinementCtx) => void;
8
- export declare const cleanLocalizedTexts: <T>(obj: T, activeLocales: TSubscriptionPageConfigAdditionalLocales[]) => T;
18
+ /**
19
+ * Очищает LocalizedText поля:
20
+ * - Оставляет только указанные локали
21
+ * - Делает trim() всем строкам
22
+ * - Удаляет пустые значения
23
+ */
24
+ export declare const cleanLocalizedTexts: <T>(obj: T, activeLocales: TLanguageCode[]) => T;
9
25
  //# sourceMappingURL=subscription-page-config.validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-page-config.validator.d.ts","sourceRoot":"","sources":["../../../../models/subscription-page-config/subscription-page-config.validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,wCAAwC,EAAE,MAAM,iBAAiB,CAAC;AAG3E,eAAO,MAAM,sBAAsB,GAC/B,KAAK,OAAO,EACZ,iBAAiB,wCAAwC,EAAE,EAC3D,MAAM,MAAM,EACZ,KAAK,CAAC,CAAC,aAAa,KACrB,IA0BF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAC9B,MAAM;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAChF,KAAK,CAAC,CAAC,aAAa,KACrB,IAwBF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,CAAC,EACjC,KAAK,CAAC,EACN,eAAe,wCAAwC,EAAE,KAC1D,CA2BF,CAAC"}
1
+ {"version":3,"file":"subscription-page-config.validator.d.ts","sourceRoot":"","sources":["../../../../models/subscription-page-config/subscription-page-config.validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAkB,MAAM,iBAAiB,CAAC;AAoBhE;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAC/B,MAAM;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EACzF,iBAAiB,aAAa,EAAE,EAChC,KAAK,CAAC,CAAC,aAAa,KACrB,IAoCF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAC9B,MAAM;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAChF,KAAK,CAAC,CAAC,aAAa,KACrB,IA2BF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,KAAK,CAAC,EAAE,eAAe,aAAa,EAAE,KAAG,CA2B/E,CAAC"}
@@ -2,34 +2,64 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cleanLocalizedTexts = exports.validateSvgReferences = exports.validateLocalizedTexts = void 0;
4
4
  const zod_1 = require("zod");
5
- const validateLocalizedTexts = (obj, requiredLocales, path, ctx) => {
6
- if (obj === null || typeof obj !== 'object')
7
- return;
8
- if ('en' in obj && typeof obj.en === 'string') {
9
- for (const locale of requiredLocales) {
10
- const value = obj[locale];
11
- if (!value || value.trim() === '') {
12
- ctx.addIssue({
13
- code: zod_1.z.ZodIssueCode.custom,
14
- message: `Missing required locale '${locale}' at ${path}`,
15
- path: [path, locale],
16
- });
5
+ const constants_1 = require("../../constants");
6
+ /**
7
+ * Проверяет что LocalizedText объект является таковым
8
+ * LocalizedText - это объект где ключи это языковые коды, а значения - строки
9
+ */
10
+ const isLocalizedText = (obj) => {
11
+ if (obj === null || typeof obj !== 'object' || Array.isArray(obj))
12
+ return false;
13
+ const entries = Object.entries(obj);
14
+ if (entries.length === 0)
15
+ return false;
16
+ // Проверяем что все значения - строки (характерно для LocalizedText)
17
+ // и что хотя бы один ключ выглядит как языковой код (2 символа)
18
+ const hasStringValues = entries.every(([, value]) => typeof value === 'string');
19
+ const hasLanguageCodeKey = entries.some(([key]) => key.length === 2);
20
+ return hasStringValues && hasLanguageCodeKey;
21
+ };
22
+ /**
23
+ * Валидирует что все обязательные локали присутствуют в LocalizedText полях
24
+ */
25
+ const validateLocalizedTexts = (data, requiredLocales, ctx) => {
26
+ const checkLocalizedText = (obj, path) => {
27
+ if (obj === null || typeof obj !== 'object')
28
+ return;
29
+ if (isLocalizedText(obj)) {
30
+ for (const locale of requiredLocales) {
31
+ const value = obj[locale];
32
+ if (!value || value.trim() === '') {
33
+ ctx.addIssue({
34
+ code: zod_1.z.ZodIssueCode.custom,
35
+ message: `Missing required locale '${locale}' at ${path}`,
36
+ path: [path, locale],
37
+ });
38
+ }
17
39
  }
40
+ return;
18
41
  }
19
- return;
20
- }
21
- for (const [key, value] of Object.entries(obj)) {
22
- if (Array.isArray(value)) {
23
- value.forEach((item, index) => {
24
- (0, exports.validateLocalizedTexts)(item, requiredLocales, `${path}.${key}[${index}]`, ctx);
42
+ if (Array.isArray(obj)) {
43
+ obj.forEach((item, index) => {
44
+ checkLocalizedText(item, `${path}[${index}]`);
25
45
  });
46
+ return;
26
47
  }
27
- else if (typeof value === 'object' && value !== null) {
28
- (0, exports.validateLocalizedTexts)(value, requiredLocales, `${path}.${key}`, ctx);
48
+ for (const [key, value] of Object.entries(obj)) {
49
+ if (typeof value === 'object' && value !== null) {
50
+ checkLocalizedText(value, `${path}.${key}`);
51
+ }
29
52
  }
30
- }
53
+ };
54
+ // Проверяем platforms
55
+ checkLocalizedText(data.platforms, 'platforms');
56
+ // Проверяем uiConfig
57
+ checkLocalizedText(data.uiConfig, 'uiConfig');
31
58
  };
32
59
  exports.validateLocalizedTexts = validateLocalizedTexts;
60
+ /**
61
+ * Валидирует что все svgIconKey ссылаются на существующие ключи в svgLibrary
62
+ */
33
63
  const validateSvgReferences = (data, ctx) => {
34
64
  const validKeys = new Set(Object.keys(data.svgLibrary));
35
65
  const checkSvgRef = (obj, path) => {
@@ -37,6 +67,9 @@ const validateSvgReferences = (data, ctx) => {
37
67
  return;
38
68
  for (const [key, value] of Object.entries(obj)) {
39
69
  if (key === 'svgIconKey' && typeof value === 'string') {
70
+ // Пустая строка = нет иконки (для опциональных полей)
71
+ if (value === '')
72
+ continue;
40
73
  if (!validKeys.has(value)) {
41
74
  ctx.addIssue({
42
75
  code: zod_1.z.ZodIssueCode.custom,
@@ -56,16 +89,22 @@ const validateSvgReferences = (data, ctx) => {
56
89
  checkSvgRef(data.platforms, 'platforms');
57
90
  };
58
91
  exports.validateSvgReferences = validateSvgReferences;
92
+ /**
93
+ * Очищает LocalizedText поля:
94
+ * - Оставляет только указанные локали
95
+ * - Делает trim() всем строкам
96
+ * - Удаляет пустые значения
97
+ */
59
98
  const cleanLocalizedTexts = (obj, activeLocales) => {
60
99
  if (obj === null || typeof obj !== 'object')
61
100
  return obj;
62
- if ('en' in obj && typeof obj.en === 'string') {
63
- const allowedKeys = new Set(['en', ...activeLocales]);
101
+ if (isLocalizedText(obj)) {
102
+ const allowedKeys = new Set(activeLocales);
64
103
  const cleaned = {};
65
104
  for (const [key, value] of Object.entries(obj)) {
66
- if (typeof value === 'string' && allowedKeys.has(key)) {
105
+ if (typeof value === 'string' && (0, constants_1.isLanguageCode)(key) && allowedKeys.has(key)) {
67
106
  const trimmed = value.trim();
68
- if (trimmed || key === 'en') {
107
+ if (trimmed) {
69
108
  cleaned[key] = trimmed;
70
109
  }
71
110
  }
@@ -17,5 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./app-config.constant"), exports);
18
18
  __exportStar(require("./button-types.constant"), exports);
19
19
  __exportStar(require("./installation-guide-blocks.constant"), exports);
20
+ __exportStar(require("./language-codes.constant"), exports);
20
21
  __exportStar(require("./subscription-info-blocks.constant"), exports);
21
22
  __exportStar(require("./subscription-page-config"), exports);
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLanguagesArray = exports.isLanguageCode = exports.getLanguageNativeName = exports.getLanguageName = exports.getLanguageInfo = exports.LANGUAGE_CODES = void 0;
4
+ const LANGUAGES_LIST = {
5
+ aa: { name: 'Afar', nativeName: 'Afaraf' },
6
+ ab: { name: 'Abkhaz', nativeName: 'аҧсуа бызшәа' },
7
+ ae: { name: 'Avestan', nativeName: 'avesta' },
8
+ af: { name: 'Afrikaans', nativeName: 'Afrikaans' },
9
+ ak: { name: 'Akan', nativeName: 'Akan' },
10
+ am: { name: 'Amharic', nativeName: 'አማርኛ' },
11
+ an: { name: 'Aragonese', nativeName: 'aragonés' },
12
+ ar: { name: 'Arabic', nativeName: 'العربية' },
13
+ as: { name: 'Assamese', nativeName: 'অসমীয়া' },
14
+ av: { name: 'Avaric', nativeName: 'авар мацӀ' },
15
+ ay: { name: 'Aymara', nativeName: 'aymar aru' },
16
+ az: { name: 'Azerbaijani', nativeName: 'azərbaycan dili' },
17
+ ba: { name: 'Bashkir', nativeName: 'башҡорт теле' },
18
+ be: { name: 'Belarusian', nativeName: 'беларуская мова' },
19
+ bg: { name: 'Bulgarian', nativeName: 'български език' },
20
+ bi: { name: 'Bislama', nativeName: 'Bislama' },
21
+ bm: { name: 'Bambara', nativeName: 'bamanankan' },
22
+ bn: { name: 'Bengali', nativeName: 'বাংলা' },
23
+ bo: { name: 'Tibetan', nativeName: 'བོད་ཡིག' },
24
+ br: { name: 'Breton', nativeName: 'brezhoneg' },
25
+ bs: { name: 'Bosnian', nativeName: 'bosanski jezik' },
26
+ ca: { name: 'Catalan', nativeName: 'Català' },
27
+ ce: { name: 'Chechen', nativeName: 'нохчийн мотт' },
28
+ ch: { name: 'Chamorro', nativeName: 'Chamoru' },
29
+ co: { name: 'Corsican', nativeName: 'corsu' },
30
+ cr: { name: 'Cree', nativeName: 'ᓀᐦᐃᔭᐍᐏᐣ' },
31
+ cs: { name: 'Czech', nativeName: 'Čeština' },
32
+ cu: { name: 'Old Church Slavonic', nativeName: 'ѩзыкъ словѣньскъ' },
33
+ cv: { name: 'Chuvash', nativeName: 'чӑваш чӗлхи' },
34
+ cy: { name: 'Welsh', nativeName: 'Cymraeg' },
35
+ da: { name: 'Danish', nativeName: 'Dansk' },
36
+ de: { name: 'German', nativeName: 'Deutsch' },
37
+ dv: { name: 'Divehi', nativeName: 'ދިވެހި' },
38
+ dz: { name: 'Dzongkha', nativeName: 'རྫོང་ཁ' },
39
+ ee: { name: 'Ewe', nativeName: 'Eʋegbe' },
40
+ el: { name: 'Greek', nativeName: 'Ελληνικά' },
41
+ en: { name: 'English', nativeName: 'English' },
42
+ eo: { name: 'Esperanto', nativeName: 'Esperanto' },
43
+ es: { name: 'Spanish', nativeName: 'Español' },
44
+ et: { name: 'Estonian', nativeName: 'eesti' },
45
+ eu: { name: 'Basque', nativeName: 'euskara' },
46
+ fa: { name: 'Persian', nativeName: 'فارسی' },
47
+ ff: { name: 'Fula', nativeName: 'Fulfulde' },
48
+ fi: { name: 'Finnish', nativeName: 'suomi' },
49
+ fj: { name: 'Fijian', nativeName: 'vosa Vakaviti' },
50
+ fo: { name: 'Faroese', nativeName: 'Føroyskt' },
51
+ fr: { name: 'French', nativeName: 'Français' },
52
+ fy: { name: 'Western Frisian', nativeName: 'Frysk' },
53
+ ga: { name: 'Irish', nativeName: 'Gaeilge' },
54
+ gd: { name: 'Scottish Gaelic', nativeName: 'Gàidhlig' },
55
+ gl: { name: 'Galician', nativeName: 'galego' },
56
+ gn: { name: 'Guaraní', nativeName: "Avañe'ẽ" },
57
+ gu: { name: 'Gujarati', nativeName: 'ગુજરાતી' },
58
+ gv: { name: 'Manx', nativeName: 'Gaelg' },
59
+ ha: { name: 'Hausa', nativeName: 'هَوُسَ' },
60
+ he: { name: 'Hebrew', nativeName: 'עברית' },
61
+ hi: { name: 'Hindi', nativeName: 'हिन्दी' },
62
+ ho: { name: 'Hiri Motu', nativeName: 'Hiri Motu' },
63
+ hr: { name: 'Croatian', nativeName: 'Hrvatski' },
64
+ ht: { name: 'Haitian', nativeName: 'Kreyòl ayisyen' },
65
+ hu: { name: 'Hungarian', nativeName: 'magyar' },
66
+ hy: { name: 'Armenian', nativeName: 'Հdelays' },
67
+ hz: { name: 'Herero', nativeName: 'Otjiherero' },
68
+ ia: { name: 'Interlingua', nativeName: 'Interlingua' },
69
+ id: { name: 'Indonesian', nativeName: 'Bahasa Indonesia' },
70
+ ie: { name: 'Interlingue', nativeName: 'Interlingue' },
71
+ ig: { name: 'Igbo', nativeName: 'Asụsụ Igbo' },
72
+ ii: { name: 'Nuosu', nativeName: 'ꆈꌠ꒿ Nuosuhxop' },
73
+ ik: { name: 'Inupiaq', nativeName: 'Iñupiaq' },
74
+ io: { name: 'Ido', nativeName: 'Ido' },
75
+ is: { name: 'Icelandic', nativeName: 'Íslenska' },
76
+ it: { name: 'Italian', nativeName: 'Italiano' },
77
+ iu: { name: 'Inuktitut', nativeName: 'ᐃᓄᒃᑎᑐᑦ' },
78
+ ja: { name: 'Japanese', nativeName: '日本語' },
79
+ jv: { name: 'Javanese', nativeName: 'basa Jawa' },
80
+ ka: { name: 'Georgian', nativeName: 'ქართული' },
81
+ kg: { name: 'Kongo', nativeName: 'Kikongo' },
82
+ ki: { name: 'Kikuyu', nativeName: 'Gĩkũyũ' },
83
+ kj: { name: 'Kwanyama', nativeName: 'Kuanyama' },
84
+ kk: { name: 'Kazakh', nativeName: 'қазақ тілі' },
85
+ kl: { name: 'Kalaallisut', nativeName: 'kalaallisut' },
86
+ km: { name: 'Khmer', nativeName: 'ខេមរភាសា' },
87
+ kn: { name: 'Kannada', nativeName: 'ಕನ್ನಡ' },
88
+ ko: { name: 'Korean', nativeName: '한국어' },
89
+ kr: { name: 'Kanuri', nativeName: 'Kanuri' },
90
+ ks: { name: 'Kashmiri', nativeName: 'कश्मीरी' },
91
+ ku: { name: 'Kurdish', nativeName: 'Kurdî' },
92
+ kv: { name: 'Komi', nativeName: 'коми кыв' },
93
+ kw: { name: 'Cornish', nativeName: 'Kernewek' },
94
+ ky: { name: 'Kyrgyz', nativeName: 'Кыргызча' },
95
+ la: { name: 'Latin', nativeName: 'latine' },
96
+ lb: { name: 'Luxembourgish', nativeName: 'Lëtzebuergesch' },
97
+ lg: { name: 'Ganda', nativeName: 'Luganda' },
98
+ li: { name: 'Limburgish', nativeName: 'Limburgs' },
99
+ ln: { name: 'Lingala', nativeName: 'Lingála' },
100
+ lo: { name: 'Lao', nativeName: 'ພາສາລາວ' },
101
+ lt: { name: 'Lithuanian', nativeName: 'lietuvių kalba' },
102
+ lu: { name: 'Luba-Katanga', nativeName: 'Kiluba' },
103
+ lv: { name: 'Latvian', nativeName: 'latviešu valoda' },
104
+ mg: { name: 'Malagasy', nativeName: 'fiteny malagasy' },
105
+ mh: { name: 'Marshallese', nativeName: 'Kajin M̧ajeļ' },
106
+ mi: { name: 'Māori', nativeName: 'te reo Māori' },
107
+ mk: { name: 'Macedonian', nativeName: 'македонски јазик' },
108
+ ml: { name: 'Malayalam', nativeName: 'മലയാളം' },
109
+ mn: { name: 'Mongolian', nativeName: 'Монгол хэл' },
110
+ mr: { name: 'Marathi', nativeName: 'मराठी' },
111
+ ms: { name: 'Malay', nativeName: 'Bahasa Melayu' },
112
+ mt: { name: 'Maltese', nativeName: 'Malti' },
113
+ my: { name: 'Burmese', nativeName: 'ဗမာစာ' },
114
+ na: { name: 'Nauru', nativeName: 'Dorerin Naoero' },
115
+ nb: { name: 'Norwegian Bokmål', nativeName: 'Norsk bokmål' },
116
+ nd: { name: 'Northern Ndebele', nativeName: 'isiNdebele' },
117
+ ne: { name: 'Nepali', nativeName: 'नेपाली' },
118
+ ng: { name: 'Ndonga', nativeName: 'Owambo' },
119
+ nl: { name: 'Dutch', nativeName: 'Nederlands' },
120
+ nn: { name: 'Norwegian Nynorsk', nativeName: 'Norsk nynorsk' },
121
+ no: { name: 'Norwegian', nativeName: 'Norsk' },
122
+ nr: { name: 'Southern Ndebele', nativeName: 'isiNdebele' },
123
+ nv: { name: 'Navajo', nativeName: 'Diné bizaad' },
124
+ ny: { name: 'Chichewa', nativeName: 'chiCheŵa' },
125
+ oc: { name: 'Occitan', nativeName: 'occitan' },
126
+ oj: { name: 'Ojibwe', nativeName: 'ᐊᓂᔑᓈᐯᒧᐎᓐ' },
127
+ om: { name: 'Oromo', nativeName: 'Afaan Oromoo' },
128
+ or: { name: 'Oriya', nativeName: 'ଓଡ଼ିଆ' },
129
+ os: { name: 'Ossetian', nativeName: 'ирон æвзаг' },
130
+ pa: { name: 'Panjabi', nativeName: 'ਪੰਜਾਬੀ' },
131
+ pi: { name: 'Pāli', nativeName: 'पाऴि' },
132
+ pl: { name: 'Polish', nativeName: 'Polski' },
133
+ ps: { name: 'Pashto', nativeName: 'پښتو' },
134
+ pt: { name: 'Portuguese', nativeName: 'Português' },
135
+ qu: { name: 'Quechua', nativeName: 'Runa Simi' },
136
+ rm: { name: 'Romansh', nativeName: 'rumantsch grischun' },
137
+ rn: { name: 'Kirundi', nativeName: 'Ikirundi' },
138
+ ro: { name: 'Romanian', nativeName: 'Română' },
139
+ ru: { name: 'Russian', nativeName: 'Русский' },
140
+ rw: { name: 'Kinyarwanda', nativeName: 'Ikinyarwanda' },
141
+ sa: { name: 'Sanskrit', nativeName: 'संस्कृतम्' },
142
+ sc: { name: 'Sardinian', nativeName: 'sardu' },
143
+ sd: { name: 'Sindhi', nativeName: 'सिन्धी' },
144
+ se: { name: 'Northern Sami', nativeName: 'Davvisámegiella' },
145
+ sg: { name: 'Sango', nativeName: 'yângâ tî sängö' },
146
+ si: { name: 'Sinhala', nativeName: 'සිංහල' },
147
+ sk: { name: 'Slovak', nativeName: 'Slovenčina' },
148
+ sl: { name: 'Slovenian', nativeName: 'slovenščina' },
149
+ sm: { name: 'Samoan', nativeName: "gagana fa'a Samoa" },
150
+ sn: { name: 'Shona', nativeName: 'chiShona' },
151
+ so: { name: 'Somali', nativeName: 'Soomaaliga' },
152
+ sq: { name: 'Albanian', nativeName: 'Shqip' },
153
+ sr: { name: 'Serbian', nativeName: 'српски језик' },
154
+ ss: { name: 'Swati', nativeName: 'SiSwati' },
155
+ st: { name: 'Southern Sotho', nativeName: 'Sesotho' },
156
+ su: { name: 'Sundanese', nativeName: 'Basa Sunda' },
157
+ sv: { name: 'Swedish', nativeName: 'Svenska' },
158
+ sw: { name: 'Swahili', nativeName: 'Kiswahili' },
159
+ ta: { name: 'Tamil', nativeName: 'தமிழ்' },
160
+ te: { name: 'Telugu', nativeName: 'తెలుగు' },
161
+ tg: { name: 'Tajik', nativeName: 'тоҷикӣ' },
162
+ th: { name: 'Thai', nativeName: 'ไทย' },
163
+ ti: { name: 'Tigrinya', nativeName: 'ትግርኛ' },
164
+ tk: { name: 'Turkmen', nativeName: 'Türkmençe' },
165
+ tl: { name: 'Tagalog', nativeName: 'Wikang Tagalog' },
166
+ tn: { name: 'Tswana', nativeName: 'Setswana' },
167
+ to: { name: 'Tonga', nativeName: 'faka Tonga' },
168
+ tr: { name: 'Turkish', nativeName: 'Türkçe' },
169
+ ts: { name: 'Tsonga', nativeName: 'Xitsonga' },
170
+ tt: { name: 'Tatar', nativeName: 'татар теле' },
171
+ tw: { name: 'Twi', nativeName: 'Twi' },
172
+ ty: { name: 'Tahitian', nativeName: 'Reo Tahiti' },
173
+ ug: { name: 'Uyghur', nativeName: 'ئۇيغۇرچە' },
174
+ uk: { name: 'Ukrainian', nativeName: 'Українська' },
175
+ ur: { name: 'Urdu', nativeName: 'اردو' },
176
+ uz: { name: 'Uzbek', nativeName: 'Ўзбек' },
177
+ ve: { name: 'Venda', nativeName: 'Tshivenḓa' },
178
+ vi: { name: 'Vietnamese', nativeName: 'Tiếng Việt' },
179
+ vo: { name: 'Volapük', nativeName: 'Volapük' },
180
+ wa: { name: 'Walloon', nativeName: 'walon' },
181
+ wo: { name: 'Wolof', nativeName: 'Wollof' },
182
+ xh: { name: 'Xhosa', nativeName: 'isiXhosa' },
183
+ yi: { name: 'Yiddish', nativeName: 'ייִדיש' },
184
+ yo: { name: 'Yoruba', nativeName: 'Yorùbá' },
185
+ za: { name: 'Zhuang', nativeName: 'Saɯ cueŋƅ' },
186
+ zh: { name: 'Chinese', nativeName: '中文' },
187
+ zu: { name: 'Zulu', nativeName: 'isiZulu' },
188
+ };
189
+ exports.LANGUAGE_CODES = Object.keys(LANGUAGES_LIST);
190
+ /**
191
+ * Get language info by code
192
+ * @param code - ISO 639-1 language code
193
+ * @returns Language info object with name and nativeName
194
+ */
195
+ const getLanguageInfo = (code) => {
196
+ if ((0, exports.isLanguageCode)(code)) {
197
+ return LANGUAGES_LIST[code];
198
+ }
199
+ return null;
200
+ };
201
+ exports.getLanguageInfo = getLanguageInfo;
202
+ /**
203
+ * Get language name (English) by code
204
+ * @param code - ISO 639-1 language code
205
+ * @returns English language name or the code itself if not found
206
+ */
207
+ const getLanguageName = (code) => {
208
+ if ((0, exports.isLanguageCode)(code)) {
209
+ return LANGUAGES_LIST[code].name;
210
+ }
211
+ return code;
212
+ };
213
+ exports.getLanguageName = getLanguageName;
214
+ /**
215
+ * Get native language name by code
216
+ * @param code - ISO 639-1 language code
217
+ * @returns Native language name or the code itself if not found
218
+ */
219
+ const getLanguageNativeName = (code) => {
220
+ if ((0, exports.isLanguageCode)(code)) {
221
+ return LANGUAGES_LIST[code].nativeName;
222
+ }
223
+ return code;
224
+ };
225
+ exports.getLanguageNativeName = getLanguageNativeName;
226
+ /**
227
+ * Check if a string is a valid language code
228
+ */
229
+ const isLanguageCode = (code) => {
230
+ return code in LANGUAGES_LIST;
231
+ };
232
+ exports.isLanguageCode = isLanguageCode;
233
+ /**
234
+ * Get all languages as array for UI selects
235
+ */
236
+ const getLanguagesArray = () => {
237
+ return Object.entries(LANGUAGES_LIST).map(([code, info]) => (Object.assign({ code }, info)));
238
+ };
239
+ exports.getLanguagesArray = getLanguagesArray;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SUBSCRIPTION_PAGE_CONFIG_PLATFORM_TYPES = exports.SUBSCRIPTION_PAGE_CONFIG_ADDITIONAL_LOCALES = exports.SUBSCRIPTION_PAGE_CONFIG_VERSION = void 0;
3
+ exports.SUBSCRIPTION_PAGE_CONFIG_PLATFORM_TYPES = exports.LANGUAGE_CODES = exports.SUBSCRIPTION_PAGE_CONFIG_VERSION = void 0;
4
+ const language_codes_constant_1 = require("../language-codes.constant");
5
+ Object.defineProperty(exports, "LANGUAGE_CODES", { enumerable: true, get: function () { return language_codes_constant_1.LANGUAGE_CODES; } });
4
6
  exports.SUBSCRIPTION_PAGE_CONFIG_VERSION = {
5
7
  1: '1',
6
8
  };
7
- exports.SUBSCRIPTION_PAGE_CONFIG_ADDITIONAL_LOCALES = ['ru', 'zh', 'fa', 'fr'];
8
9
  exports.SUBSCRIPTION_PAGE_CONFIG_PLATFORM_TYPES = {
9
10
  IOS: 'ios',
10
11
  ANDROID: 'android',
@@ -4,12 +4,10 @@ exports.SubscriptionPageRawConfigSchema = exports.LocalizedTextSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const constants_1 = require("../../constants");
6
6
  const subscription_page_config_validator_1 = require("./subscription-page-config.validator");
7
- exports.LocalizedTextSchema = zod_1.z.object({
8
- en: zod_1.z.string(),
9
- ru: zod_1.z.string().optional(),
10
- zh: zod_1.z.string().optional(),
11
- fa: zod_1.z.string().optional(),
12
- fr: zod_1.z.string().optional(),
7
+ exports.LocalizedTextSchema = zod_1.z
8
+ .record(zod_1.z.enum(constants_1.LANGUAGE_CODES), zod_1.z.string())
9
+ .refine((obj) => Object.keys(obj).length > 0, {
10
+ message: 'At least one language must be specified',
13
11
  });
14
12
  const SvgLibrarySchema = zod_1.z.record(zod_1.z.string().regex(/^[A-Za-z]+$/, { message: 'Only latin characters, no spaces allowed' }), zod_1.z.string());
15
13
  const ButtonSchema = zod_1.z.object({
@@ -46,6 +44,7 @@ const BlockSchema = zod_1.z.object({
46
44
  });
47
45
  const PlatformAppSchema = zod_1.z.object({
48
46
  name: zod_1.z.string(),
47
+ svgIconKey: zod_1.z.optional(zod_1.z.string()),
49
48
  featured: zod_1.z.boolean(),
50
49
  blocks: zod_1.z.array(BlockSchema),
51
50
  });
@@ -73,16 +72,36 @@ const UiConfigSchema = zod_1.z.object({
73
72
  headerText: exports.LocalizedTextSchema,
74
73
  }),
75
74
  });
75
+ const SubscriptionPageTranslateKeysSchema = zod_1.z.object({
76
+ linkCopied: exports.LocalizedTextSchema,
77
+ linkCopiedToClipboard: exports.LocalizedTextSchema,
78
+ getLink: exports.LocalizedTextSchema,
79
+ scanQrCode: exports.LocalizedTextSchema,
80
+ scanQrCodeDescription: exports.LocalizedTextSchema,
81
+ copyLink: exports.LocalizedTextSchema,
82
+ name: exports.LocalizedTextSchema,
83
+ status: exports.LocalizedTextSchema,
84
+ active: exports.LocalizedTextSchema,
85
+ inactive: exports.LocalizedTextSchema,
86
+ expires: exports.LocalizedTextSchema,
87
+ bandwidth: exports.LocalizedTextSchema,
88
+ scanToImport: exports.LocalizedTextSchema,
89
+ expiresIn: exports.LocalizedTextSchema,
90
+ expired: exports.LocalizedTextSchema,
91
+ unknown: exports.LocalizedTextSchema,
92
+ indefinitely: exports.LocalizedTextSchema,
93
+ });
76
94
  exports.SubscriptionPageRawConfigSchema = zod_1.z
77
95
  .object({
78
96
  version: zod_1.z.nativeEnum(constants_1.SUBSCRIPTION_PAGE_CONFIG_VERSION),
79
- additionalLocales: zod_1.z.array(zod_1.z.enum(constants_1.SUBSCRIPTION_PAGE_CONFIG_ADDITIONAL_LOCALES)),
97
+ locales: zod_1.z.array(zod_1.z.enum(constants_1.LANGUAGE_CODES)).min(1, 'At least one locale must be specified'),
80
98
  brandingSettings: BrandingSettingsSchema,
81
99
  uiConfig: UiConfigSchema,
100
+ baseTranslations: SubscriptionPageTranslateKeysSchema,
82
101
  svgLibrary: SvgLibrarySchema,
83
102
  platforms: zod_1.z.record(zod_1.z.nativeEnum(constants_1.SUBSCRIPTION_PAGE_CONFIG_PLATFORM_TYPES), PlatformSchema),
84
103
  })
85
104
  .superRefine((data, ctx) => {
86
- (0, subscription_page_config_validator_1.validateLocalizedTexts)(data.platforms, data.additionalLocales, 'platforms', ctx);
105
+ (0, subscription_page_config_validator_1.validateLocalizedTexts)(data, data.locales, ctx);
87
106
  (0, subscription_page_config_validator_1.validateSvgReferences)(data, ctx);
88
107
  });