diff --git a/lib/components/App.js b/lib/components/App.js new file mode 100644 index 0000000..44ae680 --- /dev/null +++ b/lib/components/App.js @@ -0,0 +1,9 @@ +import React from "react"; +import PropTypes from "prop-types"; + +export const App = ({ children, port }) => {children}; + +App.propTypes = { + port: PropTypes.number, + children: PropTypes.node, +}; diff --git a/lib/components/Router.js b/lib/components/Router.js new file mode 100644 index 0000000..5d612a7 --- /dev/null +++ b/lib/components/Router.js @@ -0,0 +1,27 @@ +import React from "react"; +import PropTypes from "prop-types"; + +export const Router = ({ + path, + caseSensitive, + mergeParams, + strict, + children, +}) => ( + + {children} + +); + +Router.propTypes = { + path: PropTypes.string.isRequired, + caseSensitive: PropTypes.bool, + mergeParams: PropTypes.bool, + strict: PropTypes.bool, + children: PropTypes.node, +}; diff --git a/lib/components/Routes.js b/lib/components/Routes.js new file mode 100644 index 0000000..8fcbe77 --- /dev/null +++ b/lib/components/Routes.js @@ -0,0 +1,46 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { METHODS } from "../renderer/helpers"; + +const BaseRoute = (method) => { + const RouteComponent = ({ path, content, children }) => ( + + {children} + + ); + + RouteComponent.propTypes = { + path: PropTypes.string, + content: PropTypes.any, + handler: PropTypes.func, + }; + + return RouteComponent; +}; + +export const Get = BaseRoute("get"); +export const Post = BaseRoute("post"); +export const Put = BaseRoute("put"); +export const Head = BaseRoute("head"); +export const Delete = BaseRoute("delete"); +export const Options = BaseRoute("options"); +export const Trace = BaseRoute("trace"); +export const Copy = BaseRoute("copy"); +export const Lock = BaseRoute("lock"); +export const Mkcol = BaseRoute("mkcol"); +export const Move = BaseRoute("move"); +export const Purge = BaseRoute("purge"); +export const Propfind = BaseRoute("propfind"); +export const Proppatch = BaseRoute("proppatch"); +export const Unlock = BaseRoute("unlock"); +export const Report = BaseRoute("report"); +export const Mkactivity = BaseRoute("mkactivity"); +export const Checkout = BaseRoute("checkout"); +export const Merge = BaseRoute("merge"); +export const Msearch = BaseRoute("m-search"); +export const Notify = BaseRoute("notify"); +export const Subscribe = BaseRoute("subscribe"); +export const Unsubscribe = BaseRoute("unsubscribe"); +export const Patch = BaseRoute("patch"); +export const Search = BaseRoute("search"); +export const Connect = BaseRoute("connect"); diff --git a/lib/components/Static.js b/lib/components/Static.js new file mode 100644 index 0000000..7819e36 --- /dev/null +++ b/lib/components/Static.js @@ -0,0 +1,12 @@ +import React from "react"; +import PropTypes from "prop-types"; + +export const Static = ({ publicPath, path, options }) => ( + +); + +Static.propTypes = { + publicPath: PropTypes.string.isRequired, + path: PropTypes.string, + options: PropTypes.object, +}; diff --git a/lib/components/index.js b/lib/components/index.js new file mode 100644 index 0000000..20ccde5 --- /dev/null +++ b/lib/components/index.js @@ -0,0 +1,4 @@ +export * from "./App"; +export * from "./Static"; +export * from "./Router"; +export * from "./Routes"; diff --git a/lib/context.js b/lib/context.js new file mode 100644 index 0000000..f86c32c --- /dev/null +++ b/lib/context.js @@ -0,0 +1,3 @@ +import { createContext } from "react"; + +export const ReqResContext = createContext({ req: null, res: null }); diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..a62b2d3 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,3 @@ +export * from "./renderer"; +export * from "./components"; +export * from "./context"; diff --git a/src/renderer/generateRoute.js b/lib/renderer/generateRoute.js similarity index 85% rename from src/renderer/generateRoute.js rename to lib/renderer/generateRoute.js index 8023fad..b624f1c 100644 --- a/src/renderer/generateRoute.js +++ b/lib/renderer/generateRoute.js @@ -2,16 +2,16 @@ import React from "react"; import { renderToString } from "react-dom/server"; import { ServerStyleSheet } from "styled-components"; import { Helmet } from "react-helmet"; -import { context } from "../context"; +import { ReqResContext } from "../context"; const sheet = new ServerStyleSheet(); function renderPage(Component, req, res) { const app = renderToString( sheet.collectStyles( - + - + ) ); const styleTags = sheet.getStyleTags(); @@ -37,8 +37,8 @@ function renderPage(Component, req, res) { res.send(html); } -export function generateRoute(parentInstance, method, props) { - parentInstance.routerInstance[method]( +export function generateRoute(parentInstance, props) { + parentInstance.routerInstance[props.method]( props.path || "/", ...[ ...(props.middlewares || []), diff --git a/src/renderer/helpers.js b/lib/renderer/helpers.js similarity index 83% rename from src/renderer/helpers.js rename to lib/renderer/helpers.js index 22f60be..df5db1f 100644 --- a/src/renderer/helpers.js +++ b/lib/renderer/helpers.js @@ -34,13 +34,15 @@ export const colors = { export function log(type, msg) { switch (type) { case "success": - console.log(`${colors.fg.green}${colors.bright}${msg}${colors.reset}`); + console.log( + `${colors.fg.green}${colors.bright}[ReactXpress] ${msg}${colors.reset}` + ); break; case "warn": - console.log(`${colors.fg.yellow}${msg}${colors.reset}`); + console.log(`${colors.fg.yellow}[ReactXpress] ${msg}${colors.reset}`); break; default: - console.log(msg); + console.log(`[ReactXpress] ${msg}`); break; } } diff --git a/src/renderer/index.js b/lib/renderer/index.js similarity index 94% rename from src/renderer/index.js rename to lib/renderer/index.js index fd01bfd..2d8e0cc 100644 --- a/src/renderer/index.js +++ b/lib/renderer/index.js @@ -42,9 +42,9 @@ let reconciler = ReactReconciler({ return { routerInstance: router, path: props.path }; } - if (METHODS.includes(type)) { + if (type === "route") { return { - method: type, + type, props, }; } @@ -73,8 +73,8 @@ let reconciler = ReactReconciler({ return; } - if (child.method) { - generateRoute(parentInstance, child.method, child.props); + if (child.type === "route") { + generateRoute(parentInstance, child.props); return; } @@ -158,12 +158,10 @@ let reconciler = ReactReconciler({ clearContainer(container, child) {}, }); -let ReactExpress = { +export const ReactXpress = { render(app) { log("success", `starting...`); let container = reconciler.createContainer(null, false, false); reconciler.updateContainer(app, container, null, null); }, }; - -export default ReactExpress; diff --git a/package-lock.json b/package-lock.json index 3d80cec..f1a9e7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "custom-renderer", + "name": "react-express-renderer", "version": "1.0.0", "lockfileVersion": 1, "requires": true, diff --git a/package.json b/package.json index 0d0a731..1922f6b 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "license": "ISC", "dependencies": { "express": "^4.17.1", + "prop-types": "^15.7.2", "react": "^17.0.1", "react-dom": "^17.0.1", "react-helmet": "^6.1.0", diff --git a/src/app.js b/src/app.js index 71a94ef..f85cc2f 100644 --- a/src/app.js +++ b/src/app.js @@ -1,22 +1,22 @@ import React from "react"; import { HomePage } from "./pages/HomePage"; import { ComponentsPage } from "./pages/ComponentsPage"; -import ReactExpress from "./renderer"; +import { ReactXpress, App, Static, Router, Get, Post } from "../lib"; const ExpressApp = () => ( - - - - - - - - - - - - - + + + + + + + + + + + + + ); -ReactExpress.render(); +ReactXpress.render(); diff --git a/src/components/layout/TopNav.js b/src/components/layout/TopNav.js index d0fc40a..1110d58 100644 --- a/src/components/layout/TopNav.js +++ b/src/components/layout/TopNav.js @@ -1,9 +1,9 @@ import React, { useContext } from "react"; import styled from "styled-components"; -import { context } from "../../context"; +import { ReqResContext } from "../../../lib"; export const TopNav = () => { - const { req } = useContext(context); + const { req } = useContext(ReqResContext); return ( diff --git a/src/context.js b/src/context.js deleted file mode 100644 index 90e89c6..0000000 --- a/src/context.js +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from "react"; - -export const context = createContext({ req: null, res: null });