@ywal123456/jskim 0.2.0 → 0.3.1
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 +112 -162
- package/docs/configuration.md +204 -207
- package/docs/create-jskim.md +22 -7
- package/package.json +1 -1
- package/scripts/commands/path-display.js +1 -15
- package/scripts/lib/build-project.js +18 -12
- package/scripts/lib/create-nunjucks-env.js +40 -1
- package/scripts/lib/create-project-watcher.js +7 -2
- package/scripts/lib/format-diagnostic.js +234 -0
- package/scripts/lib/load-config.js +6 -4
- package/scripts/lib/merge-config.js +87 -2
- package/scripts/lib/process-files.js +307 -0
- package/scripts/lib/render-pages.js +39 -13
- package/scripts/lib/resolve-project.js +193 -44
- package/scripts/lib/resolve-watch-paths.js +31 -13
- package/scripts/lib/to-display-path.js +28 -0
package/README.md
CHANGED
|
@@ -2,18 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Nunjucks を使った汎用の静的 HTML ビルド環境です。
|
|
4
4
|
|
|
5
|
-
特定のアプリ構成、業務ロジック、CSS/JS 設計、Git
|
|
6
|
-
Nunjucks ソースを設定に従って静的 HTML にレンダリングし、assets をコピーして配布可能な結果を作ります。
|
|
5
|
+
特定のアプリ構成、業務ロジック、CSS/JS 設計、Git 運用、デプロイ基盤を強制しません。`jskim.config.js` に従ってソースを処理し、配布可能な静的ファイルを `outputDir` に生成します。
|
|
7
6
|
|
|
8
7
|
## 現在の対応範囲
|
|
9
8
|
|
|
10
|
-
- `
|
|
11
|
-
-
|
|
12
|
-
- Nunjucks
|
|
13
|
-
- 静的ファイルのコピー
|
|
14
|
-
- outputDir の clean
|
|
9
|
+
- `files` pipeline による Nunjucks レンダリングと静的ファイルコピー
|
|
10
|
+
- legacy `render` / `copy` 設定の継続サポート
|
|
11
|
+
- `data`、Nunjucks `filters` / `globals`
|
|
15
12
|
- `rootPath` の自動注入
|
|
16
|
-
-
|
|
13
|
+
- outputDir の clean
|
|
17
14
|
- ファイル監視(`watch`)後の全体再ビルド
|
|
18
15
|
- ビルド結果のローカル静的サーバー(`serve`)
|
|
19
16
|
- 開発サーバー(`dev` = build + watch + serve)
|
|
@@ -25,14 +22,13 @@ Nunjucks ソースを設定に従って静的 HTML にレンダリングし、as
|
|
|
25
22
|
|
|
26
23
|
- ブラウザ自動起動
|
|
27
24
|
- HMR / CSS だけのホット更新
|
|
28
|
-
- JSON
|
|
25
|
+
- JSON / YAML などの外部データファイル自動読み込み
|
|
29
26
|
- API / Mock API
|
|
30
27
|
- 増分ビルド
|
|
31
28
|
- SPA fallback / proxy
|
|
29
|
+
- formatter 機能
|
|
32
30
|
|
|
33
|
-
既存 HTML の自動 import / migration は JSKim core
|
|
34
|
-
既存 source の移行は利用者が project に合わせて行います。
|
|
35
|
-
将来必要になった場合も、JSKim 本体ではなく独立した tool / package として検討します。
|
|
31
|
+
既存 HTML の自動 import / migration は JSKim core の責任範囲外です。既存 source の移行は利用者が project に合わせて行います。将来必要になった場合も、JSKim 本体ではなく独立した tool / package として検討します。
|
|
36
32
|
|
|
37
33
|
## パッケージの役割
|
|
38
34
|
|
|
@@ -48,6 +44,7 @@ Nunjucks ソースを設定に従って静的 HTML にレンダリングし、as
|
|
|
48
44
|
|
|
49
45
|
詳細:
|
|
50
46
|
|
|
47
|
+
- [docs/configuration.md](docs/configuration.md)
|
|
51
48
|
- [docs/create-jskim.md](docs/create-jskim.md)
|
|
52
49
|
- [docs/publishing.md](docs/publishing.md)(maintainer 向け release 手順)
|
|
53
50
|
|
|
@@ -69,6 +66,8 @@ npm create jskim@latest
|
|
|
69
66
|
npx create-jskim my-project
|
|
70
67
|
```
|
|
71
68
|
|
|
69
|
+
生成器は自動で `npm install` / `git init` を実行しません。空ではない既存ディレクトリも上書きしません。
|
|
70
|
+
|
|
72
71
|
## CLI
|
|
73
72
|
|
|
74
73
|
```bash
|
|
@@ -93,8 +92,6 @@ jskim dev <project>
|
|
|
93
92
|
|
|
94
93
|
要点:
|
|
95
94
|
|
|
96
|
-
- npm package 名は `@ywal123456/jskim`(scoped)
|
|
97
|
-
- インストール後の CLI binary 名は `jskim`
|
|
98
95
|
- コマンドは実行したディレクトリの `process.cwd()` をプロジェクトルートとして扱う
|
|
99
96
|
- パッケージのインストール先(`node_modules/@ywal123456/jskim`)を作業空間とはみなさない
|
|
100
97
|
- プロジェクトルートに `jskim.config.js` が必要
|
|
@@ -106,44 +103,89 @@ jskim --help
|
|
|
106
103
|
jskim --version
|
|
107
104
|
```
|
|
108
105
|
|
|
109
|
-
##
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
106
|
+
## files pipeline
|
|
107
|
+
|
|
108
|
+
v0.3.0 以降の推奨設定は `files` です。`files[].from` 配下を走査し、末尾が `.njk` のファイルは Nunjucks でレンダリングして末尾の `.njk` だけを外します。それ以外のファイルは byte copy します。
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
module.exports = {
|
|
112
|
+
defaults: {
|
|
113
|
+
files: [{ from: 'pages', to: '' }],
|
|
114
|
+
templates: ['layouts', 'components'],
|
|
115
|
+
},
|
|
116
|
+
projects: {
|
|
117
|
+
sample: {
|
|
118
|
+
sourceDir: 'src/sample',
|
|
119
|
+
outputDir: 'dist/sample',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
};
|
|
115
123
|
```
|
|
116
124
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
125
|
+
例:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
src/sample/pages/index.html.njk → dist/sample/index.html
|
|
129
|
+
src/sample/pages/assets/css/style.css.njk → dist/sample/assets/css/style.css
|
|
130
|
+
src/sample/pages/assets/image/logo.svg → dist/sample/assets/image/logo.svg
|
|
121
131
|
```
|
|
122
132
|
|
|
123
|
-
|
|
124
|
-
- 空ではない既存ディレクトリは上書きしません
|
|
133
|
+
推奨命名:
|
|
125
134
|
|
|
126
|
-
|
|
135
|
+
- HTML は `index.html.njk`、`request/index.html.njk` のように最終拡張子を含める
|
|
136
|
+
- CSS / JS を Nunjucks で処理する場合は `style.css.njk`、`main.js.njk` のように書く
|
|
137
|
+
- 画像などテンプレート処理しないファイルは通常の拡張子のまま置く
|
|
127
138
|
|
|
128
|
-
|
|
139
|
+
`templates` に指定した `layouts` / `components` は loader の検索パスになり、直接出力されません。
|
|
129
140
|
|
|
130
|
-
|
|
141
|
+
legacy の `render` / `copy` も引き続き使えます。ただし同じプロジェクトで `files` と `render` / `copy` は同時に設定できません。詳細は [docs/configuration.md](docs/configuration.md) を参照してください。
|
|
131
142
|
|
|
132
|
-
|
|
133
|
-
|
|
143
|
+
## data / filters / globals
|
|
144
|
+
|
|
145
|
+
`defaults.data` と project の `data` はテンプレート context に渡されます。Nunjucks の filter / global も `jskim.config.js` から登録できます。
|
|
146
|
+
|
|
147
|
+
```js
|
|
148
|
+
data: {
|
|
149
|
+
site: { name: 'JSKim Sample', language: 'ja' },
|
|
150
|
+
},
|
|
151
|
+
nunjucks: {
|
|
152
|
+
filters: {
|
|
153
|
+
formatPrice(value) {
|
|
154
|
+
return `${Number(value).toLocaleString('ja-JP')}円`;
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
globals: {
|
|
158
|
+
currentYear() {
|
|
159
|
+
return new Date().getFullYear();
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Nunjucks は `autoescape: true` です。JavaScript に JSON を埋め込む filter は `nunjucks.runtime.SafeString` を返してください。
|
|
166
|
+
|
|
167
|
+
```js
|
|
168
|
+
toJson(value) {
|
|
169
|
+
const nunjucks = require('nunjucks');
|
|
170
|
+
return new nunjucks.runtime.SafeString(JSON.stringify(value));
|
|
171
|
+
}
|
|
134
172
|
```
|
|
135
173
|
|
|
136
|
-
|
|
174
|
+
機密情報を `data` やテンプレートへ入れると、生成済み HTML / JS / CSS に含まれる可能性があります。API key、token、社内 URL などの secret は公開成果物に混入しないよう確認してください。
|
|
175
|
+
|
|
176
|
+
## このリポジトリでの開発コマンド
|
|
177
|
+
|
|
178
|
+
開発リポジトリでは従来どおり `npm run` も使えます。
|
|
137
179
|
|
|
138
180
|
```bash
|
|
181
|
+
npm install
|
|
139
182
|
npm run build -- sample
|
|
140
|
-
|
|
141
|
-
jskim build sample
|
|
183
|
+
npm run dev -- sample
|
|
142
184
|
```
|
|
143
185
|
|
|
144
186
|
`sample` は `jskim.config.js` の `projects` に登録されたプロジェクト名です。
|
|
145
187
|
|
|
146
|
-
##
|
|
188
|
+
## watch
|
|
147
189
|
|
|
148
190
|
```bash
|
|
149
191
|
npm run watch -- sample
|
|
@@ -158,168 +200,68 @@ jskim watch sample
|
|
|
158
200
|
3. 変更検知後、debounce して全体ビルドを再実行
|
|
159
201
|
4. ビルドエラーがあってもウォッチャーは維持し、次の保存で再試行
|
|
160
202
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
マージ済みプロジェクト設定から計算します。
|
|
164
|
-
|
|
165
|
-
- `sourceDir` + `render[].from`(例: `src/sample/pages`)
|
|
166
|
-
- `sourceDir` + `templates[]`(例: `src/sample/layouts`, `src/sample/components`)
|
|
167
|
-
- `sourceDir` + `copy[].from`(例: `src/sample/assets`)
|
|
168
|
-
|
|
169
|
-
`dist/`、`node_modules/`、`outputDir` は監視しません。
|
|
170
|
-
|
|
171
|
-
### 現在の方針
|
|
203
|
+
監視対象はマージ済みプロジェクト設定から計算します。
|
|
172
204
|
|
|
173
|
-
-
|
|
174
|
-
- `
|
|
175
|
-
- `
|
|
176
|
-
- 設定の読み込み / 検証に失敗しても process は終了せず、以前の正常な設定を継続します。
|
|
177
|
-
- `serve` は config を監視しません。設定変更後は serve process の再起動が必要です。
|
|
178
|
-
- 終了: `Ctrl+C`(SIGINT)または SIGTERM → `[JSKim] ウォッチを停止しました。`
|
|
205
|
+
- files mode: `sourceDir` + `files[].from`、`sourceDir` + `templates[]`
|
|
206
|
+
- legacy mode: `sourceDir` + `render[].from`、`sourceDir` + `templates[]`、`sourceDir` + `copy[].from`
|
|
207
|
+
- `dist/`、`node_modules/`、`outputDir` は監視しません
|
|
179
208
|
|
|
180
|
-
|
|
209
|
+
`watch` / `dev` は `jskim.config.js` の変更を検知し、正常なら監視対象を更新して全体ビルドします。`dev` で `outputDir` / `serve.host` / `serve.port` / `dev.liveReload` を変えた場合は process 再起動が必要です。
|
|
181
210
|
|
|
182
|
-
|
|
183
|
-
- 正常な変更: watcher 再構成 → 全体ビルド
|
|
184
|
-
- 不正な設定: 以前の正常な設定を維持し、修正後に自動で再試行
|
|
185
|
-
- `watch` では `outputDir` 変更も適用できます(以前の outputDir は自動削除しません)
|
|
186
|
-
- `dev` では次の変更は process 再起動が必要です:
|
|
187
|
-
- `outputDir`
|
|
188
|
-
- `serve.host`
|
|
189
|
-
- `serve.port`
|
|
190
|
-
- `dev.liveReload`
|
|
191
|
-
- `dev` で対応できる設定変更が成功し、build も成功した場合だけ browser reload を 1 回送ります
|
|
211
|
+
## serve / dev
|
|
192
212
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
## 静的サーバー(serve)
|
|
213
|
+
`serve` は **すでにビルドされた** `outputDir` をローカルで確認するためのコマンドです。
|
|
196
214
|
|
|
197
215
|
```bash
|
|
198
216
|
npm run build -- sample
|
|
199
217
|
npm run serve -- sample
|
|
200
|
-
# または
|
|
201
|
-
jskim build sample
|
|
202
|
-
jskim serve sample
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
`serve` は **すでにビルドされた** `outputDir` をローカルで確認するためのコマンドです。
|
|
206
|
-
|
|
207
|
-
- 自動で build / watch は実行しません
|
|
208
|
-
- サーバールートは `outputDir`(例: `dist/sample`)
|
|
209
|
-
- 対応 HTTP メソッドは `GET` と `HEAD` のみ
|
|
210
|
-
- ライブリロードはありません(HTML を変換しません)
|
|
211
|
-
- ローカル確認用です(本番サーバー機能ではありません)
|
|
212
|
-
|
|
213
|
-
既定の接続先:
|
|
214
|
-
|
|
215
|
-
```text
|
|
216
|
-
http://127.0.0.1:3000/
|
|
217
218
|
```
|
|
218
219
|
|
|
219
|
-
`
|
|
220
|
-
|
|
221
|
-
`outputDir` が無い場合は、先に build するよう案内して終了します。
|
|
222
|
-
|
|
223
|
-
終了: `Ctrl+C` → `[JSKim] 静的サーバーを停止しました。`
|
|
224
|
-
|
|
225
|
-
## 開発サーバー(dev)
|
|
220
|
+
`dev` は build + watch + serve を統合します。
|
|
226
221
|
|
|
227
222
|
```bash
|
|
228
223
|
npm run dev -- sample
|
|
229
|
-
# または
|
|
230
|
-
jskim dev sample
|
|
231
224
|
```
|
|
232
225
|
|
|
233
|
-
`dev` は次を統合します。
|
|
234
|
-
|
|
235
|
-
1. 初回に全体ビルド
|
|
236
|
-
2. 実際の `outputDir`(`dist`)を静的サーバーで提供
|
|
237
|
-
3. ファイル監視と全体再ビルド(`watch` と同じ debounce / 直列化)
|
|
238
|
-
4. **成功した再ビルドのあとだけ** ブラウザを全体リロード(SSE)
|
|
239
|
-
|
|
240
|
-
ポイント:
|
|
241
|
-
|
|
242
|
-
- メモリ専用レンダリングではなく、常に実際の `dist` を提供します
|
|
243
|
-
- ライブリロードは HMR ではなく **ページ全体の reload** です
|
|
244
|
-
- `dist` ファイルへ script を書き込みません。dev の HTML レスポンスにだけ一時注入します
|
|
245
|
-
- ビルドエラー時も watcher / server は維持し、reload は送りません
|
|
246
|
-
- ブラウザ自動起動はサポートしません
|
|
247
|
-
- `watch.debounce` / `serve.host` / `serve.port` / `dev.liveReload` を使います
|
|
248
|
-
|
|
249
226
|
既定 URL:
|
|
250
227
|
|
|
251
228
|
```text
|
|
252
229
|
http://127.0.0.1:3000/
|
|
253
230
|
```
|
|
254
231
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
`jskim.config.js` の build / watch 関連設定は hot reload されます。
|
|
258
|
-
`outputDir` / `serve.host` / `serve.port` / `dev.liveReload` を変えた場合は `dev` を再起動してください。
|
|
259
|
-
|
|
260
|
-
終了: `Ctrl+C` → `[JSKim] 開発サーバーを停止しました。`
|
|
261
|
-
|
|
262
|
-
### 予約パス `/_jskim/live-reload`
|
|
263
|
-
|
|
264
|
-
`dev.liveReload: true` のとき、JSKim が内部で使う予約パスです。
|
|
265
|
-
|
|
266
|
-
- 実際の静的ファイルパスとして使わないことを推奨します
|
|
267
|
-
- `serve` ではこの endpoint は有効になりません
|
|
268
|
-
- `dev.liveReload: false` のときも有効になりません
|
|
269
|
-
|
|
270
|
-
## テスト
|
|
271
|
-
|
|
272
|
-
```bash
|
|
273
|
-
npm test
|
|
274
|
-
```
|
|
232
|
+
ポイント:
|
|
275
233
|
|
|
276
|
-
|
|
234
|
+
- `serve` は自動で build / watch を実行しません
|
|
235
|
+
- サーバールートは `outputDir`(例: `dist/sample`)
|
|
236
|
+
- `serve` は HTML を変換せず、ライブリロード script を注入しません
|
|
237
|
+
- `dev` は成功した再ビルドのあとだけ SSE でページ全体 reload を送ります
|
|
238
|
+
- `dev` でも `dist` ファイルへ script は書き込みません
|
|
239
|
+
- ブラウザ自動起動はサポートしません
|
|
277
240
|
|
|
278
|
-
-
|
|
279
|
-
- 各テストは一時ワークスペース(`os.tmpdir`)で実行します
|
|
280
|
-
- build / watch / serve / dev / 言語ポリシーの回帰を検証します
|
|
241
|
+
`/_jskim/live-reload` は `dev.liveReload: true` のときだけ使う内部予約パスです。実際の静的ファイルパスとしては使わないことを推奨します。
|
|
281
242
|
|
|
282
243
|
## 基本ディレクトリ構成
|
|
283
244
|
|
|
284
245
|
```text
|
|
285
246
|
jskim/
|
|
286
247
|
├─ bin/
|
|
287
|
-
│ └─ jskim.js
|
|
288
248
|
├─ jskim.config.js
|
|
289
249
|
├─ scripts/
|
|
290
|
-
│ ├─ build.js
|
|
291
|
-
│ ├─ watch.js
|
|
292
|
-
│ ├─ serve.js
|
|
293
|
-
│ ├─ dev.js
|
|
294
|
-
│ └─ commands/
|
|
295
250
|
├─ src/
|
|
296
251
|
│ └─ sample/
|
|
297
252
|
│ ├─ pages/
|
|
253
|
+
│ │ ├─ index.html.njk
|
|
254
|
+
│ │ ├─ assets/
|
|
255
|
+
│ │ └─ request/
|
|
298
256
|
│ ├─ layouts/
|
|
299
|
-
│
|
|
300
|
-
│ └─ assets/
|
|
257
|
+
│ └─ components/
|
|
301
258
|
└─ dist/
|
|
302
259
|
└─ sample/
|
|
303
260
|
```
|
|
304
261
|
|
|
305
|
-
## jskim.config.js の役割
|
|
306
|
-
|
|
307
|
-
コマンドを実行したディレクトリ(`process.cwd()`)をワークスペースルートとし、そこに置いた `jskim.config.js` がビルド動作の基準です。
|
|
308
|
-
|
|
309
|
-
- `defaults`: 全プロジェクト共通の render / templates / copy / build / watch / serve / dev
|
|
310
|
-
- `projects`: プロジェクトごとの `sourceDir`、`outputDir`、および任意の上書き
|
|
311
|
-
|
|
312
|
-
詳細は [docs/configuration.md](docs/configuration.md) を参照してください。
|
|
313
|
-
|
|
314
|
-
## src と dist の関係
|
|
315
|
-
|
|
316
|
-
- `sourceDir`(例: `src/sample`)に Nunjucks ソースと assets を置きます
|
|
317
|
-
- `outputDir`(例: `dist/sample`)にレンダリング済み HTML とコピーされた静的ファイルが生成されます
|
|
318
|
-
- `dist/` はビルド成果物なので手編集しないでください
|
|
319
|
-
|
|
320
262
|
## rootPath の使い方
|
|
321
263
|
|
|
322
|
-
|
|
264
|
+
各 `.njk` ファイルの最終出力位置を基準に `rootPath` が自動計算され、Nunjucks context に注入されます。
|
|
323
265
|
|
|
324
266
|
```njk
|
|
325
267
|
<link rel="stylesheet" href="{{ rootPath }}assets/css/style.css">
|
|
@@ -329,12 +271,14 @@ jskim/
|
|
|
329
271
|
| 出力ファイル | rootPath |
|
|
330
272
|
|-----------|----------|
|
|
331
273
|
| `dist/sample/index.html` | `./` |
|
|
332
|
-
| `dist/sample/
|
|
333
|
-
| `dist/sample/guide/syntax/
|
|
274
|
+
| `dist/sample/request/index.html` | `../` |
|
|
275
|
+
| `dist/sample/guide/syntax/index.html` | `../../` |
|
|
276
|
+
|
|
277
|
+
`data.rootPath` は予約語のため使えません。
|
|
334
278
|
|
|
335
279
|
## sample
|
|
336
280
|
|
|
337
|
-
`src/sample` は
|
|
281
|
+
`src/sample` は files pipeline、`data`、custom filter、global、ページ別 assets を示す小さなサンプルです。
|
|
338
282
|
|
|
339
283
|
```bash
|
|
340
284
|
npm run build -- sample
|
|
@@ -345,6 +289,14 @@ npm run dev -- sample
|
|
|
345
289
|
|
|
346
290
|
ビルド後、`dist/sample/index.html` または `http://127.0.0.1:3000/` で確認できます。
|
|
347
291
|
|
|
292
|
+
## テスト
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
npm test
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Node 標準の `node:test` / `node:assert` を使います。外部テスト framework は使いません。
|
|
299
|
+
|
|
348
300
|
## リポジトリ
|
|
349
301
|
|
|
350
302
|
- Repository: https://github.com/ywal123456-collab/jskim
|
|
@@ -352,6 +304,4 @@ npm run dev -- sample
|
|
|
352
304
|
|
|
353
305
|
## ライセンス
|
|
354
306
|
|
|
355
|
-
JSKim は MIT License
|
|
356
|
-
自由に使用・修正・再配布・商用利用できます。著作権表示と License 文言の保持が必要であり、無保証です。
|
|
357
|
-
詳細は [`LICENSE`](./LICENSE) を確認してください。
|
|
307
|
+
JSKim は MIT License のもとで提供されます。自由に使用・修正・再配布・商用利用できます。著作権表示と License 文言の保持が必要であり、無保証です。詳細は [`LICENSE`](./LICENSE) を確認してください。
|