UNPKG

@statusfy/core

Version:
234 lines (202 loc) 6.45 kB
const fs = require("fs"); const dotProp = require("dot-prop"); const defaultsDeep = require("lodash/defaultsDeep"); const { esm, logger, style, path } = require("@statusfy/common"); const loadConfig = require("./load"); const { colors } = style; module.exports = function generateConfig(sourceDir, cliOptions) { /** * @type { import("@nuxt/types").Configuration } */ const nuxtConfig = Object.assign( {}, esm(path.join(__dirname, "../../nuxt.config.js")) ); const loadedConfig = loadConfig(sourceDir); const siteConfig = loadedConfig.config; const siteConfigErrors = loadedConfig.errors; try { if (siteConfigErrors && siteConfigErrors.length > 0) { logger.fatal( `Your site configuration is invalid:\n${siteConfigErrors.join("\n")}` ); process.exit(1); } } catch (error) { logger.error(error); process.exit(1); } // General nuxtConfig.dev = !(process.env.NODE_ENV === "production"); nuxtConfig.rootDir = path.join(__dirname, "..", ".."); nuxtConfig.buildDir = path.join(sourceDir, ".statusfy"); nuxtConfig.modulesDir.push(path.join(sourceDir, "node_modules")); nuxtConfig.modulesDir = [...new Set(nuxtConfig.modulesDir)]; // Style nuxtConfig.loading.color = colors.black; nuxtConfig.meta.theme_color = colors.black; // Statusfy module configuration nuxtConfig.server = { host: cliOptions.host || process.env.HOST || "127.0.0.1", port: cliOptions.port || process.env.PORT || 3000 }; // Statusfy module configuration nuxtConfig.statusfy.version = nuxtConfig.manifest.version; nuxtConfig.statusfy.dev = nuxtConfig.dev; nuxtConfig.statusfy.locales = siteConfig.locales; nuxtConfig.statusfy.sourceDir = sourceDir; nuxtConfig.statusfy.siteConfig = siteConfig; nuxtConfig.statusfy.publicFilesPath = fs.existsSync( path.join(sourceDir, "public") ) ? path.join(sourceDir, "public") : null; const validLogoExtension = ["png", "jpg", "jpeg", "gif", "svg"]; // eslint-disable-next-line no-unused-vars for (const ext of validLogoExtension) { const filePath = path.join( sourceDir, "theme", "default", "img", `logo.${ext}` ); if (fs.existsSync(filePath)) { nuxtConfig.statusfy.assets.mainLogo = filePath; break; } } // Head Configuration nuxtConfig.head = { ...siteConfig.head, ...nuxtConfig.head }; nuxtConfig.head.title = siteConfig.title; // Hack: fix duplicate descripton object const descriptionIndex = nuxtConfig.head.meta.findIndex( o => o.hid === "description" ); const descriptionValue = { hid: "description", name: "description", content: siteConfig.description }; if (descriptionIndex === -1) { nuxtConfig.head.meta.push(descriptionValue); } else { nuxtConfig.head.meta[descriptionIndex] = descriptionValue; } nuxtConfig.head.titleTemplate = `%s | ${siteConfig.title}`; nuxtConfig.head = defaultsDeep(siteConfig.head, nuxtConfig.head); // Generate Configuration nuxtConfig.generate = nuxtConfig.generate || {}; nuxtConfig.generate.dir = path.join(sourceDir, cliOptions.outDir || "dist"); // nuxt-i18n module configuration const nuxti18nModuleConfig = nuxtConfig.modules.find( item => item[0] === "nuxt-i18n" )[1]; // Update the locales list nuxti18nModuleConfig.locales = []; siteConfig.locales.forEach(locale => { nuxti18nModuleConfig.locales.push({ ...locale, file: `${locale.code}.js` }); }); nuxti18nModuleConfig.defaultLocale = siteConfig.defaultLocale; nuxti18nModuleConfig.detectBrowserLanguage.cookieKey = `${siteConfig.name}.lang_redirected`; nuxti18nModuleConfig.vueI18n.fallbackLocale = siteConfig.defaultLocale; if (siteConfig.baseUrl) { nuxti18nModuleConfig.baseUrl = siteConfig.baseUrl === "/" ? null : siteConfig.baseUrl; } // PWA Module if (siteConfig.serviceWorker === true) { nuxtConfig.workbox.cacheId = siteConfig.name; nuxtConfig.workbox.globDirectory = path.resolve( nuxtConfig.buildDir, "dist", "client" ); nuxtConfig.workbox.runtimeCaching.forEach(runtime => { if (runtime.strategyOptions) { runtime.strategyOptions.cacheName = `${siteConfig.name}_${runtime.strategyOptions.cacheName}`; } }); if (siteConfig.analytics && siteConfig.analytics.ga) { nuxtConfig.workbox.offlineAnalytics = true; } // onesignal notifications const onesignalAppId = dotProp.get( siteConfig.notifications, "webpush.onesignal.appId" ); if (onesignalAppId) { nuxtConfig.modules.unshift("@nuxtjs/onesignal"); nuxtConfig.oneSignal = { init: { appId: onesignalAppId, allowLocalhostAsSecureOrigin: true, welcomeNotification: { disable: true } } }; } } else { const nuxtiPwaModuleConfig = nuxtConfig.modules.find( item => item[0] === "@nuxtjs/pwa" )[1]; nuxtiPwaModuleConfig.workbox = false; delete nuxtConfig.workbox; } if (siteConfig.manifest === true) { nuxtConfig.manifest.name = siteConfig.title; nuxtConfig.manifest.short_name = siteConfig.short_title; nuxtConfig.manifest.description = siteConfig.description; nuxtConfig.manifest.lang = siteConfig.defaultLocale; } else { const nuxtiPwaModuleConfig = nuxtConfig.modules.find( item => item[0] === "@nuxtjs/pwa" )[1]; nuxtiPwaModuleConfig.manifest = false; delete nuxtConfig.manifest; } nuxtConfig.meta.ogHost = siteConfig.baseUrl; const customIconPath = path.join( sourceDir, "theme", "default", "img", "icon.png" ); if (fs.existsSync(customIconPath)) { nuxtConfig.icon.iconSrc = customIconPath; } // Custom Styles const validStylesExtension = [ "css", "less", "sass", "scss", "styl", "stylus" ]; const stylesPath = []; // eslint-disable-next-line no-unused-vars for (const ext of validStylesExtension) { const filePath = path.join(sourceDir, "theme", "default", `style.${ext}`); if (fs.existsSync(filePath)) { stylesPath.push(filePath); } } if (stylesPath.length > 0) { logger.info( `Loading Styles from:\n${stylesPath .map(p => path.relative(sourceDir, p)) .join("\n")}` ); nuxtConfig.css.push(...stylesPath); } return { nuxtConfig, siteConfig }; };