@atomazing-org/vite-config
Version:
A library providing a vite configuration with including PWA and MF supports.
1 lines • 11.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../configs/workbox.config.ts","../src/helpers.ts"],"sourcesContent":["/// <reference types=\"vitest\" />\r\nimport { defineConfig, PluginOption, UserConfig } from 'vite'\r\nimport { federation } from '@module-federation/vite'\r\nimport react from '@vitejs/plugin-react'\r\nimport { VitePWA } from 'vite-plugin-pwa'\r\nimport { qrcode } from 'vite-plugin-qrcode'\r\nimport defaultWorkboxConfig from '../configs/workbox.config'\r\nimport basicSsl from '@vitejs/plugin-basic-ssl'\r\nimport tsconfigPaths from 'vite-tsconfig-paths'\r\nimport checker from 'vite-plugin-checker'\r\nimport { findTsModule } from './helpers'\r\nimport { ModuleFederationOptions } from '@module-federation/vite/lib/utils/normalizeModuleFederationOptions'\r\nimport { lingui } from '@lingui/vite-plugin'\r\n\r\ntype Args = {\r\n\tenableDevPwa?: boolean\r\n\tenableHttps?: boolean\r\n\tmoduleFederationOptions?: Partial<ModuleFederationOptions> & Pick<ModuleFederationOptions, 'name'>\r\n\tenableI8n?: boolean\r\n} & UserConfig\r\n\r\n// https://vitejs.dev/config/\r\nexport async function createViteConfig({\r\n\tenableDevPwa = false,\r\n\tenableHttps = false,\r\n\tenableI8n = false,\r\n\tmoduleFederationOptions,\r\n\t...userConfig\r\n}: Args) {\r\n\tconst manifest = await findTsModule('manifest.ts')\r\n\tconst workboxConfig = await findTsModule('workbox.config.ts')\r\n\r\n\tconst { plugins: userPlugins, build, ...restUserConfig } = userConfig\r\n\tconst plugins: PluginOption[] = []\r\n\tconst babelPlugins: string[] = ['@emotion/babel-plugin']\r\n\r\n\tif (manifest) {\r\n\t\tconsole.log('🔧 Detected manifest.ts')\r\n\t\tif (workboxConfig) {\r\n\t\t\tconsole.log('🔧 Detected workbox.config.ts')\r\n\t\t} else {\r\n\t\t\tconsole.log('🔧 Default workbox.config.ts should be used')\r\n\t\t}\r\n\t\t// https://vite-pwa-org.netlify.app/\r\n\t\tplugins.push(\r\n\t\t\tVitePWA({\r\n\t\t\t\tdevOptions: {\r\n\t\t\t\t\tenabled: enableDevPwa,\r\n\t\t\t\t\ttype: 'module',\r\n\t\t\t\t},\r\n\r\n\t\t\t\tmanifest,\r\n\t\t\t\tregisterType: 'autoUpdate',\r\n\t\t\t\tworkbox: workboxConfig ? workboxConfig : defaultWorkboxConfig,\r\n\t\t\t\tincludeAssets: ['**/*', 'sw.js'],\r\n\t\t\t}),\r\n\t\t)\r\n\t\tif (enableDevPwa) {\r\n\t\t\tplugins.push(\r\n\t\t\t\tqrcode({\r\n\t\t\t\t\tfilter: url =>\r\n\t\t\t\t\t\turl.startsWith('http://192.168.0.') || url.startsWith('https://192.168.0.'),\r\n\t\t\t\t}),\r\n\t\t\t)\r\n\t\t}\r\n\t\tconsole.log('🛠️ vite-plugin-pwa is connected')\r\n\t}\r\n\r\n\tif (moduleFederationOptions) {\r\n\t\tplugins.push(\r\n\t\t\tfederation({\r\n\t\t\t\tfilename: 'remoteEntry.js',\r\n\t\t\t\t...moduleFederationOptions,\r\n\t\t\t}),\r\n\t\t)\r\n\t\tconsole.log('🛠️ @module-federation/vite is connected')\r\n\t}\r\n\r\n\tif (enableHttps) {\r\n\t\tplugins.push(basicSsl())\r\n\t\tconsole.log('🛠️ @vitejs/plugin-basic-ssl is connected ')\r\n\t}\r\n\r\n\tif (enableI8n) {\r\n\t\tbabelPlugins.push('@lingui/babel-plugin-lingui-macro')\r\n\t\tplugins.push(lingui())\r\n\t\tconsole.log('🛠️ @lingui/vite-plugin is connected ')\r\n\t}\r\n\r\n\treturn defineConfig({\r\n\t\ttest: {\r\n\t\t\tglobals: true,\r\n\t\t},\r\n\t\tplugins: [\r\n\t\t\t...plugins,\r\n\t\t\treact({\r\n\t\t\t\tjsxImportSource: '@emotion/react',\r\n\t\t\t\tbabel: {\r\n\t\t\t\t\tplugins: babelPlugins,\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\t\t\ttsconfigPaths(),\r\n\t\t\tchecker({\r\n\t\t\t\ttypescript: true,\r\n\t\t\t}),\r\n\t\t\t...(userPlugins ?? []),\r\n\t\t],\r\n\t\tresolve: {\r\n\t\t\textensions: ['.tsx', '.ts', '.jsx', '.js', '.json', '.mjs', '.mts'],\r\n\t\t},\r\n\t\tbuild: {\r\n\t\t\trollupOptions: {\r\n\t\t\t\tonwarn(warning, warn) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\twarning.code === 'SOURCEMAP_ERROR' ||\r\n\t\t\t\t\t\twarning.message.includes('PURE') // ignore PURE comment warning\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\t\t\t\t\twarn(warning)\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\t...build,\r\n\t\t},\r\n\t\t...restUserConfig,\r\n\t})\r\n}\r\n\r\nexport * from 'vite-plugin-pwa'\r\nexport * from 'workbox-build'\r\nexport * from 'workbox-window'\r\n","import type { GenerateSWOptions } from 'workbox-build/build/types'\r\n\r\nconst workbox: Partial<GenerateSWOptions> = {\r\n\tglobPatterns: ['assets/**/*.{js,css}', 'index.html', 'favicon.svg', 'manifest.webmanifest'],\r\n\tglobIgnores: ['**/@mui/icons-material/**', '**/node_modules/**'],\r\n\tskipWaiting: true,\r\n\tclientsClaim: true,\r\n\tnavigateFallback: '/index.html',\r\n\truntimeCaching: [\r\n\t\t{\r\n\t\t\t// ✅ Локальный API или внешние API (если нужно)\r\n\t\t\turlPattern: ({ url }) => url.href.startsWith('https://'),\r\n\t\t\thandler: 'NetworkFirst',\r\n\t\t\toptions: {\r\n\t\t\t\tcacheName: 'jsonplaceholder',\r\n\t\t\t\tnetworkTimeoutSeconds: 5,\r\n\t\t\t\texpiration: {\r\n\t\t\t\t\tmaxEntries: 50,\r\n\t\t\t\t\tmaxAgeSeconds: 7 * 24 * 60 * 60,\r\n\t\t\t\t},\r\n\t\t\t\tcacheableResponse: {\r\n\t\t\t\t\tstatuses: [0, 200],\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t},\r\n\t\t{\r\n\t\t\t// ✅ Скрипты, стили, воркеры (локальные)\r\n\t\t\turlPattern: ({ request }) =>\r\n\t\t\t\trequest.destination === 'script' ||\r\n\t\t\t\trequest.destination === 'style' ||\r\n\t\t\t\trequest.destination === 'worker',\r\n\t\t\thandler: 'CacheFirst',\r\n\t\t\toptions: {\r\n\t\t\t\tcacheName: 'app-assets',\r\n\t\t\t\texpiration: {\r\n\t\t\t\t\tmaxEntries: 60,\r\n\t\t\t\t\tmaxAgeSeconds: 30 * 24 * 60 * 60,\r\n\t\t\t\t},\r\n\t\t\t\tcacheableResponse: {\r\n\t\t\t\t\tstatuses: [0, 200],\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t},\r\n\t\t{\r\n\t\t\t// ✅ Документы навигации (страницы)\r\n\t\t\turlPattern: ({ request }) => request.mode === 'navigate',\r\n\t\t\thandler: 'NetworkFirst',\r\n\t\t\toptions: {\r\n\t\t\t\tcacheName: 'documents',\r\n\t\t\t\tnetworkTimeoutSeconds: 10,\r\n\t\t\t\texpiration: {\r\n\t\t\t\t\tmaxEntries: 50,\r\n\t\t\t\t\tmaxAgeSeconds: 30 * 24 * 60 * 60,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t},\r\n\t\t{\r\n\t\t\t// ✅ Локальные изображения\r\n\t\t\turlPattern: ({ request }) => request.destination === 'image',\r\n\t\t\thandler: 'CacheFirst',\r\n\t\t\toptions: {\r\n\t\t\t\tcacheName: 'images',\r\n\t\t\t\texpiration: {\r\n\t\t\t\t\tmaxEntries: 60,\r\n\t\t\t\t\tmaxAgeSeconds: 30 * 24 * 60 * 60,\r\n\t\t\t\t},\r\n\t\t\t\tcacheableResponse: {\r\n\t\t\t\t\tstatuses: [0, 200],\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t},\r\n\t],\r\n}\r\n\r\nexport default workbox\r\n","import fs from 'fs'\r\nimport path from 'path'\r\nimport { transform } from 'esbuild'\r\nimport asyncFs from 'node:fs/promises'\r\n\r\nexport const findFile = (fileName: string): string | null => {\r\n\tconst rootDir = process.cwd()\r\n\tconst filePath = path.join(rootDir, fileName)\r\n\tif (fs.existsSync(filePath)) {\r\n\t\treturn filePath\r\n\t}\r\n\treturn null\r\n}\r\n\r\nexport const findTsModule = async (fileName: string) => {\r\n\tconst foundPath = findFile(fileName)\r\n\tif (!foundPath) return null\r\n\ttry {\r\n\t\tconst tsCode = await asyncFs.readFile(foundPath, 'utf-8')\r\n\r\n\t\t// Транспилируем TypeScript в JavaScript\r\n\t\tconst { code: jsCode } = await transform(tsCode, {\r\n\t\t\tloader: 'ts',\r\n\t\t\tformat: 'esm',\r\n\t\t\ttarget: 'esnext',\r\n\t\t})\r\n\r\n\t\t// Создаем data URL для импорта\r\n\t\tconst dataUrl = `data:text/javascript;base64,${Buffer.from(jsCode).toString('base64')}`\r\n\t\tconst module = await import(dataUrl)\r\n\t\treturn module.default\r\n\t} catch (e) {\r\n\t\tconsole.error(`Error on ${fileName} loading.`, e)\r\n\t\treturn null\r\n\t}\r\n}\r\n"],"mappings":"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","names":["defineConfig","federation","react","VitePWA","qrcode","workbox","url","request","workbox_config_default","basicSsl","tsconfigPaths","checker","fs","path","transform","asyncFs","findFile","fileName","rootDir","filePath","findTsModule","foundPath","tsCode","jsCode","e","lingui","createViteConfig","enableDevPwa","enableHttps","enableI8n","moduleFederationOptions","userConfig","manifest","findTsModule","workboxConfig","userPlugins","build","restUserConfig","plugins","babelPlugins","VitePWA","workbox_config_default","qrcode","url","federation","basicSsl","defineConfig","react","tsconfigPaths","checker","warning","warn"]}