@rpcbase/router 0.74.0 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -117,3 +117,4 @@ export {
117
117
  useApplyMeta,
118
118
  useRegisterNavigationGuard
119
119
  };
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/loadRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts"],"sourcesContent":["import { lazy } from \"react\"\nimport { LoaderFunction } from \"react-router\"\nimport { Loader, LoaderArgs } from \"@rpcbase/client\"\n\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: Loader\n}\n\ntype RouteWithLoader = {\n Component: React.LazyExoticComponent<React.ComponentType<unknown>>\n loader?: LoaderFunction\n}\n\nexport const loadRoute = (importPromise: Promise<RouteModule>): RouteWithLoader => {\n const Component = lazy(async () => {\n const module = await importPromise\n return { default: module.default }\n })\n\n const loader = async (args: LoaderArgs) => {\n const module = await importPromise\n if (!module.loader) return null\n return module.loader(args)\n }\n\n return { Component, loader: loader as unknown as LoaderFunction }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\nconst guards = new Map<string, NavigationGuard>()\nconst listeners = new Set<NavigationGuardsListener>()\n\nconst notify = (): void => {\n listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { LoaderFunction } from 'react-router';
2
- import { Loader } from '../../client/src';
2
+ import { Loader } from '@rpcbase/client';
3
3
  type RouteModule = {
4
4
  default: React.ComponentType<unknown>;
5
5
  loader?: Loader;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/router",
3
- "version": "0.74.0",
3
+ "version": "0.76.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"