diff --git a/package.json b/package.json index 7d18cdee1d..9f8dcc6903 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dumi", - "version": "2.1.14", + "version": "2.1.15", "description": "📖 Documentation Generator of React Component", "keywords": [ "generator", diff --git a/src/features/derivative.ts b/src/features/derivative.ts index 6aa3f099d6..86c8bc500b 100644 --- a/src/features/derivative.ts +++ b/src/features/derivative.ts @@ -3,7 +3,7 @@ import type { IApi } from '@/types'; import assert from 'assert'; import fs from 'fs'; import path from 'path'; -import { deepmerge, fsExtra, logger, winPath } from 'umi/plugin-utils'; +import { deepmerge, fsExtra, logger, semver, winPath } from 'umi/plugin-utils'; /** * exclude pre-compiling modules in mfsu mode @@ -200,6 +200,24 @@ export default (api: IApi) => { USELESS_TMP_FILES.forEach((file) => { fsExtra.rmSync(path.join(api.paths.absTmpPath, file), { force: true }); }); + + // replace helmet for ssr since @umi@4.0.54 + // ref: https://github.com/umijs/umi/pull/10633 + if ( + api.config.ssr && + semver.subset(api.appData.umi.version, '4.0.54 - 4.0.55') + ) { + const helmetPath = path.join(api.paths.absTmpPath, 'core/helmet.ts'); + fsExtra.writeFileSync( + helmetPath, + fsExtra + .readFileSync(helmetPath, 'utf-8') + .replace( + /(return )(React\.createElement)/, + "$1typeof window === 'undefined' ? container : $2", + ), + ); + } }, }); diff --git a/src/loaders/markdown/transformer/rehypeLink.ts b/src/loaders/markdown/transformer/rehypeLink.ts index 68e410c3ac..291d71c481 100644 --- a/src/loaders/markdown/transformer/rehypeLink.ts +++ b/src/loaders/markdown/transformer/rehypeLink.ts @@ -21,13 +21,22 @@ export default function rehypeLink( ): Transformer { return (tree) => { visit(tree, 'element', (node, i, parent) => { - if (node.tagName === 'a' && typeof node.properties?.href === 'string') { + if ( + node.tagName === 'a' && + typeof node.properties?.href === 'string' && + // skip target specified link + !node.properties?.target && + // skip download link + !node.properties?.download + ) { const href = node.properties.href; const parsedUrl = url.parse(href); const hostAbsPath = getHostForTabRouteFile(opts.fileAbsPath); - // handle internal link - if (parsedUrl.hostname) return SKIP; + // skip external or special links: + // - http://www.example.com or mailto:xxx@example.com or data:image/xxx + // - //www.example.com + if (parsedUrl.protocol || href.startsWith('//')) return SKIP; if (/\.md$/i.test(parsedUrl.pathname!)) { // handle markdown link @@ -41,10 +50,7 @@ export default function rehypeLink( parsedUrl.pathname = routes[key].absPath; } }); - } else if ( - /^\.?\.\//.test(parsedUrl.pathname!) || - /^(\w+:)?\/\//.test(parsedUrl.pathname!) - ) { + } else if (parsedUrl.pathname && /^[^/]+/.test(parsedUrl.pathname)) { // handle relative link // transform relative link to absolute link // because react-router@6 and HTML href are different in processing relative link diff --git a/suites/boilerplate/package.json b/suites/boilerplate/package.json index dd1ceb6291..683607e870 100644 --- a/suites/boilerplate/package.json +++ b/suites/boilerplate/package.json @@ -1,6 +1,6 @@ { "name": "create-dumi", - "version": "2.0.7", + "version": "2.0.8", "description": "Creator for dumi boilerplate", "homepage": "https://github.com/umijs/dumi/tree/master/suites/boilerplate#readme", "bugs": "https://github.com/umijs/dumi/issues", diff --git a/suites/boilerplate/templates/react/package.json.tpl b/suites/boilerplate/templates/react/package.json.tpl index 2737884b7c..28d2c168f4 100644 --- a/suites/boilerplate/templates/react/package.json.tpl +++ b/suites/boilerplate/templates/react/package.json.tpl @@ -56,6 +56,8 @@ "devDependencies": { "@commitlint/cli": "^17.1.2", "@commitlint/config-conventional": "^17.1.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", "@umijs/lint": "^4.0.0", "dumi": "{{{ version }}}", "eslint": "^8.23.0",