Skip to content

Instantly share code, notes, and snippets.

View jordanell's full-sized avatar

Jordan Ell jordanell

View GitHub Profile
@jordanell
jordanell / generate.js
Last active July 10, 2020 20:16
A script to parse React components and generate markdown files for their API documentation.
import fs from "fs";
import path from "path";
import { parse } from "react-docgen";
import buildMarkdown from "./buildMarkdown";
async function generate(options = {}) {
const { component: componentObject } = options;
@jordanell
jordanell / MarkdownPage.jsx
Created May 28, 2020 17:43
Markdown to React page layout - Demos
import PropTypes from "prop-types";
import React from "react";
import MarkdownElement from "MarkdownElement";
class MarkdownPage extends React.Component {
static propTypes = {
path: PropTypes.string.isRequired,
req: PropTypes.func.isRequired,
reqSource: PropTypes.func
@jordanell
jordanell / Sandbox.jsx
Created May 28, 2020 16:54
React to Markdown sandbox component
import PropTypes from "prop-types";
import React from "react";
class Sandbox extends React.Component {
static propTypes = {
component: PropTypes.func.isRequired
};
render() {
const { component: Component } = this.props;
@jordanell
jordanell / Demo.jsx
Created May 28, 2020 16:53
React to Markdown demo component
import PropTypes from "prop-types";
import React from "react";
import MarkdownElement from "src/modules/components/MarkdownElement";
import Sandbox from "src/modules/components/Sandbox";
class Demo extends React.Component {
static propTypes = {
demo: PropTypes.object.isRequired
};
@jordanell
jordanell / MarkdownElement.jsx
Last active November 1, 2019 20:39
Markdown to React page layout - Basic
import marked from "marked";
import PropTypes from "prop-types";
import React from "react";
const renderer = new marked.Renderer();
const markedOptions = {
gfm: true,
tables: true,
breaks: false,
@jordanell
jordanell / config.yml
Last active December 15, 2020 06:42
CircleCI config for Testing with Sequelize
version: 2
jobs:
test:
docker:
- image: circleci/node:10.15.3
- image: circleci/postgres:10.1
steps:
# Init
@jordanell
jordanell / withPaywall.jsx
Last active August 11, 2021 11:11
React Paywall
import get from 'lodash/get';
import PropTypes from 'prop-types';
import React from 'react';
import { connect } from 'react-redux';
/**
* Higher-order component that passes state and props into a predicate that
* checks whether the current user has permission to view the page due to paywall restrictions.
*
* If the predicate function returns true, the component is rendered.
@jordanell
jordanell / authorize.js
Last active April 30, 2019 20:34
Express authorization middleware
import { isEmpty } from 'lodash';
import {
ForbiddenError,
NotFoundError,
} from 'src/errors';
import models from 'src/models';
const defaultBlacklist = [];
@jordanell
jordanell / models.js
Last active July 8, 2021 19:48
Sequelize paranoid delete cascade
import paranoidDeleteCascade from './helpers/paranoidDeleteCascade';
// Patch the paranoid delete functionality of Sequelize
sequelize.addHook('afterDestroy', paranoidDeleteCascade(db));
@jordanell
jordanell / polymorphism-eagar-loading.js
Created March 22, 2019 15:53
Sequelize polymorphism eager loading
/**
* Given a comment which has polymorphic associations of post and photo.
*/
const comments = await models.Comment.findAll({
include: [
{ model: models.Photo },
{ model: models.Post },
],
});