Thanks very much for taking the time to contribute! Here's a Table of Contents that should cover mostly everything you may be interested in:
- Project Overview
- Technology Stack
- Setting Up
- Contributing Client Changes
- Contributing Server Changes
- Submitting Issues
The way this app works is pretty simple. There is a form where the user enters in their data. When the user presses the MAKE button, all that form data is sent to the server. Upon receiving that data, the server checks to see what template was selected, and generates a specific TeX document based on that.
It then runs a latex
child process on the generated TeX document which will generate a PDF. The PDF is then sent back to the client which will render it in the preview.
This webapp is a fullstack JavaScript project hosted on a DigitalOcean droplet. Flow is used for type safety and Jest is used for tests. Don't worry if any of this stuff is new to you, it's actually easier than you may think.
Frontend
- React
- Redux
- Styled-Components
- Flow
Backend
- Node.js
- Koa
- Flow
If you want to get the entire project running (both the client and the API server), you can do the following:
- Clone this repo
- In the root folder, run the following:
npm run build # This installs both client and server dependencies
npm start # This will start the client server on localhost:3000 and the API server on localhost:3001
- Head over to localhost:3000 to open the app.
Note: You will need to have LaTeX installed on your machine if you wish to test out the resume generation. You can download it here.
There are a few other convenience commands that you can run from within the root project folder that will run commands on the client and server simultaneously:
npm test # Run all client and server tests
npm run lint # Uses blyss to lint client and server code
npm run fix # Tries to automatically fix client and server linting errors
npm run format # Uses prettier to format client and server code
The client side is a React/Redux app with styled-components
used for styling. It uses redux-form
to manage form state, and react-pdf
to display a PDF preview.
To begin working on the clientside app, navigate to resumake/app/client
in your terminal. If you haven't followed the steps listed in the Setting Up section, you will need to run:
npm install
If you already have the client dependencies installed, you can just run the following:
npm start
You can then head over to localhost:3000 to open the app.
To see what other npm
commands you can run, checkout the client readme.
The project structure uses a feature-based approach rather than the typical react/redux project structure. It looks something like this:
src/
├── app
├── common
├── features
│ ├── form
│ ├── preview
│ └── progress
├── index.html
└── index.js
The app
folder contains the main stuff – the App.js
component, the different pages
, the root reducer, the store, etc.
The common
folder contains things used throughout the project like common components (Button
, Input
, etc) as well as shared types and theme information. Colors, sizes, and animations used globally are all stored in common/theme.js
.
The features
folder is where the logic of the app is split up, and each feature
will generally have the same structure. For example, here is the preview
folder:
src/features/preview/
├── actions.js
├── assets
├── components
├── reducer.js
├── tests
└── types.js
If you are familiar with React and Redux, most of this stuff (reducer
, actions
, components
, tests
) should look familiar to you. The assets
folder will usually just static files like images, that are used for that specific feature. The types
will be a file that contains some Flow type definitions that is used throughout that feature for actions, state, etc.
This feature is pretty self explanatory – it is the form stuff on the lefthand side of the app. It handles all form state as well as adding/removing additional fields. It also handles generating a resume on form submission which is what the Preview feature listens for.
This feature is also pretty obvious – it is the preview window on the righthand side of the app. It takes the current resume stored in state and displays it using react-pdf
.
This feature manages both the progress bar at the bottom as well as the section ordering of the sidenav.
The server side uses Node.js with Koa as the web framework of choice.
To begin working on the serverside app, navigate to resumake/app/server
in your terminal. If you haven't followed the steps listed in the Setting Up section, you will need to run:
npm install
If you already have the client dependencies installed, you can just run the following:
npm start
To see what other npm
commands you can run, checkout the server readme.
Here is the folder structure:
src/
├── generator
├── index.js
├── middleware
├── routes
└── types.js
index.js
is the main entry point of the app. It creates a new Koa instance and uses our middleware and routes.
The routes
folder is self-explanatory. Note that the project is setup so that all HTTP requests that start with /api/
will automatically be proxied from the client to routes/api.js
.
This file contains all the main API routes used in the app.
This file is a "catch-all" handler which lets the client handle all other routes (only needed in production).
This file combines the above two routers into a single use
able middleware.
The middleware
folder contains 3 things – errorHandler
, sanitizer
, and jsonResume
.
The errorHandler
is just our top-level convenience middleware that catches all errors downstream.
The sanitizer
is used to sanitize the request body received from the client that has all the form data. Also, it removes null/undefined/empty values and sanitizes LaTeX symbols.
The jsonResume
middleware handles the case when the user imports a JSON file. It attempts to parse the JSON and send it back to the client where it is then used to send a followup HTTP request for PDF generation.
The generator
folder is where most of the magic happens.
This file contains most of the important functions like generatePDF
and generateSourceCode
. Both of these functions first use generator/templates/index.js
to generate the LaTeX document.
Afterwards, generatePDF
will run a latex
child process on the LaTeX document to generate a PDF and then return that, while generateSourceCode
will simply prettify the document and send it straight to the user.
This file is used to generate a LaTeX document, as well as any additional options needed (which LaTeX command to run, inputs/fonts to include, etc). It does this by checking which template number the user chose, and then deciding based on that.
There is currently no issue format/template you need to follow, you can just raise your concern normally in the GitHub issues section.