vigor-moon 1.1.6 → 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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  __dirname,
3
3
  resolveConfig
4
- } from "./chunk-6TVEHJR5.mjs";
4
+ } from "./chunk-LDLUO4RY.mjs";
5
5
 
6
6
  // src/node/dev.ts
7
7
  import { createServer as createViteDevServer } from "vite";
@@ -432,4 +432,4 @@ export {
432
432
  unocssOptions_default,
433
433
  createDevServer
434
434
  };
435
- //# sourceMappingURL=chunk-J3CR5P37.mjs.map
435
+ //# sourceMappingURL=chunk-4MIAR4M4.mjs.map
@@ -38,6 +38,7 @@ function resolveSiteData(userConfig) {
38
38
  title: userConfig.title || "vigor.js",
39
39
  description: userConfig.description || "A SSG framework.",
40
40
  themeConfig: userConfig.themeConfig || {},
41
+ icon: userConfig.icon || "",
41
42
  vite: userConfig.vite || {}
42
43
  };
43
44
  }
@@ -59,4 +60,4 @@ function defineConfig(config) {
59
60
 
60
61
 
61
62
  exports.__commonJS = __commonJS; exports.resolveConfig = resolveConfig; exports.defineConfig = defineConfig;
62
- //# sourceMappingURL=chunk-PB3TEDCE.js.map
63
+ //# sourceMappingURL=chunk-6MH7TP7P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/node/config.ts"],"names":[],"mappings":";;;;;;AAAA,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","sourcesContent":["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"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkPB3TEDCEjs = require('./chunk-PB3TEDCE.js');
3
+ var _chunk6MH7TP7Pjs = require('./chunk-6MH7TP7P.js');
4
4
 
5
5
  // src/node/dev.ts
6
6
  var _vite = require('vite');
@@ -400,7 +400,7 @@ var unocssOptions_default = options;
400
400
 
401
401
  // src/node/dev.ts
402
402
  async function createDevServer(root, isSSR = false) {
403
- const config = await _chunkPB3TEDCEjs.resolveConfig.call(void 0, root, "serve", "development");
403
+ const config = await _chunk6MH7TP7Pjs.resolveConfig.call(void 0, root, "serve", "development");
404
404
  return _vite.createServer.call(void 0, {
405
405
  root: PACKAGE_ROOT,
406
406
  // 插件注册
@@ -431,4 +431,4 @@ async function createDevServer(root, isSSR = false) {
431
431
 
432
432
 
433
433
  exports.CLIENT_ENTRY_PATH = CLIENT_ENTRY_PATH; exports.SERVER_ENTRY_PATH = SERVER_ENTRY_PATH; exports.pluginIndexHtml = pluginIndexHtml; exports.pluginConfig = pluginConfig; exports.pluginMdx = pluginMdx2; exports.pluginRoutes = pluginRoutes; exports.unocssOptions_default = unocssOptions_default; exports.createDevServer = createDevServer;
434
- //# sourceMappingURL=chunk-U5FDKMMF.js.map
434
+ //# sourceMappingURL=chunk-KA76MQEP.js.map
@@ -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 _chunkU5FDKMMFjs = require('./chunk-U5FDKMMF.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.6",
21
+ version: "1.1.7",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
@@ -148,14 +148,14 @@ async function bundle(root, config) {
148
148
  mode: "production",
149
149
  root,
150
150
  plugins: [
151
- _vite4.default.call(void 0, _chunkU5FDKMMFjs.unocssOptions_default),
152
- _chunkU5FDKMMFjs.pluginIndexHtml.call(void 0, ),
151
+ _vite4.default.call(void 0, _chunkKA76MQEPjs.unocssOptions_default),
152
+ _chunkKA76MQEPjs.pluginIndexHtml.call(void 0, ),
153
153
  _pluginreact2.default.call(void 0, { jsxRuntime: "automatic", jsxImportSource: "react" }),
154
- _chunkU5FDKMMFjs.pluginConfig.call(void 0, config),
154
+ _chunkKA76MQEPjs.pluginConfig.call(void 0, config),
155
155
  // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样
156
156
  // 所以添加了一个参数,直接让其和isServer相同
157
- _chunkU5FDKMMFjs.pluginRoutes.call(void 0, { root: config.root, isSSR }),
158
- await _chunkU5FDKMMFjs.pluginMdx.call(void 0, )
157
+ _chunkKA76MQEPjs.pluginRoutes.call(void 0, { root: config.root, isSSR }),
158
+ await _chunkKA76MQEPjs.pluginMdx.call(void 0, )
159
159
  ],
160
160
  // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了
161
161
  ssr: {
@@ -166,7 +166,7 @@ async function bundle(root, config) {
166
166
  ssr: isServer,
167
167
  outDir: isServer ? _path2.default.join(root, ".temp") : _path2.default.join(root, CLIENT_OUTPUT),
168
168
  rollupOptions: {
169
- input: isServer ? _chunkU5FDKMMFjs.SERVER_ENTRY_PATH : _chunkU5FDKMMFjs.CLIENT_ENTRY_PATH,
169
+ input: isServer ? _chunkKA76MQEPjs.SERVER_ENTRY_PATH : _chunkKA76MQEPjs.CLIENT_ENTRY_PATH,
170
170
  output: {
171
171
  format: isServer ? "cjs" : "esm"
172
172
  }
@@ -190,7 +190,7 @@ async function bundle(root, config) {
190
190
  console.log(error);
191
191
  }
192
192
  }
193
- async function renderPage(render, root, clientBundle, routes) {
193
+ async function renderPage(render, root, clientBundle, routes, config) {
194
194
  const clientChunk = clientBundle.output.find((chunk) => chunk.type === "chunk" && chunk.isEntry);
195
195
  console.log("Rendering page in server side...");
196
196
  const helmetContext = {
@@ -208,6 +208,8 @@ async function renderPage(render, root, clientBundle, routes) {
208
208
  const styleAssets = clientBundle.output.filter(
209
209
  (chunk) => chunk.type === "asset" && chunk.fileName.endsWith(".css")
210
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]);
211
213
  const { helmet } = helmetContext.context;
212
214
  const html = `
213
215
  <!DOCTYPE html>
@@ -216,16 +218,17 @@ async function renderPage(render, root, clientBundle, routes) {
216
218
  <meta charset="UTF-8">
217
219
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
218
220
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
219
- ${_optionalChain([helmet, 'optionalAccess', _ => _.title, 'optionalAccess', _2 => _2.toString, 'call', _3 => _3()]) || ""}
220
- ${_optionalChain([helmet, 'optionalAccess', _4 => _4.meta, 'optionalAccess', _5 => _5.toString, 'call', _6 => _6()]) || ""}
221
- ${_optionalChain([helmet, 'optionalAccess', _7 => _7.link, 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]) || ""}
222
- ${_optionalChain([helmet, 'optionalAccess', _10 => _10.style, 'optionalAccess', _11 => _11.toString, 'call', _12 => _12()]) || ""}
223
- <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}">
224
227
  ${styleAssets.map((item) => `<link rel="stylesheet" href="/${item.fileName}">`).join("\n")}
225
228
  </head>
226
229
  <body>
227
230
  <div id="root">${appHtml}</div>
228
- <script src="/${_optionalChain([clientChunk, 'optionalAccess', _13 => _13.fileName])}" type="module"></script>
231
+ <script src="/${_optionalChain([clientChunk, 'optionalAccess', _17 => _17.fileName])}" type="module"></script>
229
232
  </body>
230
233
  </html>
231
234
  `.trim();
@@ -241,7 +244,7 @@ async function build(root = process.cwd(), config) {
241
244
  const serverEntryPath = _path.join.call(void 0, root, ".temp", "ssr-entry.js");
242
245
  const { render, routes } = await Promise.resolve().then(() => require(_url.pathToFileURL.call(void 0, serverEntryPath).toString()));
243
246
  try {
244
- await renderPage(render, root, clientBundle, routes);
247
+ await renderPage(render, root, clientBundle, routes, config);
245
248
  } catch (e) {
246
249
  console.log("Render is error\n", e);
247
250
  }
@@ -255,7 +258,7 @@ var _sirv = require('sirv'); var _sirv2 = _interopRequireDefault(_sirv);
255
258
  var _polka = require('polka'); var _polka2 = _interopRequireDefault(_polka);
256
259
  var DEFAULT_SERVER_PORT = 9999;
257
260
  async function preview(root, { port }) {
258
- const config = await _chunkPB3TEDCEjs.resolveConfig.call(void 0, root, "serve", "production");
261
+ const config = await _chunk6MH7TP7Pjs.resolveConfig.call(void 0, root, "serve", "production");
259
262
  const listenPort = _nullishCoalesce(port, () => ( DEFAULT_SERVER_PORT));
260
263
  const outputDir = _path2.default.resolve(root, "build");
261
264
  const notFoundPage = _fsextra2.default.readFileSync(_path2.default.resolve(outputDir, "404.html"), "utf8");
@@ -290,7 +293,7 @@ var cli = _cac.cac.call(void 0, "vigor").version(version).help();
290
293
  cli.command("[root]", "start dev server").alias("dev").action(async (root) => {
291
294
  try {
292
295
  root = root ? _path.resolve.call(void 0, root) : process.cwd();
293
- const server = await _chunkU5FDKMMFjs.createDevServer.call(void 0, root);
296
+ const server = await _chunkKA76MQEPjs.createDevServer.call(void 0, root);
294
297
  await server.listen();
295
298
  server.printUrls();
296
299
  } catch (error) {
@@ -300,7 +303,7 @@ cli.command("[root]", "start dev server").alias("dev").action(async (root) => {
300
303
  cli.command("build [root]", "build in production").action(async (root) => {
301
304
  try {
302
305
  root = _path.resolve.call(void 0, root);
303
- const config = await _chunkPB3TEDCEjs.resolveConfig.call(void 0, root, "build", "production");
306
+ const config = await _chunk6MH7TP7Pjs.resolveConfig.call(void 0, root, "build", "production");
304
307
  await build(root, config);
305
308
  } catch (error) {
306
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.6\",\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) {\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":";;;;;;;;;;;;;;;;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,QAAU;AAAA,QACV,MAAQ;AAAA,QACR,KAAO;AAAA,QACP,YAAc;AAAA,MAChB;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,QACR,8BAA8B;AAAA,QAC9B,wBAAwB;AAAA,QACxB,uBAAuB;AAAA,QACvB,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,QAAU;AAAA,QACV,SAAW;AAAA,QACX,oBAAoB;AAAA,QACpB,QAAU;AAAA,MACZ;AAAA,IACF;AAAA;AAAA;;;AChHA,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,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,YAAY,OAAO,UAAU;AACnC,YAAM,cAAc,OAAO,UAAU;AACrC,YAAM,EAAE,OAAO,IAAI,cAAc;AACjC,YAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAOc;AAAA,UACvB,QAAQ,OAAO,SAAS,KAAK;AAAA,UAC7B,QAAQ,MAAM,SAAS,KAAK;AAAA,UAC5B,QAAQ,MAAM,SAAS,KAAK;AAAA,UAC5B,QAAQ,OAAO,SAAS,KAAK;AAAA,4CACK;AAAA,UAClC,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,QAAQ,MAAM;AAAA,EAC7D,SAAS,GAAP;AACA,YAAQ,IAAI,qBAAqB,CAAC;AAAA,EACpC;AACF;;;AC3KA,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","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-J3CR5P37.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.6",
21
+ version: "1.1.7",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
@@ -190,7 +190,7 @@ async function bundle(root, config) {
190
190
  console.log(error);
191
191
  }
192
192
  }
193
- async function renderPage(render, root, clientBundle, routes) {
193
+ async function renderPage(render, root, clientBundle, routes, config) {
194
194
  const clientChunk = clientBundle.output.find((chunk) => chunk.type === "chunk" && chunk.isEntry);
195
195
  console.log("Rendering page in server side...");
196
196
  const helmetContext = {
@@ -208,6 +208,8 @@ async function renderPage(render, root, clientBundle, routes) {
208
208
  const styleAssets = clientBundle.output.filter(
209
209
  (chunk) => chunk.type === "asset" && chunk.fileName.endsWith(".css")
210
210
  );
211
+ const titleIcon = config.siteData?.icon;
212
+ const description = config.siteData?.description;
211
213
  const { helmet } = helmetContext.context;
212
214
  const html = `
213
215
  <!DOCTYPE html>
@@ -216,11 +218,12 @@ async function renderPage(render, root, clientBundle, routes) {
216
218
  <meta charset="UTF-8">
217
219
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
218
220
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
221
+ <link rel="icon" href="${titleIcon}" type="image/svg+xml"></link>
219
222
  ${helmet?.title?.toString() || ""}
220
223
  ${helmet?.meta?.toString() || ""}
221
224
  ${helmet?.link?.toString() || ""}
222
225
  ${helmet?.style?.toString() || ""}
223
- <meta name="description" content="xxx">
226
+ <meta name="description" content="${description}">
224
227
  ${styleAssets.map((item) => `<link rel="stylesheet" href="/${item.fileName}">`).join("\n")}
225
228
  </head>
226
229
  <body>
@@ -241,7 +244,7 @@ async function build(root = process.cwd(), config) {
241
244
  const serverEntryPath = join(root, ".temp", "ssr-entry.js");
242
245
  const { render, routes } = await import(pathToFileURL(serverEntryPath).toString());
243
246
  try {
244
- await renderPage(render, root, clientBundle, routes);
247
+ await renderPage(render, root, clientBundle, routes, config);
245
248
  } catch (e) {
246
249
  console.log("Render is error\n", e);
247
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.6\",\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) {\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,QAAU;AAAA,QACV,MAAQ;AAAA,QACR,KAAO;AAAA,QACP,YAAc;AAAA,MAChB;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,QACR,8BAA8B;AAAA,QAC9B,wBAAwB;AAAA,QACxB,uBAAuB;AAAA,QACvB,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,QAAU;AAAA,QACV,SAAW;AAAA,QACX,oBAAoB;AAAA,QACpB,QAAU;AAAA,MACZ;AAAA,IACF;AAAA;AAAA;;;AChHA,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"]}
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 _chunkU5FDKMMFjs = require('./chunk-U5FDKMMF.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 = _chunkU5FDKMMFjs.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-J3CR5P37.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.6",
3
+ "version": "1.1.7",
4
4
  "packageManager": "pnpm@7.9.2",
5
5
  "description": "SSG framework",
6
6
  "main": "dist/index.js",
@@ -27,10 +27,16 @@
27
27
 
28
28
  .button.brand {
29
29
  background-color: var(--vigor-bg-brand);
30
+ &:hover {
31
+ background-color: var(--vigor-bg-brand-hover);
32
+ }
30
33
  }
31
34
 
32
35
  .button.alt {
33
36
  background-color: var(--vigor-bg-alt);
34
- opacity: 70%
37
+ opacity: 70%;
38
+ &:hover {
39
+ background-color: var(--vigor-bg-alt-hover);
40
+ }
35
41
  }
36
42
 
@@ -1,7 +1,7 @@
1
- .link:hover {
2
- color: var(--vigor-link-onfocus);
3
- transition: color 0.2s;
4
- }
1
+ // .link:hover {
2
+ // color: var(--vigor-link-onfocus);
3
+ // transition: color 0.2s;
4
+ // }
5
5
 
6
6
  .link {
7
7
  display: block;
@@ -18,7 +18,14 @@
18
18
  color: var(--vigor-c-black);
19
19
  }
20
20
  }
21
-
22
21
  .bg-color {
23
- background-color: var(--vigor-c-bg-main);
22
+ -webkit-backdrop-filter: saturate(50%) blur(8px);
23
+ backdrop-filter: saturate(50%) blur(8px);
24
24
  }
25
+
26
+ @supports not (backdrop-filter: saturate(50%) blur(8px)) {
27
+ .bg-color {
28
+ background: rgba(255, 255, 255, 0.95);
29
+ }
30
+ }
31
+
@@ -19,4 +19,9 @@
19
19
  .item {
20
20
  opacity: 70%;
21
21
  color: var(--vigor-c-text-main);
22
+ }
23
+
24
+ nav section a:hover {
25
+ color: var(--vigor-link-onfocus);
26
+ transition: color 0.2s;
22
27
  }
@@ -2,6 +2,6 @@
2
2
  color: var(--vigor-c-text-main);
3
3
  &:hover {
4
4
  color: var(--vigor-toc-hover);
5
- font-weight: 650;
5
+ opacity: 100%;
6
6
  }
7
7
  }
@@ -42,7 +42,7 @@ export function TocComponent(props: TocType) {
42
42
  <div>
43
43
  {
44
44
  tocLength && (
45
- <div id="toc-container" className="relative divider-left pl-4 text-13px font-medium">
45
+ <div id="toc-container" className="fixed divider-left pl-4 text-13px font-medium">
46
46
  <div
47
47
  ref={markRef}
48
48
  id="toc-maker" >
@@ -12,6 +12,8 @@
12
12
 
13
13
  --vigor-c-light-blue: #00a8ff;
14
14
  --vigor-c-blue: #0097e6;
15
+ --vigor-c-secondary-blue: #8bd3dd;
16
+ --vigor-c-tertiary-blue: #bae8e8;
15
17
 
16
18
  --vigor-c-light-purple: #9c88ff;
17
19
  --vigor-c-purple: #8c7ae6;
@@ -33,6 +35,7 @@
33
35
  --vigor-c-light-grey: #dcdde1;
34
36
  --vigor-c-grey: #7f8fa6;
35
37
  --vigor-c-deep-grey: #718093;
38
+ --vigor-c-secondary-grey: #a7a7bb;
36
39
 
37
40
  --vigor-c-mazaline-blue: #273c75;
38
41
  --vigor-c-pico-void-blue: #192a56;
@@ -64,12 +67,14 @@
64
67
  --vigor-c-icon-bg: var(--vigor-c-swan-white);
65
68
 
66
69
  /* 按钮brand主题配色 */
67
- --vigor-bg-brand: var(--vigor-c-purple);
68
- --vigor-bg-alt: var(--vigor-c-deep-grey);
70
+ --vigor-bg-brand: var(--vigor-c-secondary-blue);
69
71
  --vigor-bg-brand-light: var(--vigor-c-azure-light);
70
72
  --vigor-text-brand: var(--vigor-c-azure);
73
+ --vigor-bg-brand-hover: var(--vigor-c-tertiary-blue);
71
74
  /* 按钮alt主题配色 */
72
75
  --vigor-c-alt: var(--vigor-c-deep-grey);
76
+ --vigor-bg-alt: var(--vigor-c-deep-grey);
77
+ --vigor-bg-alt-hover: var(--vigor-c-secondary-grey);
73
78
 
74
79
  /* 标题配色 */
75
80
  --vigor-c-title: var(--vigor-c-progress-pink-blue);
@@ -40,6 +40,7 @@ export interface ThemeConfig {
40
40
  export interface UserConfig {
41
41
  title?: string;
42
42
  description?: string;
43
+ icon?: string;
43
44
  themeConfig?: ThemeConfig;
44
45
  vite?: ViteUserConfig;
45
46
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/node/config.ts"],"names":[],"mappings":";;;;;;AAAA,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","sourcesContent":["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"]}