@qite/tide-booking-component 1.4.59 → 1.4.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/build-cjs/index.js +4094 -387
- package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-util.d.ts +1 -0
- package/build/build-cjs/src/booking-wizard/types.d.ts +1 -0
- package/build/build-cjs/src/content/login/confirm-component.d.ts +4 -0
- package/build/build-cjs/src/content/login/index.d.ts +4 -0
- package/build/build-cjs/src/content/login/login-component.d.ts +4 -0
- package/build/build-cjs/src/content/login/login-services.d.ts +11 -0
- package/build/build-cjs/src/content/login/reset-password-component.d.ts +4 -0
- package/build/build-cjs/src/content/login/types.d.ts +24 -0
- package/build/build-cjs/src/content/navbar/placeholderData.d.ts +2 -0
- package/build/build-cjs/src/content/navbar/types.d.ts +4 -0
- package/build/build-cjs/src/index.d.ts +3 -1
- package/build/build-cjs/src/shared/utils/localization-util.d.ts +35 -0
- package/build/build-esm/index.js +4078 -390
- package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-util.d.ts +1 -0
- package/build/build-esm/src/booking-wizard/types.d.ts +1 -0
- package/build/build-esm/src/content/login/confirm-component.d.ts +4 -0
- package/build/build-esm/src/content/login/index.d.ts +4 -0
- package/build/build-esm/src/content/login/login-component.d.ts +4 -0
- package/build/build-esm/src/content/login/login-services.d.ts +11 -0
- package/build/build-esm/src/content/login/reset-password-component.d.ts +4 -0
- package/build/build-esm/src/content/login/types.d.ts +24 -0
- package/build/build-esm/src/content/navbar/placeholderData.d.ts +2 -0
- package/build/build-esm/src/content/navbar/types.d.ts +4 -0
- package/build/build-esm/src/index.d.ts +3 -1
- package/build/build-esm/src/shared/utils/localization-util.d.ts +35 -0
- package/package.json +1 -1
- package/src/booking-wizard/features/sidebar/sidebar.tsx +0 -3
- package/src/content/navbar/index.tsx +38 -1
- package/src/content/navbar/placeholderData.tsx +15 -4
- package/src/content/navbar/types.ts +6 -0
- package/src/qsm/components/QSMContainer/qsm-container.tsx +1 -1
- package/src/shared/components/flyin.tsx +8 -2
- package/src/shared/translations/ar-SA.json +1 -0
- package/src/shared/translations/da-DK.json +1 -0
- package/src/shared/translations/de-DE.json +1 -0
- package/src/shared/translations/en-GB.json +1 -0
- package/src/shared/translations/es-ES.json +1 -0
- package/src/shared/translations/fr-BE.json +1 -0
- package/src/shared/translations/fr-FR.json +1 -0
- package/src/shared/translations/is-IS.json +1 -0
- package/src/shared/translations/it-IT.json +1 -0
- package/src/shared/translations/ja-JP.json +1 -0
- package/src/shared/translations/nl-BE.json +1 -0
- package/src/shared/translations/nl-NL.json +1 -0
- package/src/shared/translations/no-NO.json +1 -0
- package/src/shared/translations/pl-PL.json +1 -0
- package/src/shared/translations/pt-PT.json +1 -0
- package/src/shared/translations/sv-SE.json +1 -0
- package/styles/components/_navbar.scss +18 -0
package/build/build-cjs/index.js
CHANGED
|
@@ -347,6 +347,8 @@ var SIDEBAR$f = {
|
|
|
347
347
|
TRAVELERS_ADULT: 'بالغ',
|
|
348
348
|
TRAVELERS_CHILDREN: 'أطفال',
|
|
349
349
|
TRAVELERS_CHILD: 'طفل',
|
|
350
|
+
TRAVELERS_INFANTS: 'رضع',
|
|
351
|
+
TRAVELERS_INFANT: 'رضيع',
|
|
350
352
|
DEPARTURE: 'رحلة الذهاب',
|
|
351
353
|
DEPARTURE_SINGLE: 'التاريخ',
|
|
352
354
|
ARRIVAL: 'رحلة العودة',
|
|
@@ -500,6 +502,39 @@ var PRINT_OFFER_BUTTON$f = {
|
|
|
500
502
|
var NAVBAR$f = {
|
|
501
503
|
SEARCH: 'بحث'
|
|
502
504
|
};
|
|
505
|
+
var LOGIN$f = {
|
|
506
|
+
LOGIN_INTO: 'تسجيل الدخول إلى حسابك',
|
|
507
|
+
EMAIL: 'البريد الإلكتروني',
|
|
508
|
+
ENTER_YOUR_EMAIL: 'أدخل بريدك الإلكتروني',
|
|
509
|
+
EMAIL_REQUIRED: 'البريد الإلكتروني مطلوب.',
|
|
510
|
+
EMAIL_INVALID: 'البريد الإلكتروني غير صالح.',
|
|
511
|
+
ENTER_VALID_EMAIL: 'أدخل بريدًا إلكترونيًا صالحًا.',
|
|
512
|
+
PASSWORD: 'كلمة المرور',
|
|
513
|
+
ENTER_YOUR_PASSWORD: 'أدخل كلمة المرور',
|
|
514
|
+
RESET_PASSWORD_LABEL: 'كلمة المرور الجديدة',
|
|
515
|
+
RESET_REPEAT_PASSWORD_LABEL: 'تكرار كلمة المرور',
|
|
516
|
+
PASSWORD_REQUIRED: 'كلمة المرور مطلوبة.',
|
|
517
|
+
INVALID_CREDENTIALS: 'البريد الإلكتروني أو كلمة المرور غير صحيحة.',
|
|
518
|
+
LOGIN: 'تسجيل الدخول',
|
|
519
|
+
LOGOUT: 'تسجيل الخروج',
|
|
520
|
+
FORGOT_PASSWORD: 'هل نسيت كلمة المرور؟',
|
|
521
|
+
LOGGING_IN: 'جاري تسجيل الدخول...',
|
|
522
|
+
WELCOME_X: 'مرحبًا، ',
|
|
523
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'إعادة تعيين كلمة المرور',
|
|
524
|
+
RESET_REQUESTED: 'تم طلب إعادة تعيين كلمة المرور',
|
|
525
|
+
BACK_TO_HOMEPAGE: 'العودة إلى الصفحة الرئيسية',
|
|
526
|
+
BACK_TO_LOGIN: 'العودة إلى تسجيل الدخول',
|
|
527
|
+
RESET_PASSWORD_TITLE: 'إعادة تعيين كلمة المرور',
|
|
528
|
+
PASSWORD_COMPLEXITY: 'يجب أن تحتوي كلمة المرور على رقم واحد على الأقل وحرف كبير واحد',
|
|
529
|
+
REPEAT_PASSWORD_REQUIRED: 'يرجى تكرار كلمة المرور.',
|
|
530
|
+
PASSWORDS_DO_NOT_MATCH: 'كلمتا المرور غير متطابقتين.',
|
|
531
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'تعديل كلمة المرور',
|
|
532
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'تم تغيير كلمة المرور الخاصة بك. يمكنك الآن تسجيل الدخول باستخدام كلمة المرور الجديدة.',
|
|
533
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'هذا الرابط منتهي الصلاحية أو غير صالح.',
|
|
534
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'يمكنك طلب كلمة مرور جديدة بالنقر على الزر أدناه.',
|
|
535
|
+
RECEIVED_REQUEST: 'تم استلام طلبك بنجاح',
|
|
536
|
+
ACCOUNT_ACTIVATED_LOGIN: 'تم تفعيل حسابك الآن. انقر أدناه لتسجيل الدخول ببياناتك.'
|
|
537
|
+
};
|
|
503
538
|
var QSM$g = {
|
|
504
539
|
DEPARTURE: 'المغادرة',
|
|
505
540
|
CHOOSE_DEPARTURE: 'اختر المغادرة',
|
|
@@ -602,6 +637,7 @@ var arJson = {
|
|
|
602
637
|
ERROR: ERROR$f,
|
|
603
638
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$f,
|
|
604
639
|
NAVBAR: NAVBAR$f,
|
|
640
|
+
LOGIN: LOGIN$f,
|
|
605
641
|
QSM: QSM$g,
|
|
606
642
|
SRP: SRP$f
|
|
607
643
|
};
|
|
@@ -709,6 +745,8 @@ var SIDEBAR$e = {
|
|
|
709
745
|
TRAVELERS_ADULT: 'voksen',
|
|
710
746
|
TRAVELERS_CHILDREN: 'børn',
|
|
711
747
|
TRAVELERS_CHILD: 'barn',
|
|
748
|
+
TRAVELERS_INFANTS: 'babyer',
|
|
749
|
+
TRAVELERS_INFANT: 'baby',
|
|
712
750
|
DEPARTURE: 'Udgående',
|
|
713
751
|
DEPARTURE_SINGLE: 'Dato',
|
|
714
752
|
ARRIVAL: 'Retur',
|
|
@@ -862,6 +900,39 @@ var PRINT_OFFER_BUTTON$e = {
|
|
|
862
900
|
var NAVBAR$e = {
|
|
863
901
|
SEARCH: 'Søg'
|
|
864
902
|
};
|
|
903
|
+
var LOGIN$e = {
|
|
904
|
+
LOGIN_INTO: 'Log ind på din konto',
|
|
905
|
+
EMAIL: 'E-mail',
|
|
906
|
+
ENTER_YOUR_EMAIL: 'Indtast din e-mail',
|
|
907
|
+
EMAIL_REQUIRED: 'E-mail er påkrævet.',
|
|
908
|
+
EMAIL_INVALID: 'E-mailen er ugyldig.',
|
|
909
|
+
ENTER_VALID_EMAIL: 'Indtast en gyldig e-mail.',
|
|
910
|
+
PASSWORD: 'Adgangskode',
|
|
911
|
+
ENTER_YOUR_PASSWORD: 'Indtast din adgangskode',
|
|
912
|
+
RESET_PASSWORD_LABEL: 'Ny adgangskode',
|
|
913
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Gentag adgangskode',
|
|
914
|
+
PASSWORD_REQUIRED: 'Adgangskode er påkrævet.',
|
|
915
|
+
INVALID_CREDENTIALS: 'Ugyldig e-mail eller adgangskode.',
|
|
916
|
+
LOGIN: 'Log ind',
|
|
917
|
+
LOGOUT: 'Log ud',
|
|
918
|
+
FORGOT_PASSWORD: 'Glemt adgangskode?',
|
|
919
|
+
LOGGING_IN: 'Logger ind...',
|
|
920
|
+
WELCOME_X: 'Velkommen, ',
|
|
921
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Nulstil adgangskode',
|
|
922
|
+
RESET_REQUESTED: 'Anmodning om nulstilling af adgangskode sendt',
|
|
923
|
+
BACK_TO_HOMEPAGE: 'Tilbage til forsiden',
|
|
924
|
+
BACK_TO_LOGIN: 'Tilbage til login',
|
|
925
|
+
RESET_PASSWORD_TITLE: 'Nulstil adgangskode',
|
|
926
|
+
PASSWORD_COMPLEXITY: 'Adgangskoden skal indeholde mindst 1 tal og 1 stort bogstav',
|
|
927
|
+
REPEAT_PASSWORD_REQUIRED: 'Gentag venligst din adgangskode.',
|
|
928
|
+
PASSWORDS_DO_NOT_MATCH: 'Adgangskoderne stemmer ikke overens.',
|
|
929
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Ændr adgangskode',
|
|
930
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Din adgangskode er blevet ændret. Du kan nu logge ind med din nye adgangskode.',
|
|
931
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Dette link er udløbet eller ugyldigt.',
|
|
932
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Du kan anmode om en ny adgangskode ved at klikke på knappen nedenfor.',
|
|
933
|
+
RECEIVED_REQUEST: 'Din anmodning er modtaget',
|
|
934
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Din konto er nu aktiv. Klik nedenfor for at logge ind med dine oplysninger.'
|
|
935
|
+
};
|
|
865
936
|
var QSM$f = {
|
|
866
937
|
DEPARTURE: 'Afgang',
|
|
867
938
|
CHOOSE_DEPARTURE: 'Vælg afgang',
|
|
@@ -964,6 +1035,7 @@ var daJson = {
|
|
|
964
1035
|
ERROR: ERROR$e,
|
|
965
1036
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$e,
|
|
966
1037
|
NAVBAR: NAVBAR$e,
|
|
1038
|
+
LOGIN: LOGIN$e,
|
|
967
1039
|
QSM: QSM$f,
|
|
968
1040
|
SRP: SRP$e
|
|
969
1041
|
};
|
|
@@ -1071,6 +1143,8 @@ var SIDEBAR$d = {
|
|
|
1071
1143
|
TRAVELERS_ADULT: 'Erwachsener',
|
|
1072
1144
|
TRAVELERS_CHILDREN: 'Kinder',
|
|
1073
1145
|
TRAVELERS_CHILD: 'Kind',
|
|
1146
|
+
TRAVELERS_INFANTS: 'Babys',
|
|
1147
|
+
TRAVELERS_INFANT: 'Baby',
|
|
1074
1148
|
DEPARTURE: 'Hinflug',
|
|
1075
1149
|
DEPARTURE_SINGLE: 'Datum',
|
|
1076
1150
|
ARRIVAL: 'Rückflug',
|
|
@@ -1225,6 +1299,39 @@ var PRINT_OFFER_BUTTON$d = {
|
|
|
1225
1299
|
var NAVBAR$d = {
|
|
1226
1300
|
SEARCH: 'Suche'
|
|
1227
1301
|
};
|
|
1302
|
+
var LOGIN$d = {
|
|
1303
|
+
LOGIN_INTO: 'Melden Sie sich in Ihrem Konto an',
|
|
1304
|
+
EMAIL: 'E-Mail',
|
|
1305
|
+
ENTER_YOUR_EMAIL: 'Geben Sie Ihre E-Mail ein',
|
|
1306
|
+
EMAIL_REQUIRED: 'E-Mail ist erforderlich.',
|
|
1307
|
+
EMAIL_INVALID: 'Die E-Mail ist ungültig.',
|
|
1308
|
+
ENTER_VALID_EMAIL: 'Geben Sie eine gültige E-Mail ein.',
|
|
1309
|
+
PASSWORD: 'Passwort',
|
|
1310
|
+
ENTER_YOUR_PASSWORD: 'Geben Sie Ihr Passwort ein',
|
|
1311
|
+
RESET_PASSWORD_LABEL: 'Neues Passwort',
|
|
1312
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Passwort wiederholen',
|
|
1313
|
+
PASSWORD_REQUIRED: 'Passwort ist erforderlich.',
|
|
1314
|
+
INVALID_CREDENTIALS: 'Ungültige E-Mail oder Passwort.',
|
|
1315
|
+
LOGIN: 'Anmelden',
|
|
1316
|
+
LOGOUT: 'Abmelden',
|
|
1317
|
+
FORGOT_PASSWORD: 'Passwort vergessen?',
|
|
1318
|
+
LOGGING_IN: 'Anmeldung läuft...',
|
|
1319
|
+
WELCOME_X: 'Willkommen, ',
|
|
1320
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Passwort zurücksetzen',
|
|
1321
|
+
RESET_REQUESTED: 'Passwort-Zurücksetzung angefordert',
|
|
1322
|
+
BACK_TO_HOMEPAGE: 'Zurück zur Startseite',
|
|
1323
|
+
BACK_TO_LOGIN: 'Zurück zum Login',
|
|
1324
|
+
RESET_PASSWORD_TITLE: 'Passwort zurücksetzen',
|
|
1325
|
+
PASSWORD_COMPLEXITY: 'Das Passwort muss mindestens 1 Zahl und 1 Großbuchstaben enthalten',
|
|
1326
|
+
REPEAT_PASSWORD_REQUIRED: 'Bitte wiederholen Sie Ihr Passwort.',
|
|
1327
|
+
PASSWORDS_DO_NOT_MATCH: 'Passwörter stimmen nicht überein.',
|
|
1328
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Passwort ändern',
|
|
1329
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Ihr Passwort wurde geändert. Sie können sich nun mit Ihrem neuen Passwort anmelden.',
|
|
1330
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Dieser Link ist abgelaufen oder ungültig.',
|
|
1331
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Sie können ein neues Passwort anfordern, indem Sie auf die Schaltfläche unten klicken.',
|
|
1332
|
+
RECEIVED_REQUEST: 'Ihre Anfrage wurde erfolgreich erhalten',
|
|
1333
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Ihr Konto ist jetzt aktiv. Klicken Sie unten, um sich mit Ihren Daten anzumelden.'
|
|
1334
|
+
};
|
|
1228
1335
|
var QSM$e = {
|
|
1229
1336
|
DEPARTURE: 'Abflug',
|
|
1230
1337
|
CHOOSE_DEPARTURE: 'Abflug wählen',
|
|
@@ -1327,6 +1434,7 @@ var deJson = {
|
|
|
1327
1434
|
ERROR: ERROR$d,
|
|
1328
1435
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$d,
|
|
1329
1436
|
NAVBAR: NAVBAR$d,
|
|
1437
|
+
LOGIN: LOGIN$d,
|
|
1330
1438
|
QSM: QSM$e,
|
|
1331
1439
|
SRP: SRP$d
|
|
1332
1440
|
};
|
|
@@ -1434,6 +1542,8 @@ var SIDEBAR$c = {
|
|
|
1434
1542
|
TRAVELERS_ADULT: 'adult',
|
|
1435
1543
|
TRAVELERS_CHILDREN: 'children',
|
|
1436
1544
|
TRAVELERS_CHILD: 'child',
|
|
1545
|
+
TRAVELERS_INFANTS: 'babies',
|
|
1546
|
+
TRAVELERS_INFANT: 'baby',
|
|
1437
1547
|
DEPARTURE: 'Outbound',
|
|
1438
1548
|
DEPARTURE_SINGLE: 'Date',
|
|
1439
1549
|
ARRIVAL: 'Return',
|
|
@@ -1591,6 +1701,39 @@ var PRINT_OFFER_BUTTON$c = {
|
|
|
1591
1701
|
var NAVBAR$c = {
|
|
1592
1702
|
SEARCH: 'Search'
|
|
1593
1703
|
};
|
|
1704
|
+
var LOGIN$c = {
|
|
1705
|
+
LOGIN_INTO: 'Login to you account',
|
|
1706
|
+
EMAIL: 'Email',
|
|
1707
|
+
ENTER_YOUR_EMAIL: 'Enter your email',
|
|
1708
|
+
EMAIL_REQUIRED: 'Email is required.',
|
|
1709
|
+
EMAIL_INVALID: 'Email is invalid.',
|
|
1710
|
+
ENTER_VALID_EMAIL: 'Enter a valid email.',
|
|
1711
|
+
PASSWORD: 'Password',
|
|
1712
|
+
ENTER_YOUR_PASSWORD: 'Enter your password',
|
|
1713
|
+
RESET_PASSWORD_LABEL: 'New password',
|
|
1714
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Repeat password',
|
|
1715
|
+
PASSWORD_REQUIRED: 'Password is required.',
|
|
1716
|
+
INVALID_CREDENTIALS: 'Invalid email or password.',
|
|
1717
|
+
LOGIN: 'Login',
|
|
1718
|
+
LOGOUT: 'Logout',
|
|
1719
|
+
FORGOT_PASSWORD: 'Forgot password?',
|
|
1720
|
+
LOGGING_IN: 'Logging in...',
|
|
1721
|
+
WELCOME_X: 'Welcome, ',
|
|
1722
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Reset password',
|
|
1723
|
+
RESET_REQUESTED: 'Password reset requested',
|
|
1724
|
+
BACK_TO_HOMEPAGE: 'Back to homepage',
|
|
1725
|
+
BACK_TO_LOGIN: 'Back to login',
|
|
1726
|
+
RESET_PASSWORD_TITLE: 'Reset password',
|
|
1727
|
+
PASSWORD_COMPLEXITY: 'Password must contain at least 1 number and 1 capital letter',
|
|
1728
|
+
REPEAT_PASSWORD_REQUIRED: 'Please repeat your password.',
|
|
1729
|
+
PASSWORDS_DO_NOT_MATCH: 'Passwords do not match.',
|
|
1730
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Modify password',
|
|
1731
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Your password has been changed. You can now log in with your new password.',
|
|
1732
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'This link has expired or is invalid.',
|
|
1733
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'You can request a new password by clicking the button below.',
|
|
1734
|
+
RECEIVED_REQUEST: 'Your request has been well received',
|
|
1735
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Your account is now active. Click below to log in with your details.'
|
|
1736
|
+
};
|
|
1594
1737
|
var QSM$d = {
|
|
1595
1738
|
DEPARTURE: 'Departure',
|
|
1596
1739
|
CHOOSE_DEPARTURE: 'Choose Departure',
|
|
@@ -1693,6 +1836,7 @@ var enJson = {
|
|
|
1693
1836
|
ERROR: ERROR$c,
|
|
1694
1837
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$c,
|
|
1695
1838
|
NAVBAR: NAVBAR$c,
|
|
1839
|
+
LOGIN: LOGIN$c,
|
|
1696
1840
|
QSM: QSM$d,
|
|
1697
1841
|
SRP: SRP$c
|
|
1698
1842
|
};
|
|
@@ -1800,6 +1944,8 @@ var SIDEBAR$b = {
|
|
|
1800
1944
|
TRAVELERS_ADULT: 'adulto',
|
|
1801
1945
|
TRAVELERS_CHILDREN: 'niños',
|
|
1802
1946
|
TRAVELERS_CHILD: 'niño',
|
|
1947
|
+
TRAVELERS_INFANTS: 'bebés',
|
|
1948
|
+
TRAVELERS_INFANT: 'bebé',
|
|
1803
1949
|
DEPARTURE: 'Ida',
|
|
1804
1950
|
DEPARTURE_SINGLE: 'Fecha',
|
|
1805
1951
|
ARRIVAL: 'Vuelta',
|
|
@@ -1954,6 +2100,39 @@ var PRINT_OFFER_BUTTON$b = {
|
|
|
1954
2100
|
var NAVBAR$b = {
|
|
1955
2101
|
SEARCH: 'Buscar'
|
|
1956
2102
|
};
|
|
2103
|
+
var LOGIN$b = {
|
|
2104
|
+
LOGIN_INTO: 'Inicia sesión en tu cuenta',
|
|
2105
|
+
EMAIL: 'Correo electrónico',
|
|
2106
|
+
ENTER_YOUR_EMAIL: 'Introduce tu correo electrónico',
|
|
2107
|
+
EMAIL_REQUIRED: 'El correo electrónico es obligatorio.',
|
|
2108
|
+
EMAIL_INVALID: 'El correo electrónico no es válido.',
|
|
2109
|
+
ENTER_VALID_EMAIL: 'Introduce un correo electrónico válido.',
|
|
2110
|
+
PASSWORD: 'Contraseña',
|
|
2111
|
+
ENTER_YOUR_PASSWORD: 'Introduce tu contraseña',
|
|
2112
|
+
RESET_PASSWORD_LABEL: 'Nueva contraseña',
|
|
2113
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Repetir contraseña',
|
|
2114
|
+
PASSWORD_REQUIRED: 'La contraseña es obligatoria.',
|
|
2115
|
+
INVALID_CREDENTIALS: 'Correo electrónico o contraseña no válidos.',
|
|
2116
|
+
LOGIN: 'Iniciar sesión',
|
|
2117
|
+
LOGOUT: 'Cerrar sesión',
|
|
2118
|
+
FORGOT_PASSWORD: '¿Olvidaste tu contraseña?',
|
|
2119
|
+
LOGGING_IN: 'Iniciando sesión...',
|
|
2120
|
+
WELCOME_X: 'Bienvenido, ',
|
|
2121
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Restablecer contraseña',
|
|
2122
|
+
RESET_REQUESTED: 'Solicitud de restablecimiento de contraseña enviada',
|
|
2123
|
+
BACK_TO_HOMEPAGE: 'Volver a la página principal',
|
|
2124
|
+
BACK_TO_LOGIN: 'Volver al inicio de sesión',
|
|
2125
|
+
RESET_PASSWORD_TITLE: 'Restablecer contraseña',
|
|
2126
|
+
PASSWORD_COMPLEXITY: 'La contraseña debe contener al menos 1 número y 1 letra mayúscula',
|
|
2127
|
+
REPEAT_PASSWORD_REQUIRED: 'Por favor repite tu contraseña.',
|
|
2128
|
+
PASSWORDS_DO_NOT_MATCH: 'Las contraseñas no coinciden.',
|
|
2129
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Modificar contraseña',
|
|
2130
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Tu contraseña ha sido cambiada. Ahora puedes iniciar sesión con tu nueva contraseña.',
|
|
2131
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Este enlace ha expirado o no es válido.',
|
|
2132
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Puedes solicitar una nueva contraseña haciendo clic en el botón de abajo.',
|
|
2133
|
+
RECEIVED_REQUEST: 'Tu solicitud ha sido recibida correctamente',
|
|
2134
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Tu cuenta ahora está activa. Haz clic abajo para iniciar sesión con tus datos.'
|
|
2135
|
+
};
|
|
1957
2136
|
var QSM$c = {
|
|
1958
2137
|
DEPARTURE: 'Salida',
|
|
1959
2138
|
CHOOSE_DEPARTURE: 'Elegir salida',
|
|
@@ -2056,6 +2235,7 @@ var esJson = {
|
|
|
2056
2235
|
ERROR: ERROR$b,
|
|
2057
2236
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$b,
|
|
2058
2237
|
NAVBAR: NAVBAR$b,
|
|
2238
|
+
LOGIN: LOGIN$b,
|
|
2059
2239
|
QSM: QSM$c,
|
|
2060
2240
|
SRP: SRP$b
|
|
2061
2241
|
};
|
|
@@ -2163,6 +2343,8 @@ var SIDEBAR$a = {
|
|
|
2163
2343
|
TRAVELERS_ADULT: 'adulte',
|
|
2164
2344
|
TRAVELERS_CHILDREN: 'enfants',
|
|
2165
2345
|
TRAVELERS_CHILD: 'enfant',
|
|
2346
|
+
TRAVELERS_INFANTS: 'bébés',
|
|
2347
|
+
TRAVELERS_INFANT: 'bébé',
|
|
2166
2348
|
DEPARTURE: 'Aller',
|
|
2167
2349
|
DEPARTURE_SINGLE: 'Date',
|
|
2168
2350
|
ARRIVAL: 'Retour',
|
|
@@ -2321,369 +2503,438 @@ var PRINT_OFFER_BUTTON$a = {
|
|
|
2321
2503
|
var NAVBAR$a = {
|
|
2322
2504
|
SEARCH: 'Rechercher'
|
|
2323
2505
|
};
|
|
2324
|
-
var
|
|
2325
|
-
|
|
2326
|
-
CHOOSE_DEPARTURE: 'Choisir le départ',
|
|
2327
|
-
DESTINATION: 'Destination',
|
|
2328
|
-
CHOOSE_DESTINATION: 'Choisir une destination',
|
|
2329
|
-
ONEWAY: 'Aller simple',
|
|
2330
|
-
ROUNDTRIP: 'Aller-retour',
|
|
2331
|
-
OPENJAW: 'Open-jaw',
|
|
2332
|
-
MULTIDESTINATION: 'Multi-destinations',
|
|
2333
|
-
PACKAGES: 'Forfaits',
|
|
2334
|
-
TRANSPORT_HOTEL: 'Transport + hôtel',
|
|
2335
|
-
ACCOMMODATION: 'Hébergement',
|
|
2336
|
-
TRANSPORTS: 'Transports',
|
|
2337
|
-
TICKET_ONLY: 'Billet uniquement',
|
|
2338
|
-
RENT_A_CAR: 'Location de voiture',
|
|
2339
|
-
TRANSFERS: 'Transferts',
|
|
2340
|
-
CRUISES: 'Croisières',
|
|
2341
|
-
ONE_ACCOMMODATION: 'Un hébergement',
|
|
2342
|
-
MULTIPLE_ACCOMMODATIONS: 'Plusieurs hébergements',
|
|
2343
|
-
TRAVEL_CLASS_LABEL: 'Classe de voyage',
|
|
2344
|
-
TRAVEL_CLASS_PLACEHOLDER: 'Sélectionnez la classe',
|
|
2345
|
-
TRAVEL_TYPE_LABEL: 'Type de voyage',
|
|
2346
|
-
TRAVEL_TYPE_PLACEHOLDER: 'Sélectionnez le type de voyage',
|
|
2347
|
-
NATIONALITY_LABEL: 'Nationalité',
|
|
2348
|
-
NATIONALITY_PLACEHOLDER: 'Sélectionnez la nationalité',
|
|
2349
|
-
TRAVELERS_LABEL: 'Qui voyage ?',
|
|
2350
|
-
ADD_ROOM: 'Ajouter une chambre',
|
|
2351
|
-
REMOVE_ROOM: 'Supprimer la chambre',
|
|
2352
|
-
MAX_TRAVELERS_REACHED: 'Vous avez atteint le nombre maximum de voyageurs',
|
|
2353
|
-
ADULTS: 'Adultes',
|
|
2354
|
-
CHILDREN: 'Enfants',
|
|
2355
|
-
BABIES: 'Bébés',
|
|
2356
|
-
CHOOSE_DATES: 'Choisir les dates',
|
|
2357
|
-
DEPARTURE_DATE: 'Date de départ',
|
|
2358
|
-
RETURN_DATE: 'Date de retour',
|
|
2359
|
-
CONFIRM: 'Confirmer',
|
|
2360
|
-
TRAVELERS: 'Voyageurs'
|
|
2361
|
-
};
|
|
2362
|
-
var SRP$a = {
|
|
2363
|
-
NO_RESULTS: 'Aucun résultat trouvé.',
|
|
2364
|
-
TOTAL_RESULTS_LABEL: 'Forfaits trouvés',
|
|
2365
|
-
RESET: 'Réinitialiser',
|
|
2366
|
-
LUGGAGEINCLUDED: 'Bagages inclus',
|
|
2367
|
-
CANCEL: 'Annuler',
|
|
2368
|
-
APPLY: 'Appliquer',
|
|
2369
|
-
LOADING: 'Chargement...',
|
|
2370
|
-
SEARCHRESULTCTA: 'Voir les détails',
|
|
2371
|
-
SORTBY: 'Trier par',
|
|
2372
|
-
PRICE_ASC: 'Prix (croissant)',
|
|
2373
|
-
PRICE_DESC: 'Prix (décroissant)',
|
|
2374
|
-
DEPARTURE_TIME_ASC: 'Heure de départ croissante',
|
|
2375
|
-
DEPARTURE_TIME_DESC: 'Heure de départ décroissante',
|
|
2376
|
-
DURATION_ASC: 'Durée croissante',
|
|
2377
|
-
DURATION_DESC: 'Durée décroissante',
|
|
2378
|
-
DEPARTURE_ASC: 'Date de départ (la plus proche d’abord)',
|
|
2379
|
-
FILTERS: 'Filtres',
|
|
2380
|
-
SHOW_ITINERARY: 'Afficher l’itinéraire',
|
|
2381
|
-
ITINERARY_TITLE: 'Résumé de votre voyage',
|
|
2382
|
-
DOSSIER_NUMBER: 'Numéro de dossier',
|
|
2383
|
-
PACKAGE_PRICE_PER_PERSON: 'prix du forfait par personne',
|
|
2384
|
-
TOTAL: 'total',
|
|
2385
|
-
DAY_BY_DAY: 'Votre voyage jour par jour',
|
|
2386
|
-
START: 'début',
|
|
2387
|
-
END: 'fin',
|
|
2388
|
-
EXTENDED: 'Étendu',
|
|
2389
|
-
COMPACT: 'Compact',
|
|
2390
|
-
LIST: 'Liste',
|
|
2391
|
-
SELECT: 'Sélectionner',
|
|
2392
|
-
DEPARTURE: 'Départ',
|
|
2393
|
-
RETURN: 'Retour',
|
|
2394
|
-
DIRECT: 'Direct',
|
|
2395
|
-
STOPS: 'escales',
|
|
2396
|
-
STOP: 'escale',
|
|
2397
|
-
STOP_TIME: 'Temps d’escale',
|
|
2398
|
-
ACCOMMODATION: 'Hébergement',
|
|
2399
|
-
VIEW_DETAILS: 'Voir les détails',
|
|
2400
|
-
NIGHTS: 'nuits',
|
|
2401
|
-
MORNING_RANGE: 'Matin',
|
|
2402
|
-
AFTERNOON_RANGE: 'Après-midi',
|
|
2403
|
-
EVENING_RANGE: 'Soir',
|
|
2404
|
-
NIGHT_RANGE: 'Nuit',
|
|
2405
|
-
DEPARTURE_RANGE: 'Plage de départ',
|
|
2406
|
-
DEPARTURE_AIRPORTS: 'Aéroports de départ',
|
|
2407
|
-
ARRIVAL_AIRPORTS: 'Aéroports d’arrivée',
|
|
2408
|
-
PRICE: 'Prix'
|
|
2409
|
-
};
|
|
2410
|
-
var frBeJson = {
|
|
2411
|
-
STEPS: STEPS$a,
|
|
2412
|
-
INPUT: INPUT$a,
|
|
2413
|
-
FLIGHTS_FORM: FLIGHTS_FORM$a,
|
|
2414
|
-
PRODUCT: PRODUCT$a,
|
|
2415
|
-
MAIN: MAIN$a,
|
|
2416
|
-
SHARED: SHARED$a,
|
|
2417
|
-
SIDEBAR: SIDEBAR$a,
|
|
2418
|
-
TRAVELERS_FORM: TRAVELERS_FORM$a,
|
|
2419
|
-
OPTIONS_FORM: OPTIONS_FORM$a,
|
|
2420
|
-
ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM$a,
|
|
2421
|
-
SUMMARY: SUMMARY$a,
|
|
2422
|
-
CONFIRMATION: CONFIRMATION$a,
|
|
2423
|
-
ERROR: ERROR$a,
|
|
2424
|
-
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$a,
|
|
2425
|
-
NAVBAR: NAVBAR$a,
|
|
2426
|
-
QSM: QSM$b,
|
|
2427
|
-
SRP: SRP$a
|
|
2428
|
-
};
|
|
2429
|
-
|
|
2430
|
-
var STEPS$9 = {
|
|
2431
|
-
PERSONAL_DETAILS: 'Informations personnelles',
|
|
2432
|
-
EXTRA_OPTIONS: 'Options supplémentaires',
|
|
2433
|
-
SUMMARY: 'Résumé',
|
|
2434
|
-
CONFIRMATION: 'Confirmation',
|
|
2435
|
-
ERROR: 'Réservation échouée',
|
|
2436
|
-
PREVIOUS: 'Étape précédente',
|
|
2437
|
-
NEXT: 'Étape suivante',
|
|
2438
|
-
SUBMIT_BOOKING: 'Confirmer la réservation',
|
|
2439
|
-
SUBMIT_OFFER: 'Demander un devis',
|
|
2440
|
-
SUBMIT_OPTION: 'Prendre une option',
|
|
2441
|
-
COMPOSE: 'Rédiger',
|
|
2442
|
-
ROOM_OPTIONS: 'Options de chambre',
|
|
2443
|
-
FLIGHT_OPTIONS: 'Options de vol'
|
|
2444
|
-
};
|
|
2445
|
-
var INPUT$9 = {
|
|
2446
|
-
INCREASE: 'Augmenter',
|
|
2447
|
-
DECREASE: 'Diminuer'
|
|
2448
|
-
};
|
|
2449
|
-
var FLIGHTS_FORM$9 = {
|
|
2450
|
-
OUTWARD_FLIGHTS: 'Vols aller',
|
|
2451
|
-
OUTWARD_FLIGHT: 'Vol aller',
|
|
2452
|
-
RETURN_FLIGHTS: 'Vols retour',
|
|
2453
|
-
RETURN_FLIGHT: 'Vol retour',
|
|
2454
|
-
DIRECT_FLIGHT: 'Vol direct',
|
|
2455
|
-
STOP: 'escale',
|
|
2456
|
-
STOPS: 'escales',
|
|
2457
|
-
FLIGHT_STOPS: 'escale(s)',
|
|
2458
|
-
DIFFERENT_OPTION_WARNING: 'Attention : Ce vol modifie la durée du séjour.',
|
|
2459
|
-
FILTER_OPTIONS: 'Filtrer les options',
|
|
2460
|
-
AIRLINES: 'Compagnies aériennes',
|
|
2461
|
-
AIRPORTS: 'Aéroports',
|
|
2462
|
-
NUMBER_OF_STOPS: "Nombre d'escales",
|
|
2463
|
-
FLIGHT_OUTWARD: 'Vol aller',
|
|
2464
|
-
DEPARTURE_TIME: 'Heure de départ',
|
|
2465
|
-
TRAVEL_DURATION: 'Durée du voyage',
|
|
2466
|
-
CHANGE_TIME: 'Temps de correspondance',
|
|
2467
|
-
FLIGHT_RETURN: 'Vol retour',
|
|
2468
|
-
NO_FLIGHTS_FOUND: 'Aucun vol trouvé.',
|
|
2469
|
-
STARTING: 'À partir de',
|
|
2470
|
-
LOWEST_PRICE: 'Prix le plus bas',
|
|
2471
|
-
CHOOSE_YOUR_CLASS: 'Choisissez votre classe :',
|
|
2472
|
-
PLUS_ONE_DAY: '+1 jour',
|
|
2473
|
-
STOP_TIME: 'Temps de correspondance',
|
|
2474
|
-
NIGHT_DEPARTURE: 'Nuit (00:00 - 05:00)',
|
|
2475
|
-
MORNING_DEPARTURE: 'Matin (05:00 - 12:00)',
|
|
2476
|
-
AFTERNOON_DEPARTURE: 'Après-midi (12:00 - 18:00)',
|
|
2477
|
-
EVENING_DEPARTURE: 'Soir (18:00 - 00:00)',
|
|
2478
|
-
FLIGHTS_FOUND_1: '',
|
|
2479
|
-
FLIGHTS_FOUND_2: 'vols',
|
|
2480
|
-
FLIGHTS_FOUND_3: 'trouvés'
|
|
2481
|
-
};
|
|
2482
|
-
var PRODUCT$9 = {
|
|
2483
|
-
STAY_INCLUDED: 'Séjour inclus',
|
|
2484
|
-
FLIGHT_INCLUDED: 'Vol inclus',
|
|
2485
|
-
TRANSFER_INCLUDED: 'Transfert inclus',
|
|
2486
|
-
LOADING_PRICE: 'Votre prix est en cours de calcul.',
|
|
2487
|
-
PER_PERSON: 'Par personne',
|
|
2488
|
-
PER_NIGHT: 'Par nuit',
|
|
2489
|
-
PER_PERSON_PER_NIGHT: 'Par personne / par nuit',
|
|
2490
|
-
BOOK_NOW: 'Réservez maintenant',
|
|
2491
|
-
TO_YOUR_OFFER: 'Vers votre devis',
|
|
2492
|
-
NOT_AVAILABLE: 'Indisponible',
|
|
2493
|
-
NUMBER_OF_ROOMS: 'Nombre de chambres',
|
|
2494
|
-
AGE_BY_DEPARTURE_DATE: 'Âge des enfants à la date de départ',
|
|
2495
|
-
YEAR: 'An(s)',
|
|
2496
|
-
APPLY: 'Appliquer',
|
|
2497
|
-
EDIT: 'Modifier',
|
|
2498
|
-
DEPARTURE: 'Départ',
|
|
2499
|
-
DEPARTURE_DATE: 'Date de départ',
|
|
2500
|
-
RETURN: 'Retour',
|
|
2501
|
-
RETURN_DATE: 'Date de retour',
|
|
2502
|
-
WHO_YOU_TRAVELING_WITH: 'Avec qui voyagez-vous ?',
|
|
2503
|
-
TRAVEL_PERIOD: 'Période de voyage',
|
|
2504
|
-
CLOSE: 'Fermer',
|
|
2505
|
-
NIGHTS: 'nuits',
|
|
2506
|
-
DAYS: 'jours'
|
|
2507
|
-
};
|
|
2508
|
-
var MAIN$9 = {
|
|
2509
|
-
PREPARING_BOOKING: 'Veuillez patienter, nous préparons votre réservation',
|
|
2510
|
-
PREPARING_OFFER: 'Veuillez patienter, nous préparons votre devis',
|
|
2511
|
-
PREPARING_DOSSIER: 'Veuillez patienter, nous préparons votre dossier',
|
|
2512
|
-
PRODUCT_UNAVAILABLE: 'Produit non disponible'
|
|
2513
|
-
};
|
|
2514
|
-
var SHARED$9 = {
|
|
2515
|
-
ROOM: 'Chambre',
|
|
2516
|
-
ROOMS: 'Chambres',
|
|
2517
|
-
TOTAL_PRICE: 'Prix total',
|
|
2518
|
-
ADULTS: 'Adultes',
|
|
2519
|
-
CHILDREN: 'Enfants',
|
|
2520
|
-
SELECT: 'Sélectionner',
|
|
2521
|
-
SELECTED: 'Sélectionné'
|
|
2522
|
-
};
|
|
2523
|
-
var SIDEBAR$9 = {
|
|
2524
|
-
OVERVIEW: 'Résumé',
|
|
2525
|
-
SLIDE_TOTAL_PRICE: 'Montant total : ',
|
|
2526
|
-
SLIDE_DEPOSIT: 'Acompte à payer : ',
|
|
2527
|
-
TRAVEL_INFO: 'Informations voyage',
|
|
2528
|
-
TRAVELERS: 'Voyageurs',
|
|
2529
|
-
TRAVELERS_ADULTS: 'adultes',
|
|
2530
|
-
TRAVELERS_ADULT: 'adulte',
|
|
2531
|
-
TRAVELERS_CHILDREN: 'enfants',
|
|
2532
|
-
TRAVELERS_CHILD: 'enfant',
|
|
2533
|
-
DEPARTURE: 'Aller',
|
|
2534
|
-
DEPARTURE_SINGLE: 'Date',
|
|
2535
|
-
ARRIVAL: 'Retour',
|
|
2536
|
-
FLIGHT: 'Vol',
|
|
2537
|
-
ACCOMMODATION: 'Hébergement réservé',
|
|
2538
|
-
BASE_PRICE: 'Prix de base',
|
|
2539
|
-
OPTIONS: 'Options',
|
|
2540
|
-
INCLUDED_COSTS: 'Coûts inclus',
|
|
2541
|
-
EXTRA_COSTS: 'Coûts supplémentaires',
|
|
2542
|
-
DEPOSIT: 'Acompte à payer',
|
|
2543
|
-
DEPOSIT_TEXT1: 'Les étapes pour le ',
|
|
2544
|
-
DEPOSIT_TEXT2: 'solde restant',
|
|
2545
|
-
DEPOSIT_TEXT3: ' de ',
|
|
2546
|
-
DEPOSIT_TEXT4: ' sont décrites dans ',
|
|
2547
|
-
DEPOSIT_TEXT5: "l'étape « Résumé »",
|
|
2548
|
-
DEPOSIT_TEXT6: ' du processus de réservation.',
|
|
2549
|
-
LUGGAGE_INCLUDED: 'Bagages inclus',
|
|
2550
|
-
DEPARTURE_FLIGHT: 'Vol aller',
|
|
2551
|
-
ARRIVAL_FLIGHT: 'Vol retour',
|
|
2552
|
-
FLIGHT_DEPARTURE: 'Départ',
|
|
2553
|
-
FLIGHT_ARRIVAL: 'Arrivée',
|
|
2554
|
-
ON_REQUEST: 'Sur demande',
|
|
2555
|
-
CHANGES: 'transferts'
|
|
2556
|
-
};
|
|
2557
|
-
var TRAVELERS_FORM$9 = {
|
|
2558
|
-
AGE: 'Âge',
|
|
2559
|
-
TRAVELER: 'Voyageur',
|
|
2560
|
-
ADULT: 'adulte',
|
|
2561
|
-
ADULTS: 'adultes',
|
|
2562
|
-
CHILD: 'enfant',
|
|
2563
|
-
CHILDREN: 'enfants',
|
|
2564
|
-
GENDER: 'Civilité',
|
|
2565
|
-
GENDER_ID: "Sexe selon passeport/carte d'identité",
|
|
2566
|
-
MALE: 'M.',
|
|
2567
|
-
MALE_GENDER: 'Homme',
|
|
2568
|
-
FEMALE: 'Mme',
|
|
2569
|
-
FEMALE_GENDER: 'Femme',
|
|
2570
|
-
OTHER: 'Autre',
|
|
2571
|
-
MAIN_BOOKER: 'Titulaire de la réservation',
|
|
2572
|
-
FIRST_NAME: 'Prénom',
|
|
2573
|
-
LAST_NAME: 'Nom',
|
|
2574
|
-
BIRTHDATE: 'Date de naissance',
|
|
2575
|
-
STREET: 'Rue',
|
|
2576
|
-
STREET_PLACEHOLDER: 'Votre rue',
|
|
2577
|
-
HOUSE_NUMBER: 'Numéro',
|
|
2578
|
-
POST_BOX: 'Boîte postale',
|
|
2579
|
-
ZIPCODE: 'Code postal',
|
|
2580
|
-
CITY: 'Ville',
|
|
2581
|
-
CITY_PLACEHOLDER: 'Ville',
|
|
2582
|
-
COUNTRY: 'Pays',
|
|
2583
|
-
SELECT_COUNTRY: 'Sélectionner le pays',
|
|
2584
|
-
PHONE: 'Téléphone',
|
|
2506
|
+
var LOGIN$a = {
|
|
2507
|
+
LOGIN_INTO: 'Connectez-vous à votre compte',
|
|
2585
2508
|
EMAIL: 'Email',
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2509
|
+
ENTER_YOUR_EMAIL: 'Entrez votre email',
|
|
2510
|
+
EMAIL_REQUIRED: 'L’email est requis.',
|
|
2511
|
+
EMAIL_INVALID: 'L’email est invalide.',
|
|
2512
|
+
ENTER_VALID_EMAIL: 'Entrez un email valide.',
|
|
2513
|
+
PASSWORD: 'Mot de passe',
|
|
2514
|
+
ENTER_YOUR_PASSWORD: 'Entrez votre mot de passe',
|
|
2515
|
+
RESET_PASSWORD_LABEL: 'Nouveau mot de passe',
|
|
2516
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Répéter le mot de passe',
|
|
2517
|
+
PASSWORD_REQUIRED: 'Le mot de passe est requis.',
|
|
2518
|
+
INVALID_CREDENTIALS: 'Email ou mot de passe invalide.',
|
|
2519
|
+
LOGIN: 'Se connecter',
|
|
2520
|
+
LOGOUT: 'Se déconnecter',
|
|
2521
|
+
FORGOT_PASSWORD: 'Mot de passe oublié ?',
|
|
2522
|
+
LOGGING_IN: 'Connexion...',
|
|
2523
|
+
WELCOME_X: 'Bienvenue, ',
|
|
2524
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Réinitialiser le mot de passe',
|
|
2525
|
+
RESET_REQUESTED: 'Demande de réinitialisation du mot de passe envoyée',
|
|
2526
|
+
BACK_TO_HOMEPAGE: 'Retour à la page d’accueil',
|
|
2527
|
+
BACK_TO_LOGIN: 'Retour à la connexion',
|
|
2528
|
+
RESET_PASSWORD_TITLE: 'Réinitialiser le mot de passe',
|
|
2529
|
+
PASSWORD_COMPLEXITY: 'Le mot de passe doit contenir au moins 1 chiffre et 1 lettre majuscule',
|
|
2530
|
+
REPEAT_PASSWORD_REQUIRED: 'Veuillez répéter votre mot de passe.',
|
|
2531
|
+
PASSWORDS_DO_NOT_MATCH: 'Les mots de passe ne correspondent pas.',
|
|
2532
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Modifier le mot de passe',
|
|
2533
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Votre mot de passe a été modifié. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.',
|
|
2534
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Ce lien a expiré ou est invalide.',
|
|
2535
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Vous pouvez demander un nouveau mot de passe en cliquant sur le bouton ci-dessous.',
|
|
2536
|
+
RECEIVED_REQUEST: 'Votre demande a bien été reçue',
|
|
2537
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Votre compte est maintenant actif. Cliquez ci-dessous pour vous connecter avec vos informations.'
|
|
2610
2538
|
};
|
|
2611
|
-
var
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2539
|
+
var QSM$b = {
|
|
2540
|
+
DEPARTURE: 'Départ',
|
|
2541
|
+
CHOOSE_DEPARTURE: 'Choisir le départ',
|
|
2542
|
+
DESTINATION: 'Destination',
|
|
2543
|
+
CHOOSE_DESTINATION: 'Choisir une destination',
|
|
2544
|
+
ONEWAY: 'Aller simple',
|
|
2545
|
+
ROUNDTRIP: 'Aller-retour',
|
|
2546
|
+
OPENJAW: 'Open-jaw',
|
|
2547
|
+
MULTIDESTINATION: 'Multi-destinations',
|
|
2548
|
+
PACKAGES: 'Forfaits',
|
|
2549
|
+
TRANSPORT_HOTEL: 'Transport + hôtel',
|
|
2550
|
+
ACCOMMODATION: 'Hébergement',
|
|
2551
|
+
TRANSPORTS: 'Transports',
|
|
2552
|
+
TICKET_ONLY: 'Billet uniquement',
|
|
2553
|
+
RENT_A_CAR: 'Location de voiture',
|
|
2554
|
+
TRANSFERS: 'Transferts',
|
|
2555
|
+
CRUISES: 'Croisières',
|
|
2556
|
+
ONE_ACCOMMODATION: 'Un hébergement',
|
|
2557
|
+
MULTIPLE_ACCOMMODATIONS: 'Plusieurs hébergements',
|
|
2558
|
+
TRAVEL_CLASS_LABEL: 'Classe de voyage',
|
|
2559
|
+
TRAVEL_CLASS_PLACEHOLDER: 'Sélectionnez la classe',
|
|
2560
|
+
TRAVEL_TYPE_LABEL: 'Type de voyage',
|
|
2561
|
+
TRAVEL_TYPE_PLACEHOLDER: 'Sélectionnez le type de voyage',
|
|
2562
|
+
NATIONALITY_LABEL: 'Nationalité',
|
|
2563
|
+
NATIONALITY_PLACEHOLDER: 'Sélectionnez la nationalité',
|
|
2564
|
+
TRAVELERS_LABEL: 'Qui voyage ?',
|
|
2565
|
+
ADD_ROOM: 'Ajouter une chambre',
|
|
2566
|
+
REMOVE_ROOM: 'Supprimer la chambre',
|
|
2567
|
+
MAX_TRAVELERS_REACHED: 'Vous avez atteint le nombre maximum de voyageurs',
|
|
2568
|
+
ADULTS: 'Adultes',
|
|
2569
|
+
CHILDREN: 'Enfants',
|
|
2570
|
+
BABIES: 'Bébés',
|
|
2571
|
+
CHOOSE_DATES: 'Choisir les dates',
|
|
2572
|
+
DEPARTURE_DATE: 'Date de départ',
|
|
2573
|
+
RETURN_DATE: 'Date de retour',
|
|
2574
|
+
CONFIRM: 'Confirmer',
|
|
2575
|
+
TRAVELERS: 'Voyageurs'
|
|
2576
|
+
};
|
|
2577
|
+
var SRP$a = {
|
|
2578
|
+
NO_RESULTS: 'Aucun résultat trouvé.',
|
|
2579
|
+
TOTAL_RESULTS_LABEL: 'Forfaits trouvés',
|
|
2580
|
+
RESET: 'Réinitialiser',
|
|
2581
|
+
LUGGAGEINCLUDED: 'Bagages inclus',
|
|
2582
|
+
CANCEL: 'Annuler',
|
|
2583
|
+
APPLY: 'Appliquer',
|
|
2584
|
+
LOADING: 'Chargement...',
|
|
2585
|
+
SEARCHRESULTCTA: 'Voir les détails',
|
|
2586
|
+
SORTBY: 'Trier par',
|
|
2587
|
+
PRICE_ASC: 'Prix (croissant)',
|
|
2588
|
+
PRICE_DESC: 'Prix (décroissant)',
|
|
2589
|
+
DEPARTURE_TIME_ASC: 'Heure de départ croissante',
|
|
2590
|
+
DEPARTURE_TIME_DESC: 'Heure de départ décroissante',
|
|
2591
|
+
DURATION_ASC: 'Durée croissante',
|
|
2592
|
+
DURATION_DESC: 'Durée décroissante',
|
|
2593
|
+
DEPARTURE_ASC: 'Date de départ (la plus proche d’abord)',
|
|
2594
|
+
FILTERS: 'Filtres',
|
|
2595
|
+
SHOW_ITINERARY: 'Afficher l’itinéraire',
|
|
2596
|
+
ITINERARY_TITLE: 'Résumé de votre voyage',
|
|
2597
|
+
DOSSIER_NUMBER: 'Numéro de dossier',
|
|
2598
|
+
PACKAGE_PRICE_PER_PERSON: 'prix du forfait par personne',
|
|
2599
|
+
TOTAL: 'total',
|
|
2600
|
+
DAY_BY_DAY: 'Votre voyage jour par jour',
|
|
2601
|
+
START: 'début',
|
|
2602
|
+
END: 'fin',
|
|
2603
|
+
EXTENDED: 'Étendu',
|
|
2604
|
+
COMPACT: 'Compact',
|
|
2605
|
+
LIST: 'Liste',
|
|
2606
|
+
SELECT: 'Sélectionner',
|
|
2607
|
+
DEPARTURE: 'Départ',
|
|
2608
|
+
RETURN: 'Retour',
|
|
2609
|
+
DIRECT: 'Direct',
|
|
2610
|
+
STOPS: 'escales',
|
|
2611
|
+
STOP: 'escale',
|
|
2612
|
+
STOP_TIME: 'Temps d’escale',
|
|
2613
|
+
ACCOMMODATION: 'Hébergement',
|
|
2614
|
+
VIEW_DETAILS: 'Voir les détails',
|
|
2615
|
+
NIGHTS: 'nuits',
|
|
2616
|
+
MORNING_RANGE: 'Matin',
|
|
2617
|
+
AFTERNOON_RANGE: 'Après-midi',
|
|
2618
|
+
EVENING_RANGE: 'Soir',
|
|
2619
|
+
NIGHT_RANGE: 'Nuit',
|
|
2620
|
+
DEPARTURE_RANGE: 'Plage de départ',
|
|
2621
|
+
DEPARTURE_AIRPORTS: 'Aéroports de départ',
|
|
2622
|
+
ARRIVAL_AIRPORTS: 'Aéroports d’arrivée',
|
|
2623
|
+
PRICE: 'Prix'
|
|
2624
|
+
};
|
|
2625
|
+
var frBeJson = {
|
|
2626
|
+
STEPS: STEPS$a,
|
|
2627
|
+
INPUT: INPUT$a,
|
|
2628
|
+
FLIGHTS_FORM: FLIGHTS_FORM$a,
|
|
2629
|
+
PRODUCT: PRODUCT$a,
|
|
2630
|
+
MAIN: MAIN$a,
|
|
2631
|
+
SHARED: SHARED$a,
|
|
2632
|
+
SIDEBAR: SIDEBAR$a,
|
|
2633
|
+
TRAVELERS_FORM: TRAVELERS_FORM$a,
|
|
2634
|
+
OPTIONS_FORM: OPTIONS_FORM$a,
|
|
2635
|
+
ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM$a,
|
|
2636
|
+
SUMMARY: SUMMARY$a,
|
|
2637
|
+
CONFIRMATION: CONFIRMATION$a,
|
|
2638
|
+
ERROR: ERROR$a,
|
|
2639
|
+
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$a,
|
|
2640
|
+
NAVBAR: NAVBAR$a,
|
|
2641
|
+
LOGIN: LOGIN$a,
|
|
2642
|
+
QSM: QSM$b,
|
|
2643
|
+
SRP: SRP$a
|
|
2644
|
+
};
|
|
2645
|
+
|
|
2646
|
+
var STEPS$9 = {
|
|
2647
|
+
PERSONAL_DETAILS: 'Informations personnelles',
|
|
2648
|
+
EXTRA_OPTIONS: 'Options supplémentaires',
|
|
2649
|
+
SUMMARY: 'Résumé',
|
|
2650
|
+
CONFIRMATION: 'Confirmation',
|
|
2651
|
+
ERROR: 'Réservation échouée',
|
|
2652
|
+
PREVIOUS: 'Étape précédente',
|
|
2653
|
+
NEXT: 'Étape suivante',
|
|
2654
|
+
SUBMIT_BOOKING: 'Confirmer la réservation',
|
|
2655
|
+
SUBMIT_OFFER: 'Demander un devis',
|
|
2656
|
+
SUBMIT_OPTION: 'Prendre une option',
|
|
2657
|
+
COMPOSE: 'Rédiger',
|
|
2658
|
+
ROOM_OPTIONS: 'Options de chambre',
|
|
2659
|
+
FLIGHT_OPTIONS: 'Options de vol'
|
|
2660
|
+
};
|
|
2661
|
+
var INPUT$9 = {
|
|
2662
|
+
INCREASE: 'Augmenter',
|
|
2663
|
+
DECREASE: 'Diminuer'
|
|
2664
|
+
};
|
|
2665
|
+
var FLIGHTS_FORM$9 = {
|
|
2666
|
+
OUTWARD_FLIGHTS: 'Vols aller',
|
|
2667
|
+
OUTWARD_FLIGHT: 'Vol aller',
|
|
2668
|
+
RETURN_FLIGHTS: 'Vols retour',
|
|
2669
|
+
RETURN_FLIGHT: 'Vol retour',
|
|
2670
|
+
DIRECT_FLIGHT: 'Vol direct',
|
|
2671
|
+
STOP: 'escale',
|
|
2672
|
+
STOPS: 'escales',
|
|
2673
|
+
FLIGHT_STOPS: 'escale(s)',
|
|
2674
|
+
DIFFERENT_OPTION_WARNING: 'Attention : Ce vol modifie la durée du séjour.',
|
|
2675
|
+
FILTER_OPTIONS: 'Filtrer les options',
|
|
2676
|
+
AIRLINES: 'Compagnies aériennes',
|
|
2677
|
+
AIRPORTS: 'Aéroports',
|
|
2678
|
+
NUMBER_OF_STOPS: "Nombre d'escales",
|
|
2679
|
+
FLIGHT_OUTWARD: 'Vol aller',
|
|
2680
|
+
DEPARTURE_TIME: 'Heure de départ',
|
|
2681
|
+
TRAVEL_DURATION: 'Durée du voyage',
|
|
2682
|
+
CHANGE_TIME: 'Temps de correspondance',
|
|
2683
|
+
FLIGHT_RETURN: 'Vol retour',
|
|
2684
|
+
NO_FLIGHTS_FOUND: 'Aucun vol trouvé.',
|
|
2685
|
+
STARTING: 'À partir de',
|
|
2686
|
+
LOWEST_PRICE: 'Prix le plus bas',
|
|
2687
|
+
CHOOSE_YOUR_CLASS: 'Choisissez votre classe :',
|
|
2688
|
+
PLUS_ONE_DAY: '+1 jour',
|
|
2689
|
+
STOP_TIME: 'Temps de correspondance',
|
|
2690
|
+
NIGHT_DEPARTURE: 'Nuit (00:00 - 05:00)',
|
|
2691
|
+
MORNING_DEPARTURE: 'Matin (05:00 - 12:00)',
|
|
2692
|
+
AFTERNOON_DEPARTURE: 'Après-midi (12:00 - 18:00)',
|
|
2693
|
+
EVENING_DEPARTURE: 'Soir (18:00 - 00:00)',
|
|
2694
|
+
FLIGHTS_FOUND_1: '',
|
|
2695
|
+
FLIGHTS_FOUND_2: 'vols',
|
|
2696
|
+
FLIGHTS_FOUND_3: 'trouvés'
|
|
2697
|
+
};
|
|
2698
|
+
var PRODUCT$9 = {
|
|
2699
|
+
STAY_INCLUDED: 'Séjour inclus',
|
|
2700
|
+
FLIGHT_INCLUDED: 'Vol inclus',
|
|
2701
|
+
TRANSFER_INCLUDED: 'Transfert inclus',
|
|
2702
|
+
LOADING_PRICE: 'Votre prix est en cours de calcul.',
|
|
2703
|
+
PER_PERSON: 'Par personne',
|
|
2704
|
+
PER_NIGHT: 'Par nuit',
|
|
2705
|
+
PER_PERSON_PER_NIGHT: 'Par personne / par nuit',
|
|
2706
|
+
BOOK_NOW: 'Réservez maintenant',
|
|
2707
|
+
TO_YOUR_OFFER: 'Vers votre devis',
|
|
2708
|
+
NOT_AVAILABLE: 'Indisponible',
|
|
2709
|
+
NUMBER_OF_ROOMS: 'Nombre de chambres',
|
|
2710
|
+
AGE_BY_DEPARTURE_DATE: 'Âge des enfants à la date de départ',
|
|
2711
|
+
YEAR: 'An(s)',
|
|
2712
|
+
APPLY: 'Appliquer',
|
|
2713
|
+
EDIT: 'Modifier',
|
|
2714
|
+
DEPARTURE: 'Départ',
|
|
2715
|
+
DEPARTURE_DATE: 'Date de départ',
|
|
2716
|
+
RETURN: 'Retour',
|
|
2717
|
+
RETURN_DATE: 'Date de retour',
|
|
2718
|
+
WHO_YOU_TRAVELING_WITH: 'Avec qui voyagez-vous ?',
|
|
2719
|
+
TRAVEL_PERIOD: 'Période de voyage',
|
|
2720
|
+
CLOSE: 'Fermer',
|
|
2721
|
+
NIGHTS: 'nuits',
|
|
2722
|
+
DAYS: 'jours'
|
|
2723
|
+
};
|
|
2724
|
+
var MAIN$9 = {
|
|
2725
|
+
PREPARING_BOOKING: 'Veuillez patienter, nous préparons votre réservation',
|
|
2726
|
+
PREPARING_OFFER: 'Veuillez patienter, nous préparons votre devis',
|
|
2727
|
+
PREPARING_DOSSIER: 'Veuillez patienter, nous préparons votre dossier',
|
|
2728
|
+
PRODUCT_UNAVAILABLE: 'Produit non disponible'
|
|
2729
|
+
};
|
|
2730
|
+
var SHARED$9 = {
|
|
2731
|
+
ROOM: 'Chambre',
|
|
2732
|
+
ROOMS: 'Chambres',
|
|
2733
|
+
TOTAL_PRICE: 'Prix total',
|
|
2734
|
+
ADULTS: 'Adultes',
|
|
2735
|
+
CHILDREN: 'Enfants',
|
|
2736
|
+
SELECT: 'Sélectionner',
|
|
2737
|
+
SELECTED: 'Sélectionné'
|
|
2738
|
+
};
|
|
2739
|
+
var SIDEBAR$9 = {
|
|
2740
|
+
OVERVIEW: 'Résumé',
|
|
2741
|
+
SLIDE_TOTAL_PRICE: 'Montant total : ',
|
|
2742
|
+
SLIDE_DEPOSIT: 'Acompte à payer : ',
|
|
2743
|
+
TRAVEL_INFO: 'Informations voyage',
|
|
2744
|
+
TRAVELERS: 'Voyageurs',
|
|
2745
|
+
TRAVELERS_ADULTS: 'adultes',
|
|
2746
|
+
TRAVELERS_ADULT: 'adulte',
|
|
2747
|
+
TRAVELERS_CHILDREN: 'enfants',
|
|
2748
|
+
TRAVELERS_CHILD: 'enfant',
|
|
2749
|
+
TRAVELERS_INFANTS: 'bébés',
|
|
2750
|
+
TRAVELERS_INFANT: 'bébé',
|
|
2751
|
+
DEPARTURE: 'Aller',
|
|
2752
|
+
DEPARTURE_SINGLE: 'Date',
|
|
2753
|
+
ARRIVAL: 'Retour',
|
|
2754
|
+
FLIGHT: 'Vol',
|
|
2755
|
+
ACCOMMODATION: 'Hébergement réservé',
|
|
2756
|
+
BASE_PRICE: 'Prix de base',
|
|
2757
|
+
OPTIONS: 'Options',
|
|
2758
|
+
INCLUDED_COSTS: 'Coûts inclus',
|
|
2759
|
+
EXTRA_COSTS: 'Coûts supplémentaires',
|
|
2760
|
+
DEPOSIT: 'Acompte à payer',
|
|
2761
|
+
DEPOSIT_TEXT1: 'Les étapes pour le ',
|
|
2762
|
+
DEPOSIT_TEXT2: 'solde restant',
|
|
2763
|
+
DEPOSIT_TEXT3: ' de ',
|
|
2764
|
+
DEPOSIT_TEXT4: ' sont décrites dans ',
|
|
2765
|
+
DEPOSIT_TEXT5: "l'étape « Résumé »",
|
|
2766
|
+
DEPOSIT_TEXT6: ' du processus de réservation.',
|
|
2767
|
+
LUGGAGE_INCLUDED: 'Bagages inclus',
|
|
2768
|
+
DEPARTURE_FLIGHT: 'Vol aller',
|
|
2769
|
+
ARRIVAL_FLIGHT: 'Vol retour',
|
|
2770
|
+
FLIGHT_DEPARTURE: 'Départ',
|
|
2771
|
+
FLIGHT_ARRIVAL: 'Arrivée',
|
|
2772
|
+
ON_REQUEST: 'Sur demande',
|
|
2773
|
+
CHANGES: 'transferts'
|
|
2774
|
+
};
|
|
2775
|
+
var TRAVELERS_FORM$9 = {
|
|
2776
|
+
AGE: 'Âge',
|
|
2777
|
+
TRAVELER: 'Voyageur',
|
|
2778
|
+
ADULT: 'adulte',
|
|
2779
|
+
ADULTS: 'adultes',
|
|
2780
|
+
CHILD: 'enfant',
|
|
2781
|
+
CHILDREN: 'enfants',
|
|
2782
|
+
GENDER: 'Civilité',
|
|
2783
|
+
GENDER_ID: "Sexe selon passeport/carte d'identité",
|
|
2784
|
+
MALE: 'M.',
|
|
2785
|
+
MALE_GENDER: 'Homme',
|
|
2786
|
+
FEMALE: 'Mme',
|
|
2787
|
+
FEMALE_GENDER: 'Femme',
|
|
2788
|
+
OTHER: 'Autre',
|
|
2789
|
+
MAIN_BOOKER: 'Titulaire de la réservation',
|
|
2790
|
+
FIRST_NAME: 'Prénom',
|
|
2791
|
+
LAST_NAME: 'Nom',
|
|
2792
|
+
BIRTHDATE: 'Date de naissance',
|
|
2793
|
+
STREET: 'Rue',
|
|
2794
|
+
STREET_PLACEHOLDER: 'Votre rue',
|
|
2795
|
+
HOUSE_NUMBER: 'Numéro',
|
|
2796
|
+
POST_BOX: 'Boîte postale',
|
|
2797
|
+
ZIPCODE: 'Code postal',
|
|
2798
|
+
CITY: 'Ville',
|
|
2799
|
+
CITY_PLACEHOLDER: 'Ville',
|
|
2800
|
+
COUNTRY: 'Pays',
|
|
2801
|
+
SELECT_COUNTRY: 'Sélectionner le pays',
|
|
2802
|
+
PHONE: 'Téléphone',
|
|
2803
|
+
EMAIL: 'Email',
|
|
2804
|
+
REPEAT_EMAIL: "Répéter l'email",
|
|
2805
|
+
VALIDATION_MESSAGE: 'Veuillez vérifier les champs ci-dessous et les remplir correctement.',
|
|
2806
|
+
BOOK_WITH_AGENT: 'Je souhaite réserver via mon agence de voyage locale',
|
|
2807
|
+
CHOOSE_OFFICE: 'Je choisis un bureau',
|
|
2808
|
+
PERSON: 'Personne',
|
|
2809
|
+
COUNTRIES: {
|
|
2810
|
+
BELGIUM: 'Belgique',
|
|
2811
|
+
NETHERLANDS: 'Pays-Bas',
|
|
2812
|
+
FRANCE: 'France'
|
|
2813
|
+
},
|
|
2814
|
+
CHOOSE_AGENT_PLACEHOLDER: 'Choisissez votre agent de voyage',
|
|
2815
|
+
VALIDATION: {
|
|
2816
|
+
TRAVELER_X_FIELD: 'Chambre {0} - Voyageur {1} : {2}',
|
|
2817
|
+
SINGLE_ROOM_TRAVELER_X_FIELD: 'Voyageur {0} : {1}',
|
|
2818
|
+
TRAVELER_X_IS_NO_ADULT: "Chambre {0} - Voyageur {1} : n'est pas un adulte",
|
|
2819
|
+
SINGLE_ROOM_TRAVELER_X_IS_NO_ADULT: "Voyageur {0} : n'est pas un adulte",
|
|
2820
|
+
TRAVELER_X_IS_NO_CHILD: "Chambre {0} - Voyageur {1} : n'est pas un enfant",
|
|
2821
|
+
SINGLE_ROOM_TRAVELER_X_IS_NO_CHILD: "Voyageur {0} : n'est pas un enfant",
|
|
2822
|
+
NO_MAIN_BOOKER_SELECTED: 'Aucun titulaire de réservation sélectionné',
|
|
2823
|
+
MAIN_BOOKER_FIELD: 'Titulaire de la réservation : {0}',
|
|
2824
|
+
MAIN_BOOKER_EMAIL_IS_INVALID: 'Titulaire de la réservation : email invalide',
|
|
2825
|
+
MAIN_BOOKER_EMAIL_DOES_NOT_MATCH: 'Titulaire de la réservation : email non concordant',
|
|
2826
|
+
AGENT_IS_REQUIRED: 'Un agent de voyage est requis'
|
|
2827
|
+
}
|
|
2828
|
+
};
|
|
2829
|
+
var OPTIONS_FORM$9 = {
|
|
2830
|
+
NO_OPTIONS_TITLE: 'Aucune option',
|
|
2831
|
+
NO_OPTIONS_MESSAGE: "Ce voyage n'a pas d'options supplémentaires.",
|
|
2832
|
+
UNIT_TITLE: 'Groupe',
|
|
2833
|
+
PACKAGE: 'Forfait',
|
|
2834
|
+
DAY: 'jour',
|
|
2835
|
+
DAYS: 'jours',
|
|
2836
|
+
NIGHT: 'nuit',
|
|
2837
|
+
NIGHTS: 'nuits',
|
|
2838
|
+
PER_PAX_TITLE: 'Sélectionnez les options par voyageur',
|
|
2839
|
+
PER_BOOKING_TITLE: 'Sélectionnez les options par réservation',
|
|
2840
|
+
PER_UNIT_TITLE: 'Sélectionnez les options par groupe',
|
|
2841
|
+
NONE: 'Aucune'
|
|
2842
|
+
};
|
|
2843
|
+
var ROOM_OPTIONS_FORM$9 = {
|
|
2844
|
+
TRAVELER_GROUP: 'Groupe de voyage',
|
|
2845
|
+
ALTERNATIVES_TRAVELER_GROUP: 'Options alternatives de chambre pour le groupe',
|
|
2846
|
+
SHOW_ALTERNATIVES: 'Afficher les options alternatives de chambre'
|
|
2847
|
+
};
|
|
2848
|
+
var SUMMARY$9 = {
|
|
2849
|
+
PERSONAL_DETAILS: 'Informations personnelles',
|
|
2850
|
+
TRAVELERS: 'voyageurs',
|
|
2851
|
+
TRAVELER: 'voyageur',
|
|
2852
|
+
ADULTS: 'adultes',
|
|
2853
|
+
ADULT: 'adulte',
|
|
2854
|
+
CHILDREN: 'enfants',
|
|
2855
|
+
CHILD: 'enfant',
|
|
2856
|
+
MAIN_BOOKER: 'Titulaire de la réservation',
|
|
2857
|
+
NOTIFICATIONS_TITLE: 'Attention',
|
|
2858
|
+
VALIDATE_TITLE: 'Vérifiez vos informations',
|
|
2859
|
+
VALIDATE_TEXT_BOOKING:
|
|
2860
|
+
"Vous êtes sur le point de confirmer votre réservation. Veuillez vérifier que toutes les informations sont correctes et que les noms correspondent exactement à votre pièce d'identité ou passeport. Ces informations sont définitives et ne peuvent pas être modifiées.",
|
|
2861
|
+
VALIDATE_TEXT_OFFER:
|
|
2862
|
+
"Vous êtes sur le point de demander un devis. Veuillez vérifier que toutes les informations sont correctes et que les noms correspondent exactement à votre pièce d'identité ou passeport. Cela nous aide à éviter des problèmes si vous réservez plus tard.",
|
|
2863
|
+
VALIDATE_TEXT_OPTION:
|
|
2864
|
+
"Si vous choisissez de prendre une option, il existe un délai pour l'exercer qui dépend de la compagnie aérienne. Une option garantit une place mais pas le prix. Le prix indiqué dans cette proposition est par personne et dépend de la disponibilité. Le prix n'est garanti qu'une fois le billet émis.",
|
|
2865
|
+
OPTIONS: 'Options',
|
|
2866
|
+
REMARKS: 'Remarques',
|
|
2867
|
+
VOUCHERS: 'Bons',
|
|
2868
|
+
VOUCHER_VALIDATE: 'Valider le bon',
|
|
2869
|
+
ADD_VOUCHER: 'Ajouter un bon',
|
|
2870
|
+
VOUCHER_VALID: 'Bon valide',
|
|
2871
|
+
VOUCHER_INVALID: 'Bon invalide'
|
|
2872
|
+
};
|
|
2873
|
+
var CONFIRMATION$9 = {
|
|
2874
|
+
TITLE_TEXT_OFFER: 'Votre devis numéro {0} a été demandé',
|
|
2875
|
+
TITLE_TEXT_BOOKING: 'Votre réservation numéro {0} a été confirmée',
|
|
2876
|
+
TITLE_TEXT_OPTION: 'Vous avez pris une option sur le numéro {0}.',
|
|
2877
|
+
MESSAGE_TEXT1: 'Votre voyage de rêve est maintenant très proche.',
|
|
2878
|
+
MESSAGE_TEXT2_OFFER: 'Nos spécialistes du voyage traitent votre demande et vous contacteront sous 48 heures.',
|
|
2879
|
+
MESSAGE_TEXT2_BOOKING: 'Nos spécialistes du voyage traitent votre réservation et vous contacteront sous 48 heures.',
|
|
2880
|
+
MESSAGE_TEXT2_OPTION: 'Nos spécialistes du voyage ont noté votre réservation et vous contacteront sous 48 heures pour confirmer ou discuter de votre option.',
|
|
2881
|
+
QUESTIONS_TEXT1: 'Vous avez des questions ? ',
|
|
2882
|
+
QUESTIONS_TEXT2: 'Faites-le nous savoir',
|
|
2883
|
+
QUESTIONS_TEXT3: '.',
|
|
2884
|
+
QUESTIONS_ALT: 'Contactez-nous',
|
|
2885
|
+
MAIL_SUBJECT: 'Informations sur la réservation'
|
|
2886
|
+
};
|
|
2887
|
+
var ERROR$9 = {
|
|
2888
|
+
TRY_AGAIN: 'Réessayer la réservation',
|
|
2889
|
+
MESSAGE_TEXT1: "Une erreur s'est produite lors de la confirmation de votre voyage.",
|
|
2890
|
+
MESSAGE_TEXT2: 'Cliquez ci-dessous pour réessayer.',
|
|
2891
|
+
ERROR_TEXT1: 'Ça ne fonctionne toujours pas ? ',
|
|
2892
|
+
ERROR_TEXT2: 'Assurez-vous de nous le faire savoir',
|
|
2893
|
+
ERROR_TEXT3: '.',
|
|
2894
|
+
ERROR_ALT: 'Contactez-nous'
|
|
2895
|
+
};
|
|
2896
|
+
var PRINT_OFFER_BUTTON$9 = {
|
|
2897
|
+
LABEL_IDLE: 'Imprimer le devis',
|
|
2898
|
+
LABEL_CREATING: 'Génération du devis…',
|
|
2899
|
+
LABEL_PRINTING: 'Génération du PDF…'
|
|
2900
|
+
};
|
|
2901
|
+
var NAVBAR$9 = {
|
|
2902
|
+
SEARCH: 'Rechercher'
|
|
2903
|
+
};
|
|
2904
|
+
var LOGIN$9 = {
|
|
2905
|
+
LOGIN_INTO: 'Connectez-vous à votre compte',
|
|
2906
|
+
EMAIL: 'Email',
|
|
2907
|
+
ENTER_YOUR_EMAIL: 'Entrez votre email',
|
|
2908
|
+
EMAIL_REQUIRED: 'L’email est requis.',
|
|
2909
|
+
EMAIL_INVALID: 'L’email est invalide.',
|
|
2910
|
+
ENTER_VALID_EMAIL: 'Entrez un email valide.',
|
|
2911
|
+
PASSWORD: 'Mot de passe',
|
|
2912
|
+
ENTER_YOUR_PASSWORD: 'Entrez votre mot de passe',
|
|
2913
|
+
RESET_PASSWORD_LABEL: 'Nouveau mot de passe',
|
|
2914
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Répéter le mot de passe',
|
|
2915
|
+
PASSWORD_REQUIRED: 'Le mot de passe est requis.',
|
|
2916
|
+
INVALID_CREDENTIALS: 'Email ou mot de passe invalide.',
|
|
2917
|
+
LOGIN: 'Se connecter',
|
|
2918
|
+
LOGOUT: 'Se déconnecter',
|
|
2919
|
+
FORGOT_PASSWORD: 'Mot de passe oublié ?',
|
|
2920
|
+
LOGGING_IN: 'Connexion...',
|
|
2921
|
+
WELCOME_X: 'Bienvenue, ',
|
|
2922
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Réinitialiser le mot de passe',
|
|
2923
|
+
RESET_REQUESTED: 'Demande de réinitialisation du mot de passe envoyée',
|
|
2924
|
+
BACK_TO_HOMEPAGE: 'Retour à la page d’accueil',
|
|
2925
|
+
BACK_TO_LOGIN: 'Retour à la connexion',
|
|
2926
|
+
RESET_PASSWORD_TITLE: 'Réinitialiser le mot de passe',
|
|
2927
|
+
PASSWORD_COMPLEXITY: 'Le mot de passe doit contenir au moins 1 chiffre et 1 lettre majuscule',
|
|
2928
|
+
REPEAT_PASSWORD_REQUIRED: 'Veuillez répéter votre mot de passe.',
|
|
2929
|
+
PASSWORDS_DO_NOT_MATCH: 'Les mots de passe ne correspondent pas.',
|
|
2930
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Modifier le mot de passe',
|
|
2931
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Votre mot de passe a été modifié. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.',
|
|
2932
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Ce lien a expiré ou est invalide.',
|
|
2933
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Vous pouvez demander un nouveau mot de passe en cliquant sur le bouton ci-dessous.',
|
|
2934
|
+
RECEIVED_REQUEST: 'Votre demande a bien été reçue',
|
|
2935
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Votre compte est maintenant actif. Cliquez ci-dessous pour vous connecter avec vos informations.'
|
|
2936
|
+
};
|
|
2937
|
+
var QSM$a = {
|
|
2687
2938
|
DEPARTURE: 'Départ',
|
|
2688
2939
|
CHOOSE_DEPARTURE: 'Choisir le départ',
|
|
2689
2940
|
DESTINATION: 'Destination',
|
|
@@ -2785,6 +3036,7 @@ var frFrJson = {
|
|
|
2785
3036
|
ERROR: ERROR$9,
|
|
2786
3037
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$9,
|
|
2787
3038
|
NAVBAR: NAVBAR$9,
|
|
3039
|
+
LOGIN: LOGIN$9,
|
|
2788
3040
|
QSM: QSM$a,
|
|
2789
3041
|
SRP: SRP$9
|
|
2790
3042
|
};
|
|
@@ -2892,6 +3144,8 @@ var SIDEBAR$8 = {
|
|
|
2892
3144
|
TRAVELERS_ADULT: 'fullorðinn',
|
|
2893
3145
|
TRAVELERS_CHILDREN: 'börn',
|
|
2894
3146
|
TRAVELERS_CHILD: 'barn',
|
|
3147
|
+
TRAVELERS_INFANTS: 'ungabörn',
|
|
3148
|
+
TRAVELERS_INFANT: 'ungabarn',
|
|
2895
3149
|
DEPARTURE: 'Brottför',
|
|
2896
3150
|
DEPARTURE_SINGLE: 'Dagsetning',
|
|
2897
3151
|
ARRIVAL: 'Komið',
|
|
@@ -3045,6 +3299,39 @@ var PRINT_OFFER_BUTTON$8 = {
|
|
|
3045
3299
|
var NAVBAR$8 = {
|
|
3046
3300
|
SEARCH: 'Leita'
|
|
3047
3301
|
};
|
|
3302
|
+
var LOGIN$8 = {
|
|
3303
|
+
LOGIN_INTO: 'Skráðu þig inn á reikninginn þinn',
|
|
3304
|
+
EMAIL: 'Netfang',
|
|
3305
|
+
ENTER_YOUR_EMAIL: 'Sláðu inn netfangið þitt',
|
|
3306
|
+
EMAIL_REQUIRED: 'Netfang er nauðsynlegt.',
|
|
3307
|
+
EMAIL_INVALID: 'Netfangið er ógilt.',
|
|
3308
|
+
ENTER_VALID_EMAIL: 'Sláðu inn gilt netfang.',
|
|
3309
|
+
PASSWORD: 'Lykilorð',
|
|
3310
|
+
ENTER_YOUR_PASSWORD: 'Sláðu inn lykilorðið þitt',
|
|
3311
|
+
RESET_PASSWORD_LABEL: 'Nýtt lykilorð',
|
|
3312
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Endurtaka lykilorð',
|
|
3313
|
+
PASSWORD_REQUIRED: 'Lykilorð er nauðsynlegt.',
|
|
3314
|
+
INVALID_CREDENTIALS: 'Ógilt netfang eða lykilorð.',
|
|
3315
|
+
LOGIN: 'Skrá inn',
|
|
3316
|
+
LOGOUT: 'Skrá út',
|
|
3317
|
+
FORGOT_PASSWORD: 'Gleymt lykilorð?',
|
|
3318
|
+
LOGGING_IN: 'Skrái inn...',
|
|
3319
|
+
WELCOME_X: 'Velkomin, ',
|
|
3320
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Endurstilla lykilorð',
|
|
3321
|
+
RESET_REQUESTED: 'Beiðni um endurstillingu lykilorðs send',
|
|
3322
|
+
BACK_TO_HOMEPAGE: 'Til baka á forsíðu',
|
|
3323
|
+
BACK_TO_LOGIN: 'Til baka í innskráningu',
|
|
3324
|
+
RESET_PASSWORD_TITLE: 'Endurstilla lykilorð',
|
|
3325
|
+
PASSWORD_COMPLEXITY: 'Lykilorð verður að innihalda að minnsta kosti 1 tölu og 1 stóran staf',
|
|
3326
|
+
REPEAT_PASSWORD_REQUIRED: 'Vinsamlegast endurtaktu lykilorðið.',
|
|
3327
|
+
PASSWORDS_DO_NOT_MATCH: 'Lykilorðin passa ekki.',
|
|
3328
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Breyta lykilorði',
|
|
3329
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Lykilorðinu þínu hefur verið breytt. Þú getur nú skráð þig inn með nýja lykilorðinu.',
|
|
3330
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Þessi hlekkur er útrunninn eða ógildur.',
|
|
3331
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Þú getur beðið um nýtt lykilorð með því að smella á hnappinn hér fyrir neðan.',
|
|
3332
|
+
RECEIVED_REQUEST: 'Beiðnin þín hefur verið móttekin',
|
|
3333
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Reikningurinn þinn er nú virkur. Smelltu hér fyrir neðan til að skrá þig inn.'
|
|
3334
|
+
};
|
|
3048
3335
|
var QSM$9 = {
|
|
3049
3336
|
DEPARTURE: 'Brottför',
|
|
3050
3337
|
CHOOSE_DEPARTURE: 'Veldu brottför',
|
|
@@ -3147,6 +3434,7 @@ var isJson = {
|
|
|
3147
3434
|
ERROR: ERROR$8,
|
|
3148
3435
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$8,
|
|
3149
3436
|
NAVBAR: NAVBAR$8,
|
|
3437
|
+
LOGIN: LOGIN$8,
|
|
3150
3438
|
QSM: QSM$9,
|
|
3151
3439
|
SRP: SRP$8
|
|
3152
3440
|
};
|
|
@@ -3254,6 +3542,8 @@ var SIDEBAR$7 = {
|
|
|
3254
3542
|
TRAVELERS_ADULT: 'adulto',
|
|
3255
3543
|
TRAVELERS_CHILDREN: 'bambini',
|
|
3256
3544
|
TRAVELERS_CHILD: 'bambino',
|
|
3545
|
+
TRAVELERS_INFANTS: 'neonati',
|
|
3546
|
+
TRAVELERS_INFANT: 'neonato',
|
|
3257
3547
|
DEPARTURE: 'Andata',
|
|
3258
3548
|
DEPARTURE_SINGLE: 'Data',
|
|
3259
3549
|
ARRIVAL: 'Ritorno',
|
|
@@ -3408,6 +3698,39 @@ var PRINT_OFFER_BUTTON$7 = {
|
|
|
3408
3698
|
var NAVBAR$7 = {
|
|
3409
3699
|
SEARCH: 'Cerca'
|
|
3410
3700
|
};
|
|
3701
|
+
var LOGIN$7 = {
|
|
3702
|
+
LOGIN_INTO: 'Accedi al tuo account',
|
|
3703
|
+
EMAIL: 'Email',
|
|
3704
|
+
ENTER_YOUR_EMAIL: 'Inserisci la tua email',
|
|
3705
|
+
EMAIL_REQUIRED: "L'email è obbligatoria.",
|
|
3706
|
+
EMAIL_INVALID: "L'email non è valida.",
|
|
3707
|
+
ENTER_VALID_EMAIL: "Inserisci un'email valida.",
|
|
3708
|
+
PASSWORD: 'Password',
|
|
3709
|
+
ENTER_YOUR_PASSWORD: 'Inserisci la tua password',
|
|
3710
|
+
RESET_PASSWORD_LABEL: 'Nuova password',
|
|
3711
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Ripeti password',
|
|
3712
|
+
PASSWORD_REQUIRED: 'La password è obbligatoria.',
|
|
3713
|
+
INVALID_CREDENTIALS: 'Email o password non validi.',
|
|
3714
|
+
LOGIN: 'Accedi',
|
|
3715
|
+
LOGOUT: 'Esci',
|
|
3716
|
+
FORGOT_PASSWORD: 'Password dimenticata?',
|
|
3717
|
+
LOGGING_IN: 'Accesso in corso...',
|
|
3718
|
+
WELCOME_X: 'Benvenuto, ',
|
|
3719
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Reimposta password',
|
|
3720
|
+
RESET_REQUESTED: 'Richiesta di reimpostazione password inviata',
|
|
3721
|
+
BACK_TO_HOMEPAGE: 'Torna alla homepage',
|
|
3722
|
+
BACK_TO_LOGIN: 'Torna al login',
|
|
3723
|
+
RESET_PASSWORD_TITLE: 'Reimposta password',
|
|
3724
|
+
PASSWORD_COMPLEXITY: 'La password deve contenere almeno 1 numero e 1 lettera maiuscola',
|
|
3725
|
+
REPEAT_PASSWORD_REQUIRED: 'Per favore ripeti la password.',
|
|
3726
|
+
PASSWORDS_DO_NOT_MATCH: 'Le password non corrispondono.',
|
|
3727
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Modifica password',
|
|
3728
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'La tua password è stata modificata. Ora puoi accedere con la nuova password.',
|
|
3729
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Questo link è scaduto o non è valido.',
|
|
3730
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Puoi richiedere una nuova password cliccando il pulsante qui sotto.',
|
|
3731
|
+
RECEIVED_REQUEST: 'La tua richiesta è stata ricevuta',
|
|
3732
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Il tuo account è ora attivo. Clicca qui sotto per accedere con i tuoi dati.'
|
|
3733
|
+
};
|
|
3411
3734
|
var QSM$8 = {
|
|
3412
3735
|
DEPARTURE: 'Partenza',
|
|
3413
3736
|
CHOOSE_DEPARTURE: 'Scegli partenza',
|
|
@@ -3510,6 +3833,7 @@ var itJson = {
|
|
|
3510
3833
|
ERROR: ERROR$7,
|
|
3511
3834
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$7,
|
|
3512
3835
|
NAVBAR: NAVBAR$7,
|
|
3836
|
+
LOGIN: LOGIN$7,
|
|
3513
3837
|
QSM: QSM$8,
|
|
3514
3838
|
SRP: SRP$7
|
|
3515
3839
|
};
|
|
@@ -3617,6 +3941,8 @@ var SIDEBAR$6 = {
|
|
|
3617
3941
|
TRAVELERS_ADULT: 'volwassene',
|
|
3618
3942
|
TRAVELERS_CHILDREN: 'kinderen',
|
|
3619
3943
|
TRAVELERS_CHILD: 'kind',
|
|
3944
|
+
TRAVELERS_INFANTS: "baby's",
|
|
3945
|
+
TRAVELERS_INFANT: 'baby',
|
|
3620
3946
|
DEPARTURE: 'Heenreis',
|
|
3621
3947
|
DEPARTURE_SINGLE: 'Datum',
|
|
3622
3948
|
ARRIVAL: 'Terugreis',
|
|
@@ -3775,6 +4101,39 @@ var PRINT_OFFER_BUTTON$6 = {
|
|
|
3775
4101
|
var NAVBAR$6 = {
|
|
3776
4102
|
SEARCH: 'Zoeken'
|
|
3777
4103
|
};
|
|
4104
|
+
var LOGIN$6 = {
|
|
4105
|
+
LOGIN_INTO: 'Log in op je account',
|
|
4106
|
+
EMAIL: 'E-mail',
|
|
4107
|
+
ENTER_YOUR_EMAIL: 'Voer je e-mail in',
|
|
4108
|
+
EMAIL_REQUIRED: 'E-mail is verplicht.',
|
|
4109
|
+
EMAIL_INVALID: 'E-mailadres is ongeldig.',
|
|
4110
|
+
ENTER_VALID_EMAIL: 'Voer een geldig e-mailadres in.',
|
|
4111
|
+
PASSWORD: 'Wachtwoord',
|
|
4112
|
+
ENTER_YOUR_PASSWORD: 'Voer je wachtwoord in',
|
|
4113
|
+
RESET_PASSWORD_LABEL: 'Nieuw wachtwoord',
|
|
4114
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Herhaal wachtwoord',
|
|
4115
|
+
PASSWORD_REQUIRED: 'Wachtwoord is verplicht.',
|
|
4116
|
+
INVALID_CREDENTIALS: 'Ongeldig e-mailadres of wachtwoord.',
|
|
4117
|
+
LOGIN: 'Inloggen',
|
|
4118
|
+
LOGOUT: 'Uitloggen',
|
|
4119
|
+
FORGOT_PASSWORD: 'Wachtwoord vergeten?',
|
|
4120
|
+
LOGGING_IN: 'Bezig met inloggen...',
|
|
4121
|
+
WELCOME_X: 'Welkom, ',
|
|
4122
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Wachtwoord resetten',
|
|
4123
|
+
RESET_REQUESTED: 'Aanvraag voor wachtwoordreset verzonden',
|
|
4124
|
+
BACK_TO_HOMEPAGE: 'Terug naar homepage',
|
|
4125
|
+
BACK_TO_LOGIN: 'Terug naar login',
|
|
4126
|
+
RESET_PASSWORD_TITLE: 'Wachtwoord resetten',
|
|
4127
|
+
PASSWORD_COMPLEXITY: 'Wachtwoord moet minstens 1 cijfer en 1 hoofdletter bevatten',
|
|
4128
|
+
REPEAT_PASSWORD_REQUIRED: 'Herhaal je wachtwoord.',
|
|
4129
|
+
PASSWORDS_DO_NOT_MATCH: 'Wachtwoorden komen niet overeen.',
|
|
4130
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Wachtwoord wijzigen',
|
|
4131
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Je wachtwoord is gewijzigd. Je kan nu inloggen met je nieuwe wachtwoord.',
|
|
4132
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Deze link is verlopen of ongeldig.',
|
|
4133
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Je kan een nieuw wachtwoord aanvragen door op onderstaande knop te klikken.',
|
|
4134
|
+
RECEIVED_REQUEST: 'Je aanvraag is goed ontvangen',
|
|
4135
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Je account is nu actief. Klik hieronder om in te loggen met je gegevens.'
|
|
4136
|
+
};
|
|
3778
4137
|
var QSM$7 = {
|
|
3779
4138
|
DEPARTURE: 'Vertrek',
|
|
3780
4139
|
CHOOSE_DEPARTURE: 'Vertrek kiezen',
|
|
@@ -3877,6 +4236,7 @@ var nlBeJson = {
|
|
|
3877
4236
|
ERROR: ERROR$6,
|
|
3878
4237
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$6,
|
|
3879
4238
|
NAVBAR: NAVBAR$6,
|
|
4239
|
+
LOGIN: LOGIN$6,
|
|
3880
4240
|
QSM: QSM$7,
|
|
3881
4241
|
SRP: SRP$6
|
|
3882
4242
|
};
|
|
@@ -3984,6 +4344,8 @@ var SIDEBAR$5 = {
|
|
|
3984
4344
|
TRAVELERS_ADULT: 'volwassene',
|
|
3985
4345
|
TRAVELERS_CHILDREN: 'kinderen',
|
|
3986
4346
|
TRAVELERS_CHILD: 'kind',
|
|
4347
|
+
TRAVELERS_INFANTS: "baby's",
|
|
4348
|
+
TRAVELERS_INFANT: 'baby',
|
|
3987
4349
|
DEPARTURE: 'Heenreis',
|
|
3988
4350
|
DEPARTURE_SINGLE: 'Datum',
|
|
3989
4351
|
ARRIVAL: 'Terugreis',
|
|
@@ -4138,6 +4500,39 @@ var PRINT_OFFER_BUTTON$5 = {
|
|
|
4138
4500
|
var NAVBAR$5 = {
|
|
4139
4501
|
SEARCH: 'Zoeken'
|
|
4140
4502
|
};
|
|
4503
|
+
var LOGIN$5 = {
|
|
4504
|
+
LOGIN_INTO: 'Log in op je account',
|
|
4505
|
+
EMAIL: 'E-mail',
|
|
4506
|
+
ENTER_YOUR_EMAIL: 'Voer je e-mail in',
|
|
4507
|
+
EMAIL_REQUIRED: 'E-mail is verplicht.',
|
|
4508
|
+
EMAIL_INVALID: 'E-mailadres is ongeldig.',
|
|
4509
|
+
ENTER_VALID_EMAIL: 'Voer een geldig e-mailadres in.',
|
|
4510
|
+
PASSWORD: 'Wachtwoord',
|
|
4511
|
+
ENTER_YOUR_PASSWORD: 'Voer je wachtwoord in',
|
|
4512
|
+
RESET_PASSWORD_LABEL: 'Nieuw wachtwoord',
|
|
4513
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Herhaal wachtwoord',
|
|
4514
|
+
PASSWORD_REQUIRED: 'Wachtwoord is verplicht.',
|
|
4515
|
+
INVALID_CREDENTIALS: 'Ongeldig e-mailadres of wachtwoord.',
|
|
4516
|
+
LOGIN: 'Inloggen',
|
|
4517
|
+
LOGOUT: 'Uitloggen',
|
|
4518
|
+
FORGOT_PASSWORD: 'Wachtwoord vergeten?',
|
|
4519
|
+
LOGGING_IN: 'Bezig met inloggen...',
|
|
4520
|
+
WELCOME_X: 'Welkom, ',
|
|
4521
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Wachtwoord resetten',
|
|
4522
|
+
RESET_REQUESTED: 'Aanvraag voor wachtwoordreset verzonden',
|
|
4523
|
+
BACK_TO_HOMEPAGE: 'Terug naar homepage',
|
|
4524
|
+
BACK_TO_LOGIN: 'Terug naar login',
|
|
4525
|
+
RESET_PASSWORD_TITLE: 'Wachtwoord resetten',
|
|
4526
|
+
PASSWORD_COMPLEXITY: 'Wachtwoord moet minstens 1 cijfer en 1 hoofdletter bevatten',
|
|
4527
|
+
REPEAT_PASSWORD_REQUIRED: 'Herhaal je wachtwoord.',
|
|
4528
|
+
PASSWORDS_DO_NOT_MATCH: 'Wachtwoorden komen niet overeen.',
|
|
4529
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Wachtwoord wijzigen',
|
|
4530
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Je wachtwoord is gewijzigd. Je kan nu inloggen met je nieuwe wachtwoord.',
|
|
4531
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Deze link is verlopen of ongeldig.',
|
|
4532
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Je kan een nieuw wachtwoord aanvragen door op onderstaande knop te klikken.',
|
|
4533
|
+
RECEIVED_REQUEST: 'Je aanvraag is goed ontvangen',
|
|
4534
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Je account is nu actief. Klik hieronder om in te loggen met je gegevens.'
|
|
4535
|
+
};
|
|
4141
4536
|
var QSM$6 = {
|
|
4142
4537
|
DEPARTURE: 'Vertrek',
|
|
4143
4538
|
CHOOSE_DEPARTURE: 'Vertrek kiezen',
|
|
@@ -4240,6 +4635,7 @@ var nlNlJson = {
|
|
|
4240
4635
|
ERROR: ERROR$5,
|
|
4241
4636
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$5,
|
|
4242
4637
|
NAVBAR: NAVBAR$5,
|
|
4638
|
+
LOGIN: LOGIN$5,
|
|
4243
4639
|
QSM: QSM$6,
|
|
4244
4640
|
SRP: SRP$5
|
|
4245
4641
|
};
|
|
@@ -4347,6 +4743,8 @@ var SIDEBAR$4 = {
|
|
|
4347
4743
|
TRAVELERS_ADULT: 'voksen',
|
|
4348
4744
|
TRAVELERS_CHILDREN: 'barn',
|
|
4349
4745
|
TRAVELERS_CHILD: 'barn',
|
|
4746
|
+
TRAVELERS_INFANTS: 'babyer',
|
|
4747
|
+
TRAVELERS_INFANT: 'baby',
|
|
4350
4748
|
DEPARTURE: 'Utreise',
|
|
4351
4749
|
DEPARTURE_SINGLE: 'Dato',
|
|
4352
4750
|
ARRIVAL: 'Retur',
|
|
@@ -4501,6 +4899,39 @@ var PRINT_OFFER_BUTTON$4 = {
|
|
|
4501
4899
|
var NAVBAR$4 = {
|
|
4502
4900
|
SEARCH: 'Søk'
|
|
4503
4901
|
};
|
|
4902
|
+
var LOGIN$4 = {
|
|
4903
|
+
LOGIN_INTO: 'Logg inn på kontoen din',
|
|
4904
|
+
EMAIL: 'E-post',
|
|
4905
|
+
ENTER_YOUR_EMAIL: 'Skriv inn e-posten din',
|
|
4906
|
+
EMAIL_REQUIRED: 'E-post er påkrevd.',
|
|
4907
|
+
EMAIL_INVALID: 'E-posten er ugyldig.',
|
|
4908
|
+
ENTER_VALID_EMAIL: 'Skriv inn en gyldig e-post.',
|
|
4909
|
+
PASSWORD: 'Passord',
|
|
4910
|
+
ENTER_YOUR_PASSWORD: 'Skriv inn passordet ditt',
|
|
4911
|
+
RESET_PASSWORD_LABEL: 'Nytt passord',
|
|
4912
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Gjenta passord',
|
|
4913
|
+
PASSWORD_REQUIRED: 'Passord er påkrevd.',
|
|
4914
|
+
INVALID_CREDENTIALS: 'Ugyldig e-post eller passord.',
|
|
4915
|
+
LOGIN: 'Logg inn',
|
|
4916
|
+
LOGOUT: 'Logg ut',
|
|
4917
|
+
FORGOT_PASSWORD: 'Glemt passord?',
|
|
4918
|
+
LOGGING_IN: 'Logger inn...',
|
|
4919
|
+
WELCOME_X: 'Velkommen, ',
|
|
4920
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Tilbakestill passord',
|
|
4921
|
+
RESET_REQUESTED: 'Forespørsel om tilbakestilling av passord sendt',
|
|
4922
|
+
BACK_TO_HOMEPAGE: 'Tilbake til startsiden',
|
|
4923
|
+
BACK_TO_LOGIN: 'Tilbake til innlogging',
|
|
4924
|
+
RESET_PASSWORD_TITLE: 'Tilbakestill passord',
|
|
4925
|
+
PASSWORD_COMPLEXITY: 'Passordet må inneholde minst 1 tall og 1 stor bokstav',
|
|
4926
|
+
REPEAT_PASSWORD_REQUIRED: 'Vennligst gjenta passordet.',
|
|
4927
|
+
PASSWORDS_DO_NOT_MATCH: 'Passordene samsvarer ikke.',
|
|
4928
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Endre passord',
|
|
4929
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Passordet ditt er endret. Du kan nå logge inn med ditt nye passord.',
|
|
4930
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Denne lenken er utløpt eller ugyldig.',
|
|
4931
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Du kan be om et nytt passord ved å klikke på knappen nedenfor.',
|
|
4932
|
+
RECEIVED_REQUEST: 'Forespørselen din er mottatt',
|
|
4933
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Kontoen din er nå aktiv. Klikk nedenfor for å logge inn med dine opplysninger.'
|
|
4934
|
+
};
|
|
4504
4935
|
var QSM$5 = {
|
|
4505
4936
|
DEPARTURE: 'Avgang',
|
|
4506
4937
|
CHOOSE_DEPARTURE: 'Velg avgang',
|
|
@@ -4603,6 +5034,7 @@ var noJson = {
|
|
|
4603
5034
|
ERROR: ERROR$4,
|
|
4604
5035
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$4,
|
|
4605
5036
|
NAVBAR: NAVBAR$4,
|
|
5037
|
+
LOGIN: LOGIN$4,
|
|
4606
5038
|
QSM: QSM$5,
|
|
4607
5039
|
SRP: SRP$4
|
|
4608
5040
|
};
|
|
@@ -4710,6 +5142,8 @@ var SIDEBAR$3 = {
|
|
|
4710
5142
|
TRAVELERS_ADULT: 'dorosły',
|
|
4711
5143
|
TRAVELERS_CHILDREN: 'dzieci',
|
|
4712
5144
|
TRAVELERS_CHILD: 'dziecko',
|
|
5145
|
+
TRAVELERS_INFANTS: 'niemowlęta',
|
|
5146
|
+
TRAVELERS_INFANT: 'niemowlę',
|
|
4713
5147
|
DEPARTURE: 'Wylot',
|
|
4714
5148
|
DEPARTURE_SINGLE: 'Data',
|
|
4715
5149
|
ARRIVAL: 'Powrót',
|
|
@@ -4864,6 +5298,39 @@ var PRINT_OFFER_BUTTON$3 = {
|
|
|
4864
5298
|
var NAVBAR$3 = {
|
|
4865
5299
|
SEARCH: 'Szukaj'
|
|
4866
5300
|
};
|
|
5301
|
+
var LOGIN$3 = {
|
|
5302
|
+
LOGIN_INTO: 'Zaloguj się na swoje konto',
|
|
5303
|
+
EMAIL: 'Email',
|
|
5304
|
+
ENTER_YOUR_EMAIL: 'Wprowadź swój email',
|
|
5305
|
+
EMAIL_REQUIRED: 'Email jest wymagany.',
|
|
5306
|
+
EMAIL_INVALID: 'Adres e-mail jest nieprawidłowy.',
|
|
5307
|
+
ENTER_VALID_EMAIL: 'Wprowadź poprawny adres email.',
|
|
5308
|
+
PASSWORD: 'Hasło',
|
|
5309
|
+
ENTER_YOUR_PASSWORD: 'Wprowadź swoje hasło',
|
|
5310
|
+
RESET_PASSWORD_LABEL: 'Nowe hasło',
|
|
5311
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Powtórz hasło',
|
|
5312
|
+
PASSWORD_REQUIRED: 'Hasło jest wymagane.',
|
|
5313
|
+
INVALID_CREDENTIALS: 'Nieprawidłowy adres e-mail lub hasło.',
|
|
5314
|
+
LOGIN: 'Zaloguj się',
|
|
5315
|
+
LOGOUT: 'Wyloguj się',
|
|
5316
|
+
FORGOT_PASSWORD: 'Zapomniałeś hasła?',
|
|
5317
|
+
LOGGING_IN: 'Logowanie...',
|
|
5318
|
+
WELCOME_X: 'Witaj, ',
|
|
5319
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Zresetuj hasło',
|
|
5320
|
+
RESET_REQUESTED: 'Żądanie resetowania hasła wysłane',
|
|
5321
|
+
BACK_TO_HOMEPAGE: 'Powrót do strony głównej',
|
|
5322
|
+
BACK_TO_LOGIN: 'Powrót do logowania',
|
|
5323
|
+
RESET_PASSWORD_TITLE: 'Resetuj hasło',
|
|
5324
|
+
PASSWORD_COMPLEXITY: 'Hasło musi zawierać co najmniej 1 cyfrę i 1 wielką literę',
|
|
5325
|
+
REPEAT_PASSWORD_REQUIRED: 'Proszę powtórzyć hasło.',
|
|
5326
|
+
PASSWORDS_DO_NOT_MATCH: 'Hasła nie są zgodne.',
|
|
5327
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Zmień hasło',
|
|
5328
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Twoje hasło zostało zmienione. Możesz teraz zalogować się używając nowego hasła.',
|
|
5329
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Ten link wygasł lub jest nieprawidłowy.',
|
|
5330
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Możesz poprosić o nowe hasło klikając przycisk poniżej.',
|
|
5331
|
+
RECEIVED_REQUEST: 'Twoja prośba została odebrana',
|
|
5332
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Twoje konto jest teraz aktywne. Kliknij poniżej aby się zalogować.'
|
|
5333
|
+
};
|
|
4867
5334
|
var QSM$4 = {
|
|
4868
5335
|
DEPARTURE: 'Wylot',
|
|
4869
5336
|
CHOOSE_DEPARTURE: 'Wybierz wylot',
|
|
@@ -4966,6 +5433,7 @@ var plJson = {
|
|
|
4966
5433
|
ERROR: ERROR$3,
|
|
4967
5434
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$3,
|
|
4968
5435
|
NAVBAR: NAVBAR$3,
|
|
5436
|
+
LOGIN: LOGIN$3,
|
|
4969
5437
|
QSM: QSM$4,
|
|
4970
5438
|
SRP: SRP$3
|
|
4971
5439
|
};
|
|
@@ -5073,6 +5541,8 @@ var SIDEBAR$2 = {
|
|
|
5073
5541
|
TRAVELERS_ADULT: 'adulto',
|
|
5074
5542
|
TRAVELERS_CHILDREN: 'crianças',
|
|
5075
5543
|
TRAVELERS_CHILD: 'criança',
|
|
5544
|
+
TRAVELERS_INFANTS: 'bebés',
|
|
5545
|
+
TRAVELERS_INFANT: 'bebé',
|
|
5076
5546
|
DEPARTURE: 'Ida',
|
|
5077
5547
|
DEPARTURE_SINGLE: 'Data',
|
|
5078
5548
|
ARRIVAL: 'Regresso',
|
|
@@ -5227,6 +5697,39 @@ var PRINT_OFFER_BUTTON$2 = {
|
|
|
5227
5697
|
var NAVBAR$2 = {
|
|
5228
5698
|
SEARCH: 'Pesquisar'
|
|
5229
5699
|
};
|
|
5700
|
+
var LOGIN$2 = {
|
|
5701
|
+
LOGIN_INTO: 'Inicie sessão na sua conta',
|
|
5702
|
+
EMAIL: 'Email',
|
|
5703
|
+
ENTER_YOUR_EMAIL: 'Introduza o seu email',
|
|
5704
|
+
EMAIL_REQUIRED: 'O email é obrigatório.',
|
|
5705
|
+
EMAIL_INVALID: 'O email é inválido.',
|
|
5706
|
+
ENTER_VALID_EMAIL: 'Introduza um email válido.',
|
|
5707
|
+
PASSWORD: 'Palavra-passe',
|
|
5708
|
+
ENTER_YOUR_PASSWORD: 'Introduza a sua palavra-passe',
|
|
5709
|
+
RESET_PASSWORD_LABEL: 'Nova palavra-passe',
|
|
5710
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Repetir palavra-passe',
|
|
5711
|
+
PASSWORD_REQUIRED: 'A palavra-passe é obrigatória.',
|
|
5712
|
+
INVALID_CREDENTIALS: 'Email ou palavra-passe inválidos.',
|
|
5713
|
+
LOGIN: 'Iniciar sessão',
|
|
5714
|
+
LOGOUT: 'Terminar sessão',
|
|
5715
|
+
FORGOT_PASSWORD: 'Esqueceu a palavra-passe?',
|
|
5716
|
+
LOGGING_IN: 'A iniciar sessão...',
|
|
5717
|
+
WELCOME_X: 'Bem-vindo, ',
|
|
5718
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Redefinir palavra-passe',
|
|
5719
|
+
RESET_REQUESTED: 'Pedido de redefinição de palavra-passe enviado',
|
|
5720
|
+
BACK_TO_HOMEPAGE: 'Voltar à página inicial',
|
|
5721
|
+
BACK_TO_LOGIN: 'Voltar ao login',
|
|
5722
|
+
RESET_PASSWORD_TITLE: 'Redefinir palavra-passe',
|
|
5723
|
+
PASSWORD_COMPLEXITY: 'A palavra-passe deve conter pelo menos 1 número e 1 letra maiúscula',
|
|
5724
|
+
REPEAT_PASSWORD_REQUIRED: 'Por favor repita a palavra-passe.',
|
|
5725
|
+
PASSWORDS_DO_NOT_MATCH: 'As palavras-passe não coincidem.',
|
|
5726
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Alterar palavra-passe',
|
|
5727
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'A sua palavra-passe foi alterada. Pode agora iniciar sessão com a nova palavra-passe.',
|
|
5728
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Este link expirou ou é inválido.',
|
|
5729
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Pode pedir uma nova palavra-passe clicando no botão abaixo.',
|
|
5730
|
+
RECEIVED_REQUEST: 'O seu pedido foi recebido',
|
|
5731
|
+
ACCOUNT_ACTIVATED_LOGIN: 'A sua conta está agora ativa. Clique abaixo para iniciar sessão com os seus dados.'
|
|
5732
|
+
};
|
|
5230
5733
|
var QSM$3 = {
|
|
5231
5734
|
DEPARTURE: 'Partida',
|
|
5232
5735
|
CHOOSE_DEPARTURE: 'Escolher partida',
|
|
@@ -5329,6 +5832,7 @@ var ptJson = {
|
|
|
5329
5832
|
ERROR: ERROR$2,
|
|
5330
5833
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$2,
|
|
5331
5834
|
NAVBAR: NAVBAR$2,
|
|
5835
|
+
LOGIN: LOGIN$2,
|
|
5332
5836
|
QSM: QSM$3,
|
|
5333
5837
|
SRP: SRP$2
|
|
5334
5838
|
};
|
|
@@ -5436,6 +5940,8 @@ var SIDEBAR$1 = {
|
|
|
5436
5940
|
TRAVELERS_ADULT: 'vuxen',
|
|
5437
5941
|
TRAVELERS_CHILDREN: 'barn',
|
|
5438
5942
|
TRAVELERS_CHILD: 'barn',
|
|
5943
|
+
TRAVELERS_INFANTS: 'spädbarn',
|
|
5944
|
+
TRAVELERS_INFANT: 'spädbarn',
|
|
5439
5945
|
DEPARTURE: 'Utresa',
|
|
5440
5946
|
DEPARTURE_SINGLE: 'Datum',
|
|
5441
5947
|
ARRIVAL: 'Retur',
|
|
@@ -5590,6 +6096,39 @@ var PRINT_OFFER_BUTTON$1 = {
|
|
|
5590
6096
|
var NAVBAR$1 = {
|
|
5591
6097
|
SEARCH: 'Sök'
|
|
5592
6098
|
};
|
|
6099
|
+
var LOGIN$1 = {
|
|
6100
|
+
LOGIN_INTO: 'Logga in på ditt konto',
|
|
6101
|
+
EMAIL: 'E-post',
|
|
6102
|
+
ENTER_YOUR_EMAIL: 'Ange din e-post',
|
|
6103
|
+
EMAIL_REQUIRED: 'E-post krävs.',
|
|
6104
|
+
EMAIL_INVALID: 'E-postadressen är ogiltig.',
|
|
6105
|
+
ENTER_VALID_EMAIL: 'Ange en giltig e-postadress.',
|
|
6106
|
+
PASSWORD: 'Lösenord',
|
|
6107
|
+
ENTER_YOUR_PASSWORD: 'Ange ditt lösenord',
|
|
6108
|
+
RESET_PASSWORD_LABEL: 'Nytt lösenord',
|
|
6109
|
+
RESET_REPEAT_PASSWORD_LABEL: 'Upprepa lösenord',
|
|
6110
|
+
PASSWORD_REQUIRED: 'Lösenord krävs.',
|
|
6111
|
+
INVALID_CREDENTIALS: 'Ogiltig e-post eller lösenord.',
|
|
6112
|
+
LOGIN: 'Logga in',
|
|
6113
|
+
LOGOUT: 'Logga ut',
|
|
6114
|
+
FORGOT_PASSWORD: 'Glömt lösenord?',
|
|
6115
|
+
LOGGING_IN: 'Loggar in...',
|
|
6116
|
+
WELCOME_X: 'Välkommen, ',
|
|
6117
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'Återställ lösenord',
|
|
6118
|
+
RESET_REQUESTED: 'Begäran om återställning av lösenord skickad',
|
|
6119
|
+
BACK_TO_HOMEPAGE: 'Tillbaka till startsidan',
|
|
6120
|
+
BACK_TO_LOGIN: 'Tillbaka till inloggning',
|
|
6121
|
+
RESET_PASSWORD_TITLE: 'Återställ lösenord',
|
|
6122
|
+
PASSWORD_COMPLEXITY: 'Lösenordet måste innehålla minst 1 siffra och 1 versal',
|
|
6123
|
+
REPEAT_PASSWORD_REQUIRED: 'Vänligen upprepa ditt lösenord.',
|
|
6124
|
+
PASSWORDS_DO_NOT_MATCH: 'Lösenorden matchar inte.',
|
|
6125
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'Ändra lösenord',
|
|
6126
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'Ditt lösenord har ändrats. Du kan nu logga in med ditt nya lösenord.',
|
|
6127
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'Denna länk har gått ut eller är ogiltig.',
|
|
6128
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: 'Du kan begära ett nytt lösenord genom att klicka på knappen nedan.',
|
|
6129
|
+
RECEIVED_REQUEST: 'Din begäran har mottagits',
|
|
6130
|
+
ACCOUNT_ACTIVATED_LOGIN: 'Ditt konto är nu aktivt. Klicka nedan för att logga in med dina uppgifter.'
|
|
6131
|
+
};
|
|
5593
6132
|
var QSM$2 = {
|
|
5594
6133
|
DEPARTURE: 'Avgång',
|
|
5595
6134
|
CHOOSE_DEPARTURE: 'Välj avgång',
|
|
@@ -5692,6 +6231,7 @@ var svJson = {
|
|
|
5692
6231
|
ERROR: ERROR$1,
|
|
5693
6232
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$1,
|
|
5694
6233
|
NAVBAR: NAVBAR$1,
|
|
6234
|
+
LOGIN: LOGIN$1,
|
|
5695
6235
|
QSM: QSM$2,
|
|
5696
6236
|
SRP: SRP$1
|
|
5697
6237
|
};
|
|
@@ -5799,6 +6339,8 @@ var SIDEBAR = {
|
|
|
5799
6339
|
TRAVELERS_ADULT: '大人',
|
|
5800
6340
|
TRAVELERS_CHILDREN: '子供',
|
|
5801
6341
|
TRAVELERS_CHILD: '子供',
|
|
6342
|
+
TRAVELERS_INFANTS: '乳児',
|
|
6343
|
+
TRAVELERS_INFANT: '乳児',
|
|
5802
6344
|
DEPARTURE: '往路',
|
|
5803
6345
|
DEPARTURE_SINGLE: '日付',
|
|
5804
6346
|
ARRIVAL: '復路',
|
|
@@ -5951,6 +6493,39 @@ var PRINT_OFFER_BUTTON = {
|
|
|
5951
6493
|
var NAVBAR = {
|
|
5952
6494
|
SEARCH: '検索'
|
|
5953
6495
|
};
|
|
6496
|
+
var LOGIN = {
|
|
6497
|
+
LOGIN_INTO: 'アカウントにログイン',
|
|
6498
|
+
EMAIL: 'メールアドレス',
|
|
6499
|
+
ENTER_YOUR_EMAIL: 'メールアドレスを入力してください',
|
|
6500
|
+
EMAIL_REQUIRED: 'メールアドレスは必須です。',
|
|
6501
|
+
EMAIL_INVALID: 'メールアドレスが無効です。',
|
|
6502
|
+
ENTER_VALID_EMAIL: '有効なメールアドレスを入力してください。',
|
|
6503
|
+
PASSWORD: 'パスワード',
|
|
6504
|
+
ENTER_YOUR_PASSWORD: 'パスワードを入力してください',
|
|
6505
|
+
RESET_PASSWORD_LABEL: '新しいパスワード',
|
|
6506
|
+
RESET_REPEAT_PASSWORD_LABEL: 'パスワードを再入力',
|
|
6507
|
+
PASSWORD_REQUIRED: 'パスワードは必須です。',
|
|
6508
|
+
INVALID_CREDENTIALS: 'メールアドレスまたはパスワードが無効です。',
|
|
6509
|
+
LOGIN: 'ログイン',
|
|
6510
|
+
LOGOUT: 'ログアウト',
|
|
6511
|
+
FORGOT_PASSWORD: 'パスワードをお忘れですか?',
|
|
6512
|
+
LOGGING_IN: 'ログイン中...',
|
|
6513
|
+
WELCOME_X: 'ようこそ、',
|
|
6514
|
+
FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL: 'パスワードをリセット',
|
|
6515
|
+
RESET_REQUESTED: 'パスワードリセットのリクエストが送信されました',
|
|
6516
|
+
BACK_TO_HOMEPAGE: 'ホームページに戻る',
|
|
6517
|
+
BACK_TO_LOGIN: 'ログインに戻る',
|
|
6518
|
+
RESET_PASSWORD_TITLE: 'パスワードをリセット',
|
|
6519
|
+
PASSWORD_COMPLEXITY: 'パスワードは少なくとも1つの数字と1つの大文字を含める必要があります',
|
|
6520
|
+
REPEAT_PASSWORD_REQUIRED: 'パスワードをもう一度入力してください。',
|
|
6521
|
+
PASSWORDS_DO_NOT_MATCH: 'パスワードが一致しません。',
|
|
6522
|
+
RESET_PASSWORD_SUBMIT_LABEL: 'パスワードを変更',
|
|
6523
|
+
RESET_PASSWORD_SUCCESSFUL_MESSAGE: 'パスワードが変更されました。新しいパスワードでログインできます。',
|
|
6524
|
+
RESET_PASSWORD_INVALID_TOKEN_TITLE: 'このリンクは期限切れまたは無効です。',
|
|
6525
|
+
RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION: '以下のボタンをクリックして新しいパスワードをリクエストできます。',
|
|
6526
|
+
RECEIVED_REQUEST: 'リクエストを受け取りました',
|
|
6527
|
+
ACCOUNT_ACTIVATED_LOGIN: 'アカウントが有効になりました。以下をクリックしてログインしてください。'
|
|
6528
|
+
};
|
|
5954
6529
|
var QSM$1 = {
|
|
5955
6530
|
DEPARTURE: '出発',
|
|
5956
6531
|
CHOOSE_DEPARTURE: '出発地を選択',
|
|
@@ -6053,6 +6628,7 @@ var jaJson = {
|
|
|
6053
6628
|
ERROR: ERROR,
|
|
6054
6629
|
PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON,
|
|
6055
6630
|
NAVBAR: NAVBAR,
|
|
6631
|
+
LOGIN: LOGIN,
|
|
6056
6632
|
QSM: QSM$1,
|
|
6057
6633
|
SRP: SRP
|
|
6058
6634
|
};
|
|
@@ -20284,6 +20860,18 @@ var parseFlightLineDateTime = function (date, time) {
|
|
|
20284
20860
|
return undefined;
|
|
20285
20861
|
}
|
|
20286
20862
|
};
|
|
20863
|
+
var getPaxTypeTranslation = function (translations, paxType, numberOfPax) {
|
|
20864
|
+
switch (paxType) {
|
|
20865
|
+
case 'ADULT':
|
|
20866
|
+
return numberOfPax === 1 ? translations.SIDEBAR.TRAVELERS_ADULT : translations.SIDEBAR.TRAVELERS_ADULTS;
|
|
20867
|
+
case 'CHILD':
|
|
20868
|
+
return numberOfPax === 1 ? translations.SIDEBAR.TRAVELERS_CHILD : translations.SIDEBAR.TRAVELERS_CHILDREN;
|
|
20869
|
+
case 'INFANT':
|
|
20870
|
+
return numberOfPax === 1 ? translations.SIDEBAR.TRAVELERS_INFANT : translations.SIDEBAR.TRAVELERS_INFANTS;
|
|
20871
|
+
default:
|
|
20872
|
+
return '';
|
|
20873
|
+
}
|
|
20874
|
+
};
|
|
20287
20875
|
|
|
20288
20876
|
var FlightOptionFlight = function (_a) {
|
|
20289
20877
|
var details = _a.details,
|
|
@@ -23703,9 +24291,9 @@ var aggregatePricePerPaxType = function (priceDetails, requestRooms) {
|
|
|
23703
24291
|
room.pax.forEach(function (pax) {
|
|
23704
24292
|
var paxType = 'ADULT';
|
|
23705
24293
|
if (typeof pax.age === 'number') {
|
|
23706
|
-
if (pax.age
|
|
24294
|
+
if (pax.age <= 11) {
|
|
23707
24295
|
paxType = 'CHILD';
|
|
23708
|
-
} else if (pax.age
|
|
24296
|
+
} else if (pax.age <= 2) {
|
|
23709
24297
|
paxType = 'INFANT';
|
|
23710
24298
|
}
|
|
23711
24299
|
}
|
|
@@ -23728,11 +24316,15 @@ var aggregatePricePerPaxType = function (priceDetails, requestRooms) {
|
|
|
23728
24316
|
detailsMap[descKey] = {
|
|
23729
24317
|
numberOfPax: 1,
|
|
23730
24318
|
description: detail.priceDescription || '',
|
|
23731
|
-
price: ppp.price
|
|
24319
|
+
price: ppp.price,
|
|
24320
|
+
paxIds: [ppp.paxId]
|
|
23732
24321
|
};
|
|
23733
24322
|
} else {
|
|
23734
|
-
detailsMap[descKey].numberOfPax += 1;
|
|
23735
24323
|
detailsMap[descKey].price += ppp.price;
|
|
24324
|
+
if (!detailsMap[descKey].paxIds.includes(ppp.paxId)) {
|
|
24325
|
+
detailsMap[descKey].paxIds.push(ppp.paxId);
|
|
24326
|
+
detailsMap[descKey].numberOfPax += 1;
|
|
24327
|
+
}
|
|
23736
24328
|
}
|
|
23737
24329
|
}
|
|
23738
24330
|
});
|
|
@@ -23896,8 +24488,6 @@ var Sidebar = function (_a) {
|
|
|
23896
24488
|
var handleToggleClick = function () {
|
|
23897
24489
|
setActive(!active);
|
|
23898
24490
|
};
|
|
23899
|
-
console.log('basePricePerPaxType', basePricePerPaxType);
|
|
23900
|
-
console.log('seperateExtraPricePerPaxType', seperateExtraPricePerPaxType);
|
|
23901
24491
|
return React__default['default'].createElement(
|
|
23902
24492
|
'div',
|
|
23903
24493
|
{ className: buildClassName(['booking__sidebar', active && 'booking__sidebar--active']) },
|
|
@@ -24031,7 +24621,51 @@ var Sidebar = function (_a) {
|
|
|
24031
24621
|
React__default['default'].createElement('h6', { className: 'pricing-summary__title' }, translations.SIDEBAR.BASE_PRICE)
|
|
24032
24622
|
),
|
|
24033
24623
|
React__default['default'].createElement('div', { className: 'pricing-summary__value' }, formatPrice(basePrice, currencyCode))
|
|
24034
|
-
)
|
|
24624
|
+
),
|
|
24625
|
+
basePricePerPaxType &&
|
|
24626
|
+
basePricePerPaxType.map(function (ppt, index) {
|
|
24627
|
+
return React__default['default'].createElement(
|
|
24628
|
+
React__default['default'].Fragment,
|
|
24629
|
+
{ key: ''.concat(ppt.paxType, '-').concat(index) },
|
|
24630
|
+
React__default['default'].createElement(
|
|
24631
|
+
'div',
|
|
24632
|
+
{ className: 'pricing-summary__row' },
|
|
24633
|
+
React__default['default'].createElement(
|
|
24634
|
+
'div',
|
|
24635
|
+
{ className: 'pricing-summary__property' },
|
|
24636
|
+
ppt.numberOfPax,
|
|
24637
|
+
' ',
|
|
24638
|
+
getPaxTypeTranslation(translations, ppt.paxType, ppt.numberOfPax)
|
|
24639
|
+
),
|
|
24640
|
+
React__default['default'].createElement(
|
|
24641
|
+
'div',
|
|
24642
|
+
{ className: 'pricing-summary__value' },
|
|
24643
|
+
formatPrice(ppt.pricePerPaxType, currencyCode)
|
|
24644
|
+
)
|
|
24645
|
+
),
|
|
24646
|
+
ppt.details.map(function (detail, dIndex) {
|
|
24647
|
+
return React__default['default'].createElement(
|
|
24648
|
+
'div',
|
|
24649
|
+
{
|
|
24650
|
+
className: 'pricing-summary__row pricing-summary__row--sub',
|
|
24651
|
+
key: ''.concat(ppt.paxType, '-').concat(index, '-').concat(dIndex)
|
|
24652
|
+
},
|
|
24653
|
+
React__default['default'].createElement(
|
|
24654
|
+
'div',
|
|
24655
|
+
{ className: 'pricing-summary__property' },
|
|
24656
|
+
detail.numberOfPax,
|
|
24657
|
+
'x ',
|
|
24658
|
+
detail.description
|
|
24659
|
+
),
|
|
24660
|
+
React__default['default'].createElement(
|
|
24661
|
+
'div',
|
|
24662
|
+
{ className: 'pricing-summary__value' },
|
|
24663
|
+
formatPrice(detail.price / detail.numberOfPax, currencyCode)
|
|
24664
|
+
)
|
|
24665
|
+
);
|
|
24666
|
+
})
|
|
24667
|
+
);
|
|
24668
|
+
})
|
|
24035
24669
|
),
|
|
24036
24670
|
!lodash.isEmpty(includedCosts) &&
|
|
24037
24671
|
React__default['default'].createElement(
|
|
@@ -24096,10 +24730,54 @@ var Sidebar = function (_a) {
|
|
|
24096
24730
|
{ className: 'pricing-summary__row' },
|
|
24097
24731
|
React__default['default'].createElement(
|
|
24098
24732
|
'div',
|
|
24099
|
-
{ className: '
|
|
24733
|
+
{ className: 'pricing-summary__property' },
|
|
24100
24734
|
(_a = priceDetail.accommodationName) !== null && _a !== void 0 ? _a : priceDetail.accommodationCode
|
|
24101
24735
|
)
|
|
24102
|
-
)
|
|
24736
|
+
),
|
|
24737
|
+
seperateExtraPricePerPaxType &&
|
|
24738
|
+
seperateExtraPricePerPaxType.map(function (ppt, index) {
|
|
24739
|
+
return React__default['default'].createElement(
|
|
24740
|
+
React__default['default'].Fragment,
|
|
24741
|
+
{ key: ''.concat(ppt.paxType, '-').concat(index) },
|
|
24742
|
+
React__default['default'].createElement(
|
|
24743
|
+
'div',
|
|
24744
|
+
{ className: 'pricing-summary__row' },
|
|
24745
|
+
React__default['default'].createElement(
|
|
24746
|
+
'div',
|
|
24747
|
+
{ className: 'pricing-summary__property' },
|
|
24748
|
+
ppt.numberOfPax,
|
|
24749
|
+
' ',
|
|
24750
|
+
getPaxTypeTranslation(translations, ppt.paxType, ppt.numberOfPax)
|
|
24751
|
+
),
|
|
24752
|
+
React__default['default'].createElement(
|
|
24753
|
+
'div',
|
|
24754
|
+
{ className: 'pricing-summary__value' },
|
|
24755
|
+
formatPrice(ppt.pricePerPaxType, currencyCode)
|
|
24756
|
+
)
|
|
24757
|
+
),
|
|
24758
|
+
ppt.details.map(function (detail, dIndex) {
|
|
24759
|
+
return React__default['default'].createElement(
|
|
24760
|
+
'div',
|
|
24761
|
+
{
|
|
24762
|
+
className: 'pricing-summary__row pricing-summary__row--sub',
|
|
24763
|
+
key: ''.concat(ppt.paxType, '-').concat(index, '-').concat(dIndex)
|
|
24764
|
+
},
|
|
24765
|
+
React__default['default'].createElement(
|
|
24766
|
+
'div',
|
|
24767
|
+
{ className: 'pricing-summary__property' },
|
|
24768
|
+
detail.numberOfPax,
|
|
24769
|
+
'x ',
|
|
24770
|
+
detail.description
|
|
24771
|
+
),
|
|
24772
|
+
React__default['default'].createElement(
|
|
24773
|
+
'div',
|
|
24774
|
+
{ className: 'pricing-summary__value' },
|
|
24775
|
+
formatPrice(detail.price / detail.numberOfPax, currencyCode)
|
|
24776
|
+
)
|
|
24777
|
+
);
|
|
24778
|
+
})
|
|
24779
|
+
);
|
|
24780
|
+
})
|
|
24103
24781
|
);
|
|
24104
24782
|
})
|
|
24105
24783
|
)
|
|
@@ -24216,7 +24894,8 @@ var SidebarContainer = function (_a) {
|
|
|
24216
24894
|
var _f = React.useContext(SettingsContext),
|
|
24217
24895
|
sidebarHeaderComponent = _f.sidebarHeaderComponent,
|
|
24218
24896
|
sidebarFooterComponent = _f.sidebarFooterComponent,
|
|
24219
|
-
loaderComponent = _f.loaderComponent
|
|
24897
|
+
loaderComponent = _f.loaderComponent,
|
|
24898
|
+
showPricesPerPaxType = _f.showPricesPerPaxType;
|
|
24220
24899
|
var bookingAttributes = reactRedux.useSelector(selectBookingAttributes);
|
|
24221
24900
|
var rooms = reactRedux.useSelector(selectFormRooms);
|
|
24222
24901
|
var travelerRooms = getTravelersText(rooms);
|
|
@@ -24240,12 +24919,6 @@ var SidebarContainer = function (_a) {
|
|
|
24240
24919
|
var includedServiceTypes = reactRedux.useSelector(selectIncludedServiceTypes);
|
|
24241
24920
|
var isUnavailable = reactRedux.useSelector(selectIsUnavailable) || false;
|
|
24242
24921
|
var isLoading = isFetchingProductOptions || isFetchingPriceDetails;
|
|
24243
|
-
var requestRooms = reactRedux.useSelector(selectRequestRooms);
|
|
24244
|
-
requestRooms === null || requestRooms === void 0
|
|
24245
|
-
? void 0
|
|
24246
|
-
: requestRooms.flatMap(function (x) {
|
|
24247
|
-
return x.pax;
|
|
24248
|
-
});
|
|
24249
24922
|
return React__default['default'].createElement(Sidebar, {
|
|
24250
24923
|
productName: productName,
|
|
24251
24924
|
thumbnailUrl: thumbnailUrl,
|
|
@@ -24271,8 +24944,8 @@ var SidebarContainer = function (_a) {
|
|
|
24271
24944
|
footerComponent: sidebarFooterComponent !== null && sidebarFooterComponent !== void 0 ? sidebarFooterComponent : undefined,
|
|
24272
24945
|
loaderComponent: loaderComponent !== null && loaderComponent !== void 0 ? loaderComponent : undefined,
|
|
24273
24946
|
isUnavailable: isUnavailable,
|
|
24274
|
-
basePricePerPaxType: reactRedux.useSelector(selectBasePricePerPaxType),
|
|
24275
|
-
seperateExtraPricePerPaxType: reactRedux.useSelector(selectSeparateExtraPriceDetailsPerPaxType)
|
|
24947
|
+
basePricePerPaxType: showPricesPerPaxType ? reactRedux.useSelector(selectBasePricePerPaxType) : undefined,
|
|
24948
|
+
seperateExtraPricePerPaxType: showPricesPerPaxType ? reactRedux.useSelector(selectSeparateExtraPriceDetailsPerPaxType) : undefined
|
|
24276
24949
|
});
|
|
24277
24950
|
};
|
|
24278
24951
|
|
|
@@ -29012,7 +29685,10 @@ var Navbar = function (_a) {
|
|
|
29012
29685
|
language = _a.language,
|
|
29013
29686
|
languages = _a.languages,
|
|
29014
29687
|
onLanguageChange = _a.onLanguageChange,
|
|
29015
|
-
onSearch = _a.onSearch
|
|
29688
|
+
onSearch = _a.onSearch,
|
|
29689
|
+
member = _a.member,
|
|
29690
|
+
onLogin = _a.onLogin,
|
|
29691
|
+
onLogout = _a.onLogout;
|
|
29016
29692
|
var _c = React.useState(false),
|
|
29017
29693
|
menuOpen = _c[0],
|
|
29018
29694
|
setMenuOpen = _c[1];
|
|
@@ -29240,6 +29916,18 @@ var Navbar = function (_a) {
|
|
|
29240
29916
|
)
|
|
29241
29917
|
);
|
|
29242
29918
|
};
|
|
29919
|
+
var handleLogout = function (event) {
|
|
29920
|
+
event.preventDefault();
|
|
29921
|
+
if (onLogout) {
|
|
29922
|
+
onLogout();
|
|
29923
|
+
}
|
|
29924
|
+
};
|
|
29925
|
+
var handleLogin = function (event) {
|
|
29926
|
+
event.preventDefault();
|
|
29927
|
+
if (onLogin) {
|
|
29928
|
+
onLogin();
|
|
29929
|
+
}
|
|
29930
|
+
};
|
|
29243
29931
|
return React__default['default'].createElement(
|
|
29244
29932
|
React__default['default'].Fragment,
|
|
29245
29933
|
null,
|
|
@@ -29252,6 +29940,20 @@ var Navbar = function (_a) {
|
|
|
29252
29940
|
React__default['default'].createElement(
|
|
29253
29941
|
'div',
|
|
29254
29942
|
{ className: 'nav__subnav__links' },
|
|
29943
|
+
member && React__default['default'].createElement('span', { className: 'nav__subnav__member' }, translations.LOGIN.WELCOME_X, member.name),
|
|
29944
|
+
member
|
|
29945
|
+
? React__default['default'].createElement(
|
|
29946
|
+
React__default['default'].Fragment,
|
|
29947
|
+
null,
|
|
29948
|
+
onLogout &&
|
|
29949
|
+
React__default['default'].createElement('a', { href: '#', className: 'nav__subnav__link', onClick: handleLogout }, translations.LOGIN.LOGOUT)
|
|
29950
|
+
)
|
|
29951
|
+
: React__default['default'].createElement(
|
|
29952
|
+
React__default['default'].Fragment,
|
|
29953
|
+
null,
|
|
29954
|
+
onLogin &&
|
|
29955
|
+
React__default['default'].createElement('a', { href: '#', className: 'nav__subnav__link', onClick: handleLogin }, translations.LOGIN.LOGIN)
|
|
29956
|
+
),
|
|
29255
29957
|
React__default['default'].createElement(LanguageSwitcher, {
|
|
29256
29958
|
value: language.code,
|
|
29257
29959
|
languages: languages,
|
|
@@ -32610,7 +33312,9 @@ var QSMContainer = function () {
|
|
|
32610
33312
|
fieldConfig: openJawReturnDestinationField,
|
|
32611
33313
|
showReverse: openJawReturnDestinationField.showReverse
|
|
32612
33314
|
}),
|
|
32613
|
-
qsmType == 'hotel'
|
|
33315
|
+
(qsmType == 'hotel' || qsmType == 'hotel-flight') &&
|
|
33316
|
+
destination &&
|
|
33317
|
+
React__default['default'].createElement(SearchInputGroup, { fieldConfig: destination }),
|
|
32614
33318
|
React__default['default'].createElement(Dates, { value: dateRange, onChange: handleDateChange }),
|
|
32615
33319
|
askTravelers && React__default['default'].createElement(TravelInputGroup, null),
|
|
32616
33320
|
React__default['default'].createElement(
|
|
@@ -36590,7 +37294,6 @@ var FlyIn = function (_a) {
|
|
|
36590
37294
|
'div',
|
|
36591
37295
|
{ className: 'flyin__content-cards' },
|
|
36592
37296
|
uniqueOutwardFlights.map(function (flightOption, index) {
|
|
36593
|
-
var _a;
|
|
36594
37297
|
var firstSegment = lodash.first(flightOption.outward.segments);
|
|
36595
37298
|
if (!firstSegment) return null;
|
|
36596
37299
|
var diff = getOutwardPriceDiff(firstSegment.metaData.fareCode);
|
|
@@ -36776,9 +37479,9 @@ var FlyIn = function (_a) {
|
|
|
36776
37479
|
},
|
|
36777
37480
|
React__default['default'].createElement(
|
|
36778
37481
|
'div',
|
|
36779
|
-
{ className: 'cta cta--selected' },
|
|
37482
|
+
{ className: 'cta '.concat(selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'cta--selected' : '') },
|
|
36780
37483
|
' ',
|
|
36781
|
-
selectedOutwardFareCode ===
|
|
37484
|
+
selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'Selected' : 'Select'
|
|
36782
37485
|
)
|
|
36783
37486
|
)
|
|
36784
37487
|
);
|
|
@@ -36882,7 +37585,6 @@ var FlyIn = function (_a) {
|
|
|
36882
37585
|
'div',
|
|
36883
37586
|
{ className: 'flyin__content-cards' },
|
|
36884
37587
|
uniqueReturnFlights.map(function (flightOption, index) {
|
|
36885
|
-
var _a;
|
|
36886
37588
|
var firstSegment = lodash.first(flightOption.return.segments);
|
|
36887
37589
|
if (!firstSegment) return null;
|
|
36888
37590
|
var diff = getReturnPriceDiff(firstSegment.metaData.fareCode);
|
|
@@ -37068,9 +37770,9 @@ var FlyIn = function (_a) {
|
|
|
37068
37770
|
},
|
|
37069
37771
|
React__default['default'].createElement(
|
|
37070
37772
|
'div',
|
|
37071
|
-
{ className: 'cta cta--selected' },
|
|
37773
|
+
{ className: 'cta '.concat(selectedReturnFareCode === firstSegment.metaData.fareCode ? 'cta--selected' : '') },
|
|
37072
37774
|
' ',
|
|
37073
|
-
|
|
37775
|
+
selectedReturnFareCode === firstSegment.metaData.fareCode ? 'Selected' : 'Select'
|
|
37074
37776
|
)
|
|
37075
37777
|
)
|
|
37076
37778
|
);
|
|
@@ -41203,6 +41905,3010 @@ var ImageCardGrid = function (_a) {
|
|
|
41203
41905
|
);
|
|
41204
41906
|
};
|
|
41205
41907
|
|
|
41908
|
+
/**
|
|
41909
|
+
* Based on Kendo UI Core expression code <https://github.com/telerik/kendo-ui-core#license-information>
|
|
41910
|
+
*/
|
|
41911
|
+
|
|
41912
|
+
function Cache(maxSize) {
|
|
41913
|
+
this._maxSize = maxSize;
|
|
41914
|
+
this.clear();
|
|
41915
|
+
}
|
|
41916
|
+
Cache.prototype.clear = function () {
|
|
41917
|
+
this._size = 0;
|
|
41918
|
+
this._values = Object.create(null);
|
|
41919
|
+
};
|
|
41920
|
+
Cache.prototype.get = function (key) {
|
|
41921
|
+
return this._values[key];
|
|
41922
|
+
};
|
|
41923
|
+
Cache.prototype.set = function (key, value) {
|
|
41924
|
+
this._size >= this._maxSize && this.clear();
|
|
41925
|
+
if (!(key in this._values)) this._size++;
|
|
41926
|
+
|
|
41927
|
+
return (this._values[key] = value);
|
|
41928
|
+
};
|
|
41929
|
+
|
|
41930
|
+
var SPLIT_REGEX = /[^.^\]^[]+|(?=\[\]|\.\.)/g,
|
|
41931
|
+
DIGIT_REGEX = /^\d+$/,
|
|
41932
|
+
LEAD_DIGIT_REGEX = /^\d/,
|
|
41933
|
+
SPEC_CHAR_REGEX = /[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,
|
|
41934
|
+
CLEAN_QUOTES_REGEX = /^\s*(['"]?)(.*?)(\1)\s*$/,
|
|
41935
|
+
MAX_CACHE_SIZE = 512;
|
|
41936
|
+
|
|
41937
|
+
var pathCache = new Cache(MAX_CACHE_SIZE),
|
|
41938
|
+
setCache = new Cache(MAX_CACHE_SIZE),
|
|
41939
|
+
getCache = new Cache(MAX_CACHE_SIZE);
|
|
41940
|
+
|
|
41941
|
+
var propertyExpr = {
|
|
41942
|
+
Cache: Cache,
|
|
41943
|
+
|
|
41944
|
+
split: split,
|
|
41945
|
+
|
|
41946
|
+
normalizePath: normalizePath,
|
|
41947
|
+
|
|
41948
|
+
setter: function (path) {
|
|
41949
|
+
var parts = normalizePath(path);
|
|
41950
|
+
|
|
41951
|
+
return (
|
|
41952
|
+
setCache.get(path) ||
|
|
41953
|
+
setCache.set(path, function setter(obj, value) {
|
|
41954
|
+
var index = 0;
|
|
41955
|
+
var len = parts.length;
|
|
41956
|
+
var data = obj;
|
|
41957
|
+
|
|
41958
|
+
while (index < len - 1) {
|
|
41959
|
+
var part = parts[index];
|
|
41960
|
+
if (part === '__proto__' || part === 'constructor' || part === 'prototype') {
|
|
41961
|
+
return obj;
|
|
41962
|
+
}
|
|
41963
|
+
|
|
41964
|
+
data = data[parts[index++]];
|
|
41965
|
+
}
|
|
41966
|
+
data[parts[index]] = value;
|
|
41967
|
+
})
|
|
41968
|
+
);
|
|
41969
|
+
},
|
|
41970
|
+
|
|
41971
|
+
getter: function (path, safe) {
|
|
41972
|
+
var parts = normalizePath(path);
|
|
41973
|
+
return (
|
|
41974
|
+
getCache.get(path) ||
|
|
41975
|
+
getCache.set(path, function getter(data) {
|
|
41976
|
+
var index = 0,
|
|
41977
|
+
len = parts.length;
|
|
41978
|
+
while (index < len) {
|
|
41979
|
+
if (data != null || !safe) data = data[parts[index++]];
|
|
41980
|
+
else return;
|
|
41981
|
+
}
|
|
41982
|
+
return data;
|
|
41983
|
+
})
|
|
41984
|
+
);
|
|
41985
|
+
},
|
|
41986
|
+
|
|
41987
|
+
join: function (segments) {
|
|
41988
|
+
return segments.reduce(function (path, part) {
|
|
41989
|
+
return path + (isQuoted(part) || DIGIT_REGEX.test(part) ? '[' + part + ']' : (path ? '.' : '') + part);
|
|
41990
|
+
}, '');
|
|
41991
|
+
},
|
|
41992
|
+
|
|
41993
|
+
forEach: function (path, cb, thisArg) {
|
|
41994
|
+
forEach(Array.isArray(path) ? path : split(path), cb, thisArg);
|
|
41995
|
+
}
|
|
41996
|
+
};
|
|
41997
|
+
|
|
41998
|
+
function normalizePath(path) {
|
|
41999
|
+
return (
|
|
42000
|
+
pathCache.get(path) ||
|
|
42001
|
+
pathCache.set(
|
|
42002
|
+
path,
|
|
42003
|
+
split(path).map(function (part) {
|
|
42004
|
+
return part.replace(CLEAN_QUOTES_REGEX, '$2');
|
|
42005
|
+
})
|
|
42006
|
+
)
|
|
42007
|
+
);
|
|
42008
|
+
}
|
|
42009
|
+
|
|
42010
|
+
function split(path) {
|
|
42011
|
+
return path.match(SPLIT_REGEX) || [''];
|
|
42012
|
+
}
|
|
42013
|
+
|
|
42014
|
+
function forEach(parts, iter, thisArg) {
|
|
42015
|
+
var len = parts.length,
|
|
42016
|
+
part,
|
|
42017
|
+
idx,
|
|
42018
|
+
isArray,
|
|
42019
|
+
isBracket;
|
|
42020
|
+
|
|
42021
|
+
for (idx = 0; idx < len; idx++) {
|
|
42022
|
+
part = parts[idx];
|
|
42023
|
+
|
|
42024
|
+
if (part) {
|
|
42025
|
+
if (shouldBeQuoted(part)) {
|
|
42026
|
+
part = '"' + part + '"';
|
|
42027
|
+
}
|
|
42028
|
+
|
|
42029
|
+
isBracket = isQuoted(part);
|
|
42030
|
+
isArray = !isBracket && /^\d+$/.test(part);
|
|
42031
|
+
|
|
42032
|
+
iter.call(thisArg, part, isBracket, isArray, idx, parts);
|
|
42033
|
+
}
|
|
42034
|
+
}
|
|
42035
|
+
}
|
|
42036
|
+
|
|
42037
|
+
function isQuoted(str) {
|
|
42038
|
+
return typeof str === 'string' && str && ["'", '"'].indexOf(str.charAt(0)) !== -1;
|
|
42039
|
+
}
|
|
42040
|
+
|
|
42041
|
+
function hasLeadingNumber(part) {
|
|
42042
|
+
return part.match(LEAD_DIGIT_REGEX) && !part.match(DIGIT_REGEX);
|
|
42043
|
+
}
|
|
42044
|
+
|
|
42045
|
+
function hasSpecialChars(part) {
|
|
42046
|
+
return SPEC_CHAR_REGEX.test(part);
|
|
42047
|
+
}
|
|
42048
|
+
|
|
42049
|
+
function shouldBeQuoted(part) {
|
|
42050
|
+
return !isQuoted(part) && (hasLeadingNumber(part) || hasSpecialChars(part));
|
|
42051
|
+
}
|
|
42052
|
+
|
|
42053
|
+
const reWords =
|
|
42054
|
+
/[A-Z\xc0-\xd6\xd8-\xde]?[a-z\xdf-\xf6\xf8-\xff]+(?:['’](?:d|ll|m|re|s|t|ve))?(?=[\xac\xb1\xd7\xf7\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xbf\u2000-\u206f \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000]|[A-Z\xc0-\xd6\xd8-\xde]|$)|(?:[A-Z\xc0-\xd6\xd8-\xde]|[^\ud800-\udfff\xac\xb1\xd7\xf7\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xbf\u2000-\u206f \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\d+\u2700-\u27bfa-z\xdf-\xf6\xf8-\xffA-Z\xc0-\xd6\xd8-\xde])+(?:['’](?:D|LL|M|RE|S|T|VE))?(?=[\xac\xb1\xd7\xf7\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xbf\u2000-\u206f \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000]|[A-Z\xc0-\xd6\xd8-\xde](?:[a-z\xdf-\xf6\xf8-\xff]|[^\ud800-\udfff\xac\xb1\xd7\xf7\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xbf\u2000-\u206f \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\d+\u2700-\u27bfa-z\xdf-\xf6\xf8-\xffA-Z\xc0-\xd6\xd8-\xde])|$)|[A-Z\xc0-\xd6\xd8-\xde]?(?:[a-z\xdf-\xf6\xf8-\xff]|[^\ud800-\udfff\xac\xb1\xd7\xf7\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xbf\u2000-\u206f \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\d+\u2700-\u27bfa-z\xdf-\xf6\xf8-\xffA-Z\xc0-\xd6\xd8-\xde])+(?:['’](?:d|ll|m|re|s|t|ve))?|[A-Z\xc0-\xd6\xd8-\xde]+(?:['’](?:D|LL|M|RE|S|T|VE))?|\d*(?:1ST|2ND|3RD|(?![123])\dTH)(?=\b|[a-z_])|\d*(?:1st|2nd|3rd|(?![123])\dth)(?=\b|[A-Z_])|\d+|(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe2f\u20d0-\u20ff]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe2f\u20d0-\u20ff]|\ud83c[\udffb-\udfff])?)*/g;
|
|
42055
|
+
|
|
42056
|
+
const words = (str) => str.match(reWords) || [];
|
|
42057
|
+
|
|
42058
|
+
const upperFirst = (str) => str[0].toUpperCase() + str.slice(1);
|
|
42059
|
+
|
|
42060
|
+
const join = (str, d) => words(str).join(d).toLowerCase();
|
|
42061
|
+
|
|
42062
|
+
const camelCase = (str) => words(str).reduce((acc, next) => `${acc}${!acc ? next.toLowerCase() : next[0].toUpperCase() + next.slice(1).toLowerCase()}`, '');
|
|
42063
|
+
|
|
42064
|
+
const pascalCase = (str) => upperFirst(camelCase(str));
|
|
42065
|
+
|
|
42066
|
+
const snakeCase = (str) => join(str, '_');
|
|
42067
|
+
|
|
42068
|
+
const kebabCase = (str) => join(str, '-');
|
|
42069
|
+
|
|
42070
|
+
const sentenceCase = (str) => upperFirst(join(str, ' '));
|
|
42071
|
+
|
|
42072
|
+
const titleCase = (str) => words(str).map(upperFirst).join(' ');
|
|
42073
|
+
|
|
42074
|
+
var tinyCase = {
|
|
42075
|
+
words,
|
|
42076
|
+
upperFirst,
|
|
42077
|
+
camelCase,
|
|
42078
|
+
pascalCase,
|
|
42079
|
+
snakeCase,
|
|
42080
|
+
kebabCase,
|
|
42081
|
+
sentenceCase,
|
|
42082
|
+
titleCase
|
|
42083
|
+
};
|
|
42084
|
+
|
|
42085
|
+
var toposort$2 = { exports: {} };
|
|
42086
|
+
|
|
42087
|
+
/**
|
|
42088
|
+
* Topological sorting function
|
|
42089
|
+
*
|
|
42090
|
+
* @param {Array} edges
|
|
42091
|
+
* @returns {Array}
|
|
42092
|
+
*/
|
|
42093
|
+
|
|
42094
|
+
toposort$2.exports = function (edges) {
|
|
42095
|
+
return toposort(uniqueNodes(edges), edges);
|
|
42096
|
+
};
|
|
42097
|
+
|
|
42098
|
+
toposort$2.exports.array = toposort;
|
|
42099
|
+
|
|
42100
|
+
function toposort(nodes, edges) {
|
|
42101
|
+
var cursor = nodes.length,
|
|
42102
|
+
sorted = new Array(cursor),
|
|
42103
|
+
visited = {},
|
|
42104
|
+
i = cursor,
|
|
42105
|
+
// Better data structures make algorithm much faster.
|
|
42106
|
+
outgoingEdges = makeOutgoingEdges(edges),
|
|
42107
|
+
nodesHash = makeNodesHash(nodes);
|
|
42108
|
+
|
|
42109
|
+
// check for unknown nodes
|
|
42110
|
+
edges.forEach(function (edge) {
|
|
42111
|
+
if (!nodesHash.has(edge[0]) || !nodesHash.has(edge[1])) {
|
|
42112
|
+
throw new Error('Unknown node. There is an unknown node in the supplied edges.');
|
|
42113
|
+
}
|
|
42114
|
+
});
|
|
42115
|
+
|
|
42116
|
+
while (i--) {
|
|
42117
|
+
if (!visited[i]) visit(nodes[i], i, new Set());
|
|
42118
|
+
}
|
|
42119
|
+
|
|
42120
|
+
return sorted;
|
|
42121
|
+
|
|
42122
|
+
function visit(node, i, predecessors) {
|
|
42123
|
+
if (predecessors.has(node)) {
|
|
42124
|
+
var nodeRep;
|
|
42125
|
+
try {
|
|
42126
|
+
nodeRep = ', node was:' + JSON.stringify(node);
|
|
42127
|
+
} catch (e) {
|
|
42128
|
+
nodeRep = '';
|
|
42129
|
+
}
|
|
42130
|
+
throw new Error('Cyclic dependency' + nodeRep);
|
|
42131
|
+
}
|
|
42132
|
+
|
|
42133
|
+
if (!nodesHash.has(node)) {
|
|
42134
|
+
throw new Error('Found unknown node. Make sure to provided all involved nodes. Unknown node: ' + JSON.stringify(node));
|
|
42135
|
+
}
|
|
42136
|
+
|
|
42137
|
+
if (visited[i]) return;
|
|
42138
|
+
visited[i] = true;
|
|
42139
|
+
|
|
42140
|
+
var outgoing = outgoingEdges.get(node) || new Set();
|
|
42141
|
+
outgoing = Array.from(outgoing);
|
|
42142
|
+
|
|
42143
|
+
if ((i = outgoing.length)) {
|
|
42144
|
+
predecessors.add(node);
|
|
42145
|
+
do {
|
|
42146
|
+
var child = outgoing[--i];
|
|
42147
|
+
visit(child, nodesHash.get(child), predecessors);
|
|
42148
|
+
} while (i);
|
|
42149
|
+
predecessors.delete(node);
|
|
42150
|
+
}
|
|
42151
|
+
|
|
42152
|
+
sorted[--cursor] = node;
|
|
42153
|
+
}
|
|
42154
|
+
}
|
|
42155
|
+
|
|
42156
|
+
function uniqueNodes(arr) {
|
|
42157
|
+
var res = new Set();
|
|
42158
|
+
for (var i = 0, len = arr.length; i < len; i++) {
|
|
42159
|
+
var edge = arr[i];
|
|
42160
|
+
res.add(edge[0]);
|
|
42161
|
+
res.add(edge[1]);
|
|
42162
|
+
}
|
|
42163
|
+
return Array.from(res);
|
|
42164
|
+
}
|
|
42165
|
+
|
|
42166
|
+
function makeOutgoingEdges(arr) {
|
|
42167
|
+
var edges = new Map();
|
|
42168
|
+
for (var i = 0, len = arr.length; i < len; i++) {
|
|
42169
|
+
var edge = arr[i];
|
|
42170
|
+
if (!edges.has(edge[0])) edges.set(edge[0], new Set());
|
|
42171
|
+
if (!edges.has(edge[1])) edges.set(edge[1], new Set());
|
|
42172
|
+
edges.get(edge[0]).add(edge[1]);
|
|
42173
|
+
}
|
|
42174
|
+
return edges;
|
|
42175
|
+
}
|
|
42176
|
+
|
|
42177
|
+
function makeNodesHash(arr) {
|
|
42178
|
+
var res = new Map();
|
|
42179
|
+
for (var i = 0, len = arr.length; i < len; i++) {
|
|
42180
|
+
res.set(arr[i], i);
|
|
42181
|
+
}
|
|
42182
|
+
return res;
|
|
42183
|
+
}
|
|
42184
|
+
|
|
42185
|
+
var toposort$1 = toposort$2.exports;
|
|
42186
|
+
|
|
42187
|
+
const toString$1 = Object.prototype.toString;
|
|
42188
|
+
const errorToString = Error.prototype.toString;
|
|
42189
|
+
const regExpToString = RegExp.prototype.toString;
|
|
42190
|
+
const symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => '';
|
|
42191
|
+
const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
|
|
42192
|
+
function printNumber(val) {
|
|
42193
|
+
if (val != +val) return 'NaN';
|
|
42194
|
+
const isNegativeZero = val === 0 && 1 / val < 0;
|
|
42195
|
+
return isNegativeZero ? '-0' : '' + val;
|
|
42196
|
+
}
|
|
42197
|
+
function printSimpleValue(val, quoteStrings = false) {
|
|
42198
|
+
if (val == null || val === true || val === false) return '' + val;
|
|
42199
|
+
const typeOf = typeof val;
|
|
42200
|
+
if (typeOf === 'number') return printNumber(val);
|
|
42201
|
+
if (typeOf === 'string') return quoteStrings ? `"${val}"` : val;
|
|
42202
|
+
if (typeOf === 'function') return '[Function ' + (val.name || 'anonymous') + ']';
|
|
42203
|
+
if (typeOf === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
|
|
42204
|
+
const tag = toString$1.call(val).slice(8, -1);
|
|
42205
|
+
if (tag === 'Date') return isNaN(val.getTime()) ? '' + val : val.toISOString(val);
|
|
42206
|
+
if (tag === 'Error' || val instanceof Error) return '[' + errorToString.call(val) + ']';
|
|
42207
|
+
if (tag === 'RegExp') return regExpToString.call(val);
|
|
42208
|
+
return null;
|
|
42209
|
+
}
|
|
42210
|
+
function printValue(value, quoteStrings) {
|
|
42211
|
+
let result = printSimpleValue(value, quoteStrings);
|
|
42212
|
+
if (result !== null) return result;
|
|
42213
|
+
return JSON.stringify(
|
|
42214
|
+
value,
|
|
42215
|
+
function (key, value) {
|
|
42216
|
+
let result = printSimpleValue(this[key], quoteStrings);
|
|
42217
|
+
if (result !== null) return result;
|
|
42218
|
+
return value;
|
|
42219
|
+
},
|
|
42220
|
+
2
|
|
42221
|
+
);
|
|
42222
|
+
}
|
|
42223
|
+
|
|
42224
|
+
function toArray(value) {
|
|
42225
|
+
return value == null ? [] : [].concat(value);
|
|
42226
|
+
}
|
|
42227
|
+
|
|
42228
|
+
let _Symbol$toStringTag, _Symbol$hasInstance, _Symbol$toStringTag2;
|
|
42229
|
+
let strReg = /\$\{\s*(\w+)\s*\}/g;
|
|
42230
|
+
_Symbol$toStringTag = Symbol.toStringTag;
|
|
42231
|
+
class ValidationErrorNoStack {
|
|
42232
|
+
constructor(errorOrErrors, value, field, type) {
|
|
42233
|
+
this.name = void 0;
|
|
42234
|
+
this.message = void 0;
|
|
42235
|
+
this.value = void 0;
|
|
42236
|
+
this.path = void 0;
|
|
42237
|
+
this.type = void 0;
|
|
42238
|
+
this.params = void 0;
|
|
42239
|
+
this.errors = void 0;
|
|
42240
|
+
this.inner = void 0;
|
|
42241
|
+
this[_Symbol$toStringTag] = 'Error';
|
|
42242
|
+
this.name = 'ValidationError';
|
|
42243
|
+
this.value = value;
|
|
42244
|
+
this.path = field;
|
|
42245
|
+
this.type = type;
|
|
42246
|
+
this.errors = [];
|
|
42247
|
+
this.inner = [];
|
|
42248
|
+
toArray(errorOrErrors).forEach((err) => {
|
|
42249
|
+
if (ValidationError.isError(err)) {
|
|
42250
|
+
this.errors.push(...err.errors);
|
|
42251
|
+
const innerErrors = err.inner.length ? err.inner : [err];
|
|
42252
|
+
this.inner.push(...innerErrors);
|
|
42253
|
+
} else {
|
|
42254
|
+
this.errors.push(err);
|
|
42255
|
+
}
|
|
42256
|
+
});
|
|
42257
|
+
this.message = this.errors.length > 1 ? `${this.errors.length} errors occurred` : this.errors[0];
|
|
42258
|
+
}
|
|
42259
|
+
}
|
|
42260
|
+
_Symbol$hasInstance = Symbol.hasInstance;
|
|
42261
|
+
_Symbol$toStringTag2 = Symbol.toStringTag;
|
|
42262
|
+
class ValidationError extends Error {
|
|
42263
|
+
static formatError(message, params) {
|
|
42264
|
+
// Attempt to make the path more friendly for error message interpolation.
|
|
42265
|
+
const path = params.label || params.path || 'this';
|
|
42266
|
+
// Store the original path under `originalPath` so it isn't lost to custom
|
|
42267
|
+
// message functions; e.g., ones provided in `setLocale()` calls.
|
|
42268
|
+
params = Object.assign({}, params, {
|
|
42269
|
+
path,
|
|
42270
|
+
originalPath: params.path
|
|
42271
|
+
});
|
|
42272
|
+
if (typeof message === 'string') return message.replace(strReg, (_, key) => printValue(params[key]));
|
|
42273
|
+
if (typeof message === 'function') return message(params);
|
|
42274
|
+
return message;
|
|
42275
|
+
}
|
|
42276
|
+
static isError(err) {
|
|
42277
|
+
return err && err.name === 'ValidationError';
|
|
42278
|
+
}
|
|
42279
|
+
constructor(errorOrErrors, value, field, type, disableStack) {
|
|
42280
|
+
const errorNoStack = new ValidationErrorNoStack(errorOrErrors, value, field, type);
|
|
42281
|
+
if (disableStack) {
|
|
42282
|
+
return errorNoStack;
|
|
42283
|
+
}
|
|
42284
|
+
super();
|
|
42285
|
+
this.value = void 0;
|
|
42286
|
+
this.path = void 0;
|
|
42287
|
+
this.type = void 0;
|
|
42288
|
+
this.params = void 0;
|
|
42289
|
+
this.errors = [];
|
|
42290
|
+
this.inner = [];
|
|
42291
|
+
this[_Symbol$toStringTag2] = 'Error';
|
|
42292
|
+
this.name = errorNoStack.name;
|
|
42293
|
+
this.message = errorNoStack.message;
|
|
42294
|
+
this.type = errorNoStack.type;
|
|
42295
|
+
this.value = errorNoStack.value;
|
|
42296
|
+
this.path = errorNoStack.path;
|
|
42297
|
+
this.errors = errorNoStack.errors;
|
|
42298
|
+
this.inner = errorNoStack.inner;
|
|
42299
|
+
if (Error.captureStackTrace) {
|
|
42300
|
+
Error.captureStackTrace(this, ValidationError);
|
|
42301
|
+
}
|
|
42302
|
+
}
|
|
42303
|
+
static [_Symbol$hasInstance](inst) {
|
|
42304
|
+
return ValidationErrorNoStack[Symbol.hasInstance](inst) || super[Symbol.hasInstance](inst);
|
|
42305
|
+
}
|
|
42306
|
+
}
|
|
42307
|
+
|
|
42308
|
+
let mixed = {
|
|
42309
|
+
default: '${path} is invalid',
|
|
42310
|
+
required: '${path} is a required field',
|
|
42311
|
+
defined: '${path} must be defined',
|
|
42312
|
+
notNull: '${path} cannot be null',
|
|
42313
|
+
oneOf: '${path} must be one of the following values: ${values}',
|
|
42314
|
+
notOneOf: '${path} must not be one of the following values: ${values}',
|
|
42315
|
+
notType: ({ path, type, value, originalValue }) => {
|
|
42316
|
+
const castMsg = originalValue != null && originalValue !== value ? ` (cast from the value \`${printValue(originalValue, true)}\`).` : '.';
|
|
42317
|
+
return type !== 'mixed'
|
|
42318
|
+
? `${path} must be a \`${type}\` type, ` + `but the final value was: \`${printValue(value, true)}\`` + castMsg
|
|
42319
|
+
: `${path} must match the configured type. ` + `The validated value was: \`${printValue(value, true)}\`` + castMsg;
|
|
42320
|
+
}
|
|
42321
|
+
};
|
|
42322
|
+
let string = {
|
|
42323
|
+
length: '${path} must be exactly ${length} characters',
|
|
42324
|
+
min: '${path} must be at least ${min} characters',
|
|
42325
|
+
max: '${path} must be at most ${max} characters',
|
|
42326
|
+
matches: '${path} must match the following: "${regex}"',
|
|
42327
|
+
email: '${path} must be a valid email',
|
|
42328
|
+
url: '${path} must be a valid URL',
|
|
42329
|
+
uuid: '${path} must be a valid UUID',
|
|
42330
|
+
datetime: '${path} must be a valid ISO date-time',
|
|
42331
|
+
datetime_precision: '${path} must be a valid ISO date-time with a sub-second precision of exactly ${precision} digits',
|
|
42332
|
+
datetime_offset: '${path} must be a valid ISO date-time with UTC "Z" timezone',
|
|
42333
|
+
trim: '${path} must be a trimmed string',
|
|
42334
|
+
lowercase: '${path} must be a lowercase string',
|
|
42335
|
+
uppercase: '${path} must be a upper case string'
|
|
42336
|
+
};
|
|
42337
|
+
let number = {
|
|
42338
|
+
min: '${path} must be greater than or equal to ${min}',
|
|
42339
|
+
max: '${path} must be less than or equal to ${max}',
|
|
42340
|
+
lessThan: '${path} must be less than ${less}',
|
|
42341
|
+
moreThan: '${path} must be greater than ${more}',
|
|
42342
|
+
positive: '${path} must be a positive number',
|
|
42343
|
+
negative: '${path} must be a negative number',
|
|
42344
|
+
integer: '${path} must be an integer'
|
|
42345
|
+
};
|
|
42346
|
+
let date = {
|
|
42347
|
+
min: '${path} field must be later than ${min}',
|
|
42348
|
+
max: '${path} field must be at earlier than ${max}'
|
|
42349
|
+
};
|
|
42350
|
+
let boolean = {
|
|
42351
|
+
isValue: '${path} field must be ${value}'
|
|
42352
|
+
};
|
|
42353
|
+
let object = {
|
|
42354
|
+
noUnknown: '${path} field has unspecified keys: ${unknown}',
|
|
42355
|
+
exact: '${path} object contains unknown properties: ${properties}'
|
|
42356
|
+
};
|
|
42357
|
+
let array = {
|
|
42358
|
+
min: '${path} field must have at least ${min} items',
|
|
42359
|
+
max: '${path} field must have less than or equal to ${max} items',
|
|
42360
|
+
length: '${path} must have ${length} items'
|
|
42361
|
+
};
|
|
42362
|
+
let tuple = {
|
|
42363
|
+
notType: (params) => {
|
|
42364
|
+
const { path, value, spec } = params;
|
|
42365
|
+
const typeLen = spec.types.length;
|
|
42366
|
+
if (Array.isArray(value)) {
|
|
42367
|
+
if (value.length < typeLen)
|
|
42368
|
+
return `${path} tuple value has too few items, expected a length of ${typeLen} but got ${value.length} for value: \`${printValue(value, true)}\``;
|
|
42369
|
+
if (value.length > typeLen)
|
|
42370
|
+
return `${path} tuple value has too many items, expected a length of ${typeLen} but got ${value.length} for value: \`${printValue(value, true)}\``;
|
|
42371
|
+
}
|
|
42372
|
+
return ValidationError.formatError(mixed.notType, params);
|
|
42373
|
+
}
|
|
42374
|
+
};
|
|
42375
|
+
Object.assign(Object.create(null), {
|
|
42376
|
+
mixed,
|
|
42377
|
+
string,
|
|
42378
|
+
number,
|
|
42379
|
+
date,
|
|
42380
|
+
object,
|
|
42381
|
+
array,
|
|
42382
|
+
boolean,
|
|
42383
|
+
tuple
|
|
42384
|
+
});
|
|
42385
|
+
|
|
42386
|
+
const isSchema = (obj) => obj && obj.__isYupSchema__;
|
|
42387
|
+
|
|
42388
|
+
class Condition {
|
|
42389
|
+
static fromOptions(refs, config) {
|
|
42390
|
+
if (!config.then && !config.otherwise) throw new TypeError('either `then:` or `otherwise:` is required for `when()` conditions');
|
|
42391
|
+
let { is, then, otherwise } = config;
|
|
42392
|
+
let check = typeof is === 'function' ? is : (...values) => values.every((value) => value === is);
|
|
42393
|
+
return new Condition(refs, (values, schema) => {
|
|
42394
|
+
var _branch;
|
|
42395
|
+
let branch = check(...values) ? then : otherwise;
|
|
42396
|
+
return (_branch = branch == null ? void 0 : branch(schema)) != null ? _branch : schema;
|
|
42397
|
+
});
|
|
42398
|
+
}
|
|
42399
|
+
constructor(refs, builder) {
|
|
42400
|
+
this.fn = void 0;
|
|
42401
|
+
this.refs = refs;
|
|
42402
|
+
this.refs = refs;
|
|
42403
|
+
this.fn = builder;
|
|
42404
|
+
}
|
|
42405
|
+
resolve(base, options) {
|
|
42406
|
+
let values = this.refs.map((ref) =>
|
|
42407
|
+
// TODO: ? operator here?
|
|
42408
|
+
ref.getValue(options == null ? void 0 : options.value, options == null ? void 0 : options.parent, options == null ? void 0 : options.context)
|
|
42409
|
+
);
|
|
42410
|
+
let schema = this.fn(values, base, options);
|
|
42411
|
+
if (
|
|
42412
|
+
schema === undefined ||
|
|
42413
|
+
// @ts-ignore this can be base
|
|
42414
|
+
schema === base
|
|
42415
|
+
) {
|
|
42416
|
+
return base;
|
|
42417
|
+
}
|
|
42418
|
+
if (!isSchema(schema)) throw new TypeError('conditions must return a schema object');
|
|
42419
|
+
return schema.resolve(options);
|
|
42420
|
+
}
|
|
42421
|
+
}
|
|
42422
|
+
|
|
42423
|
+
const prefixes = {
|
|
42424
|
+
context: '$',
|
|
42425
|
+
value: '.'
|
|
42426
|
+
};
|
|
42427
|
+
class Reference {
|
|
42428
|
+
constructor(key, options = {}) {
|
|
42429
|
+
this.key = void 0;
|
|
42430
|
+
this.isContext = void 0;
|
|
42431
|
+
this.isValue = void 0;
|
|
42432
|
+
this.isSibling = void 0;
|
|
42433
|
+
this.path = void 0;
|
|
42434
|
+
this.getter = void 0;
|
|
42435
|
+
this.map = void 0;
|
|
42436
|
+
if (typeof key !== 'string') throw new TypeError('ref must be a string, got: ' + key);
|
|
42437
|
+
this.key = key.trim();
|
|
42438
|
+
if (key === '') throw new TypeError('ref must be a non-empty string');
|
|
42439
|
+
this.isContext = this.key[0] === prefixes.context;
|
|
42440
|
+
this.isValue = this.key[0] === prefixes.value;
|
|
42441
|
+
this.isSibling = !this.isContext && !this.isValue;
|
|
42442
|
+
let prefix = this.isContext ? prefixes.context : this.isValue ? prefixes.value : '';
|
|
42443
|
+
this.path = this.key.slice(prefix.length);
|
|
42444
|
+
this.getter = this.path && propertyExpr.getter(this.path, true);
|
|
42445
|
+
this.map = options.map;
|
|
42446
|
+
}
|
|
42447
|
+
getValue(value, parent, context) {
|
|
42448
|
+
let result = this.isContext ? context : this.isValue ? value : parent;
|
|
42449
|
+
if (this.getter) result = this.getter(result || {});
|
|
42450
|
+
if (this.map) result = this.map(result);
|
|
42451
|
+
return result;
|
|
42452
|
+
}
|
|
42453
|
+
|
|
42454
|
+
/**
|
|
42455
|
+
*
|
|
42456
|
+
* @param {*} value
|
|
42457
|
+
* @param {Object} options
|
|
42458
|
+
* @param {Object=} options.context
|
|
42459
|
+
* @param {Object=} options.parent
|
|
42460
|
+
*/
|
|
42461
|
+
cast(value, options) {
|
|
42462
|
+
return this.getValue(value, options == null ? void 0 : options.parent, options == null ? void 0 : options.context);
|
|
42463
|
+
}
|
|
42464
|
+
resolve() {
|
|
42465
|
+
return this;
|
|
42466
|
+
}
|
|
42467
|
+
describe() {
|
|
42468
|
+
return {
|
|
42469
|
+
type: 'ref',
|
|
42470
|
+
key: this.key
|
|
42471
|
+
};
|
|
42472
|
+
}
|
|
42473
|
+
toString() {
|
|
42474
|
+
return `Ref(${this.key})`;
|
|
42475
|
+
}
|
|
42476
|
+
static isRef(value) {
|
|
42477
|
+
return value && value.__isYupRef;
|
|
42478
|
+
}
|
|
42479
|
+
}
|
|
42480
|
+
|
|
42481
|
+
// @ts-ignore
|
|
42482
|
+
Reference.prototype.__isYupRef = true;
|
|
42483
|
+
|
|
42484
|
+
const isAbsent = (value) => value == null;
|
|
42485
|
+
|
|
42486
|
+
function createValidation(config) {
|
|
42487
|
+
function validate({ value, path = '', options, originalValue, schema }, panic, next) {
|
|
42488
|
+
const { name, test, params, message, skipAbsent } = config;
|
|
42489
|
+
let { parent, context, abortEarly = schema.spec.abortEarly, disableStackTrace = schema.spec.disableStackTrace } = options;
|
|
42490
|
+
function resolve(item) {
|
|
42491
|
+
return Reference.isRef(item) ? item.getValue(value, parent, context) : item;
|
|
42492
|
+
}
|
|
42493
|
+
function createError(overrides = {}) {
|
|
42494
|
+
const nextParams = Object.assign(
|
|
42495
|
+
{
|
|
42496
|
+
value,
|
|
42497
|
+
originalValue,
|
|
42498
|
+
label: schema.spec.label,
|
|
42499
|
+
path: overrides.path || path,
|
|
42500
|
+
spec: schema.spec,
|
|
42501
|
+
disableStackTrace: overrides.disableStackTrace || disableStackTrace
|
|
42502
|
+
},
|
|
42503
|
+
params,
|
|
42504
|
+
overrides.params
|
|
42505
|
+
);
|
|
42506
|
+
for (const key of Object.keys(nextParams)) nextParams[key] = resolve(nextParams[key]);
|
|
42507
|
+
const error = new ValidationError(
|
|
42508
|
+
ValidationError.formatError(overrides.message || message, nextParams),
|
|
42509
|
+
value,
|
|
42510
|
+
nextParams.path,
|
|
42511
|
+
overrides.type || name,
|
|
42512
|
+
nextParams.disableStackTrace
|
|
42513
|
+
);
|
|
42514
|
+
error.params = nextParams;
|
|
42515
|
+
return error;
|
|
42516
|
+
}
|
|
42517
|
+
const invalid = abortEarly ? panic : next;
|
|
42518
|
+
let ctx = {
|
|
42519
|
+
path,
|
|
42520
|
+
parent,
|
|
42521
|
+
type: name,
|
|
42522
|
+
from: options.from,
|
|
42523
|
+
createError,
|
|
42524
|
+
resolve,
|
|
42525
|
+
options,
|
|
42526
|
+
originalValue,
|
|
42527
|
+
schema
|
|
42528
|
+
};
|
|
42529
|
+
const handleResult = (validOrError) => {
|
|
42530
|
+
if (ValidationError.isError(validOrError)) invalid(validOrError);
|
|
42531
|
+
else if (!validOrError) invalid(createError());
|
|
42532
|
+
else next(null);
|
|
42533
|
+
};
|
|
42534
|
+
const handleError = (err) => {
|
|
42535
|
+
if (ValidationError.isError(err)) invalid(err);
|
|
42536
|
+
else panic(err);
|
|
42537
|
+
};
|
|
42538
|
+
const shouldSkip = skipAbsent && isAbsent(value);
|
|
42539
|
+
if (shouldSkip) {
|
|
42540
|
+
return handleResult(true);
|
|
42541
|
+
}
|
|
42542
|
+
let result;
|
|
42543
|
+
try {
|
|
42544
|
+
var _result;
|
|
42545
|
+
result = test.call(ctx, value, ctx);
|
|
42546
|
+
if (typeof ((_result = result) == null ? void 0 : _result.then) === 'function') {
|
|
42547
|
+
if (options.sync) {
|
|
42548
|
+
throw new Error(
|
|
42549
|
+
`Validation test of type: "${ctx.type}" returned a Promise during a synchronous validate. ` +
|
|
42550
|
+
`This test will finish after the validate call has returned`
|
|
42551
|
+
);
|
|
42552
|
+
}
|
|
42553
|
+
return Promise.resolve(result).then(handleResult, handleError);
|
|
42554
|
+
}
|
|
42555
|
+
} catch (err) {
|
|
42556
|
+
handleError(err);
|
|
42557
|
+
return;
|
|
42558
|
+
}
|
|
42559
|
+
handleResult(result);
|
|
42560
|
+
}
|
|
42561
|
+
validate.OPTIONS = config;
|
|
42562
|
+
return validate;
|
|
42563
|
+
}
|
|
42564
|
+
|
|
42565
|
+
function getIn(schema, path, value, context = value) {
|
|
42566
|
+
let parent, lastPart, lastPartDebug;
|
|
42567
|
+
|
|
42568
|
+
// root path: ''
|
|
42569
|
+
if (!path)
|
|
42570
|
+
return {
|
|
42571
|
+
parent,
|
|
42572
|
+
parentPath: path,
|
|
42573
|
+
schema
|
|
42574
|
+
};
|
|
42575
|
+
propertyExpr.forEach(path, (_part, isBracket, isArray) => {
|
|
42576
|
+
let part = isBracket ? _part.slice(1, _part.length - 1) : _part;
|
|
42577
|
+
schema = schema.resolve({
|
|
42578
|
+
context,
|
|
42579
|
+
parent,
|
|
42580
|
+
value
|
|
42581
|
+
});
|
|
42582
|
+
let isTuple = schema.type === 'tuple';
|
|
42583
|
+
let idx = isArray ? parseInt(part, 10) : 0;
|
|
42584
|
+
if (schema.innerType || isTuple) {
|
|
42585
|
+
if (isTuple && !isArray)
|
|
42586
|
+
throw new Error(
|
|
42587
|
+
`Yup.reach cannot implicitly index into a tuple type. the path part "${lastPartDebug}" must contain an index to the tuple element, e.g. "${lastPartDebug}[0]"`
|
|
42588
|
+
);
|
|
42589
|
+
if (value && idx >= value.length) {
|
|
42590
|
+
throw new Error(`Yup.reach cannot resolve an array item at index: ${_part}, in the path: ${path}. ` + `because there is no value at that index. `);
|
|
42591
|
+
}
|
|
42592
|
+
parent = value;
|
|
42593
|
+
value = value && value[idx];
|
|
42594
|
+
schema = isTuple ? schema.spec.types[idx] : schema.innerType;
|
|
42595
|
+
}
|
|
42596
|
+
|
|
42597
|
+
// sometimes the array index part of a path doesn't exist: "nested.arr.child"
|
|
42598
|
+
// in these cases the current part is the next schema and should be processed
|
|
42599
|
+
// in this iteration. For cases where the index signature is included this
|
|
42600
|
+
// check will fail and we'll handle the `child` part on the next iteration like normal
|
|
42601
|
+
if (!isArray) {
|
|
42602
|
+
if (!schema.fields || !schema.fields[part])
|
|
42603
|
+
throw new Error(`The schema does not contain the path: ${path}. ` + `(failed at: ${lastPartDebug} which is a type: "${schema.type}")`);
|
|
42604
|
+
parent = value;
|
|
42605
|
+
value = value && value[part];
|
|
42606
|
+
schema = schema.fields[part];
|
|
42607
|
+
}
|
|
42608
|
+
lastPart = part;
|
|
42609
|
+
lastPartDebug = isBracket ? '[' + _part + ']' : '.' + _part;
|
|
42610
|
+
});
|
|
42611
|
+
return {
|
|
42612
|
+
schema,
|
|
42613
|
+
parent,
|
|
42614
|
+
parentPath: lastPart
|
|
42615
|
+
};
|
|
42616
|
+
}
|
|
42617
|
+
|
|
42618
|
+
class ReferenceSet extends Set {
|
|
42619
|
+
describe() {
|
|
42620
|
+
const description = [];
|
|
42621
|
+
for (const item of this.values()) {
|
|
42622
|
+
description.push(Reference.isRef(item) ? item.describe() : item);
|
|
42623
|
+
}
|
|
42624
|
+
return description;
|
|
42625
|
+
}
|
|
42626
|
+
resolveAll(resolve) {
|
|
42627
|
+
let result = [];
|
|
42628
|
+
for (const item of this.values()) {
|
|
42629
|
+
result.push(resolve(item));
|
|
42630
|
+
}
|
|
42631
|
+
return result;
|
|
42632
|
+
}
|
|
42633
|
+
clone() {
|
|
42634
|
+
return new ReferenceSet(this.values());
|
|
42635
|
+
}
|
|
42636
|
+
merge(newItems, removeItems) {
|
|
42637
|
+
const next = this.clone();
|
|
42638
|
+
newItems.forEach((value) => next.add(value));
|
|
42639
|
+
removeItems.forEach((value) => next.delete(value));
|
|
42640
|
+
return next;
|
|
42641
|
+
}
|
|
42642
|
+
}
|
|
42643
|
+
|
|
42644
|
+
// tweaked from https://github.com/Kelin2025/nanoclone/blob/0abeb7635bda9b68ef2277093f76dbe3bf3948e1/src/index.js
|
|
42645
|
+
function clone(src, seen = new Map()) {
|
|
42646
|
+
if (isSchema(src) || !src || typeof src !== 'object') return src;
|
|
42647
|
+
if (seen.has(src)) return seen.get(src);
|
|
42648
|
+
let copy;
|
|
42649
|
+
if (src instanceof Date) {
|
|
42650
|
+
// Date
|
|
42651
|
+
copy = new Date(src.getTime());
|
|
42652
|
+
seen.set(src, copy);
|
|
42653
|
+
} else if (src instanceof RegExp) {
|
|
42654
|
+
// RegExp
|
|
42655
|
+
copy = new RegExp(src);
|
|
42656
|
+
seen.set(src, copy);
|
|
42657
|
+
} else if (Array.isArray(src)) {
|
|
42658
|
+
// Array
|
|
42659
|
+
copy = new Array(src.length);
|
|
42660
|
+
seen.set(src, copy);
|
|
42661
|
+
for (let i = 0; i < src.length; i++) copy[i] = clone(src[i], seen);
|
|
42662
|
+
} else if (src instanceof Map) {
|
|
42663
|
+
// Map
|
|
42664
|
+
copy = new Map();
|
|
42665
|
+
seen.set(src, copy);
|
|
42666
|
+
for (const [k, v] of src.entries()) copy.set(k, clone(v, seen));
|
|
42667
|
+
} else if (src instanceof Set) {
|
|
42668
|
+
// Set
|
|
42669
|
+
copy = new Set();
|
|
42670
|
+
seen.set(src, copy);
|
|
42671
|
+
for (const v of src) copy.add(clone(v, seen));
|
|
42672
|
+
} else if (src instanceof Object) {
|
|
42673
|
+
// Object
|
|
42674
|
+
copy = {};
|
|
42675
|
+
seen.set(src, copy);
|
|
42676
|
+
for (const [k, v] of Object.entries(src)) copy[k] = clone(v, seen);
|
|
42677
|
+
} else {
|
|
42678
|
+
throw Error(`Unable to clone ${src}`);
|
|
42679
|
+
}
|
|
42680
|
+
return copy;
|
|
42681
|
+
}
|
|
42682
|
+
|
|
42683
|
+
// If `CustomSchemaMeta` isn't extended with any keys, we'll fall back to a
|
|
42684
|
+
// loose Record definition allowing free form usage.
|
|
42685
|
+
class Schema {
|
|
42686
|
+
constructor(options) {
|
|
42687
|
+
this.type = void 0;
|
|
42688
|
+
this.deps = [];
|
|
42689
|
+
this.tests = void 0;
|
|
42690
|
+
this.transforms = void 0;
|
|
42691
|
+
this.conditions = [];
|
|
42692
|
+
this._mutate = void 0;
|
|
42693
|
+
this.internalTests = {};
|
|
42694
|
+
this._whitelist = new ReferenceSet();
|
|
42695
|
+
this._blacklist = new ReferenceSet();
|
|
42696
|
+
this.exclusiveTests = Object.create(null);
|
|
42697
|
+
this._typeCheck = void 0;
|
|
42698
|
+
this.spec = void 0;
|
|
42699
|
+
this.tests = [];
|
|
42700
|
+
this.transforms = [];
|
|
42701
|
+
this.withMutation(() => {
|
|
42702
|
+
this.typeError(mixed.notType);
|
|
42703
|
+
});
|
|
42704
|
+
this.type = options.type;
|
|
42705
|
+
this._typeCheck = options.check;
|
|
42706
|
+
this.spec = Object.assign(
|
|
42707
|
+
{
|
|
42708
|
+
strip: false,
|
|
42709
|
+
strict: false,
|
|
42710
|
+
abortEarly: true,
|
|
42711
|
+
recursive: true,
|
|
42712
|
+
disableStackTrace: false,
|
|
42713
|
+
nullable: false,
|
|
42714
|
+
optional: true,
|
|
42715
|
+
coerce: true
|
|
42716
|
+
},
|
|
42717
|
+
options == null ? void 0 : options.spec
|
|
42718
|
+
);
|
|
42719
|
+
this.withMutation((s) => {
|
|
42720
|
+
s.nonNullable();
|
|
42721
|
+
});
|
|
42722
|
+
}
|
|
42723
|
+
|
|
42724
|
+
// TODO: remove
|
|
42725
|
+
get _type() {
|
|
42726
|
+
return this.type;
|
|
42727
|
+
}
|
|
42728
|
+
clone(spec) {
|
|
42729
|
+
if (this._mutate) {
|
|
42730
|
+
if (spec) Object.assign(this.spec, spec);
|
|
42731
|
+
return this;
|
|
42732
|
+
}
|
|
42733
|
+
|
|
42734
|
+
// if the nested value is a schema we can skip cloning, since
|
|
42735
|
+
// they are already immutable
|
|
42736
|
+
const next = Object.create(Object.getPrototypeOf(this));
|
|
42737
|
+
|
|
42738
|
+
// @ts-expect-error this is readonly
|
|
42739
|
+
next.type = this.type;
|
|
42740
|
+
next._typeCheck = this._typeCheck;
|
|
42741
|
+
next._whitelist = this._whitelist.clone();
|
|
42742
|
+
next._blacklist = this._blacklist.clone();
|
|
42743
|
+
next.internalTests = Object.assign({}, this.internalTests);
|
|
42744
|
+
next.exclusiveTests = Object.assign({}, this.exclusiveTests);
|
|
42745
|
+
|
|
42746
|
+
// @ts-expect-error this is readonly
|
|
42747
|
+
next.deps = [...this.deps];
|
|
42748
|
+
next.conditions = [...this.conditions];
|
|
42749
|
+
next.tests = [...this.tests];
|
|
42750
|
+
next.transforms = [...this.transforms];
|
|
42751
|
+
next.spec = clone(Object.assign({}, this.spec, spec));
|
|
42752
|
+
return next;
|
|
42753
|
+
}
|
|
42754
|
+
label(label) {
|
|
42755
|
+
let next = this.clone();
|
|
42756
|
+
next.spec.label = label;
|
|
42757
|
+
return next;
|
|
42758
|
+
}
|
|
42759
|
+
meta(...args) {
|
|
42760
|
+
if (args.length === 0) return this.spec.meta;
|
|
42761
|
+
let next = this.clone();
|
|
42762
|
+
next.spec.meta = Object.assign(next.spec.meta || {}, args[0]);
|
|
42763
|
+
return next;
|
|
42764
|
+
}
|
|
42765
|
+
withMutation(fn) {
|
|
42766
|
+
let before = this._mutate;
|
|
42767
|
+
this._mutate = true;
|
|
42768
|
+
let result = fn(this);
|
|
42769
|
+
this._mutate = before;
|
|
42770
|
+
return result;
|
|
42771
|
+
}
|
|
42772
|
+
concat(schema) {
|
|
42773
|
+
if (!schema || schema === this) return this;
|
|
42774
|
+
if (schema.type !== this.type && this.type !== 'mixed')
|
|
42775
|
+
throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${schema.type}`);
|
|
42776
|
+
let base = this;
|
|
42777
|
+
let combined = schema.clone();
|
|
42778
|
+
const mergedSpec = Object.assign({}, base.spec, combined.spec);
|
|
42779
|
+
combined.spec = mergedSpec;
|
|
42780
|
+
combined.internalTests = Object.assign({}, base.internalTests, combined.internalTests);
|
|
42781
|
+
|
|
42782
|
+
// manually merge the blacklist/whitelist (the other `schema` takes
|
|
42783
|
+
// precedence in case of conflicts)
|
|
42784
|
+
combined._whitelist = base._whitelist.merge(schema._whitelist, schema._blacklist);
|
|
42785
|
+
combined._blacklist = base._blacklist.merge(schema._blacklist, schema._whitelist);
|
|
42786
|
+
|
|
42787
|
+
// start with the current tests
|
|
42788
|
+
combined.tests = base.tests;
|
|
42789
|
+
combined.exclusiveTests = base.exclusiveTests;
|
|
42790
|
+
|
|
42791
|
+
// manually add the new tests to ensure
|
|
42792
|
+
// the deduping logic is consistent
|
|
42793
|
+
combined.withMutation((next) => {
|
|
42794
|
+
schema.tests.forEach((fn) => {
|
|
42795
|
+
next.test(fn.OPTIONS);
|
|
42796
|
+
});
|
|
42797
|
+
});
|
|
42798
|
+
combined.transforms = [...base.transforms, ...combined.transforms];
|
|
42799
|
+
return combined;
|
|
42800
|
+
}
|
|
42801
|
+
isType(v) {
|
|
42802
|
+
if (v == null) {
|
|
42803
|
+
if (this.spec.nullable && v === null) return true;
|
|
42804
|
+
if (this.spec.optional && v === undefined) return true;
|
|
42805
|
+
return false;
|
|
42806
|
+
}
|
|
42807
|
+
return this._typeCheck(v);
|
|
42808
|
+
}
|
|
42809
|
+
resolve(options) {
|
|
42810
|
+
let schema = this;
|
|
42811
|
+
if (schema.conditions.length) {
|
|
42812
|
+
let conditions = schema.conditions;
|
|
42813
|
+
schema = schema.clone();
|
|
42814
|
+
schema.conditions = [];
|
|
42815
|
+
schema = conditions.reduce((prevSchema, condition) => condition.resolve(prevSchema, options), schema);
|
|
42816
|
+
schema = schema.resolve(options);
|
|
42817
|
+
}
|
|
42818
|
+
return schema;
|
|
42819
|
+
}
|
|
42820
|
+
resolveOptions(options) {
|
|
42821
|
+
var _options$strict, _options$abortEarly, _options$recursive, _options$disableStack;
|
|
42822
|
+
return Object.assign({}, options, {
|
|
42823
|
+
from: options.from || [],
|
|
42824
|
+
strict: (_options$strict = options.strict) != null ? _options$strict : this.spec.strict,
|
|
42825
|
+
abortEarly: (_options$abortEarly = options.abortEarly) != null ? _options$abortEarly : this.spec.abortEarly,
|
|
42826
|
+
recursive: (_options$recursive = options.recursive) != null ? _options$recursive : this.spec.recursive,
|
|
42827
|
+
disableStackTrace: (_options$disableStack = options.disableStackTrace) != null ? _options$disableStack : this.spec.disableStackTrace
|
|
42828
|
+
});
|
|
42829
|
+
}
|
|
42830
|
+
|
|
42831
|
+
/**
|
|
42832
|
+
* Run the configured transform pipeline over an input value.
|
|
42833
|
+
*/
|
|
42834
|
+
|
|
42835
|
+
cast(value, options = {}) {
|
|
42836
|
+
let resolvedSchema = this.resolve(
|
|
42837
|
+
Object.assign(
|
|
42838
|
+
{
|
|
42839
|
+
value
|
|
42840
|
+
},
|
|
42841
|
+
options
|
|
42842
|
+
)
|
|
42843
|
+
);
|
|
42844
|
+
let allowOptionality = options.assert === 'ignore-optionality';
|
|
42845
|
+
let result = resolvedSchema._cast(value, options);
|
|
42846
|
+
if (options.assert !== false && !resolvedSchema.isType(result)) {
|
|
42847
|
+
if (allowOptionality && isAbsent(result)) {
|
|
42848
|
+
return result;
|
|
42849
|
+
}
|
|
42850
|
+
let formattedValue = printValue(value);
|
|
42851
|
+
let formattedResult = printValue(result);
|
|
42852
|
+
throw new TypeError(
|
|
42853
|
+
`The value of ${options.path || 'field'} could not be cast to a value ` +
|
|
42854
|
+
`that satisfies the schema type: "${resolvedSchema.type}". \n\n` +
|
|
42855
|
+
`attempted value: ${formattedValue} \n` +
|
|
42856
|
+
(formattedResult !== formattedValue ? `result of cast: ${formattedResult}` : '')
|
|
42857
|
+
);
|
|
42858
|
+
}
|
|
42859
|
+
return result;
|
|
42860
|
+
}
|
|
42861
|
+
_cast(rawValue, options) {
|
|
42862
|
+
let value = rawValue === undefined ? rawValue : this.transforms.reduce((prevValue, fn) => fn.call(this, prevValue, rawValue, this), rawValue);
|
|
42863
|
+
if (value === undefined) {
|
|
42864
|
+
value = this.getDefault(options);
|
|
42865
|
+
}
|
|
42866
|
+
return value;
|
|
42867
|
+
}
|
|
42868
|
+
_validate(_value, options = {}, panic, next) {
|
|
42869
|
+
let { path, originalValue = _value, strict = this.spec.strict } = options;
|
|
42870
|
+
let value = _value;
|
|
42871
|
+
if (!strict) {
|
|
42872
|
+
value = this._cast(
|
|
42873
|
+
value,
|
|
42874
|
+
Object.assign(
|
|
42875
|
+
{
|
|
42876
|
+
assert: false
|
|
42877
|
+
},
|
|
42878
|
+
options
|
|
42879
|
+
)
|
|
42880
|
+
);
|
|
42881
|
+
}
|
|
42882
|
+
let initialTests = [];
|
|
42883
|
+
for (let test of Object.values(this.internalTests)) {
|
|
42884
|
+
if (test) initialTests.push(test);
|
|
42885
|
+
}
|
|
42886
|
+
this.runTests(
|
|
42887
|
+
{
|
|
42888
|
+
path,
|
|
42889
|
+
value,
|
|
42890
|
+
originalValue,
|
|
42891
|
+
options,
|
|
42892
|
+
tests: initialTests
|
|
42893
|
+
},
|
|
42894
|
+
panic,
|
|
42895
|
+
(initialErrors) => {
|
|
42896
|
+
// even if we aren't ending early we can't proceed further if the types aren't correct
|
|
42897
|
+
if (initialErrors.length) {
|
|
42898
|
+
return next(initialErrors, value);
|
|
42899
|
+
}
|
|
42900
|
+
this.runTests(
|
|
42901
|
+
{
|
|
42902
|
+
path,
|
|
42903
|
+
value,
|
|
42904
|
+
originalValue,
|
|
42905
|
+
options,
|
|
42906
|
+
tests: this.tests
|
|
42907
|
+
},
|
|
42908
|
+
panic,
|
|
42909
|
+
next
|
|
42910
|
+
);
|
|
42911
|
+
}
|
|
42912
|
+
);
|
|
42913
|
+
}
|
|
42914
|
+
|
|
42915
|
+
/**
|
|
42916
|
+
* Executes a set of validations, either schema, produced Tests or a nested
|
|
42917
|
+
* schema validate result.
|
|
42918
|
+
*/
|
|
42919
|
+
runTests(runOptions, panic, next) {
|
|
42920
|
+
let fired = false;
|
|
42921
|
+
let { tests, value, originalValue, path, options } = runOptions;
|
|
42922
|
+
let panicOnce = (arg) => {
|
|
42923
|
+
if (fired) return;
|
|
42924
|
+
fired = true;
|
|
42925
|
+
panic(arg, value);
|
|
42926
|
+
};
|
|
42927
|
+
let nextOnce = (arg) => {
|
|
42928
|
+
if (fired) return;
|
|
42929
|
+
fired = true;
|
|
42930
|
+
next(arg, value);
|
|
42931
|
+
};
|
|
42932
|
+
let count = tests.length;
|
|
42933
|
+
let nestedErrors = [];
|
|
42934
|
+
if (!count) return nextOnce([]);
|
|
42935
|
+
let args = {
|
|
42936
|
+
value,
|
|
42937
|
+
originalValue,
|
|
42938
|
+
path,
|
|
42939
|
+
options,
|
|
42940
|
+
schema: this
|
|
42941
|
+
};
|
|
42942
|
+
for (let i = 0; i < tests.length; i++) {
|
|
42943
|
+
const test = tests[i];
|
|
42944
|
+
test(args, panicOnce, function finishTestRun(err) {
|
|
42945
|
+
if (err) {
|
|
42946
|
+
Array.isArray(err) ? nestedErrors.push(...err) : nestedErrors.push(err);
|
|
42947
|
+
}
|
|
42948
|
+
if (--count <= 0) {
|
|
42949
|
+
nextOnce(nestedErrors);
|
|
42950
|
+
}
|
|
42951
|
+
});
|
|
42952
|
+
}
|
|
42953
|
+
}
|
|
42954
|
+
asNestedTest({ key, index, parent, parentPath, originalParent, options }) {
|
|
42955
|
+
const k = key != null ? key : index;
|
|
42956
|
+
if (k == null) {
|
|
42957
|
+
throw TypeError('Must include `key` or `index` for nested validations');
|
|
42958
|
+
}
|
|
42959
|
+
const isIndex = typeof k === 'number';
|
|
42960
|
+
let value = parent[k];
|
|
42961
|
+
const testOptions = Object.assign({}, options, {
|
|
42962
|
+
// Nested validations fields are always strict:
|
|
42963
|
+
// 1. parent isn't strict so the casting will also have cast inner values
|
|
42964
|
+
// 2. parent is strict in which case the nested values weren't cast either
|
|
42965
|
+
strict: true,
|
|
42966
|
+
parent,
|
|
42967
|
+
value,
|
|
42968
|
+
originalValue: originalParent[k],
|
|
42969
|
+
// FIXME: tests depend on `index` being passed around deeply,
|
|
42970
|
+
// we should not let the options.key/index bleed through
|
|
42971
|
+
key: undefined,
|
|
42972
|
+
// index: undefined,
|
|
42973
|
+
[isIndex ? 'index' : 'key']: k,
|
|
42974
|
+
path: isIndex || k.includes('.') ? `${parentPath || ''}[${isIndex ? k : `"${k}"`}]` : (parentPath ? `${parentPath}.` : '') + key
|
|
42975
|
+
});
|
|
42976
|
+
return (_, panic, next) => this.resolve(testOptions)._validate(value, testOptions, panic, next);
|
|
42977
|
+
}
|
|
42978
|
+
validate(value, options) {
|
|
42979
|
+
var _options$disableStack2;
|
|
42980
|
+
let schema = this.resolve(
|
|
42981
|
+
Object.assign({}, options, {
|
|
42982
|
+
value
|
|
42983
|
+
})
|
|
42984
|
+
);
|
|
42985
|
+
let disableStackTrace =
|
|
42986
|
+
(_options$disableStack2 = options == null ? void 0 : options.disableStackTrace) != null ? _options$disableStack2 : schema.spec.disableStackTrace;
|
|
42987
|
+
return new Promise((resolve, reject) =>
|
|
42988
|
+
schema._validate(
|
|
42989
|
+
value,
|
|
42990
|
+
options,
|
|
42991
|
+
(error, parsed) => {
|
|
42992
|
+
if (ValidationError.isError(error)) error.value = parsed;
|
|
42993
|
+
reject(error);
|
|
42994
|
+
},
|
|
42995
|
+
(errors, validated) => {
|
|
42996
|
+
if (errors.length) reject(new ValidationError(errors, validated, undefined, undefined, disableStackTrace));
|
|
42997
|
+
else resolve(validated);
|
|
42998
|
+
}
|
|
42999
|
+
)
|
|
43000
|
+
);
|
|
43001
|
+
}
|
|
43002
|
+
validateSync(value, options) {
|
|
43003
|
+
var _options$disableStack3;
|
|
43004
|
+
let schema = this.resolve(
|
|
43005
|
+
Object.assign({}, options, {
|
|
43006
|
+
value
|
|
43007
|
+
})
|
|
43008
|
+
);
|
|
43009
|
+
let result;
|
|
43010
|
+
let disableStackTrace =
|
|
43011
|
+
(_options$disableStack3 = options == null ? void 0 : options.disableStackTrace) != null ? _options$disableStack3 : schema.spec.disableStackTrace;
|
|
43012
|
+
schema._validate(
|
|
43013
|
+
value,
|
|
43014
|
+
Object.assign({}, options, {
|
|
43015
|
+
sync: true
|
|
43016
|
+
}),
|
|
43017
|
+
(error, parsed) => {
|
|
43018
|
+
if (ValidationError.isError(error)) error.value = parsed;
|
|
43019
|
+
throw error;
|
|
43020
|
+
},
|
|
43021
|
+
(errors, validated) => {
|
|
43022
|
+
if (errors.length) throw new ValidationError(errors, value, undefined, undefined, disableStackTrace);
|
|
43023
|
+
result = validated;
|
|
43024
|
+
}
|
|
43025
|
+
);
|
|
43026
|
+
return result;
|
|
43027
|
+
}
|
|
43028
|
+
isValid(value, options) {
|
|
43029
|
+
return this.validate(value, options).then(
|
|
43030
|
+
() => true,
|
|
43031
|
+
(err) => {
|
|
43032
|
+
if (ValidationError.isError(err)) return false;
|
|
43033
|
+
throw err;
|
|
43034
|
+
}
|
|
43035
|
+
);
|
|
43036
|
+
}
|
|
43037
|
+
isValidSync(value, options) {
|
|
43038
|
+
try {
|
|
43039
|
+
this.validateSync(value, options);
|
|
43040
|
+
return true;
|
|
43041
|
+
} catch (err) {
|
|
43042
|
+
if (ValidationError.isError(err)) return false;
|
|
43043
|
+
throw err;
|
|
43044
|
+
}
|
|
43045
|
+
}
|
|
43046
|
+
_getDefault(options) {
|
|
43047
|
+
let defaultValue = this.spec.default;
|
|
43048
|
+
if (defaultValue == null) {
|
|
43049
|
+
return defaultValue;
|
|
43050
|
+
}
|
|
43051
|
+
return typeof defaultValue === 'function' ? defaultValue.call(this, options) : clone(defaultValue);
|
|
43052
|
+
}
|
|
43053
|
+
getDefault(
|
|
43054
|
+
options
|
|
43055
|
+
// If schema is defaulted we know it's at least not undefined
|
|
43056
|
+
) {
|
|
43057
|
+
let schema = this.resolve(options || {});
|
|
43058
|
+
return schema._getDefault(options);
|
|
43059
|
+
}
|
|
43060
|
+
default(def) {
|
|
43061
|
+
if (arguments.length === 0) {
|
|
43062
|
+
return this._getDefault();
|
|
43063
|
+
}
|
|
43064
|
+
let next = this.clone({
|
|
43065
|
+
default: def
|
|
43066
|
+
});
|
|
43067
|
+
return next;
|
|
43068
|
+
}
|
|
43069
|
+
strict(isStrict = true) {
|
|
43070
|
+
return this.clone({
|
|
43071
|
+
strict: isStrict
|
|
43072
|
+
});
|
|
43073
|
+
}
|
|
43074
|
+
nullability(nullable, message) {
|
|
43075
|
+
const next = this.clone({
|
|
43076
|
+
nullable
|
|
43077
|
+
});
|
|
43078
|
+
next.internalTests.nullable = createValidation({
|
|
43079
|
+
message,
|
|
43080
|
+
name: 'nullable',
|
|
43081
|
+
test(value) {
|
|
43082
|
+
return value === null ? this.schema.spec.nullable : true;
|
|
43083
|
+
}
|
|
43084
|
+
});
|
|
43085
|
+
return next;
|
|
43086
|
+
}
|
|
43087
|
+
optionality(optional, message) {
|
|
43088
|
+
const next = this.clone({
|
|
43089
|
+
optional
|
|
43090
|
+
});
|
|
43091
|
+
next.internalTests.optionality = createValidation({
|
|
43092
|
+
message,
|
|
43093
|
+
name: 'optionality',
|
|
43094
|
+
test(value) {
|
|
43095
|
+
return value === undefined ? this.schema.spec.optional : true;
|
|
43096
|
+
}
|
|
43097
|
+
});
|
|
43098
|
+
return next;
|
|
43099
|
+
}
|
|
43100
|
+
optional() {
|
|
43101
|
+
return this.optionality(true);
|
|
43102
|
+
}
|
|
43103
|
+
defined(message = mixed.defined) {
|
|
43104
|
+
return this.optionality(false, message);
|
|
43105
|
+
}
|
|
43106
|
+
nullable() {
|
|
43107
|
+
return this.nullability(true);
|
|
43108
|
+
}
|
|
43109
|
+
nonNullable(message = mixed.notNull) {
|
|
43110
|
+
return this.nullability(false, message);
|
|
43111
|
+
}
|
|
43112
|
+
required(message = mixed.required) {
|
|
43113
|
+
return this.clone().withMutation((next) => next.nonNullable(message).defined(message));
|
|
43114
|
+
}
|
|
43115
|
+
notRequired() {
|
|
43116
|
+
return this.clone().withMutation((next) => next.nullable().optional());
|
|
43117
|
+
}
|
|
43118
|
+
transform(fn) {
|
|
43119
|
+
let next = this.clone();
|
|
43120
|
+
next.transforms.push(fn);
|
|
43121
|
+
return next;
|
|
43122
|
+
}
|
|
43123
|
+
|
|
43124
|
+
/**
|
|
43125
|
+
* Adds a test function to the schema's queue of tests.
|
|
43126
|
+
* tests can be exclusive or non-exclusive.
|
|
43127
|
+
*
|
|
43128
|
+
* - exclusive tests, will replace any existing tests of the same name.
|
|
43129
|
+
* - non-exclusive: can be stacked
|
|
43130
|
+
*
|
|
43131
|
+
* If a non-exclusive test is added to a schema with an exclusive test of the same name
|
|
43132
|
+
* the exclusive test is removed and further tests of the same name will be stacked.
|
|
43133
|
+
*
|
|
43134
|
+
* If an exclusive test is added to a schema with non-exclusive tests of the same name
|
|
43135
|
+
* the previous tests are removed and further tests of the same name will replace each other.
|
|
43136
|
+
*/
|
|
43137
|
+
|
|
43138
|
+
test(...args) {
|
|
43139
|
+
let opts;
|
|
43140
|
+
if (args.length === 1) {
|
|
43141
|
+
if (typeof args[0] === 'function') {
|
|
43142
|
+
opts = {
|
|
43143
|
+
test: args[0]
|
|
43144
|
+
};
|
|
43145
|
+
} else {
|
|
43146
|
+
opts = args[0];
|
|
43147
|
+
}
|
|
43148
|
+
} else if (args.length === 2) {
|
|
43149
|
+
opts = {
|
|
43150
|
+
name: args[0],
|
|
43151
|
+
test: args[1]
|
|
43152
|
+
};
|
|
43153
|
+
} else {
|
|
43154
|
+
opts = {
|
|
43155
|
+
name: args[0],
|
|
43156
|
+
message: args[1],
|
|
43157
|
+
test: args[2]
|
|
43158
|
+
};
|
|
43159
|
+
}
|
|
43160
|
+
if (opts.message === undefined) opts.message = mixed.default;
|
|
43161
|
+
if (typeof opts.test !== 'function') throw new TypeError('`test` is a required parameters');
|
|
43162
|
+
let next = this.clone();
|
|
43163
|
+
let validate = createValidation(opts);
|
|
43164
|
+
let isExclusive = opts.exclusive || (opts.name && next.exclusiveTests[opts.name] === true);
|
|
43165
|
+
if (opts.exclusive) {
|
|
43166
|
+
if (!opts.name) throw new TypeError('Exclusive tests must provide a unique `name` identifying the test');
|
|
43167
|
+
}
|
|
43168
|
+
if (opts.name) next.exclusiveTests[opts.name] = !!opts.exclusive;
|
|
43169
|
+
next.tests = next.tests.filter((fn) => {
|
|
43170
|
+
if (fn.OPTIONS.name === opts.name) {
|
|
43171
|
+
if (isExclusive) return false;
|
|
43172
|
+
if (fn.OPTIONS.test === validate.OPTIONS.test) return false;
|
|
43173
|
+
}
|
|
43174
|
+
return true;
|
|
43175
|
+
});
|
|
43176
|
+
next.tests.push(validate);
|
|
43177
|
+
return next;
|
|
43178
|
+
}
|
|
43179
|
+
when(keys, options) {
|
|
43180
|
+
if (!Array.isArray(keys) && typeof keys !== 'string') {
|
|
43181
|
+
options = keys;
|
|
43182
|
+
keys = '.';
|
|
43183
|
+
}
|
|
43184
|
+
let next = this.clone();
|
|
43185
|
+
let deps = toArray(keys).map((key) => new Reference(key));
|
|
43186
|
+
deps.forEach((dep) => {
|
|
43187
|
+
// @ts-ignore readonly array
|
|
43188
|
+
if (dep.isSibling) next.deps.push(dep.key);
|
|
43189
|
+
});
|
|
43190
|
+
next.conditions.push(typeof options === 'function' ? new Condition(deps, options) : Condition.fromOptions(deps, options));
|
|
43191
|
+
return next;
|
|
43192
|
+
}
|
|
43193
|
+
typeError(message) {
|
|
43194
|
+
let next = this.clone();
|
|
43195
|
+
next.internalTests.typeError = createValidation({
|
|
43196
|
+
message,
|
|
43197
|
+
name: 'typeError',
|
|
43198
|
+
skipAbsent: true,
|
|
43199
|
+
test(value) {
|
|
43200
|
+
if (!this.schema._typeCheck(value))
|
|
43201
|
+
return this.createError({
|
|
43202
|
+
params: {
|
|
43203
|
+
type: this.schema.type
|
|
43204
|
+
}
|
|
43205
|
+
});
|
|
43206
|
+
return true;
|
|
43207
|
+
}
|
|
43208
|
+
});
|
|
43209
|
+
return next;
|
|
43210
|
+
}
|
|
43211
|
+
oneOf(enums, message = mixed.oneOf) {
|
|
43212
|
+
let next = this.clone();
|
|
43213
|
+
enums.forEach((val) => {
|
|
43214
|
+
next._whitelist.add(val);
|
|
43215
|
+
next._blacklist.delete(val);
|
|
43216
|
+
});
|
|
43217
|
+
next.internalTests.whiteList = createValidation({
|
|
43218
|
+
message,
|
|
43219
|
+
name: 'oneOf',
|
|
43220
|
+
skipAbsent: true,
|
|
43221
|
+
test(value) {
|
|
43222
|
+
let valids = this.schema._whitelist;
|
|
43223
|
+
let resolved = valids.resolveAll(this.resolve);
|
|
43224
|
+
return resolved.includes(value)
|
|
43225
|
+
? true
|
|
43226
|
+
: this.createError({
|
|
43227
|
+
params: {
|
|
43228
|
+
values: Array.from(valids).join(', '),
|
|
43229
|
+
resolved
|
|
43230
|
+
}
|
|
43231
|
+
});
|
|
43232
|
+
}
|
|
43233
|
+
});
|
|
43234
|
+
return next;
|
|
43235
|
+
}
|
|
43236
|
+
notOneOf(enums, message = mixed.notOneOf) {
|
|
43237
|
+
let next = this.clone();
|
|
43238
|
+
enums.forEach((val) => {
|
|
43239
|
+
next._blacklist.add(val);
|
|
43240
|
+
next._whitelist.delete(val);
|
|
43241
|
+
});
|
|
43242
|
+
next.internalTests.blacklist = createValidation({
|
|
43243
|
+
message,
|
|
43244
|
+
name: 'notOneOf',
|
|
43245
|
+
test(value) {
|
|
43246
|
+
let invalids = this.schema._blacklist;
|
|
43247
|
+
let resolved = invalids.resolveAll(this.resolve);
|
|
43248
|
+
if (resolved.includes(value))
|
|
43249
|
+
return this.createError({
|
|
43250
|
+
params: {
|
|
43251
|
+
values: Array.from(invalids).join(', '),
|
|
43252
|
+
resolved
|
|
43253
|
+
}
|
|
43254
|
+
});
|
|
43255
|
+
return true;
|
|
43256
|
+
}
|
|
43257
|
+
});
|
|
43258
|
+
return next;
|
|
43259
|
+
}
|
|
43260
|
+
strip(strip = true) {
|
|
43261
|
+
let next = this.clone();
|
|
43262
|
+
next.spec.strip = strip;
|
|
43263
|
+
return next;
|
|
43264
|
+
}
|
|
43265
|
+
|
|
43266
|
+
/**
|
|
43267
|
+
* Return a serialized description of the schema including validations, flags, types etc.
|
|
43268
|
+
*
|
|
43269
|
+
* @param options Provide any needed context for resolving runtime schema alterations (lazy, when conditions, etc).
|
|
43270
|
+
*/
|
|
43271
|
+
describe(options) {
|
|
43272
|
+
const next = (options ? this.resolve(options) : this).clone();
|
|
43273
|
+
const { label, meta, optional, nullable } = next.spec;
|
|
43274
|
+
const description = {
|
|
43275
|
+
meta,
|
|
43276
|
+
label,
|
|
43277
|
+
optional,
|
|
43278
|
+
nullable,
|
|
43279
|
+
default: next.getDefault(options),
|
|
43280
|
+
type: next.type,
|
|
43281
|
+
oneOf: next._whitelist.describe(),
|
|
43282
|
+
notOneOf: next._blacklist.describe(),
|
|
43283
|
+
tests: next.tests
|
|
43284
|
+
.map((fn) => ({
|
|
43285
|
+
name: fn.OPTIONS.name,
|
|
43286
|
+
params: fn.OPTIONS.params
|
|
43287
|
+
}))
|
|
43288
|
+
.filter((n, idx, list) => list.findIndex((c) => c.name === n.name) === idx)
|
|
43289
|
+
};
|
|
43290
|
+
return description;
|
|
43291
|
+
}
|
|
43292
|
+
}
|
|
43293
|
+
// @ts-expect-error
|
|
43294
|
+
Schema.prototype.__isYupSchema__ = true;
|
|
43295
|
+
for (const method of ['validate', 'validateSync'])
|
|
43296
|
+
Schema.prototype[`${method}At`] = function (path, value, options = {}) {
|
|
43297
|
+
const { parent, parentPath, schema } = getIn(this, path, value, options.context);
|
|
43298
|
+
return schema[method](
|
|
43299
|
+
parent && parent[parentPath],
|
|
43300
|
+
Object.assign({}, options, {
|
|
43301
|
+
parent,
|
|
43302
|
+
path
|
|
43303
|
+
})
|
|
43304
|
+
);
|
|
43305
|
+
};
|
|
43306
|
+
for (const alias of ['equals', 'is']) Schema.prototype[alias] = Schema.prototype.oneOf;
|
|
43307
|
+
for (const alias of ['not', 'nope']) Schema.prototype[alias] = Schema.prototype.notOneOf;
|
|
43308
|
+
|
|
43309
|
+
/**
|
|
43310
|
+
* This file is a modified version of the file from the following repository:
|
|
43311
|
+
* Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
|
|
43312
|
+
* NON-CONFORMANT EDITION.
|
|
43313
|
+
* © 2011 Colin Snover <http://zetafleet.com>
|
|
43314
|
+
* Released under MIT license.
|
|
43315
|
+
*/
|
|
43316
|
+
|
|
43317
|
+
// prettier-ignore
|
|
43318
|
+
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
|
|
43319
|
+
const isoReg = /^(\d{4}|[+-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,.](\d{1,}))?)?(?:(Z)|([+-])(\d{2})(?::?(\d{2}))?)?)?$/;
|
|
43320
|
+
function parseIsoDate(date) {
|
|
43321
|
+
const struct = parseDateStruct(date);
|
|
43322
|
+
if (!struct) return Date.parse ? Date.parse(date) : Number.NaN;
|
|
43323
|
+
|
|
43324
|
+
// timestamps without timezone identifiers should be considered local time
|
|
43325
|
+
if (struct.z === undefined && struct.plusMinus === undefined) {
|
|
43326
|
+
return new Date(struct.year, struct.month, struct.day, struct.hour, struct.minute, struct.second, struct.millisecond).valueOf();
|
|
43327
|
+
}
|
|
43328
|
+
let totalMinutesOffset = 0;
|
|
43329
|
+
if (struct.z !== 'Z' && struct.plusMinus !== undefined) {
|
|
43330
|
+
totalMinutesOffset = struct.hourOffset * 60 + struct.minuteOffset;
|
|
43331
|
+
if (struct.plusMinus === '+') totalMinutesOffset = 0 - totalMinutesOffset;
|
|
43332
|
+
}
|
|
43333
|
+
return Date.UTC(struct.year, struct.month, struct.day, struct.hour, struct.minute + totalMinutesOffset, struct.second, struct.millisecond);
|
|
43334
|
+
}
|
|
43335
|
+
function parseDateStruct(date) {
|
|
43336
|
+
var _regexResult$7$length, _regexResult$;
|
|
43337
|
+
const regexResult = isoReg.exec(date);
|
|
43338
|
+
if (!regexResult) return null;
|
|
43339
|
+
|
|
43340
|
+
// use of toNumber() avoids NaN timestamps caused by “undefined”
|
|
43341
|
+
// values being passed to Date constructor
|
|
43342
|
+
return {
|
|
43343
|
+
year: toNumber(regexResult[1]),
|
|
43344
|
+
month: toNumber(regexResult[2], 1) - 1,
|
|
43345
|
+
day: toNumber(regexResult[3], 1),
|
|
43346
|
+
hour: toNumber(regexResult[4]),
|
|
43347
|
+
minute: toNumber(regexResult[5]),
|
|
43348
|
+
second: toNumber(regexResult[6]),
|
|
43349
|
+
millisecond: regexResult[7]
|
|
43350
|
+
? // allow arbitrary sub-second precision beyond milliseconds
|
|
43351
|
+
toNumber(regexResult[7].substring(0, 3))
|
|
43352
|
+
: 0,
|
|
43353
|
+
precision: (_regexResult$7$length = (_regexResult$ = regexResult[7]) == null ? void 0 : _regexResult$.length) != null ? _regexResult$7$length : undefined,
|
|
43354
|
+
z: regexResult[8] || undefined,
|
|
43355
|
+
plusMinus: regexResult[9] || undefined,
|
|
43356
|
+
hourOffset: toNumber(regexResult[10]),
|
|
43357
|
+
minuteOffset: toNumber(regexResult[11])
|
|
43358
|
+
};
|
|
43359
|
+
}
|
|
43360
|
+
function toNumber(str, defaultValue = 0) {
|
|
43361
|
+
return Number(str) || defaultValue;
|
|
43362
|
+
}
|
|
43363
|
+
|
|
43364
|
+
// Taken from HTML spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
|
|
43365
|
+
let rEmail =
|
|
43366
|
+
// eslint-disable-next-line
|
|
43367
|
+
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
43368
|
+
let rUrl =
|
|
43369
|
+
// eslint-disable-next-line
|
|
43370
|
+
/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
|
|
43371
|
+
|
|
43372
|
+
// eslint-disable-next-line
|
|
43373
|
+
let rUUID = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
|
|
43374
|
+
let yearMonthDay = '^\\d{4}-\\d{2}-\\d{2}';
|
|
43375
|
+
let hourMinuteSecond = '\\d{2}:\\d{2}:\\d{2}';
|
|
43376
|
+
let zOrOffset = '(([+-]\\d{2}(:?\\d{2})?)|Z)';
|
|
43377
|
+
let rIsoDateTime = new RegExp(`${yearMonthDay}T${hourMinuteSecond}(\\.\\d+)?${zOrOffset}$`);
|
|
43378
|
+
let isTrimmed = (value) => isAbsent(value) || value === value.trim();
|
|
43379
|
+
let objStringTag = {}.toString();
|
|
43380
|
+
function create$6() {
|
|
43381
|
+
return new StringSchema();
|
|
43382
|
+
}
|
|
43383
|
+
class StringSchema extends Schema {
|
|
43384
|
+
constructor() {
|
|
43385
|
+
super({
|
|
43386
|
+
type: 'string',
|
|
43387
|
+
check(value) {
|
|
43388
|
+
if (value instanceof String) value = value.valueOf();
|
|
43389
|
+
return typeof value === 'string';
|
|
43390
|
+
}
|
|
43391
|
+
});
|
|
43392
|
+
this.withMutation(() => {
|
|
43393
|
+
this.transform((value, _raw, ctx) => {
|
|
43394
|
+
if (!ctx.spec.coerce || ctx.isType(value)) return value;
|
|
43395
|
+
|
|
43396
|
+
// don't ever convert arrays
|
|
43397
|
+
if (Array.isArray(value)) return value;
|
|
43398
|
+
const strValue = value != null && value.toString ? value.toString() : value;
|
|
43399
|
+
|
|
43400
|
+
// no one wants plain objects converted to [Object object]
|
|
43401
|
+
if (strValue === objStringTag) return value;
|
|
43402
|
+
return strValue;
|
|
43403
|
+
});
|
|
43404
|
+
});
|
|
43405
|
+
}
|
|
43406
|
+
required(message) {
|
|
43407
|
+
return super.required(message).withMutation((schema) =>
|
|
43408
|
+
schema.test({
|
|
43409
|
+
message: message || mixed.required,
|
|
43410
|
+
name: 'required',
|
|
43411
|
+
skipAbsent: true,
|
|
43412
|
+
test: (value) => !!value.length
|
|
43413
|
+
})
|
|
43414
|
+
);
|
|
43415
|
+
}
|
|
43416
|
+
notRequired() {
|
|
43417
|
+
return super.notRequired().withMutation((schema) => {
|
|
43418
|
+
schema.tests = schema.tests.filter((t) => t.OPTIONS.name !== 'required');
|
|
43419
|
+
return schema;
|
|
43420
|
+
});
|
|
43421
|
+
}
|
|
43422
|
+
length(length, message = string.length) {
|
|
43423
|
+
return this.test({
|
|
43424
|
+
message,
|
|
43425
|
+
name: 'length',
|
|
43426
|
+
exclusive: true,
|
|
43427
|
+
params: {
|
|
43428
|
+
length
|
|
43429
|
+
},
|
|
43430
|
+
skipAbsent: true,
|
|
43431
|
+
test(value) {
|
|
43432
|
+
return value.length === this.resolve(length);
|
|
43433
|
+
}
|
|
43434
|
+
});
|
|
43435
|
+
}
|
|
43436
|
+
min(min, message = string.min) {
|
|
43437
|
+
return this.test({
|
|
43438
|
+
message,
|
|
43439
|
+
name: 'min',
|
|
43440
|
+
exclusive: true,
|
|
43441
|
+
params: {
|
|
43442
|
+
min
|
|
43443
|
+
},
|
|
43444
|
+
skipAbsent: true,
|
|
43445
|
+
test(value) {
|
|
43446
|
+
return value.length >= this.resolve(min);
|
|
43447
|
+
}
|
|
43448
|
+
});
|
|
43449
|
+
}
|
|
43450
|
+
max(max, message = string.max) {
|
|
43451
|
+
return this.test({
|
|
43452
|
+
name: 'max',
|
|
43453
|
+
exclusive: true,
|
|
43454
|
+
message,
|
|
43455
|
+
params: {
|
|
43456
|
+
max
|
|
43457
|
+
},
|
|
43458
|
+
skipAbsent: true,
|
|
43459
|
+
test(value) {
|
|
43460
|
+
return value.length <= this.resolve(max);
|
|
43461
|
+
}
|
|
43462
|
+
});
|
|
43463
|
+
}
|
|
43464
|
+
matches(regex, options) {
|
|
43465
|
+
let excludeEmptyString = false;
|
|
43466
|
+
let message;
|
|
43467
|
+
let name;
|
|
43468
|
+
if (options) {
|
|
43469
|
+
if (typeof options === 'object') {
|
|
43470
|
+
({ excludeEmptyString = false, message, name } = options);
|
|
43471
|
+
} else {
|
|
43472
|
+
message = options;
|
|
43473
|
+
}
|
|
43474
|
+
}
|
|
43475
|
+
return this.test({
|
|
43476
|
+
name: name || 'matches',
|
|
43477
|
+
message: message || string.matches,
|
|
43478
|
+
params: {
|
|
43479
|
+
regex
|
|
43480
|
+
},
|
|
43481
|
+
skipAbsent: true,
|
|
43482
|
+
test: (value) => (value === '' && excludeEmptyString) || value.search(regex) !== -1
|
|
43483
|
+
});
|
|
43484
|
+
}
|
|
43485
|
+
email(message = string.email) {
|
|
43486
|
+
return this.matches(rEmail, {
|
|
43487
|
+
name: 'email',
|
|
43488
|
+
message,
|
|
43489
|
+
excludeEmptyString: true
|
|
43490
|
+
});
|
|
43491
|
+
}
|
|
43492
|
+
url(message = string.url) {
|
|
43493
|
+
return this.matches(rUrl, {
|
|
43494
|
+
name: 'url',
|
|
43495
|
+
message,
|
|
43496
|
+
excludeEmptyString: true
|
|
43497
|
+
});
|
|
43498
|
+
}
|
|
43499
|
+
uuid(message = string.uuid) {
|
|
43500
|
+
return this.matches(rUUID, {
|
|
43501
|
+
name: 'uuid',
|
|
43502
|
+
message,
|
|
43503
|
+
excludeEmptyString: false
|
|
43504
|
+
});
|
|
43505
|
+
}
|
|
43506
|
+
datetime(options) {
|
|
43507
|
+
let message = '';
|
|
43508
|
+
let allowOffset;
|
|
43509
|
+
let precision;
|
|
43510
|
+
if (options) {
|
|
43511
|
+
if (typeof options === 'object') {
|
|
43512
|
+
({ message = '', allowOffset = false, precision = undefined } = options);
|
|
43513
|
+
} else {
|
|
43514
|
+
message = options;
|
|
43515
|
+
}
|
|
43516
|
+
}
|
|
43517
|
+
return this.matches(rIsoDateTime, {
|
|
43518
|
+
name: 'datetime',
|
|
43519
|
+
message: message || string.datetime,
|
|
43520
|
+
excludeEmptyString: true
|
|
43521
|
+
})
|
|
43522
|
+
.test({
|
|
43523
|
+
name: 'datetime_offset',
|
|
43524
|
+
message: message || string.datetime_offset,
|
|
43525
|
+
params: {
|
|
43526
|
+
allowOffset
|
|
43527
|
+
},
|
|
43528
|
+
skipAbsent: true,
|
|
43529
|
+
test: (value) => {
|
|
43530
|
+
if (!value || allowOffset) return true;
|
|
43531
|
+
const struct = parseDateStruct(value);
|
|
43532
|
+
if (!struct) return false;
|
|
43533
|
+
return !!struct.z;
|
|
43534
|
+
}
|
|
43535
|
+
})
|
|
43536
|
+
.test({
|
|
43537
|
+
name: 'datetime_precision',
|
|
43538
|
+
message: message || string.datetime_precision,
|
|
43539
|
+
params: {
|
|
43540
|
+
precision
|
|
43541
|
+
},
|
|
43542
|
+
skipAbsent: true,
|
|
43543
|
+
test: (value) => {
|
|
43544
|
+
if (!value || precision == undefined) return true;
|
|
43545
|
+
const struct = parseDateStruct(value);
|
|
43546
|
+
if (!struct) return false;
|
|
43547
|
+
return struct.precision === precision;
|
|
43548
|
+
}
|
|
43549
|
+
});
|
|
43550
|
+
}
|
|
43551
|
+
|
|
43552
|
+
//-- transforms --
|
|
43553
|
+
ensure() {
|
|
43554
|
+
return this.default('').transform((val) => (val === null ? '' : val));
|
|
43555
|
+
}
|
|
43556
|
+
trim(message = string.trim) {
|
|
43557
|
+
return this.transform((val) => (val != null ? val.trim() : val)).test({
|
|
43558
|
+
message,
|
|
43559
|
+
name: 'trim',
|
|
43560
|
+
test: isTrimmed
|
|
43561
|
+
});
|
|
43562
|
+
}
|
|
43563
|
+
lowercase(message = string.lowercase) {
|
|
43564
|
+
return this.transform((value) => (!isAbsent(value) ? value.toLowerCase() : value)).test({
|
|
43565
|
+
message,
|
|
43566
|
+
name: 'string_case',
|
|
43567
|
+
exclusive: true,
|
|
43568
|
+
skipAbsent: true,
|
|
43569
|
+
test: (value) => isAbsent(value) || value === value.toLowerCase()
|
|
43570
|
+
});
|
|
43571
|
+
}
|
|
43572
|
+
uppercase(message = string.uppercase) {
|
|
43573
|
+
return this.transform((value) => (!isAbsent(value) ? value.toUpperCase() : value)).test({
|
|
43574
|
+
message,
|
|
43575
|
+
name: 'string_case',
|
|
43576
|
+
exclusive: true,
|
|
43577
|
+
skipAbsent: true,
|
|
43578
|
+
test: (value) => isAbsent(value) || value === value.toUpperCase()
|
|
43579
|
+
});
|
|
43580
|
+
}
|
|
43581
|
+
}
|
|
43582
|
+
create$6.prototype = StringSchema.prototype;
|
|
43583
|
+
|
|
43584
|
+
//
|
|
43585
|
+
// Number Interfaces
|
|
43586
|
+
//
|
|
43587
|
+
|
|
43588
|
+
let invalidDate = new Date('');
|
|
43589
|
+
let isDate = (obj) => Object.prototype.toString.call(obj) === '[object Date]';
|
|
43590
|
+
class DateSchema extends Schema {
|
|
43591
|
+
constructor() {
|
|
43592
|
+
super({
|
|
43593
|
+
type: 'date',
|
|
43594
|
+
check(v) {
|
|
43595
|
+
return isDate(v) && !isNaN(v.getTime());
|
|
43596
|
+
}
|
|
43597
|
+
});
|
|
43598
|
+
this.withMutation(() => {
|
|
43599
|
+
this.transform((value, _raw, ctx) => {
|
|
43600
|
+
// null -> InvalidDate isn't useful; treat all nulls as null and let it fail on
|
|
43601
|
+
// nullability check vs TypeErrors
|
|
43602
|
+
if (!ctx.spec.coerce || ctx.isType(value) || value === null) return value;
|
|
43603
|
+
value = parseIsoDate(value);
|
|
43604
|
+
|
|
43605
|
+
// 0 is a valid timestamp equivalent to 1970-01-01T00:00:00Z(unix epoch) or before.
|
|
43606
|
+
return !isNaN(value) ? new Date(value) : DateSchema.INVALID_DATE;
|
|
43607
|
+
});
|
|
43608
|
+
});
|
|
43609
|
+
}
|
|
43610
|
+
prepareParam(ref, name) {
|
|
43611
|
+
let param;
|
|
43612
|
+
if (!Reference.isRef(ref)) {
|
|
43613
|
+
let cast = this.cast(ref);
|
|
43614
|
+
if (!this._typeCheck(cast)) throw new TypeError(`\`${name}\` must be a Date or a value that can be \`cast()\` to a Date`);
|
|
43615
|
+
param = cast;
|
|
43616
|
+
} else {
|
|
43617
|
+
param = ref;
|
|
43618
|
+
}
|
|
43619
|
+
return param;
|
|
43620
|
+
}
|
|
43621
|
+
min(min, message = date.min) {
|
|
43622
|
+
let limit = this.prepareParam(min, 'min');
|
|
43623
|
+
return this.test({
|
|
43624
|
+
message,
|
|
43625
|
+
name: 'min',
|
|
43626
|
+
exclusive: true,
|
|
43627
|
+
params: {
|
|
43628
|
+
min
|
|
43629
|
+
},
|
|
43630
|
+
skipAbsent: true,
|
|
43631
|
+
test(value) {
|
|
43632
|
+
return value >= this.resolve(limit);
|
|
43633
|
+
}
|
|
43634
|
+
});
|
|
43635
|
+
}
|
|
43636
|
+
max(max, message = date.max) {
|
|
43637
|
+
let limit = this.prepareParam(max, 'max');
|
|
43638
|
+
return this.test({
|
|
43639
|
+
message,
|
|
43640
|
+
name: 'max',
|
|
43641
|
+
exclusive: true,
|
|
43642
|
+
params: {
|
|
43643
|
+
max
|
|
43644
|
+
},
|
|
43645
|
+
skipAbsent: true,
|
|
43646
|
+
test(value) {
|
|
43647
|
+
return value <= this.resolve(limit);
|
|
43648
|
+
}
|
|
43649
|
+
});
|
|
43650
|
+
}
|
|
43651
|
+
}
|
|
43652
|
+
DateSchema.INVALID_DATE = invalidDate;
|
|
43653
|
+
DateSchema.prototype;
|
|
43654
|
+
|
|
43655
|
+
// @ts-expect-error
|
|
43656
|
+
function sortFields(fields, excludedEdges = []) {
|
|
43657
|
+
let edges = [];
|
|
43658
|
+
let nodes = new Set();
|
|
43659
|
+
let excludes = new Set(excludedEdges.map(([a, b]) => `${a}-${b}`));
|
|
43660
|
+
function addNode(depPath, key) {
|
|
43661
|
+
let node = propertyExpr.split(depPath)[0];
|
|
43662
|
+
nodes.add(node);
|
|
43663
|
+
if (!excludes.has(`${key}-${node}`)) edges.push([key, node]);
|
|
43664
|
+
}
|
|
43665
|
+
for (const key of Object.keys(fields)) {
|
|
43666
|
+
let value = fields[key];
|
|
43667
|
+
nodes.add(key);
|
|
43668
|
+
if (Reference.isRef(value) && value.isSibling) addNode(value.path, key);
|
|
43669
|
+
else if (isSchema(value) && 'deps' in value) value.deps.forEach((path) => addNode(path, key));
|
|
43670
|
+
}
|
|
43671
|
+
return toposort$1.array(Array.from(nodes), edges).reverse();
|
|
43672
|
+
}
|
|
43673
|
+
|
|
43674
|
+
function findIndex(arr, err) {
|
|
43675
|
+
let idx = Infinity;
|
|
43676
|
+
arr.some((key, ii) => {
|
|
43677
|
+
var _err$path;
|
|
43678
|
+
if ((_err$path = err.path) != null && _err$path.includes(key)) {
|
|
43679
|
+
idx = ii;
|
|
43680
|
+
return true;
|
|
43681
|
+
}
|
|
43682
|
+
});
|
|
43683
|
+
return idx;
|
|
43684
|
+
}
|
|
43685
|
+
function sortByKeyOrder(keys) {
|
|
43686
|
+
return (a, b) => {
|
|
43687
|
+
return findIndex(keys, a) - findIndex(keys, b);
|
|
43688
|
+
};
|
|
43689
|
+
}
|
|
43690
|
+
|
|
43691
|
+
const parseJson = (value, _, ctx) => {
|
|
43692
|
+
if (typeof value !== 'string') {
|
|
43693
|
+
return value;
|
|
43694
|
+
}
|
|
43695
|
+
let parsed = value;
|
|
43696
|
+
try {
|
|
43697
|
+
parsed = JSON.parse(value);
|
|
43698
|
+
} catch (err) {
|
|
43699
|
+
/* */
|
|
43700
|
+
}
|
|
43701
|
+
return ctx.isType(parsed) ? parsed : value;
|
|
43702
|
+
};
|
|
43703
|
+
|
|
43704
|
+
// @ts-ignore
|
|
43705
|
+
function deepPartial(schema) {
|
|
43706
|
+
if ('fields' in schema) {
|
|
43707
|
+
const partial = {};
|
|
43708
|
+
for (const [key, fieldSchema] of Object.entries(schema.fields)) {
|
|
43709
|
+
partial[key] = deepPartial(fieldSchema);
|
|
43710
|
+
}
|
|
43711
|
+
return schema.setFields(partial);
|
|
43712
|
+
}
|
|
43713
|
+
if (schema.type === 'array') {
|
|
43714
|
+
const nextArray = schema.optional();
|
|
43715
|
+
if (nextArray.innerType) nextArray.innerType = deepPartial(nextArray.innerType);
|
|
43716
|
+
return nextArray;
|
|
43717
|
+
}
|
|
43718
|
+
if (schema.type === 'tuple') {
|
|
43719
|
+
return schema.optional().clone({
|
|
43720
|
+
types: schema.spec.types.map(deepPartial)
|
|
43721
|
+
});
|
|
43722
|
+
}
|
|
43723
|
+
if ('optional' in schema) {
|
|
43724
|
+
return schema.optional();
|
|
43725
|
+
}
|
|
43726
|
+
return schema;
|
|
43727
|
+
}
|
|
43728
|
+
const deepHas = (obj, p) => {
|
|
43729
|
+
const path = [...propertyExpr.normalizePath(p)];
|
|
43730
|
+
if (path.length === 1) return path[0] in obj;
|
|
43731
|
+
let last = path.pop();
|
|
43732
|
+
let parent = propertyExpr.getter(propertyExpr.join(path), true)(obj);
|
|
43733
|
+
return !!(parent && last in parent);
|
|
43734
|
+
};
|
|
43735
|
+
let isObject = (obj) => Object.prototype.toString.call(obj) === '[object Object]';
|
|
43736
|
+
function unknown(ctx, value) {
|
|
43737
|
+
let known = Object.keys(ctx.fields);
|
|
43738
|
+
return Object.keys(value).filter((key) => known.indexOf(key) === -1);
|
|
43739
|
+
}
|
|
43740
|
+
const defaultSort = sortByKeyOrder([]);
|
|
43741
|
+
function create$3(spec) {
|
|
43742
|
+
return new ObjectSchema(spec);
|
|
43743
|
+
}
|
|
43744
|
+
class ObjectSchema extends Schema {
|
|
43745
|
+
constructor(spec) {
|
|
43746
|
+
super({
|
|
43747
|
+
type: 'object',
|
|
43748
|
+
check(value) {
|
|
43749
|
+
return isObject(value) || typeof value === 'function';
|
|
43750
|
+
}
|
|
43751
|
+
});
|
|
43752
|
+
this.fields = Object.create(null);
|
|
43753
|
+
this._sortErrors = defaultSort;
|
|
43754
|
+
this._nodes = [];
|
|
43755
|
+
this._excludedEdges = [];
|
|
43756
|
+
this.withMutation(() => {
|
|
43757
|
+
if (spec) {
|
|
43758
|
+
this.shape(spec);
|
|
43759
|
+
}
|
|
43760
|
+
});
|
|
43761
|
+
}
|
|
43762
|
+
_cast(_value, options = {}) {
|
|
43763
|
+
var _options$stripUnknown;
|
|
43764
|
+
let value = super._cast(_value, options);
|
|
43765
|
+
|
|
43766
|
+
//should ignore nulls here
|
|
43767
|
+
if (value === undefined) return this.getDefault(options);
|
|
43768
|
+
if (!this._typeCheck(value)) return value;
|
|
43769
|
+
let fields = this.fields;
|
|
43770
|
+
let strip = (_options$stripUnknown = options.stripUnknown) != null ? _options$stripUnknown : this.spec.noUnknown;
|
|
43771
|
+
let props = [].concat(
|
|
43772
|
+
this._nodes,
|
|
43773
|
+
Object.keys(value).filter((v) => !this._nodes.includes(v))
|
|
43774
|
+
);
|
|
43775
|
+
let intermediateValue = {}; // is filled during the transform below
|
|
43776
|
+
let innerOptions = Object.assign({}, options, {
|
|
43777
|
+
parent: intermediateValue,
|
|
43778
|
+
__validating: options.__validating || false
|
|
43779
|
+
});
|
|
43780
|
+
let isChanged = false;
|
|
43781
|
+
for (const prop of props) {
|
|
43782
|
+
let field = fields[prop];
|
|
43783
|
+
let exists = prop in value;
|
|
43784
|
+
if (field) {
|
|
43785
|
+
let fieldValue;
|
|
43786
|
+
let inputValue = value[prop];
|
|
43787
|
+
|
|
43788
|
+
// safe to mutate since this is fired in sequence
|
|
43789
|
+
innerOptions.path = (options.path ? `${options.path}.` : '') + prop;
|
|
43790
|
+
field = field.resolve({
|
|
43791
|
+
value: inputValue,
|
|
43792
|
+
context: options.context,
|
|
43793
|
+
parent: intermediateValue
|
|
43794
|
+
});
|
|
43795
|
+
let fieldSpec = field instanceof Schema ? field.spec : undefined;
|
|
43796
|
+
let strict = fieldSpec == null ? void 0 : fieldSpec.strict;
|
|
43797
|
+
if (fieldSpec != null && fieldSpec.strip) {
|
|
43798
|
+
isChanged = isChanged || prop in value;
|
|
43799
|
+
continue;
|
|
43800
|
+
}
|
|
43801
|
+
fieldValue =
|
|
43802
|
+
!options.__validating || !strict
|
|
43803
|
+
? // TODO: use _cast, this is double resolving
|
|
43804
|
+
field.cast(value[prop], innerOptions)
|
|
43805
|
+
: value[prop];
|
|
43806
|
+
if (fieldValue !== undefined) {
|
|
43807
|
+
intermediateValue[prop] = fieldValue;
|
|
43808
|
+
}
|
|
43809
|
+
} else if (exists && !strip) {
|
|
43810
|
+
intermediateValue[prop] = value[prop];
|
|
43811
|
+
}
|
|
43812
|
+
if (exists !== prop in intermediateValue || intermediateValue[prop] !== value[prop]) {
|
|
43813
|
+
isChanged = true;
|
|
43814
|
+
}
|
|
43815
|
+
}
|
|
43816
|
+
return isChanged ? intermediateValue : value;
|
|
43817
|
+
}
|
|
43818
|
+
_validate(_value, options = {}, panic, next) {
|
|
43819
|
+
let { from = [], originalValue = _value, recursive = this.spec.recursive } = options;
|
|
43820
|
+
options.from = [
|
|
43821
|
+
{
|
|
43822
|
+
schema: this,
|
|
43823
|
+
value: originalValue
|
|
43824
|
+
},
|
|
43825
|
+
...from
|
|
43826
|
+
];
|
|
43827
|
+
// this flag is needed for handling `strict` correctly in the context of
|
|
43828
|
+
// validation vs just casting. e.g strict() on a field is only used when validating
|
|
43829
|
+
options.__validating = true;
|
|
43830
|
+
options.originalValue = originalValue;
|
|
43831
|
+
super._validate(_value, options, panic, (objectErrors, value) => {
|
|
43832
|
+
if (!recursive || !isObject(value)) {
|
|
43833
|
+
next(objectErrors, value);
|
|
43834
|
+
return;
|
|
43835
|
+
}
|
|
43836
|
+
originalValue = originalValue || value;
|
|
43837
|
+
let tests = [];
|
|
43838
|
+
for (let key of this._nodes) {
|
|
43839
|
+
let field = this.fields[key];
|
|
43840
|
+
if (!field || Reference.isRef(field)) {
|
|
43841
|
+
continue;
|
|
43842
|
+
}
|
|
43843
|
+
tests.push(
|
|
43844
|
+
field.asNestedTest({
|
|
43845
|
+
options,
|
|
43846
|
+
key,
|
|
43847
|
+
parent: value,
|
|
43848
|
+
parentPath: options.path,
|
|
43849
|
+
originalParent: originalValue
|
|
43850
|
+
})
|
|
43851
|
+
);
|
|
43852
|
+
}
|
|
43853
|
+
this.runTests(
|
|
43854
|
+
{
|
|
43855
|
+
tests,
|
|
43856
|
+
value,
|
|
43857
|
+
originalValue,
|
|
43858
|
+
options
|
|
43859
|
+
},
|
|
43860
|
+
panic,
|
|
43861
|
+
(fieldErrors) => {
|
|
43862
|
+
next(fieldErrors.sort(this._sortErrors).concat(objectErrors), value);
|
|
43863
|
+
}
|
|
43864
|
+
);
|
|
43865
|
+
});
|
|
43866
|
+
}
|
|
43867
|
+
clone(spec) {
|
|
43868
|
+
const next = super.clone(spec);
|
|
43869
|
+
next.fields = Object.assign({}, this.fields);
|
|
43870
|
+
next._nodes = this._nodes;
|
|
43871
|
+
next._excludedEdges = this._excludedEdges;
|
|
43872
|
+
next._sortErrors = this._sortErrors;
|
|
43873
|
+
return next;
|
|
43874
|
+
}
|
|
43875
|
+
concat(schema) {
|
|
43876
|
+
let next = super.concat(schema);
|
|
43877
|
+
let nextFields = next.fields;
|
|
43878
|
+
for (let [field, schemaOrRef] of Object.entries(this.fields)) {
|
|
43879
|
+
const target = nextFields[field];
|
|
43880
|
+
nextFields[field] = target === undefined ? schemaOrRef : target;
|
|
43881
|
+
}
|
|
43882
|
+
return next.withMutation((s) =>
|
|
43883
|
+
// XXX: excludes here is wrong
|
|
43884
|
+
s.setFields(nextFields, [...this._excludedEdges, ...schema._excludedEdges])
|
|
43885
|
+
);
|
|
43886
|
+
}
|
|
43887
|
+
_getDefault(options) {
|
|
43888
|
+
if ('default' in this.spec) {
|
|
43889
|
+
return super._getDefault(options);
|
|
43890
|
+
}
|
|
43891
|
+
|
|
43892
|
+
// if there is no default set invent one
|
|
43893
|
+
if (!this._nodes.length) {
|
|
43894
|
+
return undefined;
|
|
43895
|
+
}
|
|
43896
|
+
let dft = {};
|
|
43897
|
+
this._nodes.forEach((key) => {
|
|
43898
|
+
var _innerOptions;
|
|
43899
|
+
const field = this.fields[key];
|
|
43900
|
+
let innerOptions = options;
|
|
43901
|
+
if ((_innerOptions = innerOptions) != null && _innerOptions.value) {
|
|
43902
|
+
innerOptions = Object.assign({}, innerOptions, {
|
|
43903
|
+
parent: innerOptions.value,
|
|
43904
|
+
value: innerOptions.value[key]
|
|
43905
|
+
});
|
|
43906
|
+
}
|
|
43907
|
+
dft[key] = field && 'getDefault' in field ? field.getDefault(innerOptions) : undefined;
|
|
43908
|
+
});
|
|
43909
|
+
return dft;
|
|
43910
|
+
}
|
|
43911
|
+
setFields(shape, excludedEdges) {
|
|
43912
|
+
let next = this.clone();
|
|
43913
|
+
next.fields = shape;
|
|
43914
|
+
next._nodes = sortFields(shape, excludedEdges);
|
|
43915
|
+
next._sortErrors = sortByKeyOrder(Object.keys(shape));
|
|
43916
|
+
// XXX: this carries over edges which may not be what you want
|
|
43917
|
+
if (excludedEdges) next._excludedEdges = excludedEdges;
|
|
43918
|
+
return next;
|
|
43919
|
+
}
|
|
43920
|
+
shape(additions, excludes = []) {
|
|
43921
|
+
return this.clone().withMutation((next) => {
|
|
43922
|
+
let edges = next._excludedEdges;
|
|
43923
|
+
if (excludes.length) {
|
|
43924
|
+
if (!Array.isArray(excludes[0])) excludes = [excludes];
|
|
43925
|
+
edges = [...next._excludedEdges, ...excludes];
|
|
43926
|
+
}
|
|
43927
|
+
|
|
43928
|
+
// XXX: excludes here is wrong
|
|
43929
|
+
return next.setFields(Object.assign(next.fields, additions), edges);
|
|
43930
|
+
});
|
|
43931
|
+
}
|
|
43932
|
+
partial() {
|
|
43933
|
+
const partial = {};
|
|
43934
|
+
for (const [key, schema] of Object.entries(this.fields)) {
|
|
43935
|
+
partial[key] = 'optional' in schema && schema.optional instanceof Function ? schema.optional() : schema;
|
|
43936
|
+
}
|
|
43937
|
+
return this.setFields(partial);
|
|
43938
|
+
}
|
|
43939
|
+
deepPartial() {
|
|
43940
|
+
const next = deepPartial(this);
|
|
43941
|
+
return next;
|
|
43942
|
+
}
|
|
43943
|
+
pick(keys) {
|
|
43944
|
+
const picked = {};
|
|
43945
|
+
for (const key of keys) {
|
|
43946
|
+
if (this.fields[key]) picked[key] = this.fields[key];
|
|
43947
|
+
}
|
|
43948
|
+
return this.setFields(
|
|
43949
|
+
picked,
|
|
43950
|
+
this._excludedEdges.filter(([a, b]) => keys.includes(a) && keys.includes(b))
|
|
43951
|
+
);
|
|
43952
|
+
}
|
|
43953
|
+
omit(keys) {
|
|
43954
|
+
const remaining = [];
|
|
43955
|
+
for (const key of Object.keys(this.fields)) {
|
|
43956
|
+
if (keys.includes(key)) continue;
|
|
43957
|
+
remaining.push(key);
|
|
43958
|
+
}
|
|
43959
|
+
return this.pick(remaining);
|
|
43960
|
+
}
|
|
43961
|
+
from(from, to, alias) {
|
|
43962
|
+
let fromGetter = propertyExpr.getter(from, true);
|
|
43963
|
+
return this.transform((obj) => {
|
|
43964
|
+
if (!obj) return obj;
|
|
43965
|
+
let newObj = obj;
|
|
43966
|
+
if (deepHas(obj, from)) {
|
|
43967
|
+
newObj = Object.assign({}, obj);
|
|
43968
|
+
if (!alias) delete newObj[from];
|
|
43969
|
+
newObj[to] = fromGetter(obj);
|
|
43970
|
+
}
|
|
43971
|
+
return newObj;
|
|
43972
|
+
});
|
|
43973
|
+
}
|
|
43974
|
+
|
|
43975
|
+
/** Parse an input JSON string to an object */
|
|
43976
|
+
json() {
|
|
43977
|
+
return this.transform(parseJson);
|
|
43978
|
+
}
|
|
43979
|
+
|
|
43980
|
+
/**
|
|
43981
|
+
* Similar to `noUnknown` but only validates that an object is the right shape without stripping the unknown keys
|
|
43982
|
+
*/
|
|
43983
|
+
exact(message) {
|
|
43984
|
+
return this.test({
|
|
43985
|
+
name: 'exact',
|
|
43986
|
+
exclusive: true,
|
|
43987
|
+
message: message || object.exact,
|
|
43988
|
+
test(value) {
|
|
43989
|
+
if (value == null) return true;
|
|
43990
|
+
const unknownKeys = unknown(this.schema, value);
|
|
43991
|
+
return (
|
|
43992
|
+
unknownKeys.length === 0 ||
|
|
43993
|
+
this.createError({
|
|
43994
|
+
params: {
|
|
43995
|
+
properties: unknownKeys.join(', ')
|
|
43996
|
+
}
|
|
43997
|
+
})
|
|
43998
|
+
);
|
|
43999
|
+
}
|
|
44000
|
+
});
|
|
44001
|
+
}
|
|
44002
|
+
stripUnknown() {
|
|
44003
|
+
return this.clone({
|
|
44004
|
+
noUnknown: true
|
|
44005
|
+
});
|
|
44006
|
+
}
|
|
44007
|
+
noUnknown(noAllow = true, message = object.noUnknown) {
|
|
44008
|
+
if (typeof noAllow !== 'boolean') {
|
|
44009
|
+
message = noAllow;
|
|
44010
|
+
noAllow = true;
|
|
44011
|
+
}
|
|
44012
|
+
let next = this.test({
|
|
44013
|
+
name: 'noUnknown',
|
|
44014
|
+
exclusive: true,
|
|
44015
|
+
message: message,
|
|
44016
|
+
test(value) {
|
|
44017
|
+
if (value == null) return true;
|
|
44018
|
+
const unknownKeys = unknown(this.schema, value);
|
|
44019
|
+
return (
|
|
44020
|
+
!noAllow ||
|
|
44021
|
+
unknownKeys.length === 0 ||
|
|
44022
|
+
this.createError({
|
|
44023
|
+
params: {
|
|
44024
|
+
unknown: unknownKeys.join(', ')
|
|
44025
|
+
}
|
|
44026
|
+
})
|
|
44027
|
+
);
|
|
44028
|
+
}
|
|
44029
|
+
});
|
|
44030
|
+
next.spec.noUnknown = noAllow;
|
|
44031
|
+
return next;
|
|
44032
|
+
}
|
|
44033
|
+
unknown(allow = true, message = object.noUnknown) {
|
|
44034
|
+
return this.noUnknown(!allow, message);
|
|
44035
|
+
}
|
|
44036
|
+
transformKeys(fn) {
|
|
44037
|
+
return this.transform((obj) => {
|
|
44038
|
+
if (!obj) return obj;
|
|
44039
|
+
const result = {};
|
|
44040
|
+
for (const key of Object.keys(obj)) result[fn(key)] = obj[key];
|
|
44041
|
+
return result;
|
|
44042
|
+
});
|
|
44043
|
+
}
|
|
44044
|
+
camelCase() {
|
|
44045
|
+
return this.transformKeys(tinyCase.camelCase);
|
|
44046
|
+
}
|
|
44047
|
+
snakeCase() {
|
|
44048
|
+
return this.transformKeys(tinyCase.snakeCase);
|
|
44049
|
+
}
|
|
44050
|
+
constantCase() {
|
|
44051
|
+
return this.transformKeys((key) => tinyCase.snakeCase(key).toUpperCase());
|
|
44052
|
+
}
|
|
44053
|
+
describe(options) {
|
|
44054
|
+
const next = (options ? this.resolve(options) : this).clone();
|
|
44055
|
+
const base = super.describe(options);
|
|
44056
|
+
base.fields = {};
|
|
44057
|
+
for (const [key, value] of Object.entries(next.fields)) {
|
|
44058
|
+
var _innerOptions2;
|
|
44059
|
+
let innerOptions = options;
|
|
44060
|
+
if ((_innerOptions2 = innerOptions) != null && _innerOptions2.value) {
|
|
44061
|
+
innerOptions = Object.assign({}, innerOptions, {
|
|
44062
|
+
parent: innerOptions.value,
|
|
44063
|
+
value: innerOptions.value[key]
|
|
44064
|
+
});
|
|
44065
|
+
}
|
|
44066
|
+
base.fields[key] = value.describe(innerOptions);
|
|
44067
|
+
}
|
|
44068
|
+
return base;
|
|
44069
|
+
}
|
|
44070
|
+
}
|
|
44071
|
+
create$3.prototype = ObjectSchema.prototype;
|
|
44072
|
+
|
|
44073
|
+
class InvalidTokenError extends Error {}
|
|
44074
|
+
InvalidTokenError.prototype.name = 'InvalidTokenError';
|
|
44075
|
+
function b64DecodeUnicode(str) {
|
|
44076
|
+
return decodeURIComponent(
|
|
44077
|
+
atob(str).replace(/(.)/g, (m, p) => {
|
|
44078
|
+
let code = p.charCodeAt(0).toString(16).toUpperCase();
|
|
44079
|
+
if (code.length < 2) {
|
|
44080
|
+
code = '0' + code;
|
|
44081
|
+
}
|
|
44082
|
+
return '%' + code;
|
|
44083
|
+
})
|
|
44084
|
+
);
|
|
44085
|
+
}
|
|
44086
|
+
function base64UrlDecode(str) {
|
|
44087
|
+
let output = str.replace(/-/g, '+').replace(/_/g, '/');
|
|
44088
|
+
switch (output.length % 4) {
|
|
44089
|
+
case 0:
|
|
44090
|
+
break;
|
|
44091
|
+
case 2:
|
|
44092
|
+
output += '==';
|
|
44093
|
+
break;
|
|
44094
|
+
case 3:
|
|
44095
|
+
output += '=';
|
|
44096
|
+
break;
|
|
44097
|
+
default:
|
|
44098
|
+
throw new Error('base64 string is not of the correct length');
|
|
44099
|
+
}
|
|
44100
|
+
try {
|
|
44101
|
+
return b64DecodeUnicode(output);
|
|
44102
|
+
} catch (err) {
|
|
44103
|
+
return atob(output);
|
|
44104
|
+
}
|
|
44105
|
+
}
|
|
44106
|
+
function jwtDecode(token, options) {
|
|
44107
|
+
if (typeof token !== 'string') {
|
|
44108
|
+
throw new InvalidTokenError('Invalid token specified: must be a string');
|
|
44109
|
+
}
|
|
44110
|
+
options || (options = {});
|
|
44111
|
+
const pos = options.header === true ? 0 : 1;
|
|
44112
|
+
const part = token.split('.')[pos];
|
|
44113
|
+
if (typeof part !== 'string') {
|
|
44114
|
+
throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
|
|
44115
|
+
}
|
|
44116
|
+
let decoded;
|
|
44117
|
+
try {
|
|
44118
|
+
decoded = base64UrlDecode(part);
|
|
44119
|
+
} catch (e) {
|
|
44120
|
+
throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
|
|
44121
|
+
}
|
|
44122
|
+
try {
|
|
44123
|
+
return JSON.parse(decoded);
|
|
44124
|
+
} catch (e) {
|
|
44125
|
+
throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
|
|
44126
|
+
}
|
|
44127
|
+
}
|
|
44128
|
+
|
|
44129
|
+
var loginMember = function (username, password, tideClientConfig, portalId) {
|
|
44130
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44131
|
+
var memberLogingRequest, memberInfo;
|
|
44132
|
+
return __generator(this, function (_a) {
|
|
44133
|
+
switch (_a.label) {
|
|
44134
|
+
case 0:
|
|
44135
|
+
if (!tideClientConfig.host || !tideClientConfig.apiKey) {
|
|
44136
|
+
return [2 /*return*/, Promise.reject()];
|
|
44137
|
+
}
|
|
44138
|
+
memberLogingRequest = {
|
|
44139
|
+
username: username,
|
|
44140
|
+
password: password,
|
|
44141
|
+
portalId: portalId
|
|
44142
|
+
};
|
|
44143
|
+
return [4 /*yield*/, build.login(tideClientConfig, memberLogingRequest, undefined)];
|
|
44144
|
+
case 1:
|
|
44145
|
+
memberInfo = _a.sent();
|
|
44146
|
+
return [2 /*return*/, memberInfo];
|
|
44147
|
+
}
|
|
44148
|
+
});
|
|
44149
|
+
});
|
|
44150
|
+
};
|
|
44151
|
+
var confirmMember = function (token, password, hasAgreed, tideClientConfig) {
|
|
44152
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44153
|
+
var memberConfirmationRequest, response;
|
|
44154
|
+
return __generator(this, function (_a) {
|
|
44155
|
+
switch (_a.label) {
|
|
44156
|
+
case 0:
|
|
44157
|
+
if (!tideClientConfig.host || !tideClientConfig.apiKey) {
|
|
44158
|
+
return [2 /*return*/, Promise.reject()];
|
|
44159
|
+
}
|
|
44160
|
+
memberConfirmationRequest = {
|
|
44161
|
+
token: token,
|
|
44162
|
+
password: password,
|
|
44163
|
+
hasAgreed: hasAgreed
|
|
44164
|
+
};
|
|
44165
|
+
return [4 /*yield*/, build.confirm(tideClientConfig, memberConfirmationRequest, undefined)];
|
|
44166
|
+
case 1:
|
|
44167
|
+
response = _a.sent();
|
|
44168
|
+
return [2 /*return*/, response];
|
|
44169
|
+
}
|
|
44170
|
+
});
|
|
44171
|
+
});
|
|
44172
|
+
};
|
|
44173
|
+
var passwordForgotten = function (username, tideClientConfig, portalId) {
|
|
44174
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44175
|
+
var memberForgotPasswordRequest, response;
|
|
44176
|
+
return __generator(this, function (_a) {
|
|
44177
|
+
switch (_a.label) {
|
|
44178
|
+
case 0:
|
|
44179
|
+
if (!tideClientConfig.host || !tideClientConfig.apiKey) {
|
|
44180
|
+
return [2 /*return*/, Promise.reject()];
|
|
44181
|
+
}
|
|
44182
|
+
memberForgotPasswordRequest = {
|
|
44183
|
+
username: username,
|
|
44184
|
+
portalId: portalId
|
|
44185
|
+
};
|
|
44186
|
+
return [4 /*yield*/, build.forgotPassword(tideClientConfig, memberForgotPasswordRequest, undefined)];
|
|
44187
|
+
case 1:
|
|
44188
|
+
response = _a.sent();
|
|
44189
|
+
return [2 /*return*/, response.ok];
|
|
44190
|
+
}
|
|
44191
|
+
});
|
|
44192
|
+
});
|
|
44193
|
+
};
|
|
44194
|
+
var newPassword = function (token, password, tideClientConfig) {
|
|
44195
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44196
|
+
var memberResetPasswordRequest, response;
|
|
44197
|
+
return __generator(this, function (_a) {
|
|
44198
|
+
switch (_a.label) {
|
|
44199
|
+
case 0:
|
|
44200
|
+
if (!tideClientConfig.host || !tideClientConfig.apiKey) {
|
|
44201
|
+
return [2 /*return*/, Promise.reject()];
|
|
44202
|
+
}
|
|
44203
|
+
memberResetPasswordRequest = {
|
|
44204
|
+
token: token,
|
|
44205
|
+
password: password
|
|
44206
|
+
};
|
|
44207
|
+
return [4 /*yield*/, build.resetPassword(tideClientConfig, memberResetPasswordRequest, undefined)];
|
|
44208
|
+
case 1:
|
|
44209
|
+
response = _a.sent();
|
|
44210
|
+
return [2 /*return*/, response.ok];
|
|
44211
|
+
}
|
|
44212
|
+
});
|
|
44213
|
+
});
|
|
44214
|
+
};
|
|
44215
|
+
var decodeTokenToMemberInfo = function (token) {
|
|
44216
|
+
if (!token) {
|
|
44217
|
+
return undefined;
|
|
44218
|
+
}
|
|
44219
|
+
var decodedToken = jwtDecode(token);
|
|
44220
|
+
var member = undefined;
|
|
44221
|
+
// check if token is not expired
|
|
44222
|
+
if ((decodedToken === null || decodedToken === void 0 ? void 0 : decodedToken.exp) && decodedToken.exp * 1000 < new Date().getTime()) {
|
|
44223
|
+
return undefined;
|
|
44224
|
+
}
|
|
44225
|
+
if (decodedToken) {
|
|
44226
|
+
member = {
|
|
44227
|
+
id: decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid']
|
|
44228
|
+
? parseInt(decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid'])
|
|
44229
|
+
: 0,
|
|
44230
|
+
companyId: decodedToken.company ? parseInt(decodedToken.company) : 0,
|
|
44231
|
+
companyName: decodedToken.companyName,
|
|
44232
|
+
name: decodedToken.unique_name,
|
|
44233
|
+
email: decodedToken.email || decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'],
|
|
44234
|
+
language: decodedToken.language,
|
|
44235
|
+
agentId: decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid']
|
|
44236
|
+
? parseInt(decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid'])
|
|
44237
|
+
: 0,
|
|
44238
|
+
addressId: decodedToken.addressId ? parseInt(decodedToken.addressId) : undefined,
|
|
44239
|
+
addressName: decodedToken.addressName,
|
|
44240
|
+
addressLogo: decodedToken.addressLogo
|
|
44241
|
+
};
|
|
44242
|
+
}
|
|
44243
|
+
return member;
|
|
44244
|
+
};
|
|
44245
|
+
|
|
44246
|
+
var LoginComponent = function (_a) {
|
|
44247
|
+
var tideClientConfig = _a.tideClientConfig,
|
|
44248
|
+
portalId = _a.portalId,
|
|
44249
|
+
languageCode = _a.languageCode,
|
|
44250
|
+
member = _a.member,
|
|
44251
|
+
setMember = _a.setMember,
|
|
44252
|
+
handleBackToHome = _a.handleBackToHome;
|
|
44253
|
+
var _b = React.useState(false),
|
|
44254
|
+
isLoggedIn = _b[0],
|
|
44255
|
+
setIsLoggedIn = _b[1];
|
|
44256
|
+
var _c = React.useState(false),
|
|
44257
|
+
showPassword = _c[0];
|
|
44258
|
+
_c[1];
|
|
44259
|
+
var _d = React.useState(false),
|
|
44260
|
+
isForgotPassword = _d[0],
|
|
44261
|
+
setIsForgotPassword = _d[1];
|
|
44262
|
+
var _e = React.useState(false),
|
|
44263
|
+
newPasswordRequested = _e[0],
|
|
44264
|
+
setNewPasswordRequested = _e[1];
|
|
44265
|
+
var _f = React.useState(false),
|
|
44266
|
+
apiError = _f[0],
|
|
44267
|
+
setApiError = _f[1];
|
|
44268
|
+
var translations = getTranslations(languageCode !== null && languageCode !== void 0 ? languageCode : 'en-GB');
|
|
44269
|
+
var formik$1 = formik.useFormik({
|
|
44270
|
+
initialValues: {
|
|
44271
|
+
username: '',
|
|
44272
|
+
password: ''
|
|
44273
|
+
},
|
|
44274
|
+
validationSchema: create$3({
|
|
44275
|
+
username: create$6().email(translations.LOGIN.EMAIL_INVALID).required(translations.LOGIN.EMAIL_REQUIRED),
|
|
44276
|
+
password: create$6().required(translations.LOGIN.PASSWORD_REQUIRED)
|
|
44277
|
+
}),
|
|
44278
|
+
onSubmit: function (values) {
|
|
44279
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44280
|
+
var response, member_1;
|
|
44281
|
+
return __generator(this, function (_a) {
|
|
44282
|
+
switch (_a.label) {
|
|
44283
|
+
case 0:
|
|
44284
|
+
_a.trys.push([0, 2, , 3]);
|
|
44285
|
+
return [4 /*yield*/, loginMember(values.username, values.password, tideClientConfig, portalId)];
|
|
44286
|
+
case 1:
|
|
44287
|
+
response = _a.sent();
|
|
44288
|
+
member_1 = decodeTokenToMemberInfo(response.token);
|
|
44289
|
+
if (member_1 && member_1.id !== 0) {
|
|
44290
|
+
setMember(member_1);
|
|
44291
|
+
localStorage.setItem('token', response.token);
|
|
44292
|
+
setIsLoggedIn(true);
|
|
44293
|
+
}
|
|
44294
|
+
return [3 /*break*/, 3];
|
|
44295
|
+
case 2:
|
|
44296
|
+
_a.sent();
|
|
44297
|
+
setApiError(true);
|
|
44298
|
+
return [3 /*break*/, 3];
|
|
44299
|
+
case 3:
|
|
44300
|
+
return [2 /*return*/];
|
|
44301
|
+
}
|
|
44302
|
+
});
|
|
44303
|
+
});
|
|
44304
|
+
}
|
|
44305
|
+
});
|
|
44306
|
+
var handleForgotPasswordClick = function (e) {
|
|
44307
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44308
|
+
var errors;
|
|
44309
|
+
return __generator(this, function (_a) {
|
|
44310
|
+
switch (_a.label) {
|
|
44311
|
+
case 0:
|
|
44312
|
+
e.preventDefault();
|
|
44313
|
+
formik$1.setTouched({ username: true }, true);
|
|
44314
|
+
return [4 /*yield*/, formik$1.validateForm()];
|
|
44315
|
+
case 1:
|
|
44316
|
+
errors = _a.sent();
|
|
44317
|
+
if (!errors.username) {
|
|
44318
|
+
handleForgotPassword();
|
|
44319
|
+
}
|
|
44320
|
+
return [2 /*return*/];
|
|
44321
|
+
}
|
|
44322
|
+
});
|
|
44323
|
+
});
|
|
44324
|
+
};
|
|
44325
|
+
var handleForgotPassword = function () {
|
|
44326
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44327
|
+
var response;
|
|
44328
|
+
return __generator(this, function (_a) {
|
|
44329
|
+
switch (_a.label) {
|
|
44330
|
+
case 0:
|
|
44331
|
+
_a.trys.push([0, 2, , 3]);
|
|
44332
|
+
return [4 /*yield*/, passwordForgotten(formik$1.values.username, tideClientConfig, portalId)];
|
|
44333
|
+
case 1:
|
|
44334
|
+
response = _a.sent();
|
|
44335
|
+
if (response) {
|
|
44336
|
+
setNewPasswordRequested(true);
|
|
44337
|
+
}
|
|
44338
|
+
return [3 /*break*/, 3];
|
|
44339
|
+
case 2:
|
|
44340
|
+
_a.sent();
|
|
44341
|
+
setApiError(true);
|
|
44342
|
+
return [3 /*break*/, 3];
|
|
44343
|
+
case 3:
|
|
44344
|
+
return [2 /*return*/];
|
|
44345
|
+
}
|
|
44346
|
+
});
|
|
44347
|
+
});
|
|
44348
|
+
};
|
|
44349
|
+
return React__default['default'].createElement(
|
|
44350
|
+
React__default['default'].Fragment,
|
|
44351
|
+
null,
|
|
44352
|
+
!isLoggedIn &&
|
|
44353
|
+
!isForgotPassword &&
|
|
44354
|
+
React__default['default'].createElement(
|
|
44355
|
+
React__default['default'].Fragment,
|
|
44356
|
+
null,
|
|
44357
|
+
React__default['default'].createElement('h4', { className: 'login__card__title' }, translations.LOGIN.LOGIN_INTO),
|
|
44358
|
+
React__default['default'].createElement(
|
|
44359
|
+
'form',
|
|
44360
|
+
{ className: 'login__form', onSubmit: formik$1.handleSubmit, noValidate: true },
|
|
44361
|
+
React__default['default'].createElement(
|
|
44362
|
+
'div',
|
|
44363
|
+
{ className: 'login__form__group' },
|
|
44364
|
+
React__default['default'].createElement('label', { htmlFor: 'email' }, translations.LOGIN.EMAIL),
|
|
44365
|
+
React__default['default'].createElement(
|
|
44366
|
+
'input',
|
|
44367
|
+
__assign({ type: 'text', id: 'username', placeholder: translations.LOGIN.ENTER_YOUR_EMAIL }, formik$1.getFieldProps('username'))
|
|
44368
|
+
),
|
|
44369
|
+
formik$1.touched.username &&
|
|
44370
|
+
formik$1.errors.username &&
|
|
44371
|
+
React__default['default'].createElement('div', { id: 'username-error', className: 'login__error' }, formik$1.errors.username)
|
|
44372
|
+
),
|
|
44373
|
+
React__default['default'].createElement(
|
|
44374
|
+
'div',
|
|
44375
|
+
{ className: 'login__form__group' },
|
|
44376
|
+
React__default['default'].createElement('label', { htmlFor: 'password' }, translations.LOGIN.PASSWORD),
|
|
44377
|
+
React__default['default'].createElement(
|
|
44378
|
+
'input',
|
|
44379
|
+
__assign(
|
|
44380
|
+
{ type: showPassword ? 'text' : 'password', id: 'password', placeholder: translations.LOGIN.ENTER_YOUR_PASSWORD },
|
|
44381
|
+
formik$1.getFieldProps('password'),
|
|
44382
|
+
{ required: true }
|
|
44383
|
+
)
|
|
44384
|
+
),
|
|
44385
|
+
(formik$1.touched.password || formik$1.submitCount > 0) &&
|
|
44386
|
+
formik$1.errors.password &&
|
|
44387
|
+
React__default['default'].createElement(
|
|
44388
|
+
'div',
|
|
44389
|
+
{ id: 'password-error', className: 'login__error' },
|
|
44390
|
+
formik$1.values.password === '' ? translations.LOGIN.PASSWORD_REQUIRED : formik$1.errors.password
|
|
44391
|
+
)
|
|
44392
|
+
),
|
|
44393
|
+
!formik$1.errors.password &&
|
|
44394
|
+
apiError &&
|
|
44395
|
+
React__default['default'].createElement('div', { className: 'login__error' }, translations.LOGIN.INVALID_CREDENTIALS),
|
|
44396
|
+
React__default['default'].createElement('button', { type: 'submit', className: 'cta cta--primary' }, translations.LOGIN.LOGIN),
|
|
44397
|
+
React__default['default'].createElement(
|
|
44398
|
+
'button',
|
|
44399
|
+
{
|
|
44400
|
+
type: 'button',
|
|
44401
|
+
className: 'login__forgot',
|
|
44402
|
+
onClick: function () {
|
|
44403
|
+
formik$1.setFieldValue('password', '');
|
|
44404
|
+
formik$1.setFieldTouched('password', false, false);
|
|
44405
|
+
formik$1.setFieldError('password', undefined);
|
|
44406
|
+
setApiError(false);
|
|
44407
|
+
setIsForgotPassword(true);
|
|
44408
|
+
}
|
|
44409
|
+
},
|
|
44410
|
+
translations.LOGIN.FORGOT_PASSWORD
|
|
44411
|
+
)
|
|
44412
|
+
)
|
|
44413
|
+
),
|
|
44414
|
+
isLoggedIn &&
|
|
44415
|
+
member &&
|
|
44416
|
+
!isForgotPassword &&
|
|
44417
|
+
React__default['default'].createElement(
|
|
44418
|
+
'div',
|
|
44419
|
+
{ className: 'login__welcome' },
|
|
44420
|
+
React__default['default'].createElement(
|
|
44421
|
+
'h3',
|
|
44422
|
+
{ className: 'login__card__title' },
|
|
44423
|
+
translations.LOGIN.WELCOME_X,
|
|
44424
|
+
member === null || member === void 0 ? void 0 : member.name
|
|
44425
|
+
),
|
|
44426
|
+
React__default['default'].createElement('button', { className: 'cta cta--primary', onClick: handleBackToHome }, translations.LOGIN.BACK_TO_HOMEPAGE)
|
|
44427
|
+
),
|
|
44428
|
+
isForgotPassword &&
|
|
44429
|
+
!newPasswordRequested &&
|
|
44430
|
+
React__default['default'].createElement(
|
|
44431
|
+
React__default['default'].Fragment,
|
|
44432
|
+
null,
|
|
44433
|
+
React__default['default'].createElement('h4', { className: 'login__card__title' }, translations.LOGIN.FORGOT_PASSWORD),
|
|
44434
|
+
React__default['default'].createElement(
|
|
44435
|
+
'form',
|
|
44436
|
+
{ className: 'login__form', noValidate: true },
|
|
44437
|
+
React__default['default'].createElement(
|
|
44438
|
+
'div',
|
|
44439
|
+
{ className: 'login__form__group' },
|
|
44440
|
+
React__default['default'].createElement('label', { htmlFor: 'email' }, translations.LOGIN.EMAIL),
|
|
44441
|
+
React__default['default'].createElement(
|
|
44442
|
+
'input',
|
|
44443
|
+
__assign({ type: 'text', id: 'username', placeholder: translations.LOGIN.ENTER_YOUR_EMAIL }, formik$1.getFieldProps('username'), {
|
|
44444
|
+
required: true
|
|
44445
|
+
})
|
|
44446
|
+
),
|
|
44447
|
+
(((formik$1.submitCount > 0 || formik$1.touched.username) && formik$1.errors.username) || apiError) &&
|
|
44448
|
+
React__default['default'].createElement('div', { id: 'username-error', className: 'login__error' }, translations.LOGIN.EMAIL_REQUIRED)
|
|
44449
|
+
),
|
|
44450
|
+
React__default['default'].createElement(
|
|
44451
|
+
'button',
|
|
44452
|
+
{ className: 'cta cta--primary', onClick: handleForgotPasswordClick },
|
|
44453
|
+
translations.LOGIN.FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL
|
|
44454
|
+
)
|
|
44455
|
+
)
|
|
44456
|
+
),
|
|
44457
|
+
newPasswordRequested && React__default['default'].createElement('h4', { className: 'login__card__title' }, translations.LOGIN.RESET_REQUESTED)
|
|
44458
|
+
);
|
|
44459
|
+
};
|
|
44460
|
+
|
|
44461
|
+
var ResetPasswordComponent = function (_a) {
|
|
44462
|
+
var tideClientConfig = _a.tideClientConfig,
|
|
44463
|
+
languageCode = _a.languageCode,
|
|
44464
|
+
handleBackToLogin = _a.handleBackToLogin;
|
|
44465
|
+
var _b = React.useState(false),
|
|
44466
|
+
passwordSet = _b[0],
|
|
44467
|
+
setPasswordSet = _b[1];
|
|
44468
|
+
var _c = React.useState({
|
|
44469
|
+
password: false,
|
|
44470
|
+
repeatPassword: false
|
|
44471
|
+
}),
|
|
44472
|
+
touched = _c[0],
|
|
44473
|
+
setTouched = _c[1];
|
|
44474
|
+
var _d = React.useState({
|
|
44475
|
+
password: '',
|
|
44476
|
+
repeatPassword: ''
|
|
44477
|
+
}),
|
|
44478
|
+
formValues = _d[0],
|
|
44479
|
+
setFormValues = _d[1];
|
|
44480
|
+
var _e = React.useState(false),
|
|
44481
|
+
submitted = _e[0],
|
|
44482
|
+
setSubmitted = _e[1];
|
|
44483
|
+
var _f = React.useState({}),
|
|
44484
|
+
errors = _f[0],
|
|
44485
|
+
setErrors = _f[1];
|
|
44486
|
+
var _g = React.useState(null),
|
|
44487
|
+
token = _g[0],
|
|
44488
|
+
setToken = _g[1];
|
|
44489
|
+
var _h = React.useState(false),
|
|
44490
|
+
invalidToken = _h[0],
|
|
44491
|
+
setInvalidToken = _h[1];
|
|
44492
|
+
var translations = getTranslations(languageCode !== null && languageCode !== void 0 ? languageCode : 'en-GB');
|
|
44493
|
+
React.useEffect(function () {
|
|
44494
|
+
if (typeof window !== 'undefined') {
|
|
44495
|
+
var rawToken = new URLSearchParams(window.location.search).get('token');
|
|
44496
|
+
setToken(rawToken);
|
|
44497
|
+
if (rawToken) {
|
|
44498
|
+
try {
|
|
44499
|
+
var decoded = jwtDecode(rawToken);
|
|
44500
|
+
if (!decoded.exp || decoded.exp * 1000 < Date.now()) {
|
|
44501
|
+
setInvalidToken(true);
|
|
44502
|
+
}
|
|
44503
|
+
} catch (e) {
|
|
44504
|
+
setInvalidToken(true);
|
|
44505
|
+
}
|
|
44506
|
+
} else {
|
|
44507
|
+
setInvalidToken(true);
|
|
44508
|
+
}
|
|
44509
|
+
}
|
|
44510
|
+
}, []);
|
|
44511
|
+
var handleBlur = function (event) {
|
|
44512
|
+
setTouched(function (prev) {
|
|
44513
|
+
var _a;
|
|
44514
|
+
return __assign(__assign({}, prev), ((_a = {}), (_a[event.target.name] = true), _a));
|
|
44515
|
+
});
|
|
44516
|
+
validate();
|
|
44517
|
+
};
|
|
44518
|
+
var onChange = function (event) {
|
|
44519
|
+
var _a;
|
|
44520
|
+
setFormValues(__assign(__assign({}, formValues), ((_a = {}), (_a[event.target.name] = event.target.value), _a)));
|
|
44521
|
+
validate();
|
|
44522
|
+
};
|
|
44523
|
+
var validate = function () {
|
|
44524
|
+
var validationErrors = {};
|
|
44525
|
+
var password = formValues.password,
|
|
44526
|
+
repeatPassword = formValues.repeatPassword;
|
|
44527
|
+
// Validate password
|
|
44528
|
+
if (!password) {
|
|
44529
|
+
validationErrors.password = 'required';
|
|
44530
|
+
} else if (touched.password || submitted) {
|
|
44531
|
+
var hasNumber = /\d/.test(password);
|
|
44532
|
+
var hasCapital = /[A-Z]/.test(password);
|
|
44533
|
+
if (!hasNumber || !hasCapital) {
|
|
44534
|
+
validationErrors.passwordComplexity = 'invalid';
|
|
44535
|
+
}
|
|
44536
|
+
}
|
|
44537
|
+
// Validate repeat password
|
|
44538
|
+
if (!repeatPassword) {
|
|
44539
|
+
validationErrors.repeatPassword = 'required';
|
|
44540
|
+
} else if ((touched.repeatPassword || submitted) && password && repeatPassword !== password) {
|
|
44541
|
+
validationErrors.matchPassword = 'mismatch';
|
|
44542
|
+
}
|
|
44543
|
+
setErrors(validationErrors);
|
|
44544
|
+
return Object.keys(validationErrors).length === 0;
|
|
44545
|
+
};
|
|
44546
|
+
var handleResetPassword = function (e) {
|
|
44547
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44548
|
+
var isValid, response;
|
|
44549
|
+
return __generator(this, function (_b) {
|
|
44550
|
+
switch (_b.label) {
|
|
44551
|
+
case 0:
|
|
44552
|
+
e.preventDefault();
|
|
44553
|
+
setSubmitted(true);
|
|
44554
|
+
setTouched({ password: true, repeatPassword: true });
|
|
44555
|
+
isValid = validate();
|
|
44556
|
+
if (!isValid) return [2 /*return*/];
|
|
44557
|
+
if (!token) return [3 /*break*/, 4];
|
|
44558
|
+
_b.label = 1;
|
|
44559
|
+
case 1:
|
|
44560
|
+
_b.trys.push([1, 3, , 4]);
|
|
44561
|
+
return [4 /*yield*/, newPassword(token, formValues.password, tideClientConfig)];
|
|
44562
|
+
case 2:
|
|
44563
|
+
response = _b.sent();
|
|
44564
|
+
if (response) {
|
|
44565
|
+
setPasswordSet(true);
|
|
44566
|
+
}
|
|
44567
|
+
return [3 /*break*/, 4];
|
|
44568
|
+
case 3:
|
|
44569
|
+
_b.sent();
|
|
44570
|
+
setErrors(function (prevErrors) {
|
|
44571
|
+
return __assign(__assign({}, prevErrors), { api: true });
|
|
44572
|
+
});
|
|
44573
|
+
setInvalidToken(true);
|
|
44574
|
+
return [3 /*break*/, 4];
|
|
44575
|
+
case 4:
|
|
44576
|
+
return [2 /*return*/];
|
|
44577
|
+
}
|
|
44578
|
+
});
|
|
44579
|
+
});
|
|
44580
|
+
};
|
|
44581
|
+
React.useEffect(
|
|
44582
|
+
function () {
|
|
44583
|
+
validate();
|
|
44584
|
+
},
|
|
44585
|
+
[formValues, token]
|
|
44586
|
+
);
|
|
44587
|
+
return React__default['default'].createElement(
|
|
44588
|
+
React__default['default'].Fragment,
|
|
44589
|
+
null,
|
|
44590
|
+
!passwordSet &&
|
|
44591
|
+
!invalidToken &&
|
|
44592
|
+
React__default['default'].createElement(
|
|
44593
|
+
React__default['default'].Fragment,
|
|
44594
|
+
null,
|
|
44595
|
+
React__default['default'].createElement('h4', { className: 'login__card__title' }, translations.LOGIN.RESET_PASSWORD_TITLE),
|
|
44596
|
+
React__default['default'].createElement(
|
|
44597
|
+
'form',
|
|
44598
|
+
{
|
|
44599
|
+
className: 'login__form',
|
|
44600
|
+
onSubmit: function (e) {
|
|
44601
|
+
return e.preventDefault();
|
|
44602
|
+
},
|
|
44603
|
+
noValidate: true
|
|
44604
|
+
},
|
|
44605
|
+
React__default['default'].createElement(
|
|
44606
|
+
'div',
|
|
44607
|
+
{ className: 'login__form__group' },
|
|
44608
|
+
React__default['default'].createElement('label', { htmlFor: 'password' }, translations.LOGIN.RESET_PASSWORD_LABEL),
|
|
44609
|
+
React__default['default'].createElement('input', {
|
|
44610
|
+
type: 'password',
|
|
44611
|
+
id: 'password',
|
|
44612
|
+
name: 'password',
|
|
44613
|
+
value: formValues.password,
|
|
44614
|
+
onChange: onChange,
|
|
44615
|
+
onBlur: handleBlur,
|
|
44616
|
+
required: true
|
|
44617
|
+
}),
|
|
44618
|
+
(touched.password || submitted) &&
|
|
44619
|
+
(errors.password || errors.passwordComplexity) &&
|
|
44620
|
+
React__default['default'].createElement(
|
|
44621
|
+
'div',
|
|
44622
|
+
{ id: 'username-error', className: 'login__error' },
|
|
44623
|
+
errors.password === 'required' && translations.LOGIN.PASSWORD_REQUIRED,
|
|
44624
|
+
errors.passwordComplexity === 'invalid' && translations.LOGIN.PASSWORD_COMPLEXITY
|
|
44625
|
+
)
|
|
44626
|
+
),
|
|
44627
|
+
React__default['default'].createElement(
|
|
44628
|
+
'div',
|
|
44629
|
+
{ className: 'login__form__group' },
|
|
44630
|
+
React__default['default'].createElement('label', { htmlFor: 'repeatPassword' }, translations.LOGIN.RESET_REPEAT_PASSWORD_LABEL),
|
|
44631
|
+
React__default['default'].createElement('input', {
|
|
44632
|
+
type: 'password',
|
|
44633
|
+
id: 'repeatPassword',
|
|
44634
|
+
name: 'repeatPassword',
|
|
44635
|
+
value: formValues.repeatPassword,
|
|
44636
|
+
onChange: onChange,
|
|
44637
|
+
onBlur: handleBlur,
|
|
44638
|
+
required: true
|
|
44639
|
+
}),
|
|
44640
|
+
(touched.repeatPassword || submitted) &&
|
|
44641
|
+
(errors.repeatPassword || errors.matchPassword) &&
|
|
44642
|
+
React__default['default'].createElement(
|
|
44643
|
+
'div',
|
|
44644
|
+
{ id: 'username-error', className: 'login__error' },
|
|
44645
|
+
errors.repeatPassword === 'required' && translations.LOGIN.REPEAT_PASSWORD_REQUIRED,
|
|
44646
|
+
errors.matchPassword === 'mismatch' && translations.LOGIN.PASSWORDS_DO_NOT_MATCH
|
|
44647
|
+
)
|
|
44648
|
+
),
|
|
44649
|
+
React__default['default'].createElement(
|
|
44650
|
+
'button',
|
|
44651
|
+
{ type: 'button', className: 'cta cta--primary', onClick: handleResetPassword },
|
|
44652
|
+
translations.LOGIN.RESET_PASSWORD_SUBMIT_LABEL
|
|
44653
|
+
)
|
|
44654
|
+
)
|
|
44655
|
+
),
|
|
44656
|
+
passwordSet &&
|
|
44657
|
+
React__default['default'].createElement(
|
|
44658
|
+
'div',
|
|
44659
|
+
{ className: 'login__welcome' },
|
|
44660
|
+
React__default['default'].createElement('h3', { className: 'login__card__title' }, translations.LOGIN.RESET_PASSWORD_TITLE),
|
|
44661
|
+
React__default['default'].createElement('p', null, translations.LOGIN.RESET_PASSWORD_SUCCESSFUL_MESSAGE),
|
|
44662
|
+
React__default['default'].createElement('button', { className: 'cta cta--primary', onClick: handleBackToLogin }, translations.LOGIN.BACK_TO_LOGIN)
|
|
44663
|
+
),
|
|
44664
|
+
invalidToken &&
|
|
44665
|
+
React__default['default'].createElement(
|
|
44666
|
+
'div',
|
|
44667
|
+
{ className: 'login__welcome' },
|
|
44668
|
+
React__default['default'].createElement('h3', { className: 'login__card__title' }, translations.LOGIN.RESET_PASSWORD_INVALID_TOKEN_TITLE),
|
|
44669
|
+
React__default['default'].createElement('p', null, translations.LOGIN.RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION),
|
|
44670
|
+
React__default['default'].createElement('button', { className: 'cta cta--primary', onClick: handleBackToLogin }, translations.LOGIN.BACK_TO_LOGIN)
|
|
44671
|
+
)
|
|
44672
|
+
);
|
|
44673
|
+
};
|
|
44674
|
+
|
|
44675
|
+
var ConfirmComponent = function (_a) {
|
|
44676
|
+
var tideClientConfig = _a.tideClientConfig,
|
|
44677
|
+
languageCode = _a.languageCode,
|
|
44678
|
+
handleBackToLogin = _a.handleBackToLogin;
|
|
44679
|
+
var _b = React.useState(false),
|
|
44680
|
+
isConfirmed = _b[0],
|
|
44681
|
+
setIsConfirmed = _b[1];
|
|
44682
|
+
var _c = React.useState(),
|
|
44683
|
+
touched = _c[0],
|
|
44684
|
+
setTouched = _c[1];
|
|
44685
|
+
var _d = React.useState({
|
|
44686
|
+
password: '',
|
|
44687
|
+
repeatPassword: ''
|
|
44688
|
+
}),
|
|
44689
|
+
formValues = _d[0],
|
|
44690
|
+
setFormValues = _d[1];
|
|
44691
|
+
var _e = React.useState({}),
|
|
44692
|
+
errors = _e[0],
|
|
44693
|
+
setErrors = _e[1];
|
|
44694
|
+
var _f = React.useState(null),
|
|
44695
|
+
token = _f[0],
|
|
44696
|
+
setToken = _f[1];
|
|
44697
|
+
var translations = getTranslations(languageCode !== null && languageCode !== void 0 ? languageCode : 'en-GB');
|
|
44698
|
+
React.useEffect(function () {
|
|
44699
|
+
if (typeof window !== 'undefined') {
|
|
44700
|
+
setToken(new URLSearchParams(window.location.search).get('token'));
|
|
44701
|
+
}
|
|
44702
|
+
}, []);
|
|
44703
|
+
var handleBlur = function (event) {
|
|
44704
|
+
var _a;
|
|
44705
|
+
if (!touched) {
|
|
44706
|
+
setTouched({ password: false, repeatPassword: false });
|
|
44707
|
+
}
|
|
44708
|
+
setTouched(__assign(__assign({}, touched), ((_a = {}), (_a[event.target.name] = true), _a)));
|
|
44709
|
+
validate();
|
|
44710
|
+
};
|
|
44711
|
+
var onChange = function (event) {
|
|
44712
|
+
var _a;
|
|
44713
|
+
setFormValues(__assign(__assign({}, formValues), ((_a = {}), (_a[event.target.name] = event.target.value), _a)));
|
|
44714
|
+
validate();
|
|
44715
|
+
};
|
|
44716
|
+
var validate = function () {
|
|
44717
|
+
var validationErrors = {};
|
|
44718
|
+
if (formValues) {
|
|
44719
|
+
if (!formValues.password || formValues.password.length === 0) {
|
|
44720
|
+
validationErrors.password = true;
|
|
44721
|
+
}
|
|
44722
|
+
if (!formValues.repeatPassword || formValues.repeatPassword.length === 0) {
|
|
44723
|
+
validationErrors.repeatPassword = true;
|
|
44724
|
+
} else if (formValues.password !== formValues.repeatPassword) {
|
|
44725
|
+
validationErrors.passwordMatch = true;
|
|
44726
|
+
}
|
|
44727
|
+
if (!token || token.length === 0) {
|
|
44728
|
+
validationErrors.token = true;
|
|
44729
|
+
}
|
|
44730
|
+
}
|
|
44731
|
+
setErrors(validationErrors);
|
|
44732
|
+
return Object.keys(validationErrors).length === 0;
|
|
44733
|
+
};
|
|
44734
|
+
var handleConfirmation = function () {
|
|
44735
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
44736
|
+
var isValid, response;
|
|
44737
|
+
return __generator(this, function (_b) {
|
|
44738
|
+
switch (_b.label) {
|
|
44739
|
+
case 0:
|
|
44740
|
+
setTouched({ password: true, repeatPassword: true });
|
|
44741
|
+
isValid = validate();
|
|
44742
|
+
if (!isValid) return [2 /*return*/];
|
|
44743
|
+
if (!token) return [3 /*break*/, 4];
|
|
44744
|
+
_b.label = 1;
|
|
44745
|
+
case 1:
|
|
44746
|
+
_b.trys.push([1, 3, , 4]);
|
|
44747
|
+
return [4 /*yield*/, confirmMember(token, formValues.password, true, tideClientConfig)];
|
|
44748
|
+
case 2:
|
|
44749
|
+
response = _b.sent();
|
|
44750
|
+
if (response.ok) {
|
|
44751
|
+
setIsConfirmed(true);
|
|
44752
|
+
}
|
|
44753
|
+
return [3 /*break*/, 4];
|
|
44754
|
+
case 3:
|
|
44755
|
+
_b.sent();
|
|
44756
|
+
return [3 /*break*/, 4];
|
|
44757
|
+
case 4:
|
|
44758
|
+
return [2 /*return*/];
|
|
44759
|
+
}
|
|
44760
|
+
});
|
|
44761
|
+
});
|
|
44762
|
+
};
|
|
44763
|
+
React.useEffect(
|
|
44764
|
+
function () {
|
|
44765
|
+
validate();
|
|
44766
|
+
},
|
|
44767
|
+
[formValues, token]
|
|
44768
|
+
);
|
|
44769
|
+
return React__default['default'].createElement(
|
|
44770
|
+
React__default['default'].Fragment,
|
|
44771
|
+
null,
|
|
44772
|
+
!isConfirmed &&
|
|
44773
|
+
React__default['default'].createElement(
|
|
44774
|
+
React__default['default'].Fragment,
|
|
44775
|
+
null,
|
|
44776
|
+
React__default['default'].createElement('h4', { className: 'login__card__title' }, translations.LOGIN.RESET_PASSWORD_TITLE),
|
|
44777
|
+
React__default['default'].createElement(
|
|
44778
|
+
'form',
|
|
44779
|
+
{
|
|
44780
|
+
className: 'login__form',
|
|
44781
|
+
onSubmit: function (e) {
|
|
44782
|
+
return e.preventDefault();
|
|
44783
|
+
},
|
|
44784
|
+
noValidate: true
|
|
44785
|
+
},
|
|
44786
|
+
React__default['default'].createElement(
|
|
44787
|
+
'div',
|
|
44788
|
+
{ className: 'login__form__group' },
|
|
44789
|
+
React__default['default'].createElement('label', { htmlFor: 'password' }, translations.LOGIN.RESET_PASSWORD_LABEL),
|
|
44790
|
+
React__default['default'].createElement('input', {
|
|
44791
|
+
type: 'password',
|
|
44792
|
+
id: 'password',
|
|
44793
|
+
name: 'password',
|
|
44794
|
+
value: formValues.password,
|
|
44795
|
+
onChange: onChange,
|
|
44796
|
+
onBlur: handleBlur,
|
|
44797
|
+
required: true
|
|
44798
|
+
}),
|
|
44799
|
+
((touched === null || touched === void 0 ? void 0 : touched.password) ||
|
|
44800
|
+
(touched === null || touched === void 0 ? void 0 : touched.repeatPassword)) &&
|
|
44801
|
+
errors.password &&
|
|
44802
|
+
React__default['default'].createElement('div', { id: 'username-error', className: 'login__error' }, translations.LOGIN.PASSWORD_REQUIRED)
|
|
44803
|
+
),
|
|
44804
|
+
React__default['default'].createElement(
|
|
44805
|
+
'div',
|
|
44806
|
+
{ className: 'login__form__group' },
|
|
44807
|
+
React__default['default'].createElement('label', { htmlFor: 'repeatPassword' }, translations.LOGIN.RESET_REPEAT_PASSWORD_LABEL),
|
|
44808
|
+
React__default['default'].createElement('input', {
|
|
44809
|
+
type: 'password',
|
|
44810
|
+
id: 'repeatPassword',
|
|
44811
|
+
name: 'repeatPassword',
|
|
44812
|
+
value: formValues.repeatPassword,
|
|
44813
|
+
onChange: onChange,
|
|
44814
|
+
onBlur: handleBlur,
|
|
44815
|
+
required: true
|
|
44816
|
+
}),
|
|
44817
|
+
((touched === null || touched === void 0 ? void 0 : touched.repeatPassword) ||
|
|
44818
|
+
(touched === null || touched === void 0 ? void 0 : touched.password)) &&
|
|
44819
|
+
(errors.repeatPassword || errors.passwordMatch) &&
|
|
44820
|
+
React__default['default'].createElement(
|
|
44821
|
+
'div',
|
|
44822
|
+
{ id: 'username-error', className: 'login__error' },
|
|
44823
|
+
errors.repeatPassword === 'required' && translations.LOGIN.REPEAT_PASSWORD_REQUIRED,
|
|
44824
|
+
errors.passwordMatch === 'mismatch' && translations.LOGIN.PASSWORDS_DO_NOT_MATCH
|
|
44825
|
+
)
|
|
44826
|
+
),
|
|
44827
|
+
React__default['default'].createElement(
|
|
44828
|
+
'button',
|
|
44829
|
+
{ type: 'button', className: 'cta cta--primary', onClick: handleConfirmation },
|
|
44830
|
+
translations.LOGIN.RESET_PASSWORD_SUBMIT_LABEL
|
|
44831
|
+
)
|
|
44832
|
+
)
|
|
44833
|
+
),
|
|
44834
|
+
isConfirmed &&
|
|
44835
|
+
React__default['default'].createElement(
|
|
44836
|
+
'div',
|
|
44837
|
+
{ className: 'login__welcome' },
|
|
44838
|
+
React__default['default'].createElement('h3', { className: 'login__card__title' }, translations.LOGIN.RECEIVED_REQUEST),
|
|
44839
|
+
React__default['default'].createElement('p', null, translations.LOGIN.ACCOUNT_ACTIVATED_LOGIN),
|
|
44840
|
+
React__default['default'].createElement('button', { className: 'cta cta--primary', onClick: handleBackToLogin }, translations.LOGIN.BACK_TO_LOGIN)
|
|
44841
|
+
)
|
|
44842
|
+
);
|
|
44843
|
+
};
|
|
44844
|
+
|
|
44845
|
+
var Login = function (_a) {
|
|
44846
|
+
var tideClientConfig = _a.tideClientConfig,
|
|
44847
|
+
portalId = _a.portalId,
|
|
44848
|
+
languageCode = _a.languageCode,
|
|
44849
|
+
imageSrc = _a.imageSrc,
|
|
44850
|
+
logo = _a.logo,
|
|
44851
|
+
isMemberConfirmation = _a.isMemberConfirmation,
|
|
44852
|
+
isLoginPage = _a.isLoginPage,
|
|
44853
|
+
isResetPassword = _a.isResetPassword,
|
|
44854
|
+
member = _a.member,
|
|
44855
|
+
setMember = _a.setMember,
|
|
44856
|
+
handleBackToHome = _a.handleBackToHome,
|
|
44857
|
+
handleBackToLogin = _a.handleBackToLogin;
|
|
44858
|
+
return React__default['default'].createElement(
|
|
44859
|
+
'div',
|
|
44860
|
+
{ className: 'login' },
|
|
44861
|
+
React__default['default'].createElement(
|
|
44862
|
+
'div',
|
|
44863
|
+
{ className: 'login__img__wrapper' },
|
|
44864
|
+
React__default['default'].createElement('img', {
|
|
44865
|
+
className: 'login__img',
|
|
44866
|
+
src: imageSrc ? imageSrc : 'https://cdn.pixabay.com/photo/2022/04/08/06/36/rock-7118843_1280.jpg',
|
|
44867
|
+
alt: 'Login'
|
|
44868
|
+
})
|
|
44869
|
+
),
|
|
44870
|
+
React__default['default'].createElement(
|
|
44871
|
+
'div',
|
|
44872
|
+
{ className: 'login__container' },
|
|
44873
|
+
React__default['default'].createElement(
|
|
44874
|
+
'div',
|
|
44875
|
+
{ className: 'login__card' },
|
|
44876
|
+
logo && React__default['default'].createElement('div', { className: 'login__logo' }, logo),
|
|
44877
|
+
isLoginPage &&
|
|
44878
|
+
React__default['default'].createElement(LoginComponent, {
|
|
44879
|
+
tideClientConfig: tideClientConfig,
|
|
44880
|
+
portalId: portalId,
|
|
44881
|
+
languageCode: languageCode,
|
|
44882
|
+
member: member,
|
|
44883
|
+
setMember: setMember,
|
|
44884
|
+
handleBackToHome: handleBackToHome,
|
|
44885
|
+
handleBackToLogin: handleBackToLogin
|
|
44886
|
+
}),
|
|
44887
|
+
isResetPassword &&
|
|
44888
|
+
React__default['default'].createElement(ResetPasswordComponent, {
|
|
44889
|
+
tideClientConfig: tideClientConfig,
|
|
44890
|
+
portalId: portalId,
|
|
44891
|
+
languageCode: languageCode,
|
|
44892
|
+
member: member,
|
|
44893
|
+
setMember: setMember,
|
|
44894
|
+
handleBackToHome: handleBackToHome,
|
|
44895
|
+
handleBackToLogin: handleBackToLogin
|
|
44896
|
+
}),
|
|
44897
|
+
isMemberConfirmation &&
|
|
44898
|
+
React__default['default'].createElement(ConfirmComponent, {
|
|
44899
|
+
tideClientConfig: tideClientConfig,
|
|
44900
|
+
portalId: portalId,
|
|
44901
|
+
languageCode: languageCode,
|
|
44902
|
+
member: member,
|
|
44903
|
+
setMember: setMember,
|
|
44904
|
+
handleBackToHome: handleBackToHome,
|
|
44905
|
+
handleBackToLogin: handleBackToLogin
|
|
44906
|
+
})
|
|
44907
|
+
)
|
|
44908
|
+
)
|
|
44909
|
+
);
|
|
44910
|
+
};
|
|
44911
|
+
|
|
41206
44912
|
var signalR$1 = {};
|
|
41207
44913
|
|
|
41208
44914
|
var jqueryDeferred$1 = { exports: {} };
|
|
@@ -45102,6 +48808,7 @@ exports.BookingWizard = BookingWizard;
|
|
|
45102
48808
|
exports.Footer = Footer;
|
|
45103
48809
|
exports.Header = Header;
|
|
45104
48810
|
exports.ImageCardGrid = ImageCardGrid;
|
|
48811
|
+
exports.Login = Login;
|
|
45105
48812
|
exports.Navbar = Navbar;
|
|
45106
48813
|
exports.QSM = QSM;
|
|
45107
48814
|
exports.SearchResults = SearchResults;
|