Skip to content

aventinesolutions/pwdgenerate-reframe

Repository files navigation

Aventine Solutions Password Generator

pwdgenerator-reframe Version 0.1.4

A re-frame application designed to generate passwords, Aventine style.

Getting Started

Project Overview

Directory structure

Editor/IDE

Use your preferred editor or IDE that supports Clojure/ClojureScript development. See Clojure tools for some popular options.

Environment Setup

  1. Install JDK 8 or later (Java Development Kit)
  2. Install Leiningen (Clojure/ClojureScript project task & dependency management)
  3. Install Node.js (JavaScript runtime environment)
  4. Install karma-cli (test runner):
    npm install -g karma-cli
  5. Install Chrome or Chromium version 59 or later (headless test environment)
    • For Chromium, set the CHROME_BIN environment variable in your shell to the command that launches Chromium. For example, in Ubuntu, add the following line to your .bashrc:
      export CHROME_BIN=chromium-browser
  6. Clone this repo and open a terminal in the pwdgenerator-reframe project root directory
  7. Download project dependencies:
    lein deps && npm install

Browser Setup

Browser caching should be disabled when developer tools are open to prevent interference with shadow-cljs hot reloading.

Custom formatters must be enabled in the browser before CLJS DevTools can display ClojureScript data in the console in a more readable way.

Chrome/Chromium

  1. Open DevTools (Linux/Windows: F12 or Ctrl-Shift-I; macOS: ⌘-Option-I)
  2. Open DevTools Settings (Linux/Windows: ? or F1; macOS: ? or Fn+F1)
  3. Select Preferences in the navigation menu on the left, if it is not already selected
  4. Under the Network heading, enable the Disable cache (while DevTools is open) option
  5. Under the Console heading, enable the Enable custom formatters option

Firefox

  1. Open Developer Tools (Linux/Windows: F12 or Ctrl-Shift-I; macOS: ⌘-Option-I)
  2. Open Developer Tools Settings (Linux/macOS/Windows: F1)
  3. Under the Advanced settings heading, enable the Disable HTTP Cache (when toolbox is open) option

Unfortunately, Firefox does not yet support custom formatters in their devtools. For updates, follow the enhancement request in their bug tracker: 1262914 - Add support for Custom Formatters in devtools.

Development

Running the App

Start a temporary local web server, build the app with the dev profile, and serve the app with hot reload:

lein dev

Please be patient; it may take over 20 seconds to see any output, and over 40 seconds to complete.

When [:app] Build completed appears in the output, browse to http://localhost:8280/.

shadow-cljs will automatically push ClojureScript code changes to your browser on save. To prevent a few common issues, see Hot Reload in ClojureScript: Things to avoid.

Opening the app in your browser starts a ClojureScript browser REPL, to which you may now connect.

Connecting to the browser REPL from Emacs with CIDER

Connect to the browser REPL:

M-x cider-jack-in-cljs

See Shadow CLJS User's Guide: Emacs/CIDER for more information. Note that the mentioned .dir-locals.el file has already been created for you.

Connecting to the browser REPL from other editors

See Shadow CLJS User's Guide: Editor Integration. Note that lein dev runs shadow-cljs watch for you, and that this project's running build id is app, or the keyword :app in a Clojure context.

Alternatively, search the web for info on connecting to a shadow-cljs ClojureScript browser REPL from your editor and configuration.

For example, in Vim / Neovim with fireplace.vim

  1. Open a .cljs file in the project to activate fireplace.vim
  2. In normal mode, execute the Piggieback command with this project's running build id, :app:
    :Piggieback :app

Connecting to the browser REPL from a terminal

  1. Connect to the shadow-cljs nREPL:

    lein repl :connect localhost:8777

    The REPL prompt, shadow.user=>, indicates that is a Clojure REPL, not ClojureScript.

  2. In the REPL, switch the session to this project's running build id, :app:

    (shadow.cljs.devtools.api/nrepl-select :app)

    The REPL prompt changes to cljs.user=>, indicating that this is now a ClojureScript REPL.

Running Tests

Build the app with the prod profile, start a temporary local web server, launch headless Chrome/Chromium, run tests, and stop the web server:

% lein karma
# for MingW64 Windows shell
% "/c/Program Files/nodejs/node.exe" /d/workspace/pwdgenerator-reframe/node_modules/karma/bin/karma start ./karma.conf.js --single-run --reporters 'junit,dots'

Please be patient; it may take over 15 seconds to see any output, and over 25 seconds to complete.

Compiling CSS with lein-less

Use Less to edit styles in .less files located in the less/ directory. CSS files are compiled automatically on dev or prod build.

Manually compile CSS files:

lein less once

The resources/public/css/ directory is created, containing the compiled CSS files.

Compiling CSS with lein-less on change

Enable automatic compiling of CSS files when source .less files are changed:

lein less auto

Running shadow-cljs Actions

See a list of shadow-cljs CLI actions:

lein run -m shadow.cljs.devtools.cli --help

Please be patient; it may take over 10 seconds to see any output. Also note that some actions shown may not actually be supported, outputting "Unknown action." when run.

Run a shadow-cljs action on this project's build id (without the colon, just app):

lein run -m shadow.cljs.devtools.cli <action> app

Debug Logging

The debug? variable in config.cljs defaults to true in dev builds, and false in prod builds.

Use debug? for logging or other tasks that should run only on dev builds:

(ns pwdgenerator-reframe.example
  (:require [pwdgenerator-reframe.config :as config])

(when config/debug?
  (println "This message will appear in the browser console only on dev builds."))

Production

Build the app with the prod profile:

lein with-profile prod uberjar

Please be patient; it may take a few seconds to see any output, and over 50 seconds to complete.

The resources/public/js/compiled directory is created, containing the compiled app.js and manifest.edn files. The target/ directory is then created, containing the standalone pwdgenerator-reframe.jar.

Running the Server

Run the jar, setting the port the Ring server will use by setting the environment variable, port.

port=2000 java -jar target/pwdgenerator-reframe.jar

If port is not set, the server will run on port 3000 by default.

Deploying to Heroku

  1. Create a Heroku app:

    heroku create
  2. Deploy the app code:

    git push heroku master

Using Docker for Development

For Windows 10 or MacOS, Docker Desktop is required. For Linux, use the package distribution to install docker and docker-compose.

To build the base image load dependencies into the volumes:

% winpty docker-compose run runner lein deps
% winpty docker-compose run runner npm install

It will take some time to build the development image the first time the runner is called. (winpty is only required on windows).

To work on development with all development ports exposed:

% winpty docker-compose up

Once the backend server is up, the REPL can be run like this:

% winpty docker-compose run runner lein repl :connect runner:8777

Tests can be run with Karma like this:

% winpty docker-compose run runner lein karma

Firebase Configuration

The following environment variables must be set for Firebase to initialize correctly:

FIREBASE_API_KEY
FIREBASE_AUTH_DOMAIN
FIREBASE_DATABASE_URL
FIREBASE_PROJECT_ID
FIREBASE_STORAGE_BUCKET
FIREBASE_MESSAGING_SENDER_ID
FIREBASE_APP_ID
FIREBASE_MEASUREMENT_ID