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
{children}
} export default class Document extends Component { static getInitialProps ({ renderPage }) { const { html, head, errorHtml, chunks } = renderPage() const styles = flush() return { html, head, errorHtml, chunks, styles } } static childContextTypes = { _documentProps: PropTypes.any } getChildContext () { return { _documentProps: this.props } } render () { return
} } export class Head extends Component { static contextTypes = { _documentProps: PropTypes.any } getChunkPreloadLink (filename) { const { __NEXT_DATA__ } = this.context._documentProps let { buildStats, assetPrefix, buildId } = __NEXT_DATA__ const hash = buildStats ? buildStats[filename].hash : buildId return ( ) } getPreloadMainLinks () { const { dev } = this.context._documentProps if (dev) { return [ this.getChunkPreloadLink('manifest.js'), this.getChunkPreloadLink('commons.js'), this.getChunkPreloadLink('main.js') ] } // In the production mode, we have a single asset with all the JS content. return [ this.getChunkPreloadLink('app.js') ] } getPreloadDynamicChunks () { const { chunks, __NEXT_DATA__ } = this.context._documentProps let { assetPrefix } = __NEXT_DATA__ return chunks.filenames.map((chunk) => ( )) } render () { const { head, styles, __NEXT_DATA__ } = this.context._documentProps const { page, pathname, buildId, assetPrefix } = __NEXT_DATA__ const pagePathname = getPagePathname(pathname) return {(head || []).map((h, i) => React.cloneElement(h, { key: h.key || i }))} {page !== '_error' && } {this.getPreloadDynamicChunks()} {this.getPreloadMainLinks()} {styles || null} {this.props.children} } } export class Main extends Component { static contextTypes = { _documentProps: PropTypes.any } render () { const { html, errorHtml } = this.context._documentProps return (
) } } export class NextScript extends Component { static propTypes = { nonce: PropTypes.string } static contextTypes = { _documentProps: PropTypes.any } getChunkScript (filename, additionalProps = {}) { const { __NEXT_DATA__ } = this.context._documentProps let { buildStats, assetPrefix, buildId } = __NEXT_DATA__ const hash = buildStats ? buildStats[filename].hash : buildId return (