UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

195 lines 15.2 kB
"use strict"; /** * Framework Adapters for Router * Universal router integration with React, Svelte, Vue, etc. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createTestRouter = exports.createSSRRouter = exports.useRouter = exports.useSolidRouter = exports.useVueRouter = exports.useSvelteRouter = exports.useReactTreeRouter = exports.useReactRouter = void 0; const router_1 = require("./router"); const navigation_1 = require("./navigation"); /** * React Router Adapter */ const useReactRouter = (routes) => { const React = require('react'); const routerSignal = (0, router_1.router)(routes, (0, navigation_1.createBrowserNav)()); // Force re-renders when route changes const [, forceUpdate] = React.useReducer((x) => x + 1, 0); React.useEffect(() => { const unsubscribe = routerSignal.subscribe(() => forceUpdate()); return unsubscribe; }, []); return { route: routerSignal.route.value(), params: routerSignal.params.value(), navigate: (to) => { routerSignal.navigate(to); }, back: () => routerSignal.back(), forward: () => routerSignal.forward(), replace: (to) => routerSignal.replace(to) }; }; exports.useReactRouter = useReactRouter; /** * React Tree Router Adapter */ const useReactTreeRouter = (tree) => { const React = require('react'); const routerSignal = (0, router_1.treeRouter)(tree, (0, navigation_1.createBrowserNav)()); const [, forceUpdate] = React.useReducer((x) => x + 1, 0); React.useEffect(() => { const unsubscribe = routerSignal.subscribe(() => forceUpdate()); return unsubscribe; }, []); return { route: routerSignal.route.value(), params: routerSignal.params.value(), navigate: (to) => routerSignal.navigate(to), back: () => routerSignal.back(), forward: () => routerSignal.forward(), replace: (to) => routerSignal.replace(to) }; }; exports.useReactTreeRouter = useReactTreeRouter; /** * Svelte Router Adapter */ const useSvelteRouter = (routes) => { const routerSignal = (0, router_1.router)(routes, (0, navigation_1.createBrowserNav)()); // In Svelte 5, we can use $effect for reactivity if (typeof globalThis !== 'undefined' && globalThis.$effect) { globalThis.$effect(() => { // This will automatically track the router signal routerSignal.value(); }); } return { route: routerSignal.route, params: routerSignal.params, navigate: (to) => routerSignal.navigate(to), back: () => routerSignal.back(), forward: () => routerSignal.forward(), replace: (to) => routerSignal.replace(to) }; }; exports.useSvelteRouter = useSvelteRouter; /** * Vue Router Adapter */ const useVueRouter = (routes) => { const vue = require('vue'); const routerSignal = (0, router_1.router)(routes, (0, navigation_1.createBrowserNav)()); const route = vue.ref(routerSignal.route.value()); const params = vue.ref(routerSignal.params.value()); // Watch for changes routerSignal.subscribe(() => { route.value = routerSignal.route.value(); params.value = routerSignal.params.value(); }); return { route, params, navigate: (to) => routerSignal.navigate(to), back: () => routerSignal.back(), forward: () => routerSignal.forward(), replace: (to) => routerSignal.replace(to) }; }; exports.useVueRouter = useVueRouter; /** * SolidJS Router Adapter */ const useSolidRouter = (routes) => { const solid = require('solid-js'); const routerSignal = (0, router_1.router)(routes, (0, navigation_1.createBrowserNav)()); const [route, setRoute] = solid.createSignal(routerSignal.route.value()); const [params, setParams] = solid.createSignal(routerSignal.params.value()); // Subscribe to changes routerSignal.subscribe(() => { setRoute(routerSignal.route.value()); setParams(routerSignal.params.value()); }); return { route, params, navigate: (to) => routerSignal.navigate(to), back: () => routerSignal.back(), forward: () => routerSignal.forward(), replace: (to) => routerSignal.replace(to) }; }; exports.useSolidRouter = useSolidRouter; /** * Universal Router Hook * Automatically detects framework and returns appropriate adapter */ const useRouter = (routes) => { // Framework detection if (typeof window !== 'undefined') { // Check for React if (globalThis.React || window.React) { return (0, exports.useReactRouter)(routes); } // Check for Vue if (globalThis.Vue || window.Vue) { return (0, exports.useVueRouter)(routes); } // Check for SolidJS if (globalThis.solid || window.solid) { return (0, exports.useSolidRouter)(routes); } // Default to Svelte return (0, exports.useSvelteRouter)(routes); } // SSR fallback return { route: { tag: 'None' }, params: null, navigate: (_to) => { }, back: () => { }, forward: () => { }, replace: (_to) => { } }; }; exports.useRouter = useRouter; /** * Server-Side Rendering Adapter */ const createSSRRouter = (routes, initialPath) => { const env = (0, navigation_1.createNodeNav)(initialPath); const routerSignal = (0, router_1.router)(routes, env); return { getRoute: () => routerSignal.route.value(), getParams: () => routerSignal.params.value(), setPath: (path) => env.setPath(path), render: () => { const route = routerSignal.route.value(); const params = routerSignal.params.value(); return { route, params, path: env.getCurrentPath() }; } }; }; exports.createSSRRouter = createSSRRouter; /** * Testing Adapter */ const createTestRouter = (routes, initialPath = '/') => { const { createMemoryNav } = require('./navigation'); const env = createMemoryNav(initialPath); const routerSignal = (0, router_1.router)(routes, env); return { router: routerSignal, navigate: (to) => routerSignal.navigate(to), getPath: () => env.getCurrentPath(), setPath: (path) => env.setPath(path), back: () => routerSignal.back(), forward: () => routerSignal.forward() }; }; exports.createTestRouter = createTestRouter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVyL2FkYXB0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUdILHFDQUE4QztBQUM5Qyw2Q0FBK0Q7QUFFL0Q7O0dBRUc7QUFDSSxNQUFNLGNBQWMsR0FBRyxDQUFJLE1BQWtCLEVBQUUsRUFBRTtJQUN0RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBQSxlQUFNLEVBQUMsTUFBTSxFQUFFLElBQUEsNkJBQWdCLEdBQUUsQ0FBQyxDQUFDO0lBRXhELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxFLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ25CLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxPQUFPO1FBQ0wsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQ2pDLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNuQyxRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtZQUN2QixZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtRQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxD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