Skip to content

Instantly share code, notes, and snippets.

@zprima
zprima / remove_npm_with_ruby
Last active July 1, 2018 08:55
Ruby script to remove npm modules globally
File.open("li.txt", "w")
File.truncate("li.txt", 0)
system("npm -g ls | grep -v 'npm@' | awk '/@/ {print $2}' | awk -F@ '{print $1}' >> li.txt")
npm_modules = []
File.open("li.txt").each do |line|
next if line.start_with?('│') || line.start_with?('├') || line.start_with?('└')
npm_modules << line
@zprima
zprima / server.js
Created January 27, 2019 11:20
medium_p1_c1
const express = require("express");
const bodyParser = require("body-parser");
const app = express();
const port = 3001;
// Middleware
// JSON parser middleware
app.use(bodyParser.json());
@zprima
zprima / server.js
Last active January 27, 2019 11:23
medium_p1_c2
//...
// CORS middleware
app.use(function (req, res, next) {
// Allow Origins
res.header("Access-Control-Allow-Origin", "*");
// Allow Methods
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
// Allow Headers
res.header("Access-Control-Allow-Headers", "Origin, Accept, Content-Type, Authorization");
@zprima
zprima / server.js
Created January 27, 2019 11:24
medium_p1_c3
//...
const jwt = require('jsonwebtoken');
const jwtSecret = "mysuperdupersecret"; // Use env for secrets
//...
// Auth middleware
app.use((req, res, next) => {
// login does not require jwt verification
if (req.path == '/api/login') {
// next middleware
@zprima
zprima / server.js
Created January 27, 2019 11:29
medium_p1_c4
// Routes
app.get("/api/login", (req, res) => {
// generate a constant token, no need to be fancy here
const token = jwt.sign({ "username": "Mike" }, jwtSecret, { expiresIn: 60 }) // 1 min token
// return it back
res.json({ "token": token })
});
app.get("/api/token/ping", (req, res) => {
// Middleware will already catch if token is invalid
@zprima
zprima / index.js
Created January 27, 2019 11:38
medium_p1_c5
import React from 'react';
import Link from 'next/link.js';
import axios from 'axios';
import { Cookies } from 'react-cookie';
const serverUrl = 'http://localhost:3001';
// set up cookies
const cookies = new Cookies();
class Index extends React.Component {
@zprima
zprima / secret.js
Created January 27, 2019 11:39
medium_p1_c6
import React from 'react';
import axios from 'axios';
import { Cookies } from 'react-cookie';
import { handleAuthSSR } from '../utils/auth';
const serverUrl = 'http://localhost:3001';
// set up cookies
const cookies = new Cookies();
@zprima
zprima / auth.js
Created January 27, 2019 11:44
medium_p1_c7
import axios from 'axios';
import Router from 'next/router';
import { Cookies } from 'react-cookie';
// set up cookies
const cookies = new Cookies();
const serverUrl = 'http://localhost:3001';
export async function handleAuthSSR(ctx) {
let token = null;
@zprima
zprima / index.html
Created January 27, 2019 12:21
medium_p2_c1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no" />
<link rel="manifest" href="manifest.json" />
<title>FN Jumper</title>
<link rel="stylesheet" type="text/css" media="screen" href="styles.css" />
@zprima
zprima / styles.css
Created January 27, 2019 12:24
medium_p2_c2
body{
font-family: "Verdana"
}
#app{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}