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.
- package/README.md +70 -0
- package/dist/cli/build.js +231 -50
- package/dist/cli/develop.js +133 -2
- package/dist/cli/logger.js +40 -0
- package/dist/cli/preview.js +7 -2
- package/dist/config/entry.js +30 -7
- package/dist/config/image.js +23 -0
- package/dist/config/index.js +1 -2
- package/dist/config/main.js +67 -37
- package/dist/config/mdx.js +13 -30
- package/dist/config/sub.js +3 -0
- package/dist/config/system.js +9 -0
- package/dist/config/vite.js +7 -38
- package/dist/generate/archive.js +54 -0
- package/dist/generate/asset.js +46 -0
- package/dist/generate/image.js +82 -0
- package/dist/generate/page.js +67 -0
- package/dist/generate/public.js +14 -0
- package/dist/generate/remote.js +29 -0
- package/dist/generate/search.js +23 -0
- package/dist/generate/sprite.js +68 -0
- package/dist/plugins/bundle.js +5 -5
- package/dist/plugins/fetch.js +33 -0
- package/dist/plugins/hydrate.js +26 -0
- package/dist/plugins/icon.js +14 -0
- package/dist/plugins/image.js +14 -0
- package/dist/plugins/mdx.js +7 -0
- package/dist/plugins/partial.js +12 -104
- package/dist/plugins/preact.js +27 -0
- package/dist/plugins/react.js +7 -0
- package/dist/plugins/search.js +55 -0
- package/dist/plugins/ssg.js +4 -7
- package/dist/plugins/svgr.js +5 -2
- package/dist/server/global.js +8 -2
- package/dist/server/hydrate.js +3 -0
- package/dist/server/{pages.js → page.js} +17 -6
- package/dist/server/{sources.js → source.js} +3 -3
- package/dist/server/sprite.js +20 -0
- package/dist/server/ssg.js +17 -0
- package/dist/shared/comment.js +3 -6
- package/dist/shared/delivery.js +379 -0
- package/dist/shared/head.js +3 -6
- package/dist/shared/icon.js +19 -14
- package/dist/shared/image.js +230 -0
- package/dist/shared/index.js +4 -1
- package/dist/shared/markdown.js +56 -8
- package/dist/shared/search.js +260 -0
- package/dist/transform/archive.js +43 -0
- package/dist/transform/comment.js +13 -12
- package/dist/transform/delivery.js +134 -0
- package/dist/transform/encode.js +27 -0
- package/dist/transform/entry.js +84 -0
- package/dist/transform/hydrate.js +38 -0
- package/dist/transform/icon.js +74 -0
- package/dist/transform/image.js +308 -0
- package/dist/transform/page.js +110 -0
- package/dist/transform/partial.js +18 -0
- package/dist/transform/relative.js +73 -0
- package/dist/transform/remote.js +110 -0
- package/dist/transform/search.js +136 -0
- package/dist/{compile → transform}/sprite.js +2 -2
- package/dist/transform/ssg.js +72 -0
- package/dist/transform/tag.js +163 -0
- package/dist/types/cli/build.d.ts +7 -2
- package/dist/types/cli/logger.d.ts +9 -0
- package/dist/types/config/alias.d.ts +5 -5
- package/dist/types/config/entry.d.ts +13 -6
- package/dist/types/config/image.d.ts +29 -0
- package/dist/types/config/index.d.ts +2 -2
- package/dist/types/config/main.d.ts +54 -41
- package/dist/types/config/mdx.d.ts +1 -2
- package/dist/types/config/sub.d.ts +2 -1
- package/dist/types/config/system.d.ts +6 -0
- package/dist/types/config/user.d.ts +54 -41
- package/dist/types/config/vite.d.ts +2 -8
- package/dist/types/generate/archive.d.ts +5 -0
- package/dist/types/generate/asset.d.ts +10 -0
- package/dist/types/generate/image.d.ts +35 -0
- package/dist/types/generate/page.d.ts +11 -0
- package/dist/types/generate/public.d.ts +4 -0
- package/dist/types/generate/remote.d.ts +11 -0
- package/dist/types/generate/search.d.ts +5 -0
- package/dist/types/generate/sprite.d.ts +14 -0
- package/dist/types/plugins/bundle.d.ts +1 -1
- package/dist/types/plugins/{serve.d.ts → fetch.d.ts} +1 -1
- package/dist/types/plugins/hydrate.d.ts +2 -0
- package/dist/types/plugins/icon.d.ts +3 -0
- package/dist/types/plugins/image.d.ts +3 -0
- package/dist/types/plugins/mdx.d.ts +3 -0
- package/dist/types/plugins/partial.d.ts +0 -1
- package/dist/types/plugins/preact.d.ts +3 -0
- package/dist/types/plugins/react.d.ts +1 -0
- package/dist/types/plugins/search.d.ts +3 -0
- package/dist/types/plugins/ssg.d.ts +1 -1
- package/dist/types/plugins/svgr.d.ts +2 -2
- package/dist/types/server/global.d.ts +9 -10
- package/dist/types/server/page.d.ts +18 -0
- package/dist/types/server/source.d.ts +13 -0
- package/dist/types/server/sprite.d.ts +8 -0
- package/dist/types/server/ssg.d.ts +6 -0
- package/dist/types/shared/comment.d.ts +4 -4
- package/dist/types/shared/delivery.d.ts +56 -0
- package/dist/types/shared/head.d.ts +2 -2
- package/dist/types/shared/icon.d.ts +3 -2
- package/dist/types/shared/image.d.ts +32 -0
- package/dist/types/shared/index.d.ts +41 -1
- package/dist/types/shared/markdown.d.ts +21 -8
- package/dist/types/shared/search.d.ts +37 -0
- package/dist/types/transform/archive.d.ts +7 -0
- package/dist/types/transform/comment.d.ts +2 -1
- package/dist/types/transform/delivery.d.ts +33 -0
- package/dist/types/transform/encode.d.ts +2 -0
- package/dist/types/transform/entry.d.ts +9 -0
- package/dist/types/transform/hydrate.d.ts +8 -0
- package/dist/types/transform/icon.d.ts +15 -0
- package/dist/types/transform/image.d.ts +22 -0
- package/dist/types/transform/page.d.ts +10 -0
- package/dist/types/transform/partial.d.ts +6 -0
- package/dist/types/transform/relative.d.ts +12 -0
- package/dist/types/transform/remote.d.ts +23 -0
- package/dist/types/transform/search.d.ts +16 -0
- package/dist/types/{compile → transform}/sprite.d.ts +1 -1
- package/dist/types/transform/ssg.d.ts +17 -0
- package/dist/types/transform/tag.d.ts +24 -0
- package/dist/types/utility/base.d.ts +1 -0
- package/dist/types/utility/element.d.ts +4 -0
- package/dist/types/utility/path.d.ts +2 -5
- package/dist/types/utility/space.d.ts +5 -0
- package/dist/utility/base.js +14 -0
- package/dist/utility/element.js +22 -0
- package/dist/utility/path.js +20 -14
- package/dist/utility/space.js +12 -0
- package/package.json +30 -17
- package/dist/compile/tags.js +0 -160
- package/dist/generate/assets.js +0 -60
- package/dist/generate/html.js +0 -94
- package/dist/generate/partial.js +0 -45
- package/dist/plugins/serve.js +0 -56
- package/dist/plugins/sprite.js +0 -77
- package/dist/scripts/partial.js +0 -3
- package/dist/scripts/ssg.js +0 -59
- package/dist/server/app.js +0 -107
- package/dist/transform/markdown.js +0 -38
- package/dist/types/compile/tags.d.ts +0 -23
- package/dist/types/generate/assets.d.ts +0 -6
- package/dist/types/generate/html.d.ts +0 -7
- package/dist/types/generate/partial.d.ts +0 -6
- package/dist/types/plugins/sprite.d.ts +0 -7
- package/dist/types/scripts/ssg.d.ts +0 -11
- package/dist/types/server/app.d.ts +0 -14
- package/dist/types/server/pages.d.ts +0 -25
- package/dist/types/server/sources.d.ts +0 -9
- package/dist/types/transform/markdown.d.ts +0 -2
- /package/dist/{scripts → server}/bundle.js +0 -0
- /package/dist/types/{scripts → server}/bundle.d.ts +0 -0
- /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 {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
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
|
-
|
|
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: {
|
|
30
|
-
|
|
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
|
-
|
|
172
|
+
assetsResult = await viteBuild(assetsConfig);
|
|
173
|
+
const hydrateConfig = mergeViteConfig(
|
|
35
174
|
config.vite,
|
|
36
175
|
defineViteConfig({
|
|
37
176
|
build: { write: false },
|
|
38
|
-
plugins: [
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
191
|
+
hydrateResult = { output: [] };
|
|
54
192
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
package/dist/cli/develop.js
CHANGED
|
@@ -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 {
|
|
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: [
|
|
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
|
+
};
|
package/dist/cli/preview.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import {
|
|
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
|
|
9
|
+
const mergedViteConfig = mergeViteConfig(config.vite, defineViteConfig({}));
|
|
10
|
+
const viteServer = await vitePreview(mergedViteConfig);
|
|
6
11
|
viteServer.printUrls();
|
|
7
12
|
}
|
|
8
13
|
export {
|
package/dist/config/entry.js
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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
|
};
|