minista 3.0.0-alpha.8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +70 -0
  2. package/dist/cli/build.js +231 -50
  3. package/dist/cli/develop.js +133 -2
  4. package/dist/cli/logger.js +40 -0
  5. package/dist/cli/preview.js +7 -2
  6. package/dist/config/entry.js +30 -7
  7. package/dist/config/image.js +23 -0
  8. package/dist/config/index.js +1 -2
  9. package/dist/config/main.js +67 -37
  10. package/dist/config/mdx.js +13 -30
  11. package/dist/config/sub.js +3 -0
  12. package/dist/config/system.js +9 -0
  13. package/dist/config/vite.js +7 -38
  14. package/dist/generate/archive.js +54 -0
  15. package/dist/generate/asset.js +46 -0
  16. package/dist/generate/image.js +82 -0
  17. package/dist/generate/page.js +67 -0
  18. package/dist/generate/public.js +14 -0
  19. package/dist/generate/remote.js +29 -0
  20. package/dist/generate/search.js +23 -0
  21. package/dist/generate/sprite.js +68 -0
  22. package/dist/plugins/bundle.js +5 -5
  23. package/dist/plugins/fetch.js +33 -0
  24. package/dist/plugins/hydrate.js +26 -0
  25. package/dist/plugins/icon.js +14 -0
  26. package/dist/plugins/image.js +14 -0
  27. package/dist/plugins/mdx.js +7 -0
  28. package/dist/plugins/partial.js +12 -104
  29. package/dist/plugins/preact.js +27 -0
  30. package/dist/plugins/react.js +7 -0
  31. package/dist/plugins/search.js +55 -0
  32. package/dist/plugins/ssg.js +4 -7
  33. package/dist/plugins/svgr.js +5 -2
  34. package/dist/server/global.js +8 -2
  35. package/dist/server/hydrate.js +3 -0
  36. package/dist/server/{pages.js → page.js} +17 -6
  37. package/dist/server/{sources.js → source.js} +3 -3
  38. package/dist/server/sprite.js +20 -0
  39. package/dist/server/ssg.js +17 -0
  40. package/dist/shared/comment.js +3 -6
  41. package/dist/shared/delivery.js +379 -0
  42. package/dist/shared/head.js +3 -6
  43. package/dist/shared/icon.js +19 -14
  44. package/dist/shared/image.js +230 -0
  45. package/dist/shared/index.js +4 -1
  46. package/dist/shared/markdown.js +56 -8
  47. package/dist/shared/search.js +260 -0
  48. package/dist/transform/archive.js +43 -0
  49. package/dist/transform/comment.js +13 -12
  50. package/dist/transform/delivery.js +134 -0
  51. package/dist/transform/encode.js +27 -0
  52. package/dist/transform/entry.js +84 -0
  53. package/dist/transform/hydrate.js +38 -0
  54. package/dist/transform/icon.js +74 -0
  55. package/dist/transform/image.js +308 -0
  56. package/dist/transform/page.js +110 -0
  57. package/dist/transform/partial.js +18 -0
  58. package/dist/transform/relative.js +73 -0
  59. package/dist/transform/remote.js +110 -0
  60. package/dist/transform/search.js +136 -0
  61. package/dist/{compile → transform}/sprite.js +2 -2
  62. package/dist/transform/ssg.js +72 -0
  63. package/dist/transform/tag.js +163 -0
  64. package/dist/types/cli/build.d.ts +7 -2
  65. package/dist/types/cli/logger.d.ts +9 -0
  66. package/dist/types/config/alias.d.ts +5 -5
  67. package/dist/types/config/entry.d.ts +13 -6
  68. package/dist/types/config/image.d.ts +29 -0
  69. package/dist/types/config/index.d.ts +2 -2
  70. package/dist/types/config/main.d.ts +54 -41
  71. package/dist/types/config/mdx.d.ts +1 -2
  72. package/dist/types/config/sub.d.ts +2 -1
  73. package/dist/types/config/system.d.ts +6 -0
  74. package/dist/types/config/user.d.ts +54 -41
  75. package/dist/types/config/vite.d.ts +2 -8
  76. package/dist/types/generate/archive.d.ts +5 -0
  77. package/dist/types/generate/asset.d.ts +10 -0
  78. package/dist/types/generate/image.d.ts +35 -0
  79. package/dist/types/generate/page.d.ts +11 -0
  80. package/dist/types/generate/public.d.ts +4 -0
  81. package/dist/types/generate/remote.d.ts +11 -0
  82. package/dist/types/generate/search.d.ts +5 -0
  83. package/dist/types/generate/sprite.d.ts +14 -0
  84. package/dist/types/plugins/bundle.d.ts +1 -1
  85. package/dist/types/plugins/{serve.d.ts → fetch.d.ts} +1 -1
  86. package/dist/types/plugins/hydrate.d.ts +2 -0
  87. package/dist/types/plugins/icon.d.ts +3 -0
  88. package/dist/types/plugins/image.d.ts +3 -0
  89. package/dist/types/plugins/mdx.d.ts +3 -0
  90. package/dist/types/plugins/partial.d.ts +0 -1
  91. package/dist/types/plugins/preact.d.ts +3 -0
  92. package/dist/types/plugins/react.d.ts +1 -0
  93. package/dist/types/plugins/search.d.ts +3 -0
  94. package/dist/types/plugins/ssg.d.ts +1 -1
  95. package/dist/types/plugins/svgr.d.ts +2 -2
  96. package/dist/types/server/global.d.ts +9 -10
  97. package/dist/types/server/page.d.ts +18 -0
  98. package/dist/types/server/source.d.ts +13 -0
  99. package/dist/types/server/sprite.d.ts +8 -0
  100. package/dist/types/server/ssg.d.ts +6 -0
  101. package/dist/types/shared/comment.d.ts +4 -4
  102. package/dist/types/shared/delivery.d.ts +56 -0
  103. package/dist/types/shared/head.d.ts +2 -2
  104. package/dist/types/shared/icon.d.ts +3 -2
  105. package/dist/types/shared/image.d.ts +32 -0
  106. package/dist/types/shared/index.d.ts +41 -1
  107. package/dist/types/shared/markdown.d.ts +21 -8
  108. package/dist/types/shared/search.d.ts +37 -0
  109. package/dist/types/transform/archive.d.ts +7 -0
  110. package/dist/types/transform/comment.d.ts +2 -1
  111. package/dist/types/transform/delivery.d.ts +33 -0
  112. package/dist/types/transform/encode.d.ts +2 -0
  113. package/dist/types/transform/entry.d.ts +9 -0
  114. package/dist/types/transform/hydrate.d.ts +8 -0
  115. package/dist/types/transform/icon.d.ts +15 -0
  116. package/dist/types/transform/image.d.ts +22 -0
  117. package/dist/types/transform/page.d.ts +10 -0
  118. package/dist/types/transform/partial.d.ts +6 -0
  119. package/dist/types/transform/relative.d.ts +12 -0
  120. package/dist/types/transform/remote.d.ts +23 -0
  121. package/dist/types/transform/search.d.ts +16 -0
  122. package/dist/types/{compile → transform}/sprite.d.ts +1 -1
  123. package/dist/types/transform/ssg.d.ts +17 -0
  124. package/dist/types/transform/tag.d.ts +24 -0
  125. package/dist/types/utility/base.d.ts +1 -0
  126. package/dist/types/utility/element.d.ts +4 -0
  127. package/dist/types/utility/path.d.ts +2 -5
  128. package/dist/types/utility/space.d.ts +5 -0
  129. package/dist/utility/base.js +14 -0
  130. package/dist/utility/element.js +22 -0
  131. package/dist/utility/path.js +20 -14
  132. package/dist/utility/space.js +12 -0
  133. package/package.json +30 -17
  134. package/dist/compile/tags.js +0 -160
  135. package/dist/generate/assets.js +0 -60
  136. package/dist/generate/html.js +0 -94
  137. package/dist/generate/partial.js +0 -45
  138. package/dist/plugins/serve.js +0 -56
  139. package/dist/plugins/sprite.js +0 -77
  140. package/dist/scripts/partial.js +0 -3
  141. package/dist/scripts/ssg.js +0 -59
  142. package/dist/server/app.js +0 -107
  143. package/dist/transform/markdown.js +0 -38
  144. package/dist/types/compile/tags.d.ts +0 -23
  145. package/dist/types/generate/assets.d.ts +0 -6
  146. package/dist/types/generate/html.d.ts +0 -7
  147. package/dist/types/generate/partial.d.ts +0 -6
  148. package/dist/types/plugins/sprite.d.ts +0 -7
  149. package/dist/types/scripts/ssg.d.ts +0 -11
  150. package/dist/types/server/app.d.ts +0 -14
  151. package/dist/types/server/pages.d.ts +0 -25
  152. package/dist/types/server/sources.d.ts +0 -9
  153. package/dist/types/transform/markdown.d.ts +0 -2
  154. /package/dist/{scripts → server}/bundle.js +0 -0
  155. /package/dist/types/{scripts → server}/bundle.d.ts +0 -0
  156. /package/dist/types/{scripts/partial.d.ts → server/hydrate.d.ts} +0 -0
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # minista
2
+
3
+ <p>
4
+ <a aria-label="Made by QRANOKO" href="https://qranoko.jp">
5
+ <img src="https://img.shields.io/badge/MADE%20BY%20QRANOKO-212121.svg?style=for-the-badge&labelColor=212121">
6
+ </a>
7
+ <a aria-label="NPM version" href="https://www.npmjs.com/package/minista">
8
+ <img alt="" src="https://img.shields.io/npm/v/minista.svg?style=for-the-badge&labelColor=212121">
9
+ </a>
10
+ <a aria-label="License" href="https://github.com/qrac/minista/blob/master/LICENSE">
11
+ <img alt="" src="https://img.shields.io/npm/l/minista.svg?style=for-the-badge&labelColor=212121">
12
+ </a>
13
+ </p>
14
+
15
+ ## Site & Documentation
16
+
17
+ https://minista.qranoko.jp
18
+
19
+ ## About
20
+
21
+ minista(ミニスタ)は React の JSX から綺麗な HTML を作る日本製のスタティックサイトジェネレーターです。
22
+
23
+ ## How To Use
24
+
25
+ ### Automatic Setup
26
+
27
+ ```sh
28
+ $ npm create minista@latest
29
+ ```
30
+
31
+ ### Manual Setup
32
+
33
+ ```sh
34
+ $ npm install --save-dev minista react react-dom
35
+ $ touch ./src/pages/index.jsx
36
+ ```
37
+
38
+ ```js
39
+ // ./src/pages/index.jsx
40
+ export default function () {
41
+ return <h1>Hello!</h1>
42
+ }
43
+ ```
44
+
45
+ `package.json` を開き、以下のスクリプトを追加します。
46
+
47
+ ```json
48
+ "scripts": {
49
+ "dev": "minista",
50
+ "build": "minista build",
51
+ "preview": "minista preview",
52
+ }
53
+ ```
54
+
55
+ ## Commands
56
+
57
+ | コマンド | 内容 |
58
+ | ----------------- | ------------------------------- |
59
+ | `minista` | 開発モード(`Ctrl + C` で停止) |
60
+ | `minista build` | 静的書き出し |
61
+ | `minista preview` | 静的書き出し後の動作確認 |
62
+
63
+ ## License
64
+
65
+ - MIT
66
+
67
+ ## Credit
68
+
69
+ - Author: [Qrac](https://qrac.jp)
70
+ - Organization: [QRANOKO](https://qranoko.jp)
package/dist/cli/build.js CHANGED
@@ -6,81 +6,262 @@ import {
6
6
  build as viteBuild,
7
7
  createLogger
8
8
  } from "vite";
9
+ import { parse as parseHtml } from "node-html-parser";
9
10
  import { resolveConfig } from "../config/index.js";
10
- import { pluginGetSsg } from "../plugins/ssg.js";
11
- import { pluginPartial, pluginGetPartial } from "../plugins/partial.js";
12
- import { pluginGetBundle } from "../plugins/bundle.js";
13
- import { generateHtml } from "../generate/html.js";
14
- import { generateAssets } from "../generate/assets.js";
15
- import { generatePartial } from "../generate/partial.js";
11
+ import { resolveViteEntry } from "../config/entry.js";
12
+ import { pluginReact } from "../plugins/react.js";
13
+ import { pluginPreact } from "../plugins/preact.js";
14
+ import { pluginMdx } from "../plugins/mdx.js";
15
+ import { pluginImage } from "../plugins/image.js";
16
+ import { pluginSvgr } from "../plugins/svgr.js";
17
+ import { pluginIcon } from "../plugins/icon.js";
18
+ import { pluginFetch } from "../plugins/fetch.js";
19
+ import { pluginSsg } from "../plugins/ssg.js";
20
+ import { pluginPartial } from "../plugins/partial.js";
21
+ import { pluginHydrate } from "../plugins/hydrate.js";
22
+ import { pluginBundle } from "../plugins/bundle.js";
23
+ import { pluginSearch } from "../plugins/search.js";
24
+ import { transformDeliveries } from "../transform/delivery.js";
25
+ import { transformArchives } from "../transform/archive.js";
26
+ import { transformRemotes } from "../transform/remote.js";
27
+ import { transformEntries } from "../transform/entry.js";
28
+ import { transformImages } from "../transform/image.js";
29
+ import { transformIcons } from "../transform/icon.js";
30
+ import { transformRelative } from "../transform/relative.js";
31
+ import { transformSearch } from "../transform/search.js";
32
+ import { generatePublics } from "../generate/public.js";
33
+ import { generatePages } from "../generate/page.js";
34
+ import { generateAssets } from "../generate/asset.js";
35
+ import { generateImages } from "../generate/image.js";
36
+ import { generateSprites } from "../generate/sprite.js";
37
+ import { generateArchives } from "../generate/archive.js";
38
+ import { hasElement } from "../utility/element.js";
16
39
  async function build(inlineConfig = {}) {
17
40
  const config = await resolveConfig(inlineConfig);
41
+ const { resolvedRoot, resolvedEntry, tempDir } = config.sub;
42
+ const { assets, search, delivery } = config.main;
43
+ const { partial } = assets;
44
+ const resolvedOut = path.join(resolvedRoot, config.main.out);
45
+ const bundleCssName = path.join(assets.outDir, assets.bundle.outName + ".css");
46
+ const bugBundleCssName = path.join(assets.outDir, "bundle.css");
47
+ const hydrateJsName = path.join(assets.outDir, assets.partial.outName + ".js");
48
+ let ssgResult;
49
+ let assetsResult;
50
+ let hydrateResult;
51
+ let ssgItems;
52
+ let assetItems;
53
+ let hydrateItems;
54
+ let ssgPages = [];
55
+ let parsedPages = [];
56
+ let dynamicEntries = {};
57
+ let assetEntries = {};
58
+ let createPages = [];
59
+ let createAssets = [];
60
+ let createImages = {};
61
+ let createSprites = {};
62
+ let cssNameBugFix = {};
63
+ let hasBundleCss = false;
64
+ let hasHydrate = false;
65
+ let hasSearch = false;
18
66
  const ssgConfig = mergeViteConfig(
19
67
  config.vite,
20
68
  defineViteConfig({
21
69
  build: { write: false, ssr: true, minify: false },
22
- plugins: [pluginGetSsg(), pluginPartial(config)],
70
+ ssr: { noExternal: "minista" },
71
+ plugins: [
72
+ pluginReact(),
73
+ pluginMdx(config),
74
+ pluginImage(config),
75
+ pluginSvgr(config),
76
+ pluginIcon(config),
77
+ pluginFetch(config),
78
+ pluginSsg(),
79
+ pluginPartial(config)
80
+ ],
23
81
  customLogger: createLogger("warn", { prefix: "[minista]" })
24
82
  })
25
83
  );
84
+ ssgResult = await viteBuild(ssgConfig);
85
+ ssgItems = ssgResult.output.filter((item) => {
86
+ return item.fileName.match(/__minista_plugin_ssg\.js$/);
87
+ });
88
+ if (ssgItems.length > 0) {
89
+ const ssgPath = path.join(tempDir, "ssg.mjs");
90
+ const ssgData = ssgItems[0].source || ssgItems[0].code || "";
91
+ await fs.outputFile(ssgPath, ssgData);
92
+ const { runSsg } = await import(ssgPath);
93
+ ssgPages = await runSsg(config);
94
+ }
95
+ if (ssgPages.length > 0) {
96
+ parsedPages = ssgPages.map((page) => {
97
+ const parsedHtml = parseHtml(page.html, { comment: true });
98
+ return {
99
+ fileName: page.fileName,
100
+ path: page.path,
101
+ group: page.group,
102
+ title: page.path,
103
+ draft: page.draft,
104
+ parsedHtml
105
+ };
106
+ });
107
+ let parsedData = parsedPages.map((item) => item.parsedHtml);
108
+ hasSearch = hasElement(parsedData, `[data-full-text-search]`);
109
+ hasHydrate = hasElement(parsedData, `[data-${partial.rootAttrSuffix}]`);
110
+ transformDeliveries({ parsedData, ssgPages, config });
111
+ transformArchives({ parsedData, config });
112
+ await transformRemotes({
113
+ command: "build",
114
+ parsedData,
115
+ config
116
+ });
117
+ await transformImages({
118
+ command: "build",
119
+ parsedData,
120
+ config,
121
+ createImages
122
+ });
123
+ await transformIcons({
124
+ command: "build",
125
+ parsedData,
126
+ config,
127
+ createSprites
128
+ });
129
+ await transformEntries({
130
+ parsedData,
131
+ config,
132
+ dynamicEntries
133
+ });
134
+ createPages = await Promise.all(
135
+ parsedPages.map(async (page) => {
136
+ const pathname = page.path;
137
+ let parsedHtml = page.parsedHtml;
138
+ if (config.main.base === "" || config.main.base === "./") {
139
+ transformRelative({
140
+ parsedHtml,
141
+ pathname,
142
+ config
143
+ });
144
+ }
145
+ return {
146
+ fileName: page.fileName,
147
+ data: parsedHtml.toString()
148
+ };
149
+ })
150
+ );
151
+ }
152
+ assetEntries = resolveViteEntry(resolvedRoot, resolvedEntry);
153
+ assetEntries = { ...assetEntries, ...dynamicEntries };
26
154
  const assetsConfig = mergeViteConfig(
27
155
  config.vite,
28
156
  defineViteConfig({
29
- build: { write: false },
30
- plugins: [pluginGetBundle()],
157
+ build: {
158
+ rollupOptions: {
159
+ input: assetEntries
160
+ },
161
+ write: false
162
+ },
163
+ plugins: [
164
+ pluginReact(),
165
+ pluginMdx(config),
166
+ pluginSvgr(config),
167
+ pluginBundle()
168
+ ],
31
169
  customLogger: createLogger("warn", { prefix: "[minista]" })
32
170
  })
33
171
  );
34
- const partialConfig = mergeViteConfig(
172
+ assetsResult = await viteBuild(assetsConfig);
173
+ const hydrateConfig = mergeViteConfig(
35
174
  config.vite,
36
175
  defineViteConfig({
37
176
  build: { write: false },
38
- plugins: [pluginGetPartial(config)],
177
+ plugins: [
178
+ pluginReact(),
179
+ pluginPreact(config),
180
+ pluginMdx(config),
181
+ pluginSvgr(config),
182
+ pluginHydrate(),
183
+ pluginSearch(config)
184
+ ],
39
185
  customLogger: createLogger("warn", { prefix: "[minista]" })
40
186
  })
41
187
  );
42
- const hasPartial = fs.existsSync(path.join(config.sub.tempDir, "partials"));
43
- let ssgResult;
44
- let assetsResult;
45
- let partialResult;
46
- await Promise.all([
47
- ssgResult = await viteBuild(ssgConfig),
48
- assetsResult = await viteBuild(assetsConfig)
49
- ]);
50
- if (hasPartial) {
51
- partialResult = await viteBuild(partialConfig);
188
+ if (hasHydrate) {
189
+ hydrateResult = await viteBuild(hydrateConfig);
52
190
  } else {
53
- partialResult = { output: [] };
191
+ hydrateResult = { output: [] };
54
192
  }
55
- const resolvedOut = path.join(config.sub.resolvedRoot, config.main.out);
56
- const resolvedPublic = path.join(config.sub.resolvedRoot, config.main.public);
57
- const hasPublic = fs.existsSync(resolvedPublic);
58
- await fs.emptyDir(resolvedOut);
59
- hasPublic && await fs.copy(resolvedPublic, resolvedOut);
60
- const bundleCssName = path.join(
61
- config.main.assets.outDir,
62
- config.main.assets.bundle.outName + ".css"
63
- );
64
- const bugBundleCssName = path.join(config.main.assets.outDir, "bundle.css");
65
- const hasBundleCss = assetsResult.output.some(
66
- (item) => item.fileName === bundleCssName || item.fileName === bugBundleCssName
67
- );
68
- await Promise.all([
69
- await generateHtml({
70
- config,
71
- items: ssgResult.output,
72
- hasBundleCss
73
- }),
74
- await generateAssets({
75
- config,
76
- items: assetsResult.output
77
- }),
78
- hasPartial && await generatePartial({
79
- config,
80
- items: partialResult.output
193
+ assetItems = assetsResult.output.filter((item) => {
194
+ return !item.fileName.match(/__minista_plugin_bundle\.js$/);
195
+ });
196
+ hydrateItems = hydrateResult.output.filter((item) => {
197
+ return item.fileName.match(/__minista_plugin_hydrate\.js$/);
198
+ });
199
+ hasBundleCss = assetsResult.output.some((item) => {
200
+ return item.fileName === bundleCssName || item.fileName === bugBundleCssName;
201
+ });
202
+ cssNameBugFix = Object.fromEntries(
203
+ Object.entries(assetEntries).map((item) => {
204
+ return [
205
+ path.join(assets.outDir, path.parse(item[1]).name + ".css"),
206
+ path.join(assets.outDir, item[0] + ".css")
207
+ ];
81
208
  })
82
- ]);
83
- return;
209
+ );
210
+ cssNameBugFix = { ...cssNameBugFix, ...{ [bugBundleCssName]: bundleCssName } };
211
+ createAssets = [...assetItems, ...hydrateItems].map((item) => {
212
+ const isCss = item.fileName.match(/.*\.css$/);
213
+ const isBundleCss = item.fileName.match(/__minista_plugin_bundle\.css$/);
214
+ const isHydrateJs = item.fileName.match(/__minista_plugin_hydrate\.js$/);
215
+ let fileName = item.fileName;
216
+ isBundleCss && (fileName = bundleCssName);
217
+ isHydrateJs && (fileName = hydrateJsName);
218
+ if (isCss && Object.hasOwn(cssNameBugFix, fileName)) {
219
+ fileName = cssNameBugFix[fileName];
220
+ }
221
+ fileName = fileName.replace(/-ministaDuplicateName\d*/, "");
222
+ let data = "";
223
+ item.source && (data = item.source);
224
+ item.code && (data = item.code);
225
+ data === "\n" && (data = "");
226
+ return {
227
+ fileName,
228
+ data
229
+ };
230
+ });
231
+ createAssets = createAssets.filter((item) => item.data);
232
+ if (hasSearch && ssgPages.length) {
233
+ const fileName = path.join(search.outDir, search.outName + ".json");
234
+ const searchObj = await transformSearch({
235
+ command: "build",
236
+ ssgPages,
237
+ config
238
+ });
239
+ const data = JSON.stringify(searchObj);
240
+ createAssets.push({ fileName, data });
241
+ }
242
+ const pageNames = createPages.map((item) => item.fileName);
243
+ const assetNames = createAssets.map((item) => item.fileName);
244
+ const imageNames = Object.keys(createImages).map((item) => item);
245
+ const iconNames = Object.keys(createSprites).map((item) => item);
246
+ const archiveNames = delivery.archives.map((item) => {
247
+ return path.join(item.outDir, item.outName + "." + item.format);
248
+ });
249
+ const mergedItemNames = [
250
+ ...pageNames,
251
+ ...assetNames,
252
+ ...imageNames,
253
+ ...iconNames,
254
+ ...archiveNames
255
+ ];
256
+ const nameLengths = mergedItemNames.map((item) => item.length);
257
+ const maxNameLength = nameLengths.reduce((a, b) => a > b ? a : b, 0);
258
+ await fs.emptyDir(resolvedOut);
259
+ await generatePublics({ config });
260
+ await generatePages({ createPages, config, hasBundleCss, maxNameLength });
261
+ await generateAssets({ createAssets, config, maxNameLength });
262
+ await generateImages({ createImages, config, maxNameLength });
263
+ await generateSprites({ createSprites, config, maxNameLength });
264
+ await generateArchives({ config, maxNameLength });
84
265
  }
85
266
  export {
86
267
  build
@@ -1,23 +1,154 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "node:url";
1
3
  import {
2
4
  createServer as createViteServer,
3
5
  defineConfig as defineViteConfig,
4
6
  mergeConfig as mergeViteConfig
5
7
  } from "vite";
8
+ import { parse as parseHtml } from "node-html-parser";
6
9
  import { resolveConfig } from "../config/index.js";
7
- import { pluginServe } from "../plugins/serve.js";
10
+ import { pluginReact } from "../plugins/react.js";
11
+ import { pluginPreact } from "../plugins/preact.js";
12
+ import { pluginMdx } from "../plugins/mdx.js";
13
+ import { pluginImage } from "../plugins/image.js";
14
+ import { pluginSvgr } from "../plugins/svgr.js";
15
+ import { pluginIcon } from "../plugins/icon.js";
16
+ import { pluginFetch } from "../plugins/fetch.js";
8
17
  import { pluginPartial } from "../plugins/partial.js";
18
+ import { pluginSearch } from "../plugins/search.js";
19
+ import { transformPage } from "../transform/page.js";
20
+ import { transformSsg } from "../transform/ssg.js";
21
+ import { transformTags } from "../transform/tag.js";
22
+ import { transformComments } from "../transform/comment.js";
23
+ import { transformDeliveries } from "../transform/delivery.js";
24
+ import { transformArchives } from "../transform/archive.js";
25
+ import { transformRemotes } from "../transform/remote.js";
26
+ import { transformImages } from "../transform/image.js";
27
+ import { transformIcons } from "../transform/icon.js";
28
+ import { transformEncode } from "../transform/encode.js";
29
+ import { transformSearch } from "../transform/search.js";
30
+ import { generateTempSearch } from "../generate/search.js";
31
+ import { hasElement } from "../utility/element.js";
32
+ const __filename = fileURLToPath(import.meta.url);
33
+ const __dirname = path.dirname(__filename);
9
34
  async function develop(inlineConfig = {}) {
10
35
  const config = await resolveConfig(inlineConfig);
11
36
  const mergedViteConfig = mergeViteConfig(
12
37
  config.vite,
13
38
  defineViteConfig({
14
- plugins: [pluginServe(config), pluginPartial(config)]
39
+ plugins: [
40
+ pluginDevelop(config),
41
+ pluginReact(),
42
+ pluginPreact(config),
43
+ pluginMdx(config),
44
+ pluginImage(config),
45
+ pluginSvgr(config),
46
+ pluginIcon(config),
47
+ pluginFetch(config),
48
+ pluginPartial(config),
49
+ pluginSearch(config)
50
+ ]
15
51
  })
16
52
  );
17
53
  const viteServer = await createViteServer(mergedViteConfig);
18
54
  await viteServer.listen();
19
55
  viteServer.printUrls();
20
56
  }
57
+ function pluginDevelop(config) {
58
+ let server;
59
+ let ssgPages = [];
60
+ return {
61
+ name: "minista-vite-plugin:develop",
62
+ configureServer(_server) {
63
+ server = _server;
64
+ return () => {
65
+ server.middlewares.use(async (req, res, next) => {
66
+ try {
67
+ const { resolvedBase } = config.sub;
68
+ let originalUrl = req.originalUrl || "";
69
+ let url = originalUrl;
70
+ if (resolvedBase.match(/^\/.*\/$/)) {
71
+ const reg = new RegExp(`^${resolvedBase}`);
72
+ url = url.replace(reg, "/");
73
+ }
74
+ const { getSources } = await server.ssrLoadModule(
75
+ __dirname + "/../server/source.js"
76
+ );
77
+ const { resolvedGlobal, resolvedPages } = await getSources();
78
+ const { headTags, startTags, endTags } = transformTags({
79
+ command: "serve",
80
+ pathname: url,
81
+ config
82
+ });
83
+ let html = transformPage({
84
+ url,
85
+ resolvedGlobal,
86
+ resolvedPages,
87
+ headTags,
88
+ startTags,
89
+ endTags
90
+ });
91
+ let parsedHtml = parseHtml(html, { comment: true });
92
+ const charsetEl = parsedHtml.querySelector(`meta[charset]`);
93
+ const charset = charsetEl?.getAttribute("charset") || "UTF-8";
94
+ const searchAttr = `[data-full-text-search]`;
95
+ const deliveryAttr = `[data-minista-transform-target="delivery"]`;
96
+ const hasSearch = hasElement(parsedHtml, searchAttr);
97
+ const hasDelivery = hasElement(parsedHtml, deliveryAttr);
98
+ if (hasSearch || hasDelivery) {
99
+ ssgPages = await transformSsg({
100
+ command: "serve",
101
+ resolvedGlobal,
102
+ resolvedPages,
103
+ config
104
+ });
105
+ }
106
+ if (hasSearch) {
107
+ const searchObj = await transformSearch({
108
+ command: "serve",
109
+ ssgPages,
110
+ config
111
+ });
112
+ const data = JSON.stringify(searchObj);
113
+ await generateTempSearch({ data, config });
114
+ }
115
+ transformComments(parsedHtml);
116
+ transformDeliveries({ parsedData: parsedHtml, ssgPages, config });
117
+ transformArchives({ parsedData: parsedHtml, config });
118
+ await transformRemotes({
119
+ command: "serve",
120
+ parsedData: parsedHtml,
121
+ config
122
+ });
123
+ await transformImages({
124
+ command: "serve",
125
+ parsedData: parsedHtml,
126
+ config
127
+ });
128
+ await transformIcons({
129
+ command: "serve",
130
+ parsedData: parsedHtml,
131
+ config,
132
+ server
133
+ });
134
+ html = parsedHtml.toString();
135
+ html = await server.transformIndexHtml(originalUrl, html);
136
+ if (charset.match(/^utf[\s-_]*8$/i)) {
137
+ res.statusCode = 200;
138
+ res.end(html);
139
+ } else {
140
+ res.statusCode = 200;
141
+ res.end(transformEncode(html, charset));
142
+ }
143
+ } catch (e) {
144
+ server.ssrFixStacktrace(e);
145
+ next(e);
146
+ }
147
+ });
148
+ };
149
+ }
150
+ };
151
+ }
21
152
  export {
22
153
  develop
23
154
  };
@@ -0,0 +1,40 @@
1
+ import pc from "picocolors";
2
+ function logger({
3
+ label,
4
+ main,
5
+ sub,
6
+ space = "",
7
+ data,
8
+ dataLength
9
+ }) {
10
+ const labelStr = (() => {
11
+ switch (label) {
12
+ case "BUILD":
13
+ return pc.bold(pc.green(label));
14
+ case "FETCH":
15
+ return pc.bold(pc.blue(label));
16
+ case "ERROR":
17
+ return pc.bold(pc.red(label));
18
+ default:
19
+ return "";
20
+ }
21
+ })();
22
+ const mainStr = (() => {
23
+ switch (label) {
24
+ case "ERROR":
25
+ return pc.red(main);
26
+ default:
27
+ return pc.bold(main);
28
+ }
29
+ })();
30
+ let texts = [labelStr, mainStr];
31
+ sub && texts.push(pc.gray(sub));
32
+ let dataSize = "";
33
+ data && (dataSize = (data.length / 1024).toFixed(2));
34
+ dataLength && (dataSize = (dataLength / 1024).toFixed(2));
35
+ const size = dataSize ? pc.gray(`${dataSize} KiB`) : "";
36
+ console.log(texts.join(" ") + space + size);
37
+ }
38
+ export {
39
+ logger
40
+ };
@@ -1,8 +1,13 @@
1
- import { preview as vitePreview } from "vite";
1
+ import {
2
+ preview as vitePreview,
3
+ defineConfig as defineViteConfig,
4
+ mergeConfig as mergeViteConfig
5
+ } from "vite";
2
6
  import { resolveConfig } from "../config/index.js";
3
7
  async function preview(inlineConfig = {}) {
4
8
  const config = await resolveConfig(inlineConfig);
5
- const viteServer = await vitePreview(config.vite);
9
+ const mergedViteConfig = mergeViteConfig(config.vite, defineViteConfig({}));
10
+ const viteServer = await vitePreview(mergedViteConfig);
6
11
  viteServer.printUrls();
7
12
  }
8
13
  export {
@@ -30,6 +30,15 @@ function resolveEntryExclude(input) {
30
30
  }
31
31
  return [];
32
32
  }
33
+ function resolveViteEntry(root, entry) {
34
+ if (!entry.length) {
35
+ return {};
36
+ }
37
+ const entries = Object.fromEntries(
38
+ entry.map((item) => [item.name, path.join(root, item.input)])
39
+ );
40
+ return entries;
41
+ }
33
42
  async function resolveEntry(entry) {
34
43
  const entries = [];
35
44
  async function pushEntries(input) {
@@ -40,7 +49,7 @@ async function resolveEntry(entry) {
40
49
  const pattern = {
41
50
  name: path.parse(input).name,
42
51
  input,
43
- insertPages: ["**/*"],
52
+ insertPages: { include: ["**/*"], exclude: [] },
44
53
  position: "head",
45
54
  attributes: ""
46
55
  };
@@ -53,7 +62,7 @@ async function resolveEntry(entry) {
53
62
  const pattern = {
54
63
  name: path.parse(item).name,
55
64
  input: item,
56
- insertPages: ["**/*"],
65
+ insertPages: { include: ["**/*"], exclude: [] },
57
66
  position: "head",
58
67
  attributes: ""
59
68
  };
@@ -67,11 +76,10 @@ async function resolveEntry(entry) {
67
76
  const name = item.name || path.parse(item.input).name;
68
77
  const include = resolveEntryInclude(item.insertPages);
69
78
  const exclude = resolveEntryExclude(item.insertPages);
70
- const fixedExclude = exclude.map((item2) => "!" + item2);
71
79
  const pattern = {
72
80
  name,
73
81
  input: item.input,
74
- insertPages: [...include, ...fixedExclude],
82
+ insertPages: { include, exclude },
75
83
  position: item.position || "head",
76
84
  attributes: item.attributes || ""
77
85
  };
@@ -85,7 +93,7 @@ async function resolveEntry(entry) {
85
93
  const pattern = {
86
94
  name: item[0],
87
95
  input: item[1],
88
- insertPages: ["**/*"],
96
+ insertPages: { include: ["**/*"], exclude: [] },
89
97
  position: "head",
90
98
  attributes: ""
91
99
  };
@@ -95,10 +103,25 @@ async function resolveEntry(entry) {
95
103
  }
96
104
  }
97
105
  await pushEntries(entry);
98
- return entries;
106
+ const entryNames = entries.map((item) => item.name);
107
+ const duplicateNames = entryNames.filter(
108
+ (value, index, self) => self.indexOf(value) === index && self.lastIndexOf(value) !== index
109
+ );
110
+ const uniqueNameEntries = entries.map((item, index) => {
111
+ const name = duplicateNames.includes(item.name) ? `${item.name}-ministaDuplicateName${index}` : item.name;
112
+ return {
113
+ name,
114
+ input: item.input,
115
+ insertPages: item.insertPages,
116
+ position: item.position,
117
+ attributes: item.attributes
118
+ };
119
+ });
120
+ return uniqueNameEntries;
99
121
  }
100
122
  export {
101
123
  resolveEntry,
102
124
  resolveEntryExclude,
103
- resolveEntryInclude
125
+ resolveEntryInclude,
126
+ resolveViteEntry
104
127
  };