From 20f29c2644dc46d2bbaa8909dee3ca294273730b Mon Sep 17 00:00:00 2001
From: Pedro Nauck <pedronauck@gmail.com>
Date: Fri, 8 Jun 2018 20:34:02 -0300
Subject: [PATCH] feat(docz-core): add base config argument

---
 .../docz-core/src/bundlers/webpack/config.ts    |  8 +++++++-
 packages/docz-core/src/commands/args.ts         |  6 +++++-
 packages/docz-core/src/config/paths.ts          | 17 ++---------------
 packages/docz/src/theme.tsx                     |  4 +++-
 4 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/packages/docz-core/src/bundlers/webpack/config.ts b/packages/docz-core/src/bundlers/webpack/config.ts
index 9a86515c4..97a93925f 100644
--- a/packages/docz-core/src/bundlers/webpack/config.ts
+++ b/packages/docz-core/src/bundlers/webpack/config.ts
@@ -69,7 +69,7 @@ export const createConfig = (babelrc: BabelRC) => (
     output
       .filename('static/js/[name].[chunkhash:8].js')
       .sourceMapFilename('static/js/[name].[chunkhash:8].js.map')
-      .publicPath(paths.servedPath)
+      .publicPath(paths.servedPath(args.base))
 
   const outputDev = (output: Config.Output) =>
     output
@@ -198,6 +198,12 @@ export const createConfig = (babelrc: BabelRC) => (
     cfg.plugin('friendly-errors').use(friendlyErrors)
   })
 
+  config.plugin('injections').use(require('webpack/lib/DefinePlugin'), [
+    {
+      BASE_URL: JSON.stringify(args.base),
+    },
+  ])
+
   config.performance.hints(false)
   return config
 }
diff --git a/packages/docz-core/src/commands/args.ts b/packages/docz-core/src/commands/args.ts
index d44569142..bba4c0292 100644
--- a/packages/docz-core/src/commands/args.ts
+++ b/packages/docz-core/src/commands/args.ts
@@ -3,10 +3,10 @@ import { Plugin } from '../Plugin'
 
 export interface Argv {
   /* io args */
+  base: string
   src: string
   files: string
   /* bundler args */
-  env: string
   debug: boolean
   typescript: boolean
   propsParser: boolean
@@ -32,6 +32,10 @@ export interface Config extends Argv {
 }
 
 export const args = (yargs: any) => {
+  yargs.positional('base', {
+    type: 'string',
+    default: '/',
+  })
   yargs.positional('source', {
     alias: 'src',
     type: 'string',
diff --git a/packages/docz-core/src/config/paths.ts b/packages/docz-core/src/config/paths.ts
index 6a0e49808..772191e58 100644
--- a/packages/docz-core/src/config/paths.ts
+++ b/packages/docz-core/src/config/paths.ts
@@ -1,10 +1,7 @@
 import * as fs from 'fs'
 import * as path from 'path'
-import * as url from 'url'
 import resolve from 'resolve'
 
-const ENV_PUBLIC_URL = process.env.PUBLIC_URL
-
 const ensureSlash = (filepath: any, needsSlash: boolean) => {
   const hasSlash = filepath.endsWith('/')
 
@@ -17,16 +14,6 @@ const ensureSlash = (filepath: any, needsSlash: boolean) => {
   }
 }
 
-const getPublicUrl = (appPackageJson: string) =>
-  ENV_PUBLIC_URL || require(appPackageJson).homepage
-
-const getServedPath = (appPackageJson: string) => {
-  const publicUrl = getPublicUrl(appPackageJson)
-  const servedUrl =
-    ENV_PUBLIC_URL || (publicUrl ? url.parse(publicUrl).pathname : '/')
-  return ensureSlash(servedUrl, true)
-}
-
 export const root = fs.realpathSync(process.cwd())
 const resolveApp = (to: string) => path.resolve(root, to)
 
@@ -34,7 +21,7 @@ export interface Paths {
   root: string
   templates: string
   packageJson: string
-  servedPath: string
+  servedPath: (base: string) => string
   docz: string
   app: string
   dist: string
@@ -49,7 +36,7 @@ export interface Paths {
 export const templates = path.join(resolve.sync('docz-core'), '../templates')
 
 export const packageJson = resolveApp('package.json')
-export const servedPath = getServedPath(resolveApp('package.json'))
+export const servedPath = (base: string) => ensureSlash(base, true)
 
 export const docz = resolveApp('.docz')
 export const app = path.resolve(docz, 'app/')
diff --git a/packages/docz/src/theme.tsx b/packages/docz/src/theme.tsx
index 76f0c8f47..b542e1f5c 100644
--- a/packages/docz/src/theme.tsx
+++ b/packages/docz/src/theme.tsx
@@ -5,6 +5,8 @@ import merge from 'deepmerge'
 
 import { ComponentsMap } from './components/DocPreview'
 
+declare var BASE_URL: string
+
 export type MSXComponent = CT<{
   components: ComponentsMap
 }>
@@ -67,7 +69,7 @@ export function theme(
 
     return (
       <dataContext.Provider value={value}>
-        <BrowserRouter>
+        <BrowserRouter basename={BASE_URL}>
           <Wrapper>
             <WrappedComponent />
           </Wrapper>