@nanas-home/hub-common 0.11.293 → 0.11.295

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.
@@ -2,6 +2,80 @@ import dayjs from 'dayjs';
2
2
  import { Token, Container } from '@freshgum/typedi';
3
3
  import { jwtDecode } from 'jwt-decode';
4
4
 
5
+ // src/helpers/asyncHelper.ts
6
+ var timeout = (ms) => {
7
+ return new Promise((resolve) => setTimeout(resolve, ms));
8
+ };
9
+ var addToParallelTasks = async (tasks, newTask, numTasksInParallel = 5) => {
10
+ if (tasks.length >= numTasksInParallel) {
11
+ const finishedTask = Promise.any(tasks);
12
+ const indexOfTask = tasks.indexOf(finishedTask);
13
+ tasks.splice(indexOfTask, 1);
14
+ await finishedTask;
15
+ }
16
+ tasks.push(newTask);
17
+ return tasks;
18
+ };
19
+
20
+ // src/contracts/generated/enum/permissionType.ts
21
+ var PermissionType = /* @__PURE__ */ ((PermissionType2) => {
22
+ PermissionType2[PermissionType2["None"] = 0] = "None";
23
+ PermissionType2[PermissionType2["All"] = 1] = "All";
24
+ PermissionType2[PermissionType2["AdminLogin"] = 2] = "AdminLogin";
25
+ PermissionType2[PermissionType2["UserView"] = 20] = "UserView";
26
+ PermissionType2[PermissionType2["UserManage"] = 21] = "UserManage";
27
+ PermissionType2[PermissionType2["UserDelete"] = 22] = "UserDelete";
28
+ PermissionType2[PermissionType2["ActivitiesView"] = 30] = "ActivitiesView";
29
+ PermissionType2[PermissionType2["UserPermissionView"] = 40] = "UserPermissionView";
30
+ PermissionType2[PermissionType2["UserPermissionManage"] = 41] = "UserPermissionManage";
31
+ PermissionType2[PermissionType2["UserPermissionDelete"] = 42] = "UserPermissionDelete";
32
+ PermissionType2[PermissionType2["PetView"] = 60] = "PetView";
33
+ PermissionType2[PermissionType2["PetManage"] = 61] = "PetManage";
34
+ PermissionType2[PermissionType2["PetDelete"] = 62] = "PetDelete";
35
+ PermissionType2[PermissionType2["CommentView"] = 80] = "CommentView";
36
+ PermissionType2[PermissionType2["CommentManage"] = 81] = "CommentManage";
37
+ PermissionType2[PermissionType2["CommentDelete"] = 82] = "CommentDelete";
38
+ PermissionType2[PermissionType2["AddressView"] = 100] = "AddressView";
39
+ PermissionType2[PermissionType2["AddressManage"] = 101] = "AddressManage";
40
+ PermissionType2[PermissionType2["AddressDelete"] = 102] = "AddressDelete";
41
+ PermissionType2[PermissionType2["BookingView"] = 120] = "BookingView";
42
+ PermissionType2[PermissionType2["BookingManage"] = 121] = "BookingManage";
43
+ PermissionType2[PermissionType2["BookingDelete"] = 122] = "BookingDelete";
44
+ PermissionType2[PermissionType2["AnswerView"] = 140] = "AnswerView";
45
+ PermissionType2[PermissionType2["AnswerManage"] = 141] = "AnswerManage";
46
+ PermissionType2[PermissionType2["AnswerDelete"] = 142] = "AnswerDelete";
47
+ PermissionType2[PermissionType2["QuestionView"] = 150] = "QuestionView";
48
+ PermissionType2[PermissionType2["QuestionManage"] = 151] = "QuestionManage";
49
+ PermissionType2[PermissionType2["QuestionDelete"] = 152] = "QuestionDelete";
50
+ PermissionType2[PermissionType2["UploadView"] = 160] = "UploadView";
51
+ PermissionType2[PermissionType2["UploadManage"] = 161] = "UploadManage";
52
+ PermissionType2[PermissionType2["UploadDelete"] = 162] = "UploadDelete";
53
+ PermissionType2[PermissionType2["MembershipView"] = 170] = "MembershipView";
54
+ PermissionType2[PermissionType2["MembershipManage"] = 171] = "MembershipManage";
55
+ PermissionType2[PermissionType2["MembershipDelete"] = 172] = "MembershipDelete";
56
+ PermissionType2[PermissionType2["UserMembershipView"] = 180] = "UserMembershipView";
57
+ PermissionType2[PermissionType2["UserMembershipManage"] = 181] = "UserMembershipManage";
58
+ PermissionType2[PermissionType2["UserMembershipDelete"] = 182] = "UserMembershipDelete";
59
+ return PermissionType2;
60
+ })(PermissionType || {});
61
+
62
+ // src/helpers/permissionHelper.ts
63
+ var hasRequiredPermissions = (props) => {
64
+ if (props.userPermissions.includes(1 /* All */)) {
65
+ props.hasAdminPermission?.();
66
+ return true;
67
+ }
68
+ const missingPermissions = props.requiredPermissions.filter((p) => props.userPermissions.includes(p) == false);
69
+ if (missingPermissions.length > 0) {
70
+ props.doesNotHavePermission?.(missingPermissions);
71
+ return false;
72
+ }
73
+ return true;
74
+ };
75
+
76
+ // src/helpers/commonHelper.ts
77
+ var getUsersName = (details) => `${details?.firstName} ${details?.lastName}`;
78
+
5
79
  // src/helpers/mimeHelper.ts
6
80
  var mimeTypeLookup = {
7
81
  txt: "text/plain",
@@ -23,89 +97,6 @@ var getMimeTypeFromExtension = (extension, logger) => {
23
97
  return "application/octet-stream";
24
98
  };
25
99
 
26
- // src/helpers/performanceHelper.ts
27
- var getPerformanceTimer = () => ({
28
- start: performance.now(),
29
- getTimeElapsed: (start) => performance.now() - start
30
- });
31
-
32
- // src/helpers/hashHelper.ts
33
- var cyrb53 = (input, seed = 0) => {
34
- let h1 = 3735928559 ^ seed, h2 = 1103547991 ^ seed;
35
- for (let i = 0, ch; i < input.length; i++) {
36
- ch = input.charCodeAt(i);
37
- h1 = Math.imul(h1 ^ ch, 2654435761);
38
- h2 = Math.imul(h2 ^ ch, 1597334677);
39
- }
40
- h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507);
41
- h1 ^= Math.imul(h2 ^ h2 >>> 13, 3266489909);
42
- h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507);
43
- h2 ^= Math.imul(h1 ^ h1 >>> 13, 3266489909);
44
- return 4294967296 * (2097151 & h2) + (h1 >>> 0);
45
- };
46
-
47
- // src/helpers/randomHelper.ts
48
- var randomIntFromRange = (min, max) => {
49
- return Math.floor(Math.random() * (max - min) + min);
50
- };
51
- var randomItemFromArray = (items) => {
52
- const randomIndex = randomIntFromRange(0, items.length);
53
- return items[randomIndex];
54
- };
55
-
56
- // src/helpers/guidHelper.ts
57
- var uuidv4 = () => {
58
- var d = (/* @__PURE__ */ new Date()).getTime();
59
- var d2 = typeof performance !== "undefined" && performance.now && performance.now() * 1e3 || 0;
60
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
61
- var r = Math.random() * 16;
62
- if (d > 0) {
63
- r = (d + r) % 16 | 0;
64
- d = Math.floor(d / 16);
65
- } else {
66
- r = (d2 + r) % 16 | 0;
67
- d2 = Math.floor(d2 / 16);
68
- }
69
- return (c === "x" ? r : r & 3 | 8).toString(16);
70
- });
71
- };
72
-
73
- // src/helpers/stringHelper.ts
74
- var capitalizeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
75
- var capitalizeFirstLetter = (orig) => {
76
- if ((orig?.length ?? 0) == 0) return orig;
77
- return [orig[0].toUpperCase(), ...orig.slice(1, orig.length)].join("");
78
- };
79
- var lowercaseFirstLetter = (orig) => {
80
- if (orig.length == 0) return orig;
81
- return [orig[0].toLowerCase(), ...orig.slice(1, orig.length)].join("");
82
- };
83
- var addSpacesForEnum = (orig) => {
84
- if (orig.length == 0) return orig;
85
- let result = "";
86
- for (const char of orig) {
87
- if (capitalizeAlphabet.includes(char)) {
88
- result += " ";
89
- }
90
- result += char;
91
- }
92
- return result;
93
- };
94
- var formatFileSize = (sizeInKb) => {
95
- const units = ["KB", "MB", "GB", "TB"];
96
- let size = sizeInKb;
97
- let unitIndex = 0;
98
- while (size >= 1024 && unitIndex < units.length - 1) {
99
- size /= 1024;
100
- unitIndex++;
101
- }
102
- const formatter = new Intl.NumberFormat("en-US", {
103
- minimumFractionDigits: 0,
104
- maximumFractionDigits: 0
105
- });
106
- return `${formatter.format(size)} ${units[unitIndex]}`;
107
- };
108
-
109
100
  // src/helpers/arrayHelper.ts
110
101
  var makeArrayOrDefault = (propsVal, defaultValue = []) => {
111
102
  if (propsVal == null) return defaultValue;
@@ -125,83 +116,9 @@ var arrayContains = (arr, items, method = "AND") => {
125
116
  return true;
126
117
  };
127
118
 
128
- // src/helpers/propHelper.ts
129
- function nameof(key1, key2) {
130
- return key2 ?? key1;
131
- }
132
-
133
- // src/helpers/eventHelper.ts
134
- var onTargetValue = (funcOnEvent) => (event) => {
135
- const value = event.target?.value;
136
- if (value == null) return;
137
- funcOnEvent(value);
138
- };
139
- var onTargetChecked = (funcOnEvent) => (event) => {
140
- const value = event.target?.checked;
141
- if (value == null) return;
142
- funcOnEvent(value);
143
- };
144
- var onTargetFiles = (funcOnEvent) => (event) => {
145
- const fileList = event.target.files;
146
- if (fileList == null || fileList.length < 1) return;
147
- funcOnEvent(fileList);
148
- };
149
- var preventDefault = (event) => {
150
- event?.preventDefault?.();
151
- return event;
152
- };
153
- var stopPropagation = (event) => {
154
- event?.stopPropagation?.();
155
- return event;
156
- };
157
-
158
- // src/services/internal/config/commonConfigService.ts
159
- var CommonConfigService = class {
160
- _internalIsProd;
161
- getHubApiUrl = () => this.get("VITE_HUB_API_URL");
162
- getHubLandingUrl = () => this.get("VITE_HUB_LANDING_URL");
163
- getHubClientUrl = () => this.get("VITE_HUB_CLIENT_URL");
164
- getHubAdminUrl = () => this.get("VITE_HUB_ADMIN_URL");
165
- getHubCoverageUrl = () => this.get("VITE_HUB_COVERAGE_URL");
166
- getHubDocsUrl = () => this.get("VITE_HUB_DOCS_URL");
167
- getHubStorybookUrl = () => this.get("VITE_HUB_STORYBOOK_URL");
168
- getHubspotId = () => this.get("VITE_HUBSPOT_ID");
169
- getFakeApiRequestDelay = () => this.getNumber("VITE_FAKE_API_REQUEST_DELAY");
170
- getCaptchaEnabled = () => this.getBool("VITE_ENABLE_CAPTCHA");
171
- getHCaptchaSecret = () => this.get("HCAPTCHA_SECRET");
172
- getHCaptchaSiteKey = () => this.get("VITE_HCAPTCHA_SITE_KEY");
173
- getTolgeeApiKey = () => this.get("VITE_TOLGEE_API_KEY");
174
- getTolgeeApiUrl = () => this.get("VITE_TOLGEE_API_URL");
175
- getTolgeeProjectId = () => this.getNumber("VITE_TOLGEE_PROJECT_ID");
176
- /* Special case, available on UI & API */
177
- isProd = () => {
178
- if (this._internalIsProd == null) {
179
- this._internalIsProd = this.get("NODE_ENV").toLocaleLowerCase() === "production" || this.get("MODE").toLocaleLowerCase() === "production";
180
- }
181
- return this._internalIsProd;
182
- };
183
- packageVersion = () => this.getWithFallback("npm_package_version", "PACKAGE_VERSION");
184
- getConsoleLogLevels = () => {
185
- const envVar = this.get("VITE_CONSOLE_LOGGING");
186
- if (envVar?.length < 1) return ["trace", "log", "info", "debug", "warn", "error"];
187
- return envVar.split(",").map((l) => l);
188
- };
189
- get(property, defaultValue) {
190
- let value = void 0;
191
- value = import.meta.env?.[property];
192
- if (defaultValue != null) {
193
- return value ?? defaultValue;
194
- }
195
- return value ?? "";
196
- }
197
- getWithFallback = (property, fallbackProperty, defaultValue) => {
198
- const orig = this.get(property);
199
- if (orig != null) return orig;
200
- return this.get(fallbackProperty, defaultValue);
201
- };
202
- getBool = (property, defaultValue) => this.get(property, defaultValue).toLowerCase() == "true";
203
- getNumber = (property, defaultValue) => Number(this.get(property, defaultValue?.toString?.()));
204
- };
119
+ // src/helpers/typescriptHacks.ts
120
+ var anyObject = () => ({});
121
+ var fakePromise = () => new Promise((res) => res({}));
205
122
  var formatDate = (date, format = "DD MMM YYYY HH:mm") => {
206
123
  const dateStr = dayjs(date).format(format);
207
124
  if (dateStr.includes("Invalid")) return "";
@@ -242,193 +159,17 @@ var getWeekNumber = (d) => {
242
159
  return Math.ceil(((d.getTime() - yearStart.getTime()) / 864e5 + 1) / 7);
243
160
  };
244
161
 
245
- // src/services/internal/log/logService.ts
246
- var LogService = class {
247
- constructor(config, _numDaysToKeep = 100) {
248
- this._numDaysToKeep = _numDaysToKeep;
249
- this._logLevels = config.getConsoleLogLevels();
250
- this._latestLogDate = addDays(/* @__PURE__ */ new Date(), -this._numDaysToKeep);
251
- console.info("Log Levels: ", this._logLevels.join());
252
- }
253
- logs = [];
254
- _logLevels;
255
- _latestLogDate;
256
- _logMessageToConsole = (log) => {
257
- let logStyle = "";
258
- switch (log.type) {
259
- case "log":
260
- case "info":
261
- logStyle = "color: green; font-size: medium";
262
- break;
263
- case "warn":
264
- logStyle = "color: orange; font-size: medium";
265
- break;
266
- case "error":
267
- logStyle = "color: red; font-size: large";
268
- break;
269
- }
270
- let messageString = `%c${log.message}`;
271
- if ((log.optionalParams ?? []).length > 0) {
272
- messageString += `
273
- additional params:
274
- ${(log.optionalParams ?? []).join("\n\r")}`;
275
- }
276
- if ((log.groups ?? []).length > 0) {
277
- const groupString = (log.groups ?? []).map((g) => `[${g}]`).join();
278
- messageString = `${groupString} - ${messageString}`;
279
- }
280
- const dateString = formatForDateLocalDetailed(/* @__PURE__ */ new Date());
281
- const logFunc = console[log.type];
282
- logFunc(`${dateString}: ${messageString}`, logStyle);
283
- };
284
- _track = (type, groups) => (message, ...optionalParams) => {
285
- const log = {
286
- type,
287
- groups,
288
- message,
289
- date: /* @__PURE__ */ new Date(),
290
- optionalParams: optionalParams.map((op) => JSON.stringify(op, null, 2))
291
- };
292
- this.logs = this.logs.filter((t) => t.date > this._latestLogDate);
293
- this.logs.push(log);
294
- if (this._logLevels.includes(log.type) === false) return;
295
- else this._logMessageToConsole(log);
296
- };
297
- getLogger = (...groups) => ({
298
- d: this._track("debug", groups),
299
- i: this._track("info", groups),
300
- w: this._track("warn", groups),
301
- e: this._track("error", groups)
302
- });
303
- };
304
- var dependencyInjectionSetup = (props) => {
305
- setContainerToken(APP_TYPE, props.appType);
306
- if (props.botPath != null) setContainerToken(BOT_PATH, props.botPath);
307
- if (props.siteConfig != null) setContainerToken(SITE_CONFIG, props.siteConfig);
308
- const configService = new CommonConfigService();
309
- const logService = new LogService(configService);
310
- setContainerToken(CommonConfigService, configService);
311
- setContainerToken(LogService, logService);
312
- return {
313
- logService,
314
- configService
315
- };
316
- };
317
- var BOT_PATH = new Token("BOT_PATH");
318
- var getBotPath = () => Container.get(BOT_PATH);
319
- var APP_TYPE = new Token("APP_TYPE");
320
- var getAppType = () => Container.get(APP_TYPE);
321
- var SITE_CONFIG = new Token("SITE_CONFIG");
322
- var setSiteConfig = (value) => Container.set({ id: SITE_CONFIG, value });
323
- var getSiteConfig = () => {
324
- try {
325
- return Container.get(SITE_CONFIG);
326
- } catch {
327
- console.error("unable to get site config. Did you set the config on app startup?");
328
- }
329
- };
330
- var setContainerToken = (id, value) => Container.set({ id, value });
331
- var getCommonConfig = () => Container.get(CommonConfigService);
332
- var getLog = () => Container.get(LogService);
333
-
334
- // src/helpers/typescriptHacks.ts
335
- var anyObject = () => ({});
336
- var fakePromise = () => new Promise((res) => res({}));
337
-
338
- // src/helpers/imageHelper.ts
339
- var getImageParams = (file) => {
340
- const fileExtension = file.name?.split?.(".")?.pop?.() ?? ".png";
341
- return new Promise((resolve, reject) => {
342
- const reader = new FileReader();
343
- reader.onload = async (e) => {
344
- const image = new Image();
345
- if (e.target == null || e.target.result == null) {
346
- reject("e.target.result is null");
347
- return;
348
- }
349
- image.src = e.target.result;
350
- await image.decode();
351
- resolve({
352
- name: file.name,
353
- type: file.type,
354
- width: image.width,
355
- height: image.height,
356
- fileSize: file.size,
357
- fileExtension
358
- });
359
- };
360
- reader.onerror = (e) => reject(e);
361
- reader.readAsDataURL(file);
362
- });
363
- };
364
-
365
- // src/contracts/generated/enum/permissionType.ts
366
- var PermissionType = /* @__PURE__ */ ((PermissionType2) => {
367
- PermissionType2[PermissionType2["None"] = 0] = "None";
368
- PermissionType2[PermissionType2["All"] = 1] = "All";
369
- PermissionType2[PermissionType2["AdminLogin"] = 2] = "AdminLogin";
370
- PermissionType2[PermissionType2["UserView"] = 20] = "UserView";
371
- PermissionType2[PermissionType2["UserManage"] = 21] = "UserManage";
372
- PermissionType2[PermissionType2["UserDelete"] = 22] = "UserDelete";
373
- PermissionType2[PermissionType2["ActivitiesView"] = 30] = "ActivitiesView";
374
- PermissionType2[PermissionType2["UserPermissionView"] = 40] = "UserPermissionView";
375
- PermissionType2[PermissionType2["UserPermissionManage"] = 41] = "UserPermissionManage";
376
- PermissionType2[PermissionType2["UserPermissionDelete"] = 42] = "UserPermissionDelete";
377
- PermissionType2[PermissionType2["PetView"] = 60] = "PetView";
378
- PermissionType2[PermissionType2["PetManage"] = 61] = "PetManage";
379
- PermissionType2[PermissionType2["PetDelete"] = 62] = "PetDelete";
380
- PermissionType2[PermissionType2["CommentView"] = 80] = "CommentView";
381
- PermissionType2[PermissionType2["CommentManage"] = 81] = "CommentManage";
382
- PermissionType2[PermissionType2["CommentDelete"] = 82] = "CommentDelete";
383
- PermissionType2[PermissionType2["AddressView"] = 100] = "AddressView";
384
- PermissionType2[PermissionType2["AddressManage"] = 101] = "AddressManage";
385
- PermissionType2[PermissionType2["AddressDelete"] = 102] = "AddressDelete";
386
- PermissionType2[PermissionType2["BookingView"] = 120] = "BookingView";
387
- PermissionType2[PermissionType2["BookingManage"] = 121] = "BookingManage";
388
- PermissionType2[PermissionType2["BookingDelete"] = 122] = "BookingDelete";
389
- PermissionType2[PermissionType2["AnswerView"] = 140] = "AnswerView";
390
- PermissionType2[PermissionType2["AnswerManage"] = 141] = "AnswerManage";
391
- PermissionType2[PermissionType2["AnswerDelete"] = 142] = "AnswerDelete";
392
- PermissionType2[PermissionType2["QuestionView"] = 150] = "QuestionView";
393
- PermissionType2[PermissionType2["QuestionManage"] = 151] = "QuestionManage";
394
- PermissionType2[PermissionType2["QuestionDelete"] = 152] = "QuestionDelete";
395
- PermissionType2[PermissionType2["UploadView"] = 160] = "UploadView";
396
- PermissionType2[PermissionType2["UploadManage"] = 161] = "UploadManage";
397
- PermissionType2[PermissionType2["UploadDelete"] = 162] = "UploadDelete";
398
- PermissionType2[PermissionType2["MembershipView"] = 170] = "MembershipView";
399
- PermissionType2[PermissionType2["MembershipManage"] = 171] = "MembershipManage";
400
- PermissionType2[PermissionType2["MembershipDelete"] = 172] = "MembershipDelete";
401
- PermissionType2[PermissionType2["UserMembershipView"] = 180] = "UserMembershipView";
402
- PermissionType2[PermissionType2["UserMembershipManage"] = 181] = "UserMembershipManage";
403
- PermissionType2[PermissionType2["UserMembershipDelete"] = 182] = "UserMembershipDelete";
404
- return PermissionType2;
405
- })(PermissionType || {});
406
-
407
- // src/helpers/permissionHelper.ts
408
- var hasRequiredPermissions = (props) => {
409
- if (props.userPermissions.includes(1 /* All */)) {
410
- props.hasAdminPermission?.();
411
- return true;
412
- }
413
- const missingPermissions = props.requiredPermissions.filter((p) => props.userPermissions.includes(p) == false);
414
- if (missingPermissions.length > 0) {
415
- props.doesNotHavePermission?.(missingPermissions);
416
- return false;
417
- }
418
- return true;
419
- };
420
-
421
162
  // src/assets/meta.json
422
163
  var meta_default = {
423
164
  packageVersion: "0.11.0",
424
- date: "2025-08-15",
425
- gitCommitHash: "e8797e0af7f0adfadceb23342fccec6569048088"
165
+ date: "2025-08-31",
166
+ gitCommitHash: "2e4e0ec3cc603d9540250a7fd4721fcaec6ba608"
426
167
  };
427
168
 
428
169
  // src/assets/packagesUsed.json
429
170
  var packagesUsed_default = {
430
- generatedDate: "2025-08-15T10:02:53.485Z",
431
- generatedDateFormat: "2025-08-15",
171
+ generatedDate: "2025-08-31T19:05:39.039Z",
172
+ generatedDateFormat: "2025-08-31",
432
173
  list: [
433
174
  {
434
175
  name: "@chromatic-com/storybook",
@@ -566,169 +307,178 @@ var packagesUsed_default = {
566
307
  var getMeta = () => meta_default;
567
308
  var getPackagesUsed = () => packagesUsed_default;
568
309
 
569
- // src/helpers/debounceHelper.ts
570
- function debounceLeading(fn, ms) {
571
- let timer;
572
- const func = (args) => new Promise((resolve) => {
573
- if (timer) {
574
- clearTimeout(timer);
310
+ // src/helpers/stringHelper.ts
311
+ var capitalizeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
312
+ var capitalizeFirstLetter = (orig) => {
313
+ if ((orig?.length ?? 0) == 0) return orig;
314
+ return [orig[0].toUpperCase(), ...orig.slice(1, orig.length)].join("");
315
+ };
316
+ var lowercaseFirstLetter = (orig) => {
317
+ if (orig.length == 0) return orig;
318
+ return [orig[0].toLowerCase(), ...orig.slice(1, orig.length)].join("");
319
+ };
320
+ var addSpacesForEnum = (orig) => {
321
+ if (orig.length == 0) return orig;
322
+ let result = "";
323
+ for (const char of orig) {
324
+ if (capitalizeAlphabet.includes(char)) {
325
+ result += " ";
575
326
  }
576
- timer = setTimeout(() => {
577
- resolve(fn(args));
578
- }, ms);
327
+ result += char;
328
+ }
329
+ return result;
330
+ };
331
+ var formatFileSize = (sizeInKb) => {
332
+ const units = ["KB", "MB", "GB", "TB"];
333
+ let size = sizeInKb;
334
+ let unitIndex = 0;
335
+ while (size >= 1024 && unitIndex < units.length - 1) {
336
+ size /= 1024;
337
+ unitIndex++;
338
+ }
339
+ const formatter = new Intl.NumberFormat("en-US", {
340
+ minimumFractionDigits: 0,
341
+ maximumFractionDigits: 0
579
342
  });
580
- const destroy = () => clearTimeout(timer);
581
- return { func, destroy };
582
- }
583
-
584
- // src/helpers/commonHelper.ts
585
- var getUsersName = (details) => `${details?.firstName} ${details?.lastName}`;
343
+ return `${formatter.format(size)} ${units[unitIndex]}`;
344
+ };
586
345
 
587
- // src/contracts/generated/apiRoute.ts
588
- var apiParams = {
589
- general: {
590
- segment: "segment"
591
- },
592
- user: {
593
- id: "id"
594
- }
595
- };
596
- var apiRoute = {
597
- home: "/",
598
- swagger: "/swagger",
599
- common: {
600
- auth: {
601
- prefix: "/auth",
602
- devJwt: "/jwt",
603
- login: "/login",
604
- signup: "/signup",
605
- swagger: { name: "Auth", description: "Endpoints for login, sign up etc" },
606
- token: {
607
- prefix: "/token",
608
- swagger: { name: "AuthToken", description: "Endpoints for creating an API token" }
609
- }
610
- },
611
- version: "/version"
612
- },
613
- admin: {
614
- activity: {
615
- prefix: "/admin/activity",
616
- swagger: {
617
- name: "Activity",
618
- description: "Endpoints for retrieving and managing activities"
619
- }
620
- },
621
- address: {
622
- prefix: "/admin/address",
623
- byLink: "/link",
624
- lookup: "/lookup",
625
- swagger: { name: "Addresses", description: "Endpoints for managing addresses" }
626
- },
627
- answer: {
628
- prefix: "/admin/answer",
629
- swagger: { name: "Answers", description: "Endpoints for managing answers to signup questions" }
630
- },
631
- booking: {
632
- prefix: "/admin/booking",
633
- byUser: "/user",
634
- swagger: { name: "Bookings", description: "Endpoints for managing bookings" }
635
- },
636
- comment: {
637
- prefix: "/admin/comment",
638
- byLink: "/link",
639
- swagger: { name: "Comments", description: "Endpoints for managing Comments" }
640
- },
641
- membership: {
642
- prefix: "/admin/membership",
643
- swagger: { name: "Memberships", description: "Endpoints for managing Memberships" }
644
- },
645
- pet: {
646
- prefix: "/admin/pet",
647
- byUser: "/user",
648
- swagger: { name: "Pets", description: "Endpoints for managing Pets" }
649
- },
650
- question: {
651
- prefix: "/admin/question",
652
- swagger: {
653
- name: "Questions",
654
- description: "Endpoints for managing questions that users need to answer in order to complete their profiles"
655
- }
656
- },
657
- upload: {
658
- prefix: "/admin/upload",
659
- viewRaw: "/view-raw",
660
- image: "/image",
661
- swagger: { name: "Uploads", description: "Endpoints for managing Uploads" }
662
- },
663
- user: {
664
- prefix: "/admin/user",
665
- swagger: { name: "Users", description: "Endpoints for Admins to manage Users" }
666
- },
667
- userMembership: {
668
- prefix: "/admin/user-membership",
669
- byUser: "/user",
670
- swagger: { name: "UserMemberships", description: "Endpoints for managing User's Memberships" }
671
- },
672
- userPermission: {
673
- prefix: "/admin/user-permission",
674
- swagger: { name: "UserPermissions", description: "Endpoints for getting and managing user permissions." }
675
- }
676
- },
677
- client: {
678
- answer: {
679
- prefix: "/answer",
680
- forProfile: "/profile",
681
- forPet: "/pet",
682
- swagger: { name: "Answers", description: "Endpoints for managing answers to signup questions" }
683
- },
684
- booking: {
685
- prefix: "/booking",
686
- swagger: { name: "Bookings", description: "Endpoints for User to manage their Bookings" }
687
- },
688
- membership: {
689
- prefix: "/membership",
690
- swagger: { name: "MembershipTiers", description: "Endpoints for public TierMemberships" }
691
- },
692
- pet: {
693
- prefix: "/pet",
694
- swagger: { name: "Pets", description: "Endpoints for User to manage their Pets" }
695
- },
696
- profile: {
697
- prefix: "/profile",
698
- avatar: "/avatar",
699
- answers: "/answers",
700
- swagger: { name: "Profile", description: "Endpoints for User to manage their Profile" }
701
- },
702
- upload: {
703
- prefix: "/upload",
704
- image: "/image",
705
- swagger: { name: "Uploads", description: "Endpoints for managing Uploads" }
706
- }
346
+ // src/services/internal/config/commonConfigService.ts
347
+ var CommonConfigService = class {
348
+ _internalIsProd;
349
+ getHubApiUrl = () => this.get("VITE_HUB_API_URL");
350
+ getHubLandingUrl = () => this.get("VITE_HUB_LANDING_URL");
351
+ getHubClientUrl = () => this.get("VITE_HUB_CLIENT_URL");
352
+ getHubAdminUrl = () => this.get("VITE_HUB_ADMIN_URL");
353
+ getHubCoverageUrl = () => this.get("VITE_HUB_COVERAGE_URL");
354
+ getHubDocsUrl = () => this.get("VITE_HUB_DOCS_URL");
355
+ getHubStorybookUrl = () => this.get("VITE_HUB_STORYBOOK_URL");
356
+ getHubspotId = () => this.get("VITE_HUBSPOT_ID");
357
+ getFakeApiRequestDelay = () => this.getNumber("VITE_FAKE_API_REQUEST_DELAY");
358
+ getCaptchaEnabled = () => this.getBool("VITE_ENABLE_CAPTCHA");
359
+ getHCaptchaSecret = () => this.get("HCAPTCHA_SECRET");
360
+ getHCaptchaSiteKey = () => this.get("VITE_HCAPTCHA_SITE_KEY");
361
+ getTolgeeApiKey = () => this.get("VITE_TOLGEE_API_KEY");
362
+ getTolgeeApiUrl = () => this.get("VITE_TOLGEE_API_URL");
363
+ getTolgeeProjectId = () => this.getNumber("VITE_TOLGEE_PROJECT_ID");
364
+ /* Special case, available on UI & API */
365
+ isProd = () => {
366
+ if (this._internalIsProd == null) {
367
+ this._internalIsProd = this.get("NODE_ENV").toLocaleLowerCase() === "production" || this.get("MODE").toLocaleLowerCase() === "production";
368
+ }
369
+ return this._internalIsProd;
370
+ };
371
+ packageVersion = () => this.getWithFallback("npm_package_version", "PACKAGE_VERSION");
372
+ getConsoleLogLevels = () => {
373
+ const envVar = this.get("VITE_CONSOLE_LOGGING");
374
+ if (envVar?.length < 1) return ["trace", "log", "info", "debug", "warn", "error"];
375
+ return envVar.split(",").map((l) => l);
376
+ };
377
+ get(property, defaultValue) {
378
+ let value = void 0;
379
+ value = import.meta.env?.[property];
380
+ if (defaultValue != null) {
381
+ return value ?? defaultValue;
382
+ }
383
+ return value ?? "";
707
384
  }
385
+ getWithFallback = (property, fallbackProperty, defaultValue) => {
386
+ const orig = this.get(property);
387
+ if (orig != null) return orig;
388
+ return this.get(fallbackProperty, defaultValue);
389
+ };
390
+ getBool = (property, defaultValue) => this.get(property, defaultValue).toLowerCase() == "true";
391
+ getNumber = (property, defaultValue) => Number(this.get(property, defaultValue?.toString?.()));
708
392
  };
709
393
 
710
- // src/helpers/profileHelper.ts
711
- var getUserAvatarUrl = (userUuid) => {
712
- return `${getCommonConfig().getHubApiUrl()}${apiRoute.client.profile.prefix}/${userUuid}/profile.png`;
713
- };
714
- var getPetAvatarUrl = (petUuid) => {
715
- return `${getCommonConfig().getHubApiUrl()}${apiRoute.client.pet.prefix}/${petUuid}/profile.png`;
394
+ // src/services/internal/log/logService.ts
395
+ var LogService = class {
396
+ constructor(config, _numDaysToKeep = 100) {
397
+ this._numDaysToKeep = _numDaysToKeep;
398
+ this._logLevels = config.getConsoleLogLevels();
399
+ this._latestLogDate = addDays(/* @__PURE__ */ new Date(), -this._numDaysToKeep);
400
+ console.info("Log Levels: ", this._logLevels.join());
401
+ }
402
+ logs = [];
403
+ _logLevels;
404
+ _latestLogDate;
405
+ _logMessageToConsole = (log) => {
406
+ let logStyle = "";
407
+ switch (log.type) {
408
+ case "log":
409
+ case "info":
410
+ logStyle = "color: green; font-size: medium";
411
+ break;
412
+ case "warn":
413
+ logStyle = "color: orange; font-size: medium";
414
+ break;
415
+ case "error":
416
+ logStyle = "color: red; font-size: large";
417
+ break;
418
+ }
419
+ let messageString = `%c${log.message}`;
420
+ if ((log.optionalParams ?? []).length > 0) {
421
+ messageString += `
422
+ additional params:
423
+ ${(log.optionalParams ?? []).join("\n\r")}`;
424
+ }
425
+ if ((log.groups ?? []).length > 0) {
426
+ const groupString = (log.groups ?? []).map((g) => `[${g}]`).join();
427
+ messageString = `${groupString} - ${messageString}`;
428
+ }
429
+ const dateString = formatForDateLocalDetailed(/* @__PURE__ */ new Date());
430
+ const logFunc = console[log.type];
431
+ logFunc(`${dateString}: ${messageString}`, logStyle);
432
+ };
433
+ _track = (type, groups) => (message, ...optionalParams) => {
434
+ const log = {
435
+ type,
436
+ groups,
437
+ message,
438
+ date: /* @__PURE__ */ new Date(),
439
+ optionalParams: optionalParams.map((op) => JSON.stringify(op, null, 2))
440
+ };
441
+ this.logs = this.logs.filter((t) => t.date > this._latestLogDate);
442
+ this.logs.push(log);
443
+ if (this._logLevels.includes(log.type) === false) return;
444
+ else this._logMessageToConsole(log);
445
+ };
446
+ getLogger = (...groups) => ({
447
+ d: this._track("debug", groups),
448
+ i: this._track("info", groups),
449
+ w: this._track("warn", groups),
450
+ e: this._track("error", groups)
451
+ });
716
452
  };
717
-
718
- // src/helpers/asyncHelper.ts
719
- var timeout = (ms) => {
720
- return new Promise((resolve) => setTimeout(resolve, ms));
453
+ var dependencyInjectionSetup = (props) => {
454
+ setContainerToken(APP_TYPE, props.appType);
455
+ if (props.botPath != null) setContainerToken(BOT_PATH, props.botPath);
456
+ if (props.siteConfig != null) setContainerToken(SITE_CONFIG, props.siteConfig);
457
+ const configService = new CommonConfigService();
458
+ const logService = new LogService(configService);
459
+ setContainerToken(CommonConfigService, configService);
460
+ setContainerToken(LogService, logService);
461
+ return {
462
+ logService,
463
+ configService
464
+ };
721
465
  };
722
- var addToParallelTasks = async (tasks, newTask, numTasksInParallel = 5) => {
723
- if (tasks.length >= numTasksInParallel) {
724
- const finishedTask = Promise.any(tasks);
725
- const indexOfTask = tasks.indexOf(finishedTask);
726
- tasks.splice(indexOfTask, 1);
727
- await finishedTask;
466
+ var BOT_PATH = new Token("BOT_PATH");
467
+ var getBotPath = () => Container.get(BOT_PATH);
468
+ var APP_TYPE = new Token("APP_TYPE");
469
+ var getAppType = () => Container.get(APP_TYPE);
470
+ var SITE_CONFIG = new Token("SITE_CONFIG");
471
+ var setSiteConfig = (value) => Container.set({ id: SITE_CONFIG, value });
472
+ var getSiteConfig = () => {
473
+ try {
474
+ return Container.get(SITE_CONFIG);
475
+ } catch {
476
+ console.error("unable to get site config. Did you set the config on app startup?");
728
477
  }
729
- tasks.push(newTask);
730
- return tasks;
731
478
  };
479
+ var setContainerToken = (id, value) => Container.set({ id, value });
480
+ var getCommonConfig = () => Container.get(CommonConfigService);
481
+ var getLog = () => Container.get(LogService);
732
482
 
733
483
  // src/helpers/urlHelper.ts
734
484
  var urlRef = (url) => {
@@ -739,341 +489,296 @@ var urlRef = (url) => {
739
489
  }
740
490
  return url + `?ref=${ref}`;
741
491
  };
742
- var getPayloadFromJwt = (token) => {
743
- try {
744
- const decoded = jwtDecode(token);
745
- const timeStamp = (/* @__PURE__ */ new Date()).getTime() / 1e3;
746
- if (decoded.exp < timeStamp) {
747
- throw "JWT token expired";
748
- }
749
- return {
750
- isSuccess: true,
751
- value: ""
752
- };
753
- } catch (err) {
754
- return {
755
- isSuccess: false,
756
- errorMessage: err?.toString?.() ?? ""
757
- };
758
- }
759
- };
760
492
 
761
- // src/helpers/enumHelper.ts
762
- var getArrFromEnum = (enumType, isNan = false) => {
763
- const result = Object.values(enumType).filter((dt) => isNaN(dt) == isNan);
764
- return result;
765
- };
493
+ // src/helpers/debounceHelper.ts
494
+ function debounceLeading(fn, ms) {
495
+ let timer;
496
+ const func = (args) => new Promise((resolve) => {
497
+ if (timer) {
498
+ clearTimeout(timer);
499
+ }
500
+ timer = setTimeout(() => {
501
+ resolve(fn(args));
502
+ }, ms);
503
+ });
504
+ const destroy = () => clearTimeout(timer);
505
+ return { func, destroy };
506
+ }
766
507
 
767
- // src/constants/localStorageKeys.ts
768
- var LocalStorageKeys = {
769
- nanaHubProfile: 10
508
+ // src/helpers/hashHelper.ts
509
+ var cyrb53 = (input, seed = 0) => {
510
+ let h1 = 3735928559 ^ seed, h2 = 1103547991 ^ seed;
511
+ for (let i = 0, ch; i < input.length; i++) {
512
+ ch = input.charCodeAt(i);
513
+ h1 = Math.imul(h1 ^ ch, 2654435761);
514
+ h2 = Math.imul(h2 ^ ch, 1597334677);
515
+ }
516
+ h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507);
517
+ h1 ^= Math.imul(h2 ^ h2 >>> 13, 3266489909);
518
+ h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507);
519
+ h2 ^= Math.imul(h1 ^ h1 >>> 13, 3266489909);
520
+ return 4294967296 * (2097151 & h2) + (h1 >>> 0);
770
521
  };
771
522
 
772
- // src/constants/validation.ts
773
- var minUrlLength = 5;
774
- var portalGlyphLength = 12;
775
- var validUuidChars = [
776
- "1",
777
- "2",
778
- "3",
779
- "4",
780
- "5",
781
- "6",
782
- "7",
783
- "8",
784
- "9",
785
- "0",
786
- "A",
787
- "B",
788
- "C",
789
- "D",
790
- "E",
791
- "F"
792
- ];
793
-
794
- // src/contracts/generated/enum/appType.ts
795
- var AppType = /* @__PURE__ */ ((AppType2) => {
796
- AppType2[AppType2["Admin"] = 0] = "Admin";
797
- AppType2[AppType2["Client"] = 1] = "Client";
798
- AppType2[AppType2["Api"] = 2] = "Api";
799
- AppType2[AppType2["Test"] = 3] = "Test";
800
- AppType2[AppType2["Interactive"] = 4] = "Interactive";
801
- return AppType2;
802
- })(AppType || {});
803
- var webAppTypes = [
804
- 0 /* Admin */,
805
- //
806
- 1 /* Client */
807
- ];
808
- var isWebApp = (appType) => webAppTypes.includes(appType);
809
-
810
- // src/contracts/generated/enum/searchableColumnInfo.ts
811
- var SearchableColumnType = /* @__PURE__ */ ((SearchableColumnType2) => {
812
- SearchableColumnType2[SearchableColumnType2["STRING_ENUM"] = 0] = "STRING_ENUM";
813
- SearchableColumnType2[SearchableColumnType2["STRING_OF_ENUMS"] = 1] = "STRING_OF_ENUMS";
814
- SearchableColumnType2[SearchableColumnType2["STRING"] = 2] = "STRING";
815
- SearchableColumnType2[SearchableColumnType2["NUMBER"] = 3] = "NUMBER";
816
- SearchableColumnType2[SearchableColumnType2["BOOLEAN"] = 4] = "BOOLEAN";
817
- SearchableColumnType2[SearchableColumnType2["DATE"] = 5] = "DATE";
818
- return SearchableColumnType2;
819
- })(SearchableColumnType || {});
820
-
821
- // src/contracts/generated/enum/petStatusType.ts
822
- var PetStatusType = /* @__PURE__ */ ((PetStatusType2) => {
823
- PetStatusType2[PetStatusType2["Unknown"] = 0] = "Unknown";
824
- PetStatusType2[PetStatusType2["Active"] = 1] = "Active";
825
- PetStatusType2[PetStatusType2["Deceased"] = 2] = "Deceased";
826
- PetStatusType2[PetStatusType2["Blacklisted"] = 3] = "Blacklisted";
827
- return PetStatusType2;
828
- })(PetStatusType || {});
829
-
830
- // src/contracts/generated/enum/petType.ts
831
- var PetType = /* @__PURE__ */ ((PetType2) => {
832
- PetType2[PetType2["Unknown"] = 0] = "Unknown";
833
- PetType2[PetType2["Dog"] = 1] = "Dog";
834
- PetType2[PetType2["Cat"] = 2] = "Cat";
835
- return PetType2;
836
- })(PetType || {});
837
-
838
- // src/contracts/generated/enum/bookingAddonType.ts
839
- var BookingAddonType = /* @__PURE__ */ ((BookingAddonType2) => {
840
- BookingAddonType2[BookingAddonType2["None"] = 0] = "None";
841
- BookingAddonType2[BookingAddonType2["PetTaxi"] = 1] = "PetTaxi";
842
- return BookingAddonType2;
843
- })(BookingAddonType || {});
844
-
845
- // src/contracts/generated/enum/addressLinkType.ts
846
- var AddressLinkType = /* @__PURE__ */ ((AddressLinkType2) => {
847
- AddressLinkType2[AddressLinkType2["Unknown"] = 0] = "Unknown";
848
- AddressLinkType2[AddressLinkType2["User"] = 1] = "User";
849
- return AddressLinkType2;
850
- })(AddressLinkType || {});
523
+ // src/helpers/enumHelper.ts
524
+ var getArrFromEnum = (enumType, isNan = false) => {
525
+ const result = Object.values(enumType).filter((dt) => isNaN(dt) == isNan);
526
+ return result;
527
+ };
851
528
 
852
- // src/contracts/generated/enum/petSexType.ts
853
- var PetSexType = /* @__PURE__ */ ((PetSexType2) => {
854
- PetSexType2[PetSexType2["Other"] = 0] = "Other";
855
- PetSexType2[PetSexType2["Male"] = 1] = "Male";
856
- PetSexType2[PetSexType2["Female"] = 2] = "Female";
857
- return PetSexType2;
858
- })(PetSexType || {});
529
+ // src/helpers/eventHelper.ts
530
+ var onTargetValue = (funcOnEvent) => (event) => {
531
+ const value = event.target?.value;
532
+ if (value == null) return;
533
+ funcOnEvent(value);
534
+ };
535
+ var onTargetChecked = (funcOnEvent) => (event) => {
536
+ const value = event.target?.checked;
537
+ if (value == null) return;
538
+ funcOnEvent(value);
539
+ };
540
+ var onTargetFiles = (funcOnEvent) => (event) => {
541
+ const fileList = event.target.files;
542
+ if (fileList == null || fileList.length < 1) return;
543
+ funcOnEvent(fileList);
544
+ };
545
+ var preventDefault = (event) => {
546
+ event?.preventDefault?.();
547
+ return event;
548
+ };
549
+ var stopPropagation = (event) => {
550
+ event?.stopPropagation?.();
551
+ return event;
552
+ };
859
553
 
860
- // src/contracts/generated/enum/membershipType.ts
861
- var MembershipType = /* @__PURE__ */ ((MembershipType2) => {
862
- MembershipType2[MembershipType2["None"] = 0] = "None";
863
- MembershipType2[MembershipType2["Club"] = 1] = "Club";
864
- MembershipType2[MembershipType2["ClubPlus"] = 2] = "ClubPlus";
865
- return MembershipType2;
866
- })(MembershipType || {});
554
+ // src/helpers/performanceHelper.ts
555
+ var getPerformanceTimer = () => ({
556
+ start: performance.now(),
557
+ getTimeElapsed: (start) => performance.now() - start
558
+ });
867
559
 
868
- // src/contracts/generated/enum/answerLinkType.ts
869
- var AnswerLinkType = /* @__PURE__ */ ((AnswerLinkType2) => {
870
- AnswerLinkType2[AnswerLinkType2["Unknown"] = 0] = "Unknown";
871
- AnswerLinkType2[AnswerLinkType2["User"] = 1] = "User";
872
- AnswerLinkType2[AnswerLinkType2["Pet"] = 2] = "Pet";
873
- return AnswerLinkType2;
874
- })(AnswerLinkType || {});
560
+ // src/helpers/randomHelper.ts
561
+ var randomIntFromRange = (min, max) => {
562
+ return Math.floor(Math.random() * (max - min) + min);
563
+ };
564
+ var randomItemFromArray = (items) => {
565
+ const randomIndex = randomIntFromRange(0, items.length);
566
+ return items[randomIndex];
567
+ };
875
568
 
876
- // src/contracts/generated/enum/uploadLinkType.ts
877
- var UploadLinkType = /* @__PURE__ */ ((UploadLinkType2) => {
878
- UploadLinkType2[UploadLinkType2["Unknown"] = 0] = "Unknown";
879
- UploadLinkType2[UploadLinkType2["User"] = 1] = "User";
880
- UploadLinkType2[UploadLinkType2["Pet"] = 2] = "Pet";
881
- return UploadLinkType2;
882
- })(UploadLinkType || {});
883
- var UploadType = /* @__PURE__ */ ((UploadType2) => {
884
- UploadType2[UploadType2["Unknown"] = 0] = "Unknown";
885
- UploadType2[UploadType2["UserProfilePic"] = 5] = "UserProfilePic";
886
- UploadType2[UploadType2["PetProfilePic"] = 10] = "PetProfilePic";
887
- UploadType2[UploadType2["PetExtraPic"] = 11] = "PetExtraPic";
888
- UploadType2[UploadType2["HomePhoto"] = 20] = "HomePhoto";
889
- return UploadType2;
890
- })(UploadType || {});
891
- var uploadsThatNeedEncryption = [];
569
+ // src/helpers/propHelper.ts
570
+ function nameof(key1, key2) {
571
+ return key2 ?? key1;
572
+ }
892
573
 
893
- // src/contracts/generated/enum/activityType.ts
894
- var ActivityType = /* @__PURE__ */ ((ActivityType2) => {
895
- ActivityType2[ActivityType2["Unknown"] = 0] = "Unknown";
896
- ActivityType2[ActivityType2["Create"] = 1] = "Create";
897
- ActivityType2[ActivityType2["Read"] = 2] = "Read";
898
- ActivityType2[ActivityType2["Update"] = 3] = "Update";
899
- ActivityType2[ActivityType2["Delete"] = 4] = "Delete";
900
- return ActivityType2;
901
- })(ActivityType || {});
574
+ // src/helpers/imageHelper.ts
575
+ var getImageParams = (file) => {
576
+ const fileExtension = file.name?.split?.(".")?.pop?.() ?? ".png";
577
+ return new Promise((resolve, reject) => {
578
+ const reader = new FileReader();
579
+ reader.onload = async (e) => {
580
+ const image = new Image();
581
+ if (e.target == null || e.target.result == null) {
582
+ reject("e.target.result is null");
583
+ return;
584
+ }
585
+ image.src = e.target.result;
586
+ await image.decode();
587
+ resolve({
588
+ name: file.name,
589
+ type: file.type,
590
+ width: image.width,
591
+ height: image.height,
592
+ fileSize: file.size,
593
+ fileExtension
594
+ });
595
+ };
596
+ reader.onerror = (e) => reject(e);
597
+ reader.readAsDataURL(file);
598
+ });
599
+ };
902
600
 
903
- // src/contracts/generated/enum/userType.ts
904
- var UserType = /* @__PURE__ */ ((UserType2) => {
905
- UserType2[UserType2["Unknown"] = 0] = "Unknown";
906
- UserType2[UserType2["Owner"] = 1] = "Owner";
907
- UserType2[UserType2["Host"] = 2] = "Host";
908
- UserType2[UserType2["Driver"] = 3] = "Driver";
909
- UserType2[UserType2["Admin"] = 50] = "Admin";
910
- UserType2[UserType2["BotToken"] = 99] = "BotToken";
911
- return UserType2;
912
- })(UserType || {});
601
+ // src/helpers/guidHelper.ts
602
+ var uuidv4 = () => {
603
+ var d = (/* @__PURE__ */ new Date()).getTime();
604
+ var d2 = typeof performance !== "undefined" && performance.now && performance.now() * 1e3 || 0;
605
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
606
+ var r = Math.random() * 16;
607
+ if (d > 0) {
608
+ r = (d + r) % 16 | 0;
609
+ d = Math.floor(d / 16);
610
+ } else {
611
+ r = (d2 + r) % 16 | 0;
612
+ d2 = Math.floor(d2 / 16);
613
+ }
614
+ return (c === "x" ? r : r & 3 | 8).toString(16);
615
+ });
616
+ };
617
+ var getPayloadFromJwt = (token) => {
618
+ try {
619
+ const decoded = jwtDecode(token);
620
+ const timeStamp = (/* @__PURE__ */ new Date()).getTime() / 1e3;
621
+ if (decoded.exp < timeStamp) {
622
+ throw "JWT token expired";
623
+ }
624
+ return {
625
+ isSuccess: true,
626
+ value: ""
627
+ };
628
+ } catch (err) {
629
+ return {
630
+ isSuccess: false,
631
+ errorMessage: err?.toString?.() ?? ""
632
+ };
633
+ }
634
+ };
913
635
 
914
- // src/contracts/generated/enum/commentLinkType.ts
915
- var CommentLinkType = /* @__PURE__ */ ((CommentLinkType2) => {
916
- CommentLinkType2[CommentLinkType2["Unknown"] = 0] = "Unknown";
917
- CommentLinkType2[CommentLinkType2["User"] = 1] = "User";
918
- CommentLinkType2[CommentLinkType2["Pet"] = 2] = "Pet";
919
- CommentLinkType2[CommentLinkType2["Booking"] = 3] = "Booking";
920
- return CommentLinkType2;
921
- })(CommentLinkType || {});
922
-
923
- // src/contracts/generated/enum/userAccountFlagType.ts
924
- var UserAccountFlagType = /* @__PURE__ */ ((UserAccountFlagType2) => {
925
- UserAccountFlagType2[UserAccountFlagType2["Unknown"] = 0] = "Unknown";
926
- UserAccountFlagType2[UserAccountFlagType2["ChangePassword"] = 1] = "ChangePassword";
927
- return UserAccountFlagType2;
928
- })(UserAccountFlagType || {});
929
-
930
- // src/contracts/generated/enum/membershipStatus.ts
931
- var MembershipStatus = /* @__PURE__ */ ((MembershipStatus2) => {
932
- MembershipStatus2[MembershipStatus2["Unknown"] = 0] = "Unknown";
933
- MembershipStatus2[MembershipStatus2["Active"] = 1] = "Active";
934
- MembershipStatus2[MembershipStatus2["PendingPayment"] = 2] = "PendingPayment";
935
- MembershipStatus2[MembershipStatus2["Paused"] = 5] = "Paused";
936
- MembershipStatus2[MembershipStatus2["Cancelled"] = 10] = "Cancelled";
937
- MembershipStatus2[MembershipStatus2["Removed"] = 11] = "Removed";
938
- return MembershipStatus2;
939
- })(MembershipStatus || {});
940
-
941
- // src/contracts/generated/enum/questionType.ts
942
- var QuestionType = /* @__PURE__ */ ((QuestionType2) => {
943
- QuestionType2[QuestionType2["Unknown"] = 0] = "Unknown";
944
- QuestionType2[QuestionType2["ShortText"] = 1] = "ShortText";
945
- QuestionType2[QuestionType2["LongText"] = 2] = "LongText";
946
- QuestionType2[QuestionType2["YesNo"] = 3] = "YesNo";
947
- QuestionType2[QuestionType2["YesNoUnknown"] = 4] = "YesNoUnknown";
948
- QuestionType2[QuestionType2["StarRating5"] = 5] = "StarRating5";
949
- return QuestionType2;
950
- })(QuestionType || {});
951
- var QuestionForType = /* @__PURE__ */ ((QuestionForType2) => {
952
- QuestionForType2[QuestionForType2["Unknown"] = 0] = "Unknown";
953
- QuestionForType2[QuestionForType2["Host"] = 1] = "Host";
954
- QuestionForType2[QuestionForType2["Owner"] = 2] = "Owner";
955
- QuestionForType2[QuestionForType2["Pet"] = 3] = "Pet";
956
- return QuestionForType2;
957
- })(QuestionForType || {});
958
-
959
- // src/contracts/generated/enum/bookingStatus.ts
960
- var BookingStatusType = /* @__PURE__ */ ((BookingStatusType2) => {
961
- BookingStatusType2[BookingStatusType2["Pending"] = 0] = "Pending";
962
- BookingStatusType2[BookingStatusType2["Cancelled"] = 1] = "Cancelled";
963
- BookingStatusType2[BookingStatusType2["FindPlacement"] = 2] = "FindPlacement";
964
- BookingStatusType2[BookingStatusType2["Request"] = 3] = "Request";
965
- BookingStatusType2[BookingStatusType2["PaidWithHostMatch"] = 4] = "PaidWithHostMatch";
966
- BookingStatusType2[BookingStatusType2["Complete"] = 5] = "Complete";
967
- BookingStatusType2[BookingStatusType2["CompleteWithHostFeedback"] = 6] = "CompleteWithHostFeedback";
968
- return BookingStatusType2;
969
- })(BookingStatusType || {});
970
-
971
- // src/contracts/generated/enum/networkState.ts
972
- var NetworkState = /* @__PURE__ */ ((NetworkState2) => {
973
- NetworkState2[NetworkState2["Pending"] = 0] = "Pending";
974
- NetworkState2[NetworkState2["Loading"] = 1] = "Loading";
975
- NetworkState2[NetworkState2["Success"] = 2] = "Success";
976
- NetworkState2[NetworkState2["Error"] = 3] = "Error";
977
- return NetworkState2;
978
- })(NetworkState || {});
979
-
980
- // src/contracts/generated/enum/orderDirectionType.ts
981
- var OrderDirectionType = /* @__PURE__ */ ((OrderDirectionType2) => {
982
- OrderDirectionType2["ASC"] = "ASC";
983
- OrderDirectionType2["DESC"] = "DESC";
984
- return OrderDirectionType2;
985
- })(OrderDirectionType || {});
986
-
987
- // src/contracts/generated/searchColumns.ts
988
- var searchColumns = {
989
- pet: [{ "property": "type", "type": 1 }, { "property": "sex", "type": 2 }, { "property": "breed", "type": 2 }, { "property": "neutered", "type": 2 }, { "property": "name", "type": 2 }, { "property": "notes", "type": 2 }, { "property": "dateOfBirth", "type": 5 }],
990
- 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 }],
991
- address: [{ "property": "name", "type": 2 }, { "property": "street", "type": 2 }, { "property": "city", "type": 2 }, { "property": "postalCode", "type": 2 }, { "property": "country", "type": 2 }],
992
- user: [{ "property": "types", "type": 1 }, { "property": "firstName", "type": 2 }, { "property": "lastName", "type": 2 }, { "property": "email", "type": 2 }, { "property": "hubspotId", "type": 2 }, { "property": "flags", "type": 1 }, { "property": "dateCreated", "type": 5 }],
993
- question: [{ "property": "forTypes", "type": 1 }, { "property": "transKey", "type": 2 }, { "property": "fallback", "type": 2 }, { "property": "type", "type": 0 }, { "property": "sortOrder", "type": 3 }, { "property": "visible", "type": 4 }, { "property": "notes", "type": 2 }],
994
- booking: [{ "property": "startDate", "type": 5 }, { "property": "endDate", "type": 5 }, { "property": "status", "type": 2 }, { "property": "notes", "type": 2 }]
995
- };
996
-
997
- // src/contracts/generated/restrictions/addressRestriction.ts
998
- var AddressRestriction = {
999
- name: { minLength: 3, maxLength: 50 },
1000
- street: { minLength: 3, maxLength: 150 },
1001
- city: { minLength: 3, maxLength: 80 },
1002
- postalCode: { minLength: 3, maxLength: 20 },
1003
- country: { minLength: 3, maxLength: 100 },
1004
- notes: { minLength: 0, maxLength: 1e3 }
1005
- };
1006
-
1007
- // src/contracts/generated/restrictions/petRestriction.ts
1008
- var PetRestriction = {
1009
- name: { minLength: 3, maxLength: 80 },
1010
- breed: { minLength: 3, maxLength: 80 },
1011
- notes: { minLength: 0, maxLength: 1e3 }
1012
- };
1013
-
1014
- // src/contracts/generated/restrictions/commentRestriction.ts
1015
- var CommentRestriction = {
1016
- name: { maxLength: 80 },
1017
- comment: { maxLength: 1e3 }
1018
- };
1019
-
1020
- // src/contracts/generated/restrictions/userRestriction.ts
1021
- var UserRestriction = {
1022
- firstName: { minLength: 3, maxLength: 80 },
1023
- lastName: { minLength: 3, maxLength: 80 },
1024
- email: { minLength: 5, maxLength: 150 },
1025
- password: { minLength: 5, maxLength: 50 },
1026
- hubspotId: { maxLength: 50 },
1027
- flags: { maxLength: 150 }
1028
- };
1029
-
1030
- // src/contracts/generated/restrictions/activityRestriction.ts
1031
- var ActivityRestriction = {
1032
- details: { maxLength: 500 }
1033
- };
1034
-
1035
- // src/contracts/generated/restrictions/uploadRestriction.ts
1036
- var UploadRestriction = {
1037
- fileName: { minLength: 3, maxLength: 150 },
1038
- blobType: { minLength: 1, maxLength: 50 }
1039
- };
1040
-
1041
- // src/contracts/generated/restrictions/permissionRestriction.ts
1042
- var PermissionRestriction = {
1043
- name: { maxLength: 50 }
1044
- };
1045
-
1046
- // src/contracts/generated/restrictions/answerRestriction.ts
1047
- var AnswerRestriction = {
1048
- answer: { minLength: 1, maxLength: 500 },
1049
- notes: { minLength: 0, maxLength: 1e3 }
636
+ // src/contracts/generated/apiRoute.ts
637
+ var apiParams = {
638
+ general: {
639
+ segment: "segment"
640
+ },
641
+ user: {
642
+ id: "id"
643
+ }
1050
644
  };
1051
-
1052
- // src/contracts/generated/restrictions/questionRestriction.ts
1053
- var QuestionRestriction = {
1054
- transKey: { minLength: 3, maxLength: 50 },
1055
- fallback: { minLength: 1, maxLength: 500 },
1056
- forTypes: { minLength: 0, maxLength: 100 },
1057
- notes: { minLength: 0, maxLength: 1e3 }
645
+ var apiRoute = {
646
+ home: "/",
647
+ swagger: "/swagger",
648
+ common: {
649
+ auth: {
650
+ prefix: "/auth",
651
+ devJwt: "/jwt",
652
+ login: "/login",
653
+ signup: "/signup",
654
+ swagger: { name: "Auth", description: "Endpoints for login, sign up etc" },
655
+ token: {
656
+ prefix: "/token",
657
+ swagger: { name: "AuthToken", description: "Endpoints for creating an API token" }
658
+ }
659
+ },
660
+ version: "/version"
661
+ },
662
+ admin: {
663
+ activity: {
664
+ prefix: "/admin/activity",
665
+ swagger: {
666
+ name: "Activity",
667
+ description: "Endpoints for retrieving and managing activities"
668
+ }
669
+ },
670
+ address: {
671
+ prefix: "/admin/address",
672
+ byLink: "/link",
673
+ lookup: "/lookup",
674
+ swagger: { name: "Addresses", description: "Endpoints for managing addresses" }
675
+ },
676
+ answer: {
677
+ prefix: "/admin/answer",
678
+ swagger: { name: "Answers", description: "Endpoints for managing answers to signup questions" }
679
+ },
680
+ booking: {
681
+ prefix: "/admin/booking",
682
+ byUser: "/user",
683
+ swagger: { name: "Bookings", description: "Endpoints for managing bookings" }
684
+ },
685
+ comment: {
686
+ prefix: "/admin/comment",
687
+ byLink: "/link",
688
+ swagger: { name: "Comments", description: "Endpoints for managing Comments" }
689
+ },
690
+ membership: {
691
+ prefix: "/admin/membership",
692
+ swagger: { name: "Memberships", description: "Endpoints for managing Memberships" }
693
+ },
694
+ pet: {
695
+ prefix: "/admin/pet",
696
+ byUser: "/user",
697
+ swagger: { name: "Pets", description: "Endpoints for managing Pets" }
698
+ },
699
+ question: {
700
+ prefix: "/admin/question",
701
+ swagger: {
702
+ name: "Questions",
703
+ description: "Endpoints for managing questions that users need to answer in order to complete their profiles"
704
+ }
705
+ },
706
+ upload: {
707
+ prefix: "/admin/upload",
708
+ viewRaw: "/view-raw",
709
+ image: "/image",
710
+ swagger: { name: "Uploads", description: "Endpoints for managing Uploads" }
711
+ },
712
+ user: {
713
+ prefix: "/admin/user",
714
+ swagger: { name: "Users", description: "Endpoints for Admins to manage Users" }
715
+ },
716
+ userMembership: {
717
+ prefix: "/admin/user-membership",
718
+ byUser: "/user",
719
+ swagger: { name: "UserMemberships", description: "Endpoints for managing User's Memberships" }
720
+ },
721
+ userPermission: {
722
+ prefix: "/admin/user-permission",
723
+ swagger: { name: "UserPermissions", description: "Endpoints for getting and managing user permissions." }
724
+ }
725
+ },
726
+ client: {
727
+ answer: {
728
+ prefix: "/answer",
729
+ forProfile: "/profile",
730
+ forPet: "/pet",
731
+ swagger: { name: "Answers", description: "Endpoints for managing answers to signup questions" }
732
+ },
733
+ booking: {
734
+ prefix: "/booking",
735
+ swagger: { name: "Bookings", description: "Endpoints for User to manage their Bookings" }
736
+ },
737
+ membership: {
738
+ prefix: "/membership",
739
+ swagger: { name: "MembershipTiers", description: "Endpoints for public TierMemberships" }
740
+ },
741
+ pet: {
742
+ prefix: "/pet",
743
+ swagger: { name: "Pets", description: "Endpoints for User to manage their Pets" }
744
+ },
745
+ profile: {
746
+ prefix: "/profile",
747
+ avatar: "/avatar",
748
+ answers: "/answers",
749
+ swagger: { name: "Profile", description: "Endpoints for User to manage their Profile" }
750
+ },
751
+ upload: {
752
+ prefix: "/upload",
753
+ image: "/image",
754
+ swagger: { name: "Uploads", description: "Endpoints for managing Uploads" }
755
+ }
756
+ }
1058
757
  };
1059
758
 
1060
- // src/contracts/generated/restrictions/drivingRouteRestriction.ts
1061
- var DrivingRouteRestriction = {
1062
- notes: { maxLength: 500 }
759
+ // src/helpers/profileHelper.ts
760
+ var getUserAvatarUrl = (userUuid) => {
761
+ return `${getCommonConfig().getHubApiUrl()}${apiRoute.client.profile.prefix}/${userUuid}/profile.png`;
1063
762
  };
1064
-
1065
- // src/contracts/generated/restrictions/unavailabilityRestriction.ts
1066
- var UnavailabilityRestriction = {
1067
- notes: { maxLength: 500 }
763
+ var getPetAvatarUrl = (petUuid) => {
764
+ return `${getCommonConfig().getHubApiUrl()}${apiRoute.client.pet.prefix}/${petUuid}/profile.png`;
1068
765
  };
1069
766
 
1070
- // src/contracts/generated/restrictions/bookingRestriction.ts
1071
- var BookingRestriction = {
1072
- notes: { maxLength: 250 }
1073
- };
1074
- var BookingAddonRestriction = {
1075
- notes: { maxLength: 250 }
1076
- };
767
+ // src/contracts/generated/enum/appType.ts
768
+ var AppType = /* @__PURE__ */ ((AppType2) => {
769
+ AppType2[AppType2["Admin"] = 0] = "Admin";
770
+ AppType2[AppType2["Client"] = 1] = "Client";
771
+ AppType2[AppType2["Api"] = 2] = "Api";
772
+ AppType2[AppType2["Test"] = 3] = "Test";
773
+ AppType2[AppType2["Interactive"] = 4] = "Interactive";
774
+ return AppType2;
775
+ })(AppType || {});
776
+ var webAppTypes = [
777
+ 0 /* Admin */,
778
+ //
779
+ 1 /* Client */
780
+ ];
781
+ var isWebApp = (appType) => webAppTypes.includes(appType);
1077
782
 
1078
783
  // src/validation/baseValidation.ts
1079
784
  var noValidation = (_) => ({ isValid: true });
@@ -1112,6 +817,101 @@ var validateForEach = (validation) => (values) => {
1112
817
  return { isValid: true };
1113
818
  };
1114
819
 
820
+ // src/validation/textValidation.ts
821
+ var minLength = (minLengthVal) => (value) => {
822
+ if ((value?.length ?? 0) >= minLengthVal) {
823
+ return { isValid: true };
824
+ }
825
+ return {
826
+ isValid: false,
827
+ errorMessageTransKey: "min_length_validator",
828
+ errorMessageParams: { count: minLengthVal },
829
+ errorMessage: `Minimum length required is {count}`
830
+ };
831
+ };
832
+ var maxLength = (maxLengthVal) => (value) => {
833
+ if ((value?.length ?? 0) <= maxLengthVal) {
834
+ return { isValid: true };
835
+ }
836
+ return {
837
+ isValid: false,
838
+ errorMessageTransKey: "max_length_validator",
839
+ errorMessageParams: { count: maxLengthVal },
840
+ errorMessage: `Text is too long! Maximum length allowed is {count}`
841
+ };
842
+ };
843
+ var shouldBeUrl = (value) => {
844
+ const validationFailures = [];
845
+ const safeValue = `${value}`;
846
+ const numPeriods = safeValue.split("").filter((c) => c === ".").length;
847
+ const isLastCharPeriod = safeValue[safeValue.length - 1] === ".";
848
+ if (numPeriods < 1 || isLastCharPeriod) {
849
+ validationFailures.push("Should have at least one period in a sensible location.");
850
+ }
851
+ if (validationFailures.length > 0) {
852
+ return {
853
+ isValid: false,
854
+ errorMessageTransKey: "link_validator",
855
+ errorMessageParams: { current: value },
856
+ errorMessage: `Should be a valid link/url. ({current}) does not meet the requirements: ${validationFailures.join(
857
+ ". "
858
+ )}.`
859
+ };
860
+ }
861
+ return { isValid: true };
862
+ };
863
+ var shouldBeYoutubeUrl = (value) => {
864
+ const safeValue = `${value}`;
865
+ const youtubePartialUrl = "https://www.youtube.com/watch?v=";
866
+ if (safeValue.includes(youtubePartialUrl)) {
867
+ return { isValid: true };
868
+ }
869
+ return {
870
+ isValid: false,
871
+ errorMessageTransKey: "youtube_url_validator",
872
+ errorMessageParams: { startUrl: youtubePartialUrl },
873
+ errorMessage: `Youtube url should start with {startUrl}`
874
+ };
875
+ };
876
+
877
+ // src/validation/dateValidation.ts
878
+ var minDate = (minDate2) => (value) => {
879
+ if (isBefore(minDate2, value)) {
880
+ return { isValid: true };
881
+ }
882
+ return {
883
+ isValid: false,
884
+ errorMessageTransKey: "min_date_validator",
885
+ errorMessageParams: { date: formatDate(minDate2, "DD MMM YY") },
886
+ errorMessage: "Minimum date is {date}"
887
+ };
888
+ };
889
+ var maxDate = (maxDate2) => (value) => {
890
+ if (isBefore(value, maxDate2)) {
891
+ return { isValid: true };
892
+ }
893
+ return {
894
+ isValid: false,
895
+ errorMessageTransKey: "max_date_validator",
896
+ errorMessageParams: { date: formatDate(maxDate2, "DD MMM YY") },
897
+ errorMessage: "Maximum date is {date}"
898
+ };
899
+ };
900
+
901
+ // src/validation/numberValidation.ts
902
+ var isNumber = (value) => {
903
+ if (value != null) {
904
+ if (isNaN(Number(value)) == false) {
905
+ return { isValid: true };
906
+ }
907
+ }
908
+ return {
909
+ isValid: false,
910
+ errorMessageTransKey: "is_number_validator",
911
+ errorMessage: `Must be a number`
912
+ };
913
+ };
914
+
1115
915
  // src/validation/arrayValidation.ts
1116
916
  var minItems = (minLength2) => (values) => {
1117
917
  const safeArr = makeArrayOrDefault(values);
@@ -1175,99 +975,299 @@ var selectedOptionIsInEnum = (enumType) => (values) => {
1175
975
  return { isValid: true };
1176
976
  };
1177
977
 
1178
- // src/validation/textValidation.ts
1179
- var minLength = (minLengthVal) => (value) => {
1180
- if ((value?.length ?? 0) >= minLengthVal) {
1181
- return { isValid: true };
1182
- }
1183
- return {
1184
- isValid: false,
1185
- errorMessageTransKey: "min_length_validator",
1186
- errorMessageParams: { count: minLengthVal },
1187
- errorMessage: `Minimum length required is {count}`
1188
- };
978
+ // src/constants/localStorageKeys.ts
979
+ var LocalStorageKeys = {
980
+ nanaHubProfile: 10
1189
981
  };
1190
- var maxLength = (maxLengthVal) => (value) => {
1191
- if ((value?.length ?? 0) <= maxLengthVal) {
1192
- return { isValid: true };
1193
- }
1194
- return {
1195
- isValid: false,
1196
- errorMessageTransKey: "max_length_validator",
1197
- errorMessageParams: { count: maxLengthVal },
1198
- errorMessage: `Text is too long! Maximum length allowed is {count}`
1199
- };
982
+
983
+ // src/constants/validation.ts
984
+ var minUrlLength = 5;
985
+ var portalGlyphLength = 12;
986
+ var validUuidChars = [
987
+ "1",
988
+ "2",
989
+ "3",
990
+ "4",
991
+ "5",
992
+ "6",
993
+ "7",
994
+ "8",
995
+ "9",
996
+ "0",
997
+ "A",
998
+ "B",
999
+ "C",
1000
+ "D",
1001
+ "E",
1002
+ "F"
1003
+ ];
1004
+
1005
+ // src/contracts/generated/restrictions/drivingRouteRestriction.ts
1006
+ var DrivingRouteRestriction = {
1007
+ notes: { maxLength: 500 }
1200
1008
  };
1201
- var shouldBeUrl = (value) => {
1202
- const validationFailures = [];
1203
- const safeValue = `${value}`;
1204
- const numPeriods = safeValue.split("").filter((c) => c === ".").length;
1205
- const isLastCharPeriod = safeValue[safeValue.length - 1] === ".";
1206
- if (numPeriods < 1 || isLastCharPeriod) {
1207
- validationFailures.push("Should have at least one period in a sensible location.");
1208
- }
1209
- if (validationFailures.length > 0) {
1210
- return {
1211
- isValid: false,
1212
- errorMessageTransKey: "link_validator",
1213
- errorMessageParams: { current: value },
1214
- errorMessage: `Should be a valid link/url. ({current}) does not meet the requirements: ${validationFailures.join(
1215
- ". "
1216
- )}.`
1217
- };
1218
- }
1219
- return { isValid: true };
1009
+
1010
+ // src/contracts/generated/restrictions/questionRestriction.ts
1011
+ var QuestionRestriction = {
1012
+ transKey: { minLength: 3, maxLength: 50 },
1013
+ fallback: { minLength: 1, maxLength: 500 },
1014
+ forTypes: { minLength: 0, maxLength: 100 },
1015
+ notes: { minLength: 0, maxLength: 1e3 }
1016
+ };
1017
+
1018
+ // src/contracts/generated/restrictions/uploadRestriction.ts
1019
+ var UploadRestriction = {
1020
+ fileName: { minLength: 3, maxLength: 150 },
1021
+ blobType: { minLength: 1, maxLength: 50 }
1022
+ };
1023
+
1024
+ // src/contracts/generated/restrictions/userRestriction.ts
1025
+ var UserRestriction = {
1026
+ firstName: { minLength: 3, maxLength: 80 },
1027
+ lastName: { minLength: 3, maxLength: 80 },
1028
+ email: { minLength: 5, maxLength: 150 },
1029
+ password: { minLength: 5, maxLength: 50 },
1030
+ hubspotId: { maxLength: 50 },
1031
+ flags: { maxLength: 150 }
1032
+ };
1033
+
1034
+ // src/contracts/generated/restrictions/activityRestriction.ts
1035
+ var ActivityRestriction = {
1036
+ details: { maxLength: 500 }
1037
+ };
1038
+
1039
+ // src/contracts/generated/restrictions/unavailabilityRestriction.ts
1040
+ var UnavailabilityRestriction = {
1041
+ notes: { maxLength: 500 }
1042
+ };
1043
+
1044
+ // src/contracts/generated/restrictions/bookingRestriction.ts
1045
+ var BookingRestriction = {
1046
+ notes: { maxLength: 250 }
1047
+ };
1048
+ var BookingAddonRestriction = {
1049
+ notes: { maxLength: 250 }
1050
+ };
1051
+
1052
+ // src/contracts/generated/restrictions/commentRestriction.ts
1053
+ var CommentRestriction = {
1054
+ name: { maxLength: 80 },
1055
+ comment: { maxLength: 1e3 }
1220
1056
  };
1221
- var shouldBeYoutubeUrl = (value) => {
1222
- const safeValue = `${value}`;
1223
- const youtubePartialUrl = "https://www.youtube.com/watch?v=";
1224
- if (safeValue.includes(youtubePartialUrl)) {
1225
- return { isValid: true };
1226
- }
1227
- return {
1228
- isValid: false,
1229
- errorMessageTransKey: "youtube_url_validator",
1230
- errorMessageParams: { startUrl: youtubePartialUrl },
1231
- errorMessage: `Youtube url should start with {startUrl}`
1232
- };
1057
+
1058
+ // src/contracts/generated/restrictions/petRestriction.ts
1059
+ var PetRestriction = {
1060
+ name: { minLength: 3, maxLength: 80 },
1061
+ breed: { minLength: 3, maxLength: 80 },
1062
+ notes: { minLength: 0, maxLength: 1e3 }
1233
1063
  };
1234
1064
 
1235
- // src/validation/numberValidation.ts
1236
- var isNumber = (value) => {
1237
- if (value != null) {
1238
- if (isNaN(Number(value)) == false) {
1239
- return { isValid: true };
1240
- }
1241
- }
1242
- return {
1243
- isValid: false,
1244
- errorMessageTransKey: "is_number_validator",
1245
- errorMessage: `Must be a number`
1246
- };
1065
+ // src/contracts/generated/restrictions/answerRestriction.ts
1066
+ var AnswerRestriction = {
1067
+ answer: { minLength: 1, maxLength: 500 },
1068
+ notes: { minLength: 0, maxLength: 1e3 }
1247
1069
  };
1248
1070
 
1249
- // src/validation/dateValidation.ts
1250
- var minDate = (minDate2) => (value) => {
1251
- if (isBefore(minDate2, value)) {
1252
- return { isValid: true };
1253
- }
1254
- return {
1255
- isValid: false,
1256
- errorMessageTransKey: "min_date_validator",
1257
- errorMessageParams: { date: formatDate(minDate2, "DD MMM YY") },
1258
- errorMessage: "Minimum date is {date}"
1259
- };
1071
+ // src/contracts/generated/restrictions/permissionRestriction.ts
1072
+ var PermissionRestriction = {
1073
+ name: { maxLength: 50 }
1260
1074
  };
1261
- var maxDate = (maxDate2) => (value) => {
1262
- if (isBefore(value, maxDate2)) {
1263
- return { isValid: true };
1264
- }
1265
- return {
1266
- isValid: false,
1267
- errorMessageTransKey: "max_date_validator",
1268
- errorMessageParams: { date: formatDate(maxDate2, "DD MMM YY") },
1269
- errorMessage: "Maximum date is {date}"
1270
- };
1075
+
1076
+ // src/contracts/generated/restrictions/addressRestriction.ts
1077
+ var AddressRestriction = {
1078
+ name: { minLength: 3, maxLength: 50 },
1079
+ street: { minLength: 3, maxLength: 150 },
1080
+ city: { minLength: 3, maxLength: 80 },
1081
+ postalCode: { minLength: 3, maxLength: 20 },
1082
+ country: { minLength: 3, maxLength: 100 },
1083
+ notes: { minLength: 0, maxLength: 1e3 }
1084
+ };
1085
+
1086
+ // src/contracts/generated/searchColumns.ts
1087
+ var searchColumns = {
1088
+ pet: [{ "property": "type", "type": 1 }, { "property": "sex", "type": 2 }, { "property": "breed", "type": 2 }, { "property": "neutered", "type": 2 }, { "property": "name", "type": 2 }, { "property": "notes", "type": 2 }, { "property": "dateOfBirth", "type": 5 }],
1089
+ 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 }],
1090
+ address: [{ "property": "name", "type": 2 }, { "property": "street", "type": 2 }, { "property": "city", "type": 2 }, { "property": "postalCode", "type": 2 }, { "property": "country", "type": 2 }],
1091
+ user: [{ "property": "types", "type": 1 }, { "property": "firstName", "type": 2 }, { "property": "lastName", "type": 2 }, { "property": "email", "type": 2 }, { "property": "hubspotId", "type": 2 }, { "property": "flags", "type": 1 }, { "property": "dateCreated", "type": 5 }],
1092
+ question: [{ "property": "forTypes", "type": 1 }, { "property": "transKey", "type": 2 }, { "property": "fallback", "type": 2 }, { "property": "type", "type": 0 }, { "property": "sortOrder", "type": 3 }, { "property": "visible", "type": 4 }, { "property": "notes", "type": 2 }],
1093
+ booking: [{ "property": "startDate", "type": 5 }, { "property": "endDate", "type": 5 }, { "property": "status", "type": 2 }, { "property": "notes", "type": 2 }]
1271
1094
  };
1272
1095
 
1096
+ // src/contracts/generated/enum/petSexType.ts
1097
+ var PetSexType = /* @__PURE__ */ ((PetSexType2) => {
1098
+ PetSexType2[PetSexType2["Other"] = 0] = "Other";
1099
+ PetSexType2[PetSexType2["Male"] = 1] = "Male";
1100
+ PetSexType2[PetSexType2["Female"] = 2] = "Female";
1101
+ return PetSexType2;
1102
+ })(PetSexType || {});
1103
+
1104
+ // src/contracts/generated/enum/petStatusType.ts
1105
+ var PetStatusType = /* @__PURE__ */ ((PetStatusType2) => {
1106
+ PetStatusType2[PetStatusType2["Unknown"] = 0] = "Unknown";
1107
+ PetStatusType2[PetStatusType2["Active"] = 1] = "Active";
1108
+ PetStatusType2[PetStatusType2["Deceased"] = 2] = "Deceased";
1109
+ PetStatusType2[PetStatusType2["Blacklisted"] = 3] = "Blacklisted";
1110
+ return PetStatusType2;
1111
+ })(PetStatusType || {});
1112
+
1113
+ // src/contracts/generated/enum/userType.ts
1114
+ var UserType = /* @__PURE__ */ ((UserType2) => {
1115
+ UserType2[UserType2["Unknown"] = 0] = "Unknown";
1116
+ UserType2[UserType2["Owner"] = 1] = "Owner";
1117
+ UserType2[UserType2["Host"] = 2] = "Host";
1118
+ UserType2[UserType2["Driver"] = 3] = "Driver";
1119
+ UserType2[UserType2["Admin"] = 50] = "Admin";
1120
+ UserType2[UserType2["BotToken"] = 99] = "BotToken";
1121
+ return UserType2;
1122
+ })(UserType || {});
1123
+
1124
+ // src/contracts/generated/enum/bookingAddonType.ts
1125
+ var BookingAddonType = /* @__PURE__ */ ((BookingAddonType2) => {
1126
+ BookingAddonType2[BookingAddonType2["None"] = 0] = "None";
1127
+ BookingAddonType2[BookingAddonType2["PetTaxi"] = 1] = "PetTaxi";
1128
+ return BookingAddonType2;
1129
+ })(BookingAddonType || {});
1130
+
1131
+ // src/contracts/generated/enum/commentLinkType.ts
1132
+ var CommentLinkType = /* @__PURE__ */ ((CommentLinkType2) => {
1133
+ CommentLinkType2[CommentLinkType2["Unknown"] = 0] = "Unknown";
1134
+ CommentLinkType2[CommentLinkType2["User"] = 1] = "User";
1135
+ CommentLinkType2[CommentLinkType2["Pet"] = 2] = "Pet";
1136
+ CommentLinkType2[CommentLinkType2["Booking"] = 3] = "Booking";
1137
+ return CommentLinkType2;
1138
+ })(CommentLinkType || {});
1139
+
1140
+ // src/contracts/generated/enum/bookingStatus.ts
1141
+ var BookingStatusType = /* @__PURE__ */ ((BookingStatusType2) => {
1142
+ BookingStatusType2[BookingStatusType2["Pending"] = 0] = "Pending";
1143
+ BookingStatusType2[BookingStatusType2["Cancelled"] = 1] = "Cancelled";
1144
+ BookingStatusType2[BookingStatusType2["FindPlacement"] = 2] = "FindPlacement";
1145
+ BookingStatusType2[BookingStatusType2["Request"] = 3] = "Request";
1146
+ BookingStatusType2[BookingStatusType2["PaidWithHostMatch"] = 4] = "PaidWithHostMatch";
1147
+ BookingStatusType2[BookingStatusType2["Complete"] = 5] = "Complete";
1148
+ BookingStatusType2[BookingStatusType2["CompleteWithHostFeedback"] = 6] = "CompleteWithHostFeedback";
1149
+ return BookingStatusType2;
1150
+ })(BookingStatusType || {});
1151
+
1152
+ // src/contracts/generated/enum/searchableColumnInfo.ts
1153
+ var SearchableColumnType = /* @__PURE__ */ ((SearchableColumnType2) => {
1154
+ SearchableColumnType2[SearchableColumnType2["STRING_ENUM"] = 0] = "STRING_ENUM";
1155
+ SearchableColumnType2[SearchableColumnType2["STRING_OF_ENUMS"] = 1] = "STRING_OF_ENUMS";
1156
+ SearchableColumnType2[SearchableColumnType2["STRING"] = 2] = "STRING";
1157
+ SearchableColumnType2[SearchableColumnType2["NUMBER"] = 3] = "NUMBER";
1158
+ SearchableColumnType2[SearchableColumnType2["BOOLEAN"] = 4] = "BOOLEAN";
1159
+ SearchableColumnType2[SearchableColumnType2["DATE"] = 5] = "DATE";
1160
+ return SearchableColumnType2;
1161
+ })(SearchableColumnType || {});
1162
+
1163
+ // src/contracts/generated/enum/networkState.ts
1164
+ var NetworkState = /* @__PURE__ */ ((NetworkState2) => {
1165
+ NetworkState2[NetworkState2["Pending"] = 0] = "Pending";
1166
+ NetworkState2[NetworkState2["Loading"] = 1] = "Loading";
1167
+ NetworkState2[NetworkState2["Success"] = 2] = "Success";
1168
+ NetworkState2[NetworkState2["Error"] = 3] = "Error";
1169
+ return NetworkState2;
1170
+ })(NetworkState || {});
1171
+
1172
+ // src/contracts/generated/enum/membershipType.ts
1173
+ var MembershipType = /* @__PURE__ */ ((MembershipType2) => {
1174
+ MembershipType2[MembershipType2["None"] = 0] = "None";
1175
+ MembershipType2[MembershipType2["Club"] = 1] = "Club";
1176
+ MembershipType2[MembershipType2["ClubPlus"] = 2] = "ClubPlus";
1177
+ return MembershipType2;
1178
+ })(MembershipType || {});
1179
+
1180
+ // src/contracts/generated/enum/activityType.ts
1181
+ var ActivityType = /* @__PURE__ */ ((ActivityType2) => {
1182
+ ActivityType2[ActivityType2["Unknown"] = 0] = "Unknown";
1183
+ ActivityType2[ActivityType2["Create"] = 1] = "Create";
1184
+ ActivityType2[ActivityType2["Read"] = 2] = "Read";
1185
+ ActivityType2[ActivityType2["Update"] = 3] = "Update";
1186
+ ActivityType2[ActivityType2["Delete"] = 4] = "Delete";
1187
+ return ActivityType2;
1188
+ })(ActivityType || {});
1189
+
1190
+ // src/contracts/generated/enum/questionType.ts
1191
+ var QuestionType = /* @__PURE__ */ ((QuestionType2) => {
1192
+ QuestionType2[QuestionType2["Unknown"] = 0] = "Unknown";
1193
+ QuestionType2[QuestionType2["ShortText"] = 1] = "ShortText";
1194
+ QuestionType2[QuestionType2["LongText"] = 2] = "LongText";
1195
+ QuestionType2[QuestionType2["YesNo"] = 3] = "YesNo";
1196
+ QuestionType2[QuestionType2["YesNoUnknown"] = 4] = "YesNoUnknown";
1197
+ QuestionType2[QuestionType2["StarRating5"] = 5] = "StarRating5";
1198
+ return QuestionType2;
1199
+ })(QuestionType || {});
1200
+ var QuestionForType = /* @__PURE__ */ ((QuestionForType2) => {
1201
+ QuestionForType2[QuestionForType2["Unknown"] = 0] = "Unknown";
1202
+ QuestionForType2[QuestionForType2["Host"] = 1] = "Host";
1203
+ QuestionForType2[QuestionForType2["Owner"] = 2] = "Owner";
1204
+ QuestionForType2[QuestionForType2["Pet"] = 3] = "Pet";
1205
+ return QuestionForType2;
1206
+ })(QuestionForType || {});
1207
+
1208
+ // src/contracts/generated/enum/orderDirectionType.ts
1209
+ var OrderDirectionType = /* @__PURE__ */ ((OrderDirectionType2) => {
1210
+ OrderDirectionType2["ASC"] = "ASC";
1211
+ OrderDirectionType2["DESC"] = "DESC";
1212
+ return OrderDirectionType2;
1213
+ })(OrderDirectionType || {});
1214
+
1215
+ // src/contracts/generated/enum/userAccountFlagType.ts
1216
+ var UserAccountFlagType = /* @__PURE__ */ ((UserAccountFlagType2) => {
1217
+ UserAccountFlagType2[UserAccountFlagType2["Unknown"] = 0] = "Unknown";
1218
+ UserAccountFlagType2[UserAccountFlagType2["ChangePassword"] = 1] = "ChangePassword";
1219
+ return UserAccountFlagType2;
1220
+ })(UserAccountFlagType || {});
1221
+
1222
+ // src/contracts/generated/enum/uploadLinkType.ts
1223
+ var UploadLinkType = /* @__PURE__ */ ((UploadLinkType2) => {
1224
+ UploadLinkType2[UploadLinkType2["Unknown"] = 0] = "Unknown";
1225
+ UploadLinkType2[UploadLinkType2["User"] = 1] = "User";
1226
+ UploadLinkType2[UploadLinkType2["Pet"] = 2] = "Pet";
1227
+ return UploadLinkType2;
1228
+ })(UploadLinkType || {});
1229
+ var UploadType = /* @__PURE__ */ ((UploadType2) => {
1230
+ UploadType2[UploadType2["Unknown"] = 0] = "Unknown";
1231
+ UploadType2[UploadType2["UserProfilePic"] = 5] = "UserProfilePic";
1232
+ UploadType2[UploadType2["PetProfilePic"] = 10] = "PetProfilePic";
1233
+ UploadType2[UploadType2["PetExtraPic"] = 11] = "PetExtraPic";
1234
+ UploadType2[UploadType2["HomePhoto"] = 20] = "HomePhoto";
1235
+ return UploadType2;
1236
+ })(UploadType || {});
1237
+ var uploadsThatNeedEncryption = [];
1238
+
1239
+ // src/contracts/generated/enum/answerLinkType.ts
1240
+ var AnswerLinkType = /* @__PURE__ */ ((AnswerLinkType2) => {
1241
+ AnswerLinkType2[AnswerLinkType2["Unknown"] = 0] = "Unknown";
1242
+ AnswerLinkType2[AnswerLinkType2["User"] = 1] = "User";
1243
+ AnswerLinkType2[AnswerLinkType2["Pet"] = 2] = "Pet";
1244
+ return AnswerLinkType2;
1245
+ })(AnswerLinkType || {});
1246
+
1247
+ // src/contracts/generated/enum/membershipStatus.ts
1248
+ var MembershipStatus = /* @__PURE__ */ ((MembershipStatus2) => {
1249
+ MembershipStatus2[MembershipStatus2["Unknown"] = 0] = "Unknown";
1250
+ MembershipStatus2[MembershipStatus2["Active"] = 1] = "Active";
1251
+ MembershipStatus2[MembershipStatus2["PendingPayment"] = 2] = "PendingPayment";
1252
+ MembershipStatus2[MembershipStatus2["Paused"] = 5] = "Paused";
1253
+ MembershipStatus2[MembershipStatus2["Cancelled"] = 10] = "Cancelled";
1254
+ MembershipStatus2[MembershipStatus2["Removed"] = 11] = "Removed";
1255
+ return MembershipStatus2;
1256
+ })(MembershipStatus || {});
1257
+
1258
+ // src/contracts/generated/enum/petType.ts
1259
+ var PetType = /* @__PURE__ */ ((PetType2) => {
1260
+ PetType2[PetType2["Unknown"] = 0] = "Unknown";
1261
+ PetType2[PetType2["Dog"] = 1] = "Dog";
1262
+ PetType2[PetType2["Cat"] = 2] = "Cat";
1263
+ return PetType2;
1264
+ })(PetType || {});
1265
+
1266
+ // src/contracts/generated/enum/addressLinkType.ts
1267
+ var AddressLinkType = /* @__PURE__ */ ((AddressLinkType2) => {
1268
+ AddressLinkType2[AddressLinkType2["Unknown"] = 0] = "Unknown";
1269
+ AddressLinkType2[AddressLinkType2["User"] = 1] = "User";
1270
+ return AddressLinkType2;
1271
+ })(AddressLinkType || {});
1272
+
1273
1273
  export { APP_TYPE, ActivityRestriction, ActivityType, AddressLinkType, AddressRestriction, AnswerLinkType, AnswerRestriction, AppType, BOT_PATH, BookingAddonRestriction, BookingAddonType, BookingRestriction, BookingStatusType, CommentLinkType, CommentRestriction, CommonConfigService, DrivingRouteRestriction, LocalStorageKeys, LogService, MembershipStatus, MembershipType, NetworkState, OrderDirectionType, PermissionRestriction, PermissionType, PetRestriction, PetSexType, PetStatusType, PetType, QuestionForType, QuestionRestriction, QuestionType, SITE_CONFIG, SearchableColumnType, UnavailabilityRestriction, UploadLinkType, UploadRestriction, UploadType, UserAccountFlagType, UserRestriction, UserType, addDays, addMinutes, addMonths, addSeconds, addSpacesForEnum, addToParallelTasks, anyObject, apiParams, apiRoute, arrayContains, arrayOfNLength, capitalizeFirstLetter, cyrb53, dateDiffInDays, debounceLeading, dependencyInjectionSetup, fakePromise, formatDate, formatFileSize, formatForBookingDate, formatForDateDropdown, formatForDateLocal, formatForDateLocalDetailed, formatForDateOfBirth, formatForDateWithTime, getAgeInYears, getAppType, getArrFromEnum, getBotPath, getCommonConfig, getImageParams, getLog, getMeta, getMimeTypeFromExtension, getPackagesUsed, getPayloadFromJwt, getPerformanceTimer, getPetAvatarUrl, getSiteConfig, getUserAvatarUrl, getUsersName, getWeekNumber, hasRequiredPermissions, isBefore, isNumber, isSameDay, isWebApp, lowercaseFirstLetter, makeArrayOrDefault, maxDate, maxItems, maxLength, mimeTypeLookup, minDate, minItems, minLength, minUrlLength, multiValidation, nameof, noValidation, notNull, onTargetChecked, onTargetFiles, onTargetValue, onlyUnique, portalGlyphLength, preventDefault, randomIntFromRange, randomItemFromArray, searchColumns, selectedItemsExist, selectedOptionIsInEnum, separateValidation, setContainerToken, setSiteConfig, shouldBeUrl, shouldBeYoutubeUrl, stopPropagation, timeout, uploadsThatNeedEncryption, urlRef, uuidv4, validUuidChars, validateForEach, webAppTypes };