From 57bac3b12c196870ac4d45069827ebceec2dee13 Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 02:20:46 +0400 Subject: [PATCH 1/8] updates & renamed to react-end --- .babelrc | 13 +- .eslintrc | 3 +- .gitignore | 4 +- README.md | 36 +- {src => app}/app.js | 16 +- {src => app}/components/layout/BaseLayout.js | 0 {src => app}/components/layout/GlobalStyle.js | 0 {src => app}/components/layout/TopNav.js | 2 +- app/index.js | 15 + {src => app}/pages/AboutPage.js | 0 {src => app}/pages/ComponentsPage.js | 0 {src => app}/pages/HomePage.js | 0 {src => app}/theme.js | 0 examples/advanced/components.js | 11 - examples/advanced/handlers.js | 23 - examples/advanced/index.js | 16 - examples/advanced/package-lock.json | 21 - examples/advanced/package.json | 15 - examples/basic/index.js | 20 - lib/index.js | 753 +++++++++++++++++- lib/renderer/generateRoute.js | 94 --- package-lock.json | 305 +++++-- package.json | 34 +- rollup.config.js | 27 + {lib => src}/components/App.js | 0 src/components/Head.js | 3 + src/components/Logger.js | 16 + src/components/Middleware.js | 7 + {lib => src}/components/Res.js | 14 +- {lib => src}/components/Router.js | 0 {lib => src}/components/Routes.js | 0 {lib => src}/components/Static.js | 0 {lib => src}/components/index.js | 2 + {lib => src}/context.js | 0 src/index.js | 3 + src/renderer/generateRoute.js | 58 ++ {lib => src}/renderer/helpers.js | 8 +- {lib => src}/renderer/index.js | 80 +- src/renderer/renderHTML.js | 16 + src/renderer/renderPage.js | 22 + 40 files changed, 1284 insertions(+), 353 deletions(-) rename {src => app}/app.js (70%) rename {src => app}/components/layout/BaseLayout.js (100%) rename {src => app}/components/layout/GlobalStyle.js (100%) rename {src => app}/components/layout/TopNav.js (97%) create mode 100644 app/index.js rename {src => app}/pages/AboutPage.js (100%) rename {src => app}/pages/ComponentsPage.js (100%) rename {src => app}/pages/HomePage.js (100%) rename {src => app}/theme.js (100%) delete mode 100644 examples/advanced/components.js delete mode 100644 examples/advanced/handlers.js delete mode 100644 examples/advanced/index.js delete mode 100644 examples/advanced/package-lock.json delete mode 100644 examples/advanced/package.json delete mode 100644 examples/basic/index.js delete mode 100644 lib/renderer/generateRoute.js create mode 100644 rollup.config.js rename {lib => src}/components/App.js (100%) create mode 100644 src/components/Head.js create mode 100644 src/components/Logger.js create mode 100644 src/components/Middleware.js rename {lib => src}/components/Res.js (58%) rename {lib => src}/components/Router.js (100%) rename {lib => src}/components/Routes.js (100%) rename {lib => src}/components/Static.js (100%) rename {lib => src}/components/index.js (68%) rename {lib => src}/context.js (100%) create mode 100644 src/index.js create mode 100644 src/renderer/generateRoute.js rename {lib => src}/renderer/helpers.js (82%) rename {lib => src}/renderer/index.js (71%) create mode 100644 src/renderer/renderHTML.js create mode 100644 src/renderer/renderPage.js diff --git a/.babelrc b/.babelrc index 558736d..715744e 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,13 @@ { - "presets": ["@babel/preset-env"], + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "esmodules": true + } + } + ] + ], "plugins": ["@babel/plugin-transform-react-jsx"] -} +} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index 8b5beb1..dc0266c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -12,5 +12,6 @@ "jsx-a11y/alt-text": 0, "import/prefer-default-export": 0, "import/no-extraneous-dependencies": 0 - } + }, + "ignorePatterns": "/lib" } diff --git a/.gitignore b/.gitignore index 55371e5..0da7201 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules -.vscode \ No newline at end of file +.vscode +.npmrc +lib \ No newline at end of file diff --git a/README.md b/README.md index 87412c4..52992cb 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ -# ReactXpress +# React-end -**React renderer to build Node.js server** +React http-server based on Express.js
![Planet Express](public/logo.svg) +## Install + +`npm i --save @react-end/express` + ### Why? It's the only crazy idea to use React to structure Backend on Node.js. @@ -19,8 +23,7 @@ It works with express.js framework to run Node.js server. Custom renderer we hav ```js import React from 'react'; -import { resolve } from 'path'; -import { ReactXpress, App, Static, Router, Get, Post, Res } from '../lib'; +import { registerApp, App, Static, Router, Get, Post, Res } from '@react-end/express'; const HomePage = () =>

Home page

; const AboutPage = () =>

About Page

; @@ -44,7 +47,14 @@ const ExpressApp = () => ( ); -// Updates! 🤩 +registerApp(ExpressApp); +``` + +
+ +## You can use this way too + +```js const Updates = () => ( <> @@ -62,17 +72,8 @@ const Updates = () => ( ); - -ReactXpress.render(); ``` -### How to use - -1. Clone the repo -2. `npm install` -3. Run dev mode - `npm run dev` -4. Do all changes in `./src` folder as it's not library yet. - ### Components `` - App Instance (props: port) @@ -88,13 +89,6 @@ ReactXpress.render();

-### What is planning? - -I work on it and I'm trying to improve it, even it's not a good idea to use this kinda renderer for real-world app. But It would be awesome to have contributors to make its DX much better. - ### Contact me Email me if you have any idea and you would like to be contributor [orkhanjafarovr@gmail.com](mailto:orkhanjafarovr@gmail.com) - -Resources:
-https://dev.to/orkhanjafarovr/express-in-react-react-backend-whut-4lkg diff --git a/src/app.js b/app/app.js similarity index 70% rename from src/app.js rename to app/app.js index add39a2..ce5b6fa 100644 --- a/src/app.js +++ b/app/app.js @@ -1,15 +1,23 @@ import React from 'react'; import { resolve } from 'path'; -import { ReactXpress, App, Static, Router, Get, Post, Res } from '../lib'; +import cors from 'cors'; +import { registerApp, App, Static, Router, Get, Post, Res, Logger, Middleware } from '../src'; import { HomePage } from './pages/HomePage'; import { ComponentsPage } from './pages/ComponentsPage'; +const isProd = process.env.NODE_ENV === 'production'; + const ExpressApp = () => ( - + + + - + + + + ( ); -ReactXpress.render(); +registerApp(ExpressApp); diff --git a/src/components/layout/BaseLayout.js b/app/components/layout/BaseLayout.js similarity index 100% rename from src/components/layout/BaseLayout.js rename to app/components/layout/BaseLayout.js diff --git a/src/components/layout/GlobalStyle.js b/app/components/layout/GlobalStyle.js similarity index 100% rename from src/components/layout/GlobalStyle.js rename to app/components/layout/GlobalStyle.js diff --git a/src/components/layout/TopNav.js b/app/components/layout/TopNav.js similarity index 97% rename from src/components/layout/TopNav.js rename to app/components/layout/TopNav.js index d10be2b..41a2104 100644 --- a/src/components/layout/TopNav.js +++ b/app/components/layout/TopNav.js @@ -1,6 +1,6 @@ import React, { useContext, useMemo } from 'react'; import styled from 'styled-components'; -import { ReqResContext } from '../../../lib'; +import { ReqResContext } from '../../../src'; const PAGES = [ { path: '/', label: 'Home', title: '@orkhanjafarovr' }, diff --git a/app/index.js b/app/index.js new file mode 100644 index 0000000..a8cb381 --- /dev/null +++ b/app/index.js @@ -0,0 +1,15 @@ +require('@babel/register')({ + presets: [ + [ + '@babel/preset-env', + { + targets: { + esmodules: true, + }, + }, + ], + ], + plugins: ['@babel/plugin-transform-react-jsx'], +}); + +require('./app.js'); diff --git a/src/pages/AboutPage.js b/app/pages/AboutPage.js similarity index 100% rename from src/pages/AboutPage.js rename to app/pages/AboutPage.js diff --git a/src/pages/ComponentsPage.js b/app/pages/ComponentsPage.js similarity index 100% rename from src/pages/ComponentsPage.js rename to app/pages/ComponentsPage.js diff --git a/src/pages/HomePage.js b/app/pages/HomePage.js similarity index 100% rename from src/pages/HomePage.js rename to app/pages/HomePage.js diff --git a/src/theme.js b/app/theme.js similarity index 100% rename from src/theme.js rename to app/theme.js diff --git a/examples/advanced/components.js b/examples/advanced/components.js deleted file mode 100644 index e43f39f..0000000 --- a/examples/advanced/components.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -export const PostItem = ({ userId, id, title, body }) => ( -
-

- UserID: {userId} / PostID: {id} -

-

Title: {title}

-

Body: {body}

-
-); diff --git a/examples/advanced/handlers.js b/examples/advanced/handlers.js deleted file mode 100644 index 231fcfa..0000000 --- a/examples/advanced/handlers.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import axios from 'axios'; - -import { PostItem } from './components'; - -export const postHandler = async (req, res, _, renderPage) => { - const { id } = req.params; - try { - const { data } = await axios(`https://jsonplaceholder.typicode.com/posts/${id}`); - renderPage(() => ); - } catch (error) { - res.status(500).end('Error'); - } -}; - -export const postsHandler = async (req, res, _, renderPage) => { - try { - const { data } = await axios('https://jsonplaceholder.typicode.com/posts'); - renderPage(() => data.map((post) => )); - } catch (error) { - res.status(500).end('Error'); - } -}; diff --git a/examples/advanced/index.js b/examples/advanced/index.js deleted file mode 100644 index e5b7f82..0000000 --- a/examples/advanced/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { ReactXpress, App, Static, Router, Get } from '../../lib'; -import { postHandler, postsHandler } from './handlers'; - -const ExpressApp = () => ( - - - - - - - - -); - -ReactXpress.render(); diff --git a/examples/advanced/package-lock.json b/examples/advanced/package-lock.json deleted file mode 100644 index 1b64c55..0000000 --- a/examples/advanced/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "advanced", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" - } - } -} diff --git a/examples/advanced/package.json b/examples/advanced/package.json deleted file mode 100644 index c89ca29..0000000 --- a/examples/advanced/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "advanced", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "axios": "^0.21.1" - } -} diff --git a/examples/basic/index.js b/examples/basic/index.js deleted file mode 100644 index e4cce29..0000000 --- a/examples/basic/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import { ReactXpress, App, Static, Router, Get } from '../../lib'; - -const ExpressApp = () => ( - - - - ( -
-

Hello World

-
- )} - /> - -
-
-); - -ReactXpress.render(); diff --git a/lib/index.js b/lib/index.js index 0302a1e..d8a6875 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,3 +1,750 @@ -export * from './renderer'; -export * from './components'; -export * from './context'; +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var React = require('react'); +var ReactReconciler = require('react-reconciler'); +var express = require('express'); +var path = require('path'); +var server = require('react-dom/server'); +var reactHelmet = require('react-helmet'); +var styledComponents = require('styled-components'); +var PropTypes = require('prop-types'); + +function _interopDefaultLegacy(e) { + return e && typeof e === 'object' && 'default' in e ? e : { default: e }; +} + +var React__default = /*#__PURE__*/ _interopDefaultLegacy(React); +var ReactReconciler__default = /*#__PURE__*/ _interopDefaultLegacy(ReactReconciler); +var express__default = /*#__PURE__*/ _interopDefaultLegacy(express); +var PropTypes__default = /*#__PURE__*/ _interopDefaultLegacy(PropTypes); + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err); + } + + _next(undefined); + }); + }; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true, + }); + } else { + obj[key] = value; + } + + return obj; +} + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) + symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; +} + +var colors = { + reset: '\x1b[0m', + bright: '\x1b[1m', + dim: '\x1b[2m', + underscore: '\x1b[4m', + blink: '\x1b[5m', + reverse: '\x1b[7m', + hidden: '\x1b[8m', + fg: { + black: '\x1b[30m', + red: '\x1b[31m', + green: '\x1b[32m', + yellow: '\x1b[33m', + blue: '\x1b[34m', + magenta: '\x1b[35m', + cyan: '\x1b[36m', + white: '\x1b[37m', + crimson: '\x1b[38m', // Scarlet + }, + bg: { + black: '\x1b[40m', + red: '\x1b[41m', + green: '\x1b[42m', + yellow: '\x1b[43m', + blue: '\x1b[44m', + magenta: '\x1b[45m', + cyan: '\x1b[46m', + white: '\x1b[47m', + crimson: '\x1b[48m', + }, +}; +var libName = '⚡️react-end'; +function log(type, msg) { + switch (type) { + case 'success': + console.log( + '' + .concat(colors.fg.blue) + .concat(colors.bright, '[') + .concat(libName, '] ') + .concat(msg) + .concat(colors.reset) + ); + break; + + case 'warn': + console.log( + ''.concat(colors.fg.yellow, '[').concat(libName, '] ').concat(msg).concat(colors.reset) + ); + break; + + default: + console.log('['.concat(libName, '] ').concat(msg)); + break; + } +} + +var ReqResContext = React.createContext({ + req: null, + res: null, +}); + +function renderPage(Component, ctx, options) { + var { appHOC, renderHTML } = options; + var sheet = new styledComponents.ServerStyleSheet(); + var root = server.renderToString( + sheet.collectStyles( + /*#__PURE__*/ React__default['default'].createElement( + ReqResContext.Provider, + { + value: ctx, + }, + appHOC(Component) + ) + ) + ); + var styles = sheet.getStyleTags(); + var helmet = reactHelmet.Helmet.renderStatic(); + var head = [helmet.title, helmet.meta, helmet.link].map((h) => h.toString()).join('\n'); + return renderHTML({ + head, + styles, + root, + }); +} + +function paramfn(sq, req, res, next, options) { + var _loop = function _loop(param) { + switch (param.type) { + case 'header': + res.setHeader(param.content.name, param.content.value); + break; + + case 'json': + res.send(param.content); + break; + + case 'text': + res.send(param.content); + break; + + case 'status': + res.statusCode = param.content; + break; + + case 'contentType': + res.setHeader('Content-Type', param.content); + break; + + case 'redirect': + if (param.content.statusCode) res.redirect(param.content.statusCode, param.content.path); + else res.redirect(param.content.path); // res.end(); + + break; + + case 'render': + res.send( + renderPage( + param.content, + { + req, + res, + }, + options + ) + ); + break; + + case 'send-file': + res.sendFile(param.content.path, param.content.options, (err) => { + if (err) { + param.content.onError(err); + next(); + } + }); + break; + } + }; + + // eslint-disable-next-line no-restricted-syntax + for (var param of sq) { + _loop(param); + } +} + +function generateRoute(router, props) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + router[props.method]( + props.path || '/', + ...[ + ...(props.middlewares || []), + /*#__PURE__*/ (function () { + var _ref = _asyncToGenerator(function* (req, res, next) { + if (props.paramsSeq) { + paramfn(props.paramsSeq, req, res, next, options); + } + + if (props.handler) + yield props.handler(req, res, next, (Component) => + renderPage(Component, { + req, + res, + }) + ); + }); + + return function (_x, _x2, _x3) { + return _ref.apply(this, arguments); + }; + })(), + ] + ); +} + +var renderHTML = (_ref) => { + var { head, styles, root } = _ref; + return '\n\n \n \n \n ' + .concat(head, '\n ') + .concat(styles, '\n \n \n
\n ') + .concat(root, '\n
\n \n\n'); +}; + +var options = { + appHOC: (Component) => /*#__PURE__*/ React__default['default'].createElement(Component, null), + renderHTML, +}; +var reconciler = ReactReconciler__default['default']({ + getRootHostContext(rootContainerInstance) {}, + + getChildHostContext(parentHostContext, type, rootContainerInstance) {}, + + getPublicInstance(instance) {}, + + prepareForCommit(containerInfo) {}, + + resetAfterCommit(containerInfo) {}, + + createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + if (type === 'app') { + var app = express__default['default'](); + app.use(express__default['default'].json()); + app.use( + express__default['default'].urlencoded({ + extended: true, + }) + ); + app.listen(props.port || 8080, () => + log('success', 'app is running on '.concat(props.port || 8080)) + ); + return app; + } + + if (type === 'router') { + var router = express__default['default'].Router({ + caseSensitive: !!props.caseSensitive, + mergeParams: !!props.mergeParams, + strict: !!props.strict, + }); + return { + routerInstance: router, + path: props.path, + }; + } + + if (type === 'route') { + var paramsSeq = []; + return { + type, + props: _objectSpread2( + _objectSpread2({}, props), + {}, + { + paramsSeq, + } + ), + }; + } + + if (type === 'param') { + return { + type, + props, + }; + } + + if (type === 'static') { + return { + path: props.path, + static: express__default['default'].static( + path.join(__dirname, props.publicPath), + props.options + ), + }; + } // eslint-disable-next-line react/destructuring-assignment + + if (type === 'logger') { + return { + type, + props, + }; + } + + return null; + }, + + appendInitialChild(parentInstance, child) { + if (child.routerInstance) { + if (parentInstance.routerInstance) { + parentInstance.routerInstance.use(child.path || '/', child.routerInstance); + } else { + parentInstance.use(child.path || '/', child.routerInstance); + } + + return; + } + + if (child.type === 'route') { + generateRoute(parentInstance.routerInstance, child.props, options); + return; + } + + if (child.type === 'param') { + parentInstance.props.paramsSeq.push(child.props); + } + + if (child.static) { + parentInstance.use(...(child.path ? [child.path, child.static] : [child.static])); + return; + } + + if (child.type === 'logger') { + if (!child.props.disabled) { + parentInstance.use(child.props.use); + } + + return; + } + }, + + finalizeInitialChildren(instance, type, props, rootContainerInstance, hostContext) {}, + + prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, hostContext) {}, + + shouldSetTextContent(type, props) {}, + + shouldDeprioritizeSubtree(type, props) {}, + + createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { + return text; + }, + + now: null, + isPrimaryRenderer: true, + scheduleDeferredCallback: '', + cancelDeferredCallback: '', + supportsMutation: true, + + commitMount(instance, type, newProps, internalInstanceHandle) {}, + + commitUpdate(instance, updatePayload, type, oldProps, newProps, internalInstanceHandle) {}, + + resetTextContent(instance) {}, + + commitTextUpdate(textInstance, oldText, newText) {}, + + appendChild(parentInstance, child) {}, + + appendChildToContainer(container, child) { + if (child.type === 'app'); + }, + + insertBefore(parentInstance, child, beforeChild) {}, + + insertInContainerBefore(container, child, beforeChild) {}, + + removeChild(parentInstance, child) {}, + + removeChildFromContainer(container, child) {}, + + clearContainer(container, child) {}, +}); +var registerApp = function registerApp(App) { + var custom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : options; + options = _objectSpread2(_objectSpread2({}, options), custom); + log('success', 'starting...'); + var container = reconciler.createContainer(null, false, false); + reconciler.updateContainer( + /*#__PURE__*/ React__default['default'].createElement(App, null), + container, + null, + null + ); +}; + +var App = (_ref) => { + var { children, port } = _ref; + return /*#__PURE__*/ React__default['default'].createElement( + 'app', + { + port: port, + }, + children + ); +}; +App.propTypes = { + port: PropTypes__default['default'].number, + children: PropTypes__default['default'].node, +}; + +var Static = (_ref) => { + var { publicPath, path, options } = _ref; + return /*#__PURE__*/ React__default['default'].createElement('static', { + publicPath: publicPath, + path: path, + options: options, + }); +}; +Static.propTypes = { + publicPath: PropTypes__default['default'].string.isRequired, + path: PropTypes__default['default'].string, + options: PropTypes__default['default'].object, +}; + +var Router = (_ref) => { + var { path, caseSensitive, mergeParams, strict, children } = _ref; + return /*#__PURE__*/ React__default['default'].createElement( + 'router', + { + path: path, + caseSensitive: !!caseSensitive, + mergeParams: !!mergeParams, + strict: !!strict, + }, + children + ); +}; +Router.propTypes = { + path: PropTypes__default['default'].string.isRequired, + caseSensitive: PropTypes__default['default'].bool, + mergeParams: PropTypes__default['default'].bool, + strict: PropTypes__default['default'].bool, + children: PropTypes__default['default'].node, +}; + +/** + * @param {{ name: 'Accept-Patch' | 'Accept-Ranges' | 'Age' | 'Allow' | 'Alt-Svc' | 'Cache-Control' | 'Connection' | 'Content-Disposition' | 'Content-Encoding' | 'Content-Language' | 'Content-Length' | 'Content-Location' | 'Content-Range' | 'Content-Type' | 'Date' | 'Delta-Base' | 'ETag' | 'Expires' | 'IM' | 'Last-Modified' | 'Link' | 'Location' | 'Pragma' | 'Proxy-Authenticate' | 'Public-Key-Pins' | 'Retry-After' | 'Server' | 'Set-Cookie' | 'Strict-Transport-Security' | 'Trailer' | 'Transfer-Encoding' | 'Tk' | 'Upgrade' | 'Vary' | 'Via' | 'Warning' | 'WWW-Authenticate' | 'Content-Security-Policy' | 'Refresh' | 'X-Powered-By' | 'X-Request-ID' | 'X-UA-Compatible' | 'X-XSS-Protection' }} props + */ + +var Header = (_ref) => { + var { name, value } = _ref; + return /*#__PURE__*/ React__default['default'].createElement('param', { + type: 'header', + content: { + name, + value, + }, + }); +}; + +Header.propTypes = { + name: PropTypes__default['default'].string.isRequired, + value: PropTypes__default['default'].any, +}; + +var Render = (_ref2) => { + var { component } = _ref2; + return /*#__PURE__*/ React__default['default'].createElement('param', { + type: 'render', + content: component, + }); +}; + +Render.propTypes = { + component: PropTypes__default['default'].func, +}; + +var Content = (_ref3) => { + var { json, contentType, text } = _ref3; + var ComponentsArray = []; + if (contentType) + ComponentsArray.push( + /*#__PURE__*/ React__default['default'].createElement('param', { + key: 'contentType', + type: 'content-type', + content: contentType, + }) + ); + if (json) + ComponentsArray.push( + /*#__PURE__*/ React__default['default'].createElement('param', { + key: 'json', + type: 'json', + content: json, + }) + ); + if (text) + ComponentsArray.push( + /*#__PURE__*/ React__default['default'].createElement('param', { + key: 'text', + type: 'text', + content: text, + }) + ); + return ComponentsArray; +}; + +Content.propTypes = { + json: PropTypes__default['default'].oneOfType([ + PropTypes__default['default'].object, + PropTypes__default['default'].array, + ]), + contentType: PropTypes__default['default'].string, + text: PropTypes__default['default'].string, +}; + +var Status = (_ref4) => { + var { statusCode } = _ref4; + return /*#__PURE__*/ React__default['default'].createElement('param', { + type: 'status', + content: statusCode, + }); +}; + +Status.propTypes = { + statusCode: PropTypes__default['default'].number, +}; + +var Redirect = (_ref5) => { + var { path, statusCode } = _ref5; + return /*#__PURE__*/ React__default['default'].createElement('param', { + type: 'redirect', + content: { + path, + statusCode, + }, + }); +}; + +Redirect.propTypes = { + path: PropTypes__default['default'].string.isRequired, + statusCode: PropTypes__default['default'].number, +}; + +var SendFile = (_ref6) => { + var { path, options, onError = () => {} } = _ref6; + return /*#__PURE__*/ React__default['default'].createElement('param', { + type: 'send-file', + content: { + path, + options, + onError, + }, + }); +}; + +SendFile.propTypes = { + path: PropTypes__default['default'].string.isRequired, + options: PropTypes__default['default'].object, + onError: PropTypes__default['default'].func, +}; +var Res = { + Header, + Render, + Content, + Status, + Redirect, + SendFile, +}; + +var BaseRoute = (method) => { + var RouteComponent = (_ref) => { + var { children, path, handler, render, status, json, text } = _ref; + return /*#__PURE__*/ React__default['default'].createElement( + 'route', + { + method: method, + path: path, + handler: handler, + }, + children, + render && + /*#__PURE__*/ React__default['default'].createElement(Res.Render, { + component: render, + }), + status && + /*#__PURE__*/ React__default['default'].createElement(Res.Status, { + statusCode: status, + }), + text && + /*#__PURE__*/ React__default['default'].createElement(Res.Content, { + text: text, + }), + json && + /*#__PURE__*/ React__default['default'].createElement(Res.Content, { + json: json, + }) + ); + }; + + RouteComponent.propTypes = { + path: PropTypes__default['default'].string, + handler: PropTypes__default['default'].func, + render: PropTypes__default['default'].func, + status: PropTypes__default['default'].number, + json: PropTypes__default['default'].any, + text: PropTypes__default['default'].string, + }; + return RouteComponent; +}; + +var Get = BaseRoute('get'); +var Post = BaseRoute('post'); +var Put = BaseRoute('put'); +var Head = BaseRoute('head'); +var Delete = BaseRoute('delete'); +var Options = BaseRoute('options'); +var Trace = BaseRoute('trace'); +var Copy = BaseRoute('copy'); +var Lock = BaseRoute('lock'); +var Mkcol = BaseRoute('mkcol'); +var Move = BaseRoute('move'); +var Purge = BaseRoute('purge'); +var Propfind = BaseRoute('propfind'); +var Proppatch = BaseRoute('proppatch'); +var Unlock = BaseRoute('unlock'); +var Report = BaseRoute('report'); +var Mkactivity = BaseRoute('mkactivity'); +var Checkout = BaseRoute('checkout'); +var Merge = BaseRoute('merge'); +var Msearch = BaseRoute('m-search'); +var Notify = BaseRoute('notify'); +var Subscribe = BaseRoute('subscribe'); +var Unsubscribe = BaseRoute('unsubscribe'); +var Patch = BaseRoute('patch'); +var Search = BaseRoute('search'); +var Connect = BaseRoute('connect'); + +var Logger = (_ref) => { + var { use, disabled } = _ref; + return /*#__PURE__*/ React__default['default'].createElement('logger', { + use: use, + disabled: disabled, + }); +}; +Logger.propTypes = { + use: PropTypes__default['default'].func.isRequired, + disabled: PropTypes__default['default'].bool, +}; + +exports.App = App; +exports.Checkout = Checkout; +exports.Connect = Connect; +exports.Copy = Copy; +exports.Delete = Delete; +exports.Get = Get; +exports.Head = Head; +exports.Lock = Lock; +exports.Logger = Logger; +exports.Merge = Merge; +exports.Mkactivity = Mkactivity; +exports.Mkcol = Mkcol; +exports.Move = Move; +exports.Msearch = Msearch; +exports.Notify = Notify; +exports.Options = Options; +exports.Patch = Patch; +exports.Post = Post; +exports.Propfind = Propfind; +exports.Proppatch = Proppatch; +exports.Purge = Purge; +exports.Put = Put; +exports.Report = Report; +exports.ReqResContext = ReqResContext; +exports.Res = Res; +exports.Router = Router; +exports.Search = Search; +exports.Static = Static; +exports.Subscribe = Subscribe; +exports.Trace = Trace; +exports.Unlock = Unlock; +exports.Unsubscribe = Unsubscribe; +exports.registerApp = registerApp; diff --git a/lib/renderer/generateRoute.js b/lib/renderer/generateRoute.js deleted file mode 100644 index d79a54d..0000000 --- a/lib/renderer/generateRoute.js +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { renderToString } from 'react-dom/server'; -import { ServerStyleSheet } from 'styled-components'; -import { Helmet } from 'react-helmet'; -import { ReqResContext } from '../context'; - -const sheet = new ServerStyleSheet(); - -function renderPage(Component, req, res) { - const app = renderToString( - sheet.collectStyles( - - - - ) - ); - const styleTags = sheet.getStyleTags(); - const helmet = Helmet.renderStatic(); - - const html = ` - - - - - - ${helmet.title.toString()} - ${helmet.meta.toString()} - ${helmet.link.toString()} - ${styleTags} - - -
- ${app} -
- - - `; - - res.send(html); -} - -function paramfn(sq, req, res, next) { - // eslint-disable-next-line no-restricted-syntax - for (const param of sq) { - switch (param.type) { - case 'json': - res.send(param.content); - break; - case 'text': - res.send(param.content); - break; - case 'status': - res.statusCode = param.content; - break; - case 'contentType': - res.setHeader('Content-Type', param.content); - break; - case 'redirect': - if (param.content.statusCode) res.redirect(param.content.statusCode, param.content.path); - else res.redirect(param.content.path); - res.end(); - break; - case 'render': - renderPage(param.content, req, res); - break; - case 'send-file': - res.sendFile(param.content.path, param.content.options, (err) => { - if (err) { - param.content.onError(err); - next(); - } - }); - break; - default: - } - } -} - -export function generateRoute(parentInstance, props) { - parentInstance.routerInstance[props.method]( - props.path || '/', - ...[ - ...(props.middlewares || []), - async (req, res, next) => { - if (props.paramsSeq) { - paramfn(props.paramsSeq, req, res, next); - } - - if (props.handler) - await props.handler(req, res, next, (Component) => renderPage(Component, req, res)); - }, - ] - ); -} diff --git a/package-lock.json b/package-lock.json index 4611138..f2557e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "react-express-renderer", - "version": "1.0.0", + "name": "@reactend/express", + "version": "1.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1137,6 +1137,50 @@ } } }, + "@rollup/plugin-babel": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.3.tgz", + "integrity": "sha512-DOMc7nx6y5xFi86AotrFssQqCen6CxYn+zts5KSI879d4n1hggSb4TH3mjVgG17Vc3lZziWWfcXzrEmVdzPMdw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-commonjs": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz", + "integrity": "sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "dependencies": { + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + } + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1152,6 +1196,12 @@ "defer-to-connect": "^1.0.1" } }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -1397,6 +1447,14 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1530,38 +1588,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1747,6 +1773,35 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1823,6 +1878,15 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, + "cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -1858,6 +1922,15 @@ "integrity": "sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA==", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", @@ -2552,6 +2625,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2859,6 +2938,64 @@ "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + } } }, "graceful-fs": { @@ -3252,6 +3389,15 @@ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", "dev": true }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, "is-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", @@ -3333,12 +3479,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3376,15 +3516,6 @@ "object.assign": "^4.1.2" } }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "language-subtag-registry": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", @@ -3779,6 +3910,15 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -3865,6 +4005,25 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4064,6 +4223,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4388,25 +4552,6 @@ "strip-json-comments": "~2.0.1" } }, - "react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", - "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.1" - } - }, "react-fast-compare": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", @@ -4658,15 +4803,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -4686,6 +4822,15 @@ "glob": "^7.1.3" } }, + "rollup": { + "version": "2.38.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.5.tgz", + "integrity": "sha512-VoWt8DysFGDVRGWuHTqZzT02J0ASgjVq/hPs9QcBOGMd7B+jfTr/iqMVEyOi901rE3xq+Deq66GzIT1yt7sGwQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.1" + } + }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -4901,6 +5046,12 @@ } } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", diff --git a/package.json b/package.json index f694694..a61feb7 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,18 @@ { - "name": "react-express-renderer", - "version": "1.0.0", - "description": "", - "main": "src/app.js", + "name": "@reactend/express", + "version": "1.0.3", + "description": "React-like http-server on Nodejs", + "main": "lib/index.js", + "repository": { + "url": "git@github.com:gigantz/react-xpress.git" + }, "scripts": { "start": "./node_modules/.bin/babel-node ./src/app.js", - "dev": "nodemon --exec babel-node ./src/app.js", - "example1": "nodemon --exec babel-node --config-file ./.babelrc ./examples/basic", - "example2": "nodemon --exec babel-node --config-file ./.babelrc ./examples/advanced" + "dev": "nodemon ./app/index.js", + "build": "rollup -c rollup.config.js && npm run copy-pkg && npm run copy-readme", + "copy-pkg": "cp ./package.json ./lib/package.json", + "copy-readme": "cp ./README.md ./lib/README.md", + "publish": "yarn build && npm publish" }, "keywords": [], "author": "Orkhan Jafarov", @@ -26,19 +31,27 @@ ] }, "dependencies": { + "compression": "^1.7.4", + "cookie-parser": "^1.4.5", + "cors": "^2.8.5", "express": "^4.17.1", + "morgan": "^1.10.0", "prop-types": "^15.7.2", - "react": "^17.0.1", - "react-dom": "^17.0.1", "react-helmet": "^6.1.0", "react-reconciler": "^0.26.1", "styled-components": "^5.2.1" }, + "peerDependencies": { + "react": "^17.0.1", + "react-dom": "^17.0.1" + }, "devDependencies": { "@babel/core": "^7.12.13", "@babel/node": "^7.12.13", "@babel/plugin-transform-react-jsx": "^7.12.13", "@babel/preset-env": "^7.12.13", + "@rollup/plugin-babel": "^5.2.3", + "@rollup/plugin-commonjs": "^17.1.0", "eslint": "^7.19.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^7.2.0", @@ -50,6 +63,7 @@ "husky": "^4.3.8", "lint-staged": "^10.5.4", "nodemon": "^2.0.7", - "prettier": "^2.2.1" + "prettier": "^2.2.1", + "rollup": "^2.38.5" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..da4e026 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,27 @@ +import babel from '@rollup/plugin-babel'; +import commonjs from '@rollup/plugin-commonjs'; + +export default { + input: 'src/index.js', + output: { + file: 'lib/index.js', + format: 'cjs', + }, + external: ['react', 'react-dom', 'prop-types', 'styled-components'], + plugins: [ + babel({ + presets: [ + [ + '@babel/preset-env', + { + targets: { + esmodules: true, + }, + }, + ], + ], + plugins: ['@babel/plugin-transform-react-jsx'], + }), + commonjs(), + ], +}; diff --git a/lib/components/App.js b/src/components/App.js similarity index 100% rename from lib/components/App.js rename to src/components/App.js diff --git a/src/components/Head.js b/src/components/Head.js new file mode 100644 index 0000000..8e3d058 --- /dev/null +++ b/src/components/Head.js @@ -0,0 +1,3 @@ +import { Helmet } from 'react-helmet'; + +export const Head = Helmet; diff --git a/src/components/Logger.js b/src/components/Logger.js new file mode 100644 index 0000000..d2ad3cf --- /dev/null +++ b/src/components/Logger.js @@ -0,0 +1,16 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * + * @param {{ + * mode: 'skip' | 'stream' | 'combined' | 'common' | 'dev' | 'short' | 'tiny' + * disabled: Boolean + * }} props + */ +export const Logger = ({ mode, disabled }) => ; +Logger.propTypes = { + mode: PropTypes.oneOf(['skip', 'stream', 'combined', 'common', 'dev', 'short', 'tiny']) + .isRequired, + disabled: PropTypes.bool, +}; diff --git a/src/components/Middleware.js b/src/components/Middleware.js new file mode 100644 index 0000000..9d2759e --- /dev/null +++ b/src/components/Middleware.js @@ -0,0 +1,7 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +export const Middleware = ({ handler }) => ; +Middleware.propTypes = { + handler: PropTypes.func.isRequired, +}; diff --git a/lib/components/Res.js b/src/components/Res.js similarity index 58% rename from lib/components/Res.js rename to src/components/Res.js index 6e657cc..7fe725f 100644 --- a/lib/components/Res.js +++ b/src/components/Res.js @@ -1,6 +1,16 @@ import React from 'react'; import PropTypes from 'prop-types'; +/** + * @param {{ name: 'Accept-Patch' | 'Accept-Ranges' | 'Age' | 'Allow' | 'Alt-Svc' | 'Cache-Control' | 'Connection' | 'Content-Disposition' | 'Content-Encoding' | 'Content-Language' | 'Content-Length' | 'Content-Location' | 'Content-Range' | 'Content-Type' | 'Date' | 'Delta-Base' | 'ETag' | 'Expires' | 'IM' | 'Last-Modified' | 'Link' | 'Location' | 'Pragma' | 'Proxy-Authenticate' | 'Public-Key-Pins' | 'Retry-After' | 'Server' | 'Set-Cookie' | 'Strict-Transport-Security' | 'Trailer' | 'Transfer-Encoding' | 'Tk' | 'Upgrade' | 'Vary' | 'Via' | 'Warning' | 'WWW-Authenticate' | 'Content-Security-Policy' | 'Refresh' | 'X-Powered-By' | 'X-Request-ID' | 'X-UA-Compatible' | 'X-XSS-Protection' }} props + */ +const Header = ({ name, value }) => ; + +Header.propTypes = { + name: PropTypes.string.isRequired, + value: PropTypes.any, +}; + const Render = ({ component }) => ; Render.propTypes = { @@ -19,13 +29,12 @@ const Content = ({ json, contentType, text }) => { }; Content.propTypes = { - json: PropTypes.any, + json: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), contentType: PropTypes.string, text: PropTypes.string, }; const Status = ({ statusCode }) => ; - Status.propTypes = { statusCode: PropTypes.number, }; @@ -48,6 +57,7 @@ SendFile.propTypes = { }; export const Res = { + Header, Render, Content, Status, diff --git a/lib/components/Router.js b/src/components/Router.js similarity index 100% rename from lib/components/Router.js rename to src/components/Router.js diff --git a/lib/components/Routes.js b/src/components/Routes.js similarity index 100% rename from lib/components/Routes.js rename to src/components/Routes.js diff --git a/lib/components/Static.js b/src/components/Static.js similarity index 100% rename from lib/components/Static.js rename to src/components/Static.js diff --git a/lib/components/index.js b/src/components/index.js similarity index 68% rename from lib/components/index.js rename to src/components/index.js index c8afecf..2aac51d 100644 --- a/lib/components/index.js +++ b/src/components/index.js @@ -3,3 +3,5 @@ export * from './Static'; export * from './Router'; export * from './Routes'; export * from './Res'; +export * from './Logger'; +export * from './Middleware'; diff --git a/lib/context.js b/src/context.js similarity index 100% rename from lib/context.js rename to src/context.js diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..0302a1e --- /dev/null +++ b/src/index.js @@ -0,0 +1,3 @@ +export * from './renderer'; +export * from './components'; +export * from './context'; diff --git a/src/renderer/generateRoute.js b/src/renderer/generateRoute.js new file mode 100644 index 0000000..4dfae8a --- /dev/null +++ b/src/renderer/generateRoute.js @@ -0,0 +1,58 @@ +import { renderPage } from './renderPage'; + +function paramfn(sq, req, res, next, options) { + // eslint-disable-next-line no-restricted-syntax + for (const param of sq) { + switch (param.type) { + case 'header': + res.setHeader(param.content.name, param.content.value); + break; + case 'json': + res.send(param.content); + break; + case 'text': + res.send(param.content); + break; + case 'status': + res.statusCode = param.content; + break; + case 'contentType': + res.setHeader('Content-Type', param.content); + break; + case 'redirect': + if (param.content.statusCode) res.redirect(param.content.statusCode, param.content.path); + else res.redirect(param.content.path); + // res.end(); + break; + case 'render': + res.send(renderPage(param.content, { req, res }, options)); + break; + case 'send-file': + res.sendFile(param.content.path, param.content.options, (err) => { + if (err) { + param.content.onError(err); + next(); + } + }); + break; + default: + } + } +} + +export function generateRoute(router, props, options = {}) { + router[props.method]( + props.path || '/', + ...[ + ...(props.middlewares || []), + async (req, res, next) => { + if (props.paramsSeq) { + paramfn(props.paramsSeq, req, res, next, options); + } + + if (props.handler) + await props.handler(req, res, next, (Component) => renderPage(Component, { req, res })); + }, + ] + ); +} diff --git a/lib/renderer/helpers.js b/src/renderer/helpers.js similarity index 82% rename from lib/renderer/helpers.js rename to src/renderer/helpers.js index dab7b54..b5876d1 100644 --- a/lib/renderer/helpers.js +++ b/src/renderer/helpers.js @@ -31,16 +31,18 @@ export const colors = { }, }; +const libName = '⚡️react-end'; + export function log(type, msg) { switch (type) { case 'success': - console.log(`${colors.fg.green}${colors.bright}[ReactXpress] ${msg}${colors.reset}`); + console.log(`${colors.fg.blue}${colors.bright}[${libName}] ${msg}${colors.reset}`); break; case 'warn': - console.log(`${colors.fg.yellow}[ReactXpress] ${msg}${colors.reset}`); + console.log(`${colors.fg.yellow}[${libName}] ${msg}${colors.reset}`); break; default: - console.log(`[ReactXpress] ${msg}`); + console.log(`[${libName}] ${msg}`); break; } } diff --git a/lib/renderer/index.js b/src/renderer/index.js similarity index 71% rename from lib/renderer/index.js rename to src/renderer/index.js index c5b9919..5b5fbc1 100644 --- a/lib/renderer/index.js +++ b/src/renderer/index.js @@ -1,29 +1,36 @@ /* eslint-disable no-param-reassign */ /* eslint-disable no-useless-return */ /* eslint-disable no-unused-vars */ +import React from 'react'; import ReactReconciler from 'react-reconciler'; import express from 'express'; +import cookieParser from 'cookie-parser'; +import compression from 'compression'; +import logger from 'morgan'; import { join } from 'path'; + import { log } from './helpers'; import { generateRoute } from './generateRoute'; +import { renderHTML } from './renderHTML'; + +let options = { + appHOC: (Component) => , + renderHTML, +}; const reconciler = ReactReconciler({ getRootHostContext(rootContainerInstance) {}, - getChildHostContext(parentHostContext, type, rootContainerInstance) {}, - getPublicInstance(instance) {}, - prepareForCommit(containerInfo) {}, - resetAfterCommit(containerInfo) {}, - createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { if (type === 'app') { const app = express(); - + app.use(compression()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); + app.use(cookieParser()); app.listen(props.port || 8080, () => log('success', `app is running on ${props.port || 8080}`) ); @@ -36,6 +43,7 @@ const reconciler = ReactReconciler({ mergeParams: !!props.mergeParams, strict: !!props.strict, }); + return { routerInstance: router, path: props.path }; } @@ -47,6 +55,13 @@ const reconciler = ReactReconciler({ }; } + if (type === 'middleware') { + return { + type, + props, + }; + } + if (type === 'param') { return { type, @@ -57,7 +72,15 @@ const reconciler = ReactReconciler({ if (type === 'static') { return { path: props.path, - static: express.static(join(__dirname, '../..', props.publicPath), props.options), + static: express.static(join(__dirname, props.publicPath), props.options), + }; + } + + // eslint-disable-next-line react/destructuring-assignment + if (type === 'logger') { + return { + type, + props, }; } @@ -75,7 +98,13 @@ const reconciler = ReactReconciler({ } if (child.type === 'route') { - generateRoute(parentInstance, child.props); + generateRoute(parentInstance.routerInstance, child.props, options); + return; + } + + if (child.type === 'middleware') { + if (parentInstance.routerInstance) parentInstance.routerInstance.use(child.props.handler); + if (parentInstance) parentInstance.use(child.props.handler); return; } @@ -87,16 +116,19 @@ const reconciler = ReactReconciler({ parentInstance.use(...(child.path ? [child.path, child.static] : [child.static])); return; } + + if (child.type === 'logger') { + if (!child.props.disabled) { + parentInstance.use(logger(child.props.mode)); + } + return; + } }, finalizeInitialChildren(instance, type, props, rootContainerInstance, hostContext) {}, - prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, hostContext) {}, - shouldSetTextContent(type, props) {}, - shouldDeprioritizeSubtree(type, props) {}, - createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { return text; }, @@ -110,36 +142,28 @@ const reconciler = ReactReconciler({ supportsMutation: true, commitMount(instance, type, newProps, internalInstanceHandle) {}, - commitUpdate(instance, updatePayload, type, oldProps, newProps, internalInstanceHandle) {}, - resetTextContent(instance) {}, - commitTextUpdate(textInstance, oldText, newText) {}, - appendChild(parentInstance, child) {}, - appendChildToContainer(container, child) { if (child.type === 'app') { container = child; } }, - insertBefore(parentInstance, child, beforeChild) {}, - insertInContainerBefore(container, child, beforeChild) {}, - removeChild(parentInstance, child) {}, - removeChildFromContainer(container, child) {}, - clearContainer(container, child) {}, }); -export const ReactXpress = { - render(app) { - log('success', `starting...`); - const container = reconciler.createContainer(null, false, false); - reconciler.updateContainer(app, container, null, null); - }, +export const registerApp = (App, custom = options) => { + options = { + ...options, + ...custom, + }; + log('success', `starting...`); + const container = reconciler.createContainer(null, false, false); + reconciler.updateContainer(, container, null, null); }; diff --git a/src/renderer/renderHTML.js b/src/renderer/renderHTML.js new file mode 100644 index 0000000..1e61f1b --- /dev/null +++ b/src/renderer/renderHTML.js @@ -0,0 +1,16 @@ +export const renderHTML = ({ head, styles, root }) => + ` + + + + + ${head} + ${styles} + + +
+ ${root} +
+ + +`; diff --git a/src/renderer/renderPage.js b/src/renderer/renderPage.js new file mode 100644 index 0000000..d3622c5 --- /dev/null +++ b/src/renderer/renderPage.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import { Helmet } from 'react-helmet'; +import { ServerStyleSheet } from 'styled-components'; + +import { ReqResContext } from '../context'; + +export function renderPage(Component, ctx, options) { + const { appHOC, renderHTML } = options; + const sheet = new ServerStyleSheet(); + const root = renderToString( + sheet.collectStyles( + {appHOC(Component)} + ) + ); + + const styles = sheet.getStyleTags(); + const helmet = Helmet.renderStatic(); + const head = [helmet.title, helmet.meta, helmet.link].map((h) => h.toString()).join('\n'); + + return renderHTML({ head, styles, root }); +} From 5fcdddab12ba0c03e22b1b8fd00f9b97aab00c9a Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 02:45:28 +0400 Subject: [PATCH 2/8] commit before publish package --- README.md | 105 ++-- app/app.js | 53 -- app/components/layout/BaseLayout.js | 25 - app/components/layout/GlobalStyle.js | 34 -- app/components/layout/TopNav.js | 100 ---- app/index.js | 15 - app/pages/AboutPage.js | 13 - app/pages/ComponentsPage.js | 62 --- app/pages/HomePage.js | 80 --- app/theme.js | 35 -- lib/index.js | 750 --------------------------- logo.svg | 56 ++ package-lock.json | 351 ++++++------- package.json | 8 +- public/code-example.png | Bin 61259 -> 0 bytes public/logo.svg | 20 - src/components/Routes.js | 1 + 17 files changed, 265 insertions(+), 1443 deletions(-) delete mode 100644 app/app.js delete mode 100644 app/components/layout/BaseLayout.js delete mode 100644 app/components/layout/GlobalStyle.js delete mode 100644 app/components/layout/TopNav.js delete mode 100644 app/index.js delete mode 100644 app/pages/AboutPage.js delete mode 100644 app/pages/ComponentsPage.js delete mode 100644 app/pages/HomePage.js delete mode 100644 app/theme.js delete mode 100644 lib/index.js create mode 100644 logo.svg delete mode 100644 public/code-example.png delete mode 100755 public/logo.svg diff --git a/README.md b/README.md index 52992cb..ae5643c 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,46 @@ -# React-end +# Reactend / Express -React http-server based on Express.js +React-like http-server on Nodejs
-![Planet Express](public/logo.svg) +![Planet Express](logo.svg) ## Install -`npm i --save @react-end/express` +`npm i --save @reactend/express react react-dom`
+or
+`yarn add @reactend/express react react-dom`
-### Why? +
+ +## Why? It's the only crazy idea to use React to structure Backend on Node.js. -
+

-### How it works? +## How it works? It works with express.js framework to run Node.js server. Custom renderer we have is building express structure app from React Components. -
+

### Code Example ```js import React from 'react'; -import { registerApp, App, Static, Router, Get, Post, Res } from '@react-end/express'; +import { resolve } from 'path'; -const HomePage = () =>

Home page

; -const AboutPage = () =>

About Page

; +import { registerApp, App, Static, Router, Get, Post, Res, Logger } from '@reactend/express'; const ExpressApp = () => ( + - - + + + + + ( handler={(req) => console.log(req.originalUrl)} /> - ); - -registerApp(ExpressApp); ```
@@ -55,40 +59,49 @@ registerApp(ExpressApp); ## You can use this way too ```js -const Updates = () => ( - <> - - - - - - - - - - - -

Shut Up And Take My Money!

} /> -
- -); +import cors from 'cors'; +; +``` + +```js + + + + + + + + + + + + + + +

Shut Up And Take My Money!

} /> +
``` -### Components - -`` - App Instance (props: port) -`` - Static route (props: publicPath, path, options) -`` - Router-Provider (props: path) -`, and ...` - Route component (props: path, content, handler, status) -`` - Response components -`` - Render (props: component) -`` - Response send (props: json, text, contentType) -`` - Response Status (props: statusCode) -`` - Response Send File (props: path, options, onError) -`` - Redirect (props: path, statusCode) +

+ +## Components + +_This minor description for now (Docs is on the way)_

+`` - App Instance (props: port)
+`` - Static route (props: publicPath, path, options)
+`` - Router-Provider (props: path)
+`, and ...` - Route component (props: path, content,
handler, status)
+`` - Middleware (props: handler)
+`` - morgan logger (props: mode, disabled)
+`` - Response components
+`` - Render (props: component)
+`` - Response send (props: json, text, contentType)
+`` - Response Status (props: statusCode)
+`` - Response Send File (props: path, options,
onError)
+`` - Redirect (props: path, statusCode)


-### Contact me +## Contact me Email me if you have any idea and you would like to be contributor [orkhanjafarovr@gmail.com](mailto:orkhanjafarovr@gmail.com) diff --git a/app/app.js b/app/app.js deleted file mode 100644 index ce5b6fa..0000000 --- a/app/app.js +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import { resolve } from 'path'; -import cors from 'cors'; - -import { registerApp, App, Static, Router, Get, Post, Res, Logger, Middleware } from '../src'; -import { HomePage } from './pages/HomePage'; -import { ComponentsPage } from './pages/ComponentsPage'; - -const isProd = process.env.NODE_ENV === 'production'; - -const ExpressApp = () => ( - - - - - - - - - - - - console.log(req.originalUrl)} - /> - - - - - -); - -const Updates = () => ( - <> - - - - - - - - - - - -

Shut Up And Take My Money!

} /> -
- -); - -registerApp(ExpressApp); diff --git a/app/components/layout/BaseLayout.js b/app/components/layout/BaseLayout.js deleted file mode 100644 index 4f79814..0000000 --- a/app/components/layout/BaseLayout.js +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import styled, { ThemeProvider } from 'styled-components'; -import { TopNav } from './TopNav'; -import { GlobalStyle } from './GlobalStyle'; -import { theme } from '../../theme'; - -export const BaseLayout = ({ children }) => ( - - - - {children} - - - -); - -const Wrapper = styled.div` - width: 100%; - max-width: 1400px; - margin: 0 auto; -`; - -const Content = styled.div` - padding: 0 10px; -`; diff --git a/app/components/layout/GlobalStyle.js b/app/components/layout/GlobalStyle.js deleted file mode 100644 index 70ba159..0000000 --- a/app/components/layout/GlobalStyle.js +++ /dev/null @@ -1,34 +0,0 @@ -import { createGlobalStyle } from 'styled-components'; - -export const GlobalStyle = createGlobalStyle` - html { - box-sizing: border-box; - font-size: 16px; - } - - *, *:before, *:after { - box-sizing: inherit; - } - - body { - background-color: #131516; - } - - body, h1, h2, h3, h4, h5, h6, p, ol, ul { - margin: 0; - padding: 0; - font-family: system-ui,-apple-system, - Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif, - BlinkMacSystemFont,Helvetica,Arial,Apple Color Emoji, - Segoe UI Emoji,Segoe UI Symbol; - } - - ol, ul { - list-style: none; - } - - img { - max-width: 100%; - height: auto; - } -`; diff --git a/app/components/layout/TopNav.js b/app/components/layout/TopNav.js deleted file mode 100644 index 41a2104..0000000 --- a/app/components/layout/TopNav.js +++ /dev/null @@ -1,100 +0,0 @@ -import React, { useContext, useMemo } from 'react'; -import styled from 'styled-components'; -import { ReqResContext } from '../../../src'; - -const PAGES = [ - { path: '/', label: 'Home', title: '@orkhanjafarovr' }, - { path: '/components', label: 'Components', title: 'Components Page' }, - { - path: 'https://github.com/gigantz/react-xpress', - label: 'Github', - title: 'Github', - }, -]; - -export const TopNav = () => { - const { req } = useContext(ReqResContext); - const pageTitle = useMemo(() => PAGES.find((p) => p.path === req.originalUrl).title, [req]); - - return ( - - {pageTitle} - {PAGES.map((page) => ( - - {page.label} - - ))} - - ); -}; - -const TopWrapper = styled.nav` - position: sticky; - width: 100%; - display: flex; - align-items: center; - background-color: ${(props) => props.theme.colors.brandVeryDark}; - - &:before { - content: ''; - height: 100%; - width: 100vw; - background-color: ${(props) => props.theme.colors.brandVeryDark}; - position: absolute; - top: 0; - left: 50%; - margin-left: -50vw; - } - - a[href='${(props) => props.currentPath}'] { - color: ${(props) => props.theme.colors.brandVeryLight}; - - &:before { - background-color: ${(props) => props.theme.colors.brandVeryLight}; - } - } - - @media (max-width: 600px) { - justify-content: center; - } -`; - -const Logo = styled.a` - position: relative; - display: inline-block; - color: ${(props) => props.theme.colors.white} !important; - font-weight: bold; - font-size: 20px; - position: relative; - text-decoration: none; - margin-right: auto; - padding: 0 10px; - - @media (max-width: 600px) { - display: none; - } -`; - -const NavItem = styled.a` - margin-top: 5px; - font-size: 18px; - display: inline-block; - padding: 15px 20px; - text-decoration: none; - color: ${(props) => props.theme.colors.white}; - position: relative; - - &:hover { - color: ${(props) => props.theme.colors.brandVeryLight}; - } - - &:before { - content: ''; - height: 3px; - width: 100%; - background-color: 'transparent'; - position: absolute; - bottom: 0; - left: 0; - } -`; diff --git a/app/index.js b/app/index.js deleted file mode 100644 index a8cb381..0000000 --- a/app/index.js +++ /dev/null @@ -1,15 +0,0 @@ -require('@babel/register')({ - presets: [ - [ - '@babel/preset-env', - { - targets: { - esmodules: true, - }, - }, - ], - ], - plugins: ['@babel/plugin-transform-react-jsx'], -}); - -require('./app.js'); diff --git a/app/pages/AboutPage.js b/app/pages/AboutPage.js deleted file mode 100644 index 9878ec7..0000000 --- a/app/pages/AboutPage.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import styled from 'styled-components'; -import { BaseLayout } from '../components/layout/BaseLayout'; - -export const AboutPage = () => ( - - -

About Page

-
-
-); - -const Wrapper = styled.div``; diff --git a/app/pages/ComponentsPage.js b/app/pages/ComponentsPage.js deleted file mode 100644 index 4c0f3ae..0000000 --- a/app/pages/ComponentsPage.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; -import styled from 'styled-components'; -import { Helmet } from 'react-helmet'; -import { BaseLayout } from '../components/layout/BaseLayout'; - -export const ComponentsPage = () => ( - - - ReactXpress | Components - - -

- {``} - App Instance (props: port) -

-

- {``} - Static route (props: publicPath, path, options) -

-

- {``} - Router-Provider (props: path) -

-

- {`, and ...`} - Route component (props: path, content, handler, - status) -

-

- {``} - Response components -

-

- {``} - Render (props: component) -

-

- {``} - Response send (props: json, text, contentType) -

-

- {``} - Response Status (props: statusCode) -

-

- {``} - Response Send File (props: path, options, onError) -

-

- {``} - Redirect (props: path, statusCode) -

-
- Sorry for this, better page is in process... -
-
-); - -const Wrapper = styled.div` - margin-top: 20px; - color: ${(props) => props.theme.colors.white}; - - h1 { - margin: 10px 0; - } - p { - margin-bottom: 10px; - } - p span { - color: ${(props) => props.theme.colors.brandLight}; - } -`; diff --git a/app/pages/HomePage.js b/app/pages/HomePage.js deleted file mode 100644 index b047266..0000000 --- a/app/pages/HomePage.js +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; -import { Helmet } from 'react-helmet'; -import styled from 'styled-components'; -import { BaseLayout } from '../components/layout/BaseLayout'; - -export const HomePage = () => ( - - - ReactXpress | React renderer to build Node.js server - - -
- -

- ReactXpress -

-

React renderer to build Node.js server

-
- -
-
-); - -const Hero = styled.div` - height: 570px; - width: 100%; - background-color: ${(props) => props.theme.colors.brandVeryDark}; - position: relative; - padding: 20px 0; - display: flex; - justify-content: space-between; - align-items: center; - text-align: center; - - h1 { - font-size: 5em; - color: ${(props) => props.theme.colors.white}; - font-weight: 900; - - span { - color: ${(props) => props.theme.colors.brandVeryLight}; - } - } - - h2 { - font-weight: normal; - color: ${(props) => props.theme.colors.brandVeryLight}; - } - - @media (max-width: 600px) { - flex-direction: column; - h1 { - font-size: 3em; - } - h2 { - font-size: 1em; - } - } - - &:before { - content: ''; - height: 100%; - width: 100vw; - background-color: ${(props) => props.theme.colors.brandVeryDark}; - position: absolute; - top: 0; - left: 50%; - margin-left: -50vw; - z-index: -1; - } -`; - -const CodeExample = styled.img` - width: 700px; - margin-top: 100px; - - @media (max-width: 600px) { - margin-top: 40px; - } -`; diff --git a/app/theme.js b/app/theme.js deleted file mode 100644 index 910cb69..0000000 --- a/app/theme.js +++ /dev/null @@ -1,35 +0,0 @@ -export const theme = { - fonts: { - fontFamily: `"HelveticaNowText", "Helvetica Neue", sans-serif`, - fontFamilySecond: `"HelveticaNowDisplay","Helvetica Neue", sans-serif`, - }, - colors: { - brandLight: '#7CDFFF', - brandVeryLight: '#7CDFFF', - brandDark: '#227C99', - brandVeryDark: '#155a70', - white: '#FFFFFF', - grey1: '#858FAD', - grey2: '#525C7A', - grey3: '#292E3D', - snow1: '#F8F9FB', - snow2: '#edf0f5', - snow3: '#E7EAF1', - snow4: '#BFC4D4', - critical: '#F74545', - criticalWeak: '#FDEDED', - warning: '#F8AE4F', - warningWeak: '#fff5e6', - success: '#36CB70', - successWeak: '#D8FFE7', - }, - shadows: { - dp4: `0px 100px 80px rgba(82, 92, 122, 0.07), - 0px 30.1471px 24.1177px rgba(82, 92, 122, 0.0456112), - 0px 12.5216px 10.0172px rgba(82, 92, 122, 0.035), - 0px 4.5288px 3.62304px rgba(82, 92, 122, 0.0243888)`, - }, - common: { - radius: '4px', - }, -}; diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index d8a6875..0000000 --- a/lib/index.js +++ /dev/null @@ -1,750 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var React = require('react'); -var ReactReconciler = require('react-reconciler'); -var express = require('express'); -var path = require('path'); -var server = require('react-dom/server'); -var reactHelmet = require('react-helmet'); -var styledComponents = require('styled-components'); -var PropTypes = require('prop-types'); - -function _interopDefaultLegacy(e) { - return e && typeof e === 'object' && 'default' in e ? e : { default: e }; -} - -var React__default = /*#__PURE__*/ _interopDefaultLegacy(React); -var ReactReconciler__default = /*#__PURE__*/ _interopDefaultLegacy(ReactReconciler); -var express__default = /*#__PURE__*/ _interopDefaultLegacy(express); -var PropTypes__default = /*#__PURE__*/ _interopDefaultLegacy(PropTypes); - -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } -} - -function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err); - } - - _next(undefined); - }); - }; -} - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true, - }); - } else { - obj[key] = value; - } - - return obj; -} - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) - symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - - if (i % 2) { - ownKeys(Object(source), true).forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - } - - return target; -} - -var colors = { - reset: '\x1b[0m', - bright: '\x1b[1m', - dim: '\x1b[2m', - underscore: '\x1b[4m', - blink: '\x1b[5m', - reverse: '\x1b[7m', - hidden: '\x1b[8m', - fg: { - black: '\x1b[30m', - red: '\x1b[31m', - green: '\x1b[32m', - yellow: '\x1b[33m', - blue: '\x1b[34m', - magenta: '\x1b[35m', - cyan: '\x1b[36m', - white: '\x1b[37m', - crimson: '\x1b[38m', // Scarlet - }, - bg: { - black: '\x1b[40m', - red: '\x1b[41m', - green: '\x1b[42m', - yellow: '\x1b[43m', - blue: '\x1b[44m', - magenta: '\x1b[45m', - cyan: '\x1b[46m', - white: '\x1b[47m', - crimson: '\x1b[48m', - }, -}; -var libName = '⚡️react-end'; -function log(type, msg) { - switch (type) { - case 'success': - console.log( - '' - .concat(colors.fg.blue) - .concat(colors.bright, '[') - .concat(libName, '] ') - .concat(msg) - .concat(colors.reset) - ); - break; - - case 'warn': - console.log( - ''.concat(colors.fg.yellow, '[').concat(libName, '] ').concat(msg).concat(colors.reset) - ); - break; - - default: - console.log('['.concat(libName, '] ').concat(msg)); - break; - } -} - -var ReqResContext = React.createContext({ - req: null, - res: null, -}); - -function renderPage(Component, ctx, options) { - var { appHOC, renderHTML } = options; - var sheet = new styledComponents.ServerStyleSheet(); - var root = server.renderToString( - sheet.collectStyles( - /*#__PURE__*/ React__default['default'].createElement( - ReqResContext.Provider, - { - value: ctx, - }, - appHOC(Component) - ) - ) - ); - var styles = sheet.getStyleTags(); - var helmet = reactHelmet.Helmet.renderStatic(); - var head = [helmet.title, helmet.meta, helmet.link].map((h) => h.toString()).join('\n'); - return renderHTML({ - head, - styles, - root, - }); -} - -function paramfn(sq, req, res, next, options) { - var _loop = function _loop(param) { - switch (param.type) { - case 'header': - res.setHeader(param.content.name, param.content.value); - break; - - case 'json': - res.send(param.content); - break; - - case 'text': - res.send(param.content); - break; - - case 'status': - res.statusCode = param.content; - break; - - case 'contentType': - res.setHeader('Content-Type', param.content); - break; - - case 'redirect': - if (param.content.statusCode) res.redirect(param.content.statusCode, param.content.path); - else res.redirect(param.content.path); // res.end(); - - break; - - case 'render': - res.send( - renderPage( - param.content, - { - req, - res, - }, - options - ) - ); - break; - - case 'send-file': - res.sendFile(param.content.path, param.content.options, (err) => { - if (err) { - param.content.onError(err); - next(); - } - }); - break; - } - }; - - // eslint-disable-next-line no-restricted-syntax - for (var param of sq) { - _loop(param); - } -} - -function generateRoute(router, props) { - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - router[props.method]( - props.path || '/', - ...[ - ...(props.middlewares || []), - /*#__PURE__*/ (function () { - var _ref = _asyncToGenerator(function* (req, res, next) { - if (props.paramsSeq) { - paramfn(props.paramsSeq, req, res, next, options); - } - - if (props.handler) - yield props.handler(req, res, next, (Component) => - renderPage(Component, { - req, - res, - }) - ); - }); - - return function (_x, _x2, _x3) { - return _ref.apply(this, arguments); - }; - })(), - ] - ); -} - -var renderHTML = (_ref) => { - var { head, styles, root } = _ref; - return '\n\n \n \n \n ' - .concat(head, '\n ') - .concat(styles, '\n \n \n
\n ') - .concat(root, '\n
\n \n\n'); -}; - -var options = { - appHOC: (Component) => /*#__PURE__*/ React__default['default'].createElement(Component, null), - renderHTML, -}; -var reconciler = ReactReconciler__default['default']({ - getRootHostContext(rootContainerInstance) {}, - - getChildHostContext(parentHostContext, type, rootContainerInstance) {}, - - getPublicInstance(instance) {}, - - prepareForCommit(containerInfo) {}, - - resetAfterCommit(containerInfo) {}, - - createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { - if (type === 'app') { - var app = express__default['default'](); - app.use(express__default['default'].json()); - app.use( - express__default['default'].urlencoded({ - extended: true, - }) - ); - app.listen(props.port || 8080, () => - log('success', 'app is running on '.concat(props.port || 8080)) - ); - return app; - } - - if (type === 'router') { - var router = express__default['default'].Router({ - caseSensitive: !!props.caseSensitive, - mergeParams: !!props.mergeParams, - strict: !!props.strict, - }); - return { - routerInstance: router, - path: props.path, - }; - } - - if (type === 'route') { - var paramsSeq = []; - return { - type, - props: _objectSpread2( - _objectSpread2({}, props), - {}, - { - paramsSeq, - } - ), - }; - } - - if (type === 'param') { - return { - type, - props, - }; - } - - if (type === 'static') { - return { - path: props.path, - static: express__default['default'].static( - path.join(__dirname, props.publicPath), - props.options - ), - }; - } // eslint-disable-next-line react/destructuring-assignment - - if (type === 'logger') { - return { - type, - props, - }; - } - - return null; - }, - - appendInitialChild(parentInstance, child) { - if (child.routerInstance) { - if (parentInstance.routerInstance) { - parentInstance.routerInstance.use(child.path || '/', child.routerInstance); - } else { - parentInstance.use(child.path || '/', child.routerInstance); - } - - return; - } - - if (child.type === 'route') { - generateRoute(parentInstance.routerInstance, child.props, options); - return; - } - - if (child.type === 'param') { - parentInstance.props.paramsSeq.push(child.props); - } - - if (child.static) { - parentInstance.use(...(child.path ? [child.path, child.static] : [child.static])); - return; - } - - if (child.type === 'logger') { - if (!child.props.disabled) { - parentInstance.use(child.props.use); - } - - return; - } - }, - - finalizeInitialChildren(instance, type, props, rootContainerInstance, hostContext) {}, - - prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, hostContext) {}, - - shouldSetTextContent(type, props) {}, - - shouldDeprioritizeSubtree(type, props) {}, - - createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { - return text; - }, - - now: null, - isPrimaryRenderer: true, - scheduleDeferredCallback: '', - cancelDeferredCallback: '', - supportsMutation: true, - - commitMount(instance, type, newProps, internalInstanceHandle) {}, - - commitUpdate(instance, updatePayload, type, oldProps, newProps, internalInstanceHandle) {}, - - resetTextContent(instance) {}, - - commitTextUpdate(textInstance, oldText, newText) {}, - - appendChild(parentInstance, child) {}, - - appendChildToContainer(container, child) { - if (child.type === 'app'); - }, - - insertBefore(parentInstance, child, beforeChild) {}, - - insertInContainerBefore(container, child, beforeChild) {}, - - removeChild(parentInstance, child) {}, - - removeChildFromContainer(container, child) {}, - - clearContainer(container, child) {}, -}); -var registerApp = function registerApp(App) { - var custom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : options; - options = _objectSpread2(_objectSpread2({}, options), custom); - log('success', 'starting...'); - var container = reconciler.createContainer(null, false, false); - reconciler.updateContainer( - /*#__PURE__*/ React__default['default'].createElement(App, null), - container, - null, - null - ); -}; - -var App = (_ref) => { - var { children, port } = _ref; - return /*#__PURE__*/ React__default['default'].createElement( - 'app', - { - port: port, - }, - children - ); -}; -App.propTypes = { - port: PropTypes__default['default'].number, - children: PropTypes__default['default'].node, -}; - -var Static = (_ref) => { - var { publicPath, path, options } = _ref; - return /*#__PURE__*/ React__default['default'].createElement('static', { - publicPath: publicPath, - path: path, - options: options, - }); -}; -Static.propTypes = { - publicPath: PropTypes__default['default'].string.isRequired, - path: PropTypes__default['default'].string, - options: PropTypes__default['default'].object, -}; - -var Router = (_ref) => { - var { path, caseSensitive, mergeParams, strict, children } = _ref; - return /*#__PURE__*/ React__default['default'].createElement( - 'router', - { - path: path, - caseSensitive: !!caseSensitive, - mergeParams: !!mergeParams, - strict: !!strict, - }, - children - ); -}; -Router.propTypes = { - path: PropTypes__default['default'].string.isRequired, - caseSensitive: PropTypes__default['default'].bool, - mergeParams: PropTypes__default['default'].bool, - strict: PropTypes__default['default'].bool, - children: PropTypes__default['default'].node, -}; - -/** - * @param {{ name: 'Accept-Patch' | 'Accept-Ranges' | 'Age' | 'Allow' | 'Alt-Svc' | 'Cache-Control' | 'Connection' | 'Content-Disposition' | 'Content-Encoding' | 'Content-Language' | 'Content-Length' | 'Content-Location' | 'Content-Range' | 'Content-Type' | 'Date' | 'Delta-Base' | 'ETag' | 'Expires' | 'IM' | 'Last-Modified' | 'Link' | 'Location' | 'Pragma' | 'Proxy-Authenticate' | 'Public-Key-Pins' | 'Retry-After' | 'Server' | 'Set-Cookie' | 'Strict-Transport-Security' | 'Trailer' | 'Transfer-Encoding' | 'Tk' | 'Upgrade' | 'Vary' | 'Via' | 'Warning' | 'WWW-Authenticate' | 'Content-Security-Policy' | 'Refresh' | 'X-Powered-By' | 'X-Request-ID' | 'X-UA-Compatible' | 'X-XSS-Protection' }} props - */ - -var Header = (_ref) => { - var { name, value } = _ref; - return /*#__PURE__*/ React__default['default'].createElement('param', { - type: 'header', - content: { - name, - value, - }, - }); -}; - -Header.propTypes = { - name: PropTypes__default['default'].string.isRequired, - value: PropTypes__default['default'].any, -}; - -var Render = (_ref2) => { - var { component } = _ref2; - return /*#__PURE__*/ React__default['default'].createElement('param', { - type: 'render', - content: component, - }); -}; - -Render.propTypes = { - component: PropTypes__default['default'].func, -}; - -var Content = (_ref3) => { - var { json, contentType, text } = _ref3; - var ComponentsArray = []; - if (contentType) - ComponentsArray.push( - /*#__PURE__*/ React__default['default'].createElement('param', { - key: 'contentType', - type: 'content-type', - content: contentType, - }) - ); - if (json) - ComponentsArray.push( - /*#__PURE__*/ React__default['default'].createElement('param', { - key: 'json', - type: 'json', - content: json, - }) - ); - if (text) - ComponentsArray.push( - /*#__PURE__*/ React__default['default'].createElement('param', { - key: 'text', - type: 'text', - content: text, - }) - ); - return ComponentsArray; -}; - -Content.propTypes = { - json: PropTypes__default['default'].oneOfType([ - PropTypes__default['default'].object, - PropTypes__default['default'].array, - ]), - contentType: PropTypes__default['default'].string, - text: PropTypes__default['default'].string, -}; - -var Status = (_ref4) => { - var { statusCode } = _ref4; - return /*#__PURE__*/ React__default['default'].createElement('param', { - type: 'status', - content: statusCode, - }); -}; - -Status.propTypes = { - statusCode: PropTypes__default['default'].number, -}; - -var Redirect = (_ref5) => { - var { path, statusCode } = _ref5; - return /*#__PURE__*/ React__default['default'].createElement('param', { - type: 'redirect', - content: { - path, - statusCode, - }, - }); -}; - -Redirect.propTypes = { - path: PropTypes__default['default'].string.isRequired, - statusCode: PropTypes__default['default'].number, -}; - -var SendFile = (_ref6) => { - var { path, options, onError = () => {} } = _ref6; - return /*#__PURE__*/ React__default['default'].createElement('param', { - type: 'send-file', - content: { - path, - options, - onError, - }, - }); -}; - -SendFile.propTypes = { - path: PropTypes__default['default'].string.isRequired, - options: PropTypes__default['default'].object, - onError: PropTypes__default['default'].func, -}; -var Res = { - Header, - Render, - Content, - Status, - Redirect, - SendFile, -}; - -var BaseRoute = (method) => { - var RouteComponent = (_ref) => { - var { children, path, handler, render, status, json, text } = _ref; - return /*#__PURE__*/ React__default['default'].createElement( - 'route', - { - method: method, - path: path, - handler: handler, - }, - children, - render && - /*#__PURE__*/ React__default['default'].createElement(Res.Render, { - component: render, - }), - status && - /*#__PURE__*/ React__default['default'].createElement(Res.Status, { - statusCode: status, - }), - text && - /*#__PURE__*/ React__default['default'].createElement(Res.Content, { - text: text, - }), - json && - /*#__PURE__*/ React__default['default'].createElement(Res.Content, { - json: json, - }) - ); - }; - - RouteComponent.propTypes = { - path: PropTypes__default['default'].string, - handler: PropTypes__default['default'].func, - render: PropTypes__default['default'].func, - status: PropTypes__default['default'].number, - json: PropTypes__default['default'].any, - text: PropTypes__default['default'].string, - }; - return RouteComponent; -}; - -var Get = BaseRoute('get'); -var Post = BaseRoute('post'); -var Put = BaseRoute('put'); -var Head = BaseRoute('head'); -var Delete = BaseRoute('delete'); -var Options = BaseRoute('options'); -var Trace = BaseRoute('trace'); -var Copy = BaseRoute('copy'); -var Lock = BaseRoute('lock'); -var Mkcol = BaseRoute('mkcol'); -var Move = BaseRoute('move'); -var Purge = BaseRoute('purge'); -var Propfind = BaseRoute('propfind'); -var Proppatch = BaseRoute('proppatch'); -var Unlock = BaseRoute('unlock'); -var Report = BaseRoute('report'); -var Mkactivity = BaseRoute('mkactivity'); -var Checkout = BaseRoute('checkout'); -var Merge = BaseRoute('merge'); -var Msearch = BaseRoute('m-search'); -var Notify = BaseRoute('notify'); -var Subscribe = BaseRoute('subscribe'); -var Unsubscribe = BaseRoute('unsubscribe'); -var Patch = BaseRoute('patch'); -var Search = BaseRoute('search'); -var Connect = BaseRoute('connect'); - -var Logger = (_ref) => { - var { use, disabled } = _ref; - return /*#__PURE__*/ React__default['default'].createElement('logger', { - use: use, - disabled: disabled, - }); -}; -Logger.propTypes = { - use: PropTypes__default['default'].func.isRequired, - disabled: PropTypes__default['default'].bool, -}; - -exports.App = App; -exports.Checkout = Checkout; -exports.Connect = Connect; -exports.Copy = Copy; -exports.Delete = Delete; -exports.Get = Get; -exports.Head = Head; -exports.Lock = Lock; -exports.Logger = Logger; -exports.Merge = Merge; -exports.Mkactivity = Mkactivity; -exports.Mkcol = Mkcol; -exports.Move = Move; -exports.Msearch = Msearch; -exports.Notify = Notify; -exports.Options = Options; -exports.Patch = Patch; -exports.Post = Post; -exports.Propfind = Propfind; -exports.Proppatch = Proppatch; -exports.Purge = Purge; -exports.Put = Put; -exports.Report = Report; -exports.ReqResContext = ReqResContext; -exports.Res = Res; -exports.Router = Router; -exports.Search = Search; -exports.Static = Static; -exports.Subscribe = Subscribe; -exports.Trace = Trace; -exports.Unlock = Unlock; -exports.Unsubscribe = Unsubscribe; -exports.registerApp = registerApp; diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..11830fd --- /dev/null +++ b/logo.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index f2557e4..6a667d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -299,21 +299,6 @@ "js-tokens": "^4.0.0" } }, - "@babel/node": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.12.13.tgz", - "integrity": "sha512-ACLDLxlNsJZxPnwSSwuXp87KwjKY0NAFko6QCnBjJlxd+gKUDLLG0Y49jO+/EwqMJd9D5/BkYn5Qb1bgrYnHSA==", - "dev": true, - "requires": { - "@babel/register": "^7.12.13", - "commander": "^4.0.1", - "core-js": "^3.2.1", - "lodash": "^4.17.19", - "node-environment-flags": "^1.0.5", - "regenerator-runtime": "^0.13.4", - "v8flags": "^3.1.1" - } - }, "@babel/parser": { "version": "7.12.15", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", @@ -981,19 +966,6 @@ "esutils": "^2.0.2" } }, - "@babel/register": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.12.13.tgz", - "integrity": "sha512-fnCeRXj970S9seY+973oPALQg61TRvAaW0nRDe1f4ytKqM3fZgsNXewTZWmqZedg74LFIRpg/11dsrPZZvYs2g==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" - } - }, "@babel/runtime": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", @@ -1577,12 +1549,6 @@ "node-releases": "^1.1.70" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1755,12 +1721,6 @@ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1892,12 +1852,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", - "dev": true - }, "core-js-compat": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", @@ -1922,15 +1876,6 @@ "integrity": "sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA==", "dev": true }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, "cosmiconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", @@ -2772,26 +2717,6 @@ "unpipe": "~1.0.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, "find-versions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", @@ -3038,15 +2963,6 @@ "react-is": "^16.7.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -3479,6 +3395,12 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3748,16 +3670,6 @@ } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -3919,21 +3831,17 @@ "sourcemap-codec": "^1.4.4" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -4040,20 +3948,10 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-releases": { @@ -4130,6 +4028,110 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -4192,17 +4194,6 @@ "has": "^1.0.3" } }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, "object.values": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", @@ -4272,24 +4263,6 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -4299,12 +4272,6 @@ "aggregate-error": "^3.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -4346,12 +4313,6 @@ "lines-and-columns": "^1.1.6" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4398,29 +4359,17 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { + "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "please-upgrade-node": { "version": "3.2.0", @@ -4957,6 +4906,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5028,24 +4983,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -5156,6 +5093,17 @@ "side-channel": "^1.0.3" } }, + "string.prototype.padend": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz", + "integrity": "sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, "string.prototype.trimend": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", @@ -5545,15 +5493,6 @@ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/package.json b/package.json index a61feb7..1d0dbc6 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "description": "React-like http-server on Nodejs", "main": "lib/index.js", "repository": { - "url": "git@github.com:gigantz/react-xpress.git" + "url": "git@github.com:gigantz/reactend-express.git" }, "scripts": { "start": "./node_modules/.bin/babel-node ./src/app.js", "dev": "nodemon ./app/index.js", - "build": "rollup -c rollup.config.js && npm run copy-pkg && npm run copy-readme", + "build": "npm-run-all rollup-build copy-pkg copy-readme", + "rollup-build": "NODE_ENV=production rollup -c rollup.config.js", "copy-pkg": "cp ./package.json ./lib/package.json", "copy-readme": "cp ./README.md ./lib/README.md", "publish": "yarn build && npm publish" @@ -33,7 +34,6 @@ "dependencies": { "compression": "^1.7.4", "cookie-parser": "^1.4.5", - "cors": "^2.8.5", "express": "^4.17.1", "morgan": "^1.10.0", "prop-types": "^15.7.2", @@ -47,7 +47,6 @@ }, "devDependencies": { "@babel/core": "^7.12.13", - "@babel/node": "^7.12.13", "@babel/plugin-transform-react-jsx": "^7.12.13", "@babel/preset-env": "^7.12.13", "@rollup/plugin-babel": "^5.2.3", @@ -63,6 +62,7 @@ "husky": "^4.3.8", "lint-staged": "^10.5.4", "nodemon": "^2.0.7", + "npm-run-all": "^4.1.5", "prettier": "^2.2.1", "rollup": "^2.38.5" } diff --git a/public/code-example.png b/public/code-example.png deleted file mode 100644 index 0a6fae4247091fe6465f5461fc33ed482391c9df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61259 zcmb@tRajh2&@PG$GPt`lXmEFTcXtU6gL?vlySqaO8axDogh7IPg3I6pcSx|!_wRFg zo^x^bzUf+BPj|2C>ZY@~FIBsBCNyrgBK%b4V}T1xdf4ILyu<}ygCP;>IX zS{g8oO1}1RXxGnBvT{+e^G!<16O)osFtbZXmhit1(yEzwr(r4{l%ZZes8-Uan9(ek zSmPcqMZ+zukk%j-UZ9lSMlT}EqHMq@qb}$Y#w`j`&g~HMPf^M5l6G&>inOT$R1WX!2qHKyypCma7+wWt>)rjVGDEDVlf<)Ib!jFpZ3L`FfTR@$G| zp(Wt-f!oZTPDq-^(o@Jifsl4)2PF`Men?`KCYE+F%Ku}Pqmz4cSF=?%L zD(dQ#)HL$?>jI+a;kO!OQd!opVi?dX{)Bch_beSJMsq$Si?g+;|gxD@=1QezY1J-ob}qa{2Y zM8$-eWMeBr&GKSwD}B;slN`UexVbT~QM0hI1?9^dy7C)pa?8`wGjY=Jz7tmzGSIZ; zu~Q2Y@s8J*aWphGmgdtClaR0u65*qyPS48JlCa8+Q!OYeTJE>|QD>rSU?3?i?XDAT zV{czvR%Wi~X<=>6NJf$A`jwG|CET)jSX`E!Ng&~aLbaf7nif5yiWyh0 zsI)&DXBY=hQfjI*3tJJNa3+u7rLJnLumo)v|3wpXJQtra1G5zqYjcVIlAHv2CF?>V zJ&_oNk_b6WQF^l+L>kUOY(gC$DxVXpLRQOC5lBPT#N}^F>7Yef8AwyqmxT1@07yPM z8oF>rmar|`Ie$esxZ?+9IcdFsm6KH{5Rn^0UfMW0X!+$GMr4$kZ%f|%9s++x3xzYs!vJFgkq^_Y!h)5!q;dd=YqAjd?;sKw6&}V61GF!vr^`^E1bK%` zqKA0S?=soEC($CtR8Sgq)aEp2rWPEDTE;YMCj>4H{2*I3f&I|}rZmdP=8!pw-9;hz>=Dp!!r{c zu-7`eb#ne&Zu#@rapJi3=1N|0^3?n|SX8qJPO3o%FT|CjHb6ILpP8B>yRK$q!dG|% z<+0}XUV(d651dpn9-i4MTo>vh-mm}2J>IY7H^LhUZ^v2;3(^{jCxc*~De8X7WFkkT0FWDgvGmZx>CBqIe+UbQPB2H1?BO^+wK>THK`A$Cc zkk^%7-gk9k(s0QjtD*=aw_ecW> z!G+TcFgq@*$R@U}wVroI6$1^!|*}*Q^qz zEwqd^6SqYd7VcAY?z(whG#SFwr>S_d>M+<#+KhsVN0GPhYrGH`v=(r7;92p3MU65Da8UJD=BkHQQ~2wzFCq8h=hg#3g`P~P%04kqg1P~OaS7qH)~@7 zB3Hkemku6=Rtx~~)Bm52-ODw$WN+>gE&XCX-G7EGClv#Mw?IQa)Z*$>g~CyyAqTLK zl*&TkIFS&2m`PxjR$*93h}{GjGi6p`IS_ae0*nhCuK$-#xy>H;rRtHM6vI`UDFL8P z&=G%goQM(BXqC)H$Mjb`AwZOw2t^xLIs|DGXE2sC0zL*qp@mRXm?1+|aB&W6s%X8) z_vUqNy@HthHkK*>Dx|biLbGwNcyBePs>YgxT=5VfXiXAr9f=bP$sue08J*NLU%O~Z z?&lkA{WL7Y7(h#u@Wom-eUqahI>PZ&{7{{c5nFMeC7(VU)$pi|Cm`Ayqv=%u>OEjH zY)k$z4}ab{Rv~^Z8X*wv<80^^a(hOXHOWsn^kAH3lE2b}S5*pFlK$Dnm*mDboczLZ zmZtjTust)0_QcqwUE>q_b9xzrzyMVE0oKdbT^x)76039=m_kl%?*15%V!)bpV{o;G z`meoc^}{PkATz%l!@xajnr`fjh8H>lqyBc)DCmFp`A8=R!Im;&!mGbq&BFnnjo7l$ znpAYx;t9u%)N6u`89qdll0q`)T^`@;BE?{!t6?o64If{_e*kq41h6p;YNZoa%HQ^^)0tC4J3B*G`TOq- zJAVIQ$kV7&3>0DKsHjTbY1;#?Bv(uCb|07~u&^Jp%pTsD1bgTcrPAqwmz~n&kLHB% z37-#Ru!m9zW44;lse4ml4M%D;1N1pqAfA|?-HF6=f1d65*>7xGcQsCSkN|6;=mT8H zs+K@3ukVoW+fp@Oj^Z@=r8Z};K6|YL-78|GAor=fT4VUT4H%tns0}?J&GB5tEppa$ zJzfVt#3toauAnjhFS3p7KPYmIAKF_C8o%EAxZR1Qx3&tH8OL{u?+`e3U@?x&3I+a# z*o<>|=kLl9^+t4!1ei%sNvUP5PzBU4FSDIZOu@Pq?*+sI(ca`y&IKF{*%(5IS1|+K zc8Pqo?45ejYG4?`ELR}c&h|6HvD~dnQFByp3Z1&aw(!oL?)m8*<2n9v5rPY zM?v+Se7s#-Ewzc8B+^GOWzWj7daU}pe>0nAb-AFFs7wb3{=czZ$4&F{&1-Irf>8|w z3ihF_-!vziQ0-BKvmv4EQ#)Y7WL4wS3eO&%LYg|_)7`boK_IGVRz9do2SM^aWd5`I zxfRJznlwO6`nd{Nv4=yz-hlcYTWuu!1B=U;FZ{-Pqp`g!!M;GshSZPAvMpop1P1wr z*N;IvUASDCv#YQ`$pszpjt~As-PzNPwHy0L1kcBIzz-1emw3H+Z}9~xjW~S^L^O(s zmXg)732?tmpL%kCR(BtwGIJ2^Keh)$2^ENBA6KIEoF!y^vHOGXO&41BQ+>neSK#cw z4>K_8$NgthSx|=wM~**5k(CXKoB&i8Tp36xtv@BxoZKAAQT9qfOc9)rwn#P;_h(8a z!7!*^yby1FnE8Tnkf4)1z6eHupmBJ;qr1xvh*G&&WhyA{fmoA7fNBAvT6*t$3Jhr> zMM;6$rq`NOGN2{H9z=Vc81$SDN@<2yiU|&&4GF?V8Nv zf6TNp19`}h(qhw9@2;2PpL{;y`7W0Z<7cj$We6yykO|B5M+uXHROKy4lxhLnEqVh` z-?Xcu2XvQZ1H6>c5*JFPYzz3T2h9P028R+fCn>T42m(cbX+<#O4lG_?i2FRn*9-3- zs$4|Rf&%__BGlTD(=UbceH5LfQZTMye}%Kd_rrk%KklSAh+WBCNg^2JAO*g(P}gdg zb3g*8sw!&-CaVAR!?GvS)k{jMrsVHqEIz{9toEG{cb}OA4e%WalWVM3VHQDHS~Dp# zQ;*xFR#ts~mI`?L`*({KtW9Yz>aY{{n>P1F)7SEBokqd3fCO_l;Zs6iQ#qhQ_+^hW z9I@&*nsnfq;lN)ZVT?uftIul2Otp(!qW!g)R#=k0rg%@t(bggM=gEQjs5?T*nm;~v zs7@n{&F0IHGB+cY;SfanXxYg4IJuc&REI;ghe$BhK^RzMqD!Bm!~sPTHe>8d|L4M*ulyo6JBzUzrjAA9KXd<{%M8IASc4a zh>>QYC--HV&7EnF^(fGe;ekDNL^VGPhN%y0`OtrA;-H6azkM6KUQg#Bx)_;F+K<(W9?d@BISM6MMQIE@(ky`P6p%jzUWAJ{`xNQ#Eo)H&w#C>wc24(<%0I@y=zanxPEYIzU;MiMa^^j zL3ZNZNDPKz@p8!m-XGWdBO{#D<3c#0;-O+I$+qj*oceb=@R>$@p9feTTx-w!C5a8g zY@*%tWtpSt7sk}!_!l;sV7qoB%?-U*-)}B!Nu~AT6q#1FH^V=NBH#wbtAKZYaVm>A zi01oY%k8qLHF?xKyND?#kJ#o~{g}yV^Pr*gu!cNufAx!Tc#ji^iGMq&M zXNH%Mlg2ctH*}N4`5pQk0j(@0L zjKw^g(v-g!e)24hFo`|}5QDL@4bNRxcw(!KdmUHmCsNEFcY(C& zaLL-ZNrHjOiJnGXZmIr~cm@1qzq+qF>Q`bCG#< z7TxNs@M7#1ZFZZkZfkq4NxrN1CX~gEeFVGtcuwtZb+V(m>##8fSLiUMzw1=SU$k`R zt)%~?vsj>#5_h{w;i7}p$dE95$DQXNV01KBrW|% zor|$$n;k||W^!k4&TJ$QD~kq1Uetrx2!&(4ZNGR4Au)6nx&&JUk!1l&HbP74qTGknno!LXZ2{lPE$eU zHHQQdFNB95!S-X6jpI*yM(+IOo%eVKfhd|U0;l}v&MRUuZV?3ZCDmpK%Xa}2uQTNf(%)C_^6v^MCWtUv6@ zc;{U+$X$A-eW=75K(&JFMr_bD7KvMbtfa;R@XI@Aa#8XDnBrjiw5<0x=oW8)0bR!# z-pw(eP|!h;SLb_U2gy!A5u05;sG8lttMt^{8%RNQP>adBVy^?4Z4Hux^nTD zrQSy**jX9H_5=FC3$KSL6!NN?eE5@Q}9~!BBIak~yU9{RG=5*!TK7cKG`wLgO2U6p8x}+~VCi zQJU1QD^|TGM_9z51-1ENtygI4d}cE>75|v|&KAUOVU$45XSM6Twoa{4S+#lQ7oS{( zGU@Erii?+V?BTQ=NH&why{~e!RaecB80|uhpMAhraX#olNOpjNEFJXO@kU1Ow^I#k zf|;96dzumr#5aSXgYoCs+R;%ov#UpCQkP$LD>$)kWxl&kx%2DgnQTLyYkgJ_Ek{aL z(#^`!_vCsM_{SI$x_^o;`MKoR}dICN2oK2?jz~y_pb8EV$*JrFYKP z?L)z_{#|#>Z^{kOZn$7nYjI5VKL#%`=2zYDPc!FhuHvuKeSag2TAV60Rf89x%*oC7#{Sb8@|E z*)o2Hq569Ka70x@lPZ|&{2Y&F$ z)O9HMlMQnM`&tt(^g}RXbEs#EyNzDw0@6{>v^1RQ9(H?VeS??$=)!B`C0veExuFhI znr?0}EgQkV_EGN3?h{>V6&&hhJEM&_o#N;M;-fJu3)m{HEctgc&&*B`PlO|QQnE*m z>{m@XZ8)Txb!$Amcq*k%Y8{AK(A_5OdTS8s=3$H!1_CZkHe~)O_t&fx^sb}E)q0(u z2e`*?O0jO%O)M0uX=-R2Q07n>udg#^I2(C9V$joP79H8f8)n@~3WH^0iVF_1u@o7z zzQ?>*8STqpB|t0knu__y8!i=%;Z2gPO{moVGT3C6i%c){|7aJ%*o%nnyTYh{4G3bZ zG3-b7voNZkD^Ir2fls~5s033Fw@^t@9boD0u9>V?!}hLFNcrFQ$5cUu#(^%9mu)zX zSA>p%PS4H)U-6g3yRaxDJZMkg#|5m%`&NoM+@@hVvjrl>9<zoe2$Q=sa%M$IjYw4^ z_Hd-S>%u>uM7mfgU1Ud0z!mE`JUziDO}o_cxK!kq5({m^?h0)#8%T@FFNRGe{?6tEXj;4pdU16U49L9vTSWH0H6G>xPU9njp1H-W zi9COx9P^bl_?Q|lbcdpPnG-7dWUiS6Q?v|}o2LrIz1;8As;S>Sv#=LNvQIyW8W0eU z3u7?G_@1?6rn%Bwa{nE0+`fG66p7YE&16?XxM74Pyda>*y=fRjWO7K8BA-;(+ zTHz=*GyBF4gYsinG01TDQO+}RSwSJ{8j2D?a3j?Jnq&QyA)4^y=RfzLJEGHUrcGhr zcJ$XY`vqSpNf0oIUR|Vb_t$tk+Tvt@Q@P!$f6OXg` zx4lf_x_-Sd02C5Iy^b)_-^Er~wlzMB9H8FaiDVYh9xF>7Uhh}QU7(kUy`CVh%*P5& zUya0$enk*tn8FCE4{A5KByGnp>n5W^{9ZKCRiiuS)owCkCmM%s6JKQp_J| zU^6p5aNJFkr;!H4L>otgnx(xc#(wYZv3PN{OexSU<=nq~GOQH)5tRcw6i~LkDMpBt z1Iw;6Iqa1(O)?0*$DBK{oGvfcbYHaiyFV0z!_EW2rcJinFaQ1bk4GX*BbyxnN`krb z#Jnb6Ct8hKDBG}T$;7=w^6ja2YOad=K@@UK-6P&FnOSONYv!d3svEQPjHL712r}j`R&H<^pkS?h($OgGFupN7=IV^HbaXtT;o(T>m&tByH$sI zzPeLeTV;Bqf4suR6WtMYEFG+wd#f12=%85G4A*!nNI-)Fnn8y`f9wi^B<1D(xr^## zGm}?QpI-}q$FKi+?l%f8?wZy8A7qwK^zSP5)BnV{4F>B5@4eWyig&X^>nNUka9y*6 zW5Nb;L#R8GUlV`qu|9xsx-sROgq|sJgYfq-?QGY+YpcnyaQ8IOH{moB?nScz$VIL7YA;t<@Obo>zbZ-q!5l3)@l=gNSXW7iONBUew1VxIG`YBo)j4G;_Nn&Z9nvrolg zxaQ`MIhkbIjiMFuSbr6O>LLtb2hueGu!^6MxBJxuK+<#^X zMqN#Hygfcbfkmrw!uItw&~z?-P2H0_5#eM;9T>FWa9pf^c3NSI)!ri%E+#rJ%uv0c z=#12oP8TW3ZP_xW2`*nLcIf(6MGVz>4y~p=2r>J(efixZGzWtvcP)IUwq9-AvT@g( zsFM#x#+HC=eEK!_?=P`)1|6kl_DeI1F_8ml?PL zQjWAv^!;e31oJicgM zSpP&+W&EH><*=8Q*Up4%LI3!^AEU@0fm3qJs2pie33$zL;z$p^sKnqn4EsPGS$N(2 z{I@|Q-VjHT2VnSIYPe;n4*##+?9WvC4jl6QuGFq4a*Qw^X#2(Vm-SPu5c)193tXt~ zu9aF5{)X)GhMaFSJ;^iM8G;dCK*eIqlRkPFKf`jpYjBD4J3Cmgv2L--TIk{SQ3Tx0 zt@byx=jShlSTtXi?`RjUSLmy&1iV(CmOomkT2dHtC z43(U8a(3NF1-b#eCy-rze?WxpzqjtvDdRxh`{O%MiH0|HHQaH&@awn1ZwEcaj1AeY ze2abaHgPY6_!nH`H3}zM!L3~S>&ldNp#>0i?(|*8ALrkoF4!?+g6KJR=RCXaE@41J zx+<8yBTD|3Yw=(AdR5iv-#>pCVlM;9c%ONl$a2cq_C}K?n_2Uy6|1GXbq`D~fA;My zej-+4G<8hY!`$zJk3`=-CP*L$9Vjl$?KV;V_Nyo1+bAIucu$l&4gIEub(=zz_XB$5A3C9F@xP04;4A_c78DdY585)IuQ2{up z|9jMtFje!!0>MEVJ4LSu8Xm87T8_NO$eTjq(yfoc>~pJo;6h(#9)k z>;f+gsbTEHf;mOY8mdL-ZtwiuM=O@6A=W%m1Lb^kad0KkS-DO2nQVuYn7)HRN(;bx zuM@@pkN*@X=?E=TOS(ry{%*`Cf9?jnn&s|5|8cZkATL6*#CzrajUkMLPM)Db^41WK zO^*3~^qV_@KvA@s|G+m%IWI>nLm`~N|H+Z#9<^N5S*VE$%lS=ET^EK=5c z3zF8BCJe^CXq$u8%J%OyP~@huvaZB&Je*e!9R5gzma5H>6h)5b7b)v5o5@g8JFlq5 z5>i9AQCNiG$l|S<3$x!rgfr$@o@f<$BTT%Kz2s8FC|8BQSuzGL+B|=DvD~3kZo!!) zf@>Q)ZC?9Mt@YvjHhFQiL7IZ1ZW{W0u>mcqb(EK?TdCY>J&wIiVl!rNNJ(*kFT3}t zT6WPy|KxWvT7io-|0j1LuYR7>@xk6>1Ugdi6|b5*E04w?)t z>^-Ao9N~mbp9S=KgJRla;=&SPIyFM|-aTK5c@ubN)nF3aCGVLdRxJ=gUY(7%k>I=# zIhkL4XS)6S!@{3qE!Wj2k-Q7*@)cZNH6|l8bD<2aCx(t+8%k!KppF#`_lAFLTYDld zgZr9@uZAqi`nTKauBMVpM4TM_9&s$~_-yma!i6f#FL;H=Swh}wVE66ZE!h-?ZnfL* zzykiLc8|fv`Q?GGX0+#$PgN;4373GFJ$C4_%BCtMo|#+p;-Vq2apv*UTU&EV^e0ls z)dfjjr3<_mQAN{j>F?WnSzWI{FbtgG|7Vj2yQ*ZTH;e-b z@?U>(^e%E7>HljO2Y*g(PyIKHgW(U!>mPY2R;1A~Lr6IBMrd>k1_@f1(z9*t5i79* zyjW&CCw*eo&H>4@6t}s3VIl^*>zune}`#m{G*z#Yfg!N7jCm z{Z07-tD2xvto-)(Uort6(>;jXWov6V+3!soSbmJ8m`>#G2}`Cw6YbMKP`lB5M~v@7 zko>+vulOBz-g6h#pj*6c96KRJK>F6~Y~@8%$yCtY7*h4xn;G-#Zmugfu*i`-n=yjz zeu1EfSk7AcEBSIC;% z@j^t^!q?^WjpUdq$L$O0wJ^B+`+CkLo=Dt3ElO+Qxt=Vm=80x}^eI44G6DkKp^(Jq z<I-faKH}8v{ka{Es`%{ zNcSH!R3G6Jc%0F?$>H)~pQtq{XMgtJ$F?(IWs1jlWCHJYkcW<>C5d!h*B-zxyoqPY z?Z=_!TW3-G^%JEEO6M~haIQR1WY;K*6@L7B0b4bjGOVl4XtI9=pgJv!1 z-)KRg-VEBnC3TKr9OU!q5vUOX;6=@Tf7o0&W{Eg2$MAt~Z3P5Qeq^3TED{W{GHZskgL{|cv>6`qA2-n8dKRdsYG!T9)$iBlMYA!3R7AdxR zJwq#L3=y?SOjiuw1xV)0>$Q-k+d?!8DX>y*ETq+fr!{{}M#rFBxM+493$ZD_IPPs7 zn5N2DPQx`!Br7;@j!5q5O{2z`25UxilDk+{@`D2<*w11p!J>qK;_5;*n{CoC+5*}HMX4V7DgP|UVqmdH$G2FT>*aSnKija7(y zYZrG(fC*U+CPMQLmqlsBRgh>0|5m?e`s;@~+m&hu`K_DvUMK`Pzx}FH8Jui971vzY zESTe0+fq zS`JgASZBL;z<0~MST9ekr!|jhE27(9EodW+Afdmfp#cq=8s~2ukj&P{PW%^#>{(;Qr?K9$CVogC z3f-FWCgO{mZ6a(Pp}y*)^J!jPPfEoL3mW3uuSZ3C1rY)zt_V*A2UVgt;YL-Of@R_6cTS&; zV6Bit{M}p2`#@G{Nu$>l^iU1+%{`;5jkIGh64$SZ%2RxrX(ODLhYa<5-~bO!uC{ZB z$DFkqly*T34>=kj&oryiBc(nEUxUb7_%~n*;su$$RHQe0SZd1M2yUZHDiEtjtr8w2 zrjm)J%P@^kI$hGe1#AG1$isDQftVMK^2GT z7)kk7&ARHneXct~@1VnZjk490d!DfXO&Pgc0=c3RzzmaND~iw>Miz-U{dpptaU>J% z#K@OGZv)TY!j?aB4mU8B{IDry@Th-FDKV{JDKi=g>pSsK^dP94{xt&$O90fg)?17jA0-4`vm>gPv7pLRz$kR4={QqT}={&(%Kt zsCDq}svIUxdz|PPfvVoLE|`ZkrOWSC*D2)(0HsroG)qazRi%qlA5!@gDp!E33U)D6 z`=xSWzh4oXw&!rAUNXo_ z*Q7n&YFIbxdy34w0sLEL!^c_d)d@e+dR7CJ5Vt;!c{m{XRIo<;R2?!DFD_S5gx6it z?Qcx>#{!kqF8D8p5vygjBkP6zN+rLF6MiJw)xR>eW;ye6^V*6DLvY4~8*U0zn&Yom z+C(TMiL6d_%;Z8SrT>c9AIbv#@-&R3DsCCW$^zBo`6lJ~p+%5K$8y@wY4sF6_yxBZ zp>TgqF^P5!W-O8dSOjKQ)jHKBBmjclW2-P4!QA=~Pc;lYTq?-kdwerly;u?#Pb2k< zqD(Dh+6c7Tx^Y#DfMKb`AMw>~-JfdvHMp>JvY8FHI97nnxd}?eLCpk>9HrG_Wo99 zUS4$(ESdS96z=oMvG-BoL7d-u44|3KG8T~YpQw^sI;L)Bpa2^Sv0O?gOe9yU~hF-XkW6h|a28B~M?J4E-=1r&O)X%UAdeqzHov z?h6P#im_*vY_Wky3U1K5jsYlsBkLy45GG+V$#4T95Q%oNTaHPojwRB!q^tUlBu=@~ z%B&csVR{N8e37Zn(7FIa;I_crn>!U)1=i-bkFj~OlgQM5wPFz>+N|_z1riDVjSWog zPIiH=9z3tqfP`R`>p0s$g%A4;YFAm~>Mvsi@i|m+!RS*OmyW!8Il^Y>4w7QqyK!x8 zU1>V9f!i%vs{lz8#?97JkkMMx^MvtPxGp640YsGDO%y^PMXl&UJBWXBj`@w}+fY)Tk8!yDjK&%+%V<|m?Dy{R`C>?9xMN2*aS#akCd#;yL!C65aJ`g*arb7j6 ztvq-B;0$Txeg%{TL~8c4K$!wb&{aSW*vSZVP2xCsK&k^4K0#Tp;_Duaa_2|U#&QLa zsSxz2M#WIme0FiC?RTF%MBe(f{p@zY$3&vI{o89Tu-CDN)41MPtOP^w0-IjVv=Ws< zoFh9V2?~4pFthTlaA%5;Q$w*SQTw=|Sr)Y_C|VtR(z%&{$51_v_@>Qwf*o#5&MSe3 zGj+jaaLjMQ^J9Ip>h(P1fo=R3L@y|bGE5cpP&$+^k^@)WvH%rD1BQdd3iSpxK%z!B zdCr8AlRwcF7W*5VVJlR@vV$zg#E>)8@!LzPh7w9@YDw=NBAGGa)^9kJ)re#@XxD71 zR=0YU@b9rc!mFEJu7MtwA{GA)X*6UaRs+u{ZU)s0HS*;&%5?A(1-tdWH}@-6{tdH* zG!HBGUL~3KGz(5iD|0!=qO})#l-FXcn4oUawuH8lzQs)awShF7wZjfV`o#^+$A7$R z9N_AHxI(-T4+8@O7VVlq{BiB-fBcBbzW{>MT>g`C{bFnILW~d2*xoK4c9}!cStOKu z;7?V>os=?e@4P>Gv`dIElz7=hvd@n9LABKL+ z%{Ar(7UEpp4>*qs6BUddY1>qpRkgWx#ZjNXgwR1b3dc#u$H#?HOb>3(0|SY@lWF&j zG?IM<9XFb>^AIO+Wn)W`z@YVl9TRa_xJu-gZob zG0DxqcWd`YeoO6hSZo#JqnJcUR1yikQlJ3Zuc5lgY{a<*&ABm$#%w9u+GleGkzapX zi8BNUX7#0?Rr)s-e!z@br77AS`S;L$F@$%5?M=>hRK;2+;4o*+mV!TVI@6~A*8YKO zwrmUzAu8D7bBilmUAXe#*C*`+U+ZRoZE{Sb?_<*0PKJBB(O*~OY-Q1uhKyH~73Xio zc!`vDSLseJxNWZ^@(@vlC8A;o`pe$q)Xy@fI_P&5E;6dxCI8YIn{mG$jSdP8g()j* z#l{;26I1#ghlcHJX9*JwbyLg*!~f341_W;h<;S;QZP4Ru6L*9@+&&JxPW1M%o>!ZP z(JRq`N{yHu?F)Jw8*~j;9PKN=wrF?%Mk5r!`9*^$Ei7a-DYcZOz0RjDJ79Oz$2B0Y zt4_S`zwUM*d?41PdeBD|hj9FNf}m@BSzKK7bdh&DFu9J|y$0|uzWm9*`ajZ9iC51Y zf3;cmAKA`UX)0$P`xx^di8p11#+Ng{QvMHl>$J(5&xpgj2$0t%AkTt*9J2$NU?*^j z{X((NI~7Hf@4T%6ywZP<=^*89rO>n7YMKZMc0?iA%l_t!|1?I=-(i0ng@?{YMsYMK z>0~KS`tms%Y>VhldF+_NDd8vIssH6OfOvn;Ehba-_|kt5xSGKCG(LrO#V|2Hkp_H< zSkOW~c?t|%Hd6Cx z3A{l2cs3w5AqKxit$M*ZYz5c)Dm@47-N^dad(iVyS3ie4i+1hdjjhY_0Qh!r*v0FK9XCfkXg+UF!}lVH6z!GG<4gdkMYh;Sd&uWr^397A*L<4_l{Qgm--(Ax`UKCKp&9x4590|mtR@B$a;_b=@b?VGjHt0EV^7&jg!X5s{NyUU9o z4=tsw@7JsV@<4NY#Eg3T*RN4RE1wIZDgq!LTnPt0=F~~Zfy^P5R5}O06$Iq1XYz+E zVvbWCAK%hV2diaiq~%msTTZcN%v4}|iuu1!RPim_W(*IHdNozPFVBr|X|N7Y)aM#* z@i4Wf#I{y3*4b2zVOkQPghn_9T@cdet{yoQF}bV{B;5v939$lFh6;1MICyy7Da_b? zPIOm6aW>u*PAOWYM}r2eJv~7c$kwX{;V1g;o^mrd5euB!`45Jdq|fA^ftv@r zA)B`R!jh7fVwsJ{!wAlf2@gW2vsNPvDOC$G{XE*5WhR^sxGjr;gMMM+P-7=2&QwA5 z93)y==yB{6+>A!Nyor2p+*x#K*1S16JVkje9Z3t8)-tL3xTp+2_~x%Iw}1aKj%9d+ z6P6pK)t}n?;vt5`V^Pt`Viyy*aKGr2OhOHP#Mu;@- zW~i8F>5r^#ZbgAr=OgOuKfb};G(q(Aoh5t7sclYv-d|P%`=Jg^@G*9f@w9A?H@r-W zFCQCL^rJQ7!?yh~{0?c2LH+DU_~_lLoi@A`c-PEX9N-4L`5pXNl$OH&lMH*HoWLpY zC&U}NqzaG8Z9=Lqv!v0su(Iq);-^!y`H-{}myx1tvk_e(vL6Ayz`q6*il?@Op$J&R zlNWffHw73mgT*3Owzq z%k5k!WD)rgfF~xOB2}GLu&FscviN}{+D8P)biR&zO+vx{wwO@NeRA;K9_193+F#V< zxptf^3J8ctuiW_D010FYnfz^{?_%x9D-%>C+k+#K#x%jWRH&Snrr&L+X7Ka{a4+EX z3CmNGciPxv0Td~*4?HFv-nCdQz5an$+V_6b^2JbDRlqOL>T!wP*Nvhmvb>()9!PX~ zBArOOV(^zd52p5)9Ca}=gzc(ou+y!%?;kKFw)6$vSh3(z-bvd%hNGX7>xPux#0Ii@uy5kdC+MYwWzlPg?xWuF zC|ED+!OqO|cD|E7v|tRfq2Fhz+8G_@z;~tY`c-aF%TgDX0I)0|))Zc+*-bFj0QQE= znqglK2P!G!)!WYuNNul$xx$dWc^+zv%(2N!=na9{tak&Y`qT}~w?X0tkmE{8xsLDL6UM!R%9?!G&YuB-alzym2&@Mj+Tw?X`&B$YuPf(`A86e0Fb)!Jm z8g6O8{Q0MyfpKZ>fn7~~fOodcYDA@pv8udESP$DA{kqZv({{oa2gtD$7MQG4ipt%9 z&o;G(Zrj9I#3TU4^D=2;1D`BR)*wWWkEZ1{)9o4By& zV@ic0wNmH3hS2g>W#79GgB_X|$>Lsr*D+GyxV8=7c8P$oSZ`fdjjo)(Xib9vY)p*E zs^~@!2vl&00{Bhyt1<8=7j}G4`^evYiDYg;;SA|E227yFjKyH5S`)=1`;)&U%d0vE zUdScqWq0ZgvyqVGMh2^$j8Z;qM-B-YTO3H64XfDKzOY~ocS<1Dy7z{re(o5!j-8H7CgcKFbdpho736boeQm}i8oIz8z>bV3j39|6=W}qT*`0C_to<#-VWyPJ+8bg1ZKH8Vw$Td!xbKB}f7U*PtPd zI|O$chhPl^mrQ^EJk6|`ms#`H>sH;8bF0tZC1;m5FRm>16$kvsKIE%59?f5RDMI9$ z@Niw49^8w!G!ZQOTXvP$9Vc!QpI}zFGgrH>g5~KzaJF>i!;XnPTamb$4hpiu2|W^h|&nsiwgwo8nPInUi7r# z1gbm_G70pwSi+B%6+VXGrzf*?cRv$emv<{QOa5yug&nLHkgpUfe3mhV~tw?@24tiD_#b5-;7wZFG|NnO;titL9ysfd`A>w`{obQR0R=*p`l z$bh7g&+A=YcpYPxFKsPPi-oZBiR09P`~mswpIOIq)CDD-mPVSL2u6T~EA|h$X&~5W zBj_^1tkO&5uZjfJ&wqq|ndm7$aNj=%M)|#8qPB5RNB z!+K|FBw^s>cX}h|V&Q)2zPVpdpm>0fOq+E}TaGMMP`1Plul3ir3d2c;>K~kX%7vDqH*)IZYdG>oyk{UBu+*06{@wY4KP(VD zV6;!S9UHH|1maj(^E|6k1OLb5VpgAXb`}S>U=%AjV`KZh^`=)UHa#!1)#IMKe&oMi za7H7y05l`$f#nD~A%K56k2G;u&k0rhT!`{zp1`k>KA%Z*`9in+tfw3En+xrCHB_xO zTj5OS?9%HyY>R9~5736P^1U@El_wDo8(A30l@}7W{LbUhi2}Cy>e9iyVu7MLc2#hA zt0`27Ve!nI*FeYu-$Mf0M@=-~d=!al0yz$+zWLl8ZFAn4Q(D^BM}v{K%aR~r$&uM9 z@Rfd0B1_*WVo{Gj^n)2i)IOqzy+hJ|YD`OagSkT;_%U7$%2$ zo#gE~myuU+cYNn|f*5{8^h-i5l$%@HMrD0SdXp82*)~$Q{A!spE!VhPUvmRv)SZC} z%-Tn~$4R~#nbV-$hB`hzw4WDHczsrvZM%si!?~&;VM9?e)lM<#T11x4hCkg1$^Kb{ z<&>75f`S52`|}H!^V5{HQ3Bv}4X-jh`cDENTJ&KI$+H

I@TObp=Co4ySLKe!n#Z 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 diff --git a/public/logo.svg b/public/logo.svg deleted file mode 100755 index 7b59b7c..0000000 --- a/public/logo.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/components/Routes.js b/src/components/Routes.js index 4e1d98e..0c0a48f 100644 --- a/src/components/Routes.js +++ b/src/components/Routes.js @@ -14,6 +14,7 @@ const BaseRoute = (method) => { ); RouteComponent.propTypes = { + children: PropTypes.node, path: PropTypes.string, handler: PropTypes.func, render: PropTypes.func, From c7d5d1c3cd65a837df83809af3b094fb1d366723 Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 02:49:18 +0400 Subject: [PATCH 3/8] 1.0.4 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1d0dbc6..071c187 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reactend/express", - "version": "1.0.3", + "version": "1.0.4", "description": "React-like http-server on Nodejs", "main": "lib/index.js", "repository": { @@ -13,7 +13,7 @@ "rollup-build": "NODE_ENV=production rollup -c rollup.config.js", "copy-pkg": "cp ./package.json ./lib/package.json", "copy-readme": "cp ./README.md ./lib/README.md", - "publish": "yarn build && npm publish" + "publish": "yarn build && npm publish --access public" }, "keywords": [], "author": "Orkhan Jafarov", From 5ef489f8d90bfd934c32bdd3adad1f407dbf2dfa Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 03:01:01 +0400 Subject: [PATCH 4/8] minor updates --- README.md | 32 +++++++++++++++++++++----------- package.json | 8 ++++---- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index ae5643c..e409a6f 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,8 @@ React-like http-server on Nodejs
-![Planet Express](logo.svg) - -## Install - -`npm i --save @reactend/express react react-dom`
-or
-`yarn add @reactend/express react react-dom`
- -
+![Planet Express](./logo.svg) +
## Why? @@ -23,7 +16,24 @@ It's the only crazy idea to use React to structure Backend on Node.js. It works with express.js framework to run Node.js server. Custom renderer we have is building express structure app from React Components.

-### Code Example +## Install + +### Install the package + +`npm i --save @reactend/express`
+or
+`yarn add @reactend/express`
+
+ +### Install peer dependecies + +`npm i --save react react-dom react-helmet styled-components`
+or
+`yarn add react react-dom react-helmet styled-components`
+ +
+ +## Code Example ```js import React from 'react'; @@ -82,7 +92,7 @@ import cors from 'cors'; ``` -

+
## Components diff --git a/package.json b/package.json index 071c187..16ca519 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,14 @@ "cookie-parser": "^1.4.5", "express": "^4.17.1", "morgan": "^1.10.0", - "prop-types": "^15.7.2", - "react-helmet": "^6.1.0", "react-reconciler": "^0.26.1", - "styled-components": "^5.2.1" + "prop-types": "^15.7.2" }, "peerDependencies": { "react": "^17.0.1", - "react-dom": "^17.0.1" + "react-dom": "^17.0.1", + "react-helmet": "^6.1.0", + "styled-components": "^5.2.1" }, "devDependencies": { "@babel/core": "^7.12.13", From 6c026bf666fe974352ecf3749363a4b863e70ec5 Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 03:01:14 +0400 Subject: [PATCH 5/8] 1.0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 16ca519..f6a31da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reactend/express", - "version": "1.0.4", + "version": "1.0.5", "description": "React-like http-server on Nodejs", "main": "lib/index.js", "repository": { From a94f65bb4b80df46c78fa8f94f9a16f1af8246bc Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 03:19:17 +0400 Subject: [PATCH 6/8] minor publishing fixes --- .gitignore | 2 +- package-lock.json | 1033 +++++++++++++++------------------------------ package.json | 11 +- rollup.config.js | 2 +- 4 files changed, 342 insertions(+), 706 deletions(-) diff --git a/.gitignore b/.gitignore index 0da7201..ad4e056 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ node_modules .vscode .npmrc -lib \ No newline at end of file +dist \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6a667d8..5e236b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, "requires": { "@babel/highlight": "^7.12.13" } @@ -19,16 +20,16 @@ "dev": true }, "@babel/core": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.13.tgz", - "integrity": "sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.16.tgz", + "integrity": "sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", + "@babel/generator": "^7.12.15", "@babel/helper-module-transforms": "^7.12.13", "@babel/helpers": "^7.12.13", - "@babel/parser": "^7.12.13", + "@babel/parser": "^7.12.16", "@babel/template": "^7.12.13", "@babel/traverse": "^7.12.13", "@babel/types": "^7.12.13", @@ -62,6 +63,7 @@ "version": "7.12.15", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, "requires": { "@babel/types": "^7.12.13", "jsesc": "^2.5.1", @@ -72,6 +74,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, "requires": { "@babel/types": "^7.12.13" } @@ -87,34 +90,34 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.13.tgz", - "integrity": "sha512-dXof20y/6wB5HnLOGyLh/gobsMvDNoekcC+8MCV2iaTd5JemhFkPD73QB+tK3iFC9P0xJC73B6MvKkyUfS9cCw==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.16.tgz", + "integrity": "sha512-dBHNEEaZx7F3KoUYqagIhRIeqyyuI65xMndMZ3WwGwEBI609I4TleYQHcrS627vbKyNTXqShoN+fvYD9HuQxAg==", "dev": true, "requires": { "@babel/compat-data": "^7.12.13", - "@babel/helper-validator-option": "^7.12.11", + "@babel/helper-validator-option": "^7.12.16", "browserslist": "^4.14.5", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz", - "integrity": "sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.16.tgz", + "integrity": "sha512-KbSEj8l9zYkMVHpQqM3wJNxS1d9h3U9vm/uE5tpjMbaj3lTp+0noe3KPsV5dSD9jxKnf9jO9Ip9FX5PKNZCKow==", "dev": true, "requires": { "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.12.16", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/helper-replace-supers": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz", - "integrity": "sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz", + "integrity": "sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", @@ -134,6 +137,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.12.13", "@babel/template": "^7.12.13", @@ -144,6 +148,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, "requires": { "@babel/types": "^7.12.13" } @@ -158,9 +163,9 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", - "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz", + "integrity": "sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==", "dev": true, "requires": { "@babel/types": "^7.12.13" @@ -170,6 +175,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "dev": true, "requires": { "@babel/types": "^7.12.13" } @@ -251,6 +257,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, "requires": { "@babel/types": "^7.12.13" } @@ -258,12 +265,13 @@ "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", - "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz", + "integrity": "sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ==", "dev": true }, "@babel/helper-wrap-function": { @@ -293,6 +301,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", @@ -300,9 +309,10 @@ } }, "@babel/parser": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", - "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "dev": true }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.12.13", @@ -326,12 +336,12 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz", + "integrity": "sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, @@ -407,9 +417,9 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz", - "integrity": "sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz", + "integrity": "sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13", @@ -784,9 +794,9 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.13.tgz", - "integrity": "sha512-hhXZMYR8t9RvduN2uW4sjl6MRtUhzNE726JvoJhpjhxKgRUVkZqTsA0xc49ALZxQM7H26pZ/lLvB2Yrea9dllA==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.16.tgz", + "integrity": "sha512-dNu0vAbIk8OkqJfGtYF6ADk6jagoyAl+Ks5aoltbAlfoKv8d6yooi3j+kObeSQaCj9PgN6KMZPB90wWyek5TmQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", @@ -880,19 +890,19 @@ } }, "@babel/preset-env": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.13.tgz", - "integrity": "sha512-JUVlizG8SoFTz4LmVUL8++aVwzwxcvey3N0j1tRbMAXVEy95uQ/cnEkmEKHN00Bwq4voAV3imQGnQvpkLAxsrw==", + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.16.tgz", + "integrity": "sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg==", "dev": true, "requires": { "@babel/compat-data": "^7.12.13", - "@babel/helper-compilation-targets": "^7.12.13", + "@babel/helper-compilation-targets": "^7.12.16", "@babel/helper-module-imports": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-validator-option": "^7.12.11", + "@babel/helper-validator-option": "^7.12.16", "@babel/plugin-proposal-async-generator-functions": "^7.12.13", "@babel/plugin-proposal-class-properties": "^7.12.13", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.16", "@babel/plugin-proposal-export-namespace-from": "^7.12.13", "@babel/plugin-proposal-json-strings": "^7.12.13", "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", @@ -900,7 +910,7 @@ "@babel/plugin-proposal-numeric-separator": "^7.12.13", "@babel/plugin-proposal-object-rest-spread": "^7.12.13", "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", - "@babel/plugin-proposal-optional-chaining": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", "@babel/plugin-proposal-private-methods": "^7.12.13", "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.0", @@ -989,6 +999,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/parser": "^7.12.13", @@ -999,6 +1010,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.12.13", @@ -1015,6 +1027,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -1022,7 +1035,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -1030,35 +1044,13 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "requires": { - "@emotion/memoize": "0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, "@eslint/eslintrc": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", @@ -1100,12 +1092,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true } } }, @@ -1244,6 +1230,24 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -1254,6 +1258,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -1281,15 +1294,16 @@ } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -1377,9 +1391,9 @@ "dev": true }, "axe-core": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.1.tgz", - "integrity": "sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.2.tgz", + "integrity": "sha512-V+Nq70NxKhYt89ArVcaNL9FDryB3vQOd+BFXZIfO3RP6rwtj+2yqqqdHEkacutglPaZLkJeuXKCjCJDMGPtPqg==", "dev": true }, "axobject-query": { @@ -1397,22 +1411,6 @@ "object.assign": "^4.1.0" } }, - "babel-plugin-styled-components": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz", - "integrity": "sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-module-imports": "^7.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1448,6 +1446,13 @@ "qs": "6.7.0", "raw-body": "2.4.0", "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } } }, "boxen": { @@ -1550,9 +1555,32 @@ } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } }, "call-bind": { "version": "1.0.2", @@ -1576,11 +1604,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" - }, "caniuse-lite": { "version": "1.0.30001185", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", @@ -1591,6 +1614,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1674,12 +1698,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -1706,6 +1724,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -1713,7 +1732,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "colorette": { "version": "1.2.1", @@ -1721,6 +1741,12 @@ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1753,13 +1779,6 @@ "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - } } }, "concat-map": { @@ -1780,23 +1799,6 @@ "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "confusing-browser-globals": { @@ -1887,6 +1889,26 @@ "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } } }, "cross-spawn": { @@ -1906,21 +1928,6 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" - }, - "css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -2003,6 +2010,14 @@ "dev": true, "requires": { "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + } } }, "duplexer3": { @@ -2017,15 +2032,15 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.655", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.655.tgz", - "integrity": "sha512-b+V6KreLR1SvNBY1WOZWsm5Dc/ZC/B5/E1m5TpUrWnEwrd1pJgKgsrLYtQYTDgdTj1/QoZE7qMPIeJ6hZwpsVA==", + "version": "1.3.663", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.663.tgz", + "integrity": "sha512-xkVkzHj6k3oRRGlmdgUCCLSLhtFYHDCTH7SeK+LJdJjnsLcrdbpr8EYmfMQhez3V/KPO5UScSpzQ0feYX6Qoyw==", "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "encodeurl": { @@ -2113,7 +2128,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "eslint": { "version": "7.19.0", @@ -2160,12 +2176,6 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2239,21 +2249,6 @@ "lru-cache": "^6.0.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2311,60 +2306,6 @@ "requires": { "debug": "^2.6.9", "pkg-dir": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } } }, "eslint-plugin-import": { @@ -2602,17 +2543,6 @@ "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } } }, "express": { @@ -2717,6 +2647,15 @@ "unpipe": "~1.0.0" } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, "find-versions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", @@ -2801,9 +2740,9 @@ "dev": true }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -2844,7 +2783,8 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true }, "got": { "version": "9.6.0", @@ -2865,68 +2805,21 @@ "url-parse-lax": "^3.0.0" }, "dependencies": { - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "lowercase-keys": "^1.0.0" + "pump": "^3.0.0" } } } }, "graceful-fs": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", - "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "has": { @@ -2941,7 +2834,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.1", @@ -2955,14 +2849,6 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -3251,9 +3137,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { @@ -3294,9 +3180,9 @@ "dev": true }, "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, "is-path-inside": { @@ -3393,12 +3279,13 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, "json-parse-even-better-errors": { @@ -3438,6 +3325,15 @@ "object.assign": "^4.1.2" } }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, "language-subtag-registry": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", @@ -3535,12 +3431,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -3651,29 +3541,23 @@ "parse-json": "^2.2.0", "pify": "^2.0.0", "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "log-symbols": { "version": "4.0.0", @@ -3747,12 +3631,6 @@ "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3777,15 +3655,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -3831,17 +3700,28 @@ "sourcemap-codec": "^1.4.4" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3948,12 +3828,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-releases": { "version": "1.1.70", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", @@ -4028,110 +3902,6 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -4263,6 +4033,24 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -4272,6 +4060,12 @@ "aggregate-error": "^3.0.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -4302,15 +4096,12 @@ } }, "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "error-ex": "^1.2.0" } }, "parseurl": { @@ -4348,10 +4139,13 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } }, "picomatch": { "version": "2.2.2", @@ -4359,18 +4153,21 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, "please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -4380,11 +4177,6 @@ "semver-compare": "^1.0.0" } }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4487,6 +4279,13 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } } }, "rc": { @@ -4499,22 +4298,14 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - } - }, - "react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } } }, "react-is": { @@ -4532,11 +4323,6 @@ "scheduler": "^0.20.1" } }, - "react-side-effect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", - "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==" - }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -4546,23 +4332,6 @@ "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", "path-type": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } } }, "read-pkg-up": { @@ -4573,51 +4342,6 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } } }, "readdirp": { @@ -4737,12 +4461,12 @@ "dev": true }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -4752,6 +4476,15 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -4886,11 +4619,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4906,12 +4634,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -4969,19 +4691,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true } } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "sourcemap-codec": { "version": "1.4.8", @@ -5047,35 +4764,6 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "string.prototype.matchall": { @@ -5093,17 +4781,6 @@ "side-channel": "^1.0.3" } }, - "string.prototype.padend": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz", - "integrity": "sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, "string.prototype.trimend": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", @@ -5133,23 +4810,15 @@ "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -5165,32 +4834,16 @@ "dev": true }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "styled-components": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.2.1.tgz", - "integrity": "sha512-sBdgLWrCFTKtmZm/9x7jkIabjFNVzCUeKfoQsM6R3saImkUnjx0QYdLwJHBjY9ifEcmjDamJDVfknWm1yxZPxQ==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^0.8.8", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -5208,9 +4861,9 @@ }, "dependencies": { "ajv": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz", - "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", + "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5248,7 +4901,8 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-readable-stream": { "version": "1.0.0", @@ -5549,12 +5203,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5578,15 +5226,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, diff --git a/package.json b/package.json index f6a31da..0db61a1 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,16 @@ { "name": "@reactend/express", - "version": "1.0.5", + "version": "1.0.8", "description": "React-like http-server on Nodejs", - "main": "lib/index.js", + "main": "dist/index.js", "repository": { "url": "git@github.com:gigantz/reactend-express.git" }, "scripts": { "start": "./node_modules/.bin/babel-node ./src/app.js", "dev": "nodemon ./app/index.js", - "build": "npm-run-all rollup-build copy-pkg copy-readme", - "rollup-build": "NODE_ENV=production rollup -c rollup.config.js", - "copy-pkg": "cp ./package.json ./lib/package.json", - "copy-readme": "cp ./README.md ./lib/README.md", - "publish": "yarn build && npm publish --access public" + "build": "NODE_ENV=production rollup -c rollup.config.js", + "prepublishOnly": "npm run build" }, "keywords": [], "author": "Orkhan Jafarov", diff --git a/rollup.config.js b/rollup.config.js index da4e026..5f03136 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -4,7 +4,7 @@ import commonjs from '@rollup/plugin-commonjs'; export default { input: 'src/index.js', output: { - file: 'lib/index.js', + file: 'dist/index.js', format: 'cjs', }, external: ['react', 'react-dom', 'prop-types', 'styled-components'], From b6a5507c52b47c4467c9ded1012465d784eaa59e Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 03:25:19 +0400 Subject: [PATCH 7/8] static without path.join --- src/renderer/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index 5b5fbc1..b774656 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -7,7 +7,6 @@ import express from 'express'; import cookieParser from 'cookie-parser'; import compression from 'compression'; import logger from 'morgan'; -import { join } from 'path'; import { log } from './helpers'; import { generateRoute } from './generateRoute'; @@ -72,7 +71,7 @@ const reconciler = ReactReconciler({ if (type === 'static') { return { path: props.path, - static: express.static(join(__dirname, props.publicPath), props.options), + static: express.static(props.publicPath, props.options), }; } From 4da7b68642566057561c2aa6ce06193c1c63dae4 Mon Sep 17 00:00:00 2001 From: Orkhan Jafarov Date: Fri, 12 Feb 2021 03:25:59 +0400 Subject: [PATCH 8/8] update to 1.0.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0db61a1..4c9497b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reactend/express", - "version": "1.0.8", + "version": "1.0.9", "description": "React-like http-server on Nodejs", "main": "dist/index.js", "repository": {