fix: add dynamic sitemap.xml and fix eslint config
Some checks failed
Build & Deploy / 🔍 Prepare Environment (push) Successful in 9s
Build & Deploy / 🧪 QA (push) Failing after 49s
Build & Deploy / 🏗️ Build (push) Successful in 6m57s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / ⚡ PageSpeed (push) Has been skipped
Build & Deploy / 🔔 Notifications (push) Successful in 2s
Some checks failed
Build & Deploy / 🔍 Prepare Environment (push) Successful in 9s
Build & Deploy / 🧪 QA (push) Failing after 49s
Build & Deploy / 🏗️ Build (push) Successful in 6m57s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / ⚡ PageSpeed (push) Has been skipped
Build & Deploy / 🔔 Notifications (push) Successful in 2s
This commit is contained in:
56
apps/web/app/sitemap.ts
Normal file
56
apps/web/app/sitemap.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import { MetadataRoute } from 'next';
|
||||||
|
import { blogPosts } from '../src/data/blogPosts';
|
||||||
|
import { technologies } from './technologies/[slug]/data';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sitemap Generator
|
||||||
|
*
|
||||||
|
* Standard Next.js 15 App Router sitemap generation.
|
||||||
|
* This file dynamically generates /sitemap.xml
|
||||||
|
*/
|
||||||
|
export default function sitemap(): MetadataRoute.Sitemap {
|
||||||
|
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'https://mintel.me';
|
||||||
|
|
||||||
|
// 1. Core Pages
|
||||||
|
const routes = [
|
||||||
|
'',
|
||||||
|
'/about',
|
||||||
|
'/blog',
|
||||||
|
'/case-studies',
|
||||||
|
'/case-studies/klz-cables',
|
||||||
|
'/contact',
|
||||||
|
'/websites',
|
||||||
|
].map((route) => ({
|
||||||
|
url: `${baseUrl}${route}`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'monthly' as const,
|
||||||
|
priority: route === '' ? 1.0 : 0.8,
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 2. Dynamic Blog Posts
|
||||||
|
const blogRoutes = blogPosts.map((post) => ({
|
||||||
|
url: `${baseUrl}/blog/${post.slug}`,
|
||||||
|
lastModified: new Date(post.date),
|
||||||
|
changeFrequency: 'monthly' as const,
|
||||||
|
priority: 0.7,
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 3. Technology Detail Pages
|
||||||
|
const techRoutes = Object.keys(technologies).map((slug) => ({
|
||||||
|
url: `${baseUrl}/technologies/${slug}`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'monthly' as const,
|
||||||
|
priority: 0.6,
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 4. Tag Pages
|
||||||
|
const allTags = [...new Set(blogPosts.flatMap((post) => post.tags))];
|
||||||
|
const tagRoutes = allTags.map((tag) => ({
|
||||||
|
url: `${baseUrl}/tags/${tag}`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'weekly' as const,
|
||||||
|
priority: 0.3,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return [...routes, ...blogRoutes, ...techRoutes, ...tagRoutes];
|
||||||
|
}
|
||||||
@@ -3,17 +3,9 @@ import tseslint from "typescript-eslint";
|
|||||||
import nextPlugin from "@next/eslint-plugin-next";
|
import nextPlugin from "@next/eslint-plugin-next";
|
||||||
import reactPlugin from "eslint-plugin-react";
|
import reactPlugin from "eslint-plugin-react";
|
||||||
import hooksPlugin from "eslint-plugin-react-hooks";
|
import hooksPlugin from "eslint-plugin-react-hooks";
|
||||||
import { FlatCompat } from "@eslint/eslintrc";
|
|
||||||
import { dirname } from "path";
|
|
||||||
import { fileURLToPath } from "url";
|
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
const __dirname = dirname(__filename);
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
const compat = new FlatCompat({
|
|
||||||
baseDirectory: __dirname,
|
|
||||||
});
|
|
||||||
|
|
||||||
export default tseslint.config(
|
export default tseslint.config(
|
||||||
{
|
{
|
||||||
ignores: ["**/dist/**", "**/node_modules/**", "**/.next/**", "**/out/**"],
|
ignores: ["**/dist/**", "**/node_modules/**", "**/.next/**", "**/out/**"],
|
||||||
@@ -34,15 +26,6 @@ export default tseslint.config(
|
|||||||
"react/react-in-jsx-scope": "off",
|
"react/react-in-jsx-scope": "off",
|
||||||
"react/no-unescaped-entities": "off",
|
"react/no-unescaped-entities": "off",
|
||||||
"@next/next/no-img-element": "warn",
|
"@next/next/no-img-element": "warn",
|
||||||
},
|
|
||||||
settings: {
|
|
||||||
react: {
|
|
||||||
version: "detect",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
rules: {
|
|
||||||
"no-unused-vars": "warn",
|
"no-unused-vars": "warn",
|
||||||
"@typescript-eslint/no-unused-vars": ["warn", {
|
"@typescript-eslint/no-unused-vars": ["warn", {
|
||||||
"argsIgnorePattern": "^_",
|
"argsIgnorePattern": "^_",
|
||||||
@@ -68,5 +51,10 @@ export default tseslint.config(
|
|||||||
"no-self-assign": "off",
|
"no-self-assign": "off",
|
||||||
"no-control-regex": "off",
|
"no-control-regex": "off",
|
||||||
},
|
},
|
||||||
|
settings: {
|
||||||
|
react: {
|
||||||
|
version: "detect",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user