├── .assets
├── img
│ ├── customisation_1.png
│ ├── logo_gray.svg
│ ├── logo_primary.svg
│ ├── logo_white.svg
│ └── orgmode.gif
└── raw
│ ├── Makefile
│ ├── navigation_00001.png
│ ├── navigation_00002.png
│ ├── navigation_00003.png
│ ├── navigation_00004.png
│ ├── navigation_00005.png
│ ├── navigation_00006.png
│ ├── navigation_00007.png
│ ├── navigation_00008.png
│ ├── navigation_00009.png
│ ├── navigation_00010.png
│ ├── navigation_00011.png
│ ├── navigation_00012.png
│ ├── orgmode_00001.png
│ ├── orgmode_00002.png
│ ├── orgmode_00003.png
│ ├── orgmode_00004.png
│ ├── orgmode_00005.png
│ ├── orgmode_00006.png
│ ├── orgmode_00007.png
│ ├── orgmode_00008.png
│ ├── orgmode_00009.png
│ ├── orgmode_00010.png
│ ├── orgmode_00011.png
│ ├── orgmode_00012.png
│ ├── orgmode_00013.png
│ ├── orgmode_00014.png
│ ├── photo.xcf
│ ├── photo_management_0001.png
│ ├── photo_management_0002.png
│ ├── photo_management_0003.png
│ ├── photo_management_0004.png
│ ├── photo_management_0005.png
│ ├── photo_management_0006.png
│ ├── photo_management_0007.png
│ ├── photo_management_0008.png
│ ├── photo_management_0009.png
│ └── photo_management_0010.png
├── .babelrc
├── .editorconfig
├── .eslintrc.json
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug.md
│ ├── feature.md
│ └── support.md
└── stale.yml
├── .gitignore
├── CONTRIBUTING.md
├── Jenkinsfile
├── LICENSE
├── Makefile
├── README.md
├── client
├── assets
│ ├── css
│ │ ├── mixin.scss
│ │ ├── reset.scss
│ │ ├── videojs-custom.css
│ │ └── videojs-sublime-skin.scss
│ ├── fonts
│ │ ├── SourceCodePro-Regular-400-latin-ext.woff2
│ │ ├── SourceCodePro-Regular-400-latin.woff2
│ │ ├── SourceCodePro-Semibold-600-latin-ext.woff2
│ │ └── SourceCodePro-Semibold-600-latin.woff2
│ ├── icons
│ │ ├── delete.svg
│ │ ├── edit.svg
│ │ ├── empty_folder.svg
│ │ ├── empty_search.svg
│ │ ├── file.svg
│ │ ├── folder.svg
│ │ ├── music.png
│ │ ├── photo.png
│ │ ├── placeholder.png
│ │ ├── share.svg
│ │ ├── tag.svg
│ │ └── video.png
│ ├── img
│ │ ├── alarm.svg
│ │ ├── arrow-down-double.svg
│ │ ├── arrow-down.svg
│ │ ├── arrow-up-double.svg
│ │ ├── arrow_bottom.svg
│ │ ├── arrow_left.svg
│ │ ├── arrow_left_white.svg
│ │ ├── arrow_right.svg
│ │ ├── arrow_right_white.svg
│ │ ├── arrow_top.svg
│ │ ├── bucket.svg
│ │ ├── calendar.svg
│ │ ├── calendar_white.svg
│ │ ├── camera.svg
│ │ ├── check.svg
│ │ ├── close.svg
│ │ ├── close_dark.svg
│ │ ├── copy.svg
│ │ ├── deadline.svg
│ │ ├── download.svg
│ │ ├── download_white.svg
│ │ ├── dropbox.png
│ │ ├── error.svg
│ │ ├── eye.svg
│ │ ├── fullscreen.svg
│ │ ├── google-drive.png
│ │ ├── grid.svg
│ │ ├── info.svg
│ │ ├── list.svg
│ │ ├── loader.svg
│ │ ├── loader_white.svg
│ │ ├── location.svg
│ │ ├── more.svg
│ │ ├── pause.svg
│ │ ├── play.svg
│ │ ├── power.svg
│ │ ├── refresh.svg
│ │ ├── save.svg
│ │ ├── schedule.svg
│ │ ├── search.svg
│ │ ├── search_dark.svg
│ │ ├── sort.svg
│ │ ├── stop.svg
│ │ ├── todo_white.svg
│ │ ├── upload_white.svg
│ │ ├── volume.svg
│ │ ├── volume_low.svg
│ │ └── volume_mute.svg
│ └── logo
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── app_icon.png
│ │ ├── apple-touch-icon.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ ├── mstile-150x150.png
│ │ ├── og-image.png
│ │ └── safari-pinned-tab.svg
├── components
│ ├── alert.js
│ ├── alert.scss
│ ├── animation.js
│ ├── breadcrumb.js
│ ├── breadcrumb.scss
│ ├── bundle.js
│ ├── button.js
│ ├── button.scss
│ ├── card.js
│ ├── card.scss
│ ├── confirm.js
│ ├── container.js
│ ├── container.scss
│ ├── decorator.js
│ ├── dropdown.js
│ ├── dropdown.scss
│ ├── events.js
│ ├── fab.js
│ ├── fab.scss
│ ├── formbuilder.js
│ ├── formbuilder.scss
│ ├── icon.js
│ ├── icon.scss
│ ├── index.js
│ ├── input.js
│ ├── input.scss
│ ├── loader.js
│ ├── loader.scss
│ ├── mapshot.js
│ ├── mapshot.scss
│ ├── modal.js
│ ├── modal.scss
│ ├── ngif.js
│ ├── notification.js
│ ├── notification.scss
│ ├── popup.js
│ ├── popup.scss
│ ├── prompt.js
│ ├── textarea.js
│ ├── textarea.scss
│ ├── textarea.woff
│ ├── upload_queue.js
│ ├── upload_queue.scss
│ ├── video.js
│ └── video.scss
├── helpers
│ ├── ajax.js
│ ├── backpressure.js
│ ├── bcrypt.js
│ ├── cache.js
│ ├── cache_state.js
│ ├── common.js
│ ├── crypto.js
│ ├── events.js
│ ├── form.js
│ ├── format.js
│ ├── index.js
│ ├── memory.js
│ ├── mimetype.js
│ ├── navigate.js
│ ├── notify.js
│ ├── org.js
│ ├── path.js
│ ├── popup.js
│ ├── random.js
│ ├── settings.js
│ └── upload.js
├── index.html
├── index.js
├── locales
│ ├── _.json
│ ├── az.json
│ ├── be.json
│ ├── bg.json
│ ├── ca.json
│ ├── cs.json
│ ├── da.json
│ ├── de.json
│ ├── el.json
│ ├── es.json
│ ├── et.json
│ ├── eu.json
│ ├── fi.json
│ ├── fr.json
│ ├── gl.json
│ ├── hr.json
│ ├── hu.json
│ ├── id.json
│ ├── index.js
│ ├── is.json
│ ├── it.json
│ ├── ja.json
│ ├── ka.json
│ ├── ko.json
│ ├── lt.json
│ ├── lv.json
│ ├── mn.json
│ ├── nb.json
│ ├── nl.json
│ ├── pl.json
│ ├── pt.json
│ ├── ro.json
│ ├── ru.json
│ ├── sk.json
│ ├── sl.json
│ ├── sr.json
│ ├── sv.json
│ ├── th.json
│ ├── tr.json
│ ├── uk.json
│ ├── vi.json
│ ├── zh.json
│ └── zh_tw.json
├── model
│ ├── admin.js
│ ├── audit.js
│ ├── chromecast.js
│ ├── config.js
│ ├── files.js
│ ├── index.js
│ ├── log.js
│ ├── session.js
│ ├── share.js
│ └── tags.js
├── pages
│ ├── adminpage.js
│ ├── adminpage.scss
│ ├── adminpage
│ │ ├── about.js
│ │ ├── about.scss
│ │ ├── backend.js
│ │ ├── backend.scss
│ │ ├── home.js
│ │ ├── index.js
│ │ ├── logger.js
│ │ ├── logger.scss
│ │ ├── loginpage.js
│ │ ├── settings.js
│ │ ├── setup.js
│ │ └── setup.scss
│ ├── connectpage.js
│ ├── connectpage.scss
│ ├── connectpage
│ │ ├── forkme.js
│ │ ├── forkme.scss
│ │ ├── form.js
│ │ ├── form.scss
│ │ └── index.js
│ ├── error.scss
│ ├── filespage.helper.js
│ ├── filespage.js
│ ├── filespage.scss
│ ├── filespage
│ │ ├── breadcrumb.js
│ │ ├── filesystem.js
│ │ ├── filesystem.scss
│ │ ├── filezone.js
│ │ ├── filezone.scss
│ │ ├── frequently_access.js
│ │ ├── frequently_access.scss
│ │ ├── index.js
│ │ ├── share.js
│ │ ├── share.scss
│ │ ├── sidebar.js
│ │ ├── sidebar.scss
│ │ ├── submenu.js
│ │ ├── submenu.scss
│ │ ├── tag.js
│ │ ├── tag.scss
│ │ ├── thing-existing.js
│ │ ├── thing-new.js
│ │ └── thing.scss
│ ├── homepage.js
│ ├── index.js
│ ├── logout.js
│ ├── notfoundpage.js
│ ├── sharepage.js
│ ├── sharepage.scss
│ ├── tagspage.js
│ ├── tagspage.scss
│ ├── viewerpage.js
│ ├── viewerpage.scss
│ └── viewerpage
│ │ ├── appframe.js
│ │ ├── appframe.scss
│ │ ├── audioplayer.js
│ │ ├── audioplayer.scss
│ │ ├── ebookviewer.js
│ │ ├── ebookviewer.scss
│ │ ├── editor.js
│ │ ├── editor.scss
│ │ ├── editor
│ │ ├── clike.js
│ │ ├── clojure.js
│ │ ├── cmake.js
│ │ ├── commonlisp.js
│ │ ├── css.js
│ │ ├── diff.js
│ │ ├── dockerfile.js
│ │ ├── elm.js
│ │ ├── emacs-org.js
│ │ ├── erlang.js
│ │ ├── go.js
│ │ ├── htmlmixed.js
│ │ ├── javascript.js
│ │ ├── jsx.js
│ │ ├── keymap_base.js
│ │ ├── keymap_vim.js
│ │ ├── lua.js
│ │ ├── orgmode.js
│ │ ├── perl.js
│ │ ├── php.js
│ │ ├── properties.js
│ │ ├── python.js
│ │ ├── r.js
│ │ ├── ruby.js
│ │ ├── rust.js
│ │ ├── sass.js
│ │ ├── shell.js
│ │ ├── sparql.js
│ │ ├── spreadsheet.js
│ │ ├── sql.js
│ │ ├── stex.js
│ │ ├── text.js
│ │ ├── xml.js
│ │ ├── yaml-frontmatter.js
│ │ └── yaml.js
│ │ ├── filedownloader.js
│ │ ├── filedownloader.scss
│ │ ├── formviewer.js
│ │ ├── formviewer.scss
│ │ ├── ide.js
│ │ ├── ide.scss
│ │ ├── image_exif.js
│ │ ├── image_exif.scss
│ │ ├── imageviewer.js
│ │ ├── imageviewer.scss
│ │ ├── index.js
│ │ ├── menubar.js
│ │ ├── menubar.scss
│ │ ├── org_viewer.js
│ │ ├── org_viewer.scss
│ │ ├── pager.js
│ │ ├── pager.scss
│ │ ├── pdfviewer.js
│ │ ├── pdfviewer.scss
│ │ ├── pdfviewer_lazy.js
│ │ ├── videoplayer.js
│ │ └── videoplayer.scss
├── router.js
└── worker
│ └── sw_cache.js
├── cmd
└── main.go
├── config
├── config.json
├── emacs.el
└── mime.json
├── docker
├── Dockerfile
└── docker-compose.yml
├── embed.go
├── go.mod
├── go.sum
├── package.json
├── public
├── Makefile
├── assets
│ ├── boot
│ │ ├── common.js
│ │ ├── ctrl_boot.d.ts
│ │ ├── ctrl_boot_backoffice.js
│ │ ├── ctrl_boot_frontoffice.js
│ │ ├── router_backoffice.js
│ │ └── router_frontoffice.js
│ ├── components
│ │ ├── breadcrumb.css
│ │ ├── breadcrumb.js
│ │ ├── decorator_shell_filemanager.css
│ │ ├── decorator_shell_filemanager.js
│ │ ├── dropdown.css
│ │ ├── dropdown.js
│ │ ├── fab.css
│ │ ├── fab.js
│ │ ├── form.js
│ │ ├── icon.js
│ │ ├── loader.js
│ │ ├── modal.css
│ │ ├── modal.js
│ │ ├── notification.css
│ │ ├── notification.js
│ │ ├── sidebar.css
│ │ ├── sidebar.js
│ │ └── skeleton.js
│ ├── css
│ │ ├── designsystem.css
│ │ ├── designsystem_alert.css
│ │ ├── designsystem_box.css
│ │ ├── designsystem_button.css
│ │ ├── designsystem_checkbox.css
│ │ ├── designsystem_container.css
│ │ ├── designsystem_darkmode.css
│ │ ├── designsystem_dropdown.css
│ │ ├── designsystem_formbuilder.css
│ │ ├── designsystem_icon.css
│ │ ├── designsystem_input.css
│ │ ├── designsystem_inputgroup.css
│ │ ├── designsystem_skeleton.css
│ │ ├── designsystem_textarea.css
│ │ └── designsystem_utils.css
│ ├── embed
│ │ ├── filestash-map.js
│ │ └── filestash-table.js
│ ├── fonts
│ │ ├── SourceCodePro-Regular-400-latin-ext.woff2
│ │ ├── SourceCodePro-Regular-400-latin.woff2
│ │ ├── SourceCodePro-Semibold-600-latin-ext.woff2
│ │ └── SourceCodePro-Semibold-600-latin.woff2
│ ├── helpers
│ │ ├── loader.d.ts
│ │ ├── loader.js
│ │ ├── loader_wasm.js
│ │ ├── log.d.ts
│ │ ├── log.js
│ │ └── sdk.js
│ ├── index.js
│ ├── lib
│ │ ├── ajax.js
│ │ ├── animate.d.ts
│ │ ├── animate.js
│ │ ├── assert.js
│ │ ├── chromecast.js
│ │ ├── dom.d.ts
│ │ ├── dom.js
│ │ ├── error.d.ts
│ │ ├── error.js
│ │ ├── form.d.ts
│ │ ├── form.js
│ │ ├── path.js
│ │ ├── polyfill.js
│ │ ├── random.d.ts
│ │ ├── random.js
│ │ ├── rx.d.ts
│ │ ├── rx.js
│ │ ├── settings.js
│ │ ├── skeleton
│ │ │ ├── index.d.ts
│ │ │ ├── index.js
│ │ │ ├── lifecycle.d.ts
│ │ │ ├── lifecycle.js
│ │ │ ├── router.d.ts
│ │ │ └── router.js
│ │ ├── store.js
│ │ └── vendor
│ │ │ ├── bcrypt.js
│ │ │ ├── codemirror
│ │ │ ├── .editorconfig
│ │ │ ├── .gitattributes
│ │ │ ├── .npmignore
│ │ │ ├── AUTHORS
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── addon
│ │ │ │ ├── comment
│ │ │ │ │ ├── comment.js
│ │ │ │ │ └── continuecomment.js
│ │ │ │ ├── dialog
│ │ │ │ │ ├── dialog.css
│ │ │ │ │ └── dialog.js
│ │ │ │ ├── display
│ │ │ │ │ ├── autorefresh.js
│ │ │ │ │ ├── fullscreen.css
│ │ │ │ │ ├── fullscreen.js
│ │ │ │ │ ├── panel.js
│ │ │ │ │ ├── placeholder.js
│ │ │ │ │ └── rulers.js
│ │ │ │ ├── edit
│ │ │ │ │ ├── closebrackets.js
│ │ │ │ │ ├── closetag.js
│ │ │ │ │ ├── continuelist.js
│ │ │ │ │ ├── matchbrackets.js
│ │ │ │ │ ├── matchtags.js
│ │ │ │ │ └── trailingspace.js
│ │ │ │ ├── fold
│ │ │ │ │ ├── brace-fold.js
│ │ │ │ │ ├── comment-fold.js
│ │ │ │ │ ├── foldcode.js
│ │ │ │ │ ├── foldgutter.css
│ │ │ │ │ ├── foldgutter.js
│ │ │ │ │ ├── indent-fold.js
│ │ │ │ │ ├── markdown-fold.js
│ │ │ │ │ └── xml-fold.js
│ │ │ │ ├── hint
│ │ │ │ │ ├── anyword-hint.js
│ │ │ │ │ ├── css-hint.js
│ │ │ │ │ ├── html-hint.js
│ │ │ │ │ ├── javascript-hint.js
│ │ │ │ │ ├── show-hint.css
│ │ │ │ │ ├── show-hint.js
│ │ │ │ │ ├── sql-hint.js
│ │ │ │ │ └── xml-hint.js
│ │ │ │ ├── lint
│ │ │ │ │ ├── coffeescript-lint.js
│ │ │ │ │ ├── css-lint.js
│ │ │ │ │ ├── html-lint.js
│ │ │ │ │ ├── javascript-lint.js
│ │ │ │ │ ├── json-lint.js
│ │ │ │ │ ├── lint.css
│ │ │ │ │ ├── lint.js
│ │ │ │ │ └── yaml-lint.js
│ │ │ │ ├── merge
│ │ │ │ │ ├── merge.css
│ │ │ │ │ └── merge.js
│ │ │ │ ├── mode
│ │ │ │ │ ├── loadmode.js
│ │ │ │ │ ├── multiplex.js
│ │ │ │ │ ├── multiplex_test.js
│ │ │ │ │ ├── overlay.js
│ │ │ │ │ └── simple.js
│ │ │ │ ├── runmode
│ │ │ │ │ ├── colorize.js
│ │ │ │ │ ├── runmode-standalone.js
│ │ │ │ │ ├── runmode.js
│ │ │ │ │ └── runmode.node.js
│ │ │ │ ├── scroll
│ │ │ │ │ ├── annotatescrollbar.js
│ │ │ │ │ ├── scrollpastend.js
│ │ │ │ │ ├── simplescrollbars.css
│ │ │ │ │ └── simplescrollbars.js
│ │ │ │ ├── search
│ │ │ │ │ ├── jump-to-line.js
│ │ │ │ │ ├── match-highlighter.js
│ │ │ │ │ ├── matchesonscrollbar.css
│ │ │ │ │ ├── matchesonscrollbar.js
│ │ │ │ │ ├── search.js
│ │ │ │ │ └── searchcursor.js
│ │ │ │ ├── selection
│ │ │ │ │ ├── active-line.js
│ │ │ │ │ ├── mark-selection.js
│ │ │ │ │ └── selection-pointer.js
│ │ │ │ ├── tern
│ │ │ │ │ ├── tern.css
│ │ │ │ │ ├── tern.js
│ │ │ │ │ └── worker.js
│ │ │ │ └── wrap
│ │ │ │ │ └── hardwrap.js
│ │ │ ├── bin
│ │ │ │ ├── authors.sh
│ │ │ │ ├── lint
│ │ │ │ ├── release
│ │ │ │ ├── source-highlight
│ │ │ │ └── upload-release.js
│ │ │ ├── demo
│ │ │ │ ├── activeline.html
│ │ │ │ ├── anywordhint.html
│ │ │ │ ├── bidi.html
│ │ │ │ ├── btree.html
│ │ │ │ ├── buffers.html
│ │ │ │ ├── changemode.html
│ │ │ │ ├── closebrackets.html
│ │ │ │ ├── closetag.html
│ │ │ │ ├── complete.html
│ │ │ │ ├── emacs.html
│ │ │ │ ├── folding.html
│ │ │ │ ├── fullscreen.html
│ │ │ │ ├── hardwrap.html
│ │ │ │ ├── html5complete.html
│ │ │ │ ├── indentwrap.html
│ │ │ │ ├── lint.html
│ │ │ │ ├── loadmode.html
│ │ │ │ ├── marker.html
│ │ │ │ ├── markselection.html
│ │ │ │ ├── matchhighlighter.html
│ │ │ │ ├── matchtags.html
│ │ │ │ ├── merge.html
│ │ │ │ ├── multiplex.html
│ │ │ │ ├── mustache.html
│ │ │ │ ├── panel.html
│ │ │ │ ├── placeholder.html
│ │ │ │ ├── preview.html
│ │ │ │ ├── requirejs.html
│ │ │ │ ├── resize.html
│ │ │ │ ├── rulers.html
│ │ │ │ ├── runmode-standalone.html
│ │ │ │ ├── runmode.html
│ │ │ │ ├── search.html
│ │ │ │ ├── simplemode.html
│ │ │ │ ├── simplescrollbars.html
│ │ │ │ ├── spanaffectswrapping_shim.html
│ │ │ │ ├── sublime.html
│ │ │ │ ├── tern.html
│ │ │ │ ├── theme.html
│ │ │ │ ├── trailingspace.html
│ │ │ │ ├── variableheight.html
│ │ │ │ ├── vim.html
│ │ │ │ ├── visibletabs.html
│ │ │ │ ├── widget.html
│ │ │ │ └── xmlcomplete.html
│ │ │ ├── doc
│ │ │ │ ├── activebookmark.js
│ │ │ │ ├── docs.css
│ │ │ │ ├── internals.html
│ │ │ │ ├── logo.png
│ │ │ │ ├── logo.svg
│ │ │ │ ├── manual.html
│ │ │ │ ├── realworld.html
│ │ │ │ ├── releases.html
│ │ │ │ ├── reporting.html
│ │ │ │ ├── source_sans.woff
│ │ │ │ ├── upgrade_v2.2.html
│ │ │ │ ├── upgrade_v3.html
│ │ │ │ ├── upgrade_v4.html
│ │ │ │ └── yinyang.png
│ │ │ ├── index.html
│ │ │ ├── keymap
│ │ │ │ ├── emacs.js
│ │ │ │ ├── sublime.js
│ │ │ │ └── vim.js
│ │ │ ├── lib
│ │ │ │ ├── codemirror.css
│ │ │ │ └── codemirror.js
│ │ │ ├── mode
│ │ │ │ ├── apl
│ │ │ │ │ ├── apl.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── asciiarmor
│ │ │ │ │ ├── asciiarmor.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── asn.1
│ │ │ │ │ ├── asn.1.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── asterisk
│ │ │ │ │ ├── asterisk.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── brainfuck
│ │ │ │ │ ├── brainfuck.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── clike
│ │ │ │ │ ├── clike.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── scala.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── clojure
│ │ │ │ │ ├── clojure.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── cmake
│ │ │ │ │ ├── cmake.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── cobol
│ │ │ │ │ ├── cobol.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── coffeescript
│ │ │ │ │ ├── coffeescript.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── commonlisp
│ │ │ │ │ ├── commonlisp.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── crystal
│ │ │ │ │ ├── crystal.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── css
│ │ │ │ │ ├── css.js
│ │ │ │ │ ├── gss.html
│ │ │ │ │ ├── gss_test.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── less.html
│ │ │ │ │ ├── less_test.js
│ │ │ │ │ ├── scss.html
│ │ │ │ │ ├── scss_test.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── cypher
│ │ │ │ │ ├── cypher.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── d
│ │ │ │ │ ├── d.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── dart
│ │ │ │ │ ├── dart.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── diff
│ │ │ │ │ ├── diff.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── django
│ │ │ │ │ ├── django.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── dockerfile
│ │ │ │ │ ├── dockerfile.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── dtd
│ │ │ │ │ ├── dtd.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── dylan
│ │ │ │ │ ├── dylan.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── ebnf
│ │ │ │ │ ├── ebnf.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── ecl
│ │ │ │ │ ├── ecl.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── eiffel
│ │ │ │ │ ├── eiffel.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── elm
│ │ │ │ │ ├── elm.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── erlang
│ │ │ │ │ ├── erlang.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── factor
│ │ │ │ │ ├── factor.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── fcl
│ │ │ │ │ ├── fcl.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── forth
│ │ │ │ │ ├── forth.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── fortran
│ │ │ │ │ ├── fortran.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── gas
│ │ │ │ │ ├── gas.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── gfm
│ │ │ │ │ ├── gfm.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── gherkin
│ │ │ │ │ ├── gherkin.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── go
│ │ │ │ │ ├── go.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── groovy
│ │ │ │ │ ├── groovy.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── haml
│ │ │ │ │ ├── haml.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── test.js
│ │ │ │ ├── handlebars
│ │ │ │ │ ├── handlebars.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── haskell-literate
│ │ │ │ │ ├── haskell-literate.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── haskell
│ │ │ │ │ ├── haskell.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── haxe
│ │ │ │ │ ├── haxe.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── htmlembedded
│ │ │ │ │ ├── htmlembedded.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── htmlmixed
│ │ │ │ │ ├── htmlmixed.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── http
│ │ │ │ │ ├── http.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── idl
│ │ │ │ │ ├── idl.js
│ │ │ │ │ └── index.html
│ │ │ │ ├── index.html
│ │ │ │ ├── javascript
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── javascript.js
│ │ │ │ │ ├── json-ld.html
│ │ │ │ │ ├── test.js
│ │ │ │ │ └── typescript.html
│ │ │ │ ├── jinja2
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── jinja2.js
│ │ │ │ ├── jsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── jsx.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── julia
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── julia.js
│ │ │ │ ├── livescript
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── livescript.js
│ │ │ │ ├── lua
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── lua.js
│ │ │ │ ├── markdown
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── markdown.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── mathematica
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── mathematica.js
│ │ │ │ ├── mbox
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── mbox.js
│ │ │ │ ├── meta.js
│ │ │ │ ├── mirc
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── mirc.js
│ │ │ │ ├── mllike
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── mllike.js
│ │ │ │ ├── modelica
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── modelica.js
│ │ │ │ ├── mscgen
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── mscgen.js
│ │ │ │ │ ├── mscgen_test.js
│ │ │ │ │ ├── msgenny_test.js
│ │ │ │ │ └── xu_test.js
│ │ │ │ ├── mumps
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── mumps.js
│ │ │ │ ├── nginx
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── nginx.js
│ │ │ │ ├── nsis
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── nsis.js
│ │ │ │ ├── ntriples
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── ntriples.js
│ │ │ │ ├── octave
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── octave.js
│ │ │ │ ├── oz
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── oz.js
│ │ │ │ ├── pascal
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── pascal.js
│ │ │ │ ├── pegjs
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── pegjs.js
│ │ │ │ ├── perl
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── perl.js
│ │ │ │ ├── php
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── php.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── pig
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── pig.js
│ │ │ │ ├── powershell
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── powershell.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── properties
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── properties.js
│ │ │ │ ├── protobuf
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── protobuf.js
│ │ │ │ ├── pug
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── pug.js
│ │ │ │ ├── puppet
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── puppet.js
│ │ │ │ ├── python
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── python.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── q
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── q.js
│ │ │ │ ├── r
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── r.js
│ │ │ │ ├── rpm
│ │ │ │ │ ├── changes
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── rpm.js
│ │ │ │ ├── rst
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── rst.js
│ │ │ │ ├── ruby
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── ruby.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── rust
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── rust.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── sas
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sas.js
│ │ │ │ ├── sass
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── sass.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── scheme
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── scheme.js
│ │ │ │ ├── shell
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── shell.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── sieve
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sieve.js
│ │ │ │ ├── slim
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── slim.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── smalltalk
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── smalltalk.js
│ │ │ │ ├── smarty
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── smarty.js
│ │ │ │ ├── solr
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── solr.js
│ │ │ │ ├── soy
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── soy.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── sparql
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sparql.js
│ │ │ │ ├── spreadsheet
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── spreadsheet.js
│ │ │ │ ├── sql
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sql.js
│ │ │ │ ├── stex
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── stex.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── stylus
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── stylus.js
│ │ │ │ ├── swift
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── swift.js
│ │ │ │ │ └── test.js
│ │ │ │ ├── tcl
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── tcl.js
│ │ │ │ ├── textile
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── test.js
│ │ │ │ │ └── textile.js
│ │ │ │ ├── tiddlywiki
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── tiddlywiki.css
│ │ │ │ │ └── tiddlywiki.js
│ │ │ │ ├── tiki
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── tiki.css
│ │ │ │ │ └── tiki.js
│ │ │ │ ├── toml
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── toml.js
│ │ │ │ ├── tornado
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── tornado.js
│ │ │ │ ├── troff
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── troff.js
│ │ │ │ ├── ttcn-cfg
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── ttcn-cfg.js
│ │ │ │ ├── ttcn
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── ttcn.js
│ │ │ │ ├── turtle
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── turtle.js
│ │ │ │ ├── twig
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── twig.js
│ │ │ │ ├── vb
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── vb.js
│ │ │ │ ├── vbscript
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── vbscript.js
│ │ │ │ ├── velocity
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── velocity.js
│ │ │ │ ├── verilog
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── test.js
│ │ │ │ │ └── verilog.js
│ │ │ │ ├── vhdl
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── vhdl.js
│ │ │ │ ├── vue
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── vue.js
│ │ │ │ ├── wast
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── test.js
│ │ │ │ │ └── wast.js
│ │ │ │ ├── webidl
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── webidl.js
│ │ │ │ ├── xml
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── test.js
│ │ │ │ │ └── xml.js
│ │ │ │ ├── xquery
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── test.js
│ │ │ │ │ └── xquery.js
│ │ │ │ ├── yacas
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── yacas.js
│ │ │ │ ├── yaml-frontmatter
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── yaml-frontmatter.js
│ │ │ │ ├── yaml
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── yaml.js
│ │ │ │ └── z80
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── z80.js
│ │ │ ├── package.json
│ │ │ ├── rollup.config.js
│ │ │ ├── src
│ │ │ │ ├── addon
│ │ │ │ │ └── runmode
│ │ │ │ │ │ ├── codemirror-standalone.js
│ │ │ │ │ │ ├── codemirror.node.js
│ │ │ │ │ │ ├── runmode-standalone.js
│ │ │ │ │ │ └── runmode.node.js
│ │ │ │ ├── codemirror.js
│ │ │ │ ├── display
│ │ │ │ │ ├── Display.js
│ │ │ │ │ ├── focus.js
│ │ │ │ │ ├── gutters.js
│ │ │ │ │ ├── highlight_worker.js
│ │ │ │ │ ├── line_numbers.js
│ │ │ │ │ ├── mode_state.js
│ │ │ │ │ ├── operations.js
│ │ │ │ │ ├── scroll_events.js
│ │ │ │ │ ├── scrollbars.js
│ │ │ │ │ ├── scrolling.js
│ │ │ │ │ ├── selection.js
│ │ │ │ │ ├── update_display.js
│ │ │ │ │ ├── update_line.js
│ │ │ │ │ ├── update_lines.js
│ │ │ │ │ └── view_tracking.js
│ │ │ │ ├── edit
│ │ │ │ │ ├── CodeMirror.js
│ │ │ │ │ ├── commands.js
│ │ │ │ │ ├── deleteNearSelection.js
│ │ │ │ │ ├── drop_events.js
│ │ │ │ │ ├── fromTextArea.js
│ │ │ │ │ ├── global_events.js
│ │ │ │ │ ├── key_events.js
│ │ │ │ │ ├── legacy.js
│ │ │ │ │ ├── main.js
│ │ │ │ │ ├── methods.js
│ │ │ │ │ ├── mouse_events.js
│ │ │ │ │ ├── options.js
│ │ │ │ │ └── utils.js
│ │ │ │ ├── input
│ │ │ │ │ ├── ContentEditableInput.js
│ │ │ │ │ ├── TextareaInput.js
│ │ │ │ │ ├── indent.js
│ │ │ │ │ ├── input.js
│ │ │ │ │ ├── keymap.js
│ │ │ │ │ ├── keynames.js
│ │ │ │ │ └── movement.js
│ │ │ │ ├── line
│ │ │ │ │ ├── highlight.js
│ │ │ │ │ ├── line_data.js
│ │ │ │ │ ├── pos.js
│ │ │ │ │ ├── saw_special_spans.js
│ │ │ │ │ ├── spans.js
│ │ │ │ │ └── utils_line.js
│ │ │ │ ├── measurement
│ │ │ │ │ ├── position_measurement.js
│ │ │ │ │ └── widgets.js
│ │ │ │ ├── model
│ │ │ │ │ ├── Doc.js
│ │ │ │ │ ├── change_measurement.js
│ │ │ │ │ ├── changes.js
│ │ │ │ │ ├── chunk.js
│ │ │ │ │ ├── document_data.js
│ │ │ │ │ ├── history.js
│ │ │ │ │ ├── line_widget.js
│ │ │ │ │ ├── mark_text.js
│ │ │ │ │ ├── selection.js
│ │ │ │ │ └── selection_updates.js
│ │ │ │ ├── modes.js
│ │ │ │ └── util
│ │ │ │ │ ├── StringStream.js
│ │ │ │ │ ├── bidi.js
│ │ │ │ │ ├── browser.js
│ │ │ │ │ ├── dom.js
│ │ │ │ │ ├── event.js
│ │ │ │ │ ├── feature_detection.js
│ │ │ │ │ ├── misc.js
│ │ │ │ │ └── operation_group.js
│ │ │ └── theme
│ │ │ │ ├── 3024-day.css
│ │ │ │ ├── 3024-night.css
│ │ │ │ ├── abbott.css
│ │ │ │ ├── abcdef.css
│ │ │ │ ├── ambiance-mobile.css
│ │ │ │ ├── ambiance.css
│ │ │ │ ├── ayu-dark.css
│ │ │ │ ├── ayu-mirage.css
│ │ │ │ ├── base16-dark.css
│ │ │ │ ├── base16-light.css
│ │ │ │ ├── bespin.css
│ │ │ │ ├── blackboard.css
│ │ │ │ ├── cobalt.css
│ │ │ │ ├── colorforth.css
│ │ │ │ ├── darcula.css
│ │ │ │ ├── dracula.css
│ │ │ │ ├── duotone-dark.css
│ │ │ │ ├── duotone-light.css
│ │ │ │ ├── eclipse.css
│ │ │ │ ├── elegant.css
│ │ │ │ ├── erlang-dark.css
│ │ │ │ ├── gruvbox-dark.css
│ │ │ │ ├── hopscotch.css
│ │ │ │ ├── icecoder.css
│ │ │ │ ├── idea.css
│ │ │ │ ├── isotope.css
│ │ │ │ ├── juejin.css
│ │ │ │ ├── lesser-dark.css
│ │ │ │ ├── liquibyte.css
│ │ │ │ ├── lucario.css
│ │ │ │ ├── material-darker.css
│ │ │ │ ├── material-ocean.css
│ │ │ │ ├── material-palenight.css
│ │ │ │ ├── material.css
│ │ │ │ ├── mbo.css
│ │ │ │ ├── mdn-like.css
│ │ │ │ ├── midnight.css
│ │ │ │ ├── monokai.css
│ │ │ │ ├── moxer.css
│ │ │ │ ├── neat.css
│ │ │ │ ├── neo.css
│ │ │ │ ├── night.css
│ │ │ │ ├── nord.css
│ │ │ │ ├── oceanic-next.css
│ │ │ │ ├── panda-syntax.css
│ │ │ │ ├── paraiso-dark.css
│ │ │ │ ├── paraiso-light.css
│ │ │ │ ├── pastel-on-dark.css
│ │ │ │ ├── railscasts.css
│ │ │ │ ├── rubyblue.css
│ │ │ │ ├── seti.css
│ │ │ │ ├── shadowfox.css
│ │ │ │ ├── solarized.css
│ │ │ │ ├── ssms.css
│ │ │ │ ├── the-matrix.css
│ │ │ │ ├── tomorrow-night-bright.css
│ │ │ │ ├── tomorrow-night-eighties.css
│ │ │ │ ├── ttcn.css
│ │ │ │ ├── twilight.css
│ │ │ │ ├── vibrant-ink.css
│ │ │ │ ├── xq-dark.css
│ │ │ │ ├── xq-light.css
│ │ │ │ ├── yeti.css
│ │ │ │ ├── yonce.css
│ │ │ │ └── zenburn.css
│ │ │ ├── epub
│ │ │ ├── epub.min.js
│ │ │ └── zip.min.js
│ │ │ ├── exif-js.js
│ │ │ ├── hlsjs
│ │ │ ├── hls.js
│ │ │ └── hls.js.map
│ │ │ ├── leaflet
│ │ │ ├── Control.Draw.js
│ │ │ ├── Leaflet.Draw.Event.js
│ │ │ ├── Leaflet.draw.js
│ │ │ ├── Toolbar.js
│ │ │ ├── Tooltip.js
│ │ │ ├── assets
│ │ │ │ └── rulers.png
│ │ │ ├── draw
│ │ │ │ ├── DrawToolbar.js
│ │ │ │ └── handler
│ │ │ │ │ ├── Draw.Circle.js
│ │ │ │ │ ├── Draw.CircleMarker.js
│ │ │ │ │ ├── Draw.Feature.js
│ │ │ │ │ ├── Draw.Marker.js
│ │ │ │ │ ├── Draw.Polygon.js
│ │ │ │ │ ├── Draw.Polyline.js
│ │ │ │ │ ├── Draw.Rectangle.js
│ │ │ │ │ └── Draw.SimpleShape.js
│ │ │ ├── edit
│ │ │ │ ├── EditToolbar.js
│ │ │ │ └── handler
│ │ │ │ │ ├── Edit.Circle.js
│ │ │ │ │ ├── Edit.CircleMarker.js
│ │ │ │ │ ├── Edit.Marker.js
│ │ │ │ │ ├── Edit.Poly.js
│ │ │ │ │ ├── Edit.Rectangle.js
│ │ │ │ │ ├── Edit.SimpleShape.js
│ │ │ │ │ ├── EditToolbar.Delete.js
│ │ │ │ │ └── EditToolbar.Edit.js
│ │ │ ├── ext
│ │ │ │ ├── GeometryUtil.js
│ │ │ │ ├── LatLngUtil.js
│ │ │ │ ├── LineUtil.Intersect.js
│ │ │ │ ├── Polygon.Intersect.js
│ │ │ │ ├── Polyline.Intersect.js
│ │ │ │ └── TouchEvents.js
│ │ │ ├── images
│ │ │ │ ├── layers.png
│ │ │ │ ├── marker-icon.png
│ │ │ │ ├── marker-shadow.png
│ │ │ │ └── spritesheet.svg
│ │ │ ├── leaflet-measure.css
│ │ │ ├── leaflet-measure.js
│ │ │ ├── leaflet.css
│ │ │ ├── leaflet.draw.css
│ │ │ ├── leaflet.js
│ │ │ └── shp.esm.js
│ │ │ ├── pdfjs
│ │ │ ├── pdf.js
│ │ │ ├── pdf.js.map
│ │ │ ├── pdf.sandbox.js
│ │ │ ├── pdf.sandbox.js.map
│ │ │ ├── pdf.worker.js
│ │ │ └── pdf.worker.js.map
│ │ │ ├── rxjs
│ │ │ ├── rxjs-ajax.min.js
│ │ │ ├── rxjs-operators.min.js
│ │ │ ├── rxjs-shared.min.js
│ │ │ └── rxjs.min.js
│ │ │ ├── three
│ │ │ ├── FontLoader.js
│ │ │ ├── OrbitControls.js
│ │ │ ├── Projector.js
│ │ │ ├── TextGeometry.js
│ │ │ ├── three.module.js
│ │ │ └── viewcube.js
│ │ │ └── wavesurfer.js
│ ├── locales
│ │ ├── _.json
│ │ ├── az.json
│ │ ├── be.json
│ │ ├── bg.json
│ │ ├── ca.json
│ │ ├── cs.json
│ │ ├── da.json
│ │ ├── de.json
│ │ ├── el.json
│ │ ├── es.json
│ │ ├── et.json
│ │ ├── eu.json
│ │ ├── fi.json
│ │ ├── fr.json
│ │ ├── gl.json
│ │ ├── hr.json
│ │ ├── hu.json
│ │ ├── id.json
│ │ ├── index.js
│ │ ├── is.json
│ │ ├── it.json
│ │ ├── ja.json
│ │ ├── ka.json
│ │ ├── ko.json
│ │ ├── lt.json
│ │ ├── lv.json
│ │ ├── mn.json
│ │ ├── nb.json
│ │ ├── nl.json
│ │ ├── no.json
│ │ ├── pl.json
│ │ ├── pt.json
│ │ ├── ro.json
│ │ ├── ru.json
│ │ ├── script.js
│ │ ├── sk.json
│ │ ├── sl.json
│ │ ├── sr.json
│ │ ├── sv.json
│ │ ├── th.json
│ │ ├── tr.json
│ │ ├── uk.json
│ │ ├── vi.json
│ │ ├── zh.json
│ │ └── zh_tw.json
│ ├── logo
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── app_icon.png
│ │ ├── apple-touch-icon.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ ├── favicon.svg
│ │ ├── mstile-150x150.png
│ │ ├── og-image.png
│ │ └── safari-pinned-tab.svg
│ ├── model
│ │ ├── backend.js
│ │ ├── chromecast.js
│ │ ├── config.d.ts
│ │ ├── config.js
│ │ ├── plugin.js
│ │ └── session.js
│ ├── pages
│ │ ├── adminpage
│ │ │ ├── animate.js
│ │ │ ├── component_box-item.js
│ │ │ ├── ctrl_about.css
│ │ │ ├── ctrl_about.js
│ │ │ ├── ctrl_backend.css
│ │ │ ├── ctrl_backend.js
│ │ │ ├── ctrl_backend_component_authentication.js
│ │ │ ├── ctrl_backend_component_storage.js
│ │ │ ├── ctrl_backend_state.js
│ │ │ ├── ctrl_log.js
│ │ │ ├── ctrl_log_audit.js
│ │ │ ├── ctrl_log_form.js
│ │ │ ├── ctrl_log_viewer.css
│ │ │ ├── ctrl_log_viewer.js
│ │ │ ├── ctrl_login.css
│ │ │ ├── ctrl_login.js
│ │ │ ├── ctrl_settings.js
│ │ │ ├── ctrl_setup.css
│ │ │ ├── ctrl_setup.js
│ │ │ ├── decorator.js
│ │ │ ├── decorator_admin_only.js
│ │ │ ├── decorator_sidemenu.css
│ │ │ ├── decorator_sidemenu.js
│ │ │ ├── helper_form.js
│ │ │ ├── index.css
│ │ │ ├── model_admin_session.js
│ │ │ ├── model_audit.js
│ │ │ ├── model_auth_middleware.js
│ │ │ ├── model_backend.js
│ │ │ ├── model_config.js
│ │ │ ├── model_log.js
│ │ │ ├── model_release.js
│ │ │ └── model_setup.js
│ │ ├── connectpage
│ │ │ ├── ctrl_forkme.js
│ │ │ ├── ctrl_form.css
│ │ │ ├── ctrl_form.js
│ │ │ ├── ctrl_form_state.js
│ │ │ ├── ctrl_poweredby.js
│ │ │ ├── model_backend.js
│ │ │ └── model_config.js
│ │ ├── ctrl_adminpage.js
│ │ ├── ctrl_connectpage.css
│ │ ├── ctrl_connectpage.js
│ │ ├── ctrl_error.js
│ │ ├── ctrl_filespage.css
│ │ ├── ctrl_filespage.js
│ │ ├── ctrl_homepage.js
│ │ ├── ctrl_logout.js
│ │ ├── ctrl_notfound.js
│ │ ├── ctrl_sharepage.css
│ │ ├── ctrl_sharepage.js
│ │ ├── ctrl_viewerpage.css
│ │ ├── ctrl_viewerpage.js
│ │ ├── filespage
│ │ │ ├── cache.js
│ │ │ ├── ctrl_filesystem.css
│ │ │ ├── ctrl_filesystem.js
│ │ │ ├── ctrl_frequentlyaccess.css
│ │ │ ├── ctrl_frequentlyaccess.js
│ │ │ ├── ctrl_newitem.css
│ │ │ ├── ctrl_newitem.js
│ │ │ ├── ctrl_submenu.css
│ │ │ ├── ctrl_submenu.js
│ │ │ ├── ctrl_upload.css
│ │ │ ├── ctrl_upload.d.ts
│ │ │ ├── ctrl_upload.js
│ │ │ ├── helper.js
│ │ │ ├── modal.css
│ │ │ ├── modal_delete.js
│ │ │ ├── modal_rename.js
│ │ │ ├── modal_share.css
│ │ │ ├── modal_share.js
│ │ │ ├── modal_tag.css
│ │ │ ├── modal_tag.js
│ │ │ ├── model_acl.js
│ │ │ ├── model_files.js
│ │ │ ├── model_virtual_layer.js
│ │ │ ├── state_config.js
│ │ │ ├── state_newthing.js
│ │ │ ├── state_selection.js
│ │ │ ├── thing.css
│ │ │ ├── thing.d.ts
│ │ │ └── thing.js
│ │ └── viewerpage
│ │ │ ├── application_3d.css
│ │ │ ├── application_3d.d.ts
│ │ │ ├── application_3d.js
│ │ │ ├── application_3d
│ │ │ ├── init.js
│ │ │ ├── scene_cube.js
│ │ │ ├── scene_light.js
│ │ │ └── toolbar.js
│ │ │ ├── application_audio.css
│ │ │ ├── application_audio.d.ts
│ │ │ ├── application_audio.js
│ │ │ ├── application_downloader.css
│ │ │ ├── application_downloader.js
│ │ │ ├── application_ebook.css
│ │ │ ├── application_ebook.d.ts
│ │ │ ├── application_ebook.js
│ │ │ ├── application_editor.css
│ │ │ ├── application_editor.d.ts
│ │ │ ├── application_editor.js
│ │ │ ├── application_editor
│ │ │ ├── clike.js
│ │ │ ├── clojure.js
│ │ │ ├── cmake.js
│ │ │ ├── commonlisp.js
│ │ │ ├── css.js
│ │ │ ├── diff.js
│ │ │ ├── dockerfile.js
│ │ │ ├── elm.js
│ │ │ ├── emacs-org.js
│ │ │ ├── erlang.js
│ │ │ ├── go.js
│ │ │ ├── groovy.js
│ │ │ ├── htmlmixed.js
│ │ │ ├── java.js
│ │ │ ├── javascript.js
│ │ │ ├── jsx.js
│ │ │ ├── keymap_base.js
│ │ │ ├── keymap_vim.js
│ │ │ ├── lua.js
│ │ │ ├── orgmode.js
│ │ │ ├── perl.js
│ │ │ ├── php.js
│ │ │ ├── properties.js
│ │ │ ├── python.js
│ │ │ ├── r.js
│ │ │ ├── ruby.js
│ │ │ ├── rust.js
│ │ │ ├── sass.js
│ │ │ ├── shell.js
│ │ │ ├── sparql.js
│ │ │ ├── spreadsheet.js
│ │ │ ├── sql.js
│ │ │ ├── stex.js
│ │ │ ├── text.js
│ │ │ ├── xml.js
│ │ │ ├── yaml-frontmatter.js
│ │ │ └── yaml.js
│ │ │ ├── application_editor_orgmode.js
│ │ │ ├── application_form.css
│ │ │ ├── application_form.js
│ │ │ ├── application_iframe.css
│ │ │ ├── application_iframe.js
│ │ │ ├── application_image.css
│ │ │ ├── application_image.d.ts
│ │ │ ├── application_image.js
│ │ │ ├── application_image
│ │ │ ├── information.css
│ │ │ ├── information.js
│ │ │ ├── pagination.css
│ │ │ ├── pagination.js
│ │ │ └── zoom.js
│ │ │ ├── application_map.css
│ │ │ ├── application_map.d.ts
│ │ │ ├── application_map.js
│ │ │ ├── application_pdf.css
│ │ │ ├── application_pdf.d.ts
│ │ │ ├── application_pdf.js
│ │ │ ├── application_skeleton.css
│ │ │ ├── application_skeleton.js
│ │ │ ├── application_table.css
│ │ │ ├── application_table.js
│ │ │ ├── application_url.js
│ │ │ ├── application_video.css
│ │ │ ├── application_video.js
│ │ │ ├── common.js
│ │ │ ├── common_fab.js
│ │ │ ├── common_icon.js
│ │ │ ├── common_player.js
│ │ │ ├── component_menubar.css
│ │ │ ├── component_menubar.js
│ │ │ ├── mimetype.js
│ │ │ └── model_files.js
│ └── sw.js
├── global.d.ts
├── index.backoffice.html
├── index.frontoffice.html
├── package.json
├── tsconfig.json
├── vite.config.js
└── vite.setup.js
├── server
├── .assets
│ └── emacs
│ │ ├── README.md
│ │ ├── htmlize.el
│ │ └── ox-gfm.el
├── common
│ ├── api.go
│ ├── app.go
│ ├── backend.go
│ ├── cache.go
│ ├── config.go
│ ├── config_state.go
│ ├── constants.go
│ ├── crypto.go
│ ├── debug.go
│ ├── default.go
│ ├── dummy.go
│ ├── error.go
│ ├── files.go
│ ├── files_all.go
│ ├── files_linux.go
│ ├── log.go
│ ├── mime.go
│ ├── plugin.go
│ ├── recovery.go
│ ├── response.go
│ ├── ssl
│ │ ├── cert.go
│ │ ├── generate.go
│ │ ├── index.go
│ │ ├── private.go
│ │ └── root.go
│ ├── token.go
│ ├── types.go
│ └── utils.go
├── ctrl
│ ├── admin.go
│ ├── config.go
│ ├── documentation.go
│ ├── export.go
│ ├── files.go
│ ├── plugin.go
│ ├── report.go
│ ├── search.go
│ ├── session.go
│ ├── share.go
│ ├── static.go
│ ├── static
│ │ ├── 404.html
│ │ └── loader.html
│ ├── tmpl.go
│ └── webdav.go
├── generator
│ ├── constants.go
│ ├── emacs-el.go
│ └── mime.go
├── middleware
│ ├── context.go
│ ├── http.go
│ ├── index.go
│ ├── session.go
│ └── telemetry.go
├── model
│ ├── audit.go
│ ├── files.go
│ ├── formater
│ │ ├── README.md
│ │ ├── office.go
│ │ ├── pdf.go
│ │ └── txt.go
│ ├── index.go
│ ├── permissions.go
│ ├── plugin.go
│ ├── share.go
│ └── webdav.go
├── plugin
│ ├── index.go
│ ├── plg_application_3d
│ │ ├── Makefile
│ │ ├── index_fbx.js
│ │ ├── index_gltf.js
│ │ ├── index_mesh.js
│ │ ├── index_obj.js
│ │ ├── index_step.js
│ │ ├── index_stl.js
│ │ ├── index_svg.js
│ │ ├── manifest.json
│ │ └── vendor
│ │ │ ├── FBXLoader.js
│ │ │ ├── GLTFLoader.js
│ │ │ ├── OBJLoader.js
│ │ │ ├── STLLoader.js
│ │ │ ├── SVGLoader.js
│ │ │ ├── curves
│ │ │ ├── NURBSCurve.js
│ │ │ └── NURBSUtils.js
│ │ │ ├── libs
│ │ │ └── fflate.module.js
│ │ │ └── utils
│ │ │ └── BufferGeometryUtils.js
│ ├── plg_application_dev
│ │ ├── Makefile
│ │ ├── index.js
│ │ ├── loader_symbol.c
│ │ └── manifest.json
│ ├── plg_application_map
│ │ ├── Makefile
│ │ ├── constant.js
│ │ ├── index_geojson.js
│ │ ├── index_gpx.js
│ │ ├── index_wms.js
│ │ ├── manifest.json
│ │ └── plugins
│ │ │ └── plugin_grayscale.js
│ ├── plg_authenticate_admin
│ │ └── index.go
│ ├── plg_authenticate_htpasswd
│ │ ├── deps
│ │ │ └── crypt
│ │ │ │ ├── AUTHORS.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── apr1_crypt
│ │ │ │ └── apr1_crypt.go
│ │ │ │ ├── common
│ │ │ │ ├── base64.go
│ │ │ │ ├── doc.go
│ │ │ │ └── salt.go
│ │ │ │ ├── crypt.go
│ │ │ │ ├── md5_crypt
│ │ │ │ └── md5_crypt.go
│ │ │ │ ├── sha256_crypt
│ │ │ │ └── sha256_crypt.go
│ │ │ │ └── sha512_crypt
│ │ │ │ └── sha512_crypt.go
│ │ └── index.go
│ ├── plg_authenticate_ldap
│ │ └── index.go
│ ├── plg_authenticate_local
│ │ ├── auth.go
│ │ ├── data.go
│ │ ├── handler.go
│ │ ├── handler.html
│ │ ├── index.go
│ │ ├── notify.go
│ │ ├── service.go
│ │ └── utils.go
│ ├── plg_authenticate_openid
│ │ └── index.go
│ ├── plg_authenticate_passthrough
│ │ └── index.go
│ ├── plg_authenticate_saml
│ │ └── index.go
│ ├── plg_authorisation_example
│ │ └── index.go
│ ├── plg_backend_artifactory
│ │ └── index.go
│ ├── plg_backend_azure
│ │ └── index.go
│ ├── plg_backend_backblaze
│ │ └── index.go
│ ├── plg_backend_dav
│ │ └── index.go
│ ├── plg_backend_dropbox
│ │ └── index.go
│ ├── plg_backend_ftp
│ │ └── index.go
│ ├── plg_backend_ftp_only
│ │ └── index.go
│ ├── plg_backend_gdrive
│ │ └── index.go
│ ├── plg_backend_git
│ │ └── index.go
│ ├── plg_backend_ldap
│ │ └── index.go
│ ├── plg_backend_local
│ │ └── index.go
│ ├── plg_backend_mysql
│ │ └── index.go
│ ├── plg_backend_nfs
│ │ ├── auth_helper.go
│ │ ├── auth_unix.go
│ │ └── index.go
│ ├── plg_backend_nfs4
│ │ ├── index.go
│ │ └── repo
│ │ │ ├── README.md
│ │ │ ├── internal
│ │ │ ├── cleanuper.go
│ │ │ ├── nfs4.go
│ │ │ ├── nfs4.x
│ │ │ ├── nfsconst.go
│ │ │ ├── rpc.go
│ │ │ ├── rpc.x
│ │ │ └── types.go
│ │ │ └── nfs4
│ │ │ ├── client.go
│ │ │ ├── nfs_err.go
│ │ │ └── supervised_conn.go
│ ├── plg_backend_nop
│ │ └── index.go
│ ├── plg_backend_s3
│ │ └── index.go
│ ├── plg_backend_samba
│ │ └── index.go
│ ├── plg_backend_sftp
│ │ └── index.go
│ ├── plg_backend_storj
│ │ └── index.go
│ ├── plg_backend_tmp
│ │ └── index.go
│ ├── plg_backend_url
│ │ └── index.go
│ ├── plg_backend_webdav
│ │ └── index.go
│ ├── plg_editor_onlyoffice
│ │ └── index.go
│ ├── plg_editor_wopi
│ │ ├── config.go
│ │ ├── handler.go
│ │ └── index.go
│ ├── plg_handler_console
│ │ ├── index.go
│ │ ├── index_linux.go
│ │ └── src
│ │ │ ├── app.css
│ │ │ ├── xterm.css
│ │ │ └── xterm.js
│ ├── plg_handler_mcp
│ │ ├── README.md
│ │ ├── config
│ │ │ └── config.go
│ │ ├── handler.go
│ │ ├── handler_auth.go
│ │ ├── handler_state.go
│ │ ├── impl
│ │ │ ├── completion.go
│ │ │ ├── prompts.go
│ │ │ ├── prompts_fs.go
│ │ │ ├── resources.go
│ │ │ ├── tools.go
│ │ │ └── tools_fs.go
│ │ ├── index.go
│ │ ├── types
│ │ │ ├── mcp_completion.go
│ │ │ ├── mcp_init.go
│ │ │ ├── mcp_notification.go
│ │ │ ├── mcp_prompts.go
│ │ │ ├── mcp_resources.go
│ │ │ ├── mcp_tools.go
│ │ │ ├── resources.go
│ │ │ ├── rpc.go
│ │ │ └── session.go
│ │ └── utils
│ │ │ ├── cors.go
│ │ │ ├── default.go
│ │ │ ├── json.go
│ │ │ ├── mcp.go
│ │ │ └── response.go
│ ├── plg_handler_syncthing
│ │ └── index.go
│ ├── plg_image_ascii
│ │ └── index.go
│ ├── plg_image_bimg
│ │ └── index.go
│ ├── plg_image_c
│ │ ├── image_gif.c
│ │ ├── image_gif.go
│ │ ├── image_gif.h
│ │ ├── image_gif_vendor.h
│ │ ├── image_jpeg.c
│ │ ├── image_jpeg.h
│ │ ├── image_jpeg_freebsd.go
│ │ ├── image_jpeg_linux.go
│ │ ├── image_png.c
│ │ ├── image_png.h
│ │ ├── image_png_freebsd.go
│ │ ├── image_png_linux.go
│ │ ├── image_psd.c
│ │ ├── image_psd.go
│ │ ├── image_psd.h
│ │ ├── image_psd_vendor.h
│ │ ├── image_raw.c
│ │ ├── image_raw.h
│ │ ├── image_raw_freebsd.go
│ │ ├── image_raw_linux.go
│ │ ├── image_webp.c
│ │ ├── image_webp.go
│ │ ├── image_webp.h
│ │ ├── index.go
│ │ └── utils.h
│ ├── plg_image_golang
│ │ └── index.go
│ ├── plg_image_light
│ │ ├── deps
│ │ │ ├── README.md
│ │ │ ├── create_libresize.sh
│ │ │ ├── create_libtranscode.sh
│ │ │ └── src
│ │ │ │ ├── libresize.c
│ │ │ │ ├── libresize.h
│ │ │ │ ├── libresize_test.c
│ │ │ │ ├── libtranscode.c
│ │ │ │ ├── libtranscode.h
│ │ │ │ └── libtranscode_test.c
│ │ ├── index.go
│ │ ├── install.sh
│ │ ├── lib_resize.go
│ │ ├── lib_resize_linux_amd64.go
│ │ ├── lib_resize_linux_arm.go
│ │ ├── lib_transcode.go
│ │ ├── lib_transcode_linux_amd64.go
│ │ └── lib_transcode_linux_arm.go
│ ├── plg_image_transcode
│ │ ├── index.go
│ │ ├── transcode_bmp.go
│ │ ├── transcode_dicom.go
│ │ ├── transcode_svg.go
│ │ └── transcode_tiff.go
│ ├── plg_override_actiondelete
│ │ ├── assets
│ │ │ └── pages
│ │ │ │ └── filespage
│ │ │ │ └── thing.js
│ │ └── index.go
│ ├── plg_override_download
│ │ ├── README.md
│ │ ├── assets
│ │ │ └── pages
│ │ │ │ └── filespage
│ │ │ │ └── thing.js
│ │ └── index.go
│ ├── plg_search_example
│ │ └── index.go
│ ├── plg_search_sqlitefts
│ │ ├── converter
│ │ │ └── index.go
│ │ ├── crawler
│ │ │ ├── configuration.go
│ │ │ ├── daemon.go
│ │ │ ├── daemon_state.go
│ │ │ ├── events.go
│ │ │ ├── phase.go
│ │ │ ├── phase_explore.go
│ │ │ ├── phase_indexing.go
│ │ │ ├── phase_maintain.go
│ │ │ ├── phase_utils.go
│ │ │ └── types.go
│ │ ├── index.go
│ │ ├── indexer
│ │ │ ├── error.go
│ │ │ ├── index.go
│ │ │ └── query.go
│ │ └── query.go
│ ├── plg_search_stateless
│ │ ├── config.go
│ │ ├── index.go
│ │ └── scoring.go
│ ├── plg_security_scanner
│ │ └── index.go
│ ├── plg_security_svg
│ │ └── index.go
│ ├── plg_starter_http
│ │ └── index.go
│ ├── plg_starter_http2
│ │ └── index.go
│ ├── plg_starter_https
│ │ └── index.go
│ ├── plg_starter_tor
│ │ └── index.go
│ ├── plg_video_thumbnail
│ │ └── index.go
│ └── plg_video_transcoder
│ │ └── index.go
└── routes.go
└── webpack.config.js
/.assets/img/customisation_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/img/customisation_1.png
--------------------------------------------------------------------------------
/.assets/img/orgmode.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/img/orgmode.gif
--------------------------------------------------------------------------------
/.assets/raw/Makefile:
--------------------------------------------------------------------------------
1 | all:
2 | convert -delay 100 -loop 0 navigation_*.png navigation.gif
3 | convert -delay 100 -loop 0 orgmode_*.png orgmode.gif
4 | convert -delay 100 -loop 0 photo_management_*.png photo_management.gif
5 |
--------------------------------------------------------------------------------
/.assets/raw/navigation_00001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00001.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00002.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00003.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00004.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00005.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00006.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00006.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00007.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00007.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00008.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00008.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00009.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00010.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00011.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00011.png
--------------------------------------------------------------------------------
/.assets/raw/navigation_00012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/navigation_00012.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00001.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00002.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00003.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00004.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00005.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00006.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00006.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00007.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00007.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00008.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00008.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00009.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00010.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00011.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00011.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00012.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00013.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00013.png
--------------------------------------------------------------------------------
/.assets/raw/orgmode_00014.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/orgmode_00014.png
--------------------------------------------------------------------------------
/.assets/raw/photo.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo.xcf
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0001.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0002.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0003.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0004.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0005.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0006.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0006.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0007.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0007.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0008.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0008.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0009.png
--------------------------------------------------------------------------------
/.assets/raw/photo_management_0010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/.assets/raw/photo_management_0010.png
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["react", "es2015", "stage-2"],
3 | "plugins": ["transform-decorators-legacy", "syntax-dynamic-import"]
4 | }
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 | [*]
4 | indent_style = space
5 | indent_size = 4
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.go]
12 | indent_size = 4
13 | indent_style = tab
14 |
15 | [Makefile]
16 | indent_style = tab
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | open_collective: filestash
4 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug
3 | about: Report a bug
4 | title: "[bug] "
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | # Description of the bug
11 |
12 |
13 |
14 | # Step by step instructions to reproduce the bug
15 |
16 |
17 |
18 | # Can you replicate that error from the demo?
19 |
20 |
24 |
25 | # Observed behavior
26 |
27 |
28 |
29 | # Expected behavior
30 |
31 |
32 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature Request
3 | about: Request for a new feature
4 | title: "[Feature Request] "
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/support.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Support
3 | about: Technical support is only available on IRC
4 | title: "[support] DO NOT CREATE A SUPPORT TICKET FROM GITHUB"
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | Please, don't create tickets on github for support. Instead, you can either:
11 | - visit the community support on libera.chat #filestash. A searchable archive is available at https://support.filestash.app If you don't already have an IRC client, you can try this link: https://kiwiirc.com/nextclient/#irc://irc.libera.chat/#filestash?nick=guest??
12 | - register for enterprise support at https://www.filestash.app/pricing/#support
13 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Issues with these labels will never be considered stale
6 | exemptLabels:
7 | - pinned
8 | - security
9 | # Label to use when marking an issue as stale
10 | staleLabel: wontfix
11 | # Comment to post when marking an issue as stale. Set to `false` to disable
12 | markComment: >
13 | This issue has been automatically marked as stale because it has not had
14 | recent activity. It will be closed if no further activity occurs. Thank you
15 | for your contributions.
16 | # Comment to post when closing a stale issue. Set to `false` to disable
17 | closeComment: false
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .sass-cache
3 | dist/
4 | *_generated.go
5 | test/
6 | *.a
7 | *.o
8 | *.bin
9 | .DS_Store
10 | package-lock.json
11 | \#*\#
12 | .\#*
13 | *.log
14 | *~
15 | *.swp
16 | *.swo
17 | .tern-port
18 | .tern-project.js
19 | *_test.go
20 | cover.*
21 | www
22 | .gitignore
23 |
24 |
25 | # frontend
26 | public/**/*.test.js
27 | public/**/__snapshots__
28 | public/jest.setup.js
29 | public/package.json
30 | public/README.org
31 |
32 | filestash-enterprise
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | all:
2 | make build_init
3 | make build_frontend
4 | make build_backend
5 |
6 | build_init:
7 | go get ./...
8 | go generate -x ./server/...
9 |
10 | build_frontend:
11 | make build_frontend_old
12 | cd public && make compress
13 |
14 | build_frontend_old:
15 | NODE_ENV=production npm run build
16 | mkdir -p ./server/ctrl/static/www/canary/
17 | cp -R ./public/assets ./server/ctrl/static/www/canary/
18 | cp -R ./public/*.html ./server/ctrl/static/www/canary/
19 |
20 | build_backend:
21 | CGO_ENABLED=1 go build --tags "fts5" -o dist/filestash cmd/main.go
22 |
23 | build_backend_arm64:
24 | CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnueabihf-gcc go build -o dist/filestash cmd/main.go
25 |
26 | build_backend_amd64:
27 | GOOS=linux CGO_ENABLED=1 GOARCH=amd64 CC=gcc go build -o dist/filestash cmd/main.go
28 |
29 | clean_frontend:
30 | rm -rf server/ctrl/static/www/
31 |
--------------------------------------------------------------------------------
/client/assets/css/videojs-custom.css:
--------------------------------------------------------------------------------
1 | .video-js{outline: none;}
2 |
3 | .video-js .vjs-big-play-button:before, .video-js .vjs-control:before, .video-js .vjs-modal-dialog, .vjs-modal-dialog .vjs-modal-dialog-content {
4 | position: absolute;
5 | top: 0;
6 | left: 0;
7 | width: 100%;
8 | height: 100%; }
9 |
10 | .video-js .vjs-big-play-button:before, .video-js .vjs-control:before {
11 | text-align: center; }
12 |
--------------------------------------------------------------------------------
/client/assets/fonts/SourceCodePro-Regular-400-latin-ext.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/fonts/SourceCodePro-Regular-400-latin-ext.woff2
--------------------------------------------------------------------------------
/client/assets/fonts/SourceCodePro-Regular-400-latin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/fonts/SourceCodePro-Regular-400-latin.woff2
--------------------------------------------------------------------------------
/client/assets/fonts/SourceCodePro-Semibold-600-latin-ext.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/fonts/SourceCodePro-Semibold-600-latin-ext.woff2
--------------------------------------------------------------------------------
/client/assets/fonts/SourceCodePro-Semibold-600-latin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/fonts/SourceCodePro-Semibold-600-latin.woff2
--------------------------------------------------------------------------------
/client/assets/icons/edit.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/icons/music.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/icons/music.png
--------------------------------------------------------------------------------
/client/assets/icons/photo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/icons/photo.png
--------------------------------------------------------------------------------
/client/assets/icons/placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/icons/placeholder.png
--------------------------------------------------------------------------------
/client/assets/icons/share.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/client/assets/icons/video.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/icons/video.png
--------------------------------------------------------------------------------
/client/assets/img/arrow_bottom.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/arrow_left.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/arrow_left_white.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/arrow_right.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/arrow_right_white.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/arrow_top.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/bucket.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/calendar.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/calendar_white.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/camera.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/check.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/close.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/close_dark.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/copy.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/deadline.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/download.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/download_white.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/dropbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/img/dropbox.png
--------------------------------------------------------------------------------
/client/assets/img/error.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/eye.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/client/assets/img/google-drive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/img/google-drive.png
--------------------------------------------------------------------------------
/client/assets/img/grid.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/client/assets/img/info.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/client/assets/img/loader.svg:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/client/assets/img/loader_white.svg:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/client/assets/img/location.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/more.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/pause.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/play.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/power.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/refresh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/assets/img/schedule.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/search_dark.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/sort.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/client/assets/img/stop.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/assets/img/upload_white.svg:
--------------------------------------------------------------------------------
1 |
2 |
6 |
--------------------------------------------------------------------------------
/client/assets/img/volume.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/client/assets/img/volume_low.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/img/volume_mute.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/client/assets/logo/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/android-chrome-192x192.png
--------------------------------------------------------------------------------
/client/assets/logo/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/android-chrome-512x512.png
--------------------------------------------------------------------------------
/client/assets/logo/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/app_icon.png
--------------------------------------------------------------------------------
/client/assets/logo/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/apple-touch-icon.png
--------------------------------------------------------------------------------
/client/assets/logo/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/favicon-16x16.png
--------------------------------------------------------------------------------
/client/assets/logo/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/favicon-32x32.png
--------------------------------------------------------------------------------
/client/assets/logo/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/favicon.ico
--------------------------------------------------------------------------------
/client/assets/logo/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/mstile-150x150.png
--------------------------------------------------------------------------------
/client/assets/logo/og-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/assets/logo/og-image.png
--------------------------------------------------------------------------------
/client/components/alert.scss:
--------------------------------------------------------------------------------
1 | .alert {
2 | background: var(--bg-color);
3 | border-radius: 5px;
4 | padding: 20px;
5 | margin-top: 20px;
6 | margin-bottom: 20px;
7 | border: 1px solid rgba(0,0,0,0.05);
8 |
9 | ol, ul {
10 | margin: 5px 0;
11 | padding: 0 20px;
12 | }
13 |
14 | &.success{
15 | background: var(--success);
16 | }
17 | &.error{
18 | background: var(--error);
19 | color: var(--bg-color);
20 | }
21 |
22 | img{
23 | max-width: 100%;
24 | border-radius: 5px;
25 | border: 10px solid white;
26 | box-sizing: border-box;
27 | margin-top: 5px;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/client/components/button.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | import "./button.scss";
4 |
5 | export function Button({ theme = "", children = null, className = "", ...props }) {
6 | return (
7 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/client/components/button.scss:
--------------------------------------------------------------------------------
1 | button{
2 | border: none;
3 | margin: 0;
4 | padding: 6px;
5 | width: 100%;
6 | display: inline-block;
7 | outline: none;
8 | cursor: pointer;
9 | font-size: inherit;
10 | border-radius: 2px;
11 | color: inherit;
12 | background: inherit;
13 |
14 | &.primary{
15 | background: var(--primary);
16 | color: white;
17 | }
18 | &.emphasis{
19 | background: var(--emphasis);
20 | color: white;
21 | }
22 | &.dark{
23 | background: var(--dark);
24 | color: white;
25 | }
26 | }
27 |
28 | .touch-no button {
29 | &.dark:hover, &.emphasis:hover, &.primary:hover {
30 | filter: brightness(95%);
31 | transition: 0.2s ease all;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/client/components/card.scss:
--------------------------------------------------------------------------------
1 | .box{
2 | padding: 10px;
3 | cursor: pointer;
4 | margin: 3px 0;
5 | overflow: hidden;
6 | position: relative;
7 | }
8 |
--------------------------------------------------------------------------------
/client/components/container.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./container.scss";
3 |
4 | export class Container extends React.Component {
5 | constructor(props) {
6 | super(props);
7 | }
8 | render() {
9 | const style = this.props.maxWidth ? { maxWidth: this.props.maxWidth } : {};
10 | let className = "component_container";
11 | if (this.props.className) className += " " + this.props.className;
12 | return (
13 |
14 | {this.props.children}
15 |
16 | );
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/client/components/container.scss:
--------------------------------------------------------------------------------
1 | .component_container{
2 | width: 95%;
3 | max-width: 800px;
4 | margin: 0 auto;
5 | padding: 10px;
6 | }
7 |
--------------------------------------------------------------------------------
/client/components/fab.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./fab.scss";
3 |
4 | export function Fab(props) {
5 | return (
6 |
7 |
8 | {props.children}
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/client/components/fab.scss:
--------------------------------------------------------------------------------
1 | .component_fab{
2 | position: fixed;
3 | bottom: 20px;
4 | right: 20px;
5 | z-index: 2;
6 | .content{
7 | height: 25px;
8 | width: 25px;
9 | padding: 13px;
10 | border-radius: 50%;
11 | background: var(--color);
12 | box-shadow: rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px, rgba(0, 0, 0, 0.2) 0px 2px 4px -1px;
13 | z-index: 1000;
14 | cursor: pointer;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/client/components/icon.scss:
--------------------------------------------------------------------------------
1 | .component_icon{
2 | vertical-align: bottom;
3 | max-height: 100%;
4 | }
5 |
--------------------------------------------------------------------------------
/client/components/loader.scss:
--------------------------------------------------------------------------------
1 | .component_loader{
2 | text-align: center;
3 | margin: 50px auto 0 auto;
4 | }
5 |
--------------------------------------------------------------------------------
/client/components/popup.scss:
--------------------------------------------------------------------------------
1 | .component_popup{
2 | .popup--content{
3 | font-size: 1.1em;
4 | margin: 0;
5 | p {margin: 0;}
6 | .modal-error-message{font-size: 15px;}
7 | }
8 | .buttons{
9 | margin: 15px -20px 0 -20px;
10 | display: flex;
11 |
12 | > div {
13 | display: flex;
14 | width: 100%;
15 | }
16 | [type="submit"]{
17 | border-radius: 10px 0 0;
18 | }
19 | > button{
20 | width: 50%;
21 | margin-left: auto;
22 | }
23 | button{
24 | text-transform: uppercase;
25 | }
26 | }
27 | .modal-error-message{
28 | color: var(--error);
29 | }
30 | .center{text-align: center;}
31 | }
32 |
--------------------------------------------------------------------------------
/client/components/textarea.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/client/components/textarea.woff
--------------------------------------------------------------------------------
/client/components/video.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Icon } from "./";
3 | import "./video.scss";
4 |
5 | export class Video extends React.Component {
6 | constructor(props) {
7 | super(props);
8 | }
9 |
10 | render() {
11 | return (
12 |
17 | );
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/client/components/video.scss:
--------------------------------------------------------------------------------
1 | .component_video{
2 | position: fixed;
3 | bottom: 10px;
4 | right: 10px;
5 | width: 300px;
6 | height: 200px;
7 | background: var(--super-light);
8 | border: 1px solid #e2e2e2;
9 | border-radius: 2px;
10 |
11 | .loader{
12 | text-align: center;
13 | margin-top: 30px;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/client/helpers/bcrypt.js:
--------------------------------------------------------------------------------
1 | import bcrypt from "bcryptjs";
2 |
3 | const ROUND = 5;
4 |
5 | export function bcrypt_password(password) {
6 | return new Promise((done, error) => {
7 | bcrypt.hash(password, ROUND, (err, hash) => {
8 | if (err) return error(err);
9 | done(hash);
10 | });
11 | });
12 | }
13 |
--------------------------------------------------------------------------------
/client/helpers/cache_state.js:
--------------------------------------------------------------------------------
1 | import { Session } from "../model";
2 |
3 | let backendID = null;
4 |
5 | export function currentShare() {
6 | return findParams("share");
7 | }
8 |
9 | export function currentBackend() {
10 | return backendID || "";
11 | }
12 |
13 | export function findParams(p) {
14 | return new window.URL(location.href).searchParams.get(p) || "";
15 | }
16 |
17 | export function setup_cache_state(_backendID = null) {
18 | if (_backendID !== null) {
19 | backendID = _backendID;
20 | return;
21 | }
22 | return Session.currentUser().then((r) => {
23 | backendID = r["backendID"]
24 | }).catch(() => backendID = null);
25 | }
26 |
--------------------------------------------------------------------------------
/client/helpers/crypto.js:
--------------------------------------------------------------------------------
1 | import Aesjs from "aes-js";
2 |
3 | export function encrypt(obj, key) {
4 | const textBytes = Aesjs.utils.utf8.toBytes(JSON.stringify(obj));
5 | const keyBytes = Aesjs.padding.pkcs7.pad(Aesjs.utils.utf8.toBytes(key));
6 | return Aesjs.utils.hex.fromBytes(
7 | new Aesjs.ModeOfOperation.ctr(keyBytes, new Aesjs.Counter(5)).encrypt(textBytes),
8 | );
9 | }
10 |
11 | export function decrypt(text, key) {
12 | const textBytes = Aesjs.utils.hex.toBytes(text);
13 | const keyBytes = Aesjs.padding.pkcs7.pad(Aesjs.utils.utf8.toBytes(key));
14 | return JSON.parse(Aesjs.utils.utf8.fromBytes(
15 | new Aesjs.ModeOfOperation.ctr(keyBytes, new Aesjs.Counter(5)).decrypt(textBytes),
16 | ));
17 | }
18 |
--------------------------------------------------------------------------------
/client/helpers/events.js:
--------------------------------------------------------------------------------
1 | function Event() {
2 | this.fns = [];
3 | }
4 | Event.prototype.subscribe = function(name, fn) {
5 | if (!name || typeof fn !== "function") return;
6 | this.fns.push({ key: name, fn: fn });
7 | };
8 | Event.prototype.unsubscribe = function(name) {
9 | this.fns = this.fns.filter((data) => {
10 | return data.key === name ? false : true;
11 | });
12 | };
13 | Event.prototype.emit = function(name, payload) {
14 | this.fns.map((data) => {
15 | if (data.key === name) data.fn(payload);
16 | });
17 | };
18 |
19 | export const event = new Event();
20 |
--------------------------------------------------------------------------------
/client/helpers/format.js:
--------------------------------------------------------------------------------
1 | export function formatTimecode(seconds) {
2 | return String(parseInt(seconds / 60)).padStart(2, "0") +
3 | ":"+
4 | String(parseInt(seconds % 60)).padStart(2, "0");
5 | }
6 |
--------------------------------------------------------------------------------
/client/helpers/memory.js:
--------------------------------------------------------------------------------
1 | function Memory() {
2 | const data = {};
3 |
4 | return {
5 | get: function(key) {
6 | if (data[key] === undefined) return null;
7 | return data[key];
8 | },
9 | set: function(key, value) {
10 | data[key] = value;
11 | },
12 | all: function() {
13 | return data;
14 | },
15 | };
16 | }
17 |
18 |
19 | export const memory = new Memory();
20 |
--------------------------------------------------------------------------------
/client/helpers/notify.js:
--------------------------------------------------------------------------------
1 | const Message = function() {
2 | let fn = null;
3 |
4 | return {
5 | send: function(text, type) {
6 | if (["info", "success", "error"].indexOf(type) === -1) {
7 | type = "info";
8 | }
9 | if (!fn) {
10 | return window.setTimeout(() => this.send(text, type), 50);
11 | }
12 | fn(text, type);
13 | return Promise.resolve();
14 | },
15 | subscribe: function(_fn) {
16 | fn = _fn;
17 | },
18 | };
19 | };
20 |
21 | export const notify = new Message();
22 |
--------------------------------------------------------------------------------
/client/helpers/random.js:
--------------------------------------------------------------------------------
1 | export function gid(prefix) {
2 | let id = prefix !== undefined ? prefix : "";
3 | id += new Date().getTime().toString(32);
4 | id += parseInt(Math.random()*Math.pow(10, 16)).toString(32);
5 | return id;
6 | }
7 |
8 | const alphabet = [
9 | "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
10 | "q", "r", "s", "t", "u", "v", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
11 | "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
12 | "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
13 | ];
14 | const alphabet_size = alphabet.length;
15 |
16 | export function randomString(size = 16) {
17 | let str = "";
18 | for (let i=0; i {
17 | window.localStorage.setItem("settings", JSON.stringify(d));
18 | }, 500);
19 | }
20 |
--------------------------------------------------------------------------------
/client/helpers/upload.js:
--------------------------------------------------------------------------------
1 | const Upload = function() {
2 | let fn = null;
3 |
4 | return {
5 | add: function(path, files) {
6 | if (!fn) {
7 | return window.setTimeout(() => this.add(path, files), 50);
8 | }
9 | fn(path, files);
10 | return Promise.resolve();
11 | },
12 | subscribe: function(_fn) {
13 | fn = _fn;
14 | },
15 | };
16 | };
17 |
18 | export const upload = new Upload();
19 |
--------------------------------------------------------------------------------
/client/locales/index.js:
--------------------------------------------------------------------------------
1 | export function t(str = "", replacementString, requestedKey) {
2 | const calculatedKey = str.toUpperCase()
3 | .replace(/ /g, "_")
4 | .replace(/[^a-zA-Z0-9\-\_\*\{\}\?]/g, "")
5 | .replace(/\_+$/, "");
6 | const value = requestedKey === undefined ?
7 | window.LNG && window.LNG[calculatedKey] :
8 | window.LNG && window.LNG[requestedKey];
9 | return reformat(
10 | value || str || "",
11 | str,
12 | ).replace("{{VALUE}}", replacementString);
13 | }
14 |
15 | function reformat(translated, initial) {
16 | if (initial[0] && initial[0].toLowerCase() === initial[0]) {
17 | return translated || "";
18 | }
19 | return (translated[0] && translated[0].toUpperCase() + translated.substring(1)) || "";
20 | }
21 |
22 | export default t;
23 |
--------------------------------------------------------------------------------
/client/model/admin.js:
--------------------------------------------------------------------------------
1 | import { http_post, http_get } from "../helpers";
2 |
3 | export const Admin = {
4 | login: function(password = "") {
5 | return http_post("/admin/api/session", { password: password });
6 | },
7 | isAdmin: function() {
8 | return http_get("/admin/api/session").then((res) => res.result);
9 | },
10 | };
11 |
--------------------------------------------------------------------------------
/client/model/audit.js:
--------------------------------------------------------------------------------
1 | import { http_get } from "../helpers/";
2 |
3 | class AuditManager {
4 | get(searchParams, abort) {
5 | const p = new URLSearchParams();
6 | Object.keys(searchParams).map((key) => {
7 | p.set(key, searchParams[key]);
8 | });
9 | const res = http_get("/admin/api/audit?" + p.toString(), "json", { abort })
10 | .then((res) => [res.result.form, res.result.render]);
11 | return res;
12 | }
13 | }
14 |
15 | export const Audit = new AuditManager();
16 |
--------------------------------------------------------------------------------
/client/model/index.js:
--------------------------------------------------------------------------------
1 | export { Files } from "./files";
2 | export { Session } from "./session";
3 | export { Share } from "./share";
4 | export { Config, Backend, Middleware } from "./config";
5 | export { Log } from "./log";
6 | export { Admin } from "./admin";
7 | export { Audit } from "./audit";
8 | export { Tags } from "./tags";
9 | export { Chromecast } from "./chromecast";
10 |
--------------------------------------------------------------------------------
/client/pages/adminpage/about.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import { Redirect } from "react-router-dom";
3 | import { Loader } from "../../components/";
4 |
5 | import "./about.scss";
6 |
7 | export function AboutPage() {
8 | useEffect(() => {
9 | const controller = new AbortController();
10 | fetch("/about", { signal: controller.signal })
11 | .then((r) => r.text())
12 | .then((r) => {
13 | const a = document.createElement("html")
14 | a.innerHTML = r;
15 | document.getElementById("about-page").innerHTML = a.querySelector("table").outerHTML;
16 | });
17 | return () => controller.abort();
18 | }, [])
19 |
20 | return (
21 |
22 |
23 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/client/pages/adminpage/about.scss:
--------------------------------------------------------------------------------
1 | #about-page {
2 | padding-top: 50px;
3 | overflow-x: auto;
4 | table td {
5 | min-width: 100px;
6 | padding: 10px 0;
7 | }
8 | .small { font-size: 0.9rem; }
9 | }
10 |
--------------------------------------------------------------------------------
/client/pages/adminpage/home.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Redirect } from "react-router-dom";
3 |
4 | export function HomePage() {
5 | return ( );
6 | }
7 |
--------------------------------------------------------------------------------
/client/pages/adminpage/index.js:
--------------------------------------------------------------------------------
1 | export { HomePage } from "./home";
2 | export { BackendPage } from "./backend";
3 | export { SettingsPage } from "./settings";
4 | export { AboutPage } from "./about";
5 | export { LogPage } from "./logger";
6 |
7 | export { SetupPage } from "./setup";
8 | export { LoginPage } from "./loginpage";
9 |
--------------------------------------------------------------------------------
/client/pages/adminpage/logger.scss:
--------------------------------------------------------------------------------
1 | .component_logpage{
2 | button{
3 | width: inherit;
4 | float: right;
5 | margin-top: 5px;
6 | padding-left: 20px;
7 | padding-right: 20px;
8 | }
9 | }
10 |
11 | .component_audit {
12 | table {
13 | width: 100%;
14 | text-align: left;
15 | border-collapse: collapse;
16 |
17 | th, td {
18 | border-bottom: 2px solid rgba(0, 0, 0, 0.05);
19 | padding: 10px 0 10px 10px;
20 | }
21 | th { opacity: 0.6; }
22 |
23 | tbody { font-size: 0.95rem; }
24 | thead { text-transform: capitalize; }
25 | }
26 |
27 | .component_icon { height: 50px; margin-top: 20px; }
28 |
29 | .flex {
30 | display: flex;
31 | justify-content: space-between;
32 | .alert { margin: 5px 0 15px 0; }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/client/pages/connectpage/index.js:
--------------------------------------------------------------------------------
1 | export { ForkMe, PoweredByFilestash } from "./forkme";
2 | export { Form } from "./form";
3 |
--------------------------------------------------------------------------------
/client/pages/error.scss:
--------------------------------------------------------------------------------
1 | .error-page{
2 | width: 80%;
3 | max-width: 600px;
4 | margin: 50px auto 0 auto;
5 | flex-direction: column;
6 |
7 | h1{margin: 5px 0; font-size: 3.1em;}
8 | h2{margin: 10px 0; font-weight: normal; opacity: 0.9; font-weight: 100; cursor:pointer;}
9 | code{margin-top: 20px; display: block; background:rgba(255,255,255,0.3);padding: 10px; border: 2px dashed rgba(0,0,0,0.1);}
10 | p{font-style: italic;}
11 | a{border-bottom: 1px dashed;}
12 | }
13 |
14 | .backnav {
15 | font-weight: 100;
16 | .component_icon {
17 | height: 23px;
18 | margin-right: -3px;
19 | vertical-align: middle;
20 | }
21 | display: inline-block;
22 | padding: 10px 5px;
23 | }
24 |
25 | .dark-mode {
26 | .error-page, .backnav {
27 | color: rgba(255,255,255,0.8);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/client/pages/filespage/index.js:
--------------------------------------------------------------------------------
1 | export { FileSystem } from "./filesystem";
2 | export { Submenu } from "./submenu";
3 | export { BreadCrumbTargettable as BreadCrumb } from "./breadcrumb";
4 | export { FrequentlyAccess } from "./frequently_access";
5 | export { Sidebar } from "./sidebar";
6 |
--------------------------------------------------------------------------------
/client/pages/index.js:
--------------------------------------------------------------------------------
1 | export { HomePage } from "./homepage";
2 | export { SharePage } from "./sharepage";
3 | export { ConnectPage } from "./connectpage";
4 | export { LogoutPage } from "./logout";
5 | export { NotFoundPage } from "./notfoundpage";
6 | export { FilesPage } from "./filespage";
7 | export { ViewerPage } from "./viewerpage";
8 | export { TagsPage } from "./tagspage";
9 |
--------------------------------------------------------------------------------
/client/pages/logout.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from "react";
2 |
3 | import { Session } from "../model/";
4 | import { Loader, ErrorPage } from "../components/";
5 | import { cache } from "../helpers/";
6 |
7 | function LogoutPageComponent({ error, history }) {
8 | useEffect(() => {
9 | Session.logout().then((res) => {
10 | cache.destroy();
11 | delete window.BEARER_TOKEN;
12 | window.CONFIG["logout"] ?
13 | location.href = CONFIG["logout"] :
14 | history.push("/");
15 | }).catch((err) => error(err));
16 | }, []);
17 |
18 | return (
19 |
20 | );
21 | }
22 |
23 | export const LogoutPage = ErrorPage(LogoutPageComponent);
24 |
--------------------------------------------------------------------------------
/client/pages/sharepage.scss:
--------------------------------------------------------------------------------
1 | @import "../assets/css/mixin.scss";
2 |
3 | .sharepage_component {
4 | @include inlinedInputWithSubmit();
5 | .error{
6 | animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both;
7 | transform: translate3d(0, 0, 0);
8 | backface-visibility: hidden;
9 | perspective: 1000px;
10 | }
11 | animation: 0.2s ease-out 0s 1 enterZoomIn;
12 | }
13 |
14 |
15 | @keyframes enterZoomIn {
16 | 0% {
17 | transform: scale(1.1)
18 | }
19 | 100% {
20 | transform: scale(1);
21 | }
22 | }
23 |
24 | @keyframes shake {
25 | 10%, 90% {
26 | transform: translate3d(-1px, 0, 0);
27 | }
28 |
29 | 20%, 80% {
30 | transform: translate3d(2px, 0, 0);
31 | }
32 |
33 | 30%, 50%, 70% {
34 | transform: translate3d(-4px, 0, 0);
35 | }
36 |
37 | 40%, 60% {
38 | transform: translate3d(4px, 0, 0);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/appframe.scss:
--------------------------------------------------------------------------------
1 | body:not(.dark-mode) .component_appframe {
2 | background: #525659;
3 | }
4 |
5 | .component_appframe {
6 | text-align: center;
7 | width: 100%;
8 |
9 | iframe {
10 | width: 100%;
11 | height: 100%;
12 | border: none;
13 | }
14 | .error {
15 | color: white;
16 | font-size: 17px;
17 | margin-top: 10px;
18 | font-family: monospace;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/ebookviewer.scss:
--------------------------------------------------------------------------------
1 | .component_ebookviewer{
2 | display: flex;
3 | flex-direction: column;
4 | flex: 1;
5 | width: 100%;
6 | flex-grow: 1;
7 |
8 | .ebookviewer_container{
9 | display: flex;
10 | flex-grow: 1;
11 | min-height: 0;
12 | .epub-container {
13 | background: var(--super-light);
14 | padding-top: 50px;
15 | padding-bottom: 50px;
16 | box-sizing: border-box;
17 | overflow-x: hidden!important;
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/clike.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/clike/clike";
2 | CodeMirror.__mode = "clike";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/clojure.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/clojure/clojure";
2 | CodeMirror.__mode = "clojure";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/cmake.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/cmake/cmake";
2 | CodeMirror.__mode = "cmake";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/commonlisp.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/commonlisp/commonlisp";
2 | CodeMirror.__mode = "commonlisp";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/css.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/css/css";
2 | CodeMirror.__mode = "css";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/diff.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/diff/diff";
2 | CodeMirror.__mode = "diff";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/dockerfile.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/dockerfile/dockerfile";
2 | CodeMirror.__mode = "dockerfile";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/elm.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/elm/elm";
2 | CodeMirror.__mode = "elm";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/erlang.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/erlang/erlang";
2 | CodeMirror.__mode = "erlang";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/go.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/go/go";
2 | CodeMirror.__mode = "go";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/htmlmixed.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/htmlmixed/htmlmixed";
2 | CodeMirror.__mode = "htmlmixed";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/javascript.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/javascript/javascript";
2 | CodeMirror.__mode = "javascript";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/jsx.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/jsx/jsx";
2 | CodeMirror.__mode = "jsx";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/keymap_base.js:
--------------------------------------------------------------------------------
1 | import "codemirror/keymap/sublime.js";
2 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/keymap_vim.js:
--------------------------------------------------------------------------------
1 | import "codemirror/keymap/vim.js";
2 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/lua.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/lua/lua";
2 | CodeMirror.__mode = "lua";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/perl.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/perl/perl";
2 | CodeMirror.__mode = "perl";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/php.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/php/php";
2 | CodeMirror.__mode = "php";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/properties.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/properties/properties";
2 | CodeMirror.__mode = "properties";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/python.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/python/python";
2 | CodeMirror.__mode = "python";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/r.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/r/r";
2 | CodeMirror.__mode = "r";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/ruby.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/ruby/ruby";
2 | CodeMirror.__mode = "ruby";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/rust.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/rust/rust";
2 | CodeMirror.__mode = "rust";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/sass.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/sass/sass";
2 | CodeMirror.__mode = "sass";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/shell.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/shell/shell";
2 | CodeMirror.__mode = "shell";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/sparql.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/sparql/sparql";
2 | CodeMirror.__mode = "sparql";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/spreadsheet.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/spreadsheet/spreadsheet";
2 | CodeMirror.__mode = "spreadsheet";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/sql.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/sql/sql";
2 | CodeMirror.__mode = "sql";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/stex.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/stex/stex";
2 | CodeMirror.__mode = "stex";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/text.js:
--------------------------------------------------------------------------------
1 | export default CodeMirror;
2 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/xml.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/xml/xml";
2 | CodeMirror.__mode = "xml";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/yaml-frontmatter.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/gfm/gfm";
2 | import "codemirror/mode/yaml-frontmatter/yaml-frontmatter";
3 | CodeMirror.__mode = "yaml-frontmatter";
4 | export default CodeMirror;
5 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/editor/yaml.js:
--------------------------------------------------------------------------------
1 | import "codemirror/mode/yaml/yaml";
2 | CodeMirror.__mode = "yaml";
3 | export default CodeMirror;
4 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/index.js:
--------------------------------------------------------------------------------
1 | export { FileDownloader } from "./filedownloader";
2 | export { ImageViewer } from "./imageviewer";
3 | export { PDFViewer } from "./pdfviewer";
4 | export { FormViewer } from "./formviewer";
5 | // Those are commented because they will be delivered as a separate chunk
6 | // export { VideoPlayer } from "./videoplayer";
7 | // export { IDE } from "./ide";
8 | // export { AudioPlayer } from "./audioplayer";
9 |
--------------------------------------------------------------------------------
/client/pages/viewerpage/pdfviewer.scss:
--------------------------------------------------------------------------------
1 | body:not(.dark-mode) .component_pdfviewer .pdfviewer_container {
2 | background: #525659;
3 | }
4 |
5 | .component_pdfviewer{
6 | display: flex;
7 | flex-direction: column;
8 | flex: 1;
9 | width: 100%;
10 | flex-grow: 1;
11 |
12 | .pdfviewer_container {
13 | text-align: center;
14 | height: 100%;
15 | width: 100%;
16 | flex-grow: 1;
17 |
18 | /* PDFJS */
19 | canvas{
20 | margin: 0 auto;
21 | }
22 | .react-pdf__Document{
23 | overflow-y: scroll;
24 | height: 100%;
25 | .react-pdf__Page{
26 | margin-top: 15px;
27 | padding-bottom: 50px;
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/config/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "general": {
3 | },
4 | "features": {
5 | },
6 | "log": {
7 | },
8 | "email": {
9 | },
10 | "oauth": {
11 | },
12 | "connections": [
13 | {
14 | "type": "webdav",
15 | "label": "WebDav"
16 | },
17 | {
18 | "type": "ftp",
19 | "label": "FTP"
20 | },
21 | {
22 | "type": "sftp",
23 | "label": "SFTP"
24 | },
25 | {
26 | "type": "git",
27 | "label": "GIT"
28 | },
29 | {
30 | "type": "s3",
31 | "label": "S3"
32 | },
33 | {
34 | "type": "dropbox",
35 | "label": "Dropbox"
36 | },
37 | {
38 | "type": "gdrive",
39 | "label": "Drive"
40 | }
41 | ]
42 | }
43 |
--------------------------------------------------------------------------------
/embed.go:
--------------------------------------------------------------------------------
1 | package embed
2 |
3 | import (
4 | "embed"
5 | "io/fs"
6 | "net/http"
7 | "os"
8 | )
9 |
10 | var (
11 | //go:embed public
12 | wwwPublic embed.FS
13 | WWWPublic http.FileSystem = http.FS(os.DirFS("./public/"))
14 | )
15 |
16 | //go:embed server/plugin/index.go
17 | var EmbedPluginList []byte
18 |
19 | func init() {
20 | if os.Getenv("DEBUG") != "true" {
21 | fsPublic, _ := fs.Sub(wwwPublic, "public")
22 | WWWPublic = http.FS(fsPublic)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/public/Makefile:
--------------------------------------------------------------------------------
1 | compress:
2 | find . -type f -name '*.html' | xargs brotli -f -k
3 | find . -type f -name '*.html' | xargs gzip -f -k
4 | find . -type f -name '*.js' | xargs brotli -f -k
5 | find . -type f -name '*.js' | xargs gzip -f -k
6 | find . -type f -name '*.css' | xargs brotli -f -k
7 | find . -type f -name '*.css' | xargs gzip -f -k
8 | find . -type f -name '*.svg' | xargs brotli -f -k
9 | find . -type f -name '*.svg' | xargs gzip -f -k
10 |
11 | clean:
12 | find . -name '*.gz' -exec rm {} \;
13 | find . -name '*.br' -exec rm {} \;
14 |
15 | serve:
16 | go run server.go
17 |
--------------------------------------------------------------------------------
/public/assets/boot/common.js:
--------------------------------------------------------------------------------
1 | export function $error(msg) {
2 | const $code = document.createElement("code");
3 | $code.style.display = "block";
4 | $code.style.margin = "20px 0";
5 | $code.style.fontSize = "1.2rem";
6 | $code.style.padding = "0 10% 0 10%";
7 | $code.textContent = msg;
8 |
9 | const $img = document.createElement("img");
10 | $img.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABQAQMAAADcLOLWAAAABlBMVEUAAABTU1OoaSf/AAAAAXRSTlMAQObYZgAAAFlJREFUeF69zrERgCAQBdElMqQEOtHSuNIohRIMjfjO6DDmB7jZy5YgySQVYDIakIHD1kBPC9Bra5G2Ans0N7iAcOLF+EHvXySpjSBWCDI/3nIdBDihr8m4AcKdbn96jpAHAAAAAElFTkSuQmCC");
11 | $img.style.display = "block";
12 | $img.style.padding = "20vh 10% 0 10%";
13 |
14 | document.body.innerHTML = "";
15 | document.body.appendChild($img);
16 | document.body.appendChild($code);
17 | }
18 |
--------------------------------------------------------------------------------
/public/assets/boot/ctrl_boot.d.ts:
--------------------------------------------------------------------------------
1 | export {};
2 |
3 | interface IChromecast {
4 | init: () => Promise;
5 | }
6 |
7 | declare global {
8 | interface Window {
9 | env: string
10 | LNG: object;
11 | CONFIG: object;
12 | overrides: object;
13 | Chromecast: IChromecast;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/public/assets/boot/router_backoffice.js:
--------------------------------------------------------------------------------
1 | const routes = {
2 | "/admin/backend": "/pages/adminpage/ctrl_backend.js",
3 | "/admin/settings": "/pages/adminpage/ctrl_settings.js",
4 | "/admin/logs": "/pages/adminpage/ctrl_log.js",
5 | "/admin/about": "/pages/adminpage/ctrl_about.js",
6 | "/admin/setup": "/pages/adminpage/ctrl_setup.js",
7 | "/admin/": "/pages/ctrl_adminpage.js",
8 | "/admin": "/pages/ctrl_adminpage.js",
9 | "/logout": "/pages/ctrl_logout.js",
10 | "": "/pages/ctrl_notfound.js",
11 | };
12 |
13 | export default routes;
14 |
--------------------------------------------------------------------------------
/public/assets/boot/router_frontoffice.js:
--------------------------------------------------------------------------------
1 | const routes = {
2 | "/login": "/pages/ctrl_connectpage.js",
3 | "/logout": "/pages/ctrl_logout.js",
4 |
5 | "/": "/pages/ctrl_homepage.js",
6 | "/files/.*": "/pages/ctrl_filespage.js",
7 | "/view/.*": "/pages/ctrl_viewerpage.js",
8 | // /tags/.* -> "pages/ctrl_tags.js",
9 | "/s/.*": "/pages/ctrl_sharepage.js",
10 |
11 | "": "/pages/ctrl_notfound.js",
12 | };
13 |
14 | export default routes;
15 |
--------------------------------------------------------------------------------
/public/assets/components/dropdown.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/public/assets/components/dropdown.css
--------------------------------------------------------------------------------
/public/assets/components/fab.css:
--------------------------------------------------------------------------------
1 | .component_fab {
2 | position: fixed;
3 | bottom: 20px;
4 | right: 20px;
5 | z-index: 2;
6 | background: transparent;
7 | }
8 | .component_fab .content {
9 | height: 25px;
10 | width: 25px;
11 | padding: 13px;
12 | border-radius: 50%;
13 | background: var(--dark);
14 | box-shadow: rgba(0, 0, 0, 0.14) 0px 4px 5px 0px, rgba(0, 0, 0, 0.12) 0px 1px 10px 0px, rgba(0, 0, 0, 0.2) 0px 2px 4px -1px;
15 | z-index: 1000;
16 | cursor: pointer;
17 | }
18 |
--------------------------------------------------------------------------------
/public/assets/components/fab.js:
--------------------------------------------------------------------------------
1 | import { loadCSS } from "../helpers/loader.js";
2 | import assert from "../lib/assert.js";
3 |
4 | export default class ComponentFab extends HTMLButtonElement {
5 | constructor() {
6 | super();
7 | this.innerHTML = ``;
8 | this.classList.add("component_fab");
9 | }
10 |
11 | async render($icon) {
12 | await loadCSS(import.meta.url, "./fab.css");
13 | assert.type(this.querySelector(".content"), HTMLElement).replaceChildren($icon);
14 | }
15 | }
16 |
17 | customElements.define("component-fab", ComponentFab, { extends: "button" });
18 |
--------------------------------------------------------------------------------
/public/assets/components/skeleton.js:
--------------------------------------------------------------------------------
1 | export function generateSkeleton(n) {
2 | const tmpl = "";
3 | let html = "";
4 | for (let i = 0; i < n; i++) {
5 | html += tmpl;
6 | }
7 | return html;
8 | }
9 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_alert.css:
--------------------------------------------------------------------------------
1 | .alert {
2 | background: var(--bg-color);
3 | border-radius: 5px;
4 | padding: 20px;
5 | margin-top: 20px;
6 | margin-bottom: 20px;
7 | border: 1px solid rgba(0,0,0,0.05);
8 | }
9 | .alert ol, .alert ul {
10 | margin: 5px 0;
11 | padding: 0 20px;
12 | }
13 | .alert.success{
14 | background: var(--success);
15 | }
16 | .alert.error{
17 | background: var(--error);
18 | color: var(--bg-color);
19 | }
20 | .alert img{
21 | max-width: 100%;
22 | border-radius: 5px;
23 | border: 10px solid white;
24 | box-sizing: border-box;
25 | margin-top: 5px;
26 | }
27 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_box.css:
--------------------------------------------------------------------------------
1 | .box{
2 | padding: 10px;
3 | cursor: pointer;
4 | margin: 3px 0;
5 | overflow: hidden;
6 | position: relative;
7 | }
8 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_button.css:
--------------------------------------------------------------------------------
1 | button {
2 | border: none;
3 | margin: 0;
4 | padding: 6px;
5 | display: inline-block;
6 | outline: none;
7 | cursor: pointer;
8 | font-size: inherit;
9 | border-radius: 3px;
10 | color: rgba(0,0,0,0.6);
11 | background: inherit;
12 | }
13 | button.primary {
14 | background: var(--primary);
15 | color: white;
16 | }
17 | button.emphasis {
18 | background: var(--emphasis);
19 | color: white;
20 | }
21 | button.dark {
22 | background: var(--dark);
23 | color: white;
24 | }
25 | button.light {
26 | background: #e2e2e2;
27 | color: var(--dark);
28 | }
29 | button.large {
30 | width: 100%;
31 | }
32 | button[disabled] {
33 | opacity: 0.9;
34 | }
35 |
36 | .touch-no button.dark:hover, .touch-no button.emphasis:hover, .touch-no button.primary:hover {
37 | filter: brightness(95%);
38 | transition: 0.2s ease all;
39 | }
40 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_container.css:
--------------------------------------------------------------------------------
1 | .component_container{
2 | width: 95%;
3 | max-width: 800px;
4 | margin: 0 auto;
5 | padding: 10px;
6 | }
7 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_darkmode.css:
--------------------------------------------------------------------------------
1 | body.dark-mode {
2 | --bg-color: #1e1f22;
3 | --color: #f1f1f1;
4 | --light: #dfe1e5;
5 |
6 |
7 | --border: #303438;
8 | --dark: #2b2d30;
9 | }
10 |
11 | body.dark-mode input {
12 | color: var(--bg-color);
13 | }
14 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_icon.css:
--------------------------------------------------------------------------------
1 | .component_icon {
2 | vertical-align: bottom;
3 | max-height: 100%;
4 | }
5 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_skeleton.css:
--------------------------------------------------------------------------------
1 | .component_skeleton {
2 | width: 100%;
3 | height: 30px;
4 | background: linear-gradient(110deg, rgba(0,0,0,0.02) 8%, rgba(0,0,0,0.04) 18%, rgba(0,0,0,0.02) 33%);
5 | border-radius: 5px;
6 | background-size: 200% 100%;
7 | animation: 3s skeleton_shine linear infinite;
8 | margin-bottom: 15px;
9 | }
10 |
11 | @keyframes skeleton_shine {
12 | to { background-position-x: -200%; }
13 | }
14 |
--------------------------------------------------------------------------------
/public/assets/css/designsystem_utils.css:
--------------------------------------------------------------------------------
1 | .pointer {
2 | cursor: pointer;
3 | }
4 |
5 | .hidden{
6 | position:absolute!important;
7 | left:-10000px!important;
8 | top:auto!important;
9 | width:1px!important;
10 | height:1px!important;
11 | overflow:hidden!important;
12 | }
13 |
14 | .no-select {
15 | -webkit-touch-callout: none;
16 | -webkit-user-select: none;
17 | -khtml-user-select: none;
18 | -moz-user-select: none;
19 | -ms-user-select: none;
20 | user-select: none;
21 | -webkit-tap-highlight-color: transparent;
22 | }
23 |
24 | .center{
25 | text-align: center;
26 | }
27 |
28 | .full-width {
29 | width: 100%;
30 | }
31 |
32 | .flex {
33 | display: flex;
34 | }
35 |
36 | .ellipsis {
37 | white-space: nowrap;
38 | overflow: hidden;
39 | text-overflow: ellipsis;
40 | }
41 |
--------------------------------------------------------------------------------
/public/assets/fonts/SourceCodePro-Regular-400-latin-ext.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/public/assets/fonts/SourceCodePro-Regular-400-latin-ext.woff2
--------------------------------------------------------------------------------
/public/assets/fonts/SourceCodePro-Regular-400-latin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/public/assets/fonts/SourceCodePro-Regular-400-latin.woff2
--------------------------------------------------------------------------------
/public/assets/fonts/SourceCodePro-Semibold-600-latin-ext.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/public/assets/fonts/SourceCodePro-Semibold-600-latin-ext.woff2
--------------------------------------------------------------------------------
/public/assets/fonts/SourceCodePro-Semibold-600-latin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickael-kerjean/filestash/f1048299f6c56671ddd3568c986439c80e6a6037/public/assets/fonts/SourceCodePro-Semibold-600-latin.woff2
--------------------------------------------------------------------------------
/public/assets/helpers/loader.d.ts:
--------------------------------------------------------------------------------
1 | export function loadScript(url: string): Promise;
2 |
3 | export function loadJS(baseURL: string, path: string, opts?: object): Promise;
4 |
5 | export function loadCSS(baseURL: string, ...arrayOfFilenames: string[]): Promise;
6 |
7 | export function loadCSSInline(baseURL: string, filename: string): Promise;
8 |
9 | export function CSS(baseURL: string, ...arrayOfFilenames: string[]): Promise;
10 |
11 | export function init(): Promise;
--------------------------------------------------------------------------------
/public/assets/helpers/log.d.ts:
--------------------------------------------------------------------------------
1 | export function report(msg: Event|string, err?: any, link?: string, lineNo?: number, columnno?: number);
--------------------------------------------------------------------------------
/public/assets/helpers/log.js:
--------------------------------------------------------------------------------
1 | import { toHref } from "../lib/skeleton/router.js";
2 | import ajax from "../lib/ajax.js";
3 |
4 | export function report(msg, err, link, lineNo, columnNo) {
5 | if (window.navigator.onLine === false) return Promise.resolve();
6 | let url = toHref("/report?");
7 | url += "url=" + encodeURIComponent(location.href) + "&";
8 | url += "msg=" + encodeURIComponent(msg) + "&";
9 | url += "from=" + encodeURIComponent(link) + "&";
10 | url += "from.lineNo=" + lineNo + "&";
11 | url += "from.columnNo=" + columnNo;
12 | if (err instanceof Error) url += "error=" + encodeURIComponent(err.message) + "&";
13 |
14 | return ajax({ url, method: "post" }).toPromise().catch(() => {});
15 | }
16 |
--------------------------------------------------------------------------------
/public/assets/helpers/sdk.js:
--------------------------------------------------------------------------------
1 | // feature detection if we're using Filestash as a standalone app or as an SDK
2 | // see: ../index.js
3 |
4 | export function isSDK() {
5 | const importURL = new URL(import.meta.url);
6 | return location.origin !== importURL.origin;
7 | }
8 |
9 | export function urlSDK(url) {
10 | if (url.startsWith("blob:")) return url;
11 | else if (url.startsWith("http://") || url.startsWith("https://")) return url;
12 |
13 | const importURL = new URL(import.meta.url);
14 | if (new RegExp("^/").test(url) === false) {
15 | url = "/" + url;
16 | }
17 | return importURL.origin + url;
18 | }
19 |
--------------------------------------------------------------------------------
/public/assets/lib/dom.d.ts:
--------------------------------------------------------------------------------
1 | export function qs($node: HTMLElement | DocumentFragment, selector: string);
2 |
3 | export function qsa($node: HTMLElement | DocumentFragment, selector: string);
4 |
5 | export function safe(str: string): string;
6 |
--------------------------------------------------------------------------------
/public/assets/lib/dom.js:
--------------------------------------------------------------------------------
1 | export function qs($node, selector) {
2 | if (!$node) throw new TypeError("undefined node");
3 | const $target = $node.querySelector(selector);
4 | if (!$target) throw new DOMException(`undefined node for selector '${selector}'`, "NotFoundError");
5 | return $target;
6 | }
7 |
8 | export function qsa($node, selector) {
9 | if (!$node) throw new TypeError("undefined node");
10 | return $node.querySelectorAll(selector);
11 | }
12 |
13 | export function safe(str) {
14 | if (typeof str !== "string") return "";
15 |
16 | const $div = document.createElement("div");
17 | $div.textContent = str;
18 | return ($div.innerHTML || "")
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/public/assets/lib/error.d.ts:
--------------------------------------------------------------------------------
1 | export class AjaxError extends Error {
2 | constructor(message: string, err?: any, code?: string);
3 | code(): string;
4 | err(): any;
5 | type(): string;
6 | }
7 |
8 | export class ApplicationError extends Error {
9 | constructor(message: string, debug: string);
10 | debugMsg: string;
11 | type(): string;
12 | debug(): string;
13 | }
14 |
--------------------------------------------------------------------------------
/public/assets/lib/error.js:
--------------------------------------------------------------------------------
1 | export class AjaxError extends Error {
2 | constructor(message, err = null, code = "UNDEFINED_CODE") {
3 | super(message);
4 | this.name = this.constructor.name;
5 | this.errCode = code;
6 | this.errOrig = err;
7 | }
8 |
9 | code() {
10 | return this.errCode;
11 | }
12 |
13 | err() {
14 | return this.errOrig;
15 | }
16 |
17 | type() {
18 | return "AjaxError";
19 | }
20 | }
21 |
22 | export class ApplicationError extends Error {
23 | constructor(message, debug) {
24 | super(message);
25 | this.debugMsg = debug;
26 | }
27 |
28 | type() {
29 | return "ApplicationError";
30 | }
31 |
32 | debug() {
33 | return this.debugMsg || "N/A";
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/public/assets/lib/form.d.ts:
--------------------------------------------------------------------------------
1 | // type FormOption = {
2 | // };
3 |
4 | export function mutateForm(formSpec: object, formState: object): object;
5 |
6 | export function createFormNodes(node: object, opts: object): Promise