diff --git a/next-sitemap.js b/next-sitemap.js new file mode 100644 index 0000000..266e271 --- /dev/null +++ b/next-sitemap.js @@ -0,0 +1,11 @@ +const SITE_URL = + process.env.NEXT_PUBLIC_URL || 'https://zdamegzaminzawodowy.pl'; + +module.exports = { + siteUrl: SITE_URL, + generateRobotsTxt: true, + exclude: ['/server-sitemap.xml', '/404', '/pl', '/500'], + robotsTxtOptions: { + additionalSitemaps: [`${SITE_URL}/server-sitemap.xml`], + }, +}; diff --git a/package.json b/package.json index 8c89e36..c770003 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "next dev", "build": "next build", + "postbuild": "next-sitemap", "start": "next start", "codegen": "graphql-codegen" }, @@ -19,6 +20,7 @@ "graphql-request": "^3.4.0", "lodash": "^4.17.21", "next": "10.0.9", + "next-sitemap": "^1.6.25", "polish-plurals": "^1.1.0", "react": "17.0.1", "react-dom": "17.0.1", diff --git a/pages/server-sitemap.xml/index.tsx b/pages/server-sitemap.xml/index.tsx new file mode 100644 index 0000000..3637ec2 --- /dev/null +++ b/pages/server-sitemap.xml/index.tsx @@ -0,0 +1,61 @@ +import { GetServerSideProps } from 'next'; +import { gql } from 'graphql-request'; +import { getServerSideSitemap } from 'next-sitemap'; +import { ISitemapFiled } from 'next-sitemap/dist/@types/interface'; +import { createClient } from 'libs/graphql'; +import { Query, QueryQualificationsArgs } from 'libs/graphql'; +import { WEBSITE_URL, QUESTIONS } from 'config/app'; +import { Route } from 'config/routing'; +import resolveAs from 'utils/resolveAs'; + +const QUERY_QUALIFICATIONS = gql` + query qualifications($sort: [String!], $limit: Int) { + qualifications(sort: $sort, limit: $limit) { + items { + slug + } + } + } +`; +const LIMIT = 1000; + +export const getServerSideProps: GetServerSideProps = async ctx => { + const client = createClient(); + let fields: ISitemapFiled[] = []; + + try { + const { + qualifications: { items }, + } = await client.request< + Pick, + QueryQualificationsArgs + >(QUERY_QUALIFICATIONS, { limit: LIMIT, sort: ['code ASC'] }); + if (Array.isArray(items)) { + fields = ([] as typeof fields).concat( + ...QUESTIONS.map(limit => { + return items.map( + (item): ISitemapFiled => { + return { + loc: `${WEBSITE_URL}${resolveAs({ + pathname: Route.TestPage, + query: { slug: item.slug, limit }, + })}`, + lastmod: new Date().toISOString(), + changefreq: 'always', + }; + } + ); + }) + ); + } + } catch (e) { + console.log('server-sitemap.xml', e.message); + } + + return getServerSideSitemap(ctx, fields); +}; + +// Default export to prevent next.js errors +const Index = () =>
; + +export default Index; diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..4df4226 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,10 @@ +# * +User-agent: * +Allow: / + +# Host +Host: https://zdamegzaminzawodowy.pl + +# Sitemaps +Sitemap: https://zdamegzaminzawodowy.pl/sitemap.xml +Sitemap: https://zdamegzaminzawodowy.pl/server-sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..c3691ab --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,5 @@ + + +https://zdamegzaminzawodowy.pldaily0.72021-04-13T15:59:54.800Z +https://zdamegzaminzawodowy.pl/polityka-prywatnoscidaily0.72021-04-13T15:59:54.800Z + \ No newline at end of file diff --git a/src/common/SEO/SEO.tsx b/src/common/SEO/SEO.tsx index 68728b2..3652ca8 100644 --- a/src/common/SEO/SEO.tsx +++ b/src/common/SEO/SEO.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { useRouter } from 'next/router'; -import { URL } from 'config/app'; +import { WEBSITE_URL } from 'config/app'; import Head from 'next/head'; @@ -19,27 +19,33 @@ const SEO = ({ title, description = DEFAULT_DESCRIPTION }: SEOProps) => { return ( {formattedTitle} - - + + - + - + - - + + ); diff --git a/src/config/app.ts b/src/config/app.ts index a16461c..5cce959 100644 --- a/src/config/app.ts +++ b/src/config/app.ts @@ -9,5 +9,5 @@ export const QUESTIONS = [1, 40]; export const GOOGLE_PLAY_URL = 'https://play.google.com/store/apps/details?id=com.dawidwysokinski.zdamegzaminzawodowy'; -export const URL = +export const WEBSITE_URL = process.env.NEXT_PUBLIC_URL ?? 'https://zdamegzaminzawodowy.pl'; diff --git a/yarn.lock b/yarn.lock index 2c78381..78fd41e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -505,6 +505,11 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@corex/deepmerge@^2.5.6": + version "2.5.6" + resolved "https://registry.yarnpkg.com/@corex/deepmerge/-/deepmerge-2.5.6.tgz#a5d26c6a0f4df1f65d17871c94f463d5097e349a" + integrity sha512-zvClQyrUGV4Hzr2zWnyD/MS0DrNWJ9jMKFLYA/abmsU4dObMuFXhragGqWpWHW6G/ghJpf09E+JumTo5jSb9rg== + "@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" @@ -2514,6 +2519,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-config-react-app@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" @@ -4068,6 +4078,13 @@ map-cache@^0.2.0: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +matcher@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-4.0.0.tgz#a42a05a09aaed92e2d241eb91fddac689461ea51" + integrity sha512-S6x5wmcDmsDRRU/c2dkccDwQPXoFczc5+HpQ2lON8pnvHlnvHAHj5WlLVvw6n6vNyHuVugYrFohYxbS+pvFpKQ== + dependencies: + escape-string-regexp "^4.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -4213,6 +4230,15 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +next-sitemap@^1.6.25: + version "1.6.25" + resolved "https://registry.yarnpkg.com/next-sitemap/-/next-sitemap-1.6.25.tgz#bab5694e998e57b9932c57fb6dd95448d55ab88c" + integrity sha512-lZ1Mchz0Kwfy9C2kdxlp1FPT1kj6g2EY6+cAuBjmRht+3fbDqLaDaC0z3cYhjvsfmHlshc1FNkZ7Ntq5a8q7tQ== + dependencies: + "@corex/deepmerge" "^2.5.6" + matcher "^4.0.0" + minimist "^1.2.5" + next@10.0.9: version "10.0.9" resolved "https://registry.yarnpkg.com/next/-/next-10.0.9.tgz#ad5d8e0368fee8363cdfd64d22dfbf71f683ae66"