@vuepress/plugin-pwa 2.0.0-rc.61 → 2.0.0-rc.63
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PwaInstall.js","sources":["../../../src/client/components/PwaInstallModal.ts","../../../src/client/components/PwaInstall.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { useLocaleConfig } from '@vuepress/helper/client'\nimport { useEventListener } from '@vueuse/core'\nimport type { PropType, VNode } from 'vue'\nimport { defineComponent, h, onMounted, shallowRef } from 'vue'\nimport { withBase } from 'vuepress/client'\nimport type { AppManifest, PwaPluginLocaleConfig } from '../../shared/index.js'\nimport { ArrowLeftIcon, ArrowRightIcon, CloseIcon } from './icons.js'\n\ninterface InstallPromptEvent extends Event {\n readonly platforms: string\n prompt: () => void\n readonly userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>\n}\n\nexport const PwaInstallModal = defineComponent({\n name: 'PwaInstallModal',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n\n /**\n * Whether use hint message instead of showing a button\n *\n * 是否使用提示\n */\n useHint: Boolean,\n },\n\n emits: ['canInstall', 'hint', 'close'],\n\n setup(props, { emit }) {\n const locale = useLocaleConfig(props.locales)\n\n const manifest = shallowRef<AppManifest>({})\n const deferredPrompt = shallowRef<InstallPromptEvent>()\n\n const getManifest = async (): Promise<void> => {\n const manifestContent = localStorage.getItem('manifest')\n\n if (manifestContent)\n manifest.value = JSON.parse(manifestContent) as AppManifest\n else\n try {\n const response = await fetch(withBase('manifest.webmanifest'))\n const data = (await response.json()) as AppManifest\n\n manifest.value = data\n localStorage.setItem('manifest', JSON.stringify(data))\n } catch {\n console.error(\n '[PWA]: Error getting manifest, check that you have a valid web manifest or network connection',\n )\n }\n }\n\n const scrollToLeft = (): void => {\n const screenshotsDiv = document.querySelector('.screenshot')\n\n if (screenshotsDiv)\n screenshotsDiv.scrollBy({\n left: -screenshotsDiv.clientWidth,\n top: 0,\n behavior: 'smooth',\n })\n }\n\n const scrollToRight = (): void => {\n const screenshotsDiv = document.querySelector('.screenshot')\n\n if (screenshotsDiv)\n screenshotsDiv.scrollBy({\n left: screenshotsDiv.clientWidth,\n top: 0,\n behavior: 'smooth',\n })\n }\n\n const install = async (): Promise<void> => {\n if (deferredPrompt.value) {\n deferredPrompt.value.prompt()\n\n document.dispatchEvent(new CustomEvent('show'))\n\n const choiceResult = await deferredPrompt.value.userChoice\n\n if (choiceResult.outcome === 'accepted') {\n console.info('PWA has been installed')\n\n emit('close', false)\n emit('canInstall', false)\n } else {\n console.info('You choose to not install PWA')\n\n emit('close', false)\n emit('canInstall', false)\n }\n }\n }\n\n const hint = (): void => {\n console.info('You accepted the install hint')\n emit('hint')\n }\n\n onMounted(() => {\n // eslint-disable-next-line no-prototype-builtins\n if (window.hasOwnProperty('BeforeInstallPromptEvent')) {\n useEventListener(window, 'beforeinstallprompt', (event) => {\n deferredPrompt.value = event as InstallPromptEvent\n\n emit('canInstall', true)\n event.preventDefault()\n })\n\n useEventListener('keyup', (event): void => {\n if (event.key === 'Escape') emit('close', false)\n })\n\n void getManifest()\n }\n })\n\n return (): VNode =>\n h('div', { id: 'install-modal-wrapper' }, [\n h('div', {\n class: 'background',\n onClick: () => {\n emit('close', false)\n },\n }),\n\n h('div', { class: 'install-modal' }, [\n h('div', { class: 'header' }, [\n // close button\n h(\n 'button',\n {\n 'type': 'button',\n 'class': 'close-button',\n 'aria-label': locale.value.close,\n 'onClick': () => {\n emit('close', false)\n },\n },\n h(CloseIcon),\n ),\n\n h('div', { class: 'logo' }, [\n manifest.value.icons\n ? h('img', {\n src: manifest.value.icons[0]?.src,\n alt: 'App Logo',\n })\n : null,\n h('div', { class: 'title' }, [\n h('h1', manifest.value.short_name || manifest.value.name),\n h('p', { class: 'desc' }, locale.value.explain),\n ]),\n ]),\n ]),\n\n h('div', { class: 'content' }, [\n h('div', { class: 'highlight' }, [\n manifest.value.features\n ? h('div', { class: 'feature-wrapper' }, [\n h('h3', locale.value.feature),\n h(\n 'ul',\n manifest.value.features.map((feature) =>\n h('li', feature),\n ),\n ),\n ])\n : null,\n\n manifest.value.screenshots\n ? h('div', { class: 'screenshot-wrapper' }, [\n h(\n 'button',\n {\n 'type': 'button',\n 'aria-label': locale.value.prevImage,\n 'onClick': scrollToLeft,\n },\n h(ArrowLeftIcon),\n ),\n h('section', { class: 'screenshot' }, [\n manifest.value.screenshots.map((screenshot) =>\n h(\n 'div',\n h('img', {\n src: screenshot.src,\n alt: 'App Screenshot',\n }),\n ),\n ),\n ]),\n h(\n 'button',\n {\n 'type': 'button',\n 'aria-label': locale.value.nextImage,\n 'onClick': scrollToRight,\n },\n h(ArrowRightIcon),\n ),\n ])\n : null,\n ]),\n\n h('div', { class: 'description' }, [\n h('h3', locale.value.desc),\n h('p', manifest.value.description),\n ]),\n ]),\n\n props.useHint\n ? h('div', { class: 'ios-text', onClick: hint }, [\n h('p', locale.value.iOSInstall),\n h('button', { type: 'button', class: 'success' }, 'Got it!'),\n ])\n : h('div', { class: 'button-wrapper' }, [\n h(\n 'button',\n { type: 'button', class: 'install-button', onClick: install },\n [locale.value.install, h('span', manifest.value.short_name)],\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'cancel-button',\n onClick: () => {\n emit('close', false)\n },\n },\n locale.value.cancel,\n ),\n ]),\n ]),\n ])\n },\n})\n","import { useLocaleConfig } from '@vuepress/helper/client'\nimport { useToggle } from '@vueuse/core'\nimport type { PropType, VNode } from 'vue'\nimport { computed, defineComponent, h, onMounted, ref } from 'vue'\nimport type {\n ManifestExternalApplicationResource,\n PwaPluginLocaleConfig,\n} from '../../shared/index.js'\nimport { PwaInstallModal } from './PwaInstallModal.js'\n\nimport '../styles/modal.css'\n\ninterface ModernNavigator extends Navigator {\n // Nonstandard Api\n getInstalledRelatedApps: () => Promise<ManifestExternalApplicationResource[]>\n}\n\ninterface SafariNavigator extends Navigator {\n // Available on Apple’s iOS Safari only.\n standalone: boolean\n}\n\nexport const PwaInstall = defineComponent({\n name: 'PwaInstall',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n },\n\n setup(props) {\n const locale = useLocaleConfig(props.locales)\n const [isOpen, toggleIsOpen] = useToggle(false)\n\n const canInstall = ref(false)\n const hasRelatedApps = ref(false)\n const isIOS = ref(false)\n const isSafari = ref(false)\n const hinted = ref(false)\n\n const useHint = computed(\n () => isIOS.value && isSafari.value && !hinted.value,\n )\n\n const showInstall = computed(\n () => (hasRelatedApps.value && canInstall.value) || useHint.value,\n )\n\n const getInstalledStatus = (): boolean => {\n if ((navigator as SafariNavigator).standalone)\n return (navigator as SafariNavigator).standalone\n\n return matchMedia('(display-mode: standalone)').matches\n }\n\n const hint = (): void => {\n toggleIsOpen(false)\n hinted.value = true\n // do not notify again\n localStorage.setItem('iOS-pwa-hint', 'hinted')\n }\n\n onMounted(() => {\n if (getInstalledStatus()) {\n const { userAgent } = navigator\n\n // handle iOS specifically\n isIOS.value =\n // regular iPhone\n userAgent.includes('iPhone') ||\n // regular iPad\n userAgent.includes('iPad') ||\n // iPad pro\n Boolean(\n userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints &&\n navigator.maxTouchPoints > 2,\n )\n\n isSafari.value =\n navigator.userAgent.includes('Safari') &&\n !userAgent.includes('Chrome')\n\n hinted.value = Boolean(localStorage.getItem('iOS-pwa-hint'))\n }\n\n if ('getInstalledRelatedApps' in (navigator as ModernNavigator))\n void (navigator as ModernNavigator)\n .getInstalledRelatedApps()\n .then((result) => {\n hasRelatedApps.value = result.length > 0\n })\n })\n\n return (): VNode =>\n h('div', { id: 'pwa-install' }, [\n showInstall.value\n ? h(\n 'button',\n {\n type: 'button',\n class: 'modal-button',\n onClick: () => {\n toggleIsOpen(true)\n },\n },\n locale.value.install,\n )\n : null,\n h(PwaInstallModal, {\n style: {\n display: isOpen.value ? 'block' : 'none',\n },\n locales: props.locales,\n useHint: useHint.value,\n onCanInstall: (value: boolean) => {\n canInstall.value = value\n },\n onHint: () => {\n hint()\n },\n onClose: () => toggleIsOpen(false),\n }),\n ])\n },\n})\n"],"names":["PwaInstallModal","defineComponent","props","emit","locale","useLocaleConfig","manifest","shallowRef","deferredPrompt","getManifest","manifestContent","data","withBase","scrollToLeft","screenshotsDiv","scrollToRight","install","hint","onMounted","useEventListener","event","h","CloseIcon","feature","ArrowLeftIcon","screenshot","ArrowRightIcon","PwaInstall","isOpen","toggleIsOpen","useToggle","canInstall","ref","hasRelatedApps","isIOS","isSafari","hinted","useHint","computed","showInstall","getInstalledStatus","userAgent","result","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PwaInstall.js","sources":["../../../src/client/components/PwaInstallModal.ts","../../../src/client/components/PwaInstall.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { useLocaleConfig } from '@vuepress/helper/client'\nimport { useEventListener } from '@vueuse/core'\nimport type { PropType, VNode } from 'vue'\nimport { defineComponent, h, onMounted, shallowRef } from 'vue'\nimport { withBase } from 'vuepress/client'\nimport type { AppManifest, PwaPluginLocaleConfig } from '../../shared/index.js'\nimport { ArrowLeftIcon, ArrowRightIcon, CloseIcon } from './icons.js'\n\ninterface InstallPromptEvent extends Event {\n readonly platforms: string\n prompt: () => void\n readonly userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>\n}\n\nexport const PwaInstallModal = defineComponent({\n name: 'PwaInstallModal',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n\n /**\n * Whether use hint message instead of showing a button\n *\n * 是否使用提示\n */\n useHint: Boolean,\n },\n\n emits: ['canInstall', 'hint', 'close'],\n\n setup(props, { emit }) {\n const locale = useLocaleConfig(props.locales)\n\n const manifest = shallowRef<AppManifest>({})\n const deferredPrompt = shallowRef<InstallPromptEvent>()\n\n const getManifest = async (): Promise<void> => {\n const manifestContent = localStorage.getItem('manifest')\n\n if (manifestContent)\n manifest.value = JSON.parse(manifestContent) as AppManifest\n else\n try {\n const response = await fetch(withBase('manifest.webmanifest'))\n const data = (await response.json()) as AppManifest\n\n manifest.value = data\n localStorage.setItem('manifest', JSON.stringify(data))\n } catch {\n console.error(\n '[PWA]: Error getting manifest, check that you have a valid web manifest or network connection',\n )\n }\n }\n\n const scrollToLeft = (): void => {\n const screenshotsDiv = document.querySelector('.screenshot')\n\n if (screenshotsDiv)\n screenshotsDiv.scrollBy({\n left: -screenshotsDiv.clientWidth,\n top: 0,\n behavior: 'smooth',\n })\n }\n\n const scrollToRight = (): void => {\n const screenshotsDiv = document.querySelector('.screenshot')\n\n if (screenshotsDiv)\n screenshotsDiv.scrollBy({\n left: screenshotsDiv.clientWidth,\n top: 0,\n behavior: 'smooth',\n })\n }\n\n const install = async (): Promise<void> => {\n if (deferredPrompt.value) {\n deferredPrompt.value.prompt()\n\n document.dispatchEvent(new CustomEvent('show'))\n\n const choiceResult = await deferredPrompt.value.userChoice\n\n if (choiceResult.outcome === 'accepted') {\n console.info('PWA has been installed')\n\n emit('close', false)\n emit('canInstall', false)\n } else {\n console.info('You choose to not install PWA')\n\n emit('close', false)\n emit('canInstall', false)\n }\n }\n }\n\n const hint = (): void => {\n console.info('You accepted the install hint')\n emit('hint')\n }\n\n onMounted(() => {\n // eslint-disable-next-line no-prototype-builtins\n if (window.hasOwnProperty('BeforeInstallPromptEvent')) {\n useEventListener(window, 'beforeinstallprompt', (event) => {\n deferredPrompt.value = event as InstallPromptEvent\n\n emit('canInstall', true)\n event.preventDefault()\n })\n\n useEventListener('keyup', (event): void => {\n if (event.key === 'Escape') emit('close', false)\n })\n\n void getManifest()\n }\n })\n\n return (): VNode =>\n h('div', { id: 'install-modal-wrapper' }, [\n h('div', {\n class: 'background',\n onClick: () => {\n emit('close', false)\n },\n }),\n\n h('div', { class: 'install-modal' }, [\n h('div', { class: 'header' }, [\n // close button\n h(\n 'button',\n {\n 'type': 'button',\n 'class': 'close-button',\n 'aria-label': locale.value.close,\n 'onClick': () => {\n emit('close', false)\n },\n },\n h(CloseIcon),\n ),\n\n h('div', { class: 'logo' }, [\n manifest.value.icons\n ? h('img', {\n src: manifest.value.icons[0]?.src,\n alt: 'App Logo',\n })\n : null,\n h('div', { class: 'title' }, [\n h('h1', manifest.value.short_name || manifest.value.name),\n h('p', { class: 'desc' }, locale.value.explain),\n ]),\n ]),\n ]),\n\n h('div', { class: 'content' }, [\n h('div', { class: 'highlight' }, [\n manifest.value.features\n ? h('div', { class: 'feature-wrapper' }, [\n h('h3', locale.value.feature),\n h(\n 'ul',\n manifest.value.features.map((feature) =>\n h('li', feature),\n ),\n ),\n ])\n : null,\n\n manifest.value.screenshots\n ? h('div', { class: 'screenshot-wrapper' }, [\n h(\n 'button',\n {\n 'type': 'button',\n 'aria-label': locale.value.prevImage,\n 'onClick': scrollToLeft,\n },\n h(ArrowLeftIcon),\n ),\n h('section', { class: 'screenshot' }, [\n manifest.value.screenshots.map((screenshot) =>\n h(\n 'div',\n h('img', {\n src: screenshot.src,\n alt: 'App Screenshot',\n }),\n ),\n ),\n ]),\n h(\n 'button',\n {\n 'type': 'button',\n 'aria-label': locale.value.nextImage,\n 'onClick': scrollToRight,\n },\n h(ArrowRightIcon),\n ),\n ])\n : null,\n ]),\n\n h('div', { class: 'description' }, [\n h('h3', locale.value.desc),\n h('p', manifest.value.description),\n ]),\n ]),\n\n props.useHint\n ? h('div', { class: 'ios-text', onClick: hint }, [\n h('p', locale.value.iOSInstall),\n h('button', { type: 'button', class: 'success' }, 'Got it!'),\n ])\n : h('div', { class: 'button-wrapper' }, [\n h(\n 'button',\n { type: 'button', class: 'install-button', onClick: install },\n [locale.value.install, h('span', manifest.value.short_name)],\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'cancel-button',\n onClick: () => {\n emit('close', false)\n },\n },\n locale.value.cancel,\n ),\n ]),\n ]),\n ])\n },\n})\n","import { useLocaleConfig } from '@vuepress/helper/client'\nimport { useToggle } from '@vueuse/core'\nimport type { PropType, VNode } from 'vue'\nimport { computed, defineComponent, h, onMounted, ref } from 'vue'\nimport type {\n ManifestExternalApplicationResource,\n PwaPluginLocaleConfig,\n} from '../../shared/index.js'\nimport { PwaInstallModal } from './PwaInstallModal.js'\n\nimport '../styles/modal.css'\n\ninterface ModernNavigator extends Navigator {\n // Nonstandard Api\n getInstalledRelatedApps: () => Promise<ManifestExternalApplicationResource[]>\n}\n\ninterface SafariNavigator extends Navigator {\n // Available on Apple’s iOS Safari only.\n standalone: boolean\n}\n\nexport const PwaInstall = defineComponent({\n name: 'PwaInstall',\n\n props: {\n /** locale data */\n locales: {\n type: Object as PropType<PwaPluginLocaleConfig>,\n required: true,\n },\n },\n\n setup(props) {\n const locale = useLocaleConfig(props.locales)\n const [isOpen, toggleIsOpen] = useToggle(false)\n\n const canInstall = ref(false)\n const hasRelatedApps = ref(false)\n const isIOS = ref(false)\n const isSafari = ref(false)\n const hinted = ref(false)\n\n const useHint = computed(\n () => isIOS.value && isSafari.value && !hinted.value,\n )\n\n const showInstall = computed(\n () => (hasRelatedApps.value && canInstall.value) || useHint.value,\n )\n\n const getInstallStatus = (): boolean => {\n if ((navigator as SafariNavigator).standalone)\n return (navigator as SafariNavigator).standalone\n\n return matchMedia('(display-mode: standalone)').matches\n }\n\n const hint = (): void => {\n toggleIsOpen(false)\n hinted.value = true\n // do not notify again\n localStorage.setItem('iOS-pwa-hint', 'hinted')\n }\n\n onMounted(() => {\n if (getInstallStatus()) {\n const { userAgent } = navigator\n\n // handle iOS specifically\n isIOS.value =\n // regular iPhone\n userAgent.includes('iPhone') ||\n // regular iPad\n userAgent.includes('iPad') ||\n // iPad pro\n Boolean(\n userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints &&\n navigator.maxTouchPoints > 2,\n )\n\n isSafari.value =\n navigator.userAgent.includes('Safari') &&\n !userAgent.includes('Chrome')\n\n hinted.value = Boolean(localStorage.getItem('iOS-pwa-hint'))\n }\n\n if ('getInstalledRelatedApps' in (navigator as ModernNavigator))\n void (navigator as ModernNavigator)\n .getInstalledRelatedApps()\n .then((result) => {\n hasRelatedApps.value = result.length > 0\n })\n })\n\n return (): VNode =>\n h('div', { id: 'pwa-install' }, [\n showInstall.value\n ? h(\n 'button',\n {\n type: 'button',\n class: 'modal-button',\n onClick: () => {\n toggleIsOpen(true)\n },\n },\n locale.value.install,\n )\n : null,\n h(PwaInstallModal, {\n style: {\n display: isOpen.value ? 'block' : 'none',\n },\n locales: props.locales,\n useHint: useHint.value,\n onCanInstall: (value: boolean) => {\n canInstall.value = value\n },\n onHint: () => {\n hint()\n },\n onClose: () => toggleIsOpen(false),\n }),\n ])\n },\n})\n"],"names":["PwaInstallModal","defineComponent","props","emit","locale","useLocaleConfig","manifest","shallowRef","deferredPrompt","getManifest","manifestContent","data","withBase","scrollToLeft","screenshotsDiv","scrollToRight","install","hint","onMounted","useEventListener","event","h","CloseIcon","feature","ArrowLeftIcon","screenshot","ArrowRightIcon","PwaInstall","isOpen","toggleIsOpen","useToggle","canInstall","ref","hasRelatedApps","isIOS","isSafari","hinted","useHint","computed","showInstall","getInstallStatus","userAgent","result","value"],"mappings":"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"}
|
package/lib/node/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import{getRootLang as P,Logger as C,endsWith as T,isLinkAbsolute as A,getRealPath as N,getLocaleConfig as O,addViteOptimizeDepsExclude as $,addViteSsrNoExternal as D,customizeDevServer as B}from"@vuepress/helper";import{fs as g,colors as b,path as k,getDirname as F}from"vuepress/utils";import{generateSW as L}from"workbox-build";import{isPlainObject as y}from"vuepress/shared";const j={"/en/":{install:"Install",iOSInstall:"Tap the share button and then 'Add to Home Screen'",cancel:"Cancel",close:"Close",prevImage:"Previous Image",nextImage:"Next Image",desc:"Description",feature:"Key Features",explain:"This app can be installed on your PC or mobile device. This will allow this web app to look and behave like any other installed app. You will find it in your app lists and be able to pin it to your home screen, start menus or task bars. This installed web app will also be able to safely interact with other apps and your operating system. ",hint:"New content found.",update:"New content is available."},"/zh/":{install:"安装",iOSInstall:"点击分享按钮然后点击“添加到主屏幕”",cancel:"取消",close:"关闭",prevImage:"上一张图片",nextImage:"下一张图片",desc:"详情",feature:"主要特色",explain:"该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。",hint:"发现新内容可用",update:"新内容已就绪"},"/zh-tw/":{install:"安裝",iOSInstall:"點擊分享按鈕然後點擊“添加到主畫面”",cancel:"取消",close:"關閉",prevImage:"上一張圖片",nextImage:"下一張圖片",desc:"詳情",feature:"主要特色",explain:"該應用可以安裝在你的 PC 或行動裝置上。這將使該 Web 應用程式外觀和行為與其他應用程式相同。它將在出現在應用程式列表中,並可以固定到主畫面,開始菜單或任務欄。此 Web 應用程式還將能夠與其他應用程式和你的操作系統安全地進行交互。",hint:"發現新内容可用",update:"新内容已就绪"},"/de/":{install:"Installieren",iOSInstall:"Drucke den Share-Button und dann 'zu Homescreen hinzufügen'",cancel:"Abbrechen",close:"Schließen",prevImage:"Vorheriges Bild",nextImage:"Nächstes Bild",desc:"Berschreibung",feature:"Funktionen",explain:"Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.",hint:"Neuer Inhalt gefunden.",update:"Neue Inhalte sind verfügbar."},"/de-at/":{install:"Installieren",iOSInstall:"Drucke den Share-Button und dan 'zu Homescreen hinzufügen'",cancel:"Abbrechen",close:"Schließen",prevImage:"Vorheriges Bild",nextImage:"Nächstes Bild",desc:"Berschreibung",feature:"Features",explain:"Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.",hint:"Neue Inhalte sind verfügbar.",update:"Neue Inhalte sind verfügbar."},"/vi/":{install:"Tải về",iOSInstall:"Nhấn vào nút chia sẻ và sau đó 'Thêm vào Màn hình chính'",cancel:"Huỷ bỏ",close:"Đóng",prevImage:"Hình ảnh trước đó",nextImage:"Hình ảnh tiếp theo",desc:"Sự miêu tả",feature:"Các tính năng chính",explain:"Ứng dụng này có thể được cài đặt trên PC hoặc thiết bị di động của bạn. Điều này sẽ cho phép ứng dụng web này trông và hoạt động giống như bất kỳ ứng dụng đã cài đặt nào khác. Bạn sẽ tìm thấy nó trong danh sách ứng dụng của mình và có thể ghim nó vào màn hình chính, menu bắt đầu hoặc thanh tác vụ. Ứng dụng web đã cài đặt này cũng sẽ có thể tương tác an toàn với các ứng dụng khác và hệ điều hành của bạn.",hint:"Nội dung mới được tìm thấy",update:"Đã có nội dung mới"},"/uk/":{install:"Встановити",iOSInstall:"Торкніться кнопки «Поділитися», а потім «Додати на головний екран»",cancel:"Скасувати",close:"Закрити",prevImage:"Попереднє зображення",nextImage:"Наступне зображення",desc:"Опис",feature:"Основні характеристики",explain:"Цю програму можна встановити на ПК або мобільний пристрій. Це дозволить цій веб-програмі виглядати та вести себе як будь-яка інша встановлена програма. Ви знайдете її у списках додатків і зможете закріпити на головному екрані, в меню «Пуск» або на панелі завдань. Ця встановлена веб-програма також зможе безпечно взаємодіяти з іншими програмами та вашою операційною системою. ",hint:"Знайдено новий вміст",update:"Доступний новий контент."},"/ru/":{install:"Установить",iOSInstall:"Нажмите кнопку «Поделиться», а затем «Добавить на главный экран»",cancel:"Отменить",close:"Закрыть",prevImage:"Предыдущее изображение",nextImage:"Следующее изображение",desc:"Описание",feature:"Основные функции",explain:"Это приложение может быть установлено на вашем компьютере или мобильном устройстве. Это позволит веб-приложению выглядеть и вести себя как любое другое установленное приложение. Вы найдете его в списках приложений и сможете закрепить его на домашнем экране, в меню пуск или на панели задач. Установленное веб-приложение также сможет безопасно взаимодействовать с другими приложениями и операционной системой. ",hint:"Найден новый контент",update:"Доступен новый контент."},"/br/":{install:"Instalar",iOSInstall:"Toque no botão de compartilhar e depois 'Adicionar à Home'",cancel:"Cancelar",close:"Fechar",prevImage:"Imagem anterior",nextImage:"Próxima imagem",desc:"Descrição",feature:"Características Chave",explain:"Esta aplicação web pode ser instalada no seu PC ou dispositivo móvel. Isso fará com que ela se pareça e se comporte como qualquer outra aplicação. Você a encontrará na lista de apps e poderá adicionar seu ícone à tela de entrada, menus ou barras de tarefa. Uma vez instalada, esta aplicação web também poderá interagir com outras aplicações ou com o próprio sistema operacional. ",hint:"Novo conteúdo encontrado",update:"Novo conteúdo está disponível."},"/pl/":{install:"Zainstaluj",iOSInstall:"Stuknij przycisk udostępniania, a następnie „Dodaj do ekranu głównego”",cancel:"Anuluj",close:"Zamknij",prevImage:"Poprzedni obrazek",nextImage:"Następny obrazek",desc:"Opis",feature:"Kluczowe cechy",explain:"Tę aplikację można zainstalować na komputerze lub urządzeniu mobilnym. Dzięki temu ta aplikacja internetowa będzie wyglądać i zachowywać się jak każda inna zainstalowana aplikacja. Znajdziesz ją na listach aplikacji i będziesz mógł przypiąć go do ekranu głównego, menu startowego lub pasków zadań. Ta zainstalowana aplikacja internetowa będzie również mogła bezpiecznie komunikować się z innymi aplikacjami i systemem operacyjnym.",hint:"Znaleziono nową zawartość.",update:"Nowa zawartość jest dostępna."},"/sk/":{install:"Insštalácia",iOSInstall:"Klikni na tlačidlo zdielania a potom 'Daj na domovskú obrazovku'",cancel:"Zrušiť",close:"Zavrieť",prevImage:"Prodošlí obrázok",nextImage:"Ďalší obrázok",desc:"Poznámka",feature:"Kľúčové vlastnosti",explain:"Túto aplikáciu je možné nainštalovať na počítač alebo mobil. Toto umožný sa správať aplikácii ako každej inej nainštalovanej aplikácii. Nájdeš ju vo svojom liste aplikácii a budeš môcť ju pripnúť na domovskú stránku, štartovacieho menu alebo do panelu úloh. Táto nainštalovaná webová aplikácia umžní tiež bezpečne komunikovať s ostatnými nainštalovanými aplikáciami a operačným systémom. ",hint:"Nový obsah bol nájdený.",update:"Nový obsah je dostupný."},"/fr/":{install:"Installer",iOSInstall:"Appuyez sur le bouton partager puis 'Ajouter à l'écran d'accueil'",cancel:"Annuler",close:"Fermer",prevImage:"Image précédente",nextImage:"Image suivante",desc:"Description",feature:"Composants clés",explain:"Cette app peut être installée sur PC ou smartphone. Cela permettra de rendre cette page web comme n'importe quelle autre application. Vous la trouverez dans votre liste d'application et serez capable de la pin sur votre écran principal et divers menus. L'application web installée sera capable d'interagir avec les autres applications et le système d'exploitation.",hint:"New content found.",update:"New content is available."},"/es/":{install:"Instalar",iOSInstall:"Toque el botón compartir y luego 'Agregar a la pantalla de inicio'",cancel:"Cancelar",close:"Cerrar",prevImage:"Imagen anterior",nextImage:"Imagen siguiente",desc:"Descripción",feature:"Características clave",explain:"Esta aplicación se puede instalar en su PC o dispositivo móvil. Esto permitirá que esta aplicación web se vea y se comporte como cualquier otra aplicación instalada. Lo encontrará en su lista de aplicaciones y podrá fijarlo a su pantalla de inicio, menús de inicio o barras de tareas. Esta aplicación web instalada también podrá interactuar de manera segura con otras aplicaciones y su sistema operativo.",hint:"Nuevo contenido encontrado.",update:"Hay nuevo contenido disponible."},"/ja/":{install:"インストール",iOSInstall:"共有ボタンをタップし、「ホームスクリーンに追加」をタップします",cancel:"キャンセル",close:"閉じる",prevImage:"前の画像",nextImage:"次の画像",desc:"詳細",feature:"主な特徴",explain:"このアプリは、PCまたはモバイルデバイスにインストールすることができます。 これにより、このウェブアプリは、インストールされている他のアプリと同様に表示され、動作するようになります。 アプリ一覧で見つけることができ、ホーム画面、スタートメニュー、タスクバーに固定することができます。 このインストールされたウェブアプリケーションは、他のアプリケーションやオペレーティングシステムと安全にやり取りすることもできます。",hint:"新しいコンテンツが見つかりました。",update:"新しいコンテンツが登場しました。"},"/tr/":{install:"Yükle",iOSInstall:"Paylaş düğmesine ve ardından 'Ana Ekrana Ekle' düğmesine basın",cancel:"İptal",close:"Kapat",prevImage:"Önceki Resim",nextImage:"Sonraki Resim",desc:"Tanım",feature:"Ana Özellikler",explain:"Bu uygulama PC'nize veya mobil cihazınıza yüklenebilir. Yüklenmesi bu web uygulamasının diğer yüklü uygulamalar gibi görünmesini ve davranmasını sağlar. Yüklenen web uygulamasını uygulama listenizde bulabilir ve ana ekranınıza, menülere veya görev çubuklarına sabitleyebilirsiniz. Aynı zamanda yüklenen web uygulaması, diğer uygulamalar ve işletim sisteminizle güvenli bir şekilde etkileşime girebilecektir.",hint:"Yeni içerik bulundu.",update:"Yeni içerik mevcut."},"/ko/":{install:"설치",iOSInstall:"공유 버튼을 누르고 '홈 화면에 추가'를 누르세요",cancel:"취소",close:"닫기",prevImage:"이전 이미지",nextImage:"다음 이미지",desc:"설명",feature:"주요 기능",explain:"이 앱은 PC 또는 모바일 장치에 설치할 수 있습니다. 이렇게 하면 이 웹 앱은 다른 설치된 앱과 마찬가지로 표시되고 작동합니다. 앱 목록에서 찾을 수 있으며 홈 화면, 시작 메뉴, 작업 표시줄에 고정할 수 있습니다. 설치된 웹 앱은 다른 앱과 안전하게 상호 작용할 수 있습니다.",hint:"새로운 콘텐츠를 찾았습니다.",update:"새로운 콘텐츠가 있습니다."},"/fi/":{install:"Asenna",iOSInstall:"Paina Jaa-painiketta ja sitten 'Lisää kotiin'-painiketta",cancel:"Peruuta",close:"Sulje",prevImage:"Edellinen kuva",nextImage:"Seuraava kuva",desc:"Kuvaus",feature:"Avainominaisuudet",explain:"Tämä sovellus on asennettavissa tietokoneelle tai mobiililaitteelle. Tämä mahdollistaa sovelluksen toiminnan tietokoneohjelmana. Löydät sen sovelluslistasta ja voit kiinnittää sen työpöydälle, kotinäytölle, tehtäväpalkkiin tai muulle listalle. Asennettu sovellus voi turvallisesti olla vuorovaikutuksessa muiden sovellusten ja käyttöjärjestelmäsi kanssa.",hint:"Uutta sisältöä.",update:"Uutta sisältöä on saatavilla."},"/hu/":{install:"Telepítés",iOSInstall:"Nyomd meg a megosztás gombot, majd a 'Hozzáadás a kezdőképernyőhöz' opciót",cancel:"Mégse",close:"Bezárás",prevImage:"Előző kép",nextImage:"Következő kép",desc:"Leírás",feature:"Főbb jellemzők",explain:"Ez az alkalmazás telepíthető PC-re vagy mobil eszközre. Ez lehetővé teszi, hogy ez a webalkalmazás úgy nézzen ki és viselkedjen, mint bármely más telepített alkalmazás. Az alkalmazáslistában találod majd, és hozzáadhatod a kezdőképernyőhöz, indító menühöz vagy a feladatok sávjához. Az telepített webalkalmazás biztonságosan interakcióba léphet más alkalmazásokkal és az operációs rendszerrel.",hint:"Új tartalom érhető el.",update:"Új tartalom érhető el."},"/id/":{install:"Install",iOSInstall:"Ketuk tombol bagikan, lalu 'Tambahkan ke Layar Utama'",cancel:"Batal",close:"Tutup",prevImage:"Gambar sebelumnya",nextImage:"Gambar selanjutnya",desc:"Keterangan",feature:"Fitur",explain:"Aplikasi ini dapat diinstal di PC atau perangkat seluler Anda. Ini akan memungkinkan aplikasi web ini terlihat seperti aplikasi terpasang lainnya. Anda bisa menemukannya di daftar aplikasi dan dapat menyematkannya ke layar beranda, menu start, atau menu ke taskbar. Aplikasi web yang terinstal ini juga dapat berinteraksi dengan aplikasi lain dan dengan sistem operasi yang Anda gunakan. ",hint:"Konten baru ditemukan.",update:"Konten baru telah tersedia."},"/nl/":{install:"Installeren",iOSInstall:"Druk op de share button en dan op 'Add to Home Screen'",cancel:"Annuleren",close:"Sluiten",prevImage:"Vorige Foto",nextImage:"Volgende Foto",desc:"Beschrijving",feature:"Belangrijkste mogelijkheden",explain:"Deze app kan op uw PC of mobiel toestel geïnstalleerd worden. Dit laat toe om deze webapp er uit te laten alsof het een normale app is. Je kan het terugvinden in jouw applijsten en kan het op je homescreen, start menu of taakbalk vastzetten. Deze geïnstalleerde webapp zal ook veilig samenwerken met andere apps en uw besturingssysteem. ",hint:"Nieuwe inhoud gevonden.",update:"Nieuwe inhoud is beschikbaar."}},S=async(a,e)=>{const{siteData:n}=a,{base:t}=a.options,i=a.dir.source(".vuepress/public/manifest.webmanifest"),o=a.dir.source(".vuepress/public/manifest.json"),s=JSON.parse(g.existsSync(i)?await g.readFile(i,"utf8"):g.existsSync(o)?await g.readFile(o,"utf8"):"{}");return{name:n.title||n.locales["/"]?.title||"Site",short_name:n.title||n.locales["/"]?.title||"Site",description:n.description||n.locales["/"]?.description||"A site built with vuepress",lang:P(a),start_url:t,scope:t,display:"standalone",theme_color:e.themeColor||"#46bd87",background_color:"#ffffff",orientation:"portrait-primary",prefer_related_applications:!1,...s,...e.manifest}},w="@vuepress/plugin-pwa",m=new C(w),M=async(a,e)=>{const{succeed:n}=m.load("Generating manifest.webmanifest"),t=await S(a,e),i=a.dir.dest("manifest.webmanifest");await g.writeJSON(i,t,{flag:"w"}),n(`Manifest generated and saved to ${b.cyan(k.relative(process.cwd(),i))}!`)},z=["png","jpg","jpeg","webp","bmp","gif"],x=["js","css","svg","woff","woff2","eot","ttf","otf"],E=(a=1024)=>e=>{const n=[],t=[];for(const i of e){const{url:o,size:s}=i;z.some(h=>T(o,`.${h}`))&&s>a*1024?n.push(`Skipped ${o}, as it's ${Math.ceil(s/1024)} KB.`):t.push(i)}return{warnings:n,manifest:t}},H=async(a,e)=>{const{succeed:n}=m.load("Generating service worker"),t=[`**/*.{${x.join(",")}}`];e.cacheHTML?t.push("**/*.html"):t.push("./index.html","./404.html"),e.cacheImage&&t.push(`**/*.{${z.join(",")}}`),await L({dontCacheBustURLsMatching:new RegExp(`\\.[0-9a-f]{8}\\.(${["html",...x,...z].join("|")})$`),globPatterns:t,cleanupOutdatedCaches:!0,clientsClaim:!0,maximumFileSizeToCacheInBytes:(e.maxSize??2048)*1024,manifestTransforms:[E(e.maxImageSize)],mode:a.env.isDebug?"development":"production",sourcemap:a.env.isDebug,...e.generateSWConfig,globDirectory:a.dir.dest(),swDest:a.dir.dest(e.serviceWorkerFilename??"service-worker.js")}).then(({count:i,size:o,warnings:s})=>{n(),m.info(`Precache ${b.cyan(`${i} files`)}, totaling ${b.cyan(`${(o/1024/1024).toFixed(2)} Mb.`)}.`),s.length&&m.warn(`
|
|
1
|
+
import{getRootLang as P,Logger as C,endsWith as T,isLinkAbsolute as A,getModulePath as N,getLocaleConfig as O,addViteOptimizeDepsExclude as $,addViteSsrNoExternal as D,customizeDevServer as B}from"@vuepress/helper";import{fs as g,colors as b,path as k,getDirname as F}from"vuepress/utils";import{generateSW as L}from"workbox-build";import{isPlainObject as y}from"vuepress/shared";const j={"/en/":{install:"Install",iOSInstall:"Tap the share button and then 'Add to Home Screen'",cancel:"Cancel",close:"Close",prevImage:"Previous Image",nextImage:"Next Image",desc:"Description",feature:"Key Features",explain:"This app can be installed on your PC or mobile device. This will allow this web app to look and behave like any other installed app. You will find it in your app lists and be able to pin it to your home screen, start menus or task bars. This installed web app will also be able to safely interact with other apps and your operating system. ",hint:"New content found.",update:"New content is available."},"/zh/":{install:"安装",iOSInstall:"点击分享按钮然后点击“添加到主屏幕”",cancel:"取消",close:"关闭",prevImage:"上一张图片",nextImage:"下一张图片",desc:"详情",feature:"主要特色",explain:"该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。",hint:"发现新内容可用",update:"新内容已就绪"},"/zh-tw/":{install:"安裝",iOSInstall:"點擊分享按鈕然後點擊“添加到主畫面”",cancel:"取消",close:"關閉",prevImage:"上一張圖片",nextImage:"下一張圖片",desc:"詳情",feature:"主要特色",explain:"該應用可以安裝在你的 PC 或行動裝置上。這將使該 Web 應用程式外觀和行為與其他應用程式相同。它將在出現在應用程式列表中,並可以固定到主畫面,開始菜單或任務欄。此 Web 應用程式還將能夠與其他應用程式和你的操作系統安全地進行交互。",hint:"發現新内容可用",update:"新内容已就绪"},"/de/":{install:"Installieren",iOSInstall:"Drucke den Share-Button und dann 'zu Homescreen hinzufügen'",cancel:"Abbrechen",close:"Schließen",prevImage:"Vorheriges Bild",nextImage:"Nächstes Bild",desc:"Berschreibung",feature:"Funktionen",explain:"Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.",hint:"Neuer Inhalt gefunden.",update:"Neue Inhalte sind verfügbar."},"/de-at/":{install:"Installieren",iOSInstall:"Drucke den Share-Button und dan 'zu Homescreen hinzufügen'",cancel:"Abbrechen",close:"Schließen",prevImage:"Vorheriges Bild",nextImage:"Nächstes Bild",desc:"Berschreibung",feature:"Features",explain:"Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.",hint:"Neue Inhalte sind verfügbar.",update:"Neue Inhalte sind verfügbar."},"/vi/":{install:"Tải về",iOSInstall:"Nhấn vào nút chia sẻ và sau đó 'Thêm vào Màn hình chính'",cancel:"Huỷ bỏ",close:"Đóng",prevImage:"Hình ảnh trước đó",nextImage:"Hình ảnh tiếp theo",desc:"Sự miêu tả",feature:"Các tính năng chính",explain:"Ứng dụng này có thể được cài đặt trên PC hoặc thiết bị di động của bạn. Điều này sẽ cho phép ứng dụng web này trông và hoạt động giống như bất kỳ ứng dụng đã cài đặt nào khác. Bạn sẽ tìm thấy nó trong danh sách ứng dụng của mình và có thể ghim nó vào màn hình chính, menu bắt đầu hoặc thanh tác vụ. Ứng dụng web đã cài đặt này cũng sẽ có thể tương tác an toàn với các ứng dụng khác và hệ điều hành của bạn.",hint:"Nội dung mới được tìm thấy",update:"Đã có nội dung mới"},"/uk/":{install:"Встановити",iOSInstall:"Торкніться кнопки «Поділитися», а потім «Додати на головний екран»",cancel:"Скасувати",close:"Закрити",prevImage:"Попереднє зображення",nextImage:"Наступне зображення",desc:"Опис",feature:"Основні характеристики",explain:"Цю програму можна встановити на ПК або мобільний пристрій. Це дозволить цій веб-програмі виглядати та вести себе як будь-яка інша встановлена програма. Ви знайдете її у списках додатків і зможете закріпити на головному екрані, в меню «Пуск» або на панелі завдань. Ця встановлена веб-програма також зможе безпечно взаємодіяти з іншими програмами та вашою операційною системою. ",hint:"Знайдено новий вміст",update:"Доступний новий контент."},"/ru/":{install:"Установить",iOSInstall:"Нажмите кнопку «Поделиться», а затем «Добавить на главный экран»",cancel:"Отменить",close:"Закрыть",prevImage:"Предыдущее изображение",nextImage:"Следующее изображение",desc:"Описание",feature:"Основные функции",explain:"Это приложение может быть установлено на вашем компьютере или мобильном устройстве. Это позволит веб-приложению выглядеть и вести себя как любое другое установленное приложение. Вы найдете его в списках приложений и сможете закрепить его на домашнем экране, в меню пуск или на панели задач. Установленное веб-приложение также сможет безопасно взаимодействовать с другими приложениями и операционной системой. ",hint:"Найден новый контент",update:"Доступен новый контент."},"/br/":{install:"Instalar",iOSInstall:"Toque no botão de compartilhar e depois 'Adicionar à Home'",cancel:"Cancelar",close:"Fechar",prevImage:"Imagem anterior",nextImage:"Próxima imagem",desc:"Descrição",feature:"Características Chave",explain:"Esta aplicação web pode ser instalada no seu PC ou dispositivo móvel. Isso fará com que ela se pareça e se comporte como qualquer outra aplicação. Você a encontrará na lista de apps e poderá adicionar seu ícone à tela de entrada, menus ou barras de tarefa. Uma vez instalada, esta aplicação web também poderá interagir com outras aplicações ou com o próprio sistema operacional. ",hint:"Novo conteúdo encontrado",update:"Novo conteúdo está disponível."},"/pl/":{install:"Zainstaluj",iOSInstall:"Stuknij przycisk udostępniania, a następnie „Dodaj do ekranu głównego”",cancel:"Anuluj",close:"Zamknij",prevImage:"Poprzedni obrazek",nextImage:"Następny obrazek",desc:"Opis",feature:"Kluczowe cechy",explain:"Tę aplikację można zainstalować na komputerze lub urządzeniu mobilnym. Dzięki temu ta aplikacja internetowa będzie wyglądać i zachowywać się jak każda inna zainstalowana aplikacja. Znajdziesz ją na listach aplikacji i będziesz mógł przypiąć go do ekranu głównego, menu startowego lub pasków zadań. Ta zainstalowana aplikacja internetowa będzie również mogła bezpiecznie komunikować się z innymi aplikacjami i systemem operacyjnym.",hint:"Znaleziono nową zawartość.",update:"Nowa zawartość jest dostępna."},"/sk/":{install:"Insštalácia",iOSInstall:"Klikni na tlačidlo zdielania a potom 'Daj na domovskú obrazovku'",cancel:"Zrušiť",close:"Zavrieť",prevImage:"Prodošlí obrázok",nextImage:"Ďalší obrázok",desc:"Poznámka",feature:"Kľúčové vlastnosti",explain:"Túto aplikáciu je možné nainštalovať na počítač alebo mobil. Toto umožný sa správať aplikácii ako každej inej nainštalovanej aplikácii. Nájdeš ju vo svojom liste aplikácii a budeš môcť ju pripnúť na domovskú stránku, štartovacieho menu alebo do panelu úloh. Táto nainštalovaná webová aplikácia umžní tiež bezpečne komunikovať s ostatnými nainštalovanými aplikáciami a operačným systémom. ",hint:"Nový obsah bol nájdený.",update:"Nový obsah je dostupný."},"/fr/":{install:"Installer",iOSInstall:"Appuyez sur le bouton partager puis 'Ajouter à l'écran d'accueil'",cancel:"Annuler",close:"Fermer",prevImage:"Image précédente",nextImage:"Image suivante",desc:"Description",feature:"Composants clés",explain:"Cette app peut être installée sur PC ou smartphone. Cela permettra de rendre cette page web comme n'importe quelle autre application. Vous la trouverez dans votre liste d'application et serez capable de la pin sur votre écran principal et divers menus. L'application web installée sera capable d'interagir avec les autres applications et le système d'exploitation.",hint:"New content found.",update:"New content is available."},"/es/":{install:"Instalar",iOSInstall:"Toque el botón compartir y luego 'Agregar a la pantalla de inicio'",cancel:"Cancelar",close:"Cerrar",prevImage:"Imagen anterior",nextImage:"Imagen siguiente",desc:"Descripción",feature:"Características clave",explain:"Esta aplicación se puede instalar en su PC o dispositivo móvil. Esto permitirá que esta aplicación web se vea y se comporte como cualquier otra aplicación instalada. Lo encontrará en su lista de aplicaciones y podrá fijarlo a su pantalla de inicio, menús de inicio o barras de tareas. Esta aplicación web instalada también podrá interactuar de manera segura con otras aplicaciones y su sistema operativo.",hint:"Nuevo contenido encontrado.",update:"Hay nuevo contenido disponible."},"/ja/":{install:"インストール",iOSInstall:"共有ボタンをタップし、「ホームスクリーンに追加」をタップします",cancel:"キャンセル",close:"閉じる",prevImage:"前の画像",nextImage:"次の画像",desc:"詳細",feature:"主な特徴",explain:"このアプリは、PCまたはモバイルデバイスにインストールすることができます。 これにより、このウェブアプリは、インストールされている他のアプリと同様に表示され、動作するようになります。 アプリ一覧で見つけることができ、ホーム画面、スタートメニュー、タスクバーに固定することができます。 このインストールされたウェブアプリケーションは、他のアプリケーションやオペレーティングシステムと安全にやり取りすることもできます。",hint:"新しいコンテンツが見つかりました。",update:"新しいコンテンツが登場しました。"},"/tr/":{install:"Yükle",iOSInstall:"Paylaş düğmesine ve ardından 'Ana Ekrana Ekle' düğmesine basın",cancel:"İptal",close:"Kapat",prevImage:"Önceki Resim",nextImage:"Sonraki Resim",desc:"Tanım",feature:"Ana Özellikler",explain:"Bu uygulama PC'nize veya mobil cihazınıza yüklenebilir. Yüklenmesi bu web uygulamasının diğer yüklü uygulamalar gibi görünmesini ve davranmasını sağlar. Yüklenen web uygulamasını uygulama listenizde bulabilir ve ana ekranınıza, menülere veya görev çubuklarına sabitleyebilirsiniz. Aynı zamanda yüklenen web uygulaması, diğer uygulamalar ve işletim sisteminizle güvenli bir şekilde etkileşime girebilecektir.",hint:"Yeni içerik bulundu.",update:"Yeni içerik mevcut."},"/ko/":{install:"설치",iOSInstall:"공유 버튼을 누르고 '홈 화면에 추가'를 누르세요",cancel:"취소",close:"닫기",prevImage:"이전 이미지",nextImage:"다음 이미지",desc:"설명",feature:"주요 기능",explain:"이 앱은 PC 또는 모바일 장치에 설치할 수 있습니다. 이렇게 하면 이 웹 앱은 다른 설치된 앱과 마찬가지로 표시되고 작동합니다. 앱 목록에서 찾을 수 있으며 홈 화면, 시작 메뉴, 작업 표시줄에 고정할 수 있습니다. 설치된 웹 앱은 다른 앱과 안전하게 상호 작용할 수 있습니다.",hint:"새로운 콘텐츠를 찾았습니다.",update:"새로운 콘텐츠가 있습니다."},"/fi/":{install:"Asenna",iOSInstall:"Paina Jaa-painiketta ja sitten 'Lisää kotiin'-painiketta",cancel:"Peruuta",close:"Sulje",prevImage:"Edellinen kuva",nextImage:"Seuraava kuva",desc:"Kuvaus",feature:"Avainominaisuudet",explain:"Tämä sovellus on asennettavissa tietokoneelle tai mobiililaitteelle. Tämä mahdollistaa sovelluksen toiminnan tietokoneohjelmana. Löydät sen sovelluslistasta ja voit kiinnittää sen työpöydälle, kotinäytölle, tehtäväpalkkiin tai muulle listalle. Asennettu sovellus voi turvallisesti olla vuorovaikutuksessa muiden sovellusten ja käyttöjärjestelmäsi kanssa.",hint:"Uutta sisältöä.",update:"Uutta sisältöä on saatavilla."},"/hu/":{install:"Telepítés",iOSInstall:"Nyomd meg a megosztás gombot, majd a 'Hozzáadás a kezdőképernyőhöz' opciót",cancel:"Mégse",close:"Bezárás",prevImage:"Előző kép",nextImage:"Következő kép",desc:"Leírás",feature:"Főbb jellemzők",explain:"Ez az alkalmazás telepíthető PC-re vagy mobil eszközre. Ez lehetővé teszi, hogy ez a webalkalmazás úgy nézzen ki és viselkedjen, mint bármely más telepített alkalmazás. Az alkalmazáslistában találod majd, és hozzáadhatod a kezdőképernyőhöz, indító menühöz vagy a feladatok sávjához. Az telepített webalkalmazás biztonságosan interakcióba léphet más alkalmazásokkal és az operációs rendszerrel.",hint:"Új tartalom érhető el.",update:"Új tartalom érhető el."},"/id/":{install:"Install",iOSInstall:"Ketuk tombol bagikan, lalu 'Tambahkan ke Layar Utama'",cancel:"Batal",close:"Tutup",prevImage:"Gambar sebelumnya",nextImage:"Gambar selanjutnya",desc:"Keterangan",feature:"Fitur",explain:"Aplikasi ini dapat diinstal di PC atau perangkat seluler Anda. Ini akan memungkinkan aplikasi web ini terlihat seperti aplikasi terpasang lainnya. Anda bisa menemukannya di daftar aplikasi dan dapat menyematkannya ke layar beranda, menu start, atau menu ke taskbar. Aplikasi web yang terinstal ini juga dapat berinteraksi dengan aplikasi lain dan dengan sistem operasi yang Anda gunakan. ",hint:"Konten baru ditemukan.",update:"Konten baru telah tersedia."},"/nl/":{install:"Installeren",iOSInstall:"Druk op de share button en dan op 'Add to Home Screen'",cancel:"Annuleren",close:"Sluiten",prevImage:"Vorige Foto",nextImage:"Volgende Foto",desc:"Beschrijving",feature:"Belangrijkste mogelijkheden",explain:"Deze app kan op uw PC of mobiel toestel geïnstalleerd worden. Dit laat toe om deze webapp er uit te laten alsof het een normale app is. Je kan het terugvinden in jouw applijsten en kan het op je homescreen, start menu of taakbalk vastzetten. Deze geïnstalleerde webapp zal ook veilig samenwerken met andere apps en uw besturingssysteem. ",hint:"Nieuwe inhoud gevonden.",update:"Nieuwe inhoud is beschikbaar."}},S=async(a,e)=>{const{siteData:n}=a,{base:t}=a.options,i=a.dir.source(".vuepress/public/manifest.webmanifest"),o=a.dir.source(".vuepress/public/manifest.json"),s=JSON.parse(g.existsSync(i)?await g.readFile(i,"utf8"):g.existsSync(o)?await g.readFile(o,"utf8"):"{}");return{name:n.title||n.locales["/"]?.title||"Site",short_name:n.title||n.locales["/"]?.title||"Site",description:n.description||n.locales["/"]?.description||"A site built with vuepress",lang:P(a),start_url:t,scope:t,display:"standalone",theme_color:e.themeColor||"#46bd87",background_color:"#ffffff",orientation:"portrait-primary",prefer_related_applications:!1,...s,...e.manifest}},w="@vuepress/plugin-pwa",m=new C(w),M=async(a,e)=>{const{succeed:n}=m.load("Generating manifest.webmanifest"),t=await S(a,e),i=a.dir.dest("manifest.webmanifest");await g.writeJSON(i,t,{flag:"w"}),n(`Manifest generated and saved to ${b.cyan(k.relative(process.cwd(),i))}!`)},z=["png","jpg","jpeg","webp","bmp","gif"],x=["js","css","svg","woff","woff2","eot","ttf","otf"],E=(a=1024)=>e=>{const n=[],t=[];for(const i of e){const{url:o,size:s}=i;z.some(h=>T(o,`.${h}`))&&s>a*1024?n.push(`Skipped ${o}, as it's ${Math.ceil(s/1024)} KB.`):t.push(i)}return{warnings:n,manifest:t}},H=async(a,e)=>{const{succeed:n}=m.load("Generating service worker"),t=[`**/*.{${x.join(",")}}`];e.cacheHTML?t.push("**/*.html"):t.push("./index.html","./404.html"),e.cacheImage&&t.push(`**/*.{${z.join(",")}}`),await L({dontCacheBustURLsMatching:new RegExp(`\\.[0-9a-f]{8}\\.(${["html",...x,...z].join("|")})$`),globPatterns:t,cleanupOutdatedCaches:!0,clientsClaim:!0,maximumFileSizeToCacheInBytes:(e.maxSize??2048)*1024,manifestTransforms:[E(e.maxImageSize)],mode:a.env.isDebug?"development":"production",sourcemap:a.env.isDebug,...e.generateSWConfig,globDirectory:a.dir.dest(),swDest:a.dir.dest(e.serviceWorkerFilename??"service-worker.js")}).then(({count:i,size:o,warnings:s})=>{n(),m.info(`Precache ${b.cyan(`${i} files`)}, totaling ${b.cyan(`${(o/1024/1024).toFixed(2)} Mb.`)}.`),s.length&&m.warn(`
|
|
2
2
|
${s.map(h=>` · ${h}`).join(`
|
|
3
3
|
`)}`),o>104857600?m.error(`Cache Size is larger than 100MB, so that it can not be registered on all browsers.
|
|
4
4
|
${b.blue("Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\n")}`):o>52428800&&m.warn(`
|
|
5
5
|
Cache Size is larger than 50MB, which will not be registered on Safari.
|
|
6
|
-
${b.blue("Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\n")}`)})},u=(a,e)=>A(e)?e.replace(/^\//,a):e,W=(a,e)=>(e.icons&&(e.icons=e.icons.map(n=>({...n,src:u(a,n.src)}))),e.shortcuts&&(e.shortcuts=e.shortcuts.map(n=>({...n,icons:n.icons?.map(t=>({...t,src:u(a,t.src)}))??[],url:u(a,n.url)}))),e.screenshots&&(e.screenshots=e.screenshots.map(n=>({...n,src:u(a,n.src)}))),e),K=(a,e)=>{e.favicon&&(e.favicon=u(a,e.favicon)),e.apple&&(e.apple.icon&&(e.apple.icon=u(a,e.apple.icon)),e.apple.maskIcon&&(e.apple.maskIcon=u(a,e.apple.maskIcon))),e.msTile&&e.msTile.image&&(e.msTile.image=u(a,e.msTile.image)),e.manifest&&(e.manifest=W(a,e.manifest))},V=({favicon:a,manifest:e,themeColor:n="#46bd87",apple:t,msTile:i},o="/",s=[])=>{const h=[],I=[];s.forEach(l=>{l[0]==="meta"?h.push(l[1].name):l[0]==="link"&&I.push(l[1].rel)});let p="";const d=(l,r,f={})=>{I.includes(l)||s.push(["link",{rel:l,href:r,...f}])},c=(l,r,f={})=>{h.includes(l)||s.push(["meta",{name:l,content:r,...f}])};if(a&&d("icon",a),e?.icons){const{icons:l}=e;l.length>0&&(p=l[0].src,e.icons.forEach(r=>{r.type?d("icon",r.src,{type:r.type,sizes:r.sizes}):d("icon",r.src,{sizes:r.sizes})}))}return d("manifest",`${o}manifest.webmanifest`,{crossorigin:"use-credentials"}),c("theme-color",n||"#46bd87"),y(t)&&(t.icon||p)?(d("apple-touch-icon",t.icon||p),c("apple-mobile-web-app-capable","yes"),c("apple-mobile-web-app-status-bar-style",t.statusBarColor||"black"),t.maskIcon&&d("mask-icon",t.maskIcon,{color:n||"#46bd87"})):t!==!1&&p&&(d("apple-touch-icon",p),c("apple-mobile-web-app-capable","yes"),c("apple-mobile-web-app-status-bar-style","black")),y(i)&&(i.image||p)?(c("msapplication-TileImage",i.image||p),c("msapplication-TileColor",i.color||n||"#46bd87")):i!==!1&&p&&(c("msapplication-TileImage",p),c("msapplication-TileColor",n||"#46bd87")),s},v=F(import.meta.url),_=(a,e)=>{let n="";const t=[];return e.showInstall&&(n+=`import { PwaInstall as _PwaInstall } from "${k.join(v,"../client/components/PwaInstall.js")}";
|
|
6
|
+
${b.blue("Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\n")}`)})},u=(a,e)=>A(e)?e.replace(/^\//,a):e,W=(a,e)=>(e.icons&&(e.icons=e.icons.map(n=>({...n,src:u(a,n.src)}))),e.shortcuts&&(e.shortcuts=e.shortcuts.map(n=>({...n,icons:n.icons?.map(t=>({...t,src:u(a,t.src)}))??[],url:u(a,n.url)}))),e.screenshots&&(e.screenshots=e.screenshots.map(n=>({...n,src:u(a,n.src)}))),e),K=(a,e)=>{e.favicon&&(e.favicon=u(a,e.favicon)),e.apple&&(e.apple.icon&&(e.apple.icon=u(a,e.apple.icon)),e.apple.maskIcon&&(e.apple.maskIcon=u(a,e.apple.maskIcon))),e.msTile&&e.msTile.image&&(e.msTile.image=u(a,e.msTile.image)),e.manifest&&(e.manifest=W(a,e.manifest))},V=({favicon:a,manifest:e,themeColor:n="#46bd87",apple:t,msTile:i},o="/",s=[])=>{const h=[],I=[];s.forEach(l=>{l[0]==="meta"?h.push(l[1].name):l[0]==="link"&&I.push(l[1].rel)});let p="";const d=(l,r,f={})=>{I.includes(l)||s.push(["link",{rel:l,href:r,...f}])},c=(l,r,f={})=>{h.includes(l)||s.push(["meta",{name:l,content:r,...f}])};if(a&&d("icon",a),e?.icons){const{icons:l}=e;l.length>0&&(p=l[0].src,e.icons.forEach(r=>{r.type?d("icon",r.src,{type:r.type,sizes:r.sizes}):d("icon",r.src,{sizes:r.sizes})}))}return d("manifest",`${o}manifest.webmanifest`,{crossorigin:"use-credentials"}),c("theme-color",n||"#46bd87"),y(t)&&(t.icon||p)?(d("apple-touch-icon",t.icon||p),c("apple-mobile-web-app-capable","yes"),c("apple-mobile-web-app-status-bar-style",t.statusBarColor||"black"),t.maskIcon&&d("mask-icon",t.maskIcon,{color:n||"#46bd87"})):t!==!1&&p&&(d("apple-touch-icon",p),c("apple-mobile-web-app-capable","yes"),c("apple-mobile-web-app-status-bar-style","black")),y(i)&&(i.image||p)?(c("msapplication-TileImage",i.image||p),c("msapplication-TileColor",i.color||n||"#46bd87")):i!==!1&&p&&(c("msapplication-TileImage",p),c("msapplication-TileColor",n||"#46bd87")),s},v=import.meta.dirname||F(import.meta.url),_=(a,e)=>{let n="";const t=[];return e.showInstall&&(n+=`import { PwaInstall as _PwaInstall } from "${k.join(v,"../client/components/PwaInstall.js")}";
|
|
7
7
|
`,t.push("PwaInstall")),e.update==="hint"?(n+=`import { PwaFoundPopup as _PwaFoundPopup } from "${e.foundComponent||k.join(v,"../client/components/PwaFoundPopup.js")}";
|
|
8
8
|
`,t.push("PwaFoundPopup")):e.update!=="disable"&&e.update!=="force"&&(n+=`import { PwaReadyPopup as _PwaReadyPopup } from "${e.readyComponent||k.join(v,"../client/components/PwaReadyPopup.js")}";
|
|
9
9
|
`,t.push("PwaReadyPopup")),a.writeTemp("pwa/config.js",`import { h } from "vue";
|
|
10
10
|
import { defineClientConfig } from "vuepress/client";
|
|
11
11
|
import { setupPwa, setupViewPoint } from "${k.join(v,"../client/composables/index.js")}";
|
|
12
12
|
${n}
|
|
13
|
-
import "${N("@vuepress/plugin-pwa/styles/vars.css",import.meta
|
|
13
|
+
import "${N("@vuepress/plugin-pwa/styles/vars.css",import.meta)}";
|
|
14
14
|
|
|
15
15
|
const locales = ${JSON.stringify(O({app:a,name:w,default:j,config:e.locales}))};
|
|
16
16
|
|
package/lib/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/node/locales.ts","../../src/node/getManifest.ts","../../src/node/logger.ts","../../src/node/generateManifest.ts","../../src/node/generateServiceWorker.ts","../../src/node/helper.ts","../../src/node/injectLinksToHead.ts","../../src/node/prepareClientConfigFile.ts","../../src/node/pwaPlugin.ts"],"sourcesContent":["import type { PwaPluginLocaleConfig } from '../shared/index.js'\n\n/** Multi language config for pwa popup */\nexport const pwaLocales: PwaPluginLocaleConfig = {\n '/en/': {\n install: 'Install',\n iOSInstall: \"Tap the share button and then 'Add to Home Screen'\",\n cancel: 'Cancel',\n close: 'Close',\n prevImage: 'Previous Image',\n nextImage: 'Next Image',\n desc: 'Description',\n feature: 'Key Features',\n explain:\n 'This app can be installed on your PC or mobile device. This will allow this web app to look and behave like any other installed app. You will find it in your app lists and be able to pin it to your home screen, start menus or task bars. This installed web app will also be able to safely interact with other apps and your operating system. ',\n hint: 'New content found.',\n update: 'New content is available.',\n },\n\n '/zh/': {\n install: '安装',\n iOSInstall: '点击分享按钮然后点击“添加到主屏幕”',\n cancel: '取消',\n close: '关闭',\n prevImage: '上一张图片',\n nextImage: '下一张图片',\n desc: '详情',\n feature: '主要特色',\n explain:\n '该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。',\n hint: '发现新内容可用',\n update: '新内容已就绪',\n },\n\n '/zh-tw/': {\n install: '安裝',\n iOSInstall: '點擊分享按鈕然後點擊“添加到主畫面”',\n cancel: '取消',\n close: '關閉',\n prevImage: '上一張圖片',\n nextImage: '下一張圖片',\n desc: '詳情',\n feature: '主要特色',\n explain:\n '該應用可以安裝在你的 PC 或行動裝置上。這將使該 Web 應用程式外觀和行為與其他應用程式相同。它將在出現在應用程式列表中,並可以固定到主畫面,開始菜單或任務欄。此 Web 應用程式還將能夠與其他應用程式和你的操作系統安全地進行交互。',\n hint: '發現新内容可用',\n update: '新内容已就绪',\n },\n\n '/de/': {\n install: 'Installieren',\n iOSInstall: \"Drucke den Share-Button und dann 'zu Homescreen hinzufügen'\",\n cancel: 'Abbrechen',\n close: 'Schließen',\n prevImage: 'Vorheriges Bild',\n nextImage: 'Nächstes Bild',\n desc: 'Berschreibung',\n feature: 'Funktionen',\n explain:\n 'Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.',\n hint: 'Neuer Inhalt gefunden.',\n update: 'Neue Inhalte sind verfügbar.',\n },\n\n '/de-at/': {\n install: 'Installieren',\n iOSInstall: \"Drucke den Share-Button und dan 'zu Homescreen hinzufügen'\",\n cancel: 'Abbrechen',\n close: 'Schließen',\n prevImage: 'Vorheriges Bild',\n nextImage: 'Nächstes Bild',\n desc: 'Berschreibung',\n feature: 'Features',\n explain:\n 'Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.',\n hint: 'Neue Inhalte sind verfügbar.',\n update: 'Neue Inhalte sind verfügbar.',\n },\n\n '/vi/': {\n install: 'Tải về',\n iOSInstall: \"Nhấn vào nút chia sẻ và sau đó 'Thêm vào Màn hình chính'\",\n cancel: 'Huỷ bỏ',\n close: 'Đóng',\n prevImage: 'Hình ảnh trước đó',\n nextImage: 'Hình ảnh tiếp theo',\n desc: 'Sự miêu tả',\n feature: 'Các tính năng chính',\n explain:\n 'Ứng dụng này có thể được cài đặt trên PC hoặc thiết bị di động của bạn. Điều này sẽ cho phép ứng dụng web này trông và hoạt động giống như bất kỳ ứng dụng đã cài đặt nào khác. Bạn sẽ tìm thấy nó trong danh sách ứng dụng của mình và có thể ghim nó vào màn hình chính, menu bắt đầu hoặc thanh tác vụ. Ứng dụng web đã cài đặt này cũng sẽ có thể tương tác an toàn với các ứng dụng khác và hệ điều hành của bạn.',\n hint: 'Nội dung mới được tìm thấy',\n update: 'Đã có nội dung mới',\n },\n\n '/uk/': {\n install: 'Встановити',\n iOSInstall:\n 'Торкніться кнопки «Поділитися», а потім «Додати на головний екран»',\n cancel: 'Скасувати',\n close: 'Закрити',\n prevImage: 'Попереднє зображення',\n nextImage: 'Наступне зображення',\n desc: 'Опис',\n feature: 'Основні характеристики',\n explain:\n 'Цю програму можна встановити на ПК або мобільний пристрій. Це дозволить цій веб-програмі виглядати та вести себе як будь-яка інша встановлена програма. Ви знайдете її у списках додатків і зможете закріпити на головному екрані, в меню «Пуск» або на панелі завдань. Ця встановлена веб-програма також зможе безпечно взаємодіяти з іншими програмами та вашою операційною системою. ',\n hint: 'Знайдено новий вміст',\n update: 'Доступний новий контент.',\n },\n\n '/ru/': {\n install: 'Установить',\n iOSInstall:\n 'Нажмите кнопку «Поделиться», а затем «Добавить на главный экран»',\n cancel: 'Отменить',\n close: 'Закрыть',\n prevImage: 'Предыдущее изображение',\n nextImage: 'Следующее изображение',\n desc: 'Описание',\n feature: 'Основные функции',\n explain:\n 'Это приложение может быть установлено на вашем компьютере или мобильном устройстве. Это позволит веб-приложению выглядеть и вести себя как любое другое установленное приложение. Вы найдете его в списках приложений и сможете закрепить его на домашнем экране, в меню пуск или на панели задач. Установленное веб-приложение также сможет безопасно взаимодействовать с другими приложениями и операционной системой. ',\n hint: 'Найден новый контент',\n update: 'Доступен новый контент.',\n },\n\n '/br/': {\n install: 'Instalar',\n iOSInstall: \"Toque no botão de compartilhar e depois 'Adicionar à Home'\",\n cancel: 'Cancelar',\n close: 'Fechar',\n prevImage: 'Imagem anterior',\n nextImage: 'Próxima imagem',\n desc: 'Descrição',\n feature: 'Características Chave',\n explain:\n 'Esta aplicação web pode ser instalada no seu PC ou dispositivo móvel. Isso fará com que ela se pareça e se comporte como qualquer outra aplicação. Você a encontrará na lista de apps e poderá adicionar seu ícone à tela de entrada, menus ou barras de tarefa. Uma vez instalada, esta aplicação web também poderá interagir com outras aplicações ou com o próprio sistema operacional. ',\n hint: 'Novo conteúdo encontrado',\n update: 'Novo conteúdo está disponível.',\n },\n\n '/pl/': {\n install: 'Zainstaluj',\n iOSInstall:\n 'Stuknij przycisk udostępniania, a następnie „Dodaj do ekranu głównego”',\n cancel: 'Anuluj',\n close: 'Zamknij',\n prevImage: 'Poprzedni obrazek',\n nextImage: 'Następny obrazek',\n desc: 'Opis',\n feature: 'Kluczowe cechy',\n explain:\n 'Tę aplikację można zainstalować na komputerze lub urządzeniu mobilnym. Dzięki temu ta aplikacja internetowa będzie wyglądać i zachowywać się jak każda inna zainstalowana aplikacja. Znajdziesz ją na listach aplikacji i będziesz mógł przypiąć go do ekranu głównego, menu startowego lub pasków zadań. Ta zainstalowana aplikacja internetowa będzie również mogła bezpiecznie komunikować się z innymi aplikacjami i systemem operacyjnym.',\n hint: 'Znaleziono nową zawartość.',\n update: 'Nowa zawartość jest dostępna.',\n },\n\n '/sk/': {\n install: 'Insštalácia',\n iOSInstall:\n \"Klikni na tlačidlo zdielania a potom 'Daj na domovskú obrazovku'\",\n cancel: 'Zrušiť',\n close: 'Zavrieť',\n prevImage: 'Prodošlí obrázok',\n nextImage: 'Ďalší obrázok',\n desc: 'Poznámka',\n feature: 'Kľúčové vlastnosti',\n explain:\n 'Túto aplikáciu je možné nainštalovať na počítač alebo mobil. Toto umožný sa správať aplikácii ako každej inej nainštalovanej aplikácii. Nájdeš ju vo svojom liste aplikácii a budeš môcť ju pripnúť na domovskú stránku, štartovacieho menu alebo do panelu úloh. Táto nainštalovaná webová aplikácia umžní tiež bezpečne komunikovať s ostatnými nainštalovanými aplikáciami a operačným systémom. ',\n hint: 'Nový obsah bol nájdený.',\n update: 'Nový obsah je dostupný.',\n },\n\n '/fr/': {\n install: 'Installer',\n iOSInstall:\n \"Appuyez sur le bouton partager puis 'Ajouter à l'écran d'accueil'\",\n cancel: 'Annuler',\n close: 'Fermer',\n prevImage: 'Image précédente',\n nextImage: 'Image suivante',\n desc: 'Description',\n feature: 'Composants clés',\n explain:\n \"Cette app peut être installée sur PC ou smartphone. Cela permettra de rendre cette page web comme n'importe quelle autre application. Vous la trouverez dans votre liste d'application et serez capable de la pin sur votre écran principal et divers menus. L'application web installée sera capable d'interagir avec les autres applications et le système d'exploitation.\",\n hint: 'New content found.',\n update: 'New content is available.',\n },\n\n '/es/': {\n install: 'Instalar',\n iOSInstall:\n \"Toque el botón compartir y luego 'Agregar a la pantalla de inicio'\",\n cancel: 'Cancelar',\n close: 'Cerrar',\n prevImage: 'Imagen anterior',\n nextImage: 'Imagen siguiente',\n desc: 'Descripción',\n feature: 'Características clave',\n explain:\n 'Esta aplicación se puede instalar en su PC o dispositivo móvil. Esto permitirá que esta aplicación web se vea y se comporte como cualquier otra aplicación instalada. Lo encontrará en su lista de aplicaciones y podrá fijarlo a su pantalla de inicio, menús de inicio o barras de tareas. Esta aplicación web instalada también podrá interactuar de manera segura con otras aplicaciones y su sistema operativo.',\n hint: 'Nuevo contenido encontrado.',\n update: 'Hay nuevo contenido disponible.',\n },\n\n '/ja/': {\n install: 'インストール',\n iOSInstall:\n '共有ボタンをタップし、「ホームスクリーンに追加」をタップします',\n cancel: 'キャンセル',\n close: '閉じる',\n prevImage: '前の画像',\n nextImage: '次の画像',\n desc: '詳細',\n feature: '主な特徴',\n explain:\n 'このアプリは、PCまたはモバイルデバイスにインストールすることができます。 これにより、このウェブアプリは、インストールされている他のアプリと同様に表示され、動作するようになります。 アプリ一覧で見つけることができ、ホーム画面、スタートメニュー、タスクバーに固定することができます。 このインストールされたウェブアプリケーションは、他のアプリケーションやオペレーティングシステムと安全にやり取りすることもできます。',\n hint: '新しいコンテンツが見つかりました。',\n update: '新しいコンテンツが登場しました。',\n },\n\n '/tr/': {\n install: 'Yükle',\n iOSInstall:\n \"Paylaş düğmesine ve ardından 'Ana Ekrana Ekle' düğmesine basın\",\n cancel: 'İptal',\n close: 'Kapat',\n prevImage: 'Önceki Resim',\n nextImage: 'Sonraki Resim',\n desc: 'Tanım',\n feature: 'Ana Özellikler',\n explain:\n \"Bu uygulama PC'nize veya mobil cihazınıza yüklenebilir. Yüklenmesi bu web uygulamasının diğer yüklü uygulamalar gibi görünmesini ve davranmasını sağlar. Yüklenen web uygulamasını uygulama listenizde bulabilir ve ana ekranınıza, menülere veya görev çubuklarına sabitleyebilirsiniz. Aynı zamanda yüklenen web uygulaması, diğer uygulamalar ve işletim sisteminizle güvenli bir şekilde etkileşime girebilecektir.\",\n hint: 'Yeni içerik bulundu.',\n update: 'Yeni içerik mevcut.',\n },\n\n '/ko/': {\n install: '설치',\n iOSInstall: \"공유 버튼을 누르고 '홈 화면에 추가'를 누르세요\",\n cancel: '취소',\n close: '닫기',\n prevImage: '이전 이미지',\n nextImage: '다음 이미지',\n desc: '설명',\n feature: '주요 기능',\n explain:\n '이 앱은 PC 또는 모바일 장치에 설치할 수 있습니다. 이렇게 하면 이 웹 앱은 다른 설치된 앱과 마찬가지로 표시되고 작동합니다. 앱 목록에서 찾을 수 있으며 홈 화면, 시작 메뉴, 작업 표시줄에 고정할 수 있습니다. 설치된 웹 앱은 다른 앱과 안전하게 상호 작용할 수 있습니다.',\n hint: '새로운 콘텐츠를 찾았습니다.',\n update: '새로운 콘텐츠가 있습니다.',\n },\n\n '/fi/': {\n install: 'Asenna',\n iOSInstall: \"Paina Jaa-painiketta ja sitten 'Lisää kotiin'-painiketta\",\n cancel: 'Peruuta',\n close: 'Sulje',\n prevImage: 'Edellinen kuva',\n nextImage: 'Seuraava kuva',\n desc: 'Kuvaus',\n feature: 'Avainominaisuudet',\n explain:\n 'Tämä sovellus on asennettavissa tietokoneelle tai mobiililaitteelle. Tämä mahdollistaa sovelluksen toiminnan tietokoneohjelmana. Löydät sen sovelluslistasta ja voit kiinnittää sen työpöydälle, kotinäytölle, tehtäväpalkkiin tai muulle listalle. Asennettu sovellus voi turvallisesti olla vuorovaikutuksessa muiden sovellusten ja käyttöjärjestelmäsi kanssa.',\n hint: 'Uutta sisältöä.',\n update: 'Uutta sisältöä on saatavilla.',\n },\n\n '/hu/': {\n install: 'Telepítés',\n iOSInstall:\n \"Nyomd meg a megosztás gombot, majd a 'Hozzáadás a kezdőképernyőhöz' opciót\",\n cancel: 'Mégse',\n close: 'Bezárás',\n prevImage: 'Előző kép',\n nextImage: 'Következő kép',\n desc: 'Leírás',\n feature: 'Főbb jellemzők',\n explain:\n 'Ez az alkalmazás telepíthető PC-re vagy mobil eszközre. Ez lehetővé teszi, hogy ez a webalkalmazás úgy nézzen ki és viselkedjen, mint bármely más telepített alkalmazás. Az alkalmazáslistában találod majd, és hozzáadhatod a kezdőképernyőhöz, indító menühöz vagy a feladatok sávjához. Az telepített webalkalmazás biztonságosan interakcióba léphet más alkalmazásokkal és az operációs rendszerrel.',\n hint: 'Új tartalom érhető el.',\n update: 'Új tartalom érhető el.',\n },\n\n '/id/': {\n install: 'Install',\n iOSInstall: \"Ketuk tombol bagikan, lalu 'Tambahkan ke Layar Utama'\",\n cancel: 'Batal',\n close: 'Tutup',\n prevImage: 'Gambar sebelumnya',\n nextImage: 'Gambar selanjutnya',\n desc: 'Keterangan',\n feature: 'Fitur',\n explain:\n 'Aplikasi ini dapat diinstal di PC atau perangkat seluler Anda. Ini akan memungkinkan aplikasi web ini terlihat seperti aplikasi terpasang lainnya. Anda bisa menemukannya di daftar aplikasi dan dapat menyematkannya ke layar beranda, menu start, atau menu ke taskbar. Aplikasi web yang terinstal ini juga dapat berinteraksi dengan aplikasi lain dan dengan sistem operasi yang Anda gunakan. ',\n hint: 'Konten baru ditemukan.',\n update: 'Konten baru telah tersedia.',\n },\n\n '/nl/': {\n install: 'Installeren',\n iOSInstall: \"Druk op de share button en dan op 'Add to Home Screen'\",\n cancel: 'Annuleren',\n close: 'Sluiten',\n prevImage: 'Vorige Foto',\n nextImage: 'Volgende Foto',\n desc: 'Beschrijving',\n feature: 'Belangrijkste mogelijkheden',\n explain:\n 'Deze app kan op uw PC of mobiel toestel geïnstalleerd worden. Dit laat toe om deze webapp er uit te laten alsof het een normale app is. Je kan het terugvinden in jouw applijsten en kan het op je homescreen, start menu of taakbalk vastzetten. Deze geïnstalleerde webapp zal ook veilig samenwerken met andere apps en uw besturingssysteem. ',\n hint: 'Nieuwe inhoud gevonden.',\n update: 'Nieuwe inhoud is beschikbaar.',\n },\n}\n","import { getRootLang } from '@vuepress/helper'\nimport type { App } from 'vuepress/core'\nimport { fs } from 'vuepress/utils'\nimport type { AppManifest } from '../shared/index.js'\nimport type { PwaPluginOptions } from './options.js'\n\nexport const getManifest = async (\n app: App,\n options: PwaPluginOptions,\n): Promise<AppManifest> => {\n const { siteData } = app\n const { base } = app.options\n\n const userManifestPath = app.dir.source(\n '.vuepress/public/manifest.webmanifest',\n )\n const userManifestJSONPath = app.dir.source('.vuepress/public/manifest.json')\n\n const manifestFileContent = JSON.parse(\n fs.existsSync(userManifestPath)\n ? await fs.readFile(userManifestPath, 'utf8')\n : fs.existsSync(userManifestJSONPath)\n ? await fs.readFile(userManifestJSONPath, 'utf8')\n : '{}',\n ) as AppManifest\n\n const manifest: AppManifest = {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n name: siteData.title || siteData.locales['/']?.title || 'Site',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n short_name: siteData.title || siteData.locales['/']?.title || 'Site',\n description:\n siteData.description ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n siteData.locales['/']?.description ||\n 'A site built with vuepress',\n lang: getRootLang(app),\n start_url: base,\n scope: base,\n\n display: 'standalone',\n theme_color: options.themeColor || '#46bd87',\n background_color: '#ffffff',\n orientation: 'portrait-primary',\n prefer_related_applications: false,\n\n ...manifestFileContent,\n ...options.manifest,\n }\n\n return manifest\n}\n","import { Logger } from '@vuepress/helper'\n\nexport const PLUGIN_NAME = '@vuepress/plugin-pwa'\n\nexport const logger = new Logger(PLUGIN_NAME)\n","import type { App } from 'vuepress/core'\nimport { colors, fs, path } from 'vuepress/utils'\nimport { getManifest } from './getManifest.js'\nimport { logger } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\n\nexport const generateManifest = async (\n app: App,\n options: PwaPluginOptions,\n): Promise<void> => {\n const { succeed } = logger.load('Generating manifest.webmanifest')\n\n const manifest = await getManifest(app, options)\n const manifestPath = app.dir.dest('manifest.webmanifest')\n\n await fs.writeJSON(manifestPath, manifest, {\n flag: 'w',\n })\n\n succeed(\n `Manifest generated and saved to ${colors.cyan(\n path.relative(process.cwd(), manifestPath),\n )}!`,\n )\n}\n","import { endsWith } from '@vuepress/helper'\nimport type { App } from 'vuepress/core'\nimport { colors } from 'vuepress/utils'\nimport type {\n ManifestEntry,\n ManifestTransform,\n ManifestTransformResult,\n} from 'workbox-build'\nimport { generateSW } from 'workbox-build'\nimport { logger } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\n\nconst imageExtensions = ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'gif']\nconst cacheExtensions = [\n 'js',\n 'css',\n 'svg',\n 'woff',\n 'woff2',\n 'eot',\n 'ttf',\n 'otf',\n]\n\nconst imageFilter =\n (maxSize = 1024): ManifestTransform =>\n (\n manifestEntries: (ManifestEntry & { size: number })[],\n ): ManifestTransformResult => {\n const warnings: string[] = []\n const manifest: (ManifestEntry & { size: number })[] = []\n\n for (const entry of manifestEntries) {\n const { url, size } = entry\n\n if (imageExtensions.some((ext) => endsWith(url, `.${ext}`)))\n if (size > maxSize * 1024)\n warnings.push(`Skipped ${url}, as it's ${Math.ceil(size / 1024)} KB.`)\n else manifest.push(entry)\n else manifest.push(entry)\n }\n\n return { warnings, manifest }\n }\n\nexport const generateServiceWorker = async (\n app: App,\n options: PwaPluginOptions,\n): Promise<void> => {\n const { succeed } = logger.load('Generating service worker')\n\n const globPatterns = [`**/*.{${cacheExtensions.join(',')}}`]\n\n if (options.cacheHTML) globPatterns.push('**/*.html')\n else globPatterns.push('./index.html', './404.html')\n\n if (options.cacheImage)\n globPatterns.push(`**/*.{${imageExtensions.join(',')}}`)\n\n await generateSW({\n dontCacheBustURLsMatching: new RegExp(\n `\\\\.[0-9a-f]{8}\\\\.(${['html', ...cacheExtensions, ...imageExtensions].join('|')})$`,\n ),\n globPatterns,\n cleanupOutdatedCaches: true,\n clientsClaim: true,\n maximumFileSizeToCacheInBytes: (options.maxSize ?? 2048) * 1024,\n manifestTransforms: [imageFilter(options.maxImageSize)],\n mode: app.env.isDebug ? 'development' : 'production',\n sourcemap: app.env.isDebug,\n ...options.generateSWConfig,\n // should not be override by user config\n globDirectory: app.dir.dest(),\n swDest: app.dir.dest(options.serviceWorkerFilename ?? 'service-worker.js'),\n }).then(({ count, size, warnings }) => {\n succeed()\n\n logger.info(\n `Precache ${colors.cyan(`${count} files`)}, totaling ${colors.cyan(\n `${(size / 1024 / 1024).toFixed(2)} Mb.`,\n )}.`,\n )\n\n if (warnings.length)\n logger.warn(`\\n${warnings.map((warning) => ` · ${warning}`).join('\\n')}`)\n\n if (size > 104857600)\n logger.error(\n `Cache Size is larger than 100MB, so that it can not be registered on all browsers.\\n${colors.blue(\n 'Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\\n',\n )}`,\n )\n else if (size > 52428800)\n logger.warn(\n `\\nCache Size is larger than 50MB, which will not be registered on Safari.\\n${colors.blue(\n 'Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\\n',\n )}`,\n )\n })\n}\n","import { isLinkAbsolute } from '@vuepress/helper'\nimport type { AppManifest } from '../shared/index.js'\nimport type { PwaPluginOptions } from './options.js'\n\nconst appendBaseToLink = (base: string, link: string): string =>\n isLinkAbsolute(link) ? link.replace(/^\\//, base) : link\n\nexport const appendBaseToManifest = (\n base: string,\n manifest: AppManifest,\n): AppManifest => {\n if (manifest.icons)\n manifest.icons = manifest.icons.map((icon) => ({\n ...icon,\n src: appendBaseToLink(base, icon.src),\n }))\n\n if (manifest.shortcuts)\n manifest.shortcuts = manifest.shortcuts.map((shortcut) => ({\n ...shortcut,\n icons:\n shortcut.icons?.map((icon) => ({\n ...icon,\n src: appendBaseToLink(base, icon.src),\n })) ?? [],\n url: appendBaseToLink(base, shortcut.url),\n }))\n\n if (manifest.screenshots)\n manifest.screenshots = manifest.screenshots.map((screenshot) => ({\n ...screenshot,\n src: appendBaseToLink(base, screenshot.src),\n }))\n\n return manifest\n}\n\nexport const appendBase = (base: string, options: PwaPluginOptions): void => {\n if (options.favicon) options.favicon = appendBaseToLink(base, options.favicon)\n\n if (options.apple) {\n if (options.apple.icon)\n options.apple.icon = appendBaseToLink(base, options.apple.icon)\n\n if (options.apple.maskIcon)\n options.apple.maskIcon = appendBaseToLink(base, options.apple.maskIcon)\n }\n\n if (options.msTile && options.msTile.image)\n options.msTile.image = appendBaseToLink(base, options.msTile.image)\n\n if (options.manifest)\n options.manifest = appendBaseToManifest(base, options.manifest)\n}\n","import type { HeadConfig } from 'vuepress/core'\nimport { isPlainObject } from 'vuepress/shared'\nimport type { PwaPluginOptions } from './options.js'\n\nexport const injectLinksToHead = (\n {\n favicon,\n manifest,\n themeColor = '#46bd87',\n apple,\n msTile,\n }: PwaPluginOptions,\n base = '/',\n head: HeadConfig[] = [],\n): HeadConfig[] => {\n const metaKeys: string[] = []\n const linkKeys: string[] = []\n\n // Generate Hash for Head\n head.forEach((item) => {\n if (item[0] === 'meta') metaKeys.push(item[1].name as string)\n else if (item[0] === 'link') linkKeys.push(item[1].rel as string)\n })\n\n let fallBackIcon = ''\n const setLink = (\n rel: string,\n href: string,\n more: Record<string, string> = {},\n ): void => {\n if (!linkKeys.includes(rel)) head.push(['link', { rel, href, ...more }])\n }\n\n const setMeta = (\n name: string,\n content: string,\n more: Record<string, string> = {},\n ): void => {\n if (!metaKeys.includes(name))\n head.push(['meta', { name, content, ...more }])\n }\n\n if (favicon) setLink('icon', favicon)\n\n if (manifest?.icons) {\n const { icons } = manifest\n\n if (icons.length > 0) {\n fallBackIcon = icons[0].src\n\n manifest.icons.forEach((icon) => {\n if (icon.type)\n setLink('icon', icon.src, { type: icon.type, sizes: icon.sizes })\n else setLink('icon', icon.src, { sizes: icon.sizes })\n })\n }\n }\n\n setLink('manifest', `${base}manifest.webmanifest`, {\n crossorigin: 'use-credentials',\n })\n setMeta('theme-color', themeColor || '#46bd87')\n\n if (isPlainObject(apple) && (apple.icon || fallBackIcon)) {\n setLink('apple-touch-icon', apple.icon || fallBackIcon)\n setMeta('apple-mobile-web-app-capable', 'yes')\n setMeta(\n 'apple-mobile-web-app-status-bar-style',\n apple.statusBarColor || 'black',\n )\n if (apple.maskIcon)\n setLink('mask-icon', apple.maskIcon, {\n color: themeColor || '#46bd87',\n })\n } else if (apple !== false && fallBackIcon) {\n setLink('apple-touch-icon', fallBackIcon)\n setMeta('apple-mobile-web-app-capable', 'yes')\n setMeta('apple-mobile-web-app-status-bar-style', 'black')\n }\n\n if (isPlainObject(msTile) && (msTile.image || fallBackIcon)) {\n setMeta('msapplication-TileImage', msTile.image || fallBackIcon)\n setMeta('msapplication-TileColor', msTile.color || themeColor || '#46bd87')\n } else if (msTile !== false && fallBackIcon) {\n setMeta('msapplication-TileImage', fallBackIcon)\n setMeta('msapplication-TileColor', themeColor || '#46bd87')\n }\n\n return head\n}\n","import { getLocaleConfig, getRealPath } from '@vuepress/helper'\nimport type { App } from 'vuepress/core'\nimport { getDirname, path } from 'vuepress/utils'\nimport { pwaLocales } from './locales.js'\nimport { PLUGIN_NAME } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\n\nconst __dirname = getDirname(import.meta.url)\n\nexport const prepareClientConfigFile = (\n app: App,\n options: PwaPluginOptions,\n): Promise<string> => {\n let configImport = ''\n const rootComponents: string[] = []\n\n if (options.showInstall) {\n configImport += `\\\nimport { PwaInstall as _PwaInstall } from \"${path.join(__dirname, '../client/components/PwaInstall.js')}\";\n`\n\n rootComponents.push('PwaInstall')\n }\n\n if (options.update === 'hint') {\n configImport += `\\\nimport { PwaFoundPopup as _PwaFoundPopup } from \"${\n options.foundComponent ||\n path.join(__dirname, '../client/components/PwaFoundPopup.js')\n }\";\n`\n\n rootComponents.push('PwaFoundPopup')\n } else if (options.update !== 'disable' && options.update !== 'force') {\n configImport += `\\\nimport { PwaReadyPopup as _PwaReadyPopup } from \"${\n options.readyComponent ||\n path.join(__dirname, '../client/components/PwaReadyPopup.js')\n }\";\n`\n\n rootComponents.push('PwaReadyPopup')\n }\n\n return app.writeTemp(\n `pwa/config.js`,\n `\\\nimport { h } from \"vue\";\nimport { defineClientConfig } from \"vuepress/client\";\nimport { setupPwa, setupViewPoint } from \"${path.join(__dirname, '../client/composables/index.js')}\";\n${configImport}\nimport \"${getRealPath('@vuepress/plugin-pwa/styles/vars.css', import.meta.url)}\";\n\nconst locales = ${JSON.stringify(\n getLocaleConfig({\n app,\n name: PLUGIN_NAME,\n default: pwaLocales,\n config: options.locales,\n }),\n )};\n\nexport default defineClientConfig({\n setup: () => {\n setupPwa(${JSON.stringify(options.serviceWorkerFilename ?? 'service-worker.js')}, ${options.update === 'force'});\n setupViewPoint();\n },\n rootComponents: [\n${rootComponents.map((item) => ` () => h(_${item}, { locales }),`).join('\\n')}\n ],\n});\n`,\n )\n}\n","import {\n addViteOptimizeDepsExclude,\n addViteSsrNoExternal,\n customizeDevServer,\n} from '@vuepress/helper'\nimport type { PluginFunction } from 'vuepress/core'\nimport { generateManifest } from './generateManifest.js'\nimport { generateServiceWorker } from './generateServiceWorker.js'\nimport { getManifest } from './getManifest.js'\nimport { appendBase } from './helper.js'\nimport { injectLinksToHead } from './injectLinksToHead.js'\nimport { PLUGIN_NAME, logger } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\nimport { prepareClientConfigFile } from './prepareClientConfigFile.js'\n\nexport const pwaPlugin =\n (options: PwaPluginOptions = {}): PluginFunction =>\n (app) => {\n if (app.env.isDebug) logger.info('Options:', options)\n\n const { base, shouldPrefetch = true } = app.options\n\n if (options.appendBase) appendBase(base, options)\n\n if (shouldPrefetch === true)\n logger.warn(\n 'The plugin will register service worker to handle assets, so we recommend you to set \"shouldPrefetch: false\" in VuePress config file.',\n )\n\n app.options.head = injectLinksToHead(options, base, app.options.head)\n\n return {\n name: PLUGIN_NAME,\n\n extendsBundlerOptions: (bundlerOptions: unknown): void => {\n addViteOptimizeDepsExclude(bundlerOptions, app, [\n 'mitt',\n 'register-service-worker',\n ])\n addViteSsrNoExternal(bundlerOptions, app, '@vuepress/helper')\n\n customizeDevServer(bundlerOptions, app, {\n path: '/manifest.webmanifest',\n response: async (_, response) => {\n response.setHeader('Content-Type', 'application/manifest+json')\n\n return JSON.stringify(await getManifest(app, options))\n },\n errMsg: 'Unexpected manifest generation error',\n })\n },\n\n onGenerated: async (): Promise<void> => {\n await generateManifest(app, options)\n await generateServiceWorker(app, options)\n },\n\n clientConfigFile: () => prepareClientConfigFile(app, options),\n }\n }\n"],"names":["pwaLocales","getManifest","app","options","siteData","base","userManifestPath","userManifestJSONPath","manifestFileContent","fs","getRootLang","PLUGIN_NAME","logger","Logger","generateManifest","succeed","manifest","manifestPath","colors","path","imageExtensions","cacheExtensions","imageFilter","maxSize","manifestEntries","warnings","entry","url","size","ext","endsWith","generateServiceWorker","globPatterns","generateSW","count","warning","appendBaseToLink","link","isLinkAbsolute","appendBaseToManifest","icon","shortcut","screenshot","appendBase","injectLinksToHead","favicon","themeColor","apple","msTile","head","metaKeys","linkKeys","item","fallBackIcon","setLink","rel","href","more","setMeta","name","content","icons","isPlainObject","__dirname","getDirname","prepareClientConfigFile","configImport","rootComponents","getRealPath","getLocaleConfig","pwaPlugin","shouldPrefetch","bundlerOptions","addViteOptimizeDepsExclude","addViteSsrNoExternal","customizeDevServer","_","response"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/node/locales.ts","../../src/node/getManifest.ts","../../src/node/logger.ts","../../src/node/generateManifest.ts","../../src/node/generateServiceWorker.ts","../../src/node/helper.ts","../../src/node/injectLinksToHead.ts","../../src/node/prepareClientConfigFile.ts","../../src/node/pwaPlugin.ts"],"sourcesContent":["import type { PwaPluginLocaleConfig } from '../shared/index.js'\n\n/** Multi language config for pwa popup */\nexport const pwaLocales: PwaPluginLocaleConfig = {\n '/en/': {\n install: 'Install',\n iOSInstall: \"Tap the share button and then 'Add to Home Screen'\",\n cancel: 'Cancel',\n close: 'Close',\n prevImage: 'Previous Image',\n nextImage: 'Next Image',\n desc: 'Description',\n feature: 'Key Features',\n explain:\n 'This app can be installed on your PC or mobile device. This will allow this web app to look and behave like any other installed app. You will find it in your app lists and be able to pin it to your home screen, start menus or task bars. This installed web app will also be able to safely interact with other apps and your operating system. ',\n hint: 'New content found.',\n update: 'New content is available.',\n },\n\n '/zh/': {\n install: '安装',\n iOSInstall: '点击分享按钮然后点击“添加到主屏幕”',\n cancel: '取消',\n close: '关闭',\n prevImage: '上一张图片',\n nextImage: '下一张图片',\n desc: '详情',\n feature: '主要特色',\n explain:\n '该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。',\n hint: '发现新内容可用',\n update: '新内容已就绪',\n },\n\n '/zh-tw/': {\n install: '安裝',\n iOSInstall: '點擊分享按鈕然後點擊“添加到主畫面”',\n cancel: '取消',\n close: '關閉',\n prevImage: '上一張圖片',\n nextImage: '下一張圖片',\n desc: '詳情',\n feature: '主要特色',\n explain:\n '該應用可以安裝在你的 PC 或行動裝置上。這將使該 Web 應用程式外觀和行為與其他應用程式相同。它將在出現在應用程式列表中,並可以固定到主畫面,開始菜單或任務欄。此 Web 應用程式還將能夠與其他應用程式和你的操作系統安全地進行交互。',\n hint: '發現新内容可用',\n update: '新内容已就绪',\n },\n\n '/de/': {\n install: 'Installieren',\n iOSInstall: \"Drucke den Share-Button und dann 'zu Homescreen hinzufügen'\",\n cancel: 'Abbrechen',\n close: 'Schließen',\n prevImage: 'Vorheriges Bild',\n nextImage: 'Nächstes Bild',\n desc: 'Berschreibung',\n feature: 'Funktionen',\n explain:\n 'Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.',\n hint: 'Neuer Inhalt gefunden.',\n update: 'Neue Inhalte sind verfügbar.',\n },\n\n '/de-at/': {\n install: 'Installieren',\n iOSInstall: \"Drucke den Share-Button und dan 'zu Homescreen hinzufügen'\",\n cancel: 'Abbrechen',\n close: 'Schließen',\n prevImage: 'Vorheriges Bild',\n nextImage: 'Nächstes Bild',\n desc: 'Berschreibung',\n feature: 'Features',\n explain:\n 'Diese App kann auf Ihrem PC oder Mobilgerät installiert werden. Dadurch sieht diese Web-App aus und verhält sich wie jede andere installierte App. Sie finden sie in Ihren App-Listen und können sie an den Startbildschirm, die Startmenüs oder die Taskleisten anheften. Diese installierte Web-App kann auch sicher mit anderen Apps und Ihrem Betriebssystem interagieren.',\n hint: 'Neue Inhalte sind verfügbar.',\n update: 'Neue Inhalte sind verfügbar.',\n },\n\n '/vi/': {\n install: 'Tải về',\n iOSInstall: \"Nhấn vào nút chia sẻ và sau đó 'Thêm vào Màn hình chính'\",\n cancel: 'Huỷ bỏ',\n close: 'Đóng',\n prevImage: 'Hình ảnh trước đó',\n nextImage: 'Hình ảnh tiếp theo',\n desc: 'Sự miêu tả',\n feature: 'Các tính năng chính',\n explain:\n 'Ứng dụng này có thể được cài đặt trên PC hoặc thiết bị di động của bạn. Điều này sẽ cho phép ứng dụng web này trông và hoạt động giống như bất kỳ ứng dụng đã cài đặt nào khác. Bạn sẽ tìm thấy nó trong danh sách ứng dụng của mình và có thể ghim nó vào màn hình chính, menu bắt đầu hoặc thanh tác vụ. Ứng dụng web đã cài đặt này cũng sẽ có thể tương tác an toàn với các ứng dụng khác và hệ điều hành của bạn.',\n hint: 'Nội dung mới được tìm thấy',\n update: 'Đã có nội dung mới',\n },\n\n '/uk/': {\n install: 'Встановити',\n iOSInstall:\n 'Торкніться кнопки «Поділитися», а потім «Додати на головний екран»',\n cancel: 'Скасувати',\n close: 'Закрити',\n prevImage: 'Попереднє зображення',\n nextImage: 'Наступне зображення',\n desc: 'Опис',\n feature: 'Основні характеристики',\n explain:\n 'Цю програму можна встановити на ПК або мобільний пристрій. Це дозволить цій веб-програмі виглядати та вести себе як будь-яка інша встановлена програма. Ви знайдете її у списках додатків і зможете закріпити на головному екрані, в меню «Пуск» або на панелі завдань. Ця встановлена веб-програма також зможе безпечно взаємодіяти з іншими програмами та вашою операційною системою. ',\n hint: 'Знайдено новий вміст',\n update: 'Доступний новий контент.',\n },\n\n '/ru/': {\n install: 'Установить',\n iOSInstall:\n 'Нажмите кнопку «Поделиться», а затем «Добавить на главный экран»',\n cancel: 'Отменить',\n close: 'Закрыть',\n prevImage: 'Предыдущее изображение',\n nextImage: 'Следующее изображение',\n desc: 'Описание',\n feature: 'Основные функции',\n explain:\n 'Это приложение может быть установлено на вашем компьютере или мобильном устройстве. Это позволит веб-приложению выглядеть и вести себя как любое другое установленное приложение. Вы найдете его в списках приложений и сможете закрепить его на домашнем экране, в меню пуск или на панели задач. Установленное веб-приложение также сможет безопасно взаимодействовать с другими приложениями и операционной системой. ',\n hint: 'Найден новый контент',\n update: 'Доступен новый контент.',\n },\n\n '/br/': {\n install: 'Instalar',\n iOSInstall: \"Toque no botão de compartilhar e depois 'Adicionar à Home'\",\n cancel: 'Cancelar',\n close: 'Fechar',\n prevImage: 'Imagem anterior',\n nextImage: 'Próxima imagem',\n desc: 'Descrição',\n feature: 'Características Chave',\n explain:\n 'Esta aplicação web pode ser instalada no seu PC ou dispositivo móvel. Isso fará com que ela se pareça e se comporte como qualquer outra aplicação. Você a encontrará na lista de apps e poderá adicionar seu ícone à tela de entrada, menus ou barras de tarefa. Uma vez instalada, esta aplicação web também poderá interagir com outras aplicações ou com o próprio sistema operacional. ',\n hint: 'Novo conteúdo encontrado',\n update: 'Novo conteúdo está disponível.',\n },\n\n '/pl/': {\n install: 'Zainstaluj',\n iOSInstall:\n 'Stuknij przycisk udostępniania, a następnie „Dodaj do ekranu głównego”',\n cancel: 'Anuluj',\n close: 'Zamknij',\n prevImage: 'Poprzedni obrazek',\n nextImage: 'Następny obrazek',\n desc: 'Opis',\n feature: 'Kluczowe cechy',\n explain:\n 'Tę aplikację można zainstalować na komputerze lub urządzeniu mobilnym. Dzięki temu ta aplikacja internetowa będzie wyglądać i zachowywać się jak każda inna zainstalowana aplikacja. Znajdziesz ją na listach aplikacji i będziesz mógł przypiąć go do ekranu głównego, menu startowego lub pasków zadań. Ta zainstalowana aplikacja internetowa będzie również mogła bezpiecznie komunikować się z innymi aplikacjami i systemem operacyjnym.',\n hint: 'Znaleziono nową zawartość.',\n update: 'Nowa zawartość jest dostępna.',\n },\n\n '/sk/': {\n install: 'Insštalácia',\n iOSInstall:\n \"Klikni na tlačidlo zdielania a potom 'Daj na domovskú obrazovku'\",\n cancel: 'Zrušiť',\n close: 'Zavrieť',\n prevImage: 'Prodošlí obrázok',\n nextImage: 'Ďalší obrázok',\n desc: 'Poznámka',\n feature: 'Kľúčové vlastnosti',\n explain:\n 'Túto aplikáciu je možné nainštalovať na počítač alebo mobil. Toto umožný sa správať aplikácii ako každej inej nainštalovanej aplikácii. Nájdeš ju vo svojom liste aplikácii a budeš môcť ju pripnúť na domovskú stránku, štartovacieho menu alebo do panelu úloh. Táto nainštalovaná webová aplikácia umžní tiež bezpečne komunikovať s ostatnými nainštalovanými aplikáciami a operačným systémom. ',\n hint: 'Nový obsah bol nájdený.',\n update: 'Nový obsah je dostupný.',\n },\n\n '/fr/': {\n install: 'Installer',\n iOSInstall:\n \"Appuyez sur le bouton partager puis 'Ajouter à l'écran d'accueil'\",\n cancel: 'Annuler',\n close: 'Fermer',\n prevImage: 'Image précédente',\n nextImage: 'Image suivante',\n desc: 'Description',\n feature: 'Composants clés',\n explain:\n \"Cette app peut être installée sur PC ou smartphone. Cela permettra de rendre cette page web comme n'importe quelle autre application. Vous la trouverez dans votre liste d'application et serez capable de la pin sur votre écran principal et divers menus. L'application web installée sera capable d'interagir avec les autres applications et le système d'exploitation.\",\n hint: 'New content found.',\n update: 'New content is available.',\n },\n\n '/es/': {\n install: 'Instalar',\n iOSInstall:\n \"Toque el botón compartir y luego 'Agregar a la pantalla de inicio'\",\n cancel: 'Cancelar',\n close: 'Cerrar',\n prevImage: 'Imagen anterior',\n nextImage: 'Imagen siguiente',\n desc: 'Descripción',\n feature: 'Características clave',\n explain:\n 'Esta aplicación se puede instalar en su PC o dispositivo móvil. Esto permitirá que esta aplicación web se vea y se comporte como cualquier otra aplicación instalada. Lo encontrará en su lista de aplicaciones y podrá fijarlo a su pantalla de inicio, menús de inicio o barras de tareas. Esta aplicación web instalada también podrá interactuar de manera segura con otras aplicaciones y su sistema operativo.',\n hint: 'Nuevo contenido encontrado.',\n update: 'Hay nuevo contenido disponible.',\n },\n\n '/ja/': {\n install: 'インストール',\n iOSInstall:\n '共有ボタンをタップし、「ホームスクリーンに追加」をタップします',\n cancel: 'キャンセル',\n close: '閉じる',\n prevImage: '前の画像',\n nextImage: '次の画像',\n desc: '詳細',\n feature: '主な特徴',\n explain:\n 'このアプリは、PCまたはモバイルデバイスにインストールすることができます。 これにより、このウェブアプリは、インストールされている他のアプリと同様に表示され、動作するようになります。 アプリ一覧で見つけることができ、ホーム画面、スタートメニュー、タスクバーに固定することができます。 このインストールされたウェブアプリケーションは、他のアプリケーションやオペレーティングシステムと安全にやり取りすることもできます。',\n hint: '新しいコンテンツが見つかりました。',\n update: '新しいコンテンツが登場しました。',\n },\n\n '/tr/': {\n install: 'Yükle',\n iOSInstall:\n \"Paylaş düğmesine ve ardından 'Ana Ekrana Ekle' düğmesine basın\",\n cancel: 'İptal',\n close: 'Kapat',\n prevImage: 'Önceki Resim',\n nextImage: 'Sonraki Resim',\n desc: 'Tanım',\n feature: 'Ana Özellikler',\n explain:\n \"Bu uygulama PC'nize veya mobil cihazınıza yüklenebilir. Yüklenmesi bu web uygulamasının diğer yüklü uygulamalar gibi görünmesini ve davranmasını sağlar. Yüklenen web uygulamasını uygulama listenizde bulabilir ve ana ekranınıza, menülere veya görev çubuklarına sabitleyebilirsiniz. Aynı zamanda yüklenen web uygulaması, diğer uygulamalar ve işletim sisteminizle güvenli bir şekilde etkileşime girebilecektir.\",\n hint: 'Yeni içerik bulundu.',\n update: 'Yeni içerik mevcut.',\n },\n\n '/ko/': {\n install: '설치',\n iOSInstall: \"공유 버튼을 누르고 '홈 화면에 추가'를 누르세요\",\n cancel: '취소',\n close: '닫기',\n prevImage: '이전 이미지',\n nextImage: '다음 이미지',\n desc: '설명',\n feature: '주요 기능',\n explain:\n '이 앱은 PC 또는 모바일 장치에 설치할 수 있습니다. 이렇게 하면 이 웹 앱은 다른 설치된 앱과 마찬가지로 표시되고 작동합니다. 앱 목록에서 찾을 수 있으며 홈 화면, 시작 메뉴, 작업 표시줄에 고정할 수 있습니다. 설치된 웹 앱은 다른 앱과 안전하게 상호 작용할 수 있습니다.',\n hint: '새로운 콘텐츠를 찾았습니다.',\n update: '새로운 콘텐츠가 있습니다.',\n },\n\n '/fi/': {\n install: 'Asenna',\n iOSInstall: \"Paina Jaa-painiketta ja sitten 'Lisää kotiin'-painiketta\",\n cancel: 'Peruuta',\n close: 'Sulje',\n prevImage: 'Edellinen kuva',\n nextImage: 'Seuraava kuva',\n desc: 'Kuvaus',\n feature: 'Avainominaisuudet',\n explain:\n 'Tämä sovellus on asennettavissa tietokoneelle tai mobiililaitteelle. Tämä mahdollistaa sovelluksen toiminnan tietokoneohjelmana. Löydät sen sovelluslistasta ja voit kiinnittää sen työpöydälle, kotinäytölle, tehtäväpalkkiin tai muulle listalle. Asennettu sovellus voi turvallisesti olla vuorovaikutuksessa muiden sovellusten ja käyttöjärjestelmäsi kanssa.',\n hint: 'Uutta sisältöä.',\n update: 'Uutta sisältöä on saatavilla.',\n },\n\n '/hu/': {\n install: 'Telepítés',\n iOSInstall:\n \"Nyomd meg a megosztás gombot, majd a 'Hozzáadás a kezdőképernyőhöz' opciót\",\n cancel: 'Mégse',\n close: 'Bezárás',\n prevImage: 'Előző kép',\n nextImage: 'Következő kép',\n desc: 'Leírás',\n feature: 'Főbb jellemzők',\n explain:\n 'Ez az alkalmazás telepíthető PC-re vagy mobil eszközre. Ez lehetővé teszi, hogy ez a webalkalmazás úgy nézzen ki és viselkedjen, mint bármely más telepített alkalmazás. Az alkalmazáslistában találod majd, és hozzáadhatod a kezdőképernyőhöz, indító menühöz vagy a feladatok sávjához. Az telepített webalkalmazás biztonságosan interakcióba léphet más alkalmazásokkal és az operációs rendszerrel.',\n hint: 'Új tartalom érhető el.',\n update: 'Új tartalom érhető el.',\n },\n\n '/id/': {\n install: 'Install',\n iOSInstall: \"Ketuk tombol bagikan, lalu 'Tambahkan ke Layar Utama'\",\n cancel: 'Batal',\n close: 'Tutup',\n prevImage: 'Gambar sebelumnya',\n nextImage: 'Gambar selanjutnya',\n desc: 'Keterangan',\n feature: 'Fitur',\n explain:\n 'Aplikasi ini dapat diinstal di PC atau perangkat seluler Anda. Ini akan memungkinkan aplikasi web ini terlihat seperti aplikasi terpasang lainnya. Anda bisa menemukannya di daftar aplikasi dan dapat menyematkannya ke layar beranda, menu start, atau menu ke taskbar. Aplikasi web yang terinstal ini juga dapat berinteraksi dengan aplikasi lain dan dengan sistem operasi yang Anda gunakan. ',\n hint: 'Konten baru ditemukan.',\n update: 'Konten baru telah tersedia.',\n },\n\n '/nl/': {\n install: 'Installeren',\n iOSInstall: \"Druk op de share button en dan op 'Add to Home Screen'\",\n cancel: 'Annuleren',\n close: 'Sluiten',\n prevImage: 'Vorige Foto',\n nextImage: 'Volgende Foto',\n desc: 'Beschrijving',\n feature: 'Belangrijkste mogelijkheden',\n explain:\n 'Deze app kan op uw PC of mobiel toestel geïnstalleerd worden. Dit laat toe om deze webapp er uit te laten alsof het een normale app is. Je kan het terugvinden in jouw applijsten en kan het op je homescreen, start menu of taakbalk vastzetten. Deze geïnstalleerde webapp zal ook veilig samenwerken met andere apps en uw besturingssysteem. ',\n hint: 'Nieuwe inhoud gevonden.',\n update: 'Nieuwe inhoud is beschikbaar.',\n },\n}\n","import { getRootLang } from '@vuepress/helper'\nimport type { App } from 'vuepress/core'\nimport { fs } from 'vuepress/utils'\nimport type { AppManifest } from '../shared/index.js'\nimport type { PwaPluginOptions } from './options.js'\n\nexport const getManifest = async (\n app: App,\n options: PwaPluginOptions,\n): Promise<AppManifest> => {\n const { siteData } = app\n const { base } = app.options\n\n const userManifestPath = app.dir.source(\n '.vuepress/public/manifest.webmanifest',\n )\n const userManifestJSONPath = app.dir.source('.vuepress/public/manifest.json')\n\n const manifestFileContent = JSON.parse(\n fs.existsSync(userManifestPath)\n ? await fs.readFile(userManifestPath, 'utf8')\n : fs.existsSync(userManifestJSONPath)\n ? await fs.readFile(userManifestJSONPath, 'utf8')\n : '{}',\n ) as AppManifest\n\n const manifest: AppManifest = {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n name: siteData.title || siteData.locales['/']?.title || 'Site',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n short_name: siteData.title || siteData.locales['/']?.title || 'Site',\n description:\n siteData.description ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n siteData.locales['/']?.description ||\n 'A site built with vuepress',\n lang: getRootLang(app),\n start_url: base,\n scope: base,\n\n display: 'standalone',\n theme_color: options.themeColor || '#46bd87',\n background_color: '#ffffff',\n orientation: 'portrait-primary',\n prefer_related_applications: false,\n\n ...manifestFileContent,\n ...options.manifest,\n }\n\n return manifest\n}\n","import { Logger } from '@vuepress/helper'\n\nexport const PLUGIN_NAME = '@vuepress/plugin-pwa'\n\nexport const logger = new Logger(PLUGIN_NAME)\n","import type { App } from 'vuepress/core'\nimport { colors, fs, path } from 'vuepress/utils'\nimport { getManifest } from './getManifest.js'\nimport { logger } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\n\nexport const generateManifest = async (\n app: App,\n options: PwaPluginOptions,\n): Promise<void> => {\n const { succeed } = logger.load('Generating manifest.webmanifest')\n\n const manifest = await getManifest(app, options)\n const manifestPath = app.dir.dest('manifest.webmanifest')\n\n await fs.writeJSON(manifestPath, manifest, {\n flag: 'w',\n })\n\n succeed(\n `Manifest generated and saved to ${colors.cyan(\n path.relative(process.cwd(), manifestPath),\n )}!`,\n )\n}\n","import { endsWith } from '@vuepress/helper'\nimport type { App } from 'vuepress/core'\nimport { colors } from 'vuepress/utils'\nimport type {\n ManifestEntry,\n ManifestTransform,\n ManifestTransformResult,\n} from 'workbox-build'\nimport { generateSW } from 'workbox-build'\nimport { logger } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\n\nconst imageExtensions = ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'gif']\nconst cacheExtensions = [\n 'js',\n 'css',\n 'svg',\n 'woff',\n 'woff2',\n 'eot',\n 'ttf',\n 'otf',\n]\n\nconst imageFilter =\n (maxSize = 1024): ManifestTransform =>\n (\n manifestEntries: (ManifestEntry & { size: number })[],\n ): ManifestTransformResult => {\n const warnings: string[] = []\n const manifest: (ManifestEntry & { size: number })[] = []\n\n for (const entry of manifestEntries) {\n const { url, size } = entry\n\n if (imageExtensions.some((ext) => endsWith(url, `.${ext}`)))\n if (size > maxSize * 1024)\n warnings.push(`Skipped ${url}, as it's ${Math.ceil(size / 1024)} KB.`)\n else manifest.push(entry)\n else manifest.push(entry)\n }\n\n return { warnings, manifest }\n }\n\nexport const generateServiceWorker = async (\n app: App,\n options: PwaPluginOptions,\n): Promise<void> => {\n const { succeed } = logger.load('Generating service worker')\n\n const globPatterns = [`**/*.{${cacheExtensions.join(',')}}`]\n\n if (options.cacheHTML) globPatterns.push('**/*.html')\n else globPatterns.push('./index.html', './404.html')\n\n if (options.cacheImage)\n globPatterns.push(`**/*.{${imageExtensions.join(',')}}`)\n\n await generateSW({\n dontCacheBustURLsMatching: new RegExp(\n `\\\\.[0-9a-f]{8}\\\\.(${['html', ...cacheExtensions, ...imageExtensions].join('|')})$`,\n ),\n globPatterns,\n cleanupOutdatedCaches: true,\n clientsClaim: true,\n maximumFileSizeToCacheInBytes: (options.maxSize ?? 2048) * 1024,\n manifestTransforms: [imageFilter(options.maxImageSize)],\n mode: app.env.isDebug ? 'development' : 'production',\n sourcemap: app.env.isDebug,\n ...options.generateSWConfig,\n // should not be override by user config\n globDirectory: app.dir.dest(),\n swDest: app.dir.dest(options.serviceWorkerFilename ?? 'service-worker.js'),\n }).then(({ count, size, warnings }) => {\n succeed()\n\n logger.info(\n `Precache ${colors.cyan(`${count} files`)}, totaling ${colors.cyan(\n `${(size / 1024 / 1024).toFixed(2)} Mb.`,\n )}.`,\n )\n\n if (warnings.length)\n logger.warn(`\\n${warnings.map((warning) => ` · ${warning}`).join('\\n')}`)\n\n if (size > 104857600)\n logger.error(\n `Cache Size is larger than 100MB, so that it can not be registered on all browsers.\\n${colors.blue(\n 'Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\\n',\n )}`,\n )\n else if (size > 52428800)\n logger.warn(\n `\\nCache Size is larger than 50MB, which will not be registered on Safari.\\n${colors.blue(\n 'Please consider disable `cacheHTML` and `cacheImage`, or set `maxSize` and `maxImageSize` option.\\n',\n )}`,\n )\n })\n}\n","import { isLinkAbsolute } from '@vuepress/helper'\nimport type { AppManifest } from '../shared/index.js'\nimport type { PwaPluginOptions } from './options.js'\n\nconst appendBaseToLink = (base: string, link: string): string =>\n isLinkAbsolute(link) ? link.replace(/^\\//, base) : link\n\nexport const appendBaseToManifest = (\n base: string,\n manifest: AppManifest,\n): AppManifest => {\n if (manifest.icons)\n manifest.icons = manifest.icons.map((icon) => ({\n ...icon,\n src: appendBaseToLink(base, icon.src),\n }))\n\n if (manifest.shortcuts)\n manifest.shortcuts = manifest.shortcuts.map((shortcut) => ({\n ...shortcut,\n icons:\n shortcut.icons?.map((icon) => ({\n ...icon,\n src: appendBaseToLink(base, icon.src),\n })) ?? [],\n url: appendBaseToLink(base, shortcut.url),\n }))\n\n if (manifest.screenshots)\n manifest.screenshots = manifest.screenshots.map((screenshot) => ({\n ...screenshot,\n src: appendBaseToLink(base, screenshot.src),\n }))\n\n return manifest\n}\n\nexport const appendBase = (base: string, options: PwaPluginOptions): void => {\n if (options.favicon) options.favicon = appendBaseToLink(base, options.favicon)\n\n if (options.apple) {\n if (options.apple.icon)\n options.apple.icon = appendBaseToLink(base, options.apple.icon)\n\n if (options.apple.maskIcon)\n options.apple.maskIcon = appendBaseToLink(base, options.apple.maskIcon)\n }\n\n if (options.msTile && options.msTile.image)\n options.msTile.image = appendBaseToLink(base, options.msTile.image)\n\n if (options.manifest)\n options.manifest = appendBaseToManifest(base, options.manifest)\n}\n","import type { HeadConfig } from 'vuepress/core'\nimport { isPlainObject } from 'vuepress/shared'\nimport type { PwaPluginOptions } from './options.js'\n\nexport const injectLinksToHead = (\n {\n favicon,\n manifest,\n themeColor = '#46bd87',\n apple,\n msTile,\n }: PwaPluginOptions,\n base = '/',\n head: HeadConfig[] = [],\n): HeadConfig[] => {\n const metaKeys: string[] = []\n const linkKeys: string[] = []\n\n // Generate Hash for Head\n head.forEach((item) => {\n if (item[0] === 'meta') metaKeys.push(item[1].name as string)\n else if (item[0] === 'link') linkKeys.push(item[1].rel as string)\n })\n\n let fallBackIcon = ''\n const setLink = (\n rel: string,\n href: string,\n more: Record<string, string> = {},\n ): void => {\n if (!linkKeys.includes(rel)) head.push(['link', { rel, href, ...more }])\n }\n\n const setMeta = (\n name: string,\n content: string,\n more: Record<string, string> = {},\n ): void => {\n if (!metaKeys.includes(name))\n head.push(['meta', { name, content, ...more }])\n }\n\n if (favicon) setLink('icon', favicon)\n\n if (manifest?.icons) {\n const { icons } = manifest\n\n if (icons.length > 0) {\n fallBackIcon = icons[0].src\n\n manifest.icons.forEach((icon) => {\n if (icon.type)\n setLink('icon', icon.src, { type: icon.type, sizes: icon.sizes })\n else setLink('icon', icon.src, { sizes: icon.sizes })\n })\n }\n }\n\n setLink('manifest', `${base}manifest.webmanifest`, {\n crossorigin: 'use-credentials',\n })\n setMeta('theme-color', themeColor || '#46bd87')\n\n if (isPlainObject(apple) && (apple.icon || fallBackIcon)) {\n setLink('apple-touch-icon', apple.icon || fallBackIcon)\n setMeta('apple-mobile-web-app-capable', 'yes')\n setMeta(\n 'apple-mobile-web-app-status-bar-style',\n apple.statusBarColor || 'black',\n )\n if (apple.maskIcon)\n setLink('mask-icon', apple.maskIcon, {\n color: themeColor || '#46bd87',\n })\n } else if (apple !== false && fallBackIcon) {\n setLink('apple-touch-icon', fallBackIcon)\n setMeta('apple-mobile-web-app-capable', 'yes')\n setMeta('apple-mobile-web-app-status-bar-style', 'black')\n }\n\n if (isPlainObject(msTile) && (msTile.image || fallBackIcon)) {\n setMeta('msapplication-TileImage', msTile.image || fallBackIcon)\n setMeta('msapplication-TileColor', msTile.color || themeColor || '#46bd87')\n } else if (msTile !== false && fallBackIcon) {\n setMeta('msapplication-TileImage', fallBackIcon)\n setMeta('msapplication-TileColor', themeColor || '#46bd87')\n }\n\n return head\n}\n","import { getLocaleConfig, getModulePath } from '@vuepress/helper'\nimport type { App } from 'vuepress/core'\nimport { getDirname, path } from 'vuepress/utils'\nimport { pwaLocales } from './locales.js'\nimport { PLUGIN_NAME } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\n\nconst __dirname = import.meta.dirname || getDirname(import.meta.url)\n\nexport const prepareClientConfigFile = (\n app: App,\n options: PwaPluginOptions,\n): Promise<string> => {\n let configImport = ''\n const rootComponents: string[] = []\n\n if (options.showInstall) {\n configImport += `\\\nimport { PwaInstall as _PwaInstall } from \"${path.join(__dirname, '../client/components/PwaInstall.js')}\";\n`\n\n rootComponents.push('PwaInstall')\n }\n\n if (options.update === 'hint') {\n configImport += `\\\nimport { PwaFoundPopup as _PwaFoundPopup } from \"${\n options.foundComponent ||\n path.join(__dirname, '../client/components/PwaFoundPopup.js')\n }\";\n`\n\n rootComponents.push('PwaFoundPopup')\n } else if (options.update !== 'disable' && options.update !== 'force') {\n configImport += `\\\nimport { PwaReadyPopup as _PwaReadyPopup } from \"${\n options.readyComponent ||\n path.join(__dirname, '../client/components/PwaReadyPopup.js')\n }\";\n`\n\n rootComponents.push('PwaReadyPopup')\n }\n\n return app.writeTemp(\n `pwa/config.js`,\n `\\\nimport { h } from \"vue\";\nimport { defineClientConfig } from \"vuepress/client\";\nimport { setupPwa, setupViewPoint } from \"${path.join(__dirname, '../client/composables/index.js')}\";\n${configImport}\nimport \"${getModulePath('@vuepress/plugin-pwa/styles/vars.css', import.meta)}\";\n\nconst locales = ${JSON.stringify(\n getLocaleConfig({\n app,\n name: PLUGIN_NAME,\n default: pwaLocales,\n config: options.locales,\n }),\n )};\n\nexport default defineClientConfig({\n setup: () => {\n setupPwa(${JSON.stringify(options.serviceWorkerFilename ?? 'service-worker.js')}, ${options.update === 'force'});\n setupViewPoint();\n },\n rootComponents: [\n${rootComponents.map((item) => ` () => h(_${item}, { locales }),`).join('\\n')}\n ],\n});\n`,\n )\n}\n","import {\n addViteOptimizeDepsExclude,\n addViteSsrNoExternal,\n customizeDevServer,\n} from '@vuepress/helper'\nimport type { PluginFunction } from 'vuepress/core'\nimport { generateManifest } from './generateManifest.js'\nimport { generateServiceWorker } from './generateServiceWorker.js'\nimport { getManifest } from './getManifest.js'\nimport { appendBase } from './helper.js'\nimport { injectLinksToHead } from './injectLinksToHead.js'\nimport { PLUGIN_NAME, logger } from './logger.js'\nimport type { PwaPluginOptions } from './options.js'\nimport { prepareClientConfigFile } from './prepareClientConfigFile.js'\n\nexport const pwaPlugin =\n (options: PwaPluginOptions = {}): PluginFunction =>\n (app) => {\n if (app.env.isDebug) logger.info('Options:', options)\n\n const { base, shouldPrefetch = true } = app.options\n\n if (options.appendBase) appendBase(base, options)\n\n if (shouldPrefetch === true)\n logger.warn(\n 'The plugin will register service worker to handle assets, so we recommend you to set \"shouldPrefetch: false\" in VuePress config file.',\n )\n\n app.options.head = injectLinksToHead(options, base, app.options.head)\n\n return {\n name: PLUGIN_NAME,\n\n extendsBundlerOptions: (bundlerOptions: unknown): void => {\n addViteOptimizeDepsExclude(bundlerOptions, app, [\n 'mitt',\n 'register-service-worker',\n ])\n addViteSsrNoExternal(bundlerOptions, app, '@vuepress/helper')\n\n customizeDevServer(bundlerOptions, app, {\n path: '/manifest.webmanifest',\n response: async (_, response) => {\n response.setHeader('Content-Type', 'application/manifest+json')\n\n return JSON.stringify(await getManifest(app, options))\n },\n errMsg: 'Unexpected manifest generation error',\n })\n },\n\n onGenerated: async (): Promise<void> => {\n await generateManifest(app, options)\n await generateServiceWorker(app, options)\n },\n\n clientConfigFile: () => prepareClientConfigFile(app, options),\n }\n }\n"],"names":["pwaLocales","getManifest","app","options","siteData","base","userManifestPath","userManifestJSONPath","manifestFileContent","fs","getRootLang","PLUGIN_NAME","logger","Logger","generateManifest","succeed","manifest","manifestPath","colors","path","imageExtensions","cacheExtensions","imageFilter","maxSize","manifestEntries","warnings","entry","url","size","ext","endsWith","generateServiceWorker","globPatterns","generateSW","count","warning","appendBaseToLink","link","isLinkAbsolute","appendBaseToManifest","icon","shortcut","screenshot","appendBase","injectLinksToHead","favicon","themeColor","apple","msTile","head","metaKeys","linkKeys","item","fallBackIcon","setLink","rel","href","more","setMeta","name","content","icons","isPlainObject","__dirname","getDirname","prepareClientConfigFile","configImport","rootComponents","getModulePath","getLocaleConfig","pwaPlugin","shouldPrefetch","bundlerOptions","addViteOptimizeDepsExclude","addViteSsrNoExternal","customizeDevServer","_","response"],"mappings":"4XAGa,MAAAA,EAAoC,CAC/C,OAAQ,CACN,QAAS,UACT,WAAY,qDACZ,OAAQ,SACR,MAAO,QACP,UAAW,iBACX,UAAW,aACX,KAAM,cACN,QAAS,eACT,QACE,0VACF,KAAM,qBACN,OAAQ,2BACV,EAEA,OAAQ,CACN,QAAS,KACT,WAAY,qBACZ,OAAQ,KACR,MAAO,KACP,UAAW,QACX,UAAW,QACX,KAAM,KACN,QAAS,OACT,QACE,yHACF,KAAM,UACN,OAAQ,QACV,EAEA,UAAW,CACT,QAAS,KACT,WAAY,qBACZ,OAAQ,KACR,MAAO,KACP,UAAW,QACX,UAAW,QACX,KAAM,KACN,QAAS,OACT,QACE,yHACF,KAAM,UACN,OAAQ,QACV,EAEA,OAAQ,CACN,QAAS,eACT,WAAY,8DACZ,OAAQ,YACR,MAAO,YACP,UAAW,kBACX,UAAW,gBACX,KAAM,gBACN,QAAS,aACT,QACE,iXACF,KAAM,yBACN,OAAQ,8BACV,EAEA,UAAW,CACT,QAAS,eACT,WAAY,6DACZ,OAAQ,YACR,MAAO,YACP,UAAW,kBACX,UAAW,gBACX,KAAM,gBACN,QAAS,WACT,QACE,oXACF,KAAM,+BACN,OAAQ,8BACV,EAEA,OAAQ,CACN,QAAS,SACT,WAAY,2DACZ,OAAQ,SACR,MAAO,OACP,UAAW,oBACX,UAAW,qBACX,KAAM,aACN,QAAS,sBACT,QACE,yZACF,KAAM,6BACN,OAAQ,oBACV,EAEA,OAAQ,CACN,QAAS,aACT,WACE,qEACF,OAAQ,YACR,MAAO,UACP,UAAW,uBACX,UAAW,sBACX,KAAM,OACN,QAAS,yBACT,QACE,2XACF,KAAM,uBACN,OAAQ,0BACV,EAEA,OAAQ,CACN,QAAS,aACT,WACE,mEACF,OAAQ,WACR,MAAO,UACP,UAAW,yBACX,UAAW,wBACX,KAAM,WACN,QAAS,mBACT,QACE,+ZACF,KAAM,uBACN,OAAQ,yBACV,EAEA,OAAQ,CACN,QAAS,WACT,WAAY,6DACZ,OAAQ,WACR,MAAO,SACP,UAAW,kBACX,UAAW,iBACX,KAAM,YACN,QAAS,wBACT,QACE,gYACF,KAAM,2BACN,OAAQ,gCACV,EAEA,OAAQ,CACN,QAAS,aACT,WACE,yEACF,OAAQ,SACR,MAAO,UACP,UAAW,oBACX,UAAW,mBACX,KAAM,OACN,QAAS,iBACT,QACE,ibACF,KAAM,6BACN,OAAQ,+BACV,EAEA,OAAQ,CACN,QAAS,cACT,WACE,mEACF,OAAQ,SACR,MAAO,UACP,UAAW,mBACX,UAAW,gBACX,KAAM,WACN,QAAS,qBACT,QACE,0YACF,KAAM,0BACN,OAAQ,yBACV,EAEA,OAAQ,CACN,QAAS,YACT,WACE,oEACF,OAAQ,UACR,MAAO,SACP,UAAW,mBACX,UAAW,iBACX,KAAM,cACN,QAAS,kBACT,QACE,kXACF,KAAM,qBACN,OAAQ,2BACV,EAEA,OAAQ,CACN,QAAS,WACT,WACE,qEACF,OAAQ,WACR,MAAO,SACP,UAAW,kBACX,UAAW,mBACX,KAAM,cACN,QAAS,wBACT,QACE,uZACF,KAAM,8BACN,OAAQ,iCACV,EAEA,OAAQ,CACN,QAAS,SACT,WACE,kCACF,OAAQ,QACR,MAAO,MACP,UAAW,OACX,UAAW,OACX,KAAM,KACN,QAAS,OACT,QACE,kNACF,KAAM,oBACN,OAAQ,kBACV,EAEA,OAAQ,CACN,QAAS,QACT,WACE,iEACF,OAAQ,QACR,MAAO,QACP,UAAW,eACX,UAAW,gBACX,KAAM,QACN,QAAS,iBACT,QACE,0ZACF,KAAM,uBACN,OAAQ,qBACV,EAEA,OAAQ,CACN,QAAS,KACT,WAAY,8BACZ,OAAQ,KACR,MAAO,KACP,UAAW,SACX,UAAW,SACX,KAAM,KACN,QAAS,QACT,QACE,+JACF,KAAM,kBACN,OAAQ,gBACV,EAEA,OAAQ,CACN,QAAS,SACT,WAAY,2DACZ,OAAQ,UACR,MAAO,QACP,UAAW,iBACX,UAAW,gBACX,KAAM,SACN,QAAS,oBACT,QACE,qWACF,KAAM,kBACN,OAAQ,+BACV,EAEA,OAAQ,CACN,QAAS,YACT,WACE,6EACF,OAAQ,QACR,MAAO,UACP,UAAW,YACX,UAAW,gBACX,KAAM,SACN,QAAS,iBACT,QACE,4YACF,KAAM,yBACN,OAAQ,wBACV,EAEA,OAAQ,CACN,QAAS,UACT,WAAY,wDACZ,OAAQ,QACR,MAAO,QACP,UAAW,oBACX,UAAW,qBACX,KAAM,aACN,QAAS,QACT,QACE,0YACF,KAAM,yBACN,OAAQ,6BACV,EAEA,OAAQ,CACN,QAAS,cACT,WAAY,yDACZ,OAAQ,YACR,MAAO,UACP,UAAW,cACX,UAAW,gBACX,KAAM,eACN,QAAS,8BACT,QACE,oVACF,KAAM,0BACN,OAAQ,+BACV,CACF,EClTaC,EAAc,MACzBC,EACAC,IACyB,CACzB,KAAM,CAAE,SAAAC,CAAS,EAAIF,EACf,CAAE,KAAAG,CAAK,EAAIH,EAAI,QAEfI,EAAmBJ,EAAI,IAAI,OAC/B,uCACF,EACMK,EAAuBL,EAAI,IAAI,OAAO,gCAAgC,EAEtEM,EAAsB,KAAK,MAC/BC,EAAG,WAAWH,CAAgB,EAC1B,MAAMG,EAAG,SAASH,EAAkB,MAAM,EAC1CG,EAAG,WAAWF,CAAoB,EAChC,MAAME,EAAG,SAASF,EAAsB,MAAM,EAC9C,IACR,EA0BA,MAxB8B,CAE5B,KAAMH,EAAS,OAASA,EAAS,QAAQ,GAAG,GAAG,OAAS,OAExD,WAAYA,EAAS,OAASA,EAAS,QAAQ,GAAG,GAAG,OAAS,OAC9D,YACEA,EAAS,aAETA,EAAS,QAAQ,GAAG,GAAG,aACvB,6BACF,KAAMM,EAAYR,CAAG,EACrB,UAAWG,EACX,MAAOA,EAEP,QAAS,aACT,YAAaF,EAAQ,YAAc,UACnC,iBAAkB,UAClB,YAAa,mBACb,4BAA6B,GAE7B,GAAGK,EACH,GAAGL,EAAQ,QACb,CAGF,ECjDaQ,EAAc,uBAEdC,EAAS,IAAIC,EAAOF,CAAW,ECE/BG,EAAmB,MAC9BZ,EACAC,IACkB,CAClB,KAAM,CAAE,QAAAY,CAAQ,EAAIH,EAAO,KAAK,iCAAiC,EAE3DI,EAAW,MAAMf,EAAYC,EAAKC,CAAO,EACzCc,EAAef,EAAI,IAAI,KAAK,sBAAsB,EAExD,MAAMO,EAAG,UAAUQ,EAAcD,EAAU,CACzC,KAAM,GACR,CAAC,EAEDD,EACE,mCAAmCG,EAAO,KACxCC,EAAK,SAAS,QAAQ,IAAOF,EAAAA,CAAY,CAC3C,CAAC,GACH,CACF,ECZMG,EAAkB,CAAC,MAAO,MAAO,OAAQ,OAAQ,MAAO,KAAK,EAC7DC,EAAkB,CACtB,KACA,MACA,MACA,OACA,QACA,MACA,MACA,KACF,EAEMC,EACJ,CAACC,EAAU,OAETC,GAC4B,CAC5B,MAAMC,EAAqB,CAAA,EACrBT,EAAiD,GAEvD,UAAWU,KAASF,EAAiB,CACnC,KAAM,CAAE,IAAAG,EAAK,KAAAC,CAAK,EAAIF,EAElBN,EAAgB,KAAMS,GAAQC,EAASH,EAAK,IAAIE,CAAG,EAAE,CAAC,GACpDD,EAAOL,EAAU,KACnBE,EAAS,KAAK,WAAWE,CAAG,aAAa,KAAK,KAAKC,EAAO,IAAI,CAAC,MAAM,EAEpEZ,EAAS,KAAKU,CAAK,CAC1B,CAEA,MAAO,CAAE,SAAAD,EAAU,SAAAT,CAAS,CAC9B,EAEWe,EAAwB,MACnC7B,EACAC,IACkB,CAClB,KAAM,CAAE,QAAAY,CAAQ,EAAIH,EAAO,KAAK,2BAA2B,EAErDoB,EAAe,CAAC,SAASX,EAAgB,KAAK,GAAG,CAAC,GAAG,EAEvDlB,EAAQ,UAAW6B,EAAa,KAAK,WAAW,EAC/CA,EAAa,KAAK,eAAgB,YAAY,EAE/C7B,EAAQ,YACV6B,EAAa,KAAK,SAASZ,EAAgB,KAAK,GAAG,CAAC,GAAG,EAEzD,MAAMa,EAAW,CACf,0BAA2B,IAAI,OAC7B,qBAAqB,CAAC,OAAQ,GAAGZ,EAAiB,GAAGD,CAAe,EAAE,KAAK,GAAG,CAAC,IACjF,EACA,aAAAY,EACA,sBAAuB,GACvB,aAAc,GACd,+BAAgC7B,EAAQ,SAAW,MAAQ,KAC3D,mBAAoB,CAACmB,EAAYnB,EAAQ,YAAY,CAAC,EACtD,KAAMD,EAAI,IAAI,QAAU,cAAgB,aACxC,UAAWA,EAAI,IAAI,QACnB,GAAGC,EAAQ,iBAEX,cAAeD,EAAI,IAAI,KAAA,EACvB,OAAQA,EAAI,IAAI,KAAKC,EAAQ,uBAAyB,mBAAmB,CAC3E,CAAC,EAAE,KAAK,CAAC,CAAE,MAAA+B,EAAO,KAAAN,EAAM,SAAAH,CAAS,IAAM,CACrCV,EAAQ,EAERH,EAAO,KACL,YAAYM,EAAO,KAAK,GAAGgB,CAAK,QAAQ,CAAC,cAAchB,EAAO,KAC5D,IAAIU,EAAO,KAAO,MAAM,QAAQ,CAAC,CAAC,MACpC,CAAC,GACH,EAEIH,EAAS,QACXb,EAAO,KAAK;AAAA,EAAKa,EAAS,IAAKU,GAAY,OAAOA,CAAO,EAAE,EAAE,KAAK;AAAA,CAAI,CAAC,EAAE,EAEvEP,EAAO,UACThB,EAAO,MACL;AAAA,EAAuFM,EAAO,KAC5F,qGACF,CAAC,EACH,EACOU,EAAO,UACdhB,EAAO,KACL;AAAA;AAAA,EAA8EM,EAAO,KACnF,qGACF,CAAC,EACH,CACJ,CAAC,CACH,EC/FMkB,EAAmB,CAAC/B,EAAcgC,IACtCC,EAAeD,CAAI,EAAIA,EAAK,QAAQ,MAAOhC,CAAI,EAAIgC,EAExCE,EAAuB,CAClClC,EACAW,KAEIA,EAAS,QACXA,EAAS,MAAQA,EAAS,MAAM,IAAKwB,IAAU,CAC7C,GAAGA,EACH,IAAKJ,EAAiB/B,EAAMmC,EAAK,GAAG,CACtC,EAAE,GAEAxB,EAAS,YACXA,EAAS,UAAYA,EAAS,UAAU,IAAKyB,IAAc,CACzD,GAAGA,EACH,MACEA,EAAS,OAAO,IAAKD,IAAU,CAC7B,GAAGA,EACH,IAAKJ,EAAiB/B,EAAMmC,EAAK,GAAG,CACtC,EAAE,GAAK,CAAA,EACT,IAAKJ,EAAiB/B,EAAMoC,EAAS,GAAG,CAC1C,EAAE,GAEAzB,EAAS,cACXA,EAAS,YAAcA,EAAS,YAAY,IAAK0B,IAAgB,CAC/D,GAAGA,EACH,IAAKN,EAAiB/B,EAAMqC,EAAW,GAAG,CAC5C,EAAE,GAEG1B,GAGI2B,EAAa,CAACtC,EAAcF,IAAoC,CACvEA,EAAQ,UAASA,EAAQ,QAAUiC,EAAiB/B,EAAMF,EAAQ,OAAO,GAEzEA,EAAQ,QACNA,EAAQ,MAAM,OAChBA,EAAQ,MAAM,KAAOiC,EAAiB/B,EAAMF,EAAQ,MAAM,IAAI,GAE5DA,EAAQ,MAAM,WAChBA,EAAQ,MAAM,SAAWiC,EAAiB/B,EAAMF,EAAQ,MAAM,QAAQ,IAGtEA,EAAQ,QAAUA,EAAQ,OAAO,QACnCA,EAAQ,OAAO,MAAQiC,EAAiB/B,EAAMF,EAAQ,OAAO,KAAK,GAEhEA,EAAQ,WACVA,EAAQ,SAAWoC,EAAqBlC,EAAMF,EAAQ,QAAQ,EAClE,ECjDayC,EAAoB,CAC/B,CACE,QAAAC,EACA,SAAA7B,EACA,WAAA8B,EAAa,UACb,MAAAC,EACA,OAAAC,CACF,EACA3C,EAAO,IACP4C,EAAqB,KACJ,CACjB,MAAMC,EAAqB,CAAA,EACrBC,EAAqB,CAAC,EAG5BF,EAAK,QAASG,GAAS,CACjBA,EAAK,CAAC,IAAM,OAAQF,EAAS,KAAKE,EAAK,CAAC,EAAE,IAAc,EACnDA,EAAK,CAAC,IAAM,QAAQD,EAAS,KAAKC,EAAK,CAAC,EAAE,GAAa,CAClE,CAAC,EAED,IAAIC,EAAe,GACnB,MAAMC,EAAU,CACdC,EACAC,EACAC,EAA+B,CACtB,IAAA,CACJN,EAAS,SAASI,CAAG,GAAGN,EAAK,KAAK,CAAC,OAAQ,CAAE,IAAAM,EAAK,KAAAC,EAAM,GAAGC,CAAK,CAAC,CAAC,CACzE,EAEMC,EAAU,CACdC,EACAC,EACAH,EAA+B,KACtB,CACJP,EAAS,SAASS,CAAI,GACzBV,EAAK,KAAK,CAAC,OAAQ,CAAE,KAAAU,EAAM,QAAAC,EAAS,GAAGH,CAAK,CAAC,CAAC,CAClD,EAIA,GAFIZ,GAASS,EAAQ,OAAQT,CAAO,EAEhC7B,GAAU,MAAO,CACnB,KAAM,CAAE,MAAA6C,CAAM,EAAI7C,EAEd6C,EAAM,OAAS,IACjBR,EAAeQ,EAAM,CAAC,EAAE,IAExB7C,EAAS,MAAM,QAASwB,GAAS,CAC3BA,EAAK,KACPc,EAAQ,OAAQd,EAAK,IAAK,CAAE,KAAMA,EAAK,KAAM,MAAOA,EAAK,KAAM,CAAC,EAC7Dc,EAAQ,OAAQd,EAAK,IAAK,CAAE,MAAOA,EAAK,KAAM,CAAC,CACtD,CAAC,EAEL,CAEA,OAAAc,EAAQ,WAAY,GAAGjD,CAAI,uBAAwB,CACjD,YAAa,iBACf,CAAC,EACDqD,EAAQ,cAAeZ,GAAc,SAAS,EAE1CgB,EAAcf,CAAK,IAAMA,EAAM,MAAQM,IACzCC,EAAQ,mBAAoBP,EAAM,MAAQM,CAAY,EACtDK,EAAQ,+BAAgC,KAAK,EAC7CA,EACE,wCACAX,EAAM,gBAAkB,OAC1B,EACIA,EAAM,UACRO,EAAQ,YAAaP,EAAM,SAAU,CACnC,MAAOD,GAAc,SACvB,CAAC,GACMC,IAAU,IAASM,IAC5BC,EAAQ,mBAAoBD,CAAY,EACxCK,EAAQ,+BAAgC,KAAK,EAC7CA,EAAQ,wCAAyC,OAAO,GAGtDI,EAAcd,CAAM,IAAMA,EAAO,OAASK,IAC5CK,EAAQ,0BAA2BV,EAAO,OAASK,CAAY,EAC/DK,EAAQ,0BAA2BV,EAAO,OAASF,GAAc,SAAS,GACjEE,IAAW,IAASK,IAC7BK,EAAQ,0BAA2BL,CAAY,EAC/CK,EAAQ,0BAA2BZ,GAAc,SAAS,GAGrDG,CACT,EClFMc,EAAY,YAAY,SAAWC,EAAW,YAAY,GAAG,EAEtDC,EAA0B,CACrC/D,EACAC,IACoB,CACpB,IAAI+D,EAAe,GACnB,MAAMC,EAA2B,GAEjC,OAAIhE,EAAQ,cACV+D,GAAgB,8CACyB/C,EAAK,KAAK4C,EAAW,oCAAoC,CAAC;AAAA,EAGnGI,EAAe,KAAK,YAAY,GAG9BhE,EAAQ,SAAW,QACrB+D,GAAgB,oDAEd/D,EAAQ,gBACRgB,EAAK,KAAK4C,EAAW,uCAAuC,CAC9D;AAAA,EAGAI,EAAe,KAAK,eAAe,GAC1BhE,EAAQ,SAAW,WAAaA,EAAQ,SAAW,UAC5D+D,GAAgB,oDAEd/D,EAAQ,gBACRgB,EAAK,KAAK4C,EAAW,uCAAuC,CAC9D;AAAA,EAGAI,EAAe,KAAK,eAAe,GAG9BjE,EAAI,UACT,gBACA;AAAA;AAAA,4CAGwCiB,EAAK,KAAK4C,EAAW,gCAAgC,CAAC;AAAA,EAChGG,CAAY;AAAA,UACJE,EAAc,uCAAwC,WAAW,CAAC;AAAA;AAAA,kBAE1D,KAAK,UACjBC,EAAgB,CACd,IAAAnE,EACA,KAAMS,EACN,QAASX,EACT,OAAQG,EAAQ,OAClB,CAAC,CACH,CAAC;AAAA;AAAA;AAAA;AAAA,eAIU,KAAK,UAAUA,EAAQ,uBAAyB,mBAAmB,CAAC,KAAKA,EAAQ,SAAW,OAAO;AAAA;AAAA;AAAA;AAAA,EAIhHgE,EAAe,IAAKf,GAAS,gBAAgBA,CAAI,iBAAiB,EAAE,KAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA,CAI9E,CACF,EC1DakB,EACX,CAACnE,EAA4B,CAAC,IAC7BD,GAAQ,CACHA,EAAI,IAAI,SAASU,EAAO,KAAK,WAAYT,CAAO,EAEpD,KAAM,CAAE,KAAAE,EAAM,eAAAkE,EAAiB,EAAK,EAAIrE,EAAI,QAE5C,OAAIC,EAAQ,YAAYwC,EAAWtC,EAAMF,CAAO,EAE5CoE,IAAmB,IACrB3D,EAAO,KACL,uIACF,EAEFV,EAAI,QAAQ,KAAO0C,EAAkBzC,EAASE,EAAMH,EAAI,QAAQ,IAAI,EAE7D,CACL,KAAMS,EAEN,sBAAwB6D,GAAkC,CACxDC,EAA2BD,EAAgBtE,EAAK,CAC9C,OACA,yBACF,CAAC,EACDwE,EAAqBF,EAAgBtE,EAAK,kBAAkB,EAE5DyE,EAAmBH,EAAgBtE,EAAK,CACtC,KAAM,wBACN,SAAU,MAAO0E,EAAGC,KAClBA,EAAS,UAAU,eAAgB,2BAA2B,EAEvD,KAAK,UAAU,MAAM5E,EAAYC,EAAKC,CAAO,CAAC,GAEvD,OAAQ,sCACV,CAAC,CACH,EAEA,YAAa,SAA2B,CACtC,MAAMW,EAAiBZ,EAAKC,CAAO,EACnC,MAAM4B,EAAsB7B,EAAKC,CAAO,CAC1C,EAEA,iBAAkB,IAAM8D,EAAwB/D,EAAKC,CAAO,CAC9D,CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vuepress/plugin-pwa",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.63",
|
|
4
4
|
"description": "VuePress plugin - progressive web application",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vuepress-plugin",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"lib"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@vuepress/helper": "2.0.0-rc.
|
|
40
|
-
"@vueuse/core": "^
|
|
39
|
+
"@vuepress/helper": "2.0.0-rc.63",
|
|
40
|
+
"@vueuse/core": "^12.0.0",
|
|
41
41
|
"mitt": "^3.0.1",
|
|
42
42
|
"register-service-worker": "^1.7.2",
|
|
43
43
|
"vue": "^3.5.13",
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"publishConfig": {
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "339e0f9caa7b38d7fba0616194fdfa45415b914d"
|
|
53
53
|
}
|