vigor-moon 1.1.2 → 1.1.3

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/cli.js CHANGED
@@ -18,7 +18,7 @@ var require_package = _chunkPB3TEDCEjs.__commonJS.call(void 0, {
18
18
  "package.json"(exports, module) {
19
19
  module.exports = {
20
20
  name: "vigor-moon",
21
- version: "1.1.2",
21
+ version: "1.1.3",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"names":["path","fs"],"mappings":"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","sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.2\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"names":["path","fs"],"mappings":"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","sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.3\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"]}
package/dist/cli.mjs CHANGED
@@ -18,7 +18,7 @@ var require_package = __commonJS({
18
18
  "package.json"(exports, module) {
19
19
  module.exports = {
20
20
  name: "vigor-moon",
21
- version: "1.1.2",
21
+ version: "1.1.3",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.2\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"],"mappings":"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","names":["path","fs"]}
1
+ {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.3\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,MACE,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,QAAU;AAAA,MACV,OAAS;AAAA,MACT,SAAW;AAAA,QACT,KAAK;AAAA,UACH,OAAS;AAAA,UACT,QAAU;AAAA,UACV,SAAW;AAAA,QACb;AAAA,QACA,YAAY;AAAA,QACZ,kBAAkB;AAAA,MACpB;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,OAAS;AAAA,QACT,aAAa;AAAA,QACb,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,SAAW;AAAA,QACX,WAAa;AAAA,MACf;AAAA,MACA,KAAO;AAAA,QACL,OAAS;AAAA,MACX;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAU;AAAA,MACV,SAAW;AAAA,MACX,OAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAmB;AAAA,QACjB,wBAAwB;AAAA,QACxB,oBAAoB;AAAA,QACpB,sBAAsB;AAAA,QACtB,mBAAmB;AAAA,QACnB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,OAAS;AAAA,QACT,8BAA8B;AAAA,QAC9B,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,UAAY;AAAA,QACZ,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,QAAU;AAAA,QACV,QAAU;AAAA,QACV,MAAQ;AAAA,QACR,KAAO;AAAA,QACP,YAAc;AAAA,QACd,SAAW;AAAA,QACX,oBAAoB;AAAA,QACpB,QAAU;AAAA,MACZ;AAAA,MACA,cAAgB;AAAA,QACd,uBAAuB;AAAA,QACvB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,wBAAwB;AAAA,QACxB,OAAS;AAAA,QACT,KAAO;AAAA,QACP,aAAe;AAAA,QACf,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,QACvB,KAAO;AAAA,QACP,wBAAwB;AAAA,QACxB,OAAS;AAAA,QACT,OAAS;AAAA,QACT,aAAa;AAAA,QACb,sBAAsB;AAAA,QACtB,oBAAoB;AAAA,QACpB,4BAA4B;AAAA,QAC5B,eAAe;AAAA,QACf,sBAAsB;AAAA,QACtB,cAAc;AAAA,QACd,cAAc;AAAA,QACd,0BAA0B;AAAA,QAC1B,oBAAoB;AAAA,QACpB,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,QACT,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,MAAQ;AAAA,MACV;AAAA,IACF;AAAA;AAAA;;;AC5GA,SAAS,WAAW;;;ACApB,SAAS,SAAS,iBAA+B;AAEjD,OAAO,QAAQ,MAAM,eAAe;AAIpC,OAAO,QAAQ;AACf,OAAO,iBAAiB;AAExB,SAAS,qBAAqB;AAQ9B,OAAO,kBAAkB;AAKzB,IAAM,gBAAgB;AAGtB,eAAsB,OAAO,MAAc,QAAoB;AAG7D,QAAM,oBAAoB,OAAO,UAAmB,QAAQ,cAAqC;AAAA,IAC/F,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,aAAa,qBAAa;AAAA,MAC1B,gBAAgB;AAAA,MAChB,YAAY,EAAE,YAAY,aAAa,iBAAiB,QAAQ,CAAC;AAAA,MACjE,aAAa,MAAM;AAAA;AAAA;AAAA,MAGnB,aAAa,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA,MACzC,MAAM,UAAU;AAAA,IAClB;AAAA;AAAA,IAEA,KAAK;AAAA,MACH,YAAY,CAAC,kBAAkB;AAAA,IACjC;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,QAAQ,WAAW,KAAK,KAAK,MAAM,OAAO,IAAI,KAAK,KAAK,MAAM,aAAa;AAAA,MAC3E,eAAe;AAAA,QACb,OAAO,WAAW,oBAAoB;AAAA,QACtC,QAAQ;AAAA,UACN,QAAQ,WAAW,QAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AAWF,YAAQ,IAAI,wCAAwC;AAGpD,UAAM,CAAC,cAAc,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,MAErD,UAAU,MAAM,kBAAkB,KAAK,CAAC;AAAA;AAAA,MAExC,UAAU,MAAM,kBAAkB,IAAI,CAAC;AAAA,IACzC,CAAC;AACD,UAAM,YAAY,KAAK,MAAM,QAAQ;AACrC,QAAI,GAAG,eAAe,SAAS,GAAG;AAChC,YAAM,GAAG,KAAK,WAAW,KAAK,MAAM,aAAa,CAAC;AAAA,IACpD;AACA,WAAO,CAAC,cAAc,YAAY;AAAA,EACpC,SAAS,OAAP;AACA,YAAQ,IAAI,KAAK;AAAA,EACnB;AACF;AAGA,eAAsB,WACpB,QACA,MACA,cACA,QACA;AAEA,QAAM,cAAc,aAAa,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,WAAW,MAAM,OAAO;AAE/F,UAAQ,IAAI,kCAAkC;AAG9C,QAAM,gBAAgB;AAAA,IACpB,SAAS,CAAC;AAAA,EACZ;AAGA,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,GAAG;AAAA,MACH;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF,EAAE,IAAI,OAAO,UAAU;AACrB,YAAM,YAAY,MAAM;AAGxB,YAAM,UAAU,OAAO,WAAW,cAAc,OAAO;AACvD,YAAM,cAAc,aAAa,OAAO;AAAA,QACtC,CAAC,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS,SAAS,MAAM;AAAA,MACrE;AAEA,YAAM,EAAE,OAAO,IAAI,cAAc;AACjC,YAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOT,QAAQ,OAAO,SAAS,KAAK;AAAA,UAC7B,QAAQ,MAAM,SAAS,KAAK;AAAA,UAC5B,QAAQ,MAAM,SAAS,KAAK;AAAA,UAC5B,QAAQ,OAAO,SAAS,KAAK;AAAA;AAAA,UAE7B,YAAY,IAAI,CAAC,SAAS,iCAAiC,KAAK,YAAY,EAAE,KAAK,IAAI;AAAA;AAAA;AAAA,yBAGxE;AAAA,wBACD,aAAa;AAAA;AAAA;AAAA,MAG/B,KAAK;AAEL,YAAM,WAAW,UAAU,SAAS,GAAG,IAAI,GAAG,wBAAwB,GAAG;AACzE,YAAM,GAAG,UAAU,KAAK,MAAM,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAGzD,YAAM,GAAG,UAAU,KAAK,MAAM,SAAS,QAAQ,GAAG,IAAI;AAAA,IACxD,CAAC;AAAA,EACH;AAGA,QAAM,GAAG,OAAO,KAAK,MAAM,OAAO,CAAC;AACrC;AAGA,eAAsB,MAAM,OAAe,QAAQ,IAAI,GAAG,QAAoB;AAE5E,QAAM,CAAC,YAAY,IAAI,MAAM,OAAO,MAAM,MAAM;AAEhD,QAAM,kBAAkB,KAAK,MAAM,SAAS,cAAc;AAE1D,QAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,cAAc,eAAe,EAAE,SAAS;AAChF,MAAI;AACF,UAAM,WAAW,QAAQ,MAAM,cAAc,MAAM;AAAA,EACrD,SAAS,GAAP;AACA,YAAQ,IAAI,qBAAqB,CAAC;AAAA,EACpC;AACF;;;ACvKA,OAAOA,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAO,iBAAiB;AACxB,OAAO,UAAU;AACjB,OAAO,WAAW;AAGlB,IAAM,sBAAsB;AAE5B,eAAsB,QAAQ,MAAc,EAAE,KAAK,GAAsB;AACvE,QAAM,SAAS,MAAM,cAAc,MAAM,SAAS,YAAY;AAC9D,QAAM,aAAa,QAAQ;AAC3B,QAAM,YAAYD,MAAK,QAAQ,MAAM,OAAO;AAC5C,QAAM,eAAeC,IAAG,aAAaD,MAAK,QAAQ,WAAW,UAAU,GAAG,MAAM;AAGhF,QAAM,WAAW,YAAY;AAG7B,QAAM,QAAQ,KAAK,WAAW;AAAA,IAC5B,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA,IACR,WAAW;AAAA,IACX,WAAW,KAAK,UAAU;AACxB,UAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,YAAI,UAAU,iBAAiB,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,YAAwC,CAAC,KAAK,QAAQ;AAC1D,QAAI,aAAa;AACjB,QAAI,IAAI,YAAY;AAAA,EACtB;AAEA,QAAM,EAAE,UAAU,CAAC,EAChB,IAAI,UAAU,KAAK,EACnB,OAAO,YAAY,CAAC,QAAQ;AAC3B,QAAI,KAAK;AACP,YAAM;AAAA,IACR;AACA,YAAQ,IAAI,iDAAiD,YAAY;AAAA,EAC3E,CAAC;AACL;;;AFxCA,SAAS,eAAe;AAExB,IAAM,UAAU,kBAA8B;AAE9C,IAAM,MAAM,IAAI,OAAO,EAAE,QAAQ,OAAO,EAAE,KAAK;AAI/C,IACG,QAAQ,UAAU,kBAAkB,EACpC,MAAM,KAAK,EACX,OAAO,OAAO,SAAiB;AAC9B,MAAI;AACF,WAAO,OAAO,QAAQ,IAAI,IAAI,QAAQ,IAAI;AAC1C,UAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,UAAM,OAAO,OAAO;AACpB,WAAO,UAAU;AAAA,EACnB,SAAS,OAAP;AACA,YAAQ,IAAI,KAAK;AAAA,EACnB;AACF,CAAC;AAGH,IAAI,QAAQ,gBAAgB,qBAAqB,EAAE,OAAO,OAAO,SAAiB;AAChF,MAAI;AACF,WAAO,QAAQ,IAAI;AACnB,UAAM,SAAS,MAAM,cAAc,MAAM,SAAS,YAAY;AAC9D,UAAM,MAAM,MAAM,MAAM;AAAA,EAC1B,SAAS,OAAP;AACA,YAAQ,IAAI,KAAK;AAAA,EACnB;AACF,CAAC;AAGD,IACG,QAAQ,kBAAkB,0BAA0B,EACpD,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,OAAO,MAAc,EAAE,KAAK,MAAwB;AAC1D,MAAI;AACF,WAAO,QAAQ,IAAI;AACnB,YAAQ,IAAI,IAAI;AAChB,UAAM,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA,EAC9B,SAAS,GAAP;AACA,YAAQ,IAAI,CAAC;AAAA,EACf;AACF,CAAC;AAEH,IAAI,MAAM;","names":["path","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vigor-moon",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "packageManager": "pnpm@7.9.2",
5
5
  "description": "SSG framework",
6
6
  "main": "dist/index.js",
@@ -7,7 +7,7 @@ export function HomePage() {
7
7
  const { frontmatter } = useContextData();
8
8
 
9
9
  return (
10
- <div className = "px-24 pt-30">
10
+ <div className = "px-24 pt-30 w-4/5 mx-auto my-0">
11
11
  <HeroComponent hero={frontmatter.hero} />
12
12
  <FeatureComponent features={frontmatter.features} />
13
13
  <FooterComponent footer={ frontmatter.footer } />
@@ -4,7 +4,7 @@ import styles from "./index.module.scss";
4
4
  export function FeatureComponent(props: {features: Feature[]}) {
5
5
 
6
6
  return (
7
- <div flex="~ wrap" justify="between" pt="20" className="divider-bottom pb-10">
7
+ <div flex="~ wrap" justify="between" pt="8" className="divider-bottom pb-10">
8
8
  {
9
9
  props.features.map((feature) => {
10
10
  const {
@@ -14,7 +14,7 @@ export function FeatureComponent(props: {features: Feature[]}) {
14
14
  } = feature;
15
15
  return (
16
16
  <div key={title} border="rounded-md" pb="1.3%" w="32.4%">
17
- <article p="6" className={styles.bg} h-full="true" >
17
+ <article p="6" className={`${styles.bg} h-3/4`} >
18
18
  <div className={`flex-center text-3xl w-13 h-11 ${styles.iconBg}`} border="rounded-xl solid">{ icon }</div>
19
19
  <h2 className="font-semibold py-4">{ title }</h2>
20
20
  <p className="text-3.5 font-medium opacity-90">{ details }</p>
@@ -21,7 +21,7 @@ export function HeroComponent(props: { hero: Hero }) {
21
21
  <p className="text-6xl font-semibold"> { hero.text } </p>
22
22
  <p className="text-2xl pt-3 pb-6 opacity-65"> { hero.tagline } </p>
23
23
  </div>
24
- <div flex="~">
24
+ <div flex="~" pt="3">
25
25
  {hero.actions.map((action) => (
26
26
  <div key={action.link} className="pr-3">
27
27
  <Button