@foxscheduling/shared 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/README.md +56 -0
  2. package/dist/cjs/constants/emailUnsubscribeReasons.cjs +13 -0
  3. package/dist/cjs/constants/emailUnsubscribeReasons.d.ts +4 -0
  4. package/dist/cjs/constants/emailUnsubscribeReasons.d.ts.map +1 -0
  5. package/dist/cjs/index.cjs +24 -0
  6. package/dist/cjs/index.d.ts +9 -0
  7. package/dist/cjs/index.d.ts.map +1 -0
  8. package/dist/cjs/types/db.availability.cjs +12 -0
  9. package/dist/cjs/types/db.availability.d.ts +33 -0
  10. package/dist/cjs/types/db.availability.d.ts.map +1 -0
  11. package/dist/cjs/types/db.booking.cjs +2 -0
  12. package/dist/cjs/types/db.booking.d.ts +101 -0
  13. package/dist/cjs/types/db.booking.d.ts.map +1 -0
  14. package/dist/cjs/types/db.cjs +2 -0
  15. package/dist/cjs/types/db.customers.cjs +2 -0
  16. package/dist/cjs/types/db.customers.d.ts +14 -0
  17. package/dist/cjs/types/db.customers.d.ts.map +1 -0
  18. package/dist/cjs/types/db.d.ts +11 -0
  19. package/dist/cjs/types/db.d.ts.map +1 -0
  20. package/dist/cjs/types/db.directory.cjs +2 -0
  21. package/dist/cjs/types/db.directory.d.ts +38 -0
  22. package/dist/cjs/types/db.directory.d.ts.map +1 -0
  23. package/dist/cjs/types/db.emailFlow.cjs +2 -0
  24. package/dist/cjs/types/db.emailFlow.d.ts +29 -0
  25. package/dist/cjs/types/db.emailFlow.d.ts.map +1 -0
  26. package/dist/cjs/types/db.mcpUserContext.cjs +2 -0
  27. package/dist/cjs/types/db.mcpUserContext.d.ts +29 -0
  28. package/dist/cjs/types/db.mcpUserContext.d.ts.map +1 -0
  29. package/dist/cjs/types/db.notification.cjs +2 -0
  30. package/dist/cjs/types/db.notification.d.ts +27 -0
  31. package/dist/cjs/types/db.notification.d.ts.map +1 -0
  32. package/dist/cjs/types/db.oauth.cjs +2 -0
  33. package/dist/cjs/types/db.oauth.d.ts +55 -0
  34. package/dist/cjs/types/db.oauth.d.ts.map +1 -0
  35. package/dist/cjs/types/db.partnerApiKey.cjs +2 -0
  36. package/dist/cjs/types/db.partnerApiKey.d.ts +15 -0
  37. package/dist/cjs/types/db.partnerApiKey.d.ts.map +1 -0
  38. package/dist/cjs/types/db.paymentPending.cjs +2 -0
  39. package/dist/cjs/types/db.paymentPending.d.ts +16 -0
  40. package/dist/cjs/types/db.paymentPending.d.ts.map +1 -0
  41. package/dist/cjs/types/db.service.cjs +15 -0
  42. package/dist/cjs/types/db.service.d.ts +145 -0
  43. package/dist/cjs/types/db.service.d.ts.map +1 -0
  44. package/dist/cjs/types/db.tax.cjs +2 -0
  45. package/dist/cjs/types/db.tax.d.ts.map +1 -0
  46. package/dist/cjs/types/db.tenant.cjs +2 -0
  47. package/dist/cjs/types/db.tenant.d.ts +118 -0
  48. package/dist/cjs/types/db.tenant.d.ts.map +1 -0
  49. package/dist/cjs/types/db.tenantGroupedStat.cjs +2 -0
  50. package/dist/cjs/types/db.tenantGroupedStat.d.ts +13 -0
  51. package/dist/cjs/types/db.tenantGroupedStat.d.ts.map +1 -0
  52. package/dist/cjs/types/db.user.cjs +7 -0
  53. package/dist/cjs/types/db.user.d.ts +81 -0
  54. package/dist/cjs/types/db.user.d.ts.map +1 -0
  55. package/dist/cjs/types/db.userConfirmation.cjs +2 -0
  56. package/dist/cjs/types/db.userConfirmation.d.ts +17 -0
  57. package/dist/cjs/types/db.userConfirmation.d.ts.map +1 -0
  58. package/dist/cjs/types/db.userLoginSession.cjs +2 -0
  59. package/dist/cjs/types/db.userLoginSession.d.ts +28 -0
  60. package/dist/cjs/types/db.userLoginSession.d.ts.map +1 -0
  61. package/dist/cjs/types/db.webhook.cjs +10 -0
  62. package/dist/cjs/types/db.webhook.d.ts +16 -0
  63. package/dist/cjs/types/db.webhook.d.ts.map +1 -0
  64. package/dist/cjs/types/discover.cjs +2 -0
  65. package/dist/cjs/types/discover.d.ts +45 -0
  66. package/dist/cjs/types/discover.d.ts.map +1 -0
  67. package/dist/cjs/types/errorCodes.cjs +150 -0
  68. package/dist/cjs/types/errorCodes.d.ts +147 -0
  69. package/dist/cjs/types/errorCodes.d.ts.map +1 -0
  70. package/dist/cjs/types/index.cjs +44 -0
  71. package/dist/cjs/types/index.d.ts +84 -0
  72. package/dist/cjs/types/index.d.ts.map +1 -0
  73. package/dist/cjs/types/oauthScopes.cjs +33 -0
  74. package/dist/cjs/types/oauthScopes.d.ts +7 -0
  75. package/dist/cjs/types/oauthScopes.d.ts.map +1 -0
  76. package/dist/cjs/types/partnerDto.cjs +2 -0
  77. package/dist/cjs/types/partnerDto.d.ts +69 -0
  78. package/dist/cjs/types/partnerDto.d.ts.map +1 -0
  79. package/dist/cjs/types/pricing.cjs +2 -0
  80. package/dist/cjs/types/pricing.d.ts +31 -0
  81. package/dist/cjs/types/pricing.d.ts.map +1 -0
  82. package/dist/cjs/types/requestResponse.cjs +2 -0
  83. package/dist/cjs/types/requestResponse.d.ts +93 -0
  84. package/dist/cjs/types/requestResponse.d.ts.map +1 -0
  85. package/dist/cjs/types/subscription.cjs +2 -0
  86. package/dist/cjs/types/subscription.d.ts +50 -0
  87. package/dist/cjs/types/subscription.d.ts.map +1 -0
  88. package/dist/cjs/utils/bookingEmbed.cjs +178 -0
  89. package/dist/cjs/utils/bookingEmbed.d.ts +61 -0
  90. package/dist/cjs/utils/bookingEmbed.d.ts.map +1 -0
  91. package/dist/cjs/utils/bookingPageIcons.cjs +218 -0
  92. package/dist/cjs/utils/bookingPageIcons.d.ts +160 -0
  93. package/dist/cjs/utils/bookingPageIcons.d.ts.map +1 -0
  94. package/dist/cjs/utils/bookingProviders.cjs +27 -0
  95. package/dist/cjs/utils/bookingProviders.d.ts +25 -0
  96. package/dist/cjs/utils/bookingProviders.d.ts.map +1 -0
  97. package/dist/cjs/utils/currencies.cjs +148 -0
  98. package/dist/cjs/utils/currencies.d.ts +6 -0
  99. package/dist/cjs/utils/currencies.d.ts.map +1 -0
  100. package/dist/cjs/utils/dateTime.cjs +192 -0
  101. package/dist/cjs/utils/dateTime.d.ts +57 -0
  102. package/dist/cjs/utils/dateTime.d.ts.map +1 -0
  103. package/dist/cjs/utils/embedFrameLoader.cjs +76 -0
  104. package/dist/cjs/utils/embedFrameLoader.d.ts +15 -0
  105. package/dist/cjs/utils/embedFrameLoader.d.ts.map +1 -0
  106. package/dist/cjs/utils/extensionToContentType.cjs +24 -0
  107. package/dist/cjs/utils/extensionToContentType.d.ts +21 -0
  108. package/dist/cjs/utils/extensionToContentType.d.ts.map +1 -0
  109. package/dist/cjs/utils/generateUsername.cjs +7 -0
  110. package/dist/cjs/utils/generateUsername.d.ts.map +1 -0
  111. package/dist/cjs/utils/index.cjs +65 -0
  112. package/dist/cjs/utils/index.d.ts +26 -0
  113. package/dist/cjs/utils/index.d.ts.map +1 -0
  114. package/dist/cjs/utils/random.cjs +13 -0
  115. package/dist/cjs/utils/random.d.ts +3 -0
  116. package/dist/cjs/utils/random.d.ts.map +1 -0
  117. package/dist/cjs/utils/serviceReminderLabels.cjs +22 -0
  118. package/dist/cjs/utils/serviceReminderLabels.d.ts +5 -0
  119. package/dist/cjs/utils/serviceReminderLabels.d.ts.map +1 -0
  120. package/dist/cjs/utils/tenantSlug.cjs +299 -0
  121. package/dist/cjs/utils/tenantSlug.d.ts +7 -0
  122. package/dist/cjs/utils/tenantSlug.d.ts.map +1 -0
  123. package/dist/cjs/utils/textSlug.cjs +14 -0
  124. package/dist/cjs/utils/textSlug.d.ts +3 -0
  125. package/dist/cjs/utils/textSlug.d.ts.map +1 -0
  126. package/dist/cjs/utils/timezone.cjs +96 -0
  127. package/dist/cjs/utils/timezone.d.ts +2 -0
  128. package/dist/cjs/utils/timezone.d.ts.map +1 -0
  129. package/dist/cjs/utils/ucfirst.cjs +9 -0
  130. package/dist/cjs/utils/ucfirst.d.ts +2 -0
  131. package/dist/cjs/utils/ucfirst.d.ts.map +1 -0
  132. package/dist/constants/emailUnsubscribeReasons.d.ts +4 -0
  133. package/dist/constants/emailUnsubscribeReasons.d.ts.map +1 -0
  134. package/dist/constants/emailUnsubscribeReasons.js +10 -0
  135. package/dist/index.d.ts +9 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +8 -0
  138. package/dist/types/db.availability.d.ts +33 -0
  139. package/dist/types/db.availability.d.ts.map +1 -0
  140. package/dist/types/db.availability.js +9 -0
  141. package/dist/types/db.booking.d.ts +101 -0
  142. package/dist/types/db.booking.d.ts.map +1 -0
  143. package/dist/types/db.booking.js +1 -0
  144. package/dist/types/db.customers.d.ts +14 -0
  145. package/dist/types/db.customers.d.ts.map +1 -0
  146. package/dist/types/db.customers.js +1 -0
  147. package/dist/types/db.d.ts +11 -0
  148. package/dist/types/db.d.ts.map +1 -0
  149. package/dist/types/db.directory.d.ts +38 -0
  150. package/dist/types/db.directory.d.ts.map +1 -0
  151. package/dist/types/db.directory.js +1 -0
  152. package/dist/types/db.emailFlow.d.ts +29 -0
  153. package/dist/types/db.emailFlow.d.ts.map +1 -0
  154. package/dist/types/db.emailFlow.js +1 -0
  155. package/dist/types/db.js +1 -0
  156. package/dist/types/db.mcpUserContext.d.ts +29 -0
  157. package/dist/types/db.mcpUserContext.d.ts.map +1 -0
  158. package/dist/types/db.mcpUserContext.js +1 -0
  159. package/dist/types/db.notification.d.ts +27 -0
  160. package/dist/types/db.notification.d.ts.map +1 -0
  161. package/dist/types/db.notification.js +1 -0
  162. package/dist/types/db.oauth.d.ts +55 -0
  163. package/dist/types/db.oauth.d.ts.map +1 -0
  164. package/dist/types/db.oauth.js +1 -0
  165. package/dist/types/db.partnerApiKey.d.ts +15 -0
  166. package/dist/types/db.partnerApiKey.d.ts.map +1 -0
  167. package/dist/types/db.partnerApiKey.js +1 -0
  168. package/dist/types/db.paymentPending.d.ts +16 -0
  169. package/dist/types/db.paymentPending.d.ts.map +1 -0
  170. package/dist/types/db.paymentPending.js +1 -0
  171. package/dist/types/db.service.d.ts +145 -0
  172. package/dist/types/db.service.d.ts.map +1 -0
  173. package/dist/types/db.service.js +12 -0
  174. package/dist/types/db.tax.d.ts.map +1 -0
  175. package/dist/types/db.tenant.d.ts +118 -0
  176. package/dist/types/db.tenant.d.ts.map +1 -0
  177. package/dist/types/db.tenant.js +1 -0
  178. package/dist/types/db.tenantGroupedStat.d.ts +13 -0
  179. package/dist/types/db.tenantGroupedStat.d.ts.map +1 -0
  180. package/dist/types/db.tenantGroupedStat.js +1 -0
  181. package/dist/types/db.user.d.ts +81 -0
  182. package/dist/types/db.user.d.ts.map +1 -0
  183. package/dist/types/db.user.js +4 -0
  184. package/dist/types/db.userConfirmation.d.ts +17 -0
  185. package/dist/types/db.userConfirmation.d.ts.map +1 -0
  186. package/dist/types/db.userConfirmation.js +1 -0
  187. package/dist/types/db.userLoginSession.d.ts +28 -0
  188. package/dist/types/db.userLoginSession.d.ts.map +1 -0
  189. package/dist/types/db.userLoginSession.js +1 -0
  190. package/dist/types/db.webhook.d.ts +16 -0
  191. package/dist/types/db.webhook.d.ts.map +1 -0
  192. package/dist/types/db.webhook.js +7 -0
  193. package/dist/types/discover.d.ts +45 -0
  194. package/dist/types/discover.d.ts.map +1 -0
  195. package/dist/types/discover.js +1 -0
  196. package/dist/types/errorCodes.d.ts +147 -0
  197. package/dist/types/errorCodes.d.ts.map +1 -0
  198. package/dist/types/errorCodes.js +147 -0
  199. package/dist/types/index.d.ts +84 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +28 -0
  202. package/dist/types/oauthScopes.d.ts +7 -0
  203. package/dist/types/oauthScopes.d.ts.map +1 -0
  204. package/dist/types/oauthScopes.js +28 -0
  205. package/dist/types/partnerDto.d.ts +69 -0
  206. package/dist/types/partnerDto.d.ts.map +1 -0
  207. package/dist/types/partnerDto.js +1 -0
  208. package/dist/types/pricing.d.ts +31 -0
  209. package/dist/types/pricing.d.ts.map +1 -0
  210. package/dist/types/pricing.js +1 -0
  211. package/dist/types/requestResponse.d.ts +93 -0
  212. package/dist/types/requestResponse.d.ts.map +1 -0
  213. package/dist/types/requestResponse.js +1 -0
  214. package/dist/types/subscription.d.ts +50 -0
  215. package/dist/types/subscription.d.ts.map +1 -0
  216. package/dist/types/subscription.js +1 -0
  217. package/dist/utils/bookingEmbed.d.ts +61 -0
  218. package/dist/utils/bookingEmbed.d.ts.map +1 -0
  219. package/dist/utils/bookingEmbed.js +161 -0
  220. package/dist/utils/bookingPageIcons.d.ts +160 -0
  221. package/dist/utils/bookingPageIcons.d.ts.map +1 -0
  222. package/dist/utils/bookingPageIcons.js +214 -0
  223. package/dist/utils/bookingProviders.d.ts +25 -0
  224. package/dist/utils/bookingProviders.d.ts.map +1 -0
  225. package/dist/utils/bookingProviders.js +23 -0
  226. package/dist/utils/currencies.d.ts +6 -0
  227. package/dist/utils/currencies.d.ts.map +1 -0
  228. package/dist/utils/currencies.js +145 -0
  229. package/dist/utils/dateTime.d.ts +57 -0
  230. package/dist/utils/dateTime.d.ts.map +1 -0
  231. package/dist/utils/dateTime.js +150 -0
  232. package/dist/utils/embedFrameLoader.d.ts +15 -0
  233. package/dist/utils/embedFrameLoader.d.ts.map +1 -0
  234. package/dist/utils/embedFrameLoader.js +70 -0
  235. package/dist/utils/extensionToContentType.d.ts +21 -0
  236. package/dist/utils/extensionToContentType.d.ts.map +1 -0
  237. package/dist/utils/extensionToContentType.js +20 -0
  238. package/dist/utils/generateUsername.d.ts.map +1 -0
  239. package/dist/utils/index.d.ts +26 -0
  240. package/dist/utils/index.d.ts.map +1 -0
  241. package/dist/utils/index.js +45 -0
  242. package/dist/utils/random.d.ts +3 -0
  243. package/dist/utils/random.d.ts.map +1 -0
  244. package/dist/utils/random.js +8 -0
  245. package/dist/utils/serviceReminderLabels.d.ts +5 -0
  246. package/dist/utils/serviceReminderLabels.d.ts.map +1 -0
  247. package/dist/utils/serviceReminderLabels.js +18 -0
  248. package/dist/utils/tenantSlug.d.ts +7 -0
  249. package/dist/utils/tenantSlug.d.ts.map +1 -0
  250. package/dist/utils/tenantSlug.js +293 -0
  251. package/dist/utils/textSlug.d.ts +3 -0
  252. package/dist/utils/textSlug.d.ts.map +1 -0
  253. package/dist/utils/textSlug.js +10 -0
  254. package/dist/utils/timezone.d.ts +2 -0
  255. package/dist/utils/timezone.d.ts.map +1 -0
  256. package/dist/utils/timezone.js +93 -0
  257. package/dist/utils/ucfirst.d.ts +2 -0
  258. package/dist/utils/ucfirst.d.ts.map +1 -0
  259. package/dist/utils/ucfirst.js +5 -0
  260. package/package.json +46 -0
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * Shared iframe loading UI for popup widget (embed.js) and inline embed snippets.
4
+ * DOM binding lives in frontend embed/widget-init.ts (shared lib has no DOM types).
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.EMBED_FRAME_LOADER_LABEL = exports.EMBED_FRAME_DEFAULT_HEIGHT_PX = exports.EMBED_FRAME_LOAD_TIMEOUT_MS = exports.EMBED_FRAME_LOADER_CLASS = exports.EMBED_FRAME_WRAP_CLASS = void 0;
8
+ exports.getEmbedFrameLoaderCss = getEmbedFrameLoaderCss;
9
+ exports.getEmbedFrameLoaderHtml = getEmbedFrameLoaderHtml;
10
+ exports.buildEmbedFrameLoadInitScript = buildEmbedFrameLoadInitScript;
11
+ exports.EMBED_FRAME_WRAP_CLASS = "fox-scheduling-embed-wrap";
12
+ exports.EMBED_FRAME_LOADER_CLASS = "fox-scheduling-frame-loading";
13
+ exports.EMBED_FRAME_LOAD_TIMEOUT_MS = 60_000;
14
+ exports.EMBED_FRAME_DEFAULT_HEIGHT_PX = 760;
15
+ exports.EMBED_FRAME_LOADER_LABEL = "Loading booking…";
16
+ /** CSS for loader overlay (host page + widget). Self-contained, no external assets. */
17
+ function getEmbedFrameLoaderCss(scopeSelector = "") {
18
+ const root = scopeSelector ? `${scopeSelector} ` : "";
19
+ return `
20
+ ${root}.${exports.EMBED_FRAME_WRAP_CLASS} {
21
+ position: relative;
22
+ width: 100%;
23
+ box-sizing: border-box;
24
+ }
25
+ ${root}.${exports.EMBED_FRAME_LOADER_CLASS} {
26
+ position: absolute;
27
+ inset: 0;
28
+ z-index: 2;
29
+ display: flex;
30
+ flex-direction: column;
31
+ align-items: center;
32
+ justify-content: center;
33
+ gap: 12px;
34
+ background: #f8fafc;
35
+ color: #475569;
36
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
37
+ font-size: 14px;
38
+ line-height: 1.4;
39
+ transition: opacity 0.2s ease, visibility 0.2s ease;
40
+ }
41
+ ${root}.${exports.EMBED_FRAME_LOADER_CLASS}[hidden],
42
+ ${root}.${exports.EMBED_FRAME_LOADER_CLASS}.fox-scheduling-frame-loading--hidden {
43
+ opacity: 0;
44
+ visibility: hidden;
45
+ pointer-events: none;
46
+ }
47
+ ${root}.${exports.EMBED_FRAME_LOADER_CLASS} .fox-scheduling-frame-loading-spinner {
48
+ width: 36px;
49
+ height: 36px;
50
+ border: 3px solid #e2e8f0;
51
+ border-top-color: #0ea5e9;
52
+ border-radius: 50%;
53
+ animation: fox-scheduling-spin 0.75s linear infinite;
54
+ }
55
+ @keyframes fox-scheduling-spin {
56
+ to { transform: rotate(360deg); }
57
+ }
58
+ ${root}.${exports.EMBED_FRAME_WRAP_CLASS} iframe {
59
+ display: block;
60
+ width: 100%;
61
+ border: 0;
62
+ vertical-align: top;
63
+ }
64
+ `.trim();
65
+ }
66
+ function getEmbedFrameLoaderHtml(label = exports.EMBED_FRAME_LOADER_LABEL) {
67
+ const safe = label
68
+ .replace(/&/g, "&")
69
+ .replace(/</g, "&lt;")
70
+ .replace(/>/g, "&gt;");
71
+ return `<div class="${exports.EMBED_FRAME_LOADER_CLASS}" role="status" aria-live="polite" aria-busy="true"><div class="fox-scheduling-frame-loading-spinner" aria-hidden="true"></div><span>${safe}</span></div>`;
72
+ }
73
+ /** Inline script for copy-paste embed (no embed.js). */
74
+ function buildEmbedFrameLoadInitScript() {
75
+ return `<script>(function(){var w=document.currentScript&&document.currentScript.parentElement;if(!w)return;var f=w.querySelector("iframe"),l=w.querySelector(".${exports.EMBED_FRAME_LOADER_CLASS}");if(!f||!l)return;function done(){l.hidden=true;l.classList.add("fox-scheduling-frame-loading--hidden");l.setAttribute("aria-busy","false");w.setAttribute("aria-busy","false");}f.addEventListener("load",done);f.addEventListener("error",done);setTimeout(done,${exports.EMBED_FRAME_LOAD_TIMEOUT_MS});})();</script>`;
76
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared iframe loading UI for popup widget (embed.js) and inline embed snippets.
3
+ * DOM binding lives in frontend embed/widget-init.ts (shared lib has no DOM types).
4
+ */
5
+ export declare const EMBED_FRAME_WRAP_CLASS = "fox-scheduling-embed-wrap";
6
+ export declare const EMBED_FRAME_LOADER_CLASS = "fox-scheduling-frame-loading";
7
+ export declare const EMBED_FRAME_LOAD_TIMEOUT_MS = 60000;
8
+ export declare const EMBED_FRAME_DEFAULT_HEIGHT_PX = 760;
9
+ export declare const EMBED_FRAME_LOADER_LABEL = "Loading booking\u2026";
10
+ /** CSS for loader overlay (host page + widget). Self-contained, no external assets. */
11
+ export declare function getEmbedFrameLoaderCss(scopeSelector?: string): string;
12
+ export declare function getEmbedFrameLoaderHtml(label?: string): string;
13
+ /** Inline script for copy-paste embed (no embed.js). */
14
+ export declare function buildEmbedFrameLoadInitScript(): string;
15
+ //# sourceMappingURL=embedFrameLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedFrameLoader.d.ts","sourceRoot":"","sources":["../../../src/utils/embedFrameLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAClE,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AACvE,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,eAAO,MAAM,wBAAwB,0BAAqB,CAAC;AAE3D,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,aAAa,SAAK,GAAG,MAAM,CAgDjE;AAED,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,MAAiC,GACvC,MAAM,CAMR;AAED,wDAAwD;AACxD,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extensionToContentType = exports.ExtensionLibrary = void 0;
4
+ exports.ExtensionLibrary = {
5
+ jpg: 'image/jpeg',
6
+ jpeg: 'image/jpeg',
7
+ png: 'image/png',
8
+ svg: 'image/svg+xml',
9
+ gif: 'image/gif',
10
+ bmp: 'image/bmp',
11
+ tiff: 'image/tiff',
12
+ webp: 'image/webp',
13
+ mp4: 'video/mp4',
14
+ webm: 'video/webm',
15
+ pdf: 'application/pdf',
16
+ flv: 'video/x-flv',
17
+ wmv: 'video/x-ms-wmv',
18
+ mov: 'video/quicktime',
19
+ mkv: 'video/x-matroska',
20
+ avi: 'video/x-msvideo',
21
+ html: 'text/html',
22
+ };
23
+ const extensionToContentType = (extension) => exports.ExtensionLibrary[extension];
24
+ exports.extensionToContentType = extensionToContentType;
@@ -0,0 +1,21 @@
1
+ export declare const ExtensionLibrary: {
2
+ jpg: string;
3
+ jpeg: string;
4
+ png: string;
5
+ svg: string;
6
+ gif: string;
7
+ bmp: string;
8
+ tiff: string;
9
+ webp: string;
10
+ mp4: string;
11
+ webm: string;
12
+ pdf: string;
13
+ flv: string;
14
+ wmv: string;
15
+ mov: string;
16
+ mkv: string;
17
+ avi: string;
18
+ html: string;
19
+ };
20
+ export declare const extensionToContentType: (extension: keyof typeof ExtensionLibrary) => string;
21
+ //# sourceMappingURL=extensionToContentType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionToContentType.d.ts","sourceRoot":"","sources":["../../../src/utils/extensionToContentType.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;CAkB5B,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,OAAO,gBAAgB,WAAgC,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateUsername = void 0;
4
+ const generateUsername = (tenantId, email) => {
5
+ return `${tenantId}:${email.toLowerCase()}`;
6
+ };
7
+ exports.generateUsername = generateUsername;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateUsername.d.ts","sourceRoot":"","sources":["../../../src/utils/generateUsername.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,WAE/D,CAAA"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Shared utility functions for FoxScheduling backend and frontend.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.DEFAULT_BUSINESS_LOGO_URL = exports.SERVICE_LOCATION_TYPES = exports.flattenArrayOfObjects = exports.consoleLog = void 0;
21
+ exports.formatCurrency = formatCurrency;
22
+ __exportStar(require("./random.cjs"), exports);
23
+ __exportStar(require("./ucfirst.cjs"), exports);
24
+ __exportStar(require("./dateTime.cjs"), exports);
25
+ __exportStar(require("./timezone.cjs"), exports);
26
+ __exportStar(require("./currencies.cjs"), exports);
27
+ __exportStar(require("./bookingPageIcons.cjs"), exports);
28
+ __exportStar(require("./serviceReminderLabels.cjs"), exports);
29
+ __exportStar(require("./extensionToContentType.cjs"), exports);
30
+ __exportStar(require("./textSlug.cjs"), exports);
31
+ __exportStar(require("./tenantSlug.cjs"), exports);
32
+ __exportStar(require("./bookingProviders.cjs"), exports);
33
+ __exportStar(require("./bookingEmbed.cjs"), exports);
34
+ __exportStar(require("./embedFrameLoader.cjs"), exports);
35
+ /**
36
+ * Example utility - replace with your actual shared functions.
37
+ */
38
+ function formatCurrency(amount, currency = "USD") {
39
+ return new Intl.NumberFormat("en-US", {
40
+ style: "currency",
41
+ currency,
42
+ }).format(amount);
43
+ }
44
+ const consoleLog = (data, key, ...args) => {
45
+ console.log(key, data, ...args);
46
+ if (typeof data === typeof {} || typeof data === typeof []) {
47
+ console.log(`${key}: ${JSON.stringify(data, null, 2)}`, ...args);
48
+ return;
49
+ }
50
+ console.log(`${key}: ${data}`, ...args);
51
+ };
52
+ exports.consoleLog = consoleLog;
53
+ const flattenArrayOfObjects = (arr) => {
54
+ return arr.reduce((acc, obj) => {
55
+ Object.keys(obj).forEach((key) => {
56
+ acc[key] = obj[key];
57
+ });
58
+ return acc;
59
+ }, {});
60
+ };
61
+ exports.flattenArrayOfObjects = flattenArrayOfObjects;
62
+ exports.SERVICE_LOCATION_TYPES = [
63
+ "none", "google_meet", "microsoft_teams", "zoom", "discord", "slack", "other", "in_person",
64
+ ];
65
+ exports.DEFAULT_BUSINESS_LOGO_URL = "https://foxscheduling.com/assets/icons/business-icon.png";
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared utility functions for FoxScheduling backend and frontend.
3
+ */
4
+ import { ServiceLocationType } from "../types/db.service.js";
5
+ export * from "./random.js";
6
+ export * from "./ucfirst.js";
7
+ export * from "./dateTime.js";
8
+ export * from "./timezone.js";
9
+ export * from "./currencies.js";
10
+ export * from "./bookingPageIcons.js";
11
+ export * from "./serviceReminderLabels.js";
12
+ export * from "./extensionToContentType.js";
13
+ export * from "./textSlug.js";
14
+ export * from "./tenantSlug.js";
15
+ export * from "./bookingProviders.js";
16
+ export * from "./bookingEmbed.js";
17
+ export * from "./embedFrameLoader.js";
18
+ /**
19
+ * Example utility - replace with your actual shared functions.
20
+ */
21
+ export declare function formatCurrency(amount: number, currency?: string): string;
22
+ export declare const consoleLog: <T>(data: T, key?: string, ...args: any[]) => void;
23
+ export declare const flattenArrayOfObjects: <T extends Record<string, string>>(arr: Array<T>) => Record<string, string>;
24
+ export declare const SERVICE_LOCATION_TYPES: ServiceLocationType[];
25
+ export declare const DEFAULT_BUSINESS_LOGO_URL = "https://foxscheduling.com/assets/icons/business-icon.png";
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CAKvE;AAED,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAOtE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAO5G,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,EAEvD,CAAC;AAEF,eAAO,MAAM,yBAAyB,6DAA6D,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.randomNumber = exports.randomID = void 0;
4
+ const randomID = (length = 12) => {
5
+ let result = "";
6
+ const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
7
+ for (var i = length; i > 0; --i)
8
+ result += chars[Math.floor(Math.random() * chars.length)];
9
+ return result;
10
+ };
11
+ exports.randomID = randomID;
12
+ const randomNumber = (length = 12) => Math.floor(Math.random() * 10 ** length);
13
+ exports.randomNumber = randomNumber;
@@ -0,0 +1,3 @@
1
+ export declare const randomID: (length?: number) => string;
2
+ export declare const randomNumber: (length?: number) => number;
3
+ //# sourceMappingURL=random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../../src/utils/random.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GAAI,eAAW,WAKnC,CAAA;AACD,eAAO,MAAM,YAAY,GAAI,eAAW,WAA6C,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SERVICE_REMINDER_OFFSET_LABELS = void 0;
4
+ exports.formatServiceReminderOffsetLabel = formatServiceReminderOffsetLabel;
5
+ /** English labels for reminder offsets (in-app notifications, emails). */
6
+ exports.SERVICE_REMINDER_OFFSET_LABELS = {
7
+ "15_minutes": "15 minutes",
8
+ "30_minutes": "30 minutes",
9
+ "1_hour": "1 hour",
10
+ "3_hours": "3 hours",
11
+ "6_hours": "6 hours",
12
+ "12_hours": "12 hours",
13
+ "1_day": "1 day",
14
+ "1_week": "1 week",
15
+ "1_month": "1 month",
16
+ };
17
+ function formatServiceReminderOffsetLabel(offset) {
18
+ if (!offset)
19
+ return "";
20
+ return (exports.SERVICE_REMINDER_OFFSET_LABELS[offset] ??
21
+ String(offset).replace(/_/g, " "));
22
+ }
@@ -0,0 +1,5 @@
1
+ import type { ServiceReminderOffset } from "../types/db.service.js";
2
+ /** English labels for reminder offsets (in-app notifications, emails). */
3
+ export declare const SERVICE_REMINDER_OFFSET_LABELS: Record<ServiceReminderOffset, string>;
4
+ export declare function formatServiceReminderOffsetLabel(offset: string | undefined): string;
5
+ //# sourceMappingURL=serviceReminderLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceReminderLabels.d.ts","sourceRoot":"","sources":["../../../src/utils/serviceReminderLabels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,0EAA0E;AAC1E,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAUhF,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMnF"}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESERVED_TENANT_SLUGS = void 0;
4
+ exports.normalizeTenantSlugInput = normalizeTenantSlugInput;
5
+ exports.isTenantSlugFormatValid = isTenantSlugFormatValid;
6
+ exports.isReservedTenantSlug = isReservedTenantSlug;
7
+ const textSlug_js_1 = require("./textSlug.cjs");
8
+ /**
9
+ * Subdomains we never assign to a tenant booking page.
10
+ * Keep in sync with infra / marketing paths where possible.
11
+ */
12
+ const INFRA_AND_PRODUCT_RESERVED_TENANT_SLUGS = [
13
+ "www",
14
+ "api",
15
+ "app",
16
+ "admin",
17
+ "mail",
18
+ "ftp",
19
+ "cdn",
20
+ "staging",
21
+ "dev",
22
+ "test",
23
+ "prod",
24
+ "static",
25
+ "assets",
26
+ "m",
27
+ "mobile",
28
+ "blog",
29
+ "status",
30
+ "health",
31
+ "webhook",
32
+ "webhooks",
33
+ "auth",
34
+ "dashboard",
35
+ "billing",
36
+ "console",
37
+ "support",
38
+ "help",
39
+ "docs",
40
+ "localhost",
41
+ "foxscheduling",
42
+ ];
43
+ /**
44
+ * Vulgar, sexual, and other adult-oriented labels blocked as public subdomains.
45
+ * Slug-shaped only (lowercase + hyphens); not exhaustive — pair with moderation if needed.
46
+ */
47
+ const ADULT_OR_PROFANE_TENANT_SLUGS = [
48
+ "xxx",
49
+ "nsfw",
50
+ "x-rated",
51
+ "xrated",
52
+ "adult",
53
+ "adults",
54
+ "porn",
55
+ "porno",
56
+ "pornhub",
57
+ "pornography",
58
+ "hardcore",
59
+ "softcore",
60
+ "sex",
61
+ "sexx",
62
+ "sexxx",
63
+ "sexual",
64
+ "sexy",
65
+ "nude",
66
+ "nudes",
67
+ "naked",
68
+ "nudity",
69
+ "erotic",
70
+ "erotica",
71
+ "hentai",
72
+ "camgirl",
73
+ "camgirls",
74
+ "onlyfans",
75
+ "fansly",
76
+ "escort",
77
+ "escorts",
78
+ "hooker",
79
+ "hookers",
80
+ "prostitute",
81
+ "prostitution",
82
+ "brothel",
83
+ "stripper",
84
+ "strippers",
85
+ "stripping",
86
+ "lapdance",
87
+ "blowjob",
88
+ "blowjobs",
89
+ "handjob",
90
+ "handjobs",
91
+ "deepthroat",
92
+ "gangbang",
93
+ "bukkake",
94
+ "orgy",
95
+ "orgies",
96
+ "threesome",
97
+ "foursome",
98
+ "milf",
99
+ "milfs",
100
+ "gilf",
101
+ "dildo",
102
+ "dildos",
103
+ "vibrator",
104
+ "vibrators",
105
+ "fetish",
106
+ "bdsm",
107
+ "bondage",
108
+ "dominatrix",
109
+ "submissive",
110
+ "kinky",
111
+ "fisting",
112
+ "pegging",
113
+ "creampie",
114
+ "cum",
115
+ "cumming",
116
+ "cumshot",
117
+ "orgasm",
118
+ "masturbate",
119
+ "masturbation",
120
+ "anal",
121
+ "vagina",
122
+ "penis",
123
+ "clitoris",
124
+ "testicles",
125
+ "scrotum",
126
+ "tits",
127
+ "titty",
128
+ "titties",
129
+ "boobs",
130
+ "boobies",
131
+ "nipple",
132
+ "nipples",
133
+ "areola",
134
+ "cunnilingus",
135
+ "fellatio",
136
+ "cocksucker",
137
+ "motherfucker",
138
+ "motherfuckers",
139
+ "mofo",
140
+ "fuck",
141
+ "fucks",
142
+ "fucker",
143
+ "fuckers",
144
+ "fucking",
145
+ "fucked",
146
+ "fuckoff",
147
+ "fuck-you",
148
+ "clusterfuck",
149
+ "shit",
150
+ "shits",
151
+ "shitty",
152
+ "shithead",
153
+ "shitface",
154
+ "bullshit",
155
+ "horseshit",
156
+ "dipshit",
157
+ "crap",
158
+ "crappy",
159
+ "damn",
160
+ "dammit",
161
+ "goddamn",
162
+ "goddammit",
163
+ "hell",
164
+ "bitch",
165
+ "bitches",
166
+ "bitchy",
167
+ "bastard",
168
+ "bastards",
169
+ "ass",
170
+ "asses",
171
+ "asshole",
172
+ "assholes",
173
+ "jackass",
174
+ "smartass",
175
+ "dumbass",
176
+ "badass",
177
+ "douche",
178
+ "douchebag",
179
+ "douchebags",
180
+ "prick",
181
+ "pricks",
182
+ "dick",
183
+ "dicks",
184
+ "dickhead",
185
+ "dickheads",
186
+ "cock",
187
+ "cocks",
188
+ "cockhead",
189
+ "cocksucker",
190
+ "pussy",
191
+ "pussies",
192
+ "cunt",
193
+ "cunts",
194
+ "twat",
195
+ "twats",
196
+ "slut",
197
+ "sluts",
198
+ "slutty",
199
+ "whore",
200
+ "whores",
201
+ "skank",
202
+ "skanks",
203
+ "hoe",
204
+ "hoes",
205
+ "wank",
206
+ "wanker",
207
+ "wankers",
208
+ "piss",
209
+ "pissed",
210
+ "pissing",
211
+ "piss-off",
212
+ "bugger",
213
+ "sod-off",
214
+ "ballsack",
215
+ "nutsack",
216
+ "rape",
217
+ "rapes",
218
+ "rapist",
219
+ "rapists",
220
+ "molest",
221
+ "molester",
222
+ "molestation",
223
+ "pedo",
224
+ "pedos",
225
+ "pedophile",
226
+ "pedophiles",
227
+ "paedophile",
228
+ "paedophiles",
229
+ "lolita",
230
+ "incest",
231
+ "bestiality",
232
+ "beastiality",
233
+ "zoophilia",
234
+ "necrophilia",
235
+ "necro",
236
+ "scat",
237
+ "coprophilia",
238
+ "golden-shower",
239
+ "watersports",
240
+ "urine",
241
+ "pissplay",
242
+ "faggot",
243
+ "faggots",
244
+ "dyke",
245
+ "dykes",
246
+ "tranny",
247
+ "trannies",
248
+ "retard",
249
+ "retards",
250
+ "retarded",
251
+ "nigger",
252
+ "niggers",
253
+ "nigga",
254
+ "niggas",
255
+ "chink",
256
+ "chinks",
257
+ "spic",
258
+ "spics",
259
+ "wetback",
260
+ "wetbacks",
261
+ "kike",
262
+ "kikes",
263
+ "raghead",
264
+ "ragheads",
265
+ "towelhead",
266
+ "towelheads",
267
+ "gook",
268
+ "gooks",
269
+ "coon",
270
+ "coons",
271
+ "jungle-bunny",
272
+ "porch-monkey",
273
+ "beaner",
274
+ "beaners",
275
+ "cracker",
276
+ "crackers",
277
+ "honkey",
278
+ "honkeys",
279
+ "redskin",
280
+ "redskins",
281
+ ];
282
+ exports.RESERVED_TENANT_SLUGS = [
283
+ ...INFRA_AND_PRODUCT_RESERVED_TENANT_SLUGS,
284
+ ...ADULT_OR_PROFANE_TENANT_SLUGS,
285
+ ];
286
+ const TENANT_SLUG_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;
287
+ /** Normalize user input for a tenant booking subdomain. */
288
+ function normalizeTenantSlugInput(raw) {
289
+ return (0, textSlug_js_1.generateSlugFromText)(raw);
290
+ }
291
+ /** RFC-ish DNS label: 3–63 chars, lowercase alphanumeric with single hyphens between segments. */
292
+ function isTenantSlugFormatValid(slug) {
293
+ if (!slug || slug.length < 3 || slug.length > 63)
294
+ return false;
295
+ return TENANT_SLUG_REGEX.test(slug);
296
+ }
297
+ function isReservedTenantSlug(slug) {
298
+ return exports.RESERVED_TENANT_SLUGS.includes(slug.toLowerCase());
299
+ }
@@ -0,0 +1,7 @@
1
+ export declare const RESERVED_TENANT_SLUGS: readonly ["www", "api", "app", "admin", "mail", "ftp", "cdn", "staging", "dev", "test", "prod", "static", "assets", "m", "mobile", "blog", "status", "health", "webhook", "webhooks", "auth", "dashboard", "billing", "console", "support", "help", "docs", "localhost", "foxscheduling", "xxx", "nsfw", "x-rated", "xrated", "adult", "adults", "porn", "porno", "pornhub", "pornography", "hardcore", "softcore", "sex", "sexx", "sexxx", "sexual", "sexy", "nude", "nudes", "naked", "nudity", "erotic", "erotica", "hentai", "camgirl", "camgirls", "onlyfans", "fansly", "escort", "escorts", "hooker", "hookers", "prostitute", "prostitution", "brothel", "stripper", "strippers", "stripping", "lapdance", "blowjob", "blowjobs", "handjob", "handjobs", "deepthroat", "gangbang", "bukkake", "orgy", "orgies", "threesome", "foursome", "milf", "milfs", "gilf", "dildo", "dildos", "vibrator", "vibrators", "fetish", "bdsm", "bondage", "dominatrix", "submissive", "kinky", "fisting", "pegging", "creampie", "cum", "cumming", "cumshot", "orgasm", "masturbate", "masturbation", "anal", "vagina", "penis", "clitoris", "testicles", "scrotum", "tits", "titty", "titties", "boobs", "boobies", "nipple", "nipples", "areola", "cunnilingus", "fellatio", "cocksucker", "motherfucker", "motherfuckers", "mofo", "fuck", "fucks", "fucker", "fuckers", "fucking", "fucked", "fuckoff", "fuck-you", "clusterfuck", "shit", "shits", "shitty", "shithead", "shitface", "bullshit", "horseshit", "dipshit", "crap", "crappy", "damn", "dammit", "goddamn", "goddammit", "hell", "bitch", "bitches", "bitchy", "bastard", "bastards", "ass", "asses", "asshole", "assholes", "jackass", "smartass", "dumbass", "badass", "douche", "douchebag", "douchebags", "prick", "pricks", "dick", "dicks", "dickhead", "dickheads", "cock", "cocks", "cockhead", "cocksucker", "pussy", "pussies", "cunt", "cunts", "twat", "twats", "slut", "sluts", "slutty", "whore", "whores", "skank", "skanks", "hoe", "hoes", "wank", "wanker", "wankers", "piss", "pissed", "pissing", "piss-off", "bugger", "sod-off", "ballsack", "nutsack", "rape", "rapes", "rapist", "rapists", "molest", "molester", "molestation", "pedo", "pedos", "pedophile", "pedophiles", "paedophile", "paedophiles", "lolita", "incest", "bestiality", "beastiality", "zoophilia", "necrophilia", "necro", "scat", "coprophilia", "golden-shower", "watersports", "urine", "pissplay", "faggot", "faggots", "dyke", "dykes", "tranny", "trannies", "retard", "retards", "retarded", "nigger", "niggers", "nigga", "niggas", "chink", "chinks", "spic", "spics", "wetback", "wetbacks", "kike", "kikes", "raghead", "ragheads", "towelhead", "towelheads", "gook", "gooks", "coon", "coons", "jungle-bunny", "porch-monkey", "beaner", "beaners", "cracker", "crackers", "honkey", "honkeys", "redskin", "redskins"];
2
+ /** Normalize user input for a tenant booking subdomain. */
3
+ export declare function normalizeTenantSlugInput(raw: string): string;
4
+ /** RFC-ish DNS label: 3–63 chars, lowercase alphanumeric with single hyphens between segments. */
5
+ export declare function isTenantSlugFormatValid(slug: string): boolean;
6
+ export declare function isReservedTenantSlug(slug: string): boolean;
7
+ //# sourceMappingURL=tenantSlug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenantSlug.d.ts","sourceRoot":"","sources":["../../../src/utils/tenantSlug.ts"],"names":[],"mappings":"AAsRA,eAAO,MAAM,qBAAqB,4tFAGxB,CAAC;AAIX,2DAA2D;AAC3D,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI1D"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSlugFromText = void 0;
4
+ /** URL-safe slug from arbitrary text (services, tenants, etc.). */
5
+ const generateSlugFromText = (text) => {
6
+ if (!text)
7
+ return "";
8
+ return text
9
+ .toLowerCase()
10
+ .trim()
11
+ .replace(/[\s\W-]+/g, "-")
12
+ .replace(/^-+|-+$/g, "");
13
+ };
14
+ exports.generateSlugFromText = generateSlugFromText;
@@ -0,0 +1,3 @@
1
+ /** URL-safe slug from arbitrary text (services, tenants, etc.). */
2
+ export declare const generateSlugFromText: (text: string) => string;
3
+ //# sourceMappingURL=textSlug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textSlug.d.ts","sourceRoot":"","sources":["../../../src/utils/textSlug.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,WAOhD,CAAC"}