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 });