2018-10-02 22:08:57 +00:00
/* eslint-disable */
import React , { Component } from 'react'
import PropTypes from 'prop-types'
import htmlescape from 'htmlescape'
import flush from 'styled-jsx/server'
const Fragment = React . Fragment || function Fragment ( { children } ) {
return < div > { children } < / d i v >
}
export default class Document extends Component {
static childContextTypes = {
_documentProps : PropTypes . any
}
static getInitialProps ( { renderPage } ) {
const { html , head , buildManifest } = renderPage ( )
const styles = flush ( )
return { html , head , styles , buildManifest }
}
getChildContext ( ) {
return { _documentProps : this . props }
}
render ( ) {
return < html >
< Head / >
< body >
< Main / >
< NextScript / >
< / b o d y >
< / h t m l >
}
}
export class Head extends Component {
static contextTypes = {
_documentProps : PropTypes . any
}
static propTypes = {
nonce : PropTypes . string
}
getCssLinks ( ) {
const { assetPrefix , files } = this . context . _documentProps
if ( ! files || files . length === 0 ) {
return null
}
return files . map ( ( file ) => {
// Only render .css files here
if ( ! /\.css$/ . exec ( file ) ) {
return null
}
return < link
key = { file }
nonce = { this . props . nonce }
rel = 'stylesheet'
href = { ` ${ assetPrefix } /_next/ ${ file } ` }
/ >
} )
}
getPreloadDynamicChunks ( ) {
const { dynamicImports , assetPrefix } = this . context . _documentProps
return dynamicImports . map ( ( bundle ) => {
return < link
rel = 'preload'
key = { bundle . file }
href = { ` ${ assetPrefix } /_next/ ${ bundle . file } ` }
as = 'script'
nonce = { this . props . nonce }
/ >
} )
}
getPreloadMainLinks ( ) {
const { assetPrefix , files } = this . context . _documentProps
if ( ! files || files . length === 0 ) {
return null
}
return files . map ( ( file ) => {
// Only render .js files here
if ( ! /\.js$/ . exec ( file ) ) {
return null
}
return < link
key = { file }
nonce = { this . props . nonce }
rel = 'preload'
href = { ` ${ assetPrefix } /_next/ ${ file } ` }
as = 'script'
/ >
} )
}
render ( ) {
const { head , styles , assetPrefix , _ _NEXT _DATA _ _ } = this . context . _documentProps
const { page , pathname , buildId } = _ _NEXT _DATA _ _
const pagePathname = getPagePathname ( pathname )
let children = this . props . children
// show a warning if Head contains <title> (only in development)
if ( process . env . NODE _ENV !== 'production' ) {
children = React . Children . map ( children , ( child ) => {
if ( child && child . type === 'title' ) {
console . warn ( "Warning: <title> should not be used in _document.js's <Head>. https://err.sh/next.js/no-document-title" )
}
return child
} )
}
return < head { ... this . props } >
{ head }
{ page !== '/_error' && < link rel = 'preload' href = { ` ${ assetPrefix } /_next/static/ ${ buildId } /pages ${ pagePathname } ` } as = 'script' nonce = { this . props . nonce } / > }
< link rel = 'preload' href = { ` ${ assetPrefix } /_next/static/ ${ buildId } /pages/_app.js ` } as = 'script' nonce = { this . props . nonce } / >
< link rel = 'preload' href = { ` ${ assetPrefix } /_next/static/ ${ buildId } /pages/_error.js ` } as = 'script' nonce = { this . props . nonce } / >
{ this . getPreloadDynamicChunks ( ) }
{ this . getPreloadMainLinks ( ) }
{ this . getCssLinks ( ) }
{ styles || null }
{ children }
< / h e a d >
}
}
export class Main extends Component {
static contextTypes = {
_documentProps : PropTypes . any
}
render ( ) {
const { html } = this . context . _documentProps
return (
< div id = '__next' dangerouslySetInnerHTML = { { _ _html : html } } / >
)
}
}
export class NextScript extends Component {
static contextTypes = {
_documentProps : PropTypes . any
}
static propTypes = {
nonce : PropTypes . string
}
getDynamicChunks ( ) {
const { dynamicImports , assetPrefix } = this . context . _documentProps
return dynamicImports . map ( ( bundle ) => {
return < script
async
key = { bundle . file }
src = { ` ${ assetPrefix } /_next/ ${ bundle . file } ` }
nonce = { this . props . nonce }
/ >
} )
}
getScripts ( ) {
const { assetPrefix , files } = this . context . _documentProps
if ( ! files || files . length === 0 ) {
return null
}
return files . map ( ( file ) => {
// Only render .js files here
if ( ! /\.js$/ . exec ( file ) ) {
return null
}
return < script
key = { file }
src = { ` ${ assetPrefix } /_next/ ${ file } ` }
nonce = { this . props . nonce }
async
/ >
} )
}
static getInlineScriptSource ( documentProps ) {
const { _ _NEXT _DATA _ _ } = documentProps
const { page , pathname } = _ _NEXT _DATA _ _
return ` __NEXT_DATA__ = ${ htmlescape ( _ _NEXT _DATA _ _ ) } ;__NEXT_LOADED_PAGES__=[];__NEXT_REGISTER_PAGE=function(r,f){__NEXT_LOADED_PAGES__.push([r, f])} ${ page === '/_error' ? ` ;__NEXT_REGISTER_PAGE( ${ htmlescape ( pathname ) } ,function(){var e = new Error('Page does not exist: ${ htmlescape ( pathname ) } ');e.statusCode=404;return {error:e}}) ` : '' } `
}
render ( ) {
const { staticMarkup , assetPrefix , devFiles , _ _NEXT _DATA _ _ } = this . context . _documentProps
const { page , pathname , buildId } = _ _NEXT _DATA _ _
const pagePathname = getPagePathname ( pathname )
return < Fragment >
{ devFiles ? devFiles . map ( ( file ) => < script key = { file } src = { ` ${ assetPrefix } /_next/ ${ file } ` } nonce = { this . props . nonce } / > ) : null }
{ staticMarkup ? null : < script nonce = { this . props . nonce } dangerouslySetInnerHTML = { {
_ _html : NextScript . getInlineScriptSource ( this . context . _documentProps )
} } / > }
{ page !== '/_error' && < script async id = { ` __NEXT_PAGE__ ${ pathname } ` } src = { ` ${ assetPrefix } /_next/static/ ${ buildId } /pages ${ pagePathname } ` } nonce = { this . props . nonce } / > }
< script async id = { ` __NEXT_PAGE__/_app ` } src = { ` ${ assetPrefix } /_next/static/ ${ buildId } /pages/_app.js ` } nonce = { this . props . nonce } / >
< script async id = { ` __NEXT_PAGE__/_error ` } src = { ` ${ assetPrefix } /_next/static/ ${ buildId } /pages/_error.js ` } nonce = { this . props . nonce } / >
{ staticMarkup ? null : this . getDynamicChunks ( ) }
{ staticMarkup ? null : this . getScripts ( ) }
< / F r a g m e n t >
}
}
function getPagePathname ( pathname ) {
if ( pathname === '/' ) {
return '/index.js'
}
return ` ${ pathname } .js `
}