dumi 2.0.0-alpha.0 → 2.0.0-alpha.2

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 (73) hide show
  1. package/dist/assetParsers/block.d.ts +17 -0
  2. package/dist/assetParsers/block.js +130 -0
  3. package/dist/client/theme-api/DumiDemo.d.ts +10 -0
  4. package/dist/client/theme-api/DumiDemo.js +16 -0
  5. package/dist/client/theme-api/DumiDemoGrid.d.ts +6 -0
  6. package/dist/client/theme-api/DumiDemoGrid.js +64 -0
  7. package/dist/client/theme-api/context.d.ts +10 -0
  8. package/dist/client/{theme → theme-api}/context.js +2 -1
  9. package/dist/client/theme-api/index.d.ts +6 -0
  10. package/dist/client/theme-api/index.js +6 -0
  11. package/dist/client/theme-api/types.d.ts +47 -0
  12. package/dist/client/theme-api/types.js +1 -0
  13. package/dist/client/theme-api/useMatchedRouteMeta.d.ts +5 -0
  14. package/dist/client/theme-api/useMatchedRouteMeta.js +55 -0
  15. package/dist/client/tsconfig.json +12 -0
  16. package/dist/features/compile.js +21 -3
  17. package/dist/features/configPlugins/index.js +2 -1
  18. package/dist/features/configPlugins/schema.js +8 -2
  19. package/dist/features/locales.d.ts +3 -0
  20. package/dist/features/locales.js +97 -0
  21. package/dist/features/meta.d.ts +3 -0
  22. package/dist/features/meta.js +77 -0
  23. package/dist/features/routes.js +27 -4
  24. package/dist/features/sideEffects/docSideEffectsWebpackPlugin.d.ts +14 -0
  25. package/dist/features/sideEffects/docSideEffectsWebpackPlugin.js +50 -0
  26. package/dist/features/sideEffects/index.d.ts +7 -0
  27. package/dist/features/sideEffects/index.js +47 -0
  28. package/dist/features/theme/index.js +13 -31
  29. package/dist/features/theme/loader.js +3 -3
  30. package/dist/index.d.ts +8 -2
  31. package/dist/index.js +16 -3
  32. package/dist/loaders/markdown/index.d.ts +1 -1
  33. package/dist/loaders/markdown/index.js +33 -7
  34. package/dist/loaders/markdown/transformer/index.d.ts +20 -13
  35. package/dist/loaders/markdown/transformer/index.js +29 -3
  36. package/dist/loaders/markdown/transformer/rehypeDemo.d.ts +1 -1
  37. package/dist/loaders/markdown/transformer/rehypeDemo.js +160 -29
  38. package/dist/loaders/markdown/transformer/rehypeEmbed.d.ts +4 -0
  39. package/dist/loaders/markdown/transformer/rehypeEmbed.js +75 -0
  40. package/dist/loaders/markdown/transformer/rehypeIsolation.js +1 -1
  41. package/dist/loaders/markdown/transformer/rehypeJsxify.js +1 -0
  42. package/dist/loaders/markdown/transformer/rehypeRaw.js +9 -1
  43. package/dist/loaders/markdown/transformer/remarkMeta.d.ts +3 -0
  44. package/dist/loaders/markdown/transformer/remarkMeta.js +44 -0
  45. package/dist/preset.js +4 -1
  46. package/dist/types.d.ts +17 -4
  47. package/dist/utils.d.ts +11 -0
  48. package/dist/utils.js +25 -1
  49. package/package.json +31 -13
  50. package/theme-default/builtins/Previewer.d.ts +4 -0
  51. package/theme-default/builtins/Previewer.js +11 -0
  52. package/theme-default/layouts/DocLayout/index.d.ts +3 -0
  53. package/theme-default/layouts/DocLayout/index.js +16 -0
  54. package/theme-default/locales/en-US.json +3 -0
  55. package/theme-default/locales/zh-CN.json +3 -0
  56. package/theme-default/slots/Content/index.d.ts +5 -0
  57. package/theme-default/slots/Content/index.js +13 -0
  58. package/theme-default/slots/Header/index.d.ts +3 -0
  59. package/theme-default/slots/Header/index.js +17 -0
  60. package/theme-default/slots/Logo/index.d.ts +3 -0
  61. package/theme-default/slots/Logo/index.js +7 -0
  62. package/theme-default/slots/Navbar/index.d.ts +3 -0
  63. package/theme-default/slots/Navbar/index.js +7 -0
  64. package/theme-default/slots/SearchBar/index.d.ts +3 -0
  65. package/theme-default/slots/SearchBar/index.js +9 -0
  66. package/theme-default/slots/Sidebar/index.d.ts +3 -0
  67. package/theme-default/slots/Sidebar/index.js +14 -0
  68. package/theme.d.ts +1 -0
  69. package/dist/client/theme/DumiDemo.d.ts +0 -4
  70. package/dist/client/theme/DumiDemo.js +0 -9
  71. package/dist/client/theme/context.d.ts +0 -5
  72. package/dist/client/theme/index.d.ts +0 -2
  73. package/dist/client/theme/index.js +0 -2
@@ -0,0 +1,77 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/features/meta.ts
20
+ var meta_exports = {};
21
+ __export(meta_exports, {
22
+ default: () => meta_default
23
+ });
24
+ module.exports = __toCommonJS(meta_exports);
25
+ var import_plugin_utils = require("umi/plugin-utils");
26
+ var meta_default = (api) => {
27
+ const mdRouteFiles = [];
28
+ api.modifyRoutes((routes) => {
29
+ Object.values(routes).forEach((route) => {
30
+ if (route.file.endsWith(".md")) {
31
+ mdRouteFiles.push({
32
+ index: mdRouteFiles.length,
33
+ file: route.file,
34
+ id: route.id
35
+ });
36
+ }
37
+ });
38
+ return routes;
39
+ });
40
+ api.onGenerateFiles(() => {
41
+ api.writeTmpFile({
42
+ noPluginDir: true,
43
+ path: "dumi/meta/index.ts",
44
+ content: import_plugin_utils.Mustache.render(`{{#mdRouteFiles}}
45
+ import { demos as d{{{index}}}, frontmatter as fm{{{index}}} } from '{{{file}}}?type=meta';
46
+ {{/mdRouteFiles}}
47
+
48
+ export const demos = {
49
+ {{#mdRouteFiles}}
50
+ ...d{{{index}}},
51
+ {{/mdRouteFiles}}
52
+ };
53
+
54
+ export const routesMeta = {
55
+ {{#mdRouteFiles}}
56
+ '{{{id}}}': fm{{{index}}},
57
+ {{/mdRouteFiles}}
58
+ }`, { mdRouteFiles })
59
+ });
60
+ api.writeTmpFile({
61
+ noPluginDir: true,
62
+ path: "dumi/meta/runtime.ts",
63
+ content: `import { routesMeta } from '.';
64
+ export const patchRoutes = ({ routes }) => {
65
+ Object.values(routes).forEach((route) => {
66
+ if (routesMeta[route.id]) {
67
+ route.meta = { ...route.meta, ...routesMeta[route.id] };
68
+ }
69
+ });
70
+ }
71
+ `
72
+ });
73
+ });
74
+ api.addRuntimePlugin(() => "@@/dumi/meta/runtime.ts");
75
+ };
76
+ // Annotate the CommonJS export names for ESM import in node:
77
+ 0 && (module.exports = {});
@@ -26,10 +26,20 @@ __export(routes_exports, {
26
26
  });
27
27
  module.exports = __toCommonJS(routes_exports);
28
28
  var import_core = require("@umijs/core");
29
+ var import_utils = require("@umijs/core/dist/route/utils");
29
30
  var import_path = __toESM(require("path"));
30
31
  var import_pluralize = require("pluralize");
31
32
  var import_plugin_utils = require("umi/plugin-utils");
32
33
  var CTX_LAYOUT_ID = "dumi-context-layout";
34
+ function localizeUmiRoute(route, locales) {
35
+ const locale = locales.find((locale2) => route.path.endsWith(`/${locale2.id}`) && import_path.default.parse(route.file).name.endsWith(`.${locale2.id}`));
36
+ if (locale) {
37
+ const base = !("base" in locale) || locale.base === "/" ? "" : locale.base.replace(/^(\/)(.+)$/, "$2$1");
38
+ const suffix = "suffix" in locale ? locale.suffix : "";
39
+ route.path = `${base}${route.path.replace(new RegExp(`/${locale.id}$`), "").replace(/(\/index|\/README)$/, "")}${suffix}`;
40
+ route.absPath = route.path !== "/" ? `/${route.path}` : route.path;
41
+ }
42
+ }
33
43
  var routes_default = (api) => {
34
44
  api.describe({ key: "dumi:routes" });
35
45
  api.modifyConfig((memo) => {
@@ -38,6 +48,17 @@ var routes_default = (api) => {
38
48
  };
39
49
  return memo;
40
50
  });
51
+ api.modifyDefaultConfig((memo) => {
52
+ if (api.userConfig.resolve) {
53
+ const keys = ["docDirs", "entityDirs"];
54
+ keys.forEach((key) => {
55
+ var _a;
56
+ if (((_a = api.userConfig.resolve[key]) == null ? void 0 : _a.length) === 0)
57
+ memo.resolve[key] = [];
58
+ });
59
+ }
60
+ return memo;
61
+ });
41
62
  api.modifyRoutes((oRoutes) => {
42
63
  const routes = Object.values(oRoutes).reduce((ret, route) => {
43
64
  if (route.isLayout) {
@@ -71,22 +92,24 @@ var routes_default = (api) => {
71
92
  route.id = `${dir}/${key}`;
72
93
  route.parentId = docLayoutId;
73
94
  route.file = import_path.default.resolve(base, route.file);
95
+ localizeUmiRoute(route, api.config.locales);
74
96
  routes[route.id] = route;
75
97
  });
76
98
  });
77
99
  entityDirs.forEach(({ type, dir }) => {
78
100
  const base = import_path.default.join(api.cwd, dir);
79
- const entityFiles = import_plugin_utils.glob.sync("{*,*/index,*/README}.md", { cwd: base });
101
+ const entityFiles = import_plugin_utils.glob.sync("{*,*/index,*/index.*,*/README,*/README.*}.md", { cwd: base });
80
102
  entityFiles.forEach((file) => {
81
- const routePath = (0, import_plugin_utils.winPath)(import_path.default.join((0, import_pluralize.plural)(type), file)).replace(/(\/index|\/README)?\.md$/, "");
82
- const routeId = `${dir}/${routePath}`;
103
+ const routePath = (0, import_plugin_utils.winPath)(import_path.default.join((0, import_pluralize.plural)(type), file)).replace(/(\/index|\/README)?\.md$/, "").replace(/\./g, "/");
104
+ const routeId = (0, import_utils.createRouteId)(file);
83
105
  routes[routeId] = {
84
106
  id: routeId,
85
107
  path: routePath,
86
- absPath: routePath,
108
+ absPath: `/${routePath}`,
87
109
  parentId: docLayoutId,
88
110
  file: import_path.default.resolve(base, file)
89
111
  };
112
+ localizeUmiRoute(routes[routeId], api.config.locales);
90
113
  });
91
114
  });
92
115
  return routes;
@@ -0,0 +1,14 @@
1
+ import type { webpack } from 'umi';
2
+ interface IOpts {
3
+ sideEffects: string[];
4
+ pkgPath: string;
5
+ }
6
+ /**
7
+ * webpack plugin for add extra sideEffects item if user configured sideEffects in package.json
8
+ */
9
+ export default class docSideEffectsWebpackPlugin {
10
+ opts: IOpts;
11
+ constructor(opts: IOpts);
12
+ apply(compiler: webpack.Compiler): void;
13
+ }
14
+ export {};
@@ -0,0 +1,50 @@
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/features/sideEffects/docSideEffectsWebpackPlugin.ts
23
+ var docSideEffectsWebpackPlugin_exports = {};
24
+ __export(docSideEffectsWebpackPlugin_exports, {
25
+ default: () => docSideEffectsWebpackPlugin
26
+ });
27
+ module.exports = __toCommonJS(docSideEffectsWebpackPlugin_exports);
28
+ var import_path = __toESM(require("path"));
29
+ var docSideEffectsWebpackPlugin = class {
30
+ constructor(opts) {
31
+ this.opts = opts;
32
+ }
33
+ apply(compiler) {
34
+ compiler.hooks.normalModuleFactory.tap(this.constructor.name, (normalModuleFactory) => {
35
+ normalModuleFactory.hooks.afterResolve.tap(this.constructor.name, (data) => {
36
+ var _a;
37
+ const createData = data.createData || data;
38
+ const resourceResolveData = createData.resourceResolveData;
39
+ const sideEffectsFlag = (_a = resourceResolveData == null ? void 0 : resourceResolveData.descriptionFileData) == null ? void 0 : _a.sideEffects;
40
+ if (resourceResolveData && (sideEffectsFlag === false || Array.isArray(sideEffectsFlag)) && import_path.default.normalize(resourceResolveData.descriptionFilePath) === this.opts.pkgPath) {
41
+ const list = new Set(sideEffectsFlag || []);
42
+ this.opts.sideEffects.forEach((item) => list.add(item));
43
+ resourceResolveData.descriptionFileData.sideEffects = Array.from(list);
44
+ }
45
+ });
46
+ });
47
+ }
48
+ };
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {});
@@ -0,0 +1,7 @@
1
+ import type { IApi } from 'umi';
2
+ /**
3
+ * plugin for register the doc side-effects webpack plugin
4
+ * to avoid tree-shaking for .umi & .dumi/theme directory if package.json has sideEffects: false
5
+ */
6
+ declare const _default: (api: IApi) => void;
7
+ export default _default;
@@ -0,0 +1,47 @@
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/features/sideEffects/index.ts
23
+ var sideEffects_exports = {};
24
+ __export(sideEffects_exports, {
25
+ default: () => sideEffects_default
26
+ });
27
+ module.exports = __toCommonJS(sideEffects_exports);
28
+ var import_path = __toESM(require("path"));
29
+ var import_plugin_utils = require("umi/plugin-utils");
30
+ var import_docSideEffectsWebpackPlugin = __toESM(require("./docSideEffectsWebpackPlugin"));
31
+ var sideEffects_default = (api) => {
32
+ api.describe({ key: "dumi:sideEffects" });
33
+ api.chainWebpack((memo) => {
34
+ memo.plugin("docSideEffects").use(import_docSideEffectsWebpackPlugin.default, [
35
+ {
36
+ sideEffects: [
37
+ (0, import_plugin_utils.winPath)(import_path.default.relative(api.cwd, import_path.default.join(api.paths.absTmpPath, "**"))),
38
+ ".dumi/theme/**"
39
+ ],
40
+ pkgPath: import_path.default.join(api.cwd, "package.json")
41
+ }
42
+ ]);
43
+ return memo;
44
+ });
45
+ };
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {});
@@ -37,14 +37,14 @@ function getPkgThemePath(api) {
37
37
  return pkgThemeName && import_path.default.basename(require.resolve(`${pkgThemeName}/package.json`, { paths: [api.cwd] }));
38
38
  }
39
39
  var theme_default = (api) => {
40
- let localThemeData;
41
- let originalThemeData;
42
- const mdRouteFiles = [];
40
+ const localThemePath = import_path.default.join(api.cwd, import_constants.LOCAL_THEME_DIR);
41
+ const localThemeData = import_fs.default.existsSync(localThemePath) && (0, import_loader.default)(localThemePath);
43
42
  const themeMapKeys = [
44
43
  "layouts",
45
44
  "builtins",
46
45
  "slots"
47
46
  ];
47
+ let originalThemeData;
48
48
  api.describe({ key: "dumi:theme" });
49
49
  api.register({
50
50
  key: "modifyAppData",
@@ -58,9 +58,7 @@ var theme_default = (api) => {
58
58
  initialValue: pkgThemeData
59
59
  });
60
60
  api.service.themeData = originalThemeData;
61
- const localThemePath = import_path.default.join(api.cwd, import_constants.LOCAL_THEME_DIR);
62
- if (import_fs.default.existsSync(localThemePath)) {
63
- localThemeData = (0, import_loader.default)(localThemePath);
61
+ if (localThemeData) {
64
62
  api.service.themeData = (0, import_plugin_utils.deepmerge)(originalThemeData, localThemeData, {
65
63
  clone: true
66
64
  });
@@ -69,13 +67,17 @@ var theme_default = (api) => {
69
67
  DumiDemo: {
70
68
  specifier: "{ DumiDemo }",
71
69
  source: "dumi/theme"
70
+ },
71
+ DumiDemoGrid: {
72
+ specifier: "{ DumiDemoGrid }",
73
+ source: "dumi/theme"
72
74
  }
73
75
  });
74
76
  return memo;
75
77
  }
76
78
  });
77
79
  api.modifyConfig((memo) => {
78
- memo.alias["dumi/theme$"] = require.resolve("../../client/theme");
80
+ memo.alias["dumi/theme$"] = require.resolve("../../client/theme-api");
79
81
  if (localThemeData) {
80
82
  themeMapKeys.forEach((key) => {
81
83
  Object.values(localThemeData[key] || {}).forEach((item) => {
@@ -87,17 +89,9 @@ var theme_default = (api) => {
87
89
  memo.alias["dumi/theme-original"] = import_path.default.join(api.paths.absTmpPath, "dumi/theme");
88
90
  memo.alias["dumi/theme-default"] = DEFAULT_THEME_PATH;
89
91
  memo.extraBabelIncludes ?? (memo.extraBabelIncludes = []);
90
- memo.extraBabelIncludes.push(import_path.default.resolve(__dirname, "../../client/theme"));
92
+ memo.extraBabelIncludes.push(import_path.default.resolve(__dirname, "../../client/theme-api"));
91
93
  return memo;
92
94
  });
93
- api.modifyRoutes((routes) => {
94
- Object.values(routes).forEach((route) => {
95
- if (route.file.endsWith(".md")) {
96
- mdRouteFiles.push({ index: mdRouteFiles.length, file: route.file });
97
- }
98
- });
99
- return routes;
100
- });
101
95
  api.onGenerateFiles(() => {
102
96
  themeMapKeys.forEach((key) => {
103
97
  Object.values(originalThemeData[key] || {}).forEach((item) => {
@@ -109,31 +103,19 @@ export { default } from '${item.source}';`
109
103
  });
110
104
  });
111
105
  });
112
- api.writeTmpFile({
113
- noPluginDir: true,
114
- path: "dumi/demos.ts",
115
- content: import_plugin_utils.Mustache.render(`{{#mdRouteFiles}}
116
- import demos{{{index}}} from '{{{file}}}?type=meta.demos';
117
- {{/mdRouteFiles}}
118
-
119
- export default {
120
- {{#mdRouteFiles}}
121
- ...demos{{{index}}},
122
- {{/mdRouteFiles}}
123
- }`, { mdRouteFiles })
124
- });
125
106
  api.writeTmpFile({
126
107
  noPluginDir: true,
127
108
  path: "dumi/theme/ContextWrapper.tsx",
128
109
  content: `import { Context } from 'dumi/theme';
129
110
  import { useOutlet } from 'umi';
130
- import demos from '../demos';
111
+ import { demos } from '../meta';
112
+ import { locales } from '../locales/config';
131
113
 
132
114
  export default function DumiContextWrapper() {
133
115
  const outlet = useOutlet();
134
116
 
135
117
  return (
136
- <Context.Provider value={{ demos }}>{outlet}</Context.Provider>
118
+ <Context.Provider value={{ demos, locales }}>{outlet}</Context.Provider>
137
119
  );
138
120
  }`
139
121
  });
@@ -39,7 +39,7 @@ function getComponentMapFromDir(globExp, dir) {
39
39
  }
40
40
  function getLocaleMapFromDir(globExp, dir) {
41
41
  return import_plugin_utils.glob.sync(globExp, { cwd: dir }).reduce((ret, file) => {
42
- const locale = file.replace(/\.json$/, "");
42
+ const locale = import_path.default.basename(file.replace(/\.json$/, ""));
43
43
  ret[locale] = require(import_path.default.join(dir, file));
44
44
  return ret;
45
45
  }, {});
@@ -49,8 +49,8 @@ var loader_default = (dir) => {
49
49
  name: import_path.default.basename(dir),
50
50
  path: dir,
51
51
  locales: getLocaleMapFromDir("locales/*.json", dir),
52
- builtins: getComponentMapFromDir("builtins/{*,*/index}.{js,jsx,ts,tsx}", dir),
53
- slots: getComponentMapFromDir("slots/{*,*/index}.{js,jsx,ts,tsx}", dir),
52
+ builtins: getComponentMapFromDir("builtins/{!(*.d),*/index}.{js,jsx,ts,tsx}", dir),
53
+ slots: getComponentMapFromDir("slots/{!(*.d),*/index}.{js,jsx,ts,tsx}", dir),
54
54
  layouts: getComponentMapFromDir("layouts/{GlobalLayout,DocLayout,DemoLayout}{.,/index.}{js,jsx,ts,tsx}", dir)
55
55
  };
56
56
  };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,8 @@
1
- declare const _default: "Hello dumi 2.0!";
2
- export default _default;
1
+ import type { IDumiConfig } from "./types";
2
+ declare let unistUtilVisit: typeof import('unist-util-visit');
3
+ export { IApi } from "./types";
4
+ export type { Root as HastRoot } from 'hast';
5
+ export * from 'umi';
6
+ export type { Plugin as UnifiedPlugin, Transformer as UnifiedTransformer, } from 'unified';
7
+ export { unistUtilVisit };
8
+ export declare const defineConfig: (config: IDumiConfig) => IDumiConfig;
package/dist/index.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,14 +16,25 @@ var __copyProps = (to, from, except, desc) => {
14
16
  }
15
17
  return to;
16
18
  };
19
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
+ 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
21
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
22
 
19
23
  // src/index.ts
20
24
  var src_exports = {};
21
25
  __export(src_exports, {
22
- default: () => src_default
26
+ defineConfig: () => defineConfig,
27
+ unistUtilVisit: () => unistUtilVisit
23
28
  });
24
29
  module.exports = __toCommonJS(src_exports);
25
- var src_default = "Hello dumi 2.0!";
30
+ __reExport(src_exports, require("umi"), module.exports);
31
+ var unistUtilVisit;
32
+ (async () => {
33
+ unistUtilVisit = await import("unist-util-visit");
34
+ })();
35
+ var defineConfig = (config) => config;
26
36
  // Annotate the CommonJS export names for ESM import in node:
27
- 0 && (module.exports = {});
37
+ 0 && (module.exports = {
38
+ defineConfig,
39
+ unistUtilVisit
40
+ });
@@ -5,7 +5,7 @@ interface IMdLoaderDefaultModeOptions extends Omit<IMdTransformerOptions, 'fileA
5
5
  builtins: IThemeLoadResult['builtins'];
6
6
  }
7
7
  interface IMdLoaderDemosModeOptions extends Omit<IMdLoaderDefaultModeOptions, 'builtins' | 'mode'> {
8
- mode: 'demos';
8
+ mode: 'meta';
9
9
  }
10
10
  export declare type IMdLoaderOptions = IMdLoaderDefaultModeOptions | IMdLoaderDemosModeOptions;
11
11
  export default function mdLoader(this: any, raw: string): void;
@@ -25,26 +25,52 @@ __export(markdown_exports, {
25
25
  default: () => mdLoader
26
26
  });
27
27
  module.exports = __toCommonJS(markdown_exports);
28
+ var import_utils = require("../../utils");
28
29
  var import_plugin_utils = require("umi/plugin-utils");
29
30
  var import_transformer = __toESM(require("./transformer"));
30
31
  function mdLoader(raw) {
31
32
  const opts = this.getOptions();
32
33
  const cb = this.async();
33
- (0, import_transformer.default)(raw, {
34
- techStacks: opts.techStacks,
35
- cwd: opts.cwd,
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"]),
36
45
  fileAbsPath: this.resourcePath
37
46
  }).then((ret) => {
38
- if (opts.mode === "demos") {
47
+ if (opts.mode === "meta") {
48
+ const { demos, frontmatter = {} } = ret.meta;
39
49
  cb(null, import_plugin_utils.Mustache.render(`import React from 'react';
40
50
 
41
- export default {
51
+ export const demos = {
42
52
  {{#demos}}
43
- '{{{id}}}': {{{component}}},
53
+ '{{{id}}}': {
54
+ component: {{{component}}},
55
+ asset: {{{renderAsset}}}
56
+ },
44
57
  {{/demos}}
45
- }`, { demos: ret.meta.demos }));
58
+ };
59
+
60
+ export const frontmatter = {{{frontmatter}}};
61
+ `, {
62
+ demos,
63
+ frontmatter: JSON.stringify(frontmatter),
64
+ renderAsset: function renderAsset() {
65
+ Object.keys(this.sources).forEach((file) => {
66
+ this.asset.dependencies[file].value = `{{{require('!!raw-loader!${this.sources[file]}?raw').default}}}`;
67
+ });
68
+ return JSON.stringify(this.asset, null, 2).replace(/"{{{|}}}"/g, "");
69
+ }
70
+ }));
46
71
  } else {
47
72
  cb(null, `${Object.values(opts.builtins).map((item) => `import ${item.specifier} from '${item.source}';`).join("\n")}
73
+ import React from 'react';
48
74
 
49
75
  // export named function for fastRefresh
50
76
  // ref: https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/TROUBLESHOOTING.md#edits-always-lead-to-full-reload
@@ -1,4 +1,7 @@
1
- import type { IDumiTechStack } from "../../../types";
1
+ import type { IParsedBlockAsset } from "../../../assetParsers/block";
2
+ import type { IRouteMeta } from "../../../client/theme-api";
3
+ import type { IDumiConfig, IDumiTechStack } from "../../../types";
4
+ import type { DataMap } from 'vfile';
2
5
  declare module 'hast' {
3
6
  interface Element {
4
7
  JSXAttributes?: Array<{
@@ -11,27 +14,31 @@ declare module 'hast' {
11
14
  }>;
12
15
  }
13
16
  }
17
+ declare module 'vfile' {
18
+ interface DataMap {
19
+ demos: {
20
+ id: string;
21
+ component: string;
22
+ asset: IParsedBlockAsset['asset'];
23
+ sources: IParsedBlockAsset['sources'];
24
+ }[];
25
+ frontmatter: IRouteMeta;
26
+ }
27
+ }
14
28
  export interface IMdTransformerOptions {
15
29
  cwd: string;
16
30
  fileAbsPath: string;
17
31
  techStacks: IDumiTechStack[];
32
+ codeBlockMode: IDumiConfig['resolve']['codeBlockMode'];
33
+ extraRemarkPlugins?: IDumiConfig['extraRemarkPlugins'];
34
+ extraRehypePlugins?: IDumiConfig['extraRehypePlugins'];
18
35
  }
19
36
  export interface IMdTransformerResult {
20
37
  content: string;
21
- meta: {
22
- demos: {
23
- id: string;
24
- component: string;
25
- }[];
26
- };
38
+ meta: DataMap;
27
39
  }
28
40
  declare const _default: (raw: string, opts: IMdTransformerOptions) => Promise<{
29
41
  content: string;
30
- meta: {
31
- demos: {
32
- id: string;
33
- component: string;
34
- }[];
35
- };
42
+ meta: import("vfile").Data;
36
43
  }>;
37
44
  export default _default;
@@ -26,20 +26,46 @@ __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"));
29
30
  var import_rehypeIsolation = __toESM(require("./rehypeIsolation"));
30
31
  var import_rehypeJsxify = __toESM(require("./rehypeJsxify"));
31
32
  var import_rehypeRaw = __toESM(require("./rehypeRaw"));
32
33
  var import_rehypeStrip = __toESM(require("./rehypeStrip"));
34
+ var import_remarkMeta = __toESM(require("./remarkMeta"));
35
+ function applyUnifiedPlugin(opts) {
36
+ const [plugin, options] = Array.isArray(opts.plugin) ? opts.plugin : [opts.plugin];
37
+ const mod = typeof plugin === "function" ? plugin : require(require.resolve(plugin, { paths: [opts.cwd] }));
38
+ const fn = mod.default || mod;
39
+ opts.processor.use(fn, options);
40
+ }
33
41
  var transformer_default = async (raw, opts) => {
42
+ var _a, _b;
34
43
  const { unified } = await import("unified");
35
44
  const { default: remarkParse } = await import("remark-parse");
45
+ const { default: remarkFrontmatter } = await import("remark-frontmatter");
46
+ const { default: remarkBreaks } = await import("remark-breaks");
36
47
  const { default: remarkGfm } = await import("remark-gfm");
37
48
  const { default: remarkRehype } = await import("remark-rehype");
38
- const result = await unified().use(remarkParse).use(remarkGfm).use(remarkRehype, { allowDangerousHtml: true }).use(import_rehypeRaw.default).use(import_rehypeStrip.default).use(import_rehypeDemo.default, {
49
+ const processor = unified().use(remarkParse).use(remarkFrontmatter).use(import_remarkMeta.default).use(remarkBreaks).use(remarkGfm);
50
+ (_a = opts.extraRemarkPlugins) == null ? void 0 : _a.forEach((plugin) => applyUnifiedPlugin({
51
+ plugin,
52
+ processor,
53
+ cwd: opts.cwd
54
+ }));
55
+ processor.use(remarkRehype, { allowDangerousHtml: true }).use(import_rehypeRaw.default).use(import_rehypeStrip.default).use(import_rehypeEmbed.default, {
56
+ fileAbsPath: opts.fileAbsPath
57
+ }).use(import_rehypeDemo.default, {
39
58
  techStacks: opts.techStacks,
40
59
  cwd: opts.cwd,
41
- fileAbsPath: opts.fileAbsPath
42
- }).use(import_rehypeIsolation.default).use(import_rehypeJsxify.default).process(raw);
60
+ fileAbsPath: opts.fileAbsPath,
61
+ codeBlockMode: opts.codeBlockMode
62
+ }).use(import_rehypeIsolation.default);
63
+ (_b = opts.extraRehypePlugins) == null ? void 0 : _b.forEach((plugin) => applyUnifiedPlugin({
64
+ plugin,
65
+ processor,
66
+ cwd: opts.cwd
67
+ }));
68
+ const result = await processor.use(import_rehypeJsxify.default).process(raw);
43
69
  return {
44
70
  content: String(result.value),
45
71
  meta: result.data
@@ -1,6 +1,6 @@
1
1
  import type { Root } from 'hast';
2
2
  import type { Transformer } from 'unified';
3
3
  import type { IMdTransformerOptions } from '.';
4
- declare type IRehypeDemoOptions = Pick<IMdTransformerOptions, 'techStacks' | 'cwd' | 'fileAbsPath'>;
4
+ declare type IRehypeDemoOptions = Pick<IMdTransformerOptions, 'techStacks' | 'cwd' | 'fileAbsPath' | 'codeBlockMode'>;
5
5
  export default function rehypeDemo(opts: IRehypeDemoOptions): Transformer<Root>;
6
6
  export {};