dumi 2.0.0-beta.7 → 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.
Files changed (62) hide show
  1. package/dist/client/theme-api/DumiPage.js +24 -4
  2. package/dist/client/theme-api/context.d.ts +1 -0
  3. package/dist/client/theme-api/index.d.ts +2 -0
  4. package/dist/client/theme-api/index.js +3 -1
  5. package/dist/client/theme-api/types.d.ts +34 -3
  6. package/dist/client/theme-api/useRouteMeta.js +4 -3
  7. package/dist/client/theme-api/useSiteSearch.d.ts +23 -0
  8. package/dist/client/theme-api/useSiteSearch.js +331 -0
  9. package/dist/client/theme-api/useTabMeta.d.ts +4 -0
  10. package/dist/client/theme-api/useTabMeta.js +47 -0
  11. package/dist/features/configPlugins/index.js +1 -1
  12. package/dist/features/configPlugins/schema.js +2 -1
  13. package/dist/features/exports.d.ts +5 -0
  14. package/dist/features/exports.js +23 -2
  15. package/dist/features/meta.js +43 -22
  16. package/dist/features/routes.js +6 -6
  17. package/dist/features/theme/index.js +7 -2
  18. package/dist/loaders/markdown/index.d.ts +1 -1
  19. package/dist/loaders/markdown/index.js +69 -48
  20. package/dist/loaders/markdown/transformer/index.d.ts +4 -3
  21. package/dist/loaders/markdown/transformer/index.js +6 -6
  22. package/dist/loaders/markdown/transformer/rehypeDemo.js +2 -2
  23. package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +6 -1
  24. package/dist/loaders/markdown/transformer/rehypeImg.d.ts +6 -0
  25. package/dist/loaders/markdown/transformer/rehypeImg.js +57 -0
  26. package/dist/loaders/markdown/transformer/rehypeJsxify.js +17 -1
  27. package/dist/loaders/markdown/transformer/rehypeSlug.d.ts +2 -2
  28. package/dist/loaders/markdown/transformer/rehypeSlug.js +21 -57
  29. package/dist/loaders/markdown/transformer/rehypeText.d.ts +4 -0
  30. package/dist/loaders/markdown/transformer/rehypeText.js +110 -0
  31. package/dist/loaders/markdown/transformer/remarkEmbed.d.ts +4 -0
  32. package/dist/loaders/markdown/transformer/remarkEmbed.js +89 -0
  33. package/dist/loaders/page/index.js +1 -0
  34. package/dist/types.d.ts +8 -1
  35. package/dist/utils.d.ts +7 -0
  36. package/dist/utils.js +16 -0
  37. package/package.json +12 -11
  38. package/theme-default/builtins/Previewer/index.js +1 -0
  39. package/theme-default/layouts/DocLayout/index.js +3 -1
  40. package/theme-default/layouts/DocLayout/index.less +9 -4
  41. package/theme-default/locales/en-US.json +2 -1
  42. package/theme-default/locales/zh-CN.json +2 -1
  43. package/theme-default/slots/ContentTabs/index.d.ts +1 -1
  44. package/theme-default/slots/ContentTabs/index.js +1 -1
  45. package/theme-default/slots/Features/index.d.ts +4 -0
  46. package/theme-default/slots/Features/index.js +28 -0
  47. package/theme-default/slots/Features/index.less +49 -0
  48. package/theme-default/slots/Header/index.js +9 -2
  49. package/theme-default/slots/Header/index.less +18 -10
  50. package/theme-default/slots/Hero/index.d.ts +4 -0
  51. package/theme-default/slots/Hero/index.js +35 -0
  52. package/theme-default/slots/Hero/index.less +65 -0
  53. package/theme-default/slots/HeroTitle/index.d.ts +6 -0
  54. package/theme-default/slots/HeroTitle/index.js +10 -0
  55. package/theme-default/slots/HeroTitle/index.less +23 -0
  56. package/theme-default/slots/SearchBar/index.js +69 -9
  57. package/theme-default/slots/SearchBar/index.less +37 -4
  58. package/theme-default/slots/SearchResult/index.d.ts +9 -0
  59. package/theme-default/slots/SearchResult/index.js +168 -0
  60. package/theme-default/slots/SearchResult/index.less +119 -0
  61. package/dist/loaders/markdown/transformer/rehypeEmbed.d.ts +0 -12
  62. package/dist/loaders/markdown/transformer/rehypeEmbed.js +0 -88
@@ -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.modifyRoutes((routes) => {
34
- metaFiles.length = 0;
35
- Object.values(routes).forEach((route) => {
36
- if (!route.isLayout && !/\*|:/.test(route.path) && !(0, import_tabs.isTabRouteFile)(route.file)) {
37
- metaFiles.push({
38
- index: metaFiles.length,
39
- file: route.file,
40
- id: route.id
41
- });
42
- }
43
- });
44
- return routes;
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 d{{{index}}}, frontmatter as fm{{{index}}}, toc as toc{{{index}}} } from '{{{file}}}?type=meta';
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 = { ...route.meta, ...filesMeta[route.id] };
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
- ...filesMeta[id],
119
+ meta: filesMeta[id],
99
120
  }));
100
121
  }
101
122
  });
@@ -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.entityDirs) || [],
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", "entityDirs"];
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, entityDirs } = api.config.resolve;
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;
@@ -134,10 +134,10 @@ var routes_default = (api) => {
134
134
  routes[route.id] = route;
135
135
  });
136
136
  });
137
- entityDirs.forEach(({ type, dir }) => {
137
+ atomDirs.forEach(({ type, dir }) => {
138
138
  const base = import_path.default.join(api.cwd, dir);
139
- const entityFiles = import_plugin_utils.glob.sync("{*,*/index,*/index.*,*/README,*/README.*}.md", { cwd: base });
140
- entityFiles.forEach((file) => {
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] = {
@@ -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 getPkgThemePath(api) {
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) => {
@@ -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, raw: string): void;
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
- function mdLoader(raw) {
32
- const opts = this.getOptions();
33
- const cb = this.async();
34
- let content = raw;
35
- const params = new URLSearchParams(this.resourceQuery);
36
- const range = params.get("range");
37
- const regexp = params.get("regexp");
38
- if (range) {
39
- content = (0, import_utils.getFileRangeLines)(content, range);
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,38 +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
- demos,
67
- frontmatter: JSON.stringify(frontmatter),
68
- toc: JSON.stringify(toc),
69
- renderAsset: function renderAsset() {
70
- if (!("asset" in this))
71
- return "null";
72
- let { asset } = this;
73
- const { sources } = this;
74
- Object.keys(this.sources).forEach((file) => {
75
- asset = import_plugin_utils.lodash.cloneDeep(asset);
76
- asset.dependencies[file].value = `{{{require('!!raw-loader!${sources[file]}?raw').default}}}`;
77
- });
78
- return JSON.stringify(asset, null, 2).replace(/"{{{|}}}"/g, "");
79
- }
80
- }));
81
- } else {
82
- const isFragment = Boolean(this.resourcePath.includes("$tab-") || this.resourceQuery);
83
- cb(null, `${Object.values(opts.builtins).map((item) => `import ${item.specifier} from '${item.source}';`).join("\n")}
84
- import React from 'react';${isFragment ? "" : `
85
- import { DumiPage } from 'dumi'`}
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';`}
86
76
 
87
77
  // export named function for fastRefresh
88
78
  // ref: https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/TROUBLESHOOTING.md#edits-always-lead-to-full-reload
89
79
  function DumiMarkdownContent() {
90
- return ${isFragment ? ret.content : `<DumiPage>${ret.content}</DumiPage>`};
80
+ const { texts: ${import_rehypeText.CONTENT_TEXTS_OBJ_NAME} } = use${isTabContent ? "TabMeta" : "RouteMeta"}();
81
+ return ${isTabContent ? ret.content : `<DumiPage>${ret.content}</DumiPage>`};
91
82
  }
92
83
 
93
- export default DumiMarkdownContent;`);
94
- }
95
- }, cb);
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
+ });
96
117
  }
97
118
  // Annotate the CommonJS export names for ESM import in node:
98
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 { DataMap } from 'vfile';
4
+ import type { Data } from 'vfile';
5
5
  declare module 'hast' {
6
6
  interface Element {
7
7
  JSXAttributes?: Array<{
@@ -25,6 +25,7 @@ declare module 'vfile' {
25
25
  id: string;
26
26
  component: string;
27
27
  })[];
28
+ texts: IRouteMeta['texts'];
28
29
  frontmatter: IRouteMeta['frontmatter'];
29
30
  toc: IRouteMeta['toc'];
30
31
  embeds?: string[];
@@ -41,10 +42,10 @@ export interface IMdTransformerOptions {
41
42
  }
42
43
  export interface IMdTransformerResult {
43
44
  content: string;
44
- meta: DataMap;
45
+ meta: Data;
45
46
  }
46
47
  declare const _default: (raw: string, opts: IMdTransformerOptions) => Promise<{
47
48
  content: string;
48
- meta: import("vfile").Data;
49
+ meta: Data;
49
50
  }>;
50
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(import_rehypeEmbed.default, {
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, opts).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.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, entityName) {
59
- const prefix = entityName || (0, import_utils.getRoutePathFromFsPath)(import_path.default.relative(cwd, fileAbsPath)).replace(/\//g, "-");
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) {
@@ -44,7 +44,12 @@ function rehypeEnhancedTag() {
44
44
  type: "element",
45
45
  tagName: "SourceCode",
46
46
  properties: { lang },
47
- children: [{ type: "text", value: toString(node.children[0]) }]
47
+ children: [
48
+ {
49
+ type: "text",
50
+ value: toString(node.children[0])
51
+ }
52
+ ]
48
53
  });
49
54
  }
50
55
  });
@@ -0,0 +1,6 @@
1
+ import type { Root } from 'hast';
2
+ import type { Transformer } from 'unified';
3
+ /**
4
+ * rehype plugin to handle img source from local
5
+ */
6
+ export default function rehypeImg(): Transformer<Root>;
@@ -0,0 +1,57 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
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));
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/loaders/markdown/transformer/rehypeImg.ts
23
+ var rehypeImg_exports = {};
24
+ __export(rehypeImg_exports, {
25
+ default: () => rehypeImg
26
+ });
27
+ module.exports = __toCommonJS(rehypeImg_exports);
28
+ var import_path = __toESM(require("path"));
29
+ var visit;
30
+ (async () => {
31
+ ({ visit } = await import("unist-util-visit"));
32
+ })();
33
+ function isRelativeUrl(url) {
34
+ return !/^((blob:)?\w+:)?\/\//.test(url) && !import_path.default.isAbsolute(url);
35
+ }
36
+ function rehypeImg() {
37
+ return (tree) => {
38
+ visit(tree, "element", (node) => {
39
+ var _a;
40
+ if (node.tagName === "img" && typeof ((_a = node.properties) == null ? void 0 : _a.src) === "string") {
41
+ const src = node.properties.src.trim();
42
+ if (isRelativeUrl(src)) {
43
+ delete node.properties.src;
44
+ node.JSXAttributes = [
45
+ {
46
+ type: "JSXAttribute",
47
+ name: "src",
48
+ value: `require('${decodeURI(src)}')`
49
+ }
50
+ ];
51
+ }
52
+ }
53
+ });
54
+ };
55
+ }
56
+ // Annotate the CommonJS export names for ESM import in node:
57
+ 0 && (module.exports = {});
@@ -59,7 +59,23 @@ function rehypeJsxify() {
59
59
  }
60
60
  });
61
61
  });
62
- const esTree = toEstree(ast);
62
+ const esTree = toEstree(ast, {
63
+ handlers: {
64
+ text: function text(node) {
65
+ var _a;
66
+ const value = String(node.value || "");
67
+ if (!value)
68
+ return null;
69
+ return {
70
+ type: "JSXExpressionContainer",
71
+ expression: ((_a = node.data) == null ? void 0 : _a.expression) || {
72
+ type: "Literal",
73
+ value
74
+ }
75
+ };
76
+ }
77
+ }
78
+ });
63
79
  visitEstree(esTree, (node) => {
64
80
  var _a, _b;
65
81
  const isStubJSXAttr = node.type === "JSXAttribute" && "name" in node && String(node.name.name).startsWith(JSX_PROP_PREFIX);
@@ -1,4 +1,4 @@
1
1
  import type { Root } from 'hast';
2
2
  import type { Transformer } from 'unified';
3
- import { type IMdTransformerOptions } from '.';
4
- export default function rehypeSlug(opts: IMdTransformerOptions): Transformer<Root>;
3
+ export declare const HEADING_TAGS: string[];
4
+ export default function rehypeSlug(): Transformer<Root>;
@@ -22,84 +22,48 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  // src/loaders/markdown/transformer/rehypeSlug.ts
23
23
  var rehypeSlug_exports = {};
24
24
  __export(rehypeSlug_exports, {
25
+ HEADING_TAGS: () => HEADING_TAGS,
25
26
  default: () => rehypeSlug
26
27
  });
27
28
  module.exports = __toCommonJS(rehypeSlug_exports);
28
- var import_utils = require("../../../utils");
29
- var import_fs = __toESM(require("fs"));
30
29
  var import_github_slugger = __toESM(require("github-slugger"));
31
- var import__ = __toESM(require("."));
32
30
  var import_rehypeDemo = require("./rehypeDemo");
33
- var import_rehypeEmbed = require("./rehypeEmbed");
34
31
  var visit;
35
32
  var toString;
36
- var sharedSluggers = /* @__PURE__ */ new Map();
37
- function getFileSlugger(fileAbsPath, parentAbsPath) {
38
- if (parentAbsPath)
39
- return sharedSluggers.get(parentAbsPath);
40
- const slugger = new import_github_slugger.default();
41
- sharedSluggers.set(fileAbsPath, slugger);
42
- return slugger;
43
- }
44
33
  (async () => {
45
34
  ({ visit } = await import("unist-util-visit"));
46
35
  ({ toString } = await import("hast-util-to-string"));
47
36
  })();
48
37
  var HEADING_TAGS = ["h1", "h2", "h3", "h4", "h5", "h6"];
49
- function rehypeSlug(opts) {
38
+ function rehypeSlug() {
50
39
  return async (tree, vFile) => {
51
- const pathWithRandom = `${opts.fileAbsPath}?${Math.random()}`;
52
- const slugger = getFileSlugger(pathWithRandom, opts.parentAbsPath);
53
- const deferrers = [];
40
+ const slugger = new import_github_slugger.default();
54
41
  vFile.data.toc = [];
55
42
  visit(tree, "element", (node) => {
56
- var _a, _b, _c;
43
+ var _a, _b;
57
44
  if (HEADING_TAGS.includes(node.tagName)) {
58
45
  const title = toString(node);
59
46
  const depth = Number(node.tagName.slice(1));
60
- deferrers.push(() => {
61
- const id = slugger.slug(title);
62
- node.properties.id = id;
63
- vFile.data.toc.push({ id, depth, title });
64
- });
65
- } else if (((_a = node.data) == null ? void 0 : _a.tagName) === import_rehypeEmbed.EMBED_TAG) {
66
- const { fileAbsPath, query } = node.data;
67
- let content = import_fs.default.readFileSync(fileAbsPath, "utf-8");
68
- if (query.get("range")) {
69
- content = (0, import_utils.getFileRangeLines)(content, query.get("range"));
70
- } else if (query.get("regexp")) {
71
- content = (0, import_utils.getFileContentByRegExp)(content, query.get("regexp"), fileAbsPath);
72
- }
73
- deferrers.push(async () => {
74
- const {
75
- meta: { toc }
76
- } = await (0, import__.default)(content, {
77
- ...opts,
78
- parentAbsPath: opts.parentAbsPath || pathWithRandom
79
- });
80
- vFile.data.toc.push(...toc);
81
- });
82
- } else if ([import_rehypeDemo.DUMI_DEMO_TAG, import_rehypeDemo.DUMI_DEMO_GRID_TAG].includes(node.tagName) && ((_b = node.data) == null ? void 0 : _b[import_rehypeDemo.DEMO_PROP_VALUE_KEY])) {
83
- const demos = [].concat((_c = node.data) == null ? void 0 : _c[import_rehypeDemo.DEMO_PROP_VALUE_KEY]);
84
- deferrers.push(() => {
85
- demos.forEach(({ demo, previewerProps }) => {
86
- var _a2, _b2;
87
- if (!demo.inline && previewerProps.title) {
88
- vFile.data.toc.push({
89
- id: slugger.slug(demo.id),
90
- depth: ((_b2 = (_a2 = vFile.data.frontmatter) == null ? void 0 : _a2.demo) == null ? void 0 : _b2.tocDepth) || 3,
91
- title: previewerProps.title
92
- });
93
- }
94
- });
47
+ const id = slugger.slug(title);
48
+ node.properties.id = id;
49
+ vFile.data.toc.push({ id, depth, title });
50
+ } else if ([import_rehypeDemo.DUMI_DEMO_TAG, import_rehypeDemo.DUMI_DEMO_GRID_TAG].includes(node.tagName) && ((_a = node.data) == null ? void 0 : _a[import_rehypeDemo.DEMO_PROP_VALUE_KEY])) {
51
+ const demos = [].concat((_b = node.data) == null ? void 0 : _b[import_rehypeDemo.DEMO_PROP_VALUE_KEY]);
52
+ demos.forEach(({ demo, previewerProps }) => {
53
+ var _a2, _b2;
54
+ if (!demo.inline && previewerProps.title) {
55
+ vFile.data.toc.push({
56
+ id: slugger.slug(demo.id),
57
+ depth: ((_b2 = (_a2 = vFile.data.frontmatter) == null ? void 0 : _a2.demo) == null ? void 0 : _b2.tocDepth) || 3,
58
+ title: previewerProps.title
59
+ });
60
+ }
95
61
  });
96
62
  }
97
63
  });
98
- for (let deferrer of deferrers) {
99
- await deferrer();
100
- }
101
- sharedSluggers.delete(pathWithRandom);
102
64
  };
103
65
  }
104
66
  // Annotate the CommonJS export names for ESM import in node:
105
- 0 && (module.exports = {});
67
+ 0 && (module.exports = {
68
+ HEADING_TAGS
69
+ });