@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
@@ -0,0 +1,215 @@
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
+ /**
19
+ * Gitlab hosting connector
20
+ * @fileoverview Gitlab hosting connector for Silex, connect to the user's Gitlab account to host websites with .gitlab-ci.yml file template for plain html by default
21
+ * @see https://docs.gitlab.com/ee/api/oauth2.html
22
+ * @see https://docs.gitlab.com/ee/user/project/pages/getting_started/pages_ci_cd_template.html
23
+ */
24
+
25
+ import dedent from 'dedent'
26
+ import GitlabConnector, { GitlabOptions, GitlabSession} from './GitlabConnector'
27
+ import { HostingConnector, ConnectorFile } from '../../server/connectors/connectors'
28
+ import { ConnectorType, WebsiteId, JobData, JobStatus, PublicationJobData } from '../../types'
29
+ import { JobManager } from '../../server/jobs'
30
+ import { ServerConfig } from '../../server/config'
31
+ import { setTimeout } from 'timers/promises'
32
+
33
+ const waitTimeOut = 5000 /* for wait loop in job pages getting */
34
+ const SILEX_OVERWRITE_NOTICE = '# silexOverwrite: true'
35
+
36
+ export default class GitlabHostingConnector extends GitlabConnector implements HostingConnector {
37
+
38
+ displayName = 'Gitlab hosting'
39
+ connectorType = ConnectorType.HOSTING
40
+
41
+ constructor( config: ServerConfig, opts: Partial<GitlabOptions>) {
42
+ super (config, opts)
43
+ // public directory for standard gitlab pages
44
+ this.options.assetsFolder= 'public'
45
+ }
46
+
47
+ async publish(session: GitlabSession, websiteId: WebsiteId, files: ConnectorFile[], {startJob, jobSuccess, jobError}: JobManager): Promise<JobData> {
48
+ const job = startJob(`Publishing to ${this.displayName}`) as PublicationJobData
49
+ job.logs = [[`Publishing to ${this.displayName}`]]
50
+ job.errors = [[]]
51
+ /* Configuration file .gitlab-ci.yml contains template for plain html Gitlab pages*/
52
+ const pathYml = '.gitlab-ci.yml'
53
+ const contentYml = dedent`
54
+ ${SILEX_OVERWRITE_NOTICE}
55
+ # You will want to remove these lines if you customize your build process
56
+ # Silex will overwrite this file unless you remove these lines
57
+ # This is the default build process for plain eleventy sites
58
+ image: node:20
59
+ pages:
60
+ stage: deploy
61
+ environment: production
62
+ script:${files.find(file => file.path.includes('.11tydata.')) ? `
63
+ - npx @11ty/eleventy@v3.0.0-alpha.20 --input=public --output=_site
64
+ - mkdir -p public/css public/assets && cp -R public/css public/assets _site/
65
+ - rm -rf public && mv _site public`
66
+ : ''}
67
+ - echo "The site will be deployed to $CI_PAGES_URL"
68
+ artifacts:
69
+ paths:
70
+ - public
71
+ rules:
72
+ - if: '$CI_COMMIT_TAG'
73
+ - if: '$CI_PIPELINE_SOURCE == "trigger"'
74
+ `
75
+ try {
76
+ const originalCi = await this.readFile(session, websiteId, pathYml)
77
+ if(originalCi.toString().startsWith(SILEX_OVERWRITE_NOTICE)) {
78
+ await this.updateFile(session, websiteId, pathYml, contentYml)
79
+ }
80
+ } catch (e) {
81
+ // If the file .gitlab-ci.yml does not exist, create it, otherwise do nothing (do not overwriting existing one)
82
+ if (e.statusCode === 404 || e.httpStatusCode === 404 || e.message.endsWith('A file with this name doesn\'t exist')) {
83
+ await this.createFile(session, websiteId, pathYml, contentYml)
84
+ } else {
85
+ jobError(job.jobId, e.message)
86
+ }
87
+ }
88
+
89
+ // publishing all files for website
90
+ // Do not await for the result, return the job and continue the publication in the background
91
+ this.writeAssets(session, websiteId, files, async ({status, message}) => {
92
+ // Update the job status
93
+ if(status === JobStatus.SUCCESS) {
94
+ /* Squash and tag the commits */
95
+ const successTag = await this.createTag(session, websiteId, job, { startJob, jobSuccess, jobError })
96
+ if(!successTag) {
97
+ // jobError will have been called in createTag
98
+ return
99
+ }
100
+ try {
101
+ job.message = 'Getting the website URL...'
102
+ job.logs[0].push(job.message)
103
+ const gitlabUrl = await this.getUrl(session, websiteId)
104
+ job.logs[0].push(`Website URL: ${gitlabUrl}`)
105
+ job.message = 'Getting the admin URL...'
106
+ job.logs[0].push(job.message)
107
+ const adminUrl = await this.getAdminUrl(session, websiteId)
108
+ job.logs[0].push(`Admin URL: ${adminUrl}`)
109
+ job.message = 'Getting the page URL...'
110
+ job.logs[0].push(job.message)
111
+ const pageUrl = await this.getPageUrl(session, websiteId, adminUrl)
112
+ job.logs[0].push(`Page URL: ${pageUrl}`)
113
+ job.message = 'Getting the deployment logs URL...'
114
+ job.logs[0].push(job.message)
115
+ const gitlabJobLogsUrl = await this.getGitlabJobLogsUrl(session, websiteId, job, { startJob, jobSuccess, jobError }, adminUrl, successTag)
116
+ // Because of the GitLab policy, this can be null (and we suggest the user to verify their account)
117
+ if (!gitlabJobLogsUrl) {
118
+ let errorMessage = 'Could not retrieve the deployment logs URL.'
119
+
120
+ if (this.isUsingOfficialInstance()) {
121
+ const verifyURL = 'https://gitlab.com/-/identity_verification'
122
+ errorMessage +=
123
+ `<div class="notice">
124
+ If your GitLab account is recent, you may need to verify it <a href="${verifyURL}" target="_blank">here</a>
125
+ in order to be able to use pipelines (this is GitLab's policy, not Silex's).
126
+ </div>`
127
+ }
128
+
129
+ throw new Error(errorMessage)
130
+ }
131
+ job.logs[0].push(`Deployment logs URL: ${gitlabJobLogsUrl}`)
132
+ const message = `
133
+ <p><a href="${gitlabUrl}" target="_blank">Your website will soon be live here</a>.</p>
134
+ <p>Changes may take a few minutes to appear, <a href="${gitlabJobLogsUrl}" target="_blank">follow deployment here</a>.</p>
135
+ <p>Manage <a href="${pageUrl}" target="_blank">GitLab Pages settings</a>.</p>
136
+ `
137
+ job.logs[0].push(message)
138
+ jobSuccess(job.jobId, message)
139
+ } catch (error) {
140
+ console.error('Error during getting the website URLs:', error.message)
141
+ jobError(job.jobId, `Failed to get the website URLs: ${error.message}`)
142
+ }
143
+ } else if (status === JobStatus.ERROR) {
144
+ job.errors[0].push(message)
145
+ jobError(job.jobId, message)
146
+ } else {
147
+ // Update the job status while uploading files
148
+ job.status = status
149
+ job.message = message
150
+ job.logs[0].push(message)
151
+ }
152
+ })
153
+ .catch(e => {
154
+ console.error('Error uploading files to gitlab:', e.message)
155
+ jobError(job.jobId, `Failed to upload files: ${e.message}`)
156
+ })
157
+
158
+ return job
159
+ }
160
+
161
+ /* Get and return Url Gitlab Pages */
162
+ async getUrl(session: GitlabSession, websiteId: WebsiteId): Promise<string> {
163
+ const response = await this.callApi(session, `api/v4/projects/${websiteId}/pages`, 'GET')
164
+ return response.url
165
+ }
166
+
167
+ async getAdminUrl(session: GitlabSession, websiteId: WebsiteId): Promise<string> {
168
+ const projectInfo = await this.callApi(session, `api/v4/projects/${websiteId}`, 'GET')
169
+ return projectInfo.web_url
170
+ }
171
+
172
+ async getPageUrl(session: GitlabSession, websiteId: WebsiteId, projectUrl: string): Promise<string> {
173
+ return `${projectUrl}/pages`
174
+ }
175
+
176
+ // waiting for the job corresponding to the current tag
177
+ async getGitlabJobLogsUrl(session: GitlabSession, websiteId: WebsiteId, job: PublicationJobData, { startJob, jobSuccess, jobError }: JobManager, projectUrl: string, tag): Promise<string | null> {
178
+ const t0 = Date.now()
179
+ do {
180
+ const jobs = await this.callApi(session, `api/v4/projects/${websiteId}/jobs`, 'GET')
181
+ if (!jobs.length) return null
182
+ if (jobs[0].ref === tag) {return `${projectUrl}/-/jobs/${jobs[0].id}`}
183
+ await setTimeout(waitTimeOut)
184
+ } while ((Date.now() - t0) < this.options.timeOut)
185
+
186
+ // failed in timelaps allowed (avoiding infinite loop)
187
+ jobError(job.jobId, 'Failed to get job id')
188
+ job.message = 'Unable to get job id'
189
+ job.logs[0].push(job.message)
190
+ return `${projectUrl}/-/jobs/`
191
+ }
192
+
193
+ async createTag(session: GitlabSession, websiteId: WebsiteId, job: PublicationJobData, { startJob, jobSuccess, jobError }: JobManager): Promise<string | null> {
194
+ const projectId = websiteId // Assuming websiteId corresponds to GitLab project ID
195
+ const newTag = '_silex_' + Date.now()
196
+ // Create a new tag
197
+ try {
198
+ job.message = `Creating new tag ${newTag}...`
199
+ job.logs[0].push(job.message)
200
+ await this.callApi(session, `api/v4/projects/${projectId}/repository/tags`, 'POST', {
201
+ tag_name: newTag,
202
+ ref: 'main',
203
+ message: 'Publication from Silex',
204
+ })
205
+ } catch (error) {
206
+ console.error('Error during creating new tag:', error.message)
207
+ jobError(job.jobId, `Failed to create new tag: ${error.message}`)
208
+ return null
209
+ }
210
+
211
+ // Return new tag
212
+ return newTag
213
+ }
214
+
215
+ }
@@ -0,0 +1,14 @@
1
+
2
+ //import { minify } from 'html-minifier'
3
+ //const optim = files.map(file => ({
4
+ // ...file,
5
+ // html: minify(file.html, {
6
+ // continueOnParseError: true,
7
+ // collapseInlineTagWhitespace: true,
8
+ // collapseWhitespace: true,
9
+ // minifyCSS: true,
10
+ // minifyJS: true,
11
+ // removeScriptTypeAttributes: true,
12
+ // removeStyleLinkTypeAttributes: true,
13
+ // }).trim(),
14
+ //}))
@@ -0,0 +1,84 @@
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 express from 'express'
19
+ import { readFileSync } from 'fs'
20
+ import { createServer } from 'https'
21
+ import forceSSL from 'express-force-ssl'
22
+ import { ServerEvent } from '../../server/events'
23
+
24
+ // interface SslOptions {
25
+ // forceHttps?: boolean
26
+ // trustXFPHeader?: boolean
27
+ // privateKey?: string
28
+ // certificate?: string
29
+ // sslPort?: string
30
+ // }
31
+
32
+ export default async function(config, opts = {}) {
33
+ // Options with defaults
34
+ const options = {
35
+ forceHttps: process.env.SILEX_FORCE_HTTPS === 'true',
36
+ trustXFPHeader: process.env.SILEX_FORCE_HTTPS_TRUST_XFP_HEADER === 'true',
37
+ privateKey: process.env.SILEX_SSL_PRIVATE_KEY,
38
+ certificate: process.env.SILEX_SSL_CERTIFICATE,
39
+ sslPort: process.env.SSL_PORT || '443',
40
+ ...opts,
41
+ }
42
+
43
+ // Add routes on silex startup
44
+ config.on(ServerEvent.STARTUP_START, ({app}) => {
45
+ const router = express.Router()
46
+
47
+ // SSL
48
+ // force ssl if the env var SILEX_FORCE_HTTPS is set
49
+ if (options.forceHttps) {
50
+ console.info('> [SslPlugin] Force SSL option is enabled')
51
+ app.set('forceSSLOptions', {
52
+ trustXFPHeader: !!options.trustXFPHeader,
53
+ })
54
+ router.use(forceSSL)
55
+ } else {
56
+ console.info('> [SslPlugin] Force SSL option is disabled, env var SILEX_FORCE_HTTPS not set')
57
+ }
58
+
59
+ // SSL certificate
60
+ if (options.privateKey && options.certificate) {
61
+ console.info('> [SslPlugin] SSL certificate is enabled, found certificate:', options.certificate)
62
+ try {
63
+ const privateKey = readFileSync(options.privateKey).toString()
64
+ const certificate = readFileSync(options.certificate).toString()
65
+
66
+ const sslServerOptions = {
67
+ key: privateKey,
68
+ cert: certificate,
69
+ requestCert: true,
70
+ rejectUnauthorized: false,
71
+ }
72
+
73
+ createServer(sslServerOptions, this).listen(options.sslPort, () => {
74
+ console.info('> [SslPlugin] Listening on port ', options.sslPort)
75
+ })
76
+ } catch (e) {
77
+ console.error('> [SslPlugin] Load certificate failed.', e)
78
+ }
79
+ } else {
80
+ console.info('> [SslPlugin] Certificate disabled, env vars SILEX_SSL_CERTIFICATE and SILEX_SSL_PRIVATE_KEY not set')
81
+ }
82
+ app.use(router)
83
+ })
84
+ }
@@ -0,0 +1,45 @@
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 express from 'express'
19
+ import serveStatic from 'serve-static'
20
+ import { withCache } from './Cache'
21
+ import { ServerEvent } from '../../server/events'
22
+
23
+ type StaticOptions = {
24
+ routes: {
25
+ path: string
26
+ route: string
27
+ }[]
28
+ }
29
+
30
+ export default async function(config, options: StaticOptions = { routes: [] }) {
31
+ if(!options.routes) throw new Error('The config for static module has no `routes` attribute')
32
+ console.info(`> [StaticPlugin] Serving ${options.routes.length} static files`)
33
+
34
+ config.on(ServerEvent.STARTUP_START, ({app}) => {
35
+ const router = express.Router()
36
+ options.routes
37
+ .forEach(folder => {
38
+ if (!folder.route) throw new Error('The config for static module has no `route` attribute')
39
+ if (!folder.path) throw new Error('The config for static module has no `path` attribute')
40
+ console.info(`> [StaticPlugin] Serving static files from ${folder.path} on ${folder.route}`)
41
+ router.use(folder.route, serveStatic(folder.path))
42
+ })
43
+ app.use(withCache, router)
44
+ })
45
+ }
@@ -0,0 +1,19 @@
1
+ import { Router } from 'express'
2
+ import { ServerConfig } from '../config'
3
+ import { noCache } from '../../plugins/server/Cache'
4
+
5
+ import connectorApi from './connectorApi'
6
+ import websiteApi from './websiteApi'
7
+ import publicationApi from './publicationApi'
8
+ import { API_CONNECTOR_PATH, API_PUBLICATION_PATH, API_WEBSITE_PATH } from '../../constants'
9
+
10
+ export default function(config: ServerConfig): Router {
11
+ const router = Router()
12
+ router.use(noCache)
13
+
14
+ router.use(API_CONNECTOR_PATH, connectorApi(config))
15
+ router.use(API_WEBSITE_PATH, websiteApi(config))
16
+ router.use(API_PUBLICATION_PATH, publicationApi(config))
17
+
18
+ return router
19
+ }