From 27f60e0b7784603c6fb300bd8dce64515eb98962 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:56:52 +0530 Subject: [PATCH 1/4] fix: invalidate module cache for subsequent builds (#3398) --- src/client/app/index.ts | 6 +++++- src/node/build/build.ts | 4 +++- src/node/build/render.ts | 6 +++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/client/app/index.ts b/src/client/app/index.ts index 023b93ae..a7db0c23 100644 --- a/src/client/app/index.ts +++ b/src/client/app/index.ts @@ -135,7 +135,11 @@ function newRouter(): Router { pageFilePath = pageFilePath.replace(/\.js$/, '.lean.js') } - pageModule = import(/*@vite-ignore*/ pageFilePath) + if (import.meta.env.SSR) { + pageModule = import(/*@vite-ignore*/ pageFilePath + '?t=' + Date.now()) + } else { + pageModule = import(/*@vite-ignore*/ pageFilePath) + } } if (inBrowser) { diff --git a/src/node/build/build.ts b/src/node/build/build.ts index 7dca478a..d6177864 100644 --- a/src/node/build/build.ts +++ b/src/node/build/build.ts @@ -52,7 +52,9 @@ export async function build( } const entryPath = path.join(siteConfig.tempDir, 'app.js') - const { render } = await import(pathToFileURL(entryPath).toString()) + const { render } = await import( + pathToFileURL(entryPath).toString() + '?t=' + Date.now() + ) await task('rendering pages', async () => { const appChunk = diff --git a/src/node/build/render.ts b/src/node/build/render.ts index 8818a5e1..92768185 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -52,7 +52,11 @@ export async function renderPage( try { // resolve page data so we can render head tags const { __pageData } = await import( - pathToFileURL(path.join(config.tempDir, pageServerJsFileName)).toString() + pathToFileURL( + path.join(config.tempDir, pageServerJsFileName) + ).toString() + + '?t=' + + Date.now() ) pageData = __pageData } catch (e) { From b29b3b38e171a1b1eb9f6e75e7934005a7028dd4 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Mon, 1 Jan 2024 20:42:26 +0530 Subject: [PATCH 2/4] refactor: drop dependency on mrmime (#3400) --- package.json | 1 - pnpm-lock.yaml | 4 +--- src/client/app/router.ts | 9 +++------ src/client/theme-default/support/utils.ts | 5 ++--- src/node/markdown/plugins/link.ts | 19 +++++++++++++------ src/node/markdownToVue.ts | 6 ++++-- src/shared/shared.ts | 11 +++++++++++ 7 files changed, 34 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index b875fdb5..4ff878e9 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,6 @@ "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^6.3.0", - "mrmime": "^2.0.0", "shikiji": "^0.9.15", "shikiji-core": "^0.9.15", "shikiji-transformers": "^0.9.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13c8f4d2..f10ff0e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,9 +41,6 @@ importers: minisearch: specifier: ^6.3.0 version: 6.3.0 - mrmime: - specifier: ^2.0.0 - version: 2.0.0 shikiji: specifier: ^0.9.15 version: 0.9.15 @@ -3338,6 +3335,7 @@ packages: /mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} + dev: true /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} diff --git a/src/client/app/router.ts b/src/client/app/router.ts index 3a7d8cb5..02d98944 100644 --- a/src/client/app/router.ts +++ b/src/client/app/router.ts @@ -1,7 +1,6 @@ import { reactive, inject, markRaw, nextTick, readonly } from 'vue' import type { Component, InjectionKey } from 'vue' -import { lookup } from 'mrmime' -import { notFoundPageData } from '../shared' +import { notFoundPageData, treatAsHtml } from '../shared' import type { PageData, PageDataPayload, Awaitable } from '../shared' import { inBrowser, withBase } from './utils' import { siteDataRef } from './data' @@ -182,8 +181,7 @@ export function createRouter( link.baseURI ) const currentUrl = window.location - const mimeType = lookup(pathname) - // only intercept inbound links + // only intercept inbound html links if ( !e.ctrlKey && !e.shiftKey && @@ -191,8 +189,7 @@ export function createRouter( !e.metaKey && !target && origin === currentUrl.origin && - // intercept only html and unknown types (assume html) - (!mimeType || mimeType === 'text/html') + treatAsHtml(pathname) ) { e.preventDefault() if ( diff --git a/src/client/theme-default/support/utils.ts b/src/client/theme-default/support/utils.ts index f63e855a..b04efa17 100644 --- a/src/client/theme-default/support/utils.ts +++ b/src/client/theme-default/support/utils.ts @@ -1,7 +1,6 @@ import { withBase } from 'vitepress' -import { lookup } from 'mrmime' import { useData } from '../composables/data' -import { isExternal } from '../../shared' +import { isExternal, treatAsHtml } from '../../shared' export function throttleAndDebounce(fn: () => void, delay: number): () => void { let timeoutId: NodeJS.Timeout @@ -28,7 +27,7 @@ export function normalizeLink(url: string): string { isExternal(url) || url.startsWith('#') || !protocol.startsWith('http') || - (/\.(?!html|md)\w+($|\?)/i.test(url) && lookup(url)) + !treatAsHtml(pathname) ) return url diff --git a/src/node/markdown/plugins/link.ts b/src/node/markdown/plugins/link.ts index 841cd4cd..45621daf 100644 --- a/src/node/markdown/plugins/link.ts +++ b/src/node/markdown/plugins/link.ts @@ -4,7 +4,12 @@ import type MarkdownIt from 'markdown-it' import { URL } from 'url' -import { EXTERNAL_URL_RE, isExternal, type MarkdownEnv } from '../../shared' +import { + EXTERNAL_URL_RE, + isExternal, + treatAsHtml, + type MarkdownEnv +} from '../../shared' const indexRE = /(^|.*\/)index.md(#?.*)$/i @@ -35,13 +40,15 @@ export const linkPlugin = ( } hrefAttr[1] = url } else { + const { pathname, protocol } = new URL(url, 'http://a.com') + if ( - // internal anchor links + // skip internal anchor links !url.startsWith('#') && - // mail/custom protocol links - new URL(url, 'http://a.com').protocol.startsWith('http') && - // links to files (other than html/md) - !/\.(?!html|md)\w+($|\?)/i.test(url) + // skip mail/custom protocol links + protocol.startsWith('http') && + // skip links to files (other than html/md) + treatAsHtml(pathname) ) { normalizeHref(hrefAttr, env) } else if (url.startsWith('#')) { diff --git a/src/node/markdownToVue.ts b/src/node/markdownToVue.ts index 6901f464..fd3b0d88 100644 --- a/src/node/markdownToVue.ts +++ b/src/node/markdownToVue.ts @@ -14,7 +14,8 @@ import { slash, type HeadConfig, type MarkdownEnv, - type PageData + type PageData, + treatAsHtml } from './shared' import { getGitTimestamp } from './utils/getGitTimestamp' import { processIncludes } from './utils/processIncludes' @@ -145,7 +146,8 @@ export async function createMarkdownToVueRenderFn( if (links) { const dir = path.dirname(file) for (let url of links) { - if (/\.(?!html|md)\w+($|\?)/i.test(url)) continue + const { pathname } = new URL(url, 'http://a.com') + if (!treatAsHtml(pathname)) continue url = url.replace(/[?#].*$/, '').replace(/\.(html|md)$/, '') if (url.endsWith('/')) url += `index` diff --git a/src/shared/shared.ts b/src/shared/shared.ts index 9dd05e34..d0436bc4 100644 --- a/src/shared/shared.ts +++ b/src/shared/shared.ts @@ -174,3 +174,14 @@ export function sanitizeFileName(name: string): string { export function slash(p: string): string { return p.replace(/\\/g, '/') } + +// md, html? are intentionally omitted, see treatAsHtml +const commonMimeTypes = `3g2,3gp,7z,aac,abw,ai,aif,aifc,aiff,arc,asf,asr,asx,au,avi,avif,axs,azw,bin,bmp,bz,bz2,c,cda,cer,class,crl,crt,csh,css,csv,dcr,der,dll,doc,docx,eot,eps,epub,exe,gif,gtar,gz,gzip,ico,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,latex,m3u,man,mdb,mht,mhtml,mid,midi,mjs,mov,mp2,mp3,mp4,mpa,mpe,mpeg,mpg,mpkg,mpp,odp,ods,odt,oga,ogv,ogx,opus,otf,p10,p12,p7b,p7c,p7m,p7r,p7s,pbm,pdf,pfx,php,png,ppt,pptx,ps,pub,qt,rar,roff,rtf,rtx,ser,sh,spc,svg,swf,t,tar,tcl,tex,texi,texinfo,tgz,tif,tiff,tr,ts,tsv,ttf,txt,ua,viv,vivo,vsd,wav,weba,webm,webp,woff,woff2,xbm,xhtml,xls,xlsx,xml,xul,zip` + +const set = new Set(commonMimeTypes.split(',')) + +export function treatAsHtml(filename: string): boolean { + const ext = filename.split('.').pop()?.toLowerCase() + + return ext == null || !set.has(ext) +} From fb0ed027af032660e17e0ee54eaafc59ce2ded4b Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Mon, 1 Jan 2024 22:19:54 +0530 Subject: [PATCH 3/4] chore: rename variables --- src/shared/shared.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/shared/shared.ts b/src/shared/shared.ts index d0436bc4..1c3ba524 100644 --- a/src/shared/shared.ts +++ b/src/shared/shared.ts @@ -176,12 +176,22 @@ export function slash(p: string): string { } // md, html? are intentionally omitted, see treatAsHtml -const commonMimeTypes = `3g2,3gp,7z,aac,abw,ai,aif,aifc,aiff,arc,asf,asr,asx,au,avi,avif,axs,azw,bin,bmp,bz,bz2,c,cda,cer,class,crl,crt,csh,css,csv,dcr,der,dll,doc,docx,eot,eps,epub,exe,gif,gtar,gz,gzip,ico,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,latex,m3u,man,mdb,mht,mhtml,mid,midi,mjs,mov,mp2,mp3,mp4,mpa,mpe,mpeg,mpg,mpkg,mpp,odp,ods,odt,oga,ogv,ogx,opus,otf,p10,p12,p7b,p7c,p7m,p7r,p7s,pbm,pdf,pfx,php,png,ppt,pptx,ps,pub,qt,rar,roff,rtf,rtx,ser,sh,spc,svg,swf,t,tar,tcl,tex,texi,texinfo,tgz,tif,tiff,tr,ts,tsv,ttf,txt,ua,viv,vivo,vsd,wav,weba,webm,webp,woff,woff2,xbm,xhtml,xls,xlsx,xml,xul,zip` - -const set = new Set(commonMimeTypes.split(',')) +const KNOWN_EXTENSIONS = new Set( + ( + '3g2,3gp,7z,aac,abw,ai,aif,aifc,aiff,arc,asf,asr,asx,au,avi,avif,axs,' + + 'azw,bin,bmp,bz,bz2,c,cda,cer,class,crl,crt,csh,css,csv,dcr,der,dll,doc,' + + 'docx,eot,eps,epub,exe,gif,gtar,gz,gzip,ico,ics,ief,jar,jpe,jpeg,jpg,js,' + + 'json,jsonld,latex,m3u,man,mdb,mht,mhtml,mid,midi,mjs,mov,mp2,mp3,mp4,' + + 'mpa,mpe,mpeg,mpg,mpkg,mpp,odp,ods,odt,oga,ogv,ogx,opus,otf,p10,p12,p7b,' + + 'p7c,p7m,p7r,p7s,pbm,pdf,pfx,php,png,ppt,pptx,ps,pub,qt,rar,roff,rtf,' + + 'rtx,ser,sh,spc,svg,swf,t,tar,tcl,tex,texi,texinfo,tgz,tif,tiff,tr,ts,' + + 'tsv,ttf,txt,ua,viv,vivo,vsd,wav,weba,webm,webp,woff,woff2,xbm,xhtml,' + + 'xls,xlsx,xml,xul,zip' + ).split(',') +) export function treatAsHtml(filename: string): boolean { const ext = filename.split('.').pop()?.toLowerCase() - return ext == null || !set.has(ext) + return ext == null || !KNOWN_EXTENSIONS.has(ext) } From 7735631597450e96fe9dff718f808bf1f817592e Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Mon, 1 Jan 2024 22:22:37 +0530 Subject: [PATCH 4/4] chore: simplify conditions --- src/shared/shared.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/shared.ts b/src/shared/shared.ts index 1c3ba524..44f562a9 100644 --- a/src/shared/shared.ts +++ b/src/shared/shared.ts @@ -191,7 +191,7 @@ const KNOWN_EXTENSIONS = new Set( ) export function treatAsHtml(filename: string): boolean { - const ext = filename.split('.').pop()?.toLowerCase() + const ext = filename.split('.').pop() - return ext == null || !KNOWN_EXTENSIONS.has(ext) + return ext == null || !KNOWN_EXTENSIONS.has(ext.toLowerCase()) }