From 0d179ad4a6243c302b62d9f87bee94e62248fd1d Mon Sep 17 00:00:00 2001 From: Masonlet Date: Mon, 23 Mar 2026 15:32:38 -0400 Subject: [PATCH 1/2] refactor: migrate core logic to src directory --- api/contact/index.ts | 8 ++++---- package-lock.json | 4 ++-- {api/contact => src}/config.ts | 0 {api/contact => src}/cors.ts | 0 {api/contact => src}/email.ts | 0 {api/contact => src}/types.ts | 0 {api/contact => src}/validation.ts | 0 tests/contact/cors.test.ts | 2 +- tests/contact/email.test.ts | 4 ++-- tests/contact/index.test.ts | 14 +++++++------- tests/contact/validation.test.ts | 2 +- tsconfig.json | 3 ++- 12 files changed, 19 insertions(+), 18 deletions(-) rename {api/contact => src}/config.ts (100%) rename {api/contact => src}/cors.ts (100%) rename {api/contact => src}/email.ts (100%) rename {api/contact => src}/types.ts (100%) rename {api/contact => src}/validation.ts (100%) diff --git a/api/contact/index.ts b/api/contact/index.ts index 240e608..77da68f 100644 --- a/api/contact/index.ts +++ b/api/contact/index.ts @@ -1,9 +1,9 @@ import type { VercelRequest, VercelResponse } from "@vercel/node"; import { checkRateLimit } from "@vercel/firewall" -import { setCorsHeaders } from "./cors.js"; -import { isValidBody } from "./validation.js"; -import { getEmailConfig, sendEmail } from "./email.js"; -import { config } from "./config.js"; +import { setCorsHeaders } from "@/src/cors.js"; +import { isValidBody } from "@/src/validation.js"; +import { getEmailConfig, sendEmail } from "@/src/email.js"; +import { config } from "@/src/config.js"; export default async (req: VercelRequest, res: VercelResponse): Promise => { const cors = setCorsHeaders(req, res, config.allowedOrigins); diff --git a/package-lock.json b/package-lock.json index dc00065..c3371b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "contact-api", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "contact-api", - "version": "1.0.0", + "version": "1.1.0", "license": "MIT", "dependencies": { "@vercel/firewall": "^1.1.2", diff --git a/api/contact/config.ts b/src/config.ts similarity index 100% rename from api/contact/config.ts rename to src/config.ts diff --git a/api/contact/cors.ts b/src/cors.ts similarity index 100% rename from api/contact/cors.ts rename to src/cors.ts diff --git a/api/contact/email.ts b/src/email.ts similarity index 100% rename from api/contact/email.ts rename to src/email.ts diff --git a/api/contact/types.ts b/src/types.ts similarity index 100% rename from api/contact/types.ts rename to src/types.ts diff --git a/api/contact/validation.ts b/src/validation.ts similarity index 100% rename from api/contact/validation.ts rename to src/validation.ts diff --git a/tests/contact/cors.test.ts b/tests/contact/cors.test.ts index 23aab78..d05285e 100644 --- a/tests/contact/cors.test.ts +++ b/tests/contact/cors.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, vi } from "vitest"; -import { setCorsHeaders } from "@/api/contact/cors.js"; +import { setCorsHeaders } from "@/src/cors.js"; import type { VercelRequest, VercelResponse } from "@vercel/node"; const makeReq = (origin?: string, method = "POST") => ({ diff --git a/tests/contact/email.test.ts b/tests/contact/email.test.ts index 05bd725..5fbefac 100644 --- a/tests/contact/email.test.ts +++ b/tests/contact/email.test.ts @@ -1,7 +1,7 @@ import { vi, describe, it, expect, beforeEach } from "vitest"; import type { Resend } from "resend"; -import { getEmailConfig, sendEmail, type EmailConfig } from "@/api/contact/email.js"; -import type { ContactBody } from "@/api/contact/types.js"; +import { getEmailConfig, sendEmail, type EmailConfig } from "@/src/email.js"; +import type { ContactBody } from "@/src/types.js"; vi.mock("resend"); diff --git a/tests/contact/index.test.ts b/tests/contact/index.test.ts index 355c861..719da37 100644 --- a/tests/contact/index.test.ts +++ b/tests/contact/index.test.ts @@ -2,15 +2,15 @@ import { vi, describe, it, expect, beforeEach } from "vitest"; import type { VercelRequest, VercelResponse } from "@vercel/node"; vi.mock("@vercel/firewall", () => ({ checkRateLimit: vi.fn() })); -vi.mock("@/api/contact/cors.js", () => ({ setCorsHeaders: vi.fn() })); -vi.mock("@/api/contact/validation.js", () => ({ isValidBody: vi.fn() })); -vi.mock("@/api/contact/email.js", () => ({ getEmailConfig: vi.fn(), sendEmail: vi.fn() })); -vi.mock("@/api/contact/config.js", () => ({ config: { allowedOrigins: ["https://example.com"] } })); +vi.mock("@/src/cors.js", () => ({ setCorsHeaders: vi.fn() })); +vi.mock("@/src/validation.js", () => ({ isValidBody: vi.fn() })); +vi.mock("@/src/email.js", () => ({ getEmailConfig: vi.fn(), sendEmail: vi.fn() })); +vi.mock("@/src/config.js", () => ({ config: { allowedOrigins: ["https://example.com"] } })); import { checkRateLimit } from "@vercel/firewall"; -import { setCorsHeaders } from "@/api/contact/cors.js"; -import { isValidBody } from "@/api/contact/validation.js"; -import { getEmailConfig, sendEmail } from "@/api/contact/email.js"; +import { setCorsHeaders } from "@/src/cors.js"; +import { isValidBody } from "@/src/validation.js"; +import { getEmailConfig, sendEmail } from "@/src/email.js"; import handler from "@/api/contact/index.js"; const makeReq = (overrides: Partial = {}): VercelRequest => ({ diff --git a/tests/contact/validation.test.ts b/tests/contact/validation.test.ts index 9175c19..79828ce 100644 --- a/tests/contact/validation.test.ts +++ b/tests/contact/validation.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { EMAIL_REGEX, isValidBody } from "@/api/contact/validation.js"; +import { EMAIL_REGEX, isValidBody } from "@/src/validation.js"; describe("EMAIL_REGEX", () => { const validate = (email: string) => EMAIL_REGEX.test(email); diff --git a/tsconfig.json b/tsconfig.json index 19cf6b6..5ab8662 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -49,7 +49,8 @@ } }, "include": [ - "./api/**/*.ts" + "./api/**/*.ts", + "./src/**/*.ts" ], "exclude": [ "dist/", From 502db655869763a792540f64ae027138d93701fc Mon Sep 17 00:00:00 2001 From: Masonlet Date: Mon, 23 Mar 2026 15:37:43 -0400 Subject: [PATCH 2/2] chore: bump version to 1.1.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3371b4..ebe9a1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "contact-api", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "contact-api", - "version": "1.1.0", + "version": "1.1.1", "license": "MIT", "dependencies": { "@vercel/firewall": "^1.1.2", diff --git a/package.json b/package.json index bfb6109..b348f11 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "contact-api", "type": "module", - "version": "1.1.0", + "version": "1.1.1", "description": "Deployable contact form API", "author": "Mason L'Etoile", "license": "MIT",