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