@silexlabs/silex 3.0.1-alpha.0 → 3.0.2

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 +92 -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 +80 -19
  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
@@ -1,207 +0,0 @@
1
- const { Router } = require('express')
2
- const { resolve } = require('path')
3
- const formidable = require('formidable')
4
-
5
- const { noCache } = require('./Cache')
6
- const { defaultSite } = require('@silexlabs/silex').default.types
7
-
8
- const EVENT_READ_START = 'EVENT_READ_START'
9
- const EVENT_READ_END = 'EVENT_READ_END'
10
- const EVENT_DELETE_START = 'EVENT_WRITE_START'
11
- const EVENT_DELETE_END = 'EVENT_WRITE_END'
12
- const EVENT_WRITE_START = 'EVENT_WRITE_START'
13
- const EVENT_WRITE_END = 'EVENT_WRITE_END'
14
- const EVENT_ASSET_READ_START = 'EVENT_ASSET_READ_START'
15
- const EVENT_ASSET_READ_END = 'EVENT_ASSET_READ_END'
16
- const EVENT_ASSET_WRITE_START = 'EVENT_ASSET_WRITE_START'
17
- const EVENT_ASSET_WRITE_END = 'EVENT_ASSET_WRITE_END'
18
-
19
- module.exports = async function(config, opts = {}) {
20
- // Options with defaults
21
- const options = {
22
- // Defaults
23
- backend: 'src/plugins/DefaultBackend.js',
24
- // Default data for new websites
25
- defaultSite,
26
- // Options
27
- ...opts
28
- }
29
-
30
- // Link to the desired backend
31
- const backend = resolve(__dirname, '../..', options.backend)
32
- const { assetsDir, assetUrl, init, writeData, readData, list, del } = require(backend)
33
-
34
- config.on('silex:startup:start', ({app}) => {
35
- const router = Router()
36
-
37
- // website specials
38
- router.get('/website', readWebsite)
39
- router.post('/website', writeWebsite)
40
- router.delete('/website', deleteWebsite)
41
- router.get(/\/assets\/(.*)/, readAsset)
42
- router.post('/assets', writeAsset)
43
-
44
- app.use(noCache, router)
45
- })
46
-
47
- async function readWebsite(req, res) {
48
- const { id } = req.query
49
- if(id) {
50
- // Returns a website data
51
- try {
52
- config.emit(EVENT_READ_START, { req, id })
53
- const data = await readData(id)
54
- config.emit(EVENT_READ_END, { req, res, data, id })
55
- res
56
- .type('application/json')
57
- .send({
58
- ...options.defaultSite,
59
- ...data,
60
- })
61
- } catch (err) {
62
- if(err.code === 'ENOENT') {
63
- console.error('Read file error, website does not exist', err)
64
- res.status(404).json({ message: 'Read file error, website does not exist: ' + err.message, code: err.code})
65
- } else {
66
- console.error('Read file error', err)
67
- res.status(400).json({ message: err.message, code: err.code})
68
- }
69
- }
70
- } else {
71
- // list websites
72
- try {
73
- config.emit(EVENT_READ_START, { req, id })
74
- const data = await list()
75
- config.emit(EVENT_READ_END, { req, res, data, id })
76
- res
77
- .type('application/json')
78
- .send(data)
79
- } catch (err) {
80
- console.error('List sites error', err)
81
- res.status(400).json({ message: err.message, code: err.code })
82
- }
83
- }
84
- }
85
-
86
- function fromBody(body) {
87
- try {
88
- return [{
89
- assets: body.assets,
90
- pages: body.pages,
91
- files: body.files,
92
- styles: body.styles,
93
- settings: body.settings,
94
- publication: body.publication,
95
- name: body.name,
96
- fonts: body.fonts,
97
- symbols: body.symbols,
98
- }, null]
99
- } catch(err) {
100
- console.error('Could not parse body data', body, err)
101
- return [null, err]
102
- }
103
- }
104
-
105
- async function writeWebsite(req, res) {
106
- const id = req.query.id
107
- const [data, err] = fromBody(req.body)
108
- if(err) {
109
- res.status(400).json({ message: 'Error writing data file, could not parse the provided body: ' + err.message, code: err.code})
110
- return
111
- }
112
- config.emit(EVENT_WRITE_START, { req, id, data })
113
- try {
114
- await init(id)
115
- await writeData(id, data)
116
- } catch (err) {
117
- console.error('Error writing data file', err)
118
- res.status(500).json({ message: 'Error writing data file: ' + err.message, code: err.code})
119
- return
120
- }
121
-
122
- config.emit(EVENT_WRITE_END, { res, req, id, data })
123
-
124
- res.json({
125
- message: 'OK',
126
- })
127
- }
128
-
129
- async function deleteWebsite(req, res) {
130
- const { id } = req.query
131
- if(id) {
132
- try {
133
- config.emit(EVENT_DELETE_START, { req, id })
134
- const data = await del(id)
135
- config.emit(EVENT_DELETE_END, { req, res, data, id })
136
- res
137
- .type('application/json')
138
- .send(data)
139
- } catch (err) {
140
- if(err.code === 'ENOENT') {
141
- console.error('Delete file error, website does not exist', err)
142
- res.status(404).json({ message: 'Delete file error, website does not exist: ' + err.message, code: err.code})
143
- } else {
144
- console.error('Delete file error', err)
145
- res.status(400).json({ message: err.message, code: err.code})
146
- }
147
- }
148
- } else {
149
- // list websites
150
- try {
151
- config.emit(EVENT_DELETE_START, { req, id })
152
- const data = await list()
153
- config.emit(EVENT_DELETE_END, { req, res, data, id })
154
- res
155
- .type('application/json')
156
- .send(data)
157
- } catch (err) {
158
- console.error('List sites error', err)
159
- res.status(400).json({ message: err.message, code: err.code })
160
- }
161
- }
162
- }
163
-
164
- async function readAsset(req, res) {
165
- const id = req.query.id
166
- const fileName = req.params[0]
167
- const uploadDir = await assetsDir(id)
168
- config.emit(EVENT_ASSET_READ_START, { req, id, fileName, uploadDir })
169
- res.sendFile(`${uploadDir}/${fileName}`)
170
- config.emit(EVENT_ASSET_READ_END, { req, id, fileName, uploadDir })
171
- }
172
-
173
- async function writeAsset(req, res) {
174
- const id = req.query.id
175
- // FIXME: assetsDir and assetsUrl will both download the site settings file => get both in 1 call
176
- const uploadDir = await assetsDir(id)
177
-
178
- const form = formidable({
179
- uploadDir,
180
- filename: (name, ext, part, _form) => `${name}${ext}`,
181
- multiples: true,
182
- keepExtensions: true,
183
- })
184
-
185
- form.parse(req, async (err, fields, files) => {
186
- if (err) {
187
- console.error('Error parsing upload data', err)
188
- res
189
- .status(400)
190
- .json({ message: 'Error parsing upload data: ' + err.message, code: err.code})
191
- return
192
- }
193
- Promise.all(
194
- [].concat(files['files[]']) // may be an array or 1 element
195
- .map(file => {
196
- const { originalFilename, filepath } = file
197
- return assetUrl(id, originalFilename)
198
- })
199
- )
200
- .then(data => {
201
- config.emit(EVENT_ASSET_WRITE_START, { req, id, uploadDir, form, data })
202
- res.json({ data })
203
- config.emit(EVENT_ASSET_WRITE_END, { res, req, id, uploadDir, form, data })
204
- })
205
- })
206
- }
207
- }
@@ -1,386 +0,0 @@
1
- import {html, render} from 'lit-html'
2
- import {map} from 'lit-html/directives/map.js'
3
- import grapesjs from 'grapesjs/dist/grapes.min.js'
4
- import { getPageSlug } from '../../page'
5
- import { onAll } from '../utils'
6
-
7
- // constants
8
- const pluginName = 'publish'
9
- export const cmdPublish = 'publish-open-dialog'
10
- let _token = null
11
- let id
12
- let rootUrl
13
-
14
- // plugin code
15
- export const publishPlugin = grapesjs.plugins.add(pluginName, (editor, opts) => {
16
- opts = {
17
- appendTo: 'options',
18
- ...opts,
19
- }
20
- // Global config
21
- rootUrl = opts.rootUrl
22
- id = opts.id
23
- // Keep track of the token
24
- editor.on('login:success', async ({ getUser, getToken }) => {
25
- _token = await getToken()
26
- })
27
- // add publication settings to the website
28
- editor.on('storage:start:store', (data) => {
29
- data.publication = editor.getModel().get('publication')
30
- })
31
- editor.on('storage:end:load', (data) => {
32
- const model = editor.getModel()
33
- model.set('publication', data.publication || {})
34
- })
35
- editor.Panels.addButton(opts.appendTo, {
36
- id: 'publish-button',
37
- className: 'silex-button--size publish-button',
38
- command: cmdPublish,
39
- attributes: { title: 'Publish' },
40
- label: '<span class="fa fa-rocket"></span><span class="silex-button--small">Publish</span>',
41
- })
42
- editor.Commands.add(cmdPublish, {
43
- run(editor) { openDialog(editor) },
44
- stop(editor) { closeDialog(editor) },
45
- })
46
- })
47
-
48
- export function getDialogElements() {
49
- const el = document.querySelector('#publish-dialog')
50
- return el ? {
51
- dialog: el,
52
- primary: el.querySelector('#publish-button--primary'),
53
- secondary: el.querySelector('#publish-button--secondary'),
54
- } : null
55
- }
56
- function createDialogElements() {
57
- const el = document.createElement('div')
58
- el.id = 'publish-dialog'
59
- el.className = 'silex-dialog-inline silex-dialog gjs-two-color'
60
- document.body.append(el)
61
- return getDialogElements()
62
- }
63
- function move(rect) {
64
- Object.keys(rect).forEach(key => dialog.style[key] = rect[key] + 'px')
65
- }
66
- function update(editor) {
67
- render(html`
68
- ${ open ? html`
69
- <main>
70
- ${ status === STATUS_PENDING ? html`
71
- <p>Publication in progress</p>
72
- ` : ''}
73
- ${ status === STATUS_SUCCESS ? html`
74
- <p>Publication success</p>
75
- ${ url ? html`<a href="${url}" target="_blank">Click here to view the published website</a>` : ''}
76
- ` : ''}
77
- ${ status === STATUS_ERROR ? html`
78
- <p>Publication error</p>
79
- <div>${ errorMessage }</div>
80
- ` : ''}
81
- ${ state?.running ? html`
82
- <progress
83
- value=""
84
- style="width: 100%;"
85
- ></progress>
86
- ` : ''}
87
- ${ state.logs?.length ? html`
88
- <details>
89
- <summary>Logs</summary>
90
- <pre style="
91
- max-width: 100%;
92
- max-height: 50vh;
93
- overflow: auto;
94
- font-size: x-small;
95
- "
96
- >${ cleanup(state.logs) }
97
- </pre>
98
- </details>
99
- ` : '' }
100
- ${ state.errors?.length ? html`
101
- <details>
102
- <summary>Errors</summary>
103
- <pre style="
104
- max-width: 100%;
105
- max-height: 50vh;
106
- overflow: auto;
107
- font-size: x-small;
108
- "
109
- >${ cleanup(state.errors) }
110
- </pre>
111
- </details>
112
- ` : '' }
113
- </main>
114
- <footer>
115
- ${ status === STATUS_PENDING ? '' : html`
116
- <button
117
- class="silex-button silex-button--primary"
118
- id="publish-button--primary"
119
- @click=${() => startPublication(editor)}
120
- >Publish</button>
121
- `}
122
- <button
123
- class="silex-button silex-button--secondary"
124
- id="publish-button--secondary"
125
- @click=${() => editor.Commands.stop(cmdPublish)}
126
- >Close</button>
127
- </footer>
128
- ` : ''}
129
- `, dialog)
130
- if(open) {
131
- dialog.classList.remove('silex-dialog-hide')
132
- } else {
133
- dialog.classList.add('silex-dialog-hide')
134
- }
135
- }
136
- export const STATUS_NONE='STATUS_NONE'
137
- export const STATUS_PENDING='STATUS_PENDING'
138
- export const STATUS_ERROR='STATUS_ERROR'
139
- export const STATUS_SUCCESS='STATUS_SUCCESS'
140
- export let status = STATUS_NONE
141
- export let open = false
142
- let errorMessage = ''
143
- let dialog
144
- let url // from the result of the first fetch when publishing
145
- let state = {
146
- queued: false,
147
- error: false,
148
- running: false,
149
- logs: [],
150
- errors: [],
151
- }
152
-
153
- function cleanup(arr: string[][]): string {
154
- return arr[arr.length-1]
155
- ?.map(str => str.replace(/\[.*\]/g, '').trim())
156
- ?.filter(str => !!str)
157
- ?.join('\n')
158
- }
159
-
160
- function displayError(editor, message) {
161
- console.error(message)
162
- errorMessage = message
163
- status = STATUS_ERROR
164
- update(editor)
165
- }
166
- export async function closeDialog(editor) {
167
- open = false
168
- update(editor)
169
- }
170
- export async function toggleDialog(editor) {
171
- if(open) closeDialog(editor)
172
- else openDialog(editor)
173
- }
174
- export async function openDialog(editor) {
175
- open = true
176
-
177
- // Position
178
- const buttonEl = editor.Panels.getPanel('options').view.el
179
- .querySelector('.publish-button')
180
- const rect = buttonEl.getBoundingClientRect()
181
-
182
- const width = 450
183
- const padding = 10 * 2
184
- const minHeight = 50
185
- if(!dialog) dialog = createDialogElements().dialog
186
- move({
187
- left: rect.right - width - padding,
188
- top: rect.bottom + 10,
189
- width,
190
- minHeight,
191
- })
192
-
193
- // Publication
194
- if(status === STATUS_NONE) {
195
- startPublication(editor)
196
- } else {
197
- update(editor)
198
- }
199
- }
200
- export async function startPublication(editor) {
201
- if(status === STATUS_PENDING) throw new Error('Publication is already in progress')
202
- status = STATUS_PENDING
203
- update(editor)
204
- editor.trigger('publish:before')
205
- const projectData = editor.getProjectData()
206
- const siteSettings = editor.getModel().get('settings')
207
- const publicationSettings = editor.getModel().get('publication')
208
- // Update assets URL to display outside the editor
209
- const assetsFolderUrl = publicationSettings?.assets?.url
210
- if(assetsFolderUrl) {
211
- const publishedUrl = path => `${assetsFolderUrl}/${path.split('/').pop()}`
212
- // New URLs for assets, according to site config
213
- onAll(editor, c => {
214
- // Attributes
215
- if(c.get('type') === 'image') {
216
- const path = c.get('src')
217
- c.set('tmp-src', path)
218
- c.set('src', publishedUrl(path))
219
- }
220
- //// Inline styles
221
- //// This is handled by the editor.Css.getAll loop
222
- //const bgUrl = c.getStyle()['background-image']?.match(/url\('(.*)'\)/)?.pop()
223
- //if(bgUrl) {
224
- // c.set('tmp-bg-url', bgUrl)
225
- // c.setStyle({
226
- // ...c.getStyle(),
227
- // 'background-image': `url('${publishedUrl(bgUrl)}')`,
228
- // })
229
- //}
230
- })
231
- editor.Css.getAll()
232
- .forEach(c => {
233
- const bgUrl = c.getStyle()['background-image']?.match(/url\('(.*)'\)/)?.pop()
234
- if(bgUrl) {
235
- c.setStyle({
236
- ...c.getStyle(),
237
- 'background-image': `url('${publishedUrl(bgUrl)}')`,
238
- })
239
- c.set('tmp-bg-url-css', bgUrl)
240
- }
241
- })
242
- }
243
- // Build the files structure
244
- const files = await getFiles(editor, {siteSettings, publicationSettings})
245
-
246
- // Create the data to send to the server
247
- const data = {
248
- ...projectData,
249
- settings: siteSettings,
250
- publication: publicationSettings,
251
- id,
252
- files,
253
- }
254
- // Reset asset URLs
255
- if(assetsFolderUrl) {
256
- onAll(editor, c => {
257
- if(c.get('type') === 'image' && c.has('tmp-src')) {
258
- c.set('src', c.get('tmp-src'))
259
- c.set('tmp-src')
260
- }
261
- //// This is handled by the editor.Css.getAll loop
262
- //if(c.getStyle()['background-image'] && c.has('tmp-bg-url')) {
263
- // c.setStyle({
264
- // ...c.getStyle(),
265
- // 'background-image': `url('${c.get('tmp-bg-url')}')`,
266
- // })
267
- // c.set('tmp-bg-url')
268
- //}
269
- })
270
- editor.Css.getAll()
271
- .forEach(c => {
272
- if(c.has('tmp-bg-url-css')) {
273
- c.setStyle({
274
- ...c.getStyle(),
275
- 'background-image': `url('${c.get('tmp-bg-url-css')}')`,
276
- })
277
- c.set('tmp-bg-url-css')
278
- }
279
- })
280
- }
281
- editor.trigger('publish:start', data)
282
- let res
283
- let json
284
- try {
285
- res = await fetch(`${ rootUrl }publish`, {
286
- method: 'POST',
287
- body: JSON.stringify({
288
- data,
289
- token: _token,
290
- }),
291
- headers: {
292
- 'Content-Type': 'application/json'
293
- },
294
- })
295
- } catch(e) {
296
- displayError(editor, `An error occured, your site is not published. ${e.message}`)
297
- editor.trigger('publish:stop', {success: false, message: e.message})
298
- return
299
- }
300
- try {
301
- json = await res.json()
302
- } catch(e) {
303
- displayError(editor, `Could not parse the server response, your site may be published. ${e.message}`)
304
- editor.trigger('publish:stop', {success: false, message: e.message})
305
- return
306
- }
307
- if(!res.ok) {
308
- displayError(editor, `An network error occured, your site is not published. ${json.message}`)
309
- editor.trigger('publish:stop', {success: false, message: json.message})
310
- return
311
- }
312
- url = json.url
313
- if(json.statusUrl) {
314
- trackProgress(editor, json.statusUrl)
315
- } else {
316
- status = STATUS_SUCCESS
317
- update(editor)
318
- editor.trigger('publish:stop', {success: true})
319
- }
320
- }
321
-
322
- async function getFiles(editor, {siteSettings, publicationSettings, }) {
323
- return editor.Pages.getAll().map(page => {
324
- const pageSettings = page.get('settings')
325
- const pageName = publicationSettings?.autoHomePage !== false && page.get('type') === 'main' ? 'index' : (page.get('name') || page.get('type'))
326
- function getSetting(name) {
327
- return (pageSettings || {})[name] || (siteSettings || [])[name] || ''
328
- }
329
- const component = page.getMainComponent()
330
- const slug = getPageSlug(pageName)
331
- return {
332
- html: `
333
- <!DOCTYPE html>
334
- <html lang="${ getSetting('lang') }">
335
- <head>
336
- <link rel="stylesheet" href="${publicationSettings?.css?.url || ''}/${slug}.css" />
337
- ${ siteSettings?.head || '' }
338
- ${ pageSettings?.head || '' }
339
- <title>${ getSetting('title') }</title>
340
- <link rel="icon" href="${ getSetting('favicon') }" />
341
- ${
342
- ['description', 'og:title', 'og:description', 'og:image']
343
- .map(prop => `<meta property="${ prop }" content="${ getSetting(prop) }"/>`)
344
- .join('\n')
345
- }
346
- </head>
347
- ${ editor.getHtml({ component }) }
348
- </html>
349
- `,
350
- css: editor.getCss({ component }),
351
- cssPath: `${ publicationSettings?.css?.path || '' }/${slug}${publicationSettings?.css?.ext || '.css'}`,
352
- htmlPath: `${ publicationSettings?.html?.path || '' }/${slug}${publicationSettings?.html?.ext || '.html'}`,
353
- }
354
- })
355
- }
356
-
357
- export async function trackProgress(editor, statusUrl) {
358
- let res
359
- let json
360
- try {
361
- res = await fetch(statusUrl)
362
- } catch(e) {
363
- displayError(editor, `An error occured, your site is not published. ${e.message}`)
364
- editor.trigger('publish:stop', {success: false, message: e.message})
365
- return
366
- }
367
- try {
368
- state = await res.json()
369
- } catch(e) {
370
- displayError(editor, `Could not parse the server response, your site may be published. ${e.message}`)
371
- editor.trigger('publish:stop', {success: false, message: e.message})
372
- return
373
- }
374
- if(!res.ok) {
375
- displayError(editor, `An network error occured, your site is not published. ${res.statusText}`)
376
- editor.trigger('publish:stop', {success: false, message: `An network error occured, your site is not published. ${res.statusText}`})
377
- return
378
- }
379
- if(state.running) {
380
- setTimeout(() => trackProgress(editor, statusUrl), 2000)
381
- } else {
382
- status = state.error ? STATUS_ERROR : STATUS_SUCCESS
383
- editor.trigger('publish:stop', {success: state.error})
384
- }
385
- update(editor)
386
- }