@wcstack/geolocation 4.4.0 → 4.6.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/README.ja.md +1 -1
- package/README.md +1 -1
- package/dist/auto.d.ts +2 -0
- package/dist/auto.min.js +1 -1
- package/dist/auto.min.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +96 -14
- package/dist/index.esm.js.map +1 -1
- package/package.json +5 -2
package/README.ja.md
CHANGED
|
@@ -115,7 +115,7 @@ npm install @wcstack/geolocation
|
|
|
115
115
|
| `loading` | `wcs-geo:loading-changed` | 一発取得 `getCurrentPosition` のリクエスト中は `true`。 |
|
|
116
116
|
| `error` | `wcs-geo:error` | 正規化された `{ code, message }`(`PERMISSION_DENIED=1`, `POSITION_UNAVAILABLE=2`, `TIMEOUT=3`)。 |
|
|
117
117
|
| `permission` | `wcs-geo:permission-changed` | `"prompt"` / `"granted"` / `"denied"` / `"unsupported"`。Permissions API でライブ追跡。 |
|
|
118
|
-
| `errorInfo` | `wcs-geo:error-info-changed` | serializable な失敗 taxonomy(`WcsIoErrorInfo`)、または `null`。追加的で `error` から導出(`code` → `permission-denied` / `position-unavailable` / `timeout`、`recoverable` は `permission-denied`
|
|
118
|
+
| `errorInfo` | `wcs-geo:error-info-changed` | serializable な失敗 taxonomy(`WcsIoErrorInfo`)、または `null`。追加的で `error` から導出(`code` → `permission-denied` / `position-unavailable` / `timeout`、`recoverable` は `permission-denied` と `capability-missing` だけ `false`)。4.5 から、`capability-missing`(phase `probe`)はこのページで geolocation を使えないときに出します。Geolocation API が無い(4.4 までは `position-unavailable`)、secure context でない、Permissions-Policy が切っている、のどれかです。後の 2 つでは `permission` も `"unsupported"` になり、ブラウザには聞きません(利用者が拒否したかのように答えるため)。`error` の shape は不変(`code` は 2)。 |
|
|
119
119
|
|
|
120
120
|
## コマンド
|
|
121
121
|
|
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ Add the `watch` attribute to stream fixes via `watchPosition` until the element
|
|
|
115
115
|
| `loading` | `wcs-geo:loading-changed` | `true` during a one-shot `getCurrentPosition` request. |
|
|
116
116
|
| `error` | `wcs-geo:error` | Normalized `{ code, message }` (`PERMISSION_DENIED=1`, `POSITION_UNAVAILABLE=2`, `TIMEOUT=3`). |
|
|
117
117
|
| `permission` | `wcs-geo:permission-changed` | `"prompt"` / `"granted"` / `"denied"` / `"unsupported"`, tracked live via the Permissions API. |
|
|
118
|
-
| `errorInfo` | `wcs-geo:error-info-changed` | Serializable failure taxonomy (`WcsIoErrorInfo`), or `null`. Additive — derived from `error` (`code` → `permission-denied` / `position-unavailable` / `timeout`; `recoverable` is `false` only for `permission-denied`). The `error` shape is unchanged. |
|
|
118
|
+
| `errorInfo` | `wcs-geo:error-info-changed` | Serializable failure taxonomy (`WcsIoErrorInfo`), or `null`. Additive — derived from `error` (`code` → `permission-denied` / `position-unavailable` / `timeout`; `recoverable` is `false` only for `permission-denied` and `capability-missing`). Since 4.5, `capability-missing` (phase `probe`) is for a page that cannot use geolocation: no Geolocation API (`position-unavailable` up to 4.4), not a secure context, or turned off by a Permissions-Policy. In the last two `permission` is `"unsupported"` and the browser is not asked (it would answer as if the user had refused). The `error` shape is unchanged (`code` 2). |
|
|
119
119
|
|
|
120
120
|
## Commands
|
|
121
121
|
|
package/dist/auto.d.ts
ADDED
package/dist/auto.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const t={triggerAttribute:"data-geotarget",tagNames:{geo:"wcs-geo"}},e="permission-denied",i="position-unavailable",s="timeout";class r 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 r,n;this._error!==t&&(this._error=t,this._commitErrorInfo(null===t?null:(r=t.code,n=t.message,{code:1===r?e:3===r?s:i,phase:"execute",recoverable:1!==r,message:n})),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 n=!1;function o(e){const i=e.target;if(!(i instanceof Element))return;const s=i.closest(`[${t.triggerAttribute}]`);if(!s)return;const r=s.getAttribute(t.triggerAttribute);if(!r)return;const n=customElements.get(t.tagNames.geo),o=document.getElementById(r);n&&o instanceof n&&(e.preventDefault(),o.getCurrentPosition())}function a(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}const c=new WeakMap;function h(t,e){let i=c.get(t);return void 0===i&&(i=new Map,c.set(t,i)),i.has(e)||i.set(e,t.getAttribute(e)),i.get(e)}function u(t,e,i){null===i?t.removeAttribute(e):t.setAttribute(e,i)}function g(t,e,i){const s=h(t,e);u(t,e,void 0===i?s:null===i?null:String(i))}function l(t,e,i){const s=h(t,e);u(t,e,void 0===i?s:i?"":null)}class m extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...r.wcBindable,properties:[...r.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 r(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){l(this,"high-accuracy",t)}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){g(this,"timeout",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){g(this,"maximum-age",t)}get watch(){return this.hasAttribute("watch")}set watch(t){l(this,"watch",t)}get manual(){return this.hasAttribute("manual")}set manual(t){l(this,"manual",t)}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(!a(t,i))continue;const s=t,r=s[i];delete s[i],s[i]=r}}(this),this.style.display="none",n||(n=!0,document.addEventListener("click",o)),this._core.reinitPermission(),this.manual||(this.watch?this.watchPosition():this._connectedCallbackPromise=this.getCurrentPosition())}disconnectedCallback(){this._core.clearWatch(),this._core.dispose()}}var d;!function(e=customElements){e.get(t.tagNames.geo)||e.define(t.tagNames.geo,m)}(d);
|
|
1
|
+
const t={triggerAttribute:"data-geotarget",tagNames:{geo:"wcs-geo"}},e=new Set(["camera","microphone","geolocation","midi","clipboard-read","clipboard-write","screen-wake-lock","idle-detection","accelerometer","gyroscope","magnetometer","ambient-light-sensor","display-capture"]);function i(t){const i=globalThis;if(!1===i.isSecureContext)return"insecure-context";if(!e.has(t))return null;const s=i.document?.permissionsPolicy??i.document?.featurePolicy;if(void 0===s||"function"!=typeof s.allowsFeature)return null;try{return s.allowsFeature(t)?null:"policy-blocked"}catch{return null}}function s(t,e,i){return"insecure-context"===i?`${t} needs a secure context (https:, or http://localhost), and this page is not one.`:`${t} is turned off for this page by a Permissions-Policy: the server's Permissions-Policy header, or an <iframe> without allow="${e}". The browser's site settings cannot change that.`}const n="permission-denied",r="position-unavailable",o="timeout",a="capability-missing";class c 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;_unsupportedErrors=new WeakSet;_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){this._error!==t&&(this._error=t,this._commitErrorInfo(null===t?null:function(t,e,i=!1){return i?{code:a,phase:"probe",recoverable:!1,message:e}:{code:1===t?n:3===t?o:r,phase:"execute",recoverable:1!==t,message:e}}(t.code,t.message,this._unsupportedErrors.has(t))),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._setLoading(!1),this._permissionStatus&&(this._permissionStatus.removeEventListener("change",this._onPermissionChange),this._permissionStatus=null)}_hasGeolocation(){return"undefined"!=typeof navigator&&!!navigator.geolocation&&null===i("geolocation")}_initPermission(){if(null!==i("geolocation"))return this._setPermission("unsupported"),Promise.resolve();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(){const t=i("geolocation"),e={code:2,message:null===t?"Geolocation API is not available in this environment.":s("Geolocation","geolocation",t)};return this._unsupportedErrors.add(e),e}_unexpectedError(){return{code:2,message:"Unexpected error while processing the position fix."}}}let h=!1;function u(e){const i=e.target;if(!(i instanceof Element))return;const s=i.closest(`[${t.triggerAttribute}]`);if(!s)return;const n=s.getAttribute(t.triggerAttribute);if(!n)return;const r=customElements.get(t.tagNames.geo),o=document.getElementById(n);r&&o instanceof r&&(e.preventDefault(),o.getCurrentPosition())}function l(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}const g=new WeakSet;function m(t,e,i){if(g.has(t))return;g.add(t);const s=t.localName??"element";console.warn(`[wcs/input-as-attribute] <${s}> has the attribute ${e}="${i}": an object was written as an attribute, so the element did not receive it. A framework does that when the property is set before the element's definition loads (React 19), or when told to (Vue's .attr). Load the definition before rendering, or assign the property through a ref (Vue: .prop). (Said once per element.)`,t)}const d=new WeakMap;function _(t,e){let i=d.get(t);return void 0===i&&(i=new Map,d.set(t,i)),i.has(e)||i.set(e,t.getAttribute(e)),i.get(e)}function p(t,e,i){null===i?t.removeAttribute(e):t.setAttribute(e,i)}function w(t,e,i){const s=_(t,e);p(t,e,void 0===i?s:null===i?null:String(i))}function b(t,e,i){const s=_(t,e);p(t,e,void 0===i?s:i?"":null)}class f extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...c.wcBindable,properties:[...c.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 c(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[n,r]of Object.entries(s(t.detail))){try{r?e.add(n):e.delete(n)}catch{}i&&this.toggleAttribute(`data-wcs-state-${n}`,r)}})}get highAccuracy(){return this.hasAttribute("high-accuracy")}set highAccuracy(t){b(this,"high-accuracy",t)}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){w(this,"timeout",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){w(this,"maximum-age",t)}get watch(){return this.hasAttribute("watch")}set watch(t){b(this,"watch",t)}get manual(){return this.hasAttribute("manual")}set manual(t){b(this,"manual",t)}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)return;const s=t.getAttribute;for(const e of i){const i=e.name,n="function"==typeof s?s.call(t,i.toLowerCase()):null;if(null!==n&&n.startsWith("[object ")&&m(t,i,n),!Object.prototype.hasOwnProperty.call(t,i))continue;if(!l(t,i))continue;const r=t,o=r[i];delete r[i],r[i]=o}}(this),this.style.display="none",h||(h=!0,document.addEventListener("click",u)),this._core.reinitPermission(),this.manual||(this.watch?this.watchPosition():this._connectedCallbackPromise=this.getCurrentPosition())}disconnectedCallback(){this._core.clearWatch(),this._core.dispose()}}var v;!function(e=customElements){e.get(t.tagNames.geo)||e.define(t.tagNames.geo,f)}(v);
|
|
2
2
|
//# sourceMappingURL=auto.min.js.map
|
package/dist/auto.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto.min.js","sources":["../src/config.ts","../src/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/protocol/inputAttribute.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\n/** A misspelt option would otherwise do nothing: `bootstrapGeolocation` refuses it. */\nfunction invalid(key: string): never {\n throw new Error(`[@wcstack/geolocation] bootstrapGeolocation: \"${key}\" is not one of its options, or not of the option's type.`);\n}\n\n/**\n * Applies the options given; an undefined value is left out. An option this package does not\n * have, a value of another type than its default (null, or an array for an object, included) or\n * a tag name it does not define throws, and then nothing is applied.\n */\nexport function setConfig(partialConfig: IWritableConfig): void {\n const options = _config as unknown as Record<string, unknown>;\n const tags = _config.tagNames as Record<string, string>;\n const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);\n const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);\n for (const [key, value] of given) {\n const current = options[key];\n if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {\n invalid(key);\n }\n }\n for (const [name, tag] of givenTags) {\n if (!Object.hasOwn(tags, name) || typeof tag !== \"string\") invalid(`tagNames.${name}`);\n }\n for (const [key, value] of given) {\n if (key !== \"tagNames\") {\n options[key] = value;\n }\n }\n for (const [name, tag] of givenTags) tags[name] = tag as string;\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","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/input-attribute.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// 属性へ反映する wc-bindable 入力の producer 側(SPEC-extensions § Producer guidance for inputs の P1〜P3)。\n// 入力の setter は属性をこの 2 関数で書く。それで次が揃う:\n// - `undefined` は「値が無い」(P1): 属性を、この関数で最初に書く前の状態 — マークアップに書かれた値、\n// 無ければ属性なし(= その入力の文書化した既定値)— へ戻す。applier プロファイルを宣言する binder は\n// 値の後の `undefined` を書き(A2)、React 19 も書き、直接の代入でも届く。\n// - `null` はクリア(P2): 属性なし、つまり文書化した既定値。\n// - どちらも文字列 \"undefined\" / \"null\" として属性に入らない。\n//\n// 「最初に書く前」は、その最初の書き込みのときに読む(遅延)。upgrade 前に代入されたプロパティは\n// connectedCallback の upgradeProperties() が通し直すので、そのときにはパーサが書いた属性が揃っている。\n// 要素自身が setter を通さずに書いた属性は、最初の書き込みより前なら「最初の状態」に含まれる。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/input-attribute.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/inputAttribute.ts). Those copies are generated — do not edit them.\n\nconst initialAttributes = new WeakMap<Element, Map<string, string | null>>();\n\n/** The attribute as it stood before the first write through these helpers. */\nfunction initialAttribute(el: Element, name: string): string | null {\n let byName = initialAttributes.get(el);\n if (byName === undefined) {\n byName = new Map();\n initialAttributes.set(el, byName);\n }\n if (!byName.has(name)) byName.set(name, el.getAttribute(name));\n return byName.get(name) as string | null;\n}\n\nfunction writeAttribute(el: Element, name: string, value: string | null): void {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n}\n\n/**\n * A value attribute. `value` is written as `String(value)`; `null` removes the attribute;\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value === null ? null : String(value));\n}\n\n/**\n * A boolean attribute, present while `value` is truthy (`null` and `false` remove it);\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectBooleanAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value ? \"\" : null);\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\";\nimport { reflectAttribute, reflectBooleanAttribute } from \"../protocol/inputAttribute.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 // Input setters never let setAttribute stringify null / undefined (an\n // \"undefined\" timeout would silently fall back to Infinity): `null` removes the\n // attribute (the default), `undefined` restores the attribute the element\n // started with (wc-bindable producer guidance P1; React 19 and a direct\n // assignment deliver it, @wcstack/state does not).\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"high-accuracy\", value);\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 | null | undefined) {\n reflectAttribute(this, \"timeout\", 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 | null | undefined) {\n reflectAttribute(this, \"maximum-age\", value);\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"watch\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"manual\", value);\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, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n","import { WcsGeolocation } from \"./components/Geolocation.js\";\nimport { config } from \"./config.js\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.geo)) {\n registry.define(config.tagNames.geo, WcsGeolocation);\n }\n}\n"],"names":["config","triggerAttribute","tagNames","geo","WCS_GEO_ERROR_CODE","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","Object","getPrototypeOf","descriptor","getOwnPropertyDescriptor","undefined","set","initialAttributes","WeakMap","initialAttribute","el","byName","Map","has","writeAttribute","value","removeAttribute","setAttribute","reflectAttribute","initial","String","reflectBooleanAttribute","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","timeout","attr","trim","Infinity","parsed","Number","isFinite","maximumAge","manual","connectedCallbackPromise","trigger","_options","enableHighAccuracy","connectedCallback","element","declaration","input","prototype","hasOwnProperty","call","record","upgradeProperties","style","display","disconnectedCallback","registry","define","registerComponents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auto.min.js","sources":["../src/config.ts","../src/core/platformCapability.ts","../src/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/protocol/inputAttribute.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\n/** A misspelt option would otherwise do nothing: `bootstrapGeolocation` refuses it. */\nfunction invalid(key: string): never {\n throw new Error(`[@wcstack/geolocation] bootstrapGeolocation: \"${key}\" is not one of its options, or not of the option's type.`);\n}\n\n/**\n * Applies the options given; an undefined value is left out. An option this package does not\n * have, a value of another type than its default (null, or an array for an object, included) or\n * a tag name it does not define throws, and then nothing is applied.\n */\nexport function setConfig(partialConfig: IWritableConfig): void {\n const options = _config as unknown as Record<string, unknown>;\n const tags = _config.tagNames as Record<string, string>;\n const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);\n const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);\n for (const [key, value] of given) {\n const current = options[key];\n if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {\n invalid(key);\n }\n }\n for (const [name, tag] of givenTags) {\n if (!Object.hasOwn(tags, name) || typeof tag !== \"string\") invalid(`tagNames.${name}`);\n }\n for (const [key, value] of given) {\n if (key !== \"tagNames\") {\n options[key] = value;\n }\n }\n for (const [name, tag] of givenTags) tags[name] = tag as string;\n frozenConfig = null;\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /io-core/platform-capability.ts by scripts/sync-io-core.mjs.\n// Run `node scripts/sync-io-core.mjs` after editing the source.\n// ===========================================================================\n\n/**\n * platform-capability.ts\n *\n * Phase 6(docs/architecture-hardening/09-remediation-design.md §7.2 /\n * 07-browser-capability-variance.md)の browser capability 判定と error taxonomy の\n * 汎用プリミティブ。node 固有の capability registry / error code は各パッケージが\n * 別ファイルで宣言し、この汎用層(型 + assess 機構)を import する。\n *\n * 原則:\n * - feature detection は境界(利用直前)で行う。module 評価時に browser global を\n * 参照しない(SSR / worker で import が失敗しない)。\n * - capability ID(`web.fetch` 等)は文字列を global property path として eval せず、\n * registry が ID ごとに副作用のない presence probe を対応付ける。\n * - availability / permission / readiness / activity / operation error を 1 つの\n * `ready / unsupported / error` enum に畳まない。required 欠如は開始しない、\n * optional 欠如は宣言済み fallback で readiness を `degraded` にする。\n *\n * 配置: 本ファイルは /io-core/ の単一正典であり、scripts/sync-io-core.mjs が\n * 各 IO ノードの src/core/ へ生成コピー (AUTO-GENERATED, 編集禁止) を配布する。\n * `protocol/wcBindable.ts` と同じ copy-distribution 方式で、ランタイム依存を導入せず\n * 各パッケージのバンドルへ inline される (zero-runtime-dep / 自己完結 CDN を維持)。\n * 編集はこの正典に対して行い、`node scripts/sync-io-core.mjs` で再配布する。\n *\n * pure(module 評価時に browser global 非参照)。\n */\n\nexport type Availability = \"available\" | \"missing\" | \"unknown\";\nexport type PermissionState = \"granted\" | \"denied\" | \"prompt\" | \"not-applicable\" | \"unknown\";\nexport type Readiness = \"idle\" | \"ready\" | \"degraded\";\nexport type Activity = \"inactive\" | \"active\";\nexport type PreconditionState = \"satisfied\" | \"required\" | \"not-applicable\";\n\n/** operation error の phase(taxonomy)。 */\nexport type WcsIoErrorPhase = \"probe\" | \"start\" | \"execute\" | \"decode\" | \"commit\" | \"dispose\";\n\n/** serializable な error info(non-cloneable な cause とは分離。DevTools / remote へは info のみ)。 */\nexport interface WcsIoErrorInfo {\n readonly code: string;\n readonly phase: WcsIoErrorPhase;\n readonly recoverable: boolean;\n readonly capabilityId?: string;\n readonly message: string;\n}\n\nexport interface PlatformAssessment {\n readonly availability: ReadonlyMap<string, Availability>;\n readonly permission: PermissionState;\n readonly readiness: Readiness;\n readonly activity: Activity;\n readonly preconditions: {\n readonly secureContext: PreconditionState;\n readonly userActivation: PreconditionState;\n };\n readonly epoch: number;\n readonly lastError?: WcsIoErrorInfo;\n}\n\n/** capability 1 件の仕様。probe は副作用なく presence を返す(利用直前に呼ぶ)。 */\nexport interface CapabilitySpec {\n readonly probe: () => boolean;\n readonly requiresSecureContext?: boolean;\n readonly requiresUserActivation?: boolean;\n /** browser compatibility dataset のキー(任意・診断用)。 */\n readonly compatKey?: string;\n}\n\nexport type CapabilityRegistry = ReadonlyMap<string, CapabilitySpec>;\n\nexport interface AssessOptions {\n readonly required: readonly string[];\n readonly optional?: readonly string[];\n readonly permission?: PermissionState;\n readonly activity?: Activity;\n readonly epoch?: number;\n readonly lastError?: WcsIoErrorInfo;\n}\n\nfunction isSecureContext(): boolean {\n return (globalThis as { isSecureContext?: unknown }).isSecureContext === true;\n}\n\n/**\n * capability を利用直前に評価して PlatformAssessment を作る。\n * required が 1 つでも欠ければ readiness は \"idle\"(開始不可)、\n * required 揃い + optional 欠けは \"degraded\"、全揃いは \"ready\"。\n */\nexport function assessCapabilities(registry: CapabilityRegistry, options: AssessOptions): PlatformAssessment {\n const availability = new Map<string, Availability>();\n const evaluate = (id: string): Availability => {\n const spec = registry.get(id);\n if (spec === undefined) return \"unknown\";\n return spec.probe() ? \"available\" : \"missing\";\n };\n\n let requiredAllAvailable = true;\n for (const id of options.required) {\n const a = evaluate(id);\n availability.set(id, a);\n if (a !== \"available\") requiredAllAvailable = false;\n }\n let optionalAllAvailable = true;\n for (const id of options.optional ?? []) {\n const a = evaluate(id);\n availability.set(id, a);\n if (a !== \"available\") optionalAllAvailable = false;\n }\n\n const readiness: Readiness = !requiredAllAvailable ? \"idle\" : (optionalAllAvailable ? \"ready\" : \"degraded\");\n\n // preconditions: 対象 capability のいずれかが要求する場合だけ評価する。\n const allIds = [...options.required, ...(options.optional ?? [])];\n const needsSecure = allIds.some((id) => registry.get(id)?.requiresSecureContext === true);\n const needsActivation = allIds.some((id) => registry.get(id)?.requiresUserActivation === true);\n const secureContext: PreconditionState = needsSecure ? (isSecureContext() ? \"satisfied\" : \"required\") : \"not-applicable\";\n const userActivation: PreconditionState = needsActivation ? \"required\" : \"not-applicable\";\n\n return {\n availability,\n permission: options.permission ?? \"not-applicable\",\n readiness,\n activity: options.activity ?? \"inactive\",\n preconditions: { secureContext, userActivation },\n epoch: options.epoch ?? 0,\n lastError: options.lastError,\n };\n}\n\n/** availability から「required がすべて available か」を判定するヘルパ(supported の最低条件)。 */\nexport function requiredCapabilitiesAvailable(assessment: PlatformAssessment, required: readonly string[]): boolean {\n return required.every((id) => assessment.availability.get(id) === \"available\");\n}\n\n/**\n * このページで機能が使えない理由(使える、または分からないなら null)。利用直前に読む。\n *\n * - `\"insecure-context\"`: 安全なコンテキストではない(`isSecureContext === false`)。\n * Permissions API が扱う機能はどれも安全なコンテキストを要る。\n * - `\"policy-blocked\"`: Permissions-Policy(サーバーのヘッダ、または `allow` の無い\n * `<iframe>`)がその機能を切っている。\n *\n * どちらも Permissions API は教えない: Chromium はポリシーで切られた文書でも\n * `granted` を、安全でない origin では `denied` を返す。利用者の拒否と区別するため、\n * 見張り役(`<wcs-permission>`)も取りに行く側も `unsupported` を報告する\n * (docs/v4-direction-2026-10.md の決定、state-field-report)。\n * `isSecureContext` が無い環境(SSR・テスト)は判断しない。\n */\nexport type FeatureUnavailableReason = \"insecure-context\" | \"policy-blocked\";\n\n/** Permissions-Policy が制御する機能(permission 名と同じ文字列)。 */\nconst POLICY_CONTROLLED = new Set([\n \"camera\", \"microphone\", \"geolocation\", \"midi\", \"clipboard-read\", \"clipboard-write\",\n \"screen-wake-lock\", \"idle-detection\", \"accelerometer\", \"gyroscope\", \"magnetometer\",\n \"ambient-light-sensor\", \"display-capture\",\n]);\n\ninterface PolicyLike { allowsFeature(feature: string): boolean }\n\nexport function featureUnavailable(feature: string): FeatureUnavailableReason | null {\n const g = globalThis as { isSecureContext?: unknown; document?: { permissionsPolicy?: PolicyLike; featurePolicy?: PolicyLike } };\n if (g.isSecureContext === false) return \"insecure-context\";\n if (!POLICY_CONTROLLED.has(feature)) return null;\n const policy = g.document?.permissionsPolicy ?? g.document?.featurePolicy;\n if (policy === undefined || typeof policy.allowsFeature !== \"function\") return null;\n try {\n return policy.allowsFeature(feature) ? null : \"policy-blocked\";\n } catch {\n return null;\n }\n}\n\n/** `featureUnavailable` の理由を、作者が直し方を読める文にする。`what` は文頭(「The camera」など)。 */\nexport function featureUnavailableMessage(what: string, feature: string, reason: FeatureUnavailableReason): string {\n return reason === \"insecure-context\"\n ? `${what} needs a secure context (https:, or http://localhost), and this page is not one.`\n : `${what} is turned off for this page by a Permissions-Policy: the server's Permissions-Policy header, ` +\n `or an <iframe> without allow=\"${feature}\". The browser's site settings cannot change that.`;\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 // このページで使えない(API 不在・安全でない origin・Permissions-Policy)。利用者の拒否\n // (permission-denied)と区別する — サイトの設定では直らない。\n CapabilityMissing: \"capability-missing\",\n} as const;\n\n/**\n * 正規化済み `GeolocationPositionError`(spec code 1/2/3)を serializable な error\n * taxonomy に写す。\"unexpected\" は code 2(position-unavailable)に畳むため、これは既存の\n * `error.code` を忠実にミラーする。permission-denied(1)だけは retry で回復しないため\n * recoverable=false。`unsupported`(このページで使えない — Core は `error.code` を 2 にする)\n * は capability-missing / probe / recoverable=false。\n */\nexport function deriveGeoErrorInfo(code: number, message: string, unsupported = false): WcsIoErrorInfo {\n if (unsupported) {\n return { code: WCS_GEO_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\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, featureUnavailable, featureUnavailableMessage } 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 // the errors that say this page cannot use geolocation (errorInfo: capability-missing)\n private _unsupportedErrors = new WeakSet<WcsGeoErrorDetail>();\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, this._unsupportedErrors.has(error)));\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 // Clear loading, with its event (timing-and-firing-contract §22): the bailed\n // callback above will not clear it, and a route the element leaves keeps its\n // nodes — bindings included — for the next entry, so a reset nobody heard would\n // leave the page showing an acquisition that is gone. Clearing it also keeps the\n // loading=true edge of the next acquisition after a reconnect.\n this._setLoading(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 && featureUnavailable(\"geolocation\") === null;\n }\n\n private _initPermission(): Promise<void> {\n // A page that cannot use geolocation (not a secure context, or turned off by a\n // Permissions-Policy) is \"unsupported\": the Permissions API answers \"granted\" in a\n // policy-blocked frame and \"denied\" on an insecure origin — a user's refusal, which\n // the site settings would fix and these cannot. Neither changes while the page lives.\n if (featureUnavailable(\"geolocation\") !== null) {\n this._setPermission(\"unsupported\");\n return Promise.resolve();\n }\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, or not available to this page: surface it as\n // POSITION_UNAVAILABLE (2) so consumers that switch on the spec error codes treat\n // it like any other unavailable fix; errorInfo says capability-missing.\n const reason = featureUnavailable(\"geolocation\");\n const error: WcsGeoErrorDetail = {\n code: 2,\n message: reason === null\n ? \"Geolocation API is not available in this environment.\"\n : featureUnavailableMessage(\"Geolocation\", \"geolocation\", reason),\n };\n this._unsupportedErrors.add(error);\n return error;\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// 属性になってしまったオブジェクトの入力(`files=\"[object File]\"`)を、要素ごとに 1 回だけ言う。\n// React 19 は定義前の要素にプロパティが無いのでオブジェクトを属性に書き、Vue の `.attr` も\n// 書く。要素はその入力をプロパティでしか読まないので、何も受け取らず、何も言わなかった\n// (docs/seam-apps.md、fw-inventory)。\nconst toldObjectAttribute = new WeakSet<object>();\n\nfunction warnObjectAttribute(element: object, name: string, value: string): void {\n if (toldObjectAttribute.has(element)) return;\n toldObjectAttribute.add(element);\n const tag = (element as { localName?: string }).localName ?? \"element\";\n console.warn(\n `[wcs/input-as-attribute] <${tag}> has the attribute ${name}=\"${value}\": an object was written as an ` +\n `attribute, so the element did not receive it. A framework does that when the property is set before the ` +\n `element's definition loads (React 19), or when told to (Vue's .attr). Load the definition before rendering, ` +\n `or assign the property through a ref (Vue: .prop). (Said once per element.)`,\n element,\n );\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n * - 値が `[object …]` の属性(属性に書かれてしまったオブジェクトの入力)は、要素ごとに 1 回警告する。\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 const getAttribute = (element as { getAttribute?: (name: string) => string | null }).getAttribute;\n for (const input of inputs) {\n const name = input.name;\n const attribute = typeof getAttribute === \"function\" ? getAttribute.call(element, name.toLowerCase()) : null;\n if (attribute !== null && attribute.startsWith(\"[object \")) warnObjectAttribute(element, name, attribute);\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","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/input-attribute.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// 属性へ反映する wc-bindable 入力の producer 側(SPEC-extensions § Producer guidance for inputs の P1〜P3)。\n// 入力の setter は属性をこの 2 関数で書く。それで次が揃う:\n// - `undefined` は「値が無い」(P1): 属性を、この関数で最初に書く前の状態 — マークアップに書かれた値、\n// 無ければ属性なし(= その入力の文書化した既定値)— へ戻す。applier プロファイルを宣言する binder は\n// 値の後の `undefined` を書き(A2)、React 19 も書き、直接の代入でも届く。\n// - `null` はクリア(P2): 属性なし、つまり文書化した既定値。\n// - どちらも文字列 \"undefined\" / \"null\" として属性に入らない。\n//\n// 「最初に書く前」は、その最初の書き込みのときに読む(遅延)。upgrade 前に代入されたプロパティは\n// connectedCallback の upgradeProperties() が通し直すので、そのときにはパーサが書いた属性が揃っている。\n// 要素自身が setter を通さずに書いた属性は、最初の書き込みより前なら「最初の状態」に含まれる。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/input-attribute.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/inputAttribute.ts). Those copies are generated — do not edit them.\n\nconst initialAttributes = new WeakMap<Element, Map<string, string | null>>();\n\n/** The attribute as it stood before the first write through these helpers. */\nfunction initialAttribute(el: Element, name: string): string | null {\n let byName = initialAttributes.get(el);\n if (byName === undefined) {\n byName = new Map();\n initialAttributes.set(el, byName);\n }\n if (!byName.has(name)) byName.set(name, el.getAttribute(name));\n return byName.get(name) as string | null;\n}\n\nfunction writeAttribute(el: Element, name: string, value: string | null): void {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n}\n\n/**\n * A value attribute. `value` is written as `String(value)`; `null` removes the attribute;\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value === null ? null : String(value));\n}\n\n/**\n * A boolean attribute, present while `value` is truthy (`null` and `false` remove it);\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectBooleanAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value ? \"\" : null);\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\";\nimport { reflectAttribute, reflectBooleanAttribute } from \"../protocol/inputAttribute.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 // Input setters never let setAttribute stringify null / undefined (an\n // \"undefined\" timeout would silently fall back to Infinity): `null` removes the\n // attribute (the default), `undefined` restores the attribute the element\n // started with (wc-bindable producer guidance P1; React 19 and a direct\n // assignment deliver it, @wcstack/state does not).\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"high-accuracy\", value);\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 | null | undefined) {\n reflectAttribute(this, \"timeout\", 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 | null | undefined) {\n reflectAttribute(this, \"maximum-age\", value);\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"watch\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"manual\", value);\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, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n","import { WcsGeolocation } from \"./components/Geolocation.js\";\nimport { config } from \"./config.js\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.geo)) {\n registry.define(config.tagNames.geo, WcsGeolocation);\n }\n}\n"],"names":["config","triggerAttribute","tagNames","geo","POLICY_CONTROLLED","Set","featureUnavailable","feature","g","globalThis","isSecureContext","has","policy","document","permissionsPolicy","featurePolicy","undefined","allowsFeature","featureUnavailableMessage","what","reason","WCS_GEO_ERROR_CODE","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","_unsupportedErrors","WeakSet","_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","_commitErrorInfo","code","message","unsupported","phase","recoverable","deriveGeoErrorInfo","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","add","registered","handleClick","Element","triggerElement","closest","geoId","getAttribute","GeoCtor","customElements","get","geoElement","getElementById","preventDefault","hasAccessorOnPrototype","proto","Object","getPrototypeOf","descriptor","getOwnPropertyDescriptor","set","toldObjectAttribute","warnObjectAttribute","element","value","tag","localName","console","warn","initialAttributes","WeakMap","initialAttribute","el","byName","Map","writeAttribute","removeAttribute","setAttribute","reflectAttribute","initial","String","reflectBooleanAttribute","WcsGeolocation","HTMLElement","wcBindable","inputs","attribute","_core","_trigger","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","debugStates","states","attachInternals","internals","delete","map","toStates","entries","debug","hasAttribute","on","toggleAttribute","highAccuracy","timeout","attr","trim","Infinity","parsed","Number","isFinite","maximumAge","manual","connectedCallbackPromise","trigger","_options","enableHighAccuracy","connectedCallback","declaration","input","call","toLowerCase","startsWith","prototype","hasOwnProperty","record","upgradeProperties","style","display","disconnectedCallback","registry","define","registerComponents"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -212,6 +212,7 @@ declare class GeolocationCore extends EventTarget {
|
|
|
212
212
|
private _loading;
|
|
213
213
|
private _error;
|
|
214
214
|
private _errorInfo;
|
|
215
|
+
private _unsupportedErrors;
|
|
215
216
|
private _permission;
|
|
216
217
|
private _permissionStatus;
|
|
217
218
|
private _permissionSubscribed;
|
|
@@ -354,6 +355,7 @@ declare const WCS_GEO_ERROR_CODE: {
|
|
|
354
355
|
readonly PermissionDenied: "permission-denied";
|
|
355
356
|
readonly PositionUnavailable: "position-unavailable";
|
|
356
357
|
readonly Timeout: "timeout";
|
|
358
|
+
readonly CapabilityMissing: "capability-missing";
|
|
357
359
|
};
|
|
358
360
|
|
|
359
361
|
declare global {
|
package/dist/index.esm.js
CHANGED
|
@@ -65,6 +65,41 @@ function setConfig(partialConfig) {
|
|
|
65
65
|
frozenConfig = null;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// ===========================================================================
|
|
69
|
+
// AUTO-GENERATED FILE - DO NOT EDIT.
|
|
70
|
+
// Generated from /io-core/platform-capability.ts by scripts/sync-io-core.mjs.
|
|
71
|
+
// Run `node scripts/sync-io-core.mjs` after editing the source.
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
/** Permissions-Policy が制御する機能(permission 名と同じ文字列)。 */
|
|
74
|
+
const POLICY_CONTROLLED = new Set([
|
|
75
|
+
"camera", "microphone", "geolocation", "midi", "clipboard-read", "clipboard-write",
|
|
76
|
+
"screen-wake-lock", "idle-detection", "accelerometer", "gyroscope", "magnetometer",
|
|
77
|
+
"ambient-light-sensor", "display-capture",
|
|
78
|
+
]);
|
|
79
|
+
function featureUnavailable(feature) {
|
|
80
|
+
const g = globalThis;
|
|
81
|
+
if (g.isSecureContext === false)
|
|
82
|
+
return "insecure-context";
|
|
83
|
+
if (!POLICY_CONTROLLED.has(feature))
|
|
84
|
+
return null;
|
|
85
|
+
const policy = g.document?.permissionsPolicy ?? g.document?.featurePolicy;
|
|
86
|
+
if (policy === undefined || typeof policy.allowsFeature !== "function")
|
|
87
|
+
return null;
|
|
88
|
+
try {
|
|
89
|
+
return policy.allowsFeature(feature) ? null : "policy-blocked";
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** `featureUnavailable` の理由を、作者が直し方を読める文にする。`what` は文頭(「The camera」など)。 */
|
|
96
|
+
function featureUnavailableMessage(what, feature, reason) {
|
|
97
|
+
return reason === "insecure-context"
|
|
98
|
+
? `${what} needs a secure context (https:, or http://localhost), and this page is not one.`
|
|
99
|
+
: `${what} is turned off for this page by a Permissions-Policy: the server's Permissions-Policy header, ` +
|
|
100
|
+
`or an <iframe> without allow="${feature}". The browser's site settings cannot change that.`;
|
|
101
|
+
}
|
|
102
|
+
|
|
68
103
|
/**
|
|
69
104
|
* geolocationCapabilities.ts
|
|
70
105
|
*
|
|
@@ -78,14 +113,21 @@ const WCS_GEO_ERROR_CODE = {
|
|
|
78
113
|
PermissionDenied: "permission-denied",
|
|
79
114
|
PositionUnavailable: "position-unavailable",
|
|
80
115
|
Timeout: "timeout",
|
|
116
|
+
// このページで使えない(API 不在・安全でない origin・Permissions-Policy)。利用者の拒否
|
|
117
|
+
// (permission-denied)と区別する — サイトの設定では直らない。
|
|
118
|
+
CapabilityMissing: "capability-missing",
|
|
81
119
|
};
|
|
82
120
|
/**
|
|
83
121
|
* 正規化済み `GeolocationPositionError`(spec code 1/2/3)を serializable な error
|
|
84
|
-
* taxonomy に写す。
|
|
85
|
-
*
|
|
86
|
-
* は
|
|
122
|
+
* taxonomy に写す。"unexpected" は code 2(position-unavailable)に畳むため、これは既存の
|
|
123
|
+
* `error.code` を忠実にミラーする。permission-denied(1)だけは retry で回復しないため
|
|
124
|
+
* recoverable=false。`unsupported`(このページで使えない — Core は `error.code` を 2 にする)
|
|
125
|
+
* は capability-missing / probe / recoverable=false。
|
|
87
126
|
*/
|
|
88
|
-
function deriveGeoErrorInfo(code, message) {
|
|
127
|
+
function deriveGeoErrorInfo(code, message, unsupported = false) {
|
|
128
|
+
if (unsupported) {
|
|
129
|
+
return { code: WCS_GEO_ERROR_CODE.CapabilityMissing, phase: "probe", recoverable: false, message };
|
|
130
|
+
}
|
|
89
131
|
const taxonomyCode = code === 1
|
|
90
132
|
? WCS_GEO_ERROR_CODE.PermissionDenied
|
|
91
133
|
: code === 3
|
|
@@ -150,6 +192,8 @@ class GeolocationCore extends EventTarget {
|
|
|
150
192
|
_loading = false;
|
|
151
193
|
_error = null;
|
|
152
194
|
_errorInfo = null;
|
|
195
|
+
// the errors that say this page cannot use geolocation (errorInfo: capability-missing)
|
|
196
|
+
_unsupportedErrors = new WeakSet();
|
|
153
197
|
_permission = "prompt";
|
|
154
198
|
// Live PermissionStatus handle (when the Permissions API is available), kept
|
|
155
199
|
// so the `change` listener can be removed on dispose().
|
|
@@ -275,7 +319,7 @@ class GeolocationCore extends EventTarget {
|
|
|
275
319
|
// the normalized error (or null on clear). Fires before the `error` event so an
|
|
276
320
|
// observer binding both sees the classification first, mirroring the io-node
|
|
277
321
|
// family. No lane here — geolocation's fixes don't compete (dispose-only guard).
|
|
278
|
-
this._commitErrorInfo(error === null ? null : deriveGeoErrorInfo(error.code, error.message));
|
|
322
|
+
this._commitErrorInfo(error === null ? null : deriveGeoErrorInfo(error.code, error.message, this._unsupportedErrors.has(error)));
|
|
279
323
|
this._target.dispatchEvent(new CustomEvent("wcs-geo:error", {
|
|
280
324
|
detail: error,
|
|
281
325
|
bubbles: true,
|
|
@@ -466,11 +510,12 @@ class GeolocationCore extends EventTarget {
|
|
|
466
510
|
// clearWatch() before dispose(), but a direct headless dispose() (without a
|
|
467
511
|
// preceding clearWatch) still neutralizes any queued watch callback.
|
|
468
512
|
this._watchGen++;
|
|
469
|
-
//
|
|
470
|
-
//
|
|
471
|
-
//
|
|
472
|
-
//
|
|
473
|
-
|
|
513
|
+
// Clear loading, with its event (timing-and-firing-contract §22): the bailed
|
|
514
|
+
// callback above will not clear it, and a route the element leaves keeps its
|
|
515
|
+
// nodes — bindings included — for the next entry, so a reset nobody heard would
|
|
516
|
+
// leave the page showing an acquisition that is gone. Clearing it also keeps the
|
|
517
|
+
// loading=true edge of the next acquisition after a reconnect.
|
|
518
|
+
this._setLoading(false);
|
|
474
519
|
if (this._permissionStatus) {
|
|
475
520
|
this._permissionStatus.removeEventListener("change", this._onPermissionChange);
|
|
476
521
|
this._permissionStatus = null;
|
|
@@ -478,9 +523,17 @@ class GeolocationCore extends EventTarget {
|
|
|
478
523
|
}
|
|
479
524
|
// --- Internal ---
|
|
480
525
|
_hasGeolocation() {
|
|
481
|
-
return typeof navigator !== "undefined" && !!navigator.geolocation;
|
|
526
|
+
return typeof navigator !== "undefined" && !!navigator.geolocation && featureUnavailable("geolocation") === null;
|
|
482
527
|
}
|
|
483
528
|
_initPermission() {
|
|
529
|
+
// A page that cannot use geolocation (not a secure context, or turned off by a
|
|
530
|
+
// Permissions-Policy) is "unsupported": the Permissions API answers "granted" in a
|
|
531
|
+
// policy-blocked frame and "denied" on an insecure origin — a user's refusal, which
|
|
532
|
+
// the site settings would fix and these cannot. Neither changes while the page lives.
|
|
533
|
+
if (featureUnavailable("geolocation") !== null) {
|
|
534
|
+
this._setPermission("unsupported");
|
|
535
|
+
return Promise.resolve();
|
|
536
|
+
}
|
|
484
537
|
// The Permissions API is optional. When absent (or it rejects, e.g. some
|
|
485
538
|
// browsers don't accept the "geolocation" name), report "unsupported" and
|
|
486
539
|
// leave acquisition to fail loudly via the error property if attempted.
|
|
@@ -533,9 +586,18 @@ class GeolocationCore extends EventTarget {
|
|
|
533
586
|
return { code: err.code, message: err.message };
|
|
534
587
|
}
|
|
535
588
|
_unsupportedError() {
|
|
536
|
-
// Geolocation API absent: surface it as
|
|
537
|
-
// that switch on the spec error codes treat
|
|
538
|
-
|
|
589
|
+
// Geolocation API absent, or not available to this page: surface it as
|
|
590
|
+
// POSITION_UNAVAILABLE (2) so consumers that switch on the spec error codes treat
|
|
591
|
+
// it like any other unavailable fix; errorInfo says capability-missing.
|
|
592
|
+
const reason = featureUnavailable("geolocation");
|
|
593
|
+
const error = {
|
|
594
|
+
code: 2,
|
|
595
|
+
message: reason === null
|
|
596
|
+
? "Geolocation API is not available in this environment."
|
|
597
|
+
: featureUnavailableMessage("Geolocation", "geolocation", reason),
|
|
598
|
+
};
|
|
599
|
+
this._unsupportedErrors.add(error);
|
|
600
|
+
return error;
|
|
539
601
|
}
|
|
540
602
|
_unexpectedError() {
|
|
541
603
|
// An unexpected throw while normalizing/dispatching a fix. Surface it as
|
|
@@ -596,6 +658,21 @@ function hasAccessorOnPrototype(target, name) {
|
|
|
596
658
|
}
|
|
597
659
|
return false;
|
|
598
660
|
}
|
|
661
|
+
// 属性になってしまったオブジェクトの入力(`files="[object File]"`)を、要素ごとに 1 回だけ言う。
|
|
662
|
+
// React 19 は定義前の要素にプロパティが無いのでオブジェクトを属性に書き、Vue の `.attr` も
|
|
663
|
+
// 書く。要素はその入力をプロパティでしか読まないので、何も受け取らず、何も言わなかった
|
|
664
|
+
// (docs/seam-apps.md、fw-inventory)。
|
|
665
|
+
const toldObjectAttribute = new WeakSet();
|
|
666
|
+
function warnObjectAttribute(element, name, value) {
|
|
667
|
+
if (toldObjectAttribute.has(element))
|
|
668
|
+
return;
|
|
669
|
+
toldObjectAttribute.add(element);
|
|
670
|
+
const tag = element.localName ?? "element";
|
|
671
|
+
console.warn(`[wcs/input-as-attribute] <${tag}> has the attribute ${name}="${value}": an object was written as an ` +
|
|
672
|
+
`attribute, so the element did not receive it. A framework does that when the property is set before the ` +
|
|
673
|
+
`element's definition loads (React 19), or when told to (Vue's .attr). Load the definition before rendering, ` +
|
|
674
|
+
`or assign the property through a ref (Vue: .prop). (Said once per element.)`, element);
|
|
675
|
+
}
|
|
599
676
|
/**
|
|
600
677
|
* `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で
|
|
601
678
|
* accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。
|
|
@@ -603,14 +680,19 @@ function hasAccessorOnPrototype(target, name) {
|
|
|
603
680
|
* - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。
|
|
604
681
|
* - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。
|
|
605
682
|
* - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。
|
|
683
|
+
* - 値が `[object …]` の属性(属性に書かれてしまったオブジェクトの入力)は、要素ごとに 1 回警告する。
|
|
606
684
|
*/
|
|
607
685
|
function upgradeProperties(element) {
|
|
608
686
|
const declaration = element.constructor?.wcBindable;
|
|
609
687
|
const inputs = declaration?.inputs;
|
|
610
688
|
if (inputs === undefined)
|
|
611
689
|
return;
|
|
690
|
+
const getAttribute = element.getAttribute;
|
|
612
691
|
for (const input of inputs) {
|
|
613
692
|
const name = input.name;
|
|
693
|
+
const attribute = typeof getAttribute === "function" ? getAttribute.call(element, name.toLowerCase()) : null;
|
|
694
|
+
if (attribute !== null && attribute.startsWith("[object "))
|
|
695
|
+
warnObjectAttribute(element, name, attribute);
|
|
614
696
|
if (!Object.prototype.hasOwnProperty.call(element, name))
|
|
615
697
|
continue;
|
|
616
698
|
if (!hasAccessorOnPrototype(element, name))
|
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/protocol/upgradeProperties.ts","../src/protocol/inputAttribute.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\n/** A misspelt option would otherwise do nothing: `bootstrapGeolocation` refuses it. */\nfunction invalid(key: string): never {\n throw new Error(`[@wcstack/geolocation] bootstrapGeolocation: \"${key}\" is not one of its options, or not of the option's type.`);\n}\n\n/**\n * Applies the options given; an undefined value is left out. An option this package does not\n * have, a value of another type than its default (null, or an array for an object, included) or\n * a tag name it does not define throws, and then nothing is applied.\n */\nexport function setConfig(partialConfig: IWritableConfig): void {\n const options = _config as unknown as Record<string, unknown>;\n const tags = _config.tagNames as Record<string, string>;\n const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);\n const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);\n for (const [key, value] of given) {\n const current = options[key];\n if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {\n invalid(key);\n }\n }\n for (const [name, tag] of givenTags) {\n if (!Object.hasOwn(tags, name) || typeof tag !== \"string\") invalid(`tagNames.${name}`);\n }\n for (const [key, value] of given) {\n if (key !== \"tagNames\") {\n options[key] = value;\n }\n }\n for (const [name, tag] of givenTags) tags[name] = tag as string;\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","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/input-attribute.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// 属性へ反映する wc-bindable 入力の producer 側(SPEC-extensions § Producer guidance for inputs の P1〜P3)。\n// 入力の setter は属性をこの 2 関数で書く。それで次が揃う:\n// - `undefined` は「値が無い」(P1): 属性を、この関数で最初に書く前の状態 — マークアップに書かれた値、\n// 無ければ属性なし(= その入力の文書化した既定値)— へ戻す。applier プロファイルを宣言する binder は\n// 値の後の `undefined` を書き(A2)、React 19 も書き、直接の代入でも届く。\n// - `null` はクリア(P2): 属性なし、つまり文書化した既定値。\n// - どちらも文字列 \"undefined\" / \"null\" として属性に入らない。\n//\n// 「最初に書く前」は、その最初の書き込みのときに読む(遅延)。upgrade 前に代入されたプロパティは\n// connectedCallback の upgradeProperties() が通し直すので、そのときにはパーサが書いた属性が揃っている。\n// 要素自身が setter を通さずに書いた属性は、最初の書き込みより前なら「最初の状態」に含まれる。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/input-attribute.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/inputAttribute.ts). Those copies are generated — do not edit them.\n\nconst initialAttributes = new WeakMap<Element, Map<string, string | null>>();\n\n/** The attribute as it stood before the first write through these helpers. */\nfunction initialAttribute(el: Element, name: string): string | null {\n let byName = initialAttributes.get(el);\n if (byName === undefined) {\n byName = new Map();\n initialAttributes.set(el, byName);\n }\n if (!byName.has(name)) byName.set(name, el.getAttribute(name));\n return byName.get(name) as string | null;\n}\n\nfunction writeAttribute(el: Element, name: string, value: string | null): void {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n}\n\n/**\n * A value attribute. `value` is written as `String(value)`; `null` removes the attribute;\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value === null ? null : String(value));\n}\n\n/**\n * A boolean attribute, present while `value` is truthy (`null` and `false` remove it);\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectBooleanAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value ? \"\" : null);\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\";\nimport { reflectAttribute, reflectBooleanAttribute } from \"../protocol/inputAttribute.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 // Input setters never let setAttribute stringify null / undefined (an\n // \"undefined\" timeout would silently fall back to Infinity): `null` removes the\n // attribute (the default), `undefined` restores the attribute the element\n // started with (wc-bindable producer guidance P1; React 19 and a direct\n // assignment deliver it, @wcstack/state does not).\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"high-accuracy\", value);\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 | null | undefined) {\n reflectAttribute(this, \"timeout\", 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 | null | undefined) {\n reflectAttribute(this, \"maximum-age\", value);\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"watch\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"manual\", value);\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\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.geo)) {\n registry.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, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/platformCapability.ts","../src/core/geolocationCapabilities.ts","../src/core/GeolocationCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/protocol/inputAttribute.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\n/** A misspelt option would otherwise do nothing: `bootstrapGeolocation` refuses it. */\nfunction invalid(key: string): never {\n throw new Error(`[@wcstack/geolocation] bootstrapGeolocation: \"${key}\" is not one of its options, or not of the option's type.`);\n}\n\n/**\n * Applies the options given; an undefined value is left out. An option this package does not\n * have, a value of another type than its default (null, or an array for an object, included) or\n * a tag name it does not define throws, and then nothing is applied.\n */\nexport function setConfig(partialConfig: IWritableConfig): void {\n const options = _config as unknown as Record<string, unknown>;\n const tags = _config.tagNames as Record<string, string>;\n const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);\n const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);\n for (const [key, value] of given) {\n const current = options[key];\n if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {\n invalid(key);\n }\n }\n for (const [name, tag] of givenTags) {\n if (!Object.hasOwn(tags, name) || typeof tag !== \"string\") invalid(`tagNames.${name}`);\n }\n for (const [key, value] of given) {\n if (key !== \"tagNames\") {\n options[key] = value;\n }\n }\n for (const [name, tag] of givenTags) tags[name] = tag as string;\n frozenConfig = null;\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /io-core/platform-capability.ts by scripts/sync-io-core.mjs.\n// Run `node scripts/sync-io-core.mjs` after editing the source.\n// ===========================================================================\n\n/**\n * platform-capability.ts\n *\n * Phase 6(docs/architecture-hardening/09-remediation-design.md §7.2 /\n * 07-browser-capability-variance.md)の browser capability 判定と error taxonomy の\n * 汎用プリミティブ。node 固有の capability registry / error code は各パッケージが\n * 別ファイルで宣言し、この汎用層(型 + assess 機構)を import する。\n *\n * 原則:\n * - feature detection は境界(利用直前)で行う。module 評価時に browser global を\n * 参照しない(SSR / worker で import が失敗しない)。\n * - capability ID(`web.fetch` 等)は文字列を global property path として eval せず、\n * registry が ID ごとに副作用のない presence probe を対応付ける。\n * - availability / permission / readiness / activity / operation error を 1 つの\n * `ready / unsupported / error` enum に畳まない。required 欠如は開始しない、\n * optional 欠如は宣言済み fallback で readiness を `degraded` にする。\n *\n * 配置: 本ファイルは /io-core/ の単一正典であり、scripts/sync-io-core.mjs が\n * 各 IO ノードの src/core/ へ生成コピー (AUTO-GENERATED, 編集禁止) を配布する。\n * `protocol/wcBindable.ts` と同じ copy-distribution 方式で、ランタイム依存を導入せず\n * 各パッケージのバンドルへ inline される (zero-runtime-dep / 自己完結 CDN を維持)。\n * 編集はこの正典に対して行い、`node scripts/sync-io-core.mjs` で再配布する。\n *\n * pure(module 評価時に browser global 非参照)。\n */\n\nexport type Availability = \"available\" | \"missing\" | \"unknown\";\nexport type PermissionState = \"granted\" | \"denied\" | \"prompt\" | \"not-applicable\" | \"unknown\";\nexport type Readiness = \"idle\" | \"ready\" | \"degraded\";\nexport type Activity = \"inactive\" | \"active\";\nexport type PreconditionState = \"satisfied\" | \"required\" | \"not-applicable\";\n\n/** operation error の phase(taxonomy)。 */\nexport type WcsIoErrorPhase = \"probe\" | \"start\" | \"execute\" | \"decode\" | \"commit\" | \"dispose\";\n\n/** serializable な error info(non-cloneable な cause とは分離。DevTools / remote へは info のみ)。 */\nexport interface WcsIoErrorInfo {\n readonly code: string;\n readonly phase: WcsIoErrorPhase;\n readonly recoverable: boolean;\n readonly capabilityId?: string;\n readonly message: string;\n}\n\nexport interface PlatformAssessment {\n readonly availability: ReadonlyMap<string, Availability>;\n readonly permission: PermissionState;\n readonly readiness: Readiness;\n readonly activity: Activity;\n readonly preconditions: {\n readonly secureContext: PreconditionState;\n readonly userActivation: PreconditionState;\n };\n readonly epoch: number;\n readonly lastError?: WcsIoErrorInfo;\n}\n\n/** capability 1 件の仕様。probe は副作用なく presence を返す(利用直前に呼ぶ)。 */\nexport interface CapabilitySpec {\n readonly probe: () => boolean;\n readonly requiresSecureContext?: boolean;\n readonly requiresUserActivation?: boolean;\n /** browser compatibility dataset のキー(任意・診断用)。 */\n readonly compatKey?: string;\n}\n\nexport type CapabilityRegistry = ReadonlyMap<string, CapabilitySpec>;\n\nexport interface AssessOptions {\n readonly required: readonly string[];\n readonly optional?: readonly string[];\n readonly permission?: PermissionState;\n readonly activity?: Activity;\n readonly epoch?: number;\n readonly lastError?: WcsIoErrorInfo;\n}\n\nfunction isSecureContext(): boolean {\n return (globalThis as { isSecureContext?: unknown }).isSecureContext === true;\n}\n\n/**\n * capability を利用直前に評価して PlatformAssessment を作る。\n * required が 1 つでも欠ければ readiness は \"idle\"(開始不可)、\n * required 揃い + optional 欠けは \"degraded\"、全揃いは \"ready\"。\n */\nexport function assessCapabilities(registry: CapabilityRegistry, options: AssessOptions): PlatformAssessment {\n const availability = new Map<string, Availability>();\n const evaluate = (id: string): Availability => {\n const spec = registry.get(id);\n if (spec === undefined) return \"unknown\";\n return spec.probe() ? \"available\" : \"missing\";\n };\n\n let requiredAllAvailable = true;\n for (const id of options.required) {\n const a = evaluate(id);\n availability.set(id, a);\n if (a !== \"available\") requiredAllAvailable = false;\n }\n let optionalAllAvailable = true;\n for (const id of options.optional ?? []) {\n const a = evaluate(id);\n availability.set(id, a);\n if (a !== \"available\") optionalAllAvailable = false;\n }\n\n const readiness: Readiness = !requiredAllAvailable ? \"idle\" : (optionalAllAvailable ? \"ready\" : \"degraded\");\n\n // preconditions: 対象 capability のいずれかが要求する場合だけ評価する。\n const allIds = [...options.required, ...(options.optional ?? [])];\n const needsSecure = allIds.some((id) => registry.get(id)?.requiresSecureContext === true);\n const needsActivation = allIds.some((id) => registry.get(id)?.requiresUserActivation === true);\n const secureContext: PreconditionState = needsSecure ? (isSecureContext() ? \"satisfied\" : \"required\") : \"not-applicable\";\n const userActivation: PreconditionState = needsActivation ? \"required\" : \"not-applicable\";\n\n return {\n availability,\n permission: options.permission ?? \"not-applicable\",\n readiness,\n activity: options.activity ?? \"inactive\",\n preconditions: { secureContext, userActivation },\n epoch: options.epoch ?? 0,\n lastError: options.lastError,\n };\n}\n\n/** availability から「required がすべて available か」を判定するヘルパ(supported の最低条件)。 */\nexport function requiredCapabilitiesAvailable(assessment: PlatformAssessment, required: readonly string[]): boolean {\n return required.every((id) => assessment.availability.get(id) === \"available\");\n}\n\n/**\n * このページで機能が使えない理由(使える、または分からないなら null)。利用直前に読む。\n *\n * - `\"insecure-context\"`: 安全なコンテキストではない(`isSecureContext === false`)。\n * Permissions API が扱う機能はどれも安全なコンテキストを要る。\n * - `\"policy-blocked\"`: Permissions-Policy(サーバーのヘッダ、または `allow` の無い\n * `<iframe>`)がその機能を切っている。\n *\n * どちらも Permissions API は教えない: Chromium はポリシーで切られた文書でも\n * `granted` を、安全でない origin では `denied` を返す。利用者の拒否と区別するため、\n * 見張り役(`<wcs-permission>`)も取りに行く側も `unsupported` を報告する\n * (docs/v4-direction-2026-10.md の決定、state-field-report)。\n * `isSecureContext` が無い環境(SSR・テスト)は判断しない。\n */\nexport type FeatureUnavailableReason = \"insecure-context\" | \"policy-blocked\";\n\n/** Permissions-Policy が制御する機能(permission 名と同じ文字列)。 */\nconst POLICY_CONTROLLED = new Set([\n \"camera\", \"microphone\", \"geolocation\", \"midi\", \"clipboard-read\", \"clipboard-write\",\n \"screen-wake-lock\", \"idle-detection\", \"accelerometer\", \"gyroscope\", \"magnetometer\",\n \"ambient-light-sensor\", \"display-capture\",\n]);\n\ninterface PolicyLike { allowsFeature(feature: string): boolean }\n\nexport function featureUnavailable(feature: string): FeatureUnavailableReason | null {\n const g = globalThis as { isSecureContext?: unknown; document?: { permissionsPolicy?: PolicyLike; featurePolicy?: PolicyLike } };\n if (g.isSecureContext === false) return \"insecure-context\";\n if (!POLICY_CONTROLLED.has(feature)) return null;\n const policy = g.document?.permissionsPolicy ?? g.document?.featurePolicy;\n if (policy === undefined || typeof policy.allowsFeature !== \"function\") return null;\n try {\n return policy.allowsFeature(feature) ? null : \"policy-blocked\";\n } catch {\n return null;\n }\n}\n\n/** `featureUnavailable` の理由を、作者が直し方を読める文にする。`what` は文頭(「The camera」など)。 */\nexport function featureUnavailableMessage(what: string, feature: string, reason: FeatureUnavailableReason): string {\n return reason === \"insecure-context\"\n ? `${what} needs a secure context (https:, or http://localhost), and this page is not one.`\n : `${what} is turned off for this page by a Permissions-Policy: the server's Permissions-Policy header, ` +\n `or an <iframe> without allow=\"${feature}\". The browser's site settings cannot change that.`;\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 // このページで使えない(API 不在・安全でない origin・Permissions-Policy)。利用者の拒否\n // (permission-denied)と区別する — サイトの設定では直らない。\n CapabilityMissing: \"capability-missing\",\n} as const;\n\n/**\n * 正規化済み `GeolocationPositionError`(spec code 1/2/3)を serializable な error\n * taxonomy に写す。\"unexpected\" は code 2(position-unavailable)に畳むため、これは既存の\n * `error.code` を忠実にミラーする。permission-denied(1)だけは retry で回復しないため\n * recoverable=false。`unsupported`(このページで使えない — Core は `error.code` を 2 にする)\n * は capability-missing / probe / recoverable=false。\n */\nexport function deriveGeoErrorInfo(code: number, message: string, unsupported = false): WcsIoErrorInfo {\n if (unsupported) {\n return { code: WCS_GEO_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\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, featureUnavailable, featureUnavailableMessage } 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 // the errors that say this page cannot use geolocation (errorInfo: capability-missing)\n private _unsupportedErrors = new WeakSet<WcsGeoErrorDetail>();\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, this._unsupportedErrors.has(error)));\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 // Clear loading, with its event (timing-and-firing-contract §22): the bailed\n // callback above will not clear it, and a route the element leaves keeps its\n // nodes — bindings included — for the next entry, so a reset nobody heard would\n // leave the page showing an acquisition that is gone. Clearing it also keeps the\n // loading=true edge of the next acquisition after a reconnect.\n this._setLoading(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 && featureUnavailable(\"geolocation\") === null;\n }\n\n private _initPermission(): Promise<void> {\n // A page that cannot use geolocation (not a secure context, or turned off by a\n // Permissions-Policy) is \"unsupported\": the Permissions API answers \"granted\" in a\n // policy-blocked frame and \"denied\" on an insecure origin — a user's refusal, which\n // the site settings would fix and these cannot. Neither changes while the page lives.\n if (featureUnavailable(\"geolocation\") !== null) {\n this._setPermission(\"unsupported\");\n return Promise.resolve();\n }\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, or not available to this page: surface it as\n // POSITION_UNAVAILABLE (2) so consumers that switch on the spec error codes treat\n // it like any other unavailable fix; errorInfo says capability-missing.\n const reason = featureUnavailable(\"geolocation\");\n const error: WcsGeoErrorDetail = {\n code: 2,\n message: reason === null\n ? \"Geolocation API is not available in this environment.\"\n : featureUnavailableMessage(\"Geolocation\", \"geolocation\", reason),\n };\n this._unsupportedErrors.add(error);\n return error;\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// 属性になってしまったオブジェクトの入力(`files=\"[object File]\"`)を、要素ごとに 1 回だけ言う。\n// React 19 は定義前の要素にプロパティが無いのでオブジェクトを属性に書き、Vue の `.attr` も\n// 書く。要素はその入力をプロパティでしか読まないので、何も受け取らず、何も言わなかった\n// (docs/seam-apps.md、fw-inventory)。\nconst toldObjectAttribute = new WeakSet<object>();\n\nfunction warnObjectAttribute(element: object, name: string, value: string): void {\n if (toldObjectAttribute.has(element)) return;\n toldObjectAttribute.add(element);\n const tag = (element as { localName?: string }).localName ?? \"element\";\n console.warn(\n `[wcs/input-as-attribute] <${tag}> has the attribute ${name}=\"${value}\": an object was written as an ` +\n `attribute, so the element did not receive it. A framework does that when the property is set before the ` +\n `element's definition loads (React 19), or when told to (Vue's .attr). Load the definition before rendering, ` +\n `or assign the property through a ref (Vue: .prop). (Said once per element.)`,\n element,\n );\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n * - 値が `[object …]` の属性(属性に書かれてしまったオブジェクトの入力)は、要素ごとに 1 回警告する。\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 const getAttribute = (element as { getAttribute?: (name: string) => string | null }).getAttribute;\n for (const input of inputs) {\n const name = input.name;\n const attribute = typeof getAttribute === \"function\" ? getAttribute.call(element, name.toLowerCase()) : null;\n if (attribute !== null && attribute.startsWith(\"[object \")) warnObjectAttribute(element, name, attribute);\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","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/input-attribute.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// 属性へ反映する wc-bindable 入力の producer 側(SPEC-extensions § Producer guidance for inputs の P1〜P3)。\n// 入力の setter は属性をこの 2 関数で書く。それで次が揃う:\n// - `undefined` は「値が無い」(P1): 属性を、この関数で最初に書く前の状態 — マークアップに書かれた値、\n// 無ければ属性なし(= その入力の文書化した既定値)— へ戻す。applier プロファイルを宣言する binder は\n// 値の後の `undefined` を書き(A2)、React 19 も書き、直接の代入でも届く。\n// - `null` はクリア(P2): 属性なし、つまり文書化した既定値。\n// - どちらも文字列 \"undefined\" / \"null\" として属性に入らない。\n//\n// 「最初に書く前」は、その最初の書き込みのときに読む(遅延)。upgrade 前に代入されたプロパティは\n// connectedCallback の upgradeProperties() が通し直すので、そのときにはパーサが書いた属性が揃っている。\n// 要素自身が setter を通さずに書いた属性は、最初の書き込みより前なら「最初の状態」に含まれる。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/input-attribute.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/inputAttribute.ts). Those copies are generated — do not edit them.\n\nconst initialAttributes = new WeakMap<Element, Map<string, string | null>>();\n\n/** The attribute as it stood before the first write through these helpers. */\nfunction initialAttribute(el: Element, name: string): string | null {\n let byName = initialAttributes.get(el);\n if (byName === undefined) {\n byName = new Map();\n initialAttributes.set(el, byName);\n }\n if (!byName.has(name)) byName.set(name, el.getAttribute(name));\n return byName.get(name) as string | null;\n}\n\nfunction writeAttribute(el: Element, name: string, value: string | null): void {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n}\n\n/**\n * A value attribute. `value` is written as `String(value)`; `null` removes the attribute;\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value === null ? null : String(value));\n}\n\n/**\n * A boolean attribute, present while `value` is truthy (`null` and `false` remove it);\n * `undefined` restores the attribute the element started with.\n */\nexport function reflectBooleanAttribute(el: Element, name: string, value: unknown): void {\n const initial = initialAttribute(el, name);\n writeAttribute(el, name, value === undefined ? initial : value ? \"\" : null);\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\";\nimport { reflectAttribute, reflectBooleanAttribute } from \"../protocol/inputAttribute.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 // Input setters never let setAttribute stringify null / undefined (an\n // \"undefined\" timeout would silently fall back to Infinity): `null` removes the\n // attribute (the default), `undefined` restores the attribute the element\n // started with (wc-bindable producer guidance P1; React 19 and a direct\n // assignment deliver it, @wcstack/state does not).\n\n get highAccuracy(): boolean {\n return this.hasAttribute(\"high-accuracy\");\n }\n\n set highAccuracy(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"high-accuracy\", value);\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 | null | undefined) {\n reflectAttribute(this, \"timeout\", 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 | null | undefined) {\n reflectAttribute(this, \"maximum-age\", value);\n }\n\n get watch(): boolean {\n return this.hasAttribute(\"watch\");\n }\n\n set watch(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"watch\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean | null | undefined) {\n reflectBooleanAttribute(this, \"manual\", value);\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\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.geo)) {\n registry.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, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcstack/geolocation",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.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",
|
|
@@ -11,7 +11,10 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.esm.js"
|
|
13
13
|
},
|
|
14
|
-
"./auto":
|
|
14
|
+
"./auto": {
|
|
15
|
+
"types": "./dist/auto.d.ts",
|
|
16
|
+
"import": "./dist/auto.min.js"
|
|
17
|
+
}
|
|
15
18
|
},
|
|
16
19
|
"files": [
|
|
17
20
|
"dist"
|