dumi 2.0.0-beta.6 → 2.0.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/theme-api/DumiDemo.js +1 -0
- package/dist/client/theme-api/DumiPage.js +24 -4
- package/dist/client/theme-api/context.d.ts +3 -0
- package/dist/client/theme-api/context.js +1 -0
- package/dist/client/theme-api/index.d.ts +2 -0
- package/dist/client/theme-api/index.js +3 -1
- package/dist/client/theme-api/types.d.ts +34 -3
- package/dist/client/theme-api/useRouteMeta.js +4 -3
- package/dist/client/theme-api/useSiteSearch.d.ts +23 -0
- package/dist/client/theme-api/useSiteSearch.js +331 -0
- package/dist/client/theme-api/useTabMeta.d.ts +4 -0
- package/dist/client/theme-api/useTabMeta.js +47 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.js +11 -0
- package/dist/features/compile.js +6 -1
- package/dist/features/configPlugins/index.js +1 -1
- package/dist/features/configPlugins/schema.js +2 -1
- package/dist/features/exports.d.ts +5 -0
- package/dist/features/exports.js +23 -2
- package/dist/features/meta.js +43 -22
- package/dist/features/parser.js +9 -4
- package/dist/features/routes.js +9 -9
- package/dist/features/tabs.js +3 -3
- package/dist/features/theme/index.js +8 -2
- package/dist/loaders/markdown/index.d.ts +1 -1
- package/dist/loaders/markdown/index.js +69 -45
- package/dist/loaders/markdown/transformer/index.d.ts +9 -5
- package/dist/loaders/markdown/transformer/index.js +6 -6
- package/dist/loaders/markdown/transformer/rehypeDemo.js +13 -5
- package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +6 -1
- package/dist/loaders/markdown/transformer/rehypeImg.d.ts +6 -0
- package/dist/loaders/markdown/transformer/rehypeImg.js +57 -0
- package/dist/loaders/markdown/transformer/rehypeJsxify.js +17 -1
- package/dist/loaders/markdown/transformer/rehypeSlug.d.ts +2 -2
- package/dist/loaders/markdown/transformer/rehypeSlug.js +21 -57
- package/dist/loaders/markdown/transformer/rehypeText.d.ts +4 -0
- package/dist/loaders/markdown/transformer/rehypeText.js +110 -0
- package/dist/loaders/markdown/transformer/remarkEmbed.d.ts +4 -0
- package/dist/loaders/markdown/transformer/remarkEmbed.js +89 -0
- package/dist/loaders/page/index.js +1 -0
- package/dist/types.d.ts +8 -1
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +16 -0
- package/package.json +12 -11
- package/theme-default/builtins/Previewer/index.js +1 -0
- package/theme-default/layouts/DocLayout/index.js +3 -1
- package/theme-default/layouts/DocLayout/index.less +9 -4
- package/theme-default/locales/en-US.json +2 -1
- package/theme-default/locales/zh-CN.json +2 -1
- package/theme-default/slots/ContentTabs/index.d.ts +1 -1
- package/theme-default/slots/ContentTabs/index.js +1 -1
- package/theme-default/slots/Features/index.d.ts +4 -0
- package/theme-default/slots/Features/index.js +28 -0
- package/theme-default/slots/Features/index.less +49 -0
- package/theme-default/slots/Header/index.js +9 -2
- package/theme-default/slots/Header/index.less +18 -10
- package/theme-default/slots/Hero/index.d.ts +4 -0
- package/theme-default/slots/Hero/index.js +35 -0
- package/theme-default/slots/Hero/index.less +65 -0
- package/theme-default/slots/HeroTitle/index.d.ts +6 -0
- package/theme-default/slots/HeroTitle/index.js +10 -0
- package/theme-default/slots/HeroTitle/index.less +23 -0
- package/theme-default/slots/SearchBar/index.js +69 -9
- package/theme-default/slots/SearchBar/index.less +37 -4
- package/theme-default/slots/SearchResult/index.d.ts +9 -0
- package/theme-default/slots/SearchResult/index.js +168 -0
- package/theme-default/slots/SearchResult/index.less +119 -0
- package/dist/loaders/markdown/transformer/rehypeEmbed.d.ts +0 -12
- package/dist/loaders/markdown/transformer/rehypeEmbed.js +0 -87
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { IApi } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* exclude pre-compiling modules in mfsu mode
|
|
4
|
+
* and make sure there has no multiple instances problem (such as react)
|
|
5
|
+
*/
|
|
6
|
+
export declare function safeExcludeInMFSU(api: IApi, excludes: RegExp[]): void;
|
|
2
7
|
declare const _default: (api: IApi) => void;
|
|
3
8
|
export default _default;
|
package/dist/features/exports.js
CHANGED
|
@@ -22,12 +22,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
22
22
|
// src/features/exports.ts
|
|
23
23
|
var exports_exports = {};
|
|
24
24
|
__export(exports_exports, {
|
|
25
|
-
default: () => exports_default
|
|
25
|
+
default: () => exports_default,
|
|
26
|
+
safeExcludeInMFSU: () => safeExcludeInMFSU
|
|
26
27
|
});
|
|
27
28
|
module.exports = __toCommonJS(exports_exports);
|
|
28
29
|
var import_plugin_utils = require("umi/plugin-utils");
|
|
30
|
+
function safeExcludeInMFSU(api, excludes) {
|
|
31
|
+
if (api.userConfig.mfsu !== false) {
|
|
32
|
+
api.modifyDefaultConfig((memo) => {
|
|
33
|
+
memo.mfsu ?? (memo.mfsu = {});
|
|
34
|
+
memo.mfsu.exclude = (0, import_plugin_utils.deepmerge)(memo.mfsu.exclude || [], excludes);
|
|
35
|
+
memo.extraBabelIncludes ?? (memo.extraBabelIncludes = []);
|
|
36
|
+
memo.extraBabelIncludes.push(...excludes);
|
|
37
|
+
return memo;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
29
41
|
var exports_default = (api) => {
|
|
30
42
|
api.describe({ key: void 0 });
|
|
43
|
+
safeExcludeInMFSU(api, [new RegExp("dumi/dist/client")]);
|
|
44
|
+
api.modifyDefaultConfig((memo) => {
|
|
45
|
+
if (api.userConfig.mfsu !== false) {
|
|
46
|
+
memo.mfsu = { strategy: "normal" };
|
|
47
|
+
}
|
|
48
|
+
return memo;
|
|
49
|
+
});
|
|
31
50
|
api.modifyConfig((memo) => {
|
|
32
51
|
memo.alias["dumi$"] = "@@/dumi/exports";
|
|
33
52
|
return memo;
|
|
@@ -42,4 +61,6 @@ export * from '${(0, import_plugin_utils.winPath)(require.resolve("../client/the
|
|
|
42
61
|
});
|
|
43
62
|
};
|
|
44
63
|
// Annotate the CommonJS export names for ESM import in node:
|
|
45
|
-
0 && (module.exports = {
|
|
64
|
+
0 && (module.exports = {
|
|
65
|
+
safeExcludeInMFSU
|
|
66
|
+
});
|
package/dist/features/meta.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
7
|
var __export = (target, all) => {
|
|
6
8
|
for (var name in all)
|
|
@@ -14,6 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
14
16
|
}
|
|
15
17
|
return to;
|
|
16
18
|
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
|
17
20
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
21
|
|
|
19
22
|
// src/features/meta.ts
|
|
@@ -24,24 +27,29 @@ __export(meta_exports, {
|
|
|
24
27
|
default: () => meta_default
|
|
25
28
|
});
|
|
26
29
|
module.exports = __toCommonJS(meta_exports);
|
|
30
|
+
var import_path = __toESM(require("path"));
|
|
27
31
|
var import_plugin_utils = require("umi/plugin-utils");
|
|
28
32
|
var import_tabs = require("./tabs");
|
|
29
33
|
var TABS_META_PATH = "dumi/meta/tabs.ts";
|
|
30
34
|
var ATOMS_META_PATH = "dumi/meta/atoms.ts";
|
|
31
35
|
var meta_default = (api) => {
|
|
32
36
|
const metaFiles = [];
|
|
33
|
-
api.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
api.register({
|
|
38
|
+
key: "modifyRoutes",
|
|
39
|
+
stage: Infinity,
|
|
40
|
+
fn: (routes) => {
|
|
41
|
+
metaFiles.length = 0;
|
|
42
|
+
Object.values(routes).forEach((route) => {
|
|
43
|
+
if (!route.isLayout && !/\*|:/.test(route.path) && !(0, import_tabs.isTabRouteFile)(route.file)) {
|
|
44
|
+
metaFiles.push({
|
|
45
|
+
index: metaFiles.length,
|
|
46
|
+
file: route.file,
|
|
47
|
+
id: route.id
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return routes;
|
|
52
|
+
}
|
|
45
53
|
});
|
|
46
54
|
api.onGenerateFiles(async () => {
|
|
47
55
|
api.writeTmpFile({
|
|
@@ -53,29 +61,41 @@ var meta_default = (api) => {
|
|
|
53
61
|
noPluginDir: true,
|
|
54
62
|
path: "dumi/meta/index.ts",
|
|
55
63
|
content: import_plugin_utils.Mustache.render(`{{#metaFiles}}
|
|
56
|
-
import { demos as
|
|
64
|
+
import { demos as dm{{{index}}}, frontmatter as fm{{{index}}}, toc as toc{{{index}}}, texts as txt{{{index}}} } from '{{{file}}}?type=meta';
|
|
57
65
|
{{/metaFiles}}
|
|
58
66
|
|
|
59
67
|
export { components } from './atoms';
|
|
60
68
|
export { tabs } from './tabs';
|
|
61
69
|
|
|
62
|
-
export const demos = {
|
|
63
|
-
{{#metaFiles}}
|
|
64
|
-
...d{{{index}}},
|
|
65
|
-
{{/metaFiles}}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
70
|
export const filesMeta = {
|
|
69
71
|
{{#metaFiles}}
|
|
70
72
|
'{{{id}}}': {
|
|
71
73
|
frontmatter: fm{{{index}}},
|
|
72
74
|
toc: toc{{{index}}},
|
|
75
|
+
texts: txt{{{index}}},
|
|
76
|
+
demos: dm{{{index}}},
|
|
73
77
|
{{#tabs}}
|
|
74
78
|
tabs: {{{tabs}}},
|
|
75
79
|
{{/tabs}}
|
|
76
80
|
},
|
|
77
81
|
{{/metaFiles}}
|
|
78
|
-
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// generate demos data in runtime, for reuse route.id to reduce bundle size
|
|
85
|
+
export const demos = Object.entries(filesMeta).reduce((acc, [id, meta]) => {
|
|
86
|
+
// append route id to demo
|
|
87
|
+
Object.values(meta.demos).forEach((demo) => {
|
|
88
|
+
demo.routeId = id;
|
|
89
|
+
});
|
|
90
|
+
// merge demos
|
|
91
|
+
Object.assign(acc, meta.demos);
|
|
92
|
+
|
|
93
|
+
// remove demos from meta, to avoid deep clone demos in umi routes/children compatible logic
|
|
94
|
+
delete meta.demos;
|
|
95
|
+
|
|
96
|
+
return acc;
|
|
97
|
+
}, {});
|
|
98
|
+
`, {
|
|
79
99
|
metaFiles: await api.applyPlugins({
|
|
80
100
|
type: api.ApplyPluginsType.modify,
|
|
81
101
|
key: "dumi.modifyMetaFiles",
|
|
@@ -87,15 +107,16 @@ export const filesMeta = {
|
|
|
87
107
|
noPluginDir: true,
|
|
88
108
|
path: "dumi/meta/runtime.ts",
|
|
89
109
|
content: `import { filesMeta, tabs } from '.';
|
|
110
|
+
import deepmerge from '${(0, import_plugin_utils.winPath)(import_path.default.dirname(require.resolve("deepmerge/package")))}';
|
|
90
111
|
export const patchRoutes = ({ routes }) => {
|
|
91
112
|
Object.values(routes).forEach((route) => {
|
|
92
113
|
if (filesMeta[route.id]) {
|
|
93
|
-
route.meta =
|
|
114
|
+
route.meta = deepmerge(route.meta, filesMeta[route.id]);
|
|
94
115
|
|
|
95
116
|
// apply real tab data from id
|
|
96
117
|
route.meta.tabs = route.meta.tabs?.map(id => ({
|
|
97
118
|
...tabs[id],
|
|
98
|
-
|
|
119
|
+
meta: filesMeta[id],
|
|
99
120
|
}));
|
|
100
121
|
}
|
|
101
122
|
});
|
package/dist/features/parser.js
CHANGED
|
@@ -49,17 +49,22 @@ var parser_default = (api) => {
|
|
|
49
49
|
return memo;
|
|
50
50
|
});
|
|
51
51
|
api.onStart(async () => {
|
|
52
|
-
const {
|
|
52
|
+
const {
|
|
53
|
+
default: AtomAssetsParser
|
|
54
|
+
} = require("../assetParsers/atom");
|
|
53
55
|
api.service.atomParser = new AtomAssetsParser({
|
|
54
56
|
entryFile: api.config.resolve.entryFile,
|
|
55
57
|
resolveDir: api.cwd
|
|
56
58
|
});
|
|
57
|
-
if (api.env === "
|
|
58
|
-
api.service.atomParser.parse().then(writeAtomsMetaFile);
|
|
59
|
-
} else {
|
|
59
|
+
if (api.env === "development") {
|
|
60
60
|
api.service.atomParser.watch(writeAtomsMetaFile);
|
|
61
61
|
}
|
|
62
62
|
});
|
|
63
|
+
if (api.env === "production") {
|
|
64
|
+
api.onGenerateFiles(async () => {
|
|
65
|
+
writeAtomsMetaFile(await api.service.atomParser.parse());
|
|
66
|
+
});
|
|
67
|
+
}
|
|
63
68
|
};
|
|
64
69
|
// Annotate the CommonJS export names for ESM import in node:
|
|
65
70
|
0 && (module.exports = {});
|
package/dist/features/routes.js
CHANGED
|
@@ -47,7 +47,7 @@ function localizeUmiRoute(route, locales) {
|
|
|
47
47
|
var routes_default = (api) => {
|
|
48
48
|
var _a, _b, _c;
|
|
49
49
|
const extraWatchPaths = [
|
|
50
|
-
...((_a = api.userConfig.resolve) == null ? void 0 : _a.
|
|
50
|
+
...((_a = api.userConfig.resolve) == null ? void 0 : _a.atomDirs) || [],
|
|
51
51
|
...((_c = (_b = api.userConfig.resolve) == null ? void 0 : _b.docDirs) == null ? void 0 : _c.map(normalizeDocDir)) || [
|
|
52
52
|
{ dir: "docs" }
|
|
53
53
|
]
|
|
@@ -63,7 +63,7 @@ var routes_default = (api) => {
|
|
|
63
63
|
});
|
|
64
64
|
api.modifyDefaultConfig((memo) => {
|
|
65
65
|
if (api.userConfig.resolve) {
|
|
66
|
-
const keys = ["docDirs", "
|
|
66
|
+
const keys = ["docDirs", "atomDirs"];
|
|
67
67
|
keys.forEach((key) => {
|
|
68
68
|
var _a2;
|
|
69
69
|
if (((_a2 = api.userConfig.resolve[key]) == null ? void 0 : _a2.length) === 0)
|
|
@@ -83,7 +83,7 @@ var routes_default = (api) => {
|
|
|
83
83
|
return ret;
|
|
84
84
|
}, {});
|
|
85
85
|
const { DocLayout, DemoLayout } = api.service.themeData.layouts;
|
|
86
|
-
const { docDirs,
|
|
86
|
+
const { docDirs, atomDirs } = api.config.resolve;
|
|
87
87
|
const layoutRouteValues = Object.values(routes);
|
|
88
88
|
const lastLayoutId = layoutRouteValues.find(({ id }) => layoutRouteValues.every(({ parentId }) => id !== parentId)).id;
|
|
89
89
|
let docLayoutId = lastLayoutId;
|
|
@@ -112,7 +112,7 @@ var routes_default = (api) => {
|
|
|
112
112
|
}
|
|
113
113
|
Object.entries(pages).forEach(([, route]) => {
|
|
114
114
|
route.parentId = docLayoutId;
|
|
115
|
-
route.file = import_path.default.resolve(pagesDir, route.file);
|
|
115
|
+
route.file = (0, import_plugin_utils.winPath)(import_path.default.resolve(pagesDir, route.file));
|
|
116
116
|
routes[route.id] = route;
|
|
117
117
|
});
|
|
118
118
|
docDirs.map(normalizeDocDir).forEach(({ type, dir }) => {
|
|
@@ -129,15 +129,15 @@ var routes_default = (api) => {
|
|
|
129
129
|
route.path = `${pluralType}/${route.path}`.replace(/\/+$/, "/");
|
|
130
130
|
route.absPath = `/${route.path}`;
|
|
131
131
|
}
|
|
132
|
-
route.file = import_path.default.resolve(base, route.file);
|
|
132
|
+
route.file = (0, import_plugin_utils.winPath)(import_path.default.resolve(base, route.file));
|
|
133
133
|
localizeUmiRoute(route, api.config.locales);
|
|
134
134
|
routes[route.id] = route;
|
|
135
135
|
});
|
|
136
136
|
});
|
|
137
|
-
|
|
137
|
+
atomDirs.forEach(({ type, dir }) => {
|
|
138
138
|
const base = import_path.default.join(api.cwd, dir);
|
|
139
|
-
const
|
|
140
|
-
|
|
139
|
+
const atomFiles = import_plugin_utils.glob.sync("{*,*/index,*/index.*,*/README,*/README.*}.md", { cwd: base });
|
|
140
|
+
atomFiles.forEach((file) => {
|
|
141
141
|
const routePath = (0, import_plugin_utils.winPath)(import_path.default.join((0, import_pluralize.plural)(type), file)).replace(/(\/index|\/README)?\.md$/, "").replace(/\./g, "/");
|
|
142
142
|
const routeId = (0, import_utils.createRouteId)(file);
|
|
143
143
|
routes[routeId] = {
|
|
@@ -145,7 +145,7 @@ var routes_default = (api) => {
|
|
|
145
145
|
path: routePath,
|
|
146
146
|
absPath: `/${routePath}`,
|
|
147
147
|
parentId: docLayoutId,
|
|
148
|
-
file: import_path.default.resolve(base, file)
|
|
148
|
+
file: (0, import_plugin_utils.winPath)(import_path.default.resolve(base, file))
|
|
149
149
|
};
|
|
150
150
|
localizeUmiRoute(routes[routeId], api.config.locales);
|
|
151
151
|
});
|
package/dist/features/tabs.js
CHANGED
|
@@ -70,9 +70,9 @@ var tabs_default = (api) => {
|
|
|
70
70
|
routesTabMapping[parentFile].push(routeId);
|
|
71
71
|
} else {
|
|
72
72
|
tabsFromPlugins.forEach((tab) => {
|
|
73
|
-
var _a;
|
|
74
|
-
if (!tab.test || route.absPath.match(tab.test)) {
|
|
75
|
-
routesTabMapping[
|
|
73
|
+
var _a, _b;
|
|
74
|
+
if ((!tab.test || route.absPath.match(tab.test)) && !((_a = routesTabMapping[route.file]) == null ? void 0 : _a.includes(tab.id))) {
|
|
75
|
+
routesTabMapping[_b = route.file] ?? (routesTabMapping[_b] = []);
|
|
76
76
|
routesTabMapping[route.file].push(tab.id);
|
|
77
77
|
}
|
|
78
78
|
});
|
|
@@ -29,11 +29,16 @@ var import_constants = require("../../constants");
|
|
|
29
29
|
var import_fs = __toESM(require("fs"));
|
|
30
30
|
var import_path = __toESM(require("path"));
|
|
31
31
|
var import_plugin_utils = require("umi/plugin-utils");
|
|
32
|
+
var import_exports = require("../exports");
|
|
32
33
|
var import_loader = __toESM(require("./loader"));
|
|
33
34
|
var DEFAULT_THEME_PATH = import_path.default.join(__dirname, "../../../theme-default");
|
|
34
|
-
function
|
|
35
|
+
function getPkgThemeName(api) {
|
|
35
36
|
const validDeps = Object.assign({}, api.pkg.dependencies, api.pkg.devDependencies);
|
|
36
37
|
const pkgThemeName = Object.keys(validDeps).find((pkg) => pkg.split("/").pop().startsWith(import_constants.THEME_PREFIX));
|
|
38
|
+
return pkgThemeName;
|
|
39
|
+
}
|
|
40
|
+
function getPkgThemePath(api) {
|
|
41
|
+
const pkgThemeName = getPkgThemeName(api);
|
|
37
42
|
return pkgThemeName && import_path.default.basename(require.resolve(`${pkgThemeName}/package.json`, { paths: [api.cwd] }));
|
|
38
43
|
}
|
|
39
44
|
var theme_default = (api) => {
|
|
@@ -46,6 +51,7 @@ var theme_default = (api) => {
|
|
|
46
51
|
];
|
|
47
52
|
let originalThemeData;
|
|
48
53
|
api.describe({ key: "dumi:theme" });
|
|
54
|
+
(0, import_exports.safeExcludeInMFSU)(api, ["dumi/theme-default", "@ant-design/icons-svg", getPkgThemeName(api)].filter(Boolean).map((pkg) => new RegExp(pkg)));
|
|
49
55
|
api.register({
|
|
50
56
|
key: "modifyAppData",
|
|
51
57
|
before: "appData",
|
|
@@ -77,7 +83,6 @@ var theme_default = (api) => {
|
|
|
77
83
|
}
|
|
78
84
|
});
|
|
79
85
|
api.modifyConfig((memo) => {
|
|
80
|
-
memo.alias["dumi/theme$"] = require.resolve("../../client/theme-api");
|
|
81
86
|
if (localThemeData) {
|
|
82
87
|
themeMapKeys.forEach((key) => {
|
|
83
88
|
Object.values(localThemeData[key] || {}).forEach((item) => {
|
|
@@ -123,6 +128,7 @@ export default function DumiContextWrapper() {
|
|
|
123
128
|
|
|
124
129
|
return (
|
|
125
130
|
<SiteContext.Provider value={{
|
|
131
|
+
pkg: ${JSON.stringify(import_plugin_utils.lodash.pick(api.pkg, ...Object.keys(import_constants.PICKED_PKG_FIELDS)))},
|
|
126
132
|
demos,
|
|
127
133
|
components,
|
|
128
134
|
locales,
|
|
@@ -9,5 +9,5 @@ interface IMdLoaderDemosModeOptions extends Omit<IMdLoaderDefaultModeOptions, 'b
|
|
|
9
9
|
onResolveDemos?: (demos: IMdTransformerResult['meta']['demos']) => void;
|
|
10
10
|
}
|
|
11
11
|
export declare type IMdLoaderOptions = IMdLoaderDefaultModeOptions | IMdLoaderDemosModeOptions;
|
|
12
|
-
export default function mdLoader(this: any,
|
|
12
|
+
export default function mdLoader(this: any, content: string): void;
|
|
13
13
|
export {};
|
|
@@ -25,32 +25,20 @@ __export(markdown_exports, {
|
|
|
25
25
|
default: () => mdLoader
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(markdown_exports);
|
|
28
|
+
var import_tabs = require("../../features/tabs");
|
|
28
29
|
var import_utils = require("../../utils");
|
|
30
|
+
var import_fs = __toESM(require("fs"));
|
|
29
31
|
var import_plugin_utils = require("umi/plugin-utils");
|
|
30
32
|
var import_transformer = __toESM(require("./transformer"));
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
} else if (regexp) {
|
|
41
|
-
content = (0, import_utils.getFileContentByRegExp)(content, regexp, this.resourcePath);
|
|
42
|
-
}
|
|
43
|
-
(0, import_transformer.default)(content, {
|
|
44
|
-
...import_plugin_utils.lodash.omit(opts, ["mode", "builtins"]),
|
|
45
|
-
fileAbsPath: this.resourcePath
|
|
46
|
-
}).then((ret) => {
|
|
47
|
-
if (opts.mode === "meta") {
|
|
48
|
-
const { demos, frontmatter, toc, embeds = [] } = ret.meta;
|
|
49
|
-
embeds.forEach((file) => this.addDependency(file));
|
|
50
|
-
if (demos && opts.onResolveDemos) {
|
|
51
|
-
opts.onResolveDemos(demos);
|
|
52
|
-
}
|
|
53
|
-
cb(null, import_plugin_utils.Mustache.render(`import React from 'react';
|
|
33
|
+
var import_rehypeText = require("./transformer/rehypeText");
|
|
34
|
+
function emit(opts, ret) {
|
|
35
|
+
if (opts.mode === "meta") {
|
|
36
|
+
const { demos, frontmatter, toc, texts, embeds = [] } = ret.meta;
|
|
37
|
+
embeds.forEach((file) => this.addDependency(file));
|
|
38
|
+
if (demos && opts.onResolveDemos) {
|
|
39
|
+
opts.onResolveDemos(demos);
|
|
40
|
+
}
|
|
41
|
+
return import_plugin_utils.Mustache.render(`import React from 'react';
|
|
54
42
|
|
|
55
43
|
export const demos = {
|
|
56
44
|
{{#demos}}
|
|
@@ -61,35 +49,71 @@ export const demos = {
|
|
|
61
49
|
{{/demos}}
|
|
62
50
|
};
|
|
63
51
|
export const frontmatter = {{{frontmatter}}};
|
|
64
|
-
export const toc = {{{toc}}}
|
|
52
|
+
export const toc = {{{toc}}};
|
|
53
|
+
export const texts = {{{texts}}};
|
|
65
54
|
`, {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
55
|
+
demos,
|
|
56
|
+
frontmatter: JSON.stringify(frontmatter),
|
|
57
|
+
toc: JSON.stringify(toc),
|
|
58
|
+
texts: JSON.stringify(texts),
|
|
59
|
+
renderAsset: function renderAsset() {
|
|
60
|
+
if (!("asset" in this))
|
|
61
|
+
return "null";
|
|
62
|
+
let { asset } = this;
|
|
63
|
+
const { sources } = this;
|
|
64
|
+
Object.keys(this.sources).forEach((file) => {
|
|
65
|
+
asset = import_plugin_utils.lodash.cloneDeep(asset);
|
|
66
|
+
asset.dependencies[file].value = `{{{require('!!raw-loader!${sources[file]}?raw').default}}}`;
|
|
67
|
+
});
|
|
68
|
+
return JSON.stringify(asset, null, 2).replace(/"{{{|}}}"/g, "");
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
const isTabContent = (0, import_tabs.isTabRouteFile)(this.resourcePath);
|
|
73
|
+
return `${Object.values(opts.builtins).map((item) => `import ${item.specifier} from '${item.source}';`).join("\n")}
|
|
74
|
+
import React from 'react';
|
|
75
|
+
${isTabContent ? `import { useTabMeta } from 'dumi';` : `import { DumiPage, useRouteMeta } from 'dumi';`}
|
|
83
76
|
|
|
84
77
|
// export named function for fastRefresh
|
|
85
78
|
// ref: https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/TROUBLESHOOTING.md#edits-always-lead-to-full-reload
|
|
86
79
|
function DumiMarkdownContent() {
|
|
87
|
-
|
|
80
|
+
const { texts: ${import_rehypeText.CONTENT_TEXTS_OBJ_NAME} } = use${isTabContent ? "TabMeta" : "RouteMeta"}();
|
|
81
|
+
return ${isTabContent ? ret.content : `<DumiPage>${ret.content}</DumiPage>`};
|
|
88
82
|
}
|
|
89
83
|
|
|
90
|
-
export default DumiMarkdownContent
|
|
91
|
-
|
|
92
|
-
|
|
84
|
+
export default DumiMarkdownContent;`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
var deferrer = {};
|
|
88
|
+
function mdLoader(content) {
|
|
89
|
+
const opts = this.getOptions();
|
|
90
|
+
const cb = this.async();
|
|
91
|
+
const cache = (0, import_utils.getCache)("md-loader");
|
|
92
|
+
const cacheKey = [
|
|
93
|
+
this.resourcePath,
|
|
94
|
+
import_fs.default.statSync(this.resourcePath).mtimeMs,
|
|
95
|
+
JSON.stringify(import_plugin_utils.lodash.omit(opts, ["mode", "builtins", "onResolveDemos"]))
|
|
96
|
+
].join(":");
|
|
97
|
+
const cacheRet = cache.getSync(cacheKey, "");
|
|
98
|
+
if (cacheRet) {
|
|
99
|
+
cb(null, emit.call(this, opts, cacheRet));
|
|
100
|
+
return;
|
|
101
|
+
} else if (cacheKey in deferrer) {
|
|
102
|
+
deferrer[cacheKey].then((res) => {
|
|
103
|
+
cb(null, emit.call(this, opts, res));
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
deferrer[cacheKey] = new Promise((resolve) => {
|
|
108
|
+
(0, import_transformer.default)(content, {
|
|
109
|
+
...import_plugin_utils.lodash.omit(opts, ["mode", "builtins", "onResolveDemos"]),
|
|
110
|
+
fileAbsPath: this.resourcePath
|
|
111
|
+
}).then((ret) => {
|
|
112
|
+
cache.setSync(cacheKey, ret);
|
|
113
|
+
resolve(ret);
|
|
114
|
+
cb(null, emit.call(this, opts, ret));
|
|
115
|
+
}, cb);
|
|
116
|
+
});
|
|
93
117
|
}
|
|
94
118
|
// Annotate the CommonJS export names for ESM import in node:
|
|
95
119
|
0 && (module.exports = {});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { IParsedBlockAsset } from "../../../assetParsers/block";
|
|
2
2
|
import type { IRouteMeta } from "../../../client/theme-api/types";
|
|
3
3
|
import type { IDumiConfig, IDumiTechStack } from "../../../types";
|
|
4
|
-
import type {
|
|
4
|
+
import type { Data } from 'vfile';
|
|
5
5
|
declare module 'hast' {
|
|
6
6
|
interface Element {
|
|
7
7
|
JSXAttributes?: Array<{
|
|
@@ -16,12 +16,16 @@ declare module 'hast' {
|
|
|
16
16
|
}
|
|
17
17
|
declare module 'vfile' {
|
|
18
18
|
interface DataMap {
|
|
19
|
-
demos: {
|
|
19
|
+
demos: ({
|
|
20
20
|
id: string;
|
|
21
21
|
component: string;
|
|
22
22
|
asset: IParsedBlockAsset['asset'];
|
|
23
23
|
sources: IParsedBlockAsset['sources'];
|
|
24
|
-
}
|
|
24
|
+
} | {
|
|
25
|
+
id: string;
|
|
26
|
+
component: string;
|
|
27
|
+
})[];
|
|
28
|
+
texts: IRouteMeta['texts'];
|
|
25
29
|
frontmatter: IRouteMeta['frontmatter'];
|
|
26
30
|
toc: IRouteMeta['toc'];
|
|
27
31
|
embeds?: string[];
|
|
@@ -38,10 +42,10 @@ export interface IMdTransformerOptions {
|
|
|
38
42
|
}
|
|
39
43
|
export interface IMdTransformerResult {
|
|
40
44
|
content: string;
|
|
41
|
-
meta:
|
|
45
|
+
meta: Data;
|
|
42
46
|
}
|
|
43
47
|
declare const _default: (raw: string, opts: IMdTransformerOptions) => Promise<{
|
|
44
48
|
content: string;
|
|
45
|
-
meta:
|
|
49
|
+
meta: Data;
|
|
46
50
|
}>;
|
|
47
51
|
export default _default;
|
|
@@ -26,13 +26,15 @@ __export(transformer_exports, {
|
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(transformer_exports);
|
|
28
28
|
var import_rehypeDemo = __toESM(require("./rehypeDemo"));
|
|
29
|
-
var import_rehypeEmbed = __toESM(require("./rehypeEmbed"));
|
|
30
29
|
var import_rehypeEnhancedTag = __toESM(require("./rehypeEnhancedTag"));
|
|
30
|
+
var import_rehypeImg = __toESM(require("./rehypeImg"));
|
|
31
31
|
var import_rehypeIsolation = __toESM(require("./rehypeIsolation"));
|
|
32
32
|
var import_rehypeJsxify = __toESM(require("./rehypeJsxify"));
|
|
33
33
|
var import_rehypeRaw = __toESM(require("./rehypeRaw"));
|
|
34
34
|
var import_rehypeSlug = __toESM(require("./rehypeSlug"));
|
|
35
35
|
var import_rehypeStrip = __toESM(require("./rehypeStrip"));
|
|
36
|
+
var import_rehypeText = __toESM(require("./rehypeText"));
|
|
37
|
+
var import_remarkEmbed = __toESM(require("./remarkEmbed"));
|
|
36
38
|
var import_remarkMeta = __toESM(require("./remarkMeta"));
|
|
37
39
|
function applyUnifiedPlugin(opts) {
|
|
38
40
|
const [plugin, options] = Array.isArray(opts.plugin) ? opts.plugin : [opts.plugin];
|
|
@@ -49,20 +51,18 @@ var transformer_default = async (raw, opts) => {
|
|
|
49
51
|
const { default: remarkGfm } = await import("remark-gfm");
|
|
50
52
|
const { default: remarkRehype } = await import("remark-rehype");
|
|
51
53
|
const { default: rehypeAutolinkHeadings } = await import("rehype-autolink-headings");
|
|
52
|
-
const processor = unified().use(remarkParse).use(remarkFrontmatter).use(import_remarkMeta.default, { fileAbsPath: opts.fileAbsPath }).use(remarkBreaks).use(remarkGfm);
|
|
54
|
+
const processor = unified().use(remarkParse).use(import_remarkEmbed.default, { fileAbsPath: opts.fileAbsPath }).use(remarkFrontmatter).use(import_remarkMeta.default, { fileAbsPath: opts.fileAbsPath }).use(remarkBreaks).use(remarkGfm);
|
|
53
55
|
(_a = opts.extraRemarkPlugins) == null ? void 0 : _a.forEach((plugin) => applyUnifiedPlugin({
|
|
54
56
|
plugin,
|
|
55
57
|
processor,
|
|
56
58
|
cwd: opts.cwd
|
|
57
59
|
}));
|
|
58
|
-
processor.use(remarkRehype, { allowDangerousHtml: true }).use(import_rehypeRaw.default).use(import_rehypeStrip.default).use(
|
|
59
|
-
fileAbsPath: opts.fileAbsPath
|
|
60
|
-
}).use(import_rehypeDemo.default, {
|
|
60
|
+
processor.use(remarkRehype, { allowDangerousHtml: true }).use(import_rehypeRaw.default).use(import_rehypeStrip.default).use(import_rehypeImg.default).use(import_rehypeDemo.default, {
|
|
61
61
|
techStacks: opts.techStacks,
|
|
62
62
|
cwd: opts.cwd,
|
|
63
63
|
fileAbsPath: opts.fileAbsPath,
|
|
64
64
|
codeBlockMode: opts.codeBlockMode
|
|
65
|
-
}).use(import_rehypeSlug.default
|
|
65
|
+
}).use(import_rehypeSlug.default).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeText.default);
|
|
66
66
|
(_b = opts.extraRehypePlugins) == null ? void 0 : _b.forEach((plugin) => applyUnifiedPlugin({
|
|
67
67
|
plugin,
|
|
68
68
|
processor,
|
|
@@ -55,8 +55,8 @@ function getCodeLang(node, opts) {
|
|
|
55
55
|
}
|
|
56
56
|
return lang;
|
|
57
57
|
}
|
|
58
|
-
function getCodeId(cwd, fileAbsPath, localId,
|
|
59
|
-
const prefix =
|
|
58
|
+
function getCodeId(cwd, fileAbsPath, localId, atomId) {
|
|
59
|
+
const prefix = atomId || (0, import_utils.getRoutePathFromFsPath)(import_path.default.relative(cwd, fileAbsPath)).replace(/\//g, "-");
|
|
60
60
|
return [prefix, "demo", localId].filter(Boolean).join("-");
|
|
61
61
|
}
|
|
62
62
|
function tryMarkDemoNode(node, opts) {
|
|
@@ -150,8 +150,9 @@ function rehypeDemo(opts) {
|
|
|
150
150
|
fileAbsPath: opts.fileAbsPath
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
|
+
const propDemo = { id: parseOpts.id };
|
|
153
154
|
deferrers.push((0, import_block.default)(parseOpts).then(async ({ asset, sources, frontmatter }) => {
|
|
154
|
-
var _a3;
|
|
155
|
+
var _a3, _b;
|
|
155
156
|
const { src, className, ...restAttrs } = codeNode.properties || {};
|
|
156
157
|
const validAssetAttrs = [
|
|
157
158
|
"title",
|
|
@@ -167,7 +168,14 @@ function rehypeDemo(opts) {
|
|
|
167
168
|
if (originalProps[key])
|
|
168
169
|
asset[key] = originalProps[key];
|
|
169
170
|
});
|
|
170
|
-
|
|
171
|
+
if (/ inline/.test(String((_a3 = codeNode.data) == null ? void 0 : _a3.meta)) || originalProps.inline) {
|
|
172
|
+
propDemo.inline = true;
|
|
173
|
+
return {
|
|
174
|
+
id: asset.id,
|
|
175
|
+
component
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
Object.assign(previewerProps, await ((_b = techStack.generatePreviewerProps) == null ? void 0 : _b.call(techStack, originalProps, {
|
|
171
179
|
type: codeType,
|
|
172
180
|
mdAbsPath: opts.fileAbsPath,
|
|
173
181
|
fileAbsPath: codeType === "external" ? parseOpts.fileAbsPath : void 0,
|
|
@@ -194,7 +202,7 @@ function rehypeDemo(opts) {
|
|
|
194
202
|
};
|
|
195
203
|
}));
|
|
196
204
|
demosPropData.push({
|
|
197
|
-
demo:
|
|
205
|
+
demo: propDemo,
|
|
198
206
|
previewerProps
|
|
199
207
|
});
|
|
200
208
|
}
|
|
@@ -44,7 +44,12 @@ function rehypeEnhancedTag() {
|
|
|
44
44
|
type: "element",
|
|
45
45
|
tagName: "SourceCode",
|
|
46
46
|
properties: { lang },
|
|
47
|
-
children: [
|
|
47
|
+
children: [
|
|
48
|
+
{
|
|
49
|
+
type: "text",
|
|
50
|
+
value: toString(node.children[0])
|
|
51
|
+
}
|
|
52
|
+
]
|
|
48
53
|
});
|
|
49
54
|
}
|
|
50
55
|
});
|