vigor-moon 1.1.5 → 1.1.7

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.
@@ -45,6 +45,7 @@ function resolveSiteData(userConfig) {
45
45
  title: userConfig.title || "vigor.js",
46
46
  description: userConfig.description || "A SSG framework.",
47
47
  themeConfig: userConfig.themeConfig || {},
48
+ icon: userConfig.icon || "",
48
49
  vite: userConfig.vite || {}
49
50
  };
50
51
  }
@@ -67,4 +68,4 @@ export {
67
68
  resolveConfig,
68
69
  defineConfig
69
70
  };
70
- //# sourceMappingURL=chunk-6TVEHJR5.mjs.map
71
+ //# sourceMappingURL=chunk-LDLUO4RY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/.pnpm/tsup@6.6.2_typescript@4.9.5/node_modules/tsup/assets/esm_shims.js","../src/node/config.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { resolve } from \"path\";\r\nimport fs from \"fs-extra\";\r\n\r\n// vite内部的api,用来解析文件\r\nimport { loadConfigFromFile } from \"vite\";\r\nimport { UserConfig, SiteConfig } from \"../types/index\";\r\n\r\n// 定义command和mode的类型\r\ntype Command = \"build\" | \"serve\";\r\ntype Mode = \"development\" | \"production\";\r\n\r\n// 拿到的文件类型 对象、promise和返回对象或promise的函数\r\ntype RawConfig = UserConfig | Promise<UserConfig> | (() => UserConfig | Promise<UserConfig>);\r\n\r\nfunction getUserConfig(root: string) {\r\n try {\r\n // .js和.ts文件均可\r\n const supportConfigFile = [\"config.js\", \"config.ts\"];\r\n // 判断配置文件是否存在,如果存在就拿到并返回回去\r\n //\r\n const configPath = supportConfigFile.map((file) => resolve(root, file)).find(fs.pathExistsSync);\r\n return configPath;\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n}\r\n\r\nasync function resolveUserConfig(command: Command, mode: Mode, root: string) {\r\n // 1. 获取配置文件路径\r\n const configPath = getUserConfig(root);\r\n // 2. 解析配置文件\r\n const res = await loadConfigFromFile(\r\n {\r\n command,\r\n mode,\r\n },\r\n configPath\r\n );\r\n if (res) {\r\n const { config: ordConfig = {} as RawConfig } = res;\r\n // rawConfig有三种形式\r\n // 1. object对象形式\r\n // 2. promise形式\r\n // 3. function函数形式\r\n // 所以要对rawConfig做一个统一的规范化\r\n const userConfig = await (typeof ordConfig === \"function\" ? ordConfig() : ordConfig);\r\n return [configPath, userConfig] as const;\r\n } else {\r\n return [configPath, {} as UserConfig] as const;\r\n }\r\n}\r\n\r\n// 解析网站(用户信息)信息\r\nexport function resolveSiteData(userConfig: UserConfig): UserConfig {\r\n return {\r\n title: userConfig.title || \"vigor.js\",\r\n description: userConfig.description || \"A SSG framework.\",\r\n themeConfig: userConfig.themeConfig || {},\r\n vite: userConfig.vite || {},\r\n };\r\n}\r\nexport async function resolveConfig(\r\n // command和mode是vite的解析文件api需要的配置信息\r\n root: string,\r\n command: \"serve\" | \"build\",\r\n mode: \"production\" | \"development\"\r\n): Promise<SiteConfig> {\r\n // 组合并返回解析出来的网站信息\r\n const [configPath, userConfig] = await resolveUserConfig(command, mode, root);\r\n const siteConfig: SiteConfig = {\r\n root,\r\n configPath: configPath,\r\n siteData: resolveSiteData(userConfig as UserConfig),\r\n };\r\n return siteConfig;\r\n}\r\n\r\nexport function defineConfig(config: UserConfig): UserConfig {\r\n return config;\r\n}\r\n"],"mappings":";;;;;;AACA,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAEjB,IAAM,cAAc,MAAM,cAAc,YAAY,GAAG;AACvD,IAAM,aAAa,MAAM,KAAK,QAAQ,YAAY,CAAC;AAE5C,IAAM,YAA4B,2BAAW;;;ACPpD,SAAS,eAAe;AACxB,OAAO,QAAQ;AAGf,SAAS,0BAA0B;AAUnC,SAAS,cAAc,MAAc;AACnC,MAAI;AAEF,UAAM,oBAAoB,CAAC,aAAa,WAAW;AAGnD,UAAM,aAAa,kBAAkB,IAAI,CAAC,SAAS,QAAQ,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG,cAAc;AAC9F,WAAO;AAAA,EACT,SAAS,GAAP;AACA,YAAQ,IAAI,CAAC;AAAA,EACf;AACF;AAEA,eAAe,kBAAkB,SAAkB,MAAY,MAAc;AAE3E,QAAM,aAAa,cAAc,IAAI;AAErC,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,MAAI,KAAK;AACP,UAAM,EAAE,QAAQ,YAAY,CAAC,EAAe,IAAI;AAMhD,UAAM,aAAa,OAAO,OAAO,cAAc,aAAa,UAAU,IAAI;AAC1E,WAAO,CAAC,YAAY,UAAU;AAAA,EAChC,OAAO;AACL,WAAO,CAAC,YAAY,CAAC,CAAe;AAAA,EACtC;AACF;AAGO,SAAS,gBAAgB,YAAoC;AAClE,SAAO;AAAA,IACL,OAAO,WAAW,SAAS;AAAA,IAC3B,aAAa,WAAW,eAAe;AAAA,IACvC,aAAa,WAAW,eAAe,CAAC;AAAA,IACxC,MAAM,WAAW,QAAQ,CAAC;AAAA,EAC5B;AACF;AACA,eAAsB,cAEpB,MACA,SACA,MACqB;AAErB,QAAM,CAAC,YAAY,UAAU,IAAI,MAAM,kBAAkB,SAAS,MAAM,IAAI;AAC5E,QAAM,aAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,UAAU,gBAAgB,UAAwB;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,QAAgC;AAC3D,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../node_modules/.pnpm/tsup@6.6.2_typescript@4.9.5/node_modules/tsup/assets/esm_shims.js","../src/node/config.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { resolve } from \"path\";\r\nimport fs from \"fs-extra\";\r\n\r\n// vite内部的api,用来解析文件\r\nimport { loadConfigFromFile } from \"vite\";\r\nimport { UserConfig, SiteConfig } from \"../types/index\";\r\n\r\n// 定义command和mode的类型\r\ntype Command = \"build\" | \"serve\";\r\ntype Mode = \"development\" | \"production\";\r\n\r\n// 拿到的文件类型 对象、promise和返回对象或promise的函数\r\ntype RawConfig = UserConfig | Promise<UserConfig> | (() => UserConfig | Promise<UserConfig>);\r\n\r\nfunction getUserConfig(root: string) {\r\n try {\r\n // .js和.ts文件均可\r\n const supportConfigFile = [\"config.js\", \"config.ts\"];\r\n // 判断配置文件是否存在,如果存在就拿到并返回回去\r\n //\r\n const configPath = supportConfigFile.map((file) => resolve(root, file)).find(fs.pathExistsSync);\r\n return configPath;\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n}\r\n\r\nasync function resolveUserConfig(command: Command, mode: Mode, root: string) {\r\n // 1. 获取配置文件路径\r\n const configPath = getUserConfig(root);\r\n // 2. 解析配置文件\r\n const res = await loadConfigFromFile(\r\n {\r\n command,\r\n mode,\r\n },\r\n configPath\r\n );\r\n if (res) {\r\n const { config: ordConfig = {} as RawConfig } = res;\r\n // rawConfig有三种形式\r\n // 1. object对象形式\r\n // 2. promise形式\r\n // 3. function函数形式\r\n // 所以要对rawConfig做一个统一的规范化\r\n const userConfig = await (typeof ordConfig === \"function\" ? ordConfig() : ordConfig);\r\n return [configPath, userConfig] as const;\r\n } else {\r\n return [configPath, {} as UserConfig] as const;\r\n }\r\n}\r\n\r\n// 解析网站(用户信息)信息\r\nexport function resolveSiteData(userConfig: UserConfig): UserConfig {\r\n return {\r\n title: userConfig.title || \"vigor.js\",\r\n description: userConfig.description || \"A SSG framework.\",\r\n themeConfig: userConfig.themeConfig || {},\r\n icon: userConfig.icon || \"\",\r\n vite: userConfig.vite || {},\r\n };\r\n}\r\nexport async function resolveConfig(\r\n // command和mode是vite的解析文件api需要的配置信息\r\n root: string,\r\n command: \"serve\" | \"build\",\r\n mode: \"production\" | \"development\"\r\n): Promise<SiteConfig> {\r\n // 组合并返回解析出来的网站信息\r\n const [configPath, userConfig] = await resolveUserConfig(command, mode, root);\r\n const siteConfig: SiteConfig = {\r\n root,\r\n configPath: configPath,\r\n siteData: resolveSiteData(userConfig as UserConfig),\r\n };\r\n return siteConfig;\r\n}\r\n\r\nexport function defineConfig(config: UserConfig): UserConfig {\r\n return config;\r\n}\r\n"],"mappings":";;;;;;AACA,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAEjB,IAAM,cAAc,MAAM,cAAc,YAAY,GAAG;AACvD,IAAM,aAAa,MAAM,KAAK,QAAQ,YAAY,CAAC;AAE5C,IAAM,YAA4B,2BAAW;;;ACPpD,SAAS,eAAe;AACxB,OAAO,QAAQ;AAGf,SAAS,0BAA0B;AAUnC,SAAS,cAAc,MAAc;AACnC,MAAI;AAEF,UAAM,oBAAoB,CAAC,aAAa,WAAW;AAGnD,UAAM,aAAa,kBAAkB,IAAI,CAAC,SAAS,QAAQ,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG,cAAc;AAC9F,WAAO;AAAA,EACT,SAAS,GAAP;AACA,YAAQ,IAAI,CAAC;AAAA,EACf;AACF;AAEA,eAAe,kBAAkB,SAAkB,MAAY,MAAc;AAE3E,QAAM,aAAa,cAAc,IAAI;AAErC,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,MAAI,KAAK;AACP,UAAM,EAAE,QAAQ,YAAY,CAAC,EAAe,IAAI;AAMhD,UAAM,aAAa,OAAO,OAAO,cAAc,aAAa,UAAU,IAAI;AAC1E,WAAO,CAAC,YAAY,UAAU;AAAA,EAChC,OAAO;AACL,WAAO,CAAC,YAAY,CAAC,CAAe;AAAA,EACtC;AACF;AAGO,SAAS,gBAAgB,YAAoC;AAClE,SAAO;AAAA,IACL,OAAO,WAAW,SAAS;AAAA,IAC3B,aAAa,WAAW,eAAe;AAAA,IACvC,aAAa,WAAW,eAAe,CAAC;AAAA,IACxC,MAAM,WAAW,QAAQ;AAAA,IACzB,MAAM,WAAW,QAAQ,CAAC;AAAA,EAC5B;AACF;AACA,eAAsB,cAEpB,MACA,SACA,MACqB;AAErB,QAAM,CAAC,YAAY,UAAU,IAAI,MAAM,kBAAkB,SAAS,MAAM,IAAI;AAC5E,QAAM,aAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,UAAU,gBAAgB,UAAwB;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,QAAgC;AAC3D,SAAO;AACT;","names":[]}
package/dist/cli.js CHANGED
@@ -7,18 +7,18 @@
7
7
 
8
8
 
9
9
 
10
- var _chunkVWAM4ETQjs = require('./chunk-VWAM4ETQ.js');
10
+ var _chunkKA76MQEPjs = require('./chunk-KA76MQEP.js');
11
11
 
12
12
 
13
13
 
14
- var _chunkPB3TEDCEjs = require('./chunk-PB3TEDCE.js');
14
+ var _chunk6MH7TP7Pjs = require('./chunk-6MH7TP7P.js');
15
15
 
16
16
  // package.json
17
- var require_package = _chunkPB3TEDCEjs.__commonJS.call(void 0, {
17
+ var require_package = _chunk6MH7TP7Pjs.__commonJS.call(void 0, {
18
18
  "package.json"(exports, module) {
19
19
  module.exports = {
20
20
  name: "vigor-moon",
21
- version: "1.1.5",
21
+ version: "1.1.7",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
@@ -77,17 +77,10 @@ var require_package = _chunkPB3TEDCEjs.__commonJS.call(void 0, {
77
77
  enquirer: "^2.3.6",
78
78
  execa: "5.1.1",
79
79
  minimist: "^1.2.8",
80
- "rehype-stringify": "^9.0.3",
81
- "remark-parse": "^10.0.1",
82
- "remark-rehype": "^10.1.0",
83
- rollup: "^3.14.0",
84
80
  semver: "^7.5.0",
85
81
  tsup: "^6.6.2",
86
82
  tsx: "^3.12.3",
87
- typescript: "^4.9.5",
88
- unified: "^10.1.2",
89
- "unist-util-visit": "^4.1.2",
90
- vitest: "^0.28.4"
83
+ typescript: "^4.9.5"
91
84
  },
92
85
  dependencies: {
93
86
  "@loadable/component": "^5.15.3",
@@ -122,7 +115,18 @@ var require_package = _chunkPB3TEDCEjs.__commonJS.call(void 0, {
122
115
  shiki: "^0.14.1",
123
116
  sirv: "^2.0.2",
124
117
  unocss: "^0.50.4",
125
- vite: "^4.1.1"
118
+ vite: "^4.1.1",
119
+ "@unocss/preset-attributify": "0.45.26",
120
+ "@unocss/preset-icons": "0.45.29",
121
+ "@unocss/preset-wind": "0.45.26",
122
+ "@unocss/vite": "0.45.26",
123
+ "rehype-stringify": "^9.0.3",
124
+ "remark-parse": "^10.0.1",
125
+ "remark-rehype": "^10.1.0",
126
+ rollup: "^3.14.0",
127
+ unified: "^10.1.2",
128
+ "unist-util-visit": "^4.1.2",
129
+ vitest: "^0.28.4"
126
130
  }
127
131
  };
128
132
  }
@@ -144,14 +148,14 @@ async function bundle(root, config) {
144
148
  mode: "production",
145
149
  root,
146
150
  plugins: [
147
- _vite4.default.call(void 0, _chunkVWAM4ETQjs.unocssOptions_default),
148
- _chunkVWAM4ETQjs.pluginIndexHtml.call(void 0, ),
151
+ _vite4.default.call(void 0, _chunkKA76MQEPjs.unocssOptions_default),
152
+ _chunkKA76MQEPjs.pluginIndexHtml.call(void 0, ),
149
153
  _pluginreact2.default.call(void 0, { jsxRuntime: "automatic", jsxImportSource: "react" }),
150
- _chunkVWAM4ETQjs.pluginConfig.call(void 0, config),
154
+ _chunkKA76MQEPjs.pluginConfig.call(void 0, config),
151
155
  // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样
152
156
  // 所以添加了一个参数,直接让其和isServer相同
153
- _chunkVWAM4ETQjs.pluginRoutes.call(void 0, { root: config.root, isSSR }),
154
- await _chunkVWAM4ETQjs.pluginMdx.call(void 0, )
157
+ _chunkKA76MQEPjs.pluginRoutes.call(void 0, { root: config.root, isSSR }),
158
+ await _chunkKA76MQEPjs.pluginMdx.call(void 0, )
155
159
  ],
156
160
  // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了
157
161
  ssr: {
@@ -162,7 +166,7 @@ async function bundle(root, config) {
162
166
  ssr: isServer,
163
167
  outDir: isServer ? _path2.default.join(root, ".temp") : _path2.default.join(root, CLIENT_OUTPUT),
164
168
  rollupOptions: {
165
- input: isServer ? _chunkVWAM4ETQjs.SERVER_ENTRY_PATH : _chunkVWAM4ETQjs.CLIENT_ENTRY_PATH,
169
+ input: isServer ? _chunkKA76MQEPjs.SERVER_ENTRY_PATH : _chunkKA76MQEPjs.CLIENT_ENTRY_PATH,
166
170
  output: {
167
171
  format: isServer ? "cjs" : "esm"
168
172
  }
@@ -186,7 +190,7 @@ async function bundle(root, config) {
186
190
  console.log(error);
187
191
  }
188
192
  }
189
- async function renderPage(render, root, clientBundle, routes) {
193
+ async function renderPage(render, root, clientBundle, routes, config) {
190
194
  const clientChunk = clientBundle.output.find((chunk) => chunk.type === "chunk" && chunk.isEntry);
191
195
  console.log("Rendering page in server side...");
192
196
  const helmetContext = {
@@ -204,6 +208,8 @@ async function renderPage(render, root, clientBundle, routes) {
204
208
  const styleAssets = clientBundle.output.filter(
205
209
  (chunk) => chunk.type === "asset" && chunk.fileName.endsWith(".css")
206
210
  );
211
+ const titleIcon = _optionalChain([config, 'access', _ => _.siteData, 'optionalAccess', _2 => _2.icon]);
212
+ const description = _optionalChain([config, 'access', _3 => _3.siteData, 'optionalAccess', _4 => _4.description]);
207
213
  const { helmet } = helmetContext.context;
208
214
  const html = `
209
215
  <!DOCTYPE html>
@@ -212,16 +218,17 @@ async function renderPage(render, root, clientBundle, routes) {
212
218
  <meta charset="UTF-8">
213
219
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
214
220
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
215
- ${_optionalChain([helmet, 'optionalAccess', _ => _.title, 'optionalAccess', _2 => _2.toString, 'call', _3 => _3()]) || ""}
216
- ${_optionalChain([helmet, 'optionalAccess', _4 => _4.meta, 'optionalAccess', _5 => _5.toString, 'call', _6 => _6()]) || ""}
217
- ${_optionalChain([helmet, 'optionalAccess', _7 => _7.link, 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]) || ""}
218
- ${_optionalChain([helmet, 'optionalAccess', _10 => _10.style, 'optionalAccess', _11 => _11.toString, 'call', _12 => _12()]) || ""}
219
- <meta name="description" content="xxx">
221
+ <link rel="icon" href="${titleIcon}" type="image/svg+xml"></link>
222
+ ${_optionalChain([helmet, 'optionalAccess', _5 => _5.title, 'optionalAccess', _6 => _6.toString, 'call', _7 => _7()]) || ""}
223
+ ${_optionalChain([helmet, 'optionalAccess', _8 => _8.meta, 'optionalAccess', _9 => _9.toString, 'call', _10 => _10()]) || ""}
224
+ ${_optionalChain([helmet, 'optionalAccess', _11 => _11.link, 'optionalAccess', _12 => _12.toString, 'call', _13 => _13()]) || ""}
225
+ ${_optionalChain([helmet, 'optionalAccess', _14 => _14.style, 'optionalAccess', _15 => _15.toString, 'call', _16 => _16()]) || ""}
226
+ <meta name="description" content="${description}">
220
227
  ${styleAssets.map((item) => `<link rel="stylesheet" href="/${item.fileName}">`).join("\n")}
221
228
  </head>
222
229
  <body>
223
230
  <div id="root">${appHtml}</div>
224
- <script src="/${_optionalChain([clientChunk, 'optionalAccess', _13 => _13.fileName])}" type="module"></script>
231
+ <script src="/${_optionalChain([clientChunk, 'optionalAccess', _17 => _17.fileName])}" type="module"></script>
225
232
  </body>
226
233
  </html>
227
234
  `.trim();
@@ -237,7 +244,7 @@ async function build(root = process.cwd(), config) {
237
244
  const serverEntryPath = _path.join.call(void 0, root, ".temp", "ssr-entry.js");
238
245
  const { render, routes } = await Promise.resolve().then(() => require(_url.pathToFileURL.call(void 0, serverEntryPath).toString()));
239
246
  try {
240
- await renderPage(render, root, clientBundle, routes);
247
+ await renderPage(render, root, clientBundle, routes, config);
241
248
  } catch (e) {
242
249
  console.log("Render is error\n", e);
243
250
  }
@@ -251,7 +258,7 @@ var _sirv = require('sirv'); var _sirv2 = _interopRequireDefault(_sirv);
251
258
  var _polka = require('polka'); var _polka2 = _interopRequireDefault(_polka);
252
259
  var DEFAULT_SERVER_PORT = 9999;
253
260
  async function preview(root, { port }) {
254
- const config = await _chunkPB3TEDCEjs.resolveConfig.call(void 0, root, "serve", "production");
261
+ const config = await _chunk6MH7TP7Pjs.resolveConfig.call(void 0, root, "serve", "production");
255
262
  const listenPort = _nullishCoalesce(port, () => ( DEFAULT_SERVER_PORT));
256
263
  const outputDir = _path2.default.resolve(root, "build");
257
264
  const notFoundPage = _fsextra2.default.readFileSync(_path2.default.resolve(outputDir, "404.html"), "utf8");
@@ -286,7 +293,7 @@ var cli = _cac.cac.call(void 0, "vigor").version(version).help();
286
293
  cli.command("[root]", "start dev server").alias("dev").action(async (root) => {
287
294
  try {
288
295
  root = root ? _path.resolve.call(void 0, root) : process.cwd();
289
- const server = await _chunkVWAM4ETQjs.createDevServer.call(void 0, root);
296
+ const server = await _chunkKA76MQEPjs.createDevServer.call(void 0, root);
290
297
  await server.listen();
291
298
  server.printUrls();
292
299
  } catch (error) {
@@ -296,7 +303,7 @@ cli.command("[root]", "start dev server").alias("dev").action(async (root) => {
296
303
  cli.command("build [root]", "build in production").action(async (root) => {
297
304
  try {
298
305
  root = _path.resolve.call(void 0, root);
299
- const config = await _chunkPB3TEDCEjs.resolveConfig.call(void 0, root, "build", "production");
306
+ const config = await _chunk6MH7TP7Pjs.resolveConfig.call(void 0, root, "build", "production");
300
307
  await build(root, config);
301
308
  } catch (error) {
302
309
  console.log(error);
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.5\",\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.7\",\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 \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\"\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 \"@unocss/preset-attributify\": \"0.45.26\",\n \"@unocss/preset-icons\": \"0.45.29\",\n \"@unocss/preset-wind\": \"0.45.26\",\n \"@unocss/vite\": \"0.45.26\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\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 config: SiteConfig\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 titleIcon = config.siteData?.icon;\r\n const description = config.siteData?.description;\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 <link rel=\"icon\" href=\"${titleIcon}\" type=\"image/svg+xml\"></link>\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=\"${description}\">\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, config);\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
@@ -7,18 +7,18 @@ import {
7
7
  pluginMdx,
8
8
  pluginRoutes,
9
9
  unocssOptions_default
10
- } from "./chunk-SRULMBNH.mjs";
10
+ } from "./chunk-4MIAR4M4.mjs";
11
11
  import {
12
12
  __commonJS,
13
13
  resolveConfig
14
- } from "./chunk-6TVEHJR5.mjs";
14
+ } from "./chunk-LDLUO4RY.mjs";
15
15
 
16
16
  // package.json
17
17
  var require_package = __commonJS({
18
18
  "package.json"(exports, module) {
19
19
  module.exports = {
20
20
  name: "vigor-moon",
21
- version: "1.1.5",
21
+ version: "1.1.7",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
@@ -77,17 +77,10 @@ var require_package = __commonJS({
77
77
  enquirer: "^2.3.6",
78
78
  execa: "5.1.1",
79
79
  minimist: "^1.2.8",
80
- "rehype-stringify": "^9.0.3",
81
- "remark-parse": "^10.0.1",
82
- "remark-rehype": "^10.1.0",
83
- rollup: "^3.14.0",
84
80
  semver: "^7.5.0",
85
81
  tsup: "^6.6.2",
86
82
  tsx: "^3.12.3",
87
- typescript: "^4.9.5",
88
- unified: "^10.1.2",
89
- "unist-util-visit": "^4.1.2",
90
- vitest: "^0.28.4"
83
+ typescript: "^4.9.5"
91
84
  },
92
85
  dependencies: {
93
86
  "@loadable/component": "^5.15.3",
@@ -122,7 +115,18 @@ var require_package = __commonJS({
122
115
  shiki: "^0.14.1",
123
116
  sirv: "^2.0.2",
124
117
  unocss: "^0.50.4",
125
- vite: "^4.1.1"
118
+ vite: "^4.1.1",
119
+ "@unocss/preset-attributify": "0.45.26",
120
+ "@unocss/preset-icons": "0.45.29",
121
+ "@unocss/preset-wind": "0.45.26",
122
+ "@unocss/vite": "0.45.26",
123
+ "rehype-stringify": "^9.0.3",
124
+ "remark-parse": "^10.0.1",
125
+ "remark-rehype": "^10.1.0",
126
+ rollup: "^3.14.0",
127
+ unified: "^10.1.2",
128
+ "unist-util-visit": "^4.1.2",
129
+ vitest: "^0.28.4"
126
130
  }
127
131
  };
128
132
  }
@@ -186,7 +190,7 @@ async function bundle(root, config) {
186
190
  console.log(error);
187
191
  }
188
192
  }
189
- async function renderPage(render, root, clientBundle, routes) {
193
+ async function renderPage(render, root, clientBundle, routes, config) {
190
194
  const clientChunk = clientBundle.output.find((chunk) => chunk.type === "chunk" && chunk.isEntry);
191
195
  console.log("Rendering page in server side...");
192
196
  const helmetContext = {
@@ -204,6 +208,8 @@ async function renderPage(render, root, clientBundle, routes) {
204
208
  const styleAssets = clientBundle.output.filter(
205
209
  (chunk) => chunk.type === "asset" && chunk.fileName.endsWith(".css")
206
210
  );
211
+ const titleIcon = config.siteData?.icon;
212
+ const description = config.siteData?.description;
207
213
  const { helmet } = helmetContext.context;
208
214
  const html = `
209
215
  <!DOCTYPE html>
@@ -212,11 +218,12 @@ async function renderPage(render, root, clientBundle, routes) {
212
218
  <meta charset="UTF-8">
213
219
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
214
220
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
221
+ <link rel="icon" href="${titleIcon}" type="image/svg+xml"></link>
215
222
  ${helmet?.title?.toString() || ""}
216
223
  ${helmet?.meta?.toString() || ""}
217
224
  ${helmet?.link?.toString() || ""}
218
225
  ${helmet?.style?.toString() || ""}
219
- <meta name="description" content="xxx">
226
+ <meta name="description" content="${description}">
220
227
  ${styleAssets.map((item) => `<link rel="stylesheet" href="/${item.fileName}">`).join("\n")}
221
228
  </head>
222
229
  <body>
@@ -237,7 +244,7 @@ async function build(root = process.cwd(), config) {
237
244
  const serverEntryPath = join(root, ".temp", "ssr-entry.js");
238
245
  const { render, routes } = await import(pathToFileURL(serverEntryPath).toString());
239
246
  try {
240
- await renderPage(render, root, clientBundle, routes);
247
+ await renderPage(render, root, clientBundle, routes, config);
241
248
  } catch (e) {
242
249
  console.log("Render is error\n", e);
243
250
  }
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.5\",\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.7\",\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 \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\"\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 \"@unocss/preset-attributify\": \"0.45.26\",\n \"@unocss/preset-icons\": \"0.45.29\",\n \"@unocss/preset-wind\": \"0.45.26\",\n \"@unocss/vite\": \"0.45.26\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\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 config: SiteConfig\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 titleIcon = config.siteData?.icon;\r\n const description = config.siteData?.description;\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 <link rel=\"icon\" href=\"${titleIcon}\" type=\"image/svg+xml\"></link>\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=\"${description}\">\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, config);\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"]}
package/dist/dev.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkVWAM4ETQjs = require('./chunk-VWAM4ETQ.js');
4
- require('./chunk-PB3TEDCE.js');
3
+ var _chunkKA76MQEPjs = require('./chunk-KA76MQEP.js');
4
+ require('./chunk-6MH7TP7P.js');
5
5
 
6
6
 
7
- exports.createDevServer = _chunkVWAM4ETQjs.createDevServer;
7
+ exports.createDevServer = _chunkKA76MQEPjs.createDevServer;
8
8
  //# sourceMappingURL=dev.js.map
package/dist/dev.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createDevServer
3
- } from "./chunk-SRULMBNH.mjs";
4
- import "./chunk-6TVEHJR5.mjs";
3
+ } from "./chunk-4MIAR4M4.mjs";
4
+ import "./chunk-LDLUO4RY.mjs";
5
5
  export {
6
6
  createDevServer
7
7
  };
package/dist/index.d.ts CHANGED
@@ -31,6 +31,7 @@ interface ThemeConfig {
31
31
  interface UserConfig {
32
32
  title?: string;
33
33
  description?: string;
34
+ icon?: string;
34
35
  themeConfig?: ThemeConfig;
35
36
  vite?: UserConfig$1;
36
37
  }
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkPB3TEDCEjs = require('./chunk-PB3TEDCE.js');
3
+ var _chunk6MH7TP7Pjs = require('./chunk-6MH7TP7P.js');
4
4
 
5
5
 
6
- exports.defineConfig = _chunkPB3TEDCEjs.defineConfig;
6
+ exports.defineConfig = _chunk6MH7TP7Pjs.defineConfig;
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineConfig
3
- } from "./chunk-6TVEHJR5.mjs";
3
+ } from "./chunk-LDLUO4RY.mjs";
4
4
  export {
5
5
  defineConfig
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vigor-moon",
3
- "version": "1.1.5",
3
+ "version": "1.1.7",
4
4
  "packageManager": "pnpm@7.9.2",
5
5
  "description": "SSG framework",
6
6
  "main": "dist/index.js",
@@ -49,17 +49,10 @@
49
49
  "enquirer": "^2.3.6",
50
50
  "execa": "5.1.1",
51
51
  "minimist": "^1.2.8",
52
- "rehype-stringify": "^9.0.3",
53
- "remark-parse": "^10.0.1",
54
- "remark-rehype": "^10.1.0",
55
- "rollup": "^3.14.0",
56
52
  "semver": "^7.5.0",
57
53
  "tsup": "^6.6.2",
58
54
  "tsx": "^3.12.3",
59
- "typescript": "^4.9.5",
60
- "unified": "^10.1.2",
61
- "unist-util-visit": "^4.1.2",
62
- "vitest": "^0.28.4"
55
+ "typescript": "^4.9.5"
63
56
  },
64
57
  "dependencies": {
65
58
  "@loadable/component": "^5.15.3",
@@ -94,7 +87,18 @@
94
87
  "shiki": "^0.14.1",
95
88
  "sirv": "^2.0.2",
96
89
  "unocss": "^0.50.4",
97
- "vite": "^4.1.1"
90
+ "vite": "^4.1.1",
91
+ "@unocss/preset-attributify": "0.45.26",
92
+ "@unocss/preset-icons": "0.45.29",
93
+ "@unocss/preset-wind": "0.45.26",
94
+ "@unocss/vite": "0.45.26",
95
+ "rehype-stringify": "^9.0.3",
96
+ "remark-parse": "^10.0.1",
97
+ "remark-rehype": "^10.1.0",
98
+ "rollup": "^3.14.0",
99
+ "unified": "^10.1.2",
100
+ "unist-util-visit": "^4.1.2",
101
+ "vitest": "^0.28.4"
98
102
  },
99
103
  "scripts": {
100
104
  "start": "tsup --watch --format=cjs,esm",