@wcstack/fetch 1.10.0 → 1.10.4

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.ja.md CHANGED
@@ -12,11 +12,11 @@ HTTP リクエストとリアクティブな状態をつなぐ **I/O ノード**
12
12
 
13
13
  つまり、非同期通信を HTML 内で宣言的に表現できます。UI レイヤーに `fetch()`、`async/await`、loading/error のグルーコードを書く必要はありません。
14
14
 
15
- `@wcstack/fetch` は [HAWC](https://github.com/wc-bindable-protocol/wc-bindable-protocol/blob/main/docs/articles/HAWC.md) アーキテクチャに従います:
15
+ `@wcstack/fetch` は [CSBC](https://github.com/csbc-dev/arch/blob/main/README.md)(Core / Shell / Binding Contract)アーキテクチャに従います:
16
16
 
17
17
  - **Core** (`FetchCore`) が HTTP、abort、非同期状態を処理
18
18
  - **Shell** (`<wcs-fetch>`) がその状態を DOM に接続
19
- - フレームワークやバインディングシステムは [wc-bindable-protocol](https://github.com/wc-bindable-protocol/wc-bindable-protocol) 経由で利用
19
+ - **Binding Contract** (`static wcBindable`) が観測可能な `properties`、書き込み可能な `inputs`、呼び出し可能な `commands` を宣言
20
20
 
21
21
  ## なぜこれが存在するのか
22
22
 
@@ -158,6 +158,10 @@ npm install @wcstack/fetch
158
158
  自動リセット: true → false wcs-fetch:trigger-changed を発火
159
159
  ```
160
160
 
161
+ `true` を書き込んだ時点で `url` が空の場合(state 駆動の computed url が未確定など)、
162
+ その書き込みは **黙って無視** されます。fetch は実行されず、`trigger` は `false` のまま、
163
+ イベントも発火しません。先に `url` を設定してから改めて `true` を書き込んでください。
164
+
161
165
  ### 4. リアクティブ body での POST
162
166
 
163
167
  ```html
@@ -212,15 +216,19 @@ npm install @wcstack/fetch
212
216
 
213
217
  ### 出力ステート(バインド可能な非同期状態)
214
218
 
215
- 現在のリクエストの結果を表し、HAWC のメインサーフェスです:
219
+ 現在のリクエストの結果を表す、主な観測サーフェスです:
216
220
 
217
221
  | プロパティ | 型 | 説明 |
218
222
  |------------|------|------|
219
- | `value` | `any` | レスポンスデータ |
223
+ | `value` | `any` | レスポンスデータ。**HTTP エラー時(status >= 400)は `null` にリセット** |
220
224
  | `loading` | `boolean` | リクエスト実行中は `true` |
221
225
  | `error` | `WcsFetchHttpError \| Error \| null` | HTTP またはネットワークエラー |
222
226
  | `status` | `number` | HTTP ステータスコード |
223
227
 
228
+ > **注意:** HTTP エラー時は `value` が `null` にリセットされ、`status` にエラーコードが
229
+ > 入ります。`error` を観測せず `value` のみをバインドしている場合、リクエスト失敗時に
230
+ > 直前の成功値が消えます。失敗を明示的に扱うには `error` をバインドしてください。
231
+
224
232
  ### 入力 / コマンドサーフェス
225
233
 
226
234
  HTML、JS、または `@wcstack/state` バインディングからリクエスト実行を制御します:
@@ -234,7 +242,7 @@ HTML、JS、または `@wcstack/state` バインディングからリクエス
234
242
 
235
243
  ## アーキテクチャ
236
244
 
237
- `@wcstack/fetch` は HAWC アーキテクチャに従います。
245
+ `@wcstack/fetch` は CSBC アーキテクチャに従います。
238
246
 
239
247
  ### Core: `FetchCore`
240
248
 
@@ -244,7 +252,7 @@ HTML、JS、または `@wcstack/state` バインディングからリクエス
244
252
  - HTTP 実行
245
253
  - abort 制御
246
254
  - 非同期状態遷移
247
- - `wc-bindable-protocol` 宣言
255
+ - 観測可能な状態と呼び出し可能なコマンドの `wc-bindable-protocol` 宣言
248
256
 
249
257
  `EventTarget` と `fetch` をサポートする任意のランタイムでヘッドレスに動作します。
250
258
 
@@ -256,6 +264,7 @@ HTML、JS、または `@wcstack/state` バインディングからリクエス
256
264
  - 属性 / プロパティマッピング
257
265
  - DOM ライフサイクル統合
258
266
  - `trigger` などの宣言的実行ヘルパー
267
+ - DOM 向け設定とコマンドプロパティのための `wc-bindable-protocol` inputs
259
268
 
260
269
  この分離により、非同期ロジックのポータビリティを保ちながら、`@wcstack/state` のような DOM ベースのバインディングシステムとの自然な連携を可能にしています。
261
270
 
@@ -324,6 +333,13 @@ console.log(fetchEl.body); // null(fetch 後にリセット済み)
324
333
 
325
334
  このモードはシンプルなフラグメント読み込みに便利ですが、`@wcstack/state` との**ステート駆動**な利用とは別の機能です。
326
335
 
336
+ > **セキュリティ注意:** レスポンスはサニタイズせずに `targetElement.innerHTML`
337
+ > へ直接代入されます。`target` は自分で管理する信頼できるエンドポイントの
338
+ > フラグメントにのみ使用してください。信頼できない HTML は XSS の温床になり得ます
339
+ > (イベントハンドラ属性など)。信頼できない/ユーザー由来のコンテンツは、`value`
340
+ > を state にバインドして `@wcstack/state` のテキストバインディング経由で描画して
341
+ > ください。
342
+
327
343
  ## オプションの DOM トリガー
328
344
 
329
345
  `autoTrigger` が有効(デフォルト)の場合、`data-fetchtarget` 属性を持つ要素のクリックで対応する `<wcs-fetch>` が実行されます:
@@ -335,6 +351,8 @@ console.log(fetchEl.body); // null(fetch 後にリセット済み)
335
351
 
336
352
  イベント委譲を使用しているため、動的に追加された要素でも動作します。`closest()` API により、ネストされた子要素(ボタン内のアイコン等)のクリックも検出します。
337
353
 
354
+ 一致したクリックは fetch 実行前に `event.preventDefault()` を呼ぶため、要素の既定動作は抑制されます。これは「遷移せずにリクエストを発火する」という典型ユースケースのための意図的な挙動です。既定動作も併せて行いたい要素(本物の `<a href>` リンクやフォーム送信ボタン等)には `data-fetchtarget` を付けないでください(遷移/送信がキャンセルされます)。`<button type="button">` の使用を推奨します。
355
+
338
356
  指定した id に一致する要素が存在しない場合、または一致した要素が `<wcs-fetch>` でない場合、クリックは無視されます(エラーは発生しません)。
339
357
 
340
358
  これは便利機能です。
@@ -481,7 +499,7 @@ interface WcsFetchValues<T = unknown> extends WcsFetchCoreValues<T> {
481
499
 
482
500
  ## フレームワーク連携
483
501
 
484
- `<wcs-fetch>` は HAWC + `wc-bindable-protocol` なので、`@wc-bindable/*` の薄いアダプタを通じて任意のフレームワークで動作します。
502
+ `<wcs-fetch>` は CSBC `wc-bindable-protocol` 契約を公開するため、`@wc-bindable/*` の薄いアダプタを通じて任意のフレームワークで動作します。
485
503
 
486
504
  ### React
487
505
 
@@ -615,7 +633,10 @@ bootstrapFetch({
615
633
 
616
634
  - `value`、`loading`、`error`、`status` は **出力ステート**
617
635
  - `url`、`body`、`trigger` は **入力 / コマンドサーフェス**
618
- - `trigger` は意図的に単方向: `true` を書き込むと実行、リセットで完了を通知
636
+ - `trigger` は意図的に単方向: `true` を書き込むと実行、リセットで完了を通知。`url` が空のまま `true` を書き込んだ場合は黙って無視される(fetch なし・イベントなし・フラグは `false` のまま)
637
+ - HTTP エラー時(status >= 400)は `value` が `null` にリセットされ、`status` にエラーコードが入る — `value` のみのバインドでは直前の値が消えるため、失敗検知には `error` をバインドする
638
+ - ネットワークエラー時(HTTP レスポンスなし — DNS 失敗・オフライン・CORS など)は `value` が `null`、`status` が `0` にリセットされ、`error` に投げられた `Error` が入る。HTTP エラーと同様、直前の成功時の value/status は残らない
639
+ - `method="HEAD"` は仕様上ボディを持たないためレスポンスボディの読取をスキップする。`value` は `null` のままで `status` のみ通知される
619
640
  - `body` は `fetch()` 呼び出しごとに `null` にリセット — 再送信時は毎回設定が必要
620
641
  - `manual` は実行タイミングを明示的に制御したい場合に有用
621
642
  - HTML リプレースモードはオプション。wcstack の主要パターンはステート駆動バインディング
package/README.md CHANGED
@@ -12,11 +12,11 @@ With `@wcstack/state`, `<wcs-fetch>` can be bound directly through path contract
12
12
 
13
13
  This means async communication can be expressed declaratively in HTML, without writing `fetch()`, `async/await`, or loading/error glue code in your UI layer.
14
14
 
15
- `@wcstack/fetch` follows the [HAWC](https://github.com/wc-bindable-protocol/wc-bindable-protocol/blob/main/docs/articles/HAWC.md) architecture:
15
+ `@wcstack/fetch` follows the [CSBC](https://github.com/csbc-dev/arch/blob/main/README.md) (Core / Shell / Binding Contract) architecture:
16
16
 
17
17
  - **Core** (`FetchCore`) handles HTTP, abort, and async state
18
18
  - **Shell** (`<wcs-fetch>`) connects that state to the DOM
19
- - frameworks and binding systems consume it through [wc-bindable-protocol](https://github.com/wc-bindable-protocol/wc-bindable-protocol)
19
+ - **Binding Contract** (`static wcBindable`) declares observable `properties`, writable `inputs`, and callable `commands`
20
20
 
21
21
  ## Why this exists
22
22
 
@@ -158,6 +158,10 @@ external write: false → true No event (triggers fetch)
158
158
  auto-reset: true → false Dispatches wcs-fetch:trigger-changed
159
159
  ```
160
160
 
161
+ If `url` is empty when `true` is written (e.g. a state-driven computed url not yet
162
+ resolved), the write is **silently ignored**: no fetch runs, `trigger` stays `false`,
163
+ and no event fires. Set the `url` first, then write `true` again to execute.
164
+
161
165
  ### 4. POST with reactive body
162
166
 
163
167
  ```html
@@ -212,15 +216,20 @@ auto-reset: true → false Dispatches wcs-fetch:trigger-changed
212
216
 
213
217
  ### Output state (bindable async state)
214
218
 
215
- These properties represent the result of the current request and are the main HAWC surface:
219
+ These properties represent the result of the current request and are the main observable surface:
216
220
 
217
221
  | Property | Type | Description |
218
222
  |----------|------|-------------|
219
- | `value` | `any` | Response data |
223
+ | `value` | `any` | Response data. **Reset to `null` on HTTP error** (status >= 400) |
220
224
  | `loading` | `boolean` | `true` while a request is in flight |
221
225
  | `error` | `WcsFetchHttpError \| Error \| null` | HTTP or network error |
222
226
  | `status` | `number` | HTTP status code |
223
227
 
228
+ > **Note:** On an HTTP error, `value` is reset to `null` and `status` carries the
229
+ > error code. If you bind only `value` (without observing `error`), the previous
230
+ > successful value disappears when a request fails. Bind `error` to handle the
231
+ > failure case explicitly.
232
+
224
233
  ### Input / command surface
225
234
 
226
235
  These properties control request execution from HTML, JS, or `@wcstack/state` bindings:
@@ -234,7 +243,7 @@ These properties control request execution from HTML, JS, or `@wcstack/state` bi
234
243
 
235
244
  ## Architecture
236
245
 
237
- `@wcstack/fetch` follows the HAWC architecture.
246
+ `@wcstack/fetch` follows the CSBC architecture.
238
247
 
239
248
  ### Core: `FetchCore`
240
249
 
@@ -244,7 +253,7 @@ It contains:
244
253
  - HTTP execution
245
254
  - abort control
246
255
  - async state transitions
247
- - `wc-bindable-protocol` declaration
256
+ - `wc-bindable-protocol` declaration for observable state and callable commands
248
257
 
249
258
  It can run headlessly in any runtime that supports `EventTarget` and `fetch`.
250
259
 
@@ -256,6 +265,7 @@ It adds:
256
265
  - attribute / property mapping
257
266
  - DOM lifecycle integration
258
267
  - declarative execution helpers such as `trigger`
268
+ - `wc-bindable-protocol` inputs for DOM-facing configuration and command properties
259
269
 
260
270
  This split keeps the async logic portable while allowing DOM-based binding systems such as `@wcstack/state` to interact with it naturally.
261
271
 
@@ -324,6 +334,12 @@ console.log(fetchEl.body); // null (reset after fetch)
324
334
 
325
335
  This mode is useful for simple fragment loading, but it is separate from the main **state-driven** usage with `@wcstack/state`.
326
336
 
337
+ > **Security note:** The response is assigned directly to `targetElement.innerHTML`
338
+ > without sanitization. Only use `target` with fragments from a trusted endpoint
339
+ > you control. Untrusted HTML can carry XSS payloads (e.g. event-handler
340
+ > attributes). For untrusted or user-influenced content, bind `value` into state
341
+ > and render through `@wcstack/state` text bindings instead.
342
+
327
343
  ## Optional DOM Triggering
328
344
 
329
345
  If `autoTrigger` is enabled (default), clicking an element with `data-fetchtarget` triggers the corresponding `<wcs-fetch>` element:
@@ -335,6 +351,12 @@ If `autoTrigger` is enabled (default), clicking an element with `data-fetchtarge
335
351
 
336
352
  Event delegation is used — works with dynamically added elements. The `closest()` API handles nested elements (e.g., icon inside a button).
337
353
 
354
+ A matched click calls `event.preventDefault()` before triggering the fetch, so the
355
+ element's default action is suppressed. This is intentional for the common case of
356
+ firing a request without navigating. Avoid putting `data-fetchtarget` on an element
357
+ whose default action you also want (e.g. a real `<a href>` link or a form-`submit`
358
+ button) — the navigation/submit will be cancelled. Use a plain `<button type="button">`.
359
+
338
360
  If the target id does not match any element, or the matched element is not a `<wcs-fetch>`, the click is silently ignored.
339
361
 
340
362
  This is a convenience feature.
@@ -401,9 +423,17 @@ Example:
401
423
 
402
424
  Both `FetchCore` and `<wcs-fetch>` declare `wc-bindable-protocol` compliance, making them interoperable with any framework or component that supports the protocol.
403
425
 
426
+ The declaration follows the full wc-bindable interface model — three independent surfaces:
427
+
428
+ - **`properties`** — observable outputs that `bind()` subscribes to (`value`, `loading`, `error`, `status`, and the Shell's `trigger`)
429
+ - **`inputs`** — the settable surface (`url`, `method`, …); declarative metadata that tooling, codegen, and remote proxying read
430
+ - **`commands`** — invocable methods (`fetch`, `abort`); a binding system such as `@wcstack/state` can invoke them by name
431
+
432
+ Per the protocol, only `properties` is interpreted by core `bind()`; `inputs` / `commands` (and the `attribute` / `async` hints) are descriptive. They do **not** create implicit two-way data flow.
433
+
404
434
  ### Core (`FetchCore`)
405
435
 
406
- `FetchCore` declares the bindable async state that any runtime can subscribe to:
436
+ `FetchCore` declares the bindable async state that any runtime can subscribe to, plus its portable input/command surface:
407
437
 
408
438
  ```typescript
409
439
  static wcBindable = {
@@ -417,6 +447,14 @@ static wcBindable = {
417
447
  { name: "status", event: "wcs-fetch:response",
418
448
  getter: (e) => e.detail.status },
419
449
  ],
450
+ inputs: [
451
+ { name: "url" },
452
+ { name: "method" },
453
+ ],
454
+ commands: [
455
+ { name: "fetch", async: true },
456
+ { name: "abort" },
457
+ ],
420
458
  };
421
459
  ```
422
460
 
@@ -424,7 +462,7 @@ Headless consumers call `core.fetch(url)` directly — no `trigger` needed.
424
462
 
425
463
  ### Shell (`<wcs-fetch>`)
426
464
 
427
- The Shell extends the Core declaration with `trigger` so binding systems can execute fetch declaratively:
465
+ The Shell extends the Core declaration with the `trigger` output and the DOM-driven input surface; `commands` (`fetch` / `abort`) are inherited unchanged:
428
466
 
429
467
  ```typescript
430
468
  static wcBindable = {
@@ -433,9 +471,19 @@ static wcBindable = {
433
471
  ...FetchCore.wcBindable.properties,
434
472
  { name: "trigger", event: "wcs-fetch:trigger-changed" },
435
473
  ],
474
+ inputs: [
475
+ { name: "url" },
476
+ { name: "method" },
477
+ { name: "target" },
478
+ { name: "manual" },
479
+ { name: "body" },
480
+ { name: "trigger" },
481
+ ],
436
482
  };
437
483
  ```
438
484
 
485
+ The Shell's inputs intentionally carry no `attribute` hint: each setter (`url`, `method`, `target`, `manual`) already reflects to its attribute, so a binding system that mirrors `inputs[].attribute` would set the attribute twice.
486
+
439
487
  ## TypeScript Types
440
488
 
441
489
  ```typescript
@@ -481,7 +529,7 @@ This makes async processing look like ordinary state updates.
481
529
 
482
530
  ## Framework Integration
483
531
 
484
- Since `<wcs-fetch>` is HAWC + `wc-bindable-protocol`, it works with any framework through thin adapters from `@wc-bindable/*`.
532
+ Since `<wcs-fetch>` exposes a CSBC `wc-bindable-protocol` contract, it works with any framework through thin adapters from `@wc-bindable/*`.
485
533
 
486
534
  ### React
487
535
 
@@ -615,7 +663,10 @@ bootstrapFetch({
615
663
 
616
664
  - `value`, `loading`, `error`, and `status` are **output state**
617
665
  - `url`, `body`, and `trigger` are **input / command surface**
618
- - `trigger` is intentionally one-way: writing `true` executes, reset emits completion
666
+ - `trigger` is intentionally one-way: writing `true` executes, reset emits completion. Writing `true` while `url` is empty is silently ignored (no fetch, no event, flag stays `false`)
667
+ - on an HTTP error (status >= 400), `value` is reset to `null` while `status` carries the error code — a `value`-only binding loses its previous value, so bind `error` to detect failures
668
+ - on a network error (no HTTP response — DNS failure, offline, CORS, etc.), `value` is reset to `null` and `status` to `0`; `error` holds the thrown `Error`. Like HTTP errors, a previous successful value/status does not linger
669
+ - `method="HEAD"` skips response-body reading by spec (no body); `value` stays `null` and only `status` is surfaced
619
670
  - `body` is reset to `null` after each `fetch()` call — set it again before each submission
620
671
  - `manual` is useful when execution timing should be controlled explicitly
621
672
  - HTML replace mode is optional; the primary wcstack pattern is state-driven binding
package/dist/index.d.ts CHANGED
@@ -23,10 +23,20 @@ interface IWcBindableProperty {
23
23
  readonly event: string;
24
24
  readonly getter?: (event: Event) => any;
25
25
  }
26
+ interface IWcBindableInput {
27
+ readonly name: string;
28
+ readonly attribute?: string;
29
+ }
30
+ interface IWcBindableCommand {
31
+ readonly name: string;
32
+ readonly async?: boolean;
33
+ }
26
34
  interface IWcBindable {
27
35
  readonly protocol: "wc-bindable";
28
- readonly version: number;
36
+ readonly version: 1;
29
37
  readonly properties: IWcBindableProperty[];
38
+ readonly inputs?: readonly IWcBindableInput[];
39
+ readonly commands?: readonly IWcBindableCommand[];
30
40
  }
31
41
  /**
32
42
  * HTTP error returned when the server responds with a non-ok status (>= 400).
package/dist/index.esm.js CHANGED
@@ -60,6 +60,14 @@ class FetchCore extends EventTarget {
60
60
  { name: "error", event: "wcs-fetch:error" },
61
61
  { name: "status", event: "wcs-fetch:response", getter: (e) => e.detail.status },
62
62
  ],
63
+ inputs: [
64
+ { name: "url" },
65
+ { name: "method" },
66
+ ],
67
+ commands: [
68
+ { name: "fetch", async: true },
69
+ { name: "abort" },
70
+ ],
63
71
  };
64
72
  _target;
65
73
  _value = null;
@@ -126,11 +134,21 @@ class FetchCore extends EventTarget {
126
134
  async _doFetch(url, options) {
127
135
  // 進行中のリクエストをキャンセル
128
136
  this.abort();
129
- this._abortController = new AbortController();
130
- const { signal } = this._abortController;
137
+ // Hold the controller in a local so the finally block (which can run after a
138
+ // subsequent fetch has already replaced this._abortController) only clears the
139
+ // field when it still owns it. Without the identity check, an aborted earlier
140
+ // request's finally would null out the controller of the request that superseded
141
+ // it, leaving the later request un-abortable.
142
+ const ac = new AbortController();
143
+ this._abortController = ac;
144
+ const { signal } = ac;
131
145
  this._setLoading(true);
132
146
  this._setError(null);
133
- const { method = "GET", headers = {}, body = null, contentType = null, forceText = false, } = options;
147
+ const { method = "GET", body = null, contentType = null, forceText = false, } = options;
148
+ // Copy the caller's headers so the contentType injection below never mutates
149
+ // the object passed in by a headless consumer (the Shell already builds a
150
+ // fresh object, but direct FetchCore users may reuse theirs).
151
+ const headers = { ...(options.headers ?? {}) };
134
152
  try {
135
153
  if (contentType && !headers["Content-Type"]) {
136
154
  headers["Content-Type"] = contentType;
@@ -144,15 +162,25 @@ class FetchCore extends EventTarget {
144
162
  requestInit.body = body;
145
163
  }
146
164
  const response = await globalThis.fetch(url, requestInit);
147
- this._status = response.status;
148
165
  if (!response.ok) {
149
166
  const errorBody = await response.text().catch(() => "");
150
167
  const error = { status: response.status, statusText: response.statusText, body: errorBody };
151
168
  this._setError(error);
169
+ // Notify `status` observers on HTTP errors too. The `status` property is
170
+ // surfaced via the `wcs-fetch:response` event (getter reads detail.status),
171
+ // so without dispatching it here a bind() subscriber would never see the
172
+ // error status (404, 500, ...). `value` is reset to null on error.
173
+ this._setResponse(null, response.status);
152
174
  this._setLoading(false);
153
175
  return null;
154
176
  }
155
- if (forceText) {
177
+ if (method === "HEAD") {
178
+ // HEAD responses carry no body by spec. Reading it as JSON would throw a
179
+ // parse error on the empty body (and end up as a spurious `error`), so skip
180
+ // body reading entirely and surface only the status with a null value.
181
+ this._setResponse(null, response.status);
182
+ }
183
+ else if (forceText) {
156
184
  const text = await response.text();
157
185
  this._setResponse(text, response.status);
158
186
  }
@@ -172,15 +200,33 @@ class FetchCore extends EventTarget {
172
200
  }
173
201
  catch (e) {
174
202
  if (e.name === "AbortError") {
175
- this._setLoading(false);
203
+ // Suppress loading=false when a later request has already taken over. A
204
+ // subsequent fetch() aborts this one via abort() (which nulls the field) and
205
+ // then immediately installs its own controller, so `this._abortController` is
206
+ // non-null here. That newer request has already emitted loading=true and is
207
+ // still in flight, so emitting loading=false now would make observers see a
208
+ // spurious flicker. An explicit abort() leaves the field null, so that path
209
+ // still reports loading=false as expected.
210
+ if (this._abortController === null) {
211
+ this._setLoading(false);
212
+ }
176
213
  return null;
177
214
  }
178
215
  this._setError(e);
216
+ // Reset value/status on network errors too, mirroring the HTTP-error path
217
+ // (`_setResponse(null, response.status)`). Without this, a prior successful
218
+ // request's value/status would linger while `error` is non-null, showing
219
+ // observers an inconsistent state (e.g. status=200 alongside a network
220
+ // error). status=0 is the web-platform convention for "no HTTP response"
221
+ // (matches XMLHttpRequest.status on network failure) and the initial value.
222
+ this._setResponse(null, 0);
179
223
  this._setLoading(false);
180
224
  return null;
181
225
  }
182
226
  finally {
183
- this._abortController = null;
227
+ if (this._abortController === ac) {
228
+ this._abortController = null;
229
+ }
184
230
  }
185
231
  }
186
232
  }
@@ -199,6 +245,17 @@ function handleClick(event) {
199
245
  const fetchElement = document.getElementById(fetchId);
200
246
  if (!fetchElement || !(fetchElement instanceof Fetch))
201
247
  return;
248
+ // Skip when the target has no url. fetch() is fire-and-forget here (its returned
249
+ // promise is intentionally not awaited), and FetchCore.fetch() rejects synchronously
250
+ // on an empty url. Without this guard that rejection would surface as an unhandled
251
+ // promise rejection. Treat a url-less target as "nothing to do", consistent with the
252
+ // other early returns above.
253
+ if (!fetchElement.url)
254
+ return;
255
+ // Suppress the element's default action so a fetch can fire without navigating.
256
+ // Intentional: do not attach data-fetchtarget to an element whose default action
257
+ // you also want (real <a href> link, form-submit button) — it will be cancelled.
258
+ // See README "Optional DOM Triggering".
202
259
  event.preventDefault();
203
260
  fetchElement.fetch();
204
261
  }
@@ -217,6 +274,19 @@ class Fetch extends HTMLElement {
217
274
  ...FetchCore.wcBindable.properties,
218
275
  { name: "trigger", event: "wcs-fetch:trigger-changed" },
219
276
  ],
277
+ // Shell-level input surface. The Core declares only the portable `url` / `method`;
278
+ // the Shell adds the DOM-driven settable surface. No `attribute` hints are given:
279
+ // these setters already reflect to their attributes themselves, so a binding system
280
+ // that mirrors inputs[].attribute would set the attribute twice. `commands`
281
+ // (fetch / abort) are inherited unchanged from the Core via the spread above.
282
+ inputs: [
283
+ { name: "url" },
284
+ { name: "method" },
285
+ { name: "target" },
286
+ { name: "manual" },
287
+ { name: "body" },
288
+ { name: "trigger" },
289
+ ],
220
290
  };
221
291
  static get observedAttributes() { return ["url"]; }
222
292
  _core;
@@ -291,6 +361,18 @@ class Fetch extends HTMLElement {
291
361
  set trigger(value) {
292
362
  const v = !!value;
293
363
  if (v) {
364
+ // Skip when url is empty. fetch() is fire-and-forget here (its returned
365
+ // promise is intentionally only chained with .finally() to reset the flag,
366
+ // never .catch()'d), and FetchCore.fetch() rejects on an empty url. Without
367
+ // this guard that rejection — re-thrown by .finally() — surfaces as an
368
+ // unhandled promise rejection. Mirrors the url-less guard in autoTrigger.
369
+ //
370
+ // Leave `_trigger` false (do not set it) and emit no event: nothing ran, so
371
+ // surfacing a `wcs-fetch:trigger-changed` "completion" would lie to observers.
372
+ // Keeping the flag false also avoids stalling — once url is provided, writing
373
+ // `true` again is a real false→true transition that triggers the fetch.
374
+ if (!this.url)
375
+ return;
294
376
  this._trigger = true;
295
377
  this.fetch().finally(() => {
296
378
  this._trigger = false;
@@ -313,12 +395,12 @@ class Fetch extends HTMLElement {
313
395
  }
314
396
  return headers;
315
397
  }
316
- _collectBody() {
398
+ _collectBody(bodySnapshot) {
317
399
  // JS API経由のbodyが優先
318
- if (this._body !== null) {
400
+ if (bodySnapshot !== null) {
319
401
  return {
320
- body: typeof this._body === "string" ? this._body : JSON.stringify(this._body),
321
- contentType: typeof this._body === "string" ? null : "application/json",
402
+ body: typeof bodySnapshot === "string" ? bodySnapshot : JSON.stringify(bodySnapshot),
403
+ contentType: typeof bodySnapshot === "string" ? null : "application/json",
322
404
  };
323
405
  }
324
406
  // サブタグからbodyを取得
@@ -336,7 +418,12 @@ class Fetch extends HTMLElement {
336
418
  }
337
419
  async fetch() {
338
420
  const headers = this._collectHeaders();
339
- const { body, contentType } = this._collectBody();
421
+ // Snapshot and reset `body` synchronously, before any await. The body is a
422
+ // one-shot input; resetting it after the await (when another caller may have
423
+ // already set a new body for the next request) would silently drop that value.
424
+ const bodySnapshot = this._body;
425
+ this._body = null;
426
+ const { body, contentType } = this._collectBody(bodySnapshot);
340
427
  const result = await this._core.fetch(this.url, {
341
428
  method: this.method,
342
429
  headers,
@@ -345,17 +432,24 @@ class Fetch extends HTMLElement {
345
432
  forceText: !!this.target,
346
433
  });
347
434
  // HTML置換モード
435
+ // Security: the response is injected as raw innerHTML without sanitization.
436
+ // This is an opt-in convenience for trusted fragments only; the primary,
437
+ // recommended path is state-driven binding via @wcstack/state. Do not point
438
+ // `target` at an untrusted endpoint (XSS risk). See README "HTML Replace Mode".
348
439
  if (this.target && result !== null) {
349
440
  const targetElement = document.getElementById(this.target);
350
441
  if (targetElement) {
351
442
  targetElement.innerHTML = result;
352
443
  }
353
444
  }
354
- // bodyをリセット(一回限りの使用)
355
- this._body = null;
356
445
  return result;
357
446
  }
358
447
  attributeChangedCallback(name, _oldValue, newValue) {
448
+ // Re-fetch on url changes, but intentionally do NOT update
449
+ // `_connectedCallbackPromise`. Per the wc-bindable connectedCallbackPromise
450
+ // protocol that promise represents the one-shot "connect-time initialization
451
+ // is done" signal; it resolves once and is not re-armed for later url-driven
452
+ // requests. Await `promise` if you need to track a specific re-fetch.
359
453
  if (name === "url" && this.isConnected && !this.manual && newValue) {
360
454
  this.fetch();
361
455
  }
@@ -365,6 +459,7 @@ class Fetch extends HTMLElement {
365
459
  if (config.autoTrigger) {
366
460
  registerAutoTrigger();
367
461
  }
462
+ // Only the initial connect-time fetch is tracked by connectedCallbackPromise.
368
463
  if (!this.manual && this.url) {
369
464
  this._connectedCallbackPromise = this.fetch().then(() => { });
370
465
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/raiseError.ts","../src/core/FetchCore.ts","../src/autoTrigger.ts","../src/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/registerComponents.ts","../src/bootstrapFetch.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n fetch: string;\n fetchHeader: string;\n fetchBody: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-fetchtarget\",\n tagNames: {\n fetch: \"wcs-fetch\",\n fetchHeader: \"wcs-fetch-header\",\n fetchBody: \"wcs-fetch-body\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/fetch] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface FetchRequestOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit | null;\n contentType?: string | null;\n forceText?: boolean;\n}\n\nexport class FetchCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\n { name: \"error\", event: \"wcs-fetch:error\" },\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\n ],\n };\n\n private _target: EventTarget;\n private _value: any = null;\n private _loading: boolean = false;\n private _error: any = null;\n private _status: number = 0;\n private _abortController: AbortController | null = null;\n private _promise: Promise<any> = Promise.resolve(null);\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get value(): any {\n return this._value;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get status(): number {\n return this._status;\n }\n\n get promise(): Promise<any> {\n return this._promise;\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setResponse(value: any, status: number): void {\n this._value = value;\n this._status = status;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\n detail: { value, status },\n bubbles: true,\n }));\n }\n\n abort(): void {\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n }\n\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\n if (!url) {\n raiseError(\"url attribute is required.\");\n }\n\n const p = this._doFetch(url, options);\n this._promise = p;\n return p;\n }\n\n private async _doFetch(url: string, options: FetchRequestOptions): Promise<any> {\n // 進行中のリクエストをキャンセル\n this.abort();\n\n this._abortController = new AbortController();\n const { signal } = this._abortController;\n\n this._setLoading(true);\n this._setError(null);\n\n const {\n method = \"GET\",\n headers = {},\n body = null,\n contentType = null,\n forceText = false,\n } = options;\n\n try {\n if (contentType && !headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = contentType;\n }\n\n const requestInit: RequestInit = {\n method,\n headers,\n signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\n requestInit.body = body;\n }\n\n const response = await globalThis.fetch(url, requestInit);\n this._status = response.status;\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\n this._setError(error);\n this._setLoading(false);\n return null;\n }\n\n if (forceText) {\n const text = await response.text();\n this._setResponse(text, response.status);\n } else {\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\n if (responseContentType.includes(\"application/json\")) {\n const data = await response.json();\n this._setResponse(data, response.status);\n } else {\n const text = await response.text();\n this._setResponse(text, response.status);\n }\n }\n\n this._setLoading(false);\n return this._value;\n } catch (e: any) {\n if (e.name === \"AbortError\") {\n this._setLoading(false);\n return null;\n }\n this._setError(e);\n this._setLoading(false);\n return null;\n } finally {\n this._abortController = null;\n }\n }\n}\n","import { config } from \"./config.js\";\nimport { Fetch } from \"./components/Fetch.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\n if (!fetchId) return;\n\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\n\n event.preventDefault();\n fetchElement.fetch();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { FetchCore } from \"../core/FetchCore.js\";\nimport { FetchHeader } from \"./FetchHeader.js\";\nimport { FetchBody } from \"./FetchBody.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class Fetch extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...FetchCore.wcBindable,\n properties: [\n ...FetchCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: FetchCore;\n private _body: any = null;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new FetchCore(this);\n }\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get method(): string {\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\n }\n\n set method(value: string) {\n this.setAttribute(\"method\", value);\n }\n\n get target(): string | null {\n return this.getAttribute(\"target\");\n }\n\n set target(value: string | null) {\n if (value === null) {\n this.removeAttribute(\"target\");\n } else {\n this.setAttribute(\"target\", value);\n }\n }\n\n get value(): any {\n return this._core.value;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get status(): number {\n return this._core.status;\n }\n\n get promise(): Promise<any> {\n return this._core.promise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get body(): any {\n return this._body;\n }\n\n set body(value: any) {\n this._body = value;\n }\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.fetch().finally(() => {\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n });\n }\n }\n\n private _collectHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\n for (const el of headerElements) {\n const name = el.headerName;\n const value = el.headerValue;\n if (name) {\n headers[name] = value;\n }\n }\n return headers;\n }\n\n private _collectBody(): { body: BodyInit | null; contentType: string | null } {\n // JS API経由のbodyが優先\n if (this._body !== null) {\n return {\n body: typeof this._body === \"string\" ? this._body : JSON.stringify(this._body),\n contentType: typeof this._body === \"string\" ? null : \"application/json\",\n };\n }\n\n // サブタグからbodyを取得\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\n if (bodyElement) {\n return {\n body: bodyElement.bodyContent || null,\n contentType: bodyElement.contentType,\n };\n }\n\n return { body: null, contentType: null };\n }\n\n abort(): void {\n this._core.abort();\n }\n\n async fetch(): Promise<any> {\n const headers = this._collectHeaders();\n const { body, contentType } = this._collectBody();\n\n const result = await this._core.fetch(this.url, {\n method: this.method,\n headers,\n body,\n contentType,\n forceText: !!this.target,\n });\n\n // HTML置換モード\n if (this.target && result !== null) {\n const targetElement = document.getElementById(this.target);\n if (targetElement) {\n targetElement.innerHTML = result;\n }\n }\n\n // bodyをリセット(一回限りの使用)\n this._body = null;\n\n return result;\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.fetch();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n if (!this.manual && this.url) {\n this._connectedCallbackPromise = this.fetch().then(() => {});\n }\n }\n\n disconnectedCallback(): void {\n this.abort();\n }\n}\n","export class FetchHeader extends HTMLElement {\n connectedCallback(): void {\n this.style.display = \"none\";\n }\n\n get headerName(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n get headerValue(): string {\n return this.getAttribute(\"value\") || \"\";\n }\n}\n","export class FetchBody extends HTMLElement {\n constructor() {\n super();\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\n this.attachShadow({ mode: \"open\" });\n }\n\n get contentType(): string {\n return this.getAttribute(\"type\") || \"application/json\";\n }\n\n get bodyContent(): string {\n return this.textContent?.trim() || \"\";\n }\n}\n","import { Fetch } from \"./components/Fetch.js\";\nimport { FetchHeader } from \"./components/FetchHeader.js\";\nimport { FetchBody } from \"./components/FetchBody.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.fetch)) {\n customElements.define(config.tagNames.fetch, Fetch);\n }\n if (!customElements.get(config.tagNames.fetchHeader)) {\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\n }\n if (!customElements.get(config.tagNames.fetchBody)) {\n customElements.define(config.tagNames.fetchBody, FetchBody);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/raiseError.ts","../src/core/FetchCore.ts","../src/autoTrigger.ts","../src/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/registerComponents.ts","../src/bootstrapFetch.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n fetch: string;\n fetchHeader: string;\n fetchBody: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-fetchtarget\",\n tagNames: {\n fetch: \"wcs-fetch\",\n fetchHeader: \"wcs-fetch-header\",\n fetchBody: \"wcs-fetch-body\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/fetch] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface FetchRequestOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit | null;\n contentType?: string | null;\n forceText?: boolean;\n}\n\nexport class FetchCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\n { name: \"error\", event: \"wcs-fetch:error\" },\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\n ],\n inputs: [\n { name: \"url\" },\n { name: \"method\" },\n ],\n commands: [\n { name: \"fetch\", async: true },\n { name: \"abort\" },\n ],\n };\n\n private _target: EventTarget;\n private _value: any = null;\n private _loading: boolean = false;\n private _error: any = null;\n private _status: number = 0;\n private _abortController: AbortController | null = null;\n private _promise: Promise<any> = Promise.resolve(null);\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get value(): any {\n return this._value;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get status(): number {\n return this._status;\n }\n\n get promise(): Promise<any> {\n return this._promise;\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setResponse(value: any, status: number): void {\n this._value = value;\n this._status = status;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\n detail: { value, status },\n bubbles: true,\n }));\n }\n\n abort(): void {\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n }\n\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\n if (!url) {\n raiseError(\"url attribute is required.\");\n }\n\n const p = this._doFetch(url, options);\n this._promise = p;\n return p;\n }\n\n private async _doFetch(url: string, options: FetchRequestOptions): Promise<any> {\n // 進行中のリクエストをキャンセル\n this.abort();\n\n // Hold the controller in a local so the finally block (which can run after a\n // subsequent fetch has already replaced this._abortController) only clears the\n // field when it still owns it. Without the identity check, an aborted earlier\n // request's finally would null out the controller of the request that superseded\n // it, leaving the later request un-abortable.\n const ac = new AbortController();\n this._abortController = ac;\n const { signal } = ac;\n\n this._setLoading(true);\n this._setError(null);\n\n const {\n method = \"GET\",\n body = null,\n contentType = null,\n forceText = false,\n } = options;\n\n // Copy the caller's headers so the contentType injection below never mutates\n // the object passed in by a headless consumer (the Shell already builds a\n // fresh object, but direct FetchCore users may reuse theirs).\n const headers: Record<string, string> = { ...(options.headers ?? {}) };\n\n try {\n if (contentType && !headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = contentType;\n }\n\n const requestInit: RequestInit = {\n method,\n headers,\n signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\n requestInit.body = body;\n }\n\n const response = await globalThis.fetch(url, requestInit);\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\n this._setError(error);\n // Notify `status` observers on HTTP errors too. The `status` property is\n // surfaced via the `wcs-fetch:response` event (getter reads detail.status),\n // so without dispatching it here a bind() subscriber would never see the\n // error status (404, 500, ...). `value` is reset to null on error.\n this._setResponse(null, response.status);\n this._setLoading(false);\n return null;\n }\n\n if (method === \"HEAD\") {\n // HEAD responses carry no body by spec. Reading it as JSON would throw a\n // parse error on the empty body (and end up as a spurious `error`), so skip\n // body reading entirely and surface only the status with a null value.\n this._setResponse(null, response.status);\n } else if (forceText) {\n const text = await response.text();\n this._setResponse(text, response.status);\n } else {\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\n if (responseContentType.includes(\"application/json\")) {\n const data = await response.json();\n this._setResponse(data, response.status);\n } else {\n const text = await response.text();\n this._setResponse(text, response.status);\n }\n }\n\n this._setLoading(false);\n return this._value;\n } catch (e: any) {\n if (e.name === \"AbortError\") {\n // Suppress loading=false when a later request has already taken over. A\n // subsequent fetch() aborts this one via abort() (which nulls the field) and\n // then immediately installs its own controller, so `this._abortController` is\n // non-null here. That newer request has already emitted loading=true and is\n // still in flight, so emitting loading=false now would make observers see a\n // spurious flicker. An explicit abort() leaves the field null, so that path\n // still reports loading=false as expected.\n if (this._abortController === null) {\n this._setLoading(false);\n }\n return null;\n }\n this._setError(e);\n // Reset value/status on network errors too, mirroring the HTTP-error path\n // (`_setResponse(null, response.status)`). Without this, a prior successful\n // request's value/status would linger while `error` is non-null, showing\n // observers an inconsistent state (e.g. status=200 alongside a network\n // error). status=0 is the web-platform convention for \"no HTTP response\"\n // (matches XMLHttpRequest.status on network failure) and the initial value.\n this._setResponse(null, 0);\n this._setLoading(false);\n return null;\n } finally {\n if (this._abortController === ac) {\n this._abortController = null;\n }\n }\n }\n}\n","import { config } from \"./config.js\";\nimport { Fetch } from \"./components/Fetch.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\n if (!fetchId) return;\n\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\n\n // Skip when the target has no url. fetch() is fire-and-forget here (its returned\n // promise is intentionally not awaited), and FetchCore.fetch() rejects synchronously\n // on an empty url. Without this guard that rejection would surface as an unhandled\n // promise rejection. Treat a url-less target as \"nothing to do\", consistent with the\n // other early returns above.\n if (!fetchElement.url) return;\n\n // Suppress the element's default action so a fetch can fire without navigating.\n // Intentional: do not attach data-fetchtarget to an element whose default action\n // you also want (real <a href> link, form-submit button) — it will be cancelled.\n // See README \"Optional DOM Triggering\".\n event.preventDefault();\n fetchElement.fetch();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { FetchCore } from \"../core/FetchCore.js\";\nimport { FetchHeader } from \"./FetchHeader.js\";\nimport { FetchBody } from \"./FetchBody.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class Fetch extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...FetchCore.wcBindable,\n properties: [\n ...FetchCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\n ],\n // Shell-level input surface. The Core declares only the portable `url` / `method`;\n // the Shell adds the DOM-driven settable surface. No `attribute` hints are given:\n // these setters already reflect to their attributes themselves, so a binding system\n // that mirrors inputs[].attribute would set the attribute twice. `commands`\n // (fetch / abort) are inherited unchanged from the Core via the spread above.\n inputs: [\n { name: \"url\" },\n { name: \"method\" },\n { name: \"target\" },\n { name: \"manual\" },\n { name: \"body\" },\n { name: \"trigger\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: FetchCore;\n private _body: any = null;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new FetchCore(this);\n }\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get method(): string {\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\n }\n\n set method(value: string) {\n this.setAttribute(\"method\", value);\n }\n\n get target(): string | null {\n return this.getAttribute(\"target\");\n }\n\n set target(value: string | null) {\n if (value === null) {\n this.removeAttribute(\"target\");\n } else {\n this.setAttribute(\"target\", value);\n }\n }\n\n get value(): any {\n return this._core.value;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get status(): number {\n return this._core.status;\n }\n\n get promise(): Promise<any> {\n return this._core.promise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get body(): any {\n return this._body;\n }\n\n set body(value: any) {\n this._body = value;\n }\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n // Skip when url is empty. fetch() is fire-and-forget here (its returned\n // promise is intentionally only chained with .finally() to reset the flag,\n // never .catch()'d), and FetchCore.fetch() rejects on an empty url. Without\n // this guard that rejection — re-thrown by .finally() — surfaces as an\n // unhandled promise rejection. Mirrors the url-less guard in autoTrigger.\n //\n // Leave `_trigger` false (do not set it) and emit no event: nothing ran, so\n // surfacing a `wcs-fetch:trigger-changed` \"completion\" would lie to observers.\n // Keeping the flag false also avoids stalling — once url is provided, writing\n // `true` again is a real false→true transition that triggers the fetch.\n if (!this.url) return;\n this._trigger = true;\n this.fetch().finally(() => {\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n });\n }\n }\n\n private _collectHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\n for (const el of headerElements) {\n const name = el.headerName;\n const value = el.headerValue;\n if (name) {\n headers[name] = value;\n }\n }\n return headers;\n }\n\n private _collectBody(bodySnapshot: any): { body: BodyInit | null; contentType: string | null } {\n // JS API経由のbodyが優先\n if (bodySnapshot !== null) {\n return {\n body: typeof bodySnapshot === \"string\" ? bodySnapshot : JSON.stringify(bodySnapshot),\n contentType: typeof bodySnapshot === \"string\" ? null : \"application/json\",\n };\n }\n\n // サブタグからbodyを取得\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\n if (bodyElement) {\n return {\n body: bodyElement.bodyContent || null,\n contentType: bodyElement.contentType,\n };\n }\n\n return { body: null, contentType: null };\n }\n\n abort(): void {\n this._core.abort();\n }\n\n async fetch(): Promise<any> {\n const headers = this._collectHeaders();\n\n // Snapshot and reset `body` synchronously, before any await. The body is a\n // one-shot input; resetting it after the await (when another caller may have\n // already set a new body for the next request) would silently drop that value.\n const bodySnapshot = this._body;\n this._body = null;\n const { body, contentType } = this._collectBody(bodySnapshot);\n\n const result = await this._core.fetch(this.url, {\n method: this.method,\n headers,\n body,\n contentType,\n forceText: !!this.target,\n });\n\n // HTML置換モード\n // Security: the response is injected as raw innerHTML without sanitization.\n // This is an opt-in convenience for trusted fragments only; the primary,\n // recommended path is state-driven binding via @wcstack/state. Do not point\n // `target` at an untrusted endpoint (XSS risk). See README \"HTML Replace Mode\".\n if (this.target && result !== null) {\n const targetElement = document.getElementById(this.target);\n if (targetElement) {\n targetElement.innerHTML = result;\n }\n }\n\n return result;\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n // Re-fetch on url changes, but intentionally do NOT update\n // `_connectedCallbackPromise`. Per the wc-bindable connectedCallbackPromise\n // protocol that promise represents the one-shot \"connect-time initialization\n // is done\" signal; it resolves once and is not re-armed for later url-driven\n // requests. Await `promise` if you need to track a specific re-fetch.\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.fetch();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // Only the initial connect-time fetch is tracked by connectedCallbackPromise.\n if (!this.manual && this.url) {\n this._connectedCallbackPromise = this.fetch().then(() => {});\n }\n }\n\n disconnectedCallback(): void {\n this.abort();\n }\n}\n","export class FetchHeader extends HTMLElement {\n connectedCallback(): void {\n this.style.display = \"none\";\n }\n\n get headerName(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n get headerValue(): string {\n return this.getAttribute(\"value\") || \"\";\n }\n}\n","export class FetchBody extends HTMLElement {\n constructor() {\n super();\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\n this.attachShadow({ mode: \"open\" });\n }\n\n get contentType(): string {\n return this.getAttribute(\"type\") || \"application/json\";\n }\n\n get bodyContent(): string {\n return this.textContent?.trim() || \"\";\n }\n}\n","import { Fetch } from \"./components/Fetch.js\";\nimport { FetchHeader } from \"./components/FetchHeader.js\";\nimport { FetchBody } from \"./components/FetchBody.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.fetch)) {\n customElements.define(config.tagNames.fetch, Fetch);\n }\n if (!customElements.get(config.tagNames.fetchHeader)) {\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\n }\n if (!customElements.get(config.tagNames.fetchBody)) {\n customElements.define(config.tagNames.fetchBody, FetchBody);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const t={autoTrigger:!0,triggerAttribute:"data-fetchtarget",tagNames:{fetch:"wcs-fetch",fetchHeader:"wcs-fetch-header",fetchBody:"wcs-fetch-body"}};function e(t){if(null===t||"object"!=typeof t)return t;Object.freeze(t);for(const r of Object.keys(t))e(t[r]);return t}function r(t){if(null===t||"object"!=typeof t)return t;const e={};for(const s of Object.keys(t))e[s]=r(t[s]);return e}let s=null;const n=t;function o(){return s||(s=e(r(t))),s}class i extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"value",event:"wcs-fetch:response",getter:t=>t.detail.value},{name:"loading",event:"wcs-fetch:loading-changed"},{name:"error",event:"wcs-fetch:error"},{name:"status",event:"wcs-fetch:response",getter:t=>t.detail.status}]};_target;_value=null;_loading=!1;_error=null;_status=0;_abortController=null;_promise=Promise.resolve(null);constructor(t){super(),this._target=t??this}get value(){return this._value}get loading(){return this._loading}get error(){return this._error}get status(){return this._status}get promise(){return this._promise}_setLoading(t){this._loading=t,this._target.dispatchEvent(new CustomEvent("wcs-fetch:loading-changed",{detail:t,bubbles:!0}))}_setError(t){this._error=t,this._target.dispatchEvent(new CustomEvent("wcs-fetch:error",{detail:t,bubbles:!0}))}_setResponse(t,e){this._value=t,this._status=e,this._target.dispatchEvent(new CustomEvent("wcs-fetch:response",{detail:{value:t,status:e},bubbles:!0}))}abort(){this._abortController&&(this._abortController.abort(),this._abortController=null)}async fetch(t,e={}){t||function(t){throw new Error(`[@wcstack/fetch] ${t}`)}("url attribute is required.");const r=this._doFetch(t,e);return this._promise=r,r}async _doFetch(t,e){this.abort(),this._abortController=new AbortController;const{signal:r}=this._abortController;this._setLoading(!0),this._setError(null);const{method:s="GET",headers:n={},body:o=null,contentType:i=null,forceText:a=!1}=e;try{i&&!n["Content-Type"]&&(n["Content-Type"]=i);const e={method:s,headers:n,signal:r};"GET"!==s&&"HEAD"!==s&&null!==o&&(e.body=o);const c=await globalThis.fetch(t,e);if(this._status=c.status,!c.ok){const t=await c.text().catch(()=>""),e={status:c.status,statusText:c.statusText,body:t};return this._setError(e),this._setLoading(!1),null}if(a){const t=await c.text();this._setResponse(t,c.status)}else{if((c.headers.get("Content-Type")||"").includes("application/json")){const t=await c.json();this._setResponse(t,c.status)}else{const t=await c.text();this._setResponse(t,c.status)}}return this._setLoading(!1),this._value}catch(t){return"AbortError"===t.name?(this._setLoading(!1),null):(this._setError(t),this._setLoading(!1),null)}finally{this._abortController=null}}}let a=!1;function c(t){const e=t.target;if(!(e instanceof Element))return;const r=e.closest(`[${n.triggerAttribute}]`);if(!r)return;const s=r.getAttribute(n.triggerAttribute);if(!s)return;const o=document.getElementById(s);o&&o instanceof l&&(t.preventDefault(),o.fetch())}class l extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...i.wcBindable,properties:[...i.wcBindable.properties,{name:"trigger",event:"wcs-fetch:trigger-changed"}]};static get observedAttributes(){return["url"]}_core;_body=null;_trigger=!1;_connectedCallbackPromise=Promise.resolve();constructor(){super(),this._core=new i(this)}get url(){return this.getAttribute("url")||""}set url(t){this.setAttribute("url",t)}get method(){return(this.getAttribute("method")||"GET").toUpperCase()}set method(t){this.setAttribute("method",t)}get target(){return this.getAttribute("target")}set target(t){null===t?this.removeAttribute("target"):this.setAttribute("target",t)}get value(){return this._core.value}get loading(){return this._core.loading}get error(){return this._core.error}get status(){return this._core.status}get promise(){return this._core.promise}get connectedCallbackPromise(){return this._connectedCallbackPromise}get manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get body(){return this._body}set body(t){this._body=t}get trigger(){return this._trigger}set trigger(t){!!t&&(this._trigger=!0,this.fetch().finally(()=>{this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-fetch:trigger-changed",{detail:!1,bubbles:!0}))}))}_collectHeaders(){const t={},e=this.querySelectorAll(n.tagNames.fetchHeader);for(const r of e){const e=r.headerName,s=r.headerValue;e&&(t[e]=s)}return t}_collectBody(){if(null!==this._body)return{body:"string"==typeof this._body?this._body:JSON.stringify(this._body),contentType:"string"==typeof this._body?null:"application/json"};const t=this.querySelector(n.tagNames.fetchBody);return t?{body:t.bodyContent||null,contentType:t.contentType}:{body:null,contentType:null}}abort(){this._core.abort()}async fetch(){const t=this._collectHeaders(),{body:e,contentType:r}=this._collectBody(),s=await this._core.fetch(this.url,{method:this.method,headers:t,body:e,contentType:r,forceText:!!this.target});if(this.target&&null!==s){const t=document.getElementById(this.target);t&&(t.innerHTML=s)}return this._body=null,s}attributeChangedCallback(t,e,r){"url"===t&&this.isConnected&&!this.manual&&r&&this.fetch()}connectedCallback(){this.style.display="none",n.autoTrigger&&(a||(a=!0,document.addEventListener("click",c))),!this.manual&&this.url&&(this._connectedCallbackPromise=this.fetch().then(()=>{}))}disconnectedCallback(){this.abort()}}class u extends HTMLElement{connectedCallback(){this.style.display="none"}get headerName(){return this.getAttribute("name")||""}get headerValue(){return this.getAttribute("value")||""}}class h extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}get contentType(){return this.getAttribute("type")||"application/json"}get bodyContent(){return this.textContent?.trim()||""}}function g(e){var r;e&&("boolean"==typeof(r=e).autoTrigger&&(t.autoTrigger=r.autoTrigger),"string"==typeof r.triggerAttribute&&(t.triggerAttribute=r.triggerAttribute),r.tagNames&&Object.assign(t.tagNames,r.tagNames),s=null),customElements.get(n.tagNames.fetch)||customElements.define(n.tagNames.fetch,l),customElements.get(n.tagNames.fetchHeader)||customElements.define(n.tagNames.fetchHeader,u),customElements.get(n.tagNames.fetchBody)||customElements.define(n.tagNames.fetchBody,h)}export{i as FetchCore,l as WcsFetch,g as bootstrapFetch,o as getConfig};
1
+ const t={autoTrigger:!0,triggerAttribute:"data-fetchtarget",tagNames:{fetch:"wcs-fetch",fetchHeader:"wcs-fetch-header",fetchBody:"wcs-fetch-body"}};function e(t){if(null===t||"object"!=typeof t)return t;Object.freeze(t);for(const s of Object.keys(t))e(t[s]);return t}function s(t){if(null===t||"object"!=typeof t)return t;const e={};for(const r of Object.keys(t))e[r]=s(t[r]);return e}let r=null;const n=t;function o(){return r||(r=e(s(t))),r}class a extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"value",event:"wcs-fetch:response",getter:t=>t.detail.value},{name:"loading",event:"wcs-fetch:loading-changed"},{name:"error",event:"wcs-fetch:error"},{name:"status",event:"wcs-fetch:response",getter:t=>t.detail.status}],inputs:[{name:"url"},{name:"method"}],commands:[{name:"fetch",async:!0},{name:"abort"}]};_target;_value=null;_loading=!1;_error=null;_status=0;_abortController=null;_promise=Promise.resolve(null);constructor(t){super(),this._target=t??this}get value(){return this._value}get loading(){return this._loading}get error(){return this._error}get status(){return this._status}get promise(){return this._promise}_setLoading(t){this._loading=t,this._target.dispatchEvent(new CustomEvent("wcs-fetch:loading-changed",{detail:t,bubbles:!0}))}_setError(t){this._error=t,this._target.dispatchEvent(new CustomEvent("wcs-fetch:error",{detail:t,bubbles:!0}))}_setResponse(t,e){this._value=t,this._status=e,this._target.dispatchEvent(new CustomEvent("wcs-fetch:response",{detail:{value:t,status:e},bubbles:!0}))}abort(){this._abortController&&(this._abortController.abort(),this._abortController=null)}async fetch(t,e={}){t||function(t){throw new Error(`[@wcstack/fetch] ${t}`)}("url attribute is required.");const s=this._doFetch(t,e);return this._promise=s,s}async _doFetch(t,e){this.abort();const s=new AbortController;this._abortController=s;const{signal:r}=s;this._setLoading(!0),this._setError(null);const{method:n="GET",body:o=null,contentType:a=null,forceText:i=!1}=e,l={...e.headers??{}};try{a&&!l["Content-Type"]&&(l["Content-Type"]=a);const e={method:n,headers:l,signal:r};"GET"!==n&&"HEAD"!==n&&null!==o&&(e.body=o);const s=await globalThis.fetch(t,e);if(!s.ok){const t=await s.text().catch(()=>""),e={status:s.status,statusText:s.statusText,body:t};return this._setError(e),this._setResponse(null,s.status),this._setLoading(!1),null}if("HEAD"===n)this._setResponse(null,s.status);else if(i){const t=await s.text();this._setResponse(t,s.status)}else{if((s.headers.get("Content-Type")||"").includes("application/json")){const t=await s.json();this._setResponse(t,s.status)}else{const t=await s.text();this._setResponse(t,s.status)}}return this._setLoading(!1),this._value}catch(t){return"AbortError"===t.name?(null===this._abortController&&this._setLoading(!1),null):(this._setError(t),this._setResponse(null,0),this._setLoading(!1),null)}finally{this._abortController===s&&(this._abortController=null)}}}let i=!1;function l(t){const e=t.target;if(!(e instanceof Element))return;const s=e.closest(`[${n.triggerAttribute}]`);if(!s)return;const r=s.getAttribute(n.triggerAttribute);if(!r)return;const o=document.getElementById(r);o&&o instanceof c&&o.url&&(t.preventDefault(),o.fetch())}class c extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...a.wcBindable,properties:[...a.wcBindable.properties,{name:"trigger",event:"wcs-fetch:trigger-changed"}],inputs:[{name:"url"},{name:"method"},{name:"target"},{name:"manual"},{name:"body"},{name:"trigger"}]};static get observedAttributes(){return["url"]}_core;_body=null;_trigger=!1;_connectedCallbackPromise=Promise.resolve();constructor(){super(),this._core=new a(this)}get url(){return this.getAttribute("url")||""}set url(t){this.setAttribute("url",t)}get method(){return(this.getAttribute("method")||"GET").toUpperCase()}set method(t){this.setAttribute("method",t)}get target(){return this.getAttribute("target")}set target(t){null===t?this.removeAttribute("target"):this.setAttribute("target",t)}get value(){return this._core.value}get loading(){return this._core.loading}get error(){return this._core.error}get status(){return this._core.status}get promise(){return this._core.promise}get connectedCallbackPromise(){return this._connectedCallbackPromise}get manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get body(){return this._body}set body(t){this._body=t}get trigger(){return this._trigger}set trigger(t){if(!!t){if(!this.url)return;this._trigger=!0,this.fetch().finally(()=>{this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-fetch:trigger-changed",{detail:!1,bubbles:!0}))})}}_collectHeaders(){const t={},e=this.querySelectorAll(n.tagNames.fetchHeader);for(const s of e){const e=s.headerName,r=s.headerValue;e&&(t[e]=r)}return t}_collectBody(t){if(null!==t)return{body:"string"==typeof t?t:JSON.stringify(t),contentType:"string"==typeof t?null:"application/json"};const e=this.querySelector(n.tagNames.fetchBody);return e?{body:e.bodyContent||null,contentType:e.contentType}:{body:null,contentType:null}}abort(){this._core.abort()}async fetch(){const t=this._collectHeaders(),e=this._body;this._body=null;const{body:s,contentType:r}=this._collectBody(e),n=await this._core.fetch(this.url,{method:this.method,headers:t,body:s,contentType:r,forceText:!!this.target});if(this.target&&null!==n){const t=document.getElementById(this.target);t&&(t.innerHTML=n)}return n}attributeChangedCallback(t,e,s){"url"===t&&this.isConnected&&!this.manual&&s&&this.fetch()}connectedCallback(){this.style.display="none",n.autoTrigger&&(i||(i=!0,document.addEventListener("click",l))),!this.manual&&this.url&&(this._connectedCallbackPromise=this.fetch().then(()=>{}))}disconnectedCallback(){this.abort()}}class u extends HTMLElement{connectedCallback(){this.style.display="none"}get headerName(){return this.getAttribute("name")||""}get headerValue(){return this.getAttribute("value")||""}}class h extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}get contentType(){return this.getAttribute("type")||"application/json"}get bodyContent(){return this.textContent?.trim()||""}}function g(e){var s;e&&("boolean"==typeof(s=e).autoTrigger&&(t.autoTrigger=s.autoTrigger),"string"==typeof s.triggerAttribute&&(t.triggerAttribute=s.triggerAttribute),s.tagNames&&Object.assign(t.tagNames,s.tagNames),r=null),customElements.get(n.tagNames.fetch)||customElements.define(n.tagNames.fetch,c),customElements.get(n.tagNames.fetchHeader)||customElements.define(n.tagNames.fetchHeader,u),customElements.get(n.tagNames.fetchBody)||customElements.define(n.tagNames.fetchBody,h)}export{a as FetchCore,c as WcsFetch,g as bootstrapFetch,o as getConfig};
2
2
  //# sourceMappingURL=index.esm.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/FetchCore.ts","../src/raiseError.ts","../src/autoTrigger.ts","../src/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/bootstrapFetch.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n fetch: string;\n fetchHeader: string;\n fetchBody: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-fetchtarget\",\n tagNames: {\n fetch: \"wcs-fetch\",\n fetchHeader: \"wcs-fetch-header\",\n fetchBody: \"wcs-fetch-body\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface FetchRequestOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit | null;\n contentType?: string | null;\n forceText?: boolean;\n}\n\nexport class FetchCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\n { name: \"error\", event: \"wcs-fetch:error\" },\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\n ],\n };\n\n private _target: EventTarget;\n private _value: any = null;\n private _loading: boolean = false;\n private _error: any = null;\n private _status: number = 0;\n private _abortController: AbortController | null = null;\n private _promise: Promise<any> = Promise.resolve(null);\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get value(): any {\n return this._value;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get status(): number {\n return this._status;\n }\n\n get promise(): Promise<any> {\n return this._promise;\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setResponse(value: any, status: number): void {\n this._value = value;\n this._status = status;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\n detail: { value, status },\n bubbles: true,\n }));\n }\n\n abort(): void {\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n }\n\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\n if (!url) {\n raiseError(\"url attribute is required.\");\n }\n\n const p = this._doFetch(url, options);\n this._promise = p;\n return p;\n }\n\n private async _doFetch(url: string, options: FetchRequestOptions): Promise<any> {\n // 進行中のリクエストをキャンセル\n this.abort();\n\n this._abortController = new AbortController();\n const { signal } = this._abortController;\n\n this._setLoading(true);\n this._setError(null);\n\n const {\n method = \"GET\",\n headers = {},\n body = null,\n contentType = null,\n forceText = false,\n } = options;\n\n try {\n if (contentType && !headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = contentType;\n }\n\n const requestInit: RequestInit = {\n method,\n headers,\n signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\n requestInit.body = body;\n }\n\n const response = await globalThis.fetch(url, requestInit);\n this._status = response.status;\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\n this._setError(error);\n this._setLoading(false);\n return null;\n }\n\n if (forceText) {\n const text = await response.text();\n this._setResponse(text, response.status);\n } else {\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\n if (responseContentType.includes(\"application/json\")) {\n const data = await response.json();\n this._setResponse(data, response.status);\n } else {\n const text = await response.text();\n this._setResponse(text, response.status);\n }\n }\n\n this._setLoading(false);\n return this._value;\n } catch (e: any) {\n if (e.name === \"AbortError\") {\n this._setLoading(false);\n return null;\n }\n this._setError(e);\n this._setLoading(false);\n return null;\n } finally {\n this._abortController = null;\n }\n }\n}\n","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/fetch] ${message}`);\n}\n","import { config } from \"./config.js\";\nimport { Fetch } from \"./components/Fetch.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\n if (!fetchId) return;\n\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\n\n event.preventDefault();\n fetchElement.fetch();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { FetchCore } from \"../core/FetchCore.js\";\nimport { FetchHeader } from \"./FetchHeader.js\";\nimport { FetchBody } from \"./FetchBody.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class Fetch extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...FetchCore.wcBindable,\n properties: [\n ...FetchCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: FetchCore;\n private _body: any = null;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new FetchCore(this);\n }\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get method(): string {\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\n }\n\n set method(value: string) {\n this.setAttribute(\"method\", value);\n }\n\n get target(): string | null {\n return this.getAttribute(\"target\");\n }\n\n set target(value: string | null) {\n if (value === null) {\n this.removeAttribute(\"target\");\n } else {\n this.setAttribute(\"target\", value);\n }\n }\n\n get value(): any {\n return this._core.value;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get status(): number {\n return this._core.status;\n }\n\n get promise(): Promise<any> {\n return this._core.promise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get body(): any {\n return this._body;\n }\n\n set body(value: any) {\n this._body = value;\n }\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.fetch().finally(() => {\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n });\n }\n }\n\n private _collectHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\n for (const el of headerElements) {\n const name = el.headerName;\n const value = el.headerValue;\n if (name) {\n headers[name] = value;\n }\n }\n return headers;\n }\n\n private _collectBody(): { body: BodyInit | null; contentType: string | null } {\n // JS API経由のbodyが優先\n if (this._body !== null) {\n return {\n body: typeof this._body === \"string\" ? this._body : JSON.stringify(this._body),\n contentType: typeof this._body === \"string\" ? null : \"application/json\",\n };\n }\n\n // サブタグからbodyを取得\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\n if (bodyElement) {\n return {\n body: bodyElement.bodyContent || null,\n contentType: bodyElement.contentType,\n };\n }\n\n return { body: null, contentType: null };\n }\n\n abort(): void {\n this._core.abort();\n }\n\n async fetch(): Promise<any> {\n const headers = this._collectHeaders();\n const { body, contentType } = this._collectBody();\n\n const result = await this._core.fetch(this.url, {\n method: this.method,\n headers,\n body,\n contentType,\n forceText: !!this.target,\n });\n\n // HTML置換モード\n if (this.target && result !== null) {\n const targetElement = document.getElementById(this.target);\n if (targetElement) {\n targetElement.innerHTML = result;\n }\n }\n\n // bodyをリセット(一回限りの使用)\n this._body = null;\n\n return result;\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.fetch();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n if (!this.manual && this.url) {\n this._connectedCallbackPromise = this.fetch().then(() => {});\n }\n }\n\n disconnectedCallback(): void {\n this.abort();\n }\n}\n","export class FetchHeader extends HTMLElement {\n connectedCallback(): void {\n this.style.display = \"none\";\n }\n\n get headerName(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n get headerValue(): string {\n return this.getAttribute(\"value\") || \"\";\n }\n}\n","export class FetchBody extends HTMLElement {\n constructor() {\n super();\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\n this.attachShadow({ mode: \"open\" });\n }\n\n get contentType(): string {\n return this.getAttribute(\"type\") || \"application/json\";\n }\n\n get bodyContent(): string {\n return this.textContent?.trim() || \"\";\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { Fetch } from \"./components/Fetch.js\";\nimport { FetchHeader } from \"./components/FetchHeader.js\";\nimport { FetchBody } from \"./components/FetchBody.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.fetch)) {\n customElements.define(config.tagNames.fetch, Fetch);\n }\n if (!customElements.get(config.tagNames.fetchHeader)) {\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\n }\n if (!customElements.get(config.tagNames.fetchBody)) {\n customElements.define(config.tagNames.fetchBody, FetchBody);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","fetch","fetchHeader","fetchBody","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","FetchCore","EventTarget","static","protocol","version","properties","name","event","getter","e","detail","value","status","_target","_value","_loading","_error","_status","_abortController","_promise","Promise","resolve","constructor","target","super","this","loading","error","promise","_setLoading","dispatchEvent","CustomEvent","bubbles","_setError","_setResponse","abort","url","options","message","Error","raiseError","p","_doFetch","AbortController","signal","method","headers","body","contentType","forceText","requestInit","response","globalThis","ok","errorBody","text","catch","statusText","get","includes","data","json","registered","handleClick","Element","triggerElement","closest","fetchId","getAttribute","fetchElement","document","getElementById","Fetch","preventDefault","HTMLElement","wcBindable","observedAttributes","_core","_body","_trigger","_connectedCallbackPromise","setAttribute","toUpperCase","removeAttribute","connectedCallbackPromise","manual","hasAttribute","trigger","finally","_collectHeaders","headerElements","querySelectorAll","el","headerName","headerValue","_collectBody","JSON","stringify","bodyElement","querySelector","bodyContent","result","targetElement","innerHTML","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","addEventListener","then","disconnectedCallback","FetchHeader","FetchBody","attachShadow","mode","textContent","trim","bootstrapFetch","userConfig","partialConfig","assign","customElements","define"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/FetchCore.ts","../src/raiseError.ts","../src/autoTrigger.ts","../src/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/bootstrapFetch.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n fetch: string;\n fetchHeader: string;\n fetchBody: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-fetchtarget\",\n tagNames: {\n fetch: \"wcs-fetch\",\n fetchHeader: \"wcs-fetch-header\",\n fetchBody: \"wcs-fetch-body\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface FetchRequestOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: BodyInit | null;\n contentType?: string | null;\n forceText?: boolean;\n}\n\nexport class FetchCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\n { name: \"error\", event: \"wcs-fetch:error\" },\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\n ],\n inputs: [\n { name: \"url\" },\n { name: \"method\" },\n ],\n commands: [\n { name: \"fetch\", async: true },\n { name: \"abort\" },\n ],\n };\n\n private _target: EventTarget;\n private _value: any = null;\n private _loading: boolean = false;\n private _error: any = null;\n private _status: number = 0;\n private _abortController: AbortController | null = null;\n private _promise: Promise<any> = Promise.resolve(null);\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get value(): any {\n return this._value;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get status(): number {\n return this._status;\n }\n\n get promise(): Promise<any> {\n return this._promise;\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setResponse(value: any, status: number): void {\n this._value = value;\n this._status = status;\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\n detail: { value, status },\n bubbles: true,\n }));\n }\n\n abort(): void {\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n }\n\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\n if (!url) {\n raiseError(\"url attribute is required.\");\n }\n\n const p = this._doFetch(url, options);\n this._promise = p;\n return p;\n }\n\n private async _doFetch(url: string, options: FetchRequestOptions): Promise<any> {\n // 進行中のリクエストをキャンセル\n this.abort();\n\n // Hold the controller in a local so the finally block (which can run after a\n // subsequent fetch has already replaced this._abortController) only clears the\n // field when it still owns it. Without the identity check, an aborted earlier\n // request's finally would null out the controller of the request that superseded\n // it, leaving the later request un-abortable.\n const ac = new AbortController();\n this._abortController = ac;\n const { signal } = ac;\n\n this._setLoading(true);\n this._setError(null);\n\n const {\n method = \"GET\",\n body = null,\n contentType = null,\n forceText = false,\n } = options;\n\n // Copy the caller's headers so the contentType injection below never mutates\n // the object passed in by a headless consumer (the Shell already builds a\n // fresh object, but direct FetchCore users may reuse theirs).\n const headers: Record<string, string> = { ...(options.headers ?? {}) };\n\n try {\n if (contentType && !headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = contentType;\n }\n\n const requestInit: RequestInit = {\n method,\n headers,\n signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\n requestInit.body = body;\n }\n\n const response = await globalThis.fetch(url, requestInit);\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\n this._setError(error);\n // Notify `status` observers on HTTP errors too. The `status` property is\n // surfaced via the `wcs-fetch:response` event (getter reads detail.status),\n // so without dispatching it here a bind() subscriber would never see the\n // error status (404, 500, ...). `value` is reset to null on error.\n this._setResponse(null, response.status);\n this._setLoading(false);\n return null;\n }\n\n if (method === \"HEAD\") {\n // HEAD responses carry no body by spec. Reading it as JSON would throw a\n // parse error on the empty body (and end up as a spurious `error`), so skip\n // body reading entirely and surface only the status with a null value.\n this._setResponse(null, response.status);\n } else if (forceText) {\n const text = await response.text();\n this._setResponse(text, response.status);\n } else {\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\n if (responseContentType.includes(\"application/json\")) {\n const data = await response.json();\n this._setResponse(data, response.status);\n } else {\n const text = await response.text();\n this._setResponse(text, response.status);\n }\n }\n\n this._setLoading(false);\n return this._value;\n } catch (e: any) {\n if (e.name === \"AbortError\") {\n // Suppress loading=false when a later request has already taken over. A\n // subsequent fetch() aborts this one via abort() (which nulls the field) and\n // then immediately installs its own controller, so `this._abortController` is\n // non-null here. That newer request has already emitted loading=true and is\n // still in flight, so emitting loading=false now would make observers see a\n // spurious flicker. An explicit abort() leaves the field null, so that path\n // still reports loading=false as expected.\n if (this._abortController === null) {\n this._setLoading(false);\n }\n return null;\n }\n this._setError(e);\n // Reset value/status on network errors too, mirroring the HTTP-error path\n // (`_setResponse(null, response.status)`). Without this, a prior successful\n // request's value/status would linger while `error` is non-null, showing\n // observers an inconsistent state (e.g. status=200 alongside a network\n // error). status=0 is the web-platform convention for \"no HTTP response\"\n // (matches XMLHttpRequest.status on network failure) and the initial value.\n this._setResponse(null, 0);\n this._setLoading(false);\n return null;\n } finally {\n if (this._abortController === ac) {\n this._abortController = null;\n }\n }\n }\n}\n","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/fetch] ${message}`);\n}\n","import { config } from \"./config.js\";\nimport { Fetch } from \"./components/Fetch.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\n if (!fetchId) return;\n\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\n\n // Skip when the target has no url. fetch() is fire-and-forget here (its returned\n // promise is intentionally not awaited), and FetchCore.fetch() rejects synchronously\n // on an empty url. Without this guard that rejection would surface as an unhandled\n // promise rejection. Treat a url-less target as \"nothing to do\", consistent with the\n // other early returns above.\n if (!fetchElement.url) return;\n\n // Suppress the element's default action so a fetch can fire without navigating.\n // Intentional: do not attach data-fetchtarget to an element whose default action\n // you also want (real <a href> link, form-submit button) — it will be cancelled.\n // See README \"Optional DOM Triggering\".\n event.preventDefault();\n fetchElement.fetch();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { FetchCore } from \"../core/FetchCore.js\";\nimport { FetchHeader } from \"./FetchHeader.js\";\nimport { FetchBody } from \"./FetchBody.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class Fetch extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...FetchCore.wcBindable,\n properties: [\n ...FetchCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\n ],\n // Shell-level input surface. The Core declares only the portable `url` / `method`;\n // the Shell adds the DOM-driven settable surface. No `attribute` hints are given:\n // these setters already reflect to their attributes themselves, so a binding system\n // that mirrors inputs[].attribute would set the attribute twice. `commands`\n // (fetch / abort) are inherited unchanged from the Core via the spread above.\n inputs: [\n { name: \"url\" },\n { name: \"method\" },\n { name: \"target\" },\n { name: \"manual\" },\n { name: \"body\" },\n { name: \"trigger\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: FetchCore;\n private _body: any = null;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new FetchCore(this);\n }\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get method(): string {\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\n }\n\n set method(value: string) {\n this.setAttribute(\"method\", value);\n }\n\n get target(): string | null {\n return this.getAttribute(\"target\");\n }\n\n set target(value: string | null) {\n if (value === null) {\n this.removeAttribute(\"target\");\n } else {\n this.setAttribute(\"target\", value);\n }\n }\n\n get value(): any {\n return this._core.value;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get status(): number {\n return this._core.status;\n }\n\n get promise(): Promise<any> {\n return this._core.promise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get body(): any {\n return this._body;\n }\n\n set body(value: any) {\n this._body = value;\n }\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n // Skip when url is empty. fetch() is fire-and-forget here (its returned\n // promise is intentionally only chained with .finally() to reset the flag,\n // never .catch()'d), and FetchCore.fetch() rejects on an empty url. Without\n // this guard that rejection — re-thrown by .finally() — surfaces as an\n // unhandled promise rejection. Mirrors the url-less guard in autoTrigger.\n //\n // Leave `_trigger` false (do not set it) and emit no event: nothing ran, so\n // surfacing a `wcs-fetch:trigger-changed` \"completion\" would lie to observers.\n // Keeping the flag false also avoids stalling — once url is provided, writing\n // `true` again is a real false→true transition that triggers the fetch.\n if (!this.url) return;\n this._trigger = true;\n this.fetch().finally(() => {\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n });\n }\n }\n\n private _collectHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\n for (const el of headerElements) {\n const name = el.headerName;\n const value = el.headerValue;\n if (name) {\n headers[name] = value;\n }\n }\n return headers;\n }\n\n private _collectBody(bodySnapshot: any): { body: BodyInit | null; contentType: string | null } {\n // JS API経由のbodyが優先\n if (bodySnapshot !== null) {\n return {\n body: typeof bodySnapshot === \"string\" ? bodySnapshot : JSON.stringify(bodySnapshot),\n contentType: typeof bodySnapshot === \"string\" ? null : \"application/json\",\n };\n }\n\n // サブタグからbodyを取得\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\n if (bodyElement) {\n return {\n body: bodyElement.bodyContent || null,\n contentType: bodyElement.contentType,\n };\n }\n\n return { body: null, contentType: null };\n }\n\n abort(): void {\n this._core.abort();\n }\n\n async fetch(): Promise<any> {\n const headers = this._collectHeaders();\n\n // Snapshot and reset `body` synchronously, before any await. The body is a\n // one-shot input; resetting it after the await (when another caller may have\n // already set a new body for the next request) would silently drop that value.\n const bodySnapshot = this._body;\n this._body = null;\n const { body, contentType } = this._collectBody(bodySnapshot);\n\n const result = await this._core.fetch(this.url, {\n method: this.method,\n headers,\n body,\n contentType,\n forceText: !!this.target,\n });\n\n // HTML置換モード\n // Security: the response is injected as raw innerHTML without sanitization.\n // This is an opt-in convenience for trusted fragments only; the primary,\n // recommended path is state-driven binding via @wcstack/state. Do not point\n // `target` at an untrusted endpoint (XSS risk). See README \"HTML Replace Mode\".\n if (this.target && result !== null) {\n const targetElement = document.getElementById(this.target);\n if (targetElement) {\n targetElement.innerHTML = result;\n }\n }\n\n return result;\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n // Re-fetch on url changes, but intentionally do NOT update\n // `_connectedCallbackPromise`. Per the wc-bindable connectedCallbackPromise\n // protocol that promise represents the one-shot \"connect-time initialization\n // is done\" signal; it resolves once and is not re-armed for later url-driven\n // requests. Await `promise` if you need to track a specific re-fetch.\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.fetch();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // Only the initial connect-time fetch is tracked by connectedCallbackPromise.\n if (!this.manual && this.url) {\n this._connectedCallbackPromise = this.fetch().then(() => {});\n }\n }\n\n disconnectedCallback(): void {\n this.abort();\n }\n}\n","export class FetchHeader extends HTMLElement {\n connectedCallback(): void {\n this.style.display = \"none\";\n }\n\n get headerName(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n get headerValue(): string {\n return this.getAttribute(\"value\") || \"\";\n }\n}\n","export class FetchBody extends HTMLElement {\n constructor() {\n super();\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\n this.attachShadow({ mode: \"open\" });\n }\n\n get contentType(): string {\n return this.getAttribute(\"type\") || \"application/json\";\n }\n\n get bodyContent(): string {\n return this.textContent?.trim() || \"\";\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { Fetch } from \"./components/Fetch.js\";\nimport { FetchHeader } from \"./components/FetchHeader.js\";\nimport { FetchBody } from \"./components/FetchBody.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.fetch)) {\n customElements.define(config.tagNames.fetch, Fetch);\n }\n if (!customElements.get(config.tagNames.fetchHeader)) {\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\n }\n if (!customElements.get(config.tagNames.fetchBody)) {\n customElements.define(config.tagNames.fetchBody, FetchBody);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","fetch","fetchHeader","fetchBody","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","FetchCore","EventTarget","static","protocol","version","properties","name","event","getter","e","detail","value","status","inputs","commands","async","_target","_value","_loading","_error","_status","_abortController","_promise","Promise","resolve","constructor","target","super","this","loading","error","promise","_setLoading","dispatchEvent","CustomEvent","bubbles","_setError","_setResponse","abort","url","options","message","Error","raiseError","p","_doFetch","ac","AbortController","signal","method","body","contentType","forceText","headers","requestInit","response","globalThis","ok","errorBody","text","catch","statusText","get","includes","data","json","registered","handleClick","Element","triggerElement","closest","fetchId","getAttribute","fetchElement","document","getElementById","Fetch","preventDefault","HTMLElement","wcBindable","observedAttributes","_core","_body","_trigger","_connectedCallbackPromise","setAttribute","toUpperCase","removeAttribute","connectedCallbackPromise","manual","hasAttribute","trigger","finally","_collectHeaders","headerElements","querySelectorAll","el","headerName","headerValue","_collectBody","bodySnapshot","JSON","stringify","bodyElement","querySelector","bodyContent","result","targetElement","innerHTML","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","addEventListener","then","disconnectedCallback","FetchHeader","FetchBody","attachShadow","mode","textContent","trim","bootstrapFetch","userConfig","partialConfig","assign","customElements","define"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wcstack/fetch",
3
- "version": "1.10.0",
3
+ "version": "1.10.4",
4
4
  "description": "Declarative fetch component for Web Components. Framework-agnostic async data fetching via wc-bindable-protocol.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.esm.js",