waha-shared 1.0.514 → 1.0.516

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 (53) hide show
  1. package/dist/data/areas/index.js +5 -2
  2. package/dist/data/aslTimestamps/index.js +5 -2
  3. package/dist/data/bibleAudios/index.js +5 -2
  4. package/dist/data/bibleBooks/index.js +5 -2
  5. package/dist/data/bibleChaptersList/index.js +7 -2
  6. package/dist/data/bibleStatuses/index.js +5 -2
  7. package/dist/data/bibleTexts/index.js +5 -2
  8. package/dist/data/clones/index.js +5 -2
  9. package/dist/data/countries/index.js +5 -2
  10. package/dist/data/countriesAndLanguages/index.js +7 -2
  11. package/dist/data/crowdinLanguages/index.js +7 -2
  12. package/dist/data/curriculumFoundations/index.js +7 -2
  13. package/dist/data/curriculumQuestions/index.js +7 -2
  14. package/dist/data/curriculumTopics/index.js +7 -2
  15. package/dist/data/iso6933LanguageCodes/index.js +7 -2
  16. package/dist/data/languages/index.d.ts +0 -2
  17. package/dist/data/languages/index.js +5 -2
  18. package/dist/data/languages/languages.json +0 -310
  19. package/dist/data/languages/languages.schema.json +1 -11
  20. package/dist/data/languages/languages.zod.d.ts +0 -3
  21. package/dist/data/languages/languages.zod.js +0 -4
  22. package/dist/data/lessonPauses/index.js +5 -2
  23. package/dist/data/mediaDurations/index.js +7 -2
  24. package/dist/data/notification/index.js +5 -2
  25. package/dist/data/numeralMaps/index.js +5 -2
  26. package/dist/data/phoneLanguages/index.js +7 -2
  27. package/dist/data/questions/index.js +5 -2
  28. package/dist/data/releaseNotes/index.js +5 -2
  29. package/dist/data/releaseNotes/releaseNotes.json +51 -2
  30. package/dist/data/screenshots/index.js +5 -2
  31. package/dist/data/scripts/index.js +5 -2
  32. package/dist/data/sets/index.js +5 -2
  33. package/dist/data/specialIds/index.js +5 -2
  34. package/dist/data/translationsApp/index.js +7 -2
  35. package/dist/data/translationsFtb/index.js +7 -2
  36. package/dist/data/translationsIntroduction/index.js +7 -2
  37. package/dist/data/translationsQuestion/index.js +7 -2
  38. package/dist/data/translationsSet/index.js +7 -2
  39. package/dist/data/translationsSolarSpeaker/index.js +7 -2
  40. package/dist/data/translationsSpokenQuestion/index.js +7 -2
  41. package/dist/data/youtubePlaylists/index.js +7 -2
  42. package/dist/data/youtubeVideos/index.js +5 -2
  43. package/dist/functions/activeCampaign.js +16 -4
  44. package/dist/functions/bibles.d.ts +5 -4
  45. package/dist/functions/bibles.js +8 -6
  46. package/dist/functions/crowdin.js +1 -1
  47. package/dist/functions/languages.js +0 -5
  48. package/dist/functions/scripturePassages.js +4 -1
  49. package/dist/functions/sets.js +3 -1
  50. package/dist/functions/utils.js +1 -1
  51. package/dist/types/languages.d.ts +0 -8
  52. package/dist/types/webContent.js +1 -1
  53. package/package.json +2 -2
@@ -250,13 +250,9 @@
250
250
  "topics": {
251
251
  "anyOf": [{ "type": "string" }, { "type": "null" }],
252
252
  "description": "The id for the foundations curriculum for this language."
253
- },
254
- "onboarding": {
255
- "type": "string",
256
- "description": "The id for the onboarding curriculum for this language. Determines which set of onboarding DBS passages to use (e.g. languages with a different psalm numbering need their own curriculum)."
257
253
  }
258
254
  },
259
- "required": ["foundations", "questions", "topics", "onboarding"],
255
+ "required": ["foundations", "questions", "topics"],
260
256
  "additionalProperties": false,
261
257
  "description": "Determines what curriculums this language will use for its various content. Each must be linked to objects in data/foundationsCurriculums.json, data/topicsCurriculums.json , or data/questionsCurriculums.json."
262
258
  },
@@ -558,12 +554,6 @@
558
554
  "type": "string",
559
555
  "minLength": 3,
560
556
  "maxLength": 3
561
- },
562
- "onboardingPassages": {
563
- "description": "The language id of the onboarding passages for this language.",
564
- "type": "string",
565
- "minLength": 3,
566
- "maxLength": 3
567
557
  }
568
558
  },
569
559
  "additionalProperties": false,
@@ -26,7 +26,6 @@ export declare const BridgeLanguages: z.ZodObject<{
26
26
  titles: z.ZodOptional<z.ZodString>;
27
27
  questionText: z.ZodOptional<z.ZodString>;
28
28
  questionAudio: z.ZodOptional<z.ZodString>;
29
- onboardingPassages: z.ZodOptional<z.ZodString>;
30
29
  }, z.core.$strip>;
31
30
  export declare const BibleModifier: z.ZodObject<{
32
31
  scope: z.ZodUnion<[z.ZodEnum<{
@@ -241,7 +240,6 @@ export declare const Languages: z.ZodArray<z.ZodObject<{
241
240
  foundations: z.ZodString;
242
241
  questions: z.ZodString;
243
242
  topics: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
244
- onboarding: z.ZodString;
245
243
  }, z.core.$strict>;
246
244
  status: z.ZodObject<{
247
245
  dbs: z.ZodEnum<{
@@ -450,7 +448,6 @@ export declare const Languages: z.ZodArray<z.ZodObject<{
450
448
  titles: z.ZodOptional<z.ZodString>;
451
449
  questionText: z.ZodOptional<z.ZodString>;
452
450
  questionAudio: z.ZodOptional<z.ZodString>;
453
- onboardingPassages: z.ZodOptional<z.ZodString>;
454
451
  }, z.core.$strip>>;
455
452
  web: z.ZodOptional<z.ZodObject<{
456
453
  name: z.ZodString;
@@ -23,7 +23,6 @@ exports.BridgeLanguages = zod_1.z
23
23
  titles: exports.LanguageId.optional().describe('If the language is not translating its own titles, specify the language id of the language that will be used as the bridge language for the titles content.'),
24
24
  questionText: exports.LanguageId.optional().describe('If the language is not translating its own question text, specify the language id of the language that will be used as the bridge language for the question text content.'),
25
25
  questionAudio: exports.LanguageId.optional().describe('If the language is not recording its own question audio, specify the language id of the language that will be used as the bridge language for the question audio content.'),
26
- onboardingPassages: exports.LanguageId.optional().describe('The language id of the onboarding passages for this language.'),
27
26
  })
28
27
  .describe('Language ids to use as bridge languages for various pieces of content. Bridge languages are alternative languages to use for just that type of content.');
29
28
  exports.BibleModifier = zod_1.z.object({
@@ -234,9 +233,6 @@ exports.Languages = zod_1.z.array(zod_1.z
234
233
  topics: zod_1.z
235
234
  .union([zod_1.z.string(), zod_1.z.null()])
236
235
  .describe('The id for the foundations curriculum for this language.'),
237
- onboarding: zod_1.z
238
- .string()
239
- .describe('The id for the onboarding curriculum for this language. Determines which set of onboarding DBS passages to use (e.g. languages with a different psalm numbering need their own curriculum).'),
240
236
  })
241
237
  .strict()
242
238
  .describe('Determines what curriculums this language will use for its various content. Each must be linked to objects in data/foundationsCurriculums.json, data/topicsCurriculums.json , or data/questionsCurriculums.json.'),
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.lessonPauses = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const lessonPauses_zod_1 = require("./lessonPauses.zod");
6
- const data = require('./lessonPauses.json');
7
- exports.lessonPauses = lessonPauses_zod_1.LessonPauses.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./lessonPauses.json');
10
+ exports.lessonPauses = zod_1.z.object({ data: lessonPauses_zod_1.LessonPauses }).parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mediaDurations = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const mediaDurations_zod_1 = require("./mediaDurations.zod");
6
- const data = require('./mediaDurations.json');
7
- exports.mediaDurations = mediaDurations_zod_1.MediaDurations.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./mediaDurations.json');
10
+ exports.mediaDurations = zod_1.z
11
+ .object({ data: mediaDurations_zod_1.MediaDurations })
12
+ .parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.notification = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const notification_zod_1 = require("./notification.zod");
6
- const data = require('./notification.json');
7
- exports.notification = notification_zod_1.Notification.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./notification.json');
10
+ exports.notification = zod_1.z.object({ data: notification_zod_1.Notification }).parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.numeralMaps = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const numeralMaps_zod_1 = require("./numeralMaps.zod");
6
- const data = require('./numeralMaps.json');
7
- exports.numeralMaps = numeralMaps_zod_1.NumeralMaps.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./numeralMaps.json');
10
+ exports.numeralMaps = zod_1.z.object({ data: numeralMaps_zod_1.NumeralMaps }).parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.phoneLanguages = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const phoneLanguages_zod_1 = require("./phoneLanguages.zod");
6
- const data = require('./phoneLanguages.json');
7
- exports.phoneLanguages = phoneLanguages_zod_1.PhoneLanguages.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./phoneLanguages.json');
10
+ exports.phoneLanguages = zod_1.z
11
+ .object({ data: phoneLanguages_zod_1.PhoneLanguages })
12
+ .parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.questions = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const questions_zod_1 = require("./questions.zod");
6
- const data = require('./questions.json');
7
- exports.questions = questions_zod_1.Questions.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./questions.json');
10
+ exports.questions = zod_1.z.object({ data: questions_zod_1.Questions }).parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.releaseNotes = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const releaseNotes_zod_1 = require("./releaseNotes.zod");
6
- const data = require('./releaseNotes.json');
7
- exports.releaseNotes = releaseNotes_zod_1.ReleaseNotes.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./releaseNotes.json');
10
+ exports.releaseNotes = zod_1.z.object({ data: releaseNotes_zod_1.ReleaseNotes }).parse(json).data;
@@ -2,12 +2,61 @@
2
2
  "$schema": "./releaseNotes.schema.json",
3
3
  "data": [
4
4
  {
5
- "version": "9.2.1",
5
+ "version": "9.3.0",
6
6
  "showInApp": false,
7
7
  "notes": {
8
- "eng": "Language beta with languages: Italian, Kabyle (Algerian Tamazight), Georgian, North Korean, Hassaniyya Arabic"
8
+ "eng": "This update includes many bug fixes to keep Waha running smoothly.",
9
+ "ara": "يتضمن هذا التحديث العديد من إصلاحات الأخطاء للحفاظ على تشغيل واها بسلاسة.",
10
+ "aze": "Bu yeniləmə Wahanın düzgün işləməsini təmin etmək üçün bir çox səhv düzəlişlərini əhatə edir.",
11
+ "bni": "এই আপডেটে অনেক বাগ ফিক্স অন্তর্ভুক্ত রয়েছে যা Waha-কে সুচারুভাবে চালু রাখতে সাহায্য করবে।",
12
+ "ceb": "Kining update naglakip og daghang mga ayos sa bug aron mapadayon ang Waha nga nagdagan nga maayos.",
13
+ "ckb": "ئەم نوێکردنەوەیە کۆمەڵێک چاکسازیی هەڵە لەخۆدەگرێت بۆ ئەوەی واها بەبێ کێشە بەردەوام بێت.",
14
+ "cmn": "此更新包含多项错误修复,以确保 Waha 稳定运行。",
15
+ "deu": "Dieses Update enthält viele Fehlerbehebungen, damit Waha reibungslos läuft.",
16
+ "esp": "Esta actualización incluye numerosas correcciones de errores para mantener Waha funcionando correctamente.",
17
+ "fra": "Cette mise à jour inclut de nombreuses corrections de bogues pour assurer le bon fonctionnement de Waha.",
18
+ "hau": "Wannan sabuntawa ta ƙunshi gyare-gyare da yawa don tabbatar da cewa Waha na gudana yadda ya kamata.",
19
+ "heb": "עדכון זה כולל תיקוני באגים רבים כדי לשמור על פעולה תקינה של Waha.",
20
+ "hin": "इस अपडेट में कई बग फिक्स शामिल हैं जो Waha को सुचारू रूप से चलाने में मदद करते हैं।",
21
+ "hun": "Ez a frissítés számos hibajavítást tartalmaz, amelyek biztosítják a Waha zökkenőmentes működését.",
22
+ "hye": "Այս թարմացումը ներառում է բազմաթիվ սխալների շտկումներ՝ Waha-ի անխափան աշխատանքն ապահովելու համար։",
23
+ "ind": "Pembaruan ini mencakup banyak perbaikan bug untuk menjaga Waha berjalan dengan lancar.",
24
+ "ita": "Questo aggiornamento include numerose correzioni di bug per mantenere Waha funzionante in modo ottimale.",
25
+ "jpn": "このアップデートには、Wahaをスムーズに動作させるための多くのバグ修正が含まれています。",
26
+ "kat": "ეს განახლება მოიცავს მრავალ შეცდომის გამოსწორებას, რათა Waha-ს მუშაობა შეუფერხებლად გაგრძელდეს.",
27
+ "khm": "ការអាប់ដេតនេះរួមមានការជួសជុលបញ្ហាជាច្រើន ដើម្បីរក្សាឱ្យ Waha ដំណើរការបានយ៉ាងល្អ។",
28
+ "kor": "이 업데이트에는 Waha가 원활하게 실행될 수 있도록 다양한 버그 수정 사항이 포함되어 있습니다.",
29
+ "mar": "या अपडेटमध्ये Waha सुरळीत चालू ठेवण्यासाठी अनेक बग निराकरणे समाविष्ट आहेत.",
30
+ "mlg": "Ity fanavaozana ity dia ahitana fanitsiana maromaro momba ny olana mba hahafahana mampiasa ny Waha amin'ny fomba mahomby.",
31
+ "mon": "Энэхүү шинэчлэлт нь Waha-г жигд ажиллуулахын тулд олон алдааг засварлалтыг агуулж байна.",
32
+ "mya": "ဤအပ်ဒိတ်တွင် Waha ကို ချောမွေ့စွာ လည်ပတ်စေရန် ချို့ယွင်းချက် အများအပြားကို ပြင်ဆင်ထားသည်။",
33
+ "nld": "Deze update bevat veel bugfixes om Waha soepel te laten werken.",
34
+ "npi": "यस अपडेटमा Waha लाई सुचारु रूपमा चलाइराख्नका लागि धेरै बग फिक्सहरू समावेश छन्।",
35
+ "pes": "این به‌روزرسانی شامل رفع بسیاری از اشکالات برای اطمینان از عملکرد روان وَها می‌شود.",
36
+ "por": "Esta atualização inclui diversas correções de erros para manter o Waha funcionando corretamente.",
37
+ "ron": "Această actualizare include numeroase remedieri de erori pentru a menține Waha să funcționeze fără probleme.",
38
+ "rus": "Это обновление включает множество исправлений ошибок для обеспечения стабильной работы Waha.",
39
+ "spa": "Esta actualización incluye muchas correcciones de errores para mantener Waha funcionando correctamente.",
40
+ "swe": "Den här uppdateringen innehåller många felkorrigeringar för att hålla Waha igång smidigt.",
41
+ "swz": "Sasisho hili linajumuisha marekebisho mengi ya hitilafu ili kuweka Waha ikiendelea vizuri.",
42
+ "tam": "இந்த புதுப்பிப்பில் Waha சீராக இயங்குவதற்காக பல பிழை திருத்தங்கள் சேர்க்கப்பட்டுள்ளன.",
43
+ "tel": "ఈ అప్‌డేట్‌లో Waha సజావుగా నడవడానికి అనేక బగ్ పరిష్కారాలు చేర్చబడ్డాయి.",
44
+ "tgl": "Ang update na ito ay naglalaman ng maraming pag-aayos ng bug upang mapanatiling maayos ang pagtakbo ng Waha.",
45
+ "tha": "การอัปเดตนี้รวมถึงการแก้ไขข้อบกพร่องมากมายเพื่อให้ Waha ทำงานได้อย่างราบรื่น",
46
+ "tur": "Bu güncelleme, Waha'nın sorunsuz çalışmaya devam etmesi için birçok hata düzeltmesi içermektedir.",
47
+ "uig": "بۇ يېڭىلاش Waha نىڭ ئاكتىپ ئىشلىشىنى تەمىنلەش ئۈچۈن كۆپ خىل خاتالىقلارنى ئوڭشاشنى ئۆز ئىچىگە ئالىدۇ.",
48
+ "ukr": "Це оновлення містить численні виправлення помилок для забезпечення стабільної роботи Waha.",
49
+ "urd": "اس اپ ڈیٹ میں بہت سی خرابیوں کو دور کیا گیا ہے تاکہ واہا بغیر کسی رکاوٹ کے چلتا رہے۔",
50
+ "zsm": "Kemas kini ini merangkumi banyak pembetulan pepijat untuk memastikan Waha berjalan dengan lancar."
9
51
  }
10
52
  },
53
+ {
54
+ "version": "9.2.1",
55
+ "notes": {
56
+ "eng": "Language beta with languages: Italian, Kabyle (Algerian Tamazight), Georgian, North Korean, Hassaniyya Arabic"
57
+ },
58
+ "showInApp": false
59
+ },
11
60
  {
12
61
  "version": "9.2.0",
13
62
  "notes": {
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.screenshots = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const screenshots_zod_1 = require("./screenshots.zod");
6
- const data = require('./screenshots.json');
7
- exports.screenshots = screenshots_zod_1.Screenshots.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./screenshots.json');
10
+ exports.screenshots = zod_1.z.object({ data: screenshots_zod_1.Screenshots }).parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.scripts = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const scripts_zod_1 = require("./scripts.zod");
6
- const data = require('./scripts.json');
7
- exports.scripts = scripts_zod_1.Scripts.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./scripts.json');
10
+ exports.scripts = zod_1.z.object({ data: scripts_zod_1.Scripts }).parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sets = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const sets_zod_1 = require("./sets.zod");
6
- const data = require('./sets.json');
7
- exports.sets = sets_zod_1.Sets.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./sets.json');
10
+ exports.sets = zod_1.z.object({ data: sets_zod_1.Sets }).parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.specialIds = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const specialIds_zod_1 = require("./specialIds.zod");
6
- const data = require('./specialIds.json');
7
- exports.specialIds = specialIds_zod_1.SpecialIds.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./specialIds.json');
10
+ exports.specialIds = zod_1.z.object({ data: specialIds_zod_1.SpecialIds }).parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsApp = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsApp_zod_1 = require("./translationsApp.zod");
6
- const data = require('./translationsApp.json');
7
- exports.translationsApp = translationsApp_zod_1.TranslationsApp.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsApp.json');
10
+ exports.translationsApp = zod_1.z
11
+ .object({ data: translationsApp_zod_1.TranslationsApp })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsFtb = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsFtb_zod_1 = require("./translationsFtb.zod");
6
- const data = require('./translationsFtb.json');
7
- exports.translationsFtb = translationsFtb_zod_1.TranslationsFtb.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsFtb.json');
10
+ exports.translationsFtb = zod_1.z
11
+ .object({ data: translationsFtb_zod_1.TranslationsFtb })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsIntroduction = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsIntroduction_zod_1 = require("./translationsIntroduction.zod");
6
- const data = require('./translationsIntroduction.json');
7
- exports.translationsIntroduction = translationsIntroduction_zod_1.TranslationsIntroduction.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsIntroduction.json');
10
+ exports.translationsIntroduction = zod_1.z
11
+ .object({ data: translationsIntroduction_zod_1.TranslationsIntroduction })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsQuestion = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsQuestion_zod_1 = require("./translationsQuestion.zod");
6
- const data = require('./translationsQuestion.json');
7
- exports.translationsQuestion = translationsQuestion_zod_1.TranslationsQuestion.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsQuestion.json');
10
+ exports.translationsQuestion = zod_1.z
11
+ .object({ data: translationsQuestion_zod_1.TranslationsQuestion })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsSet = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsSet_zod_1 = require("./translationsSet.zod");
6
- const data = require('./translationsSet.json');
7
- exports.translationsSet = translationsSet_zod_1.TranslationsSet.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsSet.json');
10
+ exports.translationsSet = zod_1.z
11
+ .object({ data: translationsSet_zod_1.TranslationsSet })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsSolarSpeaker = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsSolarSpeaker_zod_1 = require("./translationsSolarSpeaker.zod");
6
- const data = require('./translationsSolarSpeaker.json');
7
- exports.translationsSolarSpeaker = translationsSolarSpeaker_zod_1.TranslationsSolarSpeaker.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsSolarSpeaker.json');
10
+ exports.translationsSolarSpeaker = zod_1.z
11
+ .object({ data: translationsSolarSpeaker_zod_1.TranslationsSolarSpeaker })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.translationsSpokenQuestion = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const translationsSpokenQuestion_zod_1 = require("./translationsSpokenQuestion.zod");
6
- const data = require('./translationsSpokenQuestion.json');
7
- exports.translationsSpokenQuestion = translationsSpokenQuestion_zod_1.TranslationsSpokenQuestion.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./translationsSpokenQuestion.json');
10
+ exports.translationsSpokenQuestion = zod_1.z
11
+ .object({ data: translationsSpokenQuestion_zod_1.TranslationsSpokenQuestion })
12
+ .parse(json).data;
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.youtubePlaylists = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const youtubePlaylists_zod_1 = require("./youtubePlaylists.zod");
6
- const data = require('./youtubePlaylists.json');
7
- exports.youtubePlaylists = youtubePlaylists_zod_1.YoutubePlaylists.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./youtubePlaylists.json');
10
+ exports.youtubePlaylists = zod_1.z
11
+ .object({ data: youtubePlaylists_zod_1.YoutubePlaylists })
12
+ .parse(json).data;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.youtubeVideos = void 0;
4
4
  // This file is auto-generated by scripts/prep. Do not edit manually.
5
+ const zod_1 = require("zod");
5
6
  const youtubeVideos_zod_1 = require("./youtubeVideos.zod");
6
- const data = require('./youtubeVideos.json');
7
- exports.youtubeVideos = youtubeVideos_zod_1.YoutubeVideos.parse(data.data);
7
+ // `require` rather than `import` keeps tsc from inferring a type for
8
+ // the whole JSON file.
9
+ const json = require('./youtubeVideos.json');
10
+ exports.youtubeVideos = zod_1.z.object({ data: youtubeVideos_zod_1.YoutubeVideos }).parse(json).data;
@@ -7,6 +7,7 @@ exports.contactLookupUrl = contactLookupUrl;
7
7
  exports.addToACList = addToACList;
8
8
  exports.getContactsInList = getContactsInList;
9
9
  const signale_1 = __importDefault(require("signale"));
10
+ const zod_1 = require("zod");
10
11
  const listNumbers = {
11
12
  newsletter: 3,
12
13
  volunteer: 5,
@@ -21,6 +22,16 @@ const listNumbers = {
21
22
  function contactLookupUrl(apiUrl, email) {
22
23
  return `${apiUrl}/contacts?email=${encodeURIComponent(email)}`;
23
24
  }
25
+ /** The part of an ActiveCampaign list-contacts response that's read. */
26
+ const ContactsPage = zod_1.z.object({
27
+ contacts: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), email: zod_1.z.string() })).optional(),
28
+ });
29
+ /** The part of an ActiveCampaign contact lookup response that's read. */
30
+ const ContactLookup = zod_1.z.object({
31
+ contacts: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string() })),
32
+ });
33
+ /** The part of an ActiveCampaign create-contact response that's read. */
34
+ const CreatedContact = zod_1.z.object({ contact: zod_1.z.object({ id: zod_1.z.string() }) });
24
35
  async function addToACList({ baseUrl, email, list, token, name, }) {
25
36
  const headers = { 'Api-Token': token, 'Content-Type': 'application/json' };
26
37
  const url = `${baseUrl}/api/3`;
@@ -32,9 +43,10 @@ async function addToACList({ baseUrl, email, list, token, name, }) {
32
43
  if (!findContact.ok) {
33
44
  throw new Error(`Failed to retrieve contact with ${email}. ${JSON.stringify(findContactJson)}`);
34
45
  }
46
+ const [existingContact] = ContactLookup.parse(findContactJson).contacts;
35
47
  let contactId;
36
- if (findContactJson.contacts.length > 0) {
37
- contactId = findContactJson.contacts[0].id;
48
+ if (existingContact) {
49
+ contactId = existingContact.id;
38
50
  }
39
51
  else {
40
52
  const createContact = await fetch(`${url}/contacts`, {
@@ -49,7 +61,7 @@ async function addToACList({ baseUrl, email, list, token, name, }) {
49
61
  throw new Error(`Failed to create new contact with ${email}. ${JSON.stringify(createContactJson)}`);
50
62
  }
51
63
  signale_1.default.success(`Created new AC contact with email ${email}.`);
52
- contactId = createContactJson.contact.id;
64
+ contactId = CreatedContact.parse(createContactJson).contact.id;
53
65
  }
54
66
  const subscribe = await fetch(`${url}/contactLists`, {
55
67
  method: 'POST',
@@ -87,7 +99,7 @@ async function getContactsInList({ baseUrl, limit = 100, list, token, }) {
87
99
  if (!response.ok) {
88
100
  throw new Error(`Failed to retrieve contacts in list ${list}. ${JSON.stringify(data)}`);
89
101
  }
90
- const contacts = data.contacts || [];
102
+ const contacts = ContactsPage.parse(data).contacts || [];
91
103
  if (contacts.length === 0) {
92
104
  hasMoreContacts = false;
93
105
  }
@@ -47,11 +47,12 @@ export declare function getAvailableChapters(bibleId: string | undefined): {
47
47
  all: string[];
48
48
  };
49
49
  /**
50
- * The percentage of a complete bible that `bibleId` has for `type`. Counts
51
- * distinct chapters, so overlapping entries (e.g. `OT` and `GEN`) and optional
52
- * chapters can't push it past 100.
50
+ * The percentage of a complete bible that `bibleId` has in any of `types`. Pass
51
+ * `'text', 'audio'` for an audio-only bible to count its audio. Counts distinct
52
+ * chapters, so overlapping entries (e.g. `OT` and `GEN`), a chapter with both
53
+ * text and audio, and optional chapters can't push it past 100.
53
54
  */
54
- export declare function getPercentage(bibleId: string, type: 'text' | 'audio' | 'timings'): number;
55
+ export declare function getPercentage(bibleId: string, ...types: ('text' | 'audio' | 'timings')[]): number;
55
56
  /**
56
57
  * Determines the appropriate bible for a given passage based on the language's
57
58
  * bible, bible modifiers, and fallback bible.
@@ -213,13 +213,15 @@ function getAvailableChapters(bibleId) {
213
213
  /** Chapters in a complete bible, not counting optional ones like MAL.4. */
214
214
  const REQUIRED_CHAPTER_COUNT = bibleChaptersList_1.bibleChaptersList.length - exports.OPTIONAL_CHAPTERS.size;
215
215
  /**
216
- * The percentage of a complete bible that `bibleId` has for `type`. Counts
217
- * distinct chapters, so overlapping entries (e.g. `OT` and `GEN`) and optional
218
- * chapters can't push it past 100.
216
+ * The percentage of a complete bible that `bibleId` has in any of `types`. Pass
217
+ * `'text', 'audio'` for an audio-only bible to count its audio. Counts distinct
218
+ * chapters, so overlapping entries (e.g. `OT` and `GEN`), a chapter with both
219
+ * text and audio, and optional chapters can't push it past 100.
219
220
  */
220
- function getPercentage(bibleId, type) {
221
- const chapters = expandOptimizedChapters(bibleStatuses_1.bibleStatuses[bibleId]?.[type] ?? []);
222
- const required = chapters.filter((c) => !exports.OPTIONAL_CHAPTERS.has(c));
221
+ function getPercentage(bibleId, ...types) {
222
+ const status = bibleStatuses_1.bibleStatuses[bibleId];
223
+ const chapters = new Set(types.flatMap((type) => expandOptimizedChapters(status?.[type] ?? [])));
224
+ const required = [...chapters].filter((c) => !exports.OPTIONAL_CHAPTERS.has(c));
223
225
  return (required.length / REQUIRED_CHAPTER_COUNT) * 100;
224
226
  }
225
227
  /**
@@ -110,7 +110,7 @@ async function uploadSource({ projectId, source, token, label, fileSettings, })
110
110
  const client = new crowdin_api_client_1.default({ token });
111
111
  const id = Number(projectId);
112
112
  const relativePath = crowdinRelativePath(source);
113
- const fileName = relativePath.split('/').pop();
113
+ const fileName = relativePath.slice(relativePath.lastIndexOf('/') + 1);
114
114
  const contents = fs_1.default.readFileSync(source, 'utf8');
115
115
  const storage = await client.uploadStorageApi.addStorage(fileName, contents);
116
116
  const storageId = storage.data.id;
@@ -7,7 +7,6 @@ exports.numerals = numerals;
7
7
  exports.getAppTranslations = getAppTranslations;
8
8
  exports.getMeetTranslations = getMeetTranslations;
9
9
  const curriculumFoundations_1 = require("../data/curriculumFoundations");
10
- const curriculumOnboarding_1 = require("../data/curriculumOnboarding");
11
10
  const curriculumQuestions_1 = require("../data/curriculumQuestions");
12
11
  const curriculumTopics_1 = require("../data/curriculumTopics");
13
12
  const languages_1 = require("../data/languages");
@@ -49,7 +48,6 @@ function getLanguageInfo(languageId, options) {
49
48
  const questionsCurriculum = curriculumQuestions_1.curriculumQuestions.find((questionCurriculum) => questionCurriculum.curriculumId === language.curriculum.questions);
50
49
  const foundationsCurriculum = curriculumFoundations_1.curriculumFoundations.find((foundationsCurriculum) => foundationsCurriculum.curriculumId === language.curriculum.foundations);
51
50
  const topicsCurriculum = curriculumTopics_1.curriculumTopics.find((topicsCurriculum) => topicsCurriculum.curriculumId === language?.curriculum.topics);
52
- const onboardingCurriculum = curriculumOnboarding_1.curriculumOnboarding.find((onboardingCurriculum) => onboardingCurriculum.curriculumId === language.curriculum.onboarding);
53
51
  const setIds = [];
54
52
  if (foundationsCurriculum)
55
53
  setIds.push(...foundationsCurriculum.sets);
@@ -102,13 +100,10 @@ function getLanguageInfo(languageId, options) {
102
100
  titles: language.bridgeLanguages?.titles ?? language.languageId,
103
101
  questionAudio: language.bridgeLanguages?.questionAudio ?? language.languageId,
104
102
  questionText: language.bridgeLanguages?.questionText ?? language.languageId,
105
- onboardingPassages: language.bridgeLanguages?.onboardingPassages ?? language.languageId,
106
103
  },
107
104
  script,
108
105
  lessonPauses: lessonPauses_1.lessonPauses,
109
106
  allBibleIds: (0, bibles_1.getAllBibleIds)(language),
110
- onboardingPassageIds: onboardingCurriculum?.passages ??
111
- getEnglishFallback(languageId).onboardingPassageIds,
112
107
  status: { ...language.status, dmCourse: dmCourseStatus },
113
108
  };
114
109
  return toReturn;
@@ -319,7 +319,10 @@ function normalizeVerseTimings({ enrichedSections, scripture, lessonInfo, }) {
319
319
  return verse;
320
320
  return {
321
321
  ...verse,
322
- timings: [verse.timings[0] + offset, verse.timings[1] + offset],
322
+ timings: [
323
+ verse.timings[0] + offset,
324
+ verse.timings[1] + offset,
325
+ ],
323
326
  };
324
327
  }),
325
328
  };
@@ -129,6 +129,8 @@ function assembleLessonSections({ languageInfo, setInfo, lesson, t, useSpokenQue
129
129
  });
130
130
  }
131
131
  else if (specialIds_1.specialIds.growingAsDmcSetIds.includes(setInfo.setId)) {
132
+ // Keyed by lesson ID, but only some lessons have an introduction.
133
+ const introductionTexts = t.introductions.introductions;
132
134
  sections.push({
133
135
  id: 'introduction',
134
136
  index: sections.length,
@@ -136,7 +138,7 @@ function assembleLessonSections({ languageInfo, setInfo, lesson, t, useSpokenQue
136
138
  indexWithinChapter: 0,
137
139
  pauseBefore: languageInfo.lessonPauses.beforeFtb,
138
140
  header: t.introductions.introduction,
139
- text: t.introductions.introductions[lesson.lessonId],
141
+ text: introductionTexts[lesson.lessonId],
140
142
  path: (0, utils_1.join)(languageInfo.contentLanguages.intros, [
141
143
  languageInfo.contentLanguages.intros,
142
144
  lesson.lessonId,
@@ -4,7 +4,7 @@ exports.dirname = exports.first = exports.basename = exports.join = void 0;
4
4
  exports.getErrorInfo = getErrorInfo;
5
5
  const join = (...parts) => parts.join('/').replace(/\/+/g, '/');
6
6
  exports.join = join;
7
- const basename = (p) => p.split('/').pop();
7
+ const basename = (p) => p.slice(p.lastIndexOf('/') + 1);
8
8
  exports.basename = basename;
9
9
  const first = (p) => p.split('/')[0];
10
10
  exports.first = first;