@nanas-home/hub-common 0.60.1336 → 0.61.1375

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.
@@ -268,6 +268,7 @@ var apiRoute = {
268
268
  assignHost: `/assign-host/${apiRouteParam.bookingUuid}/${apiRouteParam.userUuid}`,
269
269
  removeHost: `/remove-host/${apiRouteParam.bookingUuid}/${apiRouteParam.bookingHostUuid}`,
270
270
  calendarOverview: "/calendar-overview",
271
+ manualCreate: "/manual",
271
272
  swagger: { name: "Bookings", description: "Endpoints for managing bookings" }
272
273
  },
273
274
  bugReport: {
@@ -364,6 +365,7 @@ var apiRoute = {
364
365
  create: "",
365
366
  update: "",
366
367
  delete: `/${apiRouteParam.bookingUuid}`,
368
+ pricePrediction: "/price",
367
369
  swagger: { name: "Bookings", description: "Endpoints for User to manage their Bookings" }
368
370
  },
369
371
  bookingAddon: {
@@ -450,6 +452,7 @@ var ActivityType = /* @__PURE__ */ ((ActivityType2) => {
450
452
  ActivityType2[ActivityType2["Read"] = 2] = "Read";
451
453
  ActivityType2[ActivityType2["Update"] = 3] = "Update";
452
454
  ActivityType2[ActivityType2["Delete"] = 4] = "Delete";
455
+ ActivityType2[ActivityType2["System"] = 5] = "System";
453
456
  return ActivityType2;
454
457
  })(ActivityType || {});
455
458
 
@@ -903,6 +906,15 @@ var UuidRestriction = {
903
906
  minLength: 36,
904
907
  maxLength: 36
905
908
  };
909
+ var CaptchaTokenRestriction = {
910
+ minLength: 10,
911
+ maxLength: 2048
912
+ };
913
+ var DateObjectRestriction = {
914
+ day: { min: 0, max: 31 },
915
+ month: { min: 0, max: 12 },
916
+ year: { min: 2e3, max: 2050 }
917
+ };
906
918
 
907
919
  // src/contracts/generated/restrictions/drivingRouteRestriction.ts
908
920
  var DrivingRouteRestriction = {
@@ -1007,9 +1019,21 @@ var searchColumns = {
1007
1019
  upload: [{ "property": "linkUuid", "type": 2 }, { "property": "linkType", "type": 2 }, { "property": "type", "type": 2 }, { "property": "fileName", "type": 2 }, { "property": "blobType", "type": 2 }, { "property": "sizeInKb", "type": 2 }, { "property": "dateCreated", "type": 5 }],
1008
1020
  booking: [{ "property": "code", "type": 3 }, { "property": "startDate", "type": 5 }, { "property": "endDate", "type": 5 }, { "property": "status", "type": 1 }, { "property": "dateCreated", "type": 5 }, { "property": "notes", "type": 2 }],
1009
1021
  bugReport: [{ "property": "status", "type": 0 }, { "property": "comment", "type": 2 }, { "property": "metadata", "type": 2 }, { "property": "logs", "type": 2 }, { "property": "dateCreated", "type": 5 }],
1010
- question: [{ "property": "forTypes", "type": 1 }, { "property": "transKey", "type": 2 }, { "property": "fallback", "type": 2 }, { "property": "category", "type": 2 }, { "property": "type", "type": 0 }, { "property": "sortOrder", "type": 3 }, { "property": "visible", "type": 4 }, { "property": "notes", "type": 2 }]
1022
+ question: [{ "property": "forTypes", "type": 1 }, { "property": "transKey", "type": 2 }, { "property": "fallback", "type": 2 }, { "property": "category", "type": 2 }, { "property": "type", "type": 0 }, { "property": "sortOrder", "type": 3 }, { "property": "visible", "type": 4 }, { "property": "notes", "type": 2 }],
1023
+ tempLink: [{ "property": "linkType", "type": 1 }, { "property": "dateCreated", "type": 5 }, { "property": "dateModified", "type": 5 }]
1011
1024
  };
1012
1025
 
1026
+ // src/contracts/register.ts
1027
+ var ClientRegisterStep = /* @__PURE__ */ ((ClientRegisterStep2) => {
1028
+ ClientRegisterStep2[ClientRegisterStep2["User"] = 0] = "User";
1029
+ ClientRegisterStep2[ClientRegisterStep2["Address"] = 1] = "Address";
1030
+ ClientRegisterStep2[ClientRegisterStep2["Pets"] = 2] = "Pets";
1031
+ ClientRegisterStep2[ClientRegisterStep2["Questions"] = 3] = "Questions";
1032
+ ClientRegisterStep2[ClientRegisterStep2["TermsConditions"] = 4] = "TermsConditions";
1033
+ ClientRegisterStep2[ClientRegisterStep2["Finish"] = 5] = "Finish";
1034
+ return ClientRegisterStep2;
1035
+ })(ClientRegisterStep || {});
1036
+
1013
1037
  // src/helpers/arrayHelper.ts
1014
1038
  var makeArrayOrDefault = (propsVal, defaultValue = []) => {
1015
1039
  if (propsVal == null) return defaultValue;
@@ -1043,10 +1067,10 @@ var CommonConfigService = class {
1043
1067
  getHubDocsUrl = () => this.get("VITE_HUB_DOCS_URL");
1044
1068
  getHubStorybookUrl = () => this.get("VITE_HUB_STORYBOOK_URL");
1045
1069
  getFakeApiRequestDelay = () => this.getNumber("VITE_FAKE_API_REQUEST_DELAY");
1046
- // HCaptcha
1070
+ // Captcha
1047
1071
  getCaptchaEnabled = () => this.getBool("VITE_ENABLE_CAPTCHA");
1048
- getHCaptchaSecret = () => this.get("HCAPTCHA_SECRET");
1049
- getHCaptchaSiteKey = () => this.get("VITE_HCAPTCHA_SITE_KEY");
1072
+ getCaptchaSecret = () => this.get("CAPTCHA_SECRET");
1073
+ getCaptchaSiteKey = () => this.get("VITE_CAPTCHA_SITE_KEY");
1050
1074
  // Tolgee
1051
1075
  getTolgeeApiKey = () => this.get("VITE_TOLGEE_API_KEY");
1052
1076
  getTolgeeApiUrl = () => this.get("VITE_TOLGEE_API_URL");
@@ -1080,8 +1104,73 @@ var CommonConfigService = class {
1080
1104
  getBool = (property, defaultValue) => this.get(property, defaultValue).toLowerCase() == "true";
1081
1105
  getNumber = (property, defaultValue) => Number(this.get(property, defaultValue?.toString?.()));
1082
1106
  };
1107
+
1108
+ // src/helpers/dateDtoHelper.ts
1109
+ var numberOfDaysPerMonth = {
1110
+ defaultYear: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
1111
+ leapYear: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
1112
+ };
1113
+ var dateDtoToDateColumn = (dateObj) => `${dateObj.year}-${dateObj.month.toString().padStart(2, "0")}-${dateObj.day.toString().padStart(2, "0")}`;
1114
+ var dateColumnToDateDto = (dateStr) => {
1115
+ const segments = dateStr.split("-");
1116
+ if (segments.length != 3) return { day: 1, month: 1, year: 2e3 };
1117
+ const year = Number(segments[0]);
1118
+ const month = Math.min(12, Number(segments[1]));
1119
+ const daysInMonthItem = getNumberOfDaysInAMonth(year, month);
1120
+ const day = Math.min(daysInMonthItem, Number(segments[2]));
1121
+ return { year, month, day };
1122
+ };
1123
+ var dateToDateDto = (date) => ({
1124
+ year: date.getFullYear(),
1125
+ month: date.getMonth() + 1,
1126
+ day: date.getDate()
1127
+ });
1128
+ var dateDtoToJsDate = (dateObj) => new Date(dateObj.year, dateObj.month - 1, dateObj.day);
1129
+ var isDateDto = (value) => {
1130
+ if (value == null || typeof value !== "object") return false;
1131
+ const candidate = value;
1132
+ return typeof candidate.year === "number" && typeof candidate.month === "number" && typeof candidate.day === "number" && typeof candidate.getTime !== "function";
1133
+ };
1134
+ var isLeapYear = (year) => year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
1135
+ var getNumberOfDaysInAMonth = (year, month) => {
1136
+ const daysInMonth = isLeapYear(year) ? numberOfDaysPerMonth.leapYear : numberOfDaysPerMonth.defaultYear;
1137
+ const daysInMonthItem = daysInMonth[month - 1];
1138
+ if (daysInMonthItem == null) {
1139
+ throw "Invalid date";
1140
+ }
1141
+ return daysInMonthItem;
1142
+ };
1143
+ var getNextDayOfDateDto = (d) => {
1144
+ let { day, month, year } = d;
1145
+ const daysInMonthItem = getNumberOfDaysInAMonth(year, month);
1146
+ day++;
1147
+ if (day > daysInMonthItem) {
1148
+ day = 1;
1149
+ month++;
1150
+ if (month > 12) {
1151
+ month = 1;
1152
+ year++;
1153
+ }
1154
+ }
1155
+ return { day, month, year };
1156
+ };
1157
+ var dateDtoCompare = (a, b) => {
1158
+ if (a.year !== b.year) return a.year - b.year;
1159
+ if (a.month !== b.month) return a.month - b.month;
1160
+ return a.day - b.day;
1161
+ };
1162
+ var dateDtoIsBefore = (a, b) => {
1163
+ const compareResult = dateDtoCompare(a, b);
1164
+ if (compareResult == 0) return false;
1165
+ if (compareResult > 0) return false;
1166
+ return true;
1167
+ };
1168
+ var toDayjsInput = (date) => {
1169
+ if (isDateDto(date)) return dateDtoToJsDate(date);
1170
+ return date;
1171
+ };
1083
1172
  var formatDate = (date, format = "DD MMM YYYY HH:mm") => {
1084
- const dateStr = dayjs(date).format(format);
1173
+ const dateStr = dayjs(toDayjsInput(date)).format(format);
1085
1174
  if (dateStr.includes("Invalid")) return "";
1086
1175
  return dateStr;
1087
1176
  };
@@ -1095,14 +1184,12 @@ var addSeconds = (date, seconds) => dayjs(date).add(seconds, "seconds").toDate()
1095
1184
  var addMinutes = (date, minutes) => dayjs(date).add(minutes, "minutes").toDate();
1096
1185
  var addDays = (date, days) => dayjs(date).add(days, "days").toDate();
1097
1186
  var addMonths = (date, months) => dayjs(date).add(months, "months").toDate();
1098
- var isBefore = (date, secondDate) => dayjs(date).isBefore(secondDate);
1099
- var isSameDay = (date, secondDate) => dayjs(date).isSame(secondDate, "day");
1187
+ var isBefore = (date, secondDate) => dayjs(toDayjsInput(date)).isBefore(toDayjsInput(secondDate));
1188
+ var isSameDay = (date, secondDate) => dayjs(toDayjsInput(date)).isSame(toDayjsInput(secondDate), "day");
1100
1189
  var dateDiffInDays = (date, secondDate) => {
1101
- const date1 = new Date(date);
1102
- const date2 = new Date(secondDate);
1103
- const diffTime = Math.abs(date2.getTime() - date1.getTime());
1104
- const diffDays = Math.floor(diffTime / (1e3 * 60 * 60 * 24));
1105
- return diffDays;
1190
+ const date1 = toDayjsInput(date);
1191
+ const date2 = toDayjsInput(secondDate);
1192
+ return Math.abs(dayjs(date2).startOf("day").diff(dayjs(date1).startOf("day"), "day"));
1106
1193
  };
1107
1194
  var getAgeInYears = (birthDateOrStr, currentDate = /* @__PURE__ */ new Date()) => {
1108
1195
  const birthDate = new Date(birthDateOrStr);
@@ -1298,6 +1385,8 @@ var addToParallelTasks = async (tasks, newTask, numTasksInParallel = 5) => {
1298
1385
  tasks.push(newTask);
1299
1386
  return tasks;
1300
1387
  };
1388
+
1389
+ // src/helpers/bookingCalendarHelper.ts
1301
1390
  var getBookingStatusLabelForAdmin = (status) => {
1302
1391
  switch (status) {
1303
1392
  case 0 /* Cancelled */:
@@ -1394,12 +1483,7 @@ var filterBookingsByOverviewStatus = (bookings, statuses) => {
1394
1483
  const allowed = new Set(statuses);
1395
1484
  return bookings.filter((booking) => allowed.has(booking.status));
1396
1485
  };
1397
- var computeBookingNightCount = (startDate, endDate) => {
1398
- const nights = Math.abs(
1399
- dayjs(endDate).startOf("day").diff(dayjs(startDate).startOf("day"), "day")
1400
- );
1401
- return Math.max(1, nights);
1402
- };
1486
+ var computeBookingNightCount = (startDate, endDate) => Math.max(1, dateDiffInDays(startDate, endDate));
1403
1487
  var formatBookingNightsTooltip = (startDate, endDate) => {
1404
1488
  const nights = computeBookingNightCount(startDate, endDate);
1405
1489
  return nights === 1 ? "1 night" : `${nights} nights`;
@@ -1865,6 +1949,51 @@ var getActiveUserMembership = (userMemberships) => {
1865
1949
  });
1866
1950
  };
1867
1951
 
1952
+ // src/services/external/captcha/captchaNodeService.ts
1953
+ var CaptchaNodeService = class {
1954
+ constructor(log, _config) {
1955
+ this._config = _config;
1956
+ this._logger = log.getLogger("CaptchaNodeService");
1957
+ }
1958
+ _logger;
1959
+ async verifyToken(token, options) {
1960
+ const appType = getAppType();
1961
+ if (isWebApp(appType)) {
1962
+ const message = `verifyToken is not supported on this app type (${appType})`;
1963
+ this._logger.e(message);
1964
+ return { isSuccess: false, errorMessage: message };
1965
+ }
1966
+ let formData = new FormData();
1967
+ formData.append("response", token);
1968
+ formData.append("secret", this._config.getCaptchaSecret());
1969
+ if (options?.idempotencyKey != null) formData.append("idempotency_key", options.idempotencyKey);
1970
+ this._logger.i("verify captcha token");
1971
+ try {
1972
+ const apiResult = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", {
1973
+ method: "POST",
1974
+ body: formData
1975
+ });
1976
+ const response = await apiResult.json();
1977
+ if (response == null || response.success === false) {
1978
+ return {
1979
+ isSuccess: false,
1980
+ errorMessage: "Failed to verify captcha token"
1981
+ };
1982
+ }
1983
+ return {
1984
+ isSuccess: true
1985
+ };
1986
+ } catch (ex) {
1987
+ const errMsg = `Failed to verify captcha token: ${ex?.toString?.()}`;
1988
+ this._logger.e(errMsg);
1989
+ return {
1990
+ isSuccess: false,
1991
+ errorMessage: errMsg
1992
+ };
1993
+ }
1994
+ }
1995
+ };
1996
+
1868
1997
  // src/services/internal/config/colour.config.ts
1869
1998
  var colourPalette = {
1870
1999
  nanasBackyard: "#97A571",
@@ -2026,6 +2155,34 @@ var contactNumberValid = (value) => {
2026
2155
  return { isValid: true };
2027
2156
  };
2028
2157
 
2158
+ // src/validation/dateDtoValidation.ts
2159
+ var minDateDto = (minDate2) => (value) => {
2160
+ if (minDate2 != null && value != null) {
2161
+ if (dateDtoIsBefore(minDate2, value)) {
2162
+ return { isValid: true };
2163
+ }
2164
+ }
2165
+ return {
2166
+ isValid: false,
2167
+ errorMessageTransKey: "min_date_validator",
2168
+ errorMessageParams: { date: dateDtoToDateColumn(minDate2) },
2169
+ errorMessage: "Minimum date is {date}"
2170
+ };
2171
+ };
2172
+ var maxDateDto = (maxDate2) => (value) => {
2173
+ if (maxDate2 != null && value != null) {
2174
+ if (dateDtoIsBefore(value, maxDate2)) {
2175
+ return { isValid: true };
2176
+ }
2177
+ }
2178
+ return {
2179
+ isValid: false,
2180
+ errorMessageTransKey: "max_date_validator",
2181
+ errorMessageParams: { date: dateDtoToDateColumn(maxDate2) },
2182
+ errorMessage: "Maximum date is {date}"
2183
+ };
2184
+ };
2185
+
2029
2186
  // src/validation/dateValidation.ts
2030
2187
  var minDate = (minDate2) => (value) => {
2031
2188
  if (isBefore(minDate2, value)) {
@@ -2205,4 +2362,4 @@ var shouldBeYoutubeUrl = (value) => {
2205
2362
  };
2206
2363
  };
2207
2364
 
2208
- export { APP_TYPE_TOKEN, ActivityRestriction, ActivityType, AddressLinkType, AddressRestriction, AnswerLinkType, AnswerRestriction, AppType, AuthRegisterRestriction, BOOKING_OVERVIEW_STATUSES, BOT_PATH_TOKEN, BookingAddonRestriction, BookingAddonType, BookingRestriction, BookingStatusType, BugReportRestriction, BugReportStatusType, CdnAppImage, CommentLinkType, CommentRestriction, CommonConfigService, DependencyInjectionContainer, DrivingRouteRestriction, InvoiceRestriction, InvoiceStatusType, LogService, MembershipBillingCycleType, MembershipRestriction, MembershipStatus, MembershipType, MouseButton, NANAS_PALLETTE, NetworkState, OrderDirectionType, PermissionRestriction, PermissionType, PetRestriction, PetSexType, PetStatusType, PetType, QuestionForType, QuestionRestriction, QuestionType, SITE_CONFIG_TOKEN, SearchableColumnType, SentEmailLinkType, SentEmailRestriction, SentEmailSentStatus, StripeRestriction, SupportedLanguageArray, TempLinkType, TempRegistrationStatus, UnavailabilityRestriction, UploadLinkType, UploadRestriction, UploadType, UserAccountFlagType, UserRestriction, UserType, UuidRestriction, activityShortCode, addDays, addMinutes, addMonths, addSeconds, addSpacesForEnum, addToParallelTasks, allowedNonNumericalValuesInContactNumber, anyObject, apiRoute, apiRouteParam, arrayContains, arrayOfNLength, capitalizeFirstLetter, changeMonth, colourPalette, commonEmailLinks, computeBookingNightCount, computeBookingStatusCounts, contactNumberCharValid, contactNumberValid, convertToDate, convertToFullDateSelection, createToken, cyrb53, dateDiffInDays, debounceLeading, defaultSiteColour, emailValid, fakePromise, filterBookingsByOverviewStatus, formatBookingCalendarLabel, formatBookingNightsTooltip, formatDate, formatFileSize, formatForBookingDate, formatForDateDropdown, formatForDateLocal, formatForDateLocalDetailed, formatForDateOfBirth, formatForDateWithTime, formatPetTypesLabel, getActiveUserMembership, getAgeInYears, getAllPetQuestionForType, getAppType, getArrFromEnum, getBookingStatusLabelForAdmin, getBotPath, getCalendarDropdownDisplayValue, getCalendarDropdownForDateOfBirthDisplayValue, getCommonConfig, getDayClassObject, getDayElements, getDayHeadingElements, getImageParams, getLog, getMembershipTypeLabel, getMimeTypeFromExtension, getPayloadFromJwt, getPerformanceTimer, getPetAvatarUrl, getPetTypeLabel, getQuestionGroups, getSiteColour, getSiteConfig, getUserAvatarUrl, getUsersName, getWeekNumber, hasRequiredPermissions, hubspotQuestionsExport, isBefore, isDateAfterStart, isDateBeforeEnd, isDateDisabledByDisabledDays, isDateEnabledByEnabledDays, isNumber, isSameDay, isWebApp, lowercaseFirstLetter, makeArrayOrDefault, maxDate, maxItems, maxLength, maxValue, mimeTypeLookup, minDate, minItems, minLength, minUrlLength, minValue, monthTranslationKeyOrder, multiValidation, nameof, nanasFonts, noValidation, notNull, onlyUnique, parseBookingOverviewStatuses, passwordValid, portalGlyphLength, postCodeValid, promiseFromValue, randomIntFromRange, randomItemFromArray, rootContainer, rootDependencyInjectionSetup, searchColumns, selectedItemsExist, selectedOptionIsInEnum, separateValidation, serializeBookingOverviewStatuses, setContainerToken, setContainerTokenLazy, setSiteConfig, shouldBeUrl, shouldBeYoutubeUrl, showSecondCalendar, socialLinks, timeout, tryParseNumber, uploadsThatNeedEncryption, urlAddQueryParam, urlRef, userMustChangePassword, uuidv4, validUuidChars, validateForEach, webAppTypes, weekdayTranslationKeyOrder };
2365
+ export { APP_TYPE_TOKEN, ActivityRestriction, ActivityType, AddressLinkType, AddressRestriction, AnswerLinkType, AnswerRestriction, AppType, AuthRegisterRestriction, BOOKING_OVERVIEW_STATUSES, BOT_PATH_TOKEN, BookingAddonRestriction, BookingAddonType, BookingRestriction, BookingStatusType, BugReportRestriction, BugReportStatusType, CaptchaNodeService, CaptchaTokenRestriction, CdnAppImage, ClientRegisterStep, CommentLinkType, CommentRestriction, CommonConfigService, DateObjectRestriction, DependencyInjectionContainer, DrivingRouteRestriction, InvoiceRestriction, InvoiceStatusType, LogService, MembershipBillingCycleType, MembershipRestriction, MembershipStatus, MembershipType, MouseButton, NANAS_PALLETTE, NetworkState, OrderDirectionType, PermissionRestriction, PermissionType, PetRestriction, PetSexType, PetStatusType, PetType, QuestionForType, QuestionRestriction, QuestionType, SITE_CONFIG_TOKEN, SearchableColumnType, SentEmailLinkType, SentEmailRestriction, SentEmailSentStatus, StripeRestriction, SupportedLanguageArray, TempLinkType, TempRegistrationStatus, UnavailabilityRestriction, UploadLinkType, UploadRestriction, UploadType, UserAccountFlagType, UserRestriction, UserType, UuidRestriction, activityShortCode, addDays, addMinutes, addMonths, addSeconds, addSpacesForEnum, addToParallelTasks, allowedNonNumericalValuesInContactNumber, anyObject, apiRoute, apiRouteParam, arrayContains, arrayOfNLength, capitalizeFirstLetter, changeMonth, colourPalette, commonEmailLinks, computeBookingNightCount, computeBookingStatusCounts, contactNumberCharValid, contactNumberValid, convertToDate, convertToFullDateSelection, createToken, cyrb53, dateColumnToDateDto, dateDiffInDays, dateDtoCompare, dateDtoIsBefore, dateDtoToDateColumn, dateDtoToJsDate, dateToDateDto, debounceLeading, defaultSiteColour, emailValid, fakePromise, filterBookingsByOverviewStatus, formatBookingCalendarLabel, formatBookingNightsTooltip, formatDate, formatFileSize, formatForBookingDate, formatForDateDropdown, formatForDateLocal, formatForDateLocalDetailed, formatForDateOfBirth, formatForDateWithTime, formatPetTypesLabel, getActiveUserMembership, getAgeInYears, getAllPetQuestionForType, getAppType, getArrFromEnum, getBookingStatusLabelForAdmin, getBotPath, getCalendarDropdownDisplayValue, getCalendarDropdownForDateOfBirthDisplayValue, getCommonConfig, getDayClassObject, getDayElements, getDayHeadingElements, getImageParams, getLog, getMembershipTypeLabel, getMimeTypeFromExtension, getNextDayOfDateDto, getNumberOfDaysInAMonth, getPayloadFromJwt, getPerformanceTimer, getPetAvatarUrl, getPetTypeLabel, getQuestionGroups, getSiteColour, getSiteConfig, getUserAvatarUrl, getUsersName, getWeekNumber, hasRequiredPermissions, hubspotQuestionsExport, isBefore, isDateAfterStart, isDateBeforeEnd, isDateDisabledByDisabledDays, isDateDto, isDateEnabledByEnabledDays, isLeapYear, isNumber, isSameDay, isWebApp, lowercaseFirstLetter, makeArrayOrDefault, maxDate, maxDateDto, maxItems, maxLength, maxValue, mimeTypeLookup, minDate, minDateDto, minItems, minLength, minUrlLength, minValue, monthTranslationKeyOrder, multiValidation, nameof, nanasFonts, noValidation, notNull, numberOfDaysPerMonth, onlyUnique, parseBookingOverviewStatuses, passwordValid, portalGlyphLength, postCodeValid, promiseFromValue, randomIntFromRange, randomItemFromArray, rootContainer, rootDependencyInjectionSetup, searchColumns, selectedItemsExist, selectedOptionIsInEnum, separateValidation, serializeBookingOverviewStatuses, setContainerToken, setContainerTokenLazy, setSiteConfig, shouldBeUrl, shouldBeYoutubeUrl, showSecondCalendar, socialLinks, timeout, tryParseNumber, uploadsThatNeedEncryption, urlAddQueryParam, urlRef, userMustChangePassword, uuidv4, validUuidChars, validateForEach, webAppTypes, weekdayTranslationKeyOrder };