diff --git a/app/api/health/route.ts b/app/api/health/route.ts
new file mode 100644
index 0000000..e8fd8c5
--- /dev/null
+++ b/app/api/health/route.ts
@@ -0,0 +1,3 @@
+export async function GET() {
+ return Response.json({ status: "ok" })
+}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..a872374
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,9 @@
+import "styles/tailwind.css"
+
+export default function RootLayout({ children }: { children: React.ReactNode }) {
+ return (
+
+
{children}
+
+ )
+}
diff --git a/pages/index.tsx b/app/page.tsx
similarity index 87%
rename from pages/index.tsx
rename to app/page.tsx
index b4ed3a4..69dbb3e 100644
--- a/pages/index.tsx
+++ b/app/page.tsx
@@ -1,7 +1,7 @@
import { GetServerSidePropsContext } from "next"
import Head from "next/head"
import { Button } from "components/Button/Button"
-import { LP_GRID_ITEMS } from "../lp-items"
+import { LP_GRID_ITEMS } from "lp-items"
export default function Web() {
return (
@@ -59,17 +59,3 @@ export default function Web() {
)
}
-export async function getServerSideProps({ req, res }: GetServerSidePropsContext) {
- if (req.headers?.host?.includes("next-enterprise.vercel.app")) {
- return {
- redirect: {
- destination: "https://blazity.com/open-source/nextjs-enterprise-boilerplate",
- permanent: true,
- },
- }
- }
-
- return {
- props: {},
- }
-}
diff --git a/middleware.ts b/middleware.ts
new file mode 100644
index 0000000..59f3bf0
--- /dev/null
+++ b/middleware.ts
@@ -0,0 +1,22 @@
+import { NextResponse } from "next/server"
+import type { NextRequest } from "next/server"
+
+export function middleware(request: NextRequest) {
+ // TODO: Feel free to remove this block
+ if (request.headers?.get("host")?.includes("next-enterprise.vercel.app")) {
+ return NextResponse.redirect("https://blazity.com/open-source/nextjs-enterprise-boilerplate", { status: 301 })
+ }
+}
+
+export const config = {
+ matcher: [
+ /*
+ * Match all request paths except for the ones starting with:
+ * - api (API routes)
+ * - _next/static (static files)
+ * - _next/image (image optimization files)
+ * - favicon.ico (favicon file)
+ */
+ "/((?!api|_next/static|_next/image|favicon.ico).*)",
+ ],
+}
diff --git a/package.json b/package.json
index 13845a5..ebb87ff 100644
--- a/package.json
+++ b/package.json
@@ -79,6 +79,7 @@
"@testing-library/jest-dom": "^6.1.4",
"@testing-library/react": "^14.1.2",
"@total-typescript/ts-reset": "^0.5.1",
+ "@types/jest": "^29.5.10",
"@types/node": "^20.10.0",
"@types/react": "^18.2.38",
"@types/react-dom": "^18.2.17",
@@ -102,7 +103,7 @@
"patch-package": "^8.0.0",
"postcss": "^8.4.31",
"postinstall-postinstall": "^2.1.0",
- "prettier": "^3.1.0",
+ "prettier": "3.0.3",
"prettier-plugin-tailwindcss": "^0.5.7",
"semantic-release": "^22.0.8",
"storybook": "^7.5.3",
diff --git a/pages/_app.test.tsx b/pages/_app.test.tsx
deleted file mode 100644
index adc4579..0000000
--- a/pages/_app.test.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { render } from "@testing-library/react"
-import { AppProps } from "next/app"
-import MyApp from "./_app"
-
-// Mock router object with required properties
-const router = {
- basePath: "",
- pathname: "/",
- query: {},
- asPath: "/",
-}
-
-describe("MyApp", () => {
- it("should render a component with page props", () => {
- const props: AppProps = {
- Component: ({ title }) => (
- <>
- Test Component
- {title}
- >
- ),
- pageProps: { title: "Test Page" },
- router: router as never, // Include mocked router object in props
- }
- const { getByText } = render()
- expect(getByText("Test Component")).toBeInTheDocument()
- expect(getByText("Test Page")).toBeInTheDocument()
- })
-})
diff --git a/pages/_app.tsx b/pages/_app.tsx
deleted file mode 100644
index 3d83a02..0000000
--- a/pages/_app.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import "../styles/tailwind.css"
-
-import { AppProps } from "next/app"
-
-function MyApp({ Component, pageProps }: AppProps) {
- return
-}
-
-export default MyApp
diff --git a/pages/api/health.ts b/pages/api/health.ts
deleted file mode 100644
index 05fda7d..0000000
--- a/pages/api/health.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from "next"
-
-export default function handler(req: NextApiRequest, res: NextApiResponse) {
- res.status(200).json({ status: "ok" })
-}
diff --git a/tsconfig.json b/tsconfig.json
index fb699fe..d87e3ed 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,6 +7,7 @@
"allowJs": true,
"skipLibCheck": true,
"strict": true,
+ "noUncheckedIndexedAccess": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
@@ -16,8 +17,14 @@
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
- "baseUrl": "."
+ "baseUrl": ".",
+ "types": ["node", "jest", "@testing-library/jest-dom"],
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.mjs", "jest.config.js"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.mjs", "jest.config.js", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
diff --git a/yarn.lock b/yarn.lock
index 35dea95..c693f88 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4974,6 +4974,14 @@
dependencies:
"@types/istanbul-lib-report" "*"
+"@types/jest@^29.5.10":
+ version "29.5.10"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.10.tgz#a10fc5bab9e426081c12b2ef73d24d4f0c9b7f50"
+ integrity sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==
+ dependencies:
+ expect "^29.0.0"
+ pretty-format "^29.0.0"
+
"@types/jsdom@^20.0.0":
version "20.0.1"
resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808"
@@ -8576,7 +8584,7 @@ expect-playwright@^0.8.0:
resolved "https://registry.yarnpkg.com/expect-playwright/-/expect-playwright-0.8.0.tgz#6d4ebe0bdbdd3c1693d880d97153b96a129ae4e8"
integrity sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==
-expect@^29.7.0:
+expect@^29.0.0, expect@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc"
integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==
@@ -13108,16 +13116,16 @@ prettier-plugin-tailwindcss@^0.5.7:
resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.7.tgz#d05dc42c6f2167e3bf2c20e9f71a1fff4232b5d9"
integrity sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==
+prettier@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643"
+ integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==
+
prettier@^2, prettier@^2.8.0:
version "2.8.8"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
-prettier@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e"
- integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==
-
pretty-error@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6"
@@ -13135,7 +13143,7 @@ pretty-format@^27.0.2:
ansi-styles "^5.0.0"
react-is "^17.0.1"
-pretty-format@^29.7.0:
+pretty-format@^29.0.0, pretty-format@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==