@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,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, "<")
|
|
70
|
+
.replace(/>/g, ">");
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|