@wcstack/geolocation 1.23.0 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +17 -0
- package/dist/index.esm.js +56 -12
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -9,10 +9,27 @@ interface WcsIoErrorInfo {
|
|
|
9
9
|
readonly message: string;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Observation semantics of a `properties` entry.
|
|
14
|
+
*
|
|
15
|
+
* "state" — current value. A snapshot may cache it, and equality-based dedupe is safe.
|
|
16
|
+
* "event" — occurrence. Repeated identical payloads are distinct occurrences; never dedupe.
|
|
17
|
+
* "handle" — live / opaque resource with its own lifecycle (e.g. MediaStream). Not
|
|
18
|
+
* snapshot-safe and not necessarily serializable; consumers need an explicit
|
|
19
|
+
* ref / callback surface rather than a value slot.
|
|
20
|
+
*/
|
|
21
|
+
type WcBindableSemantics = "state" | "event" | "handle";
|
|
12
22
|
interface IWcBindableProperty {
|
|
13
23
|
readonly name: string;
|
|
14
24
|
readonly event: string;
|
|
15
25
|
readonly getter?: (event: Event) => any;
|
|
26
|
+
/**
|
|
27
|
+
* Optional, additive, forward-compatible. An absent value means **unspecified**, NOT
|
|
28
|
+
* "state": a reader that finds no `semantics` MUST keep the behavior it had before this
|
|
29
|
+
* field existed (deliver the update as-is; do not start deduping, caching or serializing
|
|
30
|
+
* on assumption). Only an explicit value licenses a reader to change its handling.
|
|
31
|
+
*/
|
|
32
|
+
readonly semantics?: WcBindableSemantics;
|
|
16
33
|
}
|
|
17
34
|
interface IWcBindableInput {
|
|
18
35
|
readonly name: string;
|
package/dist/index.esm.js
CHANGED
|
@@ -100,21 +100,21 @@ class GeolocationCore extends EventTarget {
|
|
|
100
100
|
protocol: "wc-bindable",
|
|
101
101
|
version: 1,
|
|
102
102
|
properties: [
|
|
103
|
-
{ name: "position", event: "wcs-geo:position" },
|
|
104
|
-
{ name: "latitude", event: "wcs-geo:position", getter: (e) => e.detail.latitude },
|
|
105
|
-
{ name: "longitude", event: "wcs-geo:position", getter: (e) => e.detail.longitude },
|
|
106
|
-
{ name: "accuracy", event: "wcs-geo:position", getter: (e) => e.detail.accuracy },
|
|
107
|
-
{ name: "coords", event: "wcs-geo:position", getter: (e) => e.detail.coords },
|
|
108
|
-
{ name: "timestamp", event: "wcs-geo:position", getter: (e) => e.detail.timestamp },
|
|
109
|
-
{ name: "watching", event: "wcs-geo:watching-changed" },
|
|
110
|
-
{ name: "loading", event: "wcs-geo:loading-changed" },
|
|
111
|
-
{ name: "error", event: "wcs-geo:error" },
|
|
112
|
-
{ name: "permission", event: "wcs-geo:permission-changed" },
|
|
103
|
+
{ name: "position", event: "wcs-geo:position", semantics: "state" },
|
|
104
|
+
{ name: "latitude", event: "wcs-geo:position", semantics: "state", getter: (e) => e.detail.latitude },
|
|
105
|
+
{ name: "longitude", event: "wcs-geo:position", semantics: "state", getter: (e) => e.detail.longitude },
|
|
106
|
+
{ name: "accuracy", event: "wcs-geo:position", semantics: "state", getter: (e) => e.detail.accuracy },
|
|
107
|
+
{ name: "coords", event: "wcs-geo:position", semantics: "state", getter: (e) => e.detail.coords },
|
|
108
|
+
{ name: "timestamp", event: "wcs-geo:position", semantics: "state", getter: (e) => e.detail.timestamp },
|
|
109
|
+
{ name: "watching", event: "wcs-geo:watching-changed", semantics: "state" },
|
|
110
|
+
{ name: "loading", event: "wcs-geo:loading-changed", semantics: "state" },
|
|
111
|
+
{ name: "error", event: "wcs-geo:error", semantics: "state" },
|
|
112
|
+
{ name: "permission", event: "wcs-geo:permission-changed", semantics: "state" },
|
|
113
113
|
// Serializable failure taxonomy (stable code / phase / recoverable), or null.
|
|
114
114
|
// Additive bindable output derived from the normalized `error` (spec code
|
|
115
115
|
// 1/2/3 → permission-denied / position-unavailable / timeout); the existing
|
|
116
116
|
// `error` property/event are unchanged. Fires `wcs-geo:error-info-changed`.
|
|
117
|
-
{ name: "errorInfo", event: "wcs-geo:error-info-changed" },
|
|
117
|
+
{ name: "errorInfo", event: "wcs-geo:error-info-changed", semantics: "state" },
|
|
118
118
|
],
|
|
119
119
|
commands: [
|
|
120
120
|
{ name: "getCurrentPosition", async: true },
|
|
@@ -559,6 +559,48 @@ function registerAutoTrigger() {
|
|
|
559
559
|
document.addEventListener("click", handleClick);
|
|
560
560
|
}
|
|
561
561
|
|
|
562
|
+
// ===========================================================================
|
|
563
|
+
// AUTO-GENERATED FILE - DO NOT EDIT.
|
|
564
|
+
// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.
|
|
565
|
+
// Run `node scripts/sync-protocol-types.mjs` after editing the source.
|
|
566
|
+
// ===========================================================================
|
|
567
|
+
function hasAccessorOnPrototype(target, name) {
|
|
568
|
+
let proto = Object.getPrototypeOf(target);
|
|
569
|
+
while (proto !== null) {
|
|
570
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, name);
|
|
571
|
+
if (descriptor !== undefined) {
|
|
572
|
+
return typeof descriptor.get === "function" || typeof descriptor.set === "function";
|
|
573
|
+
}
|
|
574
|
+
proto = Object.getPrototypeOf(proto);
|
|
575
|
+
}
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で
|
|
580
|
+
* accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。
|
|
581
|
+
*
|
|
582
|
+
* - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。
|
|
583
|
+
* - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。
|
|
584
|
+
* - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。
|
|
585
|
+
*/
|
|
586
|
+
function upgradeProperties(element) {
|
|
587
|
+
const declaration = element.constructor?.wcBindable;
|
|
588
|
+
const inputs = declaration?.inputs;
|
|
589
|
+
if (inputs === undefined)
|
|
590
|
+
return;
|
|
591
|
+
for (const input of inputs) {
|
|
592
|
+
const name = input.name;
|
|
593
|
+
if (!Object.prototype.hasOwnProperty.call(element, name))
|
|
594
|
+
continue;
|
|
595
|
+
if (!hasAccessorOnPrototype(element, name))
|
|
596
|
+
continue;
|
|
597
|
+
const record = element;
|
|
598
|
+
const value = record[name];
|
|
599
|
+
delete record[name];
|
|
600
|
+
record[name] = value;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
562
604
|
// Named WcsGeolocation (not `Geolocation`) so the class does not shadow the
|
|
563
605
|
// global DOM `Geolocation` interface (the type of `navigator.geolocation`), and
|
|
564
606
|
// to match the <wcs-ws> convention (WcsWebSocket). The public export keeps the
|
|
@@ -569,7 +611,7 @@ class WcsGeolocation extends HTMLElement {
|
|
|
569
611
|
...GeolocationCore.wcBindable,
|
|
570
612
|
properties: [
|
|
571
613
|
...GeolocationCore.wcBindable.properties,
|
|
572
|
-
{ name: "trigger", event: "wcs-geo:trigger-changed" },
|
|
614
|
+
{ name: "trigger", event: "wcs-geo:trigger-changed", semantics: "state" },
|
|
573
615
|
],
|
|
574
616
|
// Shell-level settable surface. Each input carries its mirrored `attribute`
|
|
575
617
|
// hint (boolean flags reflect idempotently, so a binding system that writes
|
|
@@ -802,6 +844,8 @@ class WcsGeolocation extends HTMLElement {
|
|
|
802
844
|
}
|
|
803
845
|
// --- Lifecycle ---
|
|
804
846
|
connectedCallback() {
|
|
847
|
+
// upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)
|
|
848
|
+
upgradeProperties(this);
|
|
805
849
|
this.style.display = "none";
|
|
806
850
|
if (config.autoTrigger) {
|
|
807
851
|
registerAutoTrigger();
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.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\", semantics: \"state\" },\n { name: \"latitude\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.latitude },\n { name: \"longitude\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.longitude },\n { name: \"accuracy\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.accuracy },\n { name: \"coords\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.coords },\n { name: \"timestamp\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.timestamp },\n { name: \"watching\", event: \"wcs-geo:watching-changed\", semantics: \"state\" },\n { name: \"loading\", event: \"wcs-geo:loading-changed\", semantics: \"state\" },\n { name: \"error\", event: \"wcs-geo:error\", semantics: \"state\" },\n { name: \"permission\", event: \"wcs-geo:permission-changed\", semantics: \"state\" },\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\", semantics: \"state\" },\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","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// custom element の property upgrade — `static wcBindable.inputs` に宣言した入力のうち、\n// 要素が upgrade される前に代入された own データプロパティを取り込み直す。\n//\n// なぜ必要か:\n// 未定義タグの要素は素の HTMLElement なので、`el.url = \"...\"` は own データプロパティを作る。\n// upgrade 後にクラスの accessor が prototype へ入っても own プロパティが優先されるため、\n// setter は二度と呼ばれず、値は要素へ届かないまま消える(エラーも警告も出ない)。\n// 常にプロパティ代入を行う framework(Angular の `[prop]`、Lit の `.prop=`、\n// Solid の `prop:`、Vue の `.prop` 修飾子)× 遅延定義(autoloader / CDN / code-split)で\n// 常態的に起きる。docs/architecture-hardening/13-framework-adapter-binding-constraints.md §1.2。\n//\n// 安全側の判定:\n// own プロパティがあっても、prototype チェーンに accessor が無ければ「シャドウ」ではなく\n// その own プロパティ自体が正規の格納先なので触らない(public class field を壊さない)。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/upgrade-properties.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/upgradeProperties.ts). Those copies are generated — do not edit them.\nimport { IWcBindable } from \"./wcBindable.js\";\n\nfunction hasAccessorOnPrototype(target: object, name: string): boolean {\n let proto = Object.getPrototypeOf(target);\n while (proto !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n if (descriptor !== undefined) {\n return typeof descriptor.get === \"function\" || typeof descriptor.set === \"function\";\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n */\nexport function upgradeProperties(element: object): void {\n const declaration = (element as { constructor?: { wcBindable?: IWcBindable } }).constructor?.wcBindable;\n const inputs = declaration?.inputs;\n if (inputs === undefined) return;\n for (const input of inputs) {\n const name = input.name;\n if (!Object.prototype.hasOwnProperty.call(element, name)) continue;\n if (!hasAccessorOnPrototype(element, name)) continue;\n const record = element as Record<string, unknown>;\n const value = record[name];\n delete record[name];\n record[name] = value;\n }\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\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.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\", semantics: \"state\" },\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 // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\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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"}
|
package/dist/index.esm.min.js
CHANGED
|
@@ -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 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};
|
|
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}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",semantics:"state"},{name:"latitude",event:"wcs-geo:position",semantics:"state",getter:t=>t.detail.latitude},{name:"longitude",event:"wcs-geo:position",semantics:"state",getter:t=>t.detail.longitude},{name:"accuracy",event:"wcs-geo:position",semantics:"state",getter:t=>t.detail.accuracy},{name:"coords",event:"wcs-geo:position",semantics:"state",getter:t=>t.detail.coords},{name:"timestamp",event:"wcs-geo:position",semantics:"state",getter:t=>t.detail.timestamp},{name:"watching",event:"wcs-geo:watching-changed",semantics:"state"},{name:"loading",event:"wcs-geo:loading-changed",semantics:"state"},{name:"error",event:"wcs-geo:error",semantics:"state"},{name:"permission",event:"wcs-geo:permission-changed",semantics:"state"},{name:"errorInfo",event:"wcs-geo:error-info-changed",semantics:"state"}],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(`[${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())}function u(t,e){let i=Object.getPrototypeOf(t);for(;null!==i;){const t=Object.getOwnPropertyDescriptor(i,e);if(void 0!==t)return"function"==typeof t.get||"function"==typeof t.set;i=Object.getPrototypeOf(i)}return!1}class g extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...a.wcBindable,properties:[...a.wcBindable.properties,{name:"trigger",event:"wcs-geo:trigger-changed",semantics:"state"}],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,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 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(){!function(t){const e=t.constructor?.wcBindable,i=e?.inputs;if(void 0!==i)for(const e of i){const i=e.name;if(!Object.prototype.hasOwnProperty.call(t,i))continue;if(!u(t,i))continue;const s=t,r=s[i];delete s[i],s[i]=r}}(this),this.style.display="none",r.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 l(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,g)}export{a as GeolocationCore,o as WCS_GEO_ERROR_CODE,g as WcsGeolocation,l 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/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":"AAUA,MAAMA,EAA2B,CAC/BC,aAAa,EACbC,iBAAkB,iBAClBC,SAAU,CACRC,IAAK,YAIT,SAASC,EAAcC,GACrB,GAAY,OAARA,GAA+B,iBAARA,EAAkB,OAAOA,EACpDC,OAAOC,OAAOF,GACd,IAAK,MAAMG,KAAOF,OAAOG,KAAKJ,GAC5BD,EAAYC,EAAgCG,IAE9C,OAAOH,CACT,CAEA,SAASK,EAAaL,GACpB,GAAY,OAARA,GAA+B,iBAARA,EAAkB,OAAOA,EACpD,MAAMM,EAAiC,CAAA,EACvC,IAAK,MAAMH,KAAOF,OAAOG,KAAKJ,GAC5BM,EAAMH,GAAOE,EAAWL,EAAgCG,IAE1D,OAAOG,CACT,CAEA,IAAIC,EAA+B,KAE5B,MAAMC,EAAkBd,WAEfe,IAId,OAHKF,IACHA,EAAeR,EAAWM,EAAUX,KAE/Ba,CACT,CCjCO,MAAMG,EAAqB,CAChCC,iBAAkB,oBAClBC,oBAAqB,uBACrBC,QAAS,WCcL,MAAOC,UAAwBC,YACnCC,kBAAiC,CAC/BC,SAAU,cACVC,QAAS,EACTC,WAAY,CACV,CAAEC,KAAM,WAAYC,MAAO,oBAC3B,CAAED,KAAM,WAAYC,MAAO,mBAAoBC,OAASC,GAAcA,EAAkBC,OAAOC,UAC/F,CAAEL,KAAM,YAAaC,MAAO,mBAAoBC,OAASC,GAAcA,EAAkBC,OAAOE,WAChG,CAAEN,KAAM,WAAYC,MAAO,mBAAoBC,OAASC,GAAcA,EAAkBC,OAAOG,UAC/F,CAAEP,KAAM,SAAUC,MAAO,mBAAoBC,OAASC,GAAcA,EAAkBC,OAAOI,QAC7F,CAAER,KAAM,YAAaC,MAAO,mBAAoBC,OAASC,GAAcA,EAAkBC,OAAOK,WAChG,CAAET,KAAM,WAAYC,MAAO,4BAC3B,CAAED,KAAM,UAAWC,MAAO,2BAC1B,CAAED,KAAM,QAASC,MAAO,iBACxB,CAAED,KAAM,aAAcC,MAAO,8BAK7B,CAAED,KAAM,YAAaC,MAAO,+BAE9BS,SAAU,CACR,CAAEV,KAAM,qBAAsBW,OAAO,GACrC,CAAEX,KAAM,SACR,CAAEA,KAAM,gBAIJY,QACAC,SAA0B,KAE1BC,UAAyC,KACzCC,WAAqB,EACrBC,UAAoB,EACpBC,OAAmC,KACnCC,WAAoC,KACpCC,YAAkC,SAIlCC,kBAA6C,KAM7CC,uBAAiC,EAQjCC,SAAmB,EASnBC,QAAkB,EASlBC,UAAoB,EAMpBC,OAAwBC,QAAQC,UAExC,WAAAC,CAAYC,GACVC,QACAC,KAAKnB,QAAUiB,GAAUE,KAGzBA,KAAKN,OAASM,KAAKC,iBACrB,CAEA,YAAIC,GACF,OAAOF,KAAKjB,SACd,CAEA,YAAIT,GACF,OAAO0B,KAAKjB,UAAYiB,KAAKjB,UAAUT,SAAW,IACpD,CAEA,aAAIC,GACF,OAAOyB,KAAKjB,UAAYiB,KAAKjB,UAAUR,UAAY,IACrD,CAEA,YAAIC,GACF,OAAOwB,KAAKjB,UAAYiB,KAAKjB,UAAUP,SAAW,IACpD,CAEA,UAAIC,GACF,OAAOuB,KAAKjB,UAAYiB,KAAKjB,UAAUN,OAAS,IAClD,CAEA,aAAIC,GACF,OAAOsB,KAAKjB,UAAYiB,KAAKjB,UAAUL,UAAY,IACrD,CAEA,YAAIyB,GACF,OAAOH,KAAKhB,SACd,CAEA,WAAIoB,GACF,OAAOJ,KAAKf,QACd,CAEA,SAAIoB,GACF,OAAOL,KAAKd,MACd,CAQA,aAAIoB,GACF,OAAON,KAAKb,UACd,CAEA,cAAIoB,GACF,OAAOP,KAAKZ,WACd,CAGA,SAAIoB,GACF,OAAOR,KAAKN,MACd,CAIQ,YAAAe,CAAaP,GACnBF,KAAKjB,UAAYmB,EACjBF,KAAKnB,QAAQ6B,cAAc,IAAIC,YAAY,mBAAoB,CAC7DtC,OAAQ6B,EACRU,SAAS,IAEb,CAEQ,YAAAC,CAAaV,GACfH,KAAKhB,YAAcmB,IACvBH,KAAKhB,UAAYmB,EACjBH,KAAKnB,QAAQ6B,cAAc,IAAIC,YAAY,2BAA4B,CACrEtC,OAAQ8B,EACRS,SAAS,KAEb,CAEQ,WAAAE,CAAYV,GACdJ,KAAKf,WAAamB,IACtBJ,KAAKf,SAAWmB,EAChBJ,KAAKnB,QAAQ6B,cAAc,IAAIC,YAAY,0BAA2B,CACpEtC,OAAQ+B,EACRQ,SAAS,KAEb,CAEQ,SAAAG,CAAUV,GDhLd,IAA6BW,EAAcC,ECqLzCjB,KAAKd,SAAWmB,IACpBL,KAAKd,OAASmB,EAKdL,KAAKkB,iBAA2B,OAAVb,EAAiB,MD3LRW,EC2LkCX,EAAMW,KD3L1BC,EC2LgCZ,EAAMY,QDrL9E,CAAED,KALqB,IAATA,EACjBzD,EAAmBC,iBACV,IAATwD,EACEzD,EAAmBG,QACnBH,EAAmBE,oBACI0D,MAAO,UAAWC,YAAsB,IAATJ,EAAYC,aCsLtEjB,KAAKnB,QAAQ6B,cAAc,IAAIC,YAAY,gBAAiB,CAC1DtC,OAAQgC,EACRO,SAAS,KAEb,CAKQ,gBAAAM,CAAiBG,GACvBrB,KAAKb,WAAakC,EAClBrB,KAAKnB,QAAQ6B,cAAc,IAAIC,YAAY,6BAA8B,CACvEtC,OAAQgD,EACRT,SAAS,IAEb,CAEQ,cAAAU,CAAef,GACjBP,KAAKZ,cAAgBmB,IACzBP,KAAKZ,YAAcmB,EACnBP,KAAKnB,QAAQ6B,cAAc,IAAIC,YAAY,6BAA8B,CACvEtC,OAAQkC,EACRK,SAAS,KAEb,CASA,kBAAAW,CAAmBC,EAAsB,IACvC,OAAO,IAAI7B,QAAeC,IACxB,IAAKI,KAAKyB,kBAGR,OAFAzB,KAAKe,UAAUf,KAAK0B,0BACpB9B,IAIF,MAAM+B,EAAM3B,KAAKR,QACjBQ,KAAKc,aAAY,GACjBd,KAAKe,UAAU,MACfa,UAAUC,YAAYN,mBACnBO,IAIC,GAAIH,IAAQ3B,KAAKR,QAAjB,CAQA,IACEQ,KAAKc,aAAY,GACjBd,KAAKS,aAAaT,KAAK+B,mBAAmBD,GAC5C,CAAE,MAGA9B,KAAKe,UAAUf,KAAKgC,mBACtB,CACApC,GAbA,MAFEA,KAiBHqC,IACC,GAAIN,IAAQ3B,KAAKR,QAAjB,CAIA,IACEQ,KAAKc,aAAY,GACjBd,KAAKe,UAAUf,KAAKkC,gBAAgBD,GACtC,CAAE,MACAjC,KAAKe,UAAUf,KAAKgC,mBACtB,CACApC,GAPA,MAFEA,KAWJ4B,IAGN,CAQA,KAAAW,CAAMX,EAAsB,IAC1B,IAAKxB,KAAKyB,kBAER,YADAzB,KAAKe,UAAUf,KAAK0B,qBAGtB,GAAI1B,KAAKhB,UAAW,OAEpBgB,KAAKe,UAAU,MACff,KAAKa,cAAa,GAGlB,MAAMuB,IAASpC,KAAKP,UACpBO,KAAKlB,SAAW8C,UAAUC,YAAYQ,cACnCP,IAKC,GAAIM,IAASpC,KAAKP,UAIlB,IAKEO,KAAKe,UAAU,MACff,KAAKS,aAAaT,KAAK+B,mBAAmBD,GAC5C,CAAE,MACA9B,KAAKe,UAAUf,KAAKgC,mBACtB,GAEDC,IACC,GAAIG,IAASpC,KAAKP,UAMlB,IACEO,KAAKe,UAAUf,KAAKkC,gBAAgBD,GACtC,CAAE,MACAjC,KAAKe,UAAUf,KAAKgC,mBACtB,GAEFR,EAEJ,CAEA,UAAAc,GACwB,OAAlBtC,KAAKlB,WACP8C,UAAUC,YAAYS,WAAWtC,KAAKlB,UACtCkB,KAAKlB,SAAW,MAIlBkB,KAAKP,YACLO,KAAKa,cAAa,EACpB,CAYA,OAAA0B,GAIE,OAHKvC,KAAKV,wBACRU,KAAKN,OAASM,KAAKC,mBAEdD,KAAKN,MACd,CAaA,gBAAA8C,GACOxC,KAAKuC,SACZ,CAOA,OAAAE,GACEzC,KAAKV,uBAAwB,EAG7BU,KAAKT,WAGLS,KAAKR,UAILQ,KAAKP,YAKLO,KAAKf,UAAW,EACZe,KAAKX,oBACPW,KAAKX,kBAAkBqD,oBAAoB,SAAU1C,KAAK2C,qBAC1D3C,KAAKX,kBAAoB,KAE7B,CAIQ,eAAAoC,GACN,MAA4B,oBAAdG,aAA+BA,UAAUC,WACzD,CAEQ,eAAA5B,GAIN,GAAyB,oBAAd2B,YAA8BA,UAAUgB,aAAsD,mBAAhChB,UAAUgB,YAAYC,MAS7F,OAFA7C,KAAKsB,eAAe,eAEb3B,QAAQC,UAEjBI,KAAKV,uBAAwB,EAC7B,MAAMqC,IAAQ3B,KAAKT,SACnB,OAAOqC,UAAUgB,YAAYC,MAAM,CAAE5E,KAAM,gBAAmC6E,KAC3EC,IAIKpB,IAAQ3B,KAAKT,WACjBS,KAAKX,kBAAoB0D,EACzB/C,KAAKsB,eAAeyB,EAAOC,OAC3BD,EAAOE,iBAAiB,SAAUjD,KAAK2C,uBAEzC,KACMhB,IAAQ3B,KAAKT,UACjBS,KAAKsB,eAAe,gBAG1B,CAEQqB,oBAAuBzE,IAC7B,MAAM6E,EAAS7E,EAAM4B,OACrBE,KAAKsB,eAAeyB,EAAOC,QAGrB,kBAAAjB,CAAmBD,GACzB,MAAMoB,EAAIpB,EAAIrD,OACRA,EAAuB,CAC3BH,SAAU4E,EAAE5E,SACZC,UAAW2E,EAAE3E,UACbC,SAAU0E,EAAE1E,SACZ2E,SAAUD,EAAEC,SACZC,iBAAkBF,EAAEE,iBACpBC,QAASH,EAAEG,QACXC,MAAOJ,EAAEI,OAEX,MAAO,IAAK7E,EAAQC,UAAWoD,EAAIpD,UAAWD,SAChD,CAEQ,eAAAyD,CAAgBD,GACtB,MAAO,CAAEjB,KAAMiB,EAAIjB,KAAMC,QAASgB,EAAIhB,QACxC,CAEQ,iBAAAS,GAGN,MAAO,CAAEV,KAAM,EAAGC,QAAS,wDAC7B,CAEQ,gBAAAe,GAIN,MAAO,CAAEhB,KAAM,EAAGC,QAAS,sDAC7B,EC/eF,IAAIsC,GAAa,EAEjB,SAASC,EAAYtF,GACnB,MAAM4B,EAAS5B,EAAM4B,OACrB,KAAMA,aAAkB2D,SAAU,OAElC,MAAMC,EAAiB5D,EAAO6D,QAAiB,IAAItG,EAAOZ,qBAC1D,IAAKiH,EAAgB,OAErB,MAAME,EAAQF,EAAeG,aAAaxG,EAAOZ,kBACjD,IAAKmH,EAAO,OAQZ,MAAME,EAAUC,eAAeC,IAAI3G,EAAOX,SAASC,KAC7CsH,EAAaC,SAASC,eAAeP,GACtCE,GAAaG,aAAsBH,IAMxC5F,EAAMkG,iBACLH,EAA8B1C,qBACjC,CCrBM,MAAO8C,UAAuBC,YAClCzG,oCAAqC,EACrCA,kBAAiC,IAC5BF,EAAgB4G,WACnBvG,WAAY,IACPL,EAAgB4G,WAAWvG,WAC9B,CAAEC,KAAM,UAAWC,MAAO,4BAQ5BsG,OAAQ,CACN,CAAEvG,KAAM,eAAgBwG,UAAW,iBACnC,CAAExG,KAAM,UAAWwG,UAAW,WAC9B,CAAExG,KAAM,aAAcwG,UAAW,eACjC,CAAExG,KAAM,QAASwG,UAAW,SAC5B,CAAExG,KAAM,SAAUwG,UAAW,UAC7B,CAAExG,KAAM,YAMVU,SAAU,CACR,CAAEV,KAAM,qBAAsBW,OAAO,GACrC,CAAEX,KAAM,iBACR,CAAEA,KAAM,gBAIJyG,MACAC,UAAoB,EACpBC,0BAA2CjF,QAAQC,UACnDiF,WAAsC,KAE9C,WAAAhF,GACEE,QACAC,KAAK0E,MAAQ,IAAI/G,EAAgBqC,MACjCA,KAAK6E,WAAa7E,KAAK8E,iBACvB9E,KAAK+E,YAAY,CACf,2BAA6BC,IAAC,CAAQ7E,UAAgB,IAAN6E,IAChD,0BAA4BA,IAAC,CAAQ5E,SAAe,IAAN4E,IAC9C,gBAAkBA,IAAC,CAAQ3E,MAAY,MAAL2E,KAEtC,CAMA,eAAIC,GACF,OAAOjF,KAAK6E,WAAa,IAAI7E,KAAK6E,WAAWK,QAAU,EACzD,CAEQ,cAAAJ,GAMN,IACE,GAAoC,mBAAzB9E,KAAKmF,gBAAgC,OAAO,KACvD,MAAMC,EAAYpF,KAAKmF,kBAGvB,OAFAC,EAAUF,OAAOG,IAAI,aACrBD,EAAUF,OAAOI,OAAO,aACjBF,CACT,CAAE,MACA,OAAO,IACT,CACF,CAEQ,WAAAL,CAAYQ,GAClB,GAAwB,OAApBvF,KAAK6E,WAAqB,OAC9B,MAAMK,EAASlF,KAAK6E,WAAWK,OAC/B,IAAK,MAAOhH,EAAOsH,KAAa1I,OAAO2I,QAAQF,GAC7CvF,KAAKiD,iBAAiB/E,EAAQE,IAC5B,MAAMsH,EAAQ1F,KAAK2F,aAAa,gBAChC,IAAK,MAAO1H,EAAM2H,KAAO9I,OAAO2I,QAAQD,EAAUpH,EAAkBC,SAAU,CAC5E,IACMuH,EAAMV,EAAOG,IAAIpH,GAAgBiH,EAAOI,OAAOrH,EACrD,CAAE,MAA0B,CACxByH,GAAO1F,KAAK6F,gBAAgB,kBAAkB5H,IAAQ2H,EAC5D,GAGN,CAIA,gBAAIE,GACF,OAAO9F,KAAK2F,aAAa,gBAC3B,CAEA,gBAAIG,CAAaC,GACXA,EACF/F,KAAKgG,aAAa,gBAAiB,IAEnChG,KAAKiG,gBAAgB,gBAEzB,CAEA,WAAIC,GACF,MAAMC,EAAOnG,KAAK6D,aAAa,WAC/B,GAAa,OAATsC,GAAiC,KAAhBA,EAAKC,OAAe,OAAOC,IAIhD,MAAMC,EAASC,OAAOJ,GACtB,OAAOI,OAAOC,SAASF,IAAWA,GAAU,EAAIA,EAASD,GAC3D,CAEA,WAAIH,CAAQH,GACV/F,KAAKgG,aAAa,UAAWS,OAAOV,GACtC,CAEA,cAAIW,GACF,MAAMP,EAAOnG,KAAK6D,aAAa,eAC/B,GAAa,OAATsC,GAAiC,KAAhBA,EAAKC,OAAe,OAAO,EAIhD,MAAME,EAASC,OAAOJ,GACtB,OAAOI,OAAOC,SAASF,IAAWA,GAAU,EAAIA,EAAS,CAC3D,CAEA,cAAII,CAAWX,GACb/F,KAAKgG,aAAa,cAAeS,OAAOV,GAC1C,CAEA,SAAI5D,GACF,OAAOnC,KAAK2F,aAAa,QAC3B,CAEA,SAAIxD,CAAM4D,GACJA,EACF/F,KAAKgG,aAAa,QAAS,IAE3BhG,KAAKiG,gBAAgB,QAEzB,CAEA,UAAIU,GACF,OAAO3G,KAAK2F,aAAa,SAC3B,CAEA,UAAIgB,CAAOZ,GACLA,EACF/F,KAAKgG,aAAa,SAAU,IAE5BhG,KAAKiG,gBAAgB,SAEzB,CAIA,YAAI/F,GACF,OAAOF,KAAK0E,MAAMxE,QACpB,CAEA,YAAI5B,GACF,OAAO0B,KAAK0E,MAAMpG,QACpB,CAEA,aAAIC,GACF,OAAOyB,KAAK0E,MAAMnG,SACpB,CAEA,YAAIC,GACF,OAAOwB,KAAK0E,MAAMlG,QACpB,CAEA,UAAIC,GACF,OAAOuB,KAAK0E,MAAMjG,MACpB,CAEA,aAAIC,GACF,OAAOsB,KAAK0E,MAAMhG,SACpB,CAEA,YAAIyB,GACF,OAAOH,KAAK0E,MAAMvE,QACpB,CAEA,WAAIC,GACF,OAAOJ,KAAK0E,MAAMtE,OACpB,CAEA,SAAIC,GACF,OAAOL,KAAK0E,MAAMrE,KACpB,CAEA,aAAIC,GACF,OAAON,KAAK0E,MAAMpE,SACpB,CAEA,cAAIC,GACF,OAAOP,KAAK0E,MAAMnE,UACpB,CAOA,4BAAIqG,GACF,OAAO5G,KAAK4E,yBACd,CAIA,WAAIiC,GACF,OAAO7G,KAAK2E,QACd,CAEA,WAAIkC,CAAQd,KAMEA,IAEV/F,KAAK2E,UAAW,EAGX3E,KAAKuB,qBACVvB,KAAK2E,UAAW,EAChB3E,KAAKU,cAAc,IAAIC,YAAY,0BAA2B,CAC5DtC,QAAQ,EACRuC,SAAS,KAGf,CAIA,kBAAAW,GACE,OAAOvB,KAAK0E,MAAMnD,mBAAmBvB,KAAK8G,WAC5C,CAEA,aAAAzE,GACErC,KAAK0E,MAAMvC,MAAMnC,KAAK8G,WACxB,CAEA,UAAAxE,GACEtC,KAAK0E,MAAMpC,YACb,CAIQ,QAAAwE,GACN,MAAO,CACLC,mBAAoB/G,KAAK8F,aACzBI,QAASlG,KAAKkG,QACdQ,WAAY1G,KAAK0G,WAErB,CAIA,iBAAAM,GACEhH,KAAKiH,MAAMC,QAAU,OACjB7J,EAAOb,cDjPT+G,IACJA,GAAa,EACbW,SAASjB,iBAAiB,QAASO,KCqPjCxD,KAAK0E,MAAMlC,mBACNxC,KAAK2G,SAGJ3G,KAAKmC,MACPnC,KAAKqC,gBAKLrC,KAAK4E,0BAA4B5E,KAAKuB,qBAG5C,CAEA,oBAAA4F,GACEnH,KAAK0E,MAAMpC,aACXtC,KAAK0E,MAAMjC,SACb,ECvSI,SAAU2E,EAAqBC,GL2C/B,IAAoBC,EK1CpBD,IL2CqC,kBADjBC,EKzCZD,GL0Ca7K,cACvBD,EAAQC,YAAc8K,EAAc9K,aAEQ,iBAAnC8K,EAAc7K,mBACvBF,EAAQE,iBAAmB6K,EAAc7K,kBAEvC6K,EAAc5K,UAChBI,OAAOyK,OAAOhL,EAAQG,SAAU4K,EAAc5K,UAEhDU,EAAe,MMrDV2G,eAAeC,IAAI3G,EAAOX,SAASC,MACtCoH,eAAeyD,OAAOnK,EAAOX,SAASC,IAAK0H,EDI/C"}
|
|
1
|
+
{"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.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\", semantics: \"state\" },\n { name: \"latitude\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.latitude },\n { name: \"longitude\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.longitude },\n { name: \"accuracy\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.accuracy },\n { name: \"coords\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.coords },\n { name: \"timestamp\", event: \"wcs-geo:position\", semantics: \"state\", getter: (e: Event) => (e as CustomEvent).detail.timestamp },\n { name: \"watching\", event: \"wcs-geo:watching-changed\", semantics: \"state\" },\n { name: \"loading\", event: \"wcs-geo:loading-changed\", semantics: \"state\" },\n { name: \"error\", event: \"wcs-geo:error\", semantics: \"state\" },\n { name: \"permission\", event: \"wcs-geo:permission-changed\", semantics: \"state\" },\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\", semantics: \"state\" },\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","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// custom element の property upgrade — `static wcBindable.inputs` に宣言した入力のうち、\n// 要素が upgrade される前に代入された own データプロパティを取り込み直す。\n//\n// なぜ必要か:\n// 未定義タグの要素は素の HTMLElement なので、`el.url = \"...\"` は own データプロパティを作る。\n// upgrade 後にクラスの accessor が prototype へ入っても own プロパティが優先されるため、\n// setter は二度と呼ばれず、値は要素へ届かないまま消える(エラーも警告も出ない)。\n// 常にプロパティ代入を行う framework(Angular の `[prop]`、Lit の `.prop=`、\n// Solid の `prop:`、Vue の `.prop` 修飾子)× 遅延定義(autoloader / CDN / code-split)で\n// 常態的に起きる。docs/architecture-hardening/13-framework-adapter-binding-constraints.md §1.2。\n//\n// 安全側の判定:\n// own プロパティがあっても、prototype チェーンに accessor が無ければ「シャドウ」ではなく\n// その own プロパティ自体が正規の格納先なので触らない(public class field を壊さない)。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/upgrade-properties.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/upgradeProperties.ts). Those copies are generated — do not edit them.\nimport { IWcBindable } from \"./wcBindable.js\";\n\nfunction hasAccessorOnPrototype(target: object, name: string): boolean {\n let proto = Object.getPrototypeOf(target);\n while (proto !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n if (descriptor !== undefined) {\n return typeof descriptor.get === \"function\" || typeof descriptor.set === \"function\";\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n */\nexport function upgradeProperties(element: object): void {\n const declaration = (element as { constructor?: { wcBindable?: IWcBindable } }).constructor?.wcBindable;\n const inputs = declaration?.inputs;\n if (inputs === undefined) return;\n for (const input of inputs) {\n const name = input.name;\n if (!Object.prototype.hasOwnProperty.call(element, name)) continue;\n if (!hasAccessorOnPrototype(element, name)) continue;\n const record = element as Record<string, unknown>;\n const value = record[name];\n delete record[name];\n record[name] = value;\n }\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\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.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\", semantics: \"state\" },\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 // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\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","semantics","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","hasAccessorOnPrototype","proto","getPrototypeOf","descriptor","getOwnPropertyDescriptor","undefined","set","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","element","declaration","input","prototype","hasOwnProperty","call","record","upgradeProperties","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.
|
|
3
|
+
"version": "1.25.0",
|
|
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",
|