@wcstack/fetch 1.4.0 → 1.6.2

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/dist/index.d.ts CHANGED
@@ -1,8 +1,18 @@
1
+ interface ITagNames {
2
+ readonly fetch: string;
3
+ readonly fetchHeader: string;
4
+ readonly fetchBody: string;
5
+ }
1
6
  interface IWritableTagNames {
2
7
  fetch?: string;
3
8
  fetchHeader?: string;
4
9
  fetchBody?: string;
5
10
  }
11
+ interface IConfig {
12
+ readonly autoTrigger: boolean;
13
+ readonly triggerAttribute: string;
14
+ readonly tagNames: ITagNames;
15
+ }
6
16
  interface IWritableConfig {
7
17
  autoTrigger?: boolean;
8
18
  triggerAttribute?: string;
@@ -62,6 +72,8 @@ interface WcsFetchValues<T = unknown> extends WcsFetchCoreValues<T> {
62
72
 
63
73
  declare function bootstrapFetch(userConfig?: IWritableConfig): void;
64
74
 
75
+ declare function getConfig(): IConfig;
76
+
65
77
  interface FetchRequestOptions {
66
78
  method?: string;
67
79
  headers?: Record<string, string>;
@@ -77,17 +89,20 @@ declare class FetchCore extends EventTarget {
77
89
  private _error;
78
90
  private _status;
79
91
  private _abortController;
92
+ private _promise;
80
93
  constructor(target?: EventTarget);
81
94
  get value(): any;
82
95
  get loading(): boolean;
83
96
  get error(): any;
84
97
  get status(): number;
98
+ get promise(): Promise<any>;
85
99
  private _setLoading;
86
100
  private _setError;
87
101
  private _setResponse;
88
102
  abort(): void;
89
103
  fetch(url: string, options?: FetchRequestOptions): Promise<any>;
104
+ private _doFetch;
90
105
  }
91
106
 
92
- export { FetchCore, bootstrapFetch };
107
+ export { FetchCore, bootstrapFetch, getConfig };
93
108
  export type { FetchRequestOptions, IWritableConfig, IWritableTagNames, WcsFetchCoreValues, WcsFetchHttpError, WcsFetchValues };
package/dist/index.esm.js CHANGED
@@ -7,7 +7,32 @@ const _config = {
7
7
  fetchBody: "wcs-fetch-body",
8
8
  },
9
9
  };
10
+ function deepFreeze(obj) {
11
+ if (obj === null || typeof obj !== "object")
12
+ return obj;
13
+ Object.freeze(obj);
14
+ for (const key of Object.keys(obj)) {
15
+ deepFreeze(obj[key]);
16
+ }
17
+ return obj;
18
+ }
19
+ function deepClone(obj) {
20
+ if (obj === null || typeof obj !== "object")
21
+ return obj;
22
+ const clone = {};
23
+ for (const key of Object.keys(obj)) {
24
+ clone[key] = deepClone(obj[key]);
25
+ }
26
+ return clone;
27
+ }
28
+ let frozenConfig = null;
10
29
  const config = _config;
30
+ function getConfig() {
31
+ if (!frozenConfig) {
32
+ frozenConfig = deepFreeze(deepClone(_config));
33
+ }
34
+ return frozenConfig;
35
+ }
11
36
  function setConfig(partialConfig) {
12
37
  if (typeof partialConfig.autoTrigger === "boolean") {
13
38
  _config.autoTrigger = partialConfig.autoTrigger;
@@ -18,6 +43,7 @@ function setConfig(partialConfig) {
18
43
  if (partialConfig.tagNames) {
19
44
  Object.assign(_config.tagNames, partialConfig.tagNames);
20
45
  }
46
+ frozenConfig = null;
21
47
  }
22
48
 
23
49
  function raiseError(message) {
@@ -41,6 +67,7 @@ class FetchCore extends EventTarget {
41
67
  _error = null;
42
68
  _status = 0;
43
69
  _abortController = null;
70
+ _promise = Promise.resolve(null);
44
71
  constructor(target) {
45
72
  super();
46
73
  this._target = target ?? this;
@@ -57,6 +84,9 @@ class FetchCore extends EventTarget {
57
84
  get status() {
58
85
  return this._status;
59
86
  }
87
+ get promise() {
88
+ return this._promise;
89
+ }
60
90
  _setLoading(loading) {
61
91
  this._loading = loading;
62
92
  this._target.dispatchEvent(new CustomEvent("wcs-fetch:loading-changed", {
@@ -89,6 +119,11 @@ class FetchCore extends EventTarget {
89
119
  if (!url) {
90
120
  raiseError("url attribute is required.");
91
121
  }
122
+ const p = this._doFetch(url, options);
123
+ this._promise = p;
124
+ return p;
125
+ }
126
+ async _doFetch(url, options) {
92
127
  // 進行中のリクエストをキャンセル
93
128
  this.abort();
94
129
  this._abortController = new AbortController();
@@ -151,6 +186,7 @@ class FetchCore extends EventTarget {
151
186
  }
152
187
 
153
188
  class Fetch extends HTMLElement {
189
+ static hasConnectedCallbackPromise = true;
154
190
  static wcBindable = {
155
191
  ...FetchCore.wcBindable,
156
192
  properties: [
@@ -162,6 +198,7 @@ class Fetch extends HTMLElement {
162
198
  _core;
163
199
  _body = null;
164
200
  _trigger = false;
201
+ _connectedCallbackPromise = Promise.resolve();
165
202
  constructor() {
166
203
  super();
167
204
  this._core = new FetchCore(this);
@@ -201,6 +238,12 @@ class Fetch extends HTMLElement {
201
238
  get status() {
202
239
  return this._core.status;
203
240
  }
241
+ get promise() {
242
+ return this._core.promise;
243
+ }
244
+ get connectedCallbackPromise() {
245
+ return this._connectedCallbackPromise;
246
+ }
204
247
  get manual() {
205
248
  return this.hasAttribute("manual");
206
249
  }
@@ -296,7 +339,7 @@ class Fetch extends HTMLElement {
296
339
  connectedCallback() {
297
340
  this.style.display = "none";
298
341
  if (!this.manual && this.url) {
299
- this.fetch();
342
+ this._connectedCallbackPromise = this.fetch().then(() => { });
300
343
  }
301
344
  }
302
345
  disconnectedCallback() {
@@ -376,5 +419,5 @@ function bootstrapFetch(userConfig) {
376
419
  }
377
420
  }
378
421
 
379
- export { FetchCore, bootstrapFetch };
422
+ export { FetchCore, bootstrapFetch, getConfig };
380
423
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/raiseError.ts","../src/core/FetchCore.ts","../src/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/registerComponents.ts","../src/autoTrigger.ts","../src/bootstrapFetch.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\r\n\r\ninterface IInternalConfig extends IConfig {\r\n autoTrigger: boolean;\r\n triggerAttribute: string;\r\n tagNames: {\r\n fetch: string;\r\n fetchHeader: string;\r\n fetchBody: string;\r\n };\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n autoTrigger: true,\r\n triggerAttribute: \"data-fetchtarget\",\r\n tagNames: {\r\n fetch: \"wcs-fetch\",\r\n fetchHeader: \"wcs-fetch-header\",\r\n fetchBody: \"wcs-fetch-body\",\r\n },\r\n};\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n deepFreeze((obj as Record<string, unknown>)[key]);\r\n }\r\n return obj;\r\n}\r\n\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n const clone: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n return clone as T;\r\n}\r\n\r\nlet frozenConfig: IConfig | null = null;\r\n\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n if (!frozenConfig) {\r\n frozenConfig = deepFreeze(deepClone(_config));\r\n }\r\n return frozenConfig;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (typeof partialConfig.autoTrigger === \"boolean\") {\r\n _config.autoTrigger = partialConfig.autoTrigger;\r\n }\r\n if (typeof partialConfig.triggerAttribute === \"string\") {\r\n _config.triggerAttribute = partialConfig.triggerAttribute;\r\n }\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n frozenConfig = null;\r\n}\r\n","export function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/fetch] ${message}`);\r\n}\r\n","import { raiseError } from \"../raiseError.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\n\r\nexport interface FetchRequestOptions {\r\n method?: string;\r\n headers?: Record<string, string>;\r\n body?: BodyInit | null;\r\n contentType?: string | null;\r\n forceText?: boolean;\r\n}\r\n\r\nexport class FetchCore extends EventTarget {\r\n static wcBindable: IWcBindable = {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties: [\r\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\r\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\r\n { name: \"error\", event: \"wcs-fetch:error\" },\r\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\r\n ],\r\n };\r\n\r\n private _target: EventTarget;\r\n private _value: any = null;\r\n private _loading: boolean = false;\r\n private _error: any = null;\r\n private _status: number = 0;\r\n private _abortController: AbortController | null = null;\r\n\r\n constructor(target?: EventTarget) {\r\n super();\r\n this._target = target ?? this;\r\n }\r\n\r\n get value(): any {\r\n return this._value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._loading;\r\n }\r\n\r\n get error(): any {\r\n return this._error;\r\n }\r\n\r\n get status(): number {\r\n return this._status;\r\n }\r\n\r\n private _setLoading(loading: boolean): void {\r\n this._loading = loading;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\r\n detail: loading,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setError(error: any): void {\r\n this._error = error;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\r\n detail: error,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setResponse(value: any, status: number): void {\r\n this._value = value;\r\n this._status = status;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\r\n detail: { value, status },\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n abort(): void {\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n this._abortController = null;\r\n }\r\n }\r\n\r\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\r\n if (!url) {\r\n raiseError(\"url attribute is required.\");\r\n }\r\n\r\n // 進行中のリクエストをキャンセル\r\n this.abort();\r\n\r\n this._abortController = new AbortController();\r\n const { signal } = this._abortController;\r\n\r\n this._setLoading(true);\r\n this._error = null;\r\n\r\n const {\r\n method = \"GET\",\r\n headers = {},\r\n body = null,\r\n contentType = null,\r\n forceText = false,\r\n } = options;\r\n\r\n try {\r\n if (contentType && !headers[\"Content-Type\"]) {\r\n headers[\"Content-Type\"] = contentType;\r\n }\r\n\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n signal,\r\n };\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\r\n requestInit.body = body;\r\n }\r\n\r\n const response = await globalThis.fetch(url, requestInit);\r\n this._status = response.status;\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.text().catch(() => \"\");\r\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\r\n this._setError(error);\r\n this._setLoading(false);\r\n return null;\r\n }\r\n\r\n if (forceText) {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n } else {\r\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\r\n if (responseContentType.includes(\"application/json\")) {\r\n const data = await response.json();\r\n this._setResponse(data, response.status);\r\n } else {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n }\r\n }\r\n\r\n this._setLoading(false);\r\n return this._value;\r\n } catch (e: any) {\r\n if (e.name === \"AbortError\") {\r\n this._setLoading(false);\r\n return null;\r\n }\r\n this._setError(e);\r\n this._setLoading(false);\r\n return null;\r\n } finally {\r\n this._abortController = null;\r\n }\r\n }\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\nimport { FetchCore } from \"../core/FetchCore.js\";\r\nimport { FetchHeader } from \"./FetchHeader.js\";\r\nimport { FetchBody } from \"./FetchBody.js\";\r\n\r\nexport class Fetch extends HTMLElement {\r\n static wcBindable: IWcBindable = {\r\n ...FetchCore.wcBindable,\r\n properties: [\r\n ...FetchCore.wcBindable.properties,\r\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\r\n ],\r\n };\r\n static get observedAttributes(): string[] { return [\"url\"]; }\r\n\r\n private _core: FetchCore;\r\n private _body: any = null;\r\n private _trigger: boolean = false;\r\n\r\n constructor() {\r\n super();\r\n this._core = new FetchCore(this);\r\n }\r\n\r\n get url(): string {\r\n return this.getAttribute(\"url\") || \"\";\r\n }\r\n\r\n set url(value: string) {\r\n this.setAttribute(\"url\", value);\r\n }\r\n\r\n get method(): string {\r\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\r\n }\r\n\r\n set method(value: string) {\r\n this.setAttribute(\"method\", value);\r\n }\r\n\r\n get target(): string | null {\r\n return this.getAttribute(\"target\");\r\n }\r\n\r\n set target(value: string | null) {\r\n if (value === null) {\r\n this.removeAttribute(\"target\");\r\n } else {\r\n this.setAttribute(\"target\", value);\r\n }\r\n }\r\n\r\n get value(): any {\r\n return this._core.value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._core.loading;\r\n }\r\n\r\n get error(): any {\r\n return this._core.error;\r\n }\r\n\r\n get status(): number {\r\n return this._core.status;\r\n }\r\n\r\n get manual(): boolean {\r\n return this.hasAttribute(\"manual\");\r\n }\r\n\r\n set manual(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"manual\", \"\");\r\n } else {\r\n this.removeAttribute(\"manual\");\r\n }\r\n }\r\n\r\n get body(): any {\r\n return this._body;\r\n }\r\n\r\n set body(value: any) {\r\n this._body = value;\r\n }\r\n\r\n get trigger(): boolean {\r\n return this._trigger;\r\n }\r\n\r\n set trigger(value: boolean) {\r\n const v = !!value;\r\n if (v) {\r\n this._trigger = true;\r\n this.fetch().finally(() => {\r\n this._trigger = false;\r\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\r\n detail: false,\r\n bubbles: true,\r\n }));\r\n });\r\n }\r\n }\r\n\r\n private _collectHeaders(): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\r\n for (const el of headerElements) {\r\n const name = el.headerName;\r\n const value = el.headerValue;\r\n if (name) {\r\n headers[name] = value;\r\n }\r\n }\r\n return headers;\r\n }\r\n\r\n private _collectBody(): { body: BodyInit | null; contentType: string | null } {\r\n // JS API経由のbodyが優先\r\n if (this._body !== null) {\r\n return {\r\n body: typeof this._body === \"string\" ? this._body : JSON.stringify(this._body),\r\n contentType: typeof this._body === \"string\" ? null : \"application/json\",\r\n };\r\n }\r\n\r\n // サブタグからbodyを取得\r\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\r\n if (bodyElement) {\r\n return {\r\n body: bodyElement.bodyContent || null,\r\n contentType: bodyElement.contentType,\r\n };\r\n }\r\n\r\n return { body: null, contentType: null };\r\n }\r\n\r\n abort(): void {\r\n this._core.abort();\r\n }\r\n\r\n async fetch(): Promise<any> {\r\n const headers = this._collectHeaders();\r\n const { body, contentType } = this._collectBody();\r\n\r\n const result = await this._core.fetch(this.url, {\r\n method: this.method,\r\n headers,\r\n body,\r\n contentType,\r\n forceText: !!this.target,\r\n });\r\n\r\n // HTML置換モード\r\n if (this.target && result !== null) {\r\n const targetElement = document.getElementById(this.target);\r\n if (targetElement) {\r\n targetElement.innerHTML = result;\r\n }\r\n }\r\n\r\n // bodyをリセット(一回限りの使用)\r\n this._body = null;\r\n\r\n return result;\r\n }\r\n\r\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\r\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\r\n this.fetch();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n if (!this.manual && this.url) {\r\n this.fetch();\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.abort();\r\n }\r\n}\r\n","export class FetchHeader extends HTMLElement {\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n }\r\n\r\n get headerName(): string {\r\n return this.getAttribute(\"name\") || \"\";\r\n }\r\n\r\n get headerValue(): string {\r\n return this.getAttribute(\"value\") || \"\";\r\n }\r\n}\r\n","export class FetchBody extends HTMLElement {\r\n constructor() {\r\n super();\r\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\r\n this.attachShadow({ mode: \"open\" });\r\n }\r\n\r\n get contentType(): string {\r\n return this.getAttribute(\"type\") || \"application/json\";\r\n }\r\n\r\n get bodyContent(): string {\r\n return this.textContent?.trim() || \"\";\r\n }\r\n}\r\n","import { Fetch } from \"./components/Fetch.js\";\r\nimport { FetchHeader } from \"./components/FetchHeader.js\";\r\nimport { FetchBody } from \"./components/FetchBody.js\";\r\nimport { config } from \"./config.js\";\r\n\r\nexport function registerComponents(): void {\r\n if (!customElements.get(config.tagNames.fetch)) {\r\n customElements.define(config.tagNames.fetch, Fetch);\r\n }\r\n if (!customElements.get(config.tagNames.fetchHeader)) {\r\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\r\n }\r\n if (!customElements.get(config.tagNames.fetchBody)) {\r\n customElements.define(config.tagNames.fetchBody, FetchBody);\r\n }\r\n}\r\n","import { config } from \"./config.js\";\r\nimport { Fetch } from \"./components/Fetch.js\";\r\n\r\nlet registered = false;\r\n\r\nfunction handleClick(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof Element)) return;\r\n\r\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\r\n if (!triggerElement) return;\r\n\r\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\r\n if (!fetchId) return;\r\n\r\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\r\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\r\n\r\n event.preventDefault();\r\n fetchElement.fetch();\r\n}\r\n\r\nexport function registerAutoTrigger(): void {\r\n if (registered) return;\r\n registered = true;\r\n document.addEventListener(\"click\", handleClick);\r\n}\r\n\r\nexport function unregisterAutoTrigger(): void {\r\n if (!registered) return;\r\n registered = false;\r\n document.removeEventListener(\"click\", handleClick);\r\n}\r\n","import { setConfig } from \"./config.js\";\r\nimport { config } from \"./config.js\";\r\nimport { registerComponents } from \"./registerComponents.js\";\r\nimport { registerAutoTrigger } from \"./autoTrigger.js\";\r\nimport { IWritableConfig } from \"./types.js\";\r\n\r\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\r\n if (userConfig) {\r\n setConfig(userConfig);\r\n }\r\n registerComponents();\r\n if (config.autoTrigger) {\r\n registerAutoTrigger();\r\n }\r\n}\r\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/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/registerComponents.ts","../src/autoTrigger.ts","../src/bootstrapFetch.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\r\n\r\ninterface IInternalConfig extends IConfig {\r\n autoTrigger: boolean;\r\n triggerAttribute: string;\r\n tagNames: {\r\n fetch: string;\r\n fetchHeader: string;\r\n fetchBody: string;\r\n };\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n autoTrigger: true,\r\n triggerAttribute: \"data-fetchtarget\",\r\n tagNames: {\r\n fetch: \"wcs-fetch\",\r\n fetchHeader: \"wcs-fetch-header\",\r\n fetchBody: \"wcs-fetch-body\",\r\n },\r\n};\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n deepFreeze((obj as Record<string, unknown>)[key]);\r\n }\r\n return obj;\r\n}\r\n\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n const clone: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n return clone as T;\r\n}\r\n\r\nlet frozenConfig: IConfig | null = null;\r\n\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n if (!frozenConfig) {\r\n frozenConfig = deepFreeze(deepClone(_config));\r\n }\r\n return frozenConfig;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (typeof partialConfig.autoTrigger === \"boolean\") {\r\n _config.autoTrigger = partialConfig.autoTrigger;\r\n }\r\n if (typeof partialConfig.triggerAttribute === \"string\") {\r\n _config.triggerAttribute = partialConfig.triggerAttribute;\r\n }\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n frozenConfig = null;\r\n}\r\n","export function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/fetch] ${message}`);\r\n}\r\n","import { raiseError } from \"../raiseError.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\n\r\nexport interface FetchRequestOptions {\r\n method?: string;\r\n headers?: Record<string, string>;\r\n body?: BodyInit | null;\r\n contentType?: string | null;\r\n forceText?: boolean;\r\n}\r\n\r\nexport class FetchCore extends EventTarget {\r\n static wcBindable: IWcBindable = {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties: [\r\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\r\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\r\n { name: \"error\", event: \"wcs-fetch:error\" },\r\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\r\n ],\r\n };\r\n\r\n private _target: EventTarget;\r\n private _value: any = null;\r\n private _loading: boolean = false;\r\n private _error: any = null;\r\n private _status: number = 0;\r\n private _abortController: AbortController | null = null;\r\n private _promise: Promise<any> = Promise.resolve(null);\r\n\r\n constructor(target?: EventTarget) {\r\n super();\r\n this._target = target ?? this;\r\n }\r\n\r\n get value(): any {\r\n return this._value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._loading;\r\n }\r\n\r\n get error(): any {\r\n return this._error;\r\n }\r\n\r\n get status(): number {\r\n return this._status;\r\n }\r\n\r\n get promise(): Promise<any> {\r\n return this._promise;\r\n }\r\n\r\n private _setLoading(loading: boolean): void {\r\n this._loading = loading;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\r\n detail: loading,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setError(error: any): void {\r\n this._error = error;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\r\n detail: error,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setResponse(value: any, status: number): void {\r\n this._value = value;\r\n this._status = status;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\r\n detail: { value, status },\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n abort(): void {\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n this._abortController = null;\r\n }\r\n }\r\n\r\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\r\n if (!url) {\r\n raiseError(\"url attribute is required.\");\r\n }\r\n\r\n const p = this._doFetch(url, options);\r\n this._promise = p;\r\n return p;\r\n }\r\n\r\n private async _doFetch(url: string, options: FetchRequestOptions): Promise<any> {\r\n // 進行中のリクエストをキャンセル\r\n this.abort();\r\n\r\n this._abortController = new AbortController();\r\n const { signal } = this._abortController;\r\n\r\n this._setLoading(true);\r\n this._error = null;\r\n\r\n const {\r\n method = \"GET\",\r\n headers = {},\r\n body = null,\r\n contentType = null,\r\n forceText = false,\r\n } = options;\r\n\r\n try {\r\n if (contentType && !headers[\"Content-Type\"]) {\r\n headers[\"Content-Type\"] = contentType;\r\n }\r\n\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n signal,\r\n };\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\r\n requestInit.body = body;\r\n }\r\n\r\n const response = await globalThis.fetch(url, requestInit);\r\n this._status = response.status;\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.text().catch(() => \"\");\r\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\r\n this._setError(error);\r\n this._setLoading(false);\r\n return null;\r\n }\r\n\r\n if (forceText) {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n } else {\r\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\r\n if (responseContentType.includes(\"application/json\")) {\r\n const data = await response.json();\r\n this._setResponse(data, response.status);\r\n } else {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n }\r\n }\r\n\r\n this._setLoading(false);\r\n return this._value;\r\n } catch (e: any) {\r\n if (e.name === \"AbortError\") {\r\n this._setLoading(false);\r\n return null;\r\n }\r\n this._setError(e);\r\n this._setLoading(false);\r\n return null;\r\n } finally {\r\n this._abortController = null;\r\n }\r\n }\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\nimport { FetchCore } from \"../core/FetchCore.js\";\r\nimport { FetchHeader } from \"./FetchHeader.js\";\r\nimport { FetchBody } from \"./FetchBody.js\";\r\n\r\nexport class Fetch extends HTMLElement {\r\n static hasConnectedCallbackPromise = true;\r\n static wcBindable: IWcBindable = {\r\n ...FetchCore.wcBindable,\r\n properties: [\r\n ...FetchCore.wcBindable.properties,\r\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\r\n ],\r\n };\r\n static get observedAttributes(): string[] { return [\"url\"]; }\r\n\r\n private _core: FetchCore;\r\n private _body: any = null;\r\n private _trigger: boolean = false;\r\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\r\n\r\n constructor() {\r\n super();\r\n this._core = new FetchCore(this);\r\n }\r\n\r\n get url(): string {\r\n return this.getAttribute(\"url\") || \"\";\r\n }\r\n\r\n set url(value: string) {\r\n this.setAttribute(\"url\", value);\r\n }\r\n\r\n get method(): string {\r\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\r\n }\r\n\r\n set method(value: string) {\r\n this.setAttribute(\"method\", value);\r\n }\r\n\r\n get target(): string | null {\r\n return this.getAttribute(\"target\");\r\n }\r\n\r\n set target(value: string | null) {\r\n if (value === null) {\r\n this.removeAttribute(\"target\");\r\n } else {\r\n this.setAttribute(\"target\", value);\r\n }\r\n }\r\n\r\n get value(): any {\r\n return this._core.value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._core.loading;\r\n }\r\n\r\n get error(): any {\r\n return this._core.error;\r\n }\r\n\r\n get status(): number {\r\n return this._core.status;\r\n }\r\n\r\n get promise(): Promise<any> {\r\n return this._core.promise;\r\n }\r\n\r\n get connectedCallbackPromise(): Promise<void> {\r\n return this._connectedCallbackPromise;\r\n }\r\n\r\n get manual(): boolean {\r\n return this.hasAttribute(\"manual\");\r\n }\r\n\r\n set manual(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"manual\", \"\");\r\n } else {\r\n this.removeAttribute(\"manual\");\r\n }\r\n }\r\n\r\n get body(): any {\r\n return this._body;\r\n }\r\n\r\n set body(value: any) {\r\n this._body = value;\r\n }\r\n\r\n get trigger(): boolean {\r\n return this._trigger;\r\n }\r\n\r\n set trigger(value: boolean) {\r\n const v = !!value;\r\n if (v) {\r\n this._trigger = true;\r\n this.fetch().finally(() => {\r\n this._trigger = false;\r\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\r\n detail: false,\r\n bubbles: true,\r\n }));\r\n });\r\n }\r\n }\r\n\r\n private _collectHeaders(): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\r\n for (const el of headerElements) {\r\n const name = el.headerName;\r\n const value = el.headerValue;\r\n if (name) {\r\n headers[name] = value;\r\n }\r\n }\r\n return headers;\r\n }\r\n\r\n private _collectBody(): { body: BodyInit | null; contentType: string | null } {\r\n // JS API経由のbodyが優先\r\n if (this._body !== null) {\r\n return {\r\n body: typeof this._body === \"string\" ? this._body : JSON.stringify(this._body),\r\n contentType: typeof this._body === \"string\" ? null : \"application/json\",\r\n };\r\n }\r\n\r\n // サブタグからbodyを取得\r\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\r\n if (bodyElement) {\r\n return {\r\n body: bodyElement.bodyContent || null,\r\n contentType: bodyElement.contentType,\r\n };\r\n }\r\n\r\n return { body: null, contentType: null };\r\n }\r\n\r\n abort(): void {\r\n this._core.abort();\r\n }\r\n\r\n async fetch(): Promise<any> {\r\n const headers = this._collectHeaders();\r\n const { body, contentType } = this._collectBody();\r\n\r\n const result = await this._core.fetch(this.url, {\r\n method: this.method,\r\n headers,\r\n body,\r\n contentType,\r\n forceText: !!this.target,\r\n });\r\n\r\n // HTML置換モード\r\n if (this.target && result !== null) {\r\n const targetElement = document.getElementById(this.target);\r\n if (targetElement) {\r\n targetElement.innerHTML = result;\r\n }\r\n }\r\n\r\n // bodyをリセット(一回限りの使用)\r\n this._body = null;\r\n\r\n return result;\r\n }\r\n\r\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\r\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\r\n this.fetch();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n if (!this.manual && this.url) {\r\n this._connectedCallbackPromise = this.fetch().then(() => {});\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.abort();\r\n }\r\n}\r\n","export class FetchHeader extends HTMLElement {\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n }\r\n\r\n get headerName(): string {\r\n return this.getAttribute(\"name\") || \"\";\r\n }\r\n\r\n get headerValue(): string {\r\n return this.getAttribute(\"value\") || \"\";\r\n }\r\n}\r\n","export class FetchBody extends HTMLElement {\r\n constructor() {\r\n super();\r\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\r\n this.attachShadow({ mode: \"open\" });\r\n }\r\n\r\n get contentType(): string {\r\n return this.getAttribute(\"type\") || \"application/json\";\r\n }\r\n\r\n get bodyContent(): string {\r\n return this.textContent?.trim() || \"\";\r\n }\r\n}\r\n","import { Fetch } from \"./components/Fetch.js\";\r\nimport { FetchHeader } from \"./components/FetchHeader.js\";\r\nimport { FetchBody } from \"./components/FetchBody.js\";\r\nimport { config } from \"./config.js\";\r\n\r\nexport function registerComponents(): void {\r\n if (!customElements.get(config.tagNames.fetch)) {\r\n customElements.define(config.tagNames.fetch, Fetch);\r\n }\r\n if (!customElements.get(config.tagNames.fetchHeader)) {\r\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\r\n }\r\n if (!customElements.get(config.tagNames.fetchBody)) {\r\n customElements.define(config.tagNames.fetchBody, FetchBody);\r\n }\r\n}\r\n","import { config } from \"./config.js\";\r\nimport { Fetch } from \"./components/Fetch.js\";\r\n\r\nlet registered = false;\r\n\r\nfunction handleClick(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof Element)) return;\r\n\r\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\r\n if (!triggerElement) return;\r\n\r\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\r\n if (!fetchId) return;\r\n\r\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\r\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\r\n\r\n event.preventDefault();\r\n fetchElement.fetch();\r\n}\r\n\r\nexport function registerAutoTrigger(): void {\r\n if (registered) return;\r\n registered = true;\r\n document.addEventListener(\"click\", handleClick);\r\n}\r\n\r\nexport function unregisterAutoTrigger(): void {\r\n if (!registered) return;\r\n registered = false;\r\n document.removeEventListener(\"click\", handleClick);\r\n}\r\n","import { setConfig } from \"./config.js\";\r\nimport { config } from \"./config.js\";\r\nimport { registerComponents } from \"./registerComponents.js\";\r\nimport { registerAutoTrigger } from \"./autoTrigger.js\";\r\nimport { IWritableConfig } from \"./types.js\";\r\n\r\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\r\n if (userConfig) {\r\n setConfig(userConfig);\r\n }\r\n registerComponents();\r\n if (config.autoTrigger) {\r\n registerAutoTrigger();\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const t={autoTrigger:!0,triggerAttribute:"data-fetchtarget",tagNames:{fetch:"wcs-fetch",fetchHeader:"wcs-fetch-header",fetchBody:"wcs-fetch-body"}},e=t;class s extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"value",event:"wcs-fetch:response",getter:t=>t.detail.value},{name:"loading",event:"wcs-fetch:loading-changed"},{name:"error",event:"wcs-fetch:error"},{name:"status",event:"wcs-fetch:response",getter:t=>t.detail.status}]};_target;_value=null;_loading=!1;_error=null;_status=0;_abortController=null;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}_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."),this.abort(),this._abortController=new AbortController;const{signal:s}=this._abortController;this._setLoading(!0),this._error=null;const{method:r="GET",headers:n={},body:a=null,contentType:o=null,forceText:i=!1}=e;try{o&&!n["Content-Type"]&&(n["Content-Type"]=o);const e={method:r,headers:n,signal:s};"GET"!==r&&"HEAD"!==r&&null!==a&&(e.body=a);const l=await globalThis.fetch(t,e);if(this._status=l.status,!l.ok){const t=await l.text().catch(()=>""),e={status:l.status,statusText:l.statusText,body:t};return this._setError(e),this._setLoading(!1),null}if(i){const t=await l.text();this._setResponse(t,l.status)}else{if((l.headers.get("Content-Type")||"").includes("application/json")){const t=await l.json();this._setResponse(t,l.status)}else{const t=await l.text();this._setResponse(t,l.status)}}return this._setLoading(!1),this._value}catch(t){return"AbortError"===t.name?(this._setLoading(!1),null):(this._setError(t),this._setLoading(!1),null)}finally{this._abortController=null}}}class r extends HTMLElement{static wcBindable={...s.wcBindable,properties:[...s.wcBindable.properties,{name:"trigger",event:"wcs-fetch:trigger-changed"}]};static get observedAttributes(){return["url"]}_core;_body=null;_trigger=!1;constructor(){super(),this._core=new s(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 manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get body(){return this._body}set body(t){this._body=t}get trigger(){return this._trigger}set trigger(t){!!t&&(this._trigger=!0,this.fetch().finally(()=>{this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-fetch:trigger-changed",{detail:!1,bubbles:!0}))}))}_collectHeaders(){const t={},s=this.querySelectorAll(e.tagNames.fetchHeader);for(const e of s){const s=e.headerName,r=e.headerValue;s&&(t[s]=r)}return t}_collectBody(){if(null!==this._body)return{body:"string"==typeof this._body?this._body:JSON.stringify(this._body),contentType:"string"==typeof this._body?null:"application/json"};const t=this.querySelector(e.tagNames.fetchBody);return t?{body:t.bodyContent||null,contentType:t.contentType}:{body:null,contentType:null}}abort(){this._core.abort()}async fetch(){const t=this._collectHeaders(),{body:e,contentType:s}=this._collectBody(),r=await this._core.fetch(this.url,{method:this.method,headers:t,body:e,contentType:s,forceText:!!this.target});if(this.target&&null!==r){const t=document.getElementById(this.target);t&&(t.innerHTML=r)}return this._body=null,r}attributeChangedCallback(t,e,s){"url"===t&&this.isConnected&&!this.manual&&s&&this.fetch()}connectedCallback(){this.style.display="none",!this.manual&&this.url&&this.fetch()}disconnectedCallback(){this.abort()}}class n extends HTMLElement{connectedCallback(){this.style.display="none"}get headerName(){return this.getAttribute("name")||""}get headerValue(){return this.getAttribute("value")||""}}class a extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}get contentType(){return this.getAttribute("type")||"application/json"}get bodyContent(){return this.textContent?.trim()||""}}let o=!1;function i(t){const s=t.target;if(!(s instanceof Element))return;const n=s.closest(`[${e.triggerAttribute}]`);if(!n)return;const a=n.getAttribute(e.triggerAttribute);if(!a)return;const o=document.getElementById(a);o&&o instanceof r&&(t.preventDefault(),o.fetch())}function l(s){var l;s&&("boolean"==typeof(l=s).autoTrigger&&(t.autoTrigger=l.autoTrigger),"string"==typeof l.triggerAttribute&&(t.triggerAttribute=l.triggerAttribute),l.tagNames&&Object.assign(t.tagNames,l.tagNames)),customElements.get(e.tagNames.fetch)||customElements.define(e.tagNames.fetch,r),customElements.get(e.tagNames.fetchHeader)||customElements.define(e.tagNames.fetchHeader,n),customElements.get(e.tagNames.fetchBody)||customElements.define(e.tagNames.fetchBody,a),e.autoTrigger&&(o||(o=!0,document.addEventListener("click",i)))}export{s as FetchCore,l as bootstrapFetch};
1
+ const t={autoTrigger:!0,triggerAttribute:"data-fetchtarget",tagNames:{fetch:"wcs-fetch",fetchHeader:"wcs-fetch-header",fetchBody:"wcs-fetch-body"}};function e(t){if(null===t||"object"!=typeof t)return t;Object.freeze(t);for(const r of Object.keys(t))e(t[r]);return t}function r(t){if(null===t||"object"!=typeof t)return t;const e={};for(const s of Object.keys(t))e[s]=r(t[s]);return e}let s=null;const n=t;function o(){return s||(s=e(r(t))),s}class i extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"value",event:"wcs-fetch:response",getter:t=>t.detail.value},{name:"loading",event:"wcs-fetch:loading-changed"},{name:"error",event:"wcs-fetch:error"},{name:"status",event:"wcs-fetch:response",getter:t=>t.detail.status}]};_target;_value=null;_loading=!1;_error=null;_status=0;_abortController=null;_promise=Promise.resolve(null);constructor(t){super(),this._target=t??this}get value(){return this._value}get loading(){return this._loading}get error(){return this._error}get status(){return this._status}get promise(){return this._promise}_setLoading(t){this._loading=t,this._target.dispatchEvent(new CustomEvent("wcs-fetch:loading-changed",{detail:t,bubbles:!0}))}_setError(t){this._error=t,this._target.dispatchEvent(new CustomEvent("wcs-fetch:error",{detail:t,bubbles:!0}))}_setResponse(t,e){this._value=t,this._status=e,this._target.dispatchEvent(new CustomEvent("wcs-fetch:response",{detail:{value:t,status:e},bubbles:!0}))}abort(){this._abortController&&(this._abortController.abort(),this._abortController=null)}async fetch(t,e={}){t||function(t){throw new Error(`[@wcstack/fetch] ${t}`)}("url attribute is required.");const r=this._doFetch(t,e);return this._promise=r,r}async _doFetch(t,e){this.abort(),this._abortController=new AbortController;const{signal:r}=this._abortController;this._setLoading(!0),this._error=null;const{method:s="GET",headers:n={},body:o=null,contentType:i=null,forceText:a=!1}=e;try{i&&!n["Content-Type"]&&(n["Content-Type"]=i);const e={method:s,headers:n,signal:r};"GET"!==s&&"HEAD"!==s&&null!==o&&(e.body=o);const l=await globalThis.fetch(t,e);if(this._status=l.status,!l.ok){const t=await l.text().catch(()=>""),e={status:l.status,statusText:l.statusText,body:t};return this._setError(e),this._setLoading(!1),null}if(a){const t=await l.text();this._setResponse(t,l.status)}else{if((l.headers.get("Content-Type")||"").includes("application/json")){const t=await l.json();this._setResponse(t,l.status)}else{const t=await l.text();this._setResponse(t,l.status)}}return this._setLoading(!1),this._value}catch(t){return"AbortError"===t.name?(this._setLoading(!1),null):(this._setError(t),this._setLoading(!1),null)}finally{this._abortController=null}}}class a extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...i.wcBindable,properties:[...i.wcBindable.properties,{name:"trigger",event:"wcs-fetch:trigger-changed"}]};static get observedAttributes(){return["url"]}_core;_body=null;_trigger=!1;_connectedCallbackPromise=Promise.resolve();constructor(){super(),this._core=new i(this)}get url(){return this.getAttribute("url")||""}set url(t){this.setAttribute("url",t)}get method(){return(this.getAttribute("method")||"GET").toUpperCase()}set method(t){this.setAttribute("method",t)}get target(){return this.getAttribute("target")}set target(t){null===t?this.removeAttribute("target"):this.setAttribute("target",t)}get value(){return this._core.value}get loading(){return this._core.loading}get error(){return this._core.error}get status(){return this._core.status}get promise(){return this._core.promise}get connectedCallbackPromise(){return this._connectedCallbackPromise}get manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get body(){return this._body}set body(t){this._body=t}get trigger(){return this._trigger}set trigger(t){!!t&&(this._trigger=!0,this.fetch().finally(()=>{this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-fetch:trigger-changed",{detail:!1,bubbles:!0}))}))}_collectHeaders(){const t={},e=this.querySelectorAll(n.tagNames.fetchHeader);for(const r of e){const e=r.headerName,s=r.headerValue;e&&(t[e]=s)}return t}_collectBody(){if(null!==this._body)return{body:"string"==typeof this._body?this._body:JSON.stringify(this._body),contentType:"string"==typeof this._body?null:"application/json"};const t=this.querySelector(n.tagNames.fetchBody);return t?{body:t.bodyContent||null,contentType:t.contentType}:{body:null,contentType:null}}abort(){this._core.abort()}async fetch(){const t=this._collectHeaders(),{body:e,contentType:r}=this._collectBody(),s=await this._core.fetch(this.url,{method:this.method,headers:t,body:e,contentType:r,forceText:!!this.target});if(this.target&&null!==s){const t=document.getElementById(this.target);t&&(t.innerHTML=s)}return this._body=null,s}attributeChangedCallback(t,e,r){"url"===t&&this.isConnected&&!this.manual&&r&&this.fetch()}connectedCallback(){this.style.display="none",!this.manual&&this.url&&(this._connectedCallbackPromise=this.fetch().then(()=>{}))}disconnectedCallback(){this.abort()}}class l extends HTMLElement{connectedCallback(){this.style.display="none"}get headerName(){return this.getAttribute("name")||""}get headerValue(){return this.getAttribute("value")||""}}class c extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}get contentType(){return this.getAttribute("type")||"application/json"}get bodyContent(){return this.textContent?.trim()||""}}let u=!1;function h(t){const e=t.target;if(!(e instanceof Element))return;const r=e.closest(`[${n.triggerAttribute}]`);if(!r)return;const s=r.getAttribute(n.triggerAttribute);if(!s)return;const o=document.getElementById(s);o&&o instanceof a&&(t.preventDefault(),o.fetch())}function g(e){var r;e&&("boolean"==typeof(r=e).autoTrigger&&(t.autoTrigger=r.autoTrigger),"string"==typeof r.triggerAttribute&&(t.triggerAttribute=r.triggerAttribute),r.tagNames&&Object.assign(t.tagNames,r.tagNames),s=null),customElements.get(n.tagNames.fetch)||customElements.define(n.tagNames.fetch,a),customElements.get(n.tagNames.fetchHeader)||customElements.define(n.tagNames.fetchHeader,l),customElements.get(n.tagNames.fetchBody)||customElements.define(n.tagNames.fetchBody,c),n.autoTrigger&&(u||(u=!0,document.addEventListener("click",h)))}export{i as FetchCore,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/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/autoTrigger.ts","../src/bootstrapFetch.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\r\n\r\ninterface IInternalConfig extends IConfig {\r\n autoTrigger: boolean;\r\n triggerAttribute: string;\r\n tagNames: {\r\n fetch: string;\r\n fetchHeader: string;\r\n fetchBody: string;\r\n };\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n autoTrigger: true,\r\n triggerAttribute: \"data-fetchtarget\",\r\n tagNames: {\r\n fetch: \"wcs-fetch\",\r\n fetchHeader: \"wcs-fetch-header\",\r\n fetchBody: \"wcs-fetch-body\",\r\n },\r\n};\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n deepFreeze((obj as Record<string, unknown>)[key]);\r\n }\r\n return obj;\r\n}\r\n\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n const clone: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n return clone as T;\r\n}\r\n\r\nlet frozenConfig: IConfig | null = null;\r\n\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n if (!frozenConfig) {\r\n frozenConfig = deepFreeze(deepClone(_config));\r\n }\r\n return frozenConfig;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (typeof partialConfig.autoTrigger === \"boolean\") {\r\n _config.autoTrigger = partialConfig.autoTrigger;\r\n }\r\n if (typeof partialConfig.triggerAttribute === \"string\") {\r\n _config.triggerAttribute = partialConfig.triggerAttribute;\r\n }\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n frozenConfig = null;\r\n}\r\n","import { raiseError } from \"../raiseError.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\n\r\nexport interface FetchRequestOptions {\r\n method?: string;\r\n headers?: Record<string, string>;\r\n body?: BodyInit | null;\r\n contentType?: string | null;\r\n forceText?: boolean;\r\n}\r\n\r\nexport class FetchCore extends EventTarget {\r\n static wcBindable: IWcBindable = {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties: [\r\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\r\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\r\n { name: \"error\", event: \"wcs-fetch:error\" },\r\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\r\n ],\r\n };\r\n\r\n private _target: EventTarget;\r\n private _value: any = null;\r\n private _loading: boolean = false;\r\n private _error: any = null;\r\n private _status: number = 0;\r\n private _abortController: AbortController | null = null;\r\n\r\n constructor(target?: EventTarget) {\r\n super();\r\n this._target = target ?? this;\r\n }\r\n\r\n get value(): any {\r\n return this._value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._loading;\r\n }\r\n\r\n get error(): any {\r\n return this._error;\r\n }\r\n\r\n get status(): number {\r\n return this._status;\r\n }\r\n\r\n private _setLoading(loading: boolean): void {\r\n this._loading = loading;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\r\n detail: loading,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setError(error: any): void {\r\n this._error = error;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\r\n detail: error,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setResponse(value: any, status: number): void {\r\n this._value = value;\r\n this._status = status;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\r\n detail: { value, status },\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n abort(): void {\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n this._abortController = null;\r\n }\r\n }\r\n\r\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\r\n if (!url) {\r\n raiseError(\"url attribute is required.\");\r\n }\r\n\r\n // 進行中のリクエストをキャンセル\r\n this.abort();\r\n\r\n this._abortController = new AbortController();\r\n const { signal } = this._abortController;\r\n\r\n this._setLoading(true);\r\n this._error = null;\r\n\r\n const {\r\n method = \"GET\",\r\n headers = {},\r\n body = null,\r\n contentType = null,\r\n forceText = false,\r\n } = options;\r\n\r\n try {\r\n if (contentType && !headers[\"Content-Type\"]) {\r\n headers[\"Content-Type\"] = contentType;\r\n }\r\n\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n signal,\r\n };\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\r\n requestInit.body = body;\r\n }\r\n\r\n const response = await globalThis.fetch(url, requestInit);\r\n this._status = response.status;\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.text().catch(() => \"\");\r\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\r\n this._setError(error);\r\n this._setLoading(false);\r\n return null;\r\n }\r\n\r\n if (forceText) {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n } else {\r\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\r\n if (responseContentType.includes(\"application/json\")) {\r\n const data = await response.json();\r\n this._setResponse(data, response.status);\r\n } else {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n }\r\n }\r\n\r\n this._setLoading(false);\r\n return this._value;\r\n } catch (e: any) {\r\n if (e.name === \"AbortError\") {\r\n this._setLoading(false);\r\n return null;\r\n }\r\n this._setError(e);\r\n this._setLoading(false);\r\n return null;\r\n } finally {\r\n this._abortController = null;\r\n }\r\n }\r\n}\r\n","export function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/fetch] ${message}`);\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\nimport { FetchCore } from \"../core/FetchCore.js\";\r\nimport { FetchHeader } from \"./FetchHeader.js\";\r\nimport { FetchBody } from \"./FetchBody.js\";\r\n\r\nexport class Fetch extends HTMLElement {\r\n static wcBindable: IWcBindable = {\r\n ...FetchCore.wcBindable,\r\n properties: [\r\n ...FetchCore.wcBindable.properties,\r\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\r\n ],\r\n };\r\n static get observedAttributes(): string[] { return [\"url\"]; }\r\n\r\n private _core: FetchCore;\r\n private _body: any = null;\r\n private _trigger: boolean = false;\r\n\r\n constructor() {\r\n super();\r\n this._core = new FetchCore(this);\r\n }\r\n\r\n get url(): string {\r\n return this.getAttribute(\"url\") || \"\";\r\n }\r\n\r\n set url(value: string) {\r\n this.setAttribute(\"url\", value);\r\n }\r\n\r\n get method(): string {\r\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\r\n }\r\n\r\n set method(value: string) {\r\n this.setAttribute(\"method\", value);\r\n }\r\n\r\n get target(): string | null {\r\n return this.getAttribute(\"target\");\r\n }\r\n\r\n set target(value: string | null) {\r\n if (value === null) {\r\n this.removeAttribute(\"target\");\r\n } else {\r\n this.setAttribute(\"target\", value);\r\n }\r\n }\r\n\r\n get value(): any {\r\n return this._core.value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._core.loading;\r\n }\r\n\r\n get error(): any {\r\n return this._core.error;\r\n }\r\n\r\n get status(): number {\r\n return this._core.status;\r\n }\r\n\r\n get manual(): boolean {\r\n return this.hasAttribute(\"manual\");\r\n }\r\n\r\n set manual(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"manual\", \"\");\r\n } else {\r\n this.removeAttribute(\"manual\");\r\n }\r\n }\r\n\r\n get body(): any {\r\n return this._body;\r\n }\r\n\r\n set body(value: any) {\r\n this._body = value;\r\n }\r\n\r\n get trigger(): boolean {\r\n return this._trigger;\r\n }\r\n\r\n set trigger(value: boolean) {\r\n const v = !!value;\r\n if (v) {\r\n this._trigger = true;\r\n this.fetch().finally(() => {\r\n this._trigger = false;\r\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\r\n detail: false,\r\n bubbles: true,\r\n }));\r\n });\r\n }\r\n }\r\n\r\n private _collectHeaders(): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\r\n for (const el of headerElements) {\r\n const name = el.headerName;\r\n const value = el.headerValue;\r\n if (name) {\r\n headers[name] = value;\r\n }\r\n }\r\n return headers;\r\n }\r\n\r\n private _collectBody(): { body: BodyInit | null; contentType: string | null } {\r\n // JS API経由のbodyが優先\r\n if (this._body !== null) {\r\n return {\r\n body: typeof this._body === \"string\" ? this._body : JSON.stringify(this._body),\r\n contentType: typeof this._body === \"string\" ? null : \"application/json\",\r\n };\r\n }\r\n\r\n // サブタグからbodyを取得\r\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\r\n if (bodyElement) {\r\n return {\r\n body: bodyElement.bodyContent || null,\r\n contentType: bodyElement.contentType,\r\n };\r\n }\r\n\r\n return { body: null, contentType: null };\r\n }\r\n\r\n abort(): void {\r\n this._core.abort();\r\n }\r\n\r\n async fetch(): Promise<any> {\r\n const headers = this._collectHeaders();\r\n const { body, contentType } = this._collectBody();\r\n\r\n const result = await this._core.fetch(this.url, {\r\n method: this.method,\r\n headers,\r\n body,\r\n contentType,\r\n forceText: !!this.target,\r\n });\r\n\r\n // HTML置換モード\r\n if (this.target && result !== null) {\r\n const targetElement = document.getElementById(this.target);\r\n if (targetElement) {\r\n targetElement.innerHTML = result;\r\n }\r\n }\r\n\r\n // bodyをリセット(一回限りの使用)\r\n this._body = null;\r\n\r\n return result;\r\n }\r\n\r\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\r\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\r\n this.fetch();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n if (!this.manual && this.url) {\r\n this.fetch();\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.abort();\r\n }\r\n}\r\n","export class FetchHeader extends HTMLElement {\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n }\r\n\r\n get headerName(): string {\r\n return this.getAttribute(\"name\") || \"\";\r\n }\r\n\r\n get headerValue(): string {\r\n return this.getAttribute(\"value\") || \"\";\r\n }\r\n}\r\n","export class FetchBody extends HTMLElement {\r\n constructor() {\r\n super();\r\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\r\n this.attachShadow({ mode: \"open\" });\r\n }\r\n\r\n get contentType(): string {\r\n return this.getAttribute(\"type\") || \"application/json\";\r\n }\r\n\r\n get bodyContent(): string {\r\n return this.textContent?.trim() || \"\";\r\n }\r\n}\r\n","import { config } from \"./config.js\";\r\nimport { Fetch } from \"./components/Fetch.js\";\r\n\r\nlet registered = false;\r\n\r\nfunction handleClick(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof Element)) return;\r\n\r\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\r\n if (!triggerElement) return;\r\n\r\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\r\n if (!fetchId) return;\r\n\r\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\r\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\r\n\r\n event.preventDefault();\r\n fetchElement.fetch();\r\n}\r\n\r\nexport function registerAutoTrigger(): void {\r\n if (registered) return;\r\n registered = true;\r\n document.addEventListener(\"click\", handleClick);\r\n}\r\n\r\nexport function unregisterAutoTrigger(): void {\r\n if (!registered) return;\r\n registered = false;\r\n document.removeEventListener(\"click\", handleClick);\r\n}\r\n","import { setConfig } from \"./config.js\";\r\nimport { config } from \"./config.js\";\r\nimport { registerComponents } from \"./registerComponents.js\";\r\nimport { registerAutoTrigger } from \"./autoTrigger.js\";\r\nimport { IWritableConfig } from \"./types.js\";\r\n\r\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\r\n if (userConfig) {\r\n setConfig(userConfig);\r\n }\r\n registerComponents();\r\n if (config.autoTrigger) {\r\n registerAutoTrigger();\r\n }\r\n}\r\n","import { Fetch } from \"./components/Fetch.js\";\r\nimport { FetchHeader } from \"./components/FetchHeader.js\";\r\nimport { FetchBody } from \"./components/FetchBody.js\";\r\nimport { config } from \"./config.js\";\r\n\r\nexport function registerComponents(): void {\r\n if (!customElements.get(config.tagNames.fetch)) {\r\n customElements.define(config.tagNames.fetch, Fetch);\r\n }\r\n if (!customElements.get(config.tagNames.fetchHeader)) {\r\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\r\n }\r\n if (!customElements.get(config.tagNames.fetchBody)) {\r\n customElements.define(config.tagNames.fetchBody, FetchBody);\r\n }\r\n}\r\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","fetch","fetchHeader","fetchBody","config","FetchCore","EventTarget","static","protocol","version","properties","name","event","getter","e","detail","value","status","_target","_value","_loading","_error","_status","_abortController","constructor","target","super","this","loading","error","_setLoading","dispatchEvent","CustomEvent","bubbles","_setError","_setResponse","abort","url","options","message","Error","raiseError","AbortController","signal","method","headers","body","contentType","forceText","requestInit","response","globalThis","ok","errorBody","text","catch","statusText","get","includes","data","json","Fetch","HTMLElement","wcBindable","observedAttributes","_core","_body","_trigger","getAttribute","setAttribute","toUpperCase","removeAttribute","manual","hasAttribute","trigger","finally","_collectHeaders","headerElements","querySelectorAll","el","headerName","headerValue","_collectBody","JSON","stringify","bodyElement","querySelector","bodyContent","result","targetElement","document","getElementById","innerHTML","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","disconnectedCallback","FetchHeader","FetchBody","attachShadow","mode","textContent","trim","registered","handleClick","Element","triggerElement","closest","fetchId","fetchElement","preventDefault","bootstrapFetch","userConfig","partialConfig","Object","assign","customElements","define","addEventListener"],"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/components/Fetch.ts","../src/components/FetchHeader.ts","../src/components/FetchBody.ts","../src/autoTrigger.ts","../src/bootstrapFetch.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\r\n\r\ninterface IInternalConfig extends IConfig {\r\n autoTrigger: boolean;\r\n triggerAttribute: string;\r\n tagNames: {\r\n fetch: string;\r\n fetchHeader: string;\r\n fetchBody: string;\r\n };\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n autoTrigger: true,\r\n triggerAttribute: \"data-fetchtarget\",\r\n tagNames: {\r\n fetch: \"wcs-fetch\",\r\n fetchHeader: \"wcs-fetch-header\",\r\n fetchBody: \"wcs-fetch-body\",\r\n },\r\n};\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n deepFreeze((obj as Record<string, unknown>)[key]);\r\n }\r\n return obj;\r\n}\r\n\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n const clone: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n return clone as T;\r\n}\r\n\r\nlet frozenConfig: IConfig | null = null;\r\n\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n if (!frozenConfig) {\r\n frozenConfig = deepFreeze(deepClone(_config));\r\n }\r\n return frozenConfig;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (typeof partialConfig.autoTrigger === \"boolean\") {\r\n _config.autoTrigger = partialConfig.autoTrigger;\r\n }\r\n if (typeof partialConfig.triggerAttribute === \"string\") {\r\n _config.triggerAttribute = partialConfig.triggerAttribute;\r\n }\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n frozenConfig = null;\r\n}\r\n","import { raiseError } from \"../raiseError.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\n\r\nexport interface FetchRequestOptions {\r\n method?: string;\r\n headers?: Record<string, string>;\r\n body?: BodyInit | null;\r\n contentType?: string | null;\r\n forceText?: boolean;\r\n}\r\n\r\nexport class FetchCore extends EventTarget {\r\n static wcBindable: IWcBindable = {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties: [\r\n { name: \"value\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.value },\r\n { name: \"loading\", event: \"wcs-fetch:loading-changed\" },\r\n { name: \"error\", event: \"wcs-fetch:error\" },\r\n { name: \"status\", event: \"wcs-fetch:response\", getter: (e: Event) => (e as CustomEvent).detail.status },\r\n ],\r\n };\r\n\r\n private _target: EventTarget;\r\n private _value: any = null;\r\n private _loading: boolean = false;\r\n private _error: any = null;\r\n private _status: number = 0;\r\n private _abortController: AbortController | null = null;\r\n private _promise: Promise<any> = Promise.resolve(null);\r\n\r\n constructor(target?: EventTarget) {\r\n super();\r\n this._target = target ?? this;\r\n }\r\n\r\n get value(): any {\r\n return this._value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._loading;\r\n }\r\n\r\n get error(): any {\r\n return this._error;\r\n }\r\n\r\n get status(): number {\r\n return this._status;\r\n }\r\n\r\n get promise(): Promise<any> {\r\n return this._promise;\r\n }\r\n\r\n private _setLoading(loading: boolean): void {\r\n this._loading = loading;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:loading-changed\", {\r\n detail: loading,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setError(error: any): void {\r\n this._error = error;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:error\", {\r\n detail: error,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setResponse(value: any, status: number): void {\r\n this._value = value;\r\n this._status = status;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-fetch:response\", {\r\n detail: { value, status },\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n abort(): void {\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n this._abortController = null;\r\n }\r\n }\r\n\r\n async fetch(url: string, options: FetchRequestOptions = {}): Promise<any> {\r\n if (!url) {\r\n raiseError(\"url attribute is required.\");\r\n }\r\n\r\n const p = this._doFetch(url, options);\r\n this._promise = p;\r\n return p;\r\n }\r\n\r\n private async _doFetch(url: string, options: FetchRequestOptions): Promise<any> {\r\n // 進行中のリクエストをキャンセル\r\n this.abort();\r\n\r\n this._abortController = new AbortController();\r\n const { signal } = this._abortController;\r\n\r\n this._setLoading(true);\r\n this._error = null;\r\n\r\n const {\r\n method = \"GET\",\r\n headers = {},\r\n body = null,\r\n contentType = null,\r\n forceText = false,\r\n } = options;\r\n\r\n try {\r\n if (contentType && !headers[\"Content-Type\"]) {\r\n headers[\"Content-Type\"] = contentType;\r\n }\r\n\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n signal,\r\n };\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && body !== null) {\r\n requestInit.body = body;\r\n }\r\n\r\n const response = await globalThis.fetch(url, requestInit);\r\n this._status = response.status;\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.text().catch(() => \"\");\r\n const error = { status: response.status, statusText: response.statusText, body: errorBody };\r\n this._setError(error);\r\n this._setLoading(false);\r\n return null;\r\n }\r\n\r\n if (forceText) {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n } else {\r\n const responseContentType = response.headers.get(\"Content-Type\") || \"\";\r\n if (responseContentType.includes(\"application/json\")) {\r\n const data = await response.json();\r\n this._setResponse(data, response.status);\r\n } else {\r\n const text = await response.text();\r\n this._setResponse(text, response.status);\r\n }\r\n }\r\n\r\n this._setLoading(false);\r\n return this._value;\r\n } catch (e: any) {\r\n if (e.name === \"AbortError\") {\r\n this._setLoading(false);\r\n return null;\r\n }\r\n this._setError(e);\r\n this._setLoading(false);\r\n return null;\r\n } finally {\r\n this._abortController = null;\r\n }\r\n }\r\n}\r\n","export function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/fetch] ${message}`);\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\nimport { FetchCore } from \"../core/FetchCore.js\";\r\nimport { FetchHeader } from \"./FetchHeader.js\";\r\nimport { FetchBody } from \"./FetchBody.js\";\r\n\r\nexport class Fetch extends HTMLElement {\r\n static hasConnectedCallbackPromise = true;\r\n static wcBindable: IWcBindable = {\r\n ...FetchCore.wcBindable,\r\n properties: [\r\n ...FetchCore.wcBindable.properties,\r\n { name: \"trigger\", event: \"wcs-fetch:trigger-changed\" },\r\n ],\r\n };\r\n static get observedAttributes(): string[] { return [\"url\"]; }\r\n\r\n private _core: FetchCore;\r\n private _body: any = null;\r\n private _trigger: boolean = false;\r\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\r\n\r\n constructor() {\r\n super();\r\n this._core = new FetchCore(this);\r\n }\r\n\r\n get url(): string {\r\n return this.getAttribute(\"url\") || \"\";\r\n }\r\n\r\n set url(value: string) {\r\n this.setAttribute(\"url\", value);\r\n }\r\n\r\n get method(): string {\r\n return (this.getAttribute(\"method\") || \"GET\").toUpperCase();\r\n }\r\n\r\n set method(value: string) {\r\n this.setAttribute(\"method\", value);\r\n }\r\n\r\n get target(): string | null {\r\n return this.getAttribute(\"target\");\r\n }\r\n\r\n set target(value: string | null) {\r\n if (value === null) {\r\n this.removeAttribute(\"target\");\r\n } else {\r\n this.setAttribute(\"target\", value);\r\n }\r\n }\r\n\r\n get value(): any {\r\n return this._core.value;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._core.loading;\r\n }\r\n\r\n get error(): any {\r\n return this._core.error;\r\n }\r\n\r\n get status(): number {\r\n return this._core.status;\r\n }\r\n\r\n get promise(): Promise<any> {\r\n return this._core.promise;\r\n }\r\n\r\n get connectedCallbackPromise(): Promise<void> {\r\n return this._connectedCallbackPromise;\r\n }\r\n\r\n get manual(): boolean {\r\n return this.hasAttribute(\"manual\");\r\n }\r\n\r\n set manual(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"manual\", \"\");\r\n } else {\r\n this.removeAttribute(\"manual\");\r\n }\r\n }\r\n\r\n get body(): any {\r\n return this._body;\r\n }\r\n\r\n set body(value: any) {\r\n this._body = value;\r\n }\r\n\r\n get trigger(): boolean {\r\n return this._trigger;\r\n }\r\n\r\n set trigger(value: boolean) {\r\n const v = !!value;\r\n if (v) {\r\n this._trigger = true;\r\n this.fetch().finally(() => {\r\n this._trigger = false;\r\n this.dispatchEvent(new CustomEvent(\"wcs-fetch:trigger-changed\", {\r\n detail: false,\r\n bubbles: true,\r\n }));\r\n });\r\n }\r\n }\r\n\r\n private _collectHeaders(): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n const headerElements = this.querySelectorAll<FetchHeader>(config.tagNames.fetchHeader);\r\n for (const el of headerElements) {\r\n const name = el.headerName;\r\n const value = el.headerValue;\r\n if (name) {\r\n headers[name] = value;\r\n }\r\n }\r\n return headers;\r\n }\r\n\r\n private _collectBody(): { body: BodyInit | null; contentType: string | null } {\r\n // JS API経由のbodyが優先\r\n if (this._body !== null) {\r\n return {\r\n body: typeof this._body === \"string\" ? this._body : JSON.stringify(this._body),\r\n contentType: typeof this._body === \"string\" ? null : \"application/json\",\r\n };\r\n }\r\n\r\n // サブタグからbodyを取得\r\n const bodyElement = this.querySelector<FetchBody>(config.tagNames.fetchBody);\r\n if (bodyElement) {\r\n return {\r\n body: bodyElement.bodyContent || null,\r\n contentType: bodyElement.contentType,\r\n };\r\n }\r\n\r\n return { body: null, contentType: null };\r\n }\r\n\r\n abort(): void {\r\n this._core.abort();\r\n }\r\n\r\n async fetch(): Promise<any> {\r\n const headers = this._collectHeaders();\r\n const { body, contentType } = this._collectBody();\r\n\r\n const result = await this._core.fetch(this.url, {\r\n method: this.method,\r\n headers,\r\n body,\r\n contentType,\r\n forceText: !!this.target,\r\n });\r\n\r\n // HTML置換モード\r\n if (this.target && result !== null) {\r\n const targetElement = document.getElementById(this.target);\r\n if (targetElement) {\r\n targetElement.innerHTML = result;\r\n }\r\n }\r\n\r\n // bodyをリセット(一回限りの使用)\r\n this._body = null;\r\n\r\n return result;\r\n }\r\n\r\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\r\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\r\n this.fetch();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n if (!this.manual && this.url) {\r\n this._connectedCallbackPromise = this.fetch().then(() => {});\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.abort();\r\n }\r\n}\r\n","export class FetchHeader extends HTMLElement {\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n }\r\n\r\n get headerName(): string {\r\n return this.getAttribute(\"name\") || \"\";\r\n }\r\n\r\n get headerValue(): string {\r\n return this.getAttribute(\"value\") || \"\";\r\n }\r\n}\r\n","export class FetchBody extends HTMLElement {\r\n constructor() {\r\n super();\r\n // スロットなしのShadow DOMでlight DOM(bodyテキスト)の描画を抑制\r\n this.attachShadow({ mode: \"open\" });\r\n }\r\n\r\n get contentType(): string {\r\n return this.getAttribute(\"type\") || \"application/json\";\r\n }\r\n\r\n get bodyContent(): string {\r\n return this.textContent?.trim() || \"\";\r\n }\r\n}\r\n","import { config } from \"./config.js\";\r\nimport { Fetch } from \"./components/Fetch.js\";\r\n\r\nlet registered = false;\r\n\r\nfunction handleClick(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof Element)) return;\r\n\r\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\r\n if (!triggerElement) return;\r\n\r\n const fetchId = triggerElement.getAttribute(config.triggerAttribute);\r\n if (!fetchId) return;\r\n\r\n const fetchElement = document.getElementById(fetchId) as Fetch | null;\r\n if (!fetchElement || !(fetchElement instanceof Fetch)) return;\r\n\r\n event.preventDefault();\r\n fetchElement.fetch();\r\n}\r\n\r\nexport function registerAutoTrigger(): void {\r\n if (registered) return;\r\n registered = true;\r\n document.addEventListener(\"click\", handleClick);\r\n}\r\n\r\nexport function unregisterAutoTrigger(): void {\r\n if (!registered) return;\r\n registered = false;\r\n document.removeEventListener(\"click\", handleClick);\r\n}\r\n","import { setConfig } from \"./config.js\";\r\nimport { config } from \"./config.js\";\r\nimport { registerComponents } from \"./registerComponents.js\";\r\nimport { registerAutoTrigger } from \"./autoTrigger.js\";\r\nimport { IWritableConfig } from \"./types.js\";\r\n\r\nexport function bootstrapFetch(userConfig?: IWritableConfig): void {\r\n if (userConfig) {\r\n setConfig(userConfig);\r\n }\r\n registerComponents();\r\n if (config.autoTrigger) {\r\n registerAutoTrigger();\r\n }\r\n}\r\n","import { Fetch } from \"./components/Fetch.js\";\r\nimport { FetchHeader } from \"./components/FetchHeader.js\";\r\nimport { FetchBody } from \"./components/FetchBody.js\";\r\nimport { config } from \"./config.js\";\r\n\r\nexport function registerComponents(): void {\r\n if (!customElements.get(config.tagNames.fetch)) {\r\n customElements.define(config.tagNames.fetch, Fetch);\r\n }\r\n if (!customElements.get(config.tagNames.fetchHeader)) {\r\n customElements.define(config.tagNames.fetchHeader, FetchHeader);\r\n }\r\n if (!customElements.get(config.tagNames.fetchBody)) {\r\n customElements.define(config.tagNames.fetchBody, FetchBody);\r\n }\r\n}\r\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","Fetch","HTMLElement","wcBindable","observedAttributes","_core","_body","_trigger","_connectedCallbackPromise","getAttribute","setAttribute","toUpperCase","removeAttribute","connectedCallbackPromise","manual","hasAttribute","trigger","finally","_collectHeaders","headerElements","querySelectorAll","el","headerName","headerValue","_collectBody","JSON","stringify","bodyElement","querySelector","bodyContent","result","targetElement","document","getElementById","innerHTML","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","then","disconnectedCallback","FetchHeader","FetchBody","attachShadow","mode","textContent","trim","registered","handleClick","Element","triggerElement","closest","fetchId","fetchElement","preventDefault","bootstrapFetch","userConfig","partialConfig","assign","customElements","define","addEventListener"],"mappings":"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"}
package/package.json CHANGED
@@ -1,71 +1,71 @@
1
- {
2
- "name": "@wcstack/fetch",
3
- "version": "1.4.0",
4
- "description": "Declarative fetch component for Web Components. Framework-agnostic async data fetching via wc-bindable-protocol.",
5
- "type": "module",
6
- "main": "./dist/index.esm.js",
7
- "module": "./dist/index.esm.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.esm.js"
13
- },
14
- "./auto": "./dist/auto.min.js"
15
- },
16
- "files": [
17
- "dist"
18
- ],
19
- "scripts": {
20
- "clean": "rimraf dist .tsc-out",
21
- "build": "rimraf dist .tsc-out && tsc && rollup -c",
22
- "test": "vitest run",
23
- "test:watch": "vitest",
24
- "test:coverage": "vitest run --coverage",
25
- "lint": "eslint src",
26
- "version:patch": "npm version patch",
27
- "version:minor": "npm version minor",
28
- "version:major": "npm version major",
29
- "prepublishOnly": "npm run build && npm run test:coverage"
30
- },
31
- "keywords": [
32
- "web-components",
33
- "fetch",
34
- "custom-elements",
35
- "wc-bindable",
36
- "declarative",
37
- "htmx",
38
- "async",
39
- "zero-dependencies",
40
- "framework-agnostic"
41
- ],
42
- "author": "mogera551",
43
- "homepage": "https://wcstack.github.io",
44
- "repository": {
45
- "type": "git",
46
- "url": "https://github.com/wcstack/wcstack.git",
47
- "directory": "packages/fetch"
48
- },
49
- "bugs": {
50
- "url": "https://github.com/wcstack/wcstack/issues"
51
- },
52
- "license": "MIT",
53
- "devDependencies": {
54
- "@eslint/js": "^9.39.1",
55
- "@rollup/plugin-terser": "^0.4.4",
56
- "@rollup/plugin-typescript": "^11.1.6",
57
- "@vitest/coverage-v8": "^4.0.15",
58
- "@vitest/ui": "^4.0.15",
59
- "eslint": "^9.39.1",
60
- "globals": "^16.5.0",
61
- "happy-dom": "^20.0.11",
62
- "rimraf": "^6.0.1",
63
- "rollup": "^4.22.4",
64
- "rollup-plugin-dts": "^6.1.1",
65
- "rollup-plugin-copy": "^3.5.0",
66
- "tslib": "^2.8.1",
67
- "typescript": "^5.9.3",
68
- "typescript-eslint": "^8.49.0",
69
- "vitest": "^4.0.15"
70
- }
71
- }
1
+ {
2
+ "name": "@wcstack/fetch",
3
+ "version": "1.6.2",
4
+ "description": "Declarative fetch component for Web Components. Framework-agnostic async data fetching via wc-bindable-protocol.",
5
+ "type": "module",
6
+ "main": "./dist/index.esm.js",
7
+ "module": "./dist/index.esm.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.esm.js"
13
+ },
14
+ "./auto": "./dist/auto.min.js"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "clean": "rimraf dist .tsc-out",
21
+ "build": "rimraf dist .tsc-out && tsc && rollup -c",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:coverage": "vitest run --coverage",
25
+ "lint": "eslint src",
26
+ "version:patch": "npm version patch",
27
+ "version:minor": "npm version minor",
28
+ "version:major": "npm version major",
29
+ "prepublishOnly": "npm run build && npm run test:coverage"
30
+ },
31
+ "keywords": [
32
+ "web-components",
33
+ "fetch",
34
+ "custom-elements",
35
+ "wc-bindable",
36
+ "declarative",
37
+ "htmx",
38
+ "async",
39
+ "zero-dependencies",
40
+ "framework-agnostic"
41
+ ],
42
+ "author": "mogera551",
43
+ "homepage": "https://wcstack.github.io",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/wcstack/wcstack.git",
47
+ "directory": "packages/fetch"
48
+ },
49
+ "bugs": {
50
+ "url": "https://github.com/wcstack/wcstack/issues"
51
+ },
52
+ "license": "MIT",
53
+ "devDependencies": {
54
+ "@eslint/js": "^9.39.1",
55
+ "@rollup/plugin-terser": "^0.4.4",
56
+ "@rollup/plugin-typescript": "^11.1.6",
57
+ "@vitest/coverage-v8": "^4.0.15",
58
+ "@vitest/ui": "^4.0.15",
59
+ "eslint": "^9.39.1",
60
+ "globals": "^16.5.0",
61
+ "happy-dom": "^20.0.11",
62
+ "rimraf": "^6.0.1",
63
+ "rollup": "^4.22.4",
64
+ "rollup-plugin-dts": "^6.1.1",
65
+ "rollup-plugin-copy": "^3.5.0",
66
+ "tslib": "^2.8.1",
67
+ "typescript": "^5.9.3",
68
+ "typescript-eslint": "^8.49.0",
69
+ "vitest": "^4.0.15"
70
+ }
71
+ }