diff --git a/components/PageTitle/PageTitle.tsx b/components/PageTitle/PageTitle.tsx index 0638f3f9..5efcb1d4 100644 --- a/components/PageTitle/PageTitle.tsx +++ b/components/PageTitle/PageTitle.tsx @@ -1,5 +1,6 @@ import { useRouter } from "next/router"; import NextLink from "next/link"; +import urlJoin from "url-join"; import { styled } from "../../lib/styles/stitches.config"; import { baseUrl } from "../../lib/config"; import type { ComponentProps } from "react"; @@ -24,7 +25,7 @@ export type PageTitleProps = ComponentProps; const PageTitle = ({ children, ...rest }: PageTitleProps) => { const router = useRouter(); - const canonical = `${baseUrl}${router.pathname}/`; + const canonical = urlJoin(baseUrl, router.pathname, "/"); return ( diff --git a/lib/config/seo.ts b/lib/config/seo.ts index 54f8466a..71835ce3 100644 --- a/lib/config/seo.ts +++ b/lib/config/seo.ts @@ -1,3 +1,7 @@ +import urlJoin from "url-join"; +import type { StaticImageData } from "next/image"; +import type { DefaultSeoProps, SocialProfileJsonLdProps, ArticleJsonLdProps } from "next-seo"; + import * as config from "."; // favicons (some used here, some re-exported and used elsewhere) @@ -10,9 +14,6 @@ import maskable512Png from "../../public/static/favicons/maskable-512x512.png"; import maskable192Png from "../../public/static/favicons/maskable-192x192.png"; import meJpg from "../../public/static/images/me.jpg"; -import type { StaticImageData } from "next/image"; -import type { DefaultSeoProps, SocialProfileJsonLdProps, ArticleJsonLdProps } from "next-seo"; - // Most of this file simply takes the data already defined in ./config.js and translates it into objects that are // compatible with next-seo's props: // https://github.com/garmeeh/next-seo#default-seo-configuration @@ -27,7 +28,7 @@ export const defaultSeo: DefaultSeoProps = { type: "website", images: [ { - url: `${config.baseUrl}${meJpg.src}`, + url: urlJoin(config.baseUrl, meJpg.src), alt: `${config.siteName} – ${config.shortDescription}`, }, ], @@ -112,9 +113,9 @@ export const defaultSeo: DefaultSeoProps = { export const socialProfileJsonLd: SocialProfileJsonLdProps = { type: "Person", name: config.authorName, - url: `${config.baseUrl}/`, + url: urlJoin(config.baseUrl, "/"), sameAs: [ - `${config.baseUrl}/`, + urlJoin(config.baseUrl, "/"), `https://github.com/${config.authorSocial?.github}`, `https://keybase.io/${config.authorSocial?.keybase}`, `https://twitter.com/${config.authorSocial?.twitter}`, @@ -130,7 +131,7 @@ export const socialProfileJsonLd: SocialProfileJsonLdProps = { export const articleJsonLd: Pick<ArticleJsonLdProps, "authorName" | "publisherName" | "publisherLogo"> = { authorName: [config.authorName], publisherName: config.siteName, - publisherLogo: `${config.baseUrl}${meJpg.src}`, + publisherLogo: urlJoin(config.baseUrl, meJpg.src), }; // Re-export icons to use their static image data elsewhere diff --git a/lib/helpers/build-feed.ts b/lib/helpers/build-feed.ts index e6d659ee..13b402af 100644 --- a/lib/helpers/build-feed.ts +++ b/lib/helpers/build-feed.ts @@ -1,4 +1,5 @@ import { Feed } from "feed"; +import urlJoin from "url-join"; import { getAllNotes } from "./parse-notes"; import * as config from "../config"; import { RELEASE_DATE } from "../config/constants"; @@ -17,20 +18,20 @@ export const buildFeed = ( // https://github.com/jpmonette/feed#example const feed = new Feed({ - id: `${config.baseUrl}/`, - link: `${config.baseUrl}/`, + id: urlJoin(config.baseUrl, "/"), + link: urlJoin(config.baseUrl, "/"), title: config.siteName, description: config.longDescription, copyright: "https://creativecommons.org/licenses/by/4.0/", updated: new Date(RELEASE_DATE), - image: `${config.baseUrl}${favicons.meJpg.src}`, + image: urlJoin(config.baseUrl, favicons.meJpg.src), feedLinks: { - rss: `${config.baseUrl}/feed.xml`, - atom: `${config.baseUrl}/feed.atom`, + rss: urlJoin(config.baseUrl, "feed.xml"), + atom: urlJoin(config.baseUrl, "feed.atom"), }, author: { name: config.authorName, - link: `${config.baseUrl}/`, + link: urlJoin(config.baseUrl, "/"), email: config.authorEmail, }, }); @@ -43,11 +44,11 @@ export const buildFeed = ( link: note.permalink, title: note.title, description: note.description, - image: note.image ? `${config.baseUrl}${note.image}` : "", + image: note.image ? urlJoin(config.baseUrl, note.image) : "", author: [ { name: config.authorName, - link: config.baseUrl, + link: urlJoin(config.baseUrl, "/"), }, ], date: new Date(note.date), diff --git a/lib/helpers/parse-notes.ts b/lib/helpers/parse-notes.ts index ce50d472..7f77f30a 100644 --- a/lib/helpers/parse-notes.ts +++ b/lib/helpers/parse-notes.ts @@ -3,6 +3,7 @@ import path from "path"; import { renderToStaticMarkup } from "react-dom/server"; import matter from "gray-matter"; import { serialize } from "next-mdx-remote/serialize"; +import urlJoin from "url-join"; import { minify } from "terser"; import { compiler } from "markdown-to-jsx"; import removeMarkdown from "remove-markdown"; @@ -54,7 +55,7 @@ export const getNoteData = (slug: string): Omit<NoteType, "source"> & { content: // parsed markdown title: htmlTitle, slug, - permalink: `${baseUrl}/notes/${slug}/`, + permalink: urlJoin(baseUrl, "notes", slug, "/"), date: new Date(data.date).toISOString(), // validate/normalize the date string provided from front matter readingMins: Math.ceil(readingTime(content).minutes), }, diff --git a/package.json b/package.json index 279d7866..c05c0f4b 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "gray-matter": "^4.0.3", "is-absolute-url": "^4.0.1", "markdown-to-jsx": "^7.1.7", - "next": "12.1.5-canary.3", + "next": "12.1.5-canary.4", "next-compose-plugins": "^2.2.1", "next-mdx-remote": "4.0.1", "next-seo": "^5.4.0", @@ -68,16 +68,17 @@ "sanitize-html": "^2.7.0", "simple-icons": "^6.17.0", "stitches-normalize": "^2.0.0", - "swr": "^1.2.2" + "swr": "^1.2.2", + "url-join": "^5.0.0" }, "devDependencies": { "@jakejarvis/eslint-config": "*", - "@next/bundle-analyzer": "12.1.5-canary.3", + "@next/bundle-analyzer": "12.1.5-canary.4", "@svgr/webpack": "^6.2.1", "@types/node": "*", - "@types/prop-types": "^15.7.4", - "@types/react": "^17.0.43", - "@types/react-dom": "^17.0.14", + "@types/prop-types": "^15.7.5", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", "@types/react-is": "^17.0.3", "@types/remove-markdown": "^0.3.1", "@types/sanitize-html": "^2.6.2", @@ -85,7 +86,7 @@ "@typescript-eslint/parser": "^5.18.0", "cross-env": "^7.0.3", "eslint": "~8.12.0", - "eslint-config-next": "12.1.5-canary.3", + "eslint-config-next": "12.1.5-canary.4", "eslint-config-prettier": "~8.5.0", "eslint-plugin-mdx": "~1.17.0", "eslint-plugin-prettier": "~4.0.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index 5064d0b7..53aeda89 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -2,6 +2,7 @@ import { useEffect } from "react"; import { useRouter } from "next/router"; import { DefaultSeo, SocialProfileJsonLd } from "next-seo"; import * as Fathom from "fathom-client"; +import urlJoin from "url-join"; import { ThemeProvider } from "../contexts/ThemeContext"; import Layout from "../components/Layout"; import * as config from "../lib/config"; @@ -24,7 +25,7 @@ const App = ({ Component, pageProps }: AppProps) => { // get this page's URL with full domain, and hack around query parameters and anchors // NOTE: this assumes trailing slashes are enabled in next.config.js - const canonical = `${config.baseUrl}${router.pathname === "/" ? "" : router.pathname}/`; + const canonical = urlJoin(config.baseUrl, router.pathname === "/" ? "" : router.pathname, "/"); useEffect(() => { // https://usefathom.com/docs/integrations/next diff --git a/pages/notes/[slug].tsx b/pages/notes/[slug].tsx index 4a64f19b..73e0f46d 100644 --- a/pages/notes/[slug].tsx +++ b/pages/notes/[slug].tsx @@ -1,6 +1,7 @@ import { InView } from "react-intersection-observer"; import { NextSeo, ArticleJsonLd } from "next-seo"; import { MDXRemote } from "next-mdx-remote"; +import urlJoin from "url-join"; import Content from "../../components/Content"; import NoteMeta from "../../components/NoteMeta"; import Comments from "../../components/Comments"; @@ -30,7 +31,7 @@ const Note = ({ frontMatter, source }: NoteType) => { }, images: frontMatter.image && [ { - url: `${config.baseUrl}${frontMatter.image}`, + url: urlJoin(config.baseUrl, frontMatter.image), alt: frontMatter.title, }, ], @@ -45,7 +46,7 @@ const Note = ({ frontMatter, source }: NoteType) => { description={frontMatter.description} datePublished={frontMatter.date} dateModified={frontMatter.date} - images={frontMatter.image && [`${config.baseUrl}${frontMatter.image}`]} + images={frontMatter.image && [urlJoin(config.baseUrl, frontMatter.image)]} {...articleJsonLd} /> diff --git a/pages/sitemap.xml.ts b/pages/sitemap.xml.ts index 7380a518..7494897c 100644 --- a/pages/sitemap.xml.ts +++ b/pages/sitemap.xml.ts @@ -1,4 +1,5 @@ import { getServerSideSitemap } from "next-sitemap"; +import urlJoin from "url-join"; import { getAllNotes } from "../lib/helpers/parse-notes"; import { baseUrl } from "../lib/config"; import { RELEASE_DATE } from "../lib/config/constants"; @@ -33,7 +34,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { const notes = getAllNotes(); notes.map((note) => pages.push({ - loc: `/notes/${note.slug}/`, + loc: urlJoin("/notes/", note.slug, "/"), // pull lastMod from front matter date lastmod: new Date(note.date).toISOString(), priority: 0.7, @@ -41,7 +42,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { ); // make all relative URLs absolute - pages.map((page) => (page.loc = `${baseUrl}${page.loc}`)); + pages.map((page) => (page.loc = urlJoin(baseUrl, page.loc))); // cache on edge for 12 hours const { res } = context; diff --git a/yarn.lock b/yarn.lock index 0f09b774..378823d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1147,84 +1147,84 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== -"@next/bundle-analyzer@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.5-canary.3.tgz#5df706a80bcd018158d1a12a2d36c67b6d627cd5" - integrity sha512-nm0zGVaIIIhluXwKSciYUXapNB6dkvahzM0fMzyqnsUUZKI8u2wZHmXdqpOdnlwIJB82uiXm/bpDX31VjLO2pQ== +"@next/bundle-analyzer@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.5-canary.4.tgz#a23efebeec7e19dade55fb417df5068aecfa2efb" + integrity sha512-utgqpE6L6pwVSkqRd4OjLiw8LuX3BBiaB96CaJrZj4UWxwiyGFokWd28Z7mslpb+dLke86WLjUv/QF+MH1qDUQ== dependencies: webpack-bundle-analyzer "4.3.0" -"@next/env@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.5-canary.3.tgz#ecafaf1e59ce0232245b1d540664a4188e856e66" - integrity sha512-8oxgSPYaoGY1AyCHKJIsyPoWM+LEimnxLnw0q5yfT+SEY7E8/vCcQRmZtn9SgijIc0t0wDHlYtVD0L9DCB8usg== +"@next/env@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.5-canary.4.tgz#9b5e5108e2124edcddd5a7f9ddda7d244bd96c68" + integrity sha512-cXMjrodrFcQE38eELp6n2Q8zSnLiHVX88+CuW7QID2UDmillKNYW/OKYVjcB981wWz/OFM0UGIdf5KwA6IeDeA== -"@next/eslint-plugin-next@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.5-canary.3.tgz#4675c5e17e41bdc9b2a29e21ae439eba8c314a2f" - integrity sha512-rO3vHQmsIxdL4e6hYSeDw5NK713DUCHc022yhN3/NVpPceYYK1T9HYA5ikQ13tWNmXVeb+FP7nfAZeBWBcdFpQ== +"@next/eslint-plugin-next@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.5-canary.4.tgz#180f14ec0a62da5842af0f4bf5bc2278e6a0c5db" + integrity sha512-Nq96LvUgHphZaZRxLyCaobhiTorZNG8zh0FrslikP2NMPgxT6MCSiucO4tER1zP0YghZzQYpLcjfIQbJ0crQNw== dependencies: glob "7.1.7" -"@next/swc-android-arm-eabi@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.5-canary.3.tgz#644e7b5481db40c54553e595516c29b5962a467a" - integrity sha512-EI7L9+1r29AHSUMdv+Kd9uqUQ8X+MeNwkmuDaEqCS36iHiKXmTL+t4gnMMCYGU0T07yKwku3RydDhpk4NzXyYw== +"@next/swc-android-arm-eabi@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.5-canary.4.tgz#9e25cd6abadbd9b0edb50cabe2daaab4061afea4" + integrity sha512-tt99U4bSgqPWbSsp0oyzol0fxwfLlsjlF9oSdwGlPOR2nQ91QpGtUsT5uyXlXyPBhjaCT5OS739GsT5IHoAEQg== -"@next/swc-android-arm64@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.5-canary.3.tgz#35113acce726252c3a441b238674bb781d6ab96e" - integrity sha512-1C0UP4CNDfunsdjJ1h8ByhO5Rda+CJwRI4/3m8lnYp1QekCi5l5GB3uXRTA584fu9iQUV0m4AwqJjbJy2XRZGw== +"@next/swc-android-arm64@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.5-canary.4.tgz#93876e17fc4034ae15f74e111f77aab4fdbcecdf" + integrity sha512-LEX7por70dlKigcBWj8OfzU36pVTJ3C6r4Hrr3kKrS6zEstCJlUmUp9CLOUT4aJ1gDNym0p2AYwvsXShp/cxWA== -"@next/swc-darwin-arm64@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.5-canary.3.tgz#f74e4dd84e689d77375211e5d61f04658db848fe" - integrity sha512-0/tGblqyomguI0zcSPE+dThYAUzGt8eEiHiq227dGeBI3L/DJli7O9uzY2N1PR7qXMuSI6dioc5dqRtAXT886Q== +"@next/swc-darwin-arm64@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.5-canary.4.tgz#1024cf80c4c76e0385e0e19dd775a2798e82f7ad" + integrity sha512-ddXvdzo6HrK8rU+A5AGy7iC0yjVi0Pzv9LjzqXmzoZDlKEB8PPnjop+HAsQJf/Kzk1Yw9CH7eNjQsMbi8HhX0w== -"@next/swc-darwin-x64@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.5-canary.3.tgz#9f8263dc0ffdbaedaf25b7d43fe431356c48615c" - integrity sha512-cD/wT73vnx8BpgGTH0qpN8N+MAWjQjLuzhjK68uFlBNQ4YBB9/CiJSlp+bBjLRllw3tMcFmDNKqpn/hLE2sjGg== +"@next/swc-darwin-x64@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.5-canary.4.tgz#56c536203c574909559a06e9e18695b2a876841d" + integrity sha512-AFN9Go6KF7kApDnxcwvMunPxrfMZMIEr8ud/GElpl/aBpEgoFj/MGol33xwBQc1NZGrY+7IjOeVCGe5jEqya/A== -"@next/swc-linux-arm-gnueabihf@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.5-canary.3.tgz#b284aae77c29d21bd688a31055165096a9533b6e" - integrity sha512-9lWDlhrXJLY2pku/qP8MTqsLRO7eR62kbr+N5UvKXuUCuiky3DoSBL0ppWSBlKTS7mftZjy8AmX5GKPq3KQOCQ== +"@next/swc-linux-arm-gnueabihf@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.5-canary.4.tgz#c30c196392b4413d2a8c7e5e8b4b7b21eb32aa68" + integrity sha512-GCzrV7K3sITb1nxlnTfI901firrXCOa/7uKoiUhMPPxP+xJVNu0EjwelgpobWfYgEBHqsa/uKBYURnKrh0/fZQ== -"@next/swc-linux-arm64-gnu@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.5-canary.3.tgz#ce07d5e8d4907e8f4ee10a4593cf2efe0e52144e" - integrity sha512-BhVlu7WYQYqadtex5wQdNE2WPvnkZjkvt6ZDD+lr9BnddxjUqnG0cpSCwyaYMUwib2efRslCaDAElkfTwWH6Gw== +"@next/swc-linux-arm64-gnu@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.5-canary.4.tgz#f224cf0568ed56fe3f031f347c48bbcd205bd64b" + integrity sha512-LFxRvADEjSTIN+j+j5kuzmzZqloWo8VZi4Yl6/dooa7iBkRlViC28wtr6is1rqwrCp0J4PxL5Z6oGCPVJCez1Q== -"@next/swc-linux-arm64-musl@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.5-canary.3.tgz#2e13a8a0b93dbf5618c5b82c65b6673dcd5d09d0" - integrity sha512-iULGOQHYEgcaXE4aXuH7/KlOk2SPBUNIQC2HlqS3qMoW8T8I+v4cIz6B6S1uywXjaJD/RGKiDNsNX8w5gUGIZA== +"@next/swc-linux-arm64-musl@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.5-canary.4.tgz#e16a7aa069c494bd39a20e1646a87db1bedc551f" + integrity sha512-5/YLEVy8vuSooulMq5V0D1zH9/wkU3beJ5yrmAOL8gLYQAo/wHfDoR3ORznMF2uZsMX6pQ6NeMFycL9GSwy7lg== -"@next/swc-linux-x64-gnu@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.5-canary.3.tgz#9ff8cc29afdd0a2297d0e2fd9d37274209d5b4cb" - integrity sha512-1FztGThf+Q6sB+jDnwsFB25kdKFSDSQy9OmnYguf+KbDcDoDDcTLsulGhZ7F2/eIOI6/QW6OM3q2OdI3JseYpg== +"@next/swc-linux-x64-gnu@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.5-canary.4.tgz#773627dbc681130021345b8fe3c89c58d61420be" + integrity sha512-Hy2poAkPya0dRhfeqeCeBcCSoYJbc3llwrTLEDyci0QrrrengxpQXghR2iNO/E+ycz2xVGqPfuMel3JCGTwRWA== -"@next/swc-linux-x64-musl@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.5-canary.3.tgz#b0c65d2e0f08ca2caee60d920cf2459495393e50" - integrity sha512-XPEbvsa9uZc8gBI1ytNrxRAw8PhazckeYtDMggeqDTSQznCp9ba+dZ7CzCHHpf9X0HVRqQdF1MZ7Y52ji3PH8Q== +"@next/swc-linux-x64-musl@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.5-canary.4.tgz#373af8da463821081070023d790d4f98565a8b32" + integrity sha512-CP5uYJqG/0bWYIG+IuDXGAZ6e5LLrMXEyg0C/6XM/ATM5GrdF0GrVnw32KlzBKmMrEk1/BE0z+mxO0DbN3IfXw== -"@next/swc-win32-arm64-msvc@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.5-canary.3.tgz#52852c338fa1414bdca0cb12cd9d0f4879d66c38" - integrity sha512-1ehsnGq+DB5Ncd6aUjYl9+9DR/qvbR6BwMtSwvkOx4ZrrNyzP5CxH/wYtmevc5Rb9MovN+IphYUUuQELvwsIPQ== +"@next/swc-win32-arm64-msvc@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.5-canary.4.tgz#3ca7331960140a0d387ed1b6079ecd0bd7178dc6" + integrity sha512-9orbZuIWxISoyvhf236wp8uRO9f0C0/voRZ6wb8DJNfL7n2ZTu6Rj9GXYhBbbFyidaPW44jdJ/yR7EFvAkJs/w== -"@next/swc-win32-ia32-msvc@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.5-canary.3.tgz#bce9c2d9a045d4b62cd00db79c4818339ae29dc6" - integrity sha512-5R/MLYxGNHisQOSd9vQCJL9qwGq6P9dN6k4ZtIa3z2r//bCRNPjNK7odMSasamMmzMD9e8N6k601U01K2rh4BQ== +"@next/swc-win32-ia32-msvc@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.5-canary.4.tgz#672bf5b50e686e2b824c7cbaf25920a3fce5f3f5" + integrity sha512-GJR5Q/SkHIVlBn8Lbo/HXzq/KyeXVYoHtaNOp+okYemdTAPmYLqTwH8F7+mVTKg6pzGdRXO3yUj6DM6lTSIMWQ== -"@next/swc-win32-x64-msvc@12.1.5-canary.3": - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.5-canary.3.tgz#23210738ec113bc616d32b995f430a4f436707e5" - integrity sha512-xTASNc87iWMtNdpyKgTm91Z4+1EzkQH9K2HmktkyPYtGP5ZzIbvzUQ64TzFo+XemtOrTlYsTuagpEB0fouXD6w== +"@next/swc-win32-x64-msvc@12.1.5-canary.4": + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.5-canary.4.tgz#644046929034530fd692faa8fab0cb1b418289a3" + integrity sha512-wsXqXj4g9CHagoQ78diYc44rl3Hyvsv/EPEJLoHZldnGLW5Y8jS/2rTQkN55Y5KqTVdO7HkEwp3oww22eRqYxQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1646,15 +1646,15 @@ resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== -"@types/prop-types@*", "@types/prop-types@^15.7.4": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== +"@types/prop-types@*", "@types/prop-types@^15.7.5": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^17.0.14": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.14.tgz#c8f917156b652ddf807711f5becbd2ab018dea9f" - integrity sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ== +"@types/react-dom@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141" + integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg== dependencies: "@types/react" "*" @@ -1665,10 +1665,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16", "@types/react@^17.0.43": - version "17.0.43" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55" - integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A== +"@types/react@*", "@types/react@>=16", "@types/react@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.0.tgz#4be8aa3a2d04afc3ac2cc1ca43d39b0bd412890c" + integrity sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2648,12 +2648,12 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-config-next@12.1.5-canary.3: - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.5-canary.3.tgz#d2b3dee528f3308df0ef25b3f8858a55cb5923c8" - integrity sha512-UPAbCQ55owz9H8YdigpcaWIpGPYxvX/Cv98F9+3U5EXI1LUvDY7ajbYKvUFj8EMBeRDdY5BO8WrqXL8ZjgYexQ== +eslint-config-next@12.1.5-canary.4: + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.5-canary.4.tgz#e0b7d237fd8025b2885a79c26314b7cf2c756603" + integrity sha512-VShmyM4rnCkFGTA9Eg+pqFLTbpWxAvayWShvmc+a+IXGQCWXPgiza8T4Pq+dgIXLdm2ytyZ5IZ+vZZv01Y+4bQ== dependencies: - "@next/eslint-plugin-next" "12.1.5-canary.3" + "@next/eslint-plugin-next" "12.1.5-canary.4" "@rushstack/eslint-patch" "1.0.8" "@typescript-eslint/parser" "5.10.1" eslint-import-resolver-node "0.3.4" @@ -4626,28 +4626,28 @@ next-transpile-modules@^9.0.0: enhanced-resolve "^5.7.0" escalade "^3.1.1" -next@12.1.5-canary.3: - version "12.1.5-canary.3" - resolved "https://registry.yarnpkg.com/next/-/next-12.1.5-canary.3.tgz#37b83e7992c4386b99b1f7a0f08f71b949d2a6e5" - integrity sha512-up9GXlebBIR4kL7D9HnlK56Vj9IVZXLa5L8FKmNqF5oias8EqnrU2CRUjO/cinbxmmBqH780qSBFtZ6HzpoX5A== +next@12.1.5-canary.4: + version "12.1.5-canary.4" + resolved "https://registry.yarnpkg.com/next/-/next-12.1.5-canary.4.tgz#8298484d505c2b1d7f2d739f2066726ec76e90b6" + integrity sha512-A8yrJQWU+5AXeA6Obp7MB2dXyLaKxJ2vstkaQ8FR7ZYs0ldRzjySE/TArBzM2w4utjJoLP1IKuu+49gGozT7Wg== dependencies: - "@next/env" "12.1.5-canary.3" + "@next/env" "12.1.5-canary.4" caniuse-lite "^1.0.30001283" postcss "8.4.5" styled-jsx "5.0.1" optionalDependencies: - "@next/swc-android-arm-eabi" "12.1.5-canary.3" - "@next/swc-android-arm64" "12.1.5-canary.3" - "@next/swc-darwin-arm64" "12.1.5-canary.3" - "@next/swc-darwin-x64" "12.1.5-canary.3" - "@next/swc-linux-arm-gnueabihf" "12.1.5-canary.3" - "@next/swc-linux-arm64-gnu" "12.1.5-canary.3" - "@next/swc-linux-arm64-musl" "12.1.5-canary.3" - "@next/swc-linux-x64-gnu" "12.1.5-canary.3" - "@next/swc-linux-x64-musl" "12.1.5-canary.3" - "@next/swc-win32-arm64-msvc" "12.1.5-canary.3" - "@next/swc-win32-ia32-msvc" "12.1.5-canary.3" - "@next/swc-win32-x64-msvc" "12.1.5-canary.3" + "@next/swc-android-arm-eabi" "12.1.5-canary.4" + "@next/swc-android-arm64" "12.1.5-canary.4" + "@next/swc-darwin-arm64" "12.1.5-canary.4" + "@next/swc-darwin-x64" "12.1.5-canary.4" + "@next/swc-linux-arm-gnueabihf" "12.1.5-canary.4" + "@next/swc-linux-arm64-gnu" "12.1.5-canary.4" + "@next/swc-linux-arm64-musl" "12.1.5-canary.4" + "@next/swc-linux-x64-gnu" "12.1.5-canary.4" + "@next/swc-linux-x64-musl" "12.1.5-canary.4" + "@next/swc-win32-arm64-msvc" "12.1.5-canary.4" + "@next/swc-win32-ia32-msvc" "12.1.5-canary.4" + "@next/swc-win32-x64-msvc" "12.1.5-canary.4" node-abort-controller@^3.0.1: version "3.0.1" @@ -6084,6 +6084,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-join@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" + integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== + use-composed-ref@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.2.1.tgz#9bdcb5ccd894289105da2325e1210079f56bf849"