tiro-notes 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/cli.js +308 -2
- package/client/appicons/icons/mac/icon.icns +0 -0
- package/client/appicons/icons/png/1024x1024.png +0 -0
- package/client/appicons/icons/png/128x128.png +0 -0
- package/client/appicons/icons/png/16x16.png +0 -0
- package/client/appicons/icons/png/24x24.png +0 -0
- package/client/appicons/icons/png/256x256.png +0 -0
- package/client/appicons/icons/png/32x32.png +0 -0
- package/client/appicons/icons/png/48x48.png +0 -0
- package/client/appicons/icons/png/512x512.png +0 -0
- package/client/appicons/icons/png/64x64.png +0 -0
- package/client/appicons/icons/win/icon.ico +0 -0
- package/client/appicons/tiro_icon.icns +0 -0
- package/client/appicons/tiro_icon.ico +0 -0
- package/client/appicons/tiro_icon.png +0 -0
- package/client/asset-manifest.json +143 -0
- package/client/custom_icons/bottom-left.png +0 -0
- package/client/custom_icons/bottom-right.png +0 -0
- package/client/custom_icons/bottom.png +0 -0
- package/client/custom_icons/check.svg +7 -0
- package/client/custom_icons/left.png +0 -0
- package/client/custom_icons/line.svg +13 -0
- package/client/custom_icons/right.png +0 -0
- package/client/custom_icons/top-left.png +0 -0
- package/client/custom_icons/top-right.png +0 -0
- package/client/custom_icons/top.png +0 -0
- package/client/custom_icons/uncheck.svg +7 -0
- package/client/custom_icons/view-1.svg +18 -0
- package/client/custom_icons/view-2.svg +13 -0
- package/client/custom_icons/view-3.svg +13 -0
- package/client/custom_icons/view-4.svg +18 -0
- package/client/favicon.png +0 -0
- package/client/icon-192x192.png +0 -0
- package/client/icon-256x256.png +0 -0
- package/client/icon-384x384.png +0 -0
- package/client/icon-512x512.png +0 -0
- package/client/index.html +1 -0
- package/client/manifest.json +31 -0
- package/client/manifest.webmanifest +31 -0
- package/client/service-worker.js +63 -0
- package/client/static/css/12.54474f95.chunk.css +5 -0
- package/client/static/js/0.8818db75.chunk.js +1 -0
- package/client/static/js/1.dc212257.chunk.js +1 -0
- package/client/static/js/100.da1920be.chunk.js +1 -0
- package/client/static/js/101.2d460d94.chunk.js +1 -0
- package/client/static/js/102.f9a16c85.chunk.js +1 -0
- package/client/static/js/103.d1ea5ba4.chunk.js +1 -0
- package/client/static/js/104.a137d37d.chunk.js +1 -0
- package/client/static/js/105.28c03a34.chunk.js +1 -0
- package/client/static/js/106.37c81321.chunk.js +1 -0
- package/client/static/js/107.3041ab4b.chunk.js +1 -0
- package/client/static/js/108.ac4ab4c5.chunk.js +1 -0
- package/client/static/js/109.de1a8c92.chunk.js +1 -0
- package/client/static/js/110.e0fd9e71.chunk.js +1 -0
- package/client/static/js/12.69353b54.chunk.js +2 -0
- package/client/static/js/12.69353b54.chunk.js.LICENSE.txt +115 -0
- package/client/static/js/13.11233f89.chunk.js +1 -0
- package/client/static/js/14.4c6fecc8.chunk.js +1 -0
- package/client/static/js/15.54cce0d8.chunk.js +1 -0
- package/client/static/js/16.517ad23b.chunk.js +1 -0
- package/client/static/js/17.4e6d8e22.chunk.js +1 -0
- package/client/static/js/18.99a37042.chunk.js +1 -0
- package/client/static/js/19.004342b7.chunk.js +1 -0
- package/client/static/js/2.6e78ea89.chunk.js +1 -0
- package/client/static/js/20.400635c6.chunk.js +1 -0
- package/client/static/js/21.377bde95.chunk.js +1 -0
- package/client/static/js/22.97f27129.chunk.js +1 -0
- package/client/static/js/23.4ad8d0ec.chunk.js +1 -0
- package/client/static/js/24.d47656da.chunk.js +1 -0
- package/client/static/js/25.26949283.chunk.js +1 -0
- package/client/static/js/26.7e126fb1.chunk.js +1 -0
- package/client/static/js/27.85580870.chunk.js +1 -0
- package/client/static/js/28.72c93db3.chunk.js +1 -0
- package/client/static/js/29.80e40a62.chunk.js +1 -0
- package/client/static/js/3.664f336f.chunk.js +1 -0
- package/client/static/js/30.763b695b.chunk.js +1 -0
- package/client/static/js/31.8eaffd3a.chunk.js +1 -0
- package/client/static/js/32.cff2eb9f.chunk.js +1 -0
- package/client/static/js/33.70a11c37.chunk.js +1 -0
- package/client/static/js/34.ff9d1883.chunk.js +1 -0
- package/client/static/js/35.37436f63.chunk.js +1 -0
- package/client/static/js/36.83f9e51c.chunk.js +1 -0
- package/client/static/js/37.e9b848bc.chunk.js +1 -0
- package/client/static/js/38.80412b61.chunk.js +1 -0
- package/client/static/js/39.5299241a.chunk.js +1 -0
- package/client/static/js/4.328dd658.chunk.js +1 -0
- package/client/static/js/40.463e2602.chunk.js +1 -0
- package/client/static/js/41.87cc1e1b.chunk.js +1 -0
- package/client/static/js/42.9d2aaaf8.chunk.js +1 -0
- package/client/static/js/43.f55d6cd8.chunk.js +1 -0
- package/client/static/js/44.c769115a.chunk.js +1 -0
- package/client/static/js/45.cfaccbdb.chunk.js +1 -0
- package/client/static/js/46.04848b38.chunk.js +1 -0
- package/client/static/js/47.43108ad8.chunk.js +1 -0
- package/client/static/js/48.b0036b11.chunk.js +1 -0
- package/client/static/js/49.57012f8f.chunk.js +1 -0
- package/client/static/js/5.307b6480.chunk.js +1 -0
- package/client/static/js/50.d61bf562.chunk.js +1 -0
- package/client/static/js/51.8c2a739c.chunk.js +1 -0
- package/client/static/js/52.d60d6518.chunk.js +1 -0
- package/client/static/js/53.33e83e10.chunk.js +1 -0
- package/client/static/js/54.30726307.chunk.js +1 -0
- package/client/static/js/55.7e89444b.chunk.js +1 -0
- package/client/static/js/56.ad8541df.chunk.js +1 -0
- package/client/static/js/57.9fcc16d5.chunk.js +1 -0
- package/client/static/js/58.3a4458c1.chunk.js +1 -0
- package/client/static/js/59.d5ea8728.chunk.js +1 -0
- package/client/static/js/6.db56389b.chunk.js +1 -0
- package/client/static/js/60.96160883.chunk.js +1 -0
- package/client/static/js/61.59a3090c.chunk.js +1 -0
- package/client/static/js/62.858318f5.chunk.js +1 -0
- package/client/static/js/63.443b52f8.chunk.js +1 -0
- package/client/static/js/64.f67bbf85.chunk.js +1 -0
- package/client/static/js/65.f90a3a33.chunk.js +1 -0
- package/client/static/js/66.fcf111a8.chunk.js +1 -0
- package/client/static/js/67.f0af4760.chunk.js +1 -0
- package/client/static/js/68.4447a6c0.chunk.js +1 -0
- package/client/static/js/69.f92b446d.chunk.js +1 -0
- package/client/static/js/7.83cb847e.chunk.js +1 -0
- package/client/static/js/70.fc10f889.chunk.js +1 -0
- package/client/static/js/71.0b66ff83.chunk.js +1 -0
- package/client/static/js/72.75b6477f.chunk.js +1 -0
- package/client/static/js/73.ba5cd0ec.chunk.js +1 -0
- package/client/static/js/74.69ee5648.chunk.js +1 -0
- package/client/static/js/75.0ee213ed.chunk.js +1 -0
- package/client/static/js/76.03cc8251.chunk.js +1 -0
- package/client/static/js/77.9e0c615b.chunk.js +1 -0
- package/client/static/js/78.e39822e2.chunk.js +1 -0
- package/client/static/js/79.47712414.chunk.js +1 -0
- package/client/static/js/8.959dc24d.chunk.js +1 -0
- package/client/static/js/80.03d3c44a.chunk.js +1 -0
- package/client/static/js/81.3e86dcfc.chunk.js +1 -0
- package/client/static/js/82.d04a34d3.chunk.js +1 -0
- package/client/static/js/83.ed876d1d.chunk.js +1 -0
- package/client/static/js/84.22e9c594.chunk.js +1 -0
- package/client/static/js/85.d6790ffd.chunk.js +1 -0
- package/client/static/js/86.f5ca5c0b.chunk.js +1 -0
- package/client/static/js/87.6dbf41c6.chunk.js +1 -0
- package/client/static/js/88.0da244ee.chunk.js +1 -0
- package/client/static/js/89.40ea9ef2.chunk.js +1 -0
- package/client/static/js/9.d4911eb8.chunk.js +1 -0
- package/client/static/js/90.58b50413.chunk.js +1 -0
- package/client/static/js/91.d0607983.chunk.js +1 -0
- package/client/static/js/92.b1941812.chunk.js +1 -0
- package/client/static/js/93.cae75383.chunk.js +1 -0
- package/client/static/js/94.babda4ae.chunk.js +1 -0
- package/client/static/js/95.0a85c04f.chunk.js +1 -0
- package/client/static/js/96.e2d807e4.chunk.js +1 -0
- package/client/static/js/97.37813ebb.chunk.js +1 -0
- package/client/static/js/98.6df7c8e0.chunk.js +1 -0
- package/client/static/js/99.62e4c9c4.chunk.js +1 -0
- package/client/static/js/main.abaedb84.chunk.js +1 -0
- package/client/static/js/runtime-main.057f2c94.js +1 -0
- package/client/static/media/book-solid.87f5b737.svg +1 -0
- package/client/static/media/compact-disc-solid.55b6e50c.svg +1 -0
- package/client/static/media/deco-bg-map.7ca9103b.png +0 -0
- package/client/static/media/fa-brands-400.150de8ea.ttf +0 -0
- package/client/static/media/fa-brands-400.e033a13e.woff2 +0 -0
- package/client/static/media/fa-regular-400.3223dc79.woff2 +0 -0
- package/client/static/media/fa-regular-400.d8747423.ttf +0 -0
- package/client/static/media/fa-solid-900.4a2cd718.ttf +0 -0
- package/client/static/media/fa-solid-900.bb975c96.woff2 +0 -0
- package/client/static/media/fa-v4compatibility.0e3a648b.ttf +0 -0
- package/client/static/media/fa-v4compatibility.68577e40.woff2 +0 -0
- package/client/static/media/file-audio-solid.a76f99f0.svg +1 -0
- package/client/static/media/file-code-solid.62b467ac.svg +1 -0
- package/client/static/media/file-excel-solid.217d73db.svg +1 -0
- package/client/static/media/file-pdf-solid.0a9d75fe.svg +1 -0
- package/client/static/media/file-powerpoint-solid.4d969453.svg +1 -0
- package/client/static/media/file-solid.6415173e.svg +1 -0
- package/client/static/media/file-video-solid.312288cf.svg +1 -0
- package/client/static/media/file-word-solid.9228e1ff.svg +1 -0
- package/client/static/media/file-zipper-solid.7db57917.svg +1 -0
- package/client/static/media/globe-africa-solid.0ad34146.svg +1 -0
- package/client/static/media/link-solid.7b689dbd.svg +1 -0
- package/client/static/media/open-sans-all-400-normal.cb2542fc.woff +0 -0
- package/client/static/media/open-sans-all-700-normal.105e4309.woff +0 -0
- package/client/static/media/open-sans-all-800-normal.86e783c7.woff +0 -0
- package/client/static/media/open-sans-cyrillic-400-normal.5a546777.woff2 +0 -0
- package/client/static/media/open-sans-cyrillic-700-normal.2cf6253f.woff2 +0 -0
- package/client/static/media/open-sans-cyrillic-800-normal.41902933.woff2 +0 -0
- package/client/static/media/open-sans-cyrillic-ext-400-normal.01b11c56.woff2 +0 -0
- package/client/static/media/open-sans-cyrillic-ext-700-normal.00b4dd17.woff2 +0 -0
- package/client/static/media/open-sans-cyrillic-ext-800-normal.2c1c4cc5.woff2 +0 -0
- package/client/static/media/open-sans-greek-400-normal.3064bf7e.woff2 +0 -0
- package/client/static/media/open-sans-greek-700-normal.a0312547.woff2 +0 -0
- package/client/static/media/open-sans-greek-800-normal.d60c6496.woff2 +0 -0
- package/client/static/media/open-sans-greek-ext-400-normal.1ed998a4.woff2 +0 -0
- package/client/static/media/open-sans-greek-ext-700-normal.8850c90c.woff2 +0 -0
- package/client/static/media/open-sans-greek-ext-800-normal.fe3583f2.woff2 +0 -0
- package/client/static/media/open-sans-hebrew-400-normal.daafcec8.woff2 +0 -0
- package/client/static/media/open-sans-hebrew-700-normal.3befb44d.woff2 +0 -0
- package/client/static/media/open-sans-hebrew-800-normal.bfe88fed.woff2 +0 -0
- package/client/static/media/open-sans-latin-400-normal.a1535f45.woff2 +0 -0
- package/client/static/media/open-sans-latin-700-normal.b245bc85.woff2 +0 -0
- package/client/static/media/open-sans-latin-800-normal.185f6b03.woff2 +0 -0
- package/client/static/media/open-sans-latin-ext-400-normal.ccfa20f8.woff2 +0 -0
- package/client/static/media/open-sans-latin-ext-700-normal.64471a17.woff2 +0 -0
- package/client/static/media/open-sans-latin-ext-800-normal.988eae1a.woff2 +0 -0
- package/client/static/media/open-sans-vietnamese-400-normal.473f6b09.woff2 +0 -0
- package/client/static/media/open-sans-vietnamese-700-normal.b4c5968d.woff2 +0 -0
- package/client/static/media/open-sans-vietnamese-800-normal.27b69d87.woff2 +0 -0
- package/client/static/media/search-solid.cc51b702.svg +1 -0
- package/client/tiro-local.crt +20 -0
- package/package.json +26 -11
- package/server/ssl/tiro-local.crt +18 -0
- package/server/ssl/tiro-local.key +28 -0
- package/server/tiro-server.js +2 -0
- package/server/tiro-server.js.LICENSE.txt +315 -0
- package/shared.helpers.build.js +177 -0
- package/index.html +0 -0
- package/index.js +0 -4
- package/package.json~ +0 -13
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Tiro Notes
|
|
2
|
+
|
|
3
|
+
An open-source, cross-platform markdown editor designed for extensibility & flexibility
|
|
4
|
+
|
|
5
|
+
🌐 website| 📢 news| 📘 guides| ⬇️ usage | demo | Status |
|
|
6
|
+
-|-|-|-|-|-
|
|
7
|
+
[tiro-notes.org](https://tiro-notes.org)|[dev blog](https://tinyurl.com/tiroblog) & [twitter](https://twitter.com/NotesTiro)|[guides](https://tiro-notes.org/#/guide-custom-tags)|[download](https://tiro-notes.org/#/downloads) or ```npx tiro-notes@latest```|[online demo](https://codesandbox.io/p/devbox/agitated-dubinsky-dvqtjw) | beta
|
|
8
|
+
|
|
9
|
+
<a href="https://codesandbox.io/p/devbox/agitated-dubinsky-dvqtjw" target="_blank"><img width="200" alt="button_open-in-codesandbox(1)" src="https://github.com/user-attachments/assets/17bc828d-be5f-42d2-a6ec-9536080028f4" /></a>
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Tiro Notes focus points are :
|
|
16
|
+
|
|
17
|
+
- 🏋 **Extensibility** : Tiro Notes uses a system of custom tags to extend its capabilities :
|
|
18
|
+
- Add [```[[latex]]```](https://tiro-notes.org/#/custom-tags?id=latex), [```[[uml]]```](https://tiro-notes.org/#/custom-tags?id=mermaid) or [```[[charts]]```](https://tiro-notes.org/#/custom-tags?id=mermaid), preview your pdf, mp4 or youtube links using [```[[view]]```](https://tiro-notes.org/#/custom-tags?id=view). Add [```[[spreadsheet]]```](https://tiro-notes.org/#/custom-tags?id=spreadsheet) logic to your markdown tables.
|
|
19
|
+
- Use Tiro as an app platform with a [```[[rss]]```](https://tiro-notes.org/#/custom-tags?id=rss) reader or a [```[[calendar]]```](https://tiro-notes.org/#/custom-tags?id=calendar) in it.
|
|
20
|
+
- [Create your own custom tags](https://tiro-notes.org/#/guide-custom-tags) and use the [Client API](https://tiro-notes.org/#/guide-custom-tags?id=using-tiro-client-api).
|
|
21
|
+
|
|
22
|
+
- 🎛️ **Flexibility** : multi-window interface to create a custom workspace. Create multiple workspaces organized by tabs. Keep these workspaces synced accross your devices.
|
|
23
|
+
|
|
24
|
+
- 👑 **Open source & Open Data**: Code is open source and free. No database required. Markdown files only. You can edit and sync your files with external software as you need.
|
|
25
|
+
|
|
26
|
+
- ☁️ / 🖥️ / 💻 / 📱 **Cross-platform & Web** : Windows, macOS, Android, Linux, Web. Start an App or with CLI and access it anywhere on your local network.
|
|
27
|
+
|
|
28
|
+
# Install
|
|
29
|
+
- [Download desktop client (Win/Mac/Linux)](https://tiro-notes.org/#/downloads)
|
|
30
|
+
- or with command line ```npx tiro-notes```
|
|
31
|
+
- for the latest functionnalities ```npx tiro-notes@develop``` ([weekly basis](https://www.npmjs.com/package/tiro-notes?activeTab=versions) updates)
|
|
32
|
+
|
|
33
|
+
# Functionalities
|
|
34
|
+
|
|
35
|
+
**Note Edition**
|
|
36
|
+
- 🖊️ Mardown notes edition
|
|
37
|
+
- 🌄 Drag and Drop images & files upload (stored in a relative .resources folder)
|
|
38
|
+
- 🔗 Notes linking
|
|
39
|
+
- 🔑 note encryption (RSA 2048)
|
|
40
|
+
- 🏛 Note changes history
|
|
41
|
+
- 📄 Export to PDF
|
|
42
|
+
- 💬 Text to Speech (beta)
|
|
43
|
+
|
|
44
|
+
**Custom Tags**
|
|
45
|
+
- 💱 display math formulas with [[latex]]
|
|
46
|
+
- 🧬 display UML and other diagrams with [[diagram]]
|
|
47
|
+
- 🏋 Embed videos, pdf and web content with [[view]]
|
|
48
|
+
- 🏋 create javascript applications within your note with [[script]]
|
|
49
|
+
- 🧬 leverage the full [Client API](guide-custom-tags?id=using-tiro-client-api) in [[script]]
|
|
50
|
+
|
|
51
|
+
**Search**
|
|
52
|
+
- 🔍 Fast search (~2s for 30k notes)
|
|
53
|
+
- 🔬 Search filters (intitle: etc.)
|
|
54
|
+
|
|
55
|
+
**Folders Tree & Notes List**
|
|
56
|
+
- 🗂️ Folders management (create/rename/move/delete)
|
|
57
|
+
- 🏎️ Fast Notes List (can display 10k files without slowdown)
|
|
58
|
+
- 🧮 Notes List sorting (date creation/date modification/name)
|
|
59
|
+
- 👁️ Note preview in Notes List (with image and text)
|
|
60
|
+
- 📤 Last notes edited
|
|
61
|
+
- 🌄 Images list view
|
|
62
|
+
|
|
63
|
+
**Security**
|
|
64
|
+
- 🔒 Application login (user/password)
|
|
65
|
+
- 🔒 HTTPS support (with self signed certificate)
|
|
66
|
+
|
|
67
|
+
**Platforms**
|
|
68
|
+
- 💻 Windows/Mac/Linux applications
|
|
69
|
+
- 🥷 10 seconds install & start with command line NPX
|
|
70
|
+
- 📱 Install on Android with Termux and NPX
|
|
71
|
+
- ☁️ Use it as a local application, as a local or cloud server.
|
|
72
|
+
- 📟 Use it on any device with a browser (Mobile, tablet and Desktop interface)
|
|
73
|
+
- (🔧)📱 Install on iOS with iSH and NPX (to be tested...)
|
|
74
|
+
|
|
75
|
+
>"Marcus Tullius Tiro, a learned freedman who was a member of Cicero’s household, invented the Tironian notes, the first Latin shorthand system. Tironian notes consist of letters of the alphabet, simplified and modified to achieve greater speed in their writing."
|
package/cli.js
CHANGED
|
@@ -1,3 +1,309 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
// const isDev = false
|
|
4
|
+
const isDev = process.env.ISDEV
|
|
5
|
+
const tHelpers = isDev ? require('../shared.helpers.js') : require(`./shared.helpers.build.js`);
|
|
6
|
+
const pathServerJs = isDev ? `${__dirname}/node-build/server/tiro-server.js` : `${__dirname}/server/tiro-server.js`
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// CLI HELP MANUAL
|
|
10
|
+
const outputHelp = () => {
|
|
11
|
+
var p = require('./package.json');
|
|
12
|
+
const tiroHelpString = `
|
|
13
|
+
VERSION:
|
|
14
|
+
===
|
|
15
|
+
${p.name.toUpperCase()} v.${p.version} ${isDev ? '(**dev**)' : ''}
|
|
16
|
+
|
|
17
|
+
DESCRIPTION:
|
|
18
|
+
===
|
|
19
|
+
${p.description}
|
|
20
|
+
|
|
21
|
+
====
|
|
22
|
+
|
|
23
|
+
--https/-s : enable https ssl with self signed certificate (boolean, false by default)
|
|
24
|
+
--port/-p : port to use (number, 3023 by default)
|
|
25
|
+
--no-open/-no : do not open Tiro in browser when starting
|
|
26
|
+
--verbose/-v : control logs verbosity [0/1/2/3] (0:none, 1: critical, 2: all, 3: performance monitoring)
|
|
27
|
+
|
|
28
|
+
--tunnel/-t : [require autossh to be installed first!] uses autossh to "publish" the app on the web, requires a server you can access with ssh and autossh installed on that device. (ex:npx tiro-notes@latest -t REMOTE_USER@REMOTE_URL:REMOTE_PORT)
|
|
29
|
+
--tunnel-timeout/-tt : [require autossh to be installed first!] autokill tunnel after x hours (default: -1)
|
|
30
|
+
|
|
31
|
+
--backup/-b : [t/n/now/force/f] [require tar to be installed first!] will incrementally backup changes in archives like tiro.0.xz.tar, tiro.1.xz.tar... every day in a specific folder.
|
|
32
|
+
You can then execute commands after that process in a post backup script (useful for syncing these archives to clouds, think rsync, rclone etc.)
|
|
33
|
+
All folders will be backed up with the exception of folders ending by _NOBAK_ (ex: "my_folder_NOBAK_").
|
|
34
|
+
|
|
35
|
+
--backup-folder : modify backup folder destination. (default: "your/path/to/tiro/data_folder"+_backup
|
|
36
|
+
--backup-post-script : modify script to be executed after a backup finishes. Should be a ".txt" file with your OS commands. (default: "your/path/to/tiro/data_folder"+_backup/post_backup_script.txt
|
|
37
|
+
|
|
38
|
+
--help/-h : help
|
|
39
|
+
|
|
40
|
+
EXAMPLES:
|
|
41
|
+
====
|
|
42
|
+
- npx tiro-notes
|
|
43
|
+
- npx tiro-notes --tunnel ubuntu@myserver.com:3023 --port 3033 --https true
|
|
44
|
+
- npx tiro-notes -t ubuntu@myserver.com:3023 -p 3033 -s true
|
|
45
|
+
`;
|
|
46
|
+
console.log(tiroHelpString);
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// open frontend on default browser
|
|
51
|
+
const openInBrowser = (url) => {
|
|
52
|
+
var start = (process.platform == 'darwin'? 'open': process.platform == 'win32'? 'start': 'xdg-open');
|
|
53
|
+
require('child_process').exec(start + ' ' + url);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
function getCliArgs () {
|
|
58
|
+
var args = process.argv;
|
|
59
|
+
var argsObj = {
|
|
60
|
+
port: 3023,
|
|
61
|
+
https: false,
|
|
62
|
+
help: false,
|
|
63
|
+
open: true,
|
|
64
|
+
verbose: false,
|
|
65
|
+
backup: {
|
|
66
|
+
enabled: false,
|
|
67
|
+
now: false,
|
|
68
|
+
location: "default",
|
|
69
|
+
scriptLocation: "default"
|
|
70
|
+
},
|
|
71
|
+
tunnel: {
|
|
72
|
+
enabled: false,
|
|
73
|
+
timeout: -1,
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
for (var i = 0; i < args.length; i++) {
|
|
77
|
+
if (i % 2 !== 0) continue
|
|
78
|
+
var argName = args[i];
|
|
79
|
+
var argVal = args[i+1];
|
|
80
|
+
argName = argName.replace('--', '').replace('-','')
|
|
81
|
+
if (argName === 'p' || argName === 'port') argsObj.port = parseInt(argVal);
|
|
82
|
+
if (argName === 's' || argName === 'https') argsObj.https = true
|
|
83
|
+
if (argName === 'h' || argName === 'help') argsObj.help = true
|
|
84
|
+
if (argName === 'no-open' || argName === 'no') argsObj.open = false
|
|
85
|
+
if (argName === 'v' || argName === 'verbose') argsObj.verbose = parseInt(argVal)
|
|
86
|
+
|
|
87
|
+
if (argName === 'b' || argName === 'backup') argsObj.backup.enabled = true
|
|
88
|
+
if (argName === 'b' || argName === 'backup') argsObj.backup.now = (argVal === "now" || argVal === "n" || argVal === "force" || argVal === "f") ? true : false
|
|
89
|
+
if (argName === 'backup-location') argsObj.backup.location = argVal
|
|
90
|
+
if (argName === 'backup-post-script') argsObj.backup.scriptLocation = argVal
|
|
91
|
+
|
|
92
|
+
if (argName === 'tt' || argName === 'tunnel-timeout') argsObj.tunnel.timeout = parseInt(argVal)
|
|
93
|
+
if (argName === 't' || argName === 'tunnel') {
|
|
94
|
+
const argsArr = argVal.split(':')
|
|
95
|
+
if (argsArr.length > 1) {
|
|
96
|
+
argsObj.tunnel.enabled = true
|
|
97
|
+
argsObj.tunnel.remoteUrl = argsArr[0]
|
|
98
|
+
argsObj.tunnel.remotePort = parseInt(argsArr[1])
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return argsObj;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function startTiroServer (argsObj, cb) {
|
|
106
|
+
console.log(`Starting Tiro-Notes from CLI with following arguments : ${JSON.stringify(argsObj)}`);
|
|
107
|
+
|
|
108
|
+
// kill all possible remaining servers of tiro
|
|
109
|
+
tHelpers.killPreviousInstances(() => {
|
|
110
|
+
|
|
111
|
+
// start tiro server, detect success message and get server params
|
|
112
|
+
tHelpers.execCmd('node', [pathServerJs], {
|
|
113
|
+
logLevel: argsObj.verbose,
|
|
114
|
+
env: {
|
|
115
|
+
TIRO_PORT: argsObj.port,
|
|
116
|
+
TIRO_HTTPS: argsObj.https,
|
|
117
|
+
TIRO_PERFORMANCE_MONITORING_BACKEND: argsObj.verbose === 3
|
|
118
|
+
},
|
|
119
|
+
logName: 'tiroServer',
|
|
120
|
+
onLog: str => {
|
|
121
|
+
// we get params like dataFolder from server.js directly
|
|
122
|
+
tHelpers.checkAndGetTiroConfig(str, {platform: 'cli', cb})
|
|
123
|
+
}
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const startBackupScript = async (argsObj, dataFolder) => {
|
|
129
|
+
if (!argsObj.backup.enabled) return;
|
|
130
|
+
if (!dataFolder) return console.warn ("[BACKUP] no dataFolder detected!");
|
|
131
|
+
|
|
132
|
+
// get BACKUP_FOLDER path
|
|
133
|
+
const defaultBackupFolder = dataFolder + "_backup/"
|
|
134
|
+
const backupFolder = argsObj.backup.location !== "default" ? argsObj.backup.location : defaultBackupFolder
|
|
135
|
+
// if does not exists, create it
|
|
136
|
+
if (!tHelpers.fileExists(backupFolder)) await tHelpers.createDir(backupFolder)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
// get POST_BACKUP_SCRIPT
|
|
140
|
+
const defaultPostBackupScript = backupFolder + "post_backup_script.txt"
|
|
141
|
+
const postBackupScriptFile = argsObj.backup.scriptLocation !== "default" ? argsObj.backup.scriptLocation : defaultPostBackupScript
|
|
142
|
+
// if does not exists, create it, empty
|
|
143
|
+
if (!tHelpers.fileExists(postBackupScriptFile)) await tHelpers.saveFile(postBackupScriptFile, "")
|
|
144
|
+
let postBackupScript = await tHelpers.openFile(postBackupScriptFile)
|
|
145
|
+
if (postBackupScript) postBackupScript += ";"
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
// get LAST_BACKUP_TIMESTAMP
|
|
149
|
+
const timestampFile = backupFolder + "last_backup_timestamp.txt"
|
|
150
|
+
const now = () => new Date().getTime()
|
|
151
|
+
// if does not exists, create it, then give a timestamp of 0
|
|
152
|
+
if (!tHelpers.fileExists(timestampFile)) await tHelpers.saveFile(timestampFile, "0")
|
|
153
|
+
const getLastTimestamp = async () => {
|
|
154
|
+
let lastBackupTimestampRaw = await tHelpers.openFile(timestampFile);
|
|
155
|
+
let lastBackupTimestamp = parseInt(lastBackupTimestampRaw)
|
|
156
|
+
return lastBackupTimestamp
|
|
157
|
+
}
|
|
158
|
+
let replaceTimestampCli = () => `echo ${now()} > '${timestampFile}'`
|
|
159
|
+
|
|
160
|
+
// START INTERVAL
|
|
161
|
+
// const timeInterval = 1000 * 60 * 60 // one hour
|
|
162
|
+
const timeInterval = 1000 * 60 * 10 // one hour
|
|
163
|
+
const backupInterval = 1000 * 60 * 60 * 24 // one day
|
|
164
|
+
|
|
165
|
+
const tarExec = process.platform === "darwin" ? "gtar" : "tar"
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
console.log ("[BACKUP] starting backup logic!");
|
|
169
|
+
|
|
170
|
+
let debugBackupNow = isDev ? false : false
|
|
171
|
+
if (argsObj.backup.now) debugBackupNow = true
|
|
172
|
+
const processBackupEveryDay = async () => {
|
|
173
|
+
// if > 1 day
|
|
174
|
+
const lastTimestamp = await getLastTimestamp()
|
|
175
|
+
const diff = backupInterval + lastTimestamp - new Date().getTime()
|
|
176
|
+
const diffMin = Math.round(diff / (1000 * 60))
|
|
177
|
+
// are we between 1am-5am ?
|
|
178
|
+
const isBetween1am5am = new Date().getHours() >= 1 && new Date().getHours() <= 5
|
|
179
|
+
if ((diff < 0 && isBetween1am5am) || debugBackupNow) {
|
|
180
|
+
debugBackupNow = false
|
|
181
|
+
console.log(`[BACKUP] time has come, BACKUP! (debugBackupNow:${debugBackupNow}) ==> LOGS in log_backup.txt`);
|
|
182
|
+
|
|
183
|
+
// automatically generate a cli.sh from command below and post backup script, then exec it
|
|
184
|
+
let backupCli = `
|
|
185
|
+
${replaceTimestampCli()};
|
|
186
|
+
mkdir '${backupFolder}';
|
|
187
|
+
mkdir '${backupFolder}/backups';
|
|
188
|
+
cd '${backupFolder}';
|
|
189
|
+
echo '====== [${new Date().toLocaleString()}] -> new backup started' >> log_backups.txt;
|
|
190
|
+
${tarExec} --xz --verbose --create --file="backups/tiro.$(ls backups/ | wc -l | sed 's/^ *//;s/ *$//').tar.xz" '${dataFolder}' --listed-incremental='${backupFolder}metadata.snar' --exclude=\'*_NOBAK_';
|
|
191
|
+
echo ' [${new Date().toLocaleString()}] -> compression archive finished' >> log_backups.txt; ${postBackupScript};
|
|
192
|
+
echo ' [${new Date().toLocaleString()}] -> upload finished' >> log_backups.txt;`
|
|
193
|
+
// append to backup CLI current timestamp to last_backup_timestamp
|
|
194
|
+
// remove \n from backupCli
|
|
195
|
+
backupCli = backupCli.replace(/\n/g, ' ')
|
|
196
|
+
// replace all ;; by ;
|
|
197
|
+
backupCli = backupCli.replace(/;;/g, ';')
|
|
198
|
+
|
|
199
|
+
// execute cli
|
|
200
|
+
tHelpers.execCmdInFile(backupCli, backupFolder+"cli.sh", {
|
|
201
|
+
logLevel: argsObj.verbose
|
|
202
|
+
// logLevel: 2 // log level always 2 for backup to see whats happening
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
const debugObj = {backupFolder, postBackupScriptFile, lastTimestamp, postBackupScript, timeInterval, backupCli}
|
|
206
|
+
|
|
207
|
+
console.log (debugObj);
|
|
208
|
+
} else {
|
|
209
|
+
const logTime = new Date().toLocaleString()
|
|
210
|
+
console.log(`[BACKUP] ${logTime} => not yet. Waiting for ${diffMin} mins < 0 AND between 1am-5am ${JSON.stringify({isBetween1am5am, currHour: new Date().getHours()})}}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// every hour
|
|
215
|
+
processBackupEveryDay();
|
|
216
|
+
let int = setInterval(() => {
|
|
217
|
+
processBackupEveryDay()
|
|
218
|
+
}, timeInterval)
|
|
219
|
+
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const startSshTunnel = (argsObj) => {
|
|
223
|
+
if (argsObj.tunnel.enabled) {
|
|
224
|
+
// kill previous autossh processes
|
|
225
|
+
let cb2 = true
|
|
226
|
+
let cb1 = true
|
|
227
|
+
tHelpers.execCmd('killall', [`autossh`], {
|
|
228
|
+
logName:'tunnel 1/3',
|
|
229
|
+
onLog: () => {
|
|
230
|
+
if (!cb2) return
|
|
231
|
+
cb2 = false
|
|
232
|
+
// check if autossh is working
|
|
233
|
+
tHelpers.execCmd('autossh', [`-V`], {
|
|
234
|
+
logName:'tunnel 2/3',
|
|
235
|
+
onLog: str => {
|
|
236
|
+
if (!cb1) return
|
|
237
|
+
cb1 = false
|
|
238
|
+
// start autossh finally
|
|
239
|
+
tHelpers.execCmd('autossh',['-M',`2${argsObj.tunnel.remotePort}`,'-N', argsObj.tunnel.remoteUrl,'-R', `${argsObj.tunnel.remotePort}:localhost:${argsObj.port}`,'-C'], {
|
|
240
|
+
logName:'tunnel 3/3'
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
// if tunnel.timeout != 1
|
|
244
|
+
if (argsObj.tunnel.timeout != 1) {
|
|
245
|
+
console.log(`Tunnel timeout set to ${argsObj.tunnel.timeout}h.`)
|
|
246
|
+
setTimeout(() => {
|
|
247
|
+
console.log(`Tunnel timeout reached (${argsObj.tunnel.timeout}h). Closing tunnel.`, str)
|
|
248
|
+
tHelpers.execCmd('killall', [`autossh`], {
|
|
249
|
+
logName:'tunnel 4/3',
|
|
250
|
+
onLog: str => {
|
|
251
|
+
console.log(`Tunnel timeout reached (${argsObj.tunnel.timeout}h). Closing tunnel.`, str)
|
|
252
|
+
}
|
|
253
|
+
})
|
|
254
|
+
}, argsObj.tunnel.timeout * 1000 * 60 * 60)
|
|
255
|
+
let countHours = 0
|
|
256
|
+
setTimeout(() => {
|
|
257
|
+
countHours++
|
|
258
|
+
console.log(`Tunnel timeout in ${argsObj.tunnel.timeout - countHours}h`)
|
|
259
|
+
}, argsObj.tunnel.timeout * 1000 * 60 )
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
}
|
|
264
|
+
})
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Main script
|
|
269
|
+
function main () {
|
|
270
|
+
|
|
271
|
+
var argsObj = getCliArgs();
|
|
272
|
+
|
|
273
|
+
if (argsObj.help) {
|
|
274
|
+
|
|
275
|
+
outputHelp();
|
|
276
|
+
|
|
277
|
+
} else {
|
|
278
|
+
|
|
279
|
+
startTiroServer(argsObj, (configServerObj) => {
|
|
280
|
+
|
|
281
|
+
const c = configServerObj
|
|
282
|
+
const protocol = c.https ? 'https' : 'http'
|
|
283
|
+
const port = c.port
|
|
284
|
+
const dataFolder = c.dataFolder
|
|
285
|
+
|
|
286
|
+
// open in browser
|
|
287
|
+
if (argsObj.open) openInBrowser(`${protocol}://localhost:${port}`);
|
|
288
|
+
|
|
289
|
+
// start tunnel with autossh if asked
|
|
290
|
+
startSshTunnel(argsObj);
|
|
291
|
+
|
|
292
|
+
// start backup script
|
|
293
|
+
startBackupScript(argsObj, dataFolder);
|
|
294
|
+
|
|
295
|
+
})
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const test = () => {
|
|
300
|
+
var argsObj = getCliArgs();
|
|
301
|
+
// startBackupScript(argsObj, "/Users/gregoirethiebault/Desktop/your markdown notes")
|
|
302
|
+
startBackupScript(argsObj, "/Users/gregoirethiebault/Desktop/nodal_ex")
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
// start everything
|
|
307
|
+
// isDev ? test() : main();
|
|
308
|
+
isDev ? main() : main();
|
|
309
|
+
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": {
|
|
3
|
+
"static/js/0.8818db75.chunk.js": "/static/js/0.8818db75.chunk.js",
|
|
4
|
+
"static/js/1.dc212257.chunk.js": "/static/js/1.dc212257.chunk.js",
|
|
5
|
+
"static/js/2.6e78ea89.chunk.js": "/static/js/2.6e78ea89.chunk.js",
|
|
6
|
+
"static/js/3.664f336f.chunk.js": "/static/js/3.664f336f.chunk.js",
|
|
7
|
+
"static/js/4.328dd658.chunk.js": "/static/js/4.328dd658.chunk.js",
|
|
8
|
+
"static/js/5.307b6480.chunk.js": "/static/js/5.307b6480.chunk.js",
|
|
9
|
+
"static/js/6.db56389b.chunk.js": "/static/js/6.db56389b.chunk.js",
|
|
10
|
+
"static/js/7.83cb847e.chunk.js": "/static/js/7.83cb847e.chunk.js",
|
|
11
|
+
"static/js/8.959dc24d.chunk.js": "/static/js/8.959dc24d.chunk.js",
|
|
12
|
+
"static/js/9.d4911eb8.chunk.js": "/static/js/9.d4911eb8.chunk.js",
|
|
13
|
+
"main.js": "/static/js/main.abaedb84.chunk.js",
|
|
14
|
+
"runtime-main.js": "/static/js/runtime-main.057f2c94.js",
|
|
15
|
+
"static/css/12.54474f95.chunk.css": "/static/css/12.54474f95.chunk.css",
|
|
16
|
+
"static/js/12.69353b54.chunk.js": "/static/js/12.69353b54.chunk.js",
|
|
17
|
+
"static/js/13.11233f89.chunk.js": "/static/js/13.11233f89.chunk.js",
|
|
18
|
+
"static/js/14.4c6fecc8.chunk.js": "/static/js/14.4c6fecc8.chunk.js",
|
|
19
|
+
"static/js/15.54cce0d8.chunk.js": "/static/js/15.54cce0d8.chunk.js",
|
|
20
|
+
"static/js/16.517ad23b.chunk.js": "/static/js/16.517ad23b.chunk.js",
|
|
21
|
+
"static/js/17.4e6d8e22.chunk.js": "/static/js/17.4e6d8e22.chunk.js",
|
|
22
|
+
"static/js/18.99a37042.chunk.js": "/static/js/18.99a37042.chunk.js",
|
|
23
|
+
"static/js/19.004342b7.chunk.js": "/static/js/19.004342b7.chunk.js",
|
|
24
|
+
"static/js/20.400635c6.chunk.js": "/static/js/20.400635c6.chunk.js",
|
|
25
|
+
"static/js/21.377bde95.chunk.js": "/static/js/21.377bde95.chunk.js",
|
|
26
|
+
"static/js/22.97f27129.chunk.js": "/static/js/22.97f27129.chunk.js",
|
|
27
|
+
"static/js/23.4ad8d0ec.chunk.js": "/static/js/23.4ad8d0ec.chunk.js",
|
|
28
|
+
"static/js/24.d47656da.chunk.js": "/static/js/24.d47656da.chunk.js",
|
|
29
|
+
"static/js/25.26949283.chunk.js": "/static/js/25.26949283.chunk.js",
|
|
30
|
+
"static/js/26.7e126fb1.chunk.js": "/static/js/26.7e126fb1.chunk.js",
|
|
31
|
+
"static/js/27.85580870.chunk.js": "/static/js/27.85580870.chunk.js",
|
|
32
|
+
"static/js/28.72c93db3.chunk.js": "/static/js/28.72c93db3.chunk.js",
|
|
33
|
+
"static/js/29.80e40a62.chunk.js": "/static/js/29.80e40a62.chunk.js",
|
|
34
|
+
"static/js/30.763b695b.chunk.js": "/static/js/30.763b695b.chunk.js",
|
|
35
|
+
"static/js/31.8eaffd3a.chunk.js": "/static/js/31.8eaffd3a.chunk.js",
|
|
36
|
+
"static/js/32.cff2eb9f.chunk.js": "/static/js/32.cff2eb9f.chunk.js",
|
|
37
|
+
"static/js/33.70a11c37.chunk.js": "/static/js/33.70a11c37.chunk.js",
|
|
38
|
+
"static/js/34.ff9d1883.chunk.js": "/static/js/34.ff9d1883.chunk.js",
|
|
39
|
+
"static/js/35.37436f63.chunk.js": "/static/js/35.37436f63.chunk.js",
|
|
40
|
+
"static/js/36.83f9e51c.chunk.js": "/static/js/36.83f9e51c.chunk.js",
|
|
41
|
+
"static/js/37.e9b848bc.chunk.js": "/static/js/37.e9b848bc.chunk.js",
|
|
42
|
+
"static/js/38.80412b61.chunk.js": "/static/js/38.80412b61.chunk.js",
|
|
43
|
+
"static/js/39.5299241a.chunk.js": "/static/js/39.5299241a.chunk.js",
|
|
44
|
+
"static/js/40.463e2602.chunk.js": "/static/js/40.463e2602.chunk.js",
|
|
45
|
+
"static/js/41.87cc1e1b.chunk.js": "/static/js/41.87cc1e1b.chunk.js",
|
|
46
|
+
"static/js/42.9d2aaaf8.chunk.js": "/static/js/42.9d2aaaf8.chunk.js",
|
|
47
|
+
"static/js/43.f55d6cd8.chunk.js": "/static/js/43.f55d6cd8.chunk.js",
|
|
48
|
+
"static/js/44.c769115a.chunk.js": "/static/js/44.c769115a.chunk.js",
|
|
49
|
+
"static/js/45.cfaccbdb.chunk.js": "/static/js/45.cfaccbdb.chunk.js",
|
|
50
|
+
"static/js/46.04848b38.chunk.js": "/static/js/46.04848b38.chunk.js",
|
|
51
|
+
"static/js/47.43108ad8.chunk.js": "/static/js/47.43108ad8.chunk.js",
|
|
52
|
+
"static/js/48.b0036b11.chunk.js": "/static/js/48.b0036b11.chunk.js",
|
|
53
|
+
"static/js/49.57012f8f.chunk.js": "/static/js/49.57012f8f.chunk.js",
|
|
54
|
+
"static/js/50.d61bf562.chunk.js": "/static/js/50.d61bf562.chunk.js",
|
|
55
|
+
"static/js/51.8c2a739c.chunk.js": "/static/js/51.8c2a739c.chunk.js",
|
|
56
|
+
"static/js/52.d60d6518.chunk.js": "/static/js/52.d60d6518.chunk.js",
|
|
57
|
+
"static/js/53.33e83e10.chunk.js": "/static/js/53.33e83e10.chunk.js",
|
|
58
|
+
"static/js/54.30726307.chunk.js": "/static/js/54.30726307.chunk.js",
|
|
59
|
+
"static/js/55.7e89444b.chunk.js": "/static/js/55.7e89444b.chunk.js",
|
|
60
|
+
"static/js/56.ad8541df.chunk.js": "/static/js/56.ad8541df.chunk.js",
|
|
61
|
+
"static/js/57.9fcc16d5.chunk.js": "/static/js/57.9fcc16d5.chunk.js",
|
|
62
|
+
"static/js/58.3a4458c1.chunk.js": "/static/js/58.3a4458c1.chunk.js",
|
|
63
|
+
"static/js/59.d5ea8728.chunk.js": "/static/js/59.d5ea8728.chunk.js",
|
|
64
|
+
"static/js/60.96160883.chunk.js": "/static/js/60.96160883.chunk.js",
|
|
65
|
+
"static/js/61.59a3090c.chunk.js": "/static/js/61.59a3090c.chunk.js",
|
|
66
|
+
"static/js/62.858318f5.chunk.js": "/static/js/62.858318f5.chunk.js",
|
|
67
|
+
"static/js/63.443b52f8.chunk.js": "/static/js/63.443b52f8.chunk.js",
|
|
68
|
+
"static/js/64.f67bbf85.chunk.js": "/static/js/64.f67bbf85.chunk.js",
|
|
69
|
+
"static/js/65.f90a3a33.chunk.js": "/static/js/65.f90a3a33.chunk.js",
|
|
70
|
+
"static/js/66.fcf111a8.chunk.js": "/static/js/66.fcf111a8.chunk.js",
|
|
71
|
+
"static/js/67.f0af4760.chunk.js": "/static/js/67.f0af4760.chunk.js",
|
|
72
|
+
"static/js/68.4447a6c0.chunk.js": "/static/js/68.4447a6c0.chunk.js",
|
|
73
|
+
"static/js/69.f92b446d.chunk.js": "/static/js/69.f92b446d.chunk.js",
|
|
74
|
+
"static/js/70.fc10f889.chunk.js": "/static/js/70.fc10f889.chunk.js",
|
|
75
|
+
"static/js/71.0b66ff83.chunk.js": "/static/js/71.0b66ff83.chunk.js",
|
|
76
|
+
"static/js/72.75b6477f.chunk.js": "/static/js/72.75b6477f.chunk.js",
|
|
77
|
+
"static/js/73.ba5cd0ec.chunk.js": "/static/js/73.ba5cd0ec.chunk.js",
|
|
78
|
+
"static/js/74.69ee5648.chunk.js": "/static/js/74.69ee5648.chunk.js",
|
|
79
|
+
"static/js/75.0ee213ed.chunk.js": "/static/js/75.0ee213ed.chunk.js",
|
|
80
|
+
"static/js/76.03cc8251.chunk.js": "/static/js/76.03cc8251.chunk.js",
|
|
81
|
+
"static/js/77.9e0c615b.chunk.js": "/static/js/77.9e0c615b.chunk.js",
|
|
82
|
+
"static/js/78.e39822e2.chunk.js": "/static/js/78.e39822e2.chunk.js",
|
|
83
|
+
"static/js/79.47712414.chunk.js": "/static/js/79.47712414.chunk.js",
|
|
84
|
+
"static/js/80.03d3c44a.chunk.js": "/static/js/80.03d3c44a.chunk.js",
|
|
85
|
+
"static/js/81.3e86dcfc.chunk.js": "/static/js/81.3e86dcfc.chunk.js",
|
|
86
|
+
"static/js/82.d04a34d3.chunk.js": "/static/js/82.d04a34d3.chunk.js",
|
|
87
|
+
"static/js/83.ed876d1d.chunk.js": "/static/js/83.ed876d1d.chunk.js",
|
|
88
|
+
"static/js/84.22e9c594.chunk.js": "/static/js/84.22e9c594.chunk.js",
|
|
89
|
+
"static/js/85.d6790ffd.chunk.js": "/static/js/85.d6790ffd.chunk.js",
|
|
90
|
+
"static/js/86.f5ca5c0b.chunk.js": "/static/js/86.f5ca5c0b.chunk.js",
|
|
91
|
+
"static/js/87.6dbf41c6.chunk.js": "/static/js/87.6dbf41c6.chunk.js",
|
|
92
|
+
"static/js/88.0da244ee.chunk.js": "/static/js/88.0da244ee.chunk.js",
|
|
93
|
+
"static/js/89.40ea9ef2.chunk.js": "/static/js/89.40ea9ef2.chunk.js",
|
|
94
|
+
"static/js/90.58b50413.chunk.js": "/static/js/90.58b50413.chunk.js",
|
|
95
|
+
"static/js/91.d0607983.chunk.js": "/static/js/91.d0607983.chunk.js",
|
|
96
|
+
"static/js/92.b1941812.chunk.js": "/static/js/92.b1941812.chunk.js",
|
|
97
|
+
"static/js/93.cae75383.chunk.js": "/static/js/93.cae75383.chunk.js",
|
|
98
|
+
"static/js/94.babda4ae.chunk.js": "/static/js/94.babda4ae.chunk.js",
|
|
99
|
+
"static/js/95.0a85c04f.chunk.js": "/static/js/95.0a85c04f.chunk.js",
|
|
100
|
+
"static/js/96.e2d807e4.chunk.js": "/static/js/96.e2d807e4.chunk.js",
|
|
101
|
+
"static/js/97.37813ebb.chunk.js": "/static/js/97.37813ebb.chunk.js",
|
|
102
|
+
"static/js/98.6df7c8e0.chunk.js": "/static/js/98.6df7c8e0.chunk.js",
|
|
103
|
+
"static/js/99.62e4c9c4.chunk.js": "/static/js/99.62e4c9c4.chunk.js",
|
|
104
|
+
"static/js/100.da1920be.chunk.js": "/static/js/100.da1920be.chunk.js",
|
|
105
|
+
"static/js/101.2d460d94.chunk.js": "/static/js/101.2d460d94.chunk.js",
|
|
106
|
+
"static/js/102.f9a16c85.chunk.js": "/static/js/102.f9a16c85.chunk.js",
|
|
107
|
+
"static/js/103.d1ea5ba4.chunk.js": "/static/js/103.d1ea5ba4.chunk.js",
|
|
108
|
+
"static/js/104.a137d37d.chunk.js": "/static/js/104.a137d37d.chunk.js",
|
|
109
|
+
"static/js/105.28c03a34.chunk.js": "/static/js/105.28c03a34.chunk.js",
|
|
110
|
+
"static/js/106.37c81321.chunk.js": "/static/js/106.37c81321.chunk.js",
|
|
111
|
+
"static/js/107.3041ab4b.chunk.js": "/static/js/107.3041ab4b.chunk.js",
|
|
112
|
+
"static/js/108.ac4ab4c5.chunk.js": "/static/js/108.ac4ab4c5.chunk.js",
|
|
113
|
+
"static/js/109.de1a8c92.chunk.js": "/static/js/109.de1a8c92.chunk.js",
|
|
114
|
+
"static/js/110.e0fd9e71.chunk.js": "/static/js/110.e0fd9e71.chunk.js",
|
|
115
|
+
"index.html": "/index.html",
|
|
116
|
+
"static/js/12.69353b54.chunk.js.LICENSE.txt": "/static/js/12.69353b54.chunk.js.LICENSE.txt",
|
|
117
|
+
"static/media/book-solid.87f5b737.svg": "/static/media/book-solid.87f5b737.svg",
|
|
118
|
+
"static/media/compact-disc-solid.55b6e50c.svg": "/static/media/compact-disc-solid.55b6e50c.svg",
|
|
119
|
+
"static/media/deco-bg-map.7ca9103b.png": "/static/media/deco-bg-map.7ca9103b.png",
|
|
120
|
+
"static/media/all.css": "/static/media/fa-v4compatibility.68577e40.woff2",
|
|
121
|
+
"static/media/file-audio-solid.a76f99f0.svg": "/static/media/file-audio-solid.a76f99f0.svg",
|
|
122
|
+
"static/media/file-code-solid.62b467ac.svg": "/static/media/file-code-solid.62b467ac.svg",
|
|
123
|
+
"static/media/file-excel-solid.217d73db.svg": "/static/media/file-excel-solid.217d73db.svg",
|
|
124
|
+
"static/media/file-pdf-solid.0a9d75fe.svg": "/static/media/file-pdf-solid.0a9d75fe.svg",
|
|
125
|
+
"static/media/file-powerpoint-solid.4d969453.svg": "/static/media/file-powerpoint-solid.4d969453.svg",
|
|
126
|
+
"static/media/file-solid.6415173e.svg": "/static/media/file-solid.6415173e.svg",
|
|
127
|
+
"static/media/file-video-solid.312288cf.svg": "/static/media/file-video-solid.312288cf.svg",
|
|
128
|
+
"static/media/file-word-solid.9228e1ff.svg": "/static/media/file-word-solid.9228e1ff.svg",
|
|
129
|
+
"static/media/file-zipper-solid.7db57917.svg": "/static/media/file-zipper-solid.7db57917.svg",
|
|
130
|
+
"static/media/globe-africa-solid.0ad34146.svg": "/static/media/globe-africa-solid.0ad34146.svg",
|
|
131
|
+
"static/media/link-solid.7b689dbd.svg": "/static/media/link-solid.7b689dbd.svg",
|
|
132
|
+
"static/media/400.css": "/static/media/open-sans-vietnamese-400-normal.473f6b09.woff2",
|
|
133
|
+
"static/media/700.css": "/static/media/open-sans-vietnamese-700-normal.b4c5968d.woff2",
|
|
134
|
+
"static/media/800.css": "/static/media/open-sans-vietnamese-800-normal.27b69d87.woff2",
|
|
135
|
+
"static/media/search-solid.cc51b702.svg": "/static/media/search-solid.cc51b702.svg"
|
|
136
|
+
},
|
|
137
|
+
"entrypoints": [
|
|
138
|
+
"static/js/runtime-main.057f2c94.js",
|
|
139
|
+
"static/css/12.54474f95.chunk.css",
|
|
140
|
+
"static/js/12.69353b54.chunk.js",
|
|
141
|
+
"static/js/main.abaedb84.chunk.js"
|
|
142
|
+
]
|
|
143
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="32px" height="28px" viewBox="0 0 32 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<title>icon/check</title>
|
|
4
|
+
<g id="icon/check" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
5
|
+
<circle id="Oval" stroke="#E86666" stroke-width="3" cx="16" cy="14" r="10.5"></circle>
|
|
6
|
+
</g>
|
|
7
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="32px" height="28px" viewBox="0 0 32 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<title>icon/line</title>
|
|
4
|
+
<defs>
|
|
5
|
+
<rect id="path-1" x="8" y="13" width="16" height="3" rx="1.5"></rect>
|
|
6
|
+
</defs>
|
|
7
|
+
<g id="icon/line" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
8
|
+
<mask id="mask-2" fill="white">
|
|
9
|
+
<use xlink:href="#path-1"></use>
|
|
10
|
+
</mask>
|
|
11
|
+
<use id="Rectangle" fill="#E86666" xlink:href="#path-1"></use>
|
|
12
|
+
</g>
|
|
13
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="32px" height="28px" viewBox="0 0 32 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<title>icon/uncheck</title>
|
|
4
|
+
<g id="icon/uncheck" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
5
|
+
<circle id="Oval" fill="#E86666" cx="16" cy="14" r="12"></circle>
|
|
6
|
+
</g>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="32px" height="28px" viewBox="0 0 32 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<title>icon/view-1</title>
|
|
4
|
+
<defs>
|
|
5
|
+
<rect id="path-1" x="1" y="3" width="30" height="21" rx="3.5"></rect>
|
|
6
|
+
<path d="M16,3 L27.5,3 C29.4329966,3 31,4.56700338 31,6.5 L31,20.5 C31,22.4329966 29.4329966,24 27.5,24 L16,24 L16,24 L16,3 Z" id="path-3"></path>
|
|
7
|
+
</defs>
|
|
8
|
+
<g id="icon/view-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
9
|
+
<mask id="mask-2" fill="white">
|
|
10
|
+
<use xlink:href="#path-1"></use>
|
|
11
|
+
</mask>
|
|
12
|
+
<rect stroke="#D0D0D0" x="1.5" y="3.5" width="29" height="20" rx="3.5"></rect>
|
|
13
|
+
<mask id="mask-4" fill="white">
|
|
14
|
+
<use xlink:href="#path-3"></use>
|
|
15
|
+
</mask>
|
|
16
|
+
<use id="Rectangle" fill="#D0D0D0" xlink:href="#path-3"></use>
|
|
17
|
+
</g>
|
|
18
|
+
</svg>
|