@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
@@ -1,39 +1,201 @@
1
- import { Config, Plugin } from '@silexlabs/silex-plugins'
2
- import { getEditorConfig } from './grapesjs'
3
- import { CLIENT_CONFIG_FILE_NAME } from '../constants'
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { Config } from '@silexlabs/silex-plugins'
19
+ import { getEditor, getEditorConfig } from './grapesjs'
20
+ import { CLIENT_CONFIG_FILE_NAME, DEFAULT_LANGUAGE, DEFAULT_WEBSITE_ID } from '../constants'
21
+ import { ConnectorId, WebsiteId } from '../types'
22
+ import { Editor, EditorConfig, Page } from 'grapesjs'
23
+ import { PublicationTransformer, publicationTransformerDefault, validatePublicationTransformer } from './publication-transformers'
24
+ import * as api from './api'
25
+ import { assetsPublicationTransformer } from './assetUrl'
26
+ import { SettingsSection } from './grapesjs/settings-sections'
27
+ import { addSection, removeSection } from './grapesjs/settings'
28
+
29
+ // Plugins
30
+ import publishCustomCodeBlock from './publish-custom-code-block'
31
+ import publishFonts from './publish-fonts'
4
32
 
5
33
  /**
6
34
  * @fileoverview Silex client side config
7
35
  */
8
36
 
9
- const id = new URL(location.href).searchParams.get('id') || 'default'
10
- const lang = new URL(location.href).searchParams.get('lang') || 'en'
11
- const rootUrl = `${location.protocol}//${location.host}${location.pathname}`
37
+ export class ClientConfig extends Config {
38
+ api = api
39
+
40
+ /**
41
+ * The website to load
42
+ * This is the id of the website in the storage connector
43
+ */
44
+ websiteId: WebsiteId = new URL(location.href).searchParams.get('id') ?? DEFAULT_WEBSITE_ID
45
+
46
+ /**
47
+ * The storage connector to use
48
+ * If not found in the URL and the user is not logged in to any storage, use the first storage
49
+ */
50
+ storageId: ConnectorId = new URL(location.href).searchParams.get('connectorId')
51
+
52
+ /**
53
+ * language for I18n module
54
+ */
55
+ lang = new URL(location.href).searchParams.get('lang') ?? DEFAULT_LANGUAGE
56
+
57
+ /**
58
+ * root url of Silex app
59
+ */
60
+ rootUrl = window.location.origin + window.location.pathname.replace(/\/$/, '')
12
61
 
13
- export class SilexConfig extends Config {
14
62
  /**
15
63
  * debug mode
16
64
  */
17
65
  debug = false
18
66
 
19
67
  /**
20
- * language for I18n module
68
+ * Add hash in the file name of CSS at the time of publication
69
+ * If true, CSS files of generated pages will look like `page-name.123456.css` instead of `page-name.css`
70
+ * This is useful to avoid caching issues
71
+ * @default true
72
+ */
73
+ addHashInCssFileName = true
74
+
75
+ /**
76
+ * Replaced elements
77
+ * This is a list of elements which support the object-fit and object-position CSS properties
78
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element
79
+ * When selected, Silex will show the object-fit and object-position properties in the style panel
21
80
  */
22
- lang = lang
81
+ replacedElements = [
82
+ 'img',
83
+ 'video',
84
+ 'iframe',
85
+ 'embed',
86
+ 'object',
87
+ 'audio',
88
+ 'canvas',
89
+ // 'option',
90
+ ]
23
91
 
24
92
  /**
25
93
  * Grapesjs config
26
94
  */
27
- editor = getEditorConfig(id, rootUrl)
95
+ grapesJsConfig: EditorConfig = {
96
+ plugins: [],
97
+ pluginsOpts: {},
98
+ }
28
99
 
29
100
  /**
30
101
  * Client config url
31
102
  * This is the url of the config file which is a plugin
32
103
  */
33
- clientConfigUrl = `${rootUrl}${CLIENT_CONFIG_FILE_NAME}`
104
+ clientConfigUrl = `${this.rootUrl}/${CLIENT_CONFIG_FILE_NAME}`
105
+
106
+ /**
107
+ * Google fonts API key, see this doc to get an API key: https://developers.google.com/fonts/docs/developer_api#APIKey
108
+ * @default Test key for local dev
109
+ */
110
+ fontsApiKey = 'AIzaSyAdJTYSLPlKz4w5Iqyy-JAF2o8uQKd1FKc'
111
+
112
+ /**
113
+ * Google fonts server or a free privacy-friendly drop-in replacement for Google Fonts or a proxy server to speed up the load and protect privacy
114
+ * @see https://github.com/coollabsio/fonts
115
+ * @see https://fontlay.com/
116
+ * @default Google Fonts
117
+ */
118
+ fontsServerUrl = 'https://fonts.googleapis.com'
119
+ fontsApiUrl = 'https://www.googleapis.com'
120
+
121
+ /**
122
+ * Init GrapesJS config which depend on the config file properties
123
+ */
124
+ initGrapesConfig() {
125
+ // Get the initial config
126
+ const config = getEditorConfig(this)
127
+
128
+ // Merge with the config modified by plugins
129
+ this.grapesJsConfig = {
130
+ ...this.grapesJsConfig,
131
+ ...config,
132
+ plugins: [
133
+ ...this.grapesJsConfig.plugins,
134
+ ...config.plugins,
135
+ ],
136
+ pluginsOpts: {
137
+ ...this.grapesJsConfig.pluginsOpts,
138
+ ...config.pluginsOpts,
139
+ },
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Get grapesjs editor
145
+ */
146
+ getEditor(): Editor {
147
+ return getEditor()
148
+ }
149
+
150
+ /**
151
+ * Publication transformers let plugins change files before they are published
152
+ */
153
+ publicationTransformers: Array<PublicationTransformer> = [assetsPublicationTransformer, publicationTransformerDefault]
154
+
155
+ /**
156
+ * Reset publication transformers
157
+ */
158
+ resetPublicationTransformers() {
159
+ this.publicationTransformers = [assetsPublicationTransformer]
160
+ }
161
+
162
+ /**
163
+ * Add a publication transformer(s)
164
+ */
165
+ addPublicationTransformers(transformers: PublicationTransformer | PublicationTransformer[]) {
166
+ // Make sure it is an array
167
+ if (!Array.isArray(transformers)) {
168
+ transformers = [transformers]
169
+ }
170
+ // Validate
171
+ transformers.forEach(transformer => {
172
+ validatePublicationTransformer(transformer)
173
+ })
174
+ // Add to the list
175
+ this.publicationTransformers = this.publicationTransformers.concat(transformers)
176
+ }
177
+
178
+ /**
179
+ * Add a section to the settings dialog
180
+ */
181
+ addSettings(section: SettingsSection, siteOrPage: 'site' | 'page', position: 'first' | 'last' | number = 'last') {
182
+ addSection(section, siteOrPage, position)
183
+ }
184
+
185
+ /**
186
+ * Remove a section from the settings dialog
187
+ */
188
+ removeSettings(id: string, siteOrPage: 'site' | 'page') {
189
+ removeSection(id, siteOrPage)
190
+ }
34
191
 
35
192
  /**
36
- * GrapesJs plugins
193
+ * Add default plugins
37
194
  */
38
- grapesJsPlugins: Plugin[] = []
195
+ async addDefaultPlugins() {
196
+ await this.addPlugin([
197
+ publishCustomCodeBlock,
198
+ publishFonts,
199
+ ], {})
200
+ }
39
201
  }
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ export enum ClientEvent {
19
+ // Sent on the config object
20
+ STARTUP_START = 'silex:startup:start', /* Loading is over and Silex is starting */
21
+ STARTUP_END = 'silex:startup:end', /* Silex is ready to be used */
22
+ GRAPESJS_START = 'silex:grapesjs:start', /* GrapesJS is about to be initialized, it is time to edit config.grapesJsConfig */
23
+ GRAPESJS_END = 'silex:grapesjs:end', /* GrapesJS is ready to be used, `editor` is passed as an argument */
24
+
25
+ // Sent on GrapesJs editor object (returned by silex.getEditor())
26
+ PUBLICATION_UI_OPEN = 'silex:publication-ui:open', /* The publication UI is opened, you can access it with { publicationUi } */
27
+ PUBLICATION_UI_CLOSE = 'silex:publication-ui:close', /* The publication UI is closed, you can access it with { publicationUi } */
28
+ PUBLISH_BEFORE = 'silex:publish:before', /* Publication is about to start, you can read+write {projectData, siteSettings} */
29
+ PUBLISH_START = 'silex:publish:start', /* Publication starts, you can read+write project data/settings, use publication manager/ui, prevent publication {projectData, siteSettings, publicationManager, prenventDefault} */
30
+ PUBLISH_PAGE = 'silex:publish:page', /* Publication of a page, read+write settings and page data, use publication manager and prevent publication { siteSettings, pageSettings, page, publicationManager, preventDefault } */
31
+ PUBLISH_DATA = 'silex:publish:data', /* Just before we send the published data to the server, read+write all publication data, check PublicationData type in types.ts { data, publicationManager } */
32
+ PUBLISH_END = 'silex:publish:end', /* Publication is over, the argument is the publication result with {success: boolean, message: string} */
33
+ PUBLISH_ERROR = 'silex:publish:error', /* Publication failed, the argument is the publication result with {success: boolean, message: string} */
34
+ PUBLISH_LOGIN_START = 'silex:publish:login:start', /* The user is about to login before publication, you can read+write connector data and use publication manager and prevent publication {connector, publicationManager, preventDefault} */
35
+ PUBLISH_LOGIN_END = 'silex:publish:login:end',
36
+ ASSET_WRITE_END = 'silex:asset:write:end',
37
+ WRITE_END = 'silex:write:end',
38
+ SETTINGS_OPEN = 'silex:settings:open', /* The settings dialog is opened */
39
+ SETTINGS_CLOSE = 'silex:settings:close', /* The settings dialog is closed */
40
+ SETTINGS_SAVE_START = 'silex:settings:save:start', /* The settings dialog is closed and the settings are about to be saved */
41
+ SETTINGS_SAVE_END = 'silex:settings:save:end', /* The settings dialog is closed and the settings are saved */
42
+ SETTINGS_SECTION_CHANGE = 'silex:settings:section-change', /* The user clicked on a section in the settings dialog */
43
+ }
@@ -1,4 +1,30 @@
1
- export * from './index'
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
2
18
  export * from './grapesjs/index'
3
19
  export * from './config'
4
20
 
21
+ export * as constants from '../constants'
22
+ export * as utils from './utils'
23
+ export * as api from './api'
24
+ export * as events from './events'
25
+ export * as page from '../page'
26
+ export * as types from '../types'
27
+
28
+ console.info(`
29
+ Silex client loaded
30
+ `)
@@ -0,0 +1,204 @@
1
+ import { html, render } from 'lit-html'
2
+ import { Editor } from 'grapesjs'
3
+ import { ApiConnectorLoggedInPostMessage, ConnectorData, ConnectorId, ConnectorType, ConnectorUser } from '../../types'
4
+ import { connectorList, getUser, logout } from '../api'
5
+ import { WebsiteId } from '../../types'
6
+ import { API_CONNECTOR_LOGIN, API_CONNECTOR_PATH, API_PATH } from '../../constants'
7
+
8
+ export const cmdLogin = 'silex:auth:login'
9
+ export const cmdLogout = 'silex:auth:logout'
10
+ export const eventLoggingIn = 'silex:auth:logging-in'
11
+ export const eventLoggedIn = 'silex:auth:logged-in'
12
+ export const eventLoginFailed = 'silex:auth:login-failed'
13
+ export const eventLoggedOut = 'silex:auth:logged-out'
14
+
15
+ export interface LoginDialogOptions {
16
+ id: WebsiteId,
17
+ }
18
+
19
+ export async function getCurrentUser(editor: Editor): Promise<ConnectorUser> {
20
+ return editor.getModel().get('user') as ConnectorUser
21
+ }
22
+
23
+ export async function updateUser(editor: Editor, type: ConnectorType, connectorId?: ConnectorId): Promise<ConnectorUser> {
24
+ const user = await getUser({type, connectorId})
25
+ editor.getModel().set('user', user)
26
+ return user
27
+ }
28
+
29
+ // Orging and path, should we use config.rootUrl?
30
+ const SERVER_URL = window.location.origin + window.location.pathname.replace(/\/$/, '')
31
+
32
+ let open = false
33
+ let body: HTMLElement | null = null
34
+ export default function loginDialogPlugin(editor, opts) {
35
+ // Options
36
+ const options: LoginDialogOptions = {
37
+ ...opts,
38
+ }
39
+
40
+ // Commands and events
41
+ editor.Commands.add(cmdLogin, {
42
+ async run(editor: Editor) { await openDialog() },
43
+ stop(editor: Editor) { closeDialog() },
44
+ })
45
+ editor.Commands.add(cmdLogout, {
46
+ async run(editor: Editor) {
47
+ await logout({type: ConnectorType.STORAGE })
48
+ editor.getModel().set('user', null)
49
+ editor.trigger(eventLoggedOut)
50
+ },
51
+ })
52
+ editor.on(eventLoggedOut, async () => openDialog())
53
+
54
+ // Dialog API
55
+ function closeDialog() {
56
+ if (open) {
57
+ editor.Modal.close()
58
+ open = false
59
+ }
60
+ }
61
+ async function openDialog() {
62
+ editor.trigger(eventLoggingIn)
63
+ open = true
64
+ editor.Modal.open({
65
+ title: 'Login',
66
+ content: '<div id="LoginDialog__content"></div>',
67
+ }, {
68
+ closeOnConfirm: false,
69
+ closeOnEscape: false,
70
+ closeOnOverlayClick: false,
71
+ })
72
+ body = document.querySelector('#LoginDialog__content')
73
+ if (!body) {
74
+ throw new Error('Dialog creation failed')
75
+ }
76
+ render(html`Logging in...`, body)
77
+ return loadStorageList(async list => onStorageList(list))
78
+ }
79
+ async function onStorageList(list) {
80
+ const loggedIn = list.find(connector => connector.isLoggedIn)
81
+ if (loggedIn) {
82
+ try {
83
+ const status = await updateUser(editor, loggedIn.type, loggedIn.connectorId)
84
+ editor.trigger(eventLoggedIn, status)
85
+ return closeDialog()
86
+ } catch (err) {
87
+ console.error('Error with updating login status', err)
88
+ render(html`
89
+ <main>
90
+ <p>There was an error with updating the login status. ${err.message}</p>
91
+ </main>
92
+ <footer>
93
+ <button class="silex-button silex-button--primary" @click=${() => loadStorageList(async list => onStorageList(list))}>Retry</button>
94
+ <button class="silex-button" @click=${async () => {
95
+ await logout({type: loggedIn.type, connectorId: loggedIn.connectorId})
96
+ openDialog()
97
+ }}>Login with another connector</button>
98
+ </footer>
99
+ `, body)
100
+ }
101
+ return
102
+ }
103
+ // Display the list of storage and continue to login
104
+ render(html`
105
+ <main>
106
+ <p>Login and give Silex access to a file storage.</p>
107
+ ${list.map(connector => html`
108
+ <button
109
+ class="silex-button silex-button--primary"
110
+ id="publish-button--primary"
111
+ @click=${() => loginWithConnector(connector)}
112
+ >Login with ${connector.displayName}</button>
113
+ `)}
114
+ </main>
115
+ <footer>
116
+ </footer>
117
+ `, body)
118
+ }
119
+
120
+ // Auth management
121
+ async function loadStorageList(done: (list: ConnectorData[]) => Promise<void>) {
122
+ try {
123
+ const storageConnectors = await connectorList({type: ConnectorType.STORAGE})
124
+ await done(storageConnectors)
125
+ } catch (err) {
126
+ console.error('Error with loading storage connectors', err)
127
+ render(html`
128
+ <main>
129
+ An error occured while loading the storage connectors: ${err.message}
130
+ </main>
131
+ <footer>
132
+ <button type="button" class="gjs-btn-prim" @click=${() => loadStorageList(done)}>Retry</button>
133
+ </footer>
134
+ `, body)
135
+ }
136
+ }
137
+ async function loginWithConnector(connector: ConnectorData) {
138
+ const nonOAuthUrl = `${SERVER_URL}${API_PATH}${API_CONNECTOR_PATH}${API_CONNECTOR_LOGIN}?connectorId=${connector.connectorId}&type=${connector.type}`
139
+ window.open(connector.oauthUrl ?? nonOAuthUrl, '_blank')
140
+ return new Promise(resolve => {
141
+ render(html`
142
+ <main>
143
+ <p>Waiting for your authorization in popup window...</p>
144
+ </main>
145
+ <footer>
146
+ <button type="button" class="gjs-btn-prim" @click=${() => openDialog()}>Cancel</button>
147
+ </footer>
148
+ `, body)
149
+ const onMessage = async (event) => {
150
+ const data = event.data as ApiConnectorLoggedInPostMessage
151
+ if (data?.type === 'login') {
152
+ window.removeEventListener('message', onMessage)
153
+ const { connectorId, error, message } = data // TODO: use options from the connector? For now they are stored in the session
154
+ if (error) {
155
+ // Error, start over
156
+ console.error('login error', message)
157
+ render(html`
158
+ <main>
159
+ <p>Login failed with error: ${message}</p>
160
+ <footer>
161
+ <button type="button" class="gjs-btn-prim" @click=${() => openDialog()}>Retry</button>
162
+ ${ connectorId ? html`<button class="silex-button" @click=${async () => {
163
+ await logout({type: connector.type, connectorId})
164
+ openDialog()
165
+ }}>Login with another connector</button>` : '' }
166
+
167
+ </footer>
168
+ `, body)
169
+ editor.trigger(eventLoginFailed)
170
+ } else {
171
+ try {
172
+ render(html`
173
+ <main>
174
+ <p>Loging in...</p>
175
+ </main>
176
+ <footer>
177
+ </footer>
178
+ `, body)
179
+ const status = await updateUser(editor, connector.type, connectorId)
180
+ editor.trigger(eventLoggedIn, status)
181
+ closeDialog()
182
+ } catch (err) {
183
+ console.error('Error with loading login status', err)
184
+ render(html`
185
+ <main>
186
+ An error occured, could not get your data.
187
+ ${err.message}
188
+ </main>
189
+ <footer>
190
+ <button type="button" class="gjs-btn-prim" @click=${() => openDialog()}>Retry</button>
191
+ <button class="silex-button" @click=${async () => {
192
+ await logout({type: connector.type, connectorId})
193
+ openDialog()
194
+ }}>Login with another connector</button>
195
+ </footer>
196
+ `, body)
197
+ }
198
+ }
199
+ }
200
+ }
201
+ window.addEventListener('message', onMessage, false)
202
+ })
203
+ }
204
+ }