@ywal123456/jskim 0.2.0 → 0.3.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.
@@ -2,50 +2,33 @@
2
2
 
3
3
  `jskim.config.js` はワークスペースルート(コマンドを実行した `process.cwd()`)に置き、すべてのビルド動作の基準になります。npm パッケージとして入れた場合も、インストール先ではなく実行時のカレントディレクトリをルートとして扱います。
4
4
 
5
- ## 全体例
5
+ ## 推奨設定例
6
6
 
7
7
  ```js
8
8
  module.exports = {
9
9
  defaults: {
10
- render: [
11
- {
12
- from: 'pages',
13
- to: '',
14
- include: ['**/*.njk'],
15
- extension: '.html',
10
+ files: [{ from: 'pages', to: '' }],
11
+ templates: ['layouts', 'components'],
12
+ data: {
13
+ site: { name: 'JSKim Sample', language: 'ja' },
14
+ },
15
+ nunjucks: {
16
+ filters: {
17
+ formatPrice(value) {
18
+ return `${Number(value).toLocaleString('ja-JP')}円`;
19
+ },
16
20
  },
17
- ],
18
-
19
- templates: [
20
- 'layouts',
21
- 'components',
22
- ],
23
-
24
- copy: [
25
- {
26
- from: 'assets',
27
- to: 'assets',
21
+ globals: {
22
+ currentYear() {
23
+ return new Date().getFullYear();
24
+ },
28
25
  },
29
- ],
30
-
31
- build: {
32
- clean: true,
33
- },
34
-
35
- watch: {
36
- debounce: 150,
37
- },
38
-
39
- serve: {
40
- host: '127.0.0.1',
41
- port: 3000,
42
- },
43
-
44
- dev: {
45
- liveReload: true,
46
26
  },
27
+ build: { clean: true },
28
+ watch: { debounce: 150 },
29
+ serve: { host: '127.0.0.1', port: 3000 },
30
+ dev: { liveReload: true },
47
31
  },
48
-
49
32
  projects: {
50
33
  sample: {
51
34
  sourceDir: 'src/sample',
@@ -55,15 +38,9 @@ module.exports = {
55
38
  };
56
39
  ```
57
40
 
58
- ## defaults
59
-
60
- すべてのプロジェクトに共通で適用される既定値です。
61
-
62
- プロジェクトに同じキーがあれば、プロジェクト側が優先されます。
41
+ ## defaults / projects
63
42
 
64
- ## projects
65
-
66
- プロジェクト名 → 設定オブジェクトのマップです。
43
+ `defaults` はすべてのプロジェクトに共通で適用される既定値です。`projects` はプロジェクト名から設定オブジェクトへのマップです。
67
44
 
68
45
  ```bash
69
46
  npm run build -- sample
@@ -81,46 +58,75 @@ npm run dev -- sample
81
58
 
82
59
  任意:
83
60
 
84
- - `render`, `templates`, `copy`, `build`, `watch`, `serve`, `dev` — defaults の上書き
61
+ - `files`, `render`, `templates`, `copy`, `data`, `nunjucks`, `build`, `watch`, `serve`, `dev`
62
+
63
+ ## mode selection
85
64
 
86
- ## sourceDir
65
+ JSKim には 2 つの build mode があります。
87
66
 
88
- プロジェクトのソースルートです。**ワークスペースルート**基準の相対パス(または絶対パス)です。
67
+ | mode | 条件 | 用途 |
68
+ |------|------|------|
69
+ | files mode | `files` が空でない配列 | v0.3.0 以降の推奨。Nunjucks と静的ファイルを同じルールで扱う |
70
+ | legacy mode | `files` 未設定、かつ `render` が空でない配列 | 既存の `render` / `copy` 設定を継続する |
71
+
72
+ 同じプロジェクトで `files` と `render` / `copy` は同時に設定できません。files mode を使う場合は `render` / `copy` を空にしてください。legacy mode を使う場合は `files` を設定しないでください。
73
+
74
+ ## sourceDir / outputDir
89
75
 
90
- 例: `src/sample`
76
+ `sourceDir` はプロジェクトのソースルートです。`outputDir` はビルド結果のルートです。どちらも **ワークスペースルート** 基準の相対パス(または絶対パス)です。
91
77
 
92
- ## outputDir
78
+ ```js
79
+ projects: {
80
+ sample: {
81
+ sourceDir: 'src/sample',
82
+ outputDir: 'dist/sample',
83
+ },
84
+ },
85
+ ```
93
86
 
94
- ビルド結果のルートです。**ワークスペースルート**基準です。
87
+ `serve` は `outputDir` を静的サーバーのルートとして公開します。
95
88
 
96
- 例: `dist/sample`
89
+ ## files
97
90
 
98
- `serve` はこのディレクトリを静的サーバーのルートとして公開します。
91
+ files mode の処理ルール配列です。
99
92
 
100
- ## render
93
+ | フィールド | 基準 | 必須 | 説明 |
94
+ |------|------|------|------|
95
+ | `from` | sourceDir | 必須 | 探索開始ディレクトリ |
96
+ | `to` | outputDir | 任意 | 出力基準ディレクトリ。未指定または `''` は出力ルート |
97
+ | `include` | from 基準 | 任意 | glob パターン配列。既定は `['**/*']` |
98
+ | `exclude` | from 基準 | 任意 | 除外 glob パターン配列。既定は `[]` |
101
99
 
102
- Nunjucks ファイルを HTML にレンダリングするルール配列です。
100
+ 処理:
103
101
 
104
- | フィールド | 基準 | 説明 |
105
- |------|------|------|
106
- | `from` | sourceDir | 探索開始ディレクトリ |
107
- | `to` | outputDir | 出力基準ディレクトリ(`''` = 出力ルート) |
108
- | `include` | from 基準 | glob パターン配列 |
109
- | `extension` | — | 出力拡張子(例: `.html`) |
102
+ - 末尾が `.njk` のファイルは Nunjucks でレンダリングし、末尾の `.njk` だけを外して出力する
103
+ - それ以外のファイルは byte copy する
104
+ - 出力先が同じになるファイルが複数ある場合はエラーにする
105
+ - `templates[]` 配下のファイルは直接出力しない
110
106
 
111
107
  例:
112
108
 
113
109
  ```text
114
- src/sample/pages/index.njk → dist/sample/index.html
115
- src/sample/pages/guide/basic.njk → dist/sample/guide/basic.html
110
+ src/sample/pages/index.html.njk → dist/sample/index.html
111
+ src/sample/pages/assets/css/style.css.njk → dist/sample/assets/css/style.css
112
+ src/sample/pages/assets/image/logo.svg → dist/sample/assets/image/logo.svg
116
113
  ```
117
114
 
118
- `layouts` と `components` は render 対象ではなく、直接出力されません。
115
+ 推奨命名:
116
+
117
+ - HTML: `index.html.njk`
118
+ - CSS: `style.css.njk`
119
+ - JS: `main.js.njk`
120
+ - Nunjucks 処理しない画像など: `logo.svg`
119
121
 
120
122
  ## templates
121
123
 
122
124
  Nunjucks loader の追加検索パスです。**sourceDir** 基準です。
123
125
 
126
+ ```js
127
+ templates: ['layouts', 'components'],
128
+ ```
129
+
124
130
  `sourceDir` 自体も常に loader root に含まれるため、次が動作します。
125
131
 
126
132
  ```njk
@@ -128,113 +134,164 @@ Nunjucks loader の追加検索パスです。**sourceDir** 基準です。
128
134
  {% include "components/header.njk" %}
129
135
  ```
130
136
 
131
- ## copy
137
+ files mode では、`templates` に指定された既存ディレクトリ配下のファイルは直接出力から除外されます。layout / component を `files[].from` の範囲内に置いた場合でも、`templates` として指定しておけば出力対象になりません。
132
138
 
133
- 静的ファイルを変換せずにコピーするルール配列です。
139
+ ## data
134
140
 
135
- | フィールド | 基準 | 説明 |
136
- |------|------|------|
137
- | `from` | sourceDir | コピー元 |
138
- | `to` | outputDir | コピー先 |
141
+ `data` はすべての Nunjucks レンダリング context に渡される plain object です。
139
142
 
140
- `from` が無い場合は警告のみ出してビルドを続行します。
143
+ ```js
144
+ data: {
145
+ site: {
146
+ name: 'JSKim Sample',
147
+ language: 'ja',
148
+ themeColor: '#222222',
149
+ },
150
+ samplePrice: 12000,
151
+ },
152
+ ```
141
153
 
142
- ## build.clean
154
+ テンプレートでは通常の変数として参照できます。
143
155
 
144
- `true` のとき、ビルド前に `outputDir` だけを整理します。
156
+ ```njk
157
+ <html lang="{{ site.language }}">
158
+ {{ samplePrice }}
159
+ ```
145
160
 
146
- 次のパスは削除せず、該当すればエラーで終了します。
161
+ `rootPath` は JSKim が注入する予約キーです。`data.rootPath` は使えません。
147
162
 
148
- - ファイルシステムルート
149
- - ワークスペースルート
150
- - sourceDir 自体
151
- - sourceDir の上位パス
152
- - 空のパス
163
+ 機密情報を `data` に入れると、生成済み HTML / JS / CSS に出力される可能性があります。API key、token、社内 URL などの secret は入れないでください。
153
164
 
154
- ## watch.debounce
165
+ ## nunjucks.filters / nunjucks.globals
155
166
 
156
- ファイル変更後、全体再ビルドを開始するまでの待ち時間(ms)です。
167
+ Nunjucks のカスタム filter / global を `jskim.config.js` から登録できます。
157
168
 
158
- | 項目 | 内容 |
159
- |------|------|
160
- | 型 | `number`(有限の非負数) |
161
- | 既定値 | `150` |
162
- | マージ | `build` と同様にオブジェクト 1 段階マージ — プロジェクトで `watch.debounce` だけ上書き可能 |
169
+ ```js
170
+ nunjucks: {
171
+ filters: {
172
+ formatPrice(value) {
173
+ return `${Number(value).toLocaleString('ja-JP')}円`;
174
+ },
175
+ toJson(value) {
176
+ const nunjucks = require('nunjucks');
177
+ return new nunjucks.runtime.SafeString(JSON.stringify(value));
178
+ },
179
+ },
180
+ globals: {
181
+ currentYear() {
182
+ return new Date().getFullYear();
183
+ },
184
+ },
185
+ },
186
+ ```
163
187
 
164
- プロジェクト別の上書き例:
188
+ filter は function である必要があります。global は function 以外の値も登録できます。非同期 filter / global は現在サポートしていません。
189
+
190
+ Nunjucks は `autoescape: true` です。JavaScript テンプレートへ JSON を埋め込む場合は、HTML escape されないよう `SafeString` を返す filter を使ってください。
191
+
192
+ ```njk
193
+ const site = {{ site | toJson }};
194
+ ```
195
+
196
+ ## legacy render / copy
197
+
198
+ 既存プロジェクト向けに `render` / `copy` は継続サポートします。
165
199
 
166
200
  ```js
167
- projects: {
168
- sample: {
169
- sourceDir: 'src/sample',
170
- outputDir: 'dist/sample',
171
- watch: {
172
- debounce: 300,
201
+ defaults: {
202
+ render: [
203
+ {
204
+ from: 'pages',
205
+ to: '',
206
+ include: ['**/*.njk'],
207
+ extension: '.html',
173
208
  },
174
- },
209
+ ],
210
+ templates: ['layouts', 'components'],
211
+ copy: [
212
+ {
213
+ from: 'assets',
214
+ to: 'assets',
215
+ },
216
+ ],
175
217
  },
176
218
  ```
177
219
 
178
- 不正な値:
220
+ ### render
221
+
222
+ Nunjucks ファイルを HTML などへレンダリングするルール配列です。
223
+
224
+ | フィールド | 基準 | 説明 |
225
+ |------|------|------|
226
+ | `from` | sourceDir | 探索開始ディレクトリ |
227
+ | `to` | outputDir | 出力基準ディレクトリ(`''` = 出力ルート) |
228
+ | `include` | from 基準 | glob パターン配列 |
229
+ | `extension` | — | 出力拡張子(例: `.html`) |
230
+
231
+ legacy render では `pages/index.njk` を `index.html` のように出力する構成が一般的です。
232
+
233
+ ### copy
179
234
 
180
- - 負数
181
- - 数値でない
182
- - `NaN` / `Infinity`
235
+ 静的ファイルを変換せずにコピーするルール配列です。
183
236
 
184
- この場合は設定エラーで終了します。
237
+ | フィールド | 基準 | 説明 |
238
+ |------|------|------|
239
+ | `from` | sourceDir | コピー元 |
240
+ | `to` | outputDir | コピー先 |
185
241
 
186
- 注意:
242
+ `from` が無い場合は警告のみ出してビルドを続行します。
187
243
 
188
- - `watch` / `dev` 実行中は `jskim.config.js` 自体も監視します
189
- - 正常な設定変更は監視対象の再構成と全体ビルドに反映されます
190
- - 設定の読み込み / 検証エラー時は以前の正常な設定を継続します
244
+ ## collision
191
245
 
192
- ## serve.host
246
+ files mode では出力パスの衝突を検出します。たとえば同じ `files` 範囲に `about.html` と `about.html.njk` がある場合、どちらも `about.html` に出力されるためエラーになります。Windows では大文字小文字の違いだけの衝突も同じ出力として扱います。
193
247
 
194
- ローカル静的サーバーのバインドホストです。
248
+ ## rootPath
195
249
 
196
- | 項目 | 内容 |
197
- |------|------|
198
- | 型 | 空でない `string` |
199
- | 既定値 | `'127.0.0.1'` |
200
- | マージ | `serve` オブジェクトの 1 段階マージ |
250
+ `.njk` ファイルの最終出力位置を基準に `rootPath` が自動計算され、Nunjucks context に注入されます。
201
251
 
202
- 不正な値(空文字・非文字列)は設定エラーで終了します。
252
+ ```njk
253
+ <link rel="stylesheet" href="{{ rootPath }}assets/css/style.css">
254
+ <a href="{{ rootPath }}index.html">Home</a>
255
+ ```
256
+
257
+ | 出力ファイル | rootPath |
258
+ |-----------|----------|
259
+ | `dist/sample/index.html` | `./` |
260
+ | `dist/sample/request/index.html` | `../` |
261
+ | `dist/sample/guide/syntax/index.html` | `../../` |
262
+
263
+ ## build.clean
264
+
265
+ `true` のとき、ビルド前に `outputDir` だけを整理します。
266
+
267
+ 次のパスは削除せず、該当すればエラーで終了します。
268
+
269
+ - ファイルシステムルート
270
+ - ワークスペースルート
271
+ - sourceDir 自体
272
+ - sourceDir の上位パス
273
+ - 空のパス
203
274
 
204
- ## serve.port
275
+ ## watch.debounce
205
276
 
206
- ローカル静的サーバーのポートです。
277
+ ファイル変更後、全体再ビルドを開始するまでの待ち時間(ms)です。
207
278
 
208
279
  | 項目 | 内容 |
209
280
  |------|------|
210
- | 型 | 整数 |
211
- | 範囲 | `1` 以上 `65535` 以下 |
212
- | 既定値 | `3000` |
213
- | マージ | `serve` オブジェクトの 1 段階マージ — `serve.port` だけ上書き可能 |
281
+ | 型 | `number`(有限の非負数) |
282
+ | 既定値 | `150` |
283
+ | マージ | `watch` オブジェクトの 1 段階マージ |
214
284
 
215
- プロジェクト別の上書き例:
285
+ 不正な値(負数、数値でない、`NaN` / `Infinity`)は設定エラーで終了します。
216
286
 
217
- ```js
218
- projects: {
219
- sample: {
220
- sourceDir: 'src/sample',
221
- outputDir: 'dist/sample',
222
- serve: {
223
- port: 4000,
224
- },
225
- },
226
- },
227
- ```
287
+ ## serve.host / serve.port
228
288
 
229
- 不正な値の例: 文字列、小数、`NaN`、負数、`0`、`65536` 以上。
289
+ ローカル静的サーバーのバインドホストとポートです。
230
290
 
231
- エラー例:
232
-
233
- ```text
234
- [JSKim] 設定値が不正です: serve.port
235
- 1から65535までの整数を指定してください。
236
- 受け取った値: -1
237
- ```
291
+ | 設定 | 型 | 既定値 |
292
+ |------|------|------|
293
+ | `serve.host` | 空でない `string` | `'127.0.0.1'` |
294
+ | `serve.port` | `1` 以上 `65535` 以下の整数 | `3000` |
238
295
 
239
296
  `serve` は自動ビルドしません。`outputDir` が無い場合は先に `npm run build -- <name>` を実行してください。
240
297
 
@@ -252,7 +309,7 @@ projects: {
252
309
 
253
310
  - `GET /_jskim/live-reload` で SSE を提供
254
311
  - HTML レスポンスにだけ client script を一時注入(`dist` には書き込まない)
255
- - **成功した再ビルドのあとだけ** `reload` event を送信
312
+ - 成功した再ビルドのあとだけ `reload` event を送信
256
313
 
257
314
  `false` のとき:
258
315
 
@@ -260,48 +317,12 @@ projects: {
260
317
  - HTML への script 注入なし
261
318
  - build + watch + serve 自体は動作
262
319
 
263
- ### 予約パス `/_jskim/live-reload`
264
-
265
- `dev.liveReload: true` のときだけ有効になる内部 SSE endpoint です。
266
-
267
- - JSKim が予約するパスであり、プロジェクトの静的ファイルとしては使わないことを推奨します
268
- - `serve` コマンドでは有効になりません
269
- - `dev.liveReload: false` では有効になりません
270
- - パス自体を設定で変更するオプションはありません
271
-
272
- プロジェクト別の上書き例:
273
-
274
- ```js
275
- projects: {
276
- sample: {
277
- sourceDir: 'src/sample',
278
- outputDir: 'dist/sample',
279
- dev: {
280
- liveReload: false,
281
- },
282
- },
283
- },
284
- ```
285
-
286
- 不正な値(boolean 以外)は設定エラーで終了します。
287
-
288
- ### dev が再利用する設定
289
-
290
- | 設定 | 用途 |
291
- |------|------|
292
- | `watch.debounce` | 変更後の再ビルド待ち時間 |
293
- | `serve.host` | 開発サーバーのホスト |
294
- | `serve.port` | 開発サーバーのポート |
295
- | `dev.liveReload` | ライブリロード on/off |
296
-
297
- `dev.host` / `dev.port` / `dev.debounce` は用意しません。
320
+ `/_jskim/live-reload` は内部予約パスです。プロジェクトの静的ファイルとしては使わないことを推奨します。
298
321
 
299
322
  ## config hot reload
300
323
 
301
324
  `watch` と `dev` はワークスペースルートの `jskim.config.js` を監視します。
302
325
 
303
- ### コマンド別
304
-
305
326
  | コマンド | 動作 |
306
327
  |----------|------|
307
328
  | `build` | 実行時に config を 1 回読み込む。監視しない |
@@ -309,25 +330,7 @@ projects: {
309
330
  | `watch` | config 変更を hot apply。`outputDir` 変更も可。以前の outputDir は自動削除しない |
310
331
  | `dev` | build / watch 関連設定を hot apply。一部 runtime 設定は再起動が必要 |
311
332
 
312
- ### 正常な reload
313
-
314
- 1. config 変更を検知
315
- 2. fresh load(CommonJS require cache を `jskim.config.js` について削除)
316
- 3. merge / project resolve / validation
317
- 4. watcher 再構成
318
- 5. 全体ビルド
319
-
320
- ### エラー時
321
-
322
- | 状況 | 動作 |
323
- |------|------|
324
- | config load / resolve / validation エラー | 以前の正常な設定を維持。process は終了しない |
325
- | 新しい設定適用後の build エラー | 新しい設定 / watcher を維持。process は終了しない。修正後に再試行 |
326
- | config 一時削除(unlink) | 以前の設定を継続。再作成後に reload |
327
-
328
- ### `dev` で再起動が必要な設定
329
-
330
- 次の値が変わった candidate config は適用しません。
333
+ `dev` では次の値が変わった candidate config は適用しません。
331
334
 
332
335
  - `outputDir`
333
336
  - `serve.host`
@@ -336,32 +339,26 @@ projects: {
336
339
 
337
340
  理由: server bind と serve root を安全に切り替えるには process 再起動が必要で、部分適用すると build output と serve root がずれるためです。
338
341
 
339
- ### 制限
340
-
341
- - config hot reload は常に **全体ビルド** です(増分 build ではありません)
342
- - `jskim.config.js` が require した別 helper module だけの変更は自動反映しません。config を保存し直すか process を再起動してください
343
- - `node_modules` や JSKim package 自身の require cache は一括削除しません
344
-
345
342
  ## パス基準のまとめ
346
343
 
347
344
  | 設定 | 基準 |
348
345
  |------|------|
349
346
  | `sourceDir`, `outputDir` | ワークスペースルート(`jskim.config.js` の場所) |
350
- | `render[].from`, `templates[]`, `copy[].from` | `sourceDir` |
351
- | `render[].to`, `copy[].to` | `outputDir` |
347
+ | `files[].from`, `render[].from`, `templates[]`, `copy[].from` | `sourceDir` |
348
+ | `files[].to`, `render[].to`, `copy[].to` | `outputDir` |
349
+ | `files[].include`, `files[].exclude`, `render[].include` | 各 `from` |
352
350
 
353
351
  Windows / POSIX とも `node:path` で解釈します。HTML 内パス(`rootPath` など)は `/` を使います。
354
352
 
355
- ## 配列マージ規則
353
+ ## マージ規則
356
354
 
357
355
  - **通常値**: プロジェクト設定があれば優先、なければ defaults
358
- - **オブジェクト**(`build`, `watch`, `serve`, `dev` など): 1 段階マージ — 例: `build.clean`、`watch.debounce`、`serve.port`、`dev.liveReload` だけ上書き可能
359
- - **配列**(`render`, `templates`, `copy`): プロジェクトに同じ配列があれば **defaults 配列を丸ごと置き換え**。項目単位の自動マージなし
356
+ - **オブジェクト**(`build`, `watch`, `serve`, `dev`, `data`, `nunjucks`): 1 段階マージ
357
+ - **`nunjucks.filters` / `nunjucks.globals`**: それぞれ 1 段階マージ
358
+ - **配列**(`files`, `render`, `templates`, `copy`): プロジェクトに同じ配列があれば defaults 配列を丸ごと置き換え。項目単位の自動マージなし
360
359
 
361
360
  元の `defaults` とプロジェクト設定オブジェクトは変更しません。
362
361
 
363
362
  ## 外部パス
364
363
 
365
- `sourceDir` / `outputDir` にワークスペース外のパスを使うことは禁止しません。
366
- フレームワークは Git 構成やフォルダ配置を強制しません。
367
- ただし clean の安全装置(上記)は常に適用されます。
364
+ `sourceDir` / `outputDir` にワークスペース外のパスを使うことは禁止しません。フレームワークは Git 構成やフォルダ配置を強制しません。ただし clean の安全装置は常に適用されます。
@@ -7,8 +7,8 @@
7
7
  ## 役割
8
8
 
9
9
  - 新しい JSKim プロジェクトディレクトリを作る
10
- - 標準 `src/sample` と `jskim.config.js` を含める
11
- - 生成後の `npm install` / `git init` は **実行しない**
10
+ - files pipeline 版の標準 `src/sample` と `jskim.config.js` を含める
11
+ - 生成後の `npm install` / `git init` は実行しない
12
12
 
13
13
  ## 名称の区別
14
14
 
@@ -35,16 +35,31 @@ project/
35
35
  ├─ jskim.config.js
36
36
  ├─ README.md
37
37
  ├─ .gitignore
38
- └─ src/sample/
38
+ └─ src/
39
+ └─ sample/
40
+ ├─ pages/
41
+ │ ├─ index.html.njk
42
+ │ ├─ assets/
43
+ │ │ ├─ css/style.css.njk
44
+ │ │ ├─ js/main.js.njk
45
+ │ │ └─ image/logo.svg
46
+ │ └─ request/
47
+ │ ├─ index.html.njk
48
+ │ └─ assets/
49
+ ├─ layouts/base.njk
50
+ └─ components/
51
+ ├─ header.njk
52
+ └─ footer.njk
39
53
  ```
40
54
 
41
- `package.json` scripts bin `jskim` を使います(package name ではありません)。
42
- 既定の engine dependency は `@ywal123456/jskim`(`^0.2.0`)です。
55
+ `jskim.config.js` `files: [{ from: 'pages', to: '' }]` を使います。`.njk` は末尾の `.njk` だけを外してレンダリングし、画像などはそのままコピーします。
56
+
57
+ `package.json` の scripts は bin 名 `jskim` を使います(package name ではありません)。既定の engine dependency は `@ywal123456/jskim`(`^0.3.0`)です。
43
58
 
44
59
  ```json
45
60
  {
46
61
  "devDependencies": {
47
- "@ywal123456/jskim": "^0.2.0"
62
+ "@ywal123456/jskim": "^0.3.0"
48
63
  },
49
64
  "scripts": {
50
65
  "build": "jskim build sample",
@@ -70,7 +85,7 @@ create package の `package.json` に `jskimEngine` metadata を持ち、生成
70
85
  {
71
86
  "jskimEngine": {
72
87
  "packageName": "@ywal123456/jskim",
73
- "version": "^0.2.0"
88
+ "version": "^0.3.0"
74
89
  }
75
90
  }
76
91
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ywal123456/jskim",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Nunjucks-based static HTML build environment with watch, serve, and live reload",
5
5
  "keywords": [
6
6
  "nunjucks",
@@ -7,23 +7,17 @@ const { createNunjucksEnv } = require('./create-nunjucks-env');
7
7
  const { cleanOutput } = require('./clean-output');
8
8
  const { renderPages } = require('./render-pages');
9
9
  const { copyFiles } = require('./copy-files');
10
+ const { processFiles } = require('./process-files');
10
11
 
11
12
  /**
12
13
  * 設定を読み込み、プロジェクトを解決してフルビルドを実行します。
13
14
  *
14
15
  * @param {string|undefined} projectName
15
16
  * @param {object} [options]
16
- * @param {string} [options.workspaceRoot]
17
- * @param {string} [options.commandName='build']
18
- * @param {string} [options.usageLine]
19
- * @param {string} [options.logTitle='ビルドが完了しました']
20
- * @param {boolean} [options.includeOutput=true]
21
- * @param {boolean} [options.log=true]
22
17
  * @returns {Promise<object>}
23
18
  */
24
19
  async function buildProject(projectName, options = {}) {
25
- const workspaceRoot =
26
- options.workspaceRoot || process.cwd();
20
+ const workspaceRoot = options.workspaceRoot || process.cwd();
27
21
  const commandName = options.commandName || 'build';
28
22
 
29
23
  const { config } = loadConfig(workspaceRoot);
@@ -39,7 +33,7 @@ async function buildProject(projectName, options = {}) {
39
33
  }
40
34
 
41
35
  /**
42
- * 解決済みプロジェクトに対して clean → render → copy を実行します。
36
+ * 解決済みプロジェクトに対して clean → pipeline を実行します。
43
37
  *
44
38
  * @param {object} project
45
39
  * @param {object} [options]
@@ -62,10 +56,22 @@ async function runBuild(project, options = {}) {
62
56
  const env = createNunjucksEnv({
63
57
  sourceDir: project.sourceDir,
64
58
  templates: project.templates,
59
+ nunjucks: project.nunjucks,
65
60
  });
66
61
 
67
- const { renderedCount } = await renderPages({ env, project });
68
- const { copiedCount } = await copyFiles({ project });
62
+ let renderedCount = 0;
63
+ let copiedCount = 0;
64
+
65
+ if (project.pipelineMode === 'files') {
66
+ const result = await processFiles({ env, project });
67
+ renderedCount = result.renderedCount;
68
+ copiedCount = result.copiedCount;
69
+ } else {
70
+ const rendered = await renderPages({ env, project });
71
+ const copied = await copyFiles({ project });
72
+ renderedCount = rendered.renderedCount;
73
+ copiedCount = copied.copiedCount;
74
+ }
69
75
 
70
76
  const outputDisplay = path
71
77
  .relative(project.workspaceRoot, project.outputDir)
@@ -92,7 +98,7 @@ function printBuildResult(result, options = {}) {
92
98
 
93
99
  console.log(`[JSKim] ${logTitle}`);
94
100
  console.log(`プロジェクト: ${result.project.name}`);
95
- console.log(`レンダリングしたページ数: ${result.renderedCount}`);
101
+ console.log(`レンダリングしたファイル数: ${result.renderedCount}`);
96
102
  console.log(`コピーしたファイル数: ${result.copiedCount}`);
97
103
  if (includeOutput) {
98
104
  console.log(`出力先: ${result.outputDisplay}`);