From 813fa218e969444237f3ef4dbd9582cd7e6d72d3 Mon Sep 17 00:00:00 2001 From: VityaSchel <59040542+VityaSchel@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:35:39 +0400 Subject: [PATCH] It seems that next-sitemap is unable to produce sitemaps for dynamic paths, so we're switching back to dynamic server-side sitemap generation --- .gitignore | 4 +++- .npmrc | 1 + next-sitemap.config.js | 12 ++++++++++++ package.json | 2 ++ pnpm-lock.yaml | 21 +++++++++++++++++++++ src/pages/[group].tsx | 10 ++++++---- src/shared/data/groups.json | 4 ++++ src/shared/data/groups.ts | 4 ---- tsconfig.json | 2 +- 9 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 .npmrc create mode 100644 next-sitemap.config.js create mode 100644 src/shared/data/groups.json delete mode 100644 src/shared/data/groups.ts diff --git a/.gitignore b/.gitignore index 62190d7..531e5f0 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,6 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts -.env \ No newline at end of file +.env + +public/sitemap.xml \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b7425b9 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true \ No newline at end of file diff --git a/next-sitemap.config.js b/next-sitemap.config.js new file mode 100644 index 0000000..1231607 --- /dev/null +++ b/next-sitemap.config.js @@ -0,0 +1,12 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const groups = require('./src/shared/data/groups.json') + +/** @type {import('next-sitemap').IConfig} */ +module.exports = { + siteUrl: 'https://kspsuti.ru', + generateRobotsTxt: false, + generateIndexSitemap: false, + changefreq: 'weekly', + exclude: ['/'], + additionalPaths: async () => Object.keys(groups).map(groupName => `/${groupName}`) +} \ No newline at end of file diff --git a/package.json b/package.json index c1adee5..d490470 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "next dev", "build": "next build", + "postbuild": "next-sitemap", "start": "next start", "lint": "next lint" }, @@ -24,6 +25,7 @@ "jsdom": "^22.1.0", "lucide-react": "^0.279.0", "next": "latest", + "next-sitemap": "^4.2.3", "next-themes": "^0.2.1", "node-html-parser": "^6.1.10", "node-telegram-bot-api": "^0.63.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2938e38..59db19d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ dependencies: next: specifier: latest version: 13.5.3(react-dom@18.2.0)(react@18.2.0) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@13.5.3) next-themes: specifier: ^0.2.1 version: 0.2.1(next@13.5.3)(react-dom@18.2.0)(react@18.2.0) @@ -136,6 +139,10 @@ packages: dependencies: regenerator-runtime: 0.14.0 + /@corex/deepmerge@4.0.43: + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + dev: false + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3063,6 +3070,20 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /next-sitemap@4.2.3(next@13.5.3): + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' + dependencies: + '@corex/deepmerge': 4.0.43 + '@next/env': 13.5.3 + fast-glob: 3.3.1 + minimist: 1.2.8 + next: 13.5.3(react-dom@18.2.0)(react@18.2.0) + dev: false + /next-themes@0.2.1(next@13.5.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: diff --git a/src/pages/[group].tsx b/src/pages/[group].tsx index 77f0b9b..14d863d 100644 --- a/src/pages/[group].tsx +++ b/src/pages/[group].tsx @@ -5,7 +5,7 @@ import { getSchedule } from '@/app/agregator/schedule' import { NextSerialized, nextDeserializer, nextSerialized } from '@/app/utils/date-serializer' import { NavBar } from '@/widgets/navbar' import { LastUpdateAt } from '@/entities/last-update-at' -import { groups } from '@/shared/data/groups' +import groups from '@/shared/data/groups.json' import crypto from 'crypto' import React from 'react' import { getDayOfWeek } from '@/shared/utils' @@ -61,6 +61,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext<{ gr if (group && Object.hasOwn(groups, group) && group in groups) { let schedule let parsedAt + const groupName = group as keyof typeof groups const cachedSchedule = cachedSchedules.get(group) if (cachedSchedule?.lastFetched && Date.now() - cachedSchedule.lastFetched.getTime() < maxCacheDurationInMS) { @@ -68,9 +69,10 @@ export async function getServerSideProps(context: GetServerSidePropsContext<{ gr parsedAt = cachedSchedule.lastFetched } else { try { - schedule = await getSchedule(...groups[group]) + const group = groups[groupName] as [number, string] + schedule = await getSchedule(...group) parsedAt = new Date() - cachedSchedules.set(group, { lastFetched: new Date(), results: schedule }) + cachedSchedules.set(groupName, { lastFetched: new Date(), results: schedule }) } catch(e) { if (cachedSchedule?.lastFetched) { schedule = cachedSchedule.results @@ -103,7 +105,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext<{ gr props: nextSerialized({ schedule: schedule, parsedAt: parsedAt, - group: groups[group][1] + group: groups[groupName][1] }) } } else { diff --git a/src/shared/data/groups.json b/src/shared/data/groups.json new file mode 100644 index 0000000..19ec471 --- /dev/null +++ b/src/shared/data/groups.json @@ -0,0 +1,4 @@ +{ + "ps7": [146, "ПС-7"], + "pks35k": [78, "ПКС-35к"] +} \ No newline at end of file diff --git a/src/shared/data/groups.ts b/src/shared/data/groups.ts deleted file mode 100644 index 55a688a..0000000 --- a/src/shared/data/groups.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const groups: { [group: string]: [number, string] } = { - ps7: [146, 'ПС-7'], - pks35k: [78, 'ПКС-35к'] -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 8392698..20fa4fb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,7 +33,7 @@ "**/*.ts", "**/*.tsx", ".next/types/**/*.ts" - ], +, "next-sitemap.config.js" ], "exclude": [ "node_modules" ]