@wcstack/geolocation 1.20.0 → 1.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md CHANGED
@@ -111,6 +111,7 @@ npm install @wcstack/geolocation
111
111
  | `loading` | `wcs-geo:loading-changed` | 一発取得 `getCurrentPosition` のリクエスト中は `true`。 |
112
112
  | `error` | `wcs-geo:error` | 正規化された `{ code, message }`(`PERMISSION_DENIED=1`, `POSITION_UNAVAILABLE=2`, `TIMEOUT=3`)。 |
113
113
  | `permission` | `wcs-geo:permission-changed` | `"prompt"` / `"granted"` / `"denied"` / `"unsupported"`。Permissions API でライブ追跡。 |
114
+ | `errorInfo` | `wcs-geo:error-info-changed` | serializable な失敗 taxonomy(`WcsIoErrorInfo`)、または `null`。追加的で `error` から導出(`code` → `permission-denied` / `position-unavailable` / `timeout`、`recoverable` は `permission-denied` のみ `false`)。`error` の shape は不変。 |
114
115
 
115
116
  ## コマンド
116
117
 
package/README.md CHANGED
@@ -111,6 +111,7 @@ Add the `watch` attribute to stream fixes via `watchPosition` until the element
111
111
  | `loading` | `wcs-geo:loading-changed` | `true` during a one-shot `getCurrentPosition` request. |
112
112
  | `error` | `wcs-geo:error` | Normalized `{ code, message }` (`PERMISSION_DENIED=1`, `POSITION_UNAVAILABLE=2`, `TIMEOUT=3`). |
113
113
  | `permission` | `wcs-geo:permission-changed` | `"prompt"` / `"granted"` / `"denied"` / `"unsupported"`, tracked live via the Permissions API. |
114
+ | `errorInfo` | `wcs-geo:error-info-changed` | Serializable failure taxonomy (`WcsIoErrorInfo`), or `null`. Additive — derived from `error` (`code` → `permission-denied` / `position-unavailable` / `timeout`; `recoverable` is `false` only for `permission-denied`). The `error` shape is unchanged. |
114
115
 
115
116
  ## Commands
116
117
 
package/dist/index.d.ts CHANGED
@@ -1,3 +1,14 @@
1
+ /** operation error の phase(taxonomy)。 */
2
+ type WcsIoErrorPhase = "probe" | "start" | "execute" | "decode" | "commit" | "dispose";
3
+ /** serializable な error info(non-cloneable な cause とは分離。DevTools / remote へは info のみ)。 */
4
+ interface WcsIoErrorInfo {
5
+ readonly code: string;
6
+ readonly phase: WcsIoErrorPhase;
7
+ readonly recoverable: boolean;
8
+ readonly capabilityId?: string;
9
+ readonly message: string;
10
+ }
11
+
1
12
  interface IWcBindableProperty {
2
13
  readonly name: string;
3
14
  readonly event: string;
@@ -13,7 +24,8 @@ interface IWcBindableCommand {
13
24
  }
14
25
  interface IWcBindable {
15
26
  readonly protocol: "wc-bindable";
16
- readonly version: 1;
27
+ /** Integer protocol version. All versions >= 1 are core-compatible. */
28
+ readonly version: number;
17
29
  readonly properties: readonly IWcBindableProperty[];
18
30
  readonly inputs?: readonly IWcBindableInput[];
19
31
  readonly commands?: readonly IWcBindableCommand[];
@@ -114,6 +126,8 @@ interface WcsGeoCoreValues {
114
126
  loading: boolean;
115
127
  error: WcsGeoErrorDetail | null;
116
128
  permission: GeoPermissionState;
129
+ /** Last failure's serializable taxonomy (stable code/phase/recoverable), or null. */
130
+ errorInfo: WcsIoErrorInfo | null;
117
131
  }
118
132
  /**
119
133
  * Value types for the Shell (`<wcs-geo>`) — identical observable surface to the
@@ -180,6 +194,7 @@ declare class GeolocationCore extends EventTarget {
180
194
  private _watching;
181
195
  private _loading;
182
196
  private _error;
197
+ private _errorInfo;
183
198
  private _permission;
184
199
  private _permissionStatus;
185
200
  private _permissionSubscribed;
@@ -197,6 +212,13 @@ declare class GeolocationCore extends EventTarget {
197
212
  get watching(): boolean;
198
213
  get loading(): boolean;
199
214
  get error(): WcsGeoErrorDetail | null;
215
+ /**
216
+ * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /
217
+ * `recoverable`), or null. Exposed as an additive wc-bindable property (event
218
+ * `wcs-geo:error-info-changed`), derived from the normalized `error`; the
219
+ * existing `error` property/event are unchanged.
220
+ */
221
+ get errorInfo(): WcsIoErrorInfo | null;
200
222
  get permission(): GeoPermissionState;
201
223
  /** Resolves once the first (or most recent) permission probe settles (§3.8). */
202
224
  get ready(): Promise<void>;
@@ -204,6 +226,7 @@ declare class GeolocationCore extends EventTarget {
204
226
  private _setWatching;
205
227
  private _setLoading;
206
228
  private _setError;
229
+ private _commitErrorInfo;
207
230
  private _setPermission;
208
231
  /**
209
232
  * Acquire a single position fix. Resolves once the fix arrives or the request
@@ -287,6 +310,7 @@ declare class WcsGeolocation extends HTMLElement {
287
310
  get watching(): boolean;
288
311
  get loading(): boolean;
289
312
  get error(): WcsGeoErrorDetail | null;
313
+ get errorInfo(): WcsIoErrorInfo | null;
290
314
  get permission(): GeoPermissionState;
291
315
  get connectedCallbackPromise(): Promise<void>;
292
316
  get trigger(): boolean;
@@ -299,5 +323,21 @@ declare class WcsGeolocation extends HTMLElement {
299
323
  disconnectedCallback(): void;
300
324
  }
301
325
 
302
- export { GeolocationCore, WcsGeolocation, bootstrapGeolocation, getConfig };
303
- export type { GeoOptions, GeoPermissionState, IWritableConfig, IWritableTagNames, WcsGeoCommands, WcsGeoCoords, WcsGeoCoreCommands, WcsGeoCoreValues, WcsGeoErrorDetail, WcsGeoInputs, WcsGeoPositionDetail, WcsGeoValues };
326
+ /**
327
+ * geolocationCapabilities.ts
328
+ *
329
+ * Geolocation node 固有の error code(taxonomy)と derivation。汎用の error info 型は
330
+ * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から
331
+ * import する。geolocation は concurrent-independent(競合しない)ため lane は持たず、
332
+ * error taxonomy(errorInfo)のみを採用する。
333
+ */
334
+
335
+ /** 安定した geolocation error code(taxonomy)。値は公開キーとして固定。 */
336
+ declare const WCS_GEO_ERROR_CODE: {
337
+ readonly PermissionDenied: "permission-denied";
338
+ readonly PositionUnavailable: "position-unavailable";
339
+ readonly Timeout: "timeout";
340
+ };
341
+
342
+ export { GeolocationCore, WCS_GEO_ERROR_CODE, WcsGeolocation, bootstrapGeolocation, getConfig };
343
+ export type { GeoOptions, GeoPermissionState, IWritableConfig, IWritableTagNames, WcsGeoCommands, WcsGeoCoords, WcsGeoCoreCommands, WcsGeoCoreValues, WcsGeoErrorDetail, WcsGeoInputs, WcsGeoPositionDetail, WcsGeoValues, WcsIoErrorInfo, WcsIoErrorPhase };
package/dist/index.esm.js CHANGED
@@ -44,6 +44,35 @@ function setConfig(partialConfig) {
44
44
  frozenConfig = null;
45
45
  }
46
46
 
47
+ /**
48
+ * geolocationCapabilities.ts
49
+ *
50
+ * Geolocation node 固有の error code(taxonomy)と derivation。汎用の error info 型は
51
+ * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から
52
+ * import する。geolocation は concurrent-independent(競合しない)ため lane は持たず、
53
+ * error taxonomy(errorInfo)のみを採用する。
54
+ */
55
+ /** 安定した geolocation error code(taxonomy)。値は公開キーとして固定。 */
56
+ const WCS_GEO_ERROR_CODE = {
57
+ PermissionDenied: "permission-denied",
58
+ PositionUnavailable: "position-unavailable",
59
+ Timeout: "timeout",
60
+ };
61
+ /**
62
+ * 正規化済み `GeolocationPositionError`(spec code 1/2/3)を serializable な error
63
+ * taxonomy に写す。Core は "unsupported"/"unexpected" を code 2(position-unavailable)
64
+ * に畳むため、これは既存の `error.code` を忠実にミラーする。permission-denied(1)だけ
65
+ * は retry で回復しないため recoverable=false。
66
+ */
67
+ function deriveGeoErrorInfo(code, message) {
68
+ const taxonomyCode = code === 1
69
+ ? WCS_GEO_ERROR_CODE.PermissionDenied
70
+ : code === 3
71
+ ? WCS_GEO_ERROR_CODE.Timeout
72
+ : WCS_GEO_ERROR_CODE.PositionUnavailable;
73
+ return { code: taxonomyCode, phase: "execute", recoverable: code !== 1, message };
74
+ }
75
+
47
76
  /**
48
77
  * Headless geolocation primitive. A thin, framework-agnostic wrapper around the
49
78
  * Geolocation API exposed through the wc-bindable protocol.
@@ -81,6 +110,11 @@ class GeolocationCore extends EventTarget {
81
110
  { name: "loading", event: "wcs-geo:loading-changed" },
82
111
  { name: "error", event: "wcs-geo:error" },
83
112
  { name: "permission", event: "wcs-geo:permission-changed" },
113
+ // Serializable failure taxonomy (stable code / phase / recoverable), or null.
114
+ // Additive bindable output derived from the normalized `error` (spec code
115
+ // 1/2/3 → permission-denied / position-unavailable / timeout); the existing
116
+ // `error` property/event are unchanged. Fires `wcs-geo:error-info-changed`.
117
+ { name: "errorInfo", event: "wcs-geo:error-info-changed" },
84
118
  ],
85
119
  commands: [
86
120
  { name: "getCurrentPosition", async: true },
@@ -94,6 +128,7 @@ class GeolocationCore extends EventTarget {
94
128
  _watching = false;
95
129
  _loading = false;
96
130
  _error = null;
131
+ _errorInfo = null;
97
132
  _permission = "prompt";
98
133
  // Live PermissionStatus handle (when the Permissions API is available), kept
99
134
  // so the `change` listener can be removed on dispose().
@@ -165,6 +200,15 @@ class GeolocationCore extends EventTarget {
165
200
  get error() {
166
201
  return this._error;
167
202
  }
203
+ /**
204
+ * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /
205
+ * `recoverable`), or null. Exposed as an additive wc-bindable property (event
206
+ * `wcs-geo:error-info-changed`), derived from the normalized `error`; the
207
+ * existing `error` property/event are unchanged.
208
+ */
209
+ get errorInfo() {
210
+ return this._errorInfo;
211
+ }
168
212
  get permission() {
169
213
  return this._permission;
170
214
  }
@@ -206,11 +250,26 @@ class GeolocationCore extends EventTarget {
206
250
  if (this._error === error)
207
251
  return;
208
252
  this._error = error;
253
+ // Keep the additive `errorInfo` taxonomy in sync with `error`: derive it from
254
+ // the normalized error (or null on clear). Fires before the `error` event so an
255
+ // observer binding both sees the classification first, mirroring the io-node
256
+ // family. No lane here — geolocation's fixes don't compete (dispose-only guard).
257
+ this._commitErrorInfo(error === null ? null : deriveGeoErrorInfo(error.code, error.message));
209
258
  this._target.dispatchEvent(new CustomEvent("wcs-geo:error", {
210
259
  detail: error,
211
260
  bubbles: true,
212
261
  }));
213
262
  }
263
+ // Called only from _setError (which already same-value-guards on the error
264
+ // reference), so errorInfo transitions exactly when error does — no separate
265
+ // guard needed here.
266
+ _commitErrorInfo(info) {
267
+ this._errorInfo = info;
268
+ this._target.dispatchEvent(new CustomEvent("wcs-geo:error-info-changed", {
269
+ detail: info,
270
+ bubbles: true,
271
+ }));
272
+ }
214
273
  _setPermission(permission) {
215
274
  if (this._permission === permission)
216
275
  return;
@@ -686,6 +745,9 @@ class WcsGeolocation extends HTMLElement {
686
745
  get error() {
687
746
  return this._core.error;
688
747
  }
748
+ get errorInfo() {
749
+ return this._core.errorInfo;
750
+ }
689
751
  get permission() {
690
752
  return this._core.permission;
691
753
  }
@@ -781,5 +843,5 @@ function bootstrapGeolocation(userConfig) {
781
843
  registerComponents();
782
844
  }
783
845
 
784
- export { GeolocationCore, WcsGeolocation, bootstrapGeolocation, getConfig };
846
+ export { GeolocationCore, WCS_GEO_ERROR_CODE, WcsGeolocation, bootstrapGeolocation, getConfig };
785
847
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/components/Geolocation.ts","../src/registerComponents.ts","../src/bootstrapGeolocation.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n geo: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-geotarget\",\n tagNames: {\n geo: \"wcs-geo\",\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 {\n IWcBindable, GeoOptions, GeoPermissionState,\n WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail,\n} from \"../types.js\";\n\n/**\n * Headless geolocation primitive. A thin, framework-agnostic wrapper around the\n * Geolocation API exposed through the wc-bindable protocol.\n *\n * It has two phases, mirroring the two distinct shapes of the underlying API:\n * - **one-shot** — `getCurrentPosition()` resolves a single fix (like FetchCore's\n * one-shot `fetch()`), toggling `loading` around the async call.\n * - **continuous** — `watch()` / `clearWatch()` stream fixes (like TimerCore's\n * `start()` / `stop()`), toggling the `watching` flag.\n *\n * Every successful fix is published via the single `wcs-geo:position` event;\n * `latitude` / `longitude` / `accuracy` / `coords` / `timestamp` are read from\n * it through getters (mirroring how TimerCore exposes count/elapsed from one\n * `wcs-timer:tick` event), so an observer that binds any of them is notified on\n * every fix.\n *\n * Geolocation also has a permission gate absent from timer/websocket: the\n * `permission` property reflects `navigator.permissions.query({name:\n * \"geolocation\"})` (`prompt` / `granted` / `denied`, or `unsupported`) and\n * tracks its live `change` event. It is a read-only sensor — there is no\n * element-bound \"send\" path; element → state only.\n */\nexport class GeolocationCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"position\", event: \"wcs-geo:position\" },\n { name: \"latitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.latitude },\n { name: \"longitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.longitude },\n { name: \"accuracy\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.accuracy },\n { name: \"coords\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.coords },\n { name: \"timestamp\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.timestamp },\n { name: \"watching\", event: \"wcs-geo:watching-changed\" },\n { name: \"loading\", event: \"wcs-geo:loading-changed\" },\n { name: \"error\", event: \"wcs-geo:error\" },\n { name: \"permission\", event: \"wcs-geo:permission-changed\" },\n ],\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watch\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _target: EventTarget;\n private _watchId: number | null = null;\n\n private _position: WcsGeoPositionDetail | null = null;\n private _watching: boolean = false;\n private _loading: boolean = false;\n private _error: WcsGeoErrorDetail | null = null;\n private _permission: GeoPermissionState = \"prompt\";\n\n // Live PermissionStatus handle (when the Permissions API is available), kept\n // so the `change` listener can be removed on dispose().\n private _permissionStatus: PermissionStatus | null = null;\n\n // True once a permission subscription has been (or is being) established, and\n // reset by dispose(). Guards reinitPermission() so the first connect after\n // construction does not double-subscribe, while a reconnect after dispose()\n // does re-subscribe.\n private _permissionSubscribed: boolean = false;\n\n // Monotonic id of the current permission query. Bumped by every _initPermission()\n // and by dispose(). Each in-flight query captures its id and, on resolve, bails\n // unless it is still current — so a query superseded by a rapid (synchronous)\n // disconnect→reconnect, or one that resolves after dispose(), never attaches a\n // listener. A plain boolean cannot cover this: dispose()→reinit() flips it\n // false→true again, reopening the window for the stale query to slip through.\n private _permGen: number = 0;\n\n // Monotonic id of the current acquisition lifecycle, bumped only by dispose().\n // Each getCurrentPosition() captures it at start; the async success/error\n // callback bails (no setters, no resolve-side effects) if it is stale, so a\n // one-shot fix that resolves after the element was disconnected does not\n // dispatch wcs-geo:* on a torn-down element. Unlike FetchCore, the Geolocation\n // API has no AbortController, so a generation guard is the only way to neutralize\n // an in-flight one-shot. (watch is already stopped by clearWatch on disconnect.)\n private _acqGen: number = 0;\n\n // Monotonic id of the current watch lifecycle, bumped by watch(), clearWatch(),\n // and dispose(). Each watch() captures it; both watch callbacks bail if it is\n // stale. Unlike a live `_watchId === null` check, this distinguishes the current\n // watch from a superseded one: a clearWatch()→watch() restart installs a new\n // watchId (non-null), so a queued callback from the previous watch would pass a\n // null-check but fails the generation compare. (The README recommends exactly\n // this restart sequence to reconfigure a watch.)\n private _watchGen: number = 0;\n\n // Resolves once the most recent permission probe settles (or immediately when\n // the Permissions API is unsupported). The Shell exposes this as\n // connectedCallbackPromise so SSR can await the first probe before snapshotting\n // the HTML. Mirrors PermissionCore._ready.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n // Probe the permission state up front so observers see the real value\n // (granted/denied/prompt) before the first read, then keep it live.\n this._ready = this._initPermission();\n }\n\n get position(): WcsGeoPositionDetail | null {\n return this._position;\n }\n\n get latitude(): number | null {\n return this._position ? this._position.latitude : null;\n }\n\n get longitude(): number | null {\n return this._position ? this._position.longitude : null;\n }\n\n get accuracy(): number | null {\n return this._position ? this._position.accuracy : null;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._position ? this._position.coords : null;\n }\n\n get timestamp(): number | null {\n return this._position ? this._position.timestamp : null;\n }\n\n get watching(): boolean {\n return this._watching;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._error;\n }\n\n get permission(): GeoPermissionState {\n return this._permission;\n }\n\n /** Resolves once the first (or most recent) permission probe settles (§3.8). */\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // --- State setters with event dispatch ---\n\n private _setPosition(position: WcsGeoPositionDetail): void {\n this._position = position;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:position\", {\n detail: position,\n bubbles: true,\n }));\n }\n\n private _setWatching(watching: boolean): void {\n if (this._watching === watching) return;\n this._watching = watching;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:watching-changed\", {\n detail: watching,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n if (this._loading === loading) return;\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: WcsGeoErrorDetail | null): void {\n // Same-value guard, like the other setters. Unlike `position` (which has\n // derived getters and so must re-fire even on an identical reference), `error`\n // has no derived state — so suppressing redundant null→null dispatches (e.g.\n // a successful fix clearing an already-null error) avoids spurious events.\n if (this._error === error) return;\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setPermission(permission: GeoPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:permission-changed\", {\n detail: permission,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Acquire a single position fix. Resolves once the fix arrives or the request\n * fails — never rejects: failures are surfaced through the `error` property so\n * they flow into the declarative state, symmetrical with FetchCore.\n */\n getCurrentPosition(options: GeoOptions = {}): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n resolve();\n return;\n }\n\n const gen = this._acqGen;\n this._setLoading(true);\n this._setError(null);\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n // Stale: the element was disposed (disconnected) while this fix was in\n // flight. Drop it so a torn-down element never dispatches wcs-geo:*.\n // Still resolve() so any awaiter (e.g. connectedCallbackPromise) settles.\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n // Guard normalization/dispatch so a throw never escapes this browser\n // callback as an unhandled rejection, leaves the promise pending (which\n // would hang SSR's connectedCallbackPromise), or leaves `loading` stuck\n // true. Loading is cleared first so it holds even if a later step throws.\n try {\n this._setLoading(false);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n // Surface the unexpected failure as an error so observers are not left\n // silently stale, then resolve below.\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n (err) => {\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n try {\n this._setLoading(false);\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n options,\n );\n });\n }\n\n /**\n * Begin continuously watching the position. Idempotent while already\n * watching: a redundant watch() must not register a second `watchPosition`\n * (which would leak the handle and double the fix rate). Reconfiguring is done\n * via clearWatch() + watch().\n */\n watch(options: GeoOptions = {}): void {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n return;\n }\n if (this._watching) return;\n\n this._setError(null);\n this._setWatching(true);\n // Open a new watch generation so any queued callback from a prior watch\n // (cleared then restarted) is recognized as stale below.\n const wgen = ++this._watchGen;\n this._watchId = navigator.geolocation.watchPosition(\n (pos) => {\n // Stale: this callback belongs to a watch that was cleared (or the element\n // disposed), possibly already superseded by a restart. A live\n // `_watchId === null` check cannot catch the restart case (the new watch\n // re-populates _watchId), so compare the captured generation instead.\n if (wgen !== this._watchGen) return;\n // Guard normalization/dispatch so an unexpected throw never escapes this\n // browser callback as an unhandled rejection — symmetric with the one-shot\n // path.\n try {\n // A recovered fix clears any prior transient error (e.g. a one-off\n // TIMEOUT) so `error` reflects the current state, not a stale failure.\n // The _setError same-value guard makes this free when error is already\n // null.\n this._setError(null);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n (err) => {\n if (wgen !== this._watchGen) return;\n // An error does not implicitly release the watch — the watchId stays\n // valid and clearWatch() remains the teardown path — so `watching` is\n // left true to reflect \"watch still registered\". A terminal error (e.g.\n // PERMISSION_DENIED) is surfaced via the `error` property; callers that\n // want to stop on error can call clearWatch() in response.\n try {\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n options,\n );\n }\n\n clearWatch(): void {\n if (this._watchId !== null) {\n navigator.geolocation.clearWatch(this._watchId);\n this._watchId = null;\n }\n // Invalidate the current watch generation so any callback the browser may\n // still deliver after teardown bails.\n this._watchGen++;\n this._setWatching(false);\n }\n\n /**\n * Establish permission monitoring (§3.5). Idempotent: a no-op while a\n * subscription is already live (so the first connect after construction does\n * not double-subscribe), and re-subscribes after a dispose() — e.g. the Shell\n * element was disconnected and then reconnected (reparented). Returns the\n * `ready` promise, which resolves once the (re)established probe settles, so\n * the Shell can expose it as connectedCallbackPromise for SSR. Position\n * acquisition (one-shot / watch) is command-driven and the Shell drives it\n * separately from connectedCallback.\n */\n observe(): Promise<void> {\n if (!this._permissionSubscribed) {\n this._ready = this._initPermission();\n }\n return this._ready;\n }\n\n /**\n * Re-establish the permission `change` subscription after a dispose() — e.g.\n * the Shell element was disconnected and then reconnected (reparented). No-op\n * while a subscription is already live, so the first connect after\n * construction does not double-subscribe. This keeps permission tracking\n * symmetric with position acquisition, which the Shell also revives on\n * reconnect.\n *\n * Retained as a thin alias of observe() for the Shell's existing reconnect\n * path; observe() is the canonical §3.5 lifecycle entry point.\n */\n reinitPermission(): void {\n void this.observe();\n }\n\n /**\n * Detach the live permission `change` listener. Call from the Shell's\n * `disconnectedCallback` so a removed element does not leak the subscription.\n * A later reconnect can re-subscribe via reinitPermission().\n */\n dispose(): void {\n this._permissionSubscribed = false;\n // Invalidate any in-flight query so its .then() bails instead of attaching a\n // listener after teardown.\n this._permGen++;\n // Invalidate any in-flight one-shot acquisition so its success/error callback\n // bails instead of dispatching on a disconnected element.\n this._acqGen++;\n // Likewise invalidate the watch generation. The Shell already calls\n // clearWatch() before dispose(), but a direct headless dispose() (without a\n // preceding clearWatch) still neutralizes any queued watch callback.\n this._watchGen++;\n // Reset the loading shadow silently (no dispatch on a disposed element). The\n // bailed callback above will not clear it, and leaving it true would let the\n // same-value guard swallow the loading=true edge of the next acquisition after\n // a reconnect.\n this._loading = false;\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal ---\n\n private _hasGeolocation(): boolean {\n return typeof navigator !== \"undefined\" && !!navigator.geolocation;\n }\n\n private _initPermission(): Promise<void> {\n // The Permissions API is optional. When absent (or it rejects, e.g. some\n // browsers don't accept the \"geolocation\" name), report \"unsupported\" and\n // leave acquisition to fail loudly via the error property if attempted.\n if (typeof navigator === \"undefined\" || !navigator.permissions || typeof navigator.permissions.query !== \"function\") {\n // Route through _setPermission (not a bare assignment) so observers stay in\n // sync with the public state. The same-value guard means no redundant\n // dispatch when the state does not actually change; it does mean a\n // previously-observed \"granted\"/\"denied\" being reinit'd into an environment\n // that lost the Permissions API now correctly notifies observers of the\n // unsupported transition instead of silently overwriting the shadow value.\n this._setPermission(\"unsupported\");\n // No asynchronous probe to await: readiness is immediate.\n return Promise.resolve();\n }\n this._permissionSubscribed = true;\n const gen = ++this._permGen;\n return navigator.permissions.query({ name: \"geolocation\" as PermissionName }).then(\n (status) => {\n // Stale resolution: this query was superseded (rapid reconnect) or the\n // element was disposed while it was in flight. Drop it so only the current\n // subscription attaches a listener.\n if (gen !== this._permGen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as GeoPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => {\n if (gen !== this._permGen) return;\n this._setPermission(\"unsupported\");\n },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n const status = event.target as PermissionStatus;\n this._setPermission(status.state as GeoPermissionState);\n };\n\n private _normalizePosition(pos: GeolocationPosition): WcsGeoPositionDetail {\n const c = pos.coords;\n const coords: WcsGeoCoords = {\n latitude: c.latitude,\n longitude: c.longitude,\n accuracy: c.accuracy,\n altitude: c.altitude,\n altitudeAccuracy: c.altitudeAccuracy,\n heading: c.heading,\n speed: c.speed,\n };\n return { ...coords, timestamp: pos.timestamp, coords };\n }\n\n private _normalizeError(err: GeolocationPositionError): WcsGeoErrorDetail {\n return { code: err.code, message: err.message };\n }\n\n private _unsupportedError(): WcsGeoErrorDetail {\n // Geolocation API absent: surface it as POSITION_UNAVAILABLE (2) so consumers\n // that switch on the spec error codes treat it like any other unavailable fix.\n return { code: 2, message: \"Geolocation API is not available in this environment.\" };\n }\n\n private _unexpectedError(): WcsGeoErrorDetail {\n // An unexpected throw while normalizing/dispatching a fix. Surface it as\n // POSITION_UNAVAILABLE (2) so it flows into `error` like any other failure\n // instead of escaping the browser callback as an unhandled rejection.\n return { code: 2, message: \"Unexpected error while processing the position fix.\" };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsGeolocation } from \"./components/Geolocation.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 geoId = triggerElement.getAttribute(config.triggerAttribute);\n if (!geoId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // Geolocation as a value. The value import created a components/Geolocation.ts\n // ⇄ autoTrigger.ts cycle (Geolocation.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-geo> class\n // matches — without the import cycle.\n const GeoCtor = customElements.get(config.tagNames.geo);\n const geoElement = document.getElementById(geoId);\n if (!GeoCtor || !(geoElement instanceof GeoCtor)) return;\n\n // Suppress the element's default action so a fix can be requested without\n // navigating. Intentional: do not attach data-geotarget to an element whose\n // default action you also want (real <a href> link, form-submit button) — it\n // will be cancelled. See README \"Optional DOM Triggering\".\n event.preventDefault();\n (geoElement as WcsGeolocation).getCurrentPosition();\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, GeoOptions, GeoPermissionState, WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail } from \"../types.js\";\nimport { GeolocationCore } from \"../core/GeolocationCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\n// Named WcsGeolocation (not `Geolocation`) so the class does not shadow the\n// global DOM `Geolocation` interface (the type of `navigator.geolocation`), and\n// to match the <wcs-ws> convention (WcsWebSocket). The public export keeps the\n// `WcsGeolocation` name unchanged, so this rename is non-breaking.\nexport class WcsGeolocation extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...GeolocationCore.wcBindable,\n properties: [\n ...GeolocationCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-geo:trigger-changed\" },\n ],\n // Shell-level settable surface. Each input carries its mirrored `attribute`\n // hint (boolean flags reflect idempotently, so a binding system that writes\n // through inputs[].attribute is safe), following the <wcs-ws> convention.\n // `trigger` has no attribute — it is a momentary command-property, not a\n // declarative attribute. The `getCurrentPosition` / `watchPosition` /\n // `clearWatch` commands are declared below.\n inputs: [\n { name: \"highAccuracy\", attribute: \"high-accuracy\" },\n { name: \"timeout\", attribute: \"timeout\" },\n { name: \"maximumAge\", attribute: \"maximum-age\" },\n { name: \"watch\", attribute: \"watch\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n ],\n // The Core's `watch` command is renamed to `watchPosition` on the Shell so it\n // does not collide with the `watch` boolean attribute accessor (same pattern\n // as <wcs-ws>, where the `send` command becomes `sendMessage` to free the\n // `send` setter). `getCurrentPosition` / `clearWatch` are unchanged.\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watchPosition\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _core: GeolocationCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new GeolocationCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-geo:watching-changed\": (d) => ({ watching: d === true }),\n \"wcs-geo:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-geo:error\": (d) => ({ error: d != null }),\n });\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (docs/custom-state-reflection-design.md §3.4): attachInternals\n // is absent in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works, it\n // just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean) {\n if (value) {\n this.setAttribute(\"high-accuracy\", \"\");\n } else {\n this.removeAttribute(\"high-accuracy\");\n }\n }\n\n get timeout(): number {\n const attr = this.getAttribute(\"timeout\");\n if (attr === null || attr.trim() === \"\") return Infinity;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (Infinity = no timeout) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : Infinity;\n }\n\n set timeout(value: number) {\n this.setAttribute(\"timeout\", String(value));\n }\n\n get maximumAge(): number {\n const attr = this.getAttribute(\"maximum-age\");\n if (attr === null || attr.trim() === \"\") return 0;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (0 = never use a cached fix) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\n }\n\n set maximumAge(value: number) {\n this.setAttribute(\"maximum-age\", String(value));\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean) {\n if (value) {\n this.setAttribute(\"watch\", \"\");\n } else {\n this.removeAttribute(\"watch\");\n }\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 // --- Core delegated getters ---\n\n get position(): WcsGeoPositionDetail | null {\n return this._core.position;\n }\n\n get latitude(): number | null {\n return this._core.latitude;\n }\n\n get longitude(): number | null {\n return this._core.longitude;\n }\n\n get accuracy(): number | null {\n return this._core.accuracy;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._core.coords;\n }\n\n get timestamp(): number | null {\n return this._core.timestamp;\n }\n\n get watching(): boolean {\n return this._core.watching;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._core.error;\n }\n\n get permission(): GeoPermissionState {\n return this._core.permission;\n }\n\n // wc-bindable connectedCallbackPromise protocol: resolves once the connect-time\n // acquisition settles, so SSR (@wcstack/server render.ts) waits for the first\n // fix before snapshotting the HTML. Mirrors Fetch.connectedCallbackPromise. In\n // `watch` / `manual` modes there is no one-shot connect-time fix to await, so it\n // stays the default resolved promise.\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Command property ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n // Momentary command-property: a false→true write requests a single fix.\n // Mirrors the trigger flag on <wcs-timer> / <wcs-ws>. Prefer the\n // command-token protocol (`command.getCurrentPosition: $command.locate`) for\n // state-driven acquisition; this exists mainly for the DOM click trigger and\n // simple boolean bindings.\n const v = !!value;\n if (v) {\n this._trigger = true;\n // Fire-and-forget: getCurrentPosition() never rejects (failures surface via\n // the `error` property), so the returned promise is intentionally dropped.\n void this.getCurrentPosition();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-geo:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // --- Commands ---\n\n getCurrentPosition(): Promise<void> {\n return this._core.getCurrentPosition(this._options());\n }\n\n watchPosition(): void {\n this._core.watch(this._options());\n }\n\n clearWatch(): void {\n this._core.clearWatch();\n }\n\n // --- Internal ---\n\n private _options(): GeoOptions {\n return {\n enableHighAccuracy: this.highAccuracy,\n timeout: this.timeout,\n maximumAge: this.maximumAge,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // Revive permission tracking after a reconnect (reparenting). No-op on the\n // first connect since the constructor already subscribed; only re-subscribes\n // when disconnectedCallback's dispose() tore the subscription down.\n this._core.reinitPermission();\n if (!this.manual) {\n // `watch` attribute selects the default phase: continuous monitoring vs a\n // single fix on connect.\n if (this.watch) {\n this.watchPosition();\n } else {\n // Track only the one-shot connect-time fix so SSR can await it. watch /\n // manual leave the promise at its resolved default. getCurrentPosition()\n // never rejects (failures surface via `error`), so no .catch() is needed.\n this._connectedCallbackPromise = this.getCurrentPosition();\n }\n }\n }\n\n disconnectedCallback(): void {\n this._core.clearWatch();\n this._core.dispose();\n }\n}\n","import { WcsGeolocation } from \"./components/Geolocation.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.geo)) {\n customElements.define(config.tagNames.geo, WcsGeolocation);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapGeolocation(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/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/components/Geolocation.ts","../src/registerComponents.ts","../src/bootstrapGeolocation.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n geo: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-geotarget\",\n tagNames: {\n geo: \"wcs-geo\",\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","/**\n * geolocationCapabilities.ts\n *\n * Geolocation node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。geolocation は concurrent-independent(競合しない)ため lane は持たず、\n * error taxonomy(errorInfo)のみを採用する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した geolocation error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_GEO_ERROR_CODE = {\n PermissionDenied: \"permission-denied\",\n PositionUnavailable: \"position-unavailable\",\n Timeout: \"timeout\",\n} as const;\n\n/**\n * 正規化済み `GeolocationPositionError`(spec code 1/2/3)を serializable な error\n * taxonomy に写す。Core は \"unsupported\"/\"unexpected\" を code 2(position-unavailable)\n * に畳むため、これは既存の `error.code` を忠実にミラーする。permission-denied(1)だけ\n * は retry で回復しないため recoverable=false。\n */\nexport function deriveGeoErrorInfo(code: number, message: string): WcsIoErrorInfo {\n const taxonomyCode = code === 1\n ? WCS_GEO_ERROR_CODE.PermissionDenied\n : code === 3\n ? WCS_GEO_ERROR_CODE.Timeout\n : WCS_GEO_ERROR_CODE.PositionUnavailable;\n return { code: taxonomyCode, phase: \"execute\", recoverable: code !== 1, message };\n}\n","import {\n IWcBindable, GeoOptions, GeoPermissionState,\n WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail,\n} from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveGeoErrorInfo } from \"./geolocationCapabilities.js\";\n\n/**\n * Headless geolocation primitive. A thin, framework-agnostic wrapper around the\n * Geolocation API exposed through the wc-bindable protocol.\n *\n * It has two phases, mirroring the two distinct shapes of the underlying API:\n * - **one-shot** — `getCurrentPosition()` resolves a single fix (like FetchCore's\n * one-shot `fetch()`), toggling `loading` around the async call.\n * - **continuous** — `watch()` / `clearWatch()` stream fixes (like TimerCore's\n * `start()` / `stop()`), toggling the `watching` flag.\n *\n * Every successful fix is published via the single `wcs-geo:position` event;\n * `latitude` / `longitude` / `accuracy` / `coords` / `timestamp` are read from\n * it through getters (mirroring how TimerCore exposes count/elapsed from one\n * `wcs-timer:tick` event), so an observer that binds any of them is notified on\n * every fix.\n *\n * Geolocation also has a permission gate absent from timer/websocket: the\n * `permission` property reflects `navigator.permissions.query({name:\n * \"geolocation\"})` (`prompt` / `granted` / `denied`, or `unsupported`) and\n * tracks its live `change` event. It is a read-only sensor — there is no\n * element-bound \"send\" path; element → state only.\n */\nexport class GeolocationCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"position\", event: \"wcs-geo:position\" },\n { name: \"latitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.latitude },\n { name: \"longitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.longitude },\n { name: \"accuracy\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.accuracy },\n { name: \"coords\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.coords },\n { name: \"timestamp\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.timestamp },\n { name: \"watching\", event: \"wcs-geo:watching-changed\" },\n { name: \"loading\", event: \"wcs-geo:loading-changed\" },\n { name: \"error\", event: \"wcs-geo:error\" },\n { name: \"permission\", event: \"wcs-geo:permission-changed\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from the normalized `error` (spec code\n // 1/2/3 → permission-denied / position-unavailable / timeout); the existing\n // `error` property/event are unchanged. Fires `wcs-geo:error-info-changed`.\n { name: \"errorInfo\", event: \"wcs-geo:error-info-changed\" },\n ],\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watch\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _target: EventTarget;\n private _watchId: number | null = null;\n\n private _position: WcsGeoPositionDetail | null = null;\n private _watching: boolean = false;\n private _loading: boolean = false;\n private _error: WcsGeoErrorDetail | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _permission: GeoPermissionState = \"prompt\";\n\n // Live PermissionStatus handle (when the Permissions API is available), kept\n // so the `change` listener can be removed on dispose().\n private _permissionStatus: PermissionStatus | null = null;\n\n // True once a permission subscription has been (or is being) established, and\n // reset by dispose(). Guards reinitPermission() so the first connect after\n // construction does not double-subscribe, while a reconnect after dispose()\n // does re-subscribe.\n private _permissionSubscribed: boolean = false;\n\n // Monotonic id of the current permission query. Bumped by every _initPermission()\n // and by dispose(). Each in-flight query captures its id and, on resolve, bails\n // unless it is still current — so a query superseded by a rapid (synchronous)\n // disconnect→reconnect, or one that resolves after dispose(), never attaches a\n // listener. A plain boolean cannot cover this: dispose()→reinit() flips it\n // false→true again, reopening the window for the stale query to slip through.\n private _permGen: number = 0;\n\n // Monotonic id of the current acquisition lifecycle, bumped only by dispose().\n // Each getCurrentPosition() captures it at start; the async success/error\n // callback bails (no setters, no resolve-side effects) if it is stale, so a\n // one-shot fix that resolves after the element was disconnected does not\n // dispatch wcs-geo:* on a torn-down element. Unlike FetchCore, the Geolocation\n // API has no AbortController, so a generation guard is the only way to neutralize\n // an in-flight one-shot. (watch is already stopped by clearWatch on disconnect.)\n private _acqGen: number = 0;\n\n // Monotonic id of the current watch lifecycle, bumped by watch(), clearWatch(),\n // and dispose(). Each watch() captures it; both watch callbacks bail if it is\n // stale. Unlike a live `_watchId === null` check, this distinguishes the current\n // watch from a superseded one: a clearWatch()→watch() restart installs a new\n // watchId (non-null), so a queued callback from the previous watch would pass a\n // null-check but fails the generation compare. (The README recommends exactly\n // this restart sequence to reconfigure a watch.)\n private _watchGen: number = 0;\n\n // Resolves once the most recent permission probe settles (or immediately when\n // the Permissions API is unsupported). The Shell exposes this as\n // connectedCallbackPromise so SSR can await the first probe before snapshotting\n // the HTML. Mirrors PermissionCore._ready.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n // Probe the permission state up front so observers see the real value\n // (granted/denied/prompt) before the first read, then keep it live.\n this._ready = this._initPermission();\n }\n\n get position(): WcsGeoPositionDetail | null {\n return this._position;\n }\n\n get latitude(): number | null {\n return this._position ? this._position.latitude : null;\n }\n\n get longitude(): number | null {\n return this._position ? this._position.longitude : null;\n }\n\n get accuracy(): number | null {\n return this._position ? this._position.accuracy : null;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._position ? this._position.coords : null;\n }\n\n get timestamp(): number | null {\n return this._position ? this._position.timestamp : null;\n }\n\n get watching(): boolean {\n return this._watching;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Exposed as an additive wc-bindable property (event\n * `wcs-geo:error-info-changed`), derived from the normalized `error`; the\n * existing `error` property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get permission(): GeoPermissionState {\n return this._permission;\n }\n\n /** Resolves once the first (or most recent) permission probe settles (§3.8). */\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // --- State setters with event dispatch ---\n\n private _setPosition(position: WcsGeoPositionDetail): void {\n this._position = position;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:position\", {\n detail: position,\n bubbles: true,\n }));\n }\n\n private _setWatching(watching: boolean): void {\n if (this._watching === watching) return;\n this._watching = watching;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:watching-changed\", {\n detail: watching,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n if (this._loading === loading) return;\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: WcsGeoErrorDetail | null): void {\n // Same-value guard, like the other setters. Unlike `position` (which has\n // derived getters and so must re-fire even on an identical reference), `error`\n // has no derived state — so suppressing redundant null→null dispatches (e.g.\n // a successful fix clearing an already-null error) avoids spurious events.\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive it from\n // the normalized error (or null on clear). Fires before the `error` event so an\n // observer binding both sees the classification first, mirroring the io-node\n // family. No lane here — geolocation's fixes don't compete (dispose-only guard).\n this._commitErrorInfo(error === null ? null : deriveGeoErrorInfo(error.code, error.message));\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n private _setPermission(permission: GeoPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:permission-changed\", {\n detail: permission,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Acquire a single position fix. Resolves once the fix arrives or the request\n * fails — never rejects: failures are surfaced through the `error` property so\n * they flow into the declarative state, symmetrical with FetchCore.\n */\n getCurrentPosition(options: GeoOptions = {}): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n resolve();\n return;\n }\n\n const gen = this._acqGen;\n this._setLoading(true);\n this._setError(null);\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n // Stale: the element was disposed (disconnected) while this fix was in\n // flight. Drop it so a torn-down element never dispatches wcs-geo:*.\n // Still resolve() so any awaiter (e.g. connectedCallbackPromise) settles.\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n // Guard normalization/dispatch so a throw never escapes this browser\n // callback as an unhandled rejection, leaves the promise pending (which\n // would hang SSR's connectedCallbackPromise), or leaves `loading` stuck\n // true. Loading is cleared first so it holds even if a later step throws.\n try {\n this._setLoading(false);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n // Surface the unexpected failure as an error so observers are not left\n // silently stale, then resolve below.\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n (err) => {\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n try {\n this._setLoading(false);\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n options,\n );\n });\n }\n\n /**\n * Begin continuously watching the position. Idempotent while already\n * watching: a redundant watch() must not register a second `watchPosition`\n * (which would leak the handle and double the fix rate). Reconfiguring is done\n * via clearWatch() + watch().\n */\n watch(options: GeoOptions = {}): void {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n return;\n }\n if (this._watching) return;\n\n this._setError(null);\n this._setWatching(true);\n // Open a new watch generation so any queued callback from a prior watch\n // (cleared then restarted) is recognized as stale below.\n const wgen = ++this._watchGen;\n this._watchId = navigator.geolocation.watchPosition(\n (pos) => {\n // Stale: this callback belongs to a watch that was cleared (or the element\n // disposed), possibly already superseded by a restart. A live\n // `_watchId === null` check cannot catch the restart case (the new watch\n // re-populates _watchId), so compare the captured generation instead.\n if (wgen !== this._watchGen) return;\n // Guard normalization/dispatch so an unexpected throw never escapes this\n // browser callback as an unhandled rejection — symmetric with the one-shot\n // path.\n try {\n // A recovered fix clears any prior transient error (e.g. a one-off\n // TIMEOUT) so `error` reflects the current state, not a stale failure.\n // The _setError same-value guard makes this free when error is already\n // null.\n this._setError(null);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n (err) => {\n if (wgen !== this._watchGen) return;\n // An error does not implicitly release the watch — the watchId stays\n // valid and clearWatch() remains the teardown path — so `watching` is\n // left true to reflect \"watch still registered\". A terminal error (e.g.\n // PERMISSION_DENIED) is surfaced via the `error` property; callers that\n // want to stop on error can call clearWatch() in response.\n try {\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n options,\n );\n }\n\n clearWatch(): void {\n if (this._watchId !== null) {\n navigator.geolocation.clearWatch(this._watchId);\n this._watchId = null;\n }\n // Invalidate the current watch generation so any callback the browser may\n // still deliver after teardown bails.\n this._watchGen++;\n this._setWatching(false);\n }\n\n /**\n * Establish permission monitoring (§3.5). Idempotent: a no-op while a\n * subscription is already live (so the first connect after construction does\n * not double-subscribe), and re-subscribes after a dispose() — e.g. the Shell\n * element was disconnected and then reconnected (reparented). Returns the\n * `ready` promise, which resolves once the (re)established probe settles, so\n * the Shell can expose it as connectedCallbackPromise for SSR. Position\n * acquisition (one-shot / watch) is command-driven and the Shell drives it\n * separately from connectedCallback.\n */\n observe(): Promise<void> {\n if (!this._permissionSubscribed) {\n this._ready = this._initPermission();\n }\n return this._ready;\n }\n\n /**\n * Re-establish the permission `change` subscription after a dispose() — e.g.\n * the Shell element was disconnected and then reconnected (reparented). No-op\n * while a subscription is already live, so the first connect after\n * construction does not double-subscribe. This keeps permission tracking\n * symmetric with position acquisition, which the Shell also revives on\n * reconnect.\n *\n * Retained as a thin alias of observe() for the Shell's existing reconnect\n * path; observe() is the canonical §3.5 lifecycle entry point.\n */\n reinitPermission(): void {\n void this.observe();\n }\n\n /**\n * Detach the live permission `change` listener. Call from the Shell's\n * `disconnectedCallback` so a removed element does not leak the subscription.\n * A later reconnect can re-subscribe via reinitPermission().\n */\n dispose(): void {\n this._permissionSubscribed = false;\n // Invalidate any in-flight query so its .then() bails instead of attaching a\n // listener after teardown.\n this._permGen++;\n // Invalidate any in-flight one-shot acquisition so its success/error callback\n // bails instead of dispatching on a disconnected element.\n this._acqGen++;\n // Likewise invalidate the watch generation. The Shell already calls\n // clearWatch() before dispose(), but a direct headless dispose() (without a\n // preceding clearWatch) still neutralizes any queued watch callback.\n this._watchGen++;\n // Reset the loading shadow silently (no dispatch on a disposed element). The\n // bailed callback above will not clear it, and leaving it true would let the\n // same-value guard swallow the loading=true edge of the next acquisition after\n // a reconnect.\n this._loading = false;\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal ---\n\n private _hasGeolocation(): boolean {\n return typeof navigator !== \"undefined\" && !!navigator.geolocation;\n }\n\n private _initPermission(): Promise<void> {\n // The Permissions API is optional. When absent (or it rejects, e.g. some\n // browsers don't accept the \"geolocation\" name), report \"unsupported\" and\n // leave acquisition to fail loudly via the error property if attempted.\n if (typeof navigator === \"undefined\" || !navigator.permissions || typeof navigator.permissions.query !== \"function\") {\n // Route through _setPermission (not a bare assignment) so observers stay in\n // sync with the public state. The same-value guard means no redundant\n // dispatch when the state does not actually change; it does mean a\n // previously-observed \"granted\"/\"denied\" being reinit'd into an environment\n // that lost the Permissions API now correctly notifies observers of the\n // unsupported transition instead of silently overwriting the shadow value.\n this._setPermission(\"unsupported\");\n // No asynchronous probe to await: readiness is immediate.\n return Promise.resolve();\n }\n this._permissionSubscribed = true;\n const gen = ++this._permGen;\n return navigator.permissions.query({ name: \"geolocation\" as PermissionName }).then(\n (status) => {\n // Stale resolution: this query was superseded (rapid reconnect) or the\n // element was disposed while it was in flight. Drop it so only the current\n // subscription attaches a listener.\n if (gen !== this._permGen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as GeoPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => {\n if (gen !== this._permGen) return;\n this._setPermission(\"unsupported\");\n },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n const status = event.target as PermissionStatus;\n this._setPermission(status.state as GeoPermissionState);\n };\n\n private _normalizePosition(pos: GeolocationPosition): WcsGeoPositionDetail {\n const c = pos.coords;\n const coords: WcsGeoCoords = {\n latitude: c.latitude,\n longitude: c.longitude,\n accuracy: c.accuracy,\n altitude: c.altitude,\n altitudeAccuracy: c.altitudeAccuracy,\n heading: c.heading,\n speed: c.speed,\n };\n return { ...coords, timestamp: pos.timestamp, coords };\n }\n\n private _normalizeError(err: GeolocationPositionError): WcsGeoErrorDetail {\n return { code: err.code, message: err.message };\n }\n\n private _unsupportedError(): WcsGeoErrorDetail {\n // Geolocation API absent: surface it as POSITION_UNAVAILABLE (2) so consumers\n // that switch on the spec error codes treat it like any other unavailable fix.\n return { code: 2, message: \"Geolocation API is not available in this environment.\" };\n }\n\n private _unexpectedError(): WcsGeoErrorDetail {\n // An unexpected throw while normalizing/dispatching a fix. Surface it as\n // POSITION_UNAVAILABLE (2) so it flows into `error` like any other failure\n // instead of escaping the browser callback as an unhandled rejection.\n return { code: 2, message: \"Unexpected error while processing the position fix.\" };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsGeolocation } from \"./components/Geolocation.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 geoId = triggerElement.getAttribute(config.triggerAttribute);\n if (!geoId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // Geolocation as a value. The value import created a components/Geolocation.ts\n // ⇄ autoTrigger.ts cycle (Geolocation.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-geo> class\n // matches — without the import cycle.\n const GeoCtor = customElements.get(config.tagNames.geo);\n const geoElement = document.getElementById(geoId);\n if (!GeoCtor || !(geoElement instanceof GeoCtor)) return;\n\n // Suppress the element's default action so a fix can be requested without\n // navigating. Intentional: do not attach data-geotarget to an element whose\n // default action you also want (real <a href> link, form-submit button) — it\n // will be cancelled. See README \"Optional DOM Triggering\".\n event.preventDefault();\n (geoElement as WcsGeolocation).getCurrentPosition();\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, GeoOptions, GeoPermissionState, WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail } from \"../types.js\";\nimport { GeolocationCore } from \"../core/GeolocationCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\n// Named WcsGeolocation (not `Geolocation`) so the class does not shadow the\n// global DOM `Geolocation` interface (the type of `navigator.geolocation`), and\n// to match the <wcs-ws> convention (WcsWebSocket). The public export keeps the\n// `WcsGeolocation` name unchanged, so this rename is non-breaking.\nexport class WcsGeolocation extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...GeolocationCore.wcBindable,\n properties: [\n ...GeolocationCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-geo:trigger-changed\" },\n ],\n // Shell-level settable surface. Each input carries its mirrored `attribute`\n // hint (boolean flags reflect idempotently, so a binding system that writes\n // through inputs[].attribute is safe), following the <wcs-ws> convention.\n // `trigger` has no attribute — it is a momentary command-property, not a\n // declarative attribute. The `getCurrentPosition` / `watchPosition` /\n // `clearWatch` commands are declared below.\n inputs: [\n { name: \"highAccuracy\", attribute: \"high-accuracy\" },\n { name: \"timeout\", attribute: \"timeout\" },\n { name: \"maximumAge\", attribute: \"maximum-age\" },\n { name: \"watch\", attribute: \"watch\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n ],\n // The Core's `watch` command is renamed to `watchPosition` on the Shell so it\n // does not collide with the `watch` boolean attribute accessor (same pattern\n // as <wcs-ws>, where the `send` command becomes `sendMessage` to free the\n // `send` setter). `getCurrentPosition` / `clearWatch` are unchanged.\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watchPosition\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _core: GeolocationCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new GeolocationCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-geo:watching-changed\": (d) => ({ watching: d === true }),\n \"wcs-geo:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-geo:error\": (d) => ({ error: d != null }),\n });\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (docs/custom-state-reflection-design.md §3.4): attachInternals\n // is absent in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works, it\n // just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean) {\n if (value) {\n this.setAttribute(\"high-accuracy\", \"\");\n } else {\n this.removeAttribute(\"high-accuracy\");\n }\n }\n\n get timeout(): number {\n const attr = this.getAttribute(\"timeout\");\n if (attr === null || attr.trim() === \"\") return Infinity;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (Infinity = no timeout) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : Infinity;\n }\n\n set timeout(value: number) {\n this.setAttribute(\"timeout\", String(value));\n }\n\n get maximumAge(): number {\n const attr = this.getAttribute(\"maximum-age\");\n if (attr === null || attr.trim() === \"\") return 0;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (0 = never use a cached fix) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\n }\n\n set maximumAge(value: number) {\n this.setAttribute(\"maximum-age\", String(value));\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean) {\n if (value) {\n this.setAttribute(\"watch\", \"\");\n } else {\n this.removeAttribute(\"watch\");\n }\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 // --- Core delegated getters ---\n\n get position(): WcsGeoPositionDetail | null {\n return this._core.position;\n }\n\n get latitude(): number | null {\n return this._core.latitude;\n }\n\n get longitude(): number | null {\n return this._core.longitude;\n }\n\n get accuracy(): number | null {\n return this._core.accuracy;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._core.coords;\n }\n\n get timestamp(): number | null {\n return this._core.timestamp;\n }\n\n get watching(): boolean {\n return this._core.watching;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get permission(): GeoPermissionState {\n return this._core.permission;\n }\n\n // wc-bindable connectedCallbackPromise protocol: resolves once the connect-time\n // acquisition settles, so SSR (@wcstack/server render.ts) waits for the first\n // fix before snapshotting the HTML. Mirrors Fetch.connectedCallbackPromise. In\n // `watch` / `manual` modes there is no one-shot connect-time fix to await, so it\n // stays the default resolved promise.\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Command property ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n // Momentary command-property: a false→true write requests a single fix.\n // Mirrors the trigger flag on <wcs-timer> / <wcs-ws>. Prefer the\n // command-token protocol (`command.getCurrentPosition: $command.locate`) for\n // state-driven acquisition; this exists mainly for the DOM click trigger and\n // simple boolean bindings.\n const v = !!value;\n if (v) {\n this._trigger = true;\n // Fire-and-forget: getCurrentPosition() never rejects (failures surface via\n // the `error` property), so the returned promise is intentionally dropped.\n void this.getCurrentPosition();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-geo:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // --- Commands ---\n\n getCurrentPosition(): Promise<void> {\n return this._core.getCurrentPosition(this._options());\n }\n\n watchPosition(): void {\n this._core.watch(this._options());\n }\n\n clearWatch(): void {\n this._core.clearWatch();\n }\n\n // --- Internal ---\n\n private _options(): GeoOptions {\n return {\n enableHighAccuracy: this.highAccuracy,\n timeout: this.timeout,\n maximumAge: this.maximumAge,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // Revive permission tracking after a reconnect (reparenting). No-op on the\n // first connect since the constructor already subscribed; only re-subscribes\n // when disconnectedCallback's dispose() tore the subscription down.\n this._core.reinitPermission();\n if (!this.manual) {\n // `watch` attribute selects the default phase: continuous monitoring vs a\n // single fix on connect.\n if (this.watch) {\n this.watchPosition();\n } else {\n // Track only the one-shot connect-time fix so SSR can await it. watch /\n // manual leave the promise at its resolved default. getCurrentPosition()\n // never rejects (failures surface via `error`), so no .catch() is needed.\n this._connectedCallbackPromise = this.getCurrentPosition();\n }\n }\n }\n\n disconnectedCallback(): void {\n this._core.clearWatch();\n this._core.dispose();\n }\n}\n","import { WcsGeolocation } from \"./components/Geolocation.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.geo)) {\n customElements.define(config.tagNames.geo, WcsGeolocation);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapGeolocation(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const t={autoTrigger:!0,triggerAttribute:"data-geotarget",tagNames:{geo:"wcs-geo"}};function e(t){if(null===t||"object"!=typeof t)return t;Object.freeze(t);for(const i of Object.keys(t))e(t[i]);return t}function i(t){if(null===t||"object"!=typeof t)return t;const e={};for(const s of Object.keys(t))e[s]=i(t[s]);return e}let s=null;const r=t;function n(){return s||(s=e(i(t))),s}class o extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"position",event:"wcs-geo:position"},{name:"latitude",event:"wcs-geo:position",getter:t=>t.detail.latitude},{name:"longitude",event:"wcs-geo:position",getter:t=>t.detail.longitude},{name:"accuracy",event:"wcs-geo:position",getter:t=>t.detail.accuracy},{name:"coords",event:"wcs-geo:position",getter:t=>t.detail.coords},{name:"timestamp",event:"wcs-geo:position",getter:t=>t.detail.timestamp},{name:"watching",event:"wcs-geo:watching-changed"},{name:"loading",event:"wcs-geo:loading-changed"},{name:"error",event:"wcs-geo:error"},{name:"permission",event:"wcs-geo:permission-changed"}],commands:[{name:"getCurrentPosition",async:!0},{name:"watch"},{name:"clearWatch"}]};_target;_watchId=null;_position=null;_watching=!1;_loading=!1;_error=null;_permission="prompt";_permissionStatus=null;_permissionSubscribed=!1;_permGen=0;_acqGen=0;_watchGen=0;_ready=Promise.resolve();constructor(t){super(),this._target=t??this,this._ready=this._initPermission()}get position(){return this._position}get latitude(){return this._position?this._position.latitude:null}get longitude(){return this._position?this._position.longitude:null}get accuracy(){return this._position?this._position.accuracy:null}get coords(){return this._position?this._position.coords:null}get timestamp(){return this._position?this._position.timestamp:null}get watching(){return this._watching}get loading(){return this._loading}get error(){return this._error}get permission(){return this._permission}get ready(){return this._ready}_setPosition(t){this._position=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:position",{detail:t,bubbles:!0}))}_setWatching(t){this._watching!==t&&(this._watching=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:watching-changed",{detail:t,bubbles:!0})))}_setLoading(t){this._loading!==t&&(this._loading=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:loading-changed",{detail:t,bubbles:!0})))}_setError(t){this._error!==t&&(this._error=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:error",{detail:t,bubbles:!0})))}_setPermission(t){this._permission!==t&&(this._permission=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:permission-changed",{detail:t,bubbles:!0})))}getCurrentPosition(t={}){return new Promise(e=>{if(!this._hasGeolocation())return this._setError(this._unsupportedError()),void e();const i=this._acqGen;this._setLoading(!0),this._setError(null),navigator.geolocation.getCurrentPosition(t=>{if(i===this._acqGen){try{this._setLoading(!1),this._setPosition(this._normalizePosition(t))}catch{this._setError(this._unexpectedError())}e()}else e()},t=>{if(i===this._acqGen){try{this._setLoading(!1),this._setError(this._normalizeError(t))}catch{this._setError(this._unexpectedError())}e()}else e()},t)})}watch(t={}){if(!this._hasGeolocation())return void this._setError(this._unsupportedError());if(this._watching)return;this._setError(null),this._setWatching(!0);const e=++this._watchGen;this._watchId=navigator.geolocation.watchPosition(t=>{if(e===this._watchGen)try{this._setError(null),this._setPosition(this._normalizePosition(t))}catch{this._setError(this._unexpectedError())}},t=>{if(e===this._watchGen)try{this._setError(this._normalizeError(t))}catch{this._setError(this._unexpectedError())}},t)}clearWatch(){null!==this._watchId&&(navigator.geolocation.clearWatch(this._watchId),this._watchId=null),this._watchGen++,this._setWatching(!1)}observe(){return this._permissionSubscribed||(this._ready=this._initPermission()),this._ready}reinitPermission(){this.observe()}dispose(){this._permissionSubscribed=!1,this._permGen++,this._acqGen++,this._watchGen++,this._loading=!1,this._permissionStatus&&(this._permissionStatus.removeEventListener("change",this._onPermissionChange),this._permissionStatus=null)}_hasGeolocation(){return"undefined"!=typeof navigator&&!!navigator.geolocation}_initPermission(){if("undefined"==typeof navigator||!navigator.permissions||"function"!=typeof navigator.permissions.query)return this._setPermission("unsupported"),Promise.resolve();this._permissionSubscribed=!0;const t=++this._permGen;return navigator.permissions.query({name:"geolocation"}).then(e=>{t===this._permGen&&(this._permissionStatus=e,this._setPermission(e.state),e.addEventListener("change",this._onPermissionChange))},()=>{t===this._permGen&&this._setPermission("unsupported")})}_onPermissionChange=t=>{const e=t.target;this._setPermission(e.state)};_normalizePosition(t){const e=t.coords,i={latitude:e.latitude,longitude:e.longitude,accuracy:e.accuracy,altitude:e.altitude,altitudeAccuracy:e.altitudeAccuracy,heading:e.heading,speed:e.speed};return{...i,timestamp:t.timestamp,coords:i}}_normalizeError(t){return{code:t.code,message:t.message}}_unsupportedError(){return{code:2,message:"Geolocation API is not available in this environment."}}_unexpectedError(){return{code:2,message:"Unexpected error while processing the position fix."}}}let a=!1;function c(t){const e=t.target;if(!(e instanceof Element))return;const i=e.closest(`[${r.triggerAttribute}]`);if(!i)return;const s=i.getAttribute(r.triggerAttribute);if(!s)return;const n=customElements.get(r.tagNames.geo),o=document.getElementById(s);n&&o instanceof n&&(t.preventDefault(),o.getCurrentPosition())}class h extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...o.wcBindable,properties:[...o.wcBindable.properties,{name:"trigger",event:"wcs-geo:trigger-changed"}],inputs:[{name:"highAccuracy",attribute:"high-accuracy"},{name:"timeout",attribute:"timeout"},{name:"maximumAge",attribute:"maximum-age"},{name:"watch",attribute:"watch"},{name:"manual",attribute:"manual"},{name:"trigger"}],commands:[{name:"getCurrentPosition",async:!0},{name:"watchPosition"},{name:"clearWatch"}]};_core;_trigger=!1;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new o(this),this._internals=this._initInternals(),this._wireStates({"wcs-geo:watching-changed":t=>({watching:!0===t}),"wcs-geo:loading-changed":t=>({loading:!0===t}),"wcs-geo:error":t=>({error:null!=t})})}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const t=this.attachInternals();return t.states.add("wcs-probe"),t.states.delete("wcs-probe"),t}catch{return null}}_wireStates(t){if(null===this._internals)return;const e=this._internals.states;for(const[i,s]of Object.entries(t))this.addEventListener(i,t=>{const i=this.hasAttribute("debug-states");for(const[r,n]of Object.entries(s(t.detail))){try{n?e.add(r):e.delete(r)}catch{}i&&this.toggleAttribute(`data-wcs-state-${r}`,n)}})}get highAccuracy(){return this.hasAttribute("high-accuracy")}set highAccuracy(t){t?this.setAttribute("high-accuracy",""):this.removeAttribute("high-accuracy")}get timeout(){const t=this.getAttribute("timeout");if(null===t||""===t.trim())return 1/0;const e=Number(t);return Number.isFinite(e)&&e>=0?e:1/0}set timeout(t){this.setAttribute("timeout",String(t))}get maximumAge(){const t=this.getAttribute("maximum-age");if(null===t||""===t.trim())return 0;const e=Number(t);return Number.isFinite(e)&&e>=0?e:0}set maximumAge(t){this.setAttribute("maximum-age",String(t))}get watch(){return this.hasAttribute("watch")}set watch(t){t?this.setAttribute("watch",""):this.removeAttribute("watch")}get manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get position(){return this._core.position}get latitude(){return this._core.latitude}get longitude(){return this._core.longitude}get accuracy(){return this._core.accuracy}get coords(){return this._core.coords}get timestamp(){return this._core.timestamp}get watching(){return this._core.watching}get loading(){return this._core.loading}get error(){return this._core.error}get permission(){return this._core.permission}get connectedCallbackPromise(){return this._connectedCallbackPromise}get trigger(){return this._trigger}set trigger(t){!!t&&(this._trigger=!0,this.getCurrentPosition(),this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-geo:trigger-changed",{detail:!1,bubbles:!0})))}getCurrentPosition(){return this._core.getCurrentPosition(this._options())}watchPosition(){this._core.watch(this._options())}clearWatch(){this._core.clearWatch()}_options(){return{enableHighAccuracy:this.highAccuracy,timeout:this.timeout,maximumAge:this.maximumAge}}connectedCallback(){this.style.display="none",r.autoTrigger&&(a||(a=!0,document.addEventListener("click",c))),this._core.reinitPermission(),this.manual||(this.watch?this.watchPosition():this._connectedCallbackPromise=this.getCurrentPosition())}disconnectedCallback(){this._core.clearWatch(),this._core.dispose()}}function u(e){var i;e&&("boolean"==typeof(i=e).autoTrigger&&(t.autoTrigger=i.autoTrigger),"string"==typeof i.triggerAttribute&&(t.triggerAttribute=i.triggerAttribute),i.tagNames&&Object.assign(t.tagNames,i.tagNames),s=null),customElements.get(r.tagNames.geo)||customElements.define(r.tagNames.geo,h)}export{o as GeolocationCore,h as WcsGeolocation,u as bootstrapGeolocation,n as getConfig};
1
+ const t={autoTrigger:!0,triggerAttribute:"data-geotarget",tagNames:{geo:"wcs-geo"}};function e(t){if(null===t||"object"!=typeof t)return t;Object.freeze(t);for(const i of Object.keys(t))e(t[i]);return t}function i(t){if(null===t||"object"!=typeof t)return t;const e={};for(const r of Object.keys(t))e[r]=i(t[r]);return e}let r=null;const s=t;function n(){return r||(r=e(i(t))),r}const o={PermissionDenied:"permission-denied",PositionUnavailable:"position-unavailable",Timeout:"timeout"};class a extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"position",event:"wcs-geo:position"},{name:"latitude",event:"wcs-geo:position",getter:t=>t.detail.latitude},{name:"longitude",event:"wcs-geo:position",getter:t=>t.detail.longitude},{name:"accuracy",event:"wcs-geo:position",getter:t=>t.detail.accuracy},{name:"coords",event:"wcs-geo:position",getter:t=>t.detail.coords},{name:"timestamp",event:"wcs-geo:position",getter:t=>t.detail.timestamp},{name:"watching",event:"wcs-geo:watching-changed"},{name:"loading",event:"wcs-geo:loading-changed"},{name:"error",event:"wcs-geo:error"},{name:"permission",event:"wcs-geo:permission-changed"},{name:"errorInfo",event:"wcs-geo:error-info-changed"}],commands:[{name:"getCurrentPosition",async:!0},{name:"watch"},{name:"clearWatch"}]};_target;_watchId=null;_position=null;_watching=!1;_loading=!1;_error=null;_errorInfo=null;_permission="prompt";_permissionStatus=null;_permissionSubscribed=!1;_permGen=0;_acqGen=0;_watchGen=0;_ready=Promise.resolve();constructor(t){super(),this._target=t??this,this._ready=this._initPermission()}get position(){return this._position}get latitude(){return this._position?this._position.latitude:null}get longitude(){return this._position?this._position.longitude:null}get accuracy(){return this._position?this._position.accuracy:null}get coords(){return this._position?this._position.coords:null}get timestamp(){return this._position?this._position.timestamp:null}get watching(){return this._watching}get loading(){return this._loading}get error(){return this._error}get errorInfo(){return this._errorInfo}get permission(){return this._permission}get ready(){return this._ready}_setPosition(t){this._position=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:position",{detail:t,bubbles:!0}))}_setWatching(t){this._watching!==t&&(this._watching=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:watching-changed",{detail:t,bubbles:!0})))}_setLoading(t){this._loading!==t&&(this._loading=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:loading-changed",{detail:t,bubbles:!0})))}_setError(t){var e,i;this._error!==t&&(this._error=t,this._commitErrorInfo(null===t?null:(e=t.code,i=t.message,{code:1===e?o.PermissionDenied:3===e?o.Timeout:o.PositionUnavailable,phase:"execute",recoverable:1!==e,message:i})),this._target.dispatchEvent(new CustomEvent("wcs-geo:error",{detail:t,bubbles:!0})))}_commitErrorInfo(t){this._errorInfo=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:error-info-changed",{detail:t,bubbles:!0}))}_setPermission(t){this._permission!==t&&(this._permission=t,this._target.dispatchEvent(new CustomEvent("wcs-geo:permission-changed",{detail:t,bubbles:!0})))}getCurrentPosition(t={}){return new Promise(e=>{if(!this._hasGeolocation())return this._setError(this._unsupportedError()),void e();const i=this._acqGen;this._setLoading(!0),this._setError(null),navigator.geolocation.getCurrentPosition(t=>{if(i===this._acqGen){try{this._setLoading(!1),this._setPosition(this._normalizePosition(t))}catch{this._setError(this._unexpectedError())}e()}else e()},t=>{if(i===this._acqGen){try{this._setLoading(!1),this._setError(this._normalizeError(t))}catch{this._setError(this._unexpectedError())}e()}else e()},t)})}watch(t={}){if(!this._hasGeolocation())return void this._setError(this._unsupportedError());if(this._watching)return;this._setError(null),this._setWatching(!0);const e=++this._watchGen;this._watchId=navigator.geolocation.watchPosition(t=>{if(e===this._watchGen)try{this._setError(null),this._setPosition(this._normalizePosition(t))}catch{this._setError(this._unexpectedError())}},t=>{if(e===this._watchGen)try{this._setError(this._normalizeError(t))}catch{this._setError(this._unexpectedError())}},t)}clearWatch(){null!==this._watchId&&(navigator.geolocation.clearWatch(this._watchId),this._watchId=null),this._watchGen++,this._setWatching(!1)}observe(){return this._permissionSubscribed||(this._ready=this._initPermission()),this._ready}reinitPermission(){this.observe()}dispose(){this._permissionSubscribed=!1,this._permGen++,this._acqGen++,this._watchGen++,this._loading=!1,this._permissionStatus&&(this._permissionStatus.removeEventListener("change",this._onPermissionChange),this._permissionStatus=null)}_hasGeolocation(){return"undefined"!=typeof navigator&&!!navigator.geolocation}_initPermission(){if("undefined"==typeof navigator||!navigator.permissions||"function"!=typeof navigator.permissions.query)return this._setPermission("unsupported"),Promise.resolve();this._permissionSubscribed=!0;const t=++this._permGen;return navigator.permissions.query({name:"geolocation"}).then(e=>{t===this._permGen&&(this._permissionStatus=e,this._setPermission(e.state),e.addEventListener("change",this._onPermissionChange))},()=>{t===this._permGen&&this._setPermission("unsupported")})}_onPermissionChange=t=>{const e=t.target;this._setPermission(e.state)};_normalizePosition(t){const e=t.coords,i={latitude:e.latitude,longitude:e.longitude,accuracy:e.accuracy,altitude:e.altitude,altitudeAccuracy:e.altitudeAccuracy,heading:e.heading,speed:e.speed};return{...i,timestamp:t.timestamp,coords:i}}_normalizeError(t){return{code:t.code,message:t.message}}_unsupportedError(){return{code:2,message:"Geolocation API is not available in this environment."}}_unexpectedError(){return{code:2,message:"Unexpected error while processing the position fix."}}}let c=!1;function h(t){const e=t.target;if(!(e instanceof Element))return;const i=e.closest(`[${s.triggerAttribute}]`);if(!i)return;const r=i.getAttribute(s.triggerAttribute);if(!r)return;const n=customElements.get(s.tagNames.geo),o=document.getElementById(r);n&&o instanceof n&&(t.preventDefault(),o.getCurrentPosition())}class u extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...a.wcBindable,properties:[...a.wcBindable.properties,{name:"trigger",event:"wcs-geo:trigger-changed"}],inputs:[{name:"highAccuracy",attribute:"high-accuracy"},{name:"timeout",attribute:"timeout"},{name:"maximumAge",attribute:"maximum-age"},{name:"watch",attribute:"watch"},{name:"manual",attribute:"manual"},{name:"trigger"}],commands:[{name:"getCurrentPosition",async:!0},{name:"watchPosition"},{name:"clearWatch"}]};_core;_trigger=!1;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new a(this),this._internals=this._initInternals(),this._wireStates({"wcs-geo:watching-changed":t=>({watching:!0===t}),"wcs-geo:loading-changed":t=>({loading:!0===t}),"wcs-geo:error":t=>({error:null!=t})})}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const t=this.attachInternals();return t.states.add("wcs-probe"),t.states.delete("wcs-probe"),t}catch{return null}}_wireStates(t){if(null===this._internals)return;const e=this._internals.states;for(const[i,r]of Object.entries(t))this.addEventListener(i,t=>{const i=this.hasAttribute("debug-states");for(const[s,n]of Object.entries(r(t.detail))){try{n?e.add(s):e.delete(s)}catch{}i&&this.toggleAttribute(`data-wcs-state-${s}`,n)}})}get highAccuracy(){return this.hasAttribute("high-accuracy")}set highAccuracy(t){t?this.setAttribute("high-accuracy",""):this.removeAttribute("high-accuracy")}get timeout(){const t=this.getAttribute("timeout");if(null===t||""===t.trim())return 1/0;const e=Number(t);return Number.isFinite(e)&&e>=0?e:1/0}set timeout(t){this.setAttribute("timeout",String(t))}get maximumAge(){const t=this.getAttribute("maximum-age");if(null===t||""===t.trim())return 0;const e=Number(t);return Number.isFinite(e)&&e>=0?e:0}set maximumAge(t){this.setAttribute("maximum-age",String(t))}get watch(){return this.hasAttribute("watch")}set watch(t){t?this.setAttribute("watch",""):this.removeAttribute("watch")}get manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get position(){return this._core.position}get latitude(){return this._core.latitude}get longitude(){return this._core.longitude}get accuracy(){return this._core.accuracy}get coords(){return this._core.coords}get timestamp(){return this._core.timestamp}get watching(){return this._core.watching}get loading(){return this._core.loading}get error(){return this._core.error}get errorInfo(){return this._core.errorInfo}get permission(){return this._core.permission}get connectedCallbackPromise(){return this._connectedCallbackPromise}get trigger(){return this._trigger}set trigger(t){!!t&&(this._trigger=!0,this.getCurrentPosition(),this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-geo:trigger-changed",{detail:!1,bubbles:!0})))}getCurrentPosition(){return this._core.getCurrentPosition(this._options())}watchPosition(){this._core.watch(this._options())}clearWatch(){this._core.clearWatch()}_options(){return{enableHighAccuracy:this.highAccuracy,timeout:this.timeout,maximumAge:this.maximumAge}}connectedCallback(){this.style.display="none",s.autoTrigger&&(c||(c=!0,document.addEventListener("click",h))),this._core.reinitPermission(),this.manual||(this.watch?this.watchPosition():this._connectedCallbackPromise=this.getCurrentPosition())}disconnectedCallback(){this._core.clearWatch(),this._core.dispose()}}function g(e){var i;e&&("boolean"==typeof(i=e).autoTrigger&&(t.autoTrigger=i.autoTrigger),"string"==typeof i.triggerAttribute&&(t.triggerAttribute=i.triggerAttribute),i.tagNames&&Object.assign(t.tagNames,i.tagNames),r=null),customElements.get(s.tagNames.geo)||customElements.define(s.tagNames.geo,u)}export{a as GeolocationCore,o as WCS_GEO_ERROR_CODE,u as WcsGeolocation,g as bootstrapGeolocation,n 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/GeolocationCore.ts","../src/autoTrigger.ts","../src/components/Geolocation.ts","../src/bootstrapGeolocation.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 geo: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-geotarget\",\n tagNames: {\n geo: \"wcs-geo\",\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 {\n IWcBindable, GeoOptions, GeoPermissionState,\n WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail,\n} from \"../types.js\";\n\n/**\n * Headless geolocation primitive. A thin, framework-agnostic wrapper around the\n * Geolocation API exposed through the wc-bindable protocol.\n *\n * It has two phases, mirroring the two distinct shapes of the underlying API:\n * - **one-shot** — `getCurrentPosition()` resolves a single fix (like FetchCore's\n * one-shot `fetch()`), toggling `loading` around the async call.\n * - **continuous** — `watch()` / `clearWatch()` stream fixes (like TimerCore's\n * `start()` / `stop()`), toggling the `watching` flag.\n *\n * Every successful fix is published via the single `wcs-geo:position` event;\n * `latitude` / `longitude` / `accuracy` / `coords` / `timestamp` are read from\n * it through getters (mirroring how TimerCore exposes count/elapsed from one\n * `wcs-timer:tick` event), so an observer that binds any of them is notified on\n * every fix.\n *\n * Geolocation also has a permission gate absent from timer/websocket: the\n * `permission` property reflects `navigator.permissions.query({name:\n * \"geolocation\"})` (`prompt` / `granted` / `denied`, or `unsupported`) and\n * tracks its live `change` event. It is a read-only sensor — there is no\n * element-bound \"send\" path; element → state only.\n */\nexport class GeolocationCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"position\", event: \"wcs-geo:position\" },\n { name: \"latitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.latitude },\n { name: \"longitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.longitude },\n { name: \"accuracy\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.accuracy },\n { name: \"coords\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.coords },\n { name: \"timestamp\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.timestamp },\n { name: \"watching\", event: \"wcs-geo:watching-changed\" },\n { name: \"loading\", event: \"wcs-geo:loading-changed\" },\n { name: \"error\", event: \"wcs-geo:error\" },\n { name: \"permission\", event: \"wcs-geo:permission-changed\" },\n ],\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watch\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _target: EventTarget;\n private _watchId: number | null = null;\n\n private _position: WcsGeoPositionDetail | null = null;\n private _watching: boolean = false;\n private _loading: boolean = false;\n private _error: WcsGeoErrorDetail | null = null;\n private _permission: GeoPermissionState = \"prompt\";\n\n // Live PermissionStatus handle (when the Permissions API is available), kept\n // so the `change` listener can be removed on dispose().\n private _permissionStatus: PermissionStatus | null = null;\n\n // True once a permission subscription has been (or is being) established, and\n // reset by dispose(). Guards reinitPermission() so the first connect after\n // construction does not double-subscribe, while a reconnect after dispose()\n // does re-subscribe.\n private _permissionSubscribed: boolean = false;\n\n // Monotonic id of the current permission query. Bumped by every _initPermission()\n // and by dispose(). Each in-flight query captures its id and, on resolve, bails\n // unless it is still current — so a query superseded by a rapid (synchronous)\n // disconnect→reconnect, or one that resolves after dispose(), never attaches a\n // listener. A plain boolean cannot cover this: dispose()→reinit() flips it\n // false→true again, reopening the window for the stale query to slip through.\n private _permGen: number = 0;\n\n // Monotonic id of the current acquisition lifecycle, bumped only by dispose().\n // Each getCurrentPosition() captures it at start; the async success/error\n // callback bails (no setters, no resolve-side effects) if it is stale, so a\n // one-shot fix that resolves after the element was disconnected does not\n // dispatch wcs-geo:* on a torn-down element. Unlike FetchCore, the Geolocation\n // API has no AbortController, so a generation guard is the only way to neutralize\n // an in-flight one-shot. (watch is already stopped by clearWatch on disconnect.)\n private _acqGen: number = 0;\n\n // Monotonic id of the current watch lifecycle, bumped by watch(), clearWatch(),\n // and dispose(). Each watch() captures it; both watch callbacks bail if it is\n // stale. Unlike a live `_watchId === null` check, this distinguishes the current\n // watch from a superseded one: a clearWatch()→watch() restart installs a new\n // watchId (non-null), so a queued callback from the previous watch would pass a\n // null-check but fails the generation compare. (The README recommends exactly\n // this restart sequence to reconfigure a watch.)\n private _watchGen: number = 0;\n\n // Resolves once the most recent permission probe settles (or immediately when\n // the Permissions API is unsupported). The Shell exposes this as\n // connectedCallbackPromise so SSR can await the first probe before snapshotting\n // the HTML. Mirrors PermissionCore._ready.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n // Probe the permission state up front so observers see the real value\n // (granted/denied/prompt) before the first read, then keep it live.\n this._ready = this._initPermission();\n }\n\n get position(): WcsGeoPositionDetail | null {\n return this._position;\n }\n\n get latitude(): number | null {\n return this._position ? this._position.latitude : null;\n }\n\n get longitude(): number | null {\n return this._position ? this._position.longitude : null;\n }\n\n get accuracy(): number | null {\n return this._position ? this._position.accuracy : null;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._position ? this._position.coords : null;\n }\n\n get timestamp(): number | null {\n return this._position ? this._position.timestamp : null;\n }\n\n get watching(): boolean {\n return this._watching;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._error;\n }\n\n get permission(): GeoPermissionState {\n return this._permission;\n }\n\n /** Resolves once the first (or most recent) permission probe settles (§3.8). */\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // --- State setters with event dispatch ---\n\n private _setPosition(position: WcsGeoPositionDetail): void {\n this._position = position;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:position\", {\n detail: position,\n bubbles: true,\n }));\n }\n\n private _setWatching(watching: boolean): void {\n if (this._watching === watching) return;\n this._watching = watching;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:watching-changed\", {\n detail: watching,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n if (this._loading === loading) return;\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: WcsGeoErrorDetail | null): void {\n // Same-value guard, like the other setters. Unlike `position` (which has\n // derived getters and so must re-fire even on an identical reference), `error`\n // has no derived state — so suppressing redundant null→null dispatches (e.g.\n // a successful fix clearing an already-null error) avoids spurious events.\n if (this._error === error) return;\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setPermission(permission: GeoPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:permission-changed\", {\n detail: permission,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Acquire a single position fix. Resolves once the fix arrives or the request\n * fails — never rejects: failures are surfaced through the `error` property so\n * they flow into the declarative state, symmetrical with FetchCore.\n */\n getCurrentPosition(options: GeoOptions = {}): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n resolve();\n return;\n }\n\n const gen = this._acqGen;\n this._setLoading(true);\n this._setError(null);\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n // Stale: the element was disposed (disconnected) while this fix was in\n // flight. Drop it so a torn-down element never dispatches wcs-geo:*.\n // Still resolve() so any awaiter (e.g. connectedCallbackPromise) settles.\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n // Guard normalization/dispatch so a throw never escapes this browser\n // callback as an unhandled rejection, leaves the promise pending (which\n // would hang SSR's connectedCallbackPromise), or leaves `loading` stuck\n // true. Loading is cleared first so it holds even if a later step throws.\n try {\n this._setLoading(false);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n // Surface the unexpected failure as an error so observers are not left\n // silently stale, then resolve below.\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n (err) => {\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n try {\n this._setLoading(false);\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n options,\n );\n });\n }\n\n /**\n * Begin continuously watching the position. Idempotent while already\n * watching: a redundant watch() must not register a second `watchPosition`\n * (which would leak the handle and double the fix rate). Reconfiguring is done\n * via clearWatch() + watch().\n */\n watch(options: GeoOptions = {}): void {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n return;\n }\n if (this._watching) return;\n\n this._setError(null);\n this._setWatching(true);\n // Open a new watch generation so any queued callback from a prior watch\n // (cleared then restarted) is recognized as stale below.\n const wgen = ++this._watchGen;\n this._watchId = navigator.geolocation.watchPosition(\n (pos) => {\n // Stale: this callback belongs to a watch that was cleared (or the element\n // disposed), possibly already superseded by a restart. A live\n // `_watchId === null` check cannot catch the restart case (the new watch\n // re-populates _watchId), so compare the captured generation instead.\n if (wgen !== this._watchGen) return;\n // Guard normalization/dispatch so an unexpected throw never escapes this\n // browser callback as an unhandled rejection — symmetric with the one-shot\n // path.\n try {\n // A recovered fix clears any prior transient error (e.g. a one-off\n // TIMEOUT) so `error` reflects the current state, not a stale failure.\n // The _setError same-value guard makes this free when error is already\n // null.\n this._setError(null);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n (err) => {\n if (wgen !== this._watchGen) return;\n // An error does not implicitly release the watch — the watchId stays\n // valid and clearWatch() remains the teardown path — so `watching` is\n // left true to reflect \"watch still registered\". A terminal error (e.g.\n // PERMISSION_DENIED) is surfaced via the `error` property; callers that\n // want to stop on error can call clearWatch() in response.\n try {\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n options,\n );\n }\n\n clearWatch(): void {\n if (this._watchId !== null) {\n navigator.geolocation.clearWatch(this._watchId);\n this._watchId = null;\n }\n // Invalidate the current watch generation so any callback the browser may\n // still deliver after teardown bails.\n this._watchGen++;\n this._setWatching(false);\n }\n\n /**\n * Establish permission monitoring (§3.5). Idempotent: a no-op while a\n * subscription is already live (so the first connect after construction does\n * not double-subscribe), and re-subscribes after a dispose() — e.g. the Shell\n * element was disconnected and then reconnected (reparented). Returns the\n * `ready` promise, which resolves once the (re)established probe settles, so\n * the Shell can expose it as connectedCallbackPromise for SSR. Position\n * acquisition (one-shot / watch) is command-driven and the Shell drives it\n * separately from connectedCallback.\n */\n observe(): Promise<void> {\n if (!this._permissionSubscribed) {\n this._ready = this._initPermission();\n }\n return this._ready;\n }\n\n /**\n * Re-establish the permission `change` subscription after a dispose() — e.g.\n * the Shell element was disconnected and then reconnected (reparented). No-op\n * while a subscription is already live, so the first connect after\n * construction does not double-subscribe. This keeps permission tracking\n * symmetric with position acquisition, which the Shell also revives on\n * reconnect.\n *\n * Retained as a thin alias of observe() for the Shell's existing reconnect\n * path; observe() is the canonical §3.5 lifecycle entry point.\n */\n reinitPermission(): void {\n void this.observe();\n }\n\n /**\n * Detach the live permission `change` listener. Call from the Shell's\n * `disconnectedCallback` so a removed element does not leak the subscription.\n * A later reconnect can re-subscribe via reinitPermission().\n */\n dispose(): void {\n this._permissionSubscribed = false;\n // Invalidate any in-flight query so its .then() bails instead of attaching a\n // listener after teardown.\n this._permGen++;\n // Invalidate any in-flight one-shot acquisition so its success/error callback\n // bails instead of dispatching on a disconnected element.\n this._acqGen++;\n // Likewise invalidate the watch generation. The Shell already calls\n // clearWatch() before dispose(), but a direct headless dispose() (without a\n // preceding clearWatch) still neutralizes any queued watch callback.\n this._watchGen++;\n // Reset the loading shadow silently (no dispatch on a disposed element). The\n // bailed callback above will not clear it, and leaving it true would let the\n // same-value guard swallow the loading=true edge of the next acquisition after\n // a reconnect.\n this._loading = false;\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal ---\n\n private _hasGeolocation(): boolean {\n return typeof navigator !== \"undefined\" && !!navigator.geolocation;\n }\n\n private _initPermission(): Promise<void> {\n // The Permissions API is optional. When absent (or it rejects, e.g. some\n // browsers don't accept the \"geolocation\" name), report \"unsupported\" and\n // leave acquisition to fail loudly via the error property if attempted.\n if (typeof navigator === \"undefined\" || !navigator.permissions || typeof navigator.permissions.query !== \"function\") {\n // Route through _setPermission (not a bare assignment) so observers stay in\n // sync with the public state. The same-value guard means no redundant\n // dispatch when the state does not actually change; it does mean a\n // previously-observed \"granted\"/\"denied\" being reinit'd into an environment\n // that lost the Permissions API now correctly notifies observers of the\n // unsupported transition instead of silently overwriting the shadow value.\n this._setPermission(\"unsupported\");\n // No asynchronous probe to await: readiness is immediate.\n return Promise.resolve();\n }\n this._permissionSubscribed = true;\n const gen = ++this._permGen;\n return navigator.permissions.query({ name: \"geolocation\" as PermissionName }).then(\n (status) => {\n // Stale resolution: this query was superseded (rapid reconnect) or the\n // element was disposed while it was in flight. Drop it so only the current\n // subscription attaches a listener.\n if (gen !== this._permGen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as GeoPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => {\n if (gen !== this._permGen) return;\n this._setPermission(\"unsupported\");\n },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n const status = event.target as PermissionStatus;\n this._setPermission(status.state as GeoPermissionState);\n };\n\n private _normalizePosition(pos: GeolocationPosition): WcsGeoPositionDetail {\n const c = pos.coords;\n const coords: WcsGeoCoords = {\n latitude: c.latitude,\n longitude: c.longitude,\n accuracy: c.accuracy,\n altitude: c.altitude,\n altitudeAccuracy: c.altitudeAccuracy,\n heading: c.heading,\n speed: c.speed,\n };\n return { ...coords, timestamp: pos.timestamp, coords };\n }\n\n private _normalizeError(err: GeolocationPositionError): WcsGeoErrorDetail {\n return { code: err.code, message: err.message };\n }\n\n private _unsupportedError(): WcsGeoErrorDetail {\n // Geolocation API absent: surface it as POSITION_UNAVAILABLE (2) so consumers\n // that switch on the spec error codes treat it like any other unavailable fix.\n return { code: 2, message: \"Geolocation API is not available in this environment.\" };\n }\n\n private _unexpectedError(): WcsGeoErrorDetail {\n // An unexpected throw while normalizing/dispatching a fix. Surface it as\n // POSITION_UNAVAILABLE (2) so it flows into `error` like any other failure\n // instead of escaping the browser callback as an unhandled rejection.\n return { code: 2, message: \"Unexpected error while processing the position fix.\" };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsGeolocation } from \"./components/Geolocation.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 geoId = triggerElement.getAttribute(config.triggerAttribute);\n if (!geoId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // Geolocation as a value. The value import created a components/Geolocation.ts\n // ⇄ autoTrigger.ts cycle (Geolocation.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-geo> class\n // matches — without the import cycle.\n const GeoCtor = customElements.get(config.tagNames.geo);\n const geoElement = document.getElementById(geoId);\n if (!GeoCtor || !(geoElement instanceof GeoCtor)) return;\n\n // Suppress the element's default action so a fix can be requested without\n // navigating. Intentional: do not attach data-geotarget to an element whose\n // default action you also want (real <a href> link, form-submit button) — it\n // will be cancelled. See README \"Optional DOM Triggering\".\n event.preventDefault();\n (geoElement as WcsGeolocation).getCurrentPosition();\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, GeoOptions, GeoPermissionState, WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail } from \"../types.js\";\nimport { GeolocationCore } from \"../core/GeolocationCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\n// Named WcsGeolocation (not `Geolocation`) so the class does not shadow the\n// global DOM `Geolocation` interface (the type of `navigator.geolocation`), and\n// to match the <wcs-ws> convention (WcsWebSocket). The public export keeps the\n// `WcsGeolocation` name unchanged, so this rename is non-breaking.\nexport class WcsGeolocation extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...GeolocationCore.wcBindable,\n properties: [\n ...GeolocationCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-geo:trigger-changed\" },\n ],\n // Shell-level settable surface. Each input carries its mirrored `attribute`\n // hint (boolean flags reflect idempotently, so a binding system that writes\n // through inputs[].attribute is safe), following the <wcs-ws> convention.\n // `trigger` has no attribute — it is a momentary command-property, not a\n // declarative attribute. The `getCurrentPosition` / `watchPosition` /\n // `clearWatch` commands are declared below.\n inputs: [\n { name: \"highAccuracy\", attribute: \"high-accuracy\" },\n { name: \"timeout\", attribute: \"timeout\" },\n { name: \"maximumAge\", attribute: \"maximum-age\" },\n { name: \"watch\", attribute: \"watch\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n ],\n // The Core's `watch` command is renamed to `watchPosition` on the Shell so it\n // does not collide with the `watch` boolean attribute accessor (same pattern\n // as <wcs-ws>, where the `send` command becomes `sendMessage` to free the\n // `send` setter). `getCurrentPosition` / `clearWatch` are unchanged.\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watchPosition\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _core: GeolocationCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new GeolocationCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-geo:watching-changed\": (d) => ({ watching: d === true }),\n \"wcs-geo:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-geo:error\": (d) => ({ error: d != null }),\n });\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (docs/custom-state-reflection-design.md §3.4): attachInternals\n // is absent in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works, it\n // just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean) {\n if (value) {\n this.setAttribute(\"high-accuracy\", \"\");\n } else {\n this.removeAttribute(\"high-accuracy\");\n }\n }\n\n get timeout(): number {\n const attr = this.getAttribute(\"timeout\");\n if (attr === null || attr.trim() === \"\") return Infinity;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (Infinity = no timeout) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : Infinity;\n }\n\n set timeout(value: number) {\n this.setAttribute(\"timeout\", String(value));\n }\n\n get maximumAge(): number {\n const attr = this.getAttribute(\"maximum-age\");\n if (attr === null || attr.trim() === \"\") return 0;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (0 = never use a cached fix) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\n }\n\n set maximumAge(value: number) {\n this.setAttribute(\"maximum-age\", String(value));\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean) {\n if (value) {\n this.setAttribute(\"watch\", \"\");\n } else {\n this.removeAttribute(\"watch\");\n }\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 // --- Core delegated getters ---\n\n get position(): WcsGeoPositionDetail | null {\n return this._core.position;\n }\n\n get latitude(): number | null {\n return this._core.latitude;\n }\n\n get longitude(): number | null {\n return this._core.longitude;\n }\n\n get accuracy(): number | null {\n return this._core.accuracy;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._core.coords;\n }\n\n get timestamp(): number | null {\n return this._core.timestamp;\n }\n\n get watching(): boolean {\n return this._core.watching;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._core.error;\n }\n\n get permission(): GeoPermissionState {\n return this._core.permission;\n }\n\n // wc-bindable connectedCallbackPromise protocol: resolves once the connect-time\n // acquisition settles, so SSR (@wcstack/server render.ts) waits for the first\n // fix before snapshotting the HTML. Mirrors Fetch.connectedCallbackPromise. In\n // `watch` / `manual` modes there is no one-shot connect-time fix to await, so it\n // stays the default resolved promise.\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Command property ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n // Momentary command-property: a false→true write requests a single fix.\n // Mirrors the trigger flag on <wcs-timer> / <wcs-ws>. Prefer the\n // command-token protocol (`command.getCurrentPosition: $command.locate`) for\n // state-driven acquisition; this exists mainly for the DOM click trigger and\n // simple boolean bindings.\n const v = !!value;\n if (v) {\n this._trigger = true;\n // Fire-and-forget: getCurrentPosition() never rejects (failures surface via\n // the `error` property), so the returned promise is intentionally dropped.\n void this.getCurrentPosition();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-geo:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // --- Commands ---\n\n getCurrentPosition(): Promise<void> {\n return this._core.getCurrentPosition(this._options());\n }\n\n watchPosition(): void {\n this._core.watch(this._options());\n }\n\n clearWatch(): void {\n this._core.clearWatch();\n }\n\n // --- Internal ---\n\n private _options(): GeoOptions {\n return {\n enableHighAccuracy: this.highAccuracy,\n timeout: this.timeout,\n maximumAge: this.maximumAge,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // Revive permission tracking after a reconnect (reparenting). No-op on the\n // first connect since the constructor already subscribed; only re-subscribes\n // when disconnectedCallback's dispose() tore the subscription down.\n this._core.reinitPermission();\n if (!this.manual) {\n // `watch` attribute selects the default phase: continuous monitoring vs a\n // single fix on connect.\n if (this.watch) {\n this.watchPosition();\n } else {\n // Track only the one-shot connect-time fix so SSR can await it. watch /\n // manual leave the promise at its resolved default. getCurrentPosition()\n // never rejects (failures surface via `error`), so no .catch() is needed.\n this._connectedCallbackPromise = this.getCurrentPosition();\n }\n }\n }\n\n disconnectedCallback(): void {\n this._core.clearWatch();\n this._core.dispose();\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapGeolocation(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { WcsGeolocation } from \"./components/Geolocation.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.geo)) {\n customElements.define(config.tagNames.geo, WcsGeolocation);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","geo","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","GeolocationCore","EventTarget","static","protocol","version","properties","name","event","getter","e","detail","latitude","longitude","accuracy","coords","timestamp","commands","async","_target","_watchId","_position","_watching","_loading","_error","_permission","_permissionStatus","_permissionSubscribed","_permGen","_acqGen","_watchGen","_ready","Promise","resolve","constructor","target","super","this","_initPermission","position","watching","loading","error","permission","ready","_setPosition","dispatchEvent","CustomEvent","bubbles","_setWatching","_setLoading","_setError","_setPermission","getCurrentPosition","options","_hasGeolocation","_unsupportedError","gen","navigator","geolocation","pos","_normalizePosition","_unexpectedError","err","_normalizeError","watch","wgen","watchPosition","clearWatch","observe","reinitPermission","dispose","removeEventListener","_onPermissionChange","permissions","query","then","status","state","addEventListener","c","altitude","altitudeAccuracy","heading","speed","code","message","registered","handleClick","Element","triggerElement","closest","geoId","getAttribute","GeoCtor","customElements","get","geoElement","document","getElementById","preventDefault","WcsGeolocation","HTMLElement","wcBindable","inputs","attribute","_core","_trigger","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","debugStates","states","attachInternals","internals","add","delete","map","toStates","entries","debug","hasAttribute","on","toggleAttribute","highAccuracy","value","setAttribute","removeAttribute","timeout","attr","trim","Infinity","parsed","Number","isFinite","String","maximumAge","manual","connectedCallbackPromise","trigger","_options","enableHighAccuracy","connectedCallback","style","display","disconnectedCallback","bootstrapGeolocation","userConfig","partialConfig","assign","define"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/components/Geolocation.ts","../src/bootstrapGeolocation.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 geo: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-geotarget\",\n tagNames: {\n geo: \"wcs-geo\",\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","/**\n * geolocationCapabilities.ts\n *\n * Geolocation node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。geolocation は concurrent-independent(競合しない)ため lane は持たず、\n * error taxonomy(errorInfo)のみを採用する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した geolocation error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_GEO_ERROR_CODE = {\n PermissionDenied: \"permission-denied\",\n PositionUnavailable: \"position-unavailable\",\n Timeout: \"timeout\",\n} as const;\n\n/**\n * 正規化済み `GeolocationPositionError`(spec code 1/2/3)を serializable な error\n * taxonomy に写す。Core は \"unsupported\"/\"unexpected\" を code 2(position-unavailable)\n * に畳むため、これは既存の `error.code` を忠実にミラーする。permission-denied(1)だけ\n * は retry で回復しないため recoverable=false。\n */\nexport function deriveGeoErrorInfo(code: number, message: string): WcsIoErrorInfo {\n const taxonomyCode = code === 1\n ? WCS_GEO_ERROR_CODE.PermissionDenied\n : code === 3\n ? WCS_GEO_ERROR_CODE.Timeout\n : WCS_GEO_ERROR_CODE.PositionUnavailable;\n return { code: taxonomyCode, phase: \"execute\", recoverable: code !== 1, message };\n}\n","import {\n IWcBindable, GeoOptions, GeoPermissionState,\n WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail,\n} from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveGeoErrorInfo } from \"./geolocationCapabilities.js\";\n\n/**\n * Headless geolocation primitive. A thin, framework-agnostic wrapper around the\n * Geolocation API exposed through the wc-bindable protocol.\n *\n * It has two phases, mirroring the two distinct shapes of the underlying API:\n * - **one-shot** — `getCurrentPosition()` resolves a single fix (like FetchCore's\n * one-shot `fetch()`), toggling `loading` around the async call.\n * - **continuous** — `watch()` / `clearWatch()` stream fixes (like TimerCore's\n * `start()` / `stop()`), toggling the `watching` flag.\n *\n * Every successful fix is published via the single `wcs-geo:position` event;\n * `latitude` / `longitude` / `accuracy` / `coords` / `timestamp` are read from\n * it through getters (mirroring how TimerCore exposes count/elapsed from one\n * `wcs-timer:tick` event), so an observer that binds any of them is notified on\n * every fix.\n *\n * Geolocation also has a permission gate absent from timer/websocket: the\n * `permission` property reflects `navigator.permissions.query({name:\n * \"geolocation\"})` (`prompt` / `granted` / `denied`, or `unsupported`) and\n * tracks its live `change` event. It is a read-only sensor — there is no\n * element-bound \"send\" path; element → state only.\n */\nexport class GeolocationCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"position\", event: \"wcs-geo:position\" },\n { name: \"latitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.latitude },\n { name: \"longitude\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.longitude },\n { name: \"accuracy\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.accuracy },\n { name: \"coords\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.coords },\n { name: \"timestamp\", event: \"wcs-geo:position\", getter: (e: Event) => (e as CustomEvent).detail.timestamp },\n { name: \"watching\", event: \"wcs-geo:watching-changed\" },\n { name: \"loading\", event: \"wcs-geo:loading-changed\" },\n { name: \"error\", event: \"wcs-geo:error\" },\n { name: \"permission\", event: \"wcs-geo:permission-changed\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from the normalized `error` (spec code\n // 1/2/3 → permission-denied / position-unavailable / timeout); the existing\n // `error` property/event are unchanged. Fires `wcs-geo:error-info-changed`.\n { name: \"errorInfo\", event: \"wcs-geo:error-info-changed\" },\n ],\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watch\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _target: EventTarget;\n private _watchId: number | null = null;\n\n private _position: WcsGeoPositionDetail | null = null;\n private _watching: boolean = false;\n private _loading: boolean = false;\n private _error: WcsGeoErrorDetail | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _permission: GeoPermissionState = \"prompt\";\n\n // Live PermissionStatus handle (when the Permissions API is available), kept\n // so the `change` listener can be removed on dispose().\n private _permissionStatus: PermissionStatus | null = null;\n\n // True once a permission subscription has been (or is being) established, and\n // reset by dispose(). Guards reinitPermission() so the first connect after\n // construction does not double-subscribe, while a reconnect after dispose()\n // does re-subscribe.\n private _permissionSubscribed: boolean = false;\n\n // Monotonic id of the current permission query. Bumped by every _initPermission()\n // and by dispose(). Each in-flight query captures its id and, on resolve, bails\n // unless it is still current — so a query superseded by a rapid (synchronous)\n // disconnect→reconnect, or one that resolves after dispose(), never attaches a\n // listener. A plain boolean cannot cover this: dispose()→reinit() flips it\n // false→true again, reopening the window for the stale query to slip through.\n private _permGen: number = 0;\n\n // Monotonic id of the current acquisition lifecycle, bumped only by dispose().\n // Each getCurrentPosition() captures it at start; the async success/error\n // callback bails (no setters, no resolve-side effects) if it is stale, so a\n // one-shot fix that resolves after the element was disconnected does not\n // dispatch wcs-geo:* on a torn-down element. Unlike FetchCore, the Geolocation\n // API has no AbortController, so a generation guard is the only way to neutralize\n // an in-flight one-shot. (watch is already stopped by clearWatch on disconnect.)\n private _acqGen: number = 0;\n\n // Monotonic id of the current watch lifecycle, bumped by watch(), clearWatch(),\n // and dispose(). Each watch() captures it; both watch callbacks bail if it is\n // stale. Unlike a live `_watchId === null` check, this distinguishes the current\n // watch from a superseded one: a clearWatch()→watch() restart installs a new\n // watchId (non-null), so a queued callback from the previous watch would pass a\n // null-check but fails the generation compare. (The README recommends exactly\n // this restart sequence to reconfigure a watch.)\n private _watchGen: number = 0;\n\n // Resolves once the most recent permission probe settles (or immediately when\n // the Permissions API is unsupported). The Shell exposes this as\n // connectedCallbackPromise so SSR can await the first probe before snapshotting\n // the HTML. Mirrors PermissionCore._ready.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n // Probe the permission state up front so observers see the real value\n // (granted/denied/prompt) before the first read, then keep it live.\n this._ready = this._initPermission();\n }\n\n get position(): WcsGeoPositionDetail | null {\n return this._position;\n }\n\n get latitude(): number | null {\n return this._position ? this._position.latitude : null;\n }\n\n get longitude(): number | null {\n return this._position ? this._position.longitude : null;\n }\n\n get accuracy(): number | null {\n return this._position ? this._position.accuracy : null;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._position ? this._position.coords : null;\n }\n\n get timestamp(): number | null {\n return this._position ? this._position.timestamp : null;\n }\n\n get watching(): boolean {\n return this._watching;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Exposed as an additive wc-bindable property (event\n * `wcs-geo:error-info-changed`), derived from the normalized `error`; the\n * existing `error` property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get permission(): GeoPermissionState {\n return this._permission;\n }\n\n /** Resolves once the first (or most recent) permission probe settles (§3.8). */\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // --- State setters with event dispatch ---\n\n private _setPosition(position: WcsGeoPositionDetail): void {\n this._position = position;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:position\", {\n detail: position,\n bubbles: true,\n }));\n }\n\n private _setWatching(watching: boolean): void {\n if (this._watching === watching) return;\n this._watching = watching;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:watching-changed\", {\n detail: watching,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n if (this._loading === loading) return;\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: WcsGeoErrorDetail | null): void {\n // Same-value guard, like the other setters. Unlike `position` (which has\n // derived getters and so must re-fire even on an identical reference), `error`\n // has no derived state — so suppressing redundant null→null dispatches (e.g.\n // a successful fix clearing an already-null error) avoids spurious events.\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive it from\n // the normalized error (or null on clear). Fires before the `error` event so an\n // observer binding both sees the classification first, mirroring the io-node\n // family. No lane here — geolocation's fixes don't compete (dispose-only guard).\n this._commitErrorInfo(error === null ? null : deriveGeoErrorInfo(error.code, error.message));\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n private _setPermission(permission: GeoPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-geo:permission-changed\", {\n detail: permission,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Acquire a single position fix. Resolves once the fix arrives or the request\n * fails — never rejects: failures are surfaced through the `error` property so\n * they flow into the declarative state, symmetrical with FetchCore.\n */\n getCurrentPosition(options: GeoOptions = {}): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n resolve();\n return;\n }\n\n const gen = this._acqGen;\n this._setLoading(true);\n this._setError(null);\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n // Stale: the element was disposed (disconnected) while this fix was in\n // flight. Drop it so a torn-down element never dispatches wcs-geo:*.\n // Still resolve() so any awaiter (e.g. connectedCallbackPromise) settles.\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n // Guard normalization/dispatch so a throw never escapes this browser\n // callback as an unhandled rejection, leaves the promise pending (which\n // would hang SSR's connectedCallbackPromise), or leaves `loading` stuck\n // true. Loading is cleared first so it holds even if a later step throws.\n try {\n this._setLoading(false);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n // Surface the unexpected failure as an error so observers are not left\n // silently stale, then resolve below.\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n (err) => {\n if (gen !== this._acqGen) {\n resolve();\n return;\n }\n try {\n this._setLoading(false);\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n resolve();\n },\n options,\n );\n });\n }\n\n /**\n * Begin continuously watching the position. Idempotent while already\n * watching: a redundant watch() must not register a second `watchPosition`\n * (which would leak the handle and double the fix rate). Reconfiguring is done\n * via clearWatch() + watch().\n */\n watch(options: GeoOptions = {}): void {\n if (!this._hasGeolocation()) {\n this._setError(this._unsupportedError());\n return;\n }\n if (this._watching) return;\n\n this._setError(null);\n this._setWatching(true);\n // Open a new watch generation so any queued callback from a prior watch\n // (cleared then restarted) is recognized as stale below.\n const wgen = ++this._watchGen;\n this._watchId = navigator.geolocation.watchPosition(\n (pos) => {\n // Stale: this callback belongs to a watch that was cleared (or the element\n // disposed), possibly already superseded by a restart. A live\n // `_watchId === null` check cannot catch the restart case (the new watch\n // re-populates _watchId), so compare the captured generation instead.\n if (wgen !== this._watchGen) return;\n // Guard normalization/dispatch so an unexpected throw never escapes this\n // browser callback as an unhandled rejection — symmetric with the one-shot\n // path.\n try {\n // A recovered fix clears any prior transient error (e.g. a one-off\n // TIMEOUT) so `error` reflects the current state, not a stale failure.\n // The _setError same-value guard makes this free when error is already\n // null.\n this._setError(null);\n this._setPosition(this._normalizePosition(pos));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n (err) => {\n if (wgen !== this._watchGen) return;\n // An error does not implicitly release the watch — the watchId stays\n // valid and clearWatch() remains the teardown path — so `watching` is\n // left true to reflect \"watch still registered\". A terminal error (e.g.\n // PERMISSION_DENIED) is surfaced via the `error` property; callers that\n // want to stop on error can call clearWatch() in response.\n try {\n this._setError(this._normalizeError(err));\n } catch {\n this._setError(this._unexpectedError());\n }\n },\n options,\n );\n }\n\n clearWatch(): void {\n if (this._watchId !== null) {\n navigator.geolocation.clearWatch(this._watchId);\n this._watchId = null;\n }\n // Invalidate the current watch generation so any callback the browser may\n // still deliver after teardown bails.\n this._watchGen++;\n this._setWatching(false);\n }\n\n /**\n * Establish permission monitoring (§3.5). Idempotent: a no-op while a\n * subscription is already live (so the first connect after construction does\n * not double-subscribe), and re-subscribes after a dispose() — e.g. the Shell\n * element was disconnected and then reconnected (reparented). Returns the\n * `ready` promise, which resolves once the (re)established probe settles, so\n * the Shell can expose it as connectedCallbackPromise for SSR. Position\n * acquisition (one-shot / watch) is command-driven and the Shell drives it\n * separately from connectedCallback.\n */\n observe(): Promise<void> {\n if (!this._permissionSubscribed) {\n this._ready = this._initPermission();\n }\n return this._ready;\n }\n\n /**\n * Re-establish the permission `change` subscription after a dispose() — e.g.\n * the Shell element was disconnected and then reconnected (reparented). No-op\n * while a subscription is already live, so the first connect after\n * construction does not double-subscribe. This keeps permission tracking\n * symmetric with position acquisition, which the Shell also revives on\n * reconnect.\n *\n * Retained as a thin alias of observe() for the Shell's existing reconnect\n * path; observe() is the canonical §3.5 lifecycle entry point.\n */\n reinitPermission(): void {\n void this.observe();\n }\n\n /**\n * Detach the live permission `change` listener. Call from the Shell's\n * `disconnectedCallback` so a removed element does not leak the subscription.\n * A later reconnect can re-subscribe via reinitPermission().\n */\n dispose(): void {\n this._permissionSubscribed = false;\n // Invalidate any in-flight query so its .then() bails instead of attaching a\n // listener after teardown.\n this._permGen++;\n // Invalidate any in-flight one-shot acquisition so its success/error callback\n // bails instead of dispatching on a disconnected element.\n this._acqGen++;\n // Likewise invalidate the watch generation. The Shell already calls\n // clearWatch() before dispose(), but a direct headless dispose() (without a\n // preceding clearWatch) still neutralizes any queued watch callback.\n this._watchGen++;\n // Reset the loading shadow silently (no dispatch on a disposed element). The\n // bailed callback above will not clear it, and leaving it true would let the\n // same-value guard swallow the loading=true edge of the next acquisition after\n // a reconnect.\n this._loading = false;\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal ---\n\n private _hasGeolocation(): boolean {\n return typeof navigator !== \"undefined\" && !!navigator.geolocation;\n }\n\n private _initPermission(): Promise<void> {\n // The Permissions API is optional. When absent (or it rejects, e.g. some\n // browsers don't accept the \"geolocation\" name), report \"unsupported\" and\n // leave acquisition to fail loudly via the error property if attempted.\n if (typeof navigator === \"undefined\" || !navigator.permissions || typeof navigator.permissions.query !== \"function\") {\n // Route through _setPermission (not a bare assignment) so observers stay in\n // sync with the public state. The same-value guard means no redundant\n // dispatch when the state does not actually change; it does mean a\n // previously-observed \"granted\"/\"denied\" being reinit'd into an environment\n // that lost the Permissions API now correctly notifies observers of the\n // unsupported transition instead of silently overwriting the shadow value.\n this._setPermission(\"unsupported\");\n // No asynchronous probe to await: readiness is immediate.\n return Promise.resolve();\n }\n this._permissionSubscribed = true;\n const gen = ++this._permGen;\n return navigator.permissions.query({ name: \"geolocation\" as PermissionName }).then(\n (status) => {\n // Stale resolution: this query was superseded (rapid reconnect) or the\n // element was disposed while it was in flight. Drop it so only the current\n // subscription attaches a listener.\n if (gen !== this._permGen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as GeoPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => {\n if (gen !== this._permGen) return;\n this._setPermission(\"unsupported\");\n },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n const status = event.target as PermissionStatus;\n this._setPermission(status.state as GeoPermissionState);\n };\n\n private _normalizePosition(pos: GeolocationPosition): WcsGeoPositionDetail {\n const c = pos.coords;\n const coords: WcsGeoCoords = {\n latitude: c.latitude,\n longitude: c.longitude,\n accuracy: c.accuracy,\n altitude: c.altitude,\n altitudeAccuracy: c.altitudeAccuracy,\n heading: c.heading,\n speed: c.speed,\n };\n return { ...coords, timestamp: pos.timestamp, coords };\n }\n\n private _normalizeError(err: GeolocationPositionError): WcsGeoErrorDetail {\n return { code: err.code, message: err.message };\n }\n\n private _unsupportedError(): WcsGeoErrorDetail {\n // Geolocation API absent: surface it as POSITION_UNAVAILABLE (2) so consumers\n // that switch on the spec error codes treat it like any other unavailable fix.\n return { code: 2, message: \"Geolocation API is not available in this environment.\" };\n }\n\n private _unexpectedError(): WcsGeoErrorDetail {\n // An unexpected throw while normalizing/dispatching a fix. Surface it as\n // POSITION_UNAVAILABLE (2) so it flows into `error` like any other failure\n // instead of escaping the browser callback as an unhandled rejection.\n return { code: 2, message: \"Unexpected error while processing the position fix.\" };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsGeolocation } from \"./components/Geolocation.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 geoId = triggerElement.getAttribute(config.triggerAttribute);\n if (!geoId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // Geolocation as a value. The value import created a components/Geolocation.ts\n // ⇄ autoTrigger.ts cycle (Geolocation.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-geo> class\n // matches — without the import cycle.\n const GeoCtor = customElements.get(config.tagNames.geo);\n const geoElement = document.getElementById(geoId);\n if (!GeoCtor || !(geoElement instanceof GeoCtor)) return;\n\n // Suppress the element's default action so a fix can be requested without\n // navigating. Intentional: do not attach data-geotarget to an element whose\n // default action you also want (real <a href> link, form-submit button) — it\n // will be cancelled. See README \"Optional DOM Triggering\".\n event.preventDefault();\n (geoElement as WcsGeolocation).getCurrentPosition();\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, GeoOptions, GeoPermissionState, WcsGeoPositionDetail, WcsGeoCoords, WcsGeoErrorDetail } from \"../types.js\";\nimport { GeolocationCore } from \"../core/GeolocationCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\n// Named WcsGeolocation (not `Geolocation`) so the class does not shadow the\n// global DOM `Geolocation` interface (the type of `navigator.geolocation`), and\n// to match the <wcs-ws> convention (WcsWebSocket). The public export keeps the\n// `WcsGeolocation` name unchanged, so this rename is non-breaking.\nexport class WcsGeolocation extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...GeolocationCore.wcBindable,\n properties: [\n ...GeolocationCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-geo:trigger-changed\" },\n ],\n // Shell-level settable surface. Each input carries its mirrored `attribute`\n // hint (boolean flags reflect idempotently, so a binding system that writes\n // through inputs[].attribute is safe), following the <wcs-ws> convention.\n // `trigger` has no attribute — it is a momentary command-property, not a\n // declarative attribute. The `getCurrentPosition` / `watchPosition` /\n // `clearWatch` commands are declared below.\n inputs: [\n { name: \"highAccuracy\", attribute: \"high-accuracy\" },\n { name: \"timeout\", attribute: \"timeout\" },\n { name: \"maximumAge\", attribute: \"maximum-age\" },\n { name: \"watch\", attribute: \"watch\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n ],\n // The Core's `watch` command is renamed to `watchPosition` on the Shell so it\n // does not collide with the `watch` boolean attribute accessor (same pattern\n // as <wcs-ws>, where the `send` command becomes `sendMessage` to free the\n // `send` setter). `getCurrentPosition` / `clearWatch` are unchanged.\n commands: [\n { name: \"getCurrentPosition\", async: true },\n { name: \"watchPosition\" },\n { name: \"clearWatch\" },\n ],\n };\n\n private _core: GeolocationCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new GeolocationCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-geo:watching-changed\": (d) => ({ watching: d === true }),\n \"wcs-geo:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-geo:error\": (d) => ({ error: d != null }),\n });\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (docs/custom-state-reflection-design.md §3.4): attachInternals\n // is absent in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works, it\n // just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean) {\n if (value) {\n this.setAttribute(\"high-accuracy\", \"\");\n } else {\n this.removeAttribute(\"high-accuracy\");\n }\n }\n\n get timeout(): number {\n const attr = this.getAttribute(\"timeout\");\n if (attr === null || attr.trim() === \"\") return Infinity;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (Infinity = no timeout) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : Infinity;\n }\n\n set timeout(value: number) {\n this.setAttribute(\"timeout\", String(value));\n }\n\n get maximumAge(): number {\n const attr = this.getAttribute(\"maximum-age\");\n if (attr === null || attr.trim() === \"\") return 0;\n // Strict parse via Number() (unlike parseInt, \"10px\" -> NaN, not 10). Fall\n // back to the API default (0 = never use a cached fix) for any non-finite or\n // negative value, matching the README \"invalid values fall back to default\".\n const parsed = Number(attr);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\n }\n\n set maximumAge(value: number) {\n this.setAttribute(\"maximum-age\", String(value));\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean) {\n if (value) {\n this.setAttribute(\"watch\", \"\");\n } else {\n this.removeAttribute(\"watch\");\n }\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 // --- Core delegated getters ---\n\n get position(): WcsGeoPositionDetail | null {\n return this._core.position;\n }\n\n get latitude(): number | null {\n return this._core.latitude;\n }\n\n get longitude(): number | null {\n return this._core.longitude;\n }\n\n get accuracy(): number | null {\n return this._core.accuracy;\n }\n\n get coords(): WcsGeoCoords | null {\n return this._core.coords;\n }\n\n get timestamp(): number | null {\n return this._core.timestamp;\n }\n\n get watching(): boolean {\n return this._core.watching;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): WcsGeoErrorDetail | null {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get permission(): GeoPermissionState {\n return this._core.permission;\n }\n\n // wc-bindable connectedCallbackPromise protocol: resolves once the connect-time\n // acquisition settles, so SSR (@wcstack/server render.ts) waits for the first\n // fix before snapshotting the HTML. Mirrors Fetch.connectedCallbackPromise. In\n // `watch` / `manual` modes there is no one-shot connect-time fix to await, so it\n // stays the default resolved promise.\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Command property ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n // Momentary command-property: a false→true write requests a single fix.\n // Mirrors the trigger flag on <wcs-timer> / <wcs-ws>. Prefer the\n // command-token protocol (`command.getCurrentPosition: $command.locate`) for\n // state-driven acquisition; this exists mainly for the DOM click trigger and\n // simple boolean bindings.\n const v = !!value;\n if (v) {\n this._trigger = true;\n // Fire-and-forget: getCurrentPosition() never rejects (failures surface via\n // the `error` property), so the returned promise is intentionally dropped.\n void this.getCurrentPosition();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-geo:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // --- Commands ---\n\n getCurrentPosition(): Promise<void> {\n return this._core.getCurrentPosition(this._options());\n }\n\n watchPosition(): void {\n this._core.watch(this._options());\n }\n\n clearWatch(): void {\n this._core.clearWatch();\n }\n\n // --- Internal ---\n\n private _options(): GeoOptions {\n return {\n enableHighAccuracy: this.highAccuracy,\n timeout: this.timeout,\n maximumAge: this.maximumAge,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // Revive permission tracking after a reconnect (reparenting). No-op on the\n // first connect since the constructor already subscribed; only re-subscribes\n // when disconnectedCallback's dispose() tore the subscription down.\n this._core.reinitPermission();\n if (!this.manual) {\n // `watch` attribute selects the default phase: continuous monitoring vs a\n // single fix on connect.\n if (this.watch) {\n this.watchPosition();\n } else {\n // Track only the one-shot connect-time fix so SSR can await it. watch /\n // manual leave the promise at its resolved default. getCurrentPosition()\n // never rejects (failures surface via `error`), so no .catch() is needed.\n this._connectedCallbackPromise = this.getCurrentPosition();\n }\n }\n }\n\n disconnectedCallback(): void {\n this._core.clearWatch();\n this._core.dispose();\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapGeolocation(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { WcsGeolocation } from \"./components/Geolocation.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.geo)) {\n customElements.define(config.tagNames.geo, WcsGeolocation);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","geo","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","WCS_GEO_ERROR_CODE","PermissionDenied","PositionUnavailable","Timeout","GeolocationCore","EventTarget","static","protocol","version","properties","name","event","getter","e","detail","latitude","longitude","accuracy","coords","timestamp","commands","async","_target","_watchId","_position","_watching","_loading","_error","_errorInfo","_permission","_permissionStatus","_permissionSubscribed","_permGen","_acqGen","_watchGen","_ready","Promise","resolve","constructor","target","super","this","_initPermission","position","watching","loading","error","errorInfo","permission","ready","_setPosition","dispatchEvent","CustomEvent","bubbles","_setWatching","_setLoading","_setError","code","message","_commitErrorInfo","phase","recoverable","info","_setPermission","getCurrentPosition","options","_hasGeolocation","_unsupportedError","gen","navigator","geolocation","pos","_normalizePosition","_unexpectedError","err","_normalizeError","watch","wgen","watchPosition","clearWatch","observe","reinitPermission","dispose","removeEventListener","_onPermissionChange","permissions","query","then","status","state","addEventListener","c","altitude","altitudeAccuracy","heading","speed","registered","handleClick","Element","triggerElement","closest","geoId","getAttribute","GeoCtor","customElements","get","geoElement","document","getElementById","preventDefault","WcsGeolocation","HTMLElement","wcBindable","inputs","attribute","_core","_trigger","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","debugStates","states","attachInternals","internals","add","delete","map","toStates","entries","debug","hasAttribute","on","toggleAttribute","highAccuracy","value","setAttribute","removeAttribute","timeout","attr","trim","Infinity","parsed","Number","isFinite","String","maximumAge","manual","connectedCallbackPromise","trigger","_options","enableHighAccuracy","connectedCallback","style","display","disconnectedCallback","bootstrapGeolocation","userConfig","partialConfig","assign","define"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wcstack/geolocation",
3
- "version": "1.20.0",
3
+ "version": "1.21.1",
4
4
  "description": "Declarative geolocation component for Web Components. Framework-agnostic Geolocation API primitive via wc-bindable-protocol.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.esm.js",