Compare commits

...

14 Commits

Author SHA1 Message Date
Nadav Ivgi 52194d91e4 README: add badges for IRC and PR 2018-03-24 10:18:58 +03:00
Nadav Ivgi 9924596c98 0.2.3 2018-03-22 22:20:44 +02:00
Nadav Ivgi 99dbf42d86 Improve formatting for BTC amounts 2018-03-22 22:19:23 +02:00
Nadav Ivgi 6068bc8be4 package.json: update dependencies 2018-03-22 21:56:05 +02:00
Nadav Ivgi 1aae11541e Update README 2018-03-22 20:46:33 +02:00
Nadav Ivgi 8ec75a31a2 package.json: Update repository 2018-03-22 02:02:47 +02:00
Nadav Ivgi c0def76e72 README: add badges 2018-03-16 11:34:33 +02:00
Nadav Ivgi b8c49cdbbc 0.2.2 2018-03-12 03:53:39 +02:00
Nadav Ivgi dd29bce103 Set the invoice "source" metadata field to "filebazaar" 2018-03-12 03:30:35 +02:00
Nadav Ivgi 9e81ee327a Update README 2018-03-12 00:56:34 +02:00
Nadav Ivgi 9da051599d Properly set QR encoding type to alphanumeric 2018-03-12 00:56:24 +02:00
Nadav Ivgi b7da20b6f0 _filebazaar.yaml.example: add missing : 2018-03-06 09:09:06 +02:00
Nadav Ivgi 72bc454f76 0.2.1 2018-03-06 07:50:14 +02:00
Nadav Ivgi cfc28ee30e Decide whether to live-compile stylus based on the presence of style.styl 2018-03-06 07:49:44 +02:00
10 changed files with 309 additions and 289 deletions

View File

@ -2,3 +2,4 @@ node_modules
.env .env
src src
start.sh start.sh
static/style.styl

View File

@ -1,23 +1,32 @@
# FileBazaar # FileBazaar
Sell digital files with Lightning! [![npm release](https://img.shields.io/npm/v/filebazaar.svg)](https://www.npmjs.com/package/filebazaar)
[![MIT license](https://img.shields.io/github/license/elementsproject/filebazaar.svg)](https://github.com/elementsproject/filebazaar/blob/master/LICENSE)
[![Pull Requests Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
[![IRC](https://img.shields.io/badge/chat-on%20freenode-brightgreen.svg)](https://webchat.freenode.net/?channels=lightning-charge)
- Simple setup and minimal configuration, just put a bunch of files in a directory and run the server. Sell digital files with Bitcoin & Lightning.
- Simple setup and minimal configuration, just put some files in a directory and start the server.
- Lightweight web browsing interface, works without JavaScript. - Lightweight web browsing interface, works without JavaScript.
- Generates previews for images, videos, audio, pdf and text documents. - Generates previews for images, videos, audio, pdf and text documents.
Powered by :zap: [Lightning Charge](https://github.com/ElementsProject/lightning-charge).
![FileBazaar demo](https://i.imgur.com/UhQD0Tg.gif)
## Quickstart ## Quickstart
Setup [Lightning Charge](https://github.com/ElementsProject/lightning-charge), then: Setup [Lightning Charge](https://github.com/ElementsProject/lightning-charge), then:
```bash ```bash
# Install dependencies for EXIF extraction and preview generation # Install dependencies for EXIF extraction and preview generation
$ apt-get install exiftool ffmpeg graphicsmagick unoconv $ apt install exiftool ffmpeg graphicsmagick unoconv
# node-canvas dependencies, see https://github.com/Automattic/node-canvas#installation # Install dependencies for node-canvas (see https://github.com/Automattic/node-canvas#installation)
$ apt-get install libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++ $ apt install libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++
# Install filebazaar # Install filebazaar
$ npm install -g filebazaar $ npm install -g filebazaar
@ -28,21 +37,18 @@ $ mkdir ~/ForSale && cd ~/ForSale
# Initialize the `_filebazaar.yaml` config file # Initialize the `_filebazaar.yaml` config file
$ filebazaar init $ filebazaar init
# Edit the config file (`charge_token` is required, `token_secret` is auto-generated)
$ edit _filebazaar.yaml
# Start filebazaar! # Start filebazaar!
$ filebazaar $ filebazaar
``` ```
## Screenshots
<img src="https://i.imgur.com/Tdwcuhm.png" width="23%"></img>
<img src="https://i.imgur.com/6SFNRiq.png" width="23%"></img>
<img src="https://i.imgur.com/MDRaie2.png" width="23%"></img>
<img src="https://i.imgur.com/yjwjfT8.png" width="23%"></img>
## Configuration ## Configuration
FileBazaar's configuration options can be managed using the `_filebazaar.yaml` file or via environment variables. FileBazaar's configuration options can be managed using the `_filebazaar.yaml` file or via environment variables.
All config options are optional and have sane defaults, except for `token_secret` which is required. See [`lib/config.js`](https://github.com/shesek/filebazaar/blob/master/lib/config.js) for more details. All config options are optional and have sane defaults except for `charge_token` and `token_secret`, which are required.
See [`lib/config.js`](https://github.com/elementsproject/filebazaar/blob/master/src/lib/config.js) for more details.
Below is an example `_filebazaar.yaml` file: Below is an example `_filebazaar.yaml` file:
@ -120,15 +126,21 @@ files:
## CLI ## CLI
You can use `$ filebazaar init [directory]` to initialize a new `_filebazaar.yaml` config file. A random `token_secret` will be added for you. If no `[directory]` is specified, the file will be created in the working directory. #### Initializing `_filebazaar.yaml`
To start FileBazaar, run `$ filebazaar [path]`. You can either specify the path to the files directory or to the `_filebazaar.yaml` file. If none is specified, defaults to the working directory. You can use `$ filebazaar init [directory]` to initialize a new `_filebazaar.yaml` config file.
A random `token_secret` will be added for you. If no `[directory]` is specified, the file will be created in the working directory.
#### Running FileBazaar
To start FileBazaar, run `$ filebazaar [path]`. You can either specify the path to the files directory or to the `_filebazaar.yaml` file.
If no `[path]` is specified, defaults to the working directory.
## File Preview ## File Preview
FileBazaar can currently generate previews for the following file types: FileBazaar can currently generate previews for the following file types:
- Images: a preview image will be generated by pixelating the left-half and adding watermark text using [node-canvas](https://github.com/Automattic/node-canvas) and [graphicsmagick](http://www.graphicsmagick.org) (see [example image](https://i.imgur.com/OmrUysL.png)). - Images: a preview image will be generated by pixelating the left half of the image and adding watermark text using [node-canvas](https://github.com/Automattic/node-canvas) and [graphicsmagick](http://www.graphicsmagick.org) (see [example image](https://i.imgur.com/OmrUysL.png)).
- Videos & audio: a preview will be generated by slicing off the first 30 seconds using [ffmpeg](http://ffmpeg.org). - Videos & audio: a preview will be generated by slicing off the first 30 seconds using [ffmpeg](http://ffmpeg.org).

View File

@ -52,7 +52,7 @@ token_secret: $TOKEN_SECRET
### Files settings ### Files settings
#files: #files:
# Books/ # Books/:
# Mastering-Bitcoin.pdf: # Mastering-Bitcoin.pdf:
# price: 5 USD # price: 5 USD
# button: Buy this book # button: Buy this book

491
package-lock.json generated
View File

@ -1,15 +1,28 @@
{ {
"name": "filebazaar", "name": "filebazaar",
"version": "0.2.0", "version": "0.2.3",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"accepts": { "@types/babel-types": {
"version": "1.3.4", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.1.tgz",
"integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "integrity": "sha512-EkcOk09rjhivbovP8WreGRbXW20YRfe/qdgXOGq3it3u3aAOWDRNsQhL/XPAWFF7zhZZ+uR+nT+3b+TCkIap1w=="
},
"@types/babylon": {
"version": "6.16.2",
"resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
"integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
"requires": { "requires": {
"mime-types": "2.1.17", "@types/babel-types": "7.0.1"
}
},
"accepts": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
"requires": {
"mime-types": "2.1.18",
"negotiator": "0.6.1" "negotiator": "0.6.1"
} }
}, },
@ -19,9 +32,9 @@
"integrity": "sha1-h91BA+/39EYPHhhvXGd+1s9WaIM=" "integrity": "sha1-h91BA+/39EYPHhhvXGd+1s9WaIM="
}, },
"acorn": { "acorn": {
"version": "4.0.13", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
"integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
}, },
"acorn-globals": { "acorn-globals": {
"version": "3.1.0", "version": "3.1.0",
@ -29,6 +42,13 @@
"integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
"requires": { "requires": {
"acorn": "4.0.13" "acorn": "4.0.13"
},
"dependencies": {
"acorn": {
"version": "4.0.13",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
"integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
}
} }
}, },
"align-text": { "align-text": {
@ -44,7 +64,8 @@
"amdefine": { "amdefine": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true
}, },
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
@ -70,9 +91,9 @@
} }
}, },
"argparse": { "argparse": {
"version": "1.0.9", "version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"requires": { "requires": {
"sprintf-js": "1.0.3" "sprintf-js": "1.0.3"
} }
@ -803,7 +824,6 @@
"version": "6.26.0", "version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
"dev": true,
"requires": { "requires": {
"babel-runtime": "6.26.0", "babel-runtime": "6.26.0",
"esutils": "2.0.2", "esutils": "2.0.2",
@ -814,8 +834,7 @@
"babylon": { "babylon": {
"version": "6.18.0", "version": "6.18.0",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
"dev": true
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
@ -852,22 +871,22 @@
"on-finished": "2.3.0", "on-finished": "2.3.0",
"qs": "6.5.1", "qs": "6.5.1",
"raw-body": "2.3.2", "raw-body": "2.3.2",
"type-is": "1.6.15" "type-is": "1.6.16"
} }
}, },
"bootstrap": { "bootstrap": {
"version": "4.0.0-beta.2", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0.tgz",
"integrity": "sha512-DzGtdTlKbrMoGMpz0LigKSqJ+MgtFKxA791PU/q062OlRG0HybNZcTLH7rpDAmLS66Y3esN9yzKHLLbqa5UR3w==" "integrity": "sha512-gulJE5dGFo6Q61V/whS6VM4WIyrlydXfCgkE+Gxe5hjrJ8rXLLZlALq7zq2RPhOc45PSwQpJkrTnc2KgD6cvmA=="
}, },
"bootswatch": { "bootswatch": {
"version": "4.0.0-beta.2", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/bootswatch/-/bootswatch-4.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/bootswatch/-/bootswatch-4.0.0.tgz",
"integrity": "sha1-6KKUf9iCuDnLGMuOm7KtaCtPJxA=", "integrity": "sha1-38qwKMA8CaWIiNN9fOn2yMM0mMw=",
"requires": { "requires": {
"bootstrap": "4.0.0-beta.2", "bootstrap": "4.0.0",
"jquery": "3.2.1", "jquery": "3.3.1",
"popper.js": "1.12.9" "popper.js": "1.14.1"
} }
}, },
"brace-expansion": { "brace-expansion": {
@ -975,30 +994,11 @@
} }
}, },
"clean-css": { "clean-css": {
"version": "3.4.28", "version": "4.1.11",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
"integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
"requires": { "requires": {
"commander": "2.8.1", "source-map": "0.5.7"
"source-map": "0.4.4"
},
"dependencies": {
"commander": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
"integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
"requires": {
"graceful-readlink": "1.0.1"
}
},
"source-map": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"requires": {
"amdefine": "1.0.1"
}
}
} }
}, },
"cliui": { "cliui": {
@ -1037,19 +1037,14 @@
"dev": true "dev": true
}, },
"constantinople": { "constantinople": {
"version": "3.1.0", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
"integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=", "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
"requires": { "requires": {
"acorn": "3.3.0", "@types/babel-types": "7.0.1",
"is-expression": "2.1.0" "@types/babylon": "6.16.2",
}, "babel-types": "6.26.0",
"dependencies": { "babylon": "6.18.0"
"acorn": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
"integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
}
} }
}, },
"content-disposition": { "content-disposition": {
@ -1150,9 +1145,9 @@
} }
}, },
"currency-formatter": { "currency-formatter": {
"version": "1.3.1", "version": "1.4.2",
"resolved": "https://registry.npmjs.org/currency-formatter/-/currency-formatter-1.3.1.tgz", "resolved": "https://registry.npmjs.org/currency-formatter/-/currency-formatter-1.4.2.tgz",
"integrity": "sha1-0v4wkuqdn7gfaT4PxpfMp8lH2es=", "integrity": "sha512-rQ5HB3DenCZwfVPdpVTuVcAORodVO0VoqIbjhdUSuy0sE2b9jBdCaVKbA355NUc2KhPbu5ojHs3WypuEwPLfNg==",
"requires": { "requires": {
"accounting": "0.4.1", "accounting": "0.4.1",
"locale-currency": "0.0.1", "locale-currency": "0.0.1",
@ -1213,9 +1208,9 @@
"dev": true "dev": true
}, },
"encodeurl": { "encodeurl": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
}, },
"entities": { "entities": {
"version": "1.1.1", "version": "1.1.1",
@ -1241,8 +1236,7 @@
"esutils": { "esutils": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
"dev": true
}, },
"etag": { "etag": {
"version": "1.8.1", "version": "1.8.1",
@ -1278,11 +1272,11 @@
} }
}, },
"express": { "express": {
"version": "4.16.2", "version": "4.16.3",
"resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
"integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
"requires": { "requires": {
"accepts": "1.3.4", "accepts": "1.3.5",
"array-flatten": "1.1.1", "array-flatten": "1.1.1",
"body-parser": "1.18.2", "body-parser": "1.18.2",
"content-disposition": "0.5.2", "content-disposition": "0.5.2",
@ -1290,28 +1284,40 @@
"cookie": "0.3.1", "cookie": "0.3.1",
"cookie-signature": "1.0.6", "cookie-signature": "1.0.6",
"debug": "2.6.9", "debug": "2.6.9",
"depd": "1.1.1", "depd": "1.1.2",
"encodeurl": "1.0.1", "encodeurl": "1.0.2",
"escape-html": "1.0.3", "escape-html": "1.0.3",
"etag": "1.8.1", "etag": "1.8.1",
"finalhandler": "1.1.0", "finalhandler": "1.1.1",
"fresh": "0.5.2", "fresh": "0.5.2",
"merge-descriptors": "1.0.1", "merge-descriptors": "1.0.1",
"methods": "1.1.2", "methods": "1.1.2",
"on-finished": "2.3.0", "on-finished": "2.3.0",
"parseurl": "1.3.2", "parseurl": "1.3.2",
"path-to-regexp": "0.1.7", "path-to-regexp": "0.1.7",
"proxy-addr": "2.0.2", "proxy-addr": "2.0.3",
"qs": "6.5.1", "qs": "6.5.1",
"range-parser": "1.2.0", "range-parser": "1.2.0",
"safe-buffer": "5.1.1", "safe-buffer": "5.1.1",
"send": "0.16.1", "send": "0.16.2",
"serve-static": "1.13.1", "serve-static": "1.13.2",
"setprototypeof": "1.1.0", "setprototypeof": "1.1.0",
"statuses": "1.3.1", "statuses": "1.4.0",
"type-is": "1.6.15", "type-is": "1.6.16",
"utils-merge": "1.0.1", "utils-merge": "1.0.1",
"vary": "1.1.2" "vary": "1.1.2"
},
"dependencies": {
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
}
} }
}, },
"extend": { "extend": {
@ -1330,14 +1336,14 @@
} }
}, },
"file-extension": { "file-extension": {
"version": "4.0.1", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/file-extension/-/file-extension-4.0.1.tgz", "resolved": "https://registry.npmjs.org/file-extension/-/file-extension-4.0.2.tgz",
"integrity": "sha512-6YLhv9tYlvzUcYzKhKWjOM1/3MFABj/TaAglgyKk7s7CSKB0Y51pdgpjV3YmowEMNpUOVCxCfblMsFyjldFnNg==" "integrity": "sha512-J6iOYob7wnONbiYJ8eP9vku0VXqsVKzGhyrXtXbDP8aMcNABluorelDBFKpX8DgVsq5WKwhFwa4G2ZVcvyWYCw=="
}, },
"file-type": { "file-type": {
"version": "7.4.0", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz", "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.6.0.tgz",
"integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY=" "integrity": "sha512-EAogdjMKf0PEU26Wk+N/Qkg8JXpMRo9t70dg7+t9QvcYUZb/XfA66Hdt15g4xRdam4wgiQsg/qycKUIuZQDJog=="
}, },
"filename-regex": { "filename-regex": {
"version": "2.0.1", "version": "2.0.1",
@ -1361,17 +1367,32 @@
} }
}, },
"finalhandler": { "finalhandler": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
"integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
"requires": { "requires": {
"debug": "2.6.9", "debug": "2.6.9",
"encodeurl": "1.0.1", "encodeurl": "1.0.2",
"escape-html": "1.0.3", "escape-html": "1.0.3",
"on-finished": "2.3.0", "on-finished": "2.3.0",
"parseurl": "1.3.2", "parseurl": "1.3.2",
"statuses": "1.3.1", "statuses": "1.4.0",
"unpipe": "1.0.0" "unpipe": "1.0.0"
},
"dependencies": {
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
}
}
},
"fmtbtc": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/fmtbtc/-/fmtbtc-0.0.3.tgz",
"integrity": "sha512-3awolswh6476ce5gIvzjw6OgT7ae2WD5NSinOC/de8gLeaDQPdYlW94Hb6nCoTXMUP6AFe3eh3IQiuT+dp4c8A==",
"requires": {
"move-decimal-point": "0.0.4"
} }
}, },
"for-in": { "for-in": {
@ -1398,7 +1419,7 @@
"requires": { "requires": {
"asynckit": "0.4.0", "asynckit": "0.4.0",
"combined-stream": "1.0.6", "combined-stream": "1.0.6",
"mime-types": "2.1.17" "mime-types": "2.1.18"
} }
}, },
"formidable": { "formidable": {
@ -2388,28 +2409,23 @@
"dev": true "dev": true
}, },
"gm": { "gm": {
"version": "1.23.0", "version": "1.23.1",
"resolved": "https://registry.npmjs.org/gm/-/gm-1.23.0.tgz", "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz",
"integrity": "sha1-gKL+nL8TFRUCSEZERlhGEmn1JmE=", "integrity": "sha1-Lt7rlYCE0PjqeYjl2ZWxx9/BR3c=",
"requires": { "requires": {
"array-parallel": "0.1.3", "array-parallel": "0.1.3",
"array-series": "0.1.5", "array-series": "0.1.5",
"cross-spawn": "4.0.2", "cross-spawn": "4.0.2",
"debug": "2.2.0" "debug": "3.1.0"
}, },
"dependencies": { "dependencies": {
"debug": { "debug": {
"version": "2.2.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": { "requires": {
"ms": "0.7.1" "ms": "2.0.0"
} }
},
"ms": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
"integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg="
} }
} }
}, },
@ -2418,11 +2434,6 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
}, },
"graceful-readlink": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
"integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
},
"has": { "has": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
@ -2498,9 +2509,9 @@
} }
}, },
"ipaddr.js": { "ipaddr.js": {
"version": "1.5.2", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
"integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs="
}, },
"is-binary-path": { "is-binary-path": {
"version": "1.0.1", "version": "1.0.1",
@ -2535,18 +2546,18 @@
} }
}, },
"is-expression": { "is-expression": {
"version": "2.1.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
"integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=", "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
"requires": { "requires": {
"acorn": "3.3.0", "acorn": "4.0.13",
"object-assign": "4.1.1" "object-assign": "4.1.1"
}, },
"dependencies": { "dependencies": {
"acorn": { "acorn": {
"version": "3.3.0", "version": "4.0.13",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
"integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
} }
} }
}, },
@ -2639,9 +2650,9 @@
} }
}, },
"jquery": { "jquery": {
"version": "3.2.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
"integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
}, },
"js-stringify": { "js-stringify": {
"version": "1.0.2", "version": "1.0.2",
@ -2655,11 +2666,11 @@
"dev": true "dev": true
}, },
"js-yaml": { "js-yaml": {
"version": "3.10.0", "version": "3.11.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
"integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
"requires": { "requires": {
"argparse": "1.0.9", "argparse": "1.0.10",
"esprima": "4.0.0" "esprima": "4.0.0"
} }
}, },
@ -2697,7 +2708,7 @@
"resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.0.0.tgz",
"integrity": "sha1-i0Su28lGXck10oC+kDObZxwWzrg=", "integrity": "sha1-i0Su28lGXck10oC+kDObZxwWzrg=",
"requires": { "requires": {
"markdown-it": "8.4.0" "markdown-it": "8.4.1"
} }
}, },
"kind-of": { "kind-of": {
@ -2728,7 +2739,7 @@
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz",
"integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=",
"requires": { "requires": {
"uc.micro": "1.0.3" "uc.micro": "1.0.5"
} }
}, },
"locale-currency": { "locale-currency": {
@ -2739,8 +2750,7 @@
"lodash": { "lodash": {
"version": "4.17.4", "version": "4.17.4",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
"integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
"dev": true
}, },
"longest": { "longest": {
"version": "1.0.1", "version": "1.0.1",
@ -2772,15 +2782,15 @@
} }
}, },
"markdown-it": { "markdown-it": {
"version": "8.4.0", "version": "8.4.1",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz",
"integrity": "sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA==", "integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==",
"requires": { "requires": {
"argparse": "1.0.9", "argparse": "1.0.10",
"entities": "1.1.1", "entities": "1.1.1",
"linkify-it": "2.0.3", "linkify-it": "2.0.3",
"mdurl": "1.0.1", "mdurl": "1.0.1",
"uc.micro": "1.0.3" "uc.micro": "1.0.5"
} }
}, },
"mdurl": { "mdurl": {
@ -2831,16 +2841,16 @@
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
}, },
"mime-db": { "mime-db": {
"version": "1.30.0", "version": "1.33.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
"integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.17", "version": "2.1.18",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"requires": { "requires": {
"mime-db": "1.30.0" "mime-db": "1.33.0"
} }
}, },
"minimatch": { "minimatch": {
@ -3025,9 +3035,9 @@
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
}, },
"popper.js": { "popper.js": {
"version": "1.12.9", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.1.tgz",
"integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM=" "integrity": "sha1-uIFeXNpvYvwgQuR2GGSfdYZuZ1M="
}, },
"preserve": { "preserve": {
"version": "0.2.0", "version": "0.2.0",
@ -3061,12 +3071,12 @@
} }
}, },
"proxy-addr": { "proxy-addr": {
"version": "2.0.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
"integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
"requires": { "requires": {
"forwarded": "0.1.2", "forwarded": "0.1.2",
"ipaddr.js": "1.5.2" "ipaddr.js": "1.6.0"
} }
}, },
"pseudomap": { "pseudomap": {
@ -3075,41 +3085,41 @@
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
}, },
"pug": { "pug": {
"version": "2.0.0-rc.4", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz",
"integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=",
"requires": { "requires": {
"pug-code-gen": "2.0.0", "pug-code-gen": "2.0.1",
"pug-filters": "2.1.5", "pug-filters": "3.1.0",
"pug-lexer": "3.1.0", "pug-lexer": "4.0.0",
"pug-linker": "3.0.3", "pug-linker": "3.0.5",
"pug-load": "2.0.9", "pug-load": "2.0.11",
"pug-parser": "4.0.0", "pug-parser": "5.0.0",
"pug-runtime": "2.0.3", "pug-runtime": "2.0.4",
"pug-strip-comments": "1.0.2" "pug-strip-comments": "1.0.3"
} }
}, },
"pug-attrs": { "pug-attrs": {
"version": "2.0.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz", "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz",
"integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=", "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=",
"requires": { "requires": {
"constantinople": "3.1.0", "constantinople": "3.1.2",
"js-stringify": "1.0.2", "js-stringify": "1.0.2",
"pug-runtime": "2.0.3" "pug-runtime": "2.0.4"
} }
}, },
"pug-code-gen": { "pug-code-gen": {
"version": "2.0.0", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz", "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz",
"integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==", "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=",
"requires": { "requires": {
"constantinople": "3.1.0", "constantinople": "3.1.2",
"doctypes": "1.1.0", "doctypes": "1.1.0",
"js-stringify": "1.0.2", "js-stringify": "1.0.2",
"pug-attrs": "2.0.2", "pug-attrs": "2.0.3",
"pug-error": "1.3.2", "pug-error": "1.3.2",
"pug-runtime": "2.0.3", "pug-runtime": "2.0.4",
"void-elements": "2.0.1", "void-elements": "2.0.1",
"with": "5.1.1" "with": "5.1.1"
} }
@ -3120,84 +3130,73 @@
"integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=" "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY="
}, },
"pug-filters": { "pug-filters": {
"version": "2.1.5", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz",
"integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=",
"requires": { "requires": {
"clean-css": "3.4.28", "clean-css": "4.1.11",
"constantinople": "3.1.0", "constantinople": "3.1.2",
"jstransformer": "1.0.0", "jstransformer": "1.0.0",
"pug-error": "1.3.2", "pug-error": "1.3.2",
"pug-walk": "1.1.5", "pug-walk": "1.1.7",
"resolve": "1.5.0", "resolve": "1.6.0",
"uglify-js": "2.8.29" "uglify-js": "2.8.29"
} }
}, },
"pug-lexer": { "pug-lexer": {
"version": "3.1.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz",
"integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=",
"requires": { "requires": {
"character-parser": "2.2.0", "character-parser": "2.2.0",
"is-expression": "3.0.0", "is-expression": "3.0.0",
"pug-error": "1.3.2" "pug-error": "1.3.2"
},
"dependencies": {
"is-expression": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
"integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
"requires": {
"acorn": "4.0.13",
"object-assign": "4.1.1"
}
}
} }
}, },
"pug-linker": { "pug-linker": {
"version": "3.0.3", "version": "3.0.5",
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz", "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz",
"integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==", "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=",
"requires": { "requires": {
"pug-error": "1.3.2", "pug-error": "1.3.2",
"pug-walk": "1.1.5" "pug-walk": "1.1.7"
} }
}, },
"pug-load": { "pug-load": {
"version": "2.0.9", "version": "2.0.11",
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz", "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz",
"integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==", "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=",
"requires": { "requires": {
"object-assign": "4.1.1", "object-assign": "4.1.1",
"pug-walk": "1.1.5" "pug-walk": "1.1.7"
} }
}, },
"pug-parser": { "pug-parser": {
"version": "4.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz", "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz",
"integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==", "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=",
"requires": { "requires": {
"pug-error": "1.3.2", "pug-error": "1.3.2",
"token-stream": "0.0.1" "token-stream": "0.0.1"
} }
}, },
"pug-runtime": { "pug-runtime": {
"version": "2.0.3", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz", "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz",
"integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o=" "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g="
}, },
"pug-strip-comments": { "pug-strip-comments": {
"version": "1.0.2", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz", "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz",
"integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=", "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=",
"requires": { "requires": {
"pug-error": "1.3.2" "pug-error": "1.3.2"
} }
}, },
"pug-walk": { "pug-walk": {
"version": "1.1.5", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz", "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz",
"integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA==" "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM="
}, },
"qruri": { "qruri": {
"version": "0.0.3", "version": "0.0.3",
@ -3417,9 +3416,9 @@
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
}, },
"resolve": { "resolve": {
"version": "1.5.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz",
"integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==",
"requires": { "requires": {
"path-parse": "1.0.5" "path-parse": "1.0.5"
} }
@ -3455,14 +3454,14 @@
"dev": true "dev": true
}, },
"send": { "send": {
"version": "0.16.1", "version": "0.16.2",
"resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
"integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
"requires": { "requires": {
"debug": "2.6.9", "debug": "2.6.9",
"depd": "1.1.1", "depd": "1.1.2",
"destroy": "1.0.4", "destroy": "1.0.4",
"encodeurl": "1.0.1", "encodeurl": "1.0.2",
"escape-html": "1.0.3", "escape-html": "1.0.3",
"etag": "1.8.1", "etag": "1.8.1",
"fresh": "0.5.2", "fresh": "0.5.2",
@ -3471,18 +3470,30 @@
"ms": "2.0.0", "ms": "2.0.0",
"on-finished": "2.3.0", "on-finished": "2.3.0",
"range-parser": "1.2.0", "range-parser": "1.2.0",
"statuses": "1.3.1" "statuses": "1.4.0"
},
"dependencies": {
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
}
} }
}, },
"serve-static": { "serve-static": {
"version": "1.13.1", "version": "1.13.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
"integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
"requires": { "requires": {
"encodeurl": "1.0.1", "encodeurl": "1.0.2",
"escape-html": "1.0.3", "escape-html": "1.0.3",
"parseurl": "1.3.2", "parseurl": "1.3.2",
"send": "0.16.1" "send": "0.16.2"
} }
}, },
"set-immediate-shim": { "set-immediate-shim": {
@ -3640,8 +3651,7 @@
"to-fast-properties": { "to-fast-properties": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
"dev": true
}, },
"token-stream": { "token-stream": {
"version": "0.0.1", "version": "0.0.1",
@ -3660,18 +3670,18 @@
"integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=" "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc="
}, },
"type-is": { "type-is": {
"version": "1.6.15", "version": "1.6.16",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
"integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
"requires": { "requires": {
"media-typer": "0.3.0", "media-typer": "0.3.0",
"mime-types": "2.1.17" "mime-types": "2.1.18"
} }
}, },
"uc.micro": { "uc.micro": {
"version": "1.0.3", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz",
"integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=" "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg=="
}, },
"uglify-js": { "uglify-js": {
"version": "2.8.29", "version": "2.8.29",
@ -3771,13 +3781,6 @@
"requires": { "requires": {
"acorn": "3.3.0", "acorn": "3.3.0",
"acorn-globals": "3.1.0" "acorn-globals": "3.1.0"
},
"dependencies": {
"acorn": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
"integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
}
} }
}, },
"wordwrap": { "wordwrap": {

View File

@ -1,6 +1,6 @@
{ {
"name": "filebazaar", "name": "filebazaar",
"version": "0.2.0", "version": "0.2.3",
"description": "", "description": "",
"scripts": { "scripts": {
"start": "./start.sh", "start": "./start.sh",
@ -10,7 +10,7 @@
"bin": "dist/cli.js", "bin": "dist/cli.js",
"author": "Nadav Ivgi", "author": "Nadav Ivgi",
"license": "MIT", "license": "MIT",
"repository": "https://github.com/shesek/filebazaar.git", "repository": "https://github.com/elementsproject/filebazaar.git",
"keywords": [ "keywords": [
"bitcoin", "bitcoin",
"lightning", "lightning",
@ -19,25 +19,25 @@
], ],
"dependencies": { "dependencies": {
"babel-polyfill": "^6.26.0", "babel-polyfill": "^6.26.0",
"bootswatch": "^4.0.0-beta.2", "bootswatch": "^4.0.0",
"cookie-parser": "^1.4.3", "cookie-parser": "^1.4.3",
"csurf": "^1.9.0", "csurf": "^1.9.0",
"currency-formatter": "^1.3.1", "currency-formatter": "^1.4.2",
"express": "^4.16.2", "express": "^4.16.3",
"file-extension": "^4.0.1", "file-extension": "^4.0.2",
"file-type": "^7.4.0", "file-type": "^7.6.0",
"fmtbtc": "0.0.3",
"fs-extra": "^5.0.0", "fs-extra": "^5.0.0",
"gm": "^1.23.0", "gm": "^1.23.1",
"js-yaml": "^3.10.0", "js-yaml": "^3.11.0",
"jstransformer-markdown-it": "^2.0.0", "jstransformer-markdown-it": "^2.0.0",
"lightning-charge-client": "^0.1.7", "lightning-charge-client": "^0.1.7",
"lru-memoize": "github:neilk/lru-memoize", "lru-memoize": "github:neilk/lru-memoize",
"markdown-it": "^8.4.0", "markdown-it": "^8.4.1",
"mime-types": "^2.1.17", "mime-types": "^2.1.18",
"morgan": "^1.9.0", "morgan": "^1.9.0",
"move-decimal-point": "0.0.4",
"pretty-bytes": "^4.0.2", "pretty-bytes": "^4.0.2",
"pug": "^2.0.0-rc.4", "pug": "^2.0.3",
"qruri": "0.0.3", "qruri": "0.0.3",
"read-chunk": "^2.1.0" "read-chunk": "^2.1.0"
}, },

View File

@ -1,5 +1,7 @@
import fs from 'fs'
import path from 'path' import path from 'path'
import { pwrap, pick, fcurrency, fmsat, pngPixel } from './lib/util' import { msat2milli } from 'fmtbtc'
import { pwrap, pick, fcurrency, pngPixel } from './lib/util'
// Setup // Setup
const app = require('express')() const app = require('express')()
@ -22,7 +24,7 @@ app.enable('case sensitive routing')
// View locals // View locals
Object.assign(app.locals, { Object.assign(app.locals, {
conf, fmsat, fcurrency conf, msat2milli, fcurrency
, prettybytes: require('pretty-bytes') , prettybytes: require('pretty-bytes')
, markdown: require('markdown-it')() , markdown: require('markdown-it')()
, qruri: require('qruri') , qruri: require('qruri')
@ -39,7 +41,7 @@ app.use(require('body-parser').urlencoded({ extended: false }))
app.use(require('csurf')({ cookie: true })) app.use(require('csurf')({ cookie: true }))
// Static assets // Static assets
if (app.settings.env == 'development' && require.resolve('stylus')) if (fs.existsSync(path.join(conf.static_dir, 'style.styl')))
app.use('/_assets', require('stylus').middleware({ src: conf.static_dir, serve: true })) app.use('/_assets', require('stylus').middleware({ src: conf.static_dir, serve: true }))
app.use('/_assets', require('express').static(conf.static_dir)) app.use('/_assets', require('express').static(conf.static_dir))

View File

@ -41,7 +41,7 @@ module.exports = basePath => {
const parsePrice = str => { const parsePrice = str => {
const m = str.match(/^([\d.]+) ([a-z]+)$/i) const m = str.match(/^([\d.]+) ([a-z]+)$/i)
if (!m) throw new Error(`invalid price: ${ str }`) if (!m) throw new Error(`invalid price: ${ str }`)
return { amount: m[1], currency: m[2] } return { amount: m[1], currency: m[2].toUpperCase() }
} }
const parseFiles = (files, prefix='') => const parseFiles = (files, prefix='') =>

View File

@ -60,7 +60,7 @@ module.exports = (base, default_price, invoice_ttl, files_attr) => {
, currency: file.price.currency , currency: file.price.currency
, amount: file.price.amount , amount: file.price.amount
, expiry: invoice_ttl , expiry: invoice_ttl
, metadata: { path: file.path } , metadata: { source: 'filebazaar', path: file.path }
}) })
return { load, invoice } return { load, invoice }

View File

@ -1,6 +1,6 @@
import { execFile } from 'child_process' import { execFile } from 'child_process'
import moveDec from 'move-decimal-point' import { btc2milli } from 'fmtbtc'
import CurrencyF from 'currency-formatter' import CurrencyF from 'currency-formatter'
// Promise wrapper for express handler functions // Promise wrapper for express handler functions
const pwrap = fn => (req, res, next, ...a) => const pwrap = fn => (req, res, next, ...a) =>
@ -14,13 +14,12 @@ const exec = (cmd, ...args) => new Promise((resolve, reject) =>
// Pick specified object properties // Pick specified object properties
const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {}) const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})
// Format milli-satoshis as milli-bitcoins
const fmsat = msat => moveDec(msat, -8)
// Format price with currency symbol // Format price with currency symbol
const fcurrency = p => CurrencyF.format(p.amount, { code: p.currency.toUpperCase() }) //
const fcurrency = p => p.currency === 'BTC' ? `${btc2milli(p.amount, true)} mBTC`
: CurrencyF.format(p.amount, { code: p.currency })
// Empty 1x1 PNG pixel // Empty 1x1 PNG pixel
const pngPixel = Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=', 'base64') const pngPixel = Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=', 'base64')
module.exports = { pwrap, exec, pick, fmsat, fcurrency, pngPixel } module.exports = { pwrap, exec, pick, fcurrency, pngPixel }

View File

@ -7,7 +7,10 @@ if invoice.status == 'expired'
else else
.checkout .checkout
h3 Pay with Lightning h3 Pay with Lightning
h4 #[strong= invoice.quoted_amount] #{invoice.quoted_currency } = #[strong= fmsat(invoice.msatoshi)] mBTC if invoice.quoted_currency && invoice.quoted_currency != 'BTC'
h4 #[strong= invoice.quoted_amount] #{invoice.quoted_currency} ≈ #[strong= msat2milli(invoice.msatoshi)] mBTC
else
h4 #[strong= msat2milli(invoice.msatoshi)] mBTC
.row .row
.pay.col-sm-8 .pay.col-sm-8
pre= invoice.payreq pre= invoice.payreq
@ -19,7 +22,7 @@ else
p: a.btn.btn-lg.btn-primary(href=`lightning:${invoice.payreq}`) Pay now p: a.btn.btn-lg.btn-primary(href=`lightning:${invoice.payreq}`) Pay now
.qr.col-sm-4.mb-3: img(src=qruri('lightning:'+invoice.payreq.toUpperCase(), { margin: 0 })) .qr.col-sm-4.mb-3: img(src=qruri(('lightning:'+invoice.payreq).toUpperCase(), { margin: 0 }))
//- long-pull payment updates via <img> reloading hack. not the prettiest, but extremely terse, and it works //- long-pull payment updates via <img> reloading hack. not the prettiest, but extremely terse, and it works
img.d-none(src='_invoice/'+invoice.id+'/longpoll.png', onerror='this.src=this.src', onload='location.reload()') img.d-none(src='_invoice/'+invoice.id+'/longpoll.png', onerror='this.src=this.src', onload='location.reload()')