diff --git a/.changeset/remove-base-url.md b/.changeset/remove-base-url.md new file mode 100644 index 0000000..344c64f --- /dev/null +++ b/.changeset/remove-base-url.md @@ -0,0 +1,9 @@ +--- +"@formrelay/core": patch +"@formrelay/vue": patch +"@formrelay/nuxt": patch +--- + +Remove `baseUrl` from public API. The FormRelay API URL is now hardcoded. Override via `FORMRELAY_API_URL` env var at build time for local development. + +Nuxt module now supports both Nuxt 3 and Nuxt 4. diff --git a/packages/core/src/client.test.ts b/packages/core/src/client.test.ts index 33713d7..9b705ef 100644 --- a/packages/core/src/client.test.ts +++ b/packages/core/src/client.test.ts @@ -108,7 +108,7 @@ describe("createForm", () => { ); }); - test("uses default baseUrl when not provided", async () => { + test("uses hardcoded API base URL", async () => { const client = createMockHttpClient(); const form = createForm("01abc", { publicKey: "pk_fr_test", @@ -122,20 +122,4 @@ describe("createForm", () => { expect.any(Object), ); }); - - test("uses custom baseUrl when provided", async () => { - const client = createMockHttpClient(); - const form = createForm("01abc", { - publicKey: "pk_fr_test", - baseUrl: "https://custom.api.com", - httpClient: client, - }); - - await form.getSchema(); - - expect(client.get).toHaveBeenCalledWith( - "https://custom.api.com/api/v1/form/01abc/schema", - expect.any(Object), - ); - }); }); diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts index 8fb3a05..65109d3 100644 --- a/packages/core/src/client.ts +++ b/packages/core/src/client.ts @@ -4,10 +4,10 @@ import type { SubmitResult } from "./submit"; import { createFetchAdapter } from "./http/fetch"; import { createSchemaFetcher } from "./schema"; import { submitForm } from "./submit"; +import { API_BASE_URL } from "./constants"; export interface FormClientOptions { publicKey: string; - baseUrl?: string; httpClient?: HttpAdapter; } @@ -17,9 +17,8 @@ export interface FormClient { } export function createForm(formId: string, options: FormClientOptions): FormClient { - const baseUrl = options.baseUrl ?? "https://formrelay.app"; const httpClient = options.httpClient ?? createFetchAdapter(); - const fetchSchema = createSchemaFetcher(formId, baseUrl, options.publicKey, httpClient); + const fetchSchema = createSchemaFetcher(formId, API_BASE_URL, options.publicKey, httpClient); let cachedSchema: FormSchema | null = null; diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts new file mode 100644 index 0000000..cad2be2 --- /dev/null +++ b/packages/core/src/constants.ts @@ -0,0 +1,2 @@ +export const API_BASE_URL: string = + (typeof process !== "undefined" && process.env?.FORMRELAY_API_URL) || "https://formrelay.app"; diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 5ab7ec5..0fd8f7e 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -27,6 +27,6 @@ "vite-plus": "latest" }, "peerDependencies": { - "nuxt": "^3.0.0" + "nuxt": "^3.0.0 || ^4.0.0" } } diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 1ecd739..4204ba3 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -3,7 +3,6 @@ import { defineNuxtModule, addImports, addComponent, createResolver } from "@nux export interface ModuleOptions { publicKey?: string; secretKey?: string; - baseUrl?: string; } export default defineNuxtModule({ @@ -11,15 +10,12 @@ export default defineNuxtModule({ name: "@formrelay/nuxt", configKey: "formrelay", }, - defaults: { - baseUrl: "https://formrelay.app", - }, + defaults: {}, setup(options, nuxt) { const resolver = createResolver(import.meta.url); nuxt.options.runtimeConfig.public.formrelay = { publicKey: options.publicKey ?? "", - baseUrl: options.baseUrl ?? "https://formrelay.app", }; if (options.secretKey) { diff --git a/packages/nuxt/src/runtime/composables/useFormRelay.ts b/packages/nuxt/src/runtime/composables/useFormRelay.ts index faf2965..6b12d0a 100644 --- a/packages/nuxt/src/runtime/composables/useFormRelay.ts +++ b/packages/nuxt/src/runtime/composables/useFormRelay.ts @@ -36,7 +36,6 @@ export async function useFormRelay(options: Partial & { for const runtimeConfig = useRuntimeConfig(); const config = runtimeConfig.public.formrelay as { publicKey: string; - baseUrl: string; }; const secretKey = (runtimeConfig as Record).formrelaySecretKey as @@ -44,17 +43,14 @@ export async function useFormRelay(options: Partial & { for | undefined; const publicKey = options.publicKey ?? config.publicKey; - const baseUrl = options.baseUrl ?? config.baseUrl; - // For SSR schema fetch: use secret key adapter if configured (server-only) const schemaClient = import.meta.server && secretKey ? createForm(options.formId, { publicKey, - baseUrl, httpClient: createSecretKeyAdapter(secretKey), }) - : createForm(options.formId, { publicKey, baseUrl }); + : createForm(options.formId, { publicKey }); const { data: initialSchema } = await useAsyncData(`formrelay-schema-${options.formId}`, () => schemaClient.getSchema(), @@ -63,7 +59,6 @@ export async function useFormRelay(options: Partial & { for return useVueFormRelay({ formId: options.formId, publicKey, - baseUrl, initialSchema: initialSchema.value ?? undefined, validate: options.validate, onSuccess: options.onSuccess, diff --git a/packages/vue/src/components/FormRelay.test.ts b/packages/vue/src/components/FormRelay.test.ts index 94f45ed..d1e7290 100644 --- a/packages/vue/src/components/FormRelay.test.ts +++ b/packages/vue/src/components/FormRelay.test.ts @@ -75,14 +75,12 @@ describe("FormRelay", () => { props: { formId: "form-123", publicKey: "pk_fr_abc", - baseUrl: "https://custom.api.com", }, slots: { default: () => h("div") }, }); expect(createForm).toHaveBeenCalledWith("form-123", { publicKey: "pk_fr_abc", - baseUrl: "https://custom.api.com", }); }); diff --git a/packages/vue/src/components/FormRelay.ts b/packages/vue/src/components/FormRelay.ts index 7d3e161..6b36ea2 100644 --- a/packages/vue/src/components/FormRelay.ts +++ b/packages/vue/src/components/FormRelay.ts @@ -7,7 +7,6 @@ export default defineComponent({ props: { formId: { type: String, required: true }, publicKey: { type: String, required: true }, - baseUrl: { type: String, default: undefined }, validate: { type: Function, default: undefined }, onSuccess: { type: Function, default: undefined }, onError: { type: Function, default: undefined }, diff --git a/packages/vue/src/composables/useFormRelay.test.ts b/packages/vue/src/composables/useFormRelay.test.ts index 076abce..0f63bf1 100644 --- a/packages/vue/src/composables/useFormRelay.test.ts +++ b/packages/vue/src/composables/useFormRelay.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test, vi, beforeEach } from "vitest"; import { nextTick, isRef, isReactive } from "vue"; -import { createForm, ValidationError } from "@formrelay/core"; +import { ValidationError } from "@formrelay/core"; import { useFormRelay } from "./useFormRelay"; const mockFields = [ @@ -306,19 +306,6 @@ describe("useFormRelay", () => { expect(mockSubmit).not.toHaveBeenCalled(); }); - test("passes baseUrl to createForm", () => { - useFormRelay({ - formId: "01abc", - publicKey: "pk_fr_test", - baseUrl: "https://custom.api.com", - }); - - expect(createForm).toHaveBeenCalledWith("01abc", { - publicKey: "pk_fr_test", - baseUrl: "https://custom.api.com", - }); - }); - test("canSubmit is false while bot protection token is missing", () => { const { canSubmit, setBotToken } = useFormRelay({ formId: "01abc", diff --git a/packages/vue/src/composables/useFormRelay.ts b/packages/vue/src/composables/useFormRelay.ts index 390c7d4..01cb78c 100644 --- a/packages/vue/src/composables/useFormRelay.ts +++ b/packages/vue/src/composables/useFormRelay.ts @@ -12,7 +12,6 @@ import type { UseFormRelayOptions, UseFormRelayReturn } from "../types"; export function useFormRelay(options: UseFormRelayOptions): UseFormRelayReturn { const client = createForm(options.formId, { publicKey: options.publicKey, - baseUrl: options.baseUrl, }); const schema = ref(null); diff --git a/packages/vue/src/types.ts b/packages/vue/src/types.ts index c204042..80e8ce7 100644 --- a/packages/vue/src/types.ts +++ b/packages/vue/src/types.ts @@ -10,7 +10,6 @@ import type { ComputedRef, Ref } from "vue"; export interface UseFormRelayOptions { formId: string; publicKey: string; - baseUrl?: string; initialSchema?: FormSchema; validate?: (data: Record, schema: JsonSchema) => Record; onSuccess?: (result: { message: string }) => void;