tiro-notes 1.0.9 → 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.
Files changed (214) hide show
  1. package/README.md +75 -0
  2. package/cli.js +308 -2
  3. package/client/appicons/icons/mac/icon.icns +0 -0
  4. package/client/appicons/icons/png/1024x1024.png +0 -0
  5. package/client/appicons/icons/png/128x128.png +0 -0
  6. package/client/appicons/icons/png/16x16.png +0 -0
  7. package/client/appicons/icons/png/24x24.png +0 -0
  8. package/client/appicons/icons/png/256x256.png +0 -0
  9. package/client/appicons/icons/png/32x32.png +0 -0
  10. package/client/appicons/icons/png/48x48.png +0 -0
  11. package/client/appicons/icons/png/512x512.png +0 -0
  12. package/client/appicons/icons/png/64x64.png +0 -0
  13. package/client/appicons/icons/win/icon.ico +0 -0
  14. package/client/appicons/tiro_icon.icns +0 -0
  15. package/client/appicons/tiro_icon.ico +0 -0
  16. package/client/appicons/tiro_icon.png +0 -0
  17. package/client/asset-manifest.json +143 -0
  18. package/client/custom_icons/bottom-left.png +0 -0
  19. package/client/custom_icons/bottom-right.png +0 -0
  20. package/client/custom_icons/bottom.png +0 -0
  21. package/client/custom_icons/check.svg +7 -0
  22. package/client/custom_icons/left.png +0 -0
  23. package/client/custom_icons/line.svg +13 -0
  24. package/client/custom_icons/right.png +0 -0
  25. package/client/custom_icons/top-left.png +0 -0
  26. package/client/custom_icons/top-right.png +0 -0
  27. package/client/custom_icons/top.png +0 -0
  28. package/client/custom_icons/uncheck.svg +7 -0
  29. package/client/custom_icons/view-1.svg +18 -0
  30. package/client/custom_icons/view-2.svg +13 -0
  31. package/client/custom_icons/view-3.svg +13 -0
  32. package/client/custom_icons/view-4.svg +18 -0
  33. package/client/favicon.png +0 -0
  34. package/client/icon-192x192.png +0 -0
  35. package/client/icon-256x256.png +0 -0
  36. package/client/icon-384x384.png +0 -0
  37. package/client/icon-512x512.png +0 -0
  38. package/client/index.html +1 -0
  39. package/client/manifest.json +31 -0
  40. package/client/manifest.webmanifest +31 -0
  41. package/client/service-worker.js +63 -0
  42. package/client/static/css/12.54474f95.chunk.css +5 -0
  43. package/client/static/js/0.8818db75.chunk.js +1 -0
  44. package/client/static/js/1.dc212257.chunk.js +1 -0
  45. package/client/static/js/100.da1920be.chunk.js +1 -0
  46. package/client/static/js/101.2d460d94.chunk.js +1 -0
  47. package/client/static/js/102.f9a16c85.chunk.js +1 -0
  48. package/client/static/js/103.d1ea5ba4.chunk.js +1 -0
  49. package/client/static/js/104.a137d37d.chunk.js +1 -0
  50. package/client/static/js/105.28c03a34.chunk.js +1 -0
  51. package/client/static/js/106.37c81321.chunk.js +1 -0
  52. package/client/static/js/107.3041ab4b.chunk.js +1 -0
  53. package/client/static/js/108.ac4ab4c5.chunk.js +1 -0
  54. package/client/static/js/109.de1a8c92.chunk.js +1 -0
  55. package/client/static/js/110.e0fd9e71.chunk.js +1 -0
  56. package/client/static/js/12.69353b54.chunk.js +2 -0
  57. package/client/static/js/12.69353b54.chunk.js.LICENSE.txt +115 -0
  58. package/client/static/js/13.11233f89.chunk.js +1 -0
  59. package/client/static/js/14.4c6fecc8.chunk.js +1 -0
  60. package/client/static/js/15.54cce0d8.chunk.js +1 -0
  61. package/client/static/js/16.517ad23b.chunk.js +1 -0
  62. package/client/static/js/17.4e6d8e22.chunk.js +1 -0
  63. package/client/static/js/18.99a37042.chunk.js +1 -0
  64. package/client/static/js/19.004342b7.chunk.js +1 -0
  65. package/client/static/js/2.6e78ea89.chunk.js +1 -0
  66. package/client/static/js/20.400635c6.chunk.js +1 -0
  67. package/client/static/js/21.377bde95.chunk.js +1 -0
  68. package/client/static/js/22.97f27129.chunk.js +1 -0
  69. package/client/static/js/23.4ad8d0ec.chunk.js +1 -0
  70. package/client/static/js/24.d47656da.chunk.js +1 -0
  71. package/client/static/js/25.26949283.chunk.js +1 -0
  72. package/client/static/js/26.7e126fb1.chunk.js +1 -0
  73. package/client/static/js/27.85580870.chunk.js +1 -0
  74. package/client/static/js/28.72c93db3.chunk.js +1 -0
  75. package/client/static/js/29.80e40a62.chunk.js +1 -0
  76. package/client/static/js/3.664f336f.chunk.js +1 -0
  77. package/client/static/js/30.763b695b.chunk.js +1 -0
  78. package/client/static/js/31.8eaffd3a.chunk.js +1 -0
  79. package/client/static/js/32.cff2eb9f.chunk.js +1 -0
  80. package/client/static/js/33.70a11c37.chunk.js +1 -0
  81. package/client/static/js/34.ff9d1883.chunk.js +1 -0
  82. package/client/static/js/35.37436f63.chunk.js +1 -0
  83. package/client/static/js/36.83f9e51c.chunk.js +1 -0
  84. package/client/static/js/37.e9b848bc.chunk.js +1 -0
  85. package/client/static/js/38.80412b61.chunk.js +1 -0
  86. package/client/static/js/39.5299241a.chunk.js +1 -0
  87. package/client/static/js/4.328dd658.chunk.js +1 -0
  88. package/client/static/js/40.463e2602.chunk.js +1 -0
  89. package/client/static/js/41.87cc1e1b.chunk.js +1 -0
  90. package/client/static/js/42.9d2aaaf8.chunk.js +1 -0
  91. package/client/static/js/43.f55d6cd8.chunk.js +1 -0
  92. package/client/static/js/44.c769115a.chunk.js +1 -0
  93. package/client/static/js/45.cfaccbdb.chunk.js +1 -0
  94. package/client/static/js/46.04848b38.chunk.js +1 -0
  95. package/client/static/js/47.43108ad8.chunk.js +1 -0
  96. package/client/static/js/48.b0036b11.chunk.js +1 -0
  97. package/client/static/js/49.57012f8f.chunk.js +1 -0
  98. package/client/static/js/5.307b6480.chunk.js +1 -0
  99. package/client/static/js/50.d61bf562.chunk.js +1 -0
  100. package/client/static/js/51.8c2a739c.chunk.js +1 -0
  101. package/client/static/js/52.d60d6518.chunk.js +1 -0
  102. package/client/static/js/53.33e83e10.chunk.js +1 -0
  103. package/client/static/js/54.30726307.chunk.js +1 -0
  104. package/client/static/js/55.7e89444b.chunk.js +1 -0
  105. package/client/static/js/56.ad8541df.chunk.js +1 -0
  106. package/client/static/js/57.9fcc16d5.chunk.js +1 -0
  107. package/client/static/js/58.3a4458c1.chunk.js +1 -0
  108. package/client/static/js/59.d5ea8728.chunk.js +1 -0
  109. package/client/static/js/6.db56389b.chunk.js +1 -0
  110. package/client/static/js/60.96160883.chunk.js +1 -0
  111. package/client/static/js/61.59a3090c.chunk.js +1 -0
  112. package/client/static/js/62.858318f5.chunk.js +1 -0
  113. package/client/static/js/63.443b52f8.chunk.js +1 -0
  114. package/client/static/js/64.f67bbf85.chunk.js +1 -0
  115. package/client/static/js/65.f90a3a33.chunk.js +1 -0
  116. package/client/static/js/66.fcf111a8.chunk.js +1 -0
  117. package/client/static/js/67.f0af4760.chunk.js +1 -0
  118. package/client/static/js/68.4447a6c0.chunk.js +1 -0
  119. package/client/static/js/69.f92b446d.chunk.js +1 -0
  120. package/client/static/js/7.83cb847e.chunk.js +1 -0
  121. package/client/static/js/70.fc10f889.chunk.js +1 -0
  122. package/client/static/js/71.0b66ff83.chunk.js +1 -0
  123. package/client/static/js/72.75b6477f.chunk.js +1 -0
  124. package/client/static/js/73.ba5cd0ec.chunk.js +1 -0
  125. package/client/static/js/74.69ee5648.chunk.js +1 -0
  126. package/client/static/js/75.0ee213ed.chunk.js +1 -0
  127. package/client/static/js/76.03cc8251.chunk.js +1 -0
  128. package/client/static/js/77.9e0c615b.chunk.js +1 -0
  129. package/client/static/js/78.e39822e2.chunk.js +1 -0
  130. package/client/static/js/79.47712414.chunk.js +1 -0
  131. package/client/static/js/8.959dc24d.chunk.js +1 -0
  132. package/client/static/js/80.03d3c44a.chunk.js +1 -0
  133. package/client/static/js/81.3e86dcfc.chunk.js +1 -0
  134. package/client/static/js/82.d04a34d3.chunk.js +1 -0
  135. package/client/static/js/83.ed876d1d.chunk.js +1 -0
  136. package/client/static/js/84.22e9c594.chunk.js +1 -0
  137. package/client/static/js/85.d6790ffd.chunk.js +1 -0
  138. package/client/static/js/86.f5ca5c0b.chunk.js +1 -0
  139. package/client/static/js/87.6dbf41c6.chunk.js +1 -0
  140. package/client/static/js/88.0da244ee.chunk.js +1 -0
  141. package/client/static/js/89.40ea9ef2.chunk.js +1 -0
  142. package/client/static/js/9.d4911eb8.chunk.js +1 -0
  143. package/client/static/js/90.58b50413.chunk.js +1 -0
  144. package/client/static/js/91.d0607983.chunk.js +1 -0
  145. package/client/static/js/92.b1941812.chunk.js +1 -0
  146. package/client/static/js/93.cae75383.chunk.js +1 -0
  147. package/client/static/js/94.babda4ae.chunk.js +1 -0
  148. package/client/static/js/95.0a85c04f.chunk.js +1 -0
  149. package/client/static/js/96.e2d807e4.chunk.js +1 -0
  150. package/client/static/js/97.37813ebb.chunk.js +1 -0
  151. package/client/static/js/98.6df7c8e0.chunk.js +1 -0
  152. package/client/static/js/99.62e4c9c4.chunk.js +1 -0
  153. package/client/static/js/main.abaedb84.chunk.js +1 -0
  154. package/client/static/js/runtime-main.057f2c94.js +1 -0
  155. package/client/static/media/book-solid.87f5b737.svg +1 -0
  156. package/client/static/media/compact-disc-solid.55b6e50c.svg +1 -0
  157. package/client/static/media/deco-bg-map.7ca9103b.png +0 -0
  158. package/client/static/media/fa-brands-400.150de8ea.ttf +0 -0
  159. package/client/static/media/fa-brands-400.e033a13e.woff2 +0 -0
  160. package/client/static/media/fa-regular-400.3223dc79.woff2 +0 -0
  161. package/client/static/media/fa-regular-400.d8747423.ttf +0 -0
  162. package/client/static/media/fa-solid-900.4a2cd718.ttf +0 -0
  163. package/client/static/media/fa-solid-900.bb975c96.woff2 +0 -0
  164. package/client/static/media/fa-v4compatibility.0e3a648b.ttf +0 -0
  165. package/client/static/media/fa-v4compatibility.68577e40.woff2 +0 -0
  166. package/client/static/media/file-audio-solid.a76f99f0.svg +1 -0
  167. package/client/static/media/file-code-solid.62b467ac.svg +1 -0
  168. package/client/static/media/file-excel-solid.217d73db.svg +1 -0
  169. package/client/static/media/file-pdf-solid.0a9d75fe.svg +1 -0
  170. package/client/static/media/file-powerpoint-solid.4d969453.svg +1 -0
  171. package/client/static/media/file-solid.6415173e.svg +1 -0
  172. package/client/static/media/file-video-solid.312288cf.svg +1 -0
  173. package/client/static/media/file-word-solid.9228e1ff.svg +1 -0
  174. package/client/static/media/file-zipper-solid.7db57917.svg +1 -0
  175. package/client/static/media/globe-africa-solid.0ad34146.svg +1 -0
  176. package/client/static/media/link-solid.7b689dbd.svg +1 -0
  177. package/client/static/media/open-sans-all-400-normal.cb2542fc.woff +0 -0
  178. package/client/static/media/open-sans-all-700-normal.105e4309.woff +0 -0
  179. package/client/static/media/open-sans-all-800-normal.86e783c7.woff +0 -0
  180. package/client/static/media/open-sans-cyrillic-400-normal.5a546777.woff2 +0 -0
  181. package/client/static/media/open-sans-cyrillic-700-normal.2cf6253f.woff2 +0 -0
  182. package/client/static/media/open-sans-cyrillic-800-normal.41902933.woff2 +0 -0
  183. package/client/static/media/open-sans-cyrillic-ext-400-normal.01b11c56.woff2 +0 -0
  184. package/client/static/media/open-sans-cyrillic-ext-700-normal.00b4dd17.woff2 +0 -0
  185. package/client/static/media/open-sans-cyrillic-ext-800-normal.2c1c4cc5.woff2 +0 -0
  186. package/client/static/media/open-sans-greek-400-normal.3064bf7e.woff2 +0 -0
  187. package/client/static/media/open-sans-greek-700-normal.a0312547.woff2 +0 -0
  188. package/client/static/media/open-sans-greek-800-normal.d60c6496.woff2 +0 -0
  189. package/client/static/media/open-sans-greek-ext-400-normal.1ed998a4.woff2 +0 -0
  190. package/client/static/media/open-sans-greek-ext-700-normal.8850c90c.woff2 +0 -0
  191. package/client/static/media/open-sans-greek-ext-800-normal.fe3583f2.woff2 +0 -0
  192. package/client/static/media/open-sans-hebrew-400-normal.daafcec8.woff2 +0 -0
  193. package/client/static/media/open-sans-hebrew-700-normal.3befb44d.woff2 +0 -0
  194. package/client/static/media/open-sans-hebrew-800-normal.bfe88fed.woff2 +0 -0
  195. package/client/static/media/open-sans-latin-400-normal.a1535f45.woff2 +0 -0
  196. package/client/static/media/open-sans-latin-700-normal.b245bc85.woff2 +0 -0
  197. package/client/static/media/open-sans-latin-800-normal.185f6b03.woff2 +0 -0
  198. package/client/static/media/open-sans-latin-ext-400-normal.ccfa20f8.woff2 +0 -0
  199. package/client/static/media/open-sans-latin-ext-700-normal.64471a17.woff2 +0 -0
  200. package/client/static/media/open-sans-latin-ext-800-normal.988eae1a.woff2 +0 -0
  201. package/client/static/media/open-sans-vietnamese-400-normal.473f6b09.woff2 +0 -0
  202. package/client/static/media/open-sans-vietnamese-700-normal.b4c5968d.woff2 +0 -0
  203. package/client/static/media/open-sans-vietnamese-800-normal.27b69d87.woff2 +0 -0
  204. package/client/static/media/search-solid.cc51b702.svg +1 -0
  205. package/client/tiro-local.crt +20 -0
  206. package/package.json +26 -11
  207. package/server/ssl/tiro-local.crt +18 -0
  208. package/server/ssl/tiro-local.key +28 -0
  209. package/server/tiro-server.js +2 -0
  210. package/server/tiro-server.js.LICENSE.txt +315 -0
  211. package/shared.helpers.build.js +177 -0
  212. package/index.html +0 -0
  213. package/index.js +0 -4
  214. 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
+ ![Tiro 0.30](https://github.com/dotgreg/tiro-notes/assets/2981891/9e684988-5575-428f-8499-d11ad6637c71)
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
- const testlog = require('./index.js');
3
- testlog();
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
@@ -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
@@ -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
@@ -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>