├── client ├── src │ ├── constants │ │ └── index.js │ ├── setupTests.js │ ├── App.test.js │ ├── App.js │ ├── layout │ │ ├── TopBar │ │ │ ├── Logo.js │ │ │ ├── Item.js │ │ │ ├── HeaderItems.js │ │ │ ├── LoginDialog.js │ │ │ ├── Account.js │ │ │ └── index.js │ │ └── index.js │ ├── reportWebVitals.js │ ├── components │ │ ├── TextField │ │ │ └── NumberTextField.js │ │ ├── Button │ │ │ └── index.js │ │ ├── table.js │ │ ├── csv.js │ │ ├── pdf │ │ │ └── certificateGenertorWithPdf.js │ │ ├── image │ │ │ └── cecrtificateGeneratorByImage.js │ │ └── temp.js │ ├── pages │ │ ├── 404 │ │ │ └── index.js │ │ ├── certiEditor │ │ │ └── index.js │ │ ├── ImageCanvas │ │ │ └── index.js │ │ └── csv │ │ │ └── csvUpload.js │ ├── index.css │ ├── index.js │ ├── Routes.js │ ├── data │ │ └── index.js │ └── theme │ │ ├── typography.js │ │ ├── index.js │ │ └── shadow.js ├── public │ ├── robots.txt │ ├── t2.pdf │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── template │ │ ├── t1.png │ │ └── t2.png │ ├── images │ │ └── icon │ │ │ └── csv-icon.png │ ├── manifest.json │ ├── example.csv │ └── index.html ├── .prettierrc ├── package.json └── README.md ├── server ├── views │ ├── index.jade │ ├── error.jade │ └── layout.jade ├── public │ ├── stylesheets │ │ ├── c1.png │ │ └── style.css │ └── templates │ │ ├── t1.png │ │ └── t2.png ├── routes │ ├── users.js │ └── index.js ├── package.json ├── app.js ├── bin │ └── www └── package-lock.json ├── .gitignore └── README.md /client/src/constants/index.js: -------------------------------------------------------------------------------- 1 | export const drawerWidth = 200 2 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /server/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | -------------------------------------------------------------------------------- /client/public/t2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/t2.pdf -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/logo192.png -------------------------------------------------------------------------------- /client/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/logo512.png -------------------------------------------------------------------------------- /server/views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /client/public/template/t1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/template/t1.png -------------------------------------------------------------------------------- /client/public/template/t2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/template/t2.png -------------------------------------------------------------------------------- /server/public/stylesheets/c1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/server/public/stylesheets/c1.png -------------------------------------------------------------------------------- /server/public/templates/t1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/server/public/templates/t1.png -------------------------------------------------------------------------------- /server/public/templates/t2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/server/public/templates/t2.png -------------------------------------------------------------------------------- /client/public/images/icon/csv-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforcauseorg/Certificate-generator-react/HEAD/client/public/images/icon/csv-icon.png -------------------------------------------------------------------------------- /server/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /server/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | -------------------------------------------------------------------------------- /client/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "printWidth": 80, 4 | "singleQuote": true, 5 | "trailingComma": "none", 6 | "tabWidth": 2, 7 | "semi": false, 8 | "useTabs": false 9 | } -------------------------------------------------------------------------------- /server/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET users listing. */ 5 | router.get('/user', function(req, res, next) { 6 | res.send('respond with a resource'); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /client/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom' 6 | -------------------------------------------------------------------------------- /client/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react' 2 | import App from './App' 3 | 4 | test('renders learn react link', () => { 5 | render() 6 | const linkElement = screen.getByText(/learn react/i) 7 | expect(linkElement).toBeInTheDocument() 8 | }) 9 | -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | import Routes from './Routes' 2 | import { ThemeProvider } from '@material-ui/core/styles' 3 | import { createTheme } from './theme' 4 | 5 | const App = () => ( 6 | 7 | 8 | 9 | ) 10 | 11 | export default App 12 | -------------------------------------------------------------------------------- /client/src/layout/TopBar/Logo.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | function Logo(props) { 4 | return ( 5 | Logo 11 | ) 12 | } 13 | 14 | export default Logo 15 | -------------------------------------------------------------------------------- /client/src/layout/TopBar/Item.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import HeaderItem from './HeaderItems' 3 | 4 | // eslint-disable-next-line react/prop-types 5 | const Item = ({ title, link, active, ...props }) => { 6 | return ( 7 | <> 8 | 9 | 10 | ) 11 | } 12 | 13 | export default Item 14 | -------------------------------------------------------------------------------- /client/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = (onPerfEntry) => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry) 5 | getFID(onPerfEntry) 6 | getFCP(onPerfEntry) 7 | getLCP(onPerfEntry) 8 | getTTFB(onPerfEntry) 9 | }) 10 | } 11 | } 12 | 13 | export default reportWebVitals 14 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "canvas": "^2.6.1", 10 | "cookie-parser": "~1.4.4", 11 | "cors": "^2.8.5", 12 | "debug": "~2.6.9", 13 | "express": "~4.16.1", 14 | "http-errors": "~1.6.3", 15 | "jade": "~1.11.0", 16 | "morgan": "~1.9.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /client/src/components/TextField/NumberTextField.js: -------------------------------------------------------------------------------- 1 | import { TextField } from '@material-ui/core' 2 | import React from 'react' 3 | 4 | const NumberTextField = ({ value, handleChange, ...rest }) => { 5 | return ( 6 | 16 | ) 17 | } 18 | 19 | export default NumberTextField 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | client/node_modules 8 | server/node_modules 9 | server/public/images 10 | 11 | client/.eslintcache 12 | # testing 13 | /coverage 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | .env.local 21 | .env.development.local 22 | .env.test.local 23 | .env.production.local 24 | 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | -------------------------------------------------------------------------------- /client/src/pages/certiEditor/index.js: -------------------------------------------------------------------------------- 1 | // import { Container, makeStyles } from '@material-ui/core' 2 | // import React from 'react' 3 | // import ImageContainer from '../../components/ImageContainer' 4 | 5 | // const useStyles = makeStyles((theme) => ({ 6 | // root: { } 7 | // })) 8 | 9 | // const CertEditor = () => { 10 | // const classes = useStyles() 11 | 12 | // return ( 13 | // 14 | // 15 | // 16 | // ) 17 | // } 18 | 19 | // export default CertEditor; 20 | -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | background-color: #f5f5f5; 4 | } 5 | 6 | body { 7 | margin: 0; 8 | height: 100%; 9 | 10 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 11 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 12 | sans-serif; 13 | -webkit-font-smoothing: antialiased; 14 | -moz-osx-font-smoothing: grayscale; 15 | } 16 | 17 | code { 18 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 19 | monospace; 20 | } 21 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import './index.css' 4 | import App from './App' 5 | import reportWebVitals from './reportWebVitals' 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ) 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals() 18 | -------------------------------------------------------------------------------- /client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /client/src/pages/404/index.js: -------------------------------------------------------------------------------- 1 | import { Typography } from '@material-ui/core' 2 | import React from 'react' 3 | import { Link } from 'react-router-dom' 4 | 5 | const Error404 = () => { 6 | return ( 7 |
8 | 9 | {'Wrong page'.toLocaleUpperCase()} 10 | 11 | Available routes are 12 | {['/image-canvas', '/csv-upload', '/pdf-cert'].map((str) => ( 13 | 14 | {str} 15 | 16 | ))} 17 |
18 | ) 19 | } 20 | 21 | export default Error404 22 | -------------------------------------------------------------------------------- /client/src/pages/ImageCanvas/index.js: -------------------------------------------------------------------------------- 1 | import { AppBar, Typography } from '@material-ui/core' 2 | import React from 'react' 3 | import CertificateGeneratorByImage from '../../components/image/cecrtificateGeneratorByImage' 4 | 5 | const ImageCanvas = (props) => { 6 | if (props.location.state === undefined) { 7 | return
Please select Data Fields from the previous page
8 | } 9 | 10 | return ( 11 |
12 | 13 | 14 | Certificate Generator 15 | 16 | 17 | 18 |
19 | ) 20 | } 21 | 22 | export default ImageCanvas 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # certificate Generator 2 | 3 | **setup**: 4 | 1. run client with:
5 | a. cd client
6 | b. npm install
7 | c. npm run start
8 | 2. run server (on different terminal)
9 | a. cd server
10 | b. npm install
11 | c. npm run start
12 | 13 | On the client, move to csv-upload page: 14 | - upload csv 15 | - Select Data fields to have in your certificate 16 | - Edit your data and font styles 17 | - You can download that certificate 18 | - You can also send it to server and get all the certificates for all yourcsv fields 19 | - certificates on server will be located at `server/public/images/` 20 | 21 | Sample file for certi generation [Sample Spreadsheet - Sheet1.csv](https://github.com/codeforcauseorg/Certificate-generator-react/files/6412121/Sample.Spreadsheet.-.Sheet1.csv) 22 | 23 | -------------------------------------------------------------------------------- /client/src/Routes.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Switch, Route, BrowserRouter, Redirect } from 'react-router-dom' 3 | 4 | import CsvUpload from './pages/csv/csvUpload' 5 | import ImageCanvas from './pages/ImageCanvas' 6 | import Error404 from './pages/404' 7 | import PdfCert from './components/pdf/certificateGenertorWithPdf' 8 | import Temp from './components/temp' 9 | 10 | const Routes = () => ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | ) 22 | 23 | export default Routes 24 | -------------------------------------------------------------------------------- /client/src/data/index.js: -------------------------------------------------------------------------------- 1 | const templates = { 2 | pdf: [ 3 | { 4 | id: 1, 5 | location: 't2.pdf', 6 | type: 'pdf', 7 | text: [ 8 | { 9 | title: 'Abhishek Kumar', 10 | x: 220, 11 | y: 360, 12 | size: 50 13 | } 14 | ] 15 | } 16 | ], 17 | png: [ 18 | { 19 | id: 2, 20 | location: 'template/t1.png', 21 | type: 'png', 22 | text: [ 23 | { 24 | title: 'Field 1', 25 | x: 289, 26 | y: 200, 27 | size: 37 28 | }, 29 | { 30 | title: 'Field 2', 31 | x: 289, 32 | y: 440, 33 | size: 18 34 | }, 35 | { 36 | title: 'Field 3', 37 | x: 542, 38 | y: 440, 39 | size: 18 40 | } 41 | ] 42 | } 43 | ] 44 | } 45 | 46 | export default templates 47 | -------------------------------------------------------------------------------- /client/src/pages/csv/csvUpload.js: -------------------------------------------------------------------------------- 1 | import { makeStyles, Typography } from '@material-ui/core' 2 | import React from 'react' 3 | import CsvReader from '../../components/csv' 4 | import MainLayout from '../../layout' 5 | 6 | const useStyles = makeStyles((theme) => ({ 7 | root: { 8 | height: '100%', 9 | textAlign: 'center' 10 | }, 11 | heading: { 12 | fontSize: 40, 13 | fontWeight: 700, 14 | color: theme.palette.primary.main, 15 | padding: theme.spacing(3, 0, 6) 16 | } 17 | })) 18 | 19 | const CsvUpload = () => { 20 | const classes = useStyles() 21 | 22 | return ( 23 | 24 |
25 | 26 | Please Import Your CSV File Here 27 | 28 | 29 |
30 |
31 | ) 32 | } 33 | 34 | export default CsvUpload 35 | -------------------------------------------------------------------------------- /client/src/components/Button/index.js: -------------------------------------------------------------------------------- 1 | import { Button, makeStyles } from '@material-ui/core' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import clsx from 'clsx' 5 | 6 | const useStyles = makeStyles((theme) => ({ 7 | btn: { 8 | backgroundColor: theme.palette.primary.main, 9 | color: '#ffffff', 10 | textTransform: 'capitalize', 11 | [theme.breakpoints.down('sm')]: { 12 | width: '100%' 13 | }, 14 | '&:hover': { 15 | backgroundColor: 'rgba(241, 0, 45, 0.9)' 16 | } 17 | } 18 | })) 19 | 20 | function ButtonComponent({ className, title, icon, ...rest }) { 21 | const classes = useStyles() 22 | return ( 23 | 27 | ) 28 | } 29 | 30 | ButtonComponent.propTypes = { 31 | title: PropTypes.string 32 | } 33 | 34 | export default ButtonComponent 35 | -------------------------------------------------------------------------------- /client/src/theme/typography.js: -------------------------------------------------------------------------------- 1 | export default { 2 | fontFamily: ['"Montserrat"'].join(','), 3 | 4 | h1: { 5 | fontWeight: 700, 6 | fontSize: 35, 7 | letterSpacing: '-0.24px' 8 | }, 9 | h2: { 10 | fontWeight: 600, 11 | fontSize: 29, 12 | letterSpacing: '-0.24px' 13 | }, 14 | h3: { 15 | fontWeight: 600, 16 | fontSize: 24, 17 | letterSpacing: '-0.06px' 18 | }, 19 | h4: { 20 | fontWeight: 600, 21 | fontSize: 20, 22 | letterSpacing: '-0.06px' 23 | }, 24 | h5: { 25 | fontWeight: 600, 26 | fontSize: 16, 27 | letterSpacing: '-0.05px' 28 | }, 29 | h6: { 30 | fontWeight: 700, 31 | fontSize: 14, 32 | letterSpacing: '-0.05px' 33 | }, 34 | body1: { 35 | fontWeight: 400, 36 | fontSize: 16, 37 | letterSpacing: '-0.05px' 38 | }, 39 | body2: { 40 | fontWeight: 400, 41 | fontSize: 14, 42 | letterSpacing: '-0.05px' 43 | }, 44 | overline: { 45 | fontWeight: 500 46 | }, 47 | caption: { 48 | fontWeight: 500 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /client/src/layout/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { makeStyles } from '@material-ui/core' 4 | import TopBar from './TopBar' 5 | 6 | const useStyles = makeStyles((theme) => ({ 7 | root: { 8 | backgroundColor: theme.palette.background.default, 9 | display: 'flex', 10 | height: '100%', 11 | overflow: 'hidden', 12 | width: '100%' 13 | }, 14 | wrapper: { 15 | display: 'flex', 16 | flex: '1 1 auto', 17 | overflow: 'hidden', 18 | paddingTop: 64 19 | }, 20 | contentContainer: { 21 | display: 'flex', 22 | flex: '1 1 auto', 23 | overflow: 'hidden' 24 | }, 25 | content: { 26 | flex: '1 1 auto', 27 | height: '100%', 28 | overflow: 'auto' 29 | } 30 | })) 31 | 32 | function MainLayout({ children }) { 33 | const classes = useStyles() 34 | 35 | return ( 36 |
37 | 38 |
39 |
40 |
{children}
41 |
42 |
43 |
44 | ) 45 | } 46 | 47 | MainLayout.propTypes = { 48 | children: PropTypes.any 49 | } 50 | 51 | export default MainLayout 52 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | var createError = require('http-errors'); 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var logger = require('morgan'); 6 | 7 | var indexRouter = require('./routes/index'); 8 | var usersRouter = require('./routes/users'); 9 | const cors = require('cors') 10 | 11 | var app = express(); 12 | 13 | // view engine setup 14 | app.set('views', path.join(__dirname, 'views')); 15 | app.set('view engine', 'jade'); 16 | 17 | app.use(logger('dev')); 18 | app.use(express.json()); 19 | app.use(express.urlencoded({ extended: false })); 20 | app.use(cookieParser()); 21 | app.use(express.static(path.join(__dirname, 'public'))); 22 | app.use(cors()) 23 | 24 | app.use('/', indexRouter); 25 | app.use('/users', usersRouter); 26 | 27 | // catch 404 and forward to error handler 28 | app.use(function(req, res, next) { 29 | next(createError(404)); 30 | }); 31 | 32 | // error handler 33 | app.use(function(err, req, res, next) { 34 | // set locals, only providing error in development 35 | res.locals.message = err.message; 36 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 37 | 38 | // render the error page 39 | res.status(err.status || 500); 40 | res.render('error'); 41 | }); 42 | 43 | module.exports = app; 44 | -------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | var express = require('express'); 3 | var router = express.Router(); 4 | const { createCanvas, loadImage } = require("canvas"); 5 | 6 | /* GET home page. */ 7 | router.get('/', function (req, res, next) { 8 | res.render('index', { title: 'Express' }); 9 | }); 10 | 11 | router.post('/cert', function (req, res, next) { 12 | updateCanvas(req.body).then(buffer => { 13 | res.send(req.body.textProps) 14 | }).catch(e => { 15 | res.send(e) 16 | }) 17 | }) 18 | 19 | async function updateCanvas(certificates) { 20 | const { template, textProps, csv } = certificates 21 | const image = await loadImage(`public/templates/${template}`) 22 | var canvas = createCanvas(image.width, image.height) 23 | ctx = canvas.getContext('2d') 24 | csv.map(async (certificate, index) => { 25 | ctx.drawImage(image, 0, 0) 26 | textProps.map((drawProperties, i) => { 27 | const { x, y, size } = drawProperties 28 | console.log(drawProperties) 29 | const { title } = certificate[i] 30 | ctx.fillStyle = "#fff" 31 | ctx.font = `bold ${size}pt Menlo` 32 | ctx.fillText(title, x, y) 33 | }) 34 | const buffer = canvas.toBuffer('image/png') 35 | fs.writeFileSync(`public/images/imi${index}.png`, buffer) 36 | }) 37 | } 38 | 39 | module.exports = router; 40 | -------------------------------------------------------------------------------- /client/src/layout/TopBar/HeaderItems.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | // import { HashLink as Link } from 'react-router-hash-link'; 3 | import { Box, Typography, makeStyles, Link } from '@material-ui/core' 4 | import clsx from 'clsx' 5 | 6 | const useStyles = makeStyles(() => ({ 7 | root: {}, 8 | textStyle: { 9 | color: 'black', 10 | position: 'relative', 11 | fontColor: 'blue', 12 | display: 'flex', 13 | padding: ' 19px 19px', 14 | textDecoration: 'none', 15 | '&:hover': { 16 | position: 'relative', 17 | top: '2px', 18 | borderBottom: '4px solid #A60000' 19 | } 20 | }, 21 | activeCls: { 22 | position: 'relative', 23 | top: '2px', 24 | borderBottom: '4px solid #A60000' 25 | } 26 | })) 27 | 28 | const HeaderItem = ({ title, link, active }) => { 29 | const classes = useStyles() 30 | return ( 31 | 32 | 41 | 46 | {title} 47 | 48 | 49 | 50 | ) 51 | } 52 | 53 | export default HeaderItem 54 | -------------------------------------------------------------------------------- /client/public/example.csv: -------------------------------------------------------------------------------- 1 | ID #,Name,Project,Issue Date,Template,File 2 | 1,Ada Lovelace,Lorem Ipsum Dolor Sit Amet,"January 15, 2019",example/person, 3 | 2,Dorothy Vaughan,Eget Felis Eget Nunc Lobortis Mattis,"January 15, 2019",example/person, 4 | 3,Gilbert Baker,In Cursus Turpis Massa Tincidunt Dui Ut Ornare,"January 15, 2019",example/person, 5 | 4,Grace Murray Hopper,Lectus Mauris Ultrices Eros In Cursus,"January 15, 2019",example/person, 6 | 5,Isocrates,Mattis A Iaculis At Erat,"January 15, 2019",example/person, 7 | 6,Joyce Mitchell Cook,Purus In Mollis Nunc Sed,"January 15, 2019",example/person, 8 | 7,Katherine Goble Johnson,Justo Eget Magna Fermentum Iaculis,"January 15, 2019",example/person, 9 | 8,Edward Verne Roberts,Massa Sed Elementum Tempus Egestas Sed,"January 15, 2019",example/person, 10 | 9,Marsha P. Johnson,Sed Risus Ultricies Tristique Nulla Aliquet Enim,"January 15, 2019",example/person, 11 | 10,Mary Jackson,Viverra Tellus In Hac Habitasse Platea Dictumst,"January 15, 2019",example/person, 12 | 11,Richard Oakes,Tincidunt Ornare Massa Eget Egestas Purus,"January 15, 2019",example/person, 13 | 12,Software Freedom Conservancy,Massa Vitae Tortor Condimentum Lacinia Quis,"January 15, 2019",example/organization, 14 | 13,public.resource.org,Adipiscing Commodo Elit At Imperdiet,"January 15, 2019",example/organization, 15 | 14,The Center for Investigative Reporting,Amet Consectetur Adipiscing Elit Duis,"January 15, 2019",example/organization, -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cert-generator", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@material-ui/core": "^4.11.2", 7 | "@material-ui/data-grid": "^4.0.0-alpha.14", 8 | "@material-ui/icons": "^4.11.2", 9 | "@material-ui/lab": "^4.0.0-alpha.57", 10 | "@testing-library/jest-dom": "^5.11.6", 11 | "@testing-library/react": "^11.2.2", 12 | "@testing-library/user-event": "^12.6.0", 13 | "axios": "^0.21.1", 14 | "file-saver": "^2.0.5", 15 | "jspdf": "^2.2.0", 16 | "pdf-lib": "^1.14.1", 17 | "prettier": "^2.2.1", 18 | "react": "^17.0.1", 19 | "react-dom": "^17.0.1", 20 | "react-papaparse": "^3.11.1", 21 | "react-pdf": "^5.1.0", 22 | "react-router-dom": "^5.2.0", 23 | "react-scripts": "4.0.1", 24 | "web-vitals": "^0.2.4" 25 | }, 26 | "scripts": { 27 | "start": "react-scripts start", 28 | "build": "react-scripts build", 29 | "test": "react-scripts test", 30 | "eject": "react-scripts eject", 31 | "format": "prettier --write \"**/*.+(js|jsx|json|css|md|html)\"" 32 | }, 33 | "eslintConfig": { 34 | "extends": [ 35 | "react-app", 36 | "react-app/jest" 37 | ] 38 | }, 39 | "browserslist": { 40 | "production": [ 41 | ">0.2%", 42 | "not dead", 43 | "not op_mini all" 44 | ], 45 | "development": [ 46 | "last 1 chrome version", 47 | "last 1 firefox version", 48 | "last 1 safari version" 49 | ] 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /client/src/theme/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | /* eslint-disable import/prefer-default-export */ 3 | import _ from 'lodash' 4 | import { colors, createMuiTheme, responsiveFontSizes } from '@material-ui/core' 5 | import typography from './typography' 6 | import { softShadows } from './shadow' 7 | 8 | const baseConfig = { 9 | direction: 'ltr', 10 | typography, 11 | overrides: { 12 | MuiLinearProgress: { 13 | root: { 14 | borderRadius: 3, 15 | overflow: 'hidden' 16 | } 17 | }, 18 | MuiListItemIcon: { 19 | root: { 20 | minWidth: 32 21 | } 22 | }, 23 | MuiChip: { 24 | root: { 25 | backgroundColor: 'rgba(0,0,0,0.075)' 26 | } 27 | } 28 | } 29 | } 30 | 31 | const themeConfig = { 32 | name: 'LIGHT', 33 | overrides: { 34 | MuiInputBase: { 35 | input: { 36 | '&::placeholder': { 37 | opacity: 1, 38 | color: colors.blueGrey[600] 39 | } 40 | } 41 | } 42 | }, 43 | palette: { 44 | type: 'light', 45 | action: { 46 | active: '#03506a' //small icons 47 | }, 48 | background: { 49 | default: '#F5F5F5', 50 | dark: '#f4f6f8', 51 | primary: '#F1002D', 52 | paper: '#e0dee1' // background 53 | }, 54 | primary: { 55 | main: '#F1002D' // for header and loader 56 | }, 57 | secondary: { 58 | main: '#ee6401' // for button and selected 59 | }, 60 | text: { 61 | // for text classes 62 | primary: '#000', 63 | secondary: '#03506a' 64 | } 65 | }, 66 | shadows: softShadows 67 | } 68 | 69 | const createTheme = () => { 70 | let theme = createMuiTheme( 71 | _.merge({}, baseConfig, themeConfig, { direction: 'ltr' }) 72 | ) 73 | 74 | theme = responsiveFontSizes(theme) 75 | 76 | return theme 77 | } 78 | 79 | export { createTheme } 80 | 81 | // https://coolors.co/f1002d-ee6401-f9af28-03506a-62a7c4-e0dee1 82 | -------------------------------------------------------------------------------- /server/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('server:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '5001'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /client/src/layout/TopBar/LoginDialog.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { useSelector } from 'react-redux'; 3 | // import { useDispatch } from 'react-redux'; 4 | 5 | // import { Typography, Dialog, DialogContent, Box } from '@material-ui/core'; 6 | // import authService from 'src/services/authService'; 7 | // import StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth'; 8 | // import { dismissLogin } from 'src/actions/accountActions'; 9 | 10 | // function LoginDialog() { 11 | // const user = useSelector(state => state.account.user); 12 | // const loginFlag = useSelector(state => state.account.login); 13 | // const dispatch = useDispatch(); 14 | 15 | // const handleClose = () => { 16 | // dispatch(dismissLogin()); 17 | // }; 18 | 19 | // return ( 20 | // 25 | // 30 | // 38 | // 44 | // Login / Sign Up 45 | // 46 | 47 | // Explore learning with 48 | 49 | // 55 | // Open Source 56 | // 57 | 58 | // 62 | // 63 | // 64 | // 65 | // ); 66 | // } 67 | 68 | // export default LoginDialog; 69 | -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 23 | 27 | 36 | React App 37 | 38 | 39 | 40 |
41 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /client/src/theme/shadow.js: -------------------------------------------------------------------------------- 1 | export const softShadows = [ 2 | 'none', 3 | '0 0 0 1px rgba(63,63,68,0.05), 0 1px 2px 0 rgba(63,63,68,0.15)', 4 | '0 0 1px 0 rgba(0,0,0,0.31), 0 2px 2px -2px rgba(0,0,0,0.25)', 5 | '0 0 1px 0 rgba(0,0,0,0.31), 0 3px 4px -2px rgba(0,0,0,0.25)', 6 | '0 0 1px 0 rgba(0,0,0,0.31), 0 3px 4px -2px rgba(0,0,0,0.25)', 7 | '0 0 1px 0 rgba(0,0,0,0.31), 0 4px 6px -2px rgba(0,0,0,0.25)', 8 | '0 0 1px 0 rgba(0,0,0,0.31), 0 4px 6px -2px rgba(0,0,0,0.25)', 9 | '0 0 1px 0 rgba(0,0,0,0.31), 0 4px 8px -2px rgba(0,0,0,0.25)', 10 | '0 0 1px 0 rgba(0,0,0,0.31), 0 5px 8px -2px rgba(0,0,0,0.25)', 11 | '0 0 1px 0 rgba(0,0,0,0.31), 0 6px 12px -4px rgba(0,0,0,0.25)', 12 | '0 0 1px 0 rgba(0,0,0,0.31), 0 7px 12px -4px rgba(0,0,0,0.25)', 13 | '0 0 1px 0 rgba(0,0,0,0.31), 0 6px 16px -4px rgba(0,0,0,0.25)', 14 | '0 0 1px 0 rgba(0,0,0,0.31), 0 7px 16px -4px rgba(0,0,0,0.25)', 15 | '0 0 1px 0 rgba(0,0,0,0.31), 0 8px 18px -8px rgba(0,0,0,0.25)', 16 | '0 0 1px 0 rgba(0,0,0,0.31), 0 9px 18px -8px rgba(0,0,0,0.25)', 17 | '0 0 1px 0 rgba(0,0,0,0.31), 0 10px 20px -8px rgba(0,0,0,0.25)', 18 | '0 0 1px 0 rgba(0,0,0,0.31), 0 11px 20px -8px rgba(0,0,0,0.25)', 19 | '0 0 1px 0 rgba(0,0,0,0.31), 0 12px 22px -8px rgba(0,0,0,0.25)', 20 | '0 0 1px 0 rgba(0,0,0,0.31), 0 13px 22px -8px rgba(0,0,0,0.25)', 21 | '0 0 1px 0 rgba(0,0,0,0.31), 0 14px 24px -8px rgba(0,0,0,0.25)', 22 | '0 0 1px 0 rgba(0,0,0,0.31), 0 16px 28px -8px rgba(0,0,0,0.25)', 23 | '0 0 1px 0 rgba(0,0,0,0.31), 0 18px 30px -8px rgba(0,0,0,0.25)', 24 | '0 0 1px 0 rgba(0,0,0,0.31), 0 20px 32px -8px rgba(0,0,0,0.25)', 25 | '0 0 1px 0 rgba(0,0,0,0.31), 0 22px 34px -8px rgba(0,0,0,0.25)', 26 | '0 0 1px 0 rgba(0,0,0,0.31), 0 24px 36px -8px rgba(0,0,0,0.25)' 27 | ] 28 | 29 | export const strongShadows = [ 30 | 'none', 31 | '0 0 1px 0 rgba(0,0,0,0.70), 0 3px 4px -2px rgba(0,0,0,0.50)', 32 | '0 0 1px 0 rgba(0,0,0,0.70), 0 2px 2px -2px rgba(0,0,0,0.50)', 33 | '0 0 1px 0 rgba(0,0,0,0.70), 0 3px 4px -2px rgba(0,0,0,0.50)', 34 | '0 0 1px 0 rgba(0,0,0,0.70), 0 3px 4px -2px rgba(0,0,0,0.50)', 35 | '0 0 1px 0 rgba(0,0,0,0.70), 0 4px 6px -2px rgba(0,0,0,0.50)', 36 | '0 0 1px 0 rgba(0,0,0,0.70), 0 4px 6px -2px rgba(0,0,0,0.50)', 37 | '0 0 1px 0 rgba(0,0,0,0.70), 0 4px 8px -2px rgba(0,0,0,0.50)', 38 | '0 0 1px 0 rgba(0,0,0,0.70), 0 5px 8px -2px rgba(0,0,0,0.50)', 39 | '0 0 1px 0 rgba(0,0,0,0.70), 0 6px 12px -4px rgba(0,0,0,0.50)', 40 | '0 0 1px 0 rgba(0,0,0,0.70), 0 7px 12px -4px rgba(0,0,0,0.50)', 41 | '0 0 1px 0 rgba(0,0,0,0.70), 0 6px 16px -4px rgba(0,0,0,0.50)', 42 | '0 0 1px 0 rgba(0,0,0,0.70), 0 7px 16px -4px rgba(0,0,0,0.50)', 43 | '0 0 1px 0 rgba(0,0,0,0.70), 0 8px 18px -8px rgba(0,0,0,0.50)', 44 | '0 0 1px 0 rgba(0,0,0,0.70), 0 9px 18px -8px rgba(0,0,0,0.50)', 45 | '0 0 1px 0 rgba(0,0,0,0.70), 0 10px 20px -8px rgba(0,0,0,0.50)', 46 | '0 0 1px 0 rgba(0,0,0,0.70), 0 11px 20px -8px rgba(0,0,0,0.50)', 47 | '0 0 1px 0 rgba(0,0,0,0.70), 0 12px 22px -8px rgba(0,0,0,0.50)', 48 | '0 0 1px 0 rgba(0,0,0,0.70), 0 13px 22px -8px rgba(0,0,0,0.50)', 49 | '0 0 1px 0 rgba(0,0,0,0.70), 0 14px 24px -8px rgba(0,0,0,0.50)', 50 | '0 0 1px 0 rgba(0,0,0,0.70), 0 16px 28px -8px rgba(0,0,0,0.50)', 51 | '0 0 1px 0 rgba(0,0,0,0.70), 0 18px 30px -8px rgba(0,0,0,0.50)', 52 | '0 0 1px 0 rgba(0,0,0,0.70), 0 20px 32px -8px rgba(0,0,0,0.50)', 53 | '0 0 1px 0 rgba(0,0,0,0.70), 0 22px 34px -8px rgba(0,0,0,0.50)', 54 | '0 0 1px 0 rgba(0,0,0,0.70), 0 24px 36px -8px rgba(0,0,0,0.50)' 55 | ] 56 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 13 | 14 | The page will reload if you make edits.\ 15 | You will also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 35 | 36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 39 | 40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /client/src/components/table.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { withStyles, makeStyles } from '@material-ui/core/styles' 3 | import Table from '@material-ui/core/Table' 4 | import TableBody from '@material-ui/core/TableBody' 5 | import TableCell from '@material-ui/core/TableCell' 6 | import TableContainer from '@material-ui/core/TableContainer' 7 | import TableHead from '@material-ui/core/TableHead' 8 | import TableRow from '@material-ui/core/TableRow' 9 | import Paper from '@material-ui/core/Paper' 10 | import { TablePagination } from '@material-ui/core' 11 | 12 | const StyledTableCell = withStyles((theme) => ({ 13 | head: { 14 | backgroundColor: theme.palette.common.black, 15 | color: theme.palette.common.white 16 | }, 17 | body: { 18 | fontSize: 14 19 | } 20 | }))(TableCell) 21 | 22 | const StyledTableRow = withStyles((theme) => ({ 23 | root: { 24 | '&:nth-of-type(odd)': { 25 | backgroundColor: theme.palette.action.hover 26 | } 27 | } 28 | }))(TableRow) 29 | 30 | const useStyles = makeStyles({ 31 | root: { 32 | margin: '40px 0px' 33 | }, 34 | table: { 35 | minWidth: 700 36 | } 37 | }) 38 | 39 | export default function CustomizedTables(csvData) { 40 | const classes = useStyles() 41 | const [page, setPage] = React.useState(0) 42 | const [rowsPerPage, setRowsPerPage] = React.useState(10) 43 | 44 | const handleChangePage = (event, newPage) => { 45 | setPage(newPage) 46 | } 47 | 48 | const handleChangeRowsPerPage = (event) => { 49 | setRowsPerPage(+event.target.value) 50 | setPage(0) 51 | } 52 | 53 | return ( 54 | 55 | 56 | 57 | 58 | 59 | {csvData[0][0]} 60 | {csvData[0].map((ele, index) => 61 | index !== 0 ? ( 62 | {ele} 63 | ) : ( 64 | <> 65 | ) 66 | )} 67 | 68 | 69 | 70 | {Object.keys(csvData) 71 | .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage + 1) 72 | .map((key, index) => { 73 | if (index !== 0 || page !== 0) { 74 | // 0th index is usually data header 75 | return ( 76 | 77 | 78 | {csvData[key][0]} 79 | 80 | 81 | {csvData[key].map((ele, index) => 82 | index !== 0 ? ( 83 | {ele} 84 | ) : ( 85 | <> 86 | ) 87 | )} 88 | 89 | ) 90 | } 91 | })} 92 | 93 |
94 |
95 | 104 |
105 | ) 106 | } 107 | -------------------------------------------------------------------------------- /client/src/layout/TopBar/Account.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { useSelector } from 'react-redux'; 3 | // import { useDispatch } from 'react-redux'; 4 | // import PersonIcon from '@material-ui/icons/Person'; 5 | // import { 6 | // Typography, 7 | // Button, 8 | // Box, 9 | // Avatar, 10 | // Menu, 11 | // MenuItem, 12 | // Hidden, 13 | // CircularProgress, 14 | // makeStyles 15 | // } from '@material-ui/core'; 16 | // import { login, dismissLogin, logout } from 'src/actions/accountActions'; 17 | 18 | // const useStyles = makeStyles(theme => ({ 19 | // button: { 20 | // minWidth: '120px' 21 | // } 22 | // })); 23 | 24 | // function Account() { 25 | // const user = useSelector(state => state.account.user); 26 | // const [anchorEl, setAnchorEl] = React.useState(null); 27 | // const dispatch = useDispatch(); 28 | // const classes = useStyles(); 29 | 30 | // const handleLogout = () => { 31 | // handleCloseMenu(); 32 | // dispatch(logout()); 33 | // dispatch(dismissLogin()); 34 | // }; 35 | 36 | // const handleLoginOpen = () => { 37 | // dispatch(login()); 38 | // }; 39 | 40 | // const handleOpenMenu = event => { 41 | // setAnchorEl(event.currentTarget); 42 | // }; 43 | 44 | // const handleCloseMenu = () => { 45 | // setAnchorEl(null); 46 | // }; 47 | 48 | // const truncate = input => { 49 | // const first = input.split(' ')[0]; 50 | // if (first.length > 13) { 51 | // return first.substring(0, 10) + '...'; 52 | // } 53 | // return first; 54 | // }; 55 | 56 | // return ( 57 | //
65 | //
72 | // {user ? ( 73 | // 82 | // 89 | // {user.photoURL ? ( 90 | // avatar 97 | // ) : ( 98 | // 105 | // )} 106 | // 107 | // 108 | // 109 | // 114 | // {`Hello ${truncate(user.displayName)}`} 115 | // 116 | // 117 | // 118 | // 119 | // ) : ( 120 | // 135 | // )} 136 | // 143 | // Logout 144 | // 145 | //
146 | //
147 | // ); 148 | // } 149 | 150 | // export default Account; 151 | -------------------------------------------------------------------------------- /client/src/components/csv.js: -------------------------------------------------------------------------------- 1 | import { 2 | Box, 3 | Container, 4 | makeStyles, 5 | TextField, 6 | Typography 7 | } from '@material-ui/core' 8 | import React, { useState } from 'react' 9 | import { CSVReader } from 'react-papaparse' 10 | import Table from './table' 11 | import { Link } from 'react-router-dom' 12 | import Autocomplete from '@material-ui/lab/Autocomplete' 13 | 14 | // import 15 | const useStyles = makeStyles((theme) => ({ 16 | root: {}, 17 | button: { 18 | marginTop: '20px', 19 | padding: '8px 24px', 20 | backgroundColor: 'pink' 21 | }, 22 | box: { 23 | backgroundColor: '#ee6401', 24 | width: 'max-content', 25 | padding: '12px 18px', 26 | borderRadius: '6px', 27 | marginTop: '32px', 28 | margin: 'auto' 29 | }, 30 | link: { 31 | textDecoration: 'none', 32 | color: '#fff', 33 | width: 'max-content', 34 | display: 'block', 35 | margin: 'auto' 36 | } 37 | })) 38 | 39 | const CsvReaderComponent = () => { 40 | const classes = useStyles() 41 | 42 | const [csvData, setCsvData] = useState(null) 43 | const [columns, setColumns] = useState(null) 44 | const [selectedData, setSelectedData] = useState([]) 45 | 46 | const mapColumns = (cols) => { 47 | const colArray = [] 48 | cols.map((col, index) => { 49 | return colArray.push({ index: index, column: col }) 50 | }) 51 | setColumns(colArray) 52 | } 53 | 54 | const handleOnDrop = (data, file) => { 55 | console.log('---------------------------') 56 | console.log(data) 57 | console.log('---------------------------') 58 | 59 | const dataArray = [] 60 | 61 | data.map((element) => { 62 | return dataArray.push(element.data) 63 | }) 64 | 65 | setCsvData(dataArray) 66 | mapColumns(dataArray[0]) 67 | 68 | if ( 69 | !( 70 | file.type === 'text/csv' || 71 | file.type === '.csv' || 72 | file.type === 'application/vnd.ms-excel' 73 | ) 74 | ) { 75 | handleOnError( 76 | 'File not compatible', 77 | file.name, 78 | file, 79 | 'File not compatible, provide only csv parsable files' 80 | ) 81 | } 82 | } 83 | 84 | const handleOnError = (err, file, inputElem, reason) => { 85 | console.log('error here---------------******') 86 | console.log('file: ' + file) 87 | console.log(err) 88 | } 89 | 90 | const handleOnRemoveFile = (data) => { 91 | console.log('---------------------------') 92 | console.log(data) 93 | setCsvData(null) 94 | console.log('---------------------------') 95 | } 96 | 97 | const show = (newValue) => { 98 | console.log('hei') 99 | console.log(newValue) 100 | const selectedDataForCerts = [] 101 | if (newValue.length !== 0) { 102 | csvData.map((arrayItem, index) => { 103 | const item = [] 104 | newValue.map(({ column, index }, i) => { 105 | const obj = {} 106 | obj.csvIdx = index 107 | obj.index = i 108 | obj.title = arrayItem[index] 109 | item.push(obj) 110 | }) 111 | selectedDataForCerts.push(item) 112 | }) 113 | } 114 | setSelectedData(selectedDataForCerts) 115 | console.log(columns) 116 | console.log(newValue) 117 | console.log(selectedDataForCerts) 118 | } 119 | 120 | return ( 121 | 122 | 128 | csv-icon 129 | Click or drop your csv file here 130 | 131 | {csvData === null ? ( 132 | '' 133 | ) : ( 134 |
135 | Table Preview 136 | 137 | 138 | )} 139 | {columns === null ? ( 140 | '' 141 | ) : ( 142 | option.column} 148 | onChange={(event, newValue) => { 149 | show(newValue) 150 | // setSelectedColumns(newValue) 151 | }} 152 | // filterSelectedOptions 153 | renderInput={(params) => ( 154 | 159 | )} 160 | /> 161 | )} 162 | 163 | 164 | {selectedData.length === 0 ? ( 165 | 166 | {csvData === null 167 | ? 'First, Import Csv File' 168 | : 'Please select columns'} 169 | 170 | ) : ( 171 | 175 | 176 | {selectedData.length === 0 ? 'Please select columns' : "Let's Go"} 177 | 178 | 179 | )} 180 | 181 | 182 | 183 | ) 184 | } 185 | 186 | export default CsvReaderComponent 187 | -------------------------------------------------------------------------------- /client/src/layout/TopBar/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Link as RouterLink } from 'react-router-dom' 3 | import PropTypes from 'prop-types' 4 | import clsx from 'clsx' 5 | import { 6 | AppBar, 7 | Box, 8 | Hidden, 9 | Toolbar, 10 | Typography, 11 | Link, 12 | makeStyles 13 | } from '@material-ui/core' 14 | import Logo from './Logo' 15 | import Item from './Item' 16 | import IconButton from '@material-ui/core/IconButton' 17 | import CloseIcon from '@material-ui/icons/Close' 18 | import Drawer from '@material-ui/core/Drawer' 19 | import List from '@material-ui/core/List' 20 | import ListItem from '@material-ui/core/ListItem' 21 | // import { HashLink as Link } from 'react-router-hash-link'; 22 | // import { useSelector } from 'react-redux'; 23 | 24 | const useStyles = makeStyles((theme) => ({ 25 | root: { 26 | zIndex: theme.zIndex.drawer + 100, 27 | backgroundColor: theme.palette.background, 28 | paddingLeft: 70, 29 | paddingRight: 70, 30 | top: 'auto', 31 | [theme.breakpoints.down('md')]: { 32 | paddingLeft: 15, 33 | paddingRight: 15 34 | } 35 | }, 36 | toolbar: { 37 | minHeight: 64, 38 | maxHeight: 64 39 | }, 40 | menuButton: { 41 | float: 'right', 42 | color: '#000', 43 | marginRight: '0px' 44 | }, 45 | list: { 46 | width: '100% !important', 47 | display: 'flex', 48 | alignItems: 'center', 49 | justifyContent: 'center' 50 | }, 51 | textStyle: { 52 | textDecoration: 'none' 53 | } 54 | })) 55 | 56 | function TopBar({ className, onMobileNavOpen, ...rest }) { 57 | const classes = useStyles() 58 | // const user = useSelector(state => state.account.user); 59 | const [state, setState] = React.useState({ 60 | top: false, 61 | left: false, 62 | bottom: false, 63 | right: false 64 | }) 65 | 66 | const pathname = window.location.pathname 67 | 68 | const navItems = [ 69 | // { title: 'User', link: '/user' }, 70 | ] 71 | 72 | const list = () => ( 73 |
79 | 80 | {navItems.map((item, index) => ( 81 | 82 | 88 | 89 | {item.title} 90 | 91 | 92 | 93 | ))} 94 | {/* {!user ? ( 95 | 96 | 97 | 98 | ) : ( 99 |
100 | )} */} 101 | 102 |
103 | ) 104 | const headerMoblie = () => ( 105 |
106 | 111 | 112 | 113 | 114 | 121 | 122 | 123 | 124 |
125 | ) 126 | 127 | const toggleDrawer = (anchor, open) => (event) => { 128 | if ( 129 | event.type === 'keydown' && 130 | (event.key === 'Tab' || event.key === 'Shift') 131 | ) { 132 | return 133 | } 134 | 135 | setState({ ...state, [anchor]: open }) 136 | } 137 | 138 | return ( 139 | 140 | 141 | 142 | 143 | 144 | 145 | Certificate Generator 146 | 147 | 148 | 149 | {navItems.map((item, index) => ( 150 | 155 | ))} 156 | 157 | 158 | 159 | 160 | {/* 166 | 167 | {user ? :
} 168 | 174 | 175 | 176 | */} 177 | 183 | {headerMoblie()} 184 | {list()} 185 | 186 | 187 | 188 | 189 | ) 190 | } 191 | 192 | TopBar.propTypes = { 193 | className: PropTypes.string, 194 | onMobileNavOpen: PropTypes.func 195 | } 196 | 197 | export default TopBar 198 | -------------------------------------------------------------------------------- /client/src/components/pdf/certificateGenertorWithPdf.js: -------------------------------------------------------------------------------- 1 | import { 2 | Divider, 3 | Drawer, 4 | Fab, 5 | makeStyles, 6 | TextField, 7 | Typography 8 | } from '@material-ui/core' 9 | import IconButton from '@material-ui/core/IconButton' 10 | import ChevronRightIcon from '@material-ui/icons/ChevronRight' 11 | import CloseIcon from '@material-ui/icons/Close' 12 | import EditIcon from '@material-ui/icons/Edit' 13 | import { saveAs } from 'file-saver' 14 | import * as pdfLib from 'pdf-lib' 15 | import React, { useEffect, useState } from 'react' 16 | import { Document, Page, pdfjs } from 'react-pdf' 17 | import { drawerWidth } from '../../constants' 18 | import CustomButton from '../Button' 19 | 20 | const { PDFDocument, rgb, StandardFonts } = pdfLib 21 | 22 | pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js` 23 | 24 | const useStyles = makeStyles((theme) => ({ 25 | root: {}, 26 | btn: { 27 | margin: theme.spacing(2, 1, 0), 28 | padding: theme.spacing(1.5, 2) 29 | }, 30 | drawer: { 31 | width: drawerWidth, 32 | flexShrink: 0, 33 | backgroundColor: 'grey' 34 | }, 35 | drawerPaper: { 36 | width: drawerWidth 37 | }, 38 | fab: { 39 | position: 'absolute', 40 | bottom: theme.spacing(5), 41 | right: theme.spacing(5) 42 | }, 43 | drawerHeader: { 44 | display: 'flex', 45 | alignItems: 'center', 46 | // margin: theme.spacing(30, 1, 0), 47 | // necessary for content to be below app bar 48 | ...theme.mixins.toolbar, 49 | justifyContent: 'flex-start', 50 | cursor: 'pointer' 51 | }, 52 | appBarShift: { 53 | width: `calc(100% - ${drawerWidth}px)`, 54 | transition: theme.transitions.create(['margin', 'width'], { 55 | easing: theme.transitions.easing.easeOut, 56 | duration: theme.transitions.duration.enteringScreen 57 | }), 58 | marginRight: drawerWidth 59 | }, 60 | textField: { 61 | marginTop: '20px', 62 | backgroundColor: '#f7f7f7' 63 | } 64 | })) 65 | 66 | const CertificateGeneratorWithPdf = () => { 67 | const classes = useStyles() 68 | const defaultValue = { name: 'Abhishek Kumar', x: 220, y: 360, size: 50 } 69 | 70 | const [pdf, setPdf] = useState(null) 71 | const [numPages, setNumPages] = useState(null) 72 | const [pageNumber, setPageNumber] = useState(1) 73 | const [textDrawProperties, setTextDrawProperties] = useState(defaultValue) 74 | const [open, setOpen] = React.useState(true) 75 | 76 | useEffect(() => { 77 | generatePDF(textDrawProperties).then((arr) => setPdf(arr)) 78 | }, []) 79 | 80 | function onDocumentLoadSuccess({ numPages }) { 81 | setNumPages(numPages) 82 | } 83 | 84 | function download() { 85 | if (pdf == null) { 86 | alert('No New Changes are made on template') 87 | } else { 88 | var file = new File([pdf], 'CfcCertificate.pdf', { 89 | type: 'application/pdf;charset=utf-8' 90 | }) 91 | saveAs(file) 92 | } 93 | } 94 | 95 | const handleChange = (e) => { 96 | setTextDrawProperties({ 97 | ...textDrawProperties, 98 | [e.target.name]: e.target.value 99 | }) 100 | console.log(e.target.name) 101 | } 102 | 103 | const resetToDefault = () => { 104 | setTextDrawProperties(defaultValue) 105 | generatePDF(defaultValue).then((arr) => setPdf(arr)) 106 | } 107 | 108 | return ( 109 |
110 | {pdf !== null ? ( 111 | 116 | 117 | 118 | ) : ( 119 | <> 120 | )} 121 | 122 | Click on show pdf changes to see the made changes 123 | 124 | 130 | 143 | 156 | 166 | { 171 | const val = 'Abhishek Kumar' 172 | //check if the text is empty or not 173 | if (val.trim() !== '') { 174 | // console.log(val); 175 | generatePDF(textDrawProperties).then((arr) => { 176 | setPdf(arr) 177 | }) 178 | } else { 179 | console.log('Empty String') 180 | } 181 | }} 182 | /> 183 | { 187 | resetToDefault() 188 | }} 189 | > 190 | { 195 | download() 196 | }} 197 | /> 198 | 199 |
{ 202 | setOpen(!open) 203 | }} 204 | > 205 | 206 | 207 | 208 | Close 209 |
210 |
211 | {!open ? ( 212 | { 216 | setOpen(!open) 217 | }} 218 | > 219 | {open ? : } 220 | 221 | ) : ( 222 | <> 223 | )} 224 |
225 | ) 226 | } 227 | 228 | const generatePDF = async (properties) => { 229 | const { name, x, y, size } = properties 230 | console.log('X:' + x + 'y: ' + y) 231 | const existingPdfBytes = await fetch('t2.pdf').then((res) => 232 | res.arrayBuffer() 233 | ) 234 | 235 | // Load a PDFDocument from the existing PDF bytes 236 | const pdfDoc = await PDFDocument.load(existingPdfBytes) 237 | // pdfDoc.registerFontkit(fontkit); 238 | 239 | // //get font 240 | // const fontBytes = await fetch("Source Serif Pro").then((res) => 241 | // res.arrayBuffer() 242 | // ); 243 | 244 | // Embed our custom font in the document 245 | const helveticaFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold) 246 | 247 | // Get the first page of the document 248 | const pages = pdfDoc.getPages() 249 | const firstPage = pages[0] 250 | 251 | firstPage.drawText(name, { 252 | x: parseInt(x), 253 | y: parseInt(y), 254 | size: parseInt(size), 255 | font: helveticaFont, 256 | color: rgb(0.7, 0.625, 0.35) 257 | }) 258 | 259 | return await pdfDoc.save() 260 | } 261 | 262 | export default CertificateGeneratorWithPdf 263 | -------------------------------------------------------------------------------- /client/src/components/image/cecrtificateGeneratorByImage.js: -------------------------------------------------------------------------------- 1 | import { 2 | Divider, 3 | Drawer, 4 | Fab, 5 | makeStyles, 6 | TextField, 7 | Typography 8 | } from '@material-ui/core' 9 | import IconButton from '@material-ui/core/IconButton' 10 | import ChevronRightIcon from '@material-ui/icons/ChevronRight' 11 | import CloseIcon from '@material-ui/icons/Close' 12 | import EditIcon from '@material-ui/icons/Edit' 13 | import clsx from 'clsx' 14 | import jsPDF from 'jspdf' 15 | import React, { useEffect, useRef, useState } from 'react' 16 | import { drawerWidth } from '../../constants' 17 | import ButtonComponent from '../Button' 18 | import templates from '../../data' 19 | import axios from 'axios' 20 | 21 | const useStyles = makeStyles((theme) => ({ 22 | root: { 23 | // textAlign: 'center', 24 | padding: theme.spacing(3), 25 | marginTop: theme.spacing(5) 26 | }, 27 | drawer: { 28 | width: drawerWidth, 29 | flexShrink: 0, 30 | backgroundColor: 'grey' 31 | }, 32 | drawerPaper: { 33 | width: drawerWidth 34 | }, 35 | fab: { 36 | position: 'absolute', 37 | bottom: theme.spacing(5), 38 | right: theme.spacing(5) 39 | }, 40 | drawerHeader: { 41 | display: 'flex', 42 | alignItems: 'center', 43 | // margin: theme.spacing(30, 1, 0), 44 | // necessary for content to be below app bar 45 | ...theme.mixins.toolbar, 46 | justifyContent: 'flex-start', 47 | cursor: 'pointer' 48 | }, 49 | appBarShift: { 50 | width: `calc(100% - ${drawerWidth}px)`, 51 | transition: theme.transitions.create(['margin', 'width'], { 52 | easing: theme.transitions.easing.easeOut, 53 | duration: theme.transitions.duration.enteringScreen 54 | }), 55 | marginRight: drawerWidth 56 | }, 57 | textField: { 58 | margin: '20px 4px 0px', 59 | backgroundColor: '#f7f7f7', 60 | width: '120px' 61 | }, 62 | btn: { 63 | margin: theme.spacing(2, 2, 0), 64 | padding: theme.spacing(1.5, 2) 65 | } 66 | })) 67 | 68 | function CertificateGeneratorByImage({ data }) { 69 | const classes = useStyles() 70 | const canvas = useRef() 71 | let ctx = null 72 | 73 | const [textDrawProperties, setTextDrawProperties] = useState( 74 | templates.png[0].text 75 | ) 76 | const [open, setOpen] = React.useState(false) 77 | const [state, forceUpdate] = useState(false) 78 | 79 | useEffect(() => { 80 | setTextDrawProperties(modifyield(textDrawProperties, data[0])) 81 | }, []) 82 | 83 | useEffect(() => { 84 | // dynamically assign the width and height to canvas 85 | const canvasEle = canvas.current 86 | var imageObj1 = new Image() 87 | imageObj1.src = 'template/t1.png' 88 | imageObj1.onload = function () { 89 | canvasEle.width = imageObj1.width 90 | canvasEle.height = imageObj1.height 91 | } 92 | // get context of the canvas 93 | ctx = canvasEle.getContext('2d') 94 | }, []) 95 | 96 | useEffect(() => { 97 | updateCanvas() 98 | }) 99 | 100 | function downloadImage(uri, name) { 101 | var link = document.createElement('a') 102 | link.download = name 103 | link.href = uri 104 | document.body.appendChild(link) 105 | link.click() 106 | document.body.removeChild(link) 107 | } 108 | 109 | function downloadPdf(uri, name) { 110 | const pdf = new jsPDF({ orientation: 'landscape' }) 111 | const imgProps = pdf.getImageProperties(uri) 112 | const pdfWidth = pdf.internal.pageSize.getWidth() 113 | const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width 114 | pdf.addImage(uri, 'JPEG', 0, 0, pdfWidth, pdfHeight) 115 | pdf.save(`${name}.pdf`) 116 | } 117 | 118 | console.log(data) 119 | 120 | function updateCanvas() { 121 | // var {x, y} = cordinates 122 | const canvasEle = canvas.current 123 | ctx = canvasEle.getContext('2d') 124 | var imageObj1 = new Image() 125 | imageObj1.src = 'template/t1.png' 126 | imageObj1.onload = function () { 127 | ctx.drawImage(imageObj1, 0, 0) 128 | textDrawProperties.map((text, index) => { 129 | ctx.font = `${text.size}pt Montserrat` 130 | ctx.fillStyle = 'white' 131 | ctx.fillText(data[1][index]?.title, text.x, text.y) 132 | }) 133 | forceUpdate(true) 134 | } 135 | } 136 | 137 | const handleChange = (index) => (e) => { 138 | let newArray = [...textDrawProperties] 139 | newArray[index][e.target.name] = e.target.value 140 | setTextDrawProperties(newArray) 141 | } 142 | 143 | const resetToDefault = () => { 144 | window.location.reload() 145 | } 146 | 147 | const addField = () => { 148 | setTextDrawProperties([ 149 | ...textDrawProperties, 150 | { 151 | title: 'Title', 152 | x: Math.floor(Math.random() * 100) + 80, 153 | y: Math.floor(Math.random() * 100) + 80, 154 | size: 50 155 | } 156 | ]) 157 | } 158 | 159 | const removeField = (index) => { 160 | let arr = [...textDrawProperties] 161 | arr.splice(index, 1) 162 | setTextDrawProperties(arr) 163 | } 164 | 165 | function sendReq() { 166 | axios({ 167 | url: 'http://localhost:5001/cert', 168 | method: 'POST', 169 | data: { 170 | template: 't1.png', 171 | textProps: [...textDrawProperties], 172 | csv: [...data] 173 | } 174 | }) 175 | .then((res) => { 176 | console.log(res) 177 | }) 178 | .catch((e) => { 179 | console.log(e) 180 | }) 181 | } 182 | 183 | return ( 184 |
189 | 195 |
    196 | {textDrawProperties.map((properties, index) => ( 197 |
  • 198 |
    199 | {/* */} 204 | 207 | {properties.title} 208 | 209 | removeField(index)} 218 | > 219 | {/* */} 220 | 221 | Delete 222 | 223 | 224 |
    225 | 238 | 251 | 264 |
  • 265 | ))} 266 |
267 | 274 | { 279 | resetToDefault() 280 | }} 281 | > 282 | { 286 | const c = canvas.current 287 | downloadPdf(c.toDataURL('png'), 'certificate-pdf') 288 | downloadImage(c.toDataURL('png'), 'certificate-image') 289 | }} 290 | /> 291 | { 296 | sendReq() 297 | }} 298 | /> 299 | 300 |
{ 303 | setOpen(!open) 304 | }} 305 | > 306 | 307 | 308 | 309 | Close 310 |
311 |
312 | 313 | 314 | {!open ? ( 315 | { 319 | setOpen(!open) 320 | }} 321 | > 322 | {open ? : } 323 | 324 | ) : ( 325 | <> 326 | )} 327 |
328 | ) 329 | } 330 | 331 | function modifyield(defaultArray, dataArray) { 332 | while (dataArray.length > defaultArray.length) { 333 | defaultArray.push({ 334 | title: 'Title', 335 | x: Math.floor(Math.random() * 100) + 80, 336 | y: Math.floor(Math.random() * 100) + 80, 337 | size: Math.floor(Math.random() * 100) + 10 338 | }) 339 | } 340 | const deleteCount = defaultArray.length - dataArray.length 341 | if (dataArray.length < defaultArray.length) { 342 | defaultArray.splice(-1, deleteCount) 343 | } 344 | return defaultArray 345 | } 346 | 347 | export default CertificateGeneratorByImage 348 | -------------------------------------------------------------------------------- /client/src/components/temp.js: -------------------------------------------------------------------------------- 1 | //------------------------------------------------ 2 | // A temporary file just to test out things, Nothing to do or is related with main codebase 3 | //Please ignore 4 | //------------------------------------------------ 5 | /* eslint-disable no-use-before-define */ 6 | import React from 'react' 7 | import Autocomplete from '@material-ui/lab/Autocomplete' 8 | import { makeStyles } from '@material-ui/core/styles' 9 | import TextField from '@material-ui/core/TextField' 10 | 11 | const useStyles = makeStyles((theme) => ({ 12 | root: { 13 | width: 500, 14 | '& > * + *': { 15 | marginTop: theme.spacing(3) 16 | } 17 | } 18 | })) 19 | 20 | export default function Tags() { 21 | const classes = useStyles() 22 | 23 | return ( 24 |
25 | option.title} 30 | defaultValue={[top100Films[13]]} 31 | onChange={(event, newValue) => { 32 | console.log(event) 33 | console.log(newValue) 34 | }} 35 | // filterSelectedOptions 36 | renderInput={(params) => ( 37 | 43 | )} 44 | /> 45 |
46 | ) 47 | } 48 | 49 | // Top 100 films as rated by IMDb users. http://www.imdb.com/chart/top 50 | const top100Films = [ 51 | { title: 'The Shawshank Redemption', year: 1994 }, 52 | { title: 'The Godfather', year: 1972 }, 53 | { title: 'The Godfather: Part II', year: 1974 }, 54 | { title: 'The Dark Knight', year: 2008 }, 55 | { title: '12 Angry Men', year: 1957 }, 56 | { title: "Schindler's List", year: 1993 }, 57 | { title: 'Pulp Fiction', year: 1994 }, 58 | { title: 'The Lord of the Rings: The Return of the King', year: 2003 }, 59 | { title: 'The Good, the Bad and the Ugly', year: 1966 }, 60 | { title: 'Fight Club', year: 1999 }, 61 | { title: 'The Lord of the Rings: The Fellowship of the Ring', year: 2001 }, 62 | { title: 'Star Wars: Episode V - The Empire Strikes Back', year: 1980 }, 63 | { title: 'Forrest Gump', year: 1994 }, 64 | { title: 'Inception', year: 2010 }, 65 | { title: 'The Lord of the Rings: The Two Towers', year: 2002 }, 66 | { title: "One Flew Over the Cuckoo's Nest", year: 1975 }, 67 | { title: 'Goodfellas', year: 1990 }, 68 | { title: 'The Matrix', year: 1999 }, 69 | { title: 'Seven Samurai', year: 1954 }, 70 | { title: 'Star Wars: Episode IV - A New Hope', year: 1977 }, 71 | { title: 'City of God', year: 2002 }, 72 | { title: 'Se7en', year: 1995 }, 73 | { title: 'The Silence of the Lambs', year: 1991 }, 74 | { title: "It's a Wonderful Life", year: 1946 }, 75 | { title: 'Life Is Beautiful', year: 1997 }, 76 | { title: 'The Usual Suspects', year: 1995 }, 77 | { title: 'Léon: The Professional', year: 1994 }, 78 | { title: 'Spirited Away', year: 2001 }, 79 | { title: 'Saving Private Ryan', year: 1998 }, 80 | { title: 'Once Upon a Time in the West', year: 1968 }, 81 | { title: 'American History X', year: 1998 }, 82 | { title: 'Interstellar', year: 2014 }, 83 | { title: 'Casablanca', year: 1942 }, 84 | { title: 'City Lights', year: 1931 }, 85 | { title: 'Psycho', year: 1960 }, 86 | { title: 'The Green Mile', year: 1999 }, 87 | { title: 'The Intouchables', year: 2011 }, 88 | { title: 'Modern Times', year: 1936 }, 89 | { title: 'Raiders of the Lost Ark', year: 1981 }, 90 | { title: 'Rear Window', year: 1954 }, 91 | { title: 'The Pianist', year: 2002 }, 92 | { title: 'The Departed', year: 2006 }, 93 | { title: 'Terminator 2: Judgment Day', year: 1991 }, 94 | { title: 'Back to the Future', year: 1985 }, 95 | { title: 'Whiplash', year: 2014 }, 96 | { title: 'Gladiator', year: 2000 }, 97 | { title: 'Memento', year: 2000 }, 98 | { title: 'The Prestige', year: 2006 }, 99 | { title: 'The Lion King', year: 1994 }, 100 | { title: 'Apocalypse Now', year: 1979 }, 101 | { title: 'Alien', year: 1979 }, 102 | { title: 'Sunset Boulevard', year: 1950 }, 103 | { 104 | title: 105 | 'Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb', 106 | year: 1964 107 | }, 108 | { title: 'The Great Dictator', year: 1940 }, 109 | { title: 'Cinema Paradiso', year: 1988 }, 110 | { title: 'The Lives of Others', year: 2006 }, 111 | { title: 'Grave of the Fireflies', year: 1988 }, 112 | { title: 'Paths of Glory', year: 1957 }, 113 | { title: 'Django Unchained', year: 2012 }, 114 | { title: 'The Shining', year: 1980 }, 115 | { title: 'WALL·E', year: 2008 }, 116 | { title: 'American Beauty', year: 1999 }, 117 | { title: 'The Dark Knight Rises', year: 2012 }, 118 | { title: 'Princess Mononoke', year: 1997 }, 119 | { title: 'Aliens', year: 1986 }, 120 | { title: 'Oldboy', year: 2003 }, 121 | { title: 'Once Upon a Time in America', year: 1984 }, 122 | { title: 'Witness for the Prosecution', year: 1957 }, 123 | { title: 'Das Boot', year: 1981 }, 124 | { title: 'Citizen Kane', year: 1941 }, 125 | { title: 'North by Northwest', year: 1959 }, 126 | { title: 'Vertigo', year: 1958 }, 127 | { title: 'Star Wars: Episode VI - Return of the Jedi', year: 1983 }, 128 | { title: 'Reservoir Dogs', year: 1992 }, 129 | { title: 'Braveheart', year: 1995 }, 130 | { title: 'M', year: 1931 }, 131 | { title: 'Requiem for a Dream', year: 2000 }, 132 | { title: 'Amélie', year: 2001 }, 133 | { title: 'A Clockwork Orange', year: 1971 }, 134 | { title: 'Like Stars on Earth', year: 2007 }, 135 | { title: 'Taxi Driver', year: 1976 }, 136 | { title: 'Lawrence of Arabia', year: 1962 }, 137 | { title: 'Double Indemnity', year: 1944 }, 138 | { title: 'Eternal Sunshine of the Spotless Mind', year: 2004 }, 139 | { title: 'Amadeus', year: 1984 }, 140 | { title: 'To Kill a Mockingbird', year: 1962 }, 141 | { title: 'Toy Story 3', year: 2010 }, 142 | { title: 'Logan', year: 2017 }, 143 | { title: 'Full Metal Jacket', year: 1987 }, 144 | { title: 'Dangal', year: 2016 }, 145 | { title: 'The Sting', year: 1973 }, 146 | { title: '2001: A Space Odyssey', year: 1968 }, 147 | { title: "Singin' in the Rain", year: 1952 }, 148 | { title: 'Toy Story', year: 1995 }, 149 | { title: 'Bicycle Thieves', year: 1948 }, 150 | { title: 'The Kid', year: 1921 }, 151 | { title: 'Inglourious Basterds', year: 2009 }, 152 | { title: 'Snatch', year: 2000 }, 153 | { title: '3 Idiots', year: 2009 }, 154 | { title: 'Monty Python and the Holy Grail', year: 1975 } 155 | ] 156 | 157 | /* eslint-disable no-use-before-define */ 158 | // import React from 'react'; 159 | // import { useTheme, fade, makeStyles } from '@material-ui/core/styles'; 160 | // import Popper from '@material-ui/core/Popper'; 161 | // import SettingsIcon from '@material-ui/icons/Settings'; 162 | // import CloseIcon from '@material-ui/icons/Close'; 163 | // import DoneIcon from '@material-ui/icons/Done'; 164 | // import Autocomplete from '@material-ui/lab/Autocomplete'; 165 | // import ButtonBase from '@material-ui/core/ButtonBase'; 166 | // import InputBase from '@material-ui/core/InputBase'; 167 | 168 | // const useStyles = makeStyles((theme) => ({ 169 | // root: { 170 | // width: 221, 171 | // fontSize: 13, 172 | // }, 173 | // button: { 174 | // fontSize: 13, 175 | // width: '100%', 176 | // textAlign: 'left', 177 | // paddingBottom: 8, 178 | // color: '#586069', 179 | // fontWeight: 600, 180 | // '&:hover,&:focus': { 181 | // color: '#0366d6', 182 | // }, 183 | // '& span': { 184 | // width: '100%', 185 | // }, 186 | // '& svg': { 187 | // width: 16, 188 | // height: 16, 189 | // }, 190 | // }, 191 | // tag: { 192 | // marginTop: 3, 193 | // height: 20, 194 | // width: 400, 195 | // padding: '.15em 4px', 196 | // fontWeight: 600, 197 | // lineHeight: '15px', 198 | // borderRadius: 2, 199 | // }, 200 | // popper: { 201 | // border: '1px solid rgba(27,31,35,.15)', 202 | // boxShadow: '0 3px 12px rgba(27,31,35,.15)', 203 | // borderRadius: 3, 204 | // width: 300, 205 | // zIndex: 1, 206 | // fontSize: 13, 207 | // color: '#586069', 208 | // backgroundColor: '#f6f8fa', 209 | // }, 210 | // header: { 211 | // borderBottom: '1px solid #e1e4e8', 212 | // padding: '8px 10px', 213 | // fontWeight: 600, 214 | // }, 215 | // inputBase: { 216 | // padding: 10, 217 | // width: '100%', 218 | // borderBottom: '1px solid #dfe2e5', 219 | // '& input': { 220 | // borderRadius: 4, 221 | // backgroundColor: theme.palette.common.white, 222 | // padding: 8, 223 | // transition: theme.transitions.create(['border-color', 'box-shadow']), 224 | // border: '1px solid #ced4da', 225 | // fontSize: 14, 226 | // '&:focus': { 227 | // boxShadow: `${fade(theme.palette.primary.main, 0.25)} 0 0 0 0.2rem`, 228 | // borderColor: theme.palette.primary.main, 229 | // }, 230 | // }, 231 | // }, 232 | // paper: { 233 | // boxShadow: 'none', 234 | // margin: 0, 235 | // color: '#586069', 236 | // fontSize: 13, 237 | // }, 238 | // option: { 239 | // minHeight: 'auto', 240 | // alignItems: 'flex-start', 241 | // padding: 8, 242 | // '&[aria-selected="true"]': { 243 | // backgroundColor: 'transparent', 244 | // }, 245 | // '&[data-focus="true"]': { 246 | // backgroundColor: theme.palette.action.hover, 247 | // }, 248 | // }, 249 | // popperDisablePortal: { 250 | // position: 'relative', 251 | // }, 252 | // iconSelected: { 253 | // width: 17, 254 | // height: 17, 255 | // marginRight: 5, 256 | // marginLeft: -2, 257 | // }, 258 | // color: { 259 | // width: 14, 260 | // height: 14, 261 | // flexShrink: 0, 262 | // borderRadius: 3, 263 | // marginRight: 8, 264 | // marginTop: 2, 265 | // }, 266 | // text: { 267 | // flexGrow: 1, 268 | // }, 269 | // close: { 270 | // opacity: 0.6, 271 | // width: 18, 272 | // height: 18, 273 | // }, 274 | // })); 275 | 276 | // export default function GitHubLabel() { 277 | // const classes = useStyles(); 278 | // const [anchorEl, setAnchorEl] = React.useState(null); 279 | // const [value, setValue] = React.useState([labels[1], labels[11]]); 280 | // const [pendingValue, setPendingValue] = React.useState([]); 281 | // const theme = useTheme(); 282 | 283 | // const handleClick = (event) => { 284 | // setPendingValue(value); 285 | // setAnchorEl(event.currentTarget); 286 | // }; 287 | 288 | // const handleClose = (event, reason) => { 289 | // if (reason === 'toggleInput') { 290 | // return; 291 | // } 292 | // setValue(pendingValue); 293 | // if (anchorEl) { 294 | // anchorEl.focus(); 295 | // } 296 | // setAnchorEl(null); 297 | // console.log(value) 298 | // }; 299 | 300 | // const open = Boolean(anchorEl); 301 | // const id = open ? 'github-label' : undefined; 302 | 303 | // return ( 304 | // 305 | //
306 | // 312 | // Labels 313 | // 314 | // 315 | // {value.map((label) => ( 316 | //
324 | // {label.name} 325 | //
326 | // ))} 327 | //
328 | // 335 | //
Apply labels to this pull request
336 | // { 347 | // setPendingValue(newValue); 348 | // }} 349 | // disableCloseOnSelect 350 | // disablePortal 351 | // renderTags={() => null} 352 | // noOptionsText="No labels" 353 | // renderOption={(option, { selected }) => ( 354 | // 355 | // 359 | // 360 | //
361 | // {option.name} 362 | //
363 | // {option.description} 364 | //
365 | // 369 | //
370 | // )} 371 | // options={[...labels].sort((a, b) => { 372 | // // Display the selected labels first. 373 | // let ai = value.indexOf(a); 374 | // ai = ai === -1 ? value.length + labels.indexOf(a) : ai; 375 | // let bi = value.indexOf(b); 376 | // bi = bi === -1 ? value.length + labels.indexOf(b) : bi; 377 | // return ai - bi; 378 | // })} 379 | // getOptionLabel={(option) => option.name} 380 | // renderInput={(params) => ( 381 | // 387 | // )} 388 | // /> 389 | //
390 | //
391 | // ); 392 | // } 393 | 394 | // // From https://github.com/abdonrd/github-labels 395 | // const labels = [ 396 | // { 397 | // name: 'good first issue', 398 | // color: '#7057ff', 399 | // description: 'Good for newcomers', 400 | // }, 401 | // { 402 | // name: 'help wanted', 403 | // color: '#008672', 404 | // description: 'Extra attention is needed', 405 | // }, 406 | // { 407 | // name: 'priority: critical', 408 | // color: '#b60205', 409 | // description: '', 410 | // }, 411 | // { 412 | // name: 'priority: high', 413 | // color: '#d93f0b', 414 | // description: '', 415 | // }, 416 | // { 417 | // name: 'priority: low', 418 | // color: '#0e8a16', 419 | // description: '', 420 | // }, 421 | // { 422 | // name: 'priority: medium', 423 | // color: '#fbca04', 424 | // description: '', 425 | // }, 426 | // { 427 | // name: "status: can't reproduce", 428 | // color: '#fec1c1', 429 | // description: '', 430 | // }, 431 | // { 432 | // name: 'status: confirmed', 433 | // color: '#215cea', 434 | // description: '', 435 | // }, 436 | // { 437 | // name: 'status: duplicate', 438 | // color: '#cfd3d7', 439 | // description: 'This issue or pull request already exists', 440 | // }, 441 | // { 442 | // name: 'status: needs information', 443 | // color: '#fef2c0', 444 | // description: '', 445 | // }, 446 | // { 447 | // name: 'status: wont do/fix', 448 | // color: '#eeeeee', 449 | // description: 'This will not be worked on', 450 | // }, 451 | // { 452 | // name: 'type: bug', 453 | // color: '#d73a4a', 454 | // description: "Something isn't working", 455 | // }, 456 | // { 457 | // name: 'type: discussion', 458 | // color: '#d4c5f9', 459 | // description: '', 460 | // }, 461 | // { 462 | // name: 'type: documentation', 463 | // color: '#006b75', 464 | // description: '', 465 | // }, 466 | // { 467 | // name: 'type: enhancement', 468 | // color: '#84b6eb', 469 | // description: '', 470 | // }, 471 | // { 472 | // name: 'type: epic', 473 | // color: '#3e4b9e', 474 | // description: 'A theme of work that contain sub-tasks', 475 | // }, 476 | // { 477 | // name: 'type: feature request', 478 | // color: '#fbca04', 479 | // description: 'New feature or request', 480 | // }, 481 | // { 482 | // name: 'type: question', 483 | // color: '#d876e3', 484 | // description: 'Further information is requested', 485 | // }, 486 | // ]; 487 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 11 | }, 12 | "accepts": { 13 | "version": "1.3.7", 14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 15 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 16 | "requires": { 17 | "mime-types": "~2.1.24", 18 | "negotiator": "0.6.2" 19 | } 20 | }, 21 | "acorn": { 22 | "version": "2.7.0", 23 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 24 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 25 | }, 26 | "acorn-globals": { 27 | "version": "1.0.9", 28 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 29 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 30 | "requires": { 31 | "acorn": "^2.1.0" 32 | } 33 | }, 34 | "align-text": { 35 | "version": "0.1.4", 36 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 37 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 38 | "requires": { 39 | "kind-of": "^3.0.2", 40 | "longest": "^1.0.1", 41 | "repeat-string": "^1.5.2" 42 | } 43 | }, 44 | "amdefine": { 45 | "version": "1.0.1", 46 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 47 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 48 | }, 49 | "ansi-regex": { 50 | "version": "2.1.1", 51 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 52 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 53 | }, 54 | "aproba": { 55 | "version": "1.2.0", 56 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 57 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 58 | }, 59 | "are-we-there-yet": { 60 | "version": "1.1.5", 61 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 62 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 63 | "requires": { 64 | "delegates": "^1.0.0", 65 | "readable-stream": "^2.0.6" 66 | } 67 | }, 68 | "array-flatten": { 69 | "version": "1.1.1", 70 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 71 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 72 | }, 73 | "asap": { 74 | "version": "1.0.0", 75 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 76 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" 77 | }, 78 | "balanced-match": { 79 | "version": "1.0.0", 80 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 81 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 82 | }, 83 | "basic-auth": { 84 | "version": "2.0.1", 85 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 86 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 87 | "requires": { 88 | "safe-buffer": "5.1.2" 89 | } 90 | }, 91 | "body-parser": { 92 | "version": "1.18.3", 93 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 94 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 95 | "requires": { 96 | "bytes": "3.0.0", 97 | "content-type": "~1.0.4", 98 | "debug": "2.6.9", 99 | "depd": "~1.1.2", 100 | "http-errors": "~1.6.3", 101 | "iconv-lite": "0.4.23", 102 | "on-finished": "~2.3.0", 103 | "qs": "6.5.2", 104 | "raw-body": "2.3.3", 105 | "type-is": "~1.6.16" 106 | } 107 | }, 108 | "brace-expansion": { 109 | "version": "1.1.11", 110 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 111 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 112 | "requires": { 113 | "balanced-match": "^1.0.0", 114 | "concat-map": "0.0.1" 115 | } 116 | }, 117 | "bytes": { 118 | "version": "3.0.0", 119 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 120 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 121 | }, 122 | "camelcase": { 123 | "version": "1.2.1", 124 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 125 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 126 | }, 127 | "canvas": { 128 | "version": "2.6.1", 129 | "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", 130 | "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", 131 | "requires": { 132 | "nan": "^2.14.0", 133 | "node-pre-gyp": "^0.11.0", 134 | "simple-get": "^3.0.3" 135 | } 136 | }, 137 | "center-align": { 138 | "version": "0.1.3", 139 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 140 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 141 | "requires": { 142 | "align-text": "^0.1.3", 143 | "lazy-cache": "^1.0.3" 144 | } 145 | }, 146 | "character-parser": { 147 | "version": "1.2.1", 148 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", 149 | "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" 150 | }, 151 | "chownr": { 152 | "version": "1.1.4", 153 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 154 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 155 | }, 156 | "clean-css": { 157 | "version": "3.4.28", 158 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", 159 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", 160 | "requires": { 161 | "commander": "2.8.x", 162 | "source-map": "0.4.x" 163 | }, 164 | "dependencies": { 165 | "commander": { 166 | "version": "2.8.1", 167 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 168 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 169 | "requires": { 170 | "graceful-readlink": ">= 1.0.0" 171 | } 172 | } 173 | } 174 | }, 175 | "cliui": { 176 | "version": "2.1.0", 177 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 178 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 179 | "requires": { 180 | "center-align": "^0.1.1", 181 | "right-align": "^0.1.1", 182 | "wordwrap": "0.0.2" 183 | }, 184 | "dependencies": { 185 | "wordwrap": { 186 | "version": "0.0.2", 187 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 188 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 189 | } 190 | } 191 | }, 192 | "code-point-at": { 193 | "version": "1.1.0", 194 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 195 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 196 | }, 197 | "commander": { 198 | "version": "2.6.0", 199 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 200 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" 201 | }, 202 | "concat-map": { 203 | "version": "0.0.1", 204 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 205 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 206 | }, 207 | "console-control-strings": { 208 | "version": "1.1.0", 209 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 210 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 211 | }, 212 | "constantinople": { 213 | "version": "3.0.2", 214 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", 215 | "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", 216 | "requires": { 217 | "acorn": "^2.1.0" 218 | } 219 | }, 220 | "content-disposition": { 221 | "version": "0.5.2", 222 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 223 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 224 | }, 225 | "content-type": { 226 | "version": "1.0.4", 227 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 228 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 229 | }, 230 | "cookie": { 231 | "version": "0.4.0", 232 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 233 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 234 | }, 235 | "cookie-parser": { 236 | "version": "1.4.5", 237 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", 238 | "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", 239 | "requires": { 240 | "cookie": "0.4.0", 241 | "cookie-signature": "1.0.6" 242 | } 243 | }, 244 | "cookie-signature": { 245 | "version": "1.0.6", 246 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 247 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 248 | }, 249 | "core-util-is": { 250 | "version": "1.0.2", 251 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 252 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 253 | }, 254 | "cors": { 255 | "version": "2.8.5", 256 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 257 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 258 | "requires": { 259 | "object-assign": "^4", 260 | "vary": "^1" 261 | } 262 | }, 263 | "css": { 264 | "version": "1.0.8", 265 | "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", 266 | "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", 267 | "requires": { 268 | "css-parse": "1.0.4", 269 | "css-stringify": "1.0.5" 270 | } 271 | }, 272 | "css-parse": { 273 | "version": "1.0.4", 274 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", 275 | "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" 276 | }, 277 | "css-stringify": { 278 | "version": "1.0.5", 279 | "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", 280 | "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" 281 | }, 282 | "debug": { 283 | "version": "2.6.9", 284 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 285 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 286 | "requires": { 287 | "ms": "2.0.0" 288 | } 289 | }, 290 | "decamelize": { 291 | "version": "1.2.0", 292 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 293 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 294 | }, 295 | "decompress-response": { 296 | "version": "4.2.1", 297 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 298 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 299 | "requires": { 300 | "mimic-response": "^2.0.0" 301 | } 302 | }, 303 | "deep-extend": { 304 | "version": "0.6.0", 305 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 306 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 307 | }, 308 | "delegates": { 309 | "version": "1.0.0", 310 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 311 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 312 | }, 313 | "depd": { 314 | "version": "1.1.2", 315 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 316 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 317 | }, 318 | "destroy": { 319 | "version": "1.0.4", 320 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 321 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 322 | }, 323 | "detect-libc": { 324 | "version": "1.0.3", 325 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 326 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 327 | }, 328 | "ee-first": { 329 | "version": "1.1.1", 330 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 331 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 332 | }, 333 | "encodeurl": { 334 | "version": "1.0.2", 335 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 336 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 337 | }, 338 | "escape-html": { 339 | "version": "1.0.3", 340 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 341 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 342 | }, 343 | "etag": { 344 | "version": "1.8.1", 345 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 346 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 347 | }, 348 | "express": { 349 | "version": "4.16.4", 350 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 351 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 352 | "requires": { 353 | "accepts": "~1.3.5", 354 | "array-flatten": "1.1.1", 355 | "body-parser": "1.18.3", 356 | "content-disposition": "0.5.2", 357 | "content-type": "~1.0.4", 358 | "cookie": "0.3.1", 359 | "cookie-signature": "1.0.6", 360 | "debug": "2.6.9", 361 | "depd": "~1.1.2", 362 | "encodeurl": "~1.0.2", 363 | "escape-html": "~1.0.3", 364 | "etag": "~1.8.1", 365 | "finalhandler": "1.1.1", 366 | "fresh": "0.5.2", 367 | "merge-descriptors": "1.0.1", 368 | "methods": "~1.1.2", 369 | "on-finished": "~2.3.0", 370 | "parseurl": "~1.3.2", 371 | "path-to-regexp": "0.1.7", 372 | "proxy-addr": "~2.0.4", 373 | "qs": "6.5.2", 374 | "range-parser": "~1.2.0", 375 | "safe-buffer": "5.1.2", 376 | "send": "0.16.2", 377 | "serve-static": "1.13.2", 378 | "setprototypeof": "1.1.0", 379 | "statuses": "~1.4.0", 380 | "type-is": "~1.6.16", 381 | "utils-merge": "1.0.1", 382 | "vary": "~1.1.2" 383 | }, 384 | "dependencies": { 385 | "cookie": { 386 | "version": "0.3.1", 387 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 388 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 389 | } 390 | } 391 | }, 392 | "finalhandler": { 393 | "version": "1.1.1", 394 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 395 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 396 | "requires": { 397 | "debug": "2.6.9", 398 | "encodeurl": "~1.0.2", 399 | "escape-html": "~1.0.3", 400 | "on-finished": "~2.3.0", 401 | "parseurl": "~1.3.2", 402 | "statuses": "~1.4.0", 403 | "unpipe": "~1.0.0" 404 | } 405 | }, 406 | "forwarded": { 407 | "version": "0.1.2", 408 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 409 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 410 | }, 411 | "fresh": { 412 | "version": "0.5.2", 413 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 414 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 415 | }, 416 | "fs-minipass": { 417 | "version": "1.2.7", 418 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 419 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 420 | "requires": { 421 | "minipass": "^2.6.0" 422 | } 423 | }, 424 | "fs.realpath": { 425 | "version": "1.0.0", 426 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 427 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 428 | }, 429 | "gauge": { 430 | "version": "2.7.4", 431 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 432 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 433 | "requires": { 434 | "aproba": "^1.0.3", 435 | "console-control-strings": "^1.0.0", 436 | "has-unicode": "^2.0.0", 437 | "object-assign": "^4.1.0", 438 | "signal-exit": "^3.0.0", 439 | "string-width": "^1.0.1", 440 | "strip-ansi": "^3.0.1", 441 | "wide-align": "^1.1.0" 442 | } 443 | }, 444 | "glob": { 445 | "version": "7.1.6", 446 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 447 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 448 | "requires": { 449 | "fs.realpath": "^1.0.0", 450 | "inflight": "^1.0.4", 451 | "inherits": "2", 452 | "minimatch": "^3.0.4", 453 | "once": "^1.3.0", 454 | "path-is-absolute": "^1.0.0" 455 | } 456 | }, 457 | "graceful-readlink": { 458 | "version": "1.0.1", 459 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 460 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 461 | }, 462 | "has-unicode": { 463 | "version": "2.0.1", 464 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 465 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 466 | }, 467 | "http-errors": { 468 | "version": "1.6.3", 469 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 470 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 471 | "requires": { 472 | "depd": "~1.1.2", 473 | "inherits": "2.0.3", 474 | "setprototypeof": "1.1.0", 475 | "statuses": ">= 1.4.0 < 2" 476 | } 477 | }, 478 | "iconv-lite": { 479 | "version": "0.4.23", 480 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 481 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 482 | "requires": { 483 | "safer-buffer": ">= 2.1.2 < 3" 484 | } 485 | }, 486 | "ignore-walk": { 487 | "version": "3.0.3", 488 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 489 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 490 | "requires": { 491 | "minimatch": "^3.0.4" 492 | } 493 | }, 494 | "inflight": { 495 | "version": "1.0.6", 496 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 497 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 498 | "requires": { 499 | "once": "^1.3.0", 500 | "wrappy": "1" 501 | } 502 | }, 503 | "inherits": { 504 | "version": "2.0.3", 505 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 506 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 507 | }, 508 | "ini": { 509 | "version": "1.3.8", 510 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 511 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 512 | }, 513 | "ipaddr.js": { 514 | "version": "1.9.1", 515 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 516 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 517 | }, 518 | "is-buffer": { 519 | "version": "1.1.6", 520 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 521 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 522 | }, 523 | "is-fullwidth-code-point": { 524 | "version": "1.0.0", 525 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 526 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 527 | "requires": { 528 | "number-is-nan": "^1.0.0" 529 | } 530 | }, 531 | "is-promise": { 532 | "version": "2.2.2", 533 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 534 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" 535 | }, 536 | "isarray": { 537 | "version": "1.0.0", 538 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 539 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 540 | }, 541 | "jade": { 542 | "version": "1.11.0", 543 | "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", 544 | "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", 545 | "requires": { 546 | "character-parser": "1.2.1", 547 | "clean-css": "^3.1.9", 548 | "commander": "~2.6.0", 549 | "constantinople": "~3.0.1", 550 | "jstransformer": "0.0.2", 551 | "mkdirp": "~0.5.0", 552 | "transformers": "2.1.0", 553 | "uglify-js": "^2.4.19", 554 | "void-elements": "~2.0.1", 555 | "with": "~4.0.0" 556 | } 557 | }, 558 | "jstransformer": { 559 | "version": "0.0.2", 560 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", 561 | "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", 562 | "requires": { 563 | "is-promise": "^2.0.0", 564 | "promise": "^6.0.1" 565 | } 566 | }, 567 | "kind-of": { 568 | "version": "3.2.2", 569 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 570 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 571 | "requires": { 572 | "is-buffer": "^1.1.5" 573 | } 574 | }, 575 | "lazy-cache": { 576 | "version": "1.0.4", 577 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 578 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 579 | }, 580 | "longest": { 581 | "version": "1.0.1", 582 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 583 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 584 | }, 585 | "media-typer": { 586 | "version": "0.3.0", 587 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 588 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 589 | }, 590 | "merge-descriptors": { 591 | "version": "1.0.1", 592 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 593 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 594 | }, 595 | "methods": { 596 | "version": "1.1.2", 597 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 598 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 599 | }, 600 | "mime": { 601 | "version": "1.4.1", 602 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 603 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 604 | }, 605 | "mime-db": { 606 | "version": "1.45.0", 607 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", 608 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" 609 | }, 610 | "mime-types": { 611 | "version": "2.1.28", 612 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", 613 | "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", 614 | "requires": { 615 | "mime-db": "1.45.0" 616 | } 617 | }, 618 | "mimic-response": { 619 | "version": "2.1.0", 620 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 621 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 622 | }, 623 | "minimatch": { 624 | "version": "3.0.4", 625 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 626 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 627 | "requires": { 628 | "brace-expansion": "^1.1.7" 629 | } 630 | }, 631 | "minimist": { 632 | "version": "1.2.5", 633 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 634 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 635 | }, 636 | "minipass": { 637 | "version": "2.9.0", 638 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 639 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 640 | "requires": { 641 | "safe-buffer": "^5.1.2", 642 | "yallist": "^3.0.0" 643 | } 644 | }, 645 | "minizlib": { 646 | "version": "1.3.3", 647 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 648 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 649 | "requires": { 650 | "minipass": "^2.9.0" 651 | } 652 | }, 653 | "mkdirp": { 654 | "version": "0.5.5", 655 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 656 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 657 | "requires": { 658 | "minimist": "^1.2.5" 659 | } 660 | }, 661 | "morgan": { 662 | "version": "1.9.1", 663 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 664 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 665 | "requires": { 666 | "basic-auth": "~2.0.0", 667 | "debug": "2.6.9", 668 | "depd": "~1.1.2", 669 | "on-finished": "~2.3.0", 670 | "on-headers": "~1.0.1" 671 | } 672 | }, 673 | "ms": { 674 | "version": "2.0.0", 675 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 676 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 677 | }, 678 | "nan": { 679 | "version": "2.14.2", 680 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", 681 | "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" 682 | }, 683 | "needle": { 684 | "version": "2.5.2", 685 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", 686 | "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", 687 | "requires": { 688 | "debug": "^3.2.6", 689 | "iconv-lite": "^0.4.4", 690 | "sax": "^1.2.4" 691 | }, 692 | "dependencies": { 693 | "debug": { 694 | "version": "3.2.7", 695 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 696 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 697 | "requires": { 698 | "ms": "^2.1.1" 699 | } 700 | }, 701 | "ms": { 702 | "version": "2.1.3", 703 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 704 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 705 | } 706 | } 707 | }, 708 | "negotiator": { 709 | "version": "0.6.2", 710 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 711 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 712 | }, 713 | "node-pre-gyp": { 714 | "version": "0.11.0", 715 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", 716 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", 717 | "requires": { 718 | "detect-libc": "^1.0.2", 719 | "mkdirp": "^0.5.1", 720 | "needle": "^2.2.1", 721 | "nopt": "^4.0.1", 722 | "npm-packlist": "^1.1.6", 723 | "npmlog": "^4.0.2", 724 | "rc": "^1.2.7", 725 | "rimraf": "^2.6.1", 726 | "semver": "^5.3.0", 727 | "tar": "^4" 728 | } 729 | }, 730 | "nopt": { 731 | "version": "4.0.3", 732 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 733 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 734 | "requires": { 735 | "abbrev": "1", 736 | "osenv": "^0.1.4" 737 | } 738 | }, 739 | "npm-bundled": { 740 | "version": "1.1.1", 741 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 742 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 743 | "requires": { 744 | "npm-normalize-package-bin": "^1.0.1" 745 | } 746 | }, 747 | "npm-normalize-package-bin": { 748 | "version": "1.0.1", 749 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 750 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" 751 | }, 752 | "npm-packlist": { 753 | "version": "1.4.8", 754 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", 755 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", 756 | "requires": { 757 | "ignore-walk": "^3.0.1", 758 | "npm-bundled": "^1.0.1", 759 | "npm-normalize-package-bin": "^1.0.1" 760 | } 761 | }, 762 | "npmlog": { 763 | "version": "4.1.2", 764 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 765 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 766 | "requires": { 767 | "are-we-there-yet": "~1.1.2", 768 | "console-control-strings": "~1.1.0", 769 | "gauge": "~2.7.3", 770 | "set-blocking": "~2.0.0" 771 | } 772 | }, 773 | "number-is-nan": { 774 | "version": "1.0.1", 775 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 776 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 777 | }, 778 | "object-assign": { 779 | "version": "4.1.1", 780 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 781 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 782 | }, 783 | "on-finished": { 784 | "version": "2.3.0", 785 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 786 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 787 | "requires": { 788 | "ee-first": "1.1.1" 789 | } 790 | }, 791 | "on-headers": { 792 | "version": "1.0.2", 793 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 794 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 795 | }, 796 | "once": { 797 | "version": "1.4.0", 798 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 799 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 800 | "requires": { 801 | "wrappy": "1" 802 | } 803 | }, 804 | "optimist": { 805 | "version": "0.3.7", 806 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 807 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 808 | "requires": { 809 | "wordwrap": "~0.0.2" 810 | } 811 | }, 812 | "os-homedir": { 813 | "version": "1.0.2", 814 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 815 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 816 | }, 817 | "os-tmpdir": { 818 | "version": "1.0.2", 819 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 820 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 821 | }, 822 | "osenv": { 823 | "version": "0.1.5", 824 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 825 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 826 | "requires": { 827 | "os-homedir": "^1.0.0", 828 | "os-tmpdir": "^1.0.0" 829 | } 830 | }, 831 | "parseurl": { 832 | "version": "1.3.3", 833 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 834 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 835 | }, 836 | "path-is-absolute": { 837 | "version": "1.0.1", 838 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 839 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 840 | }, 841 | "path-to-regexp": { 842 | "version": "0.1.7", 843 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 844 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 845 | }, 846 | "process-nextick-args": { 847 | "version": "2.0.1", 848 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 849 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 850 | }, 851 | "promise": { 852 | "version": "6.1.0", 853 | "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", 854 | "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", 855 | "requires": { 856 | "asap": "~1.0.0" 857 | } 858 | }, 859 | "proxy-addr": { 860 | "version": "2.0.6", 861 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 862 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 863 | "requires": { 864 | "forwarded": "~0.1.2", 865 | "ipaddr.js": "1.9.1" 866 | } 867 | }, 868 | "qs": { 869 | "version": "6.5.2", 870 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 871 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 872 | }, 873 | "range-parser": { 874 | "version": "1.2.1", 875 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 876 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 877 | }, 878 | "raw-body": { 879 | "version": "2.3.3", 880 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 881 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 882 | "requires": { 883 | "bytes": "3.0.0", 884 | "http-errors": "1.6.3", 885 | "iconv-lite": "0.4.23", 886 | "unpipe": "1.0.0" 887 | } 888 | }, 889 | "rc": { 890 | "version": "1.2.8", 891 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 892 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 893 | "requires": { 894 | "deep-extend": "^0.6.0", 895 | "ini": "~1.3.0", 896 | "minimist": "^1.2.0", 897 | "strip-json-comments": "~2.0.1" 898 | } 899 | }, 900 | "readable-stream": { 901 | "version": "2.3.7", 902 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 903 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 904 | "requires": { 905 | "core-util-is": "~1.0.0", 906 | "inherits": "~2.0.3", 907 | "isarray": "~1.0.0", 908 | "process-nextick-args": "~2.0.0", 909 | "safe-buffer": "~5.1.1", 910 | "string_decoder": "~1.1.1", 911 | "util-deprecate": "~1.0.1" 912 | } 913 | }, 914 | "repeat-string": { 915 | "version": "1.6.1", 916 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 917 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 918 | }, 919 | "right-align": { 920 | "version": "0.1.3", 921 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 922 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 923 | "requires": { 924 | "align-text": "^0.1.1" 925 | } 926 | }, 927 | "rimraf": { 928 | "version": "2.7.1", 929 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 930 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 931 | "requires": { 932 | "glob": "^7.1.3" 933 | } 934 | }, 935 | "safe-buffer": { 936 | "version": "5.1.2", 937 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 938 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 939 | }, 940 | "safer-buffer": { 941 | "version": "2.1.2", 942 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 943 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 944 | }, 945 | "sax": { 946 | "version": "1.2.4", 947 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 948 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 949 | }, 950 | "semver": { 951 | "version": "5.7.1", 952 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 953 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 954 | }, 955 | "send": { 956 | "version": "0.16.2", 957 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 958 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 959 | "requires": { 960 | "debug": "2.6.9", 961 | "depd": "~1.1.2", 962 | "destroy": "~1.0.4", 963 | "encodeurl": "~1.0.2", 964 | "escape-html": "~1.0.3", 965 | "etag": "~1.8.1", 966 | "fresh": "0.5.2", 967 | "http-errors": "~1.6.2", 968 | "mime": "1.4.1", 969 | "ms": "2.0.0", 970 | "on-finished": "~2.3.0", 971 | "range-parser": "~1.2.0", 972 | "statuses": "~1.4.0" 973 | } 974 | }, 975 | "serve-static": { 976 | "version": "1.13.2", 977 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 978 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 979 | "requires": { 980 | "encodeurl": "~1.0.2", 981 | "escape-html": "~1.0.3", 982 | "parseurl": "~1.3.2", 983 | "send": "0.16.2" 984 | } 985 | }, 986 | "set-blocking": { 987 | "version": "2.0.0", 988 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 989 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 990 | }, 991 | "setprototypeof": { 992 | "version": "1.1.0", 993 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 994 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 995 | }, 996 | "signal-exit": { 997 | "version": "3.0.3", 998 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 999 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1000 | }, 1001 | "simple-concat": { 1002 | "version": "1.0.1", 1003 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1004 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 1005 | }, 1006 | "simple-get": { 1007 | "version": "3.1.0", 1008 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 1009 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 1010 | "requires": { 1011 | "decompress-response": "^4.2.0", 1012 | "once": "^1.3.1", 1013 | "simple-concat": "^1.0.0" 1014 | } 1015 | }, 1016 | "source-map": { 1017 | "version": "0.4.4", 1018 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 1019 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 1020 | "requires": { 1021 | "amdefine": ">=0.0.4" 1022 | } 1023 | }, 1024 | "statuses": { 1025 | "version": "1.4.0", 1026 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1027 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1028 | }, 1029 | "string-width": { 1030 | "version": "1.0.2", 1031 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1032 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1033 | "requires": { 1034 | "code-point-at": "^1.0.0", 1035 | "is-fullwidth-code-point": "^1.0.0", 1036 | "strip-ansi": "^3.0.0" 1037 | } 1038 | }, 1039 | "string_decoder": { 1040 | "version": "1.1.1", 1041 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1042 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1043 | "requires": { 1044 | "safe-buffer": "~5.1.0" 1045 | } 1046 | }, 1047 | "strip-ansi": { 1048 | "version": "3.0.1", 1049 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1050 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1051 | "requires": { 1052 | "ansi-regex": "^2.0.0" 1053 | } 1054 | }, 1055 | "strip-json-comments": { 1056 | "version": "2.0.1", 1057 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1058 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1059 | }, 1060 | "tar": { 1061 | "version": "4.4.13", 1062 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 1063 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 1064 | "requires": { 1065 | "chownr": "^1.1.1", 1066 | "fs-minipass": "^1.2.5", 1067 | "minipass": "^2.8.6", 1068 | "minizlib": "^1.2.1", 1069 | "mkdirp": "^0.5.0", 1070 | "safe-buffer": "^5.1.2", 1071 | "yallist": "^3.0.3" 1072 | } 1073 | }, 1074 | "transformers": { 1075 | "version": "2.1.0", 1076 | "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", 1077 | "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", 1078 | "requires": { 1079 | "css": "~1.0.8", 1080 | "promise": "~2.0", 1081 | "uglify-js": "~2.2.5" 1082 | }, 1083 | "dependencies": { 1084 | "is-promise": { 1085 | "version": "1.0.1", 1086 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", 1087 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" 1088 | }, 1089 | "promise": { 1090 | "version": "2.0.0", 1091 | "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", 1092 | "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", 1093 | "requires": { 1094 | "is-promise": "~1" 1095 | } 1096 | }, 1097 | "source-map": { 1098 | "version": "0.1.43", 1099 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 1100 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 1101 | "requires": { 1102 | "amdefine": ">=0.0.4" 1103 | } 1104 | }, 1105 | "uglify-js": { 1106 | "version": "2.2.5", 1107 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 1108 | "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", 1109 | "requires": { 1110 | "optimist": "~0.3.5", 1111 | "source-map": "~0.1.7" 1112 | } 1113 | } 1114 | } 1115 | }, 1116 | "type-is": { 1117 | "version": "1.6.18", 1118 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1119 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1120 | "requires": { 1121 | "media-typer": "0.3.0", 1122 | "mime-types": "~2.1.24" 1123 | } 1124 | }, 1125 | "uglify-js": { 1126 | "version": "2.8.29", 1127 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 1128 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 1129 | "requires": { 1130 | "source-map": "~0.5.1", 1131 | "uglify-to-browserify": "~1.0.0", 1132 | "yargs": "~3.10.0" 1133 | }, 1134 | "dependencies": { 1135 | "source-map": { 1136 | "version": "0.5.7", 1137 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1138 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1139 | } 1140 | } 1141 | }, 1142 | "uglify-to-browserify": { 1143 | "version": "1.0.2", 1144 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1145 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1146 | "optional": true 1147 | }, 1148 | "unpipe": { 1149 | "version": "1.0.0", 1150 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1151 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1152 | }, 1153 | "util-deprecate": { 1154 | "version": "1.0.2", 1155 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1156 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1157 | }, 1158 | "utils-merge": { 1159 | "version": "1.0.1", 1160 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1161 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1162 | }, 1163 | "vary": { 1164 | "version": "1.1.2", 1165 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1166 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1167 | }, 1168 | "void-elements": { 1169 | "version": "2.0.1", 1170 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 1171 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 1172 | }, 1173 | "wide-align": { 1174 | "version": "1.1.3", 1175 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1176 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1177 | "requires": { 1178 | "string-width": "^1.0.2 || 2" 1179 | } 1180 | }, 1181 | "window-size": { 1182 | "version": "0.1.0", 1183 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1184 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 1185 | }, 1186 | "with": { 1187 | "version": "4.0.3", 1188 | "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", 1189 | "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", 1190 | "requires": { 1191 | "acorn": "^1.0.1", 1192 | "acorn-globals": "^1.0.3" 1193 | }, 1194 | "dependencies": { 1195 | "acorn": { 1196 | "version": "1.2.2", 1197 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 1198 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 1199 | } 1200 | } 1201 | }, 1202 | "wordwrap": { 1203 | "version": "0.0.3", 1204 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1205 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 1206 | }, 1207 | "wrappy": { 1208 | "version": "1.0.2", 1209 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1210 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1211 | }, 1212 | "yallist": { 1213 | "version": "3.1.1", 1214 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1215 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1216 | }, 1217 | "yargs": { 1218 | "version": "3.10.0", 1219 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1220 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1221 | "requires": { 1222 | "camelcase": "^1.0.2", 1223 | "cliui": "^2.1.0", 1224 | "decamelize": "^1.0.0", 1225 | "window-size": "0.1.0" 1226 | } 1227 | } 1228 | } 1229 | } 1230 | --------------------------------------------------------------------------------