UNPKG

viewlogic

Version:

A lightweight, file-based routing system for Vue 3 applications with zero build configuration

139 lines (118 loc) 4.96 kB
/** * ViewLogic Router - UMD Bundle * Optimized version with cleaner Promise handling */ (function (root, factory) { if (typeof define === 'function' && define.amd) { define([], factory); } else if (typeof module === 'object' && module.exports) { module.exports = factory(); } else { var api = factory(); root.createRouter = api.createRouter; root.ViewLogicRouter = api.ViewLogicRouter; } }(typeof self !== 'undefined' ? self : this, function () { 'use strict'; let RouterClass = null; let loadPromise = null; function detectEnvironment(options) { return (options && options.environment) || 'development'; } function getBaseUrl() { // Try to detect current script URL to determine base path if (typeof document !== 'undefined') { const scripts = Array.from(document.scripts); const currentScript = scripts.find(script => script.src && script.src.includes('viewlogic-router.umd.js') ); if (currentScript) { const url = new URL(currentScript.src); const baseUrl = url.origin + url.pathname.replace(/\/[^\/]*$/, '/'); return baseUrl; } } return 'https://cdn.jsdelivr.net/npm/viewlogic/dist/'; } function getRouterPath(environment) { const baseUrl = getBaseUrl(); return environment === 'production' ? baseUrl + 'viewlogic-router.min.js' : baseUrl + 'viewlogic-router.js'; } function setGlobalRouter(router) { try { root.router = router; } catch(_) { try { window.router = router; } catch(__) {} } } async function loadRouterClass(options) { if (RouterClass) return RouterClass; if (!loadPromise) { const environment = detectEnvironment(options); const routerPath = getRouterPath(environment); loadPromise = import(routerPath) .then(module => { RouterClass = module.ViewLogicRouter; return RouterClass; }) .catch(error => { // More robust error checking for failed module loading const isLoadError = error?.message?.includes('Failed to fetch') || error?.message?.includes('404') || error?.message?.includes('Cannot find module') || error?.message?.includes('Failed to resolve'); if (environment === 'production' && isLoadError) { console.warn('Failed to load minified version, falling back to regular version'); const baseUrl = getBaseUrl(); return import(baseUrl + 'viewlogic-router.js').then(module => { RouterClass = module.ViewLogicRouter; return RouterClass; }); } throw error; }); } return loadPromise; } async function createRouter(options = {}) { const RouterConstructor = await loadRouterClass(options); const router = new RouterConstructor(options); // 라우터 생성 즉시 전역에 설정 setGlobalRouter(router); if (!router.mount) { router.mount = function(el) { // mount 시에도 다시 설정 (안전장치) setGlobalRouter(router); return router; }; } return router; } function ViewLogicRouter(options = {}) { const routerPromise = createRouter(options); // Promise 완료 시 즉시 전역 설정 확인 routerPromise.then(router => { setGlobalRouter(router); }).catch(error => { console.error('Failed to create ViewLogic router:', error); throw error; }); routerPromise.mount = function(el) { return routerPromise.then(router => { // mount 시에도 다시 설정 (안전장치) setGlobalRouter(router); if (router.mount) { return router.mount(el); } return router; }).catch(error => { console.error('Failed to mount ViewLogic router:', error); throw error; }); }; return routerPromise; } return { createRouter, ViewLogicRouter }; }));