vigor-moon 1.1.4 → 1.1.6
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/{chunk-SRULMBNH.mjs → chunk-J3CR5P37.mjs} +6 -194
- package/dist/chunk-J3CR5P37.mjs.map +1 -0
- package/dist/{chunk-VWAM4ETQ.js → chunk-U5FDKMMF.js} +7 -195
- package/dist/chunk-U5FDKMMF.js.map +1 -0
- package/dist/cli.js +22 -18
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +15 -11
- package/dist/cli.mjs.map +1 -1
- package/dist/dev.js +2 -2
- package/dist/dev.mjs +1 -1
- package/package.json +14 -10
- package/src/theme-default/Layout/doc/index.module.scss +7 -3
- package/src/theme-default/component/nav/index.tsx +2 -1
- package/src/types/types.d.ts +4 -3
- package/dist/chunk-SRULMBNH.mjs.map +0 -1
- package/dist/chunk-VWAM4ETQ.js.map +0 -1
|
@@ -128,198 +128,8 @@ import rehypePluginSlug from "rehype-slug";
|
|
|
128
128
|
import remarkPluginFrontmatter from "remark-frontmatter";
|
|
129
129
|
import remarkPluginMDXFrontmatter from "remark-mdx-frontmatter";
|
|
130
130
|
|
|
131
|
-
// node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/lib/index.js
|
|
132
|
-
var convert = (
|
|
133
|
-
/**
|
|
134
|
-
* @type {(
|
|
135
|
-
* (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &
|
|
136
|
-
* ((test?: Test) => AssertAnything)
|
|
137
|
-
* )}
|
|
138
|
-
*/
|
|
139
|
-
/**
|
|
140
|
-
* @param {Test} [test]
|
|
141
|
-
* @returns {AssertAnything}
|
|
142
|
-
*/
|
|
143
|
-
function(test) {
|
|
144
|
-
if (test === void 0 || test === null) {
|
|
145
|
-
return ok;
|
|
146
|
-
}
|
|
147
|
-
if (typeof test === "string") {
|
|
148
|
-
return typeFactory(test);
|
|
149
|
-
}
|
|
150
|
-
if (typeof test === "object") {
|
|
151
|
-
return Array.isArray(test) ? anyFactory(test) : propsFactory(test);
|
|
152
|
-
}
|
|
153
|
-
if (typeof test === "function") {
|
|
154
|
-
return castFactory(test);
|
|
155
|
-
}
|
|
156
|
-
throw new Error("Expected function, string, or object as test");
|
|
157
|
-
}
|
|
158
|
-
);
|
|
159
|
-
function anyFactory(tests) {
|
|
160
|
-
const checks = [];
|
|
161
|
-
let index = -1;
|
|
162
|
-
while (++index < tests.length) {
|
|
163
|
-
checks[index] = convert(tests[index]);
|
|
164
|
-
}
|
|
165
|
-
return castFactory(any);
|
|
166
|
-
function any(...parameters) {
|
|
167
|
-
let index2 = -1;
|
|
168
|
-
while (++index2 < checks.length) {
|
|
169
|
-
if (checks[index2].call(this, ...parameters))
|
|
170
|
-
return true;
|
|
171
|
-
}
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
function propsFactory(check) {
|
|
176
|
-
return castFactory(all);
|
|
177
|
-
function all(node) {
|
|
178
|
-
let key;
|
|
179
|
-
for (key in check) {
|
|
180
|
-
if (node[key] !== check[key])
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
function typeFactory(check) {
|
|
187
|
-
return castFactory(type);
|
|
188
|
-
function type(node) {
|
|
189
|
-
return node && node.type === check;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
function castFactory(check) {
|
|
193
|
-
return assertion;
|
|
194
|
-
function assertion(node, ...parameters) {
|
|
195
|
-
return Boolean(
|
|
196
|
-
node && typeof node === "object" && "type" in node && // @ts-expect-error: fine.
|
|
197
|
-
Boolean(check.call(this, node, ...parameters))
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
function ok() {
|
|
202
|
-
return true;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/color.js
|
|
206
|
-
function color(d) {
|
|
207
|
-
return "\x1B[33m" + d + "\x1B[39m";
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/index.js
|
|
211
|
-
var CONTINUE = true;
|
|
212
|
-
var EXIT = false;
|
|
213
|
-
var SKIP = "skip";
|
|
214
|
-
var visitParents = (
|
|
215
|
-
/**
|
|
216
|
-
* @type {(
|
|
217
|
-
* (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &
|
|
218
|
-
* (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)
|
|
219
|
-
* )}
|
|
220
|
-
*/
|
|
221
|
-
/**
|
|
222
|
-
* @param {Node} tree
|
|
223
|
-
* @param {Test} test
|
|
224
|
-
* @param {Visitor<Node>} visitor
|
|
225
|
-
* @param {boolean | null | undefined} [reverse]
|
|
226
|
-
* @returns {void}
|
|
227
|
-
*/
|
|
228
|
-
function(tree, test, visitor, reverse) {
|
|
229
|
-
if (typeof test === "function" && typeof visitor !== "function") {
|
|
230
|
-
reverse = visitor;
|
|
231
|
-
visitor = test;
|
|
232
|
-
test = null;
|
|
233
|
-
}
|
|
234
|
-
const is2 = convert(test);
|
|
235
|
-
const step = reverse ? -1 : 1;
|
|
236
|
-
factory(tree, void 0, [])();
|
|
237
|
-
function factory(node, index, parents) {
|
|
238
|
-
const value = node && typeof node === "object" ? node : {};
|
|
239
|
-
if (typeof value.type === "string") {
|
|
240
|
-
const name = (
|
|
241
|
-
// `hast`
|
|
242
|
-
typeof value.tagName === "string" ? value.tagName : (
|
|
243
|
-
// `xast`
|
|
244
|
-
typeof value.name === "string" ? value.name : void 0
|
|
245
|
-
)
|
|
246
|
-
);
|
|
247
|
-
Object.defineProperty(visit2, "name", {
|
|
248
|
-
value: "node (" + color(node.type + (name ? "<" + name + ">" : "")) + ")"
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
return visit2;
|
|
252
|
-
function visit2() {
|
|
253
|
-
let result = [];
|
|
254
|
-
let subresult;
|
|
255
|
-
let offset;
|
|
256
|
-
let grandparents;
|
|
257
|
-
if (!test || is2(node, index, parents[parents.length - 1] || null)) {
|
|
258
|
-
result = toResult(visitor(node, parents));
|
|
259
|
-
if (result[0] === EXIT) {
|
|
260
|
-
return result;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
if (node.children && result[0] !== SKIP) {
|
|
264
|
-
offset = (reverse ? node.children.length : -1) + step;
|
|
265
|
-
grandparents = parents.concat(node);
|
|
266
|
-
while (offset > -1 && offset < node.children.length) {
|
|
267
|
-
subresult = factory(node.children[offset], offset, grandparents)();
|
|
268
|
-
if (subresult[0] === EXIT) {
|
|
269
|
-
return subresult;
|
|
270
|
-
}
|
|
271
|
-
offset = typeof subresult[1] === "number" ? subresult[1] : offset + step;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return result;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
);
|
|
279
|
-
function toResult(value) {
|
|
280
|
-
if (Array.isArray(value)) {
|
|
281
|
-
return value;
|
|
282
|
-
}
|
|
283
|
-
if (typeof value === "number") {
|
|
284
|
-
return [CONTINUE, value];
|
|
285
|
-
}
|
|
286
|
-
return [value];
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// node_modules/.pnpm/unist-util-visit@4.1.2/node_modules/unist-util-visit/lib/index.js
|
|
290
|
-
var visit = (
|
|
291
|
-
/**
|
|
292
|
-
* @type {(
|
|
293
|
-
* (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &
|
|
294
|
-
* (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)
|
|
295
|
-
* )}
|
|
296
|
-
*/
|
|
297
|
-
/**
|
|
298
|
-
* @param {Node} tree
|
|
299
|
-
* @param {Test} test
|
|
300
|
-
* @param {Visitor} visitor
|
|
301
|
-
* @param {boolean | null | undefined} [reverse]
|
|
302
|
-
* @returns {void}
|
|
303
|
-
*/
|
|
304
|
-
function(tree, test, visitor, reverse) {
|
|
305
|
-
if (typeof test === "function" && typeof visitor !== "function") {
|
|
306
|
-
reverse = visitor;
|
|
307
|
-
visitor = test;
|
|
308
|
-
test = null;
|
|
309
|
-
}
|
|
310
|
-
visitParents(tree, test, overload, reverse);
|
|
311
|
-
function overload(node, parents) {
|
|
312
|
-
const parent = parents[parents.length - 1];
|
|
313
|
-
return visitor(
|
|
314
|
-
node,
|
|
315
|
-
parent ? parent.children.indexOf(node) : null,
|
|
316
|
-
parent
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
);
|
|
321
|
-
|
|
322
131
|
// src/node/plugin/plugin-mdx/rehypePlugins/preWrapper.ts
|
|
132
|
+
import { visit } from "unist-util-visit";
|
|
323
133
|
var preWrapperPlugin = () => {
|
|
324
134
|
return (tree) => {
|
|
325
135
|
visit(tree, "element", (node) => {
|
|
@@ -360,10 +170,11 @@ var preWrapperPlugin = () => {
|
|
|
360
170
|
};
|
|
361
171
|
|
|
362
172
|
// src/node/plugin/plugin-mdx/rehypePlugins/shiki.ts
|
|
173
|
+
import { visit as visit2 } from "unist-util-visit";
|
|
363
174
|
import { fromHtml } from "hast-util-from-html";
|
|
364
175
|
var shikiPlugin = ({ highlighter }) => {
|
|
365
176
|
return (tree) => {
|
|
366
|
-
|
|
177
|
+
visit2(tree, "element", (node, index, parent) => {
|
|
367
178
|
if (node.tagName === "pre" && node.children[0]?.type === "element" && node.children[0]?.tagName === "code") {
|
|
368
179
|
const codeNode = node.children[0];
|
|
369
180
|
const codeContent = codeNode.children[0].value;
|
|
@@ -383,6 +194,7 @@ var shikiPlugin = ({ highlighter }) => {
|
|
|
383
194
|
import shiki from "shiki";
|
|
384
195
|
|
|
385
196
|
// src/node/plugin/plugin-mdx/remarkPlugins/toc.ts
|
|
197
|
+
import { visit as visit3 } from "unist-util-visit";
|
|
386
198
|
import Slugger from "github-slugger";
|
|
387
199
|
import { parse } from "acorn";
|
|
388
200
|
var TOCPlugin = () => {
|
|
@@ -390,7 +202,7 @@ var TOCPlugin = () => {
|
|
|
390
202
|
const tocTree = [];
|
|
391
203
|
const slugger = new Slugger();
|
|
392
204
|
let title = "";
|
|
393
|
-
|
|
205
|
+
visit3(tree, "heading", (node) => {
|
|
394
206
|
if (!node.depth || !node.children) {
|
|
395
207
|
return;
|
|
396
208
|
}
|
|
@@ -620,4 +432,4 @@ export {
|
|
|
620
432
|
unocssOptions_default,
|
|
621
433
|
createDevServer
|
|
622
434
|
};
|
|
623
|
-
//# sourceMappingURL=chunk-
|
|
435
|
+
//# sourceMappingURL=chunk-J3CR5P37.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/dev.ts","../src/node/plugin/indexHtml.ts","../src/node/constants/index.ts","../src/node/plugin/config.ts","../src/node/plugin/plugin-mdx/pluginMdxRollup.ts","../src/node/plugin/plugin-mdx/rehypePlugins/preWrapper.ts","../src/node/plugin/plugin-mdx/rehypePlugins/shiki.ts","../src/node/plugin/plugin-mdx/remarkPlugins/toc.ts","../src/node/plugin/plugin-mdx/index.ts","../src/node/plugin/plugin-routes/RouteService.ts","../src/node/plugin/plugin-routes/index.ts","../src/node/unocssOptions.ts"],"sourcesContent":["import { createServer as createViteDevServer } from \"vite\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\nimport { resolveConfig } from \"./config\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\n// Unocss适配\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nexport async function createDevServer(root: string, isSSR: boolean = false) {\r\n // 拿到配置文件的解析路径和文件经过解析后的内容\r\n const config = await resolveConfig(root, \"serve\", \"development\");\r\n\r\n // vite服务器\r\n return createViteDevServer({\r\n root: PACKAGE_ROOT,\r\n // 插件注册\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 配置e2e的服务器检索目录外的项目的合法性\r\n server: {\r\n fs: {\r\n allow: [PACKAGE_ROOT],\r\n },\r\n },\r\n });\r\n}\r\n","import { readFile } from \"fs/promises\";\r\nimport { Plugin } from \"vite\";\r\nimport { DEFAULT_HTML_PATH, CLIENT_ENTRY_PATH } from \"../constants\";\r\n\r\nexport function pluginIndexHtml(): Plugin {\r\n return {\r\n name: \"vigor: index-html\",\r\n apply: \"serve\",\r\n transformIndexHtml(html) {\r\n return {\r\n html,\r\n tags: [\r\n {\r\n tag: \"script\",\r\n attrs: {\r\n type: \"module\",\r\n src: `/@fs/${CLIENT_ENTRY_PATH}`,\r\n },\r\n injectTo: \"body\",\r\n },\r\n ],\r\n };\r\n },\r\n configureServer(server) {\r\n return () => {\r\n server.middlewares.use(async (req, res, next) => {\r\n let html = await readFile(DEFAULT_HTML_PATH, \"utf-8\");\r\n try {\r\n html = await server.transformIndexHtml(req.url, html, req.originalUrl);\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html\");\r\n res.end(html);\r\n } catch (error) {\r\n return next(error);\r\n }\r\n });\r\n };\r\n },\r\n };\r\n}\r\n","import { join } from \"path\";\r\n\r\n// 包根地址\r\nexport const PACKAGE_ROOT = join(__dirname, \"..\");\r\n\r\n// html模板地址\r\nexport const DEFAULT_HTML_PATH = join(PACKAGE_ROOT, \"template.html\");\r\n\r\n// 客户端入口地址\r\nexport const CLIENT_ENTRY_PATH = join(PACKAGE_ROOT, \"src\", \"runtime\", \"client-entry.tsx\");\r\n// 服务端入口地址\r\nexport const SERVER_ENTRY_PATH = join(PACKAGE_ROOT, \"src\", \"runtime\", \"ssr-entry.tsx\");\r\n","import { PACKAGE_ROOT } from \"node/constants\";\r\nimport { join } from \"path\";\r\nimport { SiteConfig } from \"types/index\";\r\nimport { Plugin } from \"vite\";\r\nimport sirv from \"sirv\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\n\r\nconst SITE_DATA_ID = \"vigor:site-data\";\r\n\r\nexport function pluginConfig(config: SiteConfig): Plugin {\r\n return {\r\n name: \"vigor:site-data\",\r\n resolveId(id) {\r\n if (id === SITE_DATA_ID) {\r\n // 在vite中一个虚拟模块会在前面加一个'\\0',这算是一个约定\r\n return \"\\0\" + SITE_DATA_ID;\r\n }\r\n },\r\n load(id) {\r\n if (id === \"\\0\" + SITE_DATA_ID) {\r\n return `export default ${JSON.stringify(config.siteData)}`;\r\n }\r\n },\r\n // 通过config钩子设置别名,此处设置的别名会自动与vite配置中的别名呼应\r\n config() {\r\n return {\r\n root: PACKAGE_ROOT,\r\n resolve: {\r\n alias: {\r\n \"@runtime\": join(PACKAGE_ROOT, \"src\", \"runtime\", \"index.ts\"),\r\n \"@constants\": join(PACKAGE_ROOT, \"src\", \"node\", \"constants\", \"index.ts\"),\r\n \"@types\": join(PACKAGE_ROOT, \"src\", \"types\", \"index.ts\"),\r\n },\r\n },\r\n css: {\r\n // 在scss中定义类名的时候使用 '-' 格式可以转换为小驼峰形式进行使用\r\n // 比如:\r\n // scss: .main-bg\r\n // tsx: mainBg\r\n modules: {\r\n localsConvention: \"camelCaseOnly\",\r\n },\r\n },\r\n };\r\n },\r\n // 构建一个配置服务器来加载docs文件夹下public中的静态资源\r\n // sirv 是一个优化过的轻量级中间件,用来处理静态资源请求\r\n configureServer(server) {\r\n const publicDir = path.join(config.root, \"public\");\r\n if (fs.existsSync(publicDir)) {\r\n server.middlewares.use(sirv(publicDir));\r\n }\r\n },\r\n // 一个学习的内容,本身未实现,比较复杂的一个逻辑。\r\n // 钩子函数:当配置文件发生改变时,达到热更新的效果\r\n // async handleHotUpdate(ctx) {\r\n // const customWatchedFiles = [config.configPath];\r\n // const include = (id: string) => customWatchedFiles.some((file) => id.includes(file));\r\n // if (include(ctx.file)) {\r\n // `\\n${relative(config.root, ctx.file)} has changed, restarting server...`;\r\n // // 重启Dev Server的方案\r\n // // 手动调用dev.ts中的createServer方法\r\n // }\r\n // },\r\n };\r\n}\r\n","import pluginMdx from \"@mdx-js/rollup\";\r\nimport { Plugin } from \"vite\";\r\n// github的markdown语法标准\r\nimport remarkGFM from \"remark-gfm\";\r\n\r\n// 以下两个插件是用来将标题设置锚点的,通过以下两个插件设置的锚点,可以将标题赋上链接,然后就可以通过点击前往相应位置\r\nimport rehypePluginAutoLinkHeadings from \"rehype-autolink-headings\";\r\nimport rehypePluginSlug from \"rehype-slug\";\r\n\r\n// 解析md文件的元信息\r\nimport remarkPluginFrontmatter from \"remark-frontmatter\";\r\nimport remarkPluginMDXFrontmatter from \"remark-mdx-frontmatter\";\r\n\r\n// 为md文件元信息优化为更优良的结构的插件 -> 外包一层div并添加一个span作为标题\r\nimport { preWrapperPlugin } from \"./rehypePlugins/preWrapper\";\r\n\r\n// 代码高亮插件\r\nimport { shikiPlugin } from \"./rehypePlugins/shiki\";\r\nimport shiki from \"shiki\";\r\n\r\n// TOC解析插件\r\nimport { TOCPlugin } from \"./remarkPlugins/toc\";\r\n\r\nexport async function pluginMdxRollup(): Promise<Plugin> {\r\n return pluginMdx({\r\n // 添加github的markdown标准-GFM语法\r\n remarkPlugins: [\r\n remarkGFM,\r\n remarkPluginFrontmatter,\r\n [remarkPluginMDXFrontmatter, { name: \"frontmatter\" }],\r\n TOCPlugin,\r\n ],\r\n // md文件解析插件\r\n rehypePlugins: [\r\n rehypePluginSlug,\r\n [\r\n rehypePluginAutoLinkHeadings,\r\n {\r\n properties: {\r\n class: \"header-anchor\",\r\n },\r\n content: {\r\n type: \"text\",\r\n value: \"#\",\r\n },\r\n },\r\n ],\r\n preWrapperPlugin,\r\n [shikiPlugin, { highlighter: await shiki.getHighlighter({ theme: \"nord\" }) }],\r\n ],\r\n }) as unknown as Plugin;\r\n}\r\n","import { Plugin } from \"unified\";\r\nimport { visit } from \"unist-util-visit\";\r\nimport { Root, Element } from \"hast\";\r\n\r\nexport const preWrapperPlugin: Plugin<[], Root> = () => {\r\n return (tree) => {\r\n visit(tree, \"element\", (node) => {\r\n // 代码块生成的默认结构\r\n // \"<pre><code class=\\\\\"language-js\\\\\">console.log(123);</code></pre>\"\r\n // 1.先找到pre元素\r\n if (\r\n node.tagName === \"pre\" &&\r\n node.children[0]?.type === \"element\" &&\r\n node.children[0].tagName === \"code\" &&\r\n !node.data?.isVisited\r\n ) {\r\n const codeNode = node.children[0];\r\n const codeClassName = codeNode.properties?.className?.toString() || \"\";\r\n // language\r\n const lang = codeClassName.split(\"-\")[1];\r\n\r\n const nodeClone: Element = {\r\n type: \"element\",\r\n tagName: \"pre\",\r\n children: node.children,\r\n data: {\r\n isVisited: true,\r\n },\r\n };\r\n\r\n // 在pre外层包裹一层div,并且给代码块设定一个span标签作为标题,注明使用的语言\r\n node.tagName = \"div\";\r\n node.properties = node.properties || {};\r\n node.properties.className = codeClassName;\r\n\r\n node.children = [\r\n {\r\n type: \"element\",\r\n tagName: \"span\",\r\n properties: {\r\n className: \"lang\",\r\n },\r\n children: [\r\n {\r\n type: \"text\",\r\n value: lang,\r\n },\r\n ],\r\n },\r\n nodeClone,\r\n ];\r\n }\r\n });\r\n };\r\n};\r\n","import { Plugin } from \"unified\";\r\nimport { Root, Text } from \"hast\";\r\nimport { visit } from \"unist-util-visit\";\r\nimport { fromHtml } from \"hast-util-from-html\";\r\nimport shiki from \"shiki\";\r\n\r\ninterface Options {\r\n highlighter: shiki.Highlighter;\r\n}\r\n\r\nexport const shikiPlugin: Plugin<[Options], Root> = ({ highlighter }) => {\r\n return (tree) => {\r\n // 使用unist-util-visit工具遍历结构树\r\n visit(tree, \"element\", (node, index, parent) => {\r\n // 找到目标位置(元素)\r\n if (\r\n node.tagName === \"pre\" &&\r\n node.children[0]?.type === \"element\" &&\r\n node.children[0]?.tagName === \"code\"\r\n ) {\r\n const codeNode = node.children[0];\r\n const codeContent = (codeNode.children[0] as Text).value;\r\n const codeClassName = codeNode.properties?.className?.toString() || \"\";\r\n const lang = codeClassName.split(\"-\")[1];\r\n\r\n if (!lang) return;\r\n\r\n // 实现高亮\r\n const highlightCode = highlighter.codeToHtml(codeContent, { lang });\r\n const fragmentAST = fromHtml(highlightCode, { fragment: true });\r\n parent.children.splice(index, 1, ...fragmentAST.children);\r\n }\r\n });\r\n };\r\n};\r\n","import type { Plugin } from \"unified\";\r\nimport { Root } from \"mdast\";\r\nimport { visit } from \"unist-util-visit\";\r\nimport Slugger from \"github-slugger\";\r\nimport { parse } from \"acorn\";\r\nimport type { MdxjsEsm } from \"mdast-util-mdxjs-esm\";\r\nimport type { Program } from \"estree-jsx\";\r\n\r\ninterface TocItem {\r\n id: string;\r\n text: string;\r\n depth: number;\r\n}\r\n\r\ninterface ChildNode {\r\n type: \"link\" | \"text\" | \"inlineCode\";\r\n value: string;\r\n children?: ChildNode[];\r\n}\r\n\r\nexport const TOCPlugin: Plugin<[], Root> = () => {\r\n return (tree) => {\r\n // 初始化toc数组\r\n const tocTree: TocItem[] = [];\r\n // 初始化slugger\r\n const slugger = new Slugger();\r\n let title = \"\";\r\n visit(tree, \"heading\", (node) => {\r\n if (!node.depth || !node.children) {\r\n return;\r\n }\r\n if (node.depth === 1) {\r\n title = (node.children[0] as ChildNode).value;\r\n }\r\n\r\n if (node.depth > 1 && node.depth < 5) {\r\n // 解析h2~h5\r\n // node.children 是一个数组,包含几种情况:\r\n // 1. 文本节点,如 '## title'\r\n // 结构如下:\r\n // {\r\n // type: 'text',\r\n // value: 'title'\r\n // }\r\n // 2. 链接节点,如 '## [title](/path)'\r\n // 结构如下:\r\n // {\r\n // type: 'link',\r\n // {\r\n // type: 'text',\r\n // value: 'title'\r\n // }\r\n // ]\r\n // }\r\n // 3. 内联代码节点,如 '## `title`'\r\n // 结构如下:\r\n // {\r\n // type: 'inlineCode',\r\n // value: 'title'\r\n // }\r\n const originText = (node.children as ChildNode[])\r\n .map((child) => {\r\n switch (child.type) {\r\n case \"link\":\r\n return child.children?.map((c) => c.value).join(\"\") || \"\";\r\n default:\r\n return child.value;\r\n }\r\n })\r\n .join(\"\");\r\n const id = slugger.slug(originText);\r\n tocTree.push({\r\n id,\r\n text: originText,\r\n depth: node.depth,\r\n });\r\n }\r\n });\r\n const insertCode = `export const toc = ${JSON.stringify(tocTree, null, 2)};`;\r\n\r\n tree.children.push({\r\n type: \"mdxjsEsm\",\r\n value: insertCode,\r\n data: {\r\n estree: parse(insertCode, {\r\n ecmaVersion: 2020,\r\n sourceType: \"module\",\r\n }) as unknown as Program,\r\n },\r\n } as MdxjsEsm);\r\n\r\n if (title) {\r\n const insertTitle = `export const title = \"${title}\";`;\r\n\r\n tree.children.push({\r\n type: \"mdxjsEsm\",\r\n value: insertTitle,\r\n data: {\r\n estree: parse(insertTitle, {\r\n ecmaVersion: 2020,\r\n sourceType: \"module\",\r\n }) as unknown as Program,\r\n },\r\n } as MdxjsEsm);\r\n }\r\n };\r\n};\r\n","import { pluginMdxRollup } from \"./pluginMdxRollup\";\r\nimport { Plugin } from \"vite\";\r\n\r\nexport async function pluginMdx(): Promise<Plugin[]> {\r\n return [await pluginMdxRollup()];\r\n}\r\n","import fastGlob from \"fast-glob\";\r\nimport path from \"path\";\r\nimport { normalizePath } from \"vite\";\r\n\r\ninterface RouteData {\r\n routePath: string;\r\n absolutePath: string;\r\n}\r\n\r\nexport class RouteService {\r\n // #scanDir是定义一个私有变量\r\n #scanDir: string;\r\n // 路由信息数组\r\n #routeData: RouteData[] = [];\r\n\r\n constructor(scanDir: string) {\r\n this.#scanDir = scanDir;\r\n }\r\n\r\n async init() {\r\n // 从产物目录中获取对应文件,然后对对应文件进行排序\r\n const files = fastGlob\r\n .sync([\"**/*.{js,jsx,ts,tsx,md,mdx}\"], {\r\n cwd: this.#scanDir,\r\n absolute: true,\r\n ignore: [\"**/build/**\", \"**/.vigor/**\", \"config.ts\", \"tsconfig.json\"],\r\n })\r\n .sort();\r\n\r\n files.forEach((file) => {\r\n // 拿到文件相对路径(从A到B的)\r\n // normalizePath是对路径进行windows规范化\r\n const fileRelativePath = normalizePath(path.relative(this.#scanDir, file));\r\n\r\n // 生成路径路由\r\n const routePath = this.getRoutePath(fileRelativePath);\r\n this.#routeData.push({\r\n routePath,\r\n absolutePath: file,\r\n });\r\n });\r\n }\r\n\r\n // 得到路由路径\r\n getRoutePath(fileRelativePath: string) {\r\n const routePath = fileRelativePath.replace(/\\.(.*)?$/, \"\").replace(/index$/, \"\");\r\n // 路由路径必须以'/'作为开头\r\n return routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\r\n }\r\n\r\n // 生成路由页面代码\r\n generateRoutesPath(ssr: boolean) {\r\n return `\r\n import React from 'react';\r\n ${ssr ? \"\" : 'import loadable from \"@loadable/component\";'}\r\n ${this.#routeData\r\n .map((route, index) => {\r\n // 动态加载路由信息(按需加载)\r\n // 在生产环境下,如果是ssr产物,则使用多路由打包\r\n return ssr\r\n ? `import Route${index} from \"${normalizePath(route.absolutePath)}\";`\r\n : `const Route${index} = loadable(() => import('${normalizePath(\r\n route.absolutePath\r\n )}')); `;\r\n\r\n // 静态加载路由信息\r\n // return `import Route${index} from '${normalizePath(route.absolutePath)}'`;\r\n })\r\n .join(\"\\n\")}\r\n \r\n export const routes = [\r\n ${this.#routeData\r\n .map((route, index) => {\r\n return `{ path: '${normalizePath(\r\n route.routePath\r\n )}', element: React.createElement(Route${index}), preload: () => import('${normalizePath(\r\n route.absolutePath\r\n )}') },`;\r\n })\r\n .join(\"\\n\")}\r\n ]\r\n `;\r\n }\r\n\r\n // 设定一个访问私有变量的api,用来单元测试\r\n getRouteData(): RouteData[] {\r\n return this.#routeData;\r\n }\r\n}\r\n","import { Plugin } from \"vite\";\r\nimport { RouteService } from \"./RouteService\";\r\nimport { Element } from \"hast\";\r\nimport react, { ComponentType } from \"react\";\r\nimport { Frontmatter } from \"../../../types/index\";\r\n\r\nexport interface PageModule {\r\n default: ComponentType;\r\n frontmatter?: Frontmatter;\r\n [key: string]: unknown;\r\n title?: string;\r\n}\r\nexport interface Route {\r\n path: string;\r\n element: react.ReactElement;\r\n filePath: string;\r\n preload: () => Promise<PageModule>;\r\n}\r\ninterface PluginRoutes {\r\n root: string;\r\n isSSR: boolean;\r\n}\r\n\r\nexport const CONVENTIONAL_ROUTE_ID = \"vigor:routes\";\r\n\r\nexport function pluginRoutes(options: PluginRoutes): Plugin {\r\n const rootService = new RouteService(options.root);\r\n return {\r\n name: \"vigor:routes\",\r\n async configResolved() {\r\n await rootService.init();\r\n },\r\n resolveId(id: string) {\r\n if (id === CONVENTIONAL_ROUTE_ID) {\r\n return \"\\0\" + id;\r\n }\r\n },\r\n load(id: string) {\r\n if (id === \"\\0\" + CONVENTIONAL_ROUTE_ID) {\r\n return rootService.generateRoutesPath(options.isSSR || false);\r\n }\r\n },\r\n };\r\n}\r\n","import { VitePluginConfig } from \"unocss/vite\";\r\nimport { presetAttributify, presetIcons, presetWind } from \"unocss\";\r\n\r\nconst options: VitePluginConfig = {\r\n presets: [presetAttributify(), presetIcons(), presetWind({})],\r\n rules: [\r\n // 下面这种写法和此种写法是一样的,只不过用正则会更加灵活\r\n // [\r\n // \"divider-bottom\",\r\n // {\r\n // \"border-bottom\": \"1px solid var(--vigor-c-divider-light)\"\r\n // }\r\n // ]\r\n [\r\n /^divider-(\\w+)$/,\r\n ([, w]) => ({\r\n [`border-${w}`]: \"1px solid var(--vigor-c-divider-light)\",\r\n }),\r\n ],\r\n ],\r\n shortcuts: {\r\n \"flex-center\": \"flex justify-center items-center\",\r\n },\r\n};\r\n\r\nexport default options;\r\n"],"mappings":"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","names":["join","visit","visit","pluginMdx","path","options","pluginMdx"]}
|
|
@@ -127,201 +127,11 @@ var _rehypeslug = require('rehype-slug'); var _rehypeslug2 = _interopRequireDefa
|
|
|
127
127
|
var _remarkfrontmatter = require('remark-frontmatter'); var _remarkfrontmatter2 = _interopRequireDefault(_remarkfrontmatter);
|
|
128
128
|
var _remarkmdxfrontmatter = require('remark-mdx-frontmatter'); var _remarkmdxfrontmatter2 = _interopRequireDefault(_remarkmdxfrontmatter);
|
|
129
129
|
|
|
130
|
-
// node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/lib/index.js
|
|
131
|
-
var convert = (
|
|
132
|
-
/**
|
|
133
|
-
* @type {(
|
|
134
|
-
* (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &
|
|
135
|
-
* ((test?: Test) => AssertAnything)
|
|
136
|
-
* )}
|
|
137
|
-
*/
|
|
138
|
-
/**
|
|
139
|
-
* @param {Test} [test]
|
|
140
|
-
* @returns {AssertAnything}
|
|
141
|
-
*/
|
|
142
|
-
function(test) {
|
|
143
|
-
if (test === void 0 || test === null) {
|
|
144
|
-
return ok;
|
|
145
|
-
}
|
|
146
|
-
if (typeof test === "string") {
|
|
147
|
-
return typeFactory(test);
|
|
148
|
-
}
|
|
149
|
-
if (typeof test === "object") {
|
|
150
|
-
return Array.isArray(test) ? anyFactory(test) : propsFactory(test);
|
|
151
|
-
}
|
|
152
|
-
if (typeof test === "function") {
|
|
153
|
-
return castFactory(test);
|
|
154
|
-
}
|
|
155
|
-
throw new Error("Expected function, string, or object as test");
|
|
156
|
-
}
|
|
157
|
-
);
|
|
158
|
-
function anyFactory(tests) {
|
|
159
|
-
const checks = [];
|
|
160
|
-
let index = -1;
|
|
161
|
-
while (++index < tests.length) {
|
|
162
|
-
checks[index] = convert(tests[index]);
|
|
163
|
-
}
|
|
164
|
-
return castFactory(any);
|
|
165
|
-
function any(...parameters) {
|
|
166
|
-
let index2 = -1;
|
|
167
|
-
while (++index2 < checks.length) {
|
|
168
|
-
if (checks[index2].call(this, ...parameters))
|
|
169
|
-
return true;
|
|
170
|
-
}
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
function propsFactory(check) {
|
|
175
|
-
return castFactory(all);
|
|
176
|
-
function all(node) {
|
|
177
|
-
let key;
|
|
178
|
-
for (key in check) {
|
|
179
|
-
if (node[key] !== check[key])
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
return true;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
function typeFactory(check) {
|
|
186
|
-
return castFactory(type);
|
|
187
|
-
function type(node) {
|
|
188
|
-
return node && node.type === check;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
function castFactory(check) {
|
|
192
|
-
return assertion;
|
|
193
|
-
function assertion(node, ...parameters) {
|
|
194
|
-
return Boolean(
|
|
195
|
-
node && typeof node === "object" && "type" in node && // @ts-expect-error: fine.
|
|
196
|
-
Boolean(check.call(this, node, ...parameters))
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
function ok() {
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/color.js
|
|
205
|
-
function color(d) {
|
|
206
|
-
return "\x1B[33m" + d + "\x1B[39m";
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/index.js
|
|
210
|
-
var CONTINUE = true;
|
|
211
|
-
var EXIT = false;
|
|
212
|
-
var SKIP = "skip";
|
|
213
|
-
var visitParents = (
|
|
214
|
-
/**
|
|
215
|
-
* @type {(
|
|
216
|
-
* (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &
|
|
217
|
-
* (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)
|
|
218
|
-
* )}
|
|
219
|
-
*/
|
|
220
|
-
/**
|
|
221
|
-
* @param {Node} tree
|
|
222
|
-
* @param {Test} test
|
|
223
|
-
* @param {Visitor<Node>} visitor
|
|
224
|
-
* @param {boolean | null | undefined} [reverse]
|
|
225
|
-
* @returns {void}
|
|
226
|
-
*/
|
|
227
|
-
function(tree, test, visitor, reverse) {
|
|
228
|
-
if (typeof test === "function" && typeof visitor !== "function") {
|
|
229
|
-
reverse = visitor;
|
|
230
|
-
visitor = test;
|
|
231
|
-
test = null;
|
|
232
|
-
}
|
|
233
|
-
const is2 = convert(test);
|
|
234
|
-
const step = reverse ? -1 : 1;
|
|
235
|
-
factory(tree, void 0, [])();
|
|
236
|
-
function factory(node, index, parents) {
|
|
237
|
-
const value = node && typeof node === "object" ? node : {};
|
|
238
|
-
if (typeof value.type === "string") {
|
|
239
|
-
const name = (
|
|
240
|
-
// `hast`
|
|
241
|
-
typeof value.tagName === "string" ? value.tagName : (
|
|
242
|
-
// `xast`
|
|
243
|
-
typeof value.name === "string" ? value.name : void 0
|
|
244
|
-
)
|
|
245
|
-
);
|
|
246
|
-
Object.defineProperty(visit2, "name", {
|
|
247
|
-
value: "node (" + color(node.type + (name ? "<" + name + ">" : "")) + ")"
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
return visit2;
|
|
251
|
-
function visit2() {
|
|
252
|
-
let result = [];
|
|
253
|
-
let subresult;
|
|
254
|
-
let offset;
|
|
255
|
-
let grandparents;
|
|
256
|
-
if (!test || is2(node, index, parents[parents.length - 1] || null)) {
|
|
257
|
-
result = toResult(visitor(node, parents));
|
|
258
|
-
if (result[0] === EXIT) {
|
|
259
|
-
return result;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (node.children && result[0] !== SKIP) {
|
|
263
|
-
offset = (reverse ? node.children.length : -1) + step;
|
|
264
|
-
grandparents = parents.concat(node);
|
|
265
|
-
while (offset > -1 && offset < node.children.length) {
|
|
266
|
-
subresult = factory(node.children[offset], offset, grandparents)();
|
|
267
|
-
if (subresult[0] === EXIT) {
|
|
268
|
-
return subresult;
|
|
269
|
-
}
|
|
270
|
-
offset = typeof subresult[1] === "number" ? subresult[1] : offset + step;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
return result;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
);
|
|
278
|
-
function toResult(value) {
|
|
279
|
-
if (Array.isArray(value)) {
|
|
280
|
-
return value;
|
|
281
|
-
}
|
|
282
|
-
if (typeof value === "number") {
|
|
283
|
-
return [CONTINUE, value];
|
|
284
|
-
}
|
|
285
|
-
return [value];
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// node_modules/.pnpm/unist-util-visit@4.1.2/node_modules/unist-util-visit/lib/index.js
|
|
289
|
-
var visit = (
|
|
290
|
-
/**
|
|
291
|
-
* @type {(
|
|
292
|
-
* (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &
|
|
293
|
-
* (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)
|
|
294
|
-
* )}
|
|
295
|
-
*/
|
|
296
|
-
/**
|
|
297
|
-
* @param {Node} tree
|
|
298
|
-
* @param {Test} test
|
|
299
|
-
* @param {Visitor} visitor
|
|
300
|
-
* @param {boolean | null | undefined} [reverse]
|
|
301
|
-
* @returns {void}
|
|
302
|
-
*/
|
|
303
|
-
function(tree, test, visitor, reverse) {
|
|
304
|
-
if (typeof test === "function" && typeof visitor !== "function") {
|
|
305
|
-
reverse = visitor;
|
|
306
|
-
visitor = test;
|
|
307
|
-
test = null;
|
|
308
|
-
}
|
|
309
|
-
visitParents(tree, test, overload, reverse);
|
|
310
|
-
function overload(node, parents) {
|
|
311
|
-
const parent = parents[parents.length - 1];
|
|
312
|
-
return visitor(
|
|
313
|
-
node,
|
|
314
|
-
parent ? parent.children.indexOf(node) : null,
|
|
315
|
-
parent
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
);
|
|
320
|
-
|
|
321
130
|
// src/node/plugin/plugin-mdx/rehypePlugins/preWrapper.ts
|
|
131
|
+
var _unistutilvisit = require('unist-util-visit');
|
|
322
132
|
var preWrapperPlugin = () => {
|
|
323
133
|
return (tree) => {
|
|
324
|
-
visit(tree, "element", (node) => {
|
|
134
|
+
_unistutilvisit.visit.call(void 0, tree, "element", (node) => {
|
|
325
135
|
if (node.tagName === "pre" && _optionalChain([node, 'access', _ => _.children, 'access', _2 => _2[0], 'optionalAccess', _3 => _3.type]) === "element" && node.children[0].tagName === "code" && !_optionalChain([node, 'access', _4 => _4.data, 'optionalAccess', _5 => _5.isVisited])) {
|
|
326
136
|
const codeNode = node.children[0];
|
|
327
137
|
const codeClassName = _optionalChain([codeNode, 'access', _6 => _6.properties, 'optionalAccess', _7 => _7.className, 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]) || "";
|
|
@@ -359,10 +169,11 @@ var preWrapperPlugin = () => {
|
|
|
359
169
|
};
|
|
360
170
|
|
|
361
171
|
// src/node/plugin/plugin-mdx/rehypePlugins/shiki.ts
|
|
172
|
+
|
|
362
173
|
var _hastutilfromhtml = require('hast-util-from-html');
|
|
363
174
|
var shikiPlugin = ({ highlighter }) => {
|
|
364
175
|
return (tree) => {
|
|
365
|
-
visit(tree, "element", (node, index, parent) => {
|
|
176
|
+
_unistutilvisit.visit.call(void 0, tree, "element", (node, index, parent) => {
|
|
366
177
|
if (node.tagName === "pre" && _optionalChain([node, 'access', _10 => _10.children, 'access', _11 => _11[0], 'optionalAccess', _12 => _12.type]) === "element" && _optionalChain([node, 'access', _13 => _13.children, 'access', _14 => _14[0], 'optionalAccess', _15 => _15.tagName]) === "code") {
|
|
367
178
|
const codeNode = node.children[0];
|
|
368
179
|
const codeContent = codeNode.children[0].value;
|
|
@@ -382,6 +193,7 @@ var shikiPlugin = ({ highlighter }) => {
|
|
|
382
193
|
var _shiki = require('shiki'); var _shiki2 = _interopRequireDefault(_shiki);
|
|
383
194
|
|
|
384
195
|
// src/node/plugin/plugin-mdx/remarkPlugins/toc.ts
|
|
196
|
+
|
|
385
197
|
var _githubslugger = require('github-slugger'); var _githubslugger2 = _interopRequireDefault(_githubslugger);
|
|
386
198
|
var _acorn = require('acorn');
|
|
387
199
|
var TOCPlugin = () => {
|
|
@@ -389,7 +201,7 @@ var TOCPlugin = () => {
|
|
|
389
201
|
const tocTree = [];
|
|
390
202
|
const slugger = new (0, _githubslugger2.default)();
|
|
391
203
|
let title = "";
|
|
392
|
-
visit(tree, "heading", (node) => {
|
|
204
|
+
_unistutilvisit.visit.call(void 0, tree, "heading", (node) => {
|
|
393
205
|
if (!node.depth || !node.children) {
|
|
394
206
|
return;
|
|
395
207
|
}
|
|
@@ -619,4 +431,4 @@ async function createDevServer(root, isSSR = false) {
|
|
|
619
431
|
|
|
620
432
|
|
|
621
433
|
exports.CLIENT_ENTRY_PATH = CLIENT_ENTRY_PATH; exports.SERVER_ENTRY_PATH = SERVER_ENTRY_PATH; exports.pluginIndexHtml = pluginIndexHtml; exports.pluginConfig = pluginConfig; exports.pluginMdx = pluginMdx2; exports.pluginRoutes = pluginRoutes; exports.unocssOptions_default = unocssOptions_default; exports.createDevServer = createDevServer;
|
|
622
|
-
//# sourceMappingURL=chunk-
|
|
434
|
+
//# sourceMappingURL=chunk-U5FDKMMF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/dev.ts","../src/node/plugin/indexHtml.ts","../src/node/constants/index.ts","../src/node/plugin/config.ts","../src/node/plugin/plugin-mdx/pluginMdxRollup.ts","../src/node/plugin/plugin-mdx/rehypePlugins/preWrapper.ts","../src/node/plugin/plugin-mdx/rehypePlugins/shiki.ts","../src/node/plugin/plugin-mdx/remarkPlugins/toc.ts","../src/node/plugin/plugin-mdx/index.ts","../src/node/plugin/plugin-routes/RouteService.ts","../src/node/plugin/plugin-routes/index.ts","../src/node/unocssOptions.ts"],"names":["join","visit","pluginMdx","path","options"],"mappings":"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","sourcesContent":["import { createServer as createViteDevServer } from \"vite\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\nimport { resolveConfig } from \"./config\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\n// Unocss适配\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nexport async function createDevServer(root: string, isSSR: boolean = false) {\r\n // 拿到配置文件的解析路径和文件经过解析后的内容\r\n const config = await resolveConfig(root, \"serve\", \"development\");\r\n\r\n // vite服务器\r\n return createViteDevServer({\r\n root: PACKAGE_ROOT,\r\n // 插件注册\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 配置e2e的服务器检索目录外的项目的合法性\r\n server: {\r\n fs: {\r\n allow: [PACKAGE_ROOT],\r\n },\r\n },\r\n });\r\n}\r\n","import { readFile } from \"fs/promises\";\r\nimport { Plugin } from \"vite\";\r\nimport { DEFAULT_HTML_PATH, CLIENT_ENTRY_PATH } from \"../constants\";\r\n\r\nexport function pluginIndexHtml(): Plugin {\r\n return {\r\n name: \"vigor: index-html\",\r\n apply: \"serve\",\r\n transformIndexHtml(html) {\r\n return {\r\n html,\r\n tags: [\r\n {\r\n tag: \"script\",\r\n attrs: {\r\n type: \"module\",\r\n src: `/@fs/${CLIENT_ENTRY_PATH}`,\r\n },\r\n injectTo: \"body\",\r\n },\r\n ],\r\n };\r\n },\r\n configureServer(server) {\r\n return () => {\r\n server.middlewares.use(async (req, res, next) => {\r\n let html = await readFile(DEFAULT_HTML_PATH, \"utf-8\");\r\n try {\r\n html = await server.transformIndexHtml(req.url, html, req.originalUrl);\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html\");\r\n res.end(html);\r\n } catch (error) {\r\n return next(error);\r\n }\r\n });\r\n };\r\n },\r\n };\r\n}\r\n","import { join } from \"path\";\r\n\r\n// 包根地址\r\nexport const PACKAGE_ROOT = join(__dirname, \"..\");\r\n\r\n// html模板地址\r\nexport const DEFAULT_HTML_PATH = join(PACKAGE_ROOT, \"template.html\");\r\n\r\n// 客户端入口地址\r\nexport const CLIENT_ENTRY_PATH = join(PACKAGE_ROOT, \"src\", \"runtime\", \"client-entry.tsx\");\r\n// 服务端入口地址\r\nexport const SERVER_ENTRY_PATH = join(PACKAGE_ROOT, \"src\", \"runtime\", \"ssr-entry.tsx\");\r\n","import { PACKAGE_ROOT } from \"node/constants\";\r\nimport { join } from \"path\";\r\nimport { SiteConfig } from \"types/index\";\r\nimport { Plugin } from \"vite\";\r\nimport sirv from \"sirv\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\n\r\nconst SITE_DATA_ID = \"vigor:site-data\";\r\n\r\nexport function pluginConfig(config: SiteConfig): Plugin {\r\n return {\r\n name: \"vigor:site-data\",\r\n resolveId(id) {\r\n if (id === SITE_DATA_ID) {\r\n // 在vite中一个虚拟模块会在前面加一个'\\0',这算是一个约定\r\n return \"\\0\" + SITE_DATA_ID;\r\n }\r\n },\r\n load(id) {\r\n if (id === \"\\0\" + SITE_DATA_ID) {\r\n return `export default ${JSON.stringify(config.siteData)}`;\r\n }\r\n },\r\n // 通过config钩子设置别名,此处设置的别名会自动与vite配置中的别名呼应\r\n config() {\r\n return {\r\n root: PACKAGE_ROOT,\r\n resolve: {\r\n alias: {\r\n \"@runtime\": join(PACKAGE_ROOT, \"src\", \"runtime\", \"index.ts\"),\r\n \"@constants\": join(PACKAGE_ROOT, \"src\", \"node\", \"constants\", \"index.ts\"),\r\n \"@types\": join(PACKAGE_ROOT, \"src\", \"types\", \"index.ts\"),\r\n },\r\n },\r\n css: {\r\n // 在scss中定义类名的时候使用 '-' 格式可以转换为小驼峰形式进行使用\r\n // 比如:\r\n // scss: .main-bg\r\n // tsx: mainBg\r\n modules: {\r\n localsConvention: \"camelCaseOnly\",\r\n },\r\n },\r\n };\r\n },\r\n // 构建一个配置服务器来加载docs文件夹下public中的静态资源\r\n // sirv 是一个优化过的轻量级中间件,用来处理静态资源请求\r\n configureServer(server) {\r\n const publicDir = path.join(config.root, \"public\");\r\n if (fs.existsSync(publicDir)) {\r\n server.middlewares.use(sirv(publicDir));\r\n }\r\n },\r\n // 一个学习的内容,本身未实现,比较复杂的一个逻辑。\r\n // 钩子函数:当配置文件发生改变时,达到热更新的效果\r\n // async handleHotUpdate(ctx) {\r\n // const customWatchedFiles = [config.configPath];\r\n // const include = (id: string) => customWatchedFiles.some((file) => id.includes(file));\r\n // if (include(ctx.file)) {\r\n // `\\n${relative(config.root, ctx.file)} has changed, restarting server...`;\r\n // // 重启Dev Server的方案\r\n // // 手动调用dev.ts中的createServer方法\r\n // }\r\n // },\r\n };\r\n}\r\n","import pluginMdx from \"@mdx-js/rollup\";\r\nimport { Plugin } from \"vite\";\r\n// github的markdown语法标准\r\nimport remarkGFM from \"remark-gfm\";\r\n\r\n// 以下两个插件是用来将标题设置锚点的,通过以下两个插件设置的锚点,可以将标题赋上链接,然后就可以通过点击前往相应位置\r\nimport rehypePluginAutoLinkHeadings from \"rehype-autolink-headings\";\r\nimport rehypePluginSlug from \"rehype-slug\";\r\n\r\n// 解析md文件的元信息\r\nimport remarkPluginFrontmatter from \"remark-frontmatter\";\r\nimport remarkPluginMDXFrontmatter from \"remark-mdx-frontmatter\";\r\n\r\n// 为md文件元信息优化为更优良的结构的插件 -> 外包一层div并添加一个span作为标题\r\nimport { preWrapperPlugin } from \"./rehypePlugins/preWrapper\";\r\n\r\n// 代码高亮插件\r\nimport { shikiPlugin } from \"./rehypePlugins/shiki\";\r\nimport shiki from \"shiki\";\r\n\r\n// TOC解析插件\r\nimport { TOCPlugin } from \"./remarkPlugins/toc\";\r\n\r\nexport async function pluginMdxRollup(): Promise<Plugin> {\r\n return pluginMdx({\r\n // 添加github的markdown标准-GFM语法\r\n remarkPlugins: [\r\n remarkGFM,\r\n remarkPluginFrontmatter,\r\n [remarkPluginMDXFrontmatter, { name: \"frontmatter\" }],\r\n TOCPlugin,\r\n ],\r\n // md文件解析插件\r\n rehypePlugins: [\r\n rehypePluginSlug,\r\n [\r\n rehypePluginAutoLinkHeadings,\r\n {\r\n properties: {\r\n class: \"header-anchor\",\r\n },\r\n content: {\r\n type: \"text\",\r\n value: \"#\",\r\n },\r\n },\r\n ],\r\n preWrapperPlugin,\r\n [shikiPlugin, { highlighter: await shiki.getHighlighter({ theme: \"nord\" }) }],\r\n ],\r\n }) as unknown as Plugin;\r\n}\r\n","import { Plugin } from \"unified\";\r\nimport { visit } from \"unist-util-visit\";\r\nimport { Root, Element } from \"hast\";\r\n\r\nexport const preWrapperPlugin: Plugin<[], Root> = () => {\r\n return (tree) => {\r\n visit(tree, \"element\", (node) => {\r\n // 代码块生成的默认结构\r\n // \"<pre><code class=\\\\\"language-js\\\\\">console.log(123);</code></pre>\"\r\n // 1.先找到pre元素\r\n if (\r\n node.tagName === \"pre\" &&\r\n node.children[0]?.type === \"element\" &&\r\n node.children[0].tagName === \"code\" &&\r\n !node.data?.isVisited\r\n ) {\r\n const codeNode = node.children[0];\r\n const codeClassName = codeNode.properties?.className?.toString() || \"\";\r\n // language\r\n const lang = codeClassName.split(\"-\")[1];\r\n\r\n const nodeClone: Element = {\r\n type: \"element\",\r\n tagName: \"pre\",\r\n children: node.children,\r\n data: {\r\n isVisited: true,\r\n },\r\n };\r\n\r\n // 在pre外层包裹一层div,并且给代码块设定一个span标签作为标题,注明使用的语言\r\n node.tagName = \"div\";\r\n node.properties = node.properties || {};\r\n node.properties.className = codeClassName;\r\n\r\n node.children = [\r\n {\r\n type: \"element\",\r\n tagName: \"span\",\r\n properties: {\r\n className: \"lang\",\r\n },\r\n children: [\r\n {\r\n type: \"text\",\r\n value: lang,\r\n },\r\n ],\r\n },\r\n nodeClone,\r\n ];\r\n }\r\n });\r\n };\r\n};\r\n","import { Plugin } from \"unified\";\r\nimport { Root, Text } from \"hast\";\r\nimport { visit } from \"unist-util-visit\";\r\nimport { fromHtml } from \"hast-util-from-html\";\r\nimport shiki from \"shiki\";\r\n\r\ninterface Options {\r\n highlighter: shiki.Highlighter;\r\n}\r\n\r\nexport const shikiPlugin: Plugin<[Options], Root> = ({ highlighter }) => {\r\n return (tree) => {\r\n // 使用unist-util-visit工具遍历结构树\r\n visit(tree, \"element\", (node, index, parent) => {\r\n // 找到目标位置(元素)\r\n if (\r\n node.tagName === \"pre\" &&\r\n node.children[0]?.type === \"element\" &&\r\n node.children[0]?.tagName === \"code\"\r\n ) {\r\n const codeNode = node.children[0];\r\n const codeContent = (codeNode.children[0] as Text).value;\r\n const codeClassName = codeNode.properties?.className?.toString() || \"\";\r\n const lang = codeClassName.split(\"-\")[1];\r\n\r\n if (!lang) return;\r\n\r\n // 实现高亮\r\n const highlightCode = highlighter.codeToHtml(codeContent, { lang });\r\n const fragmentAST = fromHtml(highlightCode, { fragment: true });\r\n parent.children.splice(index, 1, ...fragmentAST.children);\r\n }\r\n });\r\n };\r\n};\r\n","import type { Plugin } from \"unified\";\r\nimport { Root } from \"mdast\";\r\nimport { visit } from \"unist-util-visit\";\r\nimport Slugger from \"github-slugger\";\r\nimport { parse } from \"acorn\";\r\nimport type { MdxjsEsm } from \"mdast-util-mdxjs-esm\";\r\nimport type { Program } from \"estree-jsx\";\r\n\r\ninterface TocItem {\r\n id: string;\r\n text: string;\r\n depth: number;\r\n}\r\n\r\ninterface ChildNode {\r\n type: \"link\" | \"text\" | \"inlineCode\";\r\n value: string;\r\n children?: ChildNode[];\r\n}\r\n\r\nexport const TOCPlugin: Plugin<[], Root> = () => {\r\n return (tree) => {\r\n // 初始化toc数组\r\n const tocTree: TocItem[] = [];\r\n // 初始化slugger\r\n const slugger = new Slugger();\r\n let title = \"\";\r\n visit(tree, \"heading\", (node) => {\r\n if (!node.depth || !node.children) {\r\n return;\r\n }\r\n if (node.depth === 1) {\r\n title = (node.children[0] as ChildNode).value;\r\n }\r\n\r\n if (node.depth > 1 && node.depth < 5) {\r\n // 解析h2~h5\r\n // node.children 是一个数组,包含几种情况:\r\n // 1. 文本节点,如 '## title'\r\n // 结构如下:\r\n // {\r\n // type: 'text',\r\n // value: 'title'\r\n // }\r\n // 2. 链接节点,如 '## [title](/path)'\r\n // 结构如下:\r\n // {\r\n // type: 'link',\r\n // {\r\n // type: 'text',\r\n // value: 'title'\r\n // }\r\n // ]\r\n // }\r\n // 3. 内联代码节点,如 '## `title`'\r\n // 结构如下:\r\n // {\r\n // type: 'inlineCode',\r\n // value: 'title'\r\n // }\r\n const originText = (node.children as ChildNode[])\r\n .map((child) => {\r\n switch (child.type) {\r\n case \"link\":\r\n return child.children?.map((c) => c.value).join(\"\") || \"\";\r\n default:\r\n return child.value;\r\n }\r\n })\r\n .join(\"\");\r\n const id = slugger.slug(originText);\r\n tocTree.push({\r\n id,\r\n text: originText,\r\n depth: node.depth,\r\n });\r\n }\r\n });\r\n const insertCode = `export const toc = ${JSON.stringify(tocTree, null, 2)};`;\r\n\r\n tree.children.push({\r\n type: \"mdxjsEsm\",\r\n value: insertCode,\r\n data: {\r\n estree: parse(insertCode, {\r\n ecmaVersion: 2020,\r\n sourceType: \"module\",\r\n }) as unknown as Program,\r\n },\r\n } as MdxjsEsm);\r\n\r\n if (title) {\r\n const insertTitle = `export const title = \"${title}\";`;\r\n\r\n tree.children.push({\r\n type: \"mdxjsEsm\",\r\n value: insertTitle,\r\n data: {\r\n estree: parse(insertTitle, {\r\n ecmaVersion: 2020,\r\n sourceType: \"module\",\r\n }) as unknown as Program,\r\n },\r\n } as MdxjsEsm);\r\n }\r\n };\r\n};\r\n","import { pluginMdxRollup } from \"./pluginMdxRollup\";\r\nimport { Plugin } from \"vite\";\r\n\r\nexport async function pluginMdx(): Promise<Plugin[]> {\r\n return [await pluginMdxRollup()];\r\n}\r\n","import fastGlob from \"fast-glob\";\r\nimport path from \"path\";\r\nimport { normalizePath } from \"vite\";\r\n\r\ninterface RouteData {\r\n routePath: string;\r\n absolutePath: string;\r\n}\r\n\r\nexport class RouteService {\r\n // #scanDir是定义一个私有变量\r\n #scanDir: string;\r\n // 路由信息数组\r\n #routeData: RouteData[] = [];\r\n\r\n constructor(scanDir: string) {\r\n this.#scanDir = scanDir;\r\n }\r\n\r\n async init() {\r\n // 从产物目录中获取对应文件,然后对对应文件进行排序\r\n const files = fastGlob\r\n .sync([\"**/*.{js,jsx,ts,tsx,md,mdx}\"], {\r\n cwd: this.#scanDir,\r\n absolute: true,\r\n ignore: [\"**/build/**\", \"**/.vigor/**\", \"config.ts\", \"tsconfig.json\"],\r\n })\r\n .sort();\r\n\r\n files.forEach((file) => {\r\n // 拿到文件相对路径(从A到B的)\r\n // normalizePath是对路径进行windows规范化\r\n const fileRelativePath = normalizePath(path.relative(this.#scanDir, file));\r\n\r\n // 生成路径路由\r\n const routePath = this.getRoutePath(fileRelativePath);\r\n this.#routeData.push({\r\n routePath,\r\n absolutePath: file,\r\n });\r\n });\r\n }\r\n\r\n // 得到路由路径\r\n getRoutePath(fileRelativePath: string) {\r\n const routePath = fileRelativePath.replace(/\\.(.*)?$/, \"\").replace(/index$/, \"\");\r\n // 路由路径必须以'/'作为开头\r\n return routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\r\n }\r\n\r\n // 生成路由页面代码\r\n generateRoutesPath(ssr: boolean) {\r\n return `\r\n import React from 'react';\r\n ${ssr ? \"\" : 'import loadable from \"@loadable/component\";'}\r\n ${this.#routeData\r\n .map((route, index) => {\r\n // 动态加载路由信息(按需加载)\r\n // 在生产环境下,如果是ssr产物,则使用多路由打包\r\n return ssr\r\n ? `import Route${index} from \"${normalizePath(route.absolutePath)}\";`\r\n : `const Route${index} = loadable(() => import('${normalizePath(\r\n route.absolutePath\r\n )}')); `;\r\n\r\n // 静态加载路由信息\r\n // return `import Route${index} from '${normalizePath(route.absolutePath)}'`;\r\n })\r\n .join(\"\\n\")}\r\n \r\n export const routes = [\r\n ${this.#routeData\r\n .map((route, index) => {\r\n return `{ path: '${normalizePath(\r\n route.routePath\r\n )}', element: React.createElement(Route${index}), preload: () => import('${normalizePath(\r\n route.absolutePath\r\n )}') },`;\r\n })\r\n .join(\"\\n\")}\r\n ]\r\n `;\r\n }\r\n\r\n // 设定一个访问私有变量的api,用来单元测试\r\n getRouteData(): RouteData[] {\r\n return this.#routeData;\r\n }\r\n}\r\n","import { Plugin } from \"vite\";\r\nimport { RouteService } from \"./RouteService\";\r\nimport { Element } from \"hast\";\r\nimport react, { ComponentType } from \"react\";\r\nimport { Frontmatter } from \"../../../types/index\";\r\n\r\nexport interface PageModule {\r\n default: ComponentType;\r\n frontmatter?: Frontmatter;\r\n [key: string]: unknown;\r\n title?: string;\r\n}\r\nexport interface Route {\r\n path: string;\r\n element: react.ReactElement;\r\n filePath: string;\r\n preload: () => Promise<PageModule>;\r\n}\r\ninterface PluginRoutes {\r\n root: string;\r\n isSSR: boolean;\r\n}\r\n\r\nexport const CONVENTIONAL_ROUTE_ID = \"vigor:routes\";\r\n\r\nexport function pluginRoutes(options: PluginRoutes): Plugin {\r\n const rootService = new RouteService(options.root);\r\n return {\r\n name: \"vigor:routes\",\r\n async configResolved() {\r\n await rootService.init();\r\n },\r\n resolveId(id: string) {\r\n if (id === CONVENTIONAL_ROUTE_ID) {\r\n return \"\\0\" + id;\r\n }\r\n },\r\n load(id: string) {\r\n if (id === \"\\0\" + CONVENTIONAL_ROUTE_ID) {\r\n return rootService.generateRoutesPath(options.isSSR || false);\r\n }\r\n },\r\n };\r\n}\r\n","import { VitePluginConfig } from \"unocss/vite\";\r\nimport { presetAttributify, presetIcons, presetWind } from \"unocss\";\r\n\r\nconst options: VitePluginConfig = {\r\n presets: [presetAttributify(), presetIcons(), presetWind({})],\r\n rules: [\r\n // 下面这种写法和此种写法是一样的,只不过用正则会更加灵活\r\n // [\r\n // \"divider-bottom\",\r\n // {\r\n // \"border-bottom\": \"1px solid var(--vigor-c-divider-light)\"\r\n // }\r\n // ]\r\n [\r\n /^divider-(\\w+)$/,\r\n ([, w]) => ({\r\n [`border-${w}`]: \"1px solid var(--vigor-c-divider-light)\",\r\n }),\r\n ],\r\n ],\r\n shortcuts: {\r\n \"flex-center\": \"flex justify-center items-center\",\r\n },\r\n};\r\n\r\nexport default options;\r\n"]}
|