diff options
Diffstat (limited to 'packages')
-rw-r--r-- | packages/gitbook-core/.babelrc | 3 | ||||
-rw-r--r-- | packages/gitbook-core/package.json | 9 | ||||
-rw-r--r-- | packages/gitbook-core/src/components/Application.js | 10 | ||||
-rw-r--r-- | packages/gitbook-core/src/components/InjectedComponent.js | 6 | ||||
-rw-r--r-- | packages/gitbook-core/src/index.js | 2 | ||||
-rw-r--r-- | packages/gitbook-core/src/renderComponent.js | 25 | ||||
-rw-r--r-- | packages/gitbook-plugin-theme-default/index.js | 3 | ||||
-rw-r--r-- | packages/gitbook-plugin-theme-default/package.json | 1 | ||||
-rw-r--r-- | packages/gitbook/.babelrc | 2 | ||||
-rw-r--r-- | packages/gitbook/package.json | 7 | ||||
-rw-r--r-- | packages/gitbook/src/output/website/onPage.js | 19 | ||||
-rw-r--r-- | packages/gitbook/src/output/website/render.js | 44 | ||||
-rw-r--r-- | packages/gitbook/testing/setup.js | 33 |
13 files changed, 121 insertions, 43 deletions
diff --git a/packages/gitbook-core/.babelrc b/packages/gitbook-core/.babelrc new file mode 100644 index 0000000..5f27bda --- /dev/null +++ b/packages/gitbook-core/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015", "react", "stage-2"] +} diff --git a/packages/gitbook-core/package.json b/packages/gitbook-core/package.json index 16de7c6..6e6c2e7 100644 --- a/packages/gitbook-core/package.json +++ b/packages/gitbook-core/package.json @@ -7,8 +7,15 @@ "immutable": "^3.8.1", "react": "^15.3.1", "react-dom": "^15.3.1", + "react-helmet": "^3.1.0", "react-redux": "^4.4.5", - "redux": "^3.5.2" + "redux": "^3.5.2", + "redux-thunk": "^2.1.0" + }, + "devDependencies": { + "babel-preset-es2015": "^6.14.0", + "babel-preset-react": "^6.11.1", + "babel-preset-stage-2": "^6.13.0" }, "repository": { "type": "git", diff --git a/packages/gitbook-core/src/components/Application.js b/packages/gitbook-core/src/components/Application.js deleted file mode 100644 index 3414a37..0000000 --- a/packages/gitbook-core/src/components/Application.js +++ /dev/null @@ -1,10 +0,0 @@ -const React = require('react'); -const { InjectedComponent } = require('./components/InjectedComponent'); - -const Application = React.createClass({ - render() { - return <InjectedComponent matching={{ role: 'Body' }} /> - } -}); - -module.exports = Application; diff --git a/packages/gitbook-core/src/components/InjectedComponent.js b/packages/gitbook-core/src/components/InjectedComponent.js index f8e5b04..39b48b2 100644 --- a/packages/gitbook-core/src/components/InjectedComponent.js +++ b/packages/gitbook-core/src/components/InjectedComponent.js @@ -1,5 +1,5 @@ const React = require('react'); -const connect = require('./connect'); +const ReactRedux = require('react-redux'); const UnsafeComponent = require('./UnsafeComponent'); const { findMatchingComponents } = require('../actions/components'); @@ -65,11 +65,11 @@ function mapStateToProps(state, props) { } module.exports = { - InjectedComponent: connect(InjectedComponentSet, (state, props) => { + InjectedComponent: ReactRedux.connect(InjectedComponentSet, (state, props) => { const result = mapStateToProps(state, props); result.components = result.components.slice(0, 1); result.withContainer = false; return result; }), - InjectedComponentSet: connect(InjectedComponentSet, mapStateToProps) + InjectedComponentSet: ReactRedux.connect(InjectedComponentSet, mapStateToProps) }; diff --git a/packages/gitbook-core/src/index.js b/packages/gitbook-core/src/index.js index dcd7580..4a2f21f 100644 --- a/packages/gitbook-core/src/index.js +++ b/packages/gitbook-core/src/index.js @@ -5,6 +5,7 @@ const connect = require('./connect'); const createPlugin = require('./createPlugin'); const createReducer = require('./createReducer'); const createStore = require('./createStore'); +const renderComponent = require('./renderComponent'); module.exports = { ACTIONS, @@ -12,6 +13,7 @@ module.exports = { createPlugin, createReducer, createStore, + renderComponent, registerComponent, InjectedComponent, InjectedComponentSet diff --git a/packages/gitbook-core/src/renderComponent.js b/packages/gitbook-core/src/renderComponent.js new file mode 100644 index 0000000..365a037 --- /dev/null +++ b/packages/gitbook-core/src/renderComponent.js @@ -0,0 +1,25 @@ +const React = require('react'); +const Helmet = require('react-helmet'); +const ReactRedux = require('react-redux'); +const { InjectedComponent } = require('./components/InjectedComponent'); + +/** + * Render a registered component from a store. + * This method is intended for server-side use in "gitbook". + * + * @param {ReduxStore} store + * @param {Descriptor} matching + * @return {Object} { el, meta } + */ +function renderComponent(store, matching) { + const el = ( + <ReactRedux.Provider store={store}> + <InjectedComponent matching={matching} /> + </ReactRedux.Provider> + ); + const head = Helmet.rewind(); + + return { el, head }; +} + +module.exports = renderComponent; diff --git a/packages/gitbook-plugin-theme-default/index.js b/packages/gitbook-plugin-theme-default/index.js new file mode 100644 index 0000000..f4d6253 --- /dev/null +++ b/packages/gitbook-plugin-theme-default/index.js @@ -0,0 +1,3 @@ +module.exports = { + +}; diff --git a/packages/gitbook-plugin-theme-default/package.json b/packages/gitbook-plugin-theme-default/package.json index cbf1516..5ee288b 100644 --- a/packages/gitbook-plugin-theme-default/package.json +++ b/packages/gitbook-plugin-theme-default/package.json @@ -2,6 +2,7 @@ "name": "gitbook-plugin-theme-default", "description": "Default theme for GitBook", "main": "./index.js", + "browser": "./src/index.js", "version": "1.0.5", "engines": { "gitbook": ">=3.0.0" diff --git a/packages/gitbook/.babelrc b/packages/gitbook/.babelrc index d4e5f8d..5f27bda 100644 --- a/packages/gitbook/.babelrc +++ b/packages/gitbook/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["es2015", "react"] + "presets": ["es2015", "react", "stage-2"] } diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index 27eda49..29fa9ce 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -67,7 +67,7 @@ "urijs": "1.18.0" }, "scripts": { - "test": "./node_modules/.bin/mocha ./testing/setup.js \"./lib/**/*/__tests__/*.js\" --bail --reporter=list --timeout=10000", + "test": "./node_modules/.bin/mocha ./testing/setup.js \"./src/**/*/__tests__/*.js\" --bail --reporter=list --timeout=10000 --compilers js:babel-register", "dist": "rm -rf lib/ && babel --presets es2015 -d lib/ src/", "prepublish": "npm run dist" }, @@ -101,6 +101,9 @@ "devDependencies": { "babel-cli": "^6.14.0", "babel-preset-es2015": "^6.14.0", - "babel-preset-react": "^6.11.1" + "babel-preset-react": "^6.11.1", + "babel-preset-stage-2": "^6.13.0", + "babel-register": "^6.14.0", + "mocha": "^3.0.2" } } diff --git a/packages/gitbook/src/output/website/onPage.js b/packages/gitbook/src/output/website/onPage.js index 3b40536..41c4b1b 100644 --- a/packages/gitbook/src/output/website/onPage.js +++ b/packages/gitbook/src/output/website/onPage.js @@ -7,9 +7,10 @@ const JSONUtils = require('../../json'); const LocationUtils = require('../../utils/location'); const Modifiers = require('../modifiers'); const writeFile = require('../helper/writeFile'); +const fileToOutput = require('../helper/fileToOutput'); const getModifiers = require('../getModifiers'); const createTemplateEngine = require('./createTemplateEngine'); -const fileToOutput = require('../helper/fileToOutput'); +const render = require('./render'); /** * Write a page as a json file @@ -40,12 +41,12 @@ function onPage(output, page) { return Modifiers.modifyHTML(page, getModifiers(output, page)) .then(function(resultPage) { // Generate the context - const context = JSONUtils.encodeOutputWithPage(output, resultPage); - context.plugins = { + const initialState = JSONUtils.encodeOutputWithPage(output, resultPage); + initialState.plugins = { resources: Plugins.listResources(plugins, resources).toJS() }; - context.template = { + /*context.template = { getJSContext() { return { page: omit(context.page, 'content'), @@ -58,18 +59,16 @@ function onPage(output, page) { } }; } - }; + };*/ // We should probabbly move it to "template" or a "site" namespace - context.basePath = basePath; + // context.basePath = basePath; // Render the theme - return Templating.renderFile(engine, prefix + '/page.html', context) + const html = render(initialState); // Write it to the disk - .then(function(tplOut) { - return writeFile(output, filePath, tplOut.getContent()); - }); + return writeFile(output, filePath, html); }); } diff --git a/packages/gitbook/src/output/website/render.js b/packages/gitbook/src/output/website/render.js new file mode 100644 index 0000000..dc674ab --- /dev/null +++ b/packages/gitbook/src/output/website/render.js @@ -0,0 +1,44 @@ +const React = require('react'); +const ReactDOMServer = require('react-dom/server'); +const GitBook = require('gitbook-core'); + +function HTML({head, innerHTML}) { + const attrs = head.htmlAttributes.toComponent(); + + return ( + <html {...attrs}> + <head> + {head.title.toComponent()} + {head.meta.toComponent()} + {head.link.toComponent()} + </head> + <body> + <div id="content" dangerouslySetInnerHTML={{__html: innerHTML}} /> + </body> + </html> + ); +} +HTML.propTypes = { + head: React.PropTypes.object, + innerHTML: React.PropTypes.string +}; + +/** + * Render a page + * @param {Object} initialState + * @return {String} html + */ +function render(initialState) { + const plugins = []; + const store = GitBook.createStore(plugins, initialState); + const { el, head } = GitBook.renderComponent(store, { + role: 'Body' + }); + + const innerHTML = ReactDOMServer.renderToString(el); + const htmlEl = <HTML head={head} innerHTML={innerHTML} />; + + return ReactDOMServer.renderToStaticMarkup(htmlEl); +} + +module.exports = render; diff --git a/packages/gitbook/testing/setup.js b/packages/gitbook/testing/setup.js index 1105002..ee1485e 100644 --- a/packages/gitbook/testing/setup.js +++ b/packages/gitbook/testing/setup.js @@ -1,17 +1,18 @@ -var is = require('is'); -var path = require('path'); -var fs = require('fs'); -var expect = require('expect'); -var cheerio = require('cheerio'); +const is = require('is'); +const path = require('path'); +const fs = require('fs'); +const expect = require('expect'); +const cheerio = require('cheerio'); expect.extend({ + /** * Check that a file is created in a directory: * expect('myFolder').toHaveFile('hello.md'); */ - toHaveFile: function(fileName) { - var filePath = path.join(this.actual, fileName); - var exists = fs.existsSync(filePath); + toHaveFile(fileName) { + const filePath = path.join(this.actual, fileName); + const exists = fs.existsSync(filePath); expect.assert( exists, @@ -21,9 +22,9 @@ expect.extend({ ); return this; }, - toNotHaveFile: function(fileName) { - var filePath = path.join(this.actual, fileName); - var exists = fs.existsSync(filePath); + toNotHaveFile(fileName) { + const filePath = path.join(this.actual, fileName); + const exists = fs.existsSync(filePath); expect.assert( !exists, @@ -37,7 +38,7 @@ expect.extend({ /** * Check that a value is defined (not null nor undefined) */ - toBeDefined: function() { + toBeDefined() { expect.assert( !(is.undefined(this.actual) || is.null(this.actual)), 'expected to be defined' @@ -48,7 +49,7 @@ expect.extend({ /** * Check that a value is defined (not null nor undefined) */ - toNotBeDefined: function() { + toNotBeDefined() { expect.assert( (is.undefined(this.actual) || is.null(this.actual)), 'expected %s to be not defined', @@ -61,9 +62,9 @@ expect.extend({ * Check that a dom element exists in HTML * @param {String} selector */ - toHaveDOMElement: function(selector) { - var $ = cheerio.load(this.actual); - var $el = $(selector); + toHaveDOMElement(selector) { + const $ = cheerio.load(this.actual); + const $el = $(selector); expect.assert($el.length > 0, 'expected HTML to contains %s', selector); } |