diff --git a/lib/load/docs.js b/lib/load/docs/index.js similarity index 94% rename from lib/load/docs.js rename to lib/load/docs/index.js index 7483b9d2e7..eb906b9a10 100644 --- a/lib/load/docs.js +++ b/lib/load/docs/index.js @@ -2,7 +2,7 @@ const fs = require('fs-extra'); const path = require('path'); const fm = require('front-matter'); const globby = require('globby'); -const {encodePath, fileToPath} = require('./utils'); +const {encodePath, fileToPath} = require('../utils'); function parse(fileString) { if (!fm.test(fileString)) { diff --git a/lib/load/env.js b/lib/load/env.js new file mode 100644 index 0000000000..d53b46f416 --- /dev/null +++ b/lib/load/env.js @@ -0,0 +1,39 @@ +const fs = require('fs-extra'); +const path = require('path'); + +module.exports = function loadEnv({siteDir, siteConfig}) { + // Translation + const translation = { + enabled: false, + enabledLanguages: [] + }; + + const languagesFile = path.join(siteDir, 'languages.js'); + if (fs.existsSync(languagesFile)) { + translation.enabled = true; + const languages = require(languagesFile); + translation.enabledLanguages = languages.filter(lang => lang.enabled); + } + + // Versioning + const versioning = { + enabled: false, + latestVersion: null, + defaultVersion: null, + versions: [] + }; + + const versionsJSONFile = path.join(siteDir, 'versions.json'); + if (fs.existsSync(versionsJSONFile)) { + versioning.enabled = true; + versioning.versions = JSON.parse(fs.readFileSync(versionsJSONFile, 'utf8')); + versioning.latestVersion = versioning.versions[0]; + const {defaultVersionShown} = siteConfig; + versioning.defaultVersion = defaultVersionShown || versioning.latestVersion; + } + + return { + translation, + versioning + }; +}; diff --git a/lib/load/index.js b/lib/load/index.js index f5cbbcd7a5..7cebbc0271 100644 --- a/lib/load/index.js +++ b/lib/load/index.js @@ -1,6 +1,7 @@ const path = require('path'); const loadConfig = require('./config'); const loadDocs = require('./docs'); +const loadEnv = require('./env'); const loadPages = require('./pages'); const loadTheme = require('./theme'); const {generate} = require('./utils'); @@ -10,6 +11,9 @@ module.exports = async function load(siteDir) { // siteConfig const siteConfig = loadConfig(siteDir); + // env + const env = loadEnv({siteDir, siteConfig}); + // docs const docsDir = path.resolve( siteDir, @@ -43,6 +47,7 @@ module.exports = async function load(siteDir) { siteDir, docsDir, docsData, + env, pagesDir, pagesData, outDir, diff --git a/lib/webpack/utils.js b/lib/webpack/utils.js index 9ce3d29a2c..369bb5db87 100644 --- a/lib/webpack/utils.js +++ b/lib/webpack/utils.js @@ -19,7 +19,6 @@ function applyChainWebpack(userChainWebpack, config, isServer) { if (userChainWebpack) { userChainWebpack(config, isServer); } - } module.exports = { diff --git a/test/load/__fixtures__/translated-site/languages.js b/test/load/__fixtures__/translated-site/languages.js new file mode 100644 index 0000000000..14c4aca911 --- /dev/null +++ b/test/load/__fixtures__/translated-site/languages.js @@ -0,0 +1,178 @@ +const languages = [ + { + enabled: true, + name: 'English', + tag: 'en', + }, + { + enabled: false, + name: '日本語', + tag: 'ja', + }, + { + enabled: false, + name: 'العربية', + tag: 'ar', + }, + { + enabled: false, + name: 'Bosanski', + tag: 'bs-BA', + }, + { + enabled: false, + name: 'Català', + tag: 'ca', + }, + { + enabled: false, + name: 'Čeština', + tag: 'cs', + }, + { + enabled: false, + name: 'Dansk', + tag: 'da', + }, + { + enabled: false, + name: 'Deutsch', + tag: 'de', + }, + { + enabled: false, + name: 'Ελληνικά', + tag: 'el', + }, + { + enabled: true, + name: 'Español', + tag: 'es-ES', + }, + { + enabled: false, + name: 'فارسی', + tag: 'fa-IR', + }, + { + enabled: false, + name: 'Suomi', + tag: 'fi', + }, + { + enabled: false, + name: 'Français', + tag: 'fr', + }, + { + enabled: false, + name: 'עִברִית', + tag: 'he', + }, + { + enabled: false, + name: 'Magyar', + tag: 'hu', + }, + { + enabled: false, + name: 'Bahasa Indonesia', + tag: 'id-ID', + }, + { + enabled: false, + name: 'Italiano', + tag: 'it', + }, + { + enabled: false, + name: 'Afrikaans', + tag: 'af', + }, + { + enabled: false, + name: '한국어', + tag: 'ko', + }, + { + enabled: false, + name: 'मराठी', + tag: 'mr-IN', + }, + { + enabled: false, + name: 'Nederlands', + tag: 'nl', + }, + { + enabled: false, + name: 'Norsk', + tag: 'no-NO', + }, + { + enabled: false, + name: 'Polskie', + tag: 'pl', + }, + { + enabled: false, + name: 'Português', + tag: 'pt-PT', + }, + { + enabled: false, + name: 'Português (Brasil)', + tag: 'pt-BR', + }, + { + enabled: true, + name: 'Română', + tag: 'ro', + }, + { + enabled: false, + name: 'Русский', + tag: 'ru', + }, + { + enabled: false, + name: 'Slovenský', + tag: 'sk-SK', + }, + { + enabled: false, + name: 'Српски језик (Ћирилица)', + tag: 'sr', + }, + { + enabled: false, + name: 'Svenska', + tag: 'sv-SE', + }, + { + enabled: true, + name: 'Türkçe', + tag: 'tr', + }, + { + enabled: false, + name: 'Українська', + tag: 'uk', + }, + { + enabled: false, + name: 'Tiếng Việt', + tag: 'vi', + }, + { + enabled: true, + name: '简体中文', + tag: 'zh-CN', + }, + { + enabled: false, + name: '繁體中文', + tag: 'zh-TW', + }, +]; +module.exports = languages; diff --git a/test/load/__fixtures__/translated-site/siteConfig.js b/test/load/__fixtures__/translated-site/siteConfig.js new file mode 100644 index 0000000000..e64b9989cf --- /dev/null +++ b/test/load/__fixtures__/translated-site/siteConfig.js @@ -0,0 +1,7 @@ +module.exports = { + title: 'Hello', + tagline: 'Hello World', + organizationName: 'endiliey', + projectName: 'hello', + baseUrl: '/' +}; diff --git a/test/load/__fixtures__/transversioned-site/languages.js b/test/load/__fixtures__/transversioned-site/languages.js new file mode 100644 index 0000000000..14c4aca911 --- /dev/null +++ b/test/load/__fixtures__/transversioned-site/languages.js @@ -0,0 +1,178 @@ +const languages = [ + { + enabled: true, + name: 'English', + tag: 'en', + }, + { + enabled: false, + name: '日本語', + tag: 'ja', + }, + { + enabled: false, + name: 'العربية', + tag: 'ar', + }, + { + enabled: false, + name: 'Bosanski', + tag: 'bs-BA', + }, + { + enabled: false, + name: 'Català', + tag: 'ca', + }, + { + enabled: false, + name: 'Čeština', + tag: 'cs', + }, + { + enabled: false, + name: 'Dansk', + tag: 'da', + }, + { + enabled: false, + name: 'Deutsch', + tag: 'de', + }, + { + enabled: false, + name: 'Ελληνικά', + tag: 'el', + }, + { + enabled: true, + name: 'Español', + tag: 'es-ES', + }, + { + enabled: false, + name: 'فارسی', + tag: 'fa-IR', + }, + { + enabled: false, + name: 'Suomi', + tag: 'fi', + }, + { + enabled: false, + name: 'Français', + tag: 'fr', + }, + { + enabled: false, + name: 'עִברִית', + tag: 'he', + }, + { + enabled: false, + name: 'Magyar', + tag: 'hu', + }, + { + enabled: false, + name: 'Bahasa Indonesia', + tag: 'id-ID', + }, + { + enabled: false, + name: 'Italiano', + tag: 'it', + }, + { + enabled: false, + name: 'Afrikaans', + tag: 'af', + }, + { + enabled: false, + name: '한국어', + tag: 'ko', + }, + { + enabled: false, + name: 'मराठी', + tag: 'mr-IN', + }, + { + enabled: false, + name: 'Nederlands', + tag: 'nl', + }, + { + enabled: false, + name: 'Norsk', + tag: 'no-NO', + }, + { + enabled: false, + name: 'Polskie', + tag: 'pl', + }, + { + enabled: false, + name: 'Português', + tag: 'pt-PT', + }, + { + enabled: false, + name: 'Português (Brasil)', + tag: 'pt-BR', + }, + { + enabled: true, + name: 'Română', + tag: 'ro', + }, + { + enabled: false, + name: 'Русский', + tag: 'ru', + }, + { + enabled: false, + name: 'Slovenský', + tag: 'sk-SK', + }, + { + enabled: false, + name: 'Српски језик (Ћирилица)', + tag: 'sr', + }, + { + enabled: false, + name: 'Svenska', + tag: 'sv-SE', + }, + { + enabled: true, + name: 'Türkçe', + tag: 'tr', + }, + { + enabled: false, + name: 'Українська', + tag: 'uk', + }, + { + enabled: false, + name: 'Tiếng Việt', + tag: 'vi', + }, + { + enabled: true, + name: '简体中文', + tag: 'zh-CN', + }, + { + enabled: false, + name: '繁體中文', + tag: 'zh-TW', + }, +]; +module.exports = languages; diff --git a/test/load/__fixtures__/transversioned-site/siteConfig.js b/test/load/__fixtures__/transversioned-site/siteConfig.js new file mode 100644 index 0000000000..e64b9989cf --- /dev/null +++ b/test/load/__fixtures__/transversioned-site/siteConfig.js @@ -0,0 +1,7 @@ +module.exports = { + title: 'Hello', + tagline: 'Hello World', + organizationName: 'endiliey', + projectName: 'hello', + baseUrl: '/' +}; diff --git a/test/load/__fixtures__/transversioned-site/versions.json b/test/load/__fixtures__/transversioned-site/versions.json new file mode 100644 index 0000000000..542b187dfe --- /dev/null +++ b/test/load/__fixtures__/transversioned-site/versions.json @@ -0,0 +1,4 @@ +[ + "1.0.1", + "1.0.0" +] diff --git a/test/load/__fixtures__/versioned-site/siteConfig.js b/test/load/__fixtures__/versioned-site/siteConfig.js new file mode 100644 index 0000000000..e64b9989cf --- /dev/null +++ b/test/load/__fixtures__/versioned-site/siteConfig.js @@ -0,0 +1,7 @@ +module.exports = { + title: 'Hello', + tagline: 'Hello World', + organizationName: 'endiliey', + projectName: 'hello', + baseUrl: '/' +}; diff --git a/test/load/__fixtures__/versioned-site/versions.json b/test/load/__fixtures__/versioned-site/versions.json new file mode 100644 index 0000000000..542b187dfe --- /dev/null +++ b/test/load/__fixtures__/versioned-site/versions.json @@ -0,0 +1,4 @@ +[ + "1.0.1", + "1.0.0" +] diff --git a/test/load/__snapshots__/env.test.js.snap b/test/load/__snapshots__/env.test.js.snap new file mode 100644 index 0000000000..a5dd432d95 --- /dev/null +++ b/test/load/__snapshots__/env.test.js.snap @@ -0,0 +1,119 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`loadEnv website with both versioning & translation disabled 1`] = ` +Object { + "translation": Object { + "enabled": false, + "enabledLanguages": Array [], + }, + "versioning": Object { + "defaultVersion": null, + "enabled": false, + "latestVersion": null, + "versions": Array [], + }, +} +`; + +exports[`loadEnv website with translation enabled 1`] = ` +Object { + "translation": Object { + "enabled": true, + "enabledLanguages": Array [ + Object { + "enabled": true, + "name": "English", + "tag": "en", + }, + Object { + "enabled": true, + "name": "Español", + "tag": "es-ES", + }, + Object { + "enabled": true, + "name": "Română", + "tag": "ro", + }, + Object { + "enabled": true, + "name": "Türkçe", + "tag": "tr", + }, + Object { + "enabled": true, + "name": "简体中文", + "tag": "zh-CN", + }, + ], + }, + "versioning": Object { + "defaultVersion": null, + "enabled": false, + "latestVersion": null, + "versions": Array [], + }, +} +`; + +exports[`loadEnv website with versioning & translation enabled 1`] = ` +Object { + "translation": Object { + "enabled": true, + "enabledLanguages": Array [ + Object { + "enabled": true, + "name": "English", + "tag": "en", + }, + Object { + "enabled": true, + "name": "Español", + "tag": "es-ES", + }, + Object { + "enabled": true, + "name": "Română", + "tag": "ro", + }, + Object { + "enabled": true, + "name": "Türkçe", + "tag": "tr", + }, + Object { + "enabled": true, + "name": "简体中文", + "tag": "zh-CN", + }, + ], + }, + "versioning": Object { + "defaultVersion": "1.0.1", + "enabled": true, + "latestVersion": "1.0.1", + "versions": Array [ + "1.0.1", + "1.0.0", + ], + }, +} +`; + +exports[`loadEnv website with versioning enabled 1`] = ` +Object { + "translation": Object { + "enabled": false, + "enabledLanguages": Array [], + }, + "versioning": Object { + "defaultVersion": "1.0.1", + "enabled": true, + "latestVersion": "1.0.1", + "versions": Array [ + "1.0.1", + "1.0.0", + ], + }, +} +`; diff --git a/test/load/__snapshots__/pages.test.js.snap b/test/load/__snapshots__/pages.test.js.snap index 8fcb8818fc..b52b89dd70 100644 --- a/test/load/__snapshots__/pages.test.js.snap +++ b/test/load/__snapshots__/pages.test.js.snap @@ -2,14 +2,14 @@ exports[`loadPages valid pages 1`] = ` Array [ - Object { - "path": "/foo", - "source": "foo.js", - }, Object { "path": "/", "source": "index.js", }, + Object { + "path": "/foo", + "source": "foo.js", + }, Object { "path": "/bar/baz", "source": "bar/baz.js", diff --git a/test/load/__snapshots__/routes.test.js.snap b/test/load/__snapshots__/routes.test.js.snap index f03e3e2ec6..c9c8cbad84 100644 --- a/test/load/__snapshots__/routes.test.js.snap +++ b/test/load/__snapshots__/routes.test.js.snap @@ -36,10 +36,10 @@ const routes = [ }) }, { - path: \\"/foo/bar\\", + path: \\"/foo/baz\\", exact: true, component: Loadable({ - loader: () => import('@docs/foo/bar.md'), + loader: () => import('@docs/foo/baz.md'), loading: Loading, render(loaded, props) { let Content = loaded.default; @@ -48,10 +48,10 @@ const routes = [ }) }, { - path: \\"/foo/baz\\", + path: \\"/foo/bar\\", exact: true, component: Loadable({ - loader: () => import('@docs/foo/baz.md'), + loader: () => import('@docs/foo/bar.md'), loading: Loading, render(loaded, props) { let Content = loaded.default; @@ -159,14 +159,6 @@ const routes = [ } }) }, - { - path: \\"/foo\\", - exact: true, - component: Loadable({ - loader: () => import('@pages/foo.js'), - loading: Loading - }) - }, { path: \\"/\\", exact: true, @@ -176,10 +168,10 @@ const routes = [ }) }, { - path: \\"/bar/baz\\", + path: \\"/foo\\", exact: true, component: Loadable({ - loader: () => import('@pages/bar/baz.js'), + loader: () => import('@pages/foo.js'), loading: Loading }) }, @@ -191,6 +183,14 @@ const routes = [ loading: Loading }) }, + { + path: \\"/bar/baz\\", + exact: true, + component: Loadable({ + loader: () => import('@pages/bar/baz.js'), + loading: Loading + }) + }, { path: '*', component: NotFound diff --git a/test/load/env.test.js b/test/load/env.test.js new file mode 100644 index 0000000000..577ddb86d8 --- /dev/null +++ b/test/load/env.test.js @@ -0,0 +1,41 @@ +import path from 'path'; +import loadEnv from '@lib/load/env'; +import loadConfig from '@lib/load/config'; + +describe('loadEnv', () => { + test('website with both versioning & translation disabled', () => { + const siteDir = path.join(__dirname, '__fixtures__', 'simple-site'); + const siteConfig = loadConfig(siteDir); + const env = loadEnv({siteDir, siteConfig}); + expect(env.versioning.enabled).toBe(false); + expect(env.translation.enabled).toBe(false); + expect(env).toMatchSnapshot(); + }); + + test('website with versioning enabled', () => { + const siteDir = path.join(__dirname, '__fixtures__', 'versioned-site'); + const siteConfig = loadConfig(siteDir); + const env = loadEnv({siteDir, siteConfig}); + expect(env.versioning.enabled).toBe(true); + expect(env.translation.enabled).toBe(false); + expect(env).toMatchSnapshot(); + }); + + test('website with translation enabled', () => { + const siteDir = path.join(__dirname, '__fixtures__', 'translated-site'); + const siteConfig = loadConfig(siteDir); + const env = loadEnv({siteDir, siteConfig}); + expect(env.versioning.enabled).toBe(false); + expect(env.translation.enabled).toBe(true); + expect(env).toMatchSnapshot(); + }); + + test('website with versioning & translation enabled', () => { + const siteDir = path.join(__dirname, '__fixtures__', 'transversioned-site'); + const siteConfig = loadConfig(siteDir); + const env = loadEnv({siteDir, siteConfig}); + expect(env.versioning.enabled).toBe(true); + expect(env.translation.enabled).toBe(true); + expect(env).toMatchSnapshot(); + }); +});