@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 +29 -8
- package/README.md +61 -10
- package/dist/index.d.ts +11 -1
- package/dist/index.esm.js +109 -14
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/package.json +1 -1
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` は [
|
|
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
|
-
-
|
|
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
|
-
|
|
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` は
|
|
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>` は
|
|
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 [
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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`
|
|
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>`
|
|
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:
|
|
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
|
-
|
|
130
|
-
|
|
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",
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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 (
|
|
400
|
+
if (bodySnapshot !== null) {
|
|
319
401
|
return {
|
|
320
|
-
body: typeof
|
|
321
|
-
contentType: typeof
|
|
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
|
-
|
|
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
|
}
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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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"}
|
package/dist/index.esm.min.js
CHANGED
|
@@ -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
|
|
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