@ywal123456/jskim 0.1.1 → 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`
85
62
 
86
- ## sourceDir
63
+ ## mode selection
87
64
 
88
- プロジェクトのソースルートです。**ワークスペースルート**基準の相対パス(または絶対パス)です。
65
+ JSKim には 2 つの build mode があります。
89
66
 
90
- 例: `src/sample`
67
+ | mode | 条件 | 用途 |
68
+ |------|------|------|
69
+ | files mode | `files` が空でない配列 | v0.3.0 以降の推奨。Nunjucks と静的ファイルを同じルールで扱う |
70
+ | legacy mode | `files` 未設定、かつ `render` が空でない配列 | 既存の `render` / `copy` 設定を継続する |
91
71
 
92
- ## outputDir
72
+ 同じプロジェクトで `files` と `render` / `copy` は同時に設定できません。files mode を使う場合は `render` / `copy` を空にしてください。legacy mode を使う場合は `files` を設定しないでください。
93
73
 
94
- ビルド結果のルートです。**ワークスペースルート**基準です。
74
+ ## sourceDir / outputDir
95
75
 
96
- 例: `dist/sample`
76
+ `sourceDir` はプロジェクトのソースルートです。`outputDir` はビルド結果のルートです。どちらも **ワークスペースルート** 基準の相対パス(または絶対パス)です。
97
77
 
98
- `serve` はこのディレクトリを静的サーバーのルートとして公開します。
78
+ ```js
79
+ projects: {
80
+ sample: {
81
+ sourceDir: 'src/sample',
82
+ outputDir: 'dist/sample',
83
+ },
84
+ },
85
+ ```
99
86
 
100
- ## render
87
+ `serve` は `outputDir` を静的サーバーのルートとして公開します。
101
88
 
102
- Nunjucks ファイルを HTML にレンダリングするルール配列です。
89
+ ## files
103
90
 
104
- | フィールド | 基準 | 説明 |
105
- |------|------|------|
106
- | `from` | sourceDir | 探索開始ディレクトリ |
107
- | `to` | outputDir | 出力基準ディレクトリ(`''` = 出力ルート) |
108
- | `include` | from 基準 | glob パターン配列 |
109
- | `extension` | | 出力拡張子(例: `.html`) |
91
+ files mode の処理ルール配列です。
92
+
93
+ | フィールド | 基準 | 必須 | 説明 |
94
+ |------|------|------|------|
95
+ | `from` | sourceDir | 必須 | 探索開始ディレクトリ |
96
+ | `to` | outputDir | 任意 | 出力基準ディレクトリ。未指定または `''` は出力ルート |
97
+ | `include` | from 基準 | 任意 | glob パターン配列。既定は `['**/*']` |
98
+ | `exclude` | from 基準 | 任意 | 除外 glob パターン配列。既定は `[]` |
99
+
100
+ 処理:
101
+
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,112 +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
+ ```
187
+
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
163
197
 
164
- プロジェクト別の上書き例:
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
179
221
 
180
- - 負数
181
- - 数値でない
182
- - `NaN` / `Infinity`
222
+ Nunjucks ファイルを HTML などへレンダリングするルール配列です。
183
223
 
184
- この場合は設定エラーで終了します。
224
+ | フィールド | 基準 | 説明 |
225
+ |------|------|------|
226
+ | `from` | sourceDir | 探索開始ディレクトリ |
227
+ | `to` | outputDir | 出力基準ディレクトリ(`''` = 出力ルート) |
228
+ | `include` | from 基準 | glob パターン配列 |
229
+ | `extension` | — | 出力拡張子(例: `.html`) |
185
230
 
186
- 注意:
231
+ legacy render では `pages/index.njk` を `index.html` のように出力する構成が一般的です。
187
232
 
188
- - この段階では `jskim.config.js` 自体は watch しません
189
- - 設定を変えた場合は watch コマンドを再起動してください
233
+ ### copy
190
234
 
191
- ## serve.host
235
+ 静的ファイルを変換せずにコピーするルール配列です。
192
236
 
193
- ローカル静的サーバーのバインドホストです。
237
+ | フィールド | 基準 | 説明 |
238
+ |------|------|------|
239
+ | `from` | sourceDir | コピー元 |
240
+ | `to` | outputDir | コピー先 |
194
241
 
195
- | 項目 | 内容 |
196
- |------|------|
197
- | 型 | 空でない `string` |
198
- | 既定値 | `'127.0.0.1'` |
199
- | マージ | `serve` オブジェクトの 1 段階マージ |
242
+ `from` が無い場合は警告のみ出してビルドを続行します。
243
+
244
+ ## collision
245
+
246
+ files mode では出力パスの衝突を検出します。たとえば同じ `files` 範囲に `about.html` `about.html.njk` がある場合、どちらも `about.html` に出力されるためエラーになります。Windows では大文字小文字の違いだけの衝突も同じ出力として扱います。
247
+
248
+ ## rootPath
249
+
250
+ 各 `.njk` ファイルの最終出力位置を基準に `rootPath` が自動計算され、Nunjucks context に注入されます。
251
+
252
+ ```njk
253
+ <link rel="stylesheet" href="{{ rootPath }}assets/css/style.css">
254
+ <a href="{{ rootPath }}index.html">Home</a>
255
+ ```
200
256
 
201
- 不正な値(空文字・非文字列)は設定エラーで終了します。
257
+ | 出力ファイル | rootPath |
258
+ |-----------|----------|
259
+ | `dist/sample/index.html` | `./` |
260
+ | `dist/sample/request/index.html` | `../` |
261
+ | `dist/sample/guide/syntax/index.html` | `../../` |
202
262
 
203
- ## serve.port
263
+ ## build.clean
204
264
 
205
- ローカル静的サーバーのポートです。
265
+ `true` のとき、ビルド前に `outputDir` だけを整理します。
266
+
267
+ 次のパスは削除せず、該当すればエラーで終了します。
268
+
269
+ - ファイルシステムルート
270
+ - ワークスペースルート
271
+ - sourceDir 自体
272
+ - sourceDir の上位パス
273
+ - 空のパス
274
+
275
+ ## watch.debounce
276
+
277
+ ファイル変更後、全体再ビルドを開始するまでの待ち時間(ms)です。
206
278
 
207
279
  | 項目 | 内容 |
208
280
  |------|------|
209
- | 型 | 整数 |
210
- | 範囲 | `1` 以上 `65535` 以下 |
211
- | 既定値 | `3000` |
212
- | マージ | `serve` オブジェクトの 1 段階マージ — `serve.port` だけ上書き可能 |
213
-
214
- プロジェクト別の上書き例:
281
+ | 型 | `number`(有限の非負数) |
282
+ | 既定値 | `150` |
283
+ | マージ | `watch` オブジェクトの 1 段階マージ |
215
284
 
216
- ```js
217
- projects: {
218
- sample: {
219
- sourceDir: 'src/sample',
220
- outputDir: 'dist/sample',
221
- serve: {
222
- port: 4000,
223
- },
224
- },
225
- },
226
- ```
285
+ 不正な値(負数、数値でない、`NaN` / `Infinity`)は設定エラーで終了します。
227
286
 
228
- 不正な値の例: 文字列、小数、`NaN`、負数、`0`、`65536` 以上。
287
+ ## serve.host / serve.port
229
288
 
230
- エラー例:
289
+ ローカル静的サーバーのバインドホストとポートです。
231
290
 
232
- ```text
233
- [JSKim] 設定値が不正です: serve.port
234
- 1から65535までの整数を指定してください。
235
- 受け取った値: -1
236
- ```
291
+ | 設定 | 型 | 既定値 |
292
+ |------|------|------|
293
+ | `serve.host` | 空でない `string` | `'127.0.0.1'` |
294
+ | `serve.port` | `1` 以上 `65535` 以下の整数 | `3000` |
237
295
 
238
296
  `serve` は自動ビルドしません。`outputDir` が無い場合は先に `npm run build -- <name>` を実行してください。
239
297
 
@@ -251,7 +309,7 @@ projects: {
251
309
 
252
310
  - `GET /_jskim/live-reload` で SSE を提供
253
311
  - HTML レスポンスにだけ client script を一時注入(`dist` には書き込まない)
254
- - **成功した再ビルドのあとだけ** `reload` event を送信
312
+ - 成功した再ビルドのあとだけ `reload` event を送信
255
313
 
256
314
  `false` のとき:
257
315
 
@@ -259,64 +317,48 @@ projects: {
259
317
  - HTML への script 注入なし
260
318
  - build + watch + serve 自体は動作
261
319
 
262
- ### 予約パス `/_jskim/live-reload`
263
-
264
- `dev.liveReload: true` のときだけ有効になる内部 SSE endpoint です。
320
+ `/_jskim/live-reload` は内部予約パスです。プロジェクトの静的ファイルとしては使わないことを推奨します。
265
321
 
266
- - JSKim が予約するパスであり、プロジェクトの静的ファイルとしては使わないことを推奨します
267
- - `serve` コマンドでは有効になりません
268
- - `dev.liveReload: false` では有効になりません
269
- - パス自体を設定で変更するオプションはありません
270
-
271
- プロジェクト別の上書き例:
272
-
273
- ```js
274
- projects: {
275
- sample: {
276
- sourceDir: 'src/sample',
277
- outputDir: 'dist/sample',
278
- dev: {
279
- liveReload: false,
280
- },
281
- },
282
- },
283
- ```
322
+ ## config hot reload
284
323
 
285
- 不正な値(boolean 以外)は設定エラーで終了します。
324
+ `watch` と `dev` はワークスペースルートの `jskim.config.js` を監視します。
286
325
 
287
- ### dev が再利用する設定
326
+ | コマンド | 動作 |
327
+ |----------|------|
328
+ | `build` | 実行時に config を 1 回読み込む。監視しない |
329
+ | `serve` | 実行時に config を 1 回読み込む。監視しない。変更後は process 再起動が必要 |
330
+ | `watch` | config 変更を hot apply。`outputDir` 変更も可。以前の outputDir は自動削除しない |
331
+ | `dev` | build / watch 関連設定を hot apply。一部 runtime 設定は再起動が必要 |
288
332
 
289
- | 設定 | 用途 |
290
- |------|------|
291
- | `watch.debounce` | 変更後の再ビルド待ち時間 |
292
- | `serve.host` | 開発サーバーのホスト |
293
- | `serve.port` | 開発サーバーのポート |
294
- | `dev.liveReload` | ライブリロード on/off |
333
+ `dev` では次の値が変わった candidate config は適用しません。
295
334
 
296
- `dev.host` / `dev.port` / `dev.debounce` は用意しません。
335
+ - `outputDir`
336
+ - `serve.host`
337
+ - `serve.port`
338
+ - `dev.liveReload`
297
339
 
298
- 設定変更後は実行中の watcher/server は自動再構成されないため、`dev` / `watch` / `serve` を再起動してください。
340
+ 理由: server bind serve root を安全に切り替えるには process 再起動が必要で、部分適用すると build output と serve root がずれるためです。
299
341
 
300
342
  ## パス基準のまとめ
301
343
 
302
344
  | 設定 | 基準 |
303
345
  |------|------|
304
346
  | `sourceDir`, `outputDir` | ワークスペースルート(`jskim.config.js` の場所) |
305
- | `render[].from`, `templates[]`, `copy[].from` | `sourceDir` |
306
- | `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` |
307
350
 
308
351
  Windows / POSIX とも `node:path` で解釈します。HTML 内パス(`rootPath` など)は `/` を使います。
309
352
 
310
- ## 配列マージ規則
353
+ ## マージ規則
311
354
 
312
355
  - **通常値**: プロジェクト設定があれば優先、なければ defaults
313
- - **オブジェクト**(`build`, `watch`, `serve`, `dev` など): 1 段階マージ — 例: `build.clean`、`watch.debounce`、`serve.port`、`dev.liveReload` だけ上書き可能
314
- - **配列**(`render`, `templates`, `copy`): プロジェクトに同じ配列があれば **defaults 配列を丸ごと置き換え**。項目単位の自動マージなし
356
+ - **オブジェクト**(`build`, `watch`, `serve`, `dev`, `data`, `nunjucks`): 1 段階マージ
357
+ - **`nunjucks.filters` / `nunjucks.globals`**: それぞれ 1 段階マージ
358
+ - **配列**(`files`, `render`, `templates`, `copy`): プロジェクトに同じ配列があれば defaults 配列を丸ごと置き換え。項目単位の自動マージなし
315
359
 
316
360
  元の `defaults` とプロジェクト設定オブジェクトは変更しません。
317
361
 
318
362
  ## 外部パス
319
363
 
320
- `sourceDir` / `outputDir` にワークスペース外のパスを使うことは禁止しません。
321
- フレームワークは Git 構成やフォルダ配置を強制しません。
322
- ただし 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.1.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.1.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.1.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.1.1",
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",