{"version":3,"sources":["utils/check.ts","utils/setting.ts","components/CardV2/index.tsx","components/SearchBar/index.tsx","components/Loading/index.tsx","utils/api.tsx","components/TagSelector/index.tsx","components/GithubLink/index.tsx","utils/theme.ts","components/DarkSwitch/index.tsx","utils/serachEngine.ts","components/Content/index.tsx","utils/tools.ts","App.tsx","serviceWorker.ts","index.tsx"],"names":["getLogoUrl","url","startsWith","setJumpTarget","target","window","localStorage","setItem","getJumpTarget","getItem","Card","title","des","logo","catelog","onClick","index","isSearching","el","useMemo","src","alt","split","pop","includes","type","showNumIndex","href","undefined","rel","className","SearchBar","props","onKeyDown","ev","code","test","key","document","getElementById","focus","useEffect","addEventListener","removeEventListener","id","placeholder","value","searchString","onChange","v","trim","setSearchText","Loading","FetchList","a","axios","get","raw","data","catelogs","push","forEach","item","name","tools","setting","hideAdmin","desc","jumpTarget","TagSelector","tags","onTagChange","currTag","renderTags","useCallback","map","each","GithubLink","viewBox","version","xmlns","width","height","d","decodeTheme","t","Date","getHours","night","matchMedia","matches","decodeAuto","applyTheme","source","disableLog","querySelector","classList","toggle","console","log","initTheme","theme","DarkSwitch","showGithub","useState","setTheme","current","useRef","hasInit","currentTimer","timer","clearInterval","realTheme","setInterval","useLayoutEffect","iTheme","lightIcon","fill","darkIcon","autoIcon","generateSearchEngineCard","searchBaidu","hide","searchBing","searchGoogle","q","mutiSearch","s","toLowerCase","rawInclude","pinYinInlcude","Boolean","pinyin","match","Content","setData","loading","setLoading","setCurrTag","setSearchString","val","setVal","filteredDataRef","hideGithub","loadData","r","tagInLocalStorage","resetSearch","notSetTag","handleSetSearch","fn","delay","time","args","clearTimeout","setTimeout","apply","useDebounce","filteredData","localResult","filter","onKeyEnter","renderCardsV2","thisTarget","toggleJumpTarget","cards","length","open","ctrlKey","metaKey","num","Number","isNaN","preventDefault","Helmet","charSet","favicon","tag","App","isLocalhost","location","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","catch","error","ReactDOM","render","URL","process","origin","fetch","response","contentType","headers","status","indexOf","ready","unregister","reload","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.460fa0ed.chunk.js","sourcesContent":["export const isLogin = () => {\n return localStorage.getItem('_token') ? true : false\n}\n\nexport const getLogoUrl = (url: string) => {\n if (url.startsWith('http')) {\n return `/api/img?url=${url}`\n } else {\n return url;\n }\n} ","type JumpTarget = 'blank' | 'self';\n\nexport const toggleJumpTarget = () => {\n const thisTarget = getJumpTarget();\n if (!thisTarget) {\n setJumpTarget('blank');\n }\n if (thisTarget === 'blank') {\n setJumpTarget('self');\n } else {\n setJumpTarget('blank');\n }\n\n}\n\nconst setJumpTarget = (target: JumpTarget) => {\n window.localStorage.setItem('jumpTarget', target);\n}\n\nexport const getJumpTarget = () => {\n return window.localStorage.getItem('jumpTarget') as JumpTarget;\n}","import { useMemo } from \"react\";\r\nimport \"./index.css\";\r\nimport { getLogoUrl } from \"../../utils/check\";\r\nimport { getJumpTarget } from \"../../utils/setting\";\r\nconst Card = ({ title, url, des, logo, catelog, onClick, index, isSearching }) => {\r\n const el = useMemo(() => {\r\n if (url === \"admin\") {\r\n return {title}\r\n } else {\r\n if (logo.split(\".\").pop().includes(\"svg\")) {\r\n return \r\n } else {\r\n return {title}\r\n }\r\n }\r\n }, [logo, title, url])\r\n const showNumIndex = index < 10 && isSearching;\r\n return (\r\n {\r\n onClick();\r\n }}\r\n target={getJumpTarget() === \"blank\" ? \"_blank\" : \"_self\"}\r\n rel=\"noreferrer\"\r\n className=\"card-box\"\r\n >\r\n {showNumIndex && {index + 1}}\r\n
\r\n
\r\n {el}\r\n {/* {url === \"admin\" ? (\r\n {title}\r\n ) : (\r\n {title}\r\n )} */}\r\n
\r\n
\r\n
\r\n {title}\r\n {catelog}\r\n
\r\n
{des}
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Card;\r\n","import { useEffect } from \"react\";\r\nimport \"./index.css\";\r\n// import { useState } from 'react';\r\n\r\ninterface SearchBarProps {\r\n setSearchText: (t: string) => void;\r\n searchString: string;\r\n}\r\nconst SearchBar = (props: SearchBarProps) => {\r\n const onKeyDown = (ev) => {\r\n const reg = /[a-zA-Z0-9]|[\\u4e00-\\u9fa5]/g;\r\n if (ev.code === \"Enter\" || reg.test(ev.key)) {\r\n const el = document.getElementById(\"search-bar\");\r\n if (el) {\r\n el.focus();\r\n }\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n return () => {\r\n document.removeEventListener(\"keydown\", onKeyDown)\r\n }\r\n })\r\n return (\r\n
\r\n
\r\n {\r\n const v = ev.target.value.trim();\r\n props.setSearchText(v);\r\n }}\r\n >\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SearchBar;\r\n","import \"./index.css\";\nexport const Loading = (props: any) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n","import axios from \"axios\";\r\nimport { getJumpTarget } from \"./setting\";\r\nconst baseUrl = \"/api/\";\r\n// const baseUrl = \"https://tools.mereith.com/api/\";\r\n\r\nconst selfJumpIcon = `data:image/png;base64,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`\r\nconst blankJumpIcon = `data:image/png;base64,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`\r\nexport const FetchList = async () => {\r\n const { data: raw } = await axios.get(baseUrl);\r\n const { data } = raw;\r\n // 获取分类\r\n const catelogs = [];\r\n catelogs.push(\"全部工具\")\r\n data.catelogs.forEach(item => {\r\n catelogs.push(item.name)\r\n })\r\n data.tools.forEach(item => {\r\n if (!catelogs.includes(item.catelog)) {\r\n catelogs.push(item.catelog);\r\n }\r\n });\r\n if (!data.setting?.hideAdmin) {\r\n data.tools.push({\r\n id: 999999999999,\r\n catelog: \"管理后台\",\r\n name: \"本站管理后台\",\r\n desc: \"本导航站的管理后台哦\",\r\n url: \"admin\",\r\n logo: `data:image/png;base64,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`,\r\n })\r\n }\r\n\r\n const jumpTarget = getJumpTarget();\r\n\r\n data.tools.push({\r\n id: 999099999978,\r\n catelogs: \"偏好设置\",\r\n name: jumpTarget === \"blank\" ? \"新建窗口\" : \"原地跳转\",\r\n desc: `点击切换跳转方式`,\r\n url: \"toggleJumpTarget\",\r\n logo: jumpTarget === \"blank\" ? blankJumpIcon : selfJumpIcon\r\n })\r\n\r\n data.catelogs = catelogs;\r\n return data;\r\n};\r\nexport default FetchList;\r\n\r\n\r\n","import \"./index.css\";\nimport { useCallback } from \"react\";\ninterface TagSelectorProps {\n tags: any;\n onTagChange: (newTag: string) => void;\n currTag: string;\n}\nconst TagSelector = (props: TagSelectorProps) => {\n const { tags = [\"all\"], onTagChange, currTag } = props;\n const renderTags = useCallback(() => {\n const originTags = tags.map((each) => {\n return (\n {\n onTagChange(each);\n }}\n >\n {each}\n \n );\n });\n return originTags;\n }, [tags, onTagChange, currTag]);\n return (\n
\n
\n {renderTags()}\n
\n
\n );\n};\n\nexport default TagSelector;\n","import \"./index.css\";\n\nconst GithubLink = () => {\n return (\n
\n \n \n \n
\n );\n};\nexport default GithubLink;\n","export function decodeAuto() {\n const d = new Date().getHours();\n const night = d > 18 || d < 8;\n if (typeof window == \"undefined\") {\n if (night) {\n return \"auto-dark\";\n } else {\n return \"auto-light\";\n }\n }\n if (night || window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return \"auto-dark\";\n } else {\n return \"auto-light\";\n }\n}\nexport const decodeTheme = (t: \"auto\" | \"light\" | \"dark\") => {\n if (t === \"auto\") {\n return decodeAuto();\n } else {\n return t;\n }\n};\nexport const applyTheme = (t: string, source: string, disableLog: boolean) => {\n if (t.includes(\"light\")) {\n const bodyEl = document.querySelector(\"body\")!;\n bodyEl.classList.toggle(\"dark-mode\", false);\n if (!disableLog) {\n console.log(`[Apply Theme][${source}] ${t}`);\n }\n } else {\n const bodyEl = document.querySelector(\"body\")!;\n bodyEl.classList.toggle(\"dark-mode\", true);\n if (!disableLog) {\n console.log(`[Apply Theme][${source}] ${t}`);\n }\n }\n};\nexport const initTheme = () => {\n if (typeof localStorage == \"undefined\") {\n return \"auto\";\n }\n // 2种情况: 1. 自动。 2.手动\n if (!(\"theme\" in localStorage) || localStorage.theme === \"auto\") {\n return \"auto\";\n } else {\n if (localStorage.theme === \"dark\") {\n return \"dark\";\n } else {\n return \"light\";\n }\n }\n};\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { applyTheme, decodeTheme, initTheme } from \"../../utils/theme\";\nimport \"./index.css\";\n\nconst DarkSwitch = ({ showGithub }: { showGithub: boolean }) => {\n const [theme, setTheme] = useState(initTheme());\n const { current } = useRef({ hasInit: false });\n const { current: currentTimer } = useRef({ timer: null });\n\n useEffect(() => {\n if (currentTimer.timer) {\n clearInterval(currentTimer.timer);\n currentTimer.timer = null;\n }\n localStorage.setItem(\"theme\", theme)\n const realTheme = decodeTheme(theme as any);\n applyTheme(realTheme, 'setTheme', true);\n if (realTheme.includes(\"auto\")) {\n currentTimer.timer = setInterval(() => {\n const realTheme = decodeTheme(\"auto\");\n applyTheme(realTheme, \"autoThemeTimer\", true);\n }, 10000);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme])\n\n\n useLayoutEffect(() => {\n if (!current.hasInit) {\n current.hasInit = true;\n if (!!!localStorage.getItem(\"theme\")) {\n // 第一次用默认的\n setTheme(\"auto\");\n } else {\n const iTheme = initTheme();\n setTheme(iTheme);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const lightIcon = (\n \n );\n const darkIcon = (\n \n )\n const autoIcon = (\n \n )\n const handleSwitch = () => {\n if (theme === \"light\") {\n setTheme(\"dark\");\n } else if (theme === \"dark\") {\n setTheme(\"auto\");\n } else {\n setTheme(\"light\");\n }\n };\n return (\n
\n {theme === \"light\" ? lightIcon : theme === \"dark\" ? darkIcon : autoIcon}\n
\n );\n};\nexport default DarkSwitch;\n","export const generateSearchEngineCard = (searchString: string) => {\n if (!searchString.trim()) return [];\n const result = [\n {\n name: \"使用百度搜索\",\n url: searchBaidu(searchString),\n desc: `在百度中搜索 「${searchString}」`,\n id: 8800880001,\n logo: \"baidu.ico\",\n hide: false\n },\n {\n name: \"使用 Bing 搜索\",\n url: searchBing(searchString),\n desc: `在 Bing 中搜索 「${searchString}」`,\n id: 8800880002,\n logo: \"bing.ico\",\n hide: false\n },\n {\n name: \"使用 Google 搜索\",\n url: searchGoogle(searchString),\n desc: `在 Google 中搜索 「${searchString}」`,\n id: 8800880003,\n logo: \"google.ico\",\n hide: false\n }\n ]\n return result;\n}\n\n\n\nconst searchBaidu = (q: string) => {\n return `https://www.baidu.com/s?wd=${q}`\n}\n\nconst searchGoogle = (q: string) => {\n return `https://www.google.com/search?q=${q}`\n}\n\nconst searchBing = (q: string) => {\n return `https://cn.bing.com/search?q=${q}`\n}","import \"./index.css\";\r\nimport CardV2 from \"../CardV2\";\r\nimport SearchBar from \"../SearchBar\";\r\nimport { Loading } from \"../Loading\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport FetchList from \"../../utils/api\";\r\nimport TagSelector from \"../TagSelector\";\r\nimport { useDebounce } from \"../../utils/tools\";\r\nimport pinyin from \"pinyin-match\";\r\nimport GithubLink from \"../GithubLink\";\r\nimport DarkSwitch from \"../DarkSwitch\";\r\nimport { isLogin } from \"../../utils/check\";\r\nimport { generateSearchEngineCard } from \"../../utils/serachEngine\";\r\nimport { toggleJumpTarget } from \"../../utils/setting\";\r\n\r\nconst mutiSearch = (s, t) => {\r\n const source = (s as string).toLowerCase();\r\n const target = t.toLowerCase();\r\n const rawInclude = source.includes(target);\r\n const pinYinInlcude = Boolean(pinyin.match(source, target));\r\n return rawInclude || pinYinInlcude;\r\n};\r\n\r\nconst Content = (props: any) => {\r\n const [data, setData] = useState({});\r\n const [loading, setLoading] = useState(true);\r\n const [currTag, setCurrTag] = useState(\"全部工具\");\r\n const [searchString, setSearchString] = useState(\"\");\r\n const [val, setVal] = useState(\"\");\r\n\r\n const filteredDataRef = useRef([]);\r\n\r\n const showGithub = useMemo(() => {\r\n const hide = data?.setting?.hideGithub === true\r\n return !hide;\r\n }, [data])\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const r = await FetchList();\r\n setData(r);\r\n const tagInLocalStorage = window.localStorage.getItem(\"tag\");\r\n if (tagInLocalStorage && tagInLocalStorage !== \"\") {\r\n if (r?.catelogs && r?.catelogs.includes(tagInLocalStorage)) {\r\n setCurrTag(tagInLocalStorage);\r\n }\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [setData, setLoading, setCurrTag]);\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSetCurrTag = (tag: string) => {\r\n setCurrTag(tag);\r\n // 管理后台不记录了\r\n if (tag !== \"管理后台\") {\r\n window.localStorage.setItem(\"tag\", tag);\r\n }\r\n resetSearch(true);\r\n };\r\n\r\n const resetSearch = (notSetTag?: boolean) => {\r\n setVal(\"\");\r\n setSearchString(\"\");\r\n const tagInLocalStorage = window.localStorage.getItem(\"tag\");\r\n if (!notSetTag && tagInLocalStorage && tagInLocalStorage !== \"\" && tagInLocalStorage !== \"管理后台\") {\r\n setCurrTag(tagInLocalStorage);\r\n }\r\n };\r\n\r\n const handleSetSearch = useDebounce((val: string) => {\r\n if (val !== \"\" && val) {\r\n setCurrTag(\"全部工具\");\r\n setSearchString(val);\r\n } else {\r\n resetSearch();\r\n }\r\n }, 500);\r\n\r\n\r\n\r\n const filteredData = useMemo(() => {\r\n if (data.tools) {\r\n const localResult = data.tools\r\n .filter((item: any) => {\r\n const hide = item.hide;\r\n if (!hide) return true;\r\n if (hide && isLogin()) return false;\r\n return false;\r\n })\r\n .filter((item: any) => {\r\n if (currTag === \"全部工具\") {\r\n return true;\r\n }\r\n return item.catelog === currTag;\r\n })\r\n .filter((item: any) => {\r\n if (searchString === \"\") {\r\n return true;\r\n }\r\n return (\r\n mutiSearch(item.name, searchString) ||\r\n mutiSearch(item.desc, searchString) ||\r\n mutiSearch(item.url, searchString)\r\n );\r\n });\r\n return [...localResult, ...generateSearchEngineCard(searchString)]\r\n } else {\r\n return [...generateSearchEngineCard(searchString)];\r\n }\r\n }, [data, currTag, searchString]);\r\n\r\n useEffect(() => {\r\n filteredDataRef.current = filteredData\r\n }, [filteredData])\r\n\r\n useEffect(() => {\r\n if (searchString.trim() === \"\") {\r\n document.removeEventListener(\"keydown\", onKeyEnter);\r\n } else {\r\n document.addEventListener(\"keydown\", onKeyEnter);\r\n }\r\n return () => {\r\n document.removeEventListener(\"keydown\", onKeyEnter);\r\n }\r\n // eslint-disable-next-line\r\n }, [searchString])\r\n\r\n const renderCardsV2 = useCallback(() => {\r\n return filteredData.map((item, index) => {\r\n return (\r\n {\r\n resetSearch();\r\n if (item.url === \"toggleJumpTarget\") {\r\n toggleJumpTarget();\r\n loadData();\r\n }\r\n }}\r\n />\r\n );\r\n });\r\n // eslint-disable-next-line\r\n }, [filteredData, searchString]);\r\n\r\n const onKeyEnter = (ev: KeyboardEvent) => {\r\n const cards = filteredDataRef.current;\r\n if (ev.code === \"Enter\") {\r\n if (cards && cards.length) {\r\n window.open(cards[0]?.url, \"_blank\");\r\n resetSearch();\r\n }\r\n }\r\n // 如果按了数字键 + ctrl/meta,打开对应的卡片\r\n if (ev.ctrlKey || ev.metaKey) {\r\n const num = Number(ev.key);\r\n if (isNaN(num)) return;\r\n ev.preventDefault()\r\n const index = Number(ev.key) - 1;\r\n if (index >= 0 && index < cards.length) {\r\n window.open(cards[index]?.url, \"_blank\");\r\n resetSearch();\r\n }\r\n }\r\n\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {data?.setting?.title ?? \"Van Nav\"}\r\n \r\n
\r\n
\r\n {\r\n setVal(t);\r\n handleSetSearch(t);\r\n }}\r\n />\r\n \r\n
\r\n
\r\n
\r\n
\r\n {loading ? : renderCardsV2()}\r\n
\r\n
\r\n {showGithub && }\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Content;\r\n","import { useRef, useCallback } from \"react\";\n\nexport const useDebounce = (fn: any, delay: number) => {\n const { current } = useRef<{ time: any }>({ time: null });\n return useCallback(\n (...args: any[]) => {\n if (current.time) {\n clearTimeout(current.time);\n current.time = null;\n }\n current.time = setTimeout(() => {\n fn.apply(this, args);\n clearTimeout(current.time);\n current.time = null;\n }, delay);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [current, delay]\n );\n};","import \"./App.css\";\r\nimport Content from \"./components/Content\";\r\nfunction App() {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from \"./serviceWorker\"\r\n// import reportWebVitals from './reportWebVitals';\r\n\r\nconsole.log(\"欢迎使用 Van Nav 项目\")\r\nconsole.log(\"项目地址: https://github.com/mereithhh/van-nav\")\r\n\r\n\r\nReactDOM.render(\r\n \r\n,\r\n document.getElementById('root')\r\n);\r\n\r\nserviceWorker.register(null);"],"sourceRoot":""}