Merge branch 'master' of https://github.com/hackmdio/codimd into DepauMD
This commit is contained in:
commit
3cf3e7c6da
78 changed files with 2001 additions and 1826 deletions
14
.mailmap
Normal file
14
.mailmap
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
Max Wu <jackymaxj@gmail.com> Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
||||||
|
Max Wu <jackymaxj@gmail.com> Cheng-Han, Wu <jackymaxj@gmail.com>
|
||||||
|
Max Wu <jackymaxj@gmail.com> jackycute <jackymaxj@gmail.com>
|
||||||
|
Max Wu <jackymaxj@gmail.com> Wu, Cheng-Han <jackymaxj@gmail.com>
|
||||||
|
Max Wu <jackymaxj@gmail.com> jackycute <jacky_cute0808@hotmail.com>
|
||||||
|
|
||||||
|
Sheogorath <sheogorath@shivering-isles.com> Christoph (Sheogorath) Kern <sheogorath@shivering-isles.com>
|
||||||
|
|
||||||
|
Raccoon <raccoon@hackmd.io> Raccoon Li <a60814billy@gmail.com>
|
||||||
|
Raccoon <raccoon@hackmd.io> Raccoon <a60814billy@gmail.com>
|
||||||
|
|
||||||
|
Peter Dave Hello <hsu@peterdavehello.org> Peter Dave Hello <PeterDaveHello@users.noreply.github.com>
|
||||||
|
|
||||||
|
Claudius Coenen <github@amenthes.de> Claudius Coenen <opensource@amenthes.de>
|
|
@ -56,7 +56,7 @@ version 1.2.0, available at
|
||||||
### Sign your work
|
### Sign your work
|
||||||
|
|
||||||
We use the Developer Certificate of Origin (DCO) as a additional safeguard
|
We use the Developer Certificate of Origin (DCO) as a additional safeguard
|
||||||
for the HackMD project. This is a well established and widely used
|
for the CodiMD project. This is a well established and widely used
|
||||||
mechanism to assure contributors have confirmed their right to license
|
mechanism to assure contributors have confirmed their right to license
|
||||||
their contribution under the project's license.
|
their contribution under the project's license.
|
||||||
Please read [contribute/developer-certificate-of-origin][dcofile].
|
Please read [contribute/developer-certificate-of-origin][dcofile].
|
||||||
|
|
902
CONTRIBUTORS
902
CONTRIBUTORS
|
@ -1,902 +0,0 @@
|
||||||
=== .babelrc
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== .editorconfig
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== .gitignore
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== .sequelizerc.example
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== .travis.yml
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
=== AUTHORS
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== CONTRIBUTING.md
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
=== LICENSE
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
jackycute <jacky_cute0808@hotmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== README.md
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Florian Rhiem <florian.rhiem@gmail.com>
|
|
||||||
jackycute <jackymaxj@gmail.com>
|
|
||||||
Jannik Lorenz <dev@janniklorenz.de>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Johannes Weißl <jargon@molb.org>
|
|
||||||
Jun SAKATA <jun.bj141400@gmail.com>
|
|
||||||
Laura Kyle <laura.kyle91@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
neopostmodern <clemens@neopostmodern.com>
|
|
||||||
NV <nvsofts@gmail.com>
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
The Gitter Badger <badger@gitter.im>
|
|
||||||
Wonder Chang <iwonder.tw@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
蒼時弦也 <elct9620@frost.tw>
|
|
||||||
=== app.js
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
James Stephenson <c4p7.fl1n7@gmail.com>
|
|
||||||
Jan Kunzmann <jan-github@phobia.de>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Jordan Matelsky <j6k4m8@gmail.com>
|
|
||||||
knjcode <knjcode@gmail.com>
|
|
||||||
LluisArevalo <thorin119@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
NV <nvsofts@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Raccoon Li <a60814billy@gmail.com>
|
|
||||||
robert <ahmerov.rt@molodost.bz>
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
S.Noda <noda@fenrir.co.jp>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== app.json
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== bin/heroku
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== bin/setup
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== config.json.example
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/images/s3-image-upload/bucket-policy-editor.png
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/images/s3-image-upload/bucket-property.png
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/images/s3-image-upload/create-bucket.png
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/images/s3-image-upload/custom-policy.png
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/images/s3-image-upload/iam-user.png
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/images/s3-image-upload/review-policy.png
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== docs/guides/s3-image-upload.md
|
|
||||||
Johannes Weißl <jargon@molb.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== lib/config/default.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/config/defaultSSL.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/config/dockerSecret.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/config/enum.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/config/environment.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Raccoon Li <a60814billy@gmail.com>
|
|
||||||
=== lib/config/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
tkykm <tkykm@users.noreply.github.com>
|
|
||||||
=== lib/config/oldEnvironment.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Raccoon Li <a60814billy@gmail.com>
|
|
||||||
=== lib/config/utils.js
|
|
||||||
Raccoon Li <a60814billy@gmail.com>
|
|
||||||
=== lib/history.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/letter-avatars.js
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/logger.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/migrations/20150504155329-create-users.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20150508114741-create-notes.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20150515125813-create-temp.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20150702001020-update-to-0_3_1.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20150915153700-change-notes-title-to-text.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20160112220142-note-add-lastchange.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20160420180355-note-add-alias.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/migrations/20160515114000-user-add-tokens.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
=== lib/migrations/20160607060246-support-revision.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/migrations/20160703062241-support-authorship.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/migrations/20161009040430-support-delete-note.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/migrations/20161201050312-support-email-signin.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/models/author.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/models/index.js
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== lib/models/note.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
NV <nvsofts@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
蒼時弦也 <elct9620@frost.tw>
|
|
||||||
=== lib/models/revision.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/models/temp.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
=== lib/models/user.js
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/client.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/editor-socketio-server.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/index.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/selection.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/server.js
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/simple-text-operation.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/text-operation.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/ot/wrapped-operation.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== lib/realtime.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Florian Rhiem <florian.rhiem@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
蒼時弦也 <elct9620@frost.tw>
|
|
||||||
=== lib/response.js
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
butlerx <butlerx@notthe.cloud>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Florian Rhiem <florian.rhiem@gmail.com>
|
|
||||||
Ikumi Shimizu <193s@users.noreply.github.com>
|
|
||||||
Jannik Lorenz <dev@janniklorenz.de>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
蒼時弦也 <elct9620@frost.tw>
|
|
||||||
=== lib/utils.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
butlerx <butlerx@notthe.cloud>
|
|
||||||
LluisArevalo <thorin119@gmail.com>
|
|
||||||
=== lib/web/auth/dropbox/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/email/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/facebook/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/github/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
=== lib/web/auth/gitlab/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/google/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Kaiyu Shi <skyisno.1@gmail.com>
|
|
||||||
=== lib/web/auth/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/ldap/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/twitter/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/auth/utils.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/baseRouter.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/historyRouter.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/imageRouter.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Kotaro Yamamoto <kota.crk@gmail.com>
|
|
||||||
Raccoon Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/middleware/checkURIValid.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
=== lib/web/middleware/redirectWithoutTrailingSlashes.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/middleware/tooBusy.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/noteRouter.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/statusRouter.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/userRouter.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/web/utils.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
=== lib/workers/dmpWorker.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== locales/ca.json
|
|
||||||
Xavier Marques <xaviermarques4f@gmail.com>
|
|
||||||
=== locales/da.json
|
|
||||||
Patrick Andersen <patrick@bacha.dk>
|
|
||||||
=== locales/de.json
|
|
||||||
Jannik Lorenz <dev@janniklorenz.de>
|
|
||||||
Philipp Zumstein <zuphilip@users.noreply.github.com>
|
|
||||||
Simon Joda Stößer <SimJoSt@users.noreply.github.com>
|
|
||||||
=== locales/el.json
|
|
||||||
Stratos Gerakakis <stratosgear@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
zachariast <zachariastraianos@gmail.com>
|
|
||||||
=== locales/en.json
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== locales/eo.json
|
|
||||||
James Stephenson <c4p7.fl1n7@gmail.com>
|
|
||||||
=== locales/es.json
|
|
||||||
Pablo Guerrero <pablo.guerrero@sap.com>
|
|
||||||
Sergio Valverde <svg153@users.noreply.github.com>
|
|
||||||
=== locales/fr.json
|
|
||||||
Colin Maudry <colin@maudry.com>
|
|
||||||
Ho33e5 <ho33e5@gmail.com>
|
|
||||||
=== locales/hi.json
|
|
||||||
Paras <paraschadha2052@gmail.com>
|
|
||||||
=== locales/hr.json
|
|
||||||
ivanorsolic <ivanorsolic@users.noreply.github.com>
|
|
||||||
=== locales/it.json
|
|
||||||
GhiMax <ghina8@gmail.com>
|
|
||||||
=== locales/ja.json
|
|
||||||
tkqubo <tk.qubo@gmail.com>
|
|
||||||
=== locales/nl.json
|
|
||||||
Martijnpold <martijntje7@gmail.com>
|
|
||||||
Tom Wyckhuys <tomwyckhuys@gmail.com>
|
|
||||||
=== locales/pl.json
|
|
||||||
Bartlomiej Szala <fenix440@gmail.com>
|
|
||||||
Jakub Sygnowski <sygnowski@gmail.com>
|
|
||||||
=== locales/pt.json
|
|
||||||
Marcelo Alencar <marceloalves@ufpa.br>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== locales/ru.json
|
|
||||||
Himura Kazuto <Himura2la@users.noreply.github.com>
|
|
||||||
p0v1n0m <p0v1n0m@gmail.com>
|
|
||||||
=== locales/sv.json
|
|
||||||
Lars Karlsson <lars@kajes.se>
|
|
||||||
Patrick Andersen <patrick@bacha.dk>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== locales/tr.json
|
|
||||||
Ömer Erdinç Yağmurlu <omeryagmurlu@gmail.com>
|
|
||||||
=== locales/uk.json
|
|
||||||
Dmytro Kytsmen <dmitrokytsmen@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== locales/zh.json
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== package.json
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
bananaappletw <bananaappletw@gmail.com>
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Bryan Davis <bd808@wikimedia.org>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Fabien Meghazi <agr@amigrave.com>
|
|
||||||
greenkeeperio-bot <support@greenkeeper.io>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Peter Dave Hello <PeterDaveHello@users.noreply.github.com>
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/apple-touch-icon.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/bootstrap-social.css
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/center.css
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/cover.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/extra.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/font.css
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/css/github-extract.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/google-font.css
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/css/index.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/markdown.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/mermaid.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
=== public/css/site.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/css/slide-preview.css
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/css/slide.css
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/default.md
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/docs/features.md
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
Pablo Guerrero <pablo.guerrero@gmail.com>
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/docs/release-notes.md
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/docs/slide-example.md
|
|
||||||
butlerx <butlerx@notthe.cloud>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/docs/yaml-metadata.md
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/favicon.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Black.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Black.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Black.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Bold.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Bold.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Bold.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-ExtraLight.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-ExtraLight.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-ExtraLight.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Light.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Light.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Light.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Medium.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Medium.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Medium.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Regular.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Regular.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Regular.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Semibold.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Semibold.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceCodePro-Semibold.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Black.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Black.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Black.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-BlackItalic.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-BlackItalic.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-BlackItalic.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Bold.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Bold.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Bold.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-BoldItalic.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-BoldItalic.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-BoldItalic.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-ExtraLight.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-ExtraLight.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-ExtraLight.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-ExtraLightItalic.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-ExtraLightItalic.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-ExtraLightItalic.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Italic.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Italic.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Italic.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Light.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Light.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Light.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-LightItalic.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-LightItalic.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-LightItalic.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Regular.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Regular.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Regular.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Semibold.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Semibold.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-Semibold.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-SemiboldItalic.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-SemiboldItalic.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSansPro-SemiboldItalic.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Bold.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Bold.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Bold.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Regular.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Regular.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Regular.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Semibold.eot
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Semibold.ttf
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/fonts/SourceSerifPro-Semibold.woff
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/hackmd-icon-1024.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/js/cover.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
NV <nvsofts@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/extra.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
NV <nvsofts@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/google-drive-picker.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
=== public/js/google-drive-upload.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/js/history.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/htmlExport.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Laura Kyle <laura.kyle91@gmail.com>
|
|
||||||
NV <nvsofts@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
Zankio <xxoojoeooxx1@gmail.com>
|
|
||||||
蒼時弦也 <elct9620@frost.tw>
|
|
||||||
=== public/js/lib/appState.js
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/common/constant.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/js/lib/common/login.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/config/index.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/editor/config.js
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/editor/index.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/editor/statusbar.html
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/editor/ui-elements.js
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/editor/utils.js
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/modeType.js
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/lib/syncscroll.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/locale.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Peter Dave Hello <PeterDaveHello@users.noreply.github.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/pretty.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/render.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/js/reveal-markdown.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/js/slide.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Max Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/screenshot.png
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/uploads/.gitkeep
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/vendor/abcjs_basic_3.1.1-min.js
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/bootstrap/tooltip.min.css
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/bootstrap/tooltip.min.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/codemirror-spell-checker/en_US.aff
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
=== public/vendor/codemirror-spell-checker/en_US.dic
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
=== public/vendor/codemirror-spell-checker/spell-checker.min.css
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/codemirror-spell-checker/spell-checker.min.js
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/vendor/inlineAttachment/codemirror.inline-attachment.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/inlineAttachment/inline-attachment.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-textcomplete/jquery.textcomplete.js
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-icons_222222_256x240.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-icons_454545_256x240.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-icons_888888_256x240.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/jquery-ui.min.css
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/jquery-ui/jquery-ui.min.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/md-toc.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/ajax-adapter.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/client.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/codemirror-adapter.js
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/compress.sh
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/editor-client.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/ot.min.js
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/selection.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/socketio-adapter.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/text-operation.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/undo-manager.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/ot/wrapped-operation.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/showup/showup.css
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/vendor/showup/showup.js
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/error.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/hackmd.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/hackmd/body.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Florian Rhiem <florian.rhiem@gmail.com>
|
|
||||||
Ian Dees <ian.dees@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
蒼時弦也 <elct9620@frost.tw>
|
|
||||||
=== public/views/hackmd/foot.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jannik Lorenz <dev@janniklorenz.de>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/hackmd/footer.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/hackmd/head.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/hackmd/header.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jannik Lorenz <dev@janniklorenz.de>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
=== public/views/html.hbs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/includes/header.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/includes/scripts.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/index.ejs
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Florian Rhiem <florian.rhiem@gmail.com>
|
|
||||||
James Stephenson <c4p7.fl1n7@gmail.com>
|
|
||||||
Jannik Lorenz <dev@janniklorenz.de>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/index/body.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/index/foot.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/index/footer.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/index/head.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
xnum <s000032001@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/index/header.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/pretty.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== public/views/shared/disqus.ejs
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/shared/ga.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/shared/help-modal.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/shared/polyfill.ejs
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/shared/refresh-modal.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/shared/revision-modal.ejs
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/shared/signin-modal.ejs
|
|
||||||
alecdwm <alec@owls.io>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Jason Croft <jcroft@velocity.org>
|
|
||||||
neopostmodern <clemens@neopostmodern.com>
|
|
||||||
Sheogorath <sheogorath@shivering-isles.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== public/views/slide.ejs
|
|
||||||
butlerx <butlerx@notthe.cloud>
|
|
||||||
Cheng-Han, Wu <jackymaxj@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== tmp/.keep
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
=== webpack.config.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== webpack.production.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
geekyd <singhsince94@gmail.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== webpackBaseConfig.js
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Peter Dave Hello <hsu@peterdavehello.org>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
||||||
=== yarn.lock
|
|
||||||
BoHong Li <a60814billy@gmail.com>
|
|
||||||
Christian Schuhmann <madebyherzblut@users.noreply.github.com>
|
|
||||||
Wu Cheng-Han <jacky_cute0808@hotmail.com>
|
|
||||||
Yukai Huang <yukaihuangtw@gmail.com>
|
|
234
README.md
234
README.md
|
@ -1,18 +1,18 @@
|
||||||
HackMD Community Edition
|
CodiMD
|
||||||
===
|
===
|
||||||
|
|
||||||
[![Standard - JavaScript Style Guide][standardjs-image]][standardjs-url]
|
[![Standard - JavaScript Style Guide][standardjs-image]][standardjs-url]
|
||||||
|
|
||||||
[![Join the chat at https://gitter.im/hackmdio/hackmd][gitter-image]][gitter-url]
|
[![Join the chat at https://gitter.im/hackmdio/hackmd][gitter-image]][gitter-url]
|
||||||
[![#HackMD on matrix.org][matrix.org-image]][matrix.org-url]
|
[![#CodiMD on matrix.org][matrix.org-image]][matrix.org-url]
|
||||||
[![build status][travis-image]][travis-url]
|
[![build status][travis-image]][travis-url]
|
||||||
[![version][github-version-badge]][github-release-page]
|
[![version][github-version-badge]][github-release-page]
|
||||||
[![Help Contribute to Open Source][codetriage-image]][codetriage-url]
|
[![Help Contribute to Open Source][codetriage-image]][codetriage-url]
|
||||||
[![POEditor][poeditor-image]][poeditor-url]
|
[![POEditor][poeditor-image]][poeditor-url]
|
||||||
|
|
||||||
HackMD lets you create realtime collaborative markdown notes on all platforms.
|
CodiMD lets you create real-time collaborative markdown notes on all platforms.
|
||||||
Inspired by Hackpad, with more focus on speed and flexibility.
|
Inspired by Hackpad, with more focus on speed and flexibility, and build from [HackMD](https://hackmd.io) source code.
|
||||||
Still in the early stage, feel free to fork or contribute to HackMD.
|
Feel free to contribute.
|
||||||
|
|
||||||
Thanks for using! :smile:
|
Thanks for using! :smile:
|
||||||
|
|
||||||
|
@ -20,13 +20,15 @@ Thanks for using! :smile:
|
||||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||||
# Table of Contents
|
# Table of Contents
|
||||||
|
|
||||||
|
- [HackMD CE became CodiMD](#hackmd-ce-became-codimd)
|
||||||
- [Browsers Requirement](#browsers-requirement)
|
- [Browsers Requirement](#browsers-requirement)
|
||||||
- [Installation](#installation)
|
- [Installation](#installation)
|
||||||
- [Getting started (Native install)](#getting-started-native-install)
|
- [Getting started (Native install)](#getting-started-native-install)
|
||||||
- [Prerequisite](#prerequisite)
|
- [Prerequisite](#prerequisite)
|
||||||
- [Instructions](#instructions)
|
- [Instructions](#instructions)
|
||||||
- [Heroku Deployment](#heroku-deployment)
|
- [Heroku Deployment](#heroku-deployment)
|
||||||
- [HackMD by docker container](#hackmd-by-docker-container)
|
- [Kubernetes](#kubernetes)
|
||||||
|
- [CodiMD by docker container](#codimd-by-docker-container)
|
||||||
- [Upgrade](#upgrade)
|
- [Upgrade](#upgrade)
|
||||||
- [Native setup](#native-setup)
|
- [Native setup](#native-setup)
|
||||||
- [Configuration](#configuration)
|
- [Configuration](#configuration)
|
||||||
|
@ -41,6 +43,16 @@ Thanks for using! :smile:
|
||||||
|
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
|
||||||
|
# HackMD CE became CodiMD
|
||||||
|
|
||||||
|
CodiMD was recently renamed from its former name was HackMD. CodiMD is the free software version of HackMD. It was the original Version of HackMD. The HackMD team initiated CodiMD and provided a solid code base. Due to the need of paying bills, A fork was created and called HackMD EE, which is a SaaS (Software as a Service) product available at [hackmd.io](https://hackmd.io).
|
||||||
|
|
||||||
|
We decided to change the name to break the confusion between HackMD and CodiMD, formally known as HackMD CE, as it never was an open core project.
|
||||||
|
|
||||||
|
Just to more confusion: We are still friends with HackMD :heart:
|
||||||
|
|
||||||
|
*For the whole renaming story, see the [related issue](https://github.com/hackmdio/hackmd/issues/720)*
|
||||||
|
|
||||||
# Browsers Requirement
|
# Browsers Requirement
|
||||||
|
|
||||||
- ![Chrome](http://browserbadge.com/chrome/47/18px) Chrome >= 47, Chrome for Android >= 47
|
- ![Chrome](http://browserbadge.com/chrome/47/18px) Chrome >= 47, Chrome for Android >= 47
|
||||||
|
@ -59,7 +71,7 @@ Thanks for using! :smile:
|
||||||
- Node.js 6.x or up (test up to 7.5.0)
|
- Node.js 6.x or up (test up to 7.5.0)
|
||||||
- Database (PostgreSQL, MySQL, MariaDB, SQLite, MSSQL) use charset `utf8`
|
- Database (PostgreSQL, MySQL, MariaDB, SQLite, MSSQL) use charset `utf8`
|
||||||
- npm (and its dependencies, especially [uWebSockets](https://github.com/uWebSockets/uWebSockets#nodejs-developers), [node-gyp](https://github.com/nodejs/node-gyp#installation))
|
- npm (and its dependencies, especially [uWebSockets](https://github.com/uWebSockets/uWebSockets#nodejs-developers), [node-gyp](https://github.com/nodejs/node-gyp#installation))
|
||||||
- For **building** HackMD we recommend to use a machine with at least **2GB** RAM
|
- For **building** CodiMD we recommend to use a machine with at least **2GB** RAM
|
||||||
|
|
||||||
### Instructions
|
### Instructions
|
||||||
|
|
||||||
|
@ -68,18 +80,27 @@ Thanks for using! :smile:
|
||||||
3. Setup the configs, see more below
|
3. Setup the configs, see more below
|
||||||
4. Setup environment variables which will overwrite the configs
|
4. Setup environment variables which will overwrite the configs
|
||||||
5. Build front-end bundle by `npm run build` (use `npm run dev` if you are in development)
|
5. Build front-end bundle by `npm run build` (use `npm run dev` if you are in development)
|
||||||
6. Run the server as you like (node, forever, pm2)
|
6. Modify the file named `.sequelizerc`, change the value of the variable `url` with your db connection string
|
||||||
|
For example: `postgres://username:password@localhost:5432/codimd`
|
||||||
|
7. Run `node_modules/.bin/sequelize db:migrate`, this step will migrate your db to the latest schema
|
||||||
|
8. Run the server as you like (node, forever, pm2)
|
||||||
|
|
||||||
## Heroku Deployment
|
## Heroku Deployment
|
||||||
|
|
||||||
You can quickly setup a sample Heroku HackMD application by clicking the button below.
|
You can quickly setup a sample Heroku CodiMD application by clicking the button below.
|
||||||
|
|
||||||
[![Deploy on Heroku](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/hackmdio/hackmd/tree/master)
|
[![Deploy on Heroku](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/hackmdio/codimd/tree/master)
|
||||||
|
|
||||||
If you deploy it without the button, keep in mind to use the right buildpacks. For details check `app.json`.
|
If you deploy it without the button, keep in mind to use the right buildpacks. For details check `app.json`.
|
||||||
|
|
||||||
## HackMD by docker container
|
## Kubernetes
|
||||||
[![Try in PWD](https://cdn.rawgit.com/play-with-docker/stacks/cff22438/assets/images/button.png)](http://play-with-docker.com?stack=https://github.com/hackmdio/docker-hackmd/raw/master/docker-compose.yml&stack_name=hackmd)
|
|
||||||
|
To install use `helm install stable/hackmd`.
|
||||||
|
|
||||||
|
For all further details, please check out the offical CodiMD [K8s helm chart](https://github.com/kubernetes/charts/tree/master/stable/hackmd).
|
||||||
|
|
||||||
|
## CodiMD by docker container
|
||||||
|
[![Try in PWD](https://cdn.rawgit.com/play-with-docker/stacks/cff22438/assets/images/button.png)](http://play-with-docker.com?stack=https://github.com/hackmdio/docker-hackmd/raw/master/docker-compose.yml&stack_name=codimd)
|
||||||
|
|
||||||
|
|
||||||
**Debian-based version:**
|
**Debian-based version:**
|
||||||
|
@ -91,11 +112,11 @@ If you deploy it without the button, keep in mind to use the right buildpacks. F
|
||||||
|
|
||||||
[![alpine](https://images.microbadger.com/badges/version/hackmdio/hackmd:alpine.svg)](https://microbadger.com/images/hackmdio/hackmd:alpine "Get your own version badge on microbadger.com") [![](https://images.microbadger.com/badges/image/hackmdio/hackmd:alpine.svg)](https://microbadger.com/images/hackmdio/hackmd:alpine "Get your own image badge on microbadger.com")
|
[![alpine](https://images.microbadger.com/badges/version/hackmdio/hackmd:alpine.svg)](https://microbadger.com/images/hackmdio/hackmd:alpine "Get your own version badge on microbadger.com") [![](https://images.microbadger.com/badges/image/hackmdio/hackmd:alpine.svg)](https://microbadger.com/images/hackmdio/hackmd:alpine "Get your own image badge on microbadger.com")
|
||||||
|
|
||||||
The easiest way to setup HackMD using docker are using the following three commands:
|
The easiest way to setup CodiMD using docker are using the following three commands:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
git clone https://github.com/hackmdio/docker-hackmd.git
|
git clone https://github.com/hackmdio/docker-hackmd.git
|
||||||
cd docker-hackmd
|
cd docker-codimd
|
||||||
docker-compose up
|
docker-compose up
|
||||||
```
|
```
|
||||||
Read more about it in the [docker repository…](https://github.com/hackmdio/docker-hackmd)
|
Read more about it in the [docker repository…](https://github.com/hackmdio/docker-hackmd)
|
||||||
|
@ -104,14 +125,14 @@ Read more about it in the [docker repository…](https://github.com/hackmdio/doc
|
||||||
|
|
||||||
## Native setup
|
## Native setup
|
||||||
|
|
||||||
If you are upgrading HackMD from an older version, follow these steps:
|
If you are upgrading CodiMD from an older version, follow these steps:
|
||||||
|
|
||||||
1. Fully stop your old server first (important)
|
1. Fully stop your old server first (important)
|
||||||
2. `git pull` or do whatever that updates the files
|
2. `git pull` or do whatever that updates the files
|
||||||
3. `npm install` to update dependencies
|
3. `npm install` to update dependencies
|
||||||
4. Build front-end bundle by `npm run build` (use `npm run dev` if you are in development)
|
4. Build front-end bundle by `npm run build` (use `npm run dev` if you are in development)
|
||||||
5. Modify the file named `.sequelizerc`, change the value of the variable `url` with your db connection string
|
5. Modify the file named `.sequelizerc`, change the value of the variable `url` with your db connection string
|
||||||
For example: `postgres://username:password@localhost:5432/hackmd`
|
For example: `postgres://username:password@localhost:5432/codimd`
|
||||||
6. Run `node_modules/.bin/sequelize db:migrate`, this step will migrate your db to the latest schema
|
6. Run `node_modules/.bin/sequelize db:migrate`, this step will migrate your db to the latest schema
|
||||||
7. Start your whole new server!
|
7. Start your whole new server!
|
||||||
|
|
||||||
|
@ -147,79 +168,84 @@ There are some config settings you need to change in the files below.
|
||||||
| --------- | ------ | ----------- |
|
| --------- | ------ | ----------- |
|
||||||
| `NODE_ENV` | `production` or `development` | set current environment (will apply corresponding settings in the `config.json`) |
|
| `NODE_ENV` | `production` or `development` | set current environment (will apply corresponding settings in the `config.json`) |
|
||||||
| `DEBUG` | `true` or `false` | set debug mode; show more logs |
|
| `DEBUG` | `true` or `false` | set debug mode; show more logs |
|
||||||
| `HMD_DOMAIN` | `hackmd.io` | domain name |
|
| `CMD_DOMAIN` | `codimd.org` | domain name |
|
||||||
| `HMD_URL_PATH` | `hackmd` | sub URL path, like `www.example.com/<URL_PATH>` |
|
| `CMD_URL_PATH` | `codimd` | sub URL path, like `www.example.com/<URL_PATH>` |
|
||||||
| `HMD_PORT` | `80` | web app port |
|
| `CMD_HOST` | `localhost` | host to listen on |
|
||||||
| `HMD_ALLOW_ORIGIN` | `localhost, hackmd.io` | domain name whitelist (use comma to separate) |
|
| `CMD_PORT` | `80` | web app port |
|
||||||
| `HMD_PROTOCOL_USESSL` | `true` or `false` | set to use SSL protocol for resources path (only applied when domain is set) |
|
| `CMD_PATH` | `/var/run/codimd.sock` | path to UNIX domain socket to listen on (if specified, `CMD_HOST` and `CMD_PORT` are ignored) |
|
||||||
| `HMD_URL_ADDPORT` | `true` or `false` | set to add port on callback URL (ports `80` or `443` won't be applied) (only applied when domain is set) |
|
| `CMD_ALLOW_ORIGIN` | `localhost, codimd.org` | domain name whitelist (use comma to separate) |
|
||||||
| `HMD_USECDN` | `true` or `false` | set to use CDN resources or not (default is `true`) |
|
| `CMD_PROTOCOL_USESSL` | `true` or `false` | set to use SSL protocol for resources path (only applied when domain is set) |
|
||||||
| `HMD_ALLOW_ANONYMOUS` | `true` or `false` | set to allow anonymous usage (default is `true`) |
|
| `CMD_URL_ADDPORT` | `true` or `false` | set to add port on callback URL (ports `80` or `443` won't be applied) (only applied when domain is set) |
|
||||||
| `HMD_ALLOW_ANONYMOUS_EDITS` | `true` or `false` | if `allowAnonymous` is `true`, allow users to select `freely` permission, allowing guests to edit existing notes (default is `false`) |
|
| `CMD_USECDN` | `true` or `false` | set to use CDN resources or not (default is `true`) |
|
||||||
| `HMD_ALLOW_FREEURL` | `true` or `false` | set to allow new note creation by accessing a nonexistent note URL |
|
| `CMD_ALLOW_ANONYMOUS` | `true` or `false` | set to allow anonymous usage (default is `true`) |
|
||||||
| `HMD_DEFAULT_PERMISSION` | `freely`, `editable`, `limited`, `locked` or `private` | set notes default permission (only applied on signed users) |
|
| `CMD_ALLOW_ANONYMOUS_EDITS` | `true` or `false` | if `allowAnonymous` is `true`, allow users to select `freely` permission, allowing guests to edit existing notes (default is `false`) |
|
||||||
| `HMD_DB_URL` | `mysql://localhost:3306/database` | set the database URL |
|
| `CMD_ALLOW_FREEURL` | `true` or `false` | set to allow new note creation by accessing a nonexistent note URL |
|
||||||
| `HMD_SESSION_SECRET` | no example | Secret used to sign the session cookie. If non is set, one will randomly generated on startup |
|
| `CMD_DEFAULT_PERMISSION` | `freely`, `editable`, `limited`, `locked` or `private` | set notes default permission (only applied on signed users) |
|
||||||
| `HMD_SESSION_LIFE` | `1209600000` | Session life time. (milliseconds) |
|
| `CMD_DB_URL` | `mysql://localhost:3306/database` | set the database URL |
|
||||||
| `HMD_FACEBOOK_CLIENTID` | no example | Facebook API client id |
|
| `CMD_SESSION_SECRET` | no example | Secret used to sign the session cookie. If non is set, one will randomly generated on startup |
|
||||||
| `HMD_FACEBOOK_CLIENTSECRET` | no example | Facebook API client secret |
|
| `CMD_SESSION_LIFE` | `1209600000` | Session life time. (milliseconds) |
|
||||||
| `HMD_TWITTER_CONSUMERKEY` | no example | Twitter API consumer key |
|
| `CMD_FACEBOOK_CLIENTID` | no example | Facebook API client id |
|
||||||
| `HMD_TWITTER_CONSUMERSECRET` | no example | Twitter API consumer secret |
|
| `CMD_FACEBOOK_CLIENTSECRET` | no example | Facebook API client secret |
|
||||||
| `HMD_GITHUB_CLIENTID` | no example | GitHub API client id |
|
| `CMD_TWITTER_CONSUMERKEY` | no example | Twitter API consumer key |
|
||||||
| `HMD_GITHUB_CLIENTSECRET` | no example | GitHub API client secret |
|
| `CMD_TWITTER_CONSUMERSECRET` | no example | Twitter API consumer secret |
|
||||||
| `HMD_GITLAB_SCOPE` | `read_user` or `api` | GitLab API requested scope (default is `api`) (GitLab snippet import/export need `api` scope) |
|
| `CMD_GITHUB_CLIENTID` | no example | GitHub API client id |
|
||||||
| `HMD_GITLAB_BASEURL` | no example | GitLab authentication endpoint, set to use other endpoint than GitLab.com (optional) |
|
| `CMD_GITHUB_CLIENTSECRET` | no example | GitHub API client secret |
|
||||||
| `HMD_GITLAB_CLIENTID` | no example | GitLab API client id |
|
| `CMD_GITLAB_SCOPE` | `read_user` or `api` | GitLab API requested scope (default is `api`) (GitLab snippet import/export need `api` scope) |
|
||||||
| `HMD_GITLAB_CLIENTSECRET` | no example | GitLab API client secret |
|
| `CMD_GITLAB_BASEURL` | no example | GitLab authentication endpoint, set to use other endpoint than GitLab.com (optional) |
|
||||||
| `HMD_MATTERMOST_BASEURL` | no example | Mattermost authentication endpoint |
|
| `CMD_GITLAB_CLIENTID` | no example | GitLab API client id |
|
||||||
| `HMD_MATTERMOST_CLIENTID` | no example | Mattermost API client id |
|
| `CMD_GITLAB_CLIENTSECRET` | no example | GitLab API client secret |
|
||||||
| `HMD_MATTERMOST_CLIENTSECRET` | no example | Mattermost API client secret |
|
| `CMD_MATTERMOST_BASEURL` | no example | Mattermost authentication endpoint |
|
||||||
| `HMD_DROPBOX_CLIENTID` | no example | Dropbox API client id |
|
| `CMD_MATTERMOST_CLIENTID` | no example | Mattermost API client id |
|
||||||
| `HMD_DROPBOX_CLIENTSECRET` | no example | Dropbox API client secret |
|
| `CMD_MATTERMOST_CLIENTSECRET` | no example | Mattermost API client secret |
|
||||||
| `HMD_GOOGLE_CLIENTID` | no example | Google API client id |
|
| `CMD_DROPBOX_CLIENTID` | no example | Dropbox API client id |
|
||||||
| `HMD_GOOGLE_CLIENTSECRET` | no example | Google API client secret |
|
| `CMD_DROPBOX_CLIENTSECRET` | no example | Dropbox API client secret |
|
||||||
| `HMD_LDAP_URL` | `ldap://example.com` | URL of LDAP server |
|
| `CMD_GOOGLE_CLIENTID` | no example | Google API client id |
|
||||||
| `HMD_LDAP_BINDDN` | no example | bindDn for LDAP access |
|
| `CMD_GOOGLE_CLIENTSECRET` | no example | Google API client secret |
|
||||||
| `HMD_LDAP_BINDCREDENTIALS` | no example | bindCredentials for LDAP access |
|
| `CMD_LDAP_URL` | `ldap://example.com` | URL of LDAP server |
|
||||||
| `HMD_LDAP_SEARCHBASE` | `o=users,dc=example,dc=com` | LDAP directory to begin search from |
|
| `CMD_LDAP_BINDDN` | no example | bindDn for LDAP access |
|
||||||
| `HMD_LDAP_SEARCHFILTER` | `(uid={{username}})` | LDAP filter to search with |
|
| `CMD_LDAP_BINDCREDENTIALS` | no example | bindCredentials for LDAP access |
|
||||||
| `HMD_LDAP_SEARCHATTRIBUTES` | `displayName, mail` | LDAP attributes to search with (use comma to separate) |
|
| `CMD_LDAP_SEARCHBASE` | `o=users,dc=example,dc=com` | LDAP directory to begin search from |
|
||||||
| `HMD_LDAP_USERIDFIELD` | `uidNumber` or `uid` or `sAMAccountName` | The LDAP field which is used uniquely identify a user on HackMD |
|
| `CMD_LDAP_SEARCHFILTER` | `(uid={{username}})` | LDAP filter to search with |
|
||||||
| `HMD_LDAP_USERNAMEFIELD` | Fallback to userid | The LDAP field which is used as the username on HackMD |
|
| `CMD_LDAP_SEARCHATTRIBUTES` | `displayName, mail` | LDAP attributes to search with (use comma to separate) |
|
||||||
| `HMD_LDAP_TLS_CA` | `server-cert.pem, root.pem` | Root CA for LDAP TLS in PEM format (use comma to separate) |
|
| `CMD_LDAP_USERIDFIELD` | `uidNumber` or `uid` or `sAMAccountName` | The LDAP field which is used uniquely identify a user on CodiMD |
|
||||||
| `HMD_LDAP_PROVIDERNAME` | `My institution` | Optional name to be displayed at login form indicating the LDAP provider |
|
| `CMD_LDAP_USERNAMEFIELD` | Fallback to userid | The LDAP field which is used as the username on CodiMD |
|
||||||
| `HMD_SAML_IDPSSOURL` | `https://idp.example.com/sso` | authentication endpoint of IdP. for details, see [guide](docs/guides/auth.md#saml-onelogin). |
|
| `CMD_LDAP_TLS_CA` | `server-cert.pem, root.pem` | Root CA for LDAP TLS in PEM format (use comma to separate) |
|
||||||
| `HMD_SAML_IDPCERT` | `/path/to/cert.pem` | certificate file path of IdP in PEM format |
|
| `CMD_LDAP_PROVIDERNAME` | `My institution` | Optional name to be displayed at login form indicating the LDAP provider |
|
||||||
| `HMD_SAML_ISSUER` | no example | identity of the service provider (optional, default: serverurl)" |
|
| `CMD_SAML_IDPSSOURL` | `https://idp.example.com/sso` | authentication endpoint of IdP. for details, see [guide](docs/guides/auth.md#saml-onelogin). |
|
||||||
| `HMD_SAML_IDENTIFIERFORMAT` | no example | name identifier format (optional, default: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`) |
|
| `CMD_SAML_IDPCERT` | `/path/to/cert.pem` | certificate file path of IdP in PEM format |
|
||||||
| `HMD_SAML_GROUPATTRIBUTE` | `memberOf` | attribute name for group list (optional) |
|
| `CMD_SAML_ISSUER` | no example | identity of the service provider (optional, default: serverurl)" |
|
||||||
| `HMD_SAML_REQUIREDGROUPS` | `Hackmd-users` | group names that allowed (use vertical bar to separate) (optional) |
|
| `CMD_SAML_IDENTIFIERFORMAT` | no example | name identifier format (optional, default: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`) |
|
||||||
| `HMD_SAML_EXTERNALGROUPS` | `Temporary-staff` | group names that not allowed (use vertical bar to separate) (optional) |
|
| `CMD_SAML_GROUPATTRIBUTE` | `memberOf` | attribute name for group list (optional) |
|
||||||
| `HMD_SAML_ATTRIBUTE_ID` | `sAMAccountName` | attribute map for `id` (optional, default: NameID of SAML response) |
|
| `CMD_SAML_REQUIREDGROUPS` | `Hackmd-users` | group names that allowed (use vertical bar to separate) (optional) |
|
||||||
| `HMD_SAML_ATTRIBUTE_USERNAME` | `mailNickname` | attribute map for `username` (optional, default: NameID of SAML response) |
|
| `CMD_SAML_EXTERNALGROUPS` | `Temporary-staff` | group names that not allowed (use vertical bar to separate) (optional) |
|
||||||
| `HMD_SAML_ATTRIBUTE_EMAIL` | `mail` | attribute map for `email` (optional, default: NameID of SAML response if `HMD_SAML_IDENTIFIERFORMAT` is default) |
|
| `CMD_SAML_ATTRIBUTE_ID` | `sAMAccountName` | attribute map for `id` (optional, default: NameID of SAML response) |
|
||||||
| `HMD_IMGUR_CLIENTID` | no example | Imgur API client id |
|
| `CMD_SAML_ATTRIBUTE_USERNAME` | `mailNickname` | attribute map for `username` (optional, default: NameID of SAML response) |
|
||||||
| `HMD_EMAIL` | `true` or `false` | set to allow email signin |
|
| `CMD_SAML_ATTRIBUTE_EMAIL` | `mail` | attribute map for `email` (optional, default: NameID of SAML response if `CMD_SAML_IDENTIFIERFORMAT` is default) |
|
||||||
| `HMD_ALLOW_PDF_EXPORT` | `true` or `false` | Enable or disable PDF exports |
|
| `CMD_IMGUR_CLIENTID` | no example | Imgur API client id |
|
||||||
| `HMD_ALLOW_EMAIL_REGISTER` | `true` or `false` | set to allow email register (only applied when email is set, default is `true`. Note `bin/manage_users` might help you if registration is `false`.) |
|
| `CMD_EMAIL` | `true` or `false` | set to allow email signin |
|
||||||
| `HMD_IMAGE_UPLOAD_TYPE` | `imgur`, `s3`, `minio` or `filesystem` | Where to upload image. For S3, see our Image Upload Guides for [S3](docs/guides/s3-image-upload.md) or [Minio](docs/guides/minio-image-upload.md) |
|
| `CMD_ALLOW_PDF_EXPORT` | `true` or `false` | Enable or disable PDF exports |
|
||||||
| `HMD_S3_ACCESS_KEY_ID` | no example | AWS access key id |
|
| `CMD_ALLOW_EMAIL_REGISTER` | `true` or `false` | set to allow email register (only applied when email is set, default is `true`. Note `bin/manage_users` might help you if registration is `false`.) |
|
||||||
| `HMD_S3_SECRET_ACCESS_KEY` | no example | AWS secret key |
|
| `CMD_ALLOW_GRAVATAR` | `true` or `false` | set to `false` to disable gravatar as profile picture source on your instance |
|
||||||
| `HMD_S3_REGION` | `ap-northeast-1` | AWS S3 region |
|
| `CMD_IMAGE_UPLOAD_TYPE` | `imgur`, `s3`, `minio` or `filesystem` | Where to upload images. For S3, see our Image Upload Guides for [S3](docs/guides/s3-image-upload.md) or [Minio](docs/guides/minio-image-upload.md) |
|
||||||
| `HMD_S3_BUCKET` | no example | AWS S3 bucket name |
|
| `CMD_S3_ACCESS_KEY_ID` | no example | AWS access key id |
|
||||||
| `HMD_MINIO_ACCESS_KEY` | no example | Minio access key |
|
| `CMD_S3_SECRET_ACCESS_KEY` | no example | AWS secret key |
|
||||||
| `HMD_MINIO_SECRET_KEY` | no example | Minio secret key |
|
| `CMD_S3_REGION` | `ap-northeast-1` | AWS S3 region |
|
||||||
| `HMD_MINIO_ENDPOINT` | `minio.example.org` | Address of your Minio endpoint/instance |
|
| `CMD_S3_BUCKET` | no example | AWS S3 bucket name |
|
||||||
| `HMD_MINIO_PORT` | `9000` | Port that is used for your Minio instance |
|
| `CMD_MINIO_ACCESS_KEY` | no example | Minio access key |
|
||||||
| `HMD_MINIO_SECURE` | `true` | If set to `true` HTTPS is used for Minio |
|
| `CMD_MINIO_SECRET_KEY` | no example | Minio secret key |
|
||||||
| `HMD_AZURE_CONNECTION_STRING` | no example | Azure Blob Storage connection string |
|
| `CMD_MINIO_ENDPOINT` | `minio.example.org` | Address of your Minio endpoint/instance |
|
||||||
| `HMD_AZURE_CONTAINER` | no example | Azure Blob Storage container name (automatically created if non existent) |
|
| `CMD_MINIO_PORT` | `9000` | Port that is used for your Minio instance |
|
||||||
| `HMD_HSTS_ENABLE` | ` true` | set to enable [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) if HTTPS is also enabled (default is ` true`) |
|
| `CMD_MINIO_SECURE` | `true` | If set to `true` HTTPS is used for Minio |
|
||||||
| `HMD_HSTS_INCLUDE_SUBDOMAINS` | `true` | set to include subdomains in HSTS (default is `true`) |
|
| `CMD_AZURE_CONNECTION_STRING` | no example | Azure Blob Storage connection string |
|
||||||
| `HMD_HSTS_MAX_AGE` | `31536000` | max duration in seconds to tell clients to keep HSTS status (default is a year) |
|
| `CMD_AZURE_CONTAINER` | no example | Azure Blob Storage container name (automatically created if non existent) |
|
||||||
| `HMD_HSTS_PRELOAD` | `true` | whether to allow preloading of the site's HSTS status (e.g. into browsers) |
|
| `CMD_HSTS_ENABLE` | ` true` | set to enable [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) if HTTPS is also enabled (default is ` true`) |
|
||||||
| `HMD_CSP_ENABLE` | `true` | whether to enable Content Security Policy (directives cannot be configured with environment variables) |
|
| `CMD_HSTS_INCLUDE_SUBDOMAINS` | `true` | set to include subdomains in HSTS (default is `true`) |
|
||||||
| `HMD_CSP_REPORTURI` | `https://<someid>.report-uri.com/r/d/csp/enforce` | Allows to add a URL for CSP reports in case of violations |
|
| `CMD_HSTS_MAX_AGE` | `31536000` | max duration in seconds to tell clients to keep HSTS status (default is a year) |
|
||||||
|
| `CMD_HSTS_PRELOAD` | `true` | whether to allow preloading of the site's HSTS status (e.g. into browsers) |
|
||||||
|
| `CMD_CSP_ENABLE` | `true` | whether to enable Content Security Policy (directives cannot be configured with environment variables) |
|
||||||
|
| `CMD_CSP_REPORTURI` | `https://<someid>.report-uri.com/r/d/csp/enforce` | Allows to add a URL for CSP reports in case of violations |
|
||||||
|
|
||||||
|
***Note:** Due to the rename process we renamed all `HMD_`-prefix variables to be `CMD_`-prefixed. The old ones continue to work.*
|
||||||
|
|
||||||
## Application settings `config.json`
|
## Application settings `config.json`
|
||||||
|
|
||||||
|
@ -227,8 +253,10 @@ There are some config settings you need to change in the files below.
|
||||||
| --------- | ------ | ----------- |
|
| --------- | ------ | ----------- |
|
||||||
| `debug` | `true` or `false` | set debug mode, show more logs |
|
| `debug` | `true` or `false` | set debug mode, show more logs |
|
||||||
| `domain` | `localhost` | domain name |
|
| `domain` | `localhost` | domain name |
|
||||||
| `urlPath` | `hackmd` | sub URL path, like `www.example.com/<urlpath>` |
|
| `urlPath` | `codimd` | sub URL path, like `www.example.com/<urlpath>` |
|
||||||
|
| `host` | `localhost` | host to listen on |
|
||||||
| `port` | `80` | web app port |
|
| `port` | `80` | web app port |
|
||||||
|
| `path` | `/var/run/codimd.sock` | path to UNIX domain socket to listen on (if specified, `host` and `port` are ignored) |
|
||||||
| `allowOrigin` | `['localhost']` | domain name whitelist |
|
| `allowOrigin` | `['localhost']` | domain name whitelist |
|
||||||
| `useSSL` | `true` or `false` | set to use SSL server (if `true`, will auto turn on `protocolUseSSL`) |
|
| `useSSL` | `true` or `false` | set to use SSL server (if `true`, will auto turn on `protocolUseSSL`) |
|
||||||
| `hsts` | `{"enable": true, "maxAgeSeconds": 31536000, "includeSubdomains": true, "preload": true}` | [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) options to use with HTTPS (default is the example value, max age is a year) |
|
| `hsts` | `{"enable": true, "maxAgeSeconds": 31536000, "includeSubdomains": true, "preload": true}` | [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) options to use with HTTPS (default is the example value, max age is a year) |
|
||||||
|
@ -241,9 +269,9 @@ There are some config settings you need to change in the files below.
|
||||||
| `allowFreeURL` | `true` or `false` | set to allow new note creation by accessing a nonexistent note URL |
|
| `allowFreeURL` | `true` or `false` | set to allow new note creation by accessing a nonexistent note URL |
|
||||||
| `defaultPermission` | `freely`, `editable`, `limited`, `locked`, `protected` or `private` | set notes default permission (only applied on signed users) |
|
| `defaultPermission` | `freely`, `editable`, `limited`, `locked`, `protected` or `private` | set notes default permission (only applied on signed users) |
|
||||||
| `dbURL` | `mysql://localhost:3306/database` | set the db URL; if set, then db config (below) won't be applied |
|
| `dbURL` | `mysql://localhost:3306/database` | set the db URL; if set, then db config (below) won't be applied |
|
||||||
| `db` | `{ "dialect": "sqlite", "storage": "./db.hackmd.sqlite" }` | set the db configs, [see more here](http://sequelize.readthedocs.org/en/latest/api/sequelize/) |
|
| `db` | `{ "dialect": "sqlite", "storage": "./db.codimd.sqlite" }` | set the db configs, [see more here](http://sequelize.readthedocs.org/en/latest/api/sequelize/) |
|
||||||
| `sslKeyPath` | `./cert/client.key` | SSL key path (only need when you set `useSSL`) |
|
| `sslKeyPath` | `./cert/client.key` | SSL key path (only need when you set `useSSL`) |
|
||||||
| `sslCertPath` | `./cert/hackmd_io.crt` | SSL cert path (only need when you set `useSSL`) |
|
| `sslCertPath` | `./cert/codimd_io.crt` | SSL cert path (only need when you set `useSSL`) |
|
||||||
| `sslCAPath` | `['./cert/COMODORSAAddTrustCA.crt']` | SSL ca chain (only need when you set `useSSL`) |
|
| `sslCAPath` | `['./cert/COMODORSAAddTrustCA.crt']` | SSL ca chain (only need when you set `useSSL`) |
|
||||||
| `dhParamPath` | `./cert/dhparam.pem` | SSL dhparam path (only need when you set `useSSL`) |
|
| `dhParamPath` | `./cert/dhparam.pem` | SSL dhparam path (only need when you set `useSSL`) |
|
||||||
| `tmpPath` | `./tmp/` | temp directory path |
|
| `tmpPath` | `./tmp/` | temp directory path |
|
||||||
|
@ -254,6 +282,7 @@ There are some config settings you need to change in the files below.
|
||||||
| `errorPath` | `./public/views/error.ejs` | error template file path |
|
| `errorPath` | `./public/views/error.ejs` | error template file path |
|
||||||
| `prettyPath` | `./public/views/pretty.ejs` | pretty template file path |
|
| `prettyPath` | `./public/views/pretty.ejs` | pretty template file path |
|
||||||
| `slidePath` | `./public/views/slide.hbs` | slide template file path |
|
| `slidePath` | `./public/views/slide.hbs` | slide template file path |
|
||||||
|
| `uploadsPath` | `./public/uploads` | uploads directory - needs to be persistent when you use imageUploadType `filesystem` |
|
||||||
| `sessionName` | `connect.sid` | cookie session name |
|
| `sessionName` | `connect.sid` | cookie session name |
|
||||||
| `sessionSecret` | `secret` | cookie session secret |
|
| `sessionSecret` | `secret` | cookie session secret |
|
||||||
| `sessionLife` | `14 * 24 * 60 * 60 * 1000` | cookie session life |
|
| `sessionLife` | `14 * 24 * 60 * 60 * 1000` | cookie session life |
|
||||||
|
@ -263,7 +292,8 @@ There are some config settings you need to change in the files below.
|
||||||
| `documentMaxLength` | `100000` | note max length |
|
| `documentMaxLength` | `100000` | note max length |
|
||||||
| `email` | `true` or `false` | set to allow email signin |
|
| `email` | `true` or `false` | set to allow email signin |
|
||||||
| `allowEmailRegister` | `true` or `false` | set to allow email register (only applied when email is set, default is `true`. Note `bin/manage_users` might help you if registration is `false`.) |
|
| `allowEmailRegister` | `true` or `false` | set to allow email register (only applied when email is set, default is `true`. Note `bin/manage_users` might help you if registration is `false`.) |
|
||||||
| `imageUploadType` | `imgur`(default), `s3`, `minio`, `azure` or `filesystem` | Where to upload image
|
| `allowGravatar` | `true` or `false` | set to `false` to disable gravatar as profile picture source on your instance |
|
||||||
|
| `imageUploadType` | `imgur`, `s3`, `minio`, `azure` or `filesystem`(default) | Where to upload images. For S3, see our Image Upload Guides for [S3](docs/guides/s3-image-upload.md) or [Minio](docs/guides/minio-image-upload.md)|
|
||||||
| `minio` | `{ "accessKey": "YOUR_MINIO_ACCESS_KEY", "secretKey": "YOUR_MINIO_SECRET_KEY", "endpoint": "YOUR_MINIO_HOST", port: 9000, secure: true }` | When `imageUploadType` is set to `minio`, you need to set this key. Also checkout our [Minio Image Upload Guide](docs/guides/minio-image-upload.md) |
|
| `minio` | `{ "accessKey": "YOUR_MINIO_ACCESS_KEY", "secretKey": "YOUR_MINIO_SECRET_KEY", "endpoint": "YOUR_MINIO_HOST", port: 9000, secure: true }` | When `imageUploadType` is set to `minio`, you need to set this key. Also checkout our [Minio Image Upload Guide](docs/guides/minio-image-upload.md) |
|
||||||
| `s3` | `{ "accessKeyId": "YOUR_S3_ACCESS_KEY_ID", "secretAccessKey": "YOUR_S3_ACCESS_KEY", "region": "YOUR_S3_REGION" }` | When `imageuploadtype` be set to `s3`, you would also need to setup this key, check our [S3 Image Upload Guide](docs/guides/s3-image-upload.md) |
|
| `s3` | `{ "accessKeyId": "YOUR_S3_ACCESS_KEY_ID", "secretAccessKey": "YOUR_S3_ACCESS_KEY", "region": "YOUR_S3_REGION" }` | When `imageuploadtype` be set to `s3`, you would also need to setup this key, check our [S3 Image Upload Guide](docs/guides/s3-image-upload.md) |
|
||||||
| `s3bucket` | `YOUR_S3_BUCKET_NAME` | bucket name when `imageUploadType` is set to `s3` or `minio` |
|
| `s3bucket` | `YOUR_S3_BUCKET_NAME` | bucket name when `imageUploadType` is set to `s3` or `minio` |
|
||||||
|
@ -294,7 +324,7 @@ There are some config settings you need to change in the files below.
|
||||||
## Structure
|
## Structure
|
||||||
|
|
||||||
```text
|
```text
|
||||||
hackmd/
|
codimd/
|
||||||
├── tmp/ --- temporary files
|
├── tmp/ --- temporary files
|
||||||
├── docs/ --- document files
|
├── docs/ --- document files
|
||||||
├── lib/ --- server libraries
|
├── lib/ --- server libraries
|
||||||
|
@ -320,15 +350,15 @@ See more at [http://operational-transformation.github.io/](http://operational-tr
|
||||||
|
|
||||||
[gitter-image]: https://badges.gitter.im/Join%20Chat.svg
|
[gitter-image]: https://badges.gitter.im/Join%20Chat.svg
|
||||||
[gitter-url]: https://gitter.im/hackmdio/hackmd?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
[gitter-url]: https://gitter.im/hackmdio/hackmd?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
||||||
[matrix.org-image]: https://img.shields.io/badge/Matrix.org-%23HackMD@matrix.org-green.svg
|
[matrix.org-image]: https://img.shields.io/badge/Matrix.org-%23CodiMD@matrix.org-green.svg
|
||||||
[matrix.org-url]: https://riot.im/app/#/room/#hackmd:matrix.org
|
[matrix.org-url]: https://riot.im/app/#/room/#codimd:matrix.org
|
||||||
[travis-image]: https://travis-ci.org/hackmdio/hackmd.svg?branch=master
|
[travis-image]: https://travis-ci.org/hackmdio/codimd.svg?branch=master
|
||||||
[travis-url]: https://travis-ci.org/hackmdio/hackmd
|
[travis-url]: https://travis-ci.org/hackmdio/codimd
|
||||||
[github-version-badge]: https://img.shields.io/github/release/hackmdio/hackmd.svg
|
[github-version-badge]: https://img.shields.io/github/release/hackmdio/codimd.svg
|
||||||
[github-release-page]: https://github.com/hackmdio/hackmd/releases
|
[github-release-page]: https://github.com/hackmdio/codimd/releases
|
||||||
[standardjs-image]: https://cdn.rawgit.com/feross/standard/master/badge.svg
|
[standardjs-image]: https://cdn.rawgit.com/feross/standard/master/badge.svg
|
||||||
[standardjs-url]: https://github.com/feross/standard
|
[standardjs-url]: https://github.com/feross/standard
|
||||||
[codetriage-image]: https://www.codetriage.com/hackmdio/hackmd/badges/users.svg
|
[codetriage-image]: https://www.codetriage.com/hackmdio/codimd/badges/users.svg
|
||||||
[codetriage-url]: https://www.codetriage.com/hackmdio/hackmd
|
[codetriage-url]: https://www.codetriage.com/hackmdio/codimd
|
||||||
[poeditor-image]: https://img.shields.io/badge/POEditor-translate-blue.svg
|
[poeditor-image]: https://img.shields.io/badge/POEditor-translate-blue.svg
|
||||||
[poeditor-url]: https://poeditor.com/join/project/1OpGjF2Jir
|
[poeditor-url]: https://poeditor.com/join/project/1OpGjF2Jir
|
||||||
|
|
37
app.js
37
app.js
|
@ -26,22 +26,6 @@ var response = require('./lib/response')
|
||||||
var models = require('./lib/models')
|
var models = require('./lib/models')
|
||||||
var csp = require('./lib/csp')
|
var csp = require('./lib/csp')
|
||||||
|
|
||||||
// generate front-end constants by template
|
|
||||||
var constpath = path.join(__dirname, './public/js/lib/common/constant.ejs')
|
|
||||||
var data = {
|
|
||||||
domain: config.domain,
|
|
||||||
urlpath: config.urlPath,
|
|
||||||
debug: config.debug,
|
|
||||||
version: config.version,
|
|
||||||
DROPBOX_APP_KEY: config.dropbox.appKey,
|
|
||||||
allowedUploadMimeTypes: config.allowedUploadMimeTypes
|
|
||||||
}
|
|
||||||
|
|
||||||
ejs.renderFile(constpath, data, {}, function (err, str) {
|
|
||||||
if (err) throw new Error(err)
|
|
||||||
fs.writeFileSync(path.join(__dirname, './public/build/constant.js'), str)
|
|
||||||
})
|
|
||||||
|
|
||||||
// server setup
|
// server setup
|
||||||
var app = express()
|
var app = express()
|
||||||
var server = null
|
var server = null
|
||||||
|
@ -129,7 +113,7 @@ if (config.csp.enable) {
|
||||||
}
|
}
|
||||||
|
|
||||||
i18n.configure({
|
i18n.configure({
|
||||||
locales: ['en', 'zh', 'zh-CN', 'zh-TW', 'fr', 'de', 'ja', 'es', 'ca', 'el', 'pt', 'it', 'tr', 'ru', 'nl', 'hr', 'pl', 'uk', 'hi', 'sv', 'eo', 'da', 'ko'],
|
locales: ['en', 'zh-CN', 'zh-TW', 'fr', 'de', 'ja', 'es', 'ca', 'el', 'pt', 'it', 'tr', 'ru', 'nl', 'hr', 'pl', 'uk', 'hi', 'sv', 'eo', 'da', 'ko'],
|
||||||
cookie: 'locale',
|
cookie: 'locale',
|
||||||
directory: path.join(__dirname, '/locales'),
|
directory: path.join(__dirname, '/locales'),
|
||||||
updateFiles: config.updateI18nFiles
|
updateFiles: config.updateI18nFiles
|
||||||
|
@ -179,6 +163,7 @@ app.use(passport.session())
|
||||||
app.use(require('./lib/web/middleware/checkURIValid'))
|
app.use(require('./lib/web/middleware/checkURIValid'))
|
||||||
// redirect url without trailing slashes
|
// redirect url without trailing slashes
|
||||||
app.use(require('./lib/web/middleware/redirectWithoutTrailingSlashes'))
|
app.use(require('./lib/web/middleware/redirectWithoutTrailingSlashes'))
|
||||||
|
app.use(require('./lib/web/middleware/codiMDVersion'))
|
||||||
|
|
||||||
// routes need sessions
|
// routes need sessions
|
||||||
// template files
|
// template files
|
||||||
|
@ -220,11 +205,21 @@ io.sockets.on('connection', realtime.connection)
|
||||||
|
|
||||||
// listen
|
// listen
|
||||||
function startListen () {
|
function startListen () {
|
||||||
server.listen(config.port, function () {
|
var address
|
||||||
|
var listenCallback = function () {
|
||||||
var schema = config.useSSL ? 'HTTPS' : 'HTTP'
|
var schema = config.useSSL ? 'HTTPS' : 'HTTP'
|
||||||
logger.info('%s Server listening at port %d', schema, config.port)
|
logger.info('%s Server listening at %s', schema, address)
|
||||||
realtime.maintenance = false
|
realtime.maintenance = false
|
||||||
})
|
}
|
||||||
|
|
||||||
|
// use unix domain socket if 'path' is specified
|
||||||
|
if (config.path) {
|
||||||
|
address = config.path
|
||||||
|
server.listen(config.path, listenCallback)
|
||||||
|
} else {
|
||||||
|
address = config.host + ':' + config.port
|
||||||
|
server.listen(config.port, config.host, listenCallback)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync db then start listen
|
// sync db then start listen
|
||||||
|
@ -250,7 +245,7 @@ process.on('uncaughtException', function (err) {
|
||||||
|
|
||||||
// install exit handler
|
// install exit handler
|
||||||
function handleTermSignals () {
|
function handleTermSignals () {
|
||||||
logger.info('hackmd has been killed by signal, try to exit gracefully...')
|
logger.info('CodiMD has been killed by signal, try to exit gracefully...')
|
||||||
realtime.maintenance = true
|
realtime.maintenance = true
|
||||||
// disconnect all socket.io clients
|
// disconnect all socket.io clients
|
||||||
Object.keys(io.sockets.sockets).forEach(function (key) {
|
Object.keys(io.sockets.sockets).forEach(function (key) {
|
||||||
|
|
6
app.json
6
app.json
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "HackMD",
|
"name": "CodiMD",
|
||||||
"description": "Realtime collaborative markdown notes on all platforms",
|
"description": "Realtime collaborative markdown notes on all platforms",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Collaborative",
|
"Collaborative",
|
||||||
|
@ -7,8 +7,8 @@
|
||||||
"Notes"
|
"Notes"
|
||||||
],
|
],
|
||||||
"website": "https://hackmd.io",
|
"website": "https://hackmd.io",
|
||||||
"repository": "https://github.com/hackmdio/hackmd",
|
"repository": "https://github.com/hackmdio/codimd",
|
||||||
"logo": "https://github.com/hackmdio/hackmd/raw/master/public/hackmd-icon-1024.png",
|
"logo": "https://github.com/hackmdio/codimd/raw/master/public/codimd-icon-1024.png",
|
||||||
"success_url": "/",
|
"success_url": "/",
|
||||||
"env": {
|
"env": {
|
||||||
"BUILD_ASSETS": {
|
"BUILD_ASSETS": {
|
||||||
|
|
|
@ -33,11 +33,10 @@ BUILD_ASSETS=false npm install
|
||||||
cat << EOF
|
cat << EOF
|
||||||
|
|
||||||
|
|
||||||
Edit the following config file to setup hackmd server and client.
|
Edit the following config file to setup CodiMD server and client.
|
||||||
Read more info at https://github.com/hackmdio/hackmd#configuration-files
|
Read more info at https://github.com/hackmdio/codimd#configuration-files
|
||||||
|
|
||||||
* config.json -- server config
|
* config.json -- CodiMD config
|
||||||
* public/js/config.js -- client config
|
|
||||||
* .sequelizerc -- db config
|
* .sequelizerc -- db config
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
},
|
},
|
||||||
"db": {
|
"db": {
|
||||||
"dialect": "sqlite",
|
"dialect": "sqlite",
|
||||||
"storage": "./db.hackmd.sqlite"
|
"storage": "./db.codimd.sqlite"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"production": {
|
"production": {
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
"db": {
|
"db": {
|
||||||
"username": "",
|
"username": "",
|
||||||
"password": "",
|
"password": "",
|
||||||
"database": "hackmd",
|
"database": "codimd",
|
||||||
"host": "localhost",
|
"host": "localhost",
|
||||||
"port": "5432",
|
"port": "5432",
|
||||||
"dialect": "postgres"
|
"dialect": "postgres"
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
Authentication guide - GitHub
|
Authentication guide - GitHub
|
||||||
===
|
===
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
1. Sign-in or sign-up for a GitHub account
|
1. Sign-in or sign-up for a GitHub account
|
||||||
2. Navigate to developer settings in your GitHub account [here](https://github.com/settings/developers) and select the "OAuth Apps" tab
|
2. Navigate to developer settings in your GitHub account [here](https://github.com/settings/developers) and select the "OAuth Apps" tab
|
||||||
3. Click on the **New OAuth App** button, to create a new OAuth App:
|
3. Click on the **New OAuth App** button, to create a new OAuth App:
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
# GitLab (self-hosted)
|
# GitLab (self-hosted)
|
||||||
===
|
===
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
1. Sign in to your GitLab
|
1. Sign in to your GitLab
|
||||||
2. Navigate to the application management page at `https://your.gitlab.domain/admin/applications` (admin permissions required)
|
2. Navigate to the application management page at `https://your.gitlab.domain/admin/applications` (admin permissions required)
|
||||||
3. Click **New application** to create a new application and fill out the registration form:
|
3. Click **New application** to create a new application and fill out the registration form:
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
Authentication guide - SAML (OneLogin)
|
Authentication guide - SAML (OneLogin)
|
||||||
===
|
===
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
1. Sign-in or sign-up for an OneLogin account. (available free trial for 2 weeks)
|
1. Sign-in or sign-up for an OneLogin account. (available free trial for 2 weeks)
|
||||||
2. Go to the administration page.
|
2. Go to the administration page.
|
||||||
3. Select the **APPS** menu and click on the **Add Apps**.
|
3. Select the **APPS** menu and click on the **Add Apps**.
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
Authentication guide - SAML
|
Authentication guide - SAML
|
||||||
===
|
===
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
The basic procedure is the same as the case of OneLogin which is mentioned in [OneLogin-Guide](./saml-onelogin.md). If you want to match your IdP, you can use more configurations as below.
|
The basic procedure is the same as the case of OneLogin which is mentioned in [OneLogin-Guide](./saml-onelogin.md). If you want to match your IdP, you can use more configurations as below.
|
||||||
|
|
||||||
* If your IdP accepts metadata XML of the service provider to ease configuraion, use this url to download metadata XML.
|
* If your IdP accepts metadata XML of the service provider to ease configuraion, use this url to download metadata XML.
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
Authentication guide - Twitter
|
Authentication guide - Twitter
|
||||||
===
|
===
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
1. Sign-in or sign-up for a Twitter account
|
1. Sign-in or sign-up for a Twitter account
|
||||||
2. Go to the Twitter Application management page [here](https://apps.twitter.com/)
|
2. Go to the Twitter Application management page [here](https://apps.twitter.com/)
|
||||||
3. Click on the **Create New App** button to create a new Twitter app:
|
3. Click on the **Create New App** button to create a new Twitter app:
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
Minio Guide for HackMD
|
Minio Guide for CodiMD
|
||||||
===
|
===
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
1. First of all you need to setup Minio itself.
|
1. First of all you need to setup Minio itself.
|
||||||
|
|
||||||
Please refer to the [official Minio docs](https://docs.minio.io/) for an
|
Please refer to the [official Minio docs](https://docs.minio.io/) for an
|
||||||
|
|
17
docs/guides/providing-terms.md
Normal file
17
docs/guides/providing-terms.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
Setup your terms of use
|
||||||
|
===
|
||||||
|
|
||||||
|
To setup your terms of use, you need to provide a document called `terms-of-use.md` which contains them. Of course written in Markdown.
|
||||||
|
|
||||||
|
It has to be provided under `./public/docs/` and will be automatically turned into a CodiMD document. It will also automatically updated as soon as you change the document on disk.
|
||||||
|
|
||||||
|
As soon as the file exists a link will show up in the bottom part along with the release notes and link to them.
|
||||||
|
|
||||||
|
Setup your privacy policy
|
||||||
|
===
|
||||||
|
|
||||||
|
To add a privacy policy you can use the same technique as for the terms of use. The main difference is that the document is called `privacy.md`.
|
||||||
|
|
||||||
|
See our example file `./public/docs/privacy.md.example` container some useful hints for writing your own privacy policy.
|
||||||
|
|
||||||
|
As with the terms of use, a link to the privacy notices will show up in the area where the release notes are provided on the index page.
|
|
@ -1,4 +1,6 @@
|
||||||
# Guide - Setup HackMD S3 image upload
|
# Guide - Setup CodiMD S3 image upload
|
||||||
|
|
||||||
|
***Note:** This guide was written before the renaming. Just replace `HackMD` with `CodiMD` in your mind :smile: thanks!*
|
||||||
|
|
||||||
1. Go to [AWS S3 console](https://console.aws.amazon.com/s3/home) and create a new bucket.
|
1. Go to [AWS S3 console](https://console.aws.amazon.com/s3/home) and create a new bucket.
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
domain: '',
|
domain: '',
|
||||||
urlPath: '',
|
urlPath: '',
|
||||||
|
host: '0.0.0.0',
|
||||||
port: 3000,
|
port: 3000,
|
||||||
urlAddPort: false,
|
urlAddPort: false,
|
||||||
allowOrigin: ['localhost'],
|
allowOrigin: ['localhost'],
|
||||||
|
@ -41,10 +42,12 @@ module.exports = {
|
||||||
defaultNotePath: './public/default.md',
|
defaultNotePath: './public/default.md',
|
||||||
docsPath: './public/docs',
|
docsPath: './public/docs',
|
||||||
indexPath: './public/views/index.ejs',
|
indexPath: './public/views/index.ejs',
|
||||||
hackmdPath: './public/views/hackmd.ejs',
|
codimdPath: './public/views/codimd.ejs',
|
||||||
errorPath: './public/views/error.ejs',
|
errorPath: './public/views/error.ejs',
|
||||||
prettyPath: './public/views/pretty.ejs',
|
prettyPath: './public/views/pretty.ejs',
|
||||||
slidePath: './public/views/slide.ejs',
|
slidePath: './public/views/slide.ejs',
|
||||||
|
constantsPath: './public/js/lib/common/constant.ejs',
|
||||||
|
uploadsPath: './public/uploads',
|
||||||
// session
|
// session
|
||||||
sessionName: 'connect.sid',
|
sessionName: 'connect.sid',
|
||||||
sessionSecret: 'secret',
|
sessionSecret: 'secret',
|
||||||
|
@ -145,5 +148,6 @@ module.exports = {
|
||||||
},
|
},
|
||||||
email: true,
|
email: true,
|
||||||
allowEmailRegister: true,
|
allowEmailRegister: true,
|
||||||
|
allowGravatar: true,
|
||||||
allowPDFExport: true
|
allowPDFExport: true
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,122 +3,125 @@
|
||||||
const {toBooleanConfig, toArrayConfig, toIntegerConfig} = require('./utils')
|
const {toBooleanConfig, toArrayConfig, toIntegerConfig} = require('./utils')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
domain: process.env.HMD_DOMAIN,
|
domain: process.env.CMD_DOMAIN,
|
||||||
urlPath: process.env.HMD_URL_PATH,
|
urlPath: process.env.CMD_URL_PATH,
|
||||||
port: toIntegerConfig(process.env.HMD_PORT),
|
host: process.env.CMD_HOST,
|
||||||
urlAddPort: toBooleanConfig(process.env.HMD_URL_ADDPORT),
|
port: toIntegerConfig(process.env.CMD_PORT),
|
||||||
useSSL: toBooleanConfig(process.env.HMD_USESSL),
|
path: process.env.CMD_PATH,
|
||||||
|
urlAddPort: toBooleanConfig(process.env.CMD_URL_ADDPORT),
|
||||||
|
useSSL: toBooleanConfig(process.env.CMD_USESSL),
|
||||||
hsts: {
|
hsts: {
|
||||||
enable: toBooleanConfig(process.env.HMD_HSTS_ENABLE),
|
enable: toBooleanConfig(process.env.CMD_HSTS_ENABLE),
|
||||||
maxAgeSeconds: process.env.HMD_HSTS_MAX_AGE,
|
maxAgeSeconds: process.env.CMD_HSTS_MAX_AGE,
|
||||||
includeSubdomains: toBooleanConfig(process.env.HMD_HSTS_INCLUDE_SUBDOMAINS),
|
includeSubdomains: toBooleanConfig(process.env.CMD_HSTS_INCLUDE_SUBDOMAINS),
|
||||||
preload: toBooleanConfig(process.env.HMD_HSTS_PRELOAD)
|
preload: toBooleanConfig(process.env.CMD_HSTS_PRELOAD)
|
||||||
},
|
},
|
||||||
csp: {
|
csp: {
|
||||||
enable: toBooleanConfig(process.env.HMD_CSP_ENABLE),
|
enable: toBooleanConfig(process.env.CMD_CSP_ENABLE),
|
||||||
reportURI: process.env.HMD_CSP_REPORTURI
|
reportURI: process.env.CMD_CSP_REPORTURI
|
||||||
},
|
},
|
||||||
protocolUseSSL: toBooleanConfig(process.env.HMD_PROTOCOL_USESSL),
|
protocolUseSSL: toBooleanConfig(process.env.CMD_PROTOCOL_USESSL),
|
||||||
allowOrigin: toArrayConfig(process.env.HMD_ALLOW_ORIGIN),
|
allowOrigin: toArrayConfig(process.env.CMD_ALLOW_ORIGIN),
|
||||||
useCDN: toBooleanConfig(process.env.HMD_USECDN),
|
useCDN: toBooleanConfig(process.env.CMD_USECDN),
|
||||||
allowAnonymous: toBooleanConfig(process.env.HMD_ALLOW_ANONYMOUS),
|
allowAnonymous: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS),
|
||||||
allowAnonymousEdits: toBooleanConfig(process.env.HMD_ALLOW_ANONYMOUS_EDITS),
|
allowAnonymousEdits: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS_EDITS),
|
||||||
allowFreeURL: toBooleanConfig(process.env.HMD_ALLOW_FREEURL),
|
allowFreeURL: toBooleanConfig(process.env.CMD_ALLOW_FREEURL),
|
||||||
defaultPermission: process.env.HMD_DEFAULT_PERMISSION,
|
defaultPermission: process.env.CMD_DEFAULT_PERMISSION,
|
||||||
dbURL: process.env.HMD_DB_URL,
|
dbURL: process.env.CMD_DB_URL,
|
||||||
sessionSecret: process.env.HMD_SESSION_SECRET,
|
sessionSecret: process.env.CMD_SESSION_SECRET,
|
||||||
sessionLife: toIntegerConfig(process.env.HMD_SESSION_LIFE),
|
sessionLife: toIntegerConfig(process.env.CMD_SESSION_LIFE),
|
||||||
imageUploadType: process.env.HMD_IMAGE_UPLOAD_TYPE,
|
imageUploadType: process.env.CMD_IMAGE_UPLOAD_TYPE,
|
||||||
imgur: {
|
imgur: {
|
||||||
clientID: process.env.HMD_IMGUR_CLIENTID
|
clientID: process.env.CMD_IMGUR_CLIENTID
|
||||||
},
|
},
|
||||||
s3: {
|
s3: {
|
||||||
accessKeyId: process.env.HMD_S3_ACCESS_KEY_ID,
|
accessKeyId: process.env.CMD_S3_ACCESS_KEY_ID,
|
||||||
secretAccessKey: process.env.HMD_S3_SECRET_ACCESS_KEY,
|
secretAccessKey: process.env.CMD_S3_SECRET_ACCESS_KEY,
|
||||||
region: process.env.HMD_S3_REGION
|
region: process.env.CMD_S3_REGION
|
||||||
},
|
},
|
||||||
minio: {
|
minio: {
|
||||||
accessKey: process.env.HMD_MINIO_ACCESS_KEY,
|
accessKey: process.env.CMD_MINIO_ACCESS_KEY,
|
||||||
secretKey: process.env.HMD_MINIO_SECRET_KEY,
|
secretKey: process.env.CMD_MINIO_SECRET_KEY,
|
||||||
endPoint: process.env.HMD_MINIO_ENDPOINT,
|
endPoint: process.env.CMD_MINIO_ENDPOINT,
|
||||||
secure: toBooleanConfig(process.env.HMD_MINIO_SECURE),
|
secure: toBooleanConfig(process.env.CMD_MINIO_SECURE),
|
||||||
port: toIntegerConfig(process.env.HMD_MINIO_PORT)
|
port: toIntegerConfig(process.env.CMD_MINIO_PORT)
|
||||||
},
|
},
|
||||||
s3bucket: process.env.HMD_S3_BUCKET,
|
s3bucket: process.env.CMD_S3_BUCKET,
|
||||||
azure: {
|
azure: {
|
||||||
connectionString: process.env.HMD_AZURE_CONNECTION_STRING,
|
connectionString: process.env.CMD_AZURE_CONNECTION_STRING,
|
||||||
container: process.env.HMD_AZURE_CONTAINER
|
container: process.env.CMD_AZURE_CONTAINER
|
||||||
},
|
},
|
||||||
facebook: {
|
facebook: {
|
||||||
clientID: process.env.HMD_FACEBOOK_CLIENTID,
|
clientID: process.env.CMD_FACEBOOK_CLIENTID,
|
||||||
clientSecret: process.env.HMD_FACEBOOK_CLIENTSECRET
|
clientSecret: process.env.CMD_FACEBOOK_CLIENTSECRET
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
consumerKey: process.env.HMD_TWITTER_CONSUMERKEY,
|
consumerKey: process.env.CMD_TWITTER_CONSUMERKEY,
|
||||||
consumerSecret: process.env.HMD_TWITTER_CONSUMERSECRET
|
consumerSecret: process.env.CMD_TWITTER_CONSUMERSECRET
|
||||||
},
|
},
|
||||||
github: {
|
github: {
|
||||||
clientID: process.env.HMD_GITHUB_CLIENTID,
|
clientID: process.env.CMD_GITHUB_CLIENTID,
|
||||||
clientSecret: process.env.HMD_GITHUB_CLIENTSECRET
|
clientSecret: process.env.CMD_GITHUB_CLIENTSECRET
|
||||||
},
|
},
|
||||||
gitlab: {
|
gitlab: {
|
||||||
baseURL: process.env.HMD_GITLAB_BASEURL,
|
baseURL: process.env.CMD_GITLAB_BASEURL,
|
||||||
clientID: process.env.HMD_GITLAB_CLIENTID,
|
clientID: process.env.CMD_GITLAB_CLIENTID,
|
||||||
clientSecret: process.env.HMD_GITLAB_CLIENTSECRET,
|
clientSecret: process.env.CMD_GITLAB_CLIENTSECRET,
|
||||||
scope: process.env.HMD_GITLAB_SCOPE
|
scope: process.env.CMD_GITLAB_SCOPE
|
||||||
},
|
},
|
||||||
mattermost: {
|
mattermost: {
|
||||||
baseURL: process.env.HMD_MATTERMOST_BASEURL,
|
baseURL: process.env.CMD_MATTERMOST_BASEURL,
|
||||||
clientID: process.env.HMD_MATTERMOST_CLIENTID,
|
clientID: process.env.CMD_MATTERMOST_CLIENTID,
|
||||||
clientSecret: process.env.HMD_MATTERMOST_CLIENTSECRET
|
clientSecret: process.env.CMD_MATTERMOST_CLIENTSECRET
|
||||||
},
|
},
|
||||||
oauth2: {
|
oauth2: {
|
||||||
baseURL: process.env.HMD_OAUTH2_BASEURL,
|
baseURL: process.env.CMD_OAUTH2_BASEURL,
|
||||||
userProfileURL: process.env.HMD_OAUTH2_USER_PROFILE_URL,
|
userProfileURL: process.env.CMD_OAUTH2_USER_PROFILE_URL,
|
||||||
userProfileUsernameAttr: process.env.HMD_OAUTH2_USER_PROFILE_USERNAME_ATTR,
|
userProfileUsernameAttr: process.env.CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR,
|
||||||
userProfileDisplayNameAttr: process.env.HMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR,
|
userProfileDisplayNameAttr: process.env.CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR,
|
||||||
userProfileEmailAttr: process.env.HMD_OAUTH2_USER_PROFILE_EMAIL_ATTR,
|
userProfileEmailAttr: process.env.CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR,
|
||||||
tokenURL: process.env.HMD_OAUTH2_TOKEN_URL,
|
tokenURL: process.env.CMD_OAUTH2_TOKEN_URL,
|
||||||
authorizationURL: process.env.HMD_OAUTH2_AUTHORIZATION_URL,
|
authorizationURL: process.env.CMD_OAUTH2_AUTHORIZATION_URL,
|
||||||
clientID: process.env.HMD_OAUTH2_CLIENT_ID,
|
clientID: process.env.CMD_OAUTH2_CLIENT_ID,
|
||||||
clientSecret: process.env.HMD_OAUTH2_CLIENT_SECRET
|
clientSecret: process.env.CMD_OAUTH2_CLIENT_SECRET
|
||||||
},
|
},
|
||||||
dropbox: {
|
dropbox: {
|
||||||
clientID: process.env.HMD_DROPBOX_CLIENTID,
|
clientID: process.env.CMD_DROPBOX_CLIENTID,
|
||||||
clientSecret: process.env.HMD_DROPBOX_CLIENTSECRET,
|
clientSecret: process.env.CMD_DROPBOX_CLIENTSECRET,
|
||||||
appKey: process.env.HMD_DROPBOX_APPKEY
|
appKey: process.env.CMD_DROPBOX_APPKEY
|
||||||
},
|
},
|
||||||
google: {
|
google: {
|
||||||
clientID: process.env.HMD_GOOGLE_CLIENTID,
|
clientID: process.env.CMD_GOOGLE_CLIENTID,
|
||||||
clientSecret: process.env.HMD_GOOGLE_CLIENTSECRET
|
clientSecret: process.env.CMD_GOOGLE_CLIENTSECRET
|
||||||
},
|
},
|
||||||
ldap: {
|
ldap: {
|
||||||
providerName: process.env.HMD_LDAP_PROVIDERNAME,
|
providerName: process.env.CMD_LDAP_PROVIDERNAME,
|
||||||
url: process.env.HMD_LDAP_URL,
|
url: process.env.CMD_LDAP_URL,
|
||||||
bindDn: process.env.HMD_LDAP_BINDDN,
|
bindDn: process.env.CMD_LDAP_BINDDN,
|
||||||
bindCredentials: process.env.HMD_LDAP_BINDCREDENTIALS,
|
bindCredentials: process.env.CMD_LDAP_BINDCREDENTIALS,
|
||||||
searchBase: process.env.HMD_LDAP_SEARCHBASE,
|
searchBase: process.env.CMD_LDAP_SEARCHBASE,
|
||||||
searchFilter: process.env.HMD_LDAP_SEARCHFILTER,
|
searchFilter: process.env.CMD_LDAP_SEARCHFILTER,
|
||||||
searchAttributes: toArrayConfig(process.env.HMD_LDAP_SEARCHATTRIBUTES),
|
searchAttributes: toArrayConfig(process.env.CMD_LDAP_SEARCHATTRIBUTES),
|
||||||
usernameField: process.env.HMD_LDAP_USERNAMEFIELD,
|
usernameField: process.env.CMD_LDAP_USERNAMEFIELD,
|
||||||
useridField: process.env.HMD_LDAP_USERIDFIELD,
|
useridField: process.env.CMD_LDAP_USERIDFIELD,
|
||||||
tlsca: process.env.HMD_LDAP_TLS_CA
|
tlsca: process.env.CMD_LDAP_TLS_CA
|
||||||
},
|
},
|
||||||
saml: {
|
saml: {
|
||||||
idpSsoUrl: process.env.HMD_SAML_IDPSSOURL,
|
idpSsoUrl: process.env.CMD_SAML_IDPSSOURL,
|
||||||
idpCert: process.env.HMD_SAML_IDPCERT,
|
idpCert: process.env.CMD_SAML_IDPCERT,
|
||||||
issuer: process.env.HMD_SAML_ISSUER,
|
issuer: process.env.CMD_SAML_ISSUER,
|
||||||
identifierFormat: process.env.HMD_SAML_IDENTIFIERFORMAT,
|
identifierFormat: process.env.CMD_SAML_IDENTIFIERFORMAT,
|
||||||
groupAttribute: process.env.HMD_SAML_GROUPATTRIBUTE,
|
groupAttribute: process.env.CMD_SAML_GROUPATTRIBUTE,
|
||||||
externalGroups: toArrayConfig(process.env.HMD_SAML_EXTERNALGROUPS, '|', []),
|
externalGroups: toArrayConfig(process.env.CMD_SAML_EXTERNALGROUPS, '|', []),
|
||||||
requiredGroups: toArrayConfig(process.env.HMD_SAML_REQUIREDGROUPS, '|', []),
|
requiredGroups: toArrayConfig(process.env.CMD_SAML_REQUIREDGROUPS, '|', []),
|
||||||
attribute: {
|
attribute: {
|
||||||
id: process.env.HMD_SAML_ATTRIBUTE_ID,
|
id: process.env.CMD_SAML_ATTRIBUTE_ID,
|
||||||
username: process.env.HMD_SAML_ATTRIBUTE_USERNAME,
|
username: process.env.CMD_SAML_ATTRIBUTE_USERNAME,
|
||||||
email: process.env.HMD_SAML_ATTRIBUTE_EMAIL
|
email: process.env.CMD_SAML_ATTRIBUTE_EMAIL
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
email: toBooleanConfig(process.env.HMD_EMAIL),
|
email: toBooleanConfig(process.env.CMD_EMAIL),
|
||||||
allowEmailRegister: toBooleanConfig(process.env.HMD_ALLOW_EMAIL_REGISTER),
|
allowEmailRegister: toBooleanConfig(process.env.CMD_ALLOW_EMAIL_REGISTER),
|
||||||
allowPDFExport: toBooleanConfig(process.env.HMD_ALLOW_PDF_EXPORT)
|
allowGravatar: toBooleanConfig(process.env.CMD_ALLOW_GRAVATAR),
|
||||||
|
allowPDFExport: toBooleanConfig(process.env.CMD_ALLOW_PDF_EXPORT)
|
||||||
}
|
}
|
||||||
|
|
124
lib/config/hackmdEnvironment.js
Normal file
124
lib/config/hackmdEnvironment.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const {toBooleanConfig, toArrayConfig, toIntegerConfig} = require('./utils')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
domain: process.env.HMD_DOMAIN,
|
||||||
|
urlPath: process.env.HMD_URL_PATH,
|
||||||
|
port: toIntegerConfig(process.env.HMD_PORT),
|
||||||
|
urlAddPort: toBooleanConfig(process.env.HMD_URL_ADDPORT),
|
||||||
|
useSSL: toBooleanConfig(process.env.HMD_USESSL),
|
||||||
|
hsts: {
|
||||||
|
enable: toBooleanConfig(process.env.HMD_HSTS_ENABLE),
|
||||||
|
maxAgeSeconds: process.env.HMD_HSTS_MAX_AGE,
|
||||||
|
includeSubdomains: toBooleanConfig(process.env.HMD_HSTS_INCLUDE_SUBDOMAINS),
|
||||||
|
preload: toBooleanConfig(process.env.HMD_HSTS_PRELOAD)
|
||||||
|
},
|
||||||
|
csp: {
|
||||||
|
enable: toBooleanConfig(process.env.HMD_CSP_ENABLE),
|
||||||
|
reportURI: process.env.HMD_CSP_REPORTURI
|
||||||
|
},
|
||||||
|
protocolUseSSL: toBooleanConfig(process.env.HMD_PROTOCOL_USESSL),
|
||||||
|
allowOrigin: toArrayConfig(process.env.HMD_ALLOW_ORIGIN),
|
||||||
|
useCDN: toBooleanConfig(process.env.HMD_USECDN),
|
||||||
|
allowAnonymous: toBooleanConfig(process.env.HMD_ALLOW_ANONYMOUS),
|
||||||
|
allowAnonymousEdits: toBooleanConfig(process.env.HMD_ALLOW_ANONYMOUS_EDITS),
|
||||||
|
allowFreeURL: toBooleanConfig(process.env.HMD_ALLOW_FREEURL),
|
||||||
|
defaultPermission: process.env.HMD_DEFAULT_PERMISSION,
|
||||||
|
dbURL: process.env.HMD_DB_URL,
|
||||||
|
sessionSecret: process.env.HMD_SESSION_SECRET,
|
||||||
|
sessionLife: toIntegerConfig(process.env.HMD_SESSION_LIFE),
|
||||||
|
imageUploadType: process.env.HMD_IMAGE_UPLOAD_TYPE,
|
||||||
|
imgur: {
|
||||||
|
clientID: process.env.HMD_IMGUR_CLIENTID
|
||||||
|
},
|
||||||
|
s3: {
|
||||||
|
accessKeyId: process.env.HMD_S3_ACCESS_KEY_ID,
|
||||||
|
secretAccessKey: process.env.HMD_S3_SECRET_ACCESS_KEY,
|
||||||
|
region: process.env.HMD_S3_REGION
|
||||||
|
},
|
||||||
|
minio: {
|
||||||
|
accessKey: process.env.HMD_MINIO_ACCESS_KEY,
|
||||||
|
secretKey: process.env.HMD_MINIO_SECRET_KEY,
|
||||||
|
endPoint: process.env.HMD_MINIO_ENDPOINT,
|
||||||
|
secure: toBooleanConfig(process.env.HMD_MINIO_SECURE),
|
||||||
|
port: toIntegerConfig(process.env.HMD_MINIO_PORT)
|
||||||
|
},
|
||||||
|
s3bucket: process.env.HMD_S3_BUCKET,
|
||||||
|
azure: {
|
||||||
|
connectionString: process.env.HMD_AZURE_CONNECTION_STRING,
|
||||||
|
container: process.env.HMD_AZURE_CONTAINER
|
||||||
|
},
|
||||||
|
facebook: {
|
||||||
|
clientID: process.env.HMD_FACEBOOK_CLIENTID,
|
||||||
|
clientSecret: process.env.HMD_FACEBOOK_CLIENTSECRET
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
consumerKey: process.env.HMD_TWITTER_CONSUMERKEY,
|
||||||
|
consumerSecret: process.env.HMD_TWITTER_CONSUMERSECRET
|
||||||
|
},
|
||||||
|
github: {
|
||||||
|
clientID: process.env.HMD_GITHUB_CLIENTID,
|
||||||
|
clientSecret: process.env.HMD_GITHUB_CLIENTSECRET
|
||||||
|
},
|
||||||
|
gitlab: {
|
||||||
|
baseURL: process.env.HMD_GITLAB_BASEURL,
|
||||||
|
clientID: process.env.HMD_GITLAB_CLIENTID,
|
||||||
|
clientSecret: process.env.HMD_GITLAB_CLIENTSECRET,
|
||||||
|
scope: process.env.HMD_GITLAB_SCOPE
|
||||||
|
},
|
||||||
|
mattermost: {
|
||||||
|
baseURL: process.env.HMD_MATTERMOST_BASEURL,
|
||||||
|
clientID: process.env.HMD_MATTERMOST_CLIENTID,
|
||||||
|
clientSecret: process.env.HMD_MATTERMOST_CLIENTSECRET
|
||||||
|
},
|
||||||
|
oauth2: {
|
||||||
|
baseURL: process.env.HMD_OAUTH2_BASEURL,
|
||||||
|
userProfileURL: process.env.HMD_OAUTH2_USER_PROFILE_URL,
|
||||||
|
userProfileUsernameAttr: process.env.HMD_OAUTH2_USER_PROFILE_USERNAME_ATTR,
|
||||||
|
userProfileDisplayNameAttr: process.env.HMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR,
|
||||||
|
userProfileEmailAttr: process.env.HMD_OAUTH2_USER_PROFILE_EMAIL_ATTR,
|
||||||
|
tokenURL: process.env.HMD_OAUTH2_TOKEN_URL,
|
||||||
|
authorizationURL: process.env.HMD_OAUTH2_AUTHORIZATION_URL,
|
||||||
|
clientID: process.env.HMD_OAUTH2_CLIENT_ID,
|
||||||
|
clientSecret: process.env.HMD_OAUTH2_CLIENT_SECRET
|
||||||
|
},
|
||||||
|
dropbox: {
|
||||||
|
clientID: process.env.HMD_DROPBOX_CLIENTID,
|
||||||
|
clientSecret: process.env.HMD_DROPBOX_CLIENTSECRET,
|
||||||
|
appKey: process.env.HMD_DROPBOX_APPKEY
|
||||||
|
},
|
||||||
|
google: {
|
||||||
|
clientID: process.env.HMD_GOOGLE_CLIENTID,
|
||||||
|
clientSecret: process.env.HMD_GOOGLE_CLIENTSECRET
|
||||||
|
},
|
||||||
|
ldap: {
|
||||||
|
providerName: process.env.HMD_LDAP_PROVIDERNAME,
|
||||||
|
url: process.env.HMD_LDAP_URL,
|
||||||
|
bindDn: process.env.HMD_LDAP_BINDDN,
|
||||||
|
bindCredentials: process.env.HMD_LDAP_BINDCREDENTIALS,
|
||||||
|
searchBase: process.env.HMD_LDAP_SEARCHBASE,
|
||||||
|
searchFilter: process.env.HMD_LDAP_SEARCHFILTER,
|
||||||
|
searchAttributes: toArrayConfig(process.env.HMD_LDAP_SEARCHATTRIBUTES),
|
||||||
|
usernameField: process.env.HMD_LDAP_USERNAMEFIELD,
|
||||||
|
useridField: process.env.HMD_LDAP_USERIDFIELD,
|
||||||
|
tlsca: process.env.HMD_LDAP_TLS_CA
|
||||||
|
},
|
||||||
|
saml: {
|
||||||
|
idpSsoUrl: process.env.HMD_SAML_IDPSSOURL,
|
||||||
|
idpCert: process.env.HMD_SAML_IDPCERT,
|
||||||
|
issuer: process.env.HMD_SAML_ISSUER,
|
||||||
|
identifierFormat: process.env.HMD_SAML_IDENTIFIERFORMAT,
|
||||||
|
groupAttribute: process.env.HMD_SAML_GROUPATTRIBUTE,
|
||||||
|
externalGroups: toArrayConfig(process.env.HMD_SAML_EXTERNALGROUPS, '|', []),
|
||||||
|
requiredGroups: toArrayConfig(process.env.HMD_SAML_REQUIREDGROUPS, '|', []),
|
||||||
|
attribute: {
|
||||||
|
id: process.env.HMD_SAML_ATTRIBUTE_ID,
|
||||||
|
username: process.env.HMD_SAML_ATTRIBUTE_USERNAME,
|
||||||
|
email: process.env.HMD_SAML_ATTRIBUTE_EMAIL
|
||||||
|
}
|
||||||
|
},
|
||||||
|
email: toBooleanConfig(process.env.HMD_EMAIL),
|
||||||
|
allowEmailRegister: toBooleanConfig(process.env.HMD_ALLOW_EMAIL_REGISTER),
|
||||||
|
allowPDFExport: toBooleanConfig(process.env.HMD_ALLOW_PDF_EXPORT)
|
||||||
|
}
|
|
@ -33,6 +33,7 @@ merge(config, debugConfig)
|
||||||
merge(config, packageConfig)
|
merge(config, packageConfig)
|
||||||
merge(config, fileConfig)
|
merge(config, fileConfig)
|
||||||
merge(config, require('./oldEnvironment'))
|
merge(config, require('./oldEnvironment'))
|
||||||
|
merge(config, require('./hackmdEnvironment'))
|
||||||
merge(config, require('./environment'))
|
merge(config, require('./environment'))
|
||||||
merge(config, require('./dockerSecret'))
|
merge(config, require('./dockerSecret'))
|
||||||
|
|
||||||
|
@ -122,6 +123,11 @@ for (let i = keys.length; i--;) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Notify users about the prefix change and inform them they use legacy prefix for environment variables
|
||||||
|
if (Object.keys(process.env).toString().indexOf('HMD_') !== -1) {
|
||||||
|
logger.warn('Using legacy HMD prefix for environment variables. Please change your variables in future. For details see: https://github.com/hackmdio/codimd#environment-variables-will-overwrite-other-server-configs')
|
||||||
|
}
|
||||||
|
|
||||||
// Generate session secret if it stays on default values
|
// Generate session secret if it stays on default values
|
||||||
if (config.sessionSecret === 'secret') {
|
if (config.sessionSecret === 'secret') {
|
||||||
logger.warn('Session secret not set. Using random generated one. Please set `sessionSecret` in your config.js file. All users will be logged out.')
|
logger.warn('Session secret not set. Using random generated one. Please set `sessionSecret` in your config.js file. All users will be logged out.')
|
||||||
|
@ -133,7 +139,7 @@ if (config.sessionSecret === 'secret') {
|
||||||
// Validate upload upload providers
|
// Validate upload upload providers
|
||||||
if (['filesystem', 's3', 'minio', 'imgur', 'azure'].indexOf(config.imageUploadType) === -1) {
|
if (['filesystem', 's3', 'minio', 'imgur', 'azure'].indexOf(config.imageUploadType) === -1) {
|
||||||
logger.error('"imageuploadtype" is not correctly set. Please use "filesystem", "s3", "minio", "azure" or "imgur". Defaulting to "imgur"')
|
logger.error('"imageuploadtype" is not correctly set. Please use "filesystem", "s3", "minio", "azure" or "imgur". Defaulting to "imgur"')
|
||||||
config.imageUploadType = 'imgur'
|
config.imageUploadType = 'filesystem'
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out mime types for image uploads
|
// figure out mime types for image uploads
|
||||||
|
@ -169,10 +175,12 @@ config.tmpPath = path.join(appRootPath, config.tmpPath)
|
||||||
config.defaultNotePath = path.join(appRootPath, config.defaultNotePath)
|
config.defaultNotePath = path.join(appRootPath, config.defaultNotePath)
|
||||||
config.docsPath = path.join(appRootPath, config.docsPath)
|
config.docsPath = path.join(appRootPath, config.docsPath)
|
||||||
config.indexPath = path.join(appRootPath, config.indexPath)
|
config.indexPath = path.join(appRootPath, config.indexPath)
|
||||||
config.hackmdPath = path.join(appRootPath, config.hackmdPath)
|
config.codimdPath = path.join(appRootPath, config.codimdPath)
|
||||||
config.errorPath = path.join(appRootPath, config.errorPath)
|
config.errorPath = path.join(appRootPath, config.errorPath)
|
||||||
config.prettyPath = path.join(appRootPath, config.prettyPath)
|
config.prettyPath = path.join(appRootPath, config.prettyPath)
|
||||||
config.slidePath = path.join(appRootPath, config.slidePath)
|
config.slidePath = path.join(appRootPath, config.slidePath)
|
||||||
|
config.constantsPath = path.join(appRootPath, config.constantsPath)
|
||||||
|
config.uploadsPath = path.join(appRootPath, config.uploadsPath)
|
||||||
|
|
||||||
// make config readonly
|
// make config readonly
|
||||||
config = deepFreeze(config)
|
config = deepFreeze(config)
|
||||||
|
|
|
@ -6,7 +6,7 @@ var CspStrategy = {}
|
||||||
var defaultDirectives = {
|
var defaultDirectives = {
|
||||||
defaultSrc: ['\'self\''],
|
defaultSrc: ['\'self\''],
|
||||||
scriptSrc: ['\'self\'', 'vimeo.com', 'https://gist.github.com', 'www.slideshare.net', 'https://query.yahooapis.com', '\'unsafe-eval\''],
|
scriptSrc: ['\'self\'', 'vimeo.com', 'https://gist.github.com', 'www.slideshare.net', 'https://query.yahooapis.com', '\'unsafe-eval\''],
|
||||||
// ^ TODO: Remove unsafe-eval - webpack script-loader issues https://github.com/hackmdio/hackmd/issues/594
|
// ^ TODO: Remove unsafe-eval - webpack script-loader issues https://github.com/hackmdio/codimd/issues/594
|
||||||
imgSrc: ['*'],
|
imgSrc: ['*'],
|
||||||
styleSrc: ['\'self\'', '\'unsafe-inline\'', 'https://assets-cdn.github.com'], // unsafe-inline is required for some libs, plus used in views
|
styleSrc: ['\'self\'', '\'unsafe-inline\'', 'https://assets-cdn.github.com'], // unsafe-inline is required for some libs, plus used in views
|
||||||
fontSrc: ['\'self\'', 'https://public.slidesharecdn.com'],
|
fontSrc: ['\'self\'', 'https://public.slidesharecdn.com'],
|
||||||
|
@ -71,7 +71,7 @@ function addInlineScriptExceptions (directives) {
|
||||||
directives.scriptSrc.push(getCspNonce)
|
directives.scriptSrc.push(getCspNonce)
|
||||||
// TODO: This is the SHA-256 hash of the inline script in build/reveal.js/plugins/notes/notes.html
|
// TODO: This is the SHA-256 hash of the inline script in build/reveal.js/plugins/notes/notes.html
|
||||||
// Any more clean solution appreciated.
|
// Any more clean solution appreciated.
|
||||||
directives.scriptSrc.push('\'sha256-EtvSSxRwce5cLeFBZbvZvDrTiRoyoXbWWwvEVciM5Ag=\'')
|
directives.scriptSrc.push('\'sha256-L0TsyAQLAc0koby5DCbFAwFfRs9ZxesA+4xg0QDSrdI=\'')
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCspNonce (req, res) {
|
function getCspNonce (req, res) {
|
||||||
|
|
|
@ -31,6 +31,15 @@ function getHistory (userid, callback) {
|
||||||
history = JSON.parse(user.history)
|
history = JSON.parse(user.history)
|
||||||
// migrate LZString encoded note id to base64url encoded note id
|
// migrate LZString encoded note id to base64url encoded note id
|
||||||
for (let i = 0, l = history.length; i < l; i++) {
|
for (let i = 0, l = history.length; i < l; i++) {
|
||||||
|
// Calculate minimal string length for an UUID that is encoded
|
||||||
|
// base64 encoded and optimize comparsion by using -1
|
||||||
|
// this should make a lot of LZ-String parsing errors obsolete
|
||||||
|
// as we can assume that a nodeId that is 48 chars or longer is a
|
||||||
|
// noteID.
|
||||||
|
const base64UuidLength = ((4 * 36) / 3) - 1
|
||||||
|
if (!(history[i].id.length > base64UuidLength)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
let id = LZString.decompressFromBase64(history[i].id)
|
let id = LZString.decompressFromBase64(history[i].id)
|
||||||
if (id && models.Note.checkNoteIdValid(id)) {
|
if (id && models.Note.checkNoteIdValid(id)) {
|
||||||
|
@ -38,9 +47,13 @@ function getHistory (userid, callback) {
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// most error here comes from LZString, ignore
|
// most error here comes from LZString, ignore
|
||||||
|
if (err.message === 'Cannot read property \'charAt\' of undefined') {
|
||||||
|
logger.warning('Looks like we can not decode "' + history[i].id + '" with LZString. Can be ignored.')
|
||||||
|
} else {
|
||||||
logger.error(err)
|
logger.error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
history = parseHistoryToObject(history)
|
history = parseHistoryToObject(history)
|
||||||
}
|
}
|
||||||
if (config.debug) {
|
if (config.debug) {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
// external modules
|
// external modules
|
||||||
|
const md5 = require('blueimp-md5')
|
||||||
const randomcolor = require('randomcolor')
|
const randomcolor = require('randomcolor')
|
||||||
const config = require('./config')
|
const config = require('./config')
|
||||||
|
|
||||||
|
@ -24,6 +25,17 @@ exports.generateAvatar = function (name) {
|
||||||
return svg
|
return svg
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.generateAvatarURL = function (name) {
|
exports.generateAvatarURL = function (name, email = '', big = true) {
|
||||||
return config.serverURL + '/user/' + name + '/avatar.svg'
|
let photo
|
||||||
|
if (email !== '' && config.allowGravatar) {
|
||||||
|
photo = 'https://www.gravatar.com/avatar/' + md5(email.toLowerCase())
|
||||||
|
if (big) {
|
||||||
|
photo += '?s=400'
|
||||||
|
} else {
|
||||||
|
photo += '?s=96'
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
photo = config.serverURL + '/user/' + (name || email.substring(0, email.lastIndexOf('@')) || md5(email.toLowerCase())) + '/avatar.svg'
|
||||||
|
}
|
||||||
|
return photo
|
||||||
}
|
}
|
||||||
|
|
13
lib/migrations/20180525153000-user-add-delete-token.js
Normal file
13
lib/migrations/20180525153000-user-add-delete-token.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
'use strict'
|
||||||
|
module.exports = {
|
||||||
|
up: function (queryInterface, Sequelize) {
|
||||||
|
return queryInterface.addColumn('Users', 'deleteToken', {
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
defaultValue: Sequelize.UUIDV4
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
down: function (queryInterface, Sequelize) {
|
||||||
|
return queryInterface.removeColumn('Users', 'deleteToken')
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,12 +24,16 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
Author.belongsTo(models.Note, {
|
Author.belongsTo(models.Note, {
|
||||||
foreignKey: 'noteId',
|
foreignKey: 'noteId',
|
||||||
as: 'note',
|
as: 'note',
|
||||||
constraints: false
|
constraints: false,
|
||||||
|
onDelete: 'CASCADE',
|
||||||
|
hooks: true
|
||||||
})
|
})
|
||||||
Author.belongsTo(models.User, {
|
Author.belongsTo(models.User, {
|
||||||
foreignKey: 'userId',
|
foreignKey: 'userId',
|
||||||
as: 'user',
|
as: 'user',
|
||||||
constraints: false
|
constraints: false,
|
||||||
|
onDelete: 'CASCADE',
|
||||||
|
hooks: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,13 +85,15 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
type: DataTypes.DATE
|
type: DataTypes.DATE
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
paranoid: true,
|
paranoid: false,
|
||||||
classMethods: {
|
classMethods: {
|
||||||
associate: function (models) {
|
associate: function (models) {
|
||||||
Note.belongsTo(models.User, {
|
Note.belongsTo(models.User, {
|
||||||
foreignKey: 'ownerId',
|
foreignKey: 'ownerId',
|
||||||
as: 'owner',
|
as: 'owner',
|
||||||
constraints: false
|
constraints: false,
|
||||||
|
onDelete: 'CASCADE',
|
||||||
|
hooks: true
|
||||||
})
|
})
|
||||||
Note.belongsTo(models.User, {
|
Note.belongsTo(models.User, {
|
||||||
foreignKey: 'lastchangeuserId',
|
foreignKey: 'lastchangeuserId',
|
||||||
|
@ -225,7 +227,11 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
var id = LZString.decompressFromBase64(noteId)
|
var id = LZString.decompressFromBase64(noteId)
|
||||||
if (id && Note.checkNoteIdValid(id)) { return callback(null, id) } else { return _callback(null, null) }
|
if (id && Note.checkNoteIdValid(id)) { return callback(null, id) } else { return _callback(null, null) }
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
if (err.message === 'Cannot read property \'charAt\' of undefined') {
|
||||||
|
logger.warning('Looks like we can not decode "' + noteId + '" with LZString. Can be ignored.')
|
||||||
|
} else {
|
||||||
logger.error(err)
|
logger.error(err)
|
||||||
|
}
|
||||||
return _callback(null, null)
|
return _callback(null, null)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -102,7 +102,9 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
Revision.belongsTo(models.Note, {
|
Revision.belongsTo(models.Note, {
|
||||||
foreignKey: 'noteId',
|
foreignKey: 'noteId',
|
||||||
as: 'note',
|
as: 'note',
|
||||||
constraints: false
|
constraints: false,
|
||||||
|
onDelete: 'CASCADE',
|
||||||
|
hooks: true
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getNoteRevisions: function (note, callback) {
|
getNoteRevisions: function (note, callback) {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
// external modules
|
// external modules
|
||||||
var md5 = require('blueimp-md5')
|
|
||||||
var Sequelize = require('sequelize')
|
var Sequelize = require('sequelize')
|
||||||
var scrypt = require('scrypt')
|
var scrypt = require('scrypt')
|
||||||
|
|
||||||
|
@ -31,6 +30,10 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
refreshToken: {
|
refreshToken: {
|
||||||
type: DataTypes.TEXT
|
type: DataTypes.TEXT
|
||||||
},
|
},
|
||||||
|
deleteToken: {
|
||||||
|
type: DataTypes.UUID,
|
||||||
|
defaultValue: Sequelize.UUIDV4
|
||||||
|
},
|
||||||
email: {
|
email: {
|
||||||
type: Sequelize.TEXT,
|
type: Sequelize.TEXT,
|
||||||
validate: {
|
validate: {
|
||||||
|
@ -66,6 +69,9 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getProfile: function (user) {
|
getProfile: function (user) {
|
||||||
|
if (!user) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
return user.profile ? User.parseProfile(user.profile) : (user.email ? User.parseProfileByEmail(user.email) : null)
|
return user.profile ? User.parseProfile(user.profile) : (user.email ? User.parseProfileByEmail(user.email) : null)
|
||||||
},
|
},
|
||||||
parseProfile: function (profile) {
|
parseProfile: function (profile) {
|
||||||
|
@ -121,10 +127,7 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'dropbox':
|
case 'dropbox':
|
||||||
// no image api provided, use gravatar
|
photo = generateAvatarURL('', profile.emails[0].value, bigger)
|
||||||
photo = 'https://www.gravatar.com/avatar/' + md5(profile.emails[0].value)
|
|
||||||
if (bigger) photo += '?s=400'
|
|
||||||
else photo += '?s=96'
|
|
||||||
break
|
break
|
||||||
case 'google':
|
case 'google':
|
||||||
photo = profile.photos[0].value
|
photo = profile.photos[0].value
|
||||||
|
@ -132,35 +135,19 @@ module.exports = function (sequelize, DataTypes) {
|
||||||
else photo = photo.replace(/(\?sz=)\d*$/i, '$196')
|
else photo = photo.replace(/(\?sz=)\d*$/i, '$196')
|
||||||
break
|
break
|
||||||
case 'ldap':
|
case 'ldap':
|
||||||
// no image api provided,
|
photo = generateAvatarURL(profile.username, profile.emails[0], bigger)
|
||||||
// use gravatar if email exists,
|
|
||||||
// otherwise generate a letter avatar
|
|
||||||
if (profile.emails[0]) {
|
|
||||||
photo = 'https://www.gravatar.com/avatar/' + md5(profile.emails[0])
|
|
||||||
if (bigger) photo += '?s=400'
|
|
||||||
else photo += '?s=96'
|
|
||||||
} else {
|
|
||||||
photo = generateAvatarURL(profile.username)
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
case 'saml':
|
case 'saml':
|
||||||
if (profile.emails[0]) {
|
photo = generateAvatarURL(profile.username, profile.emails[0], bigger)
|
||||||
photo = 'https://www.gravatar.com/avatar/' + md5(profile.emails[0])
|
|
||||||
if (bigger) photo += '?s=400'
|
|
||||||
else photo += '?s=96'
|
|
||||||
} else {
|
|
||||||
photo = generateAvatarURL(profile.username)
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
return photo
|
return photo
|
||||||
},
|
},
|
||||||
parseProfileByEmail: function (email) {
|
parseProfileByEmail: function (email) {
|
||||||
var photoUrl = 'https://www.gravatar.com/avatar/' + md5(email)
|
|
||||||
return {
|
return {
|
||||||
name: email.substring(0, email.lastIndexOf('@')),
|
name: email.substring(0, email.lastIndexOf('@')),
|
||||||
photo: photoUrl + '?s=96',
|
photo: generateAvatarURL('', email, false),
|
||||||
biggerphoto: photoUrl + '?s=400'
|
biggerphoto: generateAvatarURL('', email, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -486,6 +486,7 @@ function startConnection (socket) {
|
||||||
for (var i = 0; i < note.authors.length; i++) {
|
for (var i = 0; i < note.authors.length; i++) {
|
||||||
var author = note.authors[i]
|
var author = note.authors[i]
|
||||||
var profile = models.User.getProfile(author.user)
|
var profile = models.User.getProfile(author.user)
|
||||||
|
if (profile) {
|
||||||
authors[author.userId] = {
|
authors[author.userId] = {
|
||||||
userid: author.userId,
|
userid: author.userId,
|
||||||
color: author.color,
|
color: author.color,
|
||||||
|
@ -493,6 +494,7 @@ function startConnection (socket) {
|
||||||
name: profile.name
|
name: profile.name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
notes[noteId] = {
|
notes[noteId] = {
|
||||||
id: noteId,
|
id: noteId,
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// response
|
// response
|
||||||
// external modules
|
// external modules
|
||||||
var fs = require('fs')
|
var fs = require('fs')
|
||||||
|
var path = require('path')
|
||||||
var markdownpdf = require('markdown-pdf')
|
var markdownpdf = require('markdown-pdf')
|
||||||
var shortId = require('shortid')
|
var shortId = require('shortid')
|
||||||
var querystring = require('querystring')
|
var querystring = require('querystring')
|
||||||
|
@ -61,7 +62,10 @@ function responseError (res, code, detail, msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function showIndex (req, res, next) {
|
function showIndex (req, res, next) {
|
||||||
res.render(config.indexPath, {
|
var authStatus = req.isAuthenticated()
|
||||||
|
var deleteToken = ''
|
||||||
|
|
||||||
|
var data = {
|
||||||
url: config.serverURL,
|
url: config.serverURL,
|
||||||
useCDN: config.useCDN,
|
useCDN: config.useCDN,
|
||||||
allowAnonymous: config.allowAnonymous,
|
allowAnonymous: config.allowAnonymous,
|
||||||
|
@ -81,13 +85,31 @@ function showIndex (req, res, next) {
|
||||||
email: config.isEmailEnable,
|
email: config.isEmailEnable,
|
||||||
allowEmailRegister: config.allowEmailRegister,
|
allowEmailRegister: config.allowEmailRegister,
|
||||||
allowPDFExport: config.allowPDFExport,
|
allowPDFExport: config.allowPDFExport,
|
||||||
signin: req.isAuthenticated(),
|
signin: authStatus,
|
||||||
infoMessage: req.flash('info'),
|
infoMessage: req.flash('info'),
|
||||||
errorMessage: req.flash('error')
|
errorMessage: req.flash('error'),
|
||||||
|
privacyStatement: fs.existsSync(path.join(config.docsPath, 'privacy.md')),
|
||||||
|
termsOfUse: fs.existsSync(path.join(config.docsPath, 'terms-of-use.md')),
|
||||||
|
deleteToken: deleteToken
|
||||||
|
}
|
||||||
|
|
||||||
|
if (authStatus) {
|
||||||
|
models.User.findOne({
|
||||||
|
where: {
|
||||||
|
id: req.user.id
|
||||||
|
}
|
||||||
|
}).then(function (user) {
|
||||||
|
if (user) {
|
||||||
|
data.deleteToken = user.deleteToken
|
||||||
|
res.render(config.indexPath, data)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
res.render(config.indexPath, data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function responseHackMD (res, note) {
|
function responseCodiMD (res, note) {
|
||||||
var body = note.content
|
var body = note.content
|
||||||
var extracted = models.Note.extractMeta(body)
|
var extracted = models.Note.extractMeta(body)
|
||||||
var meta = models.Note.parseMeta(extracted.meta)
|
var meta = models.Note.parseMeta(extracted.meta)
|
||||||
|
@ -97,7 +119,7 @@ function responseHackMD (res, note) {
|
||||||
'Cache-Control': 'private', // only cache by client
|
'Cache-Control': 'private', // only cache by client
|
||||||
'X-Robots-Tag': 'noindex, nofollow' // prevent crawling
|
'X-Robots-Tag': 'noindex, nofollow' // prevent crawling
|
||||||
})
|
})
|
||||||
res.render(config.hackmdPath, {
|
res.render(config.codimdPath, {
|
||||||
url: config.serverURL,
|
url: config.serverURL,
|
||||||
title: title,
|
title: title,
|
||||||
useCDN: config.useCDN,
|
useCDN: config.useCDN,
|
||||||
|
@ -123,6 +145,8 @@ function responseHackMD (res, note) {
|
||||||
|
|
||||||
function newNote (req, res, next) {
|
function newNote (req, res, next) {
|
||||||
var owner = null
|
var owner = null
|
||||||
|
var body = req.body ? req.body : ''
|
||||||
|
body = body.replace(/[\r]/g, '')
|
||||||
if (req.isAuthenticated()) {
|
if (req.isAuthenticated()) {
|
||||||
owner = req.user.id
|
owner = req.user.id
|
||||||
} else if (!config.allowAnonymous) {
|
} else if (!config.allowAnonymous) {
|
||||||
|
@ -131,7 +155,7 @@ function newNote (req, res, next) {
|
||||||
models.Note.create({
|
models.Note.create({
|
||||||
ownerId: owner,
|
ownerId: owner,
|
||||||
alias: req.alias ? req.alias : null,
|
alias: req.alias ? req.alias : null,
|
||||||
content: req.body ? req.body : ''
|
content: body
|
||||||
}).then(function (note) {
|
}).then(function (note) {
|
||||||
return res.redirect(config.serverURL + '/' + models.Note.encodeNoteId(note.id))
|
return res.redirect(config.serverURL + '/' + models.Note.encodeNoteId(note.id))
|
||||||
}).catch(function (err) {
|
}).catch(function (err) {
|
||||||
|
@ -190,7 +214,7 @@ function showNote (req, res, next) {
|
||||||
var noteId = req.params.noteId
|
var noteId = req.params.noteId
|
||||||
var id = models.Note.encodeNoteId(note.id)
|
var id = models.Note.encodeNoteId(note.id)
|
||||||
if ((note.alias && noteId !== note.alias) || (!note.alias && noteId !== id)) { return res.redirect(config.serverURL + '/' + (note.alias || id)) }
|
if ((note.alias && noteId !== note.alias) || (!note.alias && noteId !== id)) { return res.redirect(config.serverURL + '/' + (note.alias || id)) }
|
||||||
return responseHackMD(res, note)
|
return responseCodiMD(res, note)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,15 +329,18 @@ function actionInfo (req, res, note) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function actionPDF (req, res, note) {
|
function actionPDF (req, res, note) {
|
||||||
|
var url = config.serverURL || 'http://' + req.get('host')
|
||||||
var body = note.content
|
var body = note.content
|
||||||
var extracted = models.Note.extractMeta(body)
|
var extracted = models.Note.extractMeta(body)
|
||||||
|
var content = extracted.markdown
|
||||||
var title = models.Note.decodeTitle(note.title)
|
var title = models.Note.decodeTitle(note.title)
|
||||||
|
|
||||||
if (!fs.existsSync(config.tmpPath)) {
|
if (!fs.existsSync(config.tmpPath)) {
|
||||||
fs.mkdirSync(config.tmpPath)
|
fs.mkdirSync(config.tmpPath)
|
||||||
}
|
}
|
||||||
var path = config.tmpPath + '/' + Date.now() + '.pdf'
|
var path = config.tmpPath + '/' + Date.now() + '.pdf'
|
||||||
markdownpdf().from.string(extracted.markdown).to(path, function () {
|
content = content.replace(/\]\(\//g, '](' + url + '/')
|
||||||
|
markdownpdf().from.string(content).to(path, function () {
|
||||||
var stream = fs.createReadStream(path)
|
var stream = fs.createReadStream(path)
|
||||||
var filename = title
|
var filename = title
|
||||||
// Be careful of special characters
|
// Be careful of special characters
|
||||||
|
@ -500,7 +527,7 @@ function githubActionGist (req, res, note) {
|
||||||
request({
|
request({
|
||||||
url: gistUrl,
|
url: gistUrl,
|
||||||
headers: {
|
headers: {
|
||||||
'User-Agent': 'HackMD',
|
'User-Agent': 'CodiMD',
|
||||||
'Authorization': 'token ' + accessToken
|
'Authorization': 'token ' + accessToken
|
||||||
},
|
},
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
|
|
@ -15,7 +15,7 @@ let ldapAuth = module.exports = Router()
|
||||||
passport.use(new LDAPStrategy({
|
passport.use(new LDAPStrategy({
|
||||||
server: {
|
server: {
|
||||||
url: config.ldap.url || null,
|
url: config.ldap.url || null,
|
||||||
bindDn: config.ldap.bindDn || null,
|
bindDN: config.ldap.bindDn || null,
|
||||||
bindCredentials: config.ldap.bindCredentials || null,
|
bindCredentials: config.ldap.bindCredentials || null,
|
||||||
searchBase: config.ldap.searchBase || null,
|
searchBase: config.ldap.searchBase || null,
|
||||||
searchFilter: config.ldap.searchFilter || null,
|
searchFilter: config.ldap.searchFilter || null,
|
||||||
|
|
|
@ -15,5 +15,5 @@ exports.uploadImage = function (imagePath, callback) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
callback(null, url.resolve(config.serverURL + '/', imagePath.match(/^public\/(.+$)/)[1]))
|
callback(null, url.resolve(config.serverURL + '/', imagePath.match(/public\/(.+)$/)[1]))
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ imageRouter.post('/uploadimage', function (req, res) {
|
||||||
form.keepExtensions = true
|
form.keepExtensions = true
|
||||||
|
|
||||||
if (config.imageUploadType === 'filesystem') {
|
if (config.imageUploadType === 'filesystem') {
|
||||||
form.uploadDir = 'public/uploads'
|
form.uploadDir = config.uploadsPath
|
||||||
}
|
}
|
||||||
|
|
||||||
form.parse(req, function (err, fields, files) {
|
form.parse(req, function (err, fields, files) {
|
||||||
|
|
10
lib/web/middleware/codiMDVersion.js
Normal file
10
lib/web/middleware/codiMDVersion.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const config = require('../../config')
|
||||||
|
|
||||||
|
module.exports = function (req, res, next) {
|
||||||
|
res.set({
|
||||||
|
'CodiMD-Version': config.version
|
||||||
|
})
|
||||||
|
return next()
|
||||||
|
}
|
|
@ -18,7 +18,7 @@ statusRouter.get('/status', function (req, res, next) {
|
||||||
res.set({
|
res.set({
|
||||||
'Cache-Control': 'private', // only cache by client
|
'Cache-Control': 'private', // only cache by client
|
||||||
'X-Robots-Tag': 'noindex, nofollow', // prevent crawling
|
'X-Robots-Tag': 'noindex, nofollow', // prevent crawling
|
||||||
'HackMD-Version': config.version
|
'Content-Type': 'application/json'
|
||||||
})
|
})
|
||||||
res.send(data)
|
res.send(data)
|
||||||
})
|
})
|
||||||
|
@ -90,3 +90,20 @@ statusRouter.post('/temp', urlencodedParser, function (req, res) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
statusRouter.get('/config', function (req, res) {
|
||||||
|
var data = {
|
||||||
|
domain: config.domain,
|
||||||
|
urlpath: config.urlPath,
|
||||||
|
debug: config.debug,
|
||||||
|
version: config.version,
|
||||||
|
DROPBOX_APP_KEY: config.dropbox.appKey,
|
||||||
|
allowedUploadMimeTypes: config.allowedUploadMimeTypes
|
||||||
|
}
|
||||||
|
res.set({
|
||||||
|
'Cache-Control': 'private', // only cache by client
|
||||||
|
'X-Robots-Tag': 'noindex, nofollow', // prevent crawling
|
||||||
|
'Content-Type': 'application/javascript'
|
||||||
|
})
|
||||||
|
res.render(config.constantsPath, data)
|
||||||
|
})
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
|
const archiver = require('archiver')
|
||||||
|
const async = require('async')
|
||||||
const Router = require('express').Router
|
const Router = require('express').Router
|
||||||
|
|
||||||
const response = require('../response')
|
const response = require('../response')
|
||||||
|
const config = require('../config')
|
||||||
const models = require('../models')
|
const models = require('../models')
|
||||||
const logger = require('../logger')
|
const logger = require('../logger')
|
||||||
const {generateAvatar} = require('../letter-avatars')
|
const {generateAvatar} = require('../letter-avatars')
|
||||||
|
@ -36,6 +39,87 @@ UserRouter.get('/me', function (req, res) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// delete the currently authenticated user
|
||||||
|
UserRouter.get('/me/delete/:token?', function (req, res) {
|
||||||
|
if (req.isAuthenticated()) {
|
||||||
|
models.User.findOne({
|
||||||
|
where: {
|
||||||
|
id: req.user.id
|
||||||
|
}
|
||||||
|
}).then(function (user) {
|
||||||
|
if (!user) {
|
||||||
|
return response.errorNotFound(res)
|
||||||
|
}
|
||||||
|
if (user.deleteToken === req.params.token) {
|
||||||
|
user.destroy().then(function () {
|
||||||
|
res.redirect(config.serverURL + '/')
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return response.errorForbidden(res)
|
||||||
|
}
|
||||||
|
}).catch(function (err) {
|
||||||
|
logger.error('delete user failed: ' + err)
|
||||||
|
return response.errorInternalError(res)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return response.errorForbidden(res)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// export the data of the authenticated user
|
||||||
|
UserRouter.get('/me/export', function (req, res) {
|
||||||
|
if (req.isAuthenticated()) {
|
||||||
|
// let output = fs.createWriteStream(__dirname + '/example.zip');
|
||||||
|
let archive = archiver('zip', {
|
||||||
|
zlib: { level: 3 } // Sets the compression level.
|
||||||
|
})
|
||||||
|
res.setHeader('Content-Type', 'application/zip')
|
||||||
|
res.attachment('archive.zip')
|
||||||
|
archive.pipe(res)
|
||||||
|
archive.on('error', function (err) {
|
||||||
|
logger.error('export user data failed: ' + err)
|
||||||
|
return response.errorInternalError(res)
|
||||||
|
})
|
||||||
|
models.User.findOne({
|
||||||
|
where: {
|
||||||
|
id: req.user.id
|
||||||
|
}
|
||||||
|
}).then(function (user) {
|
||||||
|
models.Note.findAll({
|
||||||
|
where: {
|
||||||
|
ownerId: user.id
|
||||||
|
}
|
||||||
|
}).then(function (notes) {
|
||||||
|
let list = []
|
||||||
|
async.each(notes, function (note, callback) {
|
||||||
|
let title
|
||||||
|
let extension = ''
|
||||||
|
do {
|
||||||
|
title = note.title + extension
|
||||||
|
extension++
|
||||||
|
} while (list.indexOf(title) !== -1)
|
||||||
|
|
||||||
|
list.push(title)
|
||||||
|
logger.debug('Write: ' + title + '.md')
|
||||||
|
archive.append(Buffer.from(note.content), { name: title + '.md', date: note.lastchangeAt })
|
||||||
|
callback(null, null)
|
||||||
|
}, function (err) {
|
||||||
|
if (err) {
|
||||||
|
return response.errorInternalError(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
archive.finalize()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}).catch(function (err) {
|
||||||
|
logger.error('export user data failed: ' + err)
|
||||||
|
return response.errorInternalError(res)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return response.errorForbidden(res)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
UserRouter.get('/user/:username/avatar.svg', function (req, res, next) {
|
UserRouter.get('/user/:username/avatar.svg', function (req, res, next) {
|
||||||
res.setHeader('Content-Type', 'image/svg+xml')
|
res.setHeader('Content-Type', 'image/svg+xml')
|
||||||
res.setHeader('Cache-Control', 'public, max-age=86400')
|
res.setHeader('Cache-Control', 'public, max-age=86400')
|
||||||
|
|
|
@ -105,5 +105,11 @@
|
||||||
"Export to Snippet": "Zu Snippet exportieren",
|
"Export to Snippet": "Zu Snippet exportieren",
|
||||||
"Select Visibility Level": "Sichtbarkeit bestimmen",
|
"Select Visibility Level": "Sichtbarkeit bestimmen",
|
||||||
"Night Theme": "Nachtmodus",
|
"Night Theme": "Nachtmodus",
|
||||||
"Follow us on %s and %s.": "Folge uns auf %s und %s."
|
"Follow us on %s and %s.": "Folge uns auf %s und %s.",
|
||||||
|
"Privacy": "Privatsphäre",
|
||||||
|
"Terms of Use": "Nutzungsbedingungen",
|
||||||
|
"Do you really want to delete your user account?": "Möchten Sie wirklich Ihr Nutzeraccount löschen?",
|
||||||
|
"This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Hiermit löschen Sie Ihren Account, alle Ihre Dokumente und alle Verweise auf Ihren Account aus anderen Dokumenten.",
|
||||||
|
"Delete user": "Benutzer löschen",
|
||||||
|
"Export user data": "Exportiere Nutzerdaten"
|
||||||
}
|
}
|
|
@ -105,5 +105,11 @@
|
||||||
"Export to Snippet": "Export to Snippet",
|
"Export to Snippet": "Export to Snippet",
|
||||||
"Select Visibility Level": "Select Visibility Level",
|
"Select Visibility Level": "Select Visibility Level",
|
||||||
"Night Theme": "Night Theme",
|
"Night Theme": "Night Theme",
|
||||||
"Follow us on %s and %s.": "Follow us on %s, and %s."
|
"Follow us on %s and %s.": "Follow us on %s, and %s.",
|
||||||
|
"Privacy": "Privacy",
|
||||||
|
"Terms of Use": "Terms of Use",
|
||||||
|
"Do you really want to delete your user account?": "Do you really want to delete your user account?",
|
||||||
|
"This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.",
|
||||||
|
"Delete user": "Delete user",
|
||||||
|
"Export user data": "Export user data"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
{
|
{
|
||||||
"Collaborative markdown notes": "Note collaborative in markdown",
|
"Collaborative markdown notes": "Note collaborative in markdown",
|
||||||
"Realtime collaborative markdown notes on all platforms.": "Note markdown collaborative per tutte le piattaforme.",
|
"Realtime collaborative markdown notes on all platforms.": "Note markdown collaborative in tempo reale per tutte le piattaforme.",
|
||||||
"Best way to write and share your knowledge in markdown.": "Miglior modo per scrivere e condividere le tue conoscenze in markdown.",
|
"Best way to write and share your knowledge in markdown.": "Miglior modo per scrivere e condividere le tue conoscenze in markdown.",
|
||||||
"Intro": "Intro",
|
"Intro": "Intro",
|
||||||
"History": "Cronologia",
|
"History": "Cronologia",
|
||||||
"New guest note": "Nuova nota ospite",
|
"New guest note": "Nuova nota ospite",
|
||||||
"Collaborate with URL": "Collabora tramite URL",
|
"Collaborate with URL": "Collabora tramite URL",
|
||||||
"Support charts and MathJax": "Supporta grafici e MathJax",
|
"Support charts and MathJax": "Supporta grafici e MathJax",
|
||||||
"Support slide mode": "Supporta slide",
|
"Support slide mode": "Supporta modalità slide",
|
||||||
"Sign In": "Registrati",
|
"Sign In": "Registrati",
|
||||||
"Below is the history from browser": "Below is the history from browser",
|
"Below is the history from browser": "Qui sotto c'è la cronologia del browser",
|
||||||
"Welcome!": "Benvenuto!",
|
"Welcome!": "Benvenuto!",
|
||||||
"New note": "Nuova nota",
|
"New note": "Nuova nota",
|
||||||
"or": "o",
|
"or": "o",
|
||||||
"Sign Out": "Disconettiti",
|
"Sign Out": "Disconettiti",
|
||||||
"Explore all features": "Escplora tutte le funzioni",
|
"Explore all features": "Esplora tutte le funzioni",
|
||||||
"Select tags...": "Seleziona tag...",
|
"Select tags...": "Seleziona tag...",
|
||||||
"Search keyword...": "Cerca...",
|
"Search keyword...": "Cerca...",
|
||||||
"Sort by title": "Ordina per titolo",
|
"Sort by title": "Ordina per titolo",
|
||||||
|
@ -29,7 +29,9 @@
|
||||||
"Import from browser": "Importa da browser",
|
"Import from browser": "Importa da browser",
|
||||||
"Releases": "Versioni",
|
"Releases": "Versioni",
|
||||||
"Are you sure?": "Sei sicuro?",
|
"Are you sure?": "Sei sicuro?",
|
||||||
"Cancel": "Cancella",
|
"Do you really want to delete this note?": "Vuoi veramente eliminare questa nota?",
|
||||||
|
"All users will lose their connection.": "Tutti gli utenti perderanno la loro connessione.",
|
||||||
|
"Cancel": "Annulla",
|
||||||
"Yes, do it!": "SI, fallo!",
|
"Yes, do it!": "SI, fallo!",
|
||||||
"Choose method": "Scegli metodo",
|
"Choose method": "Scegli metodo",
|
||||||
"Sign in via %s": "Registrati con %s",
|
"Sign in via %s": "Registrati con %s",
|
||||||
|
@ -50,7 +52,7 @@
|
||||||
"Upload Image": "Carica Immagine",
|
"Upload Image": "Carica Immagine",
|
||||||
"Menu": "Menu",
|
"Menu": "Menu",
|
||||||
"This page need refresh": "Questa pagina deve essere aggiornata",
|
"This page need refresh": "Questa pagina deve essere aggiornata",
|
||||||
"You have an incompatible client version.": "Hai una versione incompatibile.",
|
"You have an incompatible client version.": "La versione del tuo client è incompatibile.",
|
||||||
"Refresh to update.": "Ricarica per aggiornare.",
|
"Refresh to update.": "Ricarica per aggiornare.",
|
||||||
"New version available!": "Nuova versione disponibile!",
|
"New version available!": "Nuova versione disponibile!",
|
||||||
"See releases notes here": "Vedi note di rilascio qui",
|
"See releases notes here": "Vedi note di rilascio qui",
|
||||||
|
@ -60,6 +62,7 @@
|
||||||
"Refresh": "Ricarica",
|
"Refresh": "Ricarica",
|
||||||
"Contacts": "Contatti",
|
"Contacts": "Contatti",
|
||||||
"Report an issue": "Segnala un problema",
|
"Report an issue": "Segnala un problema",
|
||||||
|
"Meet us on %s": "Vieni a trovarci su %s",
|
||||||
"Send us email": "Inviaci una email",
|
"Send us email": "Inviaci una email",
|
||||||
"Documents": "Documenti",
|
"Documents": "Documenti",
|
||||||
"Features": "Caratteristiche",
|
"Features": "Caratteristiche",
|
||||||
|
@ -72,7 +75,7 @@
|
||||||
"Unordered List": "Lista non ordinata",
|
"Unordered List": "Lista non ordinata",
|
||||||
"Ordered List": "Lista ordinata",
|
"Ordered List": "Lista ordinata",
|
||||||
"Todo List": "Elenco",
|
"Todo List": "Elenco",
|
||||||
"Blockquote": "Blockquote",
|
"Blockquote": "Citazione",
|
||||||
"Bold font": "Grassetto",
|
"Bold font": "Grassetto",
|
||||||
"Italics font": "Corsivo",
|
"Italics font": "Corsivo",
|
||||||
"Strikethrough": "Barrato",
|
"Strikethrough": "Barrato",
|
||||||
|
@ -81,10 +84,10 @@
|
||||||
"Link": "Link",
|
"Link": "Link",
|
||||||
"Image": "Immagine",
|
"Image": "Immagine",
|
||||||
"Code": "Codice",
|
"Code": "Codice",
|
||||||
"Externals": "Esterno",
|
"Externals": "Esterni",
|
||||||
"This is a alert area.": "Questa è un avviso.",
|
"This is a alert area.": "Questa è un area di avviso.",
|
||||||
"Revert": "Revert",
|
"Revert": "Annulla",
|
||||||
"Import from clipboard": "Imposta dagli Appunti",
|
"Import from clipboard": "Importa dagli appunti",
|
||||||
"Paste your markdown or webpage here...": "Incollare il markdown o una pagina web qui...",
|
"Paste your markdown or webpage here...": "Incollare il markdown o una pagina web qui...",
|
||||||
"Clear": "Pulisci",
|
"Clear": "Pulisci",
|
||||||
"This note is locked": "Questa nota è bloccata",
|
"This note is locked": "Questa nota è bloccata",
|
||||||
|
@ -100,5 +103,13 @@
|
||||||
"Select From Available Snippets": "Seleziona da snippets disponibili",
|
"Select From Available Snippets": "Seleziona da snippets disponibili",
|
||||||
"OR": "O",
|
"OR": "O",
|
||||||
"Export to Snippet": "Esporta Snippet",
|
"Export to Snippet": "Esporta Snippet",
|
||||||
"Select Visibility Level": "Seleziona livello visibilità"
|
"Select Visibility Level": "Seleziona livello visibilità",
|
||||||
|
"Night Theme": "Tema Scuro",
|
||||||
|
"Follow us on %s and %s.": "Seguici su %s, e %s.",
|
||||||
|
"Privacy": "Privacy",
|
||||||
|
"Terms of Use": "Termini di Utilizzo",
|
||||||
|
"Do you really want to delete your user account?": "Vuoi veramente cancellare il tuo account utente?",
|
||||||
|
"This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Questo cancellerà il tuo account, tutte le note di cui sei proprietario e rimuoverà i riferimenti al tuo account dalle altre note.",
|
||||||
|
"Delete user": "Elimina utente",
|
||||||
|
"Export user data": "Esporta dati utente"
|
||||||
}
|
}
|
|
@ -29,6 +29,8 @@
|
||||||
"Import from browser": "ブラウザからインポート",
|
"Import from browser": "ブラウザからインポート",
|
||||||
"Releases": "リリース",
|
"Releases": "リリース",
|
||||||
"Are you sure?": "本当にいいですか?",
|
"Are you sure?": "本当にいいですか?",
|
||||||
|
"Do you really want to delete this note?": "本当にこのノートを削除しますか?",
|
||||||
|
"All users will lose their connection.": "すべてのユーザーの接続が切断されます。",
|
||||||
"Cancel": "キャンセル",
|
"Cancel": "キャンセル",
|
||||||
"Yes, do it!": "はい",
|
"Yes, do it!": "はい",
|
||||||
"Choose method": "選択してください",
|
"Choose method": "選択してください",
|
||||||
|
@ -60,6 +62,7 @@
|
||||||
"Refresh": "リロード",
|
"Refresh": "リロード",
|
||||||
"Contacts": "コンタクト",
|
"Contacts": "コンタクト",
|
||||||
"Report an issue": "問題を報告する",
|
"Report an issue": "問題を報告する",
|
||||||
|
"Meet us on %s": "%sでチャットする",
|
||||||
"Send us email": "メールを送る",
|
"Send us email": "メールを送る",
|
||||||
"Documents": "ドキュメント",
|
"Documents": "ドキュメント",
|
||||||
"Features": "機能",
|
"Features": "機能",
|
||||||
|
@ -100,5 +103,13 @@
|
||||||
"Select From Available Snippets": "スニペットを一覧から選択してください",
|
"Select From Available Snippets": "スニペットを一覧から選択してください",
|
||||||
"OR": "または",
|
"OR": "または",
|
||||||
"Export to Snippet": "スニペットにエクスポート",
|
"Export to Snippet": "スニペットにエクスポート",
|
||||||
"Select Visibility Level": "公開範囲を選んでください"
|
"Select Visibility Level": "公開範囲を選んでください",
|
||||||
|
"Night Theme": "ナイトテーマ",
|
||||||
|
"Follow us on %s and %s.": "%s と %s でフォローしてください。",
|
||||||
|
"Privacy": "プライバシー",
|
||||||
|
"Terms of Use": "利用条件",
|
||||||
|
"Do you really want to delete your user account?": "本当にアカウントを削除しますか?",
|
||||||
|
"This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "この操作はあなたのアカウントとあなたの所有するすべてのノートを削除し、さらに他の人のノートからあなたのアカウントへの参照を除去します。",
|
||||||
|
"Delete user": "ユーザーの削除",
|
||||||
|
"Export user data": "ユーザーデータをエクスポート"
|
||||||
}
|
}
|
|
@ -1 +0,0 @@
|
||||||
locales/zh-TW.json
|
|
35
package.json
35
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "hackmd",
|
"name": "CodiMD",
|
||||||
"version": "1.1.1-ce",
|
"version": "1.2.0",
|
||||||
"description": "Realtime collaborative markdown notes on all platforms.",
|
"description": "Realtime collaborative markdown notes on all platforms.",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
|
@ -16,6 +16,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Idle.Js": "git+https://github.com/shawnmclean/Idle.js",
|
"Idle.Js": "git+https://github.com/shawnmclean/Idle.js",
|
||||||
|
"archiver": "^2.1.1",
|
||||||
"async": "^2.1.4",
|
"async": "^2.1.4",
|
||||||
"aws-sdk": "^2.7.20",
|
"aws-sdk": "^2.7.20",
|
||||||
"base64url": "^3.0.0",
|
"base64url": "^3.0.0",
|
||||||
|
@ -46,7 +47,7 @@
|
||||||
"graceful-fs": "^4.1.11",
|
"graceful-fs": "^4.1.11",
|
||||||
"handlebars": "^4.0.6",
|
"handlebars": "^4.0.6",
|
||||||
"helmet": "^3.3.0",
|
"helmet": "^3.3.0",
|
||||||
"highlight.js": "~9.9.0",
|
"highlight.js": "~9.12.0",
|
||||||
"i18n": "^0.8.3",
|
"i18n": "^0.8.3",
|
||||||
"imgur": "git+https://github.com/hackmdio/node-imgur.git",
|
"imgur": "git+https://github.com/hackmdio/node-imgur.git",
|
||||||
"ionicons": "~2.0.1",
|
"ionicons": "~2.0.1",
|
||||||
|
@ -75,26 +76,26 @@
|
||||||
"markdown-it-regexp": "^0.4.0",
|
"markdown-it-regexp": "^0.4.0",
|
||||||
"markdown-it-sub": "^1.0.0",
|
"markdown-it-sub": "^1.0.0",
|
||||||
"markdown-it-sup": "^1.0.0",
|
"markdown-it-sup": "^1.0.0",
|
||||||
"markdown-pdf": "^7.0.0",
|
"markdown-pdf": "^9.0.0",
|
||||||
"mathjax": "~2.7.0",
|
"mathjax": "~2.7.0",
|
||||||
"mermaid": "~7.1.0",
|
"mermaid": "~7.1.0",
|
||||||
"mattermost": "^3.4.0",
|
"mattermost": "^3.4.0",
|
||||||
"meta-marked": "^0.4.2",
|
"meta-marked": "^0.4.2",
|
||||||
"method-override": "^2.3.7",
|
"method-override": "^2.3.7",
|
||||||
"minimist": "^1.2.0",
|
"minimist": "^1.2.0",
|
||||||
"minio": "^3.1.3",
|
"minio": "^6.0.0",
|
||||||
"moment": "^2.17.1",
|
"moment": "^2.17.1",
|
||||||
"morgan": "^1.7.0",
|
"morgan": "^1.7.0",
|
||||||
"mysql": "^2.12.0",
|
"mysql": "^2.12.0",
|
||||||
"node-uuid": "^1.4.7",
|
"node-uuid": "^1.4.7",
|
||||||
"octicons": "~3.5.0",
|
"octicons": "~4.4.0",
|
||||||
"passport": "^0.3.2",
|
"passport": "^0.4.0",
|
||||||
"passport-dropbox-oauth2": "^1.1.0",
|
"passport-dropbox-oauth2": "^1.1.0",
|
||||||
"passport-facebook": "^2.1.1",
|
"passport-facebook": "^2.1.1",
|
||||||
"passport-github": "^1.1.0",
|
"passport-github": "^1.1.0",
|
||||||
"passport-gitlab2": "^2.2.0",
|
"passport-gitlab2": "^4.0.0",
|
||||||
"passport-google-oauth20": "^1.0.0",
|
"passport-google-oauth20": "^1.0.0",
|
||||||
"passport-ldapauth": "^0.6.0",
|
"passport-ldapauth": "^2.0.0",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
"passport-oauth2": "^1.4.0",
|
"passport-oauth2": "^1.4.0",
|
||||||
"passport-twitter": "^1.0.4",
|
"passport-twitter": "^1.0.4",
|
||||||
|
@ -104,7 +105,7 @@
|
||||||
"pg": "^6.1.2",
|
"pg": "^6.1.2",
|
||||||
"pg-hstore": "^2.3.2",
|
"pg-hstore": "^2.3.2",
|
||||||
"prismjs": "^1.6.0",
|
"prismjs": "^1.6.0",
|
||||||
"randomcolor": "^0.4.4",
|
"randomcolor": "^0.5.3",
|
||||||
"raphael": "git+https://github.com/dmitrybaranovskiy/raphael",
|
"raphael": "git+https://github.com/dmitrybaranovskiy/raphael",
|
||||||
"readline-sync": "^1.4.7",
|
"readline-sync": "^1.4.7",
|
||||||
"request": "^2.79.0",
|
"request": "^2.79.0",
|
||||||
|
@ -113,29 +114,29 @@
|
||||||
"select2": "^3.5.2-browserify",
|
"select2": "^3.5.2-browserify",
|
||||||
"sequelize": "^3.28.0",
|
"sequelize": "^3.28.0",
|
||||||
"sequelize-cli": "^2.5.1",
|
"sequelize-cli": "^2.5.1",
|
||||||
"shortid": "2.2.6",
|
"shortid": "2.2.8",
|
||||||
"socket.io": "~2.0.4",
|
"socket.io": "~2.0.4",
|
||||||
"socket.io-client": "~2.0.4",
|
"socket.io-client": "~2.0.4",
|
||||||
"spin.js": "^2.3.2",
|
"spin.js": "^2.3.2",
|
||||||
"sqlite3": "^3.1.8",
|
"sqlite3": "^4.0.1",
|
||||||
"store": "^1.3.20",
|
"store": "^2.0.12",
|
||||||
"string": "^3.3.3",
|
"string": "^3.3.3",
|
||||||
"tedious": "^1.14.0",
|
"tedious": "^1.14.0",
|
||||||
"to-markdown": "^3.0.3",
|
"to-markdown": "^3.0.3",
|
||||||
"toobusy-js": "^0.5.1",
|
"toobusy-js": "^0.5.1",
|
||||||
"uuid": "^3.1.0",
|
"uuid": "^3.1.0",
|
||||||
"uws": "~0.14.1",
|
"uws": "~0.14.1",
|
||||||
"validator": "^6.2.0",
|
"validator": "^10.4.0",
|
||||||
"velocity-animate": "^1.4.0",
|
"velocity-animate": "^1.4.0",
|
||||||
"visibilityjs": "^1.2.4",
|
"visibilityjs": "^1.2.4",
|
||||||
"viz.js": "^1.7.0",
|
"viz.js": "^1.7.0",
|
||||||
"winston": "^2.3.0",
|
"winston": "^2.3.0",
|
||||||
"xss": "^0.3.3"
|
"xss": "^1.0.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.x <10.x"
|
"node": ">=6.x <10.x"
|
||||||
},
|
},
|
||||||
"bugs": "https://github.com/hackmdio/hackmd/issues",
|
"bugs": "https://github.com/hackmdio/codimd/issues",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Collaborative",
|
"Collaborative",
|
||||||
"Markdown",
|
"Markdown",
|
||||||
|
@ -150,7 +151,7 @@
|
||||||
],
|
],
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/hackmdio/hackmd.git"
|
"url": "https://github.com/hackmdio/codimd.git"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-cli": "^6.18.0",
|
"babel-cli": "^6.18.0",
|
||||||
|
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
@ -93,6 +93,10 @@
|
||||||
color: #777;
|
color: #777;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.toc .invisable-node {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
.ui-toc {
|
.ui-toc {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 20px;
|
bottom: 20px;
|
||||||
|
|
|
@ -20,6 +20,24 @@ body.night{
|
||||||
background: #333 !important;
|
background: #333 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.toolbar {
|
||||||
|
background-color: #1c1c1e;
|
||||||
|
border: 1px solid #343434;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar > .btn-toolbar > .btn-group > .btn {
|
||||||
|
background-color: #1c1c1e;
|
||||||
|
padding: 5px;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar > .btn-toolbar > .btn-group > .btn:hover {
|
||||||
|
background-color: #383a3e;
|
||||||
|
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.CodeMirror {
|
.CodeMirror {
|
||||||
font-family: "Source Code Pro", Consolas, monaco, monospace;
|
font-family: "Source Code Pro", Consolas, monaco, monospace;
|
||||||
letter-spacing: 0.025em;
|
letter-spacing: 0.025em;
|
||||||
|
@ -292,7 +310,16 @@ body.night{
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.night .dropdown-menu{
|
.night .dropdown-menu > li > a {
|
||||||
|
color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.night .dropdown-menu > li > a:focus,
|
||||||
|
.night .dropdown-menu > li > a:hover {
|
||||||
|
color: #262626
|
||||||
|
}
|
||||||
|
|
||||||
|
.night .dropdown-menu {
|
||||||
background: #222;
|
background: #222;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -214,3 +214,7 @@
|
||||||
.markdown-body figure {
|
.markdown-body figure {
|
||||||
margin: 1em 40px;
|
margin: 1em 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.markdown-body img {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
|
@ -3,12 +3,12 @@ Features
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
===
|
===
|
||||||
<i class="fa fa-file-text"></i> **HackMD** is a realtime, multi-platform collaborative markdown note editor.
|
<i class="fa fa-file-text"></i> **CodiMD** is a real-time, multi-platform collaborative markdown note editor.
|
||||||
This means that you can write notes with other people on your **desktop**, **tablet** or even on the **phone**.
|
This means that you can write notes with other people on your **desktop**, **tablet** or even on the **phone**.
|
||||||
You can sign-in via multiple auth providers like **Facebook**, **Twitter**, **GitHub** and many more on the [_homepage_](/).
|
You can sign-in via multiple auth providers like **Facebook**, **Twitter**, **GitHub** and many more on the [_homepage_](/).
|
||||||
|
|
||||||
If you experience any _issues_, feel free to report it on [**GitHub**](https://github.com/hackmdio/hackmd/issues).
|
If you experience any _issues_, feel free to report it on [**GitHub**](https://github.com/hackmdio/codimd/issues).
|
||||||
Or meet us on [**Matrix.org**](https://riot.im/app/#/room/#hackmd:matrix.org) or [**Gitter**](https://gitter.im/hackmdio/hackmd) for dev-talk and interactive help.
|
Or meet us on [**Matrix.org**](https://riot.im/app/#/room/#codimd:matrix.org) or [**Gitter**](https://gitter.im/hackmdio/hackmd) for dev-talk and interactive help.
|
||||||
**Thank you very much!**
|
**Thank you very much!**
|
||||||
|
|
||||||
Workspace
|
Workspace
|
||||||
|
@ -26,7 +26,7 @@ Workspace
|
||||||
<i class="fa fa-toggle-off fa-fw"></i> Edit: See only the editor.
|
<i class="fa fa-toggle-off fa-fw"></i> Edit: See only the editor.
|
||||||
|
|
||||||
## Night Mode:
|
## Night Mode:
|
||||||
When you are tired of a white screen and like a night mode, click on the little moon <i class="fa fa-moon-o"></i> and turn on the night view of HackMD.
|
When you are tired of a white screen and like a night mode, click on the little moon <i class="fa fa-moon-o"></i> and turn on the night view of CodiMD.
|
||||||
|
|
||||||
The editor view, which is in night mode by default, can also be toggled between night and day view using the the little sun<i class="fa fa-sun-o fa-fw"></i>.
|
The editor view, which is in night mode by default, can also be toggled between night and day view using the the little sun<i class="fa fa-sun-o fa-fw"></i>.
|
||||||
|
|
||||||
|
|
17
public/docs/privacy.md.example
Normal file
17
public/docs/privacy.md.example
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
Privacy
|
||||||
|
===
|
||||||
|
|
||||||
|
We process the following data, for the following purposes:
|
||||||
|
|
||||||
|
|your data|our usage|
|
||||||
|
|---------|---------|
|
||||||
|
|IP-Address|Used to communicate with your browser and our servers. It's may exposed to third-parties which provide resources for this service. These services are, depending on your login method, the document you visit and the setup of this instance: Google, Disqus, MathJax, GitHub, SlideShare/LinkedIn, yahoo, Gravatar, Imgur, Amazon, and Cloudflare.|
|
||||||
|
|Usernames and profiles|Your username as well as user profiles that are connected with it are transmitted and stored by us to provide a useful login integration with services like GitHub, Facebook, Twitter, GitLab, Dropbox, Google. Depending on the setup of this CodiMD instance there are maybe other third-parties involved using SAML, LDAP or the integration with a Mattermost instance.|
|
||||||
|
|Profile pictures| Your profile picture is either loaded from the service you used to login, the CodiMD instance or Gravatar.|
|
||||||
|
|Uploaded pictures| Pictures that are uploaded for documents are either uploaded to Amazon S3, Imgur, a minio instance or the local filesystem of the CodiMD server.|
|
||||||
|
|
||||||
|
All account data and notes are stored in a mysql/postgres/sqlite database. Besides the user accounts and the document themselves also relationships between the documents and the user accounts are stored. This includes ownership, authorship and revisions of all changes made during the creation of a note.
|
||||||
|
|
||||||
|
To delete your account and all your notes owned by your user account, you can find a button in the drop down menu on the front page.
|
||||||
|
|
||||||
|
The deletion of guest notes is not possible. These don't have any ownership and this means we can't connect these to you or anyone else. If you participated in a guest note or a note owned by someone else, your authorship for the revisions is removed from these notes as well. But the content you created will stay in place as the integrity of these notes has to stay untouched.
|
|
@ -1,6 +1,54 @@
|
||||||
Release Notes
|
Release Notes
|
||||||
===
|
===
|
||||||
|
|
||||||
|
<i class="fa fa-tag"></i> 1.2.0 <i class="fa fa-clock-o"></i> 2018-06-28 00:00
|
||||||
|
---
|
||||||
|
|
||||||
|
### Announcement
|
||||||
|
* HackMD CE is renamed to CodiMD to prevent confusion. [For details see here](https://github.com/hackmdio/codimd#hackmd-ce-became-codimd)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
* Show full title by hovering over to table of contents entries
|
||||||
|
* Add generic OAUTH2 support for authentication
|
||||||
|
* Redirect unauthenticated user to login page on "forbidden" pages
|
||||||
|
* Add ability to add ToS and privacy documents without code changes
|
||||||
|
* Add account deletion as part of user self-management
|
||||||
|
* Add download of all own notes
|
||||||
|
* Add privacy policy example (no legal advice)
|
||||||
|
* Increase checkbox size on slides
|
||||||
|
* Add support for Azure blob storage for image uploads
|
||||||
|
* Add Korean translation
|
||||||
|
* Add note about official K8s chart for deployment
|
||||||
|
* Add toolbar for markdown shortcuts in editor
|
||||||
|
* Add ability to disable Gravatar integration
|
||||||
|
* Add print icon to slide menu which leads to the print view.
|
||||||
|
* Add sequelize to setup instructions
|
||||||
|
* Update various packages
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* Fix local writes for non-existing translations in production
|
||||||
|
* Fix wrong documentation about default image upload type
|
||||||
|
* Fix possible error if CodiMD is started with wrong working directory
|
||||||
|
* Fix issues caused by cached/cacheeable client config
|
||||||
|
* Fix issues caused by notes created via curl/API with CRLF line endings
|
||||||
|
* Fix broken images for downloaded PDFs while using `filesystem` as `imageUploadType`
|
||||||
|
* Fix Unicode URLs when using `allowFreeURL=true`
|
||||||
|
|
||||||
|
### Refactors
|
||||||
|
* Split auth documentation into multiple documents
|
||||||
|
|
||||||
|
### Removes
|
||||||
|
* Remove polyfill for `useCDN=false` setups
|
||||||
|
* Remove unused and no longer needed symlink from translations
|
||||||
|
|
||||||
|
### Honorable mentions
|
||||||
|
* [Adam Hoka (ahoka)](https://github.com/ahoka)
|
||||||
|
* [Edgar Z. Alvarenga (aivuk)](https://github.com/aivuk)
|
||||||
|
* [Jacob Burden (jekrb)](https://github.com/jekrb)
|
||||||
|
* [Pedro Ferreira (pferreir)](https://github.com/pferreir)
|
||||||
|
* [TC Liu (liuderchi)](https://github.com/liuderchi)
|
||||||
|
|
||||||
|
|
||||||
<i class="fa fa-tag"></i> 1.1.1-ce <i class="fa fa-clock-o"></i> 2018-05-23 12:00
|
<i class="fa fa-tag"></i> 1.1.1-ce <i class="fa fa-clock-o"></i> 2018-05-23 12:00
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -266,4 +266,12 @@ Press `B` or `.` on your keyboard to pause the presentation. This is helpful whe
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Print your Slides
|
||||||
|
|
||||||
|
Down below you can find a print icon<i class="fa fa-fw fa-print"></i>.
|
||||||
|
|
||||||
|
After you click on it, use the print function of your browser (either CTRL+P or cmd+P) to print the slides as PDF.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
# The End
|
# The End
|
||||||
|
|
|
@ -96,7 +96,7 @@ dir: rtl
|
||||||
breaks
|
breaks
|
||||||
---
|
---
|
||||||
This option means the hardbreaks in the note will be parsed or be ignore.
|
This option means the hardbreaks in the note will be parsed or be ignore.
|
||||||
The original markdown syntax breaks only if you put space twice, but HackMD choose to breaks every time you enter a break.
|
The original markdown syntax breaks only if you put space twice, but CodiMD choose to breaks every time you enter a break.
|
||||||
You can only use whether `true` or `false`.
|
You can only use whether `true` or `false`.
|
||||||
|
|
||||||
> default: not set (which will be true)
|
> default: not set (which will be true)
|
||||||
|
@ -125,7 +125,7 @@ This option allow you to enable Disqus with your shortname.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
```xml
|
```xml
|
||||||
disqus: hackmd
|
disqus: codimd
|
||||||
```
|
```
|
||||||
|
|
||||||
slideOptions
|
slideOptions
|
||||||
|
|
|
@ -34,25 +34,25 @@ import S from 'string'
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
valueNames: ['id', 'text', 'timestamp', 'fromNow', 'time', 'tags', 'pinned'],
|
valueNames: ['id', 'text', 'timestamp', 'fromNow', 'time', 'tags', 'pinned'],
|
||||||
item: '<li class="col-xs-12 col-sm-6 col-md-6 col-lg-4">' +
|
item: `<li class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
|
||||||
'<span class="id" style="display:none;"></span>' +
|
<span class="id" style="display:none;"></span>
|
||||||
'<a href="#">' +
|
<a href="#">
|
||||||
'<div class="item">' +
|
<div class="item">
|
||||||
'<div class="ui-history-pin fa fa-thumb-tack fa-fw"></div>' +
|
<div class="ui-history-pin fa fa-thumb-tack fa-fw"></div>
|
||||||
'<div class="ui-history-close fa fa-close fa-fw" data-toggle="modal" data-target=".delete-modal"></div>' +
|
<div class="ui-history-close fa fa-close fa-fw" data-toggle="modal" data-target=".delete-history-modal"></div>
|
||||||
'<div class="content">' +
|
<div class="content">
|
||||||
'<h4 class="text"></h4>' +
|
<h4 class="text"></h4>
|
||||||
'<p>' +
|
<p>
|
||||||
'<i><i class="fa fa-clock-o"></i> visited </i><i class="fromNow"></i>' +
|
<i><i class="fa fa-clock-o"></i> visited </i><i class="fromNow"></i>
|
||||||
'<br>' +
|
<br>
|
||||||
'<i class="timestamp" style="display:none;"></i>' +
|
<i class="timestamp" style="display:none;"></i>
|
||||||
'<i class="time"></i>' +
|
<i class="time"></i>
|
||||||
'</p>' +
|
</p>
|
||||||
'<p class="tags"></p>' +
|
<p class="tags"></p>
|
||||||
'</div>' +
|
</div>
|
||||||
'</div>' +
|
</div>
|
||||||
'</a>' +
|
</a>
|
||||||
'</li>',
|
</li>`,
|
||||||
page: 18,
|
page: 18,
|
||||||
pagination: [{
|
pagination: [{
|
||||||
outerWindow: 1
|
outerWindow: 1
|
||||||
|
@ -208,8 +208,8 @@ function historyCloseClick (e) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
const id = $(this).closest('a').siblings('span').html()
|
const id = $(this).closest('a').siblings('span').html()
|
||||||
const value = historyList.get('id', id)[0]._values
|
const value = historyList.get('id', id)[0]._values
|
||||||
$('.ui-delete-modal-msg').text('Do you really want to delete below history?')
|
$('.ui-delete-history-modal-msg').text('Do you really want to delete below history?')
|
||||||
$('.ui-delete-modal-item').html(`<i class="fa fa-file-text"></i> ${value.text}<br><i class="fa fa-clock-o"></i> ${value.time}`)
|
$('.ui-delete-history-modal-item').html(`<i class="fa fa-file-text"></i> ${value.text}<br><i class="fa fa-clock-o"></i> ${value.time}`)
|
||||||
clearHistory = false
|
clearHistory = false
|
||||||
deleteId = id
|
deleteId = id
|
||||||
}
|
}
|
||||||
|
@ -277,7 +277,7 @@ function deleteHistory () {
|
||||||
checkHistoryList()
|
checkHistoryList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$('.delete-modal').modal('hide')
|
$('.delete-history-modal').modal('hide')
|
||||||
deleteId = null
|
deleteId = null
|
||||||
clearHistory = false
|
clearHistory = false
|
||||||
})
|
})
|
||||||
|
@ -297,12 +297,12 @@ function deleteHistory () {
|
||||||
deleteId = null
|
deleteId = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
$('.delete-modal').modal('hide')
|
$('.delete-history-modal').modal('hide')
|
||||||
clearHistory = false
|
clearHistory = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.ui-delete-modal-confirm').click(() => {
|
$('.ui-delete-history-modal-confirm').click(() => {
|
||||||
deleteHistory()
|
deleteHistory()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ $('.ui-save-history').click(() => {
|
||||||
const blob = new Blob([history], {
|
const blob = new Blob([history], {
|
||||||
type: 'application/json;charset=utf-8'
|
type: 'application/json;charset=utf-8'
|
||||||
})
|
})
|
||||||
saveAs(blob, `hackmd_history_${moment().format('YYYYMMDDHHmmss')}`, true)
|
saveAs(blob, `codimd_history_${moment().format('YYYYMMDDHHmmss')}`, true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -342,8 +342,8 @@ $('.ui-open-history').bind('change', e => {
|
||||||
})
|
})
|
||||||
|
|
||||||
$('.ui-clear-history').click(() => {
|
$('.ui-clear-history').click(() => {
|
||||||
$('.ui-delete-modal-msg').text('Do you really want to clear all history?')
|
$('.ui-delete-history-modal-msg').text('Do you really want to clear all history?')
|
||||||
$('.ui-delete-modal-item').html('There is no turning back.')
|
$('.ui-delete-history-modal-item').html('There is no turning back.')
|
||||||
clearHistory = true
|
clearHistory = true
|
||||||
deleteId = null
|
deleteId = null
|
||||||
})
|
})
|
||||||
|
@ -371,6 +371,10 @@ $('.ui-refresh-history').click(() => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$('.ui-delete-user-modal-cancel').click(() => {
|
||||||
|
$('.ui-delete-user').parent().removeClass('active')
|
||||||
|
})
|
||||||
|
|
||||||
$('.ui-logout').click(() => {
|
$('.ui-logout').click(() => {
|
||||||
clearLoginState()
|
clearLoginState()
|
||||||
location.href = `${serverurl}/logout`
|
location.href = `${serverurl}/logout`
|
||||||
|
|
|
@ -105,9 +105,9 @@ function getTitle (view) {
|
||||||
export function renderTitle (view) {
|
export function renderTitle (view) {
|
||||||
let title = getTitle(view)
|
let title = getTitle(view)
|
||||||
if (title) {
|
if (title) {
|
||||||
title += ' - HackMD'
|
title += ' - CodiMD'
|
||||||
} else {
|
} else {
|
||||||
title = 'HackMD - Collaborative markdown notes'
|
title = 'CodiMD - Collaborative markdown notes'
|
||||||
}
|
}
|
||||||
return title
|
return title
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* eslint-env browser, jquery */
|
/* eslint-env browser, jquery */
|
||||||
/* global serverurl, Cookies, moment */
|
/* global serverurl, moment */
|
||||||
|
|
||||||
import store from 'store'
|
import store from 'store'
|
||||||
import S from 'string'
|
import S from 'string'
|
||||||
|
@ -64,13 +64,7 @@ export function saveHistory (notehistory) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveHistoryToStorage (notehistory) {
|
function saveHistoryToStorage (notehistory) {
|
||||||
if (store.enabled) { store.set('notehistory', JSON.stringify(notehistory)) } else { saveHistoryToCookie(notehistory) }
|
store.set('notehistory', JSON.stringify(notehistory))
|
||||||
}
|
|
||||||
|
|
||||||
function saveHistoryToCookie (notehistory) {
|
|
||||||
Cookies.set('notehistory', notehistory, {
|
|
||||||
expires: 365
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveHistoryToServer (notehistory) {
|
function saveHistoryToServer (notehistory) {
|
||||||
|
@ -150,35 +144,17 @@ export function writeHistory (title, tags) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function writeHistoryToCookie (title, tags) {
|
|
||||||
var notehistory
|
|
||||||
try {
|
|
||||||
notehistory = Cookies.getJSON('notehistory')
|
|
||||||
} catch (err) {
|
|
||||||
notehistory = []
|
|
||||||
}
|
|
||||||
if (!notehistory) { notehistory = [] }
|
|
||||||
const newnotehistory = generateHistory(title, tags, notehistory)
|
|
||||||
saveHistoryToCookie(newnotehistory)
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeHistoryToStorage (title, tags) {
|
function writeHistoryToStorage (title, tags) {
|
||||||
if (store.enabled) {
|
|
||||||
let data = store.get('notehistory')
|
let data = store.get('notehistory')
|
||||||
var notehistory
|
let notehistory
|
||||||
if (data) {
|
if (data && typeof data === 'string') {
|
||||||
if (typeof data === 'string') { data = JSON.parse(data) }
|
notehistory = JSON.parse(data)
|
||||||
notehistory = data
|
|
||||||
} else {
|
} else {
|
||||||
notehistory = []
|
notehistory = []
|
||||||
}
|
}
|
||||||
if (!notehistory) { notehistory = [] }
|
|
||||||
|
|
||||||
const newnotehistory = generateHistory(title, tags, notehistory)
|
const newnotehistory = generateHistory(title, tags, notehistory)
|
||||||
saveHistoryToStorage(newnotehistory)
|
saveHistoryToStorage(newnotehistory)
|
||||||
} else {
|
|
||||||
writeHistoryToCookie(title, tags)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Array.isArray) {
|
if (!Array.isArray) {
|
||||||
|
@ -236,20 +212,13 @@ function getServerHistory (callback) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCookieHistory (callback) {
|
|
||||||
callback(Cookies.getJSON('notehistory'))
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getStorageHistory (callback) {
|
export function getStorageHistory (callback) {
|
||||||
if (store.enabled) {
|
|
||||||
let data = store.get('notehistory')
|
let data = store.get('notehistory')
|
||||||
if (data) {
|
if (data) {
|
||||||
if (typeof data === 'string') { data = JSON.parse(data) }
|
if (typeof data === 'string') { data = JSON.parse(data) }
|
||||||
callback(data)
|
callback(data)
|
||||||
} else { getCookieHistory(callback) }
|
|
||||||
} else {
|
|
||||||
getCookieHistory(callback)
|
|
||||||
}
|
}
|
||||||
|
callback([])
|
||||||
}
|
}
|
||||||
|
|
||||||
export function parseHistory (list, callback) {
|
export function parseHistory (list, callback) {
|
||||||
|
@ -275,21 +244,13 @@ export function parseServerToHistory (list, callback) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseCookieToHistory (list, callback) {
|
|
||||||
const notehistory = Cookies.getJSON('notehistory')
|
|
||||||
parseToHistory(list, notehistory, callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function parseStorageToHistory (list, callback) {
|
export function parseStorageToHistory (list, callback) {
|
||||||
if (store.enabled) {
|
|
||||||
let data = store.get('notehistory')
|
let data = store.get('notehistory')
|
||||||
if (data) {
|
if (data) {
|
||||||
if (typeof data === 'string') { data = JSON.parse(data) }
|
if (typeof data === 'string') { data = JSON.parse(data) }
|
||||||
parseToHistory(list, data, callback)
|
parseToHistory(list, data, callback)
|
||||||
} else { parseCookieToHistory(list, callback) }
|
|
||||||
} else {
|
|
||||||
parseCookieToHistory(list, callback)
|
|
||||||
}
|
}
|
||||||
|
parseToHistory(list, [], callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseToHistory (list, notehistory, callback) {
|
function parseToHistory (list, notehistory, callback) {
|
||||||
|
|
|
@ -566,6 +566,9 @@ var previousFocusOnEditor = null
|
||||||
|
|
||||||
function checkEditorStyle () {
|
function checkEditorStyle () {
|
||||||
var desireHeight = editorInstance.statusBar ? (ui.area.edit.height() - editorInstance.statusBar.outerHeight()) : ui.area.edit.height()
|
var desireHeight = editorInstance.statusBar ? (ui.area.edit.height() - editorInstance.statusBar.outerHeight()) : ui.area.edit.height()
|
||||||
|
if (editorInstance.toolBar) {
|
||||||
|
desireHeight = desireHeight - editorInstance.toolBar.outerHeight()
|
||||||
|
}
|
||||||
// set editor height and min height based on scrollbar style and mode
|
// set editor height and min height based on scrollbar style and mode
|
||||||
var scrollbarStyle = editor.getOption('scrollbarStyle')
|
var scrollbarStyle = editor.getOption('scrollbarStyle')
|
||||||
if (scrollbarStyle === 'overlay' || appState.currentMode === modeType.both) {
|
if (scrollbarStyle === 'overlay' || appState.currentMode === modeType.both) {
|
||||||
|
@ -804,6 +807,10 @@ function changeMode (type) {
|
||||||
editorInstance.addStatusBar()
|
editorInstance.addStatusBar()
|
||||||
editorInstance.updateStatusBar()
|
editorInstance.updateStatusBar()
|
||||||
}
|
}
|
||||||
|
// add and update tool bar
|
||||||
|
if (!editorInstance.toolBar) {
|
||||||
|
editorInstance.addToolBar()
|
||||||
|
}
|
||||||
// work around foldGutter might not init properly
|
// work around foldGutter might not init properly
|
||||||
editor.setOption('foldGutter', false)
|
editor.setOption('foldGutter', false)
|
||||||
editor.setOption('foldGutter', true)
|
editor.setOption('foldGutter', true)
|
||||||
|
|
|
@ -7,7 +7,7 @@ export const debug = window.debug || false
|
||||||
export const port = window.location.port
|
export const port = window.location.port
|
||||||
export const serverurl = `${window.location.protocol}//${domain || window.location.hostname}${port ? ':' + port : ''}${urlpath ? '/' + urlpath : ''}`
|
export const serverurl = `${window.location.protocol}//${domain || window.location.hostname}${port ? ':' + port : ''}${urlpath ? '/' + urlpath : ''}`
|
||||||
window.serverurl = serverurl
|
window.serverurl = serverurl
|
||||||
export const noteid = urlpath ? window.location.pathname.slice(urlpath.length + 1, window.location.pathname.length).split('/')[1] : window.location.pathname.split('/')[1]
|
export const noteid = decodeURIComponent(urlpath ? window.location.pathname.slice(urlpath.length + 1, window.location.pathname.length).split('/')[1] : window.location.pathname.split('/')[1])
|
||||||
export const noteurl = `${serverurl}/${noteid}`
|
export const noteurl = `${serverurl}/${noteid}`
|
||||||
|
|
||||||
export const version = window.version
|
export const version = window.version
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import * as utils from './utils'
|
import * as utils from './utils'
|
||||||
import config from './config'
|
import config from './config'
|
||||||
import statusBarTemplate from './statusbar.html'
|
import statusBarTemplate from './statusbar.html'
|
||||||
|
import toolBarTemplate from './toolbar.html'
|
||||||
|
|
||||||
/* config section */
|
/* config section */
|
||||||
const isMac = CodeMirror.keyMap.default === CodeMirror.keyMap.macDefault
|
const isMac = CodeMirror.keyMap.default === CodeMirror.keyMap.macDefault
|
||||||
|
@ -136,6 +137,88 @@ export default class Editor {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addToolBar () {
|
||||||
|
this.toolBar = $(toolBarTemplate)
|
||||||
|
this.toolbarPanel = this.editor.addPanel(this.toolBar[0], {
|
||||||
|
position: 'top'
|
||||||
|
})
|
||||||
|
|
||||||
|
var makeBold = $('#makeBold')
|
||||||
|
var makeItalic = $('#makeItalic')
|
||||||
|
var makeStrike = $('#makeStrike')
|
||||||
|
var makeHeader = $('#makeHeader')
|
||||||
|
var makeCode = $('#makeCode')
|
||||||
|
var makeQuote = $('#makeQuote')
|
||||||
|
var makeGenericList = $('#makeGenericList')
|
||||||
|
var makeOrderedList = $('#makeOrderedList')
|
||||||
|
var makeCheckList = $('#makeCheckList')
|
||||||
|
var makeLink = $('#makeLink')
|
||||||
|
var makeImage = $('#makeImage')
|
||||||
|
var makeTable = $('#makeTable')
|
||||||
|
var makeLine = $('#makeLine')
|
||||||
|
var makeComment = $('#makeComment')
|
||||||
|
|
||||||
|
makeBold.click(() => {
|
||||||
|
utils.wrapTextWith(this.editor, this.editor, '**')
|
||||||
|
this.editor.focus()
|
||||||
|
})
|
||||||
|
|
||||||
|
makeItalic.click(() => {
|
||||||
|
utils.wrapTextWith(this.editor, this.editor, '*')
|
||||||
|
this.editor.focus()
|
||||||
|
})
|
||||||
|
|
||||||
|
makeStrike.click(() => {
|
||||||
|
utils.wrapTextWith(this.editor, this.editor, '~~')
|
||||||
|
this.editor.focus()
|
||||||
|
})
|
||||||
|
|
||||||
|
makeHeader.click(() => {
|
||||||
|
utils.insertHeader(this.editor)
|
||||||
|
})
|
||||||
|
|
||||||
|
makeCode.click(() => {
|
||||||
|
utils.wrapTextWith(this.editor, this.editor, '```')
|
||||||
|
this.editor.focus()
|
||||||
|
})
|
||||||
|
|
||||||
|
makeQuote.click(() => {
|
||||||
|
utils.insertOnStartOfLines(this.editor, '> ')
|
||||||
|
})
|
||||||
|
|
||||||
|
makeGenericList.click(() => {
|
||||||
|
utils.insertOnStartOfLines(this.editor, '* ')
|
||||||
|
})
|
||||||
|
|
||||||
|
makeOrderedList.click(() => {
|
||||||
|
utils.insertOnStartOfLines(this.editor, '1. ')
|
||||||
|
})
|
||||||
|
|
||||||
|
makeCheckList.click(() => {
|
||||||
|
utils.insertOnStartOfLines(this.editor, '- [ ] ')
|
||||||
|
})
|
||||||
|
|
||||||
|
makeLink.click(() => {
|
||||||
|
utils.insertLink(this.editor, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
makeImage.click(() => {
|
||||||
|
utils.insertLink(this.editor, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
makeTable.click(() => {
|
||||||
|
utils.insertText(this.editor, '\n\n| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Text | Text | Text |\n')
|
||||||
|
})
|
||||||
|
|
||||||
|
makeLine.click(() => {
|
||||||
|
utils.insertText(this.editor, '\n----\n')
|
||||||
|
})
|
||||||
|
|
||||||
|
makeComment.click(() => {
|
||||||
|
utils.insertText(this.editor, '> []')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
addStatusBar () {
|
addStatusBar () {
|
||||||
this.statusBar = $(statusBarTemplate)
|
this.statusBar = $(statusBarTemplate)
|
||||||
this.statusCursor = this.statusBar.find('.status-cursor > .status-line-column')
|
this.statusCursor = this.statusBar.find('.status-cursor > .status-line-column')
|
||||||
|
|
48
public/js/lib/editor/toolbar.html
Normal file
48
public/js/lib/editor/toolbar.html
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
<div class="toolbar">
|
||||||
|
<div class="btn-toolbar" role="toolbar" aria-label="Editor toolbar">
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<a id="makeBold" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Bold">
|
||||||
|
<i class="fa fa-bold fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeItalic" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Italic">
|
||||||
|
<i class="fa fa-italic fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeStrike" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Strikethrough">
|
||||||
|
<i class="fa fa-strikethrough fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeHeader" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Heading">
|
||||||
|
<i class="fa fa-h1 fa-fw">H</i>
|
||||||
|
</a>
|
||||||
|
<a id="makeCode" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Code">
|
||||||
|
<i class="fa fa-code fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeQuote" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Quote">
|
||||||
|
<i class="fa fa-quote-right fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeGenericList" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="List">
|
||||||
|
<i class="fa fa-list fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeOrderedList" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Numbered List">
|
||||||
|
<i class="fa fa-list-ol fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeCheckList" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Check List">
|
||||||
|
<i class="fa fa-check-square fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeLink" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Link">
|
||||||
|
<i class="fa fa-link fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeImage" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Image">
|
||||||
|
<i class="fa fa-image fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeTable" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Table">
|
||||||
|
<i class="fa fa-table fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeLine" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Line">
|
||||||
|
<i class="fa fa-minus fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
<a id="makeComment" class="btn btn-sm btn-dark text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" title="Comment">
|
||||||
|
<i class="fa fa-comment fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -3,39 +3,39 @@ export function wrapTextWith (editor, cm, symbol) {
|
||||||
if (!cm.getSelection()) {
|
if (!cm.getSelection()) {
|
||||||
return CodeMirror.Pass
|
return CodeMirror.Pass
|
||||||
} else {
|
} else {
|
||||||
var ranges = cm.listSelections()
|
let ranges = cm.listSelections()
|
||||||
for (var i = 0; i < ranges.length; i++) {
|
for (let i = 0; i < ranges.length; i++) {
|
||||||
var range = ranges[i]
|
let range = ranges[i]
|
||||||
if (!range.empty()) {
|
if (!range.empty()) {
|
||||||
const from = range.from()
|
const from = range.from()
|
||||||
const to = range.to()
|
const to = range.to()
|
||||||
|
|
||||||
if (symbol !== 'Backspace') {
|
if (symbol !== 'Backspace') {
|
||||||
cm.replaceRange(symbol, to, to, '+input')
|
let selection = cm.getRange(from, to)
|
||||||
cm.replaceRange(symbol, from, from, '+input')
|
let anchorIndex = editor.indexFromPos(ranges[i].anchor)
|
||||||
// workaround selection range not correct after add symbol
|
let headIndex = editor.indexFromPos(ranges[i].head)
|
||||||
var _ranges = cm.listSelections()
|
cm.replaceRange(symbol + selection + symbol, from, to, '+input')
|
||||||
var anchorIndex = editor.indexFromPos(_ranges[i].anchor)
|
|
||||||
var headIndex = editor.indexFromPos(_ranges[i].head)
|
|
||||||
if (anchorIndex > headIndex) {
|
if (anchorIndex > headIndex) {
|
||||||
_ranges[i].anchor.ch--
|
ranges[i].anchor.ch += symbol.length
|
||||||
|
ranges[i].head.ch += symbol.length
|
||||||
} else {
|
} else {
|
||||||
_ranges[i].head.ch--
|
ranges[i].head.ch += symbol.length
|
||||||
|
ranges[i].anchor.ch += symbol.length
|
||||||
}
|
}
|
||||||
cm.setSelections(_ranges)
|
cm.setSelections(ranges)
|
||||||
} else {
|
} else {
|
||||||
var preEndPos = {
|
let preEndPos = {
|
||||||
line: to.line,
|
line: to.line,
|
||||||
ch: to.ch + 1
|
ch: to.ch + symbol.length
|
||||||
}
|
}
|
||||||
var preText = cm.getRange(to, preEndPos)
|
let preText = cm.getRange(to, preEndPos)
|
||||||
var preIndex = wrapSymbols.indexOf(preText)
|
let preIndex = wrapSymbols.indexOf(preText)
|
||||||
var postEndPos = {
|
let postEndPos = {
|
||||||
line: from.line,
|
line: from.line,
|
||||||
ch: from.ch - 1
|
ch: from.ch - symbol.length
|
||||||
}
|
}
|
||||||
var postText = cm.getRange(postEndPos, from)
|
let postText = cm.getRange(postEndPos, from)
|
||||||
var postIndex = wrapSymbols.indexOf(postText)
|
let postIndex = wrapSymbols.indexOf(postText)
|
||||||
// check if surround symbol are list in array and matched
|
// check if surround symbol are list in array and matched
|
||||||
if (preIndex > -1 && postIndex > -1 && preIndex === postIndex) {
|
if (preIndex > -1 && postIndex > -1 && preIndex === postIndex) {
|
||||||
cm.replaceRange('', to, preEndPos, '+delete')
|
cm.replaceRange('', to, preEndPos, '+delete')
|
||||||
|
@ -46,3 +46,76 @@ export function wrapTextWith (editor, cm, symbol) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function insertText (cm, text, cursorEnd = 0) {
|
||||||
|
let cursor = cm.getCursor()
|
||||||
|
cm.replaceSelection(text, cursor, cursor)
|
||||||
|
cm.focus()
|
||||||
|
cm.setCursor({line: cursor.line, ch: cursor.ch + cursorEnd})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function insertLink (cm, isImage) {
|
||||||
|
let cursor = cm.getCursor()
|
||||||
|
let ranges = cm.listSelections()
|
||||||
|
const linkEnd = '](https://)'
|
||||||
|
const symbol = (isImage) ? '![' : '['
|
||||||
|
|
||||||
|
for (let i = 0; i < ranges.length; i++) {
|
||||||
|
let range = ranges[i]
|
||||||
|
if (!range.empty()) {
|
||||||
|
const from = range.from()
|
||||||
|
const to = range.to()
|
||||||
|
let anchorIndex = editor.indexFromPos(ranges[i].anchor)
|
||||||
|
let headIndex = editor.indexFromPos(ranges[i].head)
|
||||||
|
let selection = cm.getRange(from, to)
|
||||||
|
selection = symbol + selection + linkEnd
|
||||||
|
cm.replaceRange(selection, from, to)
|
||||||
|
if (anchorIndex > headIndex) {
|
||||||
|
ranges[i].anchor.ch += symbol.length
|
||||||
|
ranges[i].head.ch += symbol.length
|
||||||
|
} else {
|
||||||
|
ranges[i].head.ch += symbol.length
|
||||||
|
ranges[i].anchor.ch += symbol.length
|
||||||
|
}
|
||||||
|
cm.setSelections(ranges)
|
||||||
|
} else {
|
||||||
|
cm.replaceRange(symbol + linkEnd, cursor, cursor)
|
||||||
|
cm.setCursor({line: cursor.line, ch: cursor.ch + symbol.length + linkEnd.length})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cm.focus()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function insertHeader (cm) {
|
||||||
|
let cursor = cm.getCursor()
|
||||||
|
let startOfLine = {line: cursor.line, ch: 0}
|
||||||
|
let startOfLineText = cm.getRange(startOfLine, {line: cursor.line, ch: 1})
|
||||||
|
// See if it is already a header
|
||||||
|
if (startOfLineText === '#') {
|
||||||
|
cm.replaceRange('#', startOfLine, startOfLine)
|
||||||
|
} else {
|
||||||
|
cm.replaceRange('# ', startOfLine, startOfLine)
|
||||||
|
}
|
||||||
|
cm.focus()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function insertOnStartOfLines (cm, symbol) {
|
||||||
|
let cursor = cm.getCursor()
|
||||||
|
let ranges = cm.listSelections()
|
||||||
|
|
||||||
|
for (let i = 0; i < ranges.length; i++) {
|
||||||
|
let range = ranges[i]
|
||||||
|
if (!range.empty()) {
|
||||||
|
const from = range.from()
|
||||||
|
const to = range.to()
|
||||||
|
let selection = cm.getRange({line: from.line, ch: 0}, to)
|
||||||
|
selection = selection.replace(/\n/g, '\n' + symbol)
|
||||||
|
selection = symbol + selection
|
||||||
|
cm.replaceRange(selection, from, to)
|
||||||
|
} else {
|
||||||
|
cm.replaceRange(symbol, {line: cursor.line, ch: 0}, {line: cursor.line, ch: 0})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cm.setCursor({line: cursor.line, ch: cursor.ch + symbol.length})
|
||||||
|
cm.focus()
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ window.lastchangetime = window.lastchangeui.time.attr('data-updatetime')
|
||||||
updateLastChange()
|
updateLastChange()
|
||||||
const url = window.location.pathname
|
const url = window.location.pathname
|
||||||
$('.ui-edit').attr('href', `${url}/edit`)
|
$('.ui-edit').attr('href', `${url}/edit`)
|
||||||
|
$('.ui-print').attr('href', `${url}?print-pdf`)
|
||||||
|
|
||||||
$(document).ready(() => {
|
$(document).ready(() => {
|
||||||
// tooltip
|
// tooltip
|
||||||
|
|
106
public/vendor/md-toc.js
vendored
106
public/vendor/md-toc.js
vendored
|
@ -28,7 +28,7 @@
|
||||||
Toc.prototype._collectTitleElements = function () {
|
Toc.prototype._collectTitleElements = function () {
|
||||||
this._elTitlesNames = []
|
this._elTitlesNames = []
|
||||||
this.elTitleElements = []
|
this.elTitleElements = []
|
||||||
for (var i = 1; i < 7; i++) {
|
for (var i = 1; i < 6; i++) {
|
||||||
if (this.el.getElementsByTagName('h' + i).length) {
|
if (this.el.getElementsByTagName('h' + i).length) {
|
||||||
this._elTitlesNames.push('h' + i)
|
this._elTitlesNames.push('h' + i)
|
||||||
}
|
}
|
||||||
|
@ -44,59 +44,79 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Toc.prototype._createTocContent = function () {
|
Toc.prototype._createTocContent = function recursiveToc(level = 0, titleElements = [], titleNames = [], ulClass = undefined) {
|
||||||
this._elTitleElementsLen = this.elTitleElements.length
|
// Inititalize our elements from the toc object
|
||||||
if (!this._elTitleElementsLen) return
|
// which is only available on level 0
|
||||||
this.tocContent = ''
|
if (level === 0) {
|
||||||
this._tempLists = []
|
titleElements = this.elTitleElements
|
||||||
|
titleNames = this._elTitlesNames
|
||||||
|
ulClass = this.ulClass
|
||||||
|
}
|
||||||
|
// No need to do anything for an empty ToC
|
||||||
|
if (!titleElements.length) return
|
||||||
|
|
||||||
for (var i = 0; i < this._elTitleElementsLen; i++) {
|
var content = '<ul'
|
||||||
var j = i + 1
|
if (ulClass) {
|
||||||
this._elTitleElement = this.elTitleElements[i]
|
content += ' class="' + ulClass + '"'
|
||||||
this._elTitleElementName = this._elTitleElement.tagName
|
}
|
||||||
this._elTitleElementTitle = this._elTitleElement.textContent.replace(/"/g, '"')
|
content += '>\n'
|
||||||
this._elTitleElementText = (typeof this.process === 'function' ? this.process(this._elTitleElement) : this._elTitleElement.innerHTML).replace(/<(?:.|\n)*?>/gm, '')
|
var iterTag = titleNames[level]
|
||||||
var id = this._elTitleElement.getAttribute('id')
|
var recurse = false
|
||||||
|
var openTag = false
|
||||||
|
|
||||||
|
for (var element; element = titleElements.shift();) {
|
||||||
|
var elementTag = element.tagName.toLowerCase()
|
||||||
|
|
||||||
|
// We only care about tags on our level to add them as list item
|
||||||
|
if (elementTag == iterTag) {
|
||||||
|
// Let's do some cleaning
|
||||||
|
var elementTitle = element.textContent.replace(/"/g, '"')
|
||||||
|
var elementText = (typeof this.process === 'function' ? this.process(element) : element.innerHTML).replace(/<(?:.|\n)*?>/gm, '')
|
||||||
|
var id = element.getAttribute('id')
|
||||||
if (!id) {
|
if (!id) {
|
||||||
this._elTitleElement.setAttribute('id', 'tip' + i)
|
element.setAttribute('id', 'tip' + i)
|
||||||
id = '#tip' + i
|
id = '#tip' + i
|
||||||
} else {
|
} else {
|
||||||
id = '#' + id
|
id = '#' + id
|
||||||
}
|
}
|
||||||
|
if (openTag) {
|
||||||
this.tocContent += '<li><a href="' + id + '" title="'+ this._elTitleElementTitle +'">' + this._elTitleElementText + '</a>'
|
content += '</li>\n'
|
||||||
|
openTag = false
|
||||||
if (j !== this._elTitleElementsLen) {
|
}
|
||||||
this._elNextTitleElementName = this.elTitleElements[j].tagName
|
content += '<li><a href="' + id + '" title="'+ elementTitle +'">' + elementText + '</a>'
|
||||||
if (this._elTitleElementName !== this._elNextTitleElementName) {
|
// Reset recursion. We need it for the next subsections
|
||||||
var checkColse = false
|
recurse = false
|
||||||
var y = 1
|
openTag = true
|
||||||
for (var t = this._tempLists.length - 1; t >= 0; t--) {
|
// Check if the current element has a lower level than ours, if so, we have to go down the rabbithole!
|
||||||
if (this._tempLists[t].tagName === this._elNextTitleElementName) {
|
} else if (!recurse && titleNames.indexOf(elementTag.toLowerCase()) > level) {
|
||||||
checkColse = true
|
recurse = true
|
||||||
|
if (!openTag) {
|
||||||
|
content += '<li class="invisable-node">'
|
||||||
|
openTag = true
|
||||||
|
}
|
||||||
|
// This element is for the lower lever, we have to re-add it before we send the list down there.
|
||||||
|
titleElements.unshift(element)
|
||||||
|
// Let's call ourself and get to the next level
|
||||||
|
content += recursiveToc(level + 1, titleElements, titleNames, ulClass)
|
||||||
|
} else {
|
||||||
|
// When we end up here, met a higher level element
|
||||||
|
// This is not our business so back into the list with the element and let's end this loop
|
||||||
|
titleElements.unshift(element)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
y++
|
|
||||||
}
|
}
|
||||||
if (checkColse) {
|
|
||||||
this.tocContent += new Array(y + 1).join('</li></ul>')
|
if (openTag) {
|
||||||
this._tempLists.length = this._tempLists.length - y
|
content += '</li>\n'
|
||||||
|
}
|
||||||
|
content += '</ul>\n'
|
||||||
|
|
||||||
|
// Set ToC content of the level 0 everything else pass things to the upper level!
|
||||||
|
if (level === 0) {
|
||||||
|
this.tocContent = content
|
||||||
} else {
|
} else {
|
||||||
this._tempLists.push(this._elTitleElement)
|
return content
|
||||||
if (this.ulClass) { this.tocContent += '<ul class="' + this.ulClass + '">' } else { this.tocContent += '<ul>' }
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.tocContent += '</li>'
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (this._tempLists.length) {
|
|
||||||
this.tocContent += new Array(this._tempLists.length + 1).join('</li></ul>')
|
|
||||||
} else {
|
|
||||||
this.tocContent += '</li>'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.ulClass) { this.tocContent = '<ul class="' + this.ulClass + '">' + this.tocContent + '</ul>' } else { this.tocContent = '<ul>' + this.tocContent + '</ul>' }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Toc.prototype._showToc = function () {
|
Toc.prototype._showToc = function () {
|
||||||
|
|
15
public/views/codimd.ejs
Normal file
15
public/views/codimd.ejs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<%- include codimd/head %>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<%- include codimd/header %>
|
||||||
|
<%- include codimd/body %>
|
||||||
|
<%- include codimd/footer %>
|
||||||
|
<%- include codimd/foot %>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -233,7 +233,7 @@
|
||||||
</button>
|
</button>
|
||||||
<h4 class="modal-title" id="myModalLabel"><%= __('Are you sure?') %></h4>
|
<h4 class="modal-title" id="myModalLabel"><%= __('Are you sure?') %></h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body" style="color:black;">
|
<div class="modal-body">
|
||||||
<h5 class="ui-delete-modal-msg"><%= __('Do you really want to delete this note?') %></h5>
|
<h5 class="ui-delete-modal-msg"><%= __('Do you really want to delete this note?') %></h5>
|
||||||
<strong class="ui-delete-modal-item"><%= __('All users will lose their connection.') %></strong>
|
<strong class="ui-delete-modal-item"><%= __('All users will lose their connection.') %></strong>
|
||||||
</div>
|
</div>
|
|
@ -14,7 +14,7 @@
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js" integrity="sha256-Cv5v4i4SuYvwRYzIONifZjoc99CkwfncROMSWat1cVA=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js" integrity="sha256-Cv5v4i4SuYvwRYzIONifZjoc99CkwfncROMSWat1cVA=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js" integrity="sha256-WPeFPWD3PZQUDrpFnDM1N2KadNVwCfNS4cCZ78b76T8=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js" integrity="sha256-WPeFPWD3PZQUDrpFnDM1N2KadNVwCfNS4cCZ78b76T8=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js" integrity="sha256-1O3BtOwnPyyRzOszK6P+gqaRoXHV6JXj8HkjZmPYhCI=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js" integrity="sha256-1O3BtOwnPyyRzOszK6P+gqaRoXHV6JXj8HkjZmPYhCI=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js" integrity="sha256-KbfTjB0WZ8vvXngdpJGY3Yp3xKk+tttbqClO11anCIU=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js" integrity="sha256-/BfiIkHlHoVihZdc6TFuj7MmJ0TWcWsMXkeDFwhi0zw=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.7.0/viz.js" integrity="sha256-8t+rndrF+TU4JtelmOH1lDHTMe2ovhO2UbzDArp5lY8=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.7.0/viz.js" integrity="sha256-8t+rndrF+TU4JtelmOH1lDHTMe2ovhO2UbzDArp5lY8=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.8/validator.min.js" integrity="sha256-LHeY7YoYJ0SSXbCx7sR14Pqna+52moaH3bhv0Mjzd/M=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.8/validator.min.js" integrity="sha256-LHeY7YoYJ0SSXbCx7sR14Pqna+52moaH3bhv0Mjzd/M=" crossorigin="anonymous" defer></script>
|
|
@ -12,11 +12,11 @@
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-social/4.9.0/bootstrap-social.min.css" integrity="sha256-02JtFTurpwBjQJ6q13iJe82/NF0RbZlJroDegK5g87Y=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-social/4.9.0/bootstrap-social.min.css" integrity="sha256-02JtFTurpwBjQJ6q13iJe82/NF0RbZlJroDegK5g87Y=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/4.4.0/octicons.min.css" integrity="sha256-4eCms8tUm+iL29tUvmRhNRnz/7lNI4oTtQzqa/uM2dI=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
||||||
<%- include ../build/index-header %>
|
<%- include ../build/index-header %>
|
||||||
|
<%- include ../shared/polyfill %>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<link rel="stylesheet" href='<%- url %>/build/emojify.js/dist/css/basic/emojify.min.css'>
|
<link rel="stylesheet" href='<%- url %>/build/emojify.js/dist/css/basic/emojify.min.css'>
|
||||||
<%- include ../build/index-pack-header %>
|
<%- include ../build/index-pack-header %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<%- include ../shared/polyfill %>
|
|
|
@ -2,18 +2,18 @@
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<%- include hackmd/head %>
|
<%- include codimd/head %>
|
||||||
<link rel="stylesheet" href="<%- url %>/css/center.css">
|
<link rel="stylesheet" href="<%- url %>/css/center.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<%- include hackmd/header %>
|
<%- include codimd/header %>
|
||||||
<div class="container-fluid text-center">
|
<div class="container-fluid text-center">
|
||||||
<div class="vertical-center-row">
|
<div class="vertical-center-row">
|
||||||
<h1><%- code %> <%- detail %> <small><%- msg %></small></h1>
|
<h1><%- code %> <%- detail %> <small><%- msg %></small></h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<%- include hackmd/footer %>
|
<%- include codimd/footer %>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
|
@ -1,15 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<%- include hackmd/head %>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<%- include hackmd/header %>
|
|
||||||
<%- include hackmd/body %>
|
|
||||||
<%- include hackmd/footer %>
|
|
||||||
<%- include hackmd/foot %>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -18,9 +18,9 @@
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/4.4.0/octicons.min.css" integrity="sha256-4eCms8tUm+iL29tUvmRhNRnz/7lNI4oTtQzqa/uM2dI=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/github-gist.min.css" integrity="sha256-tAflq+ymku3Khs+I/WcAneIlafYgDiOQ9stIHH985Wo=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github-gist.min.css" integrity="sha256-tAflq+ymku3Khs+I/WcAneIlafYgDiOQ9stIHH985Wo=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
||||||
<style>
|
<style>
|
||||||
{{{css}}}
|
{{{css}}}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<script src="<%= webpackConfig.output.baseUrl %>/build/constant.js"></script>
|
<script src="<%= webpackConfig.output.baseUrl %>/config"></script>
|
||||||
<% for (var chunk in htmlWebpackPlugin.files.chunks) { %>
|
<% for (var chunk in htmlWebpackPlugin.files.chunks) { %>
|
||||||
<script src="<%= webpackConfig.output.baseUrl %><%= htmlWebpackPlugin.files.chunks[chunk].entry %>" defer></script>
|
<script src="<%= webpackConfig.output.baseUrl %><%= htmlWebpackPlugin.files.chunks[chunk].entry %>" defer></script>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" aria-labelledby="profileLabel">
|
<ul class="dropdown-menu" aria-labelledby="profileLabel">
|
||||||
<li><a href="<%- url %>/features"><i class="fa fa-dot-circle-o fa-fw"></i> <%= __('Features') %></a></li>
|
<li><a href="<%- url %>/features"><i class="fa fa-dot-circle-o fa-fw"></i> <%= __('Features') %></a></li>
|
||||||
|
<li><a href="<%- url %>/me/export"><i class="fa fa-cloud-download fa-fw"></i> <%= __('Export user data') %></a></li>
|
||||||
|
<li><a class="ui-delete-user" data-toggle="modal" data-target=".delete-user-modal"><i class="fa fa-trash fa-fw"></i> <%= __('Delete user') %></a></li>
|
||||||
<li><a href="<%- url %>/logout"><i class="fa fa-sign-out fa-fw"></i> <%= __('Sign Out') %></a></li>
|
<li><a href="<%- url %>/logout"><i class="fa fa-sign-out fa-fw"></i> <%= __('Sign Out') %></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</span>
|
</span>
|
||||||
|
@ -38,8 +40,7 @@
|
||||||
|
|
||||||
<div id="home" class="section"<% if(signin) { %> style="display:none;"<% } %>>
|
<div id="home" class="section"<% if(signin) { %> style="display:none;"<% } %>>
|
||||||
<div class="inner cover">
|
<div class="inner cover">
|
||||||
<h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1>
|
<h1 class="cover-heading"><i class="fa fa-file-text"></i> CodiMD</h1>
|
||||||
<p class="lead"><strong>Community Edition</strong></p>
|
|
||||||
<p class="lead">
|
<p class="lead">
|
||||||
<%= __('Best way to write and share your knowledge in markdown.') %>
|
<%= __('Best way to write and share your knowledge in markdown.') %>
|
||||||
</p>
|
</p>
|
||||||
|
@ -108,7 +109,7 @@
|
||||||
<span class="btn btn-default btn-file ui-open-history" title="<%= __('Import history') %>">
|
<span class="btn btn-default btn-file ui-open-history" title="<%= __('Import history') %>">
|
||||||
<i class="fa fa-folder-open-o"></i><input type="file" />
|
<i class="fa fa-folder-open-o"></i><input type="file" />
|
||||||
</span>
|
</span>
|
||||||
<a href="#" class="btn btn-default ui-clear-history" title="<%= __('Clear history') %>" data-toggle="modal" data-target=".delete-modal"><i class="fa fa-trash-o"></i></a>
|
<a href="#" class="btn btn-default ui-clear-history" title="<%= __('Clear history') %>" data-toggle="modal" data-target=".delete-history-modal"><i class="fa fa-trash-o"></i></a>
|
||||||
</span>
|
</span>
|
||||||
<a href="#" class="btn btn-default ui-refresh-history" title="<%= __('Refresh history') %>"><i class="fa fa-refresh"></i></a>
|
<a href="#" class="btn btn-default ui-refresh-history" title="<%= __('Refresh history') %>"><i class="fa fa-refresh"></i></a>
|
||||||
</form>
|
</form>
|
||||||
|
@ -148,18 +149,18 @@
|
||||||
<option value="ko">한국어</option>
|
<option value="ko">한국어</option>
|
||||||
</select>
|
</select>
|
||||||
<p>
|
<p>
|
||||||
© 2018 <a href="https://hackmd.io">HackMD</a> | <a href="<%- url %>/s/release-notes" target="_blank"><%= __('Releases') %></a>
|
© 2018 <a href="https://hackmd.io">CodiMD</a> | <a href="<%- url %>/s/release-notes" target="_blank"><%= __('Releases') %></a><% if(privacyStatement) { %> | <a href="<%- url %>/s/privacy" target="_blank"><%= __('Privacy') %></a><% } %><% if(termsOfUse) { %> | <a href="<%- url %>/s/terms-of-use" target="_blank"><%= __('Terms of Use') %></a><% } %>
|
||||||
</p>
|
</p>
|
||||||
<h6 class="social-foot">
|
<h6 class="social-foot">
|
||||||
<%- __('Follow us on %s and %s.', '<a href="https://github.com/hackmdio/HackMD" target="_blank"><i class="fa fa-github"></i> GitHub</a>, <a href="https://twitter.com/hackmdio" target="_blank"><i class="fa fa-twitter"></i> Twitter</a>', '<a href="https://www.facebook.com/hackmdio" target="_blank"><i class="fa fa-facebook-square"></i> Facebook</a>') %>
|
<%- __('Follow us on %s and %s.', '<a href="https://github.com/hackmdio/CodiMD" target="_blank"><i class="fa fa-github"></i> GitHub</a>, <a href="https://twitter.com/hackmdio" target="_blank"><i class="fa fa-twitter"></i> Twitter</a>', '<a href="https://www.facebook.com/hackmdio" target="_blank"><i class="fa fa-facebook-square"></i> Facebook</a>') %>
|
||||||
</h6>
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- delete modal -->
|
<!-- delete history modal -->
|
||||||
<div class="modal fade delete-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
<div class="modal fade delete-history-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog modal-sm">
|
<div class="modal-dialog modal-sm">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -167,13 +168,33 @@
|
||||||
</button>
|
</button>
|
||||||
<h4 class="modal-title" id="myModalLabel"><%= __('Are you sure?') %></h4>
|
<h4 class="modal-title" id="myModalLabel"><%= __('Are you sure?') %></h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body" style="color:black;">
|
<div class="modal-body">
|
||||||
<h5 class="ui-delete-modal-msg"></h5>
|
<h5 class="ui-delete-history-modal-msg"></h5>
|
||||||
<strong class="ui-delete-modal-item"></strong>
|
<strong class="ui-delete-history-modal-item"></strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal"><%= __('Cancel') %></button>
|
<button type="button" class="btn btn-default" data-dismiss="modal"><%= __('Cancel') %></button>
|
||||||
<button type="button" class="btn btn-danger ui-delete-modal-confirm"><%= __('Yes, do it!') %></button>
|
<button type="button" class="btn btn-danger ui-delete-history-modal-confirm"><%= __('Yes, do it!') %></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- delete user modal -->
|
||||||
|
<div class="modal fade delete-user-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title" id="myModalLabel"><%= __('Are you sure?') %></h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<h5 class="ui-delete-user-modal-msg"><%= __('Do you really want to delete your user account?') %></h5>
|
||||||
|
<strong class="ui-delete-user-modal-item"><%= __('This will delete your account, all notes that are owned by you and remove all references to your account from other notes.') %></strong>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default ui-delete-user-modal-cancel" data-dismiss="modal"><%= __('Cancel') %></button>
|
||||||
|
<a type="button" class="btn btn-danger" href="<%- url %>/me/delete/<%- deleteToken %>"><%= __('Yes, do it!') %></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2.min.css" integrity="sha256-ijlUKKj3hJCiiT2HWo1kqkI79NTEYpzOsw5Rs3k42dI=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2.min.css" integrity="sha256-ijlUKKj3hJCiiT2HWo1kqkI79NTEYpzOsw5Rs3k42dI=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2-bootstrap.min.css" integrity="sha256-NAWFcNIZdH+TS1xpWujF/EB/Y8gwBbEOCoaK/eqaer8=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2-bootstrap.min.css" integrity="sha256-NAWFcNIZdH+TS1xpWujF/EB/Y8gwBbEOCoaK/eqaer8=" crossorigin="anonymous" />
|
||||||
<%- include ../build/cover-header %>
|
<%- include ../build/cover-header %>
|
||||||
|
<%- include ../shared/polyfill %>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<%- include ../build/cover-pack-header %>
|
<%- include ../build/cover-pack-header %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<%- include ../shared/polyfill %>
|
|
||||||
|
|
|
@ -21,14 +21,14 @@
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/4.4.0/octicons.min.css" integrity="sha256-4eCms8tUm+iL29tUvmRhNRnz/7lNI4oTtQzqa/uM2dI=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
||||||
<%- include build/pretty-header %>
|
<%- include build/pretty-header %>
|
||||||
|
<%- include shared/polyfill %>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<link rel="stylesheet" href='<%- url %>/build/emojify.js/dist/css/basic/emojify.min.css'>
|
<link rel="stylesheet" href='<%- url %>/build/emojify.js/dist/css/basic/emojify.min.css'>
|
||||||
<%- include build/pretty-pack-header %>
|
<%- include build/pretty-pack-header %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<%- include shared/polyfill %>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body style="display:none;">
|
<body style="display:none;">
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/7.1.0/mermaid.min.js" integrity="sha256-M3OC0Q6g4/+Q4j73OvnsnA+lMkdAE5KgupRHqTiPbnI=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/7.1.0/mermaid.min.js" integrity="sha256-M3OC0Q6g4/+Q4j73OvnsnA+lMkdAE5KgupRHqTiPbnI=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/js/emojify.min.js" integrity="sha256-VAB5tAlKBvgaxw8oJ1crWMVbdmBVl4mP/2M8MNRl+4E=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/js/emojify.min.js" integrity="sha256-VAB5tAlKBvgaxw8oJ1crWMVbdmBVl4mP/2M8MNRl+4E=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js" integrity="sha256-1O3BtOwnPyyRzOszK6P+gqaRoXHV6JXj8HkjZmPYhCI=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js" integrity="sha256-1O3BtOwnPyyRzOszK6P+gqaRoXHV6JXj8HkjZmPYhCI=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js" integrity="sha256-KbfTjB0WZ8vvXngdpJGY3Yp3xKk+tttbqClO11anCIU=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js" integrity="sha256-/BfiIkHlHoVihZdc6TFuj7MmJ0TWcWsMXkeDFwhi0zw=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.7.0/viz.js" integrity="sha256-8t+rndrF+TU4JtelmOH1lDHTMe2ovhO2UbzDArp5lY8=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.7.0/viz.js" integrity="sha256-8t+rndrF+TU4JtelmOH1lDHTMe2ovhO2UbzDArp5lY8=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/abcjs/3.1.1/abcjs_basic-min.js" integrity="sha256-Sq1r2XXWXQoShQKsS0Wrf5r7fRkErd9Fat9vHYeU68s=" crossorigin="anonymous"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/abcjs/3.1.1/abcjs_basic-min.js" integrity="sha256-Sq1r2XXWXQoShQKsS0Wrf5r7fRkErd9Fat9vHYeU68s=" crossorigin="anonymous"></script>
|
||||||
|
|
|
@ -15,9 +15,9 @@
|
||||||
<h3 class="panel-title"><%= __('Contacts') %></h3>
|
<h3 class="panel-title"><%= __('Contacts') %></h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<a href="https://github.com/hackmdio/hackmd/issues" target="_blank"><i class="fa fa-tag fa-fw"></i> <%= __('Report an issue') %></a>
|
<a href="https://github.com/hackmdio/codimd/issues" target="_blank"><i class="fa fa-tag fa-fw"></i> <%= __('Report an issue') %></a>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://riot.im/app/#/room/#hackmd:matrix.org" target="_blank"><i class="fa fa-hashtag fa-fw"></i> <%= __('Meet us on %s', 'Matrix') %></a>
|
<a href="https://riot.im/app/#/room/#codimd:matrix.org" target="_blank"><i class="fa fa-hashtag fa-fw"></i> <%= __('Meet us on %s', 'Matrix') %></a>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://gitter.im/hackmdio/hackmd" target="_blank"><i class="fa fa-comments fa-fw"></i> <%= __('Meet us on %s', 'Gitter') %></a>
|
<a href="https://gitter.im/hackmdio/hackmd" target="_blank"><i class="fa fa-comments fa-fw"></i> <%= __('Meet us on %s', 'Gitter') %></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -18,10 +18,11 @@
|
||||||
<% if(useCDN) { %>
|
<% if(useCDN) { %>
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/4.4.0/octicons.min.css" integrity="sha256-4eCms8tUm+iL29tUvmRhNRnz/7lNI4oTtQzqa/uM2dI=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.6.0/css/reveal.min.css" integrity="sha256-ol2N5Xr80jdDqxK0lte3orKGb9Ja3sOnpAUV7TTADmg=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.6.0/css/reveal.min.css" integrity="sha256-ol2N5Xr80jdDqxK0lte3orKGb9Ja3sOnpAUV7TTADmg=" crossorigin="anonymous" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
|
||||||
<%- include build/slide-header %>
|
<%- include build/slide-header %>
|
||||||
|
<%- include shared/polyfill %>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<link rel="stylesheet" href="<%- url %>/build/reveal.js/css/reveal.css">
|
<link rel="stylesheet" href="<%- url %>/build/reveal.js/css/reveal.css">
|
||||||
<link rel="stylesheet" href='<%- url %>/build/emojify.js/dist/css/basic/emojify.min.css'>
|
<link rel="stylesheet" href='<%- url %>/build/emojify.js/dist/css/basic/emojify.min.css'>
|
||||||
|
@ -47,8 +48,6 @@
|
||||||
link.href = '<%- url %>/build/reveal.js/' + (window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css');
|
link.href = '<%- url %>/build/reveal.js/' + (window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css');
|
||||||
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<%- include shared/polyfill %>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
@ -70,7 +69,7 @@
|
||||||
<span class="text-uppercase ui-status-lastchange"></span>
|
<span class="text-uppercase ui-status-lastchange"></span>
|
||||||
<span class="ui-lastchange text-uppercase" data-createtime="<%- createtime %>" data-updatetime="<%- updatetime %>"></span>
|
<span class="ui-lastchange text-uppercase" data-createtime="<%- createtime %>" data-updatetime="<%- updatetime %>"></span>
|
||||||
</span>
|
</span>
|
||||||
<span class="pull-right"><%- viewcount %> views <a href="#" class="ui-edit" title="Edit this note"><i class="fa fa-fw fa-pencil"></i></a></span>
|
<span class="pull-right"><%- viewcount %> views <a href="#" class="ui-edit" title="Edit this note"><i class="fa fa-fw fa-pencil"></i></a><a class="ui-print" href="" title="Open print view"><i class="fa fa-fw fa-print"></i></a></span>
|
||||||
<br>
|
<br>
|
||||||
<% if(ownerprofile && owner !== lastchangeuser) { %>
|
<% if(ownerprofile && owner !== lastchangeuser) { %>
|
||||||
<span class="ui-owner">
|
<span class="ui-owner">
|
||||||
|
@ -102,7 +101,7 @@
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/7.1.0/mermaid.min.js" integrity="sha256-M3OC0Q6g4/+Q4j73OvnsnA+lMkdAE5KgupRHqTiPbnI=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/7.1.0/mermaid.min.js" integrity="sha256-M3OC0Q6g4/+Q4j73OvnsnA+lMkdAE5KgupRHqTiPbnI=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/js/emojify.min.js" integrity="sha256-VAB5tAlKBvgaxw8oJ1crWMVbdmBVl4mP/2M8MNRl+4E=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/js/emojify.min.js" integrity="sha256-VAB5tAlKBvgaxw8oJ1crWMVbdmBVl4mP/2M8MNRl+4E=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js" integrity="sha256-1O3BtOwnPyyRzOszK6P+gqaRoXHV6JXj8HkjZmPYhCI=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.6/handlebars.min.js" integrity="sha256-1O3BtOwnPyyRzOszK6P+gqaRoXHV6JXj8HkjZmPYhCI=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js" integrity="sha256-KbfTjB0WZ8vvXngdpJGY3Yp3xKk+tttbqClO11anCIU=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js" integrity="sha256-/BfiIkHlHoVihZdc6TFuj7MmJ0TWcWsMXkeDFwhi0zw=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.7.0/viz.js" integrity="sha256-8t+rndrF+TU4JtelmOH1lDHTMe2ovhO2UbzDArp5lY8=" crossorigin="anonymous" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.7.0/viz.js" integrity="sha256-8t+rndrF+TU4JtelmOH1lDHTMe2ovhO2UbzDArp5lY8=" crossorigin="anonymous" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/abcjs/3.1.1/abcjs_basic-min.js" integrity="sha256-Sq1r2XXWXQoShQKsS0Wrf5r7fRkErd9Fat9vHYeU68s=" crossorigin="anonymous"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/abcjs/3.1.1/abcjs_basic-min.js" integrity="sha256-Sq1r2XXWXQoShQKsS0Wrf5r7fRkErd9Fat9vHYeU68s=" crossorigin="anonymous"></script>
|
||||||
|
|
|
@ -234,7 +234,7 @@ module.exports = {
|
||||||
path.join(__dirname, 'node_modules/font-awesome/css/font-awesome.min.css'),
|
path.join(__dirname, 'node_modules/font-awesome/css/font-awesome.min.css'),
|
||||||
path.join(__dirname, 'public/css/bootstrap-social.css'),
|
path.join(__dirname, 'public/css/bootstrap-social.css'),
|
||||||
path.join(__dirname, 'node_modules/ionicons/css/ionicons.min.css'),
|
path.join(__dirname, 'node_modules/ionicons/css/ionicons.min.css'),
|
||||||
path.join(__dirname, 'node_modules/octicons/octicons/octicons.css')
|
path.join(__dirname, 'node_modules/octicons/build/octicons.css')
|
||||||
],
|
],
|
||||||
'index-pack': [
|
'index-pack': [
|
||||||
'babel-polyfill',
|
'babel-polyfill',
|
||||||
|
@ -284,7 +284,7 @@ module.exports = {
|
||||||
path.join(__dirname, 'node_modules/bootstrap/dist/css/bootstrap.min.css'),
|
path.join(__dirname, 'node_modules/bootstrap/dist/css/bootstrap.min.css'),
|
||||||
path.join(__dirname, 'node_modules/font-awesome/css/font-awesome.min.css'),
|
path.join(__dirname, 'node_modules/font-awesome/css/font-awesome.min.css'),
|
||||||
path.join(__dirname, 'node_modules/ionicons/css/ionicons.min.css'),
|
path.join(__dirname, 'node_modules/ionicons/css/ionicons.min.css'),
|
||||||
path.join(__dirname, 'node_modules/octicons/octicons/octicons.css')
|
path.join(__dirname, 'node_modules/octicons/build/octicons.css')
|
||||||
],
|
],
|
||||||
'pretty-pack': [
|
'pretty-pack': [
|
||||||
'babel-polyfill',
|
'babel-polyfill',
|
||||||
|
@ -321,7 +321,7 @@ module.exports = {
|
||||||
'slide-styles-pack': [
|
'slide-styles-pack': [
|
||||||
path.join(__dirname, 'node_modules/font-awesome/css/font-awesome.min.css'),
|
path.join(__dirname, 'node_modules/font-awesome/css/font-awesome.min.css'),
|
||||||
path.join(__dirname, 'node_modules/ionicons/css/ionicons.min.css'),
|
path.join(__dirname, 'node_modules/ionicons/css/ionicons.min.css'),
|
||||||
path.join(__dirname, 'node_modules/octicons/octicons/octicons.css')
|
path.join(__dirname, 'node_modules/octicons/build/octicons.css')
|
||||||
],
|
],
|
||||||
'slide-pack': [
|
'slide-pack': [
|
||||||
'babel-polyfill',
|
'babel-polyfill',
|
||||||
|
|
497
yarn.lock
497
yarn.lock
|
@ -2,10 +2,79 @@
|
||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@types/body-parser@*":
|
||||||
|
version "1.17.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
|
||||||
|
dependencies:
|
||||||
|
"@types/connect" "*"
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/connect@*":
|
||||||
|
version "3.4.32"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/events@*":
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
|
||||||
|
|
||||||
|
"@types/express-serve-static-core@*":
|
||||||
|
version "4.16.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7"
|
||||||
|
dependencies:
|
||||||
|
"@types/events" "*"
|
||||||
|
"@types/node" "*"
|
||||||
|
"@types/range-parser" "*"
|
||||||
|
|
||||||
|
"@types/express@*":
|
||||||
|
version "4.16.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19"
|
||||||
|
dependencies:
|
||||||
|
"@types/body-parser" "*"
|
||||||
|
"@types/express-serve-static-core" "*"
|
||||||
|
"@types/serve-static" "*"
|
||||||
|
|
||||||
"@types/geojson@^1.0.0":
|
"@types/geojson@^1.0.0":
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.4.tgz#f6e011bf3f7eea616cce79b6f1a0722010822f3a"
|
resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.4.tgz#f6e011bf3f7eea616cce79b6f1a0722010822f3a"
|
||||||
|
|
||||||
|
"@types/ldapjs@^1.0.0":
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/ldapjs/-/ldapjs-1.0.3.tgz#eb2acbe603845136196dd25fba77e476d6d7db56"
|
||||||
|
dependencies:
|
||||||
|
"@types/events" "*"
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/mime@*":
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
|
||||||
|
|
||||||
|
"@types/node@*":
|
||||||
|
version "10.5.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.1.tgz#d578446f4abff5c0b49ade9b4e5274f6badaadfc"
|
||||||
|
|
||||||
|
"@types/node@^7.0.21", "@types/node@^7.0.23":
|
||||||
|
version "7.0.66"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.66.tgz#3d1dc4d6f52e484e843806ff456379f7e6ad5553"
|
||||||
|
|
||||||
|
"@types/passport@^0.3.3":
|
||||||
|
version "0.3.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/passport/-/passport-0.3.5.tgz#2089c7046d120e8bb92aa4ed86338c9c62ef7853"
|
||||||
|
dependencies:
|
||||||
|
"@types/express" "*"
|
||||||
|
|
||||||
|
"@types/range-parser@*":
|
||||||
|
version "1.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d"
|
||||||
|
|
||||||
|
"@types/serve-static@*":
|
||||||
|
version "1.13.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
|
||||||
|
dependencies:
|
||||||
|
"@types/express-serve-static-core" "*"
|
||||||
|
"@types/mime" "*"
|
||||||
|
|
||||||
"Idle.Js@git+https://github.com/shawnmclean/Idle.js":
|
"Idle.Js@git+https://github.com/shawnmclean/Idle.js":
|
||||||
version "0.0.1"
|
version "0.0.1"
|
||||||
resolved "git+https://github.com/shawnmclean/Idle.js#db9beb3483a460ad638ec947867720f0ed066a62"
|
resolved "git+https://github.com/shawnmclean/Idle.js#db9beb3483a460ad638ec947867720f0ed066a62"
|
||||||
|
@ -160,6 +229,30 @@ aproba@^1.0.3:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
|
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
|
||||||
|
|
||||||
|
archiver-utils@^1.3.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174"
|
||||||
|
dependencies:
|
||||||
|
glob "^7.0.0"
|
||||||
|
graceful-fs "^4.1.0"
|
||||||
|
lazystream "^1.0.0"
|
||||||
|
lodash "^4.8.0"
|
||||||
|
normalize-path "^2.0.0"
|
||||||
|
readable-stream "^2.0.0"
|
||||||
|
|
||||||
|
archiver@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc"
|
||||||
|
dependencies:
|
||||||
|
archiver-utils "^1.3.0"
|
||||||
|
async "^2.0.0"
|
||||||
|
buffer-crc32 "^0.2.1"
|
||||||
|
glob "^7.0.0"
|
||||||
|
lodash "^4.8.0"
|
||||||
|
readable-stream "^2.0.0"
|
||||||
|
tar-stream "^1.5.0"
|
||||||
|
zip-stream "^1.2.0"
|
||||||
|
|
||||||
archy@^1.0.0:
|
archy@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
|
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
|
||||||
|
@ -289,6 +382,12 @@ async@^1.3.0, async@^1.4.0, async@^1.5.0, async@^1.5.2, async@~1.5.2:
|
||||||
version "1.5.2"
|
version "1.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
||||||
|
|
||||||
|
async@^2.0.0:
|
||||||
|
version "2.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
|
||||||
|
dependencies:
|
||||||
|
lodash "^4.17.10"
|
||||||
|
|
||||||
async@^2.1.4:
|
async@^2.1.4:
|
||||||
version "2.5.0"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
|
resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
|
||||||
|
@ -867,9 +966,9 @@ bcrypt-pbkdf@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
tweetnacl "^0.14.3"
|
tweetnacl "^0.14.3"
|
||||||
|
|
||||||
bcryptjs@2.3.0:
|
bcryptjs@^2.4.0:
|
||||||
version "2.3.0"
|
version "2.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.3.0.tgz#5826900cfef7abaf3425c72e4d464de509b8c2ec"
|
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
|
||||||
|
|
||||||
beeper@^1.0.0:
|
beeper@^1.0.0:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
|
@ -1031,6 +1130,25 @@ buble@^0.15.0:
|
||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
os-homedir "^1.0.1"
|
os-homedir "^1.0.1"
|
||||||
|
|
||||||
|
buffer-alloc-unsafe@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
||||||
|
|
||||||
|
buffer-alloc@^1.1.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
||||||
|
dependencies:
|
||||||
|
buffer-alloc-unsafe "^1.1.0"
|
||||||
|
buffer-fill "^1.0.0"
|
||||||
|
|
||||||
|
buffer-crc32@^0.2.1:
|
||||||
|
version "0.2.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||||
|
|
||||||
|
buffer-fill@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
||||||
|
|
||||||
buffer-writer@1.0.1:
|
buffer-writer@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08"
|
resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08"
|
||||||
|
@ -1218,6 +1336,10 @@ chokidar@^1.0.0, chokidar@^1.6.1:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "^1.0.0"
|
fsevents "^1.0.0"
|
||||||
|
|
||||||
|
chownr@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
|
||||||
|
|
||||||
circular-json@^0.3.1:
|
circular-json@^0.3.1:
|
||||||
version "0.3.3"
|
version "0.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
|
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
|
||||||
|
@ -1411,6 +1533,15 @@ component-inherit@0.0.3:
|
||||||
version "0.0.3"
|
version "0.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
|
resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
|
||||||
|
|
||||||
|
compress-commons@^1.2.0:
|
||||||
|
version "1.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
|
||||||
|
dependencies:
|
||||||
|
buffer-crc32 "^0.2.1"
|
||||||
|
crc32-stream "^2.0.0"
|
||||||
|
normalize-path "^2.0.0"
|
||||||
|
readable-stream "^2.0.0"
|
||||||
|
|
||||||
compressible@~2.0.11:
|
compressible@~2.0.11:
|
||||||
version "2.0.11"
|
version "2.0.11"
|
||||||
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a"
|
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a"
|
||||||
|
@ -1544,10 +1675,21 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
|
|
||||||
|
crc32-stream@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4"
|
||||||
|
dependencies:
|
||||||
|
crc "^3.4.4"
|
||||||
|
readable-stream "^2.0.0"
|
||||||
|
|
||||||
crc@3.4.4:
|
crc@3.4.4:
|
||||||
version "3.4.4"
|
version "3.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b"
|
resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b"
|
||||||
|
|
||||||
|
crc@^3.4.4:
|
||||||
|
version "3.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964"
|
||||||
|
|
||||||
cross-spawn@^5.0.1:
|
cross-spawn@^5.0.1:
|
||||||
version "5.1.0"
|
version "5.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
|
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
|
||||||
|
@ -1751,7 +1893,7 @@ debug-log@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
|
resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
|
||||||
|
|
||||||
debug@*, debug@2, debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6, debug@~2.6.9:
|
debug@*, debug@2, debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6, debug@~2.6.9:
|
||||||
version "2.6.9"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -1777,6 +1919,10 @@ deep-equal@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
|
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
|
||||||
|
|
||||||
|
deep-extend@^0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
|
||||||
|
|
||||||
deep-extend@~0.4.0:
|
deep-extend@~0.4.0:
|
||||||
version "0.4.2"
|
version "0.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
|
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
|
||||||
|
@ -1865,6 +2011,10 @@ detect-indent@^4.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
repeating "^2.0.0"
|
repeating "^2.0.0"
|
||||||
|
|
||||||
|
detect-libc@^1.0.2:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
|
||||||
|
|
||||||
"diff-match-patch@git+https://github.com/hackmdio/diff-match-patch.git":
|
"diff-match-patch@git+https://github.com/hackmdio/diff-match-patch.git":
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "git+https://github.com/hackmdio/diff-match-patch.git#0fba40fc6d9565a4afdfb7aa1eb0bf39aa0d942c"
|
resolved "git+https://github.com/hackmdio/diff-match-patch.git#0fba40fc6d9565a4afdfb7aa1eb0bf39aa0d942c"
|
||||||
|
@ -1968,12 +2118,6 @@ dottie@^1.0.0:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/dottie/-/dottie-1.1.1.tgz#45c2a3f48bd6528eeed267a69a848eaaca6faa6a"
|
resolved "https://registry.yarnpkg.com/dottie/-/dottie-1.1.1.tgz#45c2a3f48bd6528eeed267a69a848eaaca6faa6a"
|
||||||
|
|
||||||
dtrace-provider@^0.7.0:
|
|
||||||
version "0.7.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.7.1.tgz#c06b308f2f10d5d5838aec9c571e5d588dc71d04"
|
|
||||||
dependencies:
|
|
||||||
nan "^2.3.3"
|
|
||||||
|
|
||||||
dtrace-provider@~0.8:
|
dtrace-provider@~0.8:
|
||||||
version "0.8.5"
|
version "0.8.5"
|
||||||
resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.5.tgz#98ebba221afac46e1c39fd36858d8f9367524b92"
|
resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.5.tgz#98ebba221afac46e1c39fd36858d8f9367524b92"
|
||||||
|
@ -2051,6 +2195,12 @@ encodeurl@~1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
|
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
|
||||||
|
|
||||||
|
end-of-stream@^1.0.0:
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
|
||||||
|
dependencies:
|
||||||
|
once "^1.4.0"
|
||||||
|
|
||||||
end-of-stream@~0.1.5:
|
end-of-stream@~0.1.5:
|
||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
|
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
|
||||||
|
@ -2777,6 +2927,10 @@ fresh@0.5.2:
|
||||||
version "0.5.2"
|
version "0.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
||||||
|
|
||||||
|
fs-constants@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||||
|
|
||||||
fs-exists-sync@^0.1.0:
|
fs-exists-sync@^0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
|
resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
|
||||||
|
@ -2807,6 +2961,12 @@ fs-extra@~1.0.0:
|
||||||
jsonfile "^2.1.0"
|
jsonfile "^2.1.0"
|
||||||
klaw "^1.0.0"
|
klaw "^1.0.0"
|
||||||
|
|
||||||
|
fs-minipass@^1.2.5:
|
||||||
|
version "1.2.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
|
||||||
|
dependencies:
|
||||||
|
minipass "^2.2.1"
|
||||||
|
|
||||||
fs-readdir-recursive@^1.0.0:
|
fs-readdir-recursive@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
|
resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
|
||||||
|
@ -3031,7 +3191,7 @@ good-listener@^1.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
delegate "^3.1.2"
|
delegate "^3.1.2"
|
||||||
|
|
||||||
graceful-fs@*, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
|
graceful-fs@*, graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
|
||||||
version "4.1.11"
|
version "4.1.11"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
|
||||||
|
|
||||||
|
@ -3280,10 +3440,14 @@ hide-powered-by@1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b"
|
resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b"
|
||||||
|
|
||||||
highlight.js@^9.1.0, highlight.js@~9.9.0:
|
highlight.js@^9.1.0:
|
||||||
version "9.9.0"
|
version "9.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.9.0.tgz#b9995dcfdc2773e307a34f0460d92b9a474782c0"
|
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.9.0.tgz#b9995dcfdc2773e307a34f0460d92b9a474782c0"
|
||||||
|
|
||||||
|
highlight.js@~9.12.0:
|
||||||
|
version "9.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
||||||
|
|
||||||
hoek@2.x.x:
|
hoek@2.x.x:
|
||||||
version "2.16.3"
|
version "2.16.3"
|
||||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
||||||
|
@ -3429,6 +3593,12 @@ iconv-lite@0.4.19, iconv-lite@^0.4.11:
|
||||||
version "0.4.19"
|
version "0.4.19"
|
||||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
|
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
|
||||||
|
|
||||||
|
iconv-lite@^0.4.4:
|
||||||
|
version "0.4.23"
|
||||||
|
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
|
||||||
|
dependencies:
|
||||||
|
safer-buffer ">= 2.1.2 < 3"
|
||||||
|
|
||||||
icss-replace-symbols@^1.1.0:
|
icss-replace-symbols@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
|
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
|
||||||
|
@ -3441,6 +3611,12 @@ ienoopen@1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b"
|
resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b"
|
||||||
|
|
||||||
|
ignore-walk@^3.0.1:
|
||||||
|
version "3.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
|
||||||
|
dependencies:
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
ignore@^3.0.9, ignore@^3.2.0:
|
ignore@^3.0.9, ignore@^3.2.0:
|
||||||
version "3.3.5"
|
version "3.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6"
|
||||||
|
@ -4063,6 +4239,12 @@ lazy-cache@^1.0.3:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
|
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
|
||||||
|
|
||||||
|
lazystream@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
|
||||||
|
dependencies:
|
||||||
|
readable-stream "^2.0.5"
|
||||||
|
|
||||||
lcid@^1.0.0:
|
lcid@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
||||||
|
@ -4075,17 +4257,19 @@ ldap-filter@0.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
assert-plus "0.1.5"
|
assert-plus "0.1.5"
|
||||||
|
|
||||||
ldapauth-fork@~2.5.0:
|
ldapauth-fork@^4.0.1:
|
||||||
version "2.5.5"
|
version "4.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/ldapauth-fork/-/ldapauth-fork-2.5.5.tgz#aac2b47022e5a23d6760b1d518a9696958eee67b"
|
resolved "https://registry.yarnpkg.com/ldapauth-fork/-/ldapauth-fork-4.0.2.tgz#f87d55908ba4917cca06d8ed6e173cdd65e908c9"
|
||||||
dependencies:
|
dependencies:
|
||||||
bcryptjs "2.3.0"
|
"@types/ldapjs" "^1.0.0"
|
||||||
ldapjs "~1.0.1"
|
"@types/node" "^7.0.21"
|
||||||
lru-cache "3.2.0"
|
bcryptjs "^2.4.0"
|
||||||
|
ldapjs "^1.0.1"
|
||||||
|
lru-cache "^4.0.2"
|
||||||
|
|
||||||
ldapjs@~1.0.1:
|
ldapjs@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-1.0.1.tgz#352b812ae74b0a8e96549a4b896060eee1b9a546"
|
resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-1.0.2.tgz#544ff7032b7b83c68f0701328d9297aa694340f9"
|
||||||
dependencies:
|
dependencies:
|
||||||
asn1 "0.2.3"
|
asn1 "0.2.3"
|
||||||
assert-plus "^1.0.0"
|
assert-plus "^1.0.0"
|
||||||
|
@ -4097,7 +4281,7 @@ ldapjs@~1.0.1:
|
||||||
vasync "^1.6.4"
|
vasync "^1.6.4"
|
||||||
verror "^1.8.1"
|
verror "^1.8.1"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
dtrace-provider "^0.7.0"
|
dtrace-provider "~0.8"
|
||||||
|
|
||||||
less-loader@^2.2.3:
|
less-loader@^2.2.3:
|
||||||
version "2.2.3"
|
version "2.2.3"
|
||||||
|
@ -4365,6 +4549,10 @@ lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.14.2, lodash@^4.17.0, l
|
||||||
version "4.17.4"
|
version "4.17.4"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
||||||
|
|
||||||
|
lodash@^4.17.10, lodash@^4.8.0:
|
||||||
|
version "4.17.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
|
||||||
|
|
||||||
lodash@~1.0.1:
|
lodash@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
|
||||||
|
@ -4398,7 +4586,7 @@ lru-cache@2:
|
||||||
version "2.7.3"
|
version "2.7.3"
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
|
||||||
|
|
||||||
lru-cache@3.2.0, lru-cache@^3.2.0:
|
lru-cache@^3.2.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -4411,6 +4599,13 @@ lru-cache@^4.0.1:
|
||||||
pseudomap "^1.0.2"
|
pseudomap "^1.0.2"
|
||||||
yallist "^2.1.2"
|
yallist "^2.1.2"
|
||||||
|
|
||||||
|
lru-cache@^4.0.2:
|
||||||
|
version "4.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
|
||||||
|
dependencies:
|
||||||
|
pseudomap "^1.0.2"
|
||||||
|
yallist "^2.1.2"
|
||||||
|
|
||||||
lru-queue@0.1:
|
lru-queue@0.1:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
|
resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
|
||||||
|
@ -4503,19 +4698,19 @@ markdown-it@^8.2.2:
|
||||||
mdurl "^1.0.1"
|
mdurl "^1.0.1"
|
||||||
uc.micro "^1.0.3"
|
uc.micro "^1.0.3"
|
||||||
|
|
||||||
markdown-pdf@^7.0.0:
|
markdown-pdf@^9.0.0:
|
||||||
version "7.0.0"
|
version "9.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/markdown-pdf/-/markdown-pdf-7.0.0.tgz#3c70e09a6ef3dae2c5059b3a2294bd6581d269ce"
|
resolved "https://registry.yarnpkg.com/markdown-pdf/-/markdown-pdf-9.0.0.tgz#d699f29c3b6c41da4b9a2ec7d09ea8895daef146"
|
||||||
dependencies:
|
dependencies:
|
||||||
commander "^2.2.0"
|
commander "^2.2.0"
|
||||||
duplexer "^0.1.1"
|
duplexer "^0.1.1"
|
||||||
extend "^3.0.0"
|
extend "^3.0.0"
|
||||||
highlight.js "^9.1.0"
|
highlight.js "^9.1.0"
|
||||||
phantomjs-prebuilt "^2.1.3"
|
phantomjs-prebuilt "^2.1.3"
|
||||||
remarkable "^1.6.0"
|
remarkable "^1.7.1"
|
||||||
stream-from-to "^1.4.2"
|
stream-from-to "^1.4.2"
|
||||||
through2 "^2.0.0"
|
through2 "^2.0.0"
|
||||||
tmp "0.0.28"
|
tmp "0.0.33"
|
||||||
|
|
||||||
markdown-table@^0.4.0:
|
markdown-table@^0.4.0:
|
||||||
version "0.4.0"
|
version "0.4.0"
|
||||||
|
@ -4753,9 +4948,9 @@ minimist@~0.0.1:
|
||||||
version "0.0.10"
|
version "0.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
||||||
|
|
||||||
minio@^3.1.3:
|
minio@^6.0.0:
|
||||||
version "3.2.3"
|
version "6.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/minio/-/minio-3.2.3.tgz#00a2ec46cba41596cf73fca162192718d0197c49"
|
resolved "https://registry.yarnpkg.com/minio/-/minio-6.0.0.tgz#7e514d38eaacf2264556b232f1c2c063cc6ca7ba"
|
||||||
dependencies:
|
dependencies:
|
||||||
async "^1.5.2"
|
async "^1.5.2"
|
||||||
block-stream2 "^1.0.0"
|
block-stream2 "^1.0.0"
|
||||||
|
@ -4772,6 +4967,19 @@ minio@^3.1.3:
|
||||||
xml "^1.0.0"
|
xml "^1.0.0"
|
||||||
xml2js "^0.4.15"
|
xml2js "^0.4.15"
|
||||||
|
|
||||||
|
minipass@^2.2.1, minipass@^2.3.3:
|
||||||
|
version "2.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
|
||||||
|
dependencies:
|
||||||
|
safe-buffer "^5.1.2"
|
||||||
|
yallist "^3.0.0"
|
||||||
|
|
||||||
|
minizlib@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
|
||||||
|
dependencies:
|
||||||
|
minipass "^2.2.1"
|
||||||
|
|
||||||
mkdirp@0.5.0:
|
mkdirp@0.5.0:
|
||||||
version "0.5.0"
|
version "0.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
|
||||||
|
@ -4843,10 +5051,14 @@ mysql@^2.12.0:
|
||||||
safe-buffer "5.1.1"
|
safe-buffer "5.1.1"
|
||||||
sqlstring "2.2.0"
|
sqlstring "2.2.0"
|
||||||
|
|
||||||
nan@^2.0.8, nan@^2.3.0, nan@^2.3.3, nan@~2.7.0:
|
nan@^2.0.8, nan@^2.3.0, nan@^2.3.3:
|
||||||
version "2.7.0"
|
version "2.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
|
||||||
|
|
||||||
|
nan@~2.10.0:
|
||||||
|
version "2.10.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
||||||
|
|
||||||
natives@^1.1.0:
|
natives@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
|
resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
|
||||||
|
@ -4865,6 +5077,14 @@ 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:
|
||||||
|
version "2.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
|
||||||
|
dependencies:
|
||||||
|
debug "^2.1.2"
|
||||||
|
iconv-lite "^0.4.4"
|
||||||
|
sax "^1.2.4"
|
||||||
|
|
||||||
negotiator@0.6.1:
|
negotiator@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
|
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
|
||||||
|
@ -4921,7 +5141,7 @@ node-libs-browser@^0.7.0:
|
||||||
util "^0.10.3"
|
util "^0.10.3"
|
||||||
vm-browserify "0.0.4"
|
vm-browserify "0.0.4"
|
||||||
|
|
||||||
node-pre-gyp@^0.6.36, node-pre-gyp@~0.6.38:
|
node-pre-gyp@^0.6.36:
|
||||||
version "0.6.38"
|
version "0.6.38"
|
||||||
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d"
|
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -4936,6 +5156,21 @@ node-pre-gyp@^0.6.36, node-pre-gyp@~0.6.38:
|
||||||
tar "^2.2.1"
|
tar "^2.2.1"
|
||||||
tar-pack "^3.4.0"
|
tar-pack "^3.4.0"
|
||||||
|
|
||||||
|
node-pre-gyp@~0.10.1:
|
||||||
|
version "0.10.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.2.tgz#e8945c20ef6795a20aac2b44f036eb13cf5146e3"
|
||||||
|
dependencies:
|
||||||
|
detect-libc "^1.0.2"
|
||||||
|
mkdirp "^0.5.1"
|
||||||
|
needle "^2.2.0"
|
||||||
|
nopt "^4.0.1"
|
||||||
|
npm-packlist "^1.1.6"
|
||||||
|
npmlog "^4.0.2"
|
||||||
|
rc "^1.2.7"
|
||||||
|
rimraf "^2.6.1"
|
||||||
|
semver "^5.3.0"
|
||||||
|
tar "^4"
|
||||||
|
|
||||||
node-static@0.6.0:
|
node-static@0.6.0:
|
||||||
version "0.6.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-static/-/node-static-0.6.0.tgz#e8543a897f3c82048220b39569284d44796eb1e2"
|
resolved "https://registry.yarnpkg.com/node-static/-/node-static-0.6.0.tgz#e8543a897f3c82048220b39569284d44796eb1e2"
|
||||||
|
@ -4992,6 +5227,17 @@ normalize-url@^1.4.0:
|
||||||
query-string "^4.1.0"
|
query-string "^4.1.0"
|
||||||
sort-keys "^1.0.0"
|
sort-keys "^1.0.0"
|
||||||
|
|
||||||
|
npm-bundled@^1.0.1:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
|
||||||
|
|
||||||
|
npm-packlist@^1.1.6:
|
||||||
|
version "1.1.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
|
||||||
|
dependencies:
|
||||||
|
ignore-walk "^3.0.1"
|
||||||
|
npm-bundled "^1.0.1"
|
||||||
|
|
||||||
npm-run-path@^2.0.0:
|
npm-run-path@^2.0.0:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||||
|
@ -5071,9 +5317,9 @@ object.pick@^1.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
isobject "^3.0.1"
|
isobject "^3.0.1"
|
||||||
|
|
||||||
octicons@~3.5.0:
|
octicons@~4.4.0:
|
||||||
version "3.5.0"
|
version "4.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/octicons/-/octicons-3.5.0.tgz#f7ff5935674d8b114f6d80c454bfaa01797a4e30"
|
resolved "https://registry.yarnpkg.com/octicons/-/octicons-4.4.0.tgz#aca3bd32f5dc1d907a8d0de744f78e0c54e19446"
|
||||||
|
|
||||||
on-finished@~2.3.0:
|
on-finished@~2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
|
@ -5155,7 +5401,7 @@ os-locale@^2.0.0:
|
||||||
lcid "^1.0.0"
|
lcid "^1.0.0"
|
||||||
mem "^1.1.0"
|
mem "^1.1.0"
|
||||||
|
|
||||||
os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
|
os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||||
|
|
||||||
|
@ -5283,11 +5529,11 @@ passport-github@^1.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
passport-oauth2 "1.x.x"
|
passport-oauth2 "1.x.x"
|
||||||
|
|
||||||
passport-gitlab2@^2.2.0:
|
passport-gitlab2@^4.0.0:
|
||||||
version "2.2.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/passport-gitlab2/-/passport-gitlab2-2.2.0.tgz#7380c364cdb4e8a9536ba02dd04ca97acb908da9"
|
resolved "https://registry.yarnpkg.com/passport-gitlab2/-/passport-gitlab2-4.0.0.tgz#08de8b54d58cbe6f22f577f977f7874df3c26efb"
|
||||||
dependencies:
|
dependencies:
|
||||||
passport-oauth2 "^1.3.0"
|
passport-oauth2 "^1.4.0"
|
||||||
|
|
||||||
passport-google-oauth20@^1.0.0:
|
passport-google-oauth20@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
|
@ -5295,12 +5541,14 @@ passport-google-oauth20@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
passport-oauth2 "1.x.x"
|
passport-oauth2 "1.x.x"
|
||||||
|
|
||||||
passport-ldapauth@^0.6.0:
|
passport-ldapauth@^2.0.0:
|
||||||
version "0.6.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/passport-ldapauth/-/passport-ldapauth-0.6.0.tgz#4829eb073e1f4632fae3d1795e7e0f49af46bf92"
|
resolved "https://registry.yarnpkg.com/passport-ldapauth/-/passport-ldapauth-2.0.0.tgz#42dff004417185d0a4d9f776a3eed8d4731fd689"
|
||||||
dependencies:
|
dependencies:
|
||||||
ldapauth-fork "~2.5.0"
|
"@types/node" "^7.0.23"
|
||||||
passport-strategy "1.x.x"
|
"@types/passport" "^0.3.3"
|
||||||
|
ldapauth-fork "^4.0.1"
|
||||||
|
passport-strategy "^1.0.0"
|
||||||
|
|
||||||
passport-local@^1.0.0:
|
passport-local@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
|
@ -5316,7 +5564,7 @@ passport-oauth1@1.x.x:
|
||||||
passport-strategy "1.x.x"
|
passport-strategy "1.x.x"
|
||||||
utils-merge "1.x.x"
|
utils-merge "1.x.x"
|
||||||
|
|
||||||
passport-oauth2@1.x.x, passport-oauth2@^1.3.0, passport-oauth2@^1.4.0:
|
passport-oauth2@1.x.x, passport-oauth2@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.4.0.tgz#f62f81583cbe12609be7ce6f160b9395a27b86ad"
|
resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.4.0.tgz#f62f81583cbe12609be7ce6f160b9395a27b86ad"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -5344,7 +5592,7 @@ passport-saml@^0.31.0:
|
||||||
xmlbuilder "^9.0.4"
|
xmlbuilder "^9.0.4"
|
||||||
xmldom "0.1.x"
|
xmldom "0.1.x"
|
||||||
|
|
||||||
passport-strategy@*, passport-strategy@1.x.x:
|
passport-strategy@*, passport-strategy@1.x.x, passport-strategy@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
|
resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
|
||||||
|
|
||||||
|
@ -5361,9 +5609,9 @@ passport.socketio@^3.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
xtend "^4.0.0"
|
xtend "^4.0.0"
|
||||||
|
|
||||||
passport@^0.3.2:
|
passport@^0.4.0:
|
||||||
version "0.3.2"
|
version "0.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/passport/-/passport-0.3.2.tgz#9dd009f915e8fe095b0124a01b8f82da07510102"
|
resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.0.tgz#c5095691347bd5ad3b5e180238c3914d16f05811"
|
||||||
dependencies:
|
dependencies:
|
||||||
passport-strategy "1.x.x"
|
passport-strategy "1.x.x"
|
||||||
pause "0.0.1"
|
pause "0.0.1"
|
||||||
|
@ -5460,6 +5708,10 @@ pg-hstore@^2.3.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
underscore "^1.7.0"
|
underscore "^1.7.0"
|
||||||
|
|
||||||
|
pg-int8@1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
|
||||||
|
|
||||||
pg-pool@1.*:
|
pg-pool@1.*:
|
||||||
version "1.8.0"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.8.0.tgz#f7ec73824c37a03f076f51bfdf70e340147c4f37"
|
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.8.0.tgz#f7ec73824c37a03f076f51bfdf70e340147c4f37"
|
||||||
|
@ -5468,9 +5720,10 @@ pg-pool@1.*:
|
||||||
object-assign "4.1.0"
|
object-assign "4.1.0"
|
||||||
|
|
||||||
pg-types@1.*:
|
pg-types@1.*:
|
||||||
version "1.12.1"
|
version "1.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz#d64087e3903b58ffaad279e7595c52208a14c3d2"
|
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.13.0.tgz#75f490b8a8abf75f1386ef5ec4455ecf6b345c63"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
pg-int8 "1.0.1"
|
||||||
postgres-array "~1.0.0"
|
postgres-array "~1.0.0"
|
||||||
postgres-bytea "~1.0.0"
|
postgres-bytea "~1.0.0"
|
||||||
postgres-date "~1.0.0"
|
postgres-date "~1.0.0"
|
||||||
|
@ -5868,6 +6121,10 @@ process-nextick-args@~1.0.6:
|
||||||
version "1.0.7"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
|
||||||
|
|
||||||
|
process-nextick-args@~2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
|
||||||
|
|
||||||
process@^0.11.0:
|
process@^0.11.0:
|
||||||
version "0.11.10"
|
version "0.11.10"
|
||||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||||
|
@ -5963,9 +6220,9 @@ randomatic@^1.1.3:
|
||||||
is-number "^3.0.0"
|
is-number "^3.0.0"
|
||||||
kind-of "^4.0.0"
|
kind-of "^4.0.0"
|
||||||
|
|
||||||
randomcolor@^0.4.4:
|
randomcolor@^0.5.3:
|
||||||
version "0.4.4"
|
version "0.5.3"
|
||||||
resolved "https://registry.yarnpkg.com/randomcolor/-/randomcolor-0.4.4.tgz#5ff56862e97ba03beb0419ff0536ec7aff59eeeb"
|
resolved "https://registry.yarnpkg.com/randomcolor/-/randomcolor-0.5.3.tgz#7f90f2f2a7f6d5a52232161eeaeeaea9ac3b5815"
|
||||||
|
|
||||||
range-parser@~1.2.0:
|
range-parser@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
|
@ -6005,6 +6262,15 @@ rc@^1.1.7:
|
||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
strip-json-comments "~2.0.1"
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
|
rc@^1.2.7:
|
||||||
|
version "1.2.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
||||||
|
dependencies:
|
||||||
|
deep-extend "^0.6.0"
|
||||||
|
ini "~1.3.0"
|
||||||
|
minimist "^1.2.0"
|
||||||
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
read-pkg-up@^1.0.1:
|
read-pkg-up@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
|
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
|
||||||
|
@ -6074,6 +6340,18 @@ readable-stream@2.3.3, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-
|
||||||
string_decoder "~1.0.3"
|
string_decoder "~1.0.3"
|
||||||
util-deprecate "~1.0.1"
|
util-deprecate "~1.0.1"
|
||||||
|
|
||||||
|
readable-stream@^2.0.0, readable-stream@^2.3.0:
|
||||||
|
version "2.3.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||||
|
dependencies:
|
||||||
|
core-util-is "~1.0.0"
|
||||||
|
inherits "~2.0.3"
|
||||||
|
isarray "~1.0.0"
|
||||||
|
process-nextick-args "~2.0.0"
|
||||||
|
safe-buffer "~5.1.1"
|
||||||
|
string_decoder "~1.1.1"
|
||||||
|
util-deprecate "~1.0.1"
|
||||||
|
|
||||||
readable-stream@~2.0.0:
|
readable-stream@~2.0.0:
|
||||||
version "2.0.6"
|
version "2.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
|
||||||
|
@ -6236,7 +6514,7 @@ remark@^5.0.1:
|
||||||
remark-stringify "^1.1.0"
|
remark-stringify "^1.1.0"
|
||||||
unified "^4.1.1"
|
unified "^4.1.1"
|
||||||
|
|
||||||
remarkable@^1.6.0:
|
remarkable@^1.7.1:
|
||||||
version "1.7.1"
|
version "1.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.1.tgz#aaca4972100b66a642a63a1021ca4bac1be3bff6"
|
resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.1.tgz#aaca4972100b66a642a63a1021ca4bac1be3bff6"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -6453,7 +6731,7 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@~5.1.0, 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.1:
|
safe-buffer@^5.1.1, safe-buffer@^5.1.2:
|
||||||
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"
|
||||||
|
|
||||||
|
@ -6467,6 +6745,10 @@ safefs@^3.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-fs "*"
|
graceful-fs "*"
|
||||||
|
|
||||||
|
"safer-buffer@>= 2.1.2 < 3":
|
||||||
|
version "2.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||||
|
|
||||||
sax@0.5.x:
|
sax@0.5.x:
|
||||||
version "0.5.8"
|
version "0.5.8"
|
||||||
resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
|
resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
|
||||||
|
@ -6475,6 +6757,10 @@ sax@1.2.1, sax@>=0.6.0, sax@^1.2.1, sax@~1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
|
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
|
||||||
|
|
||||||
|
sax@^1.2.4:
|
||||||
|
version "1.2.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
|
||||||
|
|
||||||
scandirectory@^2.5.0:
|
scandirectory@^2.5.0:
|
||||||
version "2.5.0"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72"
|
resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72"
|
||||||
|
@ -6630,9 +6916,9 @@ shimmer@1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.1.0.tgz#97d7377137ffbbab425522e429fe0aa89a488b35"
|
resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.1.0.tgz#97d7377137ffbbab425522e429fe0aa89a488b35"
|
||||||
|
|
||||||
shortid@2.2.6:
|
shortid@2.2.8:
|
||||||
version "2.2.6"
|
version "2.2.8"
|
||||||
resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.6.tgz#3abbefc6c51074cf2c1f1e72f6216a1b45876d72"
|
resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131"
|
||||||
|
|
||||||
sigmund@^1.0.1, sigmund@~1.0.0:
|
sigmund@^1.0.1, sigmund@~1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
|
@ -6763,12 +7049,12 @@ sprintf@0.1.5:
|
||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/sprintf/-/sprintf-0.1.5.tgz#8f83e39a9317c1a502cb7db8050e51c679f6edcf"
|
resolved "https://registry.yarnpkg.com/sprintf/-/sprintf-0.1.5.tgz#8f83e39a9317c1a502cb7db8050e51c679f6edcf"
|
||||||
|
|
||||||
sqlite3@^3.1.8:
|
sqlite3@^4.0.1:
|
||||||
version "3.1.12"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-3.1.12.tgz#2b3a14b17162e39e8aa6e1e2487a41d0795396d8"
|
resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.1.tgz#78e815bb50d7320fd90f03f1d7c3a920010d7ce3"
|
||||||
dependencies:
|
dependencies:
|
||||||
nan "~2.7.0"
|
nan "~2.10.0"
|
||||||
node-pre-gyp "~0.6.38"
|
node-pre-gyp "~0.10.1"
|
||||||
|
|
||||||
sqlstring@2.2.0:
|
sqlstring@2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
|
@ -6818,9 +7104,9 @@ standard@^9.0.1:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
|
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
|
||||||
|
|
||||||
store@^1.3.20:
|
store@^2.0.12:
|
||||||
version "1.3.20"
|
version "2.0.12"
|
||||||
resolved "https://registry.yarnpkg.com/store/-/store-1.3.20.tgz#13ea7e3fb2d6c239868265d686b1d84e99c5be3e"
|
resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593"
|
||||||
|
|
||||||
stream-browserify@^2.0.1:
|
stream-browserify@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
|
@ -6893,6 +7179,12 @@ string_decoder@~1.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
|
string_decoder@~1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
||||||
|
dependencies:
|
||||||
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
stringify-entities@^1.0.1:
|
stringify-entities@^1.0.1:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c"
|
resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c"
|
||||||
|
@ -7045,6 +7337,18 @@ tar-pack@^3.4.0:
|
||||||
tar "^2.2.1"
|
tar "^2.2.1"
|
||||||
uid-number "^0.0.6"
|
uid-number "^0.0.6"
|
||||||
|
|
||||||
|
tar-stream@^1.5.0:
|
||||||
|
version "1.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
|
||||||
|
dependencies:
|
||||||
|
bl "^1.0.0"
|
||||||
|
buffer-alloc "^1.1.0"
|
||||||
|
end-of-stream "^1.0.0"
|
||||||
|
fs-constants "^1.0.0"
|
||||||
|
readable-stream "^2.3.0"
|
||||||
|
to-buffer "^1.1.0"
|
||||||
|
xtend "^4.0.0"
|
||||||
|
|
||||||
tar@^2.2.1:
|
tar@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
|
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
|
||||||
|
@ -7053,6 +7357,18 @@ tar@^2.2.1:
|
||||||
fstream "^1.0.2"
|
fstream "^1.0.2"
|
||||||
inherits "2"
|
inherits "2"
|
||||||
|
|
||||||
|
tar@^4:
|
||||||
|
version "4.4.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
|
||||||
|
dependencies:
|
||||||
|
chownr "^1.0.1"
|
||||||
|
fs-minipass "^1.2.5"
|
||||||
|
minipass "^2.3.3"
|
||||||
|
minizlib "^1.1.0"
|
||||||
|
mkdirp "^0.5.0"
|
||||||
|
safe-buffer "^5.1.2"
|
||||||
|
yallist "^3.0.2"
|
||||||
|
|
||||||
taskgroup@^4.0.5, taskgroup@^4.2.0:
|
taskgroup@^4.0.5, taskgroup@^4.2.0:
|
||||||
version "4.3.1"
|
version "4.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a"
|
resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a"
|
||||||
|
@ -7143,18 +7459,18 @@ tiny-emitter@^2.0.0:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c"
|
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c"
|
||||||
|
|
||||||
tmp@0.0.28:
|
|
||||||
version "0.0.28"
|
|
||||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120"
|
|
||||||
dependencies:
|
|
||||||
os-tmpdir "~1.0.1"
|
|
||||||
|
|
||||||
tmp@0.0.29:
|
tmp@0.0.29:
|
||||||
version "0.0.29"
|
version "0.0.29"
|
||||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
|
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
|
||||||
dependencies:
|
dependencies:
|
||||||
os-tmpdir "~1.0.1"
|
os-tmpdir "~1.0.1"
|
||||||
|
|
||||||
|
tmp@0.0.33:
|
||||||
|
version "0.0.33"
|
||||||
|
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
||||||
|
dependencies:
|
||||||
|
os-tmpdir "~1.0.2"
|
||||||
|
|
||||||
to-array@0.1.4:
|
to-array@0.1.4:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
|
resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
|
||||||
|
@ -7163,6 +7479,10 @@ to-arraybuffer@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
|
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
|
||||||
|
|
||||||
|
to-buffer@^1.1.0:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
||||||
|
|
||||||
to-fast-properties@^1.0.3:
|
to-fast-properties@^1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
|
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
|
||||||
|
@ -7515,14 +7835,14 @@ validate-npm-package-license@^3.0.1:
|
||||||
spdx-correct "~1.0.0"
|
spdx-correct "~1.0.0"
|
||||||
spdx-expression-parse "~1.0.0"
|
spdx-expression-parse "~1.0.0"
|
||||||
|
|
||||||
|
validator@^10.4.0:
|
||||||
|
version "10.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/validator/-/validator-10.4.0.tgz#ee99a44afb3bb5ed350a159f056ca72a204cfc3c"
|
||||||
|
|
||||||
validator@^5.2.0:
|
validator@^5.2.0:
|
||||||
version "5.7.0"
|
version "5.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/validator/-/validator-5.7.0.tgz#7a87a58146b695ac486071141c0c49d67da05e5c"
|
resolved "https://registry.yarnpkg.com/validator/-/validator-5.7.0.tgz#7a87a58146b695ac486071141c0c49d67da05e5c"
|
||||||
|
|
||||||
validator@^6.2.0:
|
|
||||||
version "6.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/validator/-/validator-6.3.0.tgz#47ce23ed8d4eaddfa9d4b8ef0071b6cf1078d7c8"
|
|
||||||
|
|
||||||
validator@~9.4.1:
|
validator@~9.4.1:
|
||||||
version "9.4.1"
|
version "9.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663"
|
resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663"
|
||||||
|
@ -7874,9 +8194,9 @@ xregexp@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
|
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
|
||||||
|
|
||||||
xss@^0.3.3:
|
xss@^1.0.3:
|
||||||
version "0.3.4"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/xss/-/xss-0.3.4.tgz#f4eca4e83e10a91a578ef8caa10fb416c38ce15b"
|
resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.3.tgz#d04bd2558fd6c29c46113824d5e8b2a910054e23"
|
||||||
dependencies:
|
dependencies:
|
||||||
commander "^2.9.0"
|
commander "^2.9.0"
|
||||||
cssfilter "0.0.10"
|
cssfilter "0.0.10"
|
||||||
|
@ -7899,6 +8219,10 @@ yallist@^2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||||
|
|
||||||
|
yallist@^3.0.0, yallist@^3.0.2:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
|
||||||
|
|
||||||
yargs-parser@^7.0.0:
|
yargs-parser@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
|
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
|
||||||
|
@ -7941,3 +8265,12 @@ yauzl@2.4.1:
|
||||||
yeast@0.1.2:
|
yeast@0.1.2:
|
||||||
version "0.1.2"
|
version "0.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
|
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
|
||||||
|
|
||||||
|
zip-stream@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
|
||||||
|
dependencies:
|
||||||
|
archiver-utils "^1.3.0"
|
||||||
|
compress-commons "^1.2.0"
|
||||||
|
lodash "^4.8.0"
|
||||||
|
readable-stream "^2.0.0"
|
||||||
|
|
Loading…
Reference in a new issue