@real-router/browser-plugin 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -1 +1 @@
1
- var e=require("@real-router/logger"),t=require("@real-router/core"),r=/^[A-Z_a-z][\w-]*(?:\.[A-Z_a-z][\w-]*)*$/;function n(e,t=new WeakSet){if(null==e)return!0;const r=typeof e;if("string"===r||"boolean"===r)return!0;if("number"===r)return Number.isFinite(e);if("function"===r||"symbol"===r)return!1;if(Array.isArray(e))return!t.has(e)&&(t.add(e),e.every(e=>n(e,t)));if("object"===r){if(t.has(e))return!1;t.add(e);const r=Object.getPrototypeOf(e);return(null===r||r===Object.prototype)&&Object.values(e).every(e=>n(e,t))}return!1}function a(e){if(null==e)return!0;const t=typeof e;return"string"===t||"boolean"===t||"number"===t&&Number.isFinite(e)}function o(e){if("object"!=typeof e||null===e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);if(null!==t&&t!==Object.prototype)return!1;let r=!1;for(const t in e){if(!Object.hasOwn(e,t))continue;const n=e[t];if(!a(n)){const e=typeof n;if("function"===e||"symbol"===e)return!1;r=!0;break}}return!r||n(e)}function s(e){if(null==e)return!0;const t=typeof e;return"string"===t||"boolean"===t||("number"===t?Number.isFinite(e):!!Array.isArray(e)&&e.every(e=>{const t=typeof e;return"string"===t||"boolean"===t||"number"===t&&Number.isFinite(e)}))}function i(e){if("object"!=typeof e||null===e)return!1;const t=e;return!("params"in t&&!function(e){if("object"!=typeof e||null===e||Array.isArray(e))return!1;for(const t in e)if(Object.hasOwn(e,t)&&!s(e[t]))return!1;return!0}(t.params)||"options"in t&&"object"!=typeof t.options||"id"in t&&"number"!=typeof t.id||"redirected"in t&&"boolean"!=typeof t.redirected||"source"in t&&"string"!=typeof t.source)}function c(e){return"string"==typeof(t=e.name)&&(""===t||!(t.length>1e4)&&(!!t.startsWith("@@")||r.test(t)))&&"string"==typeof e.path&&o(e.params);var t}function l(e){if("object"!=typeof e||null===e)return!1;const t=e;return!!c(t)&&(void 0===t.meta||i(t.meta))}function u(e){if("object"!=typeof e||null===e)return!1;const t=e;return!!c(t)&&"meta"in t&&i(t.meta)}var h={forceDeactivate:!0,useHash:!1,hashPrefix:"",base:"",mergeState:!1,preserveHash:!0},p="popstate",f="browser-plugin",g=()=>{},d=new Map,b=e=>{const t=d.get(e);if(void 0!==t)return t;const r=e.replaceAll(/[$()*+.?[\\\]^{|}-]/g,String.raw`\$&`);return d.set(e,r),r};function m(e,t,r,n,a){const o={meta:e.meta,name:e.name,params:e.params,path:e.path},s=a.mergeState&&n.getState()?{...n.getState(),...o}:o;r?n.replaceState(s,"",t):n.pushState(s,"",t)}function y(e,t){return e in t}function v(e,t,r){const n=typeof t;return n===r||void 0===t||(console.warn(`[${f}] Invalid type for '${e}': expected ${r}, got ${n}`),!1)}var S=()=>{},w=()=>globalThis.location.pathname,T=(()=>{let e,t=!1;return()=>{const r=globalThis.navigator.userAgent;return r!==e&&(e=r,t=!r.includes("Trident")),t}})(),$=(e,t,r)=>{globalThis.history.pushState(e,t??"",r)},H=(e,t,r)=>{globalThis.history.replaceState(e,t??"",r)},P=(e,t)=>{const r=t.useHash&&!T();return globalThis.addEventListener("popstate",e),r&&globalThis.addEventListener("hashchange",e),()=>{globalThis.removeEventListener("popstate",e),r&&globalThis.removeEventListener("hashchange",e)}},j=(()=>{const e=new Map;return t=>{let r=e.get(t);return r||(r=new RegExp(t),e.set(t,r)),r}})(),L=e=>{const{useHash:t,hashPrefix:r="",base:n=""}=e;if(!r&&!n){const e=t?globalThis.location.hash.slice(1):globalThis.location.pathname;return(O(e)||"/")+globalThis.location.search}const a=b(r),o=b(n),s=t?globalThis.location.hash.replace(j(`^#${a}`),""):globalThis.location.pathname.replace(j(`^${o}`),"");return(O(s)||"/")+globalThis.location.search},O=t=>{try{return encodeURI(decodeURI(t))}catch(r){return e.logger.warn(f,`Could not encode path "${t}"`,r),t}},x=()=>{if(globalThis.history.state){if(u(globalThis.history.state))return globalThis.history.state;e.logger.warn(f,"History state is not a valid state object, ignoring",globalThis.history.state)}},A=()=>globalThis.location.hash;exports.browserPluginFactory=function(r,n=function(){return void 0!==globalThis.window&&globalThis.history?{getBase:w,pushState:$,replaceState:H,addPopstateListener:P,getLocation:L,getState:x,getHash:A}:function(){let t=!1;const r=r=>{t||(e.logger.warn(f,`Browser plugin is running in a non-browser environment. Method "${r}" is a no-op. This is expected for SSR, but may indicate misconfiguration if you expected browser behavior.`),t=!0)};return{getBase:()=>(r("getBase"),""),pushState:()=>{r("pushState")},replaceState:()=>{r("replaceState")},addPopstateListener:()=>(r("addPopstateListener"),S),getLocation:()=>(r("getLocation"),""),getState:()=>{r("getState")},getHash:()=>(r("getHash"),"")}}()}()){const a=function(e,t){if(!e)return!1;let r=!1;for(const n of Object.keys(e))y(n,t)&&(v(n,e[n],typeof t[n])||(r=!0));if(!0===e.useHash&&"preserveHash"in e&&console.warn(`[${f}] preserveHash ignored in hash mode`),!1===e.useHash&&"hashPrefix"in e){const t=e.hashPrefix;void 0!==t&&""!==t&&console.warn(`[${f}] hashPrefix ignored in history mode`)}return r}(r,h);let o={...h,...r};a&&(console.warn(`[${f}] Using default options due to invalid types`),o={...h}),!0===o.useHash?delete o.preserveHash:delete o.hashPrefix,o.base&&"string"==typeof o.base&&(o.base.startsWith("/")||(o.base=`/${o.base}`),o.base.endsWith("/")&&(o.base=o.base.slice(0,-1)));const s=new Map,i=e=>{const t=s.get(e);if(void 0!==t)return t;const r=new RegExp(e);return s.set(e,r),r},c=o.forceDeactivate,u=void 0===c?{source:p,replace:!0}:{forceDeactivate:c,source:p,replace:!0};let d;return function(e){const r=e.start;let a,s=!1,c=null;const h=()=>o.base??"",y=o.hashPrefix??"",v=b(y),S=o.useHash?`#${y}`:"",w=v?i(`^#${v}`):null;function T(){if(c){const e=c;c=null,console.warn(`[${f}] Processing deferred popstate event`),$(e)}}function $(r){if(s)return console.warn(`[${f}] Transition in progress, deferring popstate event`),void(c=r);try{const a=e.getState(),i=function(e,t,r,n,a){return l(e.state)?t.makeState(e.state.name,e.state.params,e.state.path,{...e.state.meta,params:e.state.meta?.params??{},options:e.state.meta?.options??{},redirected:!!e.state.meta?.redirected,source:a},e.state.meta?.id):t.matchPath(r.getLocation(n),a)}(r,e,n,o,p),c=!l(r.state);if(!i&&function(e,t){const r=e.getOptions(),{defaultRoute:n}=r;return!!n&&(e.navigateToDefault({...t,reload:!0,replace:!0}),!0)}(e,u))return;if(function(e,t,r){return!e||!(!t||!r.areStatesEqual(e,t,!1))}(i,a,e))return;s=!0,e.navigateToState(i,a,u,(r,i)=>{s=!1,function(e,r,n,a,o,s,i){e&&e.code===t.errorCodes.CANNOT_DEACTIVATE&&r&&n&&!a&&m(n,o.buildUrl(n.name,n.params),!0,s,i)}(r,i,a,c,e,n,o),T()},!0)}catch(t){s=!1,console.error(`[${f}] Critical error in onPopState`,t);try{const t=e.getState();if(t){const r=e.buildUrl(t.name,t.params);n.replaceState(t,"",r)}}catch(e){console.error(`[${f}] Failed to recover from critical error`,e)}T()}}return e.start=(...t)=>{const[a,s]=function(e,t,r){if(0===e.length){const e=t.getLocation(r);return"/"===e?[void 0,g]:[e,g]}if(1===e.length)return"function"==typeof e[0]?[t.getLocation(r),e[0]]:[e[0],g];const[n,a]=e;return[n,a]}(t,n,o);return a?r(a,s):r(s),e},e.buildUrl=(t,r)=>{const n=e.buildPath(t,r);return h()+S+n},e.matchUrl=t=>{const r=(e=>{try{const t=new URL(e,globalThis.location.origin),r=t.pathname,n=t.hash,a=t.search,s=h();if(!["http:","https:"].includes(t.protocol))return console.warn(`[${f}] Invalid URL protocol in ${e}`),null;if(o.useHash)return(w?n.replace(w,""):n.slice(1))+a;if(s){const e=b(s),t=i(`^${e}`),n=r.replace(t,"");return(n.startsWith("/")?"":"/")+n+a}return r+a}catch(t){return console.warn(`[${f}] Could not parse url ${e}`,t),null}})(t);return r?e.matchPath(r,p):void 0},e.replaceHistoryState=(t,r={})=>{const a=e.buildState(t,r);if(!a)throw new Error(`[real-router] Cannot replace state: route "${t}" is not found`);m(e.makeState(a.name,a.params,e.buildPath(a.name,a.params),{params:a.meta,options:{},redirected:!1},1),e.buildUrl(t,r),!0,n,o)},Object.defineProperty(e,"lastKnownState",{get:()=>a,set(e){a=e?Object.freeze({...e}):void 0},enumerable:!0,configurable:!0}),{onStart:()=>{d&&d(),d=n.addPopstateListener($,o)},onStop:()=>{d&&(d(),d=void 0)},onTransitionSuccess:(t,r,a)=>{e.lastKnownState=t;const s=(a.replace??!r)||!!a.reload&&e.areStatesEqual(t,r,!1),i=e.buildUrl(t.name,t.params);m(t,!o.preserveHash||r&&r.path!==t.path?i:i+n.getHash(),s,n,o)},teardown:()=>{d&&(d(),d=void 0),e.start=r,delete e.buildUrl,delete e.matchUrl,delete e.replaceHistoryState,delete e.lastKnownState}}}},exports.isHistoryState=u,exports.isState=l;//# sourceMappingURL=index.js.map
1
+ "use strict";var e=require("@real-router/logger"),t=require("@real-router/core"),r=/^[A-Z_a-z][\w-]*(?:\.[A-Z_a-z][\w-]*)*$/;function n(e,t=new WeakSet){if(null==e)return!0;const r=typeof e;if("string"===r||"boolean"===r)return!0;if("number"===r)return Number.isFinite(e);if("function"===r||"symbol"===r)return!1;if(Array.isArray(e))return!t.has(e)&&(t.add(e),e.every(e=>n(e,t)));if("object"===r){if(t.has(e))return!1;t.add(e);const r=Object.getPrototypeOf(e);return(null===r||r===Object.prototype)&&Object.values(e).every(e=>n(e,t))}return!1}function a(e){if(null==e)return!0;const t=typeof e;return"string"===t||"boolean"===t||"number"===t&&Number.isFinite(e)}function o(e){if("object"!=typeof e||null===e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);if(null!==t&&t!==Object.prototype)return!1;let r=!1;for(const t in e){if(!Object.hasOwn(e,t))continue;const n=e[t];if(!a(n)){const e=typeof n;if("function"===e||"symbol"===e)return!1;r=!0;break}}return!r||n(e)}function s(e){if(null==e)return!0;const t=typeof e;return"string"===t||"boolean"===t||("number"===t?Number.isFinite(e):!!Array.isArray(e)&&e.every(e=>{const t=typeof e;return"string"===t||"boolean"===t||"number"===t&&Number.isFinite(e)}))}function i(e){if("object"!=typeof e||null===e)return!1;const t=e;return!("params"in t&&!function(e){if("object"!=typeof e||null===e||Array.isArray(e))return!1;for(const t in e)if(Object.hasOwn(e,t)&&!s(e[t]))return!1;return!0}(t.params)||"options"in t&&"object"!=typeof t.options||"id"in t&&"number"!=typeof t.id||"redirected"in t&&"boolean"!=typeof t.redirected||"source"in t&&"string"!=typeof t.source)}function c(e){return"string"==typeof(t=e.name)&&(""===t||!(t.length>1e4)&&(!!t.startsWith("@@")||r.test(t)))&&"string"==typeof e.path&&o(e.params);var t}function l(e){if("object"!=typeof e||null===e)return!1;const t=e;return!!c(t)&&(void 0===t.meta||i(t.meta))}function u(e){if("object"!=typeof e||null===e)return!1;const t=e;return!!c(t)&&"meta"in t&&i(t.meta)}var h={forceDeactivate:!0,useHash:!1,hashPrefix:"",base:"",mergeState:!1,preserveHash:!0},p="popstate",f="browser-plugin",g=()=>{},d=new Map,b=e=>{const t=d.get(e);if(void 0!==t)return t;const r=e.replaceAll(/[$()*+.?[\\\]^{|}-]/g,String.raw`\$&`);return d.set(e,r),r};function m(e,t,r,n,a){const o={meta:e.meta,name:e.name,params:e.params,path:e.path},s=a.mergeState&&n.getState()?{...n.getState(),...o}:o;r?n.replaceState(s,"",t):n.pushState(s,"",t)}function y(e,t){return e in t}function v(e,t,r){const n=typeof t;return n===r||void 0===t||(console.warn(`[${f}] Invalid type for '${e}': expected ${r}, got ${n}`),!1)}var S=()=>{},w=()=>globalThis.location.pathname,T=(()=>{let e,t=!1;return()=>{const r=globalThis.navigator.userAgent;return r!==e&&(e=r,t=!r.includes("Trident")),t}})(),$=(e,t,r)=>{globalThis.history.pushState(e,t??"",r)},H=(e,t,r)=>{globalThis.history.replaceState(e,t??"",r)},P=(e,t)=>{const r=t.useHash&&!T();return globalThis.addEventListener("popstate",e),r&&globalThis.addEventListener("hashchange",e),()=>{globalThis.removeEventListener("popstate",e),r&&globalThis.removeEventListener("hashchange",e)}},j=(()=>{const e=new Map;return t=>{let r=e.get(t);return r||(r=new RegExp(t),e.set(t,r)),r}})(),L=e=>{const{useHash:t,hashPrefix:r="",base:n=""}=e;if(!r&&!n){const e=t?globalThis.location.hash.slice(1):globalThis.location.pathname;return(O(e)||"/")+globalThis.location.search}const a=b(r),o=b(n),s=t?globalThis.location.hash.replace(j(`^#${a}`),""):globalThis.location.pathname.replace(j(`^${o}`),"");return(O(s)||"/")+globalThis.location.search},O=t=>{try{return encodeURI(decodeURI(t))}catch(r){return e.logger.warn(f,`Could not encode path "${t}"`,r),t}},x=()=>{if(globalThis.history.state){if(u(globalThis.history.state))return globalThis.history.state;e.logger.warn(f,"History state is not a valid state object, ignoring",globalThis.history.state)}},A=()=>globalThis.location.hash;exports.browserPluginFactory=function(r,n=function(){return void 0!==globalThis.window&&globalThis.history?{getBase:w,pushState:$,replaceState:H,addPopstateListener:P,getLocation:L,getState:x,getHash:A}:function(){let t=!1;const r=r=>{t||(e.logger.warn(f,`Browser plugin is running in a non-browser environment. Method "${r}" is a no-op. This is expected for SSR, but may indicate misconfiguration if you expected browser behavior.`),t=!0)};return{getBase:()=>(r("getBase"),""),pushState:()=>{r("pushState")},replaceState:()=>{r("replaceState")},addPopstateListener:()=>(r("addPopstateListener"),S),getLocation:()=>(r("getLocation"),""),getState:()=>{r("getState")},getHash:()=>(r("getHash"),"")}}()}()){const a=function(e,t){if(!e)return!1;let r=!1;for(const n of Object.keys(e))y(n,t)&&(v(n,e[n],typeof t[n])||(r=!0));if(!0===e.useHash&&"preserveHash"in e&&console.warn(`[${f}] preserveHash ignored in hash mode`),!1===e.useHash&&"hashPrefix"in e){const t=e.hashPrefix;void 0!==t&&""!==t&&console.warn(`[${f}] hashPrefix ignored in history mode`)}return r}(r,h);let o={...h,...r};a&&(console.warn(`[${f}] Using default options due to invalid types`),o={...h}),!0===o.useHash?delete o.preserveHash:delete o.hashPrefix,o.base&&"string"==typeof o.base&&(o.base.startsWith("/")||(o.base=`/${o.base}`),o.base.endsWith("/")&&(o.base=o.base.slice(0,-1)));const s=new Map,i=e=>{const t=s.get(e);if(void 0!==t)return t;const r=new RegExp(e);return s.set(e,r),r},c=o.forceDeactivate,u=void 0===c?{source:p,replace:!0}:{forceDeactivate:c,source:p,replace:!0};let d;return function(e){const r=e.start;let a,s=!1,c=null;const h=()=>o.base??"",y=o.hashPrefix??"",v=b(y),S=o.useHash?`#${y}`:"",w=v?i(`^#${v}`):null;function T(){if(c){const e=c;c=null,console.warn(`[${f}] Processing deferred popstate event`),$(e)}}function $(r){if(s)return console.warn(`[${f}] Transition in progress, deferring popstate event`),void(c=r);try{const a=e.getState(),i=function(e,t,r,n,a){return l(e.state)?t.makeState(e.state.name,e.state.params,e.state.path,{...e.state.meta,params:e.state.meta?.params??{},options:e.state.meta?.options??{},redirected:!!e.state.meta?.redirected,source:a},e.state.meta?.id):t.matchPath(r.getLocation(n),a)}(r,e,n,o,p),c=!l(r.state);if(!i&&function(e,t){const r=e.getOptions(),{defaultRoute:n}=r;return!!n&&(e.navigateToDefault({...t,reload:!0,replace:!0}),!0)}(e,u))return;if(function(e,t,r){return!e||!(!t||!r.areStatesEqual(e,t,!1))}(i,a,e))return;s=!0,e.navigateToState(i,a,u,(r,i)=>{s=!1,function(e,r,n,a,o,s,i){e&&e.code===t.errorCodes.CANNOT_DEACTIVATE&&r&&n&&!a&&m(n,o.buildUrl(n.name,n.params),!0,s,i)}(r,i,a,c,e,n,o),T()},!0)}catch(t){s=!1,console.error(`[${f}] Critical error in onPopState`,t);try{const t=e.getState();if(t){const r=e.buildUrl(t.name,t.params);n.replaceState(t,"",r)}}catch(e){console.error(`[${f}] Failed to recover from critical error`,e)}T()}}return e.start=(...t)=>{const[a,s]=function(e,t,r){if(0===e.length){const e=t.getLocation(r);return"/"===e?[void 0,g]:[e,g]}if(1===e.length)return"function"==typeof e[0]?[t.getLocation(r),e[0]]:[e[0],g];const[n,a]=e;return[n,a]}(t,n,o);return a?r(a,s):r(s),e},e.buildUrl=(t,r)=>{const n=e.buildPath(t,r);return h()+S+n},e.matchUrl=t=>{const r=(e=>{try{const t=new URL(e,globalThis.location.origin),r=t.pathname,n=t.hash,a=t.search,s=h();if(!["http:","https:"].includes(t.protocol))return console.warn(`[${f}] Invalid URL protocol in ${e}`),null;if(o.useHash)return(w?n.replace(w,""):n.slice(1))+a;if(s){const e=b(s),t=i(`^${e}`),n=r.replace(t,"");return(n.startsWith("/")?"":"/")+n+a}return r+a}catch(t){return console.warn(`[${f}] Could not parse url ${e}`,t),null}})(t);return r?e.matchPath(r,p):void 0},e.replaceHistoryState=(t,r={})=>{const a=e.buildState(t,r);if(!a)throw new Error(`[real-router] Cannot replace state: route "${t}" is not found`);m(e.makeState(a.name,a.params,e.buildPath(a.name,a.params),{params:a.meta,options:{},redirected:!1},1),e.buildUrl(t,r),!0,n,o)},Object.defineProperty(e,"lastKnownState",{get:()=>a,set(e){a=e?Object.freeze({...e}):void 0},enumerable:!0,configurable:!0}),{onStart:()=>{d&&d(),d=n.addPopstateListener($,o)},onStop:()=>{d&&(d(),d=void 0)},onTransitionSuccess:(t,r,a)=>{e.lastKnownState=t;const s=(a.replace??!r)||!!a.reload&&e.areStatesEqual(t,r,!1),i=e.buildUrl(t.name,t.params);m(t,!o.preserveHash||r&&r.path!==t.path?i:i+n.getHash(),s,n,o)},teardown:()=>{d&&(d(),d=void 0),e.start=r,delete e.buildUrl,delete e.matchUrl,delete e.replaceHistoryState,delete e.lastKnownState}}}},exports.isHistoryState=u,exports.isState=l;//# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@real-router/browser-plugin",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "type": "commonjs",
5
5
  "description": "Browser integration plugin with History API, hash routing, and popstate support",
6
6
  "main": "./dist/cjs/index.js",
@@ -43,13 +43,13 @@
43
43
  },
44
44
  "sideEffects": false,
45
45
  "dependencies": {
46
- "@real-router/core": "^0.10.0",
46
+ "@real-router/core": "^0.12.0",
47
47
  "@real-router/logger": "^0.2.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@testing-library/jest-dom": "6.9.1",
51
51
  "jsdom": "27.4.0",
52
- "type-guards": "^0.1.4"
52
+ "type-guards": "^0.1.6"
53
53
  },
54
54
  "scripts": {
55
55
  "test": "vitest",