diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 546b1617f3..1f3424f531 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -15,7 +15,8 @@ "Website(3001)", "Embed Core(3100)", "Embed React(3101)", - "Prisma Studio(5555)" + "Prisma Studio(5555)", + "Maildev(587)" ], // Mark as the default build task so cmd/ctrl+shift+b will create them "group": { @@ -65,6 +66,13 @@ "command": "yarn db-studio", "isBackground": false, "problemMatcher": [] + }, + { + "label": "Maildev(587)", + "type": "shell", + "command": "maildev -s 587", + "isBackground": false, + "problemMatcher": [] } ] } diff --git a/apps/web/components/CustomBranding.tsx b/apps/web/components/CustomBranding.tsx index 8dd83e2235..5959a6abaa 100644 --- a/apps/web/components/CustomBranding.tsx +++ b/apps/web/components/CustomBranding.tsx @@ -1,6 +1,6 @@ import { useEffect } from "react"; -import { useBrandColors } from "@calcom/embed-core"; +import { useBrandColors } from "@calcom/embed-core/embed-iframe"; const brandColor = "#292929"; const brandTextColor = "#ffffff"; diff --git a/apps/web/components/Shell.tsx b/apps/web/components/Shell.tsx index 72c8c4f102..15bfd4e083 100644 --- a/apps/web/components/Shell.tsx +++ b/apps/web/components/Shell.tsx @@ -19,7 +19,7 @@ import { useRouter } from "next/router"; import React, { Fragment, ReactNode, useEffect, useState } from "react"; import { Toaster } from "react-hot-toast"; -import { useIsEmbed } from "@calcom/embed-core"; +import { useIsEmbed } from "@calcom/embed-core/embed-iframe"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import Button from "@calcom/ui/Button"; import Dropdown, { diff --git a/apps/web/components/booking/DatePicker.tsx b/apps/web/components/booking/DatePicker.tsx index 74aceb83ed..8a3398a9df 100644 --- a/apps/web/components/booking/DatePicker.tsx +++ b/apps/web/components/booking/DatePicker.tsx @@ -7,7 +7,7 @@ import utc from "dayjs/plugin/utc"; import { memoize } from "lodash"; import { useEffect, useRef, useState } from "react"; -import { useEmbedStyles } from "@calcom/embed-core"; +import { useEmbedStyles } from "@calcom/embed-core/embed-iframe"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import classNames from "@lib/classNames"; diff --git a/apps/web/components/booking/pages/AvailabilityPage.tsx b/apps/web/components/booking/pages/AvailabilityPage.tsx index 2b295d4a06..4a23427d27 100644 --- a/apps/web/components/booking/pages/AvailabilityPage.tsx +++ b/apps/web/components/booking/pages/AvailabilityPage.tsx @@ -30,7 +30,7 @@ import { useIsBackgroundTransparent, sdkActionManager, useEmbedNonStylesConfig, -} from "@calcom/embed-core"; +} from "@calcom/embed-core/embed-iframe"; import classNames from "@calcom/lib/classNames"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; diff --git a/apps/web/components/booking/pages/BookingPage.tsx b/apps/web/components/booking/pages/BookingPage.tsx index 22b31977f6..f02c3deda8 100644 --- a/apps/web/components/booking/pages/BookingPage.tsx +++ b/apps/web/components/booking/pages/BookingPage.tsx @@ -24,7 +24,11 @@ import { Frequency as RRuleFrequency } from "rrule"; import { v4 as uuidv4 } from "uuid"; import { z } from "zod"; -import { useEmbedNonStylesConfig, useIsBackgroundTransparent, useIsEmbed } from "@calcom/embed-core"; +import { + useEmbedNonStylesConfig, + useIsBackgroundTransparent, + useIsEmbed, +} from "@calcom/embed-core/embed-iframe"; import classNames from "@calcom/lib/classNames"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { HttpError } from "@calcom/lib/http-error"; diff --git a/apps/web/components/ui/PoweredByCal.tsx b/apps/web/components/ui/PoweredByCal.tsx index 9aa32166c4..348e8d4a75 100644 --- a/apps/web/components/ui/PoweredByCal.tsx +++ b/apps/web/components/ui/PoweredByCal.tsx @@ -1,6 +1,6 @@ import Link from "next/link"; -import { useIsEmbed } from "@calcom/embed-core"; +import { useIsEmbed } from "@calcom/embed-core/embed-iframe"; import { useLocale } from "@lib/hooks/useLocale"; diff --git a/apps/web/ee/components/stripe/PaymentPage.tsx b/apps/web/ee/components/stripe/PaymentPage.tsx index a30571d7e6..285a82c52e 100644 --- a/apps/web/ee/components/stripe/PaymentPage.tsx +++ b/apps/web/ee/components/stripe/PaymentPage.tsx @@ -9,7 +9,7 @@ import Head from "next/head"; import { FC, useEffect, useState } from "react"; import { FormattedNumber, IntlProvider } from "react-intl"; -import { sdkActionManager, useIsEmbed } from "@calcom/embed-core"; +import { sdkActionManager, useIsEmbed } from "@calcom/embed-core/embed-iframe"; import getStripe from "@calcom/stripe/client"; import PaymentComponent from "@ee/components/stripe/Payment"; import { PaymentPageProps } from "@ee/pages/payment/[uid]"; diff --git a/apps/web/lib/hooks/useTheme.tsx b/apps/web/lib/hooks/useTheme.tsx index 5c93b74623..25d6e511c1 100644 --- a/apps/web/lib/hooks/useTheme.tsx +++ b/apps/web/lib/hooks/useTheme.tsx @@ -1,7 +1,7 @@ import Head from "next/head"; import { useEffect, useState } from "react"; -import { useEmbedTheme } from "@calcom/embed-core"; +import { useEmbedTheme } from "@calcom/embed-core/embed-iframe"; import { Maybe } from "@trpc/server"; diff --git a/apps/web/package.json b/apps/web/package.json index 1a28b1ed3a..1abdebf206 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -30,7 +30,7 @@ "@calcom/app-store": "*", "@calcom/core": "*", "@calcom/ee": "*", - "@calcom/embed-core": "*", + "@calcom/embed-core": "^1.1.0-beta.10", "@calcom/lib": "*", "@calcom/prisma": "*", "@calcom/stripe": "*", diff --git a/apps/web/pages/[user].tsx b/apps/web/pages/[user].tsx index 6c78cd7a7e..6659e88e02 100644 --- a/apps/web/pages/[user].tsx +++ b/apps/web/pages/[user].tsx @@ -10,7 +10,12 @@ import { useEffect, useState } from "react"; import { Toaster } from "react-hot-toast"; import { JSONObject } from "superjson/dist/types"; -import { sdkActionManager, useEmbedNonStylesConfig, useEmbedStyles, useIsEmbed } from "@calcom/embed-core"; +import { + sdkActionManager, + useEmbedNonStylesConfig, + useEmbedStyles, + useIsEmbed, +} from "@calcom/embed-core/embed-iframe"; import defaultEvents, { getDynamicEventDescription, getGroupName, diff --git a/apps/web/pages/success.tsx b/apps/web/pages/success.tsx index a22dc2e074..0535ce609f 100644 --- a/apps/web/pages/success.tsx +++ b/apps/web/pages/success.tsx @@ -22,7 +22,7 @@ import { useEmbedNonStylesConfig, useIsBackgroundTransparent, useIsEmbed, -} from "@calcom/embed-core"; +} from "@calcom/embed-core/embed-iframe"; import { getDefaultEvent } from "@calcom/lib/defaultEvents"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { localStorage } from "@calcom/lib/webstorage"; diff --git a/apps/web/pages/team/[slug].tsx b/apps/web/pages/team/[slug].tsx index 90a3ba4d6f..0fd9462de3 100644 --- a/apps/web/pages/team/[slug].tsx +++ b/apps/web/pages/team/[slug].tsx @@ -5,7 +5,7 @@ import { GetServerSidePropsContext } from "next"; import Link from "next/link"; import React, { useEffect } from "react"; -import { useIsEmbed } from "@calcom/embed-core"; +import { useIsEmbed } from "@calcom/embed-core/embed-iframe"; import { WEBSITE_URL } from "@calcom/lib/constants"; import Button from "@calcom/ui/Button"; diff --git a/packages/embeds/embed-core/embed-iframe.ts b/packages/embeds/embed-core/embed-iframe.ts new file mode 100644 index 0000000000..f1811a9314 --- /dev/null +++ b/packages/embeds/embed-core/embed-iframe.ts @@ -0,0 +1,2 @@ +export * from "./src/embed-iframe"; +export * from "./src/sdk-event"; diff --git a/packages/embeds/embed-core/env.d.ts b/packages/embeds/embed-core/env.d.ts index d4685a2c08..f8e62b46a5 100644 --- a/packages/embeds/embed-core/env.d.ts +++ b/packages/embeds/embed-core/env.d.ts @@ -1,7 +1,9 @@ /// interface ImportMetaEnv { - readonly NEXT_PUBLIC_WEBSITE_URL: string; + readonly EMBED_PUBLIC_WEBAPP_URL: string; + readonly EMBED_PUBLIC_VERCEL_URL: string; + readonly EMBED_PUBLIC_EMBED_LIB_URL: string; } interface ImportMeta { diff --git a/packages/embeds/embed-core/index.ts b/packages/embeds/embed-core/index.ts index f1811a9314..b0ce1fa830 100644 --- a/packages/embeds/embed-core/index.ts +++ b/packages/embeds/embed-core/index.ts @@ -1,2 +1,2 @@ -export * from "./src/embed-iframe"; export * from "./src/sdk-event"; +export * from "./src/embed"; diff --git a/packages/embeds/embed-core/package.json b/packages/embeds/embed-core/package.json index ebd8ec7cd0..0f51cdfb2f 100644 --- a/packages/embeds/embed-core/package.json +++ b/packages/embeds/embed-core/package.json @@ -1,10 +1,11 @@ { "name": "@calcom/embed-core", - "version": "1.0.0", + "version": "1.1.0-beta.10", "description": "This is the vanilla JS core script that embeds Cal Link", - "main": "./index.ts", + "main": "./dist/embed/embed.js", + "types": "./dist/index.d.ts", "scripts": { - "__build": "yarn tailwind && vite build", + "__build": "yarn tailwind && vite build && yarn tsc --emitDeclarationOnly --declarationDir dist && cp -r ../../../apps/web/public/embed ./dist/", "__dev": "yarn __build --mode development", "build": "NEXT_PUBLIC_EMBED_FINGER_PRINT=$(git rev-parse --short HEAD) yarn __build", "build-preview": "PREVIEW_BUILD=1 yarn __build ", @@ -16,8 +17,12 @@ "type-check": "tsc --pretty --noEmit", "lint": "eslint --ext .ts,.js src", "embed-tests": "yarn playwright test --config=playwright/config/playwright.config.ts", - "embed-tests-quick": "QUICK=true yarn embed-tests" + "embed-tests-quick": "QUICK=true yarn embed-tests", + "prepare": "NEXT_PUBLIC_WEBAPP_URL='https://app.cal.com' yarn build" }, + "files": [ + "dist" + ], "postcss": { "map": false, "plugins": { @@ -29,11 +34,10 @@ "autoprefixer": "^10.4.7", "eslint": "^8.15.0", "postcss": "^8.4.13", - "vite": "^2.9.9" - }, - "dependencies": { + "vite": "^2.9.9", "tailwindcss": "^3.0.24", "tsc": "^2.0.4", "typescript": "^4.6.4" - } + }, + "dependencies": {} } diff --git a/packages/embeds/embed-core/playwright/config/playwright.config.ts b/packages/embeds/embed-core/playwright/config/playwright.config.ts index 7ccb45ffc3..212ee66cdb 100644 --- a/packages/embeds/embed-core/playwright/config/playwright.config.ts +++ b/packages/embeds/embed-core/playwright/config/playwright.config.ts @@ -22,7 +22,8 @@ const config: PlaywrightTestConfig = { expect: { toMatchSnapshot: { // Opacity transitions can cause small differences - maxDiffPixels: 50, + // Every month the rendered month changes failing the snapshot tests. So, increase the threshold to catch major bugs only. + maxDiffPixelRatio: 0.1, }, }, webServer: { @@ -123,7 +124,7 @@ expect.extend({ const searchParams = u.searchParams; const expectedSearchParams = expectedUrlDetails.searchParams || {}; - for (let [expectedKey, expectedValue] of Object.entries(expectedSearchParams)) { + for (const [expectedKey, expectedValue] of Object.entries(expectedSearchParams)) { const value = searchParams.get(expectedKey); if (value !== expectedValue) { return { diff --git a/packages/embeds/embed-core/playwright/lib/testUtils.ts b/packages/embeds/embed-core/playwright/lib/testUtils.ts index 1ab43dad74..b39e987b1a 100644 --- a/packages/embeds/embed-core/playwright/lib/testUtils.ts +++ b/packages/embeds/embed-core/playwright/lib/testUtils.ts @@ -36,7 +36,7 @@ export const getEmbedIframe = async ({ page, pathname }: { page: Page; pathname: await new Promise((resolve) => { setTimeout(resolve, 2000); }); - let embedIframe = page.frame("cal-embed"); + const embedIframe = page.frame("cal-embed"); if (!embedIframe) { return null; } @@ -83,7 +83,7 @@ export async function bookFirstEvent(username: string, frame: Frame, page: Page) const responseObj = await response.json(); const bookingId = responseObj.uid; // Make sure we're navigated to the success page - await expect(page.locator("[data-testid=success-page]")).toBeVisible(); + await expect(frame.locator("[data-testid=success-page]")).toBeVisible(); expect(await page.screenshot()).toMatchSnapshot("success-page.png"); return bookingId; } diff --git a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/availability-page-1-chromium-darwin.png b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/availability-page-1-chromium-darwin.png index d269136c12..fba6e75568 100644 Binary files a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/availability-page-1-chromium-darwin.png and b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/availability-page-1-chromium-darwin.png differ diff --git a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/booking-page-chromium-darwin.png b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/booking-page-chromium-darwin.png index 83f9a756f8..fd2bde81e4 100644 Binary files a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/booking-page-chromium-darwin.png and b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/booking-page-chromium-darwin.png differ diff --git a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/event-types-list-chromium-darwin.png b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/event-types-list-chromium-darwin.png index 9a3009653e..5d2f8988a4 100644 Binary files a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/event-types-list-chromium-darwin.png and b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/event-types-list-chromium-darwin.png differ diff --git a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/success-page-chromium-darwin.png b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/success-page-chromium-darwin.png index cce76a43e1..940b540226 100644 Binary files a/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/success-page-chromium-darwin.png and b/packages/embeds/embed-core/playwright/tests/inline.test.ts-snapshots/success-page-chromium-darwin.png differ diff --git a/packages/embeds/embed-core/src/FloatingButton/FloatingButton.ts b/packages/embeds/embed-core/src/FloatingButton/FloatingButton.ts index 0c9e9e8e9f..484fa3088b 100644 --- a/packages/embeds/embed-core/src/FloatingButton/FloatingButton.ts +++ b/packages/embeds/embed-core/src/FloatingButton/FloatingButton.ts @@ -1,5 +1,4 @@ -import { CalWindow } from "@calcom/embed-snippet"; - +import { CalWindow } from "../embed"; import getFloatingButtonHtml from "./FloatingButtonHtml"; export class FloatingButton extends HTMLElement { diff --git a/packages/embeds/embed-core/src/Inline/inline.ts b/packages/embeds/embed-core/src/Inline/inline.ts index 6cd74ec4a1..a1f1c260d4 100644 --- a/packages/embeds/embed-core/src/Inline/inline.ts +++ b/packages/embeds/embed-core/src/Inline/inline.ts @@ -1,5 +1,4 @@ -import { CalWindow } from "@calcom/embed-snippet"; - +import { CalWindow } from "../embed"; import loaderCss from "../loader.css"; import { getErrorString } from "../utils"; import inlineHtml from "./inlineHtml"; diff --git a/packages/embeds/embed-core/src/ModalBox/ModalBox.ts b/packages/embeds/embed-core/src/ModalBox/ModalBox.ts index eab4215a8a..8da0e86466 100644 --- a/packages/embeds/embed-core/src/ModalBox/ModalBox.ts +++ b/packages/embeds/embed-core/src/ModalBox/ModalBox.ts @@ -1,5 +1,4 @@ -import { CalWindow } from "@calcom/embed-snippet"; - +import { CalWindow } from "../embed"; import loaderCss from "../loader.css"; import { getErrorString } from "../utils"; import modalBoxHtml from "./ModalBoxHtml"; diff --git a/packages/embeds/embed-core/src/embed.ts b/packages/embeds/embed-core/src/embed.ts index 7a2ba6371b..709dd1221c 100644 --- a/packages/embeds/embed-core/src/embed.ts +++ b/packages/embeds/embed-core/src/embed.ts @@ -1,5 +1,3 @@ -import type { CalWindow } from "@calcom/embed-snippet"; - import { FloatingButton } from "./FloatingButton/FloatingButton"; import { Inline } from "./Inline/inline"; import { ModalBox } from "./ModalBox/ModalBox"; @@ -11,8 +9,7 @@ import allCss from "./tailwind.generated.css"; // HACK: Redefine and don't import WEBAPP_URL as it causes import statement to be present in built file. // This is happening because we are not able to generate an App and a lib using single Vite Config. const WEBAPP_URL = - (import.meta.env.NEXT_PUBLIC_WEBAPP_URL_TYPO as string) || - `https://${import.meta.env.NEXT_PUBLIC_VERCEL_URL}`; + import.meta.env.EMBED_PUBLIC_WEBAPP_URL || `https://${import.meta.env.EMBED_PUBLIC_VERCEL_URL}`; customElements.define("cal-modal-box", ModalBox); customElements.define("cal-floating-button", FloatingButton); @@ -33,7 +30,7 @@ if (!globalCal || !globalCal.q) { // Store Commit Hash to know exactly what version of the code is running // TODO: Ideally it should be the version as per package.json and then it can be renamed to version. // But because it is built on local machine right now, it is much more reliable to have the commit hash. -globalCal.fingerprint = import.meta.env.NEXT_PUBLIC_EMBED_FINGER_PRINT as string; +globalCal.fingerprint = import.meta.env.EMBED_PUBLIC_EMBED_FINGER_PRINT as string; globalCal.__css = allCss; document.head.appendChild(document.createElement("style")).innerHTML = css; @@ -512,6 +509,24 @@ export class Cal { } } +export interface GlobalCal { + (methodName: string, arg?: any): void; + /** Marks that the embed.js is loaded. Avoids re-downloading it. */ + loaded?: boolean; + /** Maintains a queue till the time embed.js isn't loaded */ + q?: InstructionQueue; + /** If user registers multiple namespaces, those are available here */ + ns?: Record; + instance?: Cal; + __css?: string; + fingerprint?: string; + __logQueue?: any[]; +} + +export interface CalWindow extends Window { + Cal?: GlobalCal; +} + globalCal.instance = new Cal("", globalCal.q!); for (const [ns, api] of Object.entries(globalCal.ns!)) { diff --git a/packages/embeds/embed-core/src/preview.ts b/packages/embeds/embed-core/src/preview.ts index b2d2763459..6a9168aafb 100644 --- a/packages/embeds/embed-core/src/preview.ts +++ b/packages/embeds/embed-core/src/preview.ts @@ -1,10 +1,10 @@ -import { CalWindow } from "@calcom/embed-snippet"; +import { CalWindow } from "./embed"; const WEBAPP_URL = - import.meta.env.NEXT_PUBLIC_WEBAPP_URL || `https://${import.meta.env.NEXT_PUBLIC_VERCEL_URL}`; -const EMBED_LIB_URL = import.meta.env.NEXT_PUBLIC_EMBED_LIB_URL || `${WEBAPP_URL}/embed/embed.js`; + import.meta.env.EMBED_PUBLIC_WEBAPP_URL || `https://${import.meta.env.EMBED_PUBLIC_VERCEL_URL}`; +const EMBED_LIB_URL = import.meta.env.EMBED_PUBLIC_EMBED_LIB_URL || `${WEBAPP_URL}/embed/embed.js`; -(window as any).fingerprint = import.meta.env.NEXT_PUBLIC_EMBED_FINGER_PRINT as string; +(window as any).fingerprint = import.meta.env.EMBED_PUBLIC_EMBED_FINGER_PRINT as string; // Install Cal Embed Code Snippet (function (C, A, L) { diff --git a/packages/embeds/embed-core/tsconfig.json b/packages/embeds/embed-core/tsconfig.json index bd3b3e6f54..5e1617a473 100644 --- a/packages/embeds/embed-core/tsconfig.json +++ b/packages/embeds/embed-core/tsconfig.json @@ -8,6 +8,6 @@ "moduleResolution": "Node", "baseUrl": "." }, - "include": ["."], + "include": ["src", "env.d.ts", "index.ts"], "exclude": ["dist", "build", "node_modules"] } diff --git a/packages/embeds/embed-core/vite.config.js b/packages/embeds/embed-core/vite.config.js index cfe4c9cd1e..0f94775561 100644 --- a/packages/embeds/embed-core/vite.config.js +++ b/packages/embeds/embed-core/vite.config.js @@ -1,12 +1,11 @@ -require("dotenv").config({ path: "../../../.env" }); - -process.env.NEXT_PUBLIC_VERCEL_URL = process.env.VERCEL_URL; +import viteBaseConfig from "../vite.config"; const path = require("path"); const { defineConfig } = require("vite"); + module.exports = defineConfig((configEnv) => { const config = { - envPrefix: "NEXT_PUBLIC_", + ...viteBaseConfig, base: "/embed/", build: { minify: "terser", diff --git a/packages/embeds/embed-react/env.d.ts b/packages/embeds/embed-react/env.d.ts index 11f02fe2a0..f8e62b46a5 100644 --- a/packages/embeds/embed-react/env.d.ts +++ b/packages/embeds/embed-react/env.d.ts @@ -1 +1,11 @@ /// + +interface ImportMetaEnv { + readonly EMBED_PUBLIC_WEBAPP_URL: string; + readonly EMBED_PUBLIC_VERCEL_URL: string; + readonly EMBED_PUBLIC_EMBED_LIB_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/packages/embeds/embed-react/package.json b/packages/embeds/embed-react/package.json index a8e7cfd052..d37a54f6ff 100644 --- a/packages/embeds/embed-react/package.json +++ b/packages/embeds/embed-react/package.json @@ -1,13 +1,13 @@ { "name": "@calcom/embed-react", - "version": "1.0.5", + "version": "1.0.6-beta.10", "description": "Embed Cal Link as a React Component", "scripts": { "dev": "vite --port=3101 --open", "tsc": "tsc", "build": "vite build && yarn tsc --emitDeclarationOnly --declarationDir dist", "preview": "vite preview", - "prepare": "yarn build", + "prepare": "NEXT_PUBLIC_EMBED_LIB_URL='https://app.cal.com/embed/embed.js' NEXT_PUBLIC_WEBAPP_URL='https://app.cal.com' yarn build", "type-check": "tsc --pretty --noEmit", "lint": "eslint --ext .ts,.js,.tsx,.jsx ./src", "embed-tests": "yarn playwright test --config=./playwright/config/playwright.config.ts", @@ -17,7 +17,7 @@ }, "main": "./dist/Cal.umd.js", "module": "./dist/Cal.es.js", - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", "peerDependencies": { "react": "^18.1.0", "react-dom": "^18.1.0" @@ -32,14 +32,16 @@ } }, "devDependencies": { - "@calcom/embed-snippet": "^1.0.0", "@types/react": "18.0.9", "@types/react-dom": "18.0.4", "@vitejs/plugin-react": "^1.3.2", "eslint": "^8.15.0", - "vite": "^2.9.9" + "vite": "^2.9.9", + "playwright": "^1.22.1", + "typescript": "^4.6.4" }, "dependencies": { - "typescript": "^4.6.4" + "@calcom/embed-snippet": "1.0.1-beta.10", + "@calcom/embed-core": "1.1.0-beta.10" } } diff --git a/packages/embeds/embed-react/src/index.ts b/packages/embeds/embed-react/src/index.ts index e5743a0af0..527dc02bcb 100644 --- a/packages/embeds/embed-react/src/index.ts +++ b/packages/embeds/embed-react/src/index.ts @@ -1,4 +1,4 @@ -import { CalWindow } from "@calcom/embed-snippet"; +import { CalWindow } from "@calcom/embed-core"; import Cal from "./Cal"; diff --git a/packages/embeds/embed-react/tsconfig.json b/packages/embeds/embed-react/tsconfig.json index 81f5a963d3..b815d65cf6 100644 --- a/packages/embeds/embed-react/tsconfig.json +++ b/packages/embeds/embed-react/tsconfig.json @@ -10,6 +10,6 @@ "@lib/*": ["../../../apps/web/lib/*"] } }, - "include": ["."], + "include": ["src","env.d.ts"], "exclude": ["dist", "build", "node_modules", "test-cal.tsx"] } diff --git a/packages/embeds/embed-react/vite.config.js b/packages/embeds/embed-react/vite.config.js index 991b5f4a23..8992bec327 100644 --- a/packages/embeds/embed-react/vite.config.js +++ b/packages/embeds/embed-react/vite.config.js @@ -2,10 +2,12 @@ import react from "@vitejs/plugin-react"; import path from "path"; import { defineConfig } from "vite"; +import viteBaseConfig from "../vite.config"; + // https://vitejs.dev/config/ export default defineConfig({ + ...viteBaseConfig, plugins: [react()], - envPrefix: "NEXT_PUBLIC_", build: { lib: { entry: path.resolve(__dirname, "src/index.ts"), diff --git a/packages/embeds/embed-snippet/package.json b/packages/embeds/embed-snippet/package.json index dedb9f1f97..06e9b4df49 100644 --- a/packages/embeds/embed-snippet/package.json +++ b/packages/embeds/embed-snippet/package.json @@ -1,14 +1,23 @@ { "name": "@calcom/embed-snippet", - "version": "1.0.0", - "main": "src/index.ts", + "version": "1.0.1-beta.10", + "main": "./dist/snippet.umd.js", + "module": "./dist/snippet.es.js", "description": "Vanilla JS embed snippet that is responsible to fetch @calcom/embed-core and thus show Cal Link as an embed on a page.", "scripts": { - "build": "vite build", + "build": "vite build && yarn tsc --emitDeclarationOnly --declarationDir dist", "type-check": "tsc --pretty --noEmit", - "lint": "eslint --ext .ts,.js src" + "lint": "eslint --ext .ts,.js src", + "prepare":"NEXT_PUBLIC_EMBED_LIB_URL='https://app.cal.com/embed/embed.js' NEXT_PUBLIC_WEBAPP_URL='https://app.cal.com' yarn build" }, + "files": [ + "dist" + ], + "types": "./dist/index.d.ts", "devDependencies": { "eslint": "^8.15.0" + }, + "dependencies": { + "@calcom/embed-core": "^1.1.0-beta.10" } } diff --git a/packages/embeds/embed-snippet/src/index.ts b/packages/embeds/embed-snippet/src/index.ts index 9d877a9016..ab9d2a5b1d 100644 --- a/packages/embeds/embed-snippet/src/index.ts +++ b/packages/embeds/embed-snippet/src/index.ts @@ -4,30 +4,12 @@ * As we want to keep control on the size of this snippet but we want some portion of it to be still readable. * So, write the code that you need directly but keep it short. */ -import type { Cal as CalClass, InstructionQueue } from "@calcom/embed-core/src/embed"; +import { CalWindow } from "@calcom/embed-core"; const WEBAPP_URL = - import.meta.env.NEXT_PUBLIC_WEBAPP_URL || `https://${import.meta.env.NEXT_PUBLIC_VERCEL_URL}`; + import.meta.env.EMBED_PUBLIC_WEBAPP_URL || `https://${import.meta.env.EMBED_PUBLIC_VERCEL_URL}`; -const EMBED_LIB_URL = import.meta.env.NEXT_PUBLIC_EMBED_LIB_URL || `${WEBAPP_URL}/embed/embed.js`; - -export interface GlobalCal { - (methodName: string, arg?: any): void; - /** Marks that the embed.js is loaded. Avoids re-downloading it. */ - loaded?: boolean; - /** Maintains a queue till the time embed.js isn't loaded */ - q?: InstructionQueue; - /** If user registers multiple namespaces, those are available here */ - ns?: Record; - instance?: CalClass; - __css?: string; - fingerprint?: string; - __logQueue?: any[]; -} - -export interface CalWindow extends Window { - Cal?: GlobalCal; -} +const EMBED_LIB_URL = import.meta.env.EMBED_PUBLIC_EMBED_LIB_URL || `${WEBAPP_URL}/embed/embed.js`; export default function EmbedSnippet(url = EMBED_LIB_URL) { (function (C: CalWindow, A, L) { diff --git a/packages/embeds/embed-snippet/tsconfig.json b/packages/embeds/embed-snippet/tsconfig.json index 42b3877672..05d7d4266b 100644 --- a/packages/embeds/embed-snippet/tsconfig.json +++ b/packages/embeds/embed-snippet/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@calcom/tsconfig/base.json", "compilerOptions": { "baseUrl": ".", - "module": "esnext" + "module": "esnext", + "declaration": true }, "include": ["."], "exclude": ["dist", "build", "node_modules"] diff --git a/packages/embeds/embed-snippet/vite.config.js b/packages/embeds/embed-snippet/vite.config.js index bee01c77ac..b23b88e11d 100644 --- a/packages/embeds/embed-snippet/vite.config.js +++ b/packages/embeds/embed-snippet/vite.config.js @@ -1,13 +1,11 @@ -require("dotenv").config({ path: "../../../.env" }); +import viteBaseConfig from "../vite.config"; const path = require("path"); const { defineConfig } = require("vite"); -process.env.NEXT_PUBLIC_VERCEL_URL = process.env.VERCEL_URL; - module.exports = defineConfig({ + ...viteBaseConfig, build: { - envPrefix: "NEXT_PUBLIC_", lib: { entry: path.resolve(__dirname, "src", "index.ts"), name: "snippet", diff --git a/packages/embeds/vite.config.js b/packages/embeds/vite.config.js new file mode 100644 index 0000000000..17bef332d0 --- /dev/null +++ b/packages/embeds/vite.config.js @@ -0,0 +1,9 @@ +require("dotenv").config({ path: "../../.env" }); +process.env.EMBED_PUBLIC_VERCEL_URL = process.env.VERCEL_URL; +process.env.EMBED_PUBLIC_WEBAPP_URL = process.env.NEXT_PUBLIC_WEBAPP_URL; +process.env.EMBED_PUBLIC_EMBED_LIB_URL = process.env.NEXT_PUBLIC_EMBED_LIB_URL; + +const viteBaseConfig = { + envPrefix: "EMBED_PUBLIC_", +}; +export default viteBaseConfig; diff --git a/yarn.lock b/yarn.lock index 7301a7575b..b5b7a41803 100644 --- a/yarn.lock +++ b/yarn.lock @@ -746,6 +746,18 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== +"@calcom/embed-react@^1.0.2": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@calcom/embed-react/-/embed-react-1.0.5.tgz#8c14bd3d89105e5ba6d0720ed74ec76f8a883f89" + integrity sha512-d9OXMM8w+F9ztl0g+FOQXtJVgIlZAyEw5lhX1aumFnMxHJJWF361//u5D2hsnnAunRV3444iAvI8++848Tf3Vg== + dependencies: + "@calcom/embed-snippet" "^1.0.0" + +"@calcom/embed-snippet@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@calcom/embed-snippet/-/embed-snippet-1.0.0.tgz#e4cf75e0b217312767287b20db54cab9c8ebf94f" + integrity sha512-nMcFkNNhwXqaS55JPeGVj2arDpu1ka6TRC1n1g2cC8G7fLEcWrJbkdiVkoQL8YrEm8t74CgtEE2BLCU4+LTzmg== + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1166,7 +1178,7 @@ resolved "https://registry.yarnpkg.com/@glidejs/glide/-/glide-3.5.2.tgz#7012c5920ecf202bbda44d8526fc979984b6dd54" integrity sha512-7jGciNJ2bQ4eZLSNlSZ+VAyW63kALf420CvkEpK4lEsUfWJq9odqimci0YCiyNyMUFB+pWHwLYyNc57dijYsCg== -"@headlessui/react@^1.4.1", "@headlessui/react@^1.5.0": +"@headlessui/react@^1.4.1": version "1.6.1" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.6.1.tgz#d822792e589aac005462491dd62f86095e0c3bef" integrity sha512-gMd6uIs1U4Oz718Z5gFoV0o/vD43/4zvbyiJN9Dt7PK9Ubxn+TmJwTmYwyNJc5KxxU1t0CmgTNgwZX9+4NjCnQ== @@ -3092,7 +3104,7 @@ dependencies: defer-to-connect "^1.0.1" -"@tailwindcss/forms@^0.5.0", "@tailwindcss/forms@^0.5.1": +"@tailwindcss/forms@^0.5.1": version "0.5.1" resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.1.tgz#7fe86b9b67e6d91cb902e2d3f4ebe561cc057a13" integrity sha512-QSwsFORnC2BAP0lRzQkz1pw+EzIiiPdk4e27vGQjyXkwJPeC7iLIRVndJzf9CJVbcrrIcirb/TfxF3gRTyFEVA== @@ -4352,7 +4364,7 @@ autolinker@^3.11.0: dependencies: tslib "^2.3.0" -autoprefixer@^10.3.4, autoprefixer@^10.4.2, autoprefixer@^10.4.7: +autoprefixer@^10.3.4, autoprefixer@^10.4.7: version "10.4.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== @@ -5240,11 +5252,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chart.js@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.7.1.tgz#0516f690c6a8680c6c707e31a4c1807a6f400ada" - integrity sha512-8knRegQLFnPQAheZV8MjxIXc5gQEfDFD897BJgv/klO/vtIyFFmgMXrNfgrXpbTr/XbTturxRgxIXx/Y+ASJBA== - chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -6775,7 +6782,7 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.15.0, eslint@^8.10.0, eslint@^8.15.0: +eslint@^8.10.0, eslint@^8.15.0: version "8.15.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.15.0.tgz#fea1d55a7062da48d82600d2e0974c55612a11e9" integrity sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA== @@ -11793,7 +11800,7 @@ next-api-middleware@^1.0.1: dependencies: debug "^4.3.2" -next-auth@^4.3.3, next-auth@^4.3.4: +next-auth@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.3.4.tgz#7b241e34e1f68632768cef8ee289e33256cb2b19" integrity sha512-8dGkNicbxY2BYsJq4uOJIEsGt39wXj5AViTBsVfbRQqtAFmZmXYHutf90VBmobm8rT2+Xl60HDUTkuVVK+x+xw== @@ -12863,6 +12870,18 @@ playwright-core@1.22.1: resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.22.1.tgz#59ddf903546171fdfd9c3dc189630c883619667c" integrity sha512-H+ZUVYnceWNXrRf3oxTEKAr81QzFsCKu5Fp//fEjQvqgKkfA1iX3E9DBrPJpPNOrgVzcE+IqeI0fDmYJe6Ynnw== +playwright-core@1.22.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.22.2.tgz#ed2963d79d71c2a18d5a6fd25b60b9f0a344661a" + integrity sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q== + +playwright@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.22.2.tgz#353a7c29f89ca9600edc7a9a30aed790823c797d" + integrity sha512-hUTpg7LytIl3/O4t0AQJS1V6hWsaSY5uZ7w1oCC8r3a1AQN5d6otIdCkiB3cbzgQkcMaRxisinjMFMVqZkybdQ== + dependencies: + playwright-core "1.22.2" + pngjs@^3.0.0, pngjs@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" @@ -12922,7 +12941,7 @@ postcss@8.4.5: picocolors "^1.0.0" source-map-js "^1.0.1" -postcss@^8.3.6, postcss@^8.4.13, postcss@^8.4.8: +postcss@^8.3.6, postcss@^8.4.13: version "8.4.13" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== @@ -13342,11 +13361,6 @@ react-calendar@^3.3.1: merge-class-names "^1.1.1" prop-types "^15.6.0" -react-chartjs-2@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-4.1.0.tgz#2a123df16d3a987c54eb4e810ed766d3c03adf8d" - integrity sha512-AsUihxEp8Jm1oBhbEovE+w50m9PVNhz1sfwEIT4hZduRC0m14gHWHd0cUaxkFDb8HNkdMIGzsNlmVqKiOpU74g== - react-colorful@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.5.1.tgz#29d9c4e496f2ca784dd2bb5053a3a4340cfaf784" @@ -15135,11 +15149,6 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -swr@^1.2.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" - integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -17047,6 +17056,11 @@ zod-prisma@^0.5.4: parenthesis "^3.1.8" ts-morph "^13.0.2" +zod@^3.14.4: + version "3.17.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.17.3.tgz#86abbc670ff0063a4588d85a4dcc917d6e4af2ba" + integrity sha512-4oKP5zvG6GGbMlqBkI5FESOAweldEhSOZ6LI6cG+JzUT7ofj1ZOC0PJudpQOpT1iqOFpYYtX5Pw0+o403y4bcg== + zod@^3.16.0: version "3.16.0" resolved "https://registry.yarnpkg.com/zod/-/zod-3.16.0.tgz#edfdbf77fcc9a5af13a2630a44bdda5b90e759b7"