Added draft post; updated deps

This commit is contained in:
Daniel J. Summers 2018-08-23 22:15:26 -05:00
parent ff1f9bc97d
commit 8216c731f2
3 changed files with 103 additions and 55 deletions

View File

@ -0,0 +1,50 @@
---
layout: post
title: "A Tour of myPrayerJournal: Introduction"
date: 2018-08-24 17:00:00
author: Daniel
categories:
- [ Programming, .NET, F# ]
- [ Series, A Tour of myPrayerJournal ]
tags:
---
Recently, we released version 1.0 of myPrayerJournal, a minimalistic prayer journaling application. This series aims to provide a tour of the code, with several stops along the way:
- **Part 0: Introduction** _(this post)_
- **Part 1: The Front End** - Vue components and routing
- **Part 2: State in the Browser** - Vuex and getting information from an API
- **Part 3: The API** - Giraffe and JSON web endpoints
- **Part 4: Authentication** - Auth0, using information in both app and API
- **Part 5: The Data Store** - EF Core backed by PostgreSQL, with the `DbContext` defined in F#
- **Part 6: Documentation** - GitHub Pages generated on each commit
_(these will be linked once each post has been published)_
From a technical perspective, this application was going to be a learning experience. We knew we wanted to use a Single Page Application (SPA) framework with an API; we'd built APIs before, but had yet to build a SPA. For front-end frameworks, we started with [Angular][], went through [Aurelia][] and [Elm][], then decided on [Vue][]. For the back-end API, we started with [Suave][], then went live on [Node.js][] with [Koa][]; later, we moved it to [Go][], and after .NET Core 2.1 was released, landed on [Giraffe][]. The "learning experience" part was a success; through all these attempts, we utilized 5 different languages and 3 different database access techniques.
To understand the requirements, a short explanation of the process will help. "Prayer journaling" is a discipline where a person will write down the things for which they are praying; this provides a defined list to help guide their prayer, and helps them not forget things. Then, as the situation changes, they can record updates, through to the resolution of the situation (also called the request being "answered"). This discipline not only helps to focus efforts, it also provides a record of requests and answers. Although people have successfully used a notebook, or somthing similar, there are several downsides:
- For long term requests, you can run out of room for updates.
- A physical journal can only be in one place at one time.
- Answered requests coexist with unanswered requests, so you have to flip pages past them.
- Books can end up under stacks of other things, falling victim to "out of sight, out of mind."
The initial requirements, then, became the first three bullets below; the remaining requirements emerged through using the application as it was being developed.
- List unanswered requests, in a way that they can be marked as prayed or answered, and be updated
- List answered requests, and allow full requests (and their history) to be viewed
- Do the above in a way that will not be distracting
- Allow notes to be recorded for a request; not every update on a situation requires a change in the verbiage of the request
- Allow requests to be "snoozed" (removed from the journal, with a specified date when they will reappear), and list snoozed requests so that the snooze can be expired (returning the request to the journal immediately)
- Allow requests to be prioritized; this was the genesis of what became the request recurrence features
Armed with these requirements, we will pick up next time with looking at the Vue front end.
[Angular]: https://angular.io
[Aurelia]: https://aurelia.io
[Elm]: http://elm-lang.org
[Vue]: https://vuejs.org
[Suave]: https://suave.io
[Node.js]: https://nodejs.org
[Koa]: https://koajs.com
[Go]: https://golang.org
[Giraffe]: https://github.com/giraffe-fsharp/Giraffe

106
yarn.lock
View File

@ -13,8 +13,8 @@
"@types/babel-types" "*" "@types/babel-types" "*"
JSONStream@^1.0.7: JSONStream@^1.0.7:
version "1.3.3" version "1.3.4"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.3.tgz#27b4b8fbbfeab4e71bcf551e7f27be8d952239bf" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e"
dependencies: dependencies:
jsonparse "^1.2.0" jsonparse "^1.2.0"
through ">=2.2.7 <3" through ">=2.2.7 <3"
@ -27,7 +27,7 @@ abbrev@1, abbrev@^1.0.7:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
accepts@~1.3.4: accepts@~1.3.5:
version "1.3.5" version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
dependencies: dependencies:
@ -160,8 +160,8 @@ async@~0.2.6:
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
atob@^2.1.1: atob@^2.1.1:
version "2.1.1" version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
babel-runtime@^6.26.0: babel-runtime@^6.26.0:
version "6.26.0" version "6.26.0"
@ -441,22 +441,22 @@ component-emitter@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
compressible@~2.0.13: compressible@~2.0.14:
version "2.0.14" version "2.0.14"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
dependencies: dependencies:
mime-db ">= 1.34.0 < 2" mime-db ">= 1.34.0 < 2"
compression@^1.6.0: compression@^1.6.0:
version "1.7.2" version "1.7.3"
resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
dependencies: dependencies:
accepts "~1.3.4" accepts "~1.3.5"
bytes "3.0.0" bytes "3.0.0"
compressible "~2.0.13" compressible "~2.0.14"
debug "2.6.9" debug "2.6.9"
on-headers "~1.0.1" on-headers "~1.0.1"
safe-buffer "5.1.1" safe-buffer "5.1.2"
vary "~1.1.2" vary "~1.1.2"
concat-map@0.0.1: concat-map@0.0.1:
@ -656,8 +656,8 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
esprima@^4.0.0: esprima@^4.0.0:
version "4.0.0" version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
esutils@^2.0.2: esutils@^2.0.2:
version "2.0.2" version "2.0.2"
@ -1513,18 +1513,18 @@ micromatch@^3.1.4:
to-regex "^3.0.2" to-regex "^3.0.2"
"mime-db@>= 1.34.0 < 2": "mime-db@>= 1.34.0 < 2":
version "1.34.0" version "1.36.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397"
mime-db@~1.33.0: mime-db@~1.35.0:
version "1.33.0" version "1.35.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47"
mime-types@~2.1.18: mime-types@~2.1.18:
version "2.1.18" version "2.1.19"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0"
dependencies: dependencies:
mime-db "~1.33.0" mime-db "~1.35.0"
mime@1.4.1: mime@1.4.1:
version "1.4.1" version "1.4.1"
@ -1553,8 +1553,8 @@ minimist@~0.0.1:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
minipass@^2.2.1, minipass@^2.3.3: minipass@^2.2.1, minipass@^2.3.3:
version "2.3.3" version "2.3.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957"
dependencies: dependencies:
safe-buffer "^5.1.2" safe-buffer "^5.1.2"
yallist "^3.0.0" yallist "^3.0.0"
@ -1634,9 +1634,9 @@ ncp@~2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
needle@^2.2.0: needle@^2.2.1:
version "2.2.1" version "2.2.2"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418"
dependencies: dependencies:
debug "^2.1.2" debug "^2.1.2"
iconv-lite "^0.4.4" iconv-lite "^0.4.4"
@ -1663,12 +1663,12 @@ node-fingerprint@0.0.2:
resolved "https://registry.yarnpkg.com/node-fingerprint/-/node-fingerprint-0.0.2.tgz#31cbabeb71a67ae7dd5a7dc042e51c3c75868501" resolved "https://registry.yarnpkg.com/node-fingerprint/-/node-fingerprint-0.0.2.tgz#31cbabeb71a67ae7dd5a7dc042e51c3c75868501"
node-pre-gyp@^0.10.0: node-pre-gyp@^0.10.0:
version "0.10.2" version "0.10.3"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.2.tgz#e8945c20ef6795a20aac2b44f036eb13cf5146e3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
dependencies: dependencies:
detect-libc "^1.0.2" detect-libc "^1.0.2"
mkdirp "^0.5.1" mkdirp "^0.5.1"
needle "^2.2.0" needle "^2.2.1"
nopt "^4.0.1" nopt "^4.0.1"
npm-packlist "^1.1.6" npm-packlist "^1.1.6"
npmlog "^4.0.2" npmlog "^4.0.2"
@ -1697,12 +1697,12 @@ normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
remove-trailing-separator "^1.0.1" remove-trailing-separator "^1.0.1"
npm-bundled@^1.0.1: npm-bundled@^1.0.1:
version "1.0.3" version "1.0.5"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
npm-packlist@^1.1.6: npm-packlist@^1.1.6:
version "1.1.10" version "1.1.11"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
dependencies: dependencies:
ignore-walk "^3.0.1" ignore-walk "^3.0.1"
npm-bundled "^1.0.1" npm-bundled "^1.0.1"
@ -1849,8 +1849,8 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
path-parse@^1.0.5: path-parse@^1.0.5:
version "1.0.5" version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
pinkie-promise@^2.0.0: pinkie-promise@^2.0.0:
version "2.0.1" version "2.0.1"
@ -1867,8 +1867,8 @@ posix-character-classes@^0.1.0:
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
postinstall-build@^5.0.1: postinstall-build@^5.0.1:
version "5.0.1" version "5.0.2"
resolved "https://registry.yarnpkg.com/postinstall-build/-/postinstall-build-5.0.1.tgz#b917a9079b26178d9a24af5a5cd8cb4a991d11b9" resolved "https://registry.yarnpkg.com/postinstall-build/-/postinstall-build-5.0.2.tgz#e5863f5afe05cfd398e230682ed17a3d7d48fa91"
preserve@^0.2.0: preserve@^0.2.0:
version "0.2.0" version "0.2.0"
@ -1993,8 +1993,8 @@ pug@2.0.0-alpha1:
pug-strip-comments "0.0.1" pug-strip-comments "0.0.1"
randomatic@^3.0.0: randomatic@^3.0.0:
version "3.0.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116"
dependencies: dependencies:
is-number "^4.0.0" is-number "^4.0.0"
kind-of "^6.0.0" kind-of "^6.0.0"
@ -2056,8 +2056,8 @@ remove-trailing-separator@^1.0.1:
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
repeat-element@^1.1.2: repeat-element@^1.1.2:
version "1.1.2" version "1.1.3"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
repeat-string@^1.5.2, repeat-string@^1.6.1: repeat-string@^1.5.2, repeat-string@^1.6.1:
version "1.6.1" version "1.6.1"
@ -2099,7 +2099,7 @@ safe-buffer@5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: safe-buffer@5.1.2, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2" version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@ -2126,8 +2126,8 @@ sax@^1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
semver@^5.3.0: semver@^5.3.0:
version "5.5.0" version "5.5.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
send@0.16.2: send@0.16.2:
version "0.16.2" version "0.16.2"
@ -2341,8 +2341,8 @@ supports-color@^2.0.0:
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
supports-color@^5.3.0: supports-color@^5.3.0:
version "5.4.0" version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
dependencies: dependencies:
has-flag "^3.0.0" has-flag "^3.0.0"
@ -2353,15 +2353,15 @@ swig-extras@0.0.1:
markdown "~0.5.0" markdown "~0.5.0"
swig-templates@^2.0.2: swig-templates@^2.0.2:
version "2.0.2" version "2.0.3"
resolved "https://registry.yarnpkg.com/swig-templates/-/swig-templates-2.0.2.tgz#d2502a7303019356f4ea76ea9065d4f58af6ab75" resolved "https://registry.yarnpkg.com/swig-templates/-/swig-templates-2.0.3.tgz#6b4c43b462175df2a8da857a2043379ec6ea6fd0"
dependencies: dependencies:
optimist "~0.6" optimist "~0.6"
uglify-js "2.6.0" uglify-js "2.6.0"
tar@^4: tar@^4:
version "4.4.4" version "4.4.6"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
dependencies: dependencies:
chownr "^1.0.1" chownr "^1.0.1"
fs-minipass "^1.2.5" fs-minipass "^1.2.5"
@ -2474,10 +2474,8 @@ urix@^0.1.0:
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
use@^3.1.0: use@^3.1.0:
version "3.1.0" version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
dependencies:
kind-of "^6.0.2"
util-deprecate@~1.0.1: util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"