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.
199 lines • 14.2 kB
JavaScript
;
/**
* Navigation Monad Implementation
* Monadic composition for route changes
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.navigation = exports.createNavigationEffects = exports.createMemoryNav = exports.createNodeNav = exports.createBrowserNav = exports.pureNavigation = void 0;
const effect_1 = require("../core/effect");
/**
* Creates a Navigation monad that follows monadic laws
*/
const createNavigation = (route, env) => {
const navigationInstance = {
...route,
bind: (f) => {
// Monadic bind - composition of navigations
const currentParams = route.parse(env.getCurrentPath());
if (!currentParams) {
// If current route doesn't match, return a failed navigation
return createNavigation({
path: '',
params: {},
map: (_g) => createNavigation(route, env),
matches: () => false,
parse: () => null,
generate: () => ''
}, env);
}
return f(currentParams);
},
navigate: () => {
return (0, effect_1.pureEffect)((() => {
const currentPath = env.getCurrentPath();
const params = route.parse(currentPath);
if (params) {
return params;
}
else {
// Navigate to this route
const newPath = route.generate({}); // Need params for generation
env.setPath(newPath);
return route.parse(newPath);
}
})());
}
};
return navigationInstance;
};
/**
* Pure function for Navigation monad - left identity law
*/
const pureNavigation = (value, env) => {
// Create a synthetic route that always matches and returns the value
const syntheticRoute = {
path: env.getCurrentPath(),
params: value,
map: (f) => ({
path: env.getCurrentPath(),
params: f(value),
map: (g) => (0, exports.pureNavigation)(g(f(value)), env),
matches: () => true,
parse: () => f(value),
generate: () => env.getCurrentPath()
}),
matches: () => true,
parse: () => value,
generate: () => env.getCurrentPath()
};
return createNavigation(syntheticRoute, env);
};
exports.pureNavigation = pureNavigation;
/**
* Navigation Environment Implementations
*/
/**
* Browser Navigation Environment
*/
const createBrowserNav = () => ({
getCurrentPath: () => {
if (typeof window === 'undefined')
return '/';
return window.location.pathname + window.location.search + window.location.hash;
},
setPath: (path, replace = false) => {
if (typeof window === 'undefined')
return;
if (replace) {
window.history.replaceState({}, '', path);
}
else {
window.history.pushState({}, '', path);
}
// Dispatch a custom event for listeners
window.dispatchEvent(new PopStateEvent('popstate'));
},
onPathChange: (fn) => {
if (typeof window === 'undefined')
return () => { };
const handler = () => {
fn(window.location.pathname + window.location.search + window.location.hash);
};
window.addEventListener('popstate', handler);
return () => window.removeEventListener('popstate', handler);
}
});
exports.createBrowserNav = createBrowserNav;
/**
* Node.js Navigation Environment (for SSR)
*/
const createNodeNav = (initialPath = '/') => {
let currentPath = initialPath;
const listeners = [];
return {
getCurrentPath: () => currentPath,
setPath: (path) => {
currentPath = path;
listeners.forEach(fn => fn(path));
},
onPathChange: (fn) => {
listeners.push(fn);
return () => {
const index = listeners.indexOf(fn);
if (index > -1)
listeners.splice(index, 1);
};
}
};
};
exports.createNodeNav = createNodeNav;
/**
* Memory Navigation Environment (for testing)
*/
const createMemoryNav = (initialPath = '/') => {
let currentPath = initialPath;
const history = [initialPath];
let currentIndex = 0;
const listeners = [];
const notifyListeners = () => {
listeners.forEach(fn => fn(currentPath));
};
return {
getCurrentPath: () => currentPath,
setPath: (path, replace = false) => {
if (replace) {
history[currentIndex] = path;
}
else {
// Remove any forward history
history.splice(currentIndex + 1);
history.push(path);
currentIndex = history.length - 1;
}
currentPath = path;
notifyListeners();
},
onPathChange: (fn) => {
listeners.push(fn);
return () => {
const index = listeners.indexOf(fn);
if (index > -1)
listeners.splice(index, 1);
};
}
};
};
exports.createMemoryNav = createMemoryNav;
/**
* Navigation Effects - additional navigation operations
*/
const createNavigationEffects = (env) => ({
back: () => (0, effect_1.pureEffect)((() => {
if (typeof window !== 'undefined') {
window.history.back();
}
})()),
forward: () => (0, effect_1.pureEffect)((() => {
if (typeof window !== 'undefined') {
window.history.forward();
}
})()),
go: (delta) => (0, effect_1.pureEffect)((() => {
if (typeof window !== 'undefined') {
window.history.go(delta);
}
})()),
replace: (path) => (0, effect_1.pureEffect)((() => {
env.setPath(path, true);
})()),
push: (path) => (0, effect_1.pureEffect)((() => {
env.setPath(path, false);
})())
});
exports.createNavigationEffects = createNavigationEffects;
/**
* Export navigation constructor
*/
const navigation = (route, env) => createNavigation(route, env);
exports.navigation = navigation;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXIvbmF2aWdhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFHSCwyQ0FBb0Q7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLEtBQWUsRUFDZixHQUFrQixFQUNILEVBQUU7SUFDakIsTUFBTSxrQkFBa0IsR0FBa0I7UUFDeEMsR0FBRyxLQUFLO1FBRVIsSUFBSSxFQUFFLENBQUksQ0FBMEIsRUFBaUIsRUFBRTtZQUNyRCw0Q0FBNEM7WUFDNUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLDZEQUE2RDtnQkFDN0QsT0FBTyxnQkFBZ0IsQ0FDckI7b0JBQ0UsSUFBSSxFQUFFLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLEVBQU87b0JBQ2YsR0FBRyxFQUFFLENBQUksRUFBZSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFZLEVBQUUsR0FBRyxDQUFRO29CQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSztvQkFDcEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7b0JBQ2pCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO2lCQUNuQixFQUNELEdBQUcsQ0FDSixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxRQUFRLEVBQUUsR0FBYyxFQUFFO1lBQ3hCLE9BQU8sSUFBQSxtQkFBVSxFQUFDLENBQUMsR0FBRyxFQUFFO2dCQUN0QixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FB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