@silexlabs/silex 3.0.1-alpha.0 → 3.0.1

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 (323) hide show
  1. package/.env.default +20 -0
  2. package/.silex.js +67 -8
  3. package/LICENSE +661 -203
  4. package/README.md +37 -35
  5. package/dist/client/client/api.d.ts +90 -0
  6. package/dist/client/client/assetUrl.d.ts +54 -0
  7. package/dist/client/client/config.d.ts +102 -0
  8. package/dist/client/client/events.d.ts +23 -0
  9. package/dist/client/client/expose.d.ts +8 -0
  10. package/dist/client/client/grapesjs/LoginDialog.d.ts +15 -0
  11. package/dist/client/client/grapesjs/PublicationManager.d.ts +73 -0
  12. package/dist/client/client/grapesjs/PublicationUi.d.ts +59 -0
  13. package/dist/client/client/grapesjs/blocks.d.ts +1 -0
  14. package/dist/client/client/grapesjs/breadcrumbs.d.ts +1 -0
  15. package/dist/client/client/grapesjs/css-props.d.ts +6 -0
  16. package/dist/client/client/grapesjs/footer.d.ts +2 -0
  17. package/dist/client/client/grapesjs/img.d.ts +6 -0
  18. package/dist/client/client/grapesjs/index.d.ts +9 -0
  19. package/dist/client/client/grapesjs/internal-links.d.ts +1 -0
  20. package/dist/client/client/grapesjs/keymaps.d.ts +123 -0
  21. package/dist/client/client/grapesjs/new-page-dialog.d.ts +2 -0
  22. package/dist/client/client/grapesjs/openImport.d.ts +9 -0
  23. package/dist/client/client/grapesjs/page-panel.d.ts +9 -0
  24. package/dist/client/client/grapesjs/project-bar.d.ts +21 -0
  25. package/dist/client/client/grapesjs/resize-panel.d.ts +1 -0
  26. package/dist/client/client/grapesjs/rich-text.d.ts +4 -0
  27. package/dist/client/client/grapesjs/semantic.d.ts +1 -0
  28. package/dist/client/client/grapesjs/settings-sections.d.ts +16 -0
  29. package/dist/client/client/grapesjs/settings.d.ts +4 -0
  30. package/dist/client/client/grapesjs/storage.d.ts +2 -0
  31. package/dist/client/client/grapesjs/symbolDialogs.d.ts +3 -0
  32. package/dist/client/client/grapesjs/view-buttons.d.ts +1 -0
  33. package/dist/client/client/index.d.ts +10 -0
  34. package/dist/client/client/publication-transformers.d.ts +42 -0
  35. package/dist/client/client/publish-custom-code-block.d.ts +4 -0
  36. package/dist/client/client/publish-fonts.d.ts +4 -0
  37. package/dist/client/client/utils.d.ts +22 -0
  38. package/dist/client/constants.d.ts +32 -0
  39. package/dist/client/css/admin.css +1114 -328
  40. package/dist/client/css/admin.css.map +1 -0
  41. package/dist/client/grapesjs-filter-styles/dist/index.d.ts +4 -0
  42. package/dist/client/grapesjs-fonts/dist/index.d.ts +4 -0
  43. package/dist/client/grapesjs-fonts/src/commands.d.ts +3 -0
  44. package/dist/client/grapesjs-fonts/src/fonts.d.ts +4 -0
  45. package/dist/client/grapesjs-storage-rate-limit/dist/index.d.ts +4 -0
  46. package/dist/client/grapesjs-ui-suggest-classes/dist/index.d.ts +4 -0
  47. package/dist/client/index.html +3 -2
  48. package/dist/client/js/main.js +356 -131
  49. package/dist/client/js/main.js.LICENSE.txt +15 -1
  50. package/dist/client/page.d.ts +2 -0
  51. package/dist/client/silex-lib/src/ts/client/api.d.ts +90 -0
  52. package/dist/client/silex-lib/src/ts/client/assetUrl.d.ts +54 -0
  53. package/dist/client/silex-lib/src/ts/client/config.d.ts +102 -0
  54. package/dist/client/silex-lib/src/ts/client/events.d.ts +23 -0
  55. package/dist/client/silex-lib/src/ts/client/expose.d.ts +8 -0
  56. package/dist/client/silex-lib/src/ts/client/grapesjs/LoginDialog.d.ts +15 -0
  57. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationManager.d.ts +73 -0
  58. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationUi.d.ts +59 -0
  59. package/dist/client/silex-lib/src/ts/client/grapesjs/blocks.d.ts +1 -0
  60. package/dist/client/silex-lib/src/ts/client/grapesjs/breadcrumbs.d.ts +1 -0
  61. package/dist/client/silex-lib/src/ts/client/grapesjs/css-props.d.ts +6 -0
  62. package/dist/client/silex-lib/src/ts/client/grapesjs/footer.d.ts +2 -0
  63. package/dist/client/silex-lib/src/ts/client/grapesjs/img.d.ts +6 -0
  64. package/dist/client/silex-lib/src/ts/client/grapesjs/index.d.ts +9 -0
  65. package/dist/client/silex-lib/src/ts/client/grapesjs/internal-links.d.ts +1 -0
  66. package/dist/client/silex-lib/src/ts/client/grapesjs/keymaps.d.ts +123 -0
  67. package/dist/client/silex-lib/src/ts/client/grapesjs/new-page-dialog.d.ts +2 -0
  68. package/dist/client/silex-lib/src/ts/client/grapesjs/openImport.d.ts +9 -0
  69. package/dist/client/silex-lib/src/ts/client/grapesjs/page-panel.d.ts +9 -0
  70. package/dist/client/silex-lib/src/ts/client/grapesjs/project-bar.d.ts +21 -0
  71. package/dist/client/silex-lib/src/ts/client/grapesjs/resize-panel.d.ts +1 -0
  72. package/dist/client/silex-lib/src/ts/client/grapesjs/rich-text.d.ts +4 -0
  73. package/dist/client/silex-lib/src/ts/client/grapesjs/semantic.d.ts +1 -0
  74. package/dist/client/silex-lib/src/ts/client/grapesjs/settings-sections.d.ts +16 -0
  75. package/dist/client/silex-lib/src/ts/client/grapesjs/settings.d.ts +4 -0
  76. package/dist/client/silex-lib/src/ts/client/grapesjs/storage.d.ts +2 -0
  77. package/dist/client/silex-lib/src/ts/client/grapesjs/symbolDialogs.d.ts +3 -0
  78. package/dist/client/silex-lib/src/ts/client/grapesjs/view-buttons.d.ts +1 -0
  79. package/dist/client/silex-lib/src/ts/client/index.d.ts +10 -0
  80. package/dist/client/silex-lib/src/ts/client/publication-transformers.d.ts +42 -0
  81. package/dist/client/silex-lib/src/ts/client/publish-custom-code-block.d.ts +4 -0
  82. package/dist/client/silex-lib/src/ts/client/publish-fonts.d.ts +4 -0
  83. package/dist/client/silex-lib/src/ts/client/utils.d.ts +22 -0
  84. package/dist/client/silex-lib/src/ts/constants.d.ts +32 -0
  85. package/dist/client/silex-lib/src/ts/page.d.ts +2 -0
  86. package/dist/client/silex-lib/src/ts/types.d.ts +339 -0
  87. package/dist/client/types.d.ts +339 -0
  88. package/dist/plugins/client/client/events.d.ts +23 -0
  89. package/dist/plugins/client/client/events.js +43 -0
  90. package/dist/plugins/client/client/events.js.map +1 -0
  91. package/dist/plugins/client/plugins/client/template.d.ts +2 -0
  92. package/dist/plugins/client/plugins/client/template.js +234 -0
  93. package/dist/plugins/client/plugins/client/template.js.map +1 -0
  94. package/dist/plugins/client/plugins/client/website-info.d.ts +1 -0
  95. package/dist/plugins/client/plugins/client/website-info.js +72 -0
  96. package/dist/plugins/client/plugins/client/website-info.js.map +1 -0
  97. package/dist/plugins/client/types.d.ts +339 -0
  98. package/dist/plugins/client/types.js +80 -0
  99. package/dist/plugins/client/types.js.map +1 -0
  100. package/dist/plugins/server/constants.d.ts +32 -0
  101. package/dist/plugins/server/constants.js +76 -0
  102. package/dist/plugins/server/constants.js.map +1 -0
  103. package/dist/plugins/server/plugins/server/Cache.d.ts +2 -0
  104. package/dist/plugins/server/plugins/server/Cache.js +36 -0
  105. package/dist/plugins/server/plugins/server/Cache.js.map +1 -0
  106. package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +29 -0
  107. package/dist/plugins/server/plugins/server/DownloadConnector.js +127 -0
  108. package/dist/plugins/server/plugins/server/DownloadConnector.js.map +1 -0
  109. package/dist/plugins/server/plugins/server/FtpConnector.d.ts +86 -0
  110. package/dist/plugins/server/plugins/server/FtpConnector.js +536 -0
  111. package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -0
  112. package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +135 -0
  113. package/dist/plugins/server/plugins/server/GitlabConnector.js +649 -0
  114. package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -0
  115. package/dist/plugins/server/plugins/server/GitlabHostingConnector.d.ts +16 -0
  116. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js +209 -0
  117. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js.map +1 -0
  118. package/dist/plugins/server/plugins/server/PublicationOptimizer.d.ts +0 -0
  119. package/dist/plugins/server/plugins/server/PublicationOptimizer.js +14 -0
  120. package/dist/plugins/server/plugins/server/PublicationOptimizer.js.map +1 -0
  121. package/dist/plugins/server/plugins/server/SslPlugin.d.ts +1 -0
  122. package/dist/plugins/server/plugins/server/SslPlugin.js +86 -0
  123. package/dist/plugins/server/plugins/server/SslPlugin.js.map +1 -0
  124. package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +8 -0
  125. package/dist/plugins/server/plugins/server/StaticPlugin.js +45 -0
  126. package/dist/plugins/server/plugins/server/StaticPlugin.js.map +1 -0
  127. package/dist/plugins/server/server/config.d.ts +59 -0
  128. package/dist/plugins/server/server/config.js +181 -0
  129. package/dist/plugins/server/server/config.js.map +1 -0
  130. package/dist/plugins/server/server/connectors/FsHosting.d.ts +14 -0
  131. package/dist/plugins/server/server/connectors/FsHosting.js +66 -0
  132. package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -0
  133. package/dist/plugins/server/server/connectors/FsStorage.d.ts +44 -0
  134. package/dist/plugins/server/server/connectors/FsStorage.js +261 -0
  135. package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -0
  136. package/dist/plugins/server/server/connectors/connectors.d.ts +86 -0
  137. package/dist/plugins/server/server/connectors/connectors.js +126 -0
  138. package/dist/plugins/server/server/connectors/connectors.js.map +1 -0
  139. package/dist/plugins/server/server/events.d.ts +26 -0
  140. package/dist/plugins/server/server/events.js +31 -0
  141. package/dist/plugins/server/server/events.js.map +1 -0
  142. package/dist/plugins/server/server/jobs.d.ts +12 -0
  143. package/dist/plugins/server/server/jobs.js +79 -0
  144. package/dist/plugins/server/server/jobs.js.map +1 -0
  145. package/dist/plugins/server/server/utils/validation.d.ts +7 -0
  146. package/dist/plugins/server/server/utils/validation.js +37 -0
  147. package/dist/plugins/server/server/utils/validation.js.map +1 -0
  148. package/dist/plugins/server/types.d.ts +339 -0
  149. package/dist/plugins/server/types.js +84 -0
  150. package/dist/plugins/server/types.js.map +1 -0
  151. package/dist/server/constants.js +55 -0
  152. package/dist/server/plugins/server/Cache.js +19 -0
  153. package/dist/server/server/api/api.js +20 -0
  154. package/dist/server/server/api/connectorApi.js +334 -0
  155. package/dist/server/server/api/publicationApi.js +106 -0
  156. package/dist/server/server/api/websiteApi.js +315 -0
  157. package/dist/server/server/cli.js +71 -0
  158. package/dist/server/server/config.js +120 -0
  159. package/dist/server/server/connectors/FsHosting.js +47 -0
  160. package/dist/server/server/connectors/FsStorage.js +228 -0
  161. package/dist/server/server/connectors/connectors.js +88 -0
  162. package/dist/server/server/events.js +14 -0
  163. package/dist/server/server/expose.js +27 -0
  164. package/dist/server/server/express.js +46 -0
  165. package/dist/server/server/index.js +94 -0
  166. package/dist/server/server/jobs.js +50 -0
  167. package/dist/server/server/utils/validation.js +14 -0
  168. package/dist/server/types.js +40 -0
  169. package/package.json +99 -49
  170. package/public/assets/download.png +0 -0
  171. package/public/assets/favicon.ico +0 -0
  172. package/public/assets/favicon.png +0 -0
  173. package/public/assets/ftp.png +0 -0
  174. package/public/assets/gitlab.png +0 -0
  175. package/public/assets/gitlab2.png +0 -0
  176. package/public/assets/laptop.png +0 -0
  177. package/public/assets/logo-silex-small.png +0 -0
  178. package/public/silex.js +22 -23
  179. package/src/css/_variables.scss +24 -20
  180. package/src/css/dialog.scss +35 -2
  181. package/src/css/fonts.scss +31 -0
  182. package/src/css/footer.scss +12 -0
  183. package/src/css/grapesjs-light.scss +180 -0
  184. package/src/css/grapesjs-plugins.scss +227 -0
  185. package/src/css/grapesjs.scss +159 -1
  186. package/src/css/index.scss +12 -1
  187. package/src/css/light.scss +7 -0
  188. package/src/css/loader.scss +2 -0
  189. package/src/css/project-bar.scss +32 -16
  190. package/src/css/silex.scss +79 -5
  191. package/src/css/website-info.scss +14 -0
  192. package/src/html/index.pug +3 -3
  193. package/src/html/templates/includes.pug +0 -1
  194. package/src/ts/client/api.ts +156 -0
  195. package/src/ts/client/assetUrl.test.ts +164 -0
  196. package/src/ts/client/assetUrl.ts +254 -0
  197. package/src/ts/client/config.ts +175 -13
  198. package/src/ts/client/events.ts +43 -0
  199. package/src/ts/client/expose.ts +27 -1
  200. package/src/ts/client/grapesjs/LoginDialog.ts +204 -0
  201. package/src/ts/client/grapesjs/PublicationManager.ts +433 -0
  202. package/src/ts/client/grapesjs/PublicationUi.ts +366 -0
  203. package/src/ts/client/grapesjs/blocks.ts +17 -0
  204. package/src/ts/client/grapesjs/breadcrumbs.ts +79 -0
  205. package/src/ts/client/grapesjs/css-props.ts +910 -0
  206. package/src/ts/client/grapesjs/eleventy.ts +30 -7
  207. package/src/ts/client/grapesjs/footer.ts +42 -0
  208. package/src/ts/client/grapesjs/img.ts +147 -0
  209. package/src/ts/client/grapesjs/index.ts +311 -122
  210. package/src/ts/client/grapesjs/internal-links.test.ts +19 -1
  211. package/src/ts/client/grapesjs/internal-links.ts +31 -7
  212. package/src/ts/client/grapesjs/keymaps.ts +207 -0
  213. package/src/ts/client/grapesjs/new-page-dialog.ts +19 -3
  214. package/src/ts/client/grapesjs/openImport.ts +22 -0
  215. package/src/ts/client/grapesjs/page-panel.ts +109 -7
  216. package/src/ts/client/grapesjs/project-bar.ts +133 -72
  217. package/src/ts/client/grapesjs/resize-panel.ts +20 -0
  218. package/src/ts/client/grapesjs/rich-text.ts +38 -13
  219. package/src/ts/client/grapesjs/semantic.ts +20 -3
  220. package/src/ts/client/grapesjs/settings-sections.ts +117 -0
  221. package/src/ts/client/grapesjs/settings.ts +191 -96
  222. package/src/ts/client/grapesjs/storage.ts +187 -0
  223. package/src/ts/client/grapesjs/symbolDialogs.ts +21 -5
  224. package/src/ts/client/grapesjs/view-buttons.ts +42 -0
  225. package/src/ts/client/index.ts +80 -21
  226. package/src/ts/client/publication-transformers.test.ts +207 -0
  227. package/src/ts/client/publication-transformers.ts +280 -0
  228. package/src/ts/client/publish-custom-code-block.ts +31 -0
  229. package/src/ts/client/publish-fonts.ts +36 -0
  230. package/src/ts/client/utils.ts +70 -1
  231. package/src/ts/constants.ts +78 -0
  232. package/src/ts/externs.ts +17 -0
  233. package/src/ts/page.ts +20 -3
  234. package/src/ts/plugins/client/template.ts +246 -0
  235. package/src/ts/plugins/client/website-info.ts +84 -0
  236. package/src/ts/plugins/server/Cache.ts +32 -0
  237. package/src/ts/plugins/server/DownloadConnector.ts +146 -0
  238. package/src/ts/plugins/server/FtpConnector.test.ts +82 -0
  239. package/src/ts/plugins/server/FtpConnector.ts +621 -0
  240. package/src/ts/plugins/server/GitlabConnector.ts +749 -0
  241. package/src/ts/plugins/server/GitlabHostingConnector.ts +215 -0
  242. package/src/ts/plugins/server/PublicationOptimizer.ts +14 -0
  243. package/src/ts/plugins/server/SslPlugin.ts +84 -0
  244. package/src/ts/plugins/server/StaticPlugin.ts +45 -0
  245. package/src/ts/server/api/api.ts +19 -0
  246. package/src/ts/server/api/connectorApi.ts +464 -0
  247. package/src/ts/server/api/publicationApi.ts +159 -0
  248. package/src/ts/server/api/websiteApi.ts +462 -0
  249. package/src/ts/server/cli.ts +48 -14
  250. package/src/ts/server/config.ts +158 -60
  251. package/src/ts/server/connectors/FsHosting.ts +66 -0
  252. package/src/ts/server/connectors/FsStorage.test.ts +51 -0
  253. package/src/ts/server/connectors/FsStorage.ts +290 -0
  254. package/src/ts/server/connectors/connectors.ts +203 -0
  255. package/src/ts/server/events.ts +37 -0
  256. package/src/ts/server/expose.ts +19 -0
  257. package/src/ts/server/express.ts +57 -5
  258. package/src/ts/server/index.ts +79 -16
  259. package/src/ts/server/jobs.test.ts +75 -0
  260. package/src/ts/server/jobs.ts +89 -0
  261. package/src/ts/server/utils/BackwardCompat.ts +546 -528
  262. package/src/ts/server/utils/validation.ts +34 -0
  263. package/src/ts/types.ts +295 -85
  264. package/.dockerignore +0 -5
  265. package/.editorconfig +0 -14
  266. package/.eslintrc.json +0 -43
  267. package/.github/FUNDING.yml +0 -13
  268. package/.github/workflows/docker-hub-publish.yml +0 -36
  269. package/.github/workflows/npm-publish.yml +0 -19
  270. package/.github/workflows/test.yml +0 -26
  271. package/.nvmrc +0 -1
  272. package/.silex/default/.silex.data.json +0 -1
  273. package/CODE_OF_CONDUCT.md +0 -128
  274. package/CONTRIBUTING.md +0 -131
  275. package/Dockerfile +0 -15
  276. package/directus.silex.js +0 -7
  277. package/dist/constants.js +0 -4
  278. package/dist/events.js +0 -5
  279. package/dist/page.js +0 -15
  280. package/dist/server/cli.js +0 -43
  281. package/dist/server/config.js +0 -70
  282. package/dist/server/express.js +0 -18
  283. package/dist/server/index.js +0 -58
  284. package/dist/types.js +0 -34
  285. package/jest.config.js +0 -10
  286. package/logos/logo_by_ceubri/silex-icon-2018@200px.png +0 -0
  287. package/logos/logo_by_ceubri/silex-icon-2018@4x.png +0 -0
  288. package/logos/logo_by_ceubri/silex-logo-2018-white-transp.pdf +0 -0
  289. package/logos/logo_by_ceubri/silex-logo-2018-white.jpg +0 -0
  290. package/logos/logo_by_ceubri/silex-logo-2018-white.pdf +0 -0
  291. package/logos/logo_by_ceubri/silex-logo-2018-white.png +0 -0
  292. package/logos/logo_by_ceubri/silex-logo-2018-white@0.5x.png +0 -0
  293. package/logos/logo_by_ceubri/silex-logo-2018-white@0.75x.png +0 -0
  294. package/logos/logo_by_ceubri/silex-logo-2018-white@4x.jpg +0 -0
  295. package/logos/logo_by_ceubri/silex-logo-2018-white@4x.png +0 -0
  296. package/logos/logo_by_ceubri/silex-logo-2018.ai +5 -2521
  297. package/logos/logo_by_ceubri/silex-logo-2018.jpg +0 -0
  298. package/logos/logo_by_ceubri/silex-logo-2018.pdf +0 -0
  299. package/logos/logo_by_ceubri/silex-logo-2018.png +0 -0
  300. package/logos/logo_by_ceubri/silex-logo-2018@0.5x.png +0 -0
  301. package/logos/logo_by_ceubri/silex-logo-2018@0.75x.png +0 -0
  302. package/logos/logo_by_ceubri/silex-logo-2018@4x.jpg +0 -0
  303. package/logos/logo_by_ceubri/silex-logo-2018@4x.png +0 -0
  304. package/logos/silexlabs.png +0 -0
  305. package/src/example-client-config.js +0 -47
  306. package/src/plugins/AuthPlugin.js +0 -21
  307. package/src/plugins/Cache.js +0 -11
  308. package/src/plugins/DefaultBackend.js +0 -149
  309. package/src/plugins/ExpressPlugin.js +0 -39
  310. package/src/plugins/HooksPlugin.js +0 -58
  311. package/src/plugins/PublishPlugin.js +0 -69
  312. package/src/plugins/SslPlugin.js +0 -66
  313. package/src/plugins/StaticPlugin.js +0 -48
  314. package/src/plugins/WebsitePlugin.js +0 -207
  315. package/src/ts/client/grapesjs/publish.ts +0 -386
  316. package/src/ts/client/grapesjs/template.ts +0 -166
  317. package/src/ts/events.ts +0 -2
  318. package/tsconfig-server-debug.json +0 -19
  319. package/tsconfig-server-release.json +0 -19
  320. package/tsconfig.jest.json +0 -9
  321. package/tsconfig.json +0 -26
  322. package/webpack.config.js +0 -28
  323. package/webpack.debug.config.js +0 -8
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /*
3
+ * Silex website builder, free/libre no-code tool for makers.
4
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.ServerConfig = void 0;
20
+ /**
21
+ * @fileoverview This is where the default config is defined. Also use this object as an event emitter to listen to Silex events
22
+ * The values can be overriden with env vars or before passing the config to Silex
23
+ */
24
+ /**
25
+ * @class default config for Silex server
26
+ */
27
+ const silex_plugins_1 = require("@silexlabs/silex-plugins");
28
+ const path_1 = require("path");
29
+ const constants_1 = require("../constants");
30
+ const promises_1 = require("fs/promises");
31
+ const connectors_1 = require("./connectors/connectors");
32
+ const FsStorage_1 = require("./connectors/FsStorage");
33
+ const types_1 = require("../types");
34
+ const FsHosting_1 = require("./connectors/FsHosting");
35
+ /**
36
+ * Config types definitions
37
+ */
38
+ class ServerConfig extends silex_plugins_1.Config {
39
+ expressOptions = {
40
+ jsonLimit: process.env.SILEX_EXPRESS_JSON_LIMIT,
41
+ textLimit: process.env.SILEX_EXPRESS_TEXT_LIMIT,
42
+ urlencodedLimit: process.env.SILEX_EXPRESS_URLENCODED_LIMIT,
43
+ sessionName: process.env.SILEX_SESSION_NAME,
44
+ sessionSecret: process.env.SILEX_SESSION_SECRET,
45
+ cors: process.env.SILEX_CORS_URL,
46
+ };
47
+ port = process.env.SILEX_PORT;
48
+ debug = process.env.SILEX_DEBUG === 'true';
49
+ url = process.env.SILEX_URL?.replace(/\/$/, '') ?? `${process.env.SILEX_PROTOCOL}://${process.env.SILEX_HOST}:${process.env.SILEX_PORT}`;
50
+ userConfigPath = process.env.SILEX_SERVER_CONFIG;
51
+ configFilePath = (0, path_1.resolve)(__dirname, '../../../.silex.js');
52
+ // All connectors or just the storage or hosting connectors
53
+ getConnectors(type = null) {
54
+ // All connectors including storage and hosting connectors
55
+ if (!type) {
56
+ // Concat storage and hosting connectors
57
+ const allConnectors = this.getStorageConnectors().concat(this.getHostingConnectors());
58
+ // Remove duplicates (if a connector is both a storage and a hosting connector)
59
+ return [...new Set(allConnectors)];
60
+ }
61
+ // Convert to enum in case it is a string
62
+ const connectorType = (0, connectors_1.toConnectorEnum)(type.toString());
63
+ // Only one type of connector
64
+ switch (connectorType) {
65
+ case types_1.ConnectorType.HOSTING: return this.getHostingConnectors();
66
+ case types_1.ConnectorType.STORAGE: return this.getStorageConnectors();
67
+ default: throw new Error(`Unknown connector type ${type}`);
68
+ }
69
+ }
70
+ // Storage connectors to store the website data and assets
71
+ storageConnectors = [];
72
+ addStorageConnector(storage) {
73
+ this.setStorageConnectors(this.storageConnectors.concat(storage));
74
+ }
75
+ setStorageConnectors(storageConnectors) {
76
+ this.storageConnectors = storageConnectors;
77
+ }
78
+ getStorageConnectors() {
79
+ return this.storageConnectors;
80
+ }
81
+ // Hosting connectors to publish the website online
82
+ hostingConnectors = [];
83
+ addHostingConnector(hosting) {
84
+ this.setHostingConnectors(this.hostingConnectors.concat(hosting));
85
+ }
86
+ setHostingConnectors(hostings) {
87
+ this.hostingConnectors = hostings;
88
+ }
89
+ getHostingConnectors() { return this.hostingConnectors; }
90
+ /**
91
+ * Add routes to serve the client config file
92
+ */
93
+ async addRoutes(app) {
94
+ const path = process.env.SILEX_CLIENT_CONFIG;
95
+ if (path) {
96
+ console.info(`> Serving client side config ${path} at ${constants_1.CLIENT_CONFIG_FILE_NAME}`);
97
+ try {
98
+ // Load the client config file
99
+ let clientConfig = (await (0, promises_1.readFile)(path)).toString();
100
+ // Serve the config file
101
+ app.get(`/${constants_1.CLIENT_CONFIG_FILE_NAME}`, async (req, res) => {
102
+ // Reload each time in debug mode
103
+ if (this.debug) {
104
+ console.info('[Debug mode] Reloading config file', path);
105
+ clientConfig = (await (0, promises_1.readFile)(path)).toString();
106
+ }
107
+ // Send the config file
108
+ res
109
+ .contentType('application/javascript')
110
+ .send(clientConfig);
111
+ });
112
+ }
113
+ catch (e) {
114
+ console.error(`Error loading client config file ${path}`, e);
115
+ throw new Error(`Error loading client config file ${path}: ${e.message}`);
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Load config files
121
+ * This is the main config file and the user config file
122
+ */
123
+ async loadConfigFiles() {
124
+ // Load the user config file
125
+ await this.loadUserConfig();
126
+ // Load the main config file
127
+ await this.loadSilexConfig();
128
+ }
129
+ /**
130
+ * Load user config file
131
+ * This is the config file passed as env var CONFIG
132
+ */
133
+ async loadUserConfig() {
134
+ if (this.userConfigPath) {
135
+ console.info('> Loading user config', this.userConfigPath);
136
+ try {
137
+ // Initiate the process with the config file which is just another plugin
138
+ await this.addPlugin(this.userConfigPath, {});
139
+ }
140
+ catch (e) {
141
+ throw new Error(`\nUser config file ${this.userConfigPath} error:\n\n\t${e.message}\n\n`);
142
+ }
143
+ }
144
+ }
145
+ /**
146
+ * Load .silex.js in the root folder
147
+ * This is the main config file
148
+ */
149
+ async loadSilexConfig() {
150
+ console.info('> Loading config', this.configFilePath);
151
+ try {
152
+ // Initiate the process with the config file which is just another plugin
153
+ await this.addPlugin(this.configFilePath, {});
154
+ }
155
+ catch (e) {
156
+ // Check if the error is about the config file not found and not another module not found in the config file
157
+ if (e.code === 'MODULE_NOT_FOUND' && (!e.requireStack || !e.requireStack.find(path => path === this.configFilePath))) {
158
+ console.info('> /!\\ Config file not found', this.configFilePath);
159
+ }
160
+ else {
161
+ throw new Error(`Error in config file ${this.configFilePath}: ${e.message}`);
162
+ }
163
+ }
164
+ }
165
+ async initDefaultConnectors() {
166
+ // Add default storage connectors
167
+ if (!this.storageConnectors.length) {
168
+ this.addStorageConnector(new FsStorage_1.FsStorage(null, {
169
+ path: process.env.SILEX_FS_ROOT || (0, path_1.join)(process.cwd(), '/silex/storage'),
170
+ }));
171
+ }
172
+ // Add default hosting connectors
173
+ if (!this.hostingConnectors.length) {
174
+ this.addHostingConnector(new FsHosting_1.FsHosting(null, {
175
+ path: process.env.SILEX_FS_HOSTING_ROOT || (0, path_1.join)(process.cwd(), '/silex/hosting'),
176
+ }));
177
+ }
178
+ }
179
+ }
180
+ exports.ServerConfig = ServerConfig;
181
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/ts/server/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ConnectorFile, HostingConnector, ConnectorSession } from './connectors';
2
+ import { FsStorage } from './FsStorage';
3
+ import { ConnectorType, JobData, WebsiteId } from '../../types';
4
+ import { JobManager } from '../jobs';
5
+ type FsSession = ConnectorSession;
6
+ export declare class FsHosting extends FsStorage implements HostingConnector<FsSession> {
7
+ connectorId: string;
8
+ displayName: string;
9
+ connectorType: ConnectorType;
10
+ protected initFs(): Promise<void>;
11
+ publish(session: FsSession, id: WebsiteId, files: ConnectorFile[], { startJob, jobSuccess, jobError }: JobManager): Promise<JobData>;
12
+ getUrl(session: FsSession, id: WebsiteId): Promise<string>;
13
+ }
14
+ export {};
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /*
3
+ * Silex website builder, free/libre no-code tool for makers.
4
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.FsHosting = void 0;
23
+ const promises_1 = __importDefault(require("fs/promises"));
24
+ const path_1 = require("path");
25
+ const FsStorage_1 = require("./FsStorage");
26
+ const types_1 = require("../../types");
27
+ class FsHosting extends FsStorage_1.FsStorage {
28
+ connectorId = 'fs-hosting';
29
+ displayName = 'File system hosting';
30
+ connectorType = types_1.ConnectorType.HOSTING;
31
+ async initFs() {
32
+ const stat = await promises_1.default.stat(this.options.path).catch(() => null);
33
+ if (!stat) {
34
+ await promises_1.default.mkdir((0, path_1.join)(this.options.path, 'assets'), { recursive: true });
35
+ await promises_1.default.mkdir((0, path_1.join)(this.options.path, 'css'), { recursive: true });
36
+ console.info(`> [FsHosting] Created folders assets/ and css/ in ${this.options.path}`);
37
+ }
38
+ }
39
+ async publish(session, id, files, { startJob, jobSuccess, jobError }) {
40
+ const job = startJob(`Publishing to ${this.displayName}`);
41
+ job.logs = [[`Publishing to ${this.displayName}`]];
42
+ job.errors = [[]];
43
+ // Call write without id or folder so that it goes in / (path will be modified by publication transformers)
44
+ await this.write(session, '', files, '', async ({ status, message }) => {
45
+ // Update the job status
46
+ job.status = status;
47
+ job.message = message;
48
+ job.logs[0].push(message);
49
+ if (status === types_1.JobStatus.SUCCESS) {
50
+ jobSuccess(job.jobId, message);
51
+ }
52
+ else if (status === types_1.JobStatus.ERROR) {
53
+ job.errors[0].push(message);
54
+ jobError(job.jobId, message);
55
+ }
56
+ });
57
+ return job;
58
+ }
59
+ async getUrl(session, id) {
60
+ const filePath = (0, path_1.join)(this.options.path, id, 'index.html');
61
+ const fileUrl = new URL(filePath, 'file://');
62
+ return fileUrl.toString();
63
+ }
64
+ }
65
+ exports.FsHosting = FsHosting;
66
+ //# sourceMappingURL=FsHosting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FsHosting.js","sourceRoot":"","sources":["../../../../../src/ts/server/connectors/FsHosting.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;AAEH,2DAA4B;AAE5B,+BAA2B;AAC3B,2CAAuC;AACvC,uCAA8F;AAK9F,MAAa,SAAU,SAAQ,qBAAS;IACtC,WAAW,GAAG,YAAY,CAAA;IAC1B,WAAW,GAAG,qBAAqB,CAAA;IACnC,aAAa,GAAG,qBAAa,CAAC,OAAO,CAAA;IAE3B,KAAK,CAAC,MAAM;QACpB,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,kBAAE,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACtE,MAAM,kBAAE,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACnE,OAAO,CAAC,IAAI,CAAC,qDAAqD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAkB,EAAE,EAAa,EAAE,KAAsB,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAa;QACnH,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAuB,CAAA;QAC/E,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAClD,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;QACjB,2GAA2G;QAC3G,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,EAAE;YACnE,wBAAwB;YACxB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAA;YACnB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAA;YACrB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACzB,IAAG,MAAM,KAAK,iBAAS,CAAC,OAAO,EAAE,CAAC;gBAChC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAChC,CAAC;iBAAM,IAAG,MAAM,KAAK,iBAAS,CAAC,KAAK,EAAE,CAAC;gBACrC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC3B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAkB,EAAE,EAAa;QAC5C,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC5C,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC;CACF;AAvCD,8BAuCC"}
@@ -0,0 +1,44 @@
1
+ import { ConnectorFile, StorageConnector, StatusCallback, ConnectorSession, ConnectorFileContent } from './connectors';
2
+ import { ConnectorUser, WebsiteMeta, WebsiteId, ConnectorType, WebsiteMetaFileContent, WebsiteData, ConnectorOptions } from '../../types';
3
+ import { ServerConfig } from '../config';
4
+ type FsSession = ConnectorSession;
5
+ interface FsOptions {
6
+ path: string;
7
+ assetsFolder: string;
8
+ }
9
+ export declare class FsStorage implements StorageConnector<FsSession> {
10
+ connectorId: string;
11
+ displayName: string;
12
+ icon: string;
13
+ disableLogout: boolean;
14
+ options: FsOptions;
15
+ connectorType: ConnectorType;
16
+ color: string;
17
+ background: string;
18
+ constructor(config: ServerConfig | null, opts: Partial<FsOptions>);
19
+ protected initFs(): Promise<void>;
20
+ private updateStatus;
21
+ private initStatus;
22
+ getOptions(formData: object): ConnectorOptions;
23
+ getOAuthUrl(session: FsSession): Promise<null>;
24
+ getLoginForm(session: FsSession, redirectTo: string): Promise<string | null>;
25
+ getSettingsForm(session: FsSession, redirectTo: string): Promise<string | null>;
26
+ isLoggedIn(session: FsSession): Promise<boolean>;
27
+ setToken(session: FsSession, query: object): Promise<void>;
28
+ logout(session: FsSession): Promise<void>;
29
+ getUser(session: FsSession): Promise<ConnectorUser>;
30
+ setWebsiteMeta(session: any, id: string, data: WebsiteMetaFileContent): Promise<void>;
31
+ getWebsiteMeta(session: FsSession, id: WebsiteId): Promise<WebsiteMeta>;
32
+ createWebsite(session: FsSession, meta: WebsiteMetaFileContent): Promise<WebsiteId>;
33
+ readWebsite(session: FsSession, websiteId: WebsiteId): Promise<WebsiteData>;
34
+ updateWebsite(session: FsSession, websiteId: WebsiteId, data: WebsiteData): Promise<void>;
35
+ deleteWebsite(session: FsSession, websiteId: WebsiteId): Promise<void>;
36
+ duplicateWebsite(session: FsSession, websiteId: WebsiteId): Promise<void>;
37
+ listWebsites(session: any): Promise<WebsiteMeta[]>;
38
+ getAsset(session: FsSession, id: WebsiteId, path: string): Promise<ConnectorFile>;
39
+ writeAssets(session: FsSession, id: WebsiteId, files: ConnectorFile[], statusCbk?: StatusCallback): Promise<void>;
40
+ write(session: FsSession, id: WebsiteId, files: ConnectorFile[], assetsFolder: string, statusCbk?: StatusCallback): Promise<void>;
41
+ deleteAssets(session: FsSession, id: WebsiteId, paths: string[]): Promise<void>;
42
+ readAsset(session: object, websiteId: string, fileName: string): Promise<ConnectorFileContent>;
43
+ }
44
+ export {};
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ /*
3
+ * Silex website builder, free/libre no-code tool for makers.
4
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.FsStorage = void 0;
23
+ const promises_1 = __importDefault(require("fs/promises"));
24
+ const fs_1 = require("fs");
25
+ const connectors_1 = require("./connectors");
26
+ const path_1 = require("path");
27
+ const types_1 = require("../../types");
28
+ const os_1 = require("os");
29
+ const validation_1 = require("../utils/validation");
30
+ const constants_1 = require("../../constants");
31
+ const stream_1 = require("stream");
32
+ const uuid_1 = require("uuid");
33
+ // Variables needed for jest tests
34
+ if (!globalThis.__dirname) {
35
+ // @ts-ignore
36
+ globalThis.__dirname = (0, path_1.dirname)(process.cwd() + '/src/ts/server/connectors/FsStorage.ts');
37
+ console.info('Redefining __dirname', globalThis.__dirname);
38
+ }
39
+ // Copy a folder recursively
40
+ async function copyDir(src, dest) {
41
+ await promises_1.default.mkdir(dest, { recursive: true });
42
+ const entries = await promises_1.default.readdir(src, { withFileTypes: true });
43
+ for (const entry of entries) {
44
+ const srcPath = (0, path_1.join)(src, entry.name);
45
+ const destPath = (0, path_1.join)(dest, entry.name);
46
+ entry.isDirectory() ?
47
+ await copyDir(srcPath, destPath) :
48
+ await promises_1.default.copyFile(srcPath, destPath);
49
+ }
50
+ }
51
+ const USER_ICON = 'data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' height=\'1em\' viewBox=\'0 0 448 512\'%3E%3Cpath d=\'M304 128a80 80 0 1 0 -160 0 80 80 0 1 0 160 0zM96 128a128 128 0 1 1 256 0A128 128 0 1 1 96 128zM49.3 464H398.7c-8.9-63.3-63.3-112-129-112H178.3c-65.7 0-120.1 48.7-129 112zM0 482.3C0 383.8 79.8 304 178.3 304h91.4C368.2 304 448 383.8 448 482.3c0 16.4-13.3 29.7-29.7 29.7H29.7C13.3 512 0 498.7 0 482.3z\'/%3E%3C/svg%3E';
52
+ const FILE_ICON = '/assets/laptop.png';
53
+ class FsStorage {
54
+ connectorId = 'fs-storage';
55
+ displayName = 'File system storage';
56
+ icon = FILE_ICON;
57
+ disableLogout = true;
58
+ options;
59
+ connectorType = types_1.ConnectorType.STORAGE;
60
+ color = '#ffffff';
61
+ background = '#006400';
62
+ constructor(config, opts) {
63
+ this.options = {
64
+ path: (0, path_1.join)(__dirname, '..', '..', '..', '..', 'data'),
65
+ assetsFolder: '/assets',
66
+ ...opts,
67
+ };
68
+ this.initFs();
69
+ }
70
+ async initFs() {
71
+ const stat = await promises_1.default.stat(this.options.path).catch(() => null);
72
+ if (!stat) {
73
+ // create data folder with a default website
74
+ const id = constants_1.DEFAULT_WEBSITE_ID;
75
+ await promises_1.default.mkdir((0, path_1.join)(this.options.path, id, this.options.assetsFolder), { recursive: true });
76
+ await this.setWebsiteMeta({}, id, { name: 'Default website', connectorUserSettings: {} });
77
+ await this.updateWebsite({}, id, types_1.defaultWebsiteData);
78
+ console.info(`> [FsStorage] Created ${id} in ${this.options.path}`);
79
+ }
80
+ }
81
+ // ********************
82
+ // Job utils methods
83
+ // ********************
84
+ updateStatus(filesStatuses, status, statusCbk) {
85
+ statusCbk && statusCbk({
86
+ message: `<p>Writing files:<ul><li>${filesStatuses.map(({ file, message }) => `${file.path}: ${message}`).join('</li><li>')}</li></ul></p>`,
87
+ status,
88
+ });
89
+ }
90
+ initStatus(files) {
91
+ return files.map(file => ({
92
+ file,
93
+ message: 'Waiting',
94
+ status: types_1.JobStatus.IN_PROGRESS,
95
+ }));
96
+ }
97
+ // ********************
98
+ // Connector interface
99
+ // ********************
100
+ getOptions(formData) {
101
+ return {};
102
+ }
103
+ async getOAuthUrl(session) { return null; }
104
+ async getLoginForm(session, redirectTo) {
105
+ return null;
106
+ }
107
+ async getSettingsForm(session, redirectTo) {
108
+ return null;
109
+ }
110
+ async isLoggedIn(session) {
111
+ return true;
112
+ }
113
+ async setToken(session, query) { }
114
+ async logout(session) { }
115
+ async getUser(session) {
116
+ const { username, } = (0, os_1.userInfo)();
117
+ return {
118
+ name: username,
119
+ picture: USER_ICON,
120
+ storage: await (0, connectors_1.toConnectorData)(session, this),
121
+ };
122
+ }
123
+ async setWebsiteMeta(session, id, data) {
124
+ const websiteId = (0, validation_1.requiredParam)(id, 'website id');
125
+ const content = JSON.stringify(data);
126
+ const path = (0, path_1.join)(this.options.path, id, constants_1.WEBSITE_META_DATA_FILE);
127
+ await promises_1.default.writeFile(path, content);
128
+ }
129
+ async getWebsiteMeta(session, id) {
130
+ const websiteId = (0, validation_1.requiredParam)(id, 'website id');
131
+ // Get stats for website folder
132
+ const fileStat = await promises_1.default.stat((0, path_1.join)(this.options.path, websiteId));
133
+ const path = (0, path_1.join)(this.options.path, websiteId, constants_1.WEBSITE_META_DATA_FILE);
134
+ // Get meta file
135
+ const content = await promises_1.default.readFile(path);
136
+ const meta = await JSON.parse(content.toString());
137
+ // Return all meta
138
+ return {
139
+ websiteId,
140
+ name: meta.name,
141
+ imageUrl: meta.imageUrl,
142
+ connectorUserSettings: meta.connectorUserSettings,
143
+ createdAt: fileStat.birthtime,
144
+ updatedAt: fileStat.mtime,
145
+ };
146
+ }
147
+ // ********************
148
+ // Storage interface
149
+ // ********************
150
+ async createWebsite(session, meta) {
151
+ const id = (0, uuid_1.v4)();
152
+ await promises_1.default.mkdir((0, path_1.join)(this.options.path, id, this.options.assetsFolder), { recursive: true });
153
+ await this.setWebsiteMeta(session, id, meta);
154
+ await this.updateWebsite(session, id, types_1.defaultWebsiteData);
155
+ return id;
156
+ }
157
+ async readWebsite(session, websiteId) {
158
+ const id = (0, validation_1.requiredParam)(websiteId, 'website id');
159
+ const path = (0, path_1.join)(this.options.path, id, constants_1.WEBSITE_DATA_FILE);
160
+ const content = await promises_1.default.readFile(path);
161
+ return JSON.parse(content.toString());
162
+ }
163
+ async updateWebsite(session, websiteId, data) {
164
+ const id = (0, validation_1.requiredParam)(websiteId, 'website id');
165
+ const path = (0, path_1.join)(this.options.path, id, constants_1.WEBSITE_DATA_FILE);
166
+ await promises_1.default.writeFile(path, JSON.stringify(data));
167
+ }
168
+ async deleteWebsite(session, websiteId) {
169
+ const id = (0, validation_1.requiredParam)(websiteId, 'website id');
170
+ const path = (0, path_1.join)(this.options.path, id);
171
+ return promises_1.default.rmdir(path, { recursive: true });
172
+ }
173
+ async duplicateWebsite(session, websiteId) {
174
+ const newWebsiteId = (0, uuid_1.v4)();
175
+ const from = (0, path_1.join)(this.options.path, websiteId);
176
+ const to = (0, path_1.join)(this.options.path, newWebsiteId);
177
+ await copyDir(from, to);
178
+ const meta = await this.getWebsiteMeta(session, websiteId);
179
+ await this.setWebsiteMeta(session, newWebsiteId, {
180
+ ...meta,
181
+ name: `${meta.name} copy`,
182
+ });
183
+ }
184
+ async listWebsites(session) {
185
+ const list = await promises_1.default.readdir(this.options.path);
186
+ return Promise.all(list.map(async (fileName) => {
187
+ const websiteId = fileName;
188
+ return this.getWebsiteMeta(session, websiteId);
189
+ }));
190
+ }
191
+ async getAsset(session, id, path) {
192
+ const fullPath = (0, path_1.join)(this.options.path, id, this.options.assetsFolder, path);
193
+ const content = await promises_1.default.readFile(fullPath);
194
+ return { path, content };
195
+ }
196
+ async writeAssets(session, id, files, statusCbk) {
197
+ return this.write(session, id, files, this.options.assetsFolder, statusCbk);
198
+ }
199
+ async write(session, id, files, assetsFolder, statusCbk) {
200
+ const filesStatuses = this.initStatus(files);
201
+ let error = null;
202
+ for (const fileStatus of filesStatuses) {
203
+ const { file } = fileStatus;
204
+ const path = (0, path_1.join)(this.options.path, id, assetsFolder, file.path);
205
+ if (typeof file.content === 'string' || Buffer.isBuffer(file.content)) {
206
+ fileStatus.message = 'Writing';
207
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
208
+ try {
209
+ await promises_1.default.writeFile(path, file.content);
210
+ }
211
+ catch (err) {
212
+ fileStatus.message = `Error (${err})`;
213
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
214
+ error = err;
215
+ continue;
216
+ }
217
+ fileStatus.message = 'Success';
218
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
219
+ }
220
+ else if (file.content instanceof stream_1.Readable) {
221
+ fileStatus.message = 'Writing';
222
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
223
+ const writeStream = (0, fs_1.createWriteStream)(path);
224
+ file.content.pipe(writeStream);
225
+ await new Promise((resolve) => {
226
+ writeStream.on('finish', () => {
227
+ fileStatus.message = 'Success';
228
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
229
+ resolve(file);
230
+ });
231
+ writeStream.on('error', err => {
232
+ console.error('writeStream error', err);
233
+ fileStatus.message = `Error (${err})`;
234
+ this.updateStatus(filesStatuses, types_1.JobStatus.IN_PROGRESS, statusCbk);
235
+ error = err;
236
+ resolve(file);
237
+ });
238
+ });
239
+ }
240
+ else {
241
+ console.error('Invalid file content', typeof file.content);
242
+ throw new Error('Invalid file content: ' + typeof file.content);
243
+ }
244
+ }
245
+ this.updateStatus(filesStatuses, error ? types_1.JobStatus.ERROR : types_1.JobStatus.SUCCESS, statusCbk);
246
+ if (error)
247
+ throw error;
248
+ }
249
+ async deleteAssets(session, id, paths) {
250
+ for (const path of paths) {
251
+ await promises_1.default.unlink((0, path_1.join)(this.options.path, id, path));
252
+ }
253
+ }
254
+ async readAsset(session, websiteId, fileName) {
255
+ const id = (0, validation_1.requiredParam)(websiteId, 'website id');
256
+ const path = (0, path_1.join)(this.options.path, id, this.options.assetsFolder, fileName);
257
+ return await promises_1.default.readFile(path);
258
+ }
259
+ }
260
+ exports.FsStorage = FsStorage;
261
+ //# sourceMappingURL=FsStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FsStorage.js","sourceRoot":"","sources":["../../../../../src/ts/server/connectors/FsStorage.ts"],"names":[],"mappings":"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"}