@silexlabs/silex 3.0.1-alpha.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/.env.default +20 -0
  2. package/.silex.js +67 -8
  3. package/LICENSE +661 -203
  4. package/README.md +37 -35
  5. package/dist/client/client/api.d.ts +90 -0
  6. package/dist/client/client/assetUrl.d.ts +54 -0
  7. package/dist/client/client/config.d.ts +102 -0
  8. package/dist/client/client/events.d.ts +23 -0
  9. package/dist/client/client/expose.d.ts +8 -0
  10. package/dist/client/client/grapesjs/LoginDialog.d.ts +15 -0
  11. package/dist/client/client/grapesjs/PublicationManager.d.ts +73 -0
  12. package/dist/client/client/grapesjs/PublicationUi.d.ts +59 -0
  13. package/dist/client/client/grapesjs/blocks.d.ts +1 -0
  14. package/dist/client/client/grapesjs/breadcrumbs.d.ts +1 -0
  15. package/dist/client/client/grapesjs/css-props.d.ts +6 -0
  16. package/dist/client/client/grapesjs/footer.d.ts +2 -0
  17. package/dist/client/client/grapesjs/img.d.ts +6 -0
  18. package/dist/client/client/grapesjs/index.d.ts +9 -0
  19. package/dist/client/client/grapesjs/internal-links.d.ts +1 -0
  20. package/dist/client/client/grapesjs/keymaps.d.ts +123 -0
  21. package/dist/client/client/grapesjs/new-page-dialog.d.ts +2 -0
  22. package/dist/client/client/grapesjs/openImport.d.ts +9 -0
  23. package/dist/client/client/grapesjs/page-panel.d.ts +9 -0
  24. package/dist/client/client/grapesjs/project-bar.d.ts +21 -0
  25. package/dist/client/client/grapesjs/resize-panel.d.ts +1 -0
  26. package/dist/client/client/grapesjs/rich-text.d.ts +4 -0
  27. package/dist/client/client/grapesjs/semantic.d.ts +1 -0
  28. package/dist/client/client/grapesjs/settings-sections.d.ts +16 -0
  29. package/dist/client/client/grapesjs/settings.d.ts +4 -0
  30. package/dist/client/client/grapesjs/storage.d.ts +2 -0
  31. package/dist/client/client/grapesjs/symbolDialogs.d.ts +3 -0
  32. package/dist/client/client/grapesjs/view-buttons.d.ts +1 -0
  33. package/dist/client/client/index.d.ts +10 -0
  34. package/dist/client/client/publication-transformers.d.ts +42 -0
  35. package/dist/client/client/publish-custom-code-block.d.ts +4 -0
  36. package/dist/client/client/publish-fonts.d.ts +4 -0
  37. package/dist/client/client/utils.d.ts +22 -0
  38. package/dist/client/constants.d.ts +32 -0
  39. package/dist/client/css/admin.css +1114 -328
  40. package/dist/client/css/admin.css.map +1 -0
  41. package/dist/client/grapesjs-filter-styles/dist/index.d.ts +4 -0
  42. package/dist/client/grapesjs-fonts/dist/index.d.ts +4 -0
  43. package/dist/client/grapesjs-fonts/src/commands.d.ts +3 -0
  44. package/dist/client/grapesjs-fonts/src/fonts.d.ts +4 -0
  45. package/dist/client/grapesjs-storage-rate-limit/dist/index.d.ts +4 -0
  46. package/dist/client/grapesjs-ui-suggest-classes/dist/index.d.ts +4 -0
  47. package/dist/client/index.html +3 -2
  48. package/dist/client/js/main.js +356 -131
  49. package/dist/client/js/main.js.LICENSE.txt +15 -1
  50. package/dist/client/page.d.ts +2 -0
  51. package/dist/client/silex-lib/src/ts/client/api.d.ts +90 -0
  52. package/dist/client/silex-lib/src/ts/client/assetUrl.d.ts +54 -0
  53. package/dist/client/silex-lib/src/ts/client/config.d.ts +102 -0
  54. package/dist/client/silex-lib/src/ts/client/events.d.ts +23 -0
  55. package/dist/client/silex-lib/src/ts/client/expose.d.ts +8 -0
  56. package/dist/client/silex-lib/src/ts/client/grapesjs/LoginDialog.d.ts +15 -0
  57. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationManager.d.ts +73 -0
  58. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationUi.d.ts +59 -0
  59. package/dist/client/silex-lib/src/ts/client/grapesjs/blocks.d.ts +1 -0
  60. package/dist/client/silex-lib/src/ts/client/grapesjs/breadcrumbs.d.ts +1 -0
  61. package/dist/client/silex-lib/src/ts/client/grapesjs/css-props.d.ts +6 -0
  62. package/dist/client/silex-lib/src/ts/client/grapesjs/footer.d.ts +2 -0
  63. package/dist/client/silex-lib/src/ts/client/grapesjs/img.d.ts +6 -0
  64. package/dist/client/silex-lib/src/ts/client/grapesjs/index.d.ts +9 -0
  65. package/dist/client/silex-lib/src/ts/client/grapesjs/internal-links.d.ts +1 -0
  66. package/dist/client/silex-lib/src/ts/client/grapesjs/keymaps.d.ts +123 -0
  67. package/dist/client/silex-lib/src/ts/client/grapesjs/new-page-dialog.d.ts +2 -0
  68. package/dist/client/silex-lib/src/ts/client/grapesjs/openImport.d.ts +9 -0
  69. package/dist/client/silex-lib/src/ts/client/grapesjs/page-panel.d.ts +9 -0
  70. package/dist/client/silex-lib/src/ts/client/grapesjs/project-bar.d.ts +21 -0
  71. package/dist/client/silex-lib/src/ts/client/grapesjs/resize-panel.d.ts +1 -0
  72. package/dist/client/silex-lib/src/ts/client/grapesjs/rich-text.d.ts +4 -0
  73. package/dist/client/silex-lib/src/ts/client/grapesjs/semantic.d.ts +1 -0
  74. package/dist/client/silex-lib/src/ts/client/grapesjs/settings-sections.d.ts +16 -0
  75. package/dist/client/silex-lib/src/ts/client/grapesjs/settings.d.ts +4 -0
  76. package/dist/client/silex-lib/src/ts/client/grapesjs/storage.d.ts +2 -0
  77. package/dist/client/silex-lib/src/ts/client/grapesjs/symbolDialogs.d.ts +3 -0
  78. package/dist/client/silex-lib/src/ts/client/grapesjs/view-buttons.d.ts +1 -0
  79. package/dist/client/silex-lib/src/ts/client/index.d.ts +10 -0
  80. package/dist/client/silex-lib/src/ts/client/publication-transformers.d.ts +42 -0
  81. package/dist/client/silex-lib/src/ts/client/publish-custom-code-block.d.ts +4 -0
  82. package/dist/client/silex-lib/src/ts/client/publish-fonts.d.ts +4 -0
  83. package/dist/client/silex-lib/src/ts/client/utils.d.ts +22 -0
  84. package/dist/client/silex-lib/src/ts/constants.d.ts +32 -0
  85. package/dist/client/silex-lib/src/ts/page.d.ts +2 -0
  86. package/dist/client/silex-lib/src/ts/types.d.ts +339 -0
  87. package/dist/client/types.d.ts +339 -0
  88. package/dist/plugins/client/client/events.d.ts +23 -0
  89. package/dist/plugins/client/client/events.js +43 -0
  90. package/dist/plugins/client/client/events.js.map +1 -0
  91. package/dist/plugins/client/plugins/client/template.d.ts +2 -0
  92. package/dist/plugins/client/plugins/client/template.js +234 -0
  93. package/dist/plugins/client/plugins/client/template.js.map +1 -0
  94. package/dist/plugins/client/plugins/client/website-info.d.ts +1 -0
  95. package/dist/plugins/client/plugins/client/website-info.js +72 -0
  96. package/dist/plugins/client/plugins/client/website-info.js.map +1 -0
  97. package/dist/plugins/client/types.d.ts +339 -0
  98. package/dist/plugins/client/types.js +80 -0
  99. package/dist/plugins/client/types.js.map +1 -0
  100. package/dist/plugins/server/constants.d.ts +32 -0
  101. package/dist/plugins/server/constants.js +76 -0
  102. package/dist/plugins/server/constants.js.map +1 -0
  103. package/dist/plugins/server/plugins/server/Cache.d.ts +2 -0
  104. package/dist/plugins/server/plugins/server/Cache.js +36 -0
  105. package/dist/plugins/server/plugins/server/Cache.js.map +1 -0
  106. package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +29 -0
  107. package/dist/plugins/server/plugins/server/DownloadConnector.js +127 -0
  108. package/dist/plugins/server/plugins/server/DownloadConnector.js.map +1 -0
  109. package/dist/plugins/server/plugins/server/FtpConnector.d.ts +86 -0
  110. package/dist/plugins/server/plugins/server/FtpConnector.js +536 -0
  111. package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -0
  112. package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +135 -0
  113. package/dist/plugins/server/plugins/server/GitlabConnector.js +649 -0
  114. package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -0
  115. package/dist/plugins/server/plugins/server/GitlabHostingConnector.d.ts +16 -0
  116. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js +209 -0
  117. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js.map +1 -0
  118. package/dist/plugins/server/plugins/server/PublicationOptimizer.d.ts +0 -0
  119. package/dist/plugins/server/plugins/server/PublicationOptimizer.js +14 -0
  120. package/dist/plugins/server/plugins/server/PublicationOptimizer.js.map +1 -0
  121. package/dist/plugins/server/plugins/server/SslPlugin.d.ts +1 -0
  122. package/dist/plugins/server/plugins/server/SslPlugin.js +86 -0
  123. package/dist/plugins/server/plugins/server/SslPlugin.js.map +1 -0
  124. package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +8 -0
  125. package/dist/plugins/server/plugins/server/StaticPlugin.js +45 -0
  126. package/dist/plugins/server/plugins/server/StaticPlugin.js.map +1 -0
  127. package/dist/plugins/server/server/config.d.ts +59 -0
  128. package/dist/plugins/server/server/config.js +181 -0
  129. package/dist/plugins/server/server/config.js.map +1 -0
  130. package/dist/plugins/server/server/connectors/FsHosting.d.ts +14 -0
  131. package/dist/plugins/server/server/connectors/FsHosting.js +66 -0
  132. package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -0
  133. package/dist/plugins/server/server/connectors/FsStorage.d.ts +44 -0
  134. package/dist/plugins/server/server/connectors/FsStorage.js +261 -0
  135. package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -0
  136. package/dist/plugins/server/server/connectors/connectors.d.ts +86 -0
  137. package/dist/plugins/server/server/connectors/connectors.js +126 -0
  138. package/dist/plugins/server/server/connectors/connectors.js.map +1 -0
  139. package/dist/plugins/server/server/events.d.ts +26 -0
  140. package/dist/plugins/server/server/events.js +31 -0
  141. package/dist/plugins/server/server/events.js.map +1 -0
  142. package/dist/plugins/server/server/jobs.d.ts +12 -0
  143. package/dist/plugins/server/server/jobs.js +79 -0
  144. package/dist/plugins/server/server/jobs.js.map +1 -0
  145. package/dist/plugins/server/server/utils/validation.d.ts +7 -0
  146. package/dist/plugins/server/server/utils/validation.js +37 -0
  147. package/dist/plugins/server/server/utils/validation.js.map +1 -0
  148. package/dist/plugins/server/types.d.ts +339 -0
  149. package/dist/plugins/server/types.js +84 -0
  150. package/dist/plugins/server/types.js.map +1 -0
  151. package/dist/server/constants.js +55 -0
  152. package/dist/server/plugins/server/Cache.js +19 -0
  153. package/dist/server/server/api/api.js +20 -0
  154. package/dist/server/server/api/connectorApi.js +334 -0
  155. package/dist/server/server/api/publicationApi.js +106 -0
  156. package/dist/server/server/api/websiteApi.js +315 -0
  157. package/dist/server/server/cli.js +71 -0
  158. package/dist/server/server/config.js +120 -0
  159. package/dist/server/server/connectors/FsHosting.js +47 -0
  160. package/dist/server/server/connectors/FsStorage.js +228 -0
  161. package/dist/server/server/connectors/connectors.js +88 -0
  162. package/dist/server/server/events.js +14 -0
  163. package/dist/server/server/expose.js +27 -0
  164. package/dist/server/server/express.js +46 -0
  165. package/dist/server/server/index.js +94 -0
  166. package/dist/server/server/jobs.js +50 -0
  167. package/dist/server/server/utils/validation.js +14 -0
  168. package/dist/server/types.js +40 -0
  169. package/package.json +99 -49
  170. package/public/assets/download.png +0 -0
  171. package/public/assets/favicon.ico +0 -0
  172. package/public/assets/favicon.png +0 -0
  173. package/public/assets/ftp.png +0 -0
  174. package/public/assets/gitlab.png +0 -0
  175. package/public/assets/gitlab2.png +0 -0
  176. package/public/assets/laptop.png +0 -0
  177. package/public/assets/logo-silex-small.png +0 -0
  178. package/public/silex.js +22 -23
  179. package/src/css/_variables.scss +24 -20
  180. package/src/css/dialog.scss +35 -2
  181. package/src/css/fonts.scss +31 -0
  182. package/src/css/footer.scss +12 -0
  183. package/src/css/grapesjs-light.scss +180 -0
  184. package/src/css/grapesjs-plugins.scss +227 -0
  185. package/src/css/grapesjs.scss +159 -1
  186. package/src/css/index.scss +12 -1
  187. package/src/css/light.scss +7 -0
  188. package/src/css/loader.scss +2 -0
  189. package/src/css/project-bar.scss +32 -16
  190. package/src/css/silex.scss +79 -5
  191. package/src/css/website-info.scss +14 -0
  192. package/src/html/index.pug +3 -3
  193. package/src/html/templates/includes.pug +0 -1
  194. package/src/ts/client/api.ts +156 -0
  195. package/src/ts/client/assetUrl.test.ts +164 -0
  196. package/src/ts/client/assetUrl.ts +254 -0
  197. package/src/ts/client/config.ts +175 -13
  198. package/src/ts/client/events.ts +43 -0
  199. package/src/ts/client/expose.ts +27 -1
  200. package/src/ts/client/grapesjs/LoginDialog.ts +204 -0
  201. package/src/ts/client/grapesjs/PublicationManager.ts +433 -0
  202. package/src/ts/client/grapesjs/PublicationUi.ts +366 -0
  203. package/src/ts/client/grapesjs/blocks.ts +17 -0
  204. package/src/ts/client/grapesjs/breadcrumbs.ts +79 -0
  205. package/src/ts/client/grapesjs/css-props.ts +910 -0
  206. package/src/ts/client/grapesjs/eleventy.ts +30 -7
  207. package/src/ts/client/grapesjs/footer.ts +42 -0
  208. package/src/ts/client/grapesjs/img.ts +147 -0
  209. package/src/ts/client/grapesjs/index.ts +311 -122
  210. package/src/ts/client/grapesjs/internal-links.test.ts +19 -1
  211. package/src/ts/client/grapesjs/internal-links.ts +31 -7
  212. package/src/ts/client/grapesjs/keymaps.ts +207 -0
  213. package/src/ts/client/grapesjs/new-page-dialog.ts +19 -3
  214. package/src/ts/client/grapesjs/openImport.ts +22 -0
  215. package/src/ts/client/grapesjs/page-panel.ts +109 -7
  216. package/src/ts/client/grapesjs/project-bar.ts +133 -72
  217. package/src/ts/client/grapesjs/resize-panel.ts +20 -0
  218. package/src/ts/client/grapesjs/rich-text.ts +38 -13
  219. package/src/ts/client/grapesjs/semantic.ts +20 -3
  220. package/src/ts/client/grapesjs/settings-sections.ts +117 -0
  221. package/src/ts/client/grapesjs/settings.ts +191 -96
  222. package/src/ts/client/grapesjs/storage.ts +187 -0
  223. package/src/ts/client/grapesjs/symbolDialogs.ts +21 -5
  224. package/src/ts/client/grapesjs/view-buttons.ts +42 -0
  225. package/src/ts/client/index.ts +80 -21
  226. package/src/ts/client/publication-transformers.test.ts +207 -0
  227. package/src/ts/client/publication-transformers.ts +280 -0
  228. package/src/ts/client/publish-custom-code-block.ts +31 -0
  229. package/src/ts/client/publish-fonts.ts +36 -0
  230. package/src/ts/client/utils.ts +70 -1
  231. package/src/ts/constants.ts +78 -0
  232. package/src/ts/externs.ts +17 -0
  233. package/src/ts/page.ts +20 -3
  234. package/src/ts/plugins/client/template.ts +246 -0
  235. package/src/ts/plugins/client/website-info.ts +84 -0
  236. package/src/ts/plugins/server/Cache.ts +32 -0
  237. package/src/ts/plugins/server/DownloadConnector.ts +146 -0
  238. package/src/ts/plugins/server/FtpConnector.test.ts +82 -0
  239. package/src/ts/plugins/server/FtpConnector.ts +621 -0
  240. package/src/ts/plugins/server/GitlabConnector.ts +749 -0
  241. package/src/ts/plugins/server/GitlabHostingConnector.ts +215 -0
  242. package/src/ts/plugins/server/PublicationOptimizer.ts +14 -0
  243. package/src/ts/plugins/server/SslPlugin.ts +84 -0
  244. package/src/ts/plugins/server/StaticPlugin.ts +45 -0
  245. package/src/ts/server/api/api.ts +19 -0
  246. package/src/ts/server/api/connectorApi.ts +464 -0
  247. package/src/ts/server/api/publicationApi.ts +159 -0
  248. package/src/ts/server/api/websiteApi.ts +462 -0
  249. package/src/ts/server/cli.ts +48 -14
  250. package/src/ts/server/config.ts +158 -60
  251. package/src/ts/server/connectors/FsHosting.ts +66 -0
  252. package/src/ts/server/connectors/FsStorage.test.ts +51 -0
  253. package/src/ts/server/connectors/FsStorage.ts +290 -0
  254. package/src/ts/server/connectors/connectors.ts +203 -0
  255. package/src/ts/server/events.ts +37 -0
  256. package/src/ts/server/expose.ts +19 -0
  257. package/src/ts/server/express.ts +57 -5
  258. package/src/ts/server/index.ts +79 -16
  259. package/src/ts/server/jobs.test.ts +75 -0
  260. package/src/ts/server/jobs.ts +89 -0
  261. package/src/ts/server/utils/BackwardCompat.ts +546 -528
  262. package/src/ts/server/utils/validation.ts +34 -0
  263. package/src/ts/types.ts +295 -85
  264. package/.dockerignore +0 -5
  265. package/.editorconfig +0 -14
  266. package/.eslintrc.json +0 -43
  267. package/.github/FUNDING.yml +0 -13
  268. package/.github/workflows/docker-hub-publish.yml +0 -36
  269. package/.github/workflows/npm-publish.yml +0 -19
  270. package/.github/workflows/test.yml +0 -26
  271. package/.nvmrc +0 -1
  272. package/.silex/default/.silex.data.json +0 -1
  273. package/CODE_OF_CONDUCT.md +0 -128
  274. package/CONTRIBUTING.md +0 -131
  275. package/Dockerfile +0 -15
  276. package/directus.silex.js +0 -7
  277. package/dist/constants.js +0 -4
  278. package/dist/events.js +0 -5
  279. package/dist/page.js +0 -15
  280. package/dist/server/cli.js +0 -43
  281. package/dist/server/config.js +0 -70
  282. package/dist/server/express.js +0 -18
  283. package/dist/server/index.js +0 -58
  284. package/dist/types.js +0 -34
  285. package/jest.config.js +0 -10
  286. package/logos/logo_by_ceubri/silex-icon-2018@200px.png +0 -0
  287. package/logos/logo_by_ceubri/silex-icon-2018@4x.png +0 -0
  288. package/logos/logo_by_ceubri/silex-logo-2018-white-transp.pdf +0 -0
  289. package/logos/logo_by_ceubri/silex-logo-2018-white.jpg +0 -0
  290. package/logos/logo_by_ceubri/silex-logo-2018-white.pdf +0 -0
  291. package/logos/logo_by_ceubri/silex-logo-2018-white.png +0 -0
  292. package/logos/logo_by_ceubri/silex-logo-2018-white@0.5x.png +0 -0
  293. package/logos/logo_by_ceubri/silex-logo-2018-white@0.75x.png +0 -0
  294. package/logos/logo_by_ceubri/silex-logo-2018-white@4x.jpg +0 -0
  295. package/logos/logo_by_ceubri/silex-logo-2018-white@4x.png +0 -0
  296. package/logos/logo_by_ceubri/silex-logo-2018.ai +5 -2521
  297. package/logos/logo_by_ceubri/silex-logo-2018.jpg +0 -0
  298. package/logos/logo_by_ceubri/silex-logo-2018.pdf +0 -0
  299. package/logos/logo_by_ceubri/silex-logo-2018.png +0 -0
  300. package/logos/logo_by_ceubri/silex-logo-2018@0.5x.png +0 -0
  301. package/logos/logo_by_ceubri/silex-logo-2018@0.75x.png +0 -0
  302. package/logos/logo_by_ceubri/silex-logo-2018@4x.jpg +0 -0
  303. package/logos/logo_by_ceubri/silex-logo-2018@4x.png +0 -0
  304. package/logos/silexlabs.png +0 -0
  305. package/src/example-client-config.js +0 -47
  306. package/src/plugins/AuthPlugin.js +0 -21
  307. package/src/plugins/Cache.js +0 -11
  308. package/src/plugins/DefaultBackend.js +0 -149
  309. package/src/plugins/ExpressPlugin.js +0 -39
  310. package/src/plugins/HooksPlugin.js +0 -58
  311. package/src/plugins/PublishPlugin.js +0 -69
  312. package/src/plugins/SslPlugin.js +0 -66
  313. package/src/plugins/StaticPlugin.js +0 -48
  314. package/src/plugins/WebsitePlugin.js +0 -207
  315. package/src/ts/client/grapesjs/publish.ts +0 -386
  316. package/src/ts/client/grapesjs/template.ts +0 -166
  317. package/src/ts/events.ts +0 -2
  318. package/tsconfig-server-debug.json +0 -19
  319. package/tsconfig-server-release.json +0 -19
  320. package/tsconfig.jest.json +0 -9
  321. package/tsconfig.json +0 -26
  322. package/webpack.config.js +0 -28
  323. package/webpack.debug.config.js +0 -8
@@ -0,0 +1,462 @@
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 { Router } from 'express'
19
+ import formidable from 'formidable'
20
+ import PersistentFile from 'formidable/src/PersistentFile'
21
+ import { API_WEBSITE_ASSET_READ, API_WEBSITE_ASSETS_WRITE, API_WEBSITE_READ, API_WEBSITE_WRITE, API_WEBSITE_DELETE, API_WEBSITE_META_READ, API_WEBSITE_META_WRITE, API_WEBSITE_LIST, API_WEBSITE_CREATE, API_PATH, API_WEBSITE_PATH, API_WEBSITE_DUPLICATE } from '../../constants'
22
+ import { createReadStream } from 'fs'
23
+ import { ApiError, ApiWebsiteAssetsReadParams, ApiWebsiteAssetsReadQuery, ApiWebsiteAssetsReadResponse, ApiWebsiteAssetsWriteQuery, ApiWebsiteAssetsWriteResponse, ApiWebsiteDeleteQuery, ApiWebsiteReadQuery, ApiWebsiteReadResponse, ApiWebsiteWriteBody, ApiWebsiteWriteQuery, ConnectorId, ConnectorType, WebsiteMeta, WebsiteData, WebsiteId, ApiWebsiteListQuery, ApiWebsiteListResponse, ApiWebsiteMetaReadQuery, ApiWebsiteMetaReadResponse, ApiWebsiteMetaWriteQuery, ApiWebsiteMetaWriteBody, WebsiteMetaFileContent, ApiWebsiteMetaWriteResponse, ApiWebsiteWriteResponse, ApiWebsiteCreateQuery, ApiWebsiteCreateBody, ApiWebsiteDuplicateQuery } from '../../types'
24
+ import { ConnectorFile, ConnectorFileContent, ConnectorSession, StorageConnector, getConnector } from '../connectors/connectors'
25
+ import { Readable } from 'stream'
26
+ import { requiredParam } from '../utils/validation'
27
+ import { basename, join } from 'path'
28
+ import { ServerConfig } from '../config'
29
+ import { ServerEvent, WebsiteStoreEndEventType, WebsiteStoreStartEventType, WebsiteAssetStoreStartEventType, WebsiteAssetStoreEndEventType } from '../events'
30
+
31
+ /**
32
+ * @fileoverview Website plugin for Silex
33
+ * This plugin provides the website API to Silex server
34
+ */
35
+
36
+ export default function (config: ServerConfig, opts = {}): Router {
37
+ // Options with defaults
38
+ const options = {
39
+ // Default constants
40
+ assetsPath: '/assets',
41
+ // Options
42
+ ...opts
43
+ }
44
+
45
+ // Create a new router
46
+ const router = Router()
47
+
48
+ // Load website data
49
+ router.get(API_WEBSITE_READ, async (req, res, next) => {
50
+ const query = req.query as ApiWebsiteReadQuery
51
+ const { websiteId, connectorId } = query
52
+ const session = req['session'] as ConnectorSession
53
+ if(!websiteId) {
54
+ // List websites
55
+ next()
56
+ return
57
+ }
58
+ try {
59
+ // Get website data
60
+ const websiteData: WebsiteData | Readable = await readWebsite(
61
+ session,
62
+ websiteId,
63
+ connectorId,
64
+ )
65
+ if (websiteData instanceof Readable) {
66
+ websiteData.pipe(res.type('application/json'))
67
+ } else {
68
+ res.json(websiteData as ApiWebsiteReadResponse)
69
+ }
70
+ } catch (e) {
71
+ if (e.httpStatusCode) {
72
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
73
+ } else {
74
+ res.status(500).json({ message: e.message } as ApiError)
75
+ }
76
+ }
77
+ })
78
+
79
+ // List websites
80
+ router.get(API_WEBSITE_LIST, async (req, res) => {
81
+ const query: ApiWebsiteListQuery = req.query
82
+ const { connectorId } = query
83
+ const session = req['session'] as ConnectorSession
84
+ try {
85
+ // List websites
86
+ const websites = await listWebsites(req['session'], query.connectorId as string | undefined)
87
+ res.json(websites as ApiWebsiteListResponse)
88
+ } catch (e) {
89
+ console.error('Error getting website data', e)
90
+ if (e.httpStatusCode) {
91
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
92
+ } else {
93
+ res.status(500).json({ message: e.message } as ApiError)
94
+ }
95
+ }
96
+ })
97
+
98
+ // Save website data
99
+ router.post(API_WEBSITE_WRITE, async (req, res) => {
100
+ try {
101
+ // Check input
102
+ const query: ApiWebsiteWriteQuery = req.query as any
103
+ const body: ApiWebsiteWriteBody = req.body
104
+ const websiteId= requiredParam<WebsiteId>(query.websiteId, 'Website id')
105
+ const websiteData = requiredParam<WebsiteData>(body, 'Website data') as WebsiteData
106
+ const connectorId = query.connectorId // Optional
107
+ // Hook to modify the website data before saving
108
+ config.emit(ServerEvent.WEBSITE_STORE_START, { websiteId, websiteData, connectorId } as WebsiteStoreStartEventType)
109
+ // Save website data
110
+ await writeWebsite(
111
+ req['session'],
112
+ websiteId,
113
+ websiteData,
114
+ connectorId,
115
+ )
116
+ config.emit(ServerEvent.WEBSITE_STORE_END, null as WebsiteStoreEndEventType)
117
+ res.status(200).json({ message: 'Website saved' } as ApiWebsiteWriteResponse)
118
+ } catch (e) {
119
+ console.error('Error saving website data', e)
120
+ config.emit(ServerEvent.WEBSITE_STORE_END, e as WebsiteStoreEndEventType)
121
+ if (e.httpStatusCode) {
122
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
123
+ } else {
124
+ res.status(500).json({ message: e.message } as ApiError)
125
+ }
126
+ }
127
+ })
128
+
129
+ // Create website or update website meta
130
+ router.put(API_WEBSITE_CREATE, async (req, res) => {
131
+ try {
132
+ // Check input
133
+ const session = req['session'] as ConnectorSession
134
+ const query: ApiWebsiteCreateQuery = req.query as any
135
+ const body: ApiWebsiteCreateBody = req.body
136
+ const websiteMeta = requiredParam<WebsiteMetaFileContent>(body, 'Website meta') as WebsiteMeta
137
+ const connectorId = query.connectorId
138
+ const connector = await getConnector<StorageConnector>(config, session, ConnectorType.STORAGE, connectorId)
139
+ if(!connector) {
140
+ throw new ApiError(`Connector ${connectorId} not found`, 500)
141
+ }
142
+ // Create website
143
+ await connector.createWebsite(
144
+ session,
145
+ websiteMeta,
146
+ )
147
+ res.json({ message: 'Website meta saved' } as ApiWebsiteMetaWriteResponse)
148
+ } catch (e) {
149
+ console.error('Error saving website meta', e)
150
+ if (e.httpStatusCode) {
151
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
152
+ } else {
153
+ res.status(500).json({ message: e.message } as ApiError)
154
+ }
155
+ }
156
+ })
157
+
158
+ // Update website meta
159
+ router.post(API_WEBSITE_META_WRITE, async (req, res) => {
160
+ try {
161
+ // Check input
162
+ const session = req['session'] as ConnectorSession
163
+ const query: ApiWebsiteMetaWriteQuery = req.query as any
164
+ const body: ApiWebsiteMetaWriteBody = req.body
165
+ const websiteId= requiredParam<WebsiteId>(query.websiteId, 'Website id')
166
+ const websiteMeta = requiredParam<WebsiteMetaFileContent>(body, 'Website meta') as WebsiteMeta
167
+ const connectorId = query.connectorId
168
+ const connector = await getConnector<StorageConnector>(config, session, ConnectorType.STORAGE, connectorId)
169
+ if(!connector) {
170
+ throw new ApiError(`Connector ${connectorId} not found`, 500)
171
+ }
172
+ // Update website meta
173
+ await connector.setWebsiteMeta(
174
+ session,
175
+ websiteId,
176
+ websiteMeta,
177
+ )
178
+ res.json({ message: 'Website meta saved' } as ApiWebsiteMetaWriteResponse)
179
+ } catch (e) {
180
+ console.error('Error saving website meta', e)
181
+ if (e.httpStatusCode) {
182
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
183
+ } else {
184
+ res.status(500).json({ message: e.message } as ApiError)
185
+ }
186
+ }
187
+ })
188
+
189
+ // Get website meta
190
+ router.get(API_WEBSITE_META_READ, async (req, res) => {
191
+ try {
192
+ const session = req['session'] as ConnectorSession
193
+ const query: ApiWebsiteMetaReadQuery = req.query as any
194
+ const websiteId= requiredParam<WebsiteId>(query.websiteId, 'Website id')
195
+ const connectorId = query.connectorId
196
+ const connector = await getConnector<StorageConnector>(config, session, ConnectorType.STORAGE, connectorId)
197
+ if(!connector) {
198
+ throw new ApiError(`Connector ${connectorId} not found`, 500)
199
+ }
200
+ const websiteMeta: WebsiteMeta = await connector.getWebsiteMeta(session, websiteId)
201
+ res.json(websiteMeta as ApiWebsiteMetaReadResponse)
202
+ } catch (e) {
203
+ console.error('Error getting website meta', e)
204
+ if (e.httpStatusCode) {
205
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
206
+ } else {
207
+ res.status(500).json({ message: e.message } as ApiError)
208
+ }
209
+ }
210
+ })
211
+
212
+ // Delete website
213
+ router.delete(API_WEBSITE_DELETE, async (req, res) => {
214
+ try {
215
+ const query: ApiWebsiteDeleteQuery = req.query as any
216
+ const websiteId= requiredParam<WebsiteId>(query.websiteId, 'Website id')
217
+ await deleteWebsite(req['session'], websiteId, query.connectorId)
218
+ res.status(200).json({ message: 'Website deleted' } as ApiError)
219
+ } catch (e) {
220
+ console.error('Error deleting website data', e)
221
+ if (e.httpStatusCode) {
222
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
223
+ } else {
224
+ res.status(500).json({ message: e.message } as ApiError)
225
+ }
226
+ }
227
+ })
228
+
229
+ // Duplicate website
230
+ router.post(API_WEBSITE_DUPLICATE, async (req, res) => {
231
+ try {
232
+ const query: ApiWebsiteDuplicateQuery = req.query as any
233
+ const websiteId= requiredParam<WebsiteId>(query.websiteId, 'New website id')
234
+ await duplicateWebsite(req['session'], websiteId, query.connectorId)
235
+ res.status(200).json({ message: 'Website duplicated' } as ApiError)
236
+ } catch (e) {
237
+ console.error('Error duplicating website data', e)
238
+ if (e.httpStatusCode) {
239
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
240
+ } else {
241
+ res.status(500).json({ message: e.message } as ApiError)
242
+ }
243
+ }
244
+ })
245
+
246
+ // Load assets
247
+ router.get(API_WEBSITE_ASSET_READ + '/:path', async (req, res) => {
248
+ {
249
+ try {
250
+ const query: ApiWebsiteAssetsReadQuery = req.query as any
251
+ const params: ApiWebsiteAssetsReadParams = req.params as any
252
+ const websiteId= requiredParam<WebsiteId>(query.websiteId, 'Website id')
253
+ const path = requiredParam<string>(params.path, 'path')
254
+ const asset: ConnectorFileContent = await readAsset(req['session'], websiteId, path, query.connectorId)
255
+ // Set content type
256
+ res.contentType(basename(path))
257
+ // Send the file
258
+ if (asset instanceof Readable) {
259
+ // Stream
260
+ asset.pipe(res)
261
+ } else {
262
+ // Buffer or string
263
+ res.send(asset as ApiWebsiteAssetsReadResponse)
264
+ }
265
+ } catch (e) {
266
+ console.error('Error getting asset', e)
267
+ if (e.httpStatusCode) {
268
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
269
+ } else {
270
+ res.status(500).json({ message: e.message } as ApiError)
271
+ }
272
+ }
273
+ }
274
+ })
275
+
276
+ // Upload assets
277
+ router.post(API_WEBSITE_ASSETS_WRITE, async (req, res) => {
278
+ try {
279
+ // Check input
280
+ const query: ApiWebsiteAssetsWriteQuery = req.query as any
281
+ const websiteId = requiredParam<WebsiteId>(query.websiteId as WebsiteId, 'Website id')
282
+
283
+ // Get the file data from the request
284
+ const form = formidable({
285
+ multiples: true,
286
+ keepExtensions: true,
287
+ })
288
+ const connectorId = query.connectorId // Optional
289
+
290
+ // Retrive the files
291
+ const files: ConnectorFile[] = await new Promise<ConnectorFile[]>((resolve, reject) => {
292
+ form.parse(req, async (err, fields, _files) => {
293
+ if (err) {
294
+ console.error('Error parsing upload data', err)
295
+ reject(new ApiError('Error parsing upload data: ' + err.message, 400))
296
+ } else {
297
+ const files = ([].concat(_files['files[]'] as PersistentFile) as PersistentFile[])
298
+ .map(file => file.toJSON())
299
+ .map(file => ({
300
+ path: `/${file.originalFilename}`,
301
+ content: createReadStream(file.filepath),
302
+ }))
303
+ resolve(files)
304
+ }
305
+ })
306
+ })
307
+
308
+ // Hook to modify the files
309
+ config.emit(ServerEvent.WEBSITE_ASSET_STORE_START, { files, websiteId, connectorId } as WebsiteAssetStoreStartEventType)
310
+
311
+ // Write the files
312
+ const result = await writeAssets(req['session'], websiteId, files, connectorId)
313
+
314
+ // Base URL of silex serve
315
+ const baseUrl = new URL(config.url).pathname.replace(/\/$/, '')
316
+
317
+ // Return the file URLs to insert in the website
318
+ // As expected by grapesjs (https://grapesjs.com/docs/modules/Assets.html#uploading-assets)
319
+ const data = result.map(path =>
320
+ join(
321
+ // We should return path without this line, as it is saved, not as it is displayed
322
+ // But this url is sent straight to grapesjs, so we need to return the url as it is displayed
323
+ baseUrl, API_PATH, API_WEBSITE_PATH, API_WEBSITE_ASSET_READ,
324
+ path,
325
+ )
326
+ + `?websiteId=${websiteId}&connectorId=${connectorId ? connectorId : ''}` // As expected by wesite API (readAsset)
327
+ )
328
+
329
+ // Return the file URLs
330
+ res.json({
331
+ data,
332
+ } as ApiWebsiteAssetsWriteResponse)
333
+
334
+ // Hook for plugins
335
+ config.emit(ServerEvent.WEBSITE_ASSET_STORE_END, null as WebsiteAssetStoreEndEventType)
336
+ } catch (e) {
337
+ console.error('Error uploading assets', e)
338
+ if (e.httpStatusCode) {
339
+ res.status(e.httpStatusCode).json({ message: e.message } as ApiError)
340
+ } else {
341
+ res.status(500).json({ message: e.message } as ApiError)
342
+ }
343
+ // Hook for plugins
344
+ config.emit(ServerEvent.WEBSITE_ASSET_STORE_END, e as WebsiteAssetStoreEndEventType)
345
+ }
346
+ })
347
+
348
+ /**
349
+ * Get the desired connector
350
+ * Can be the default connector or a specific one
351
+ */
352
+ async function getStorageConnector(session: any, connectorId?: string): Promise<StorageConnector> {
353
+ const storageConnector = await getConnector(config, session, ConnectorType.STORAGE, connectorId) // ?? config.getStorageConnectors()[0]
354
+
355
+ if (!storageConnector) {
356
+ throw new ApiError('No storage connector found', 404)
357
+ }
358
+
359
+ if (!await storageConnector.isLoggedIn(session)) {
360
+ throw new ApiError('Not logged in', 401)
361
+ }
362
+
363
+ return storageConnector as StorageConnector
364
+ }
365
+
366
+ /**
367
+ * Read the website data
368
+ */
369
+ async function readWebsite(session: any, websiteId: string, connectorId?: string): Promise<WebsiteData | Readable> {
370
+ // Get the desired connector
371
+ const storageConnector = await getStorageConnector(session, connectorId)
372
+
373
+ // Return website data
374
+ return storageConnector.readWebsite(session, websiteId)
375
+ }
376
+
377
+ /**
378
+ * List existing websites
379
+ */
380
+ async function listWebsites(session: any, connectorId?: string): Promise<WebsiteMeta[]> {
381
+ // Get the desired connector
382
+ const storageConnector = await getStorageConnector(session, connectorId)
383
+
384
+ // List websites
385
+ return storageConnector.listWebsites(session)
386
+ }
387
+
388
+ /**
389
+ * Write the website data to the connector
390
+ */
391
+ async function writeWebsite(session: any, websiteId: WebsiteId, websiteData: WebsiteData, connectorId?: ConnectorId): Promise<void> {
392
+ // Get the desired connector
393
+ const storageConnector = await getStorageConnector(session, connectorId)
394
+
395
+ // Write the website data
396
+ await storageConnector.updateWebsite(session, websiteId, websiteData)
397
+ }
398
+
399
+ /**
400
+ * Delete a website
401
+ */
402
+ async function deleteWebsite(session: any, websiteId: string, connectorId?: string): Promise<void> {
403
+ // Get the desired connector
404
+ const storageConnector = await getStorageConnector(session, connectorId)
405
+
406
+ // Delete the website
407
+ return storageConnector.deleteWebsite(session, websiteId)
408
+ }
409
+
410
+ /**
411
+ * Duplicate a website
412
+ */
413
+ async function duplicateWebsite(session: any, websiteId: string, connectorId?: string): Promise<void> {
414
+ // Get the desired connector
415
+ const storageConnector = await getStorageConnector(session, connectorId)
416
+
417
+ // Duplicate the website
418
+ return storageConnector.duplicateWebsite(session, websiteId)
419
+ }
420
+
421
+ /**
422
+ * Read an asset
423
+ */
424
+ async function readAsset(session: any, websiteId: string, fileName: string, connectorId?: string): Promise<ConnectorFileContent> {
425
+ // Get the desired connector
426
+ const storageConnector = await getStorageConnector(session, connectorId)
427
+
428
+ // Read the asset from the connector
429
+ return storageConnector.readAsset(session, websiteId, `/${fileName}`)
430
+ }
431
+
432
+ /**
433
+ * Write an asset to the connector
434
+ * @returns File names on the storage connector, always starting with a slash
435
+ */
436
+ async function writeAssets(session: any, websiteId: string, files: ConnectorFile[], connectorId?: string): Promise<string[]> {
437
+ // Get the desired connector
438
+ const storageConnector = await getStorageConnector(session, connectorId)
439
+
440
+ // Clean up the path
441
+ const cleanPathFiles = files.map(file => ({
442
+ ...file,
443
+ path: file.path.replace('/assets/', '/'), // Remove the assets folder added by GrapesJS
444
+ }))
445
+
446
+ // Write the asset to the connector
447
+ const result = await storageConnector.writeAssets(
448
+ session,
449
+ websiteId,
450
+ cleanPathFiles,
451
+ )
452
+
453
+ // Return the files URLs with the website id
454
+ return files
455
+ // Use the original path or the one returned by the connector
456
+ .map(({ path }, idx) => result && result[idx] ? result[idx] : path)
457
+ // Make it an absolute path with the website id and the connector id as query params
458
+ //.map((path) => toAssetUrl(path, config.url, websiteId, connectorId))
459
+ }
460
+
461
+ return router
462
+ }
@@ -1,33 +1,67 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ /*
4
+ * Silex website builder, free/libre no-code tool for makers.
5
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU Affero General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU Affero General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Affero General Public License
17
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
18
+ */
19
+
20
+ import silex from './index'
3
21
  import { parse } from 'cli'
4
22
 
5
23
  const options = parse({
6
- config: [ 'c', 'Path for the server side config file to load at startup', 'file'],
7
- port: [ 'p', 'Port to listen to', 'int'],
8
- debug: [false, 'Debug mode, with live reload, source maps etc.', 'boolean'],
24
+ 'url': ['', 'URL of your server', 'string'],
25
+ 'host': ['', 'Sets the host param of the express module "cookie-session".', 'string'],
26
+ 'port': [ 'p', 'Port to listen to', 'int'],
27
+ 'protocol': ['', 'Sets the protocol param of the express module "cookie-session".', 'string'],
28
+ 'server-config': [ 's', 'Path for the server side config file to load at startup', 'file'],
29
+ 'client-config': ['c', 'Path to client config file to be served on .silex-client.js', 'file'],
30
+ 'fs-root': ['', 'Path to the root folder where to store websites. Used by the default storage connector (fs).', 'string'],
31
+ 'fs-hosting-root': ['', 'Path to the root folder where to publish websites. Used by the default hosting connector (fs).', 'string'],
32
+ 'session-name': ['', 'Sets the name param of the express module "cookie-session".', 'string'],
33
+ 'session-secret': ['', 'Session secret', 'string'],
9
34
  'ssl-port': [ false, 'Port to listen to for SSL/HTTPS', 'int'],
10
35
  'force-https': [ false, 'Force HTTPS', 'boolean'],
11
36
  'ssl-private-key': [ false, 'Path to private key for SSL', 'file'],
12
37
  'ssl-certificate': [ false, 'Path to SSL certificate', 'file'],
13
38
  'force-https-trust-xfp-header': [ false, 'Sets the trustXFPHeader param of the express module "cookie-session". Use only with --force-https', 'boolean'],
14
- 'session-secret': ['s', 'Session secret', 'string'],
15
39
  'cors-url': ['', 'Enable CORS for URL (can be "*")', 'string'],
16
- 'client-config': ['', 'Path to client config file to be served on .silex-client.js', 'string'],
17
- 'fs-root': ['', 'Path to the root folder where to store websites. Used by the default backend (fs).', 'string'],
40
+ 'express-json-limit': ['', 'Sets the limit param of the express module "json".', 'string'],
41
+ 'express-text-limit': ['', 'Sets the limit param of the express module "text".', 'string'],
42
+ 'express-urlencoded-limit': ['', 'Sets the limit param of the express module "urlencoded".', 'string'],
43
+ 'debug': [false, 'Debug mode, with live reload, source maps etc.', 'boolean'],
18
44
  }, {})
19
45
 
20
- if(options.config) process.env.CONFIG = options.config
21
- if(options.port) process.env.PORT = options.port
22
- if(options.debug) process.env.SILEX_DEBUG = options.debug
23
- if(options['ssl-port']) process.env.SSL_PORT = options['ssl-port']
46
+ if(options['url']) process.env.SILEX_URL = options['url']
47
+ if(options['host']) process.env.SILEX_HOST = options['host']
48
+ if(options.port) process.env.SILEX_PORT = options.port
49
+ if(options['protocol']) process.env.SILEX_PROTOCOL = options['protocol']
50
+ if(options['server-config']) process.env.SILEX_SERVER_CONFIG = options['server-config']
51
+ if(options['client-config']) process.env.SILEX_CLIENT_CONFIG = options['client-config']
52
+ if(options['fs-root']) process.env.SILEX_FS_ROOT = options['fs-root']
53
+ if(options['fs-hosting-root']) process.env.SILEX_FS_HOSTING_ROOT = options['fs-hosting-root']
54
+ if(options['session-name']) process.env.SILEX_SESSION_NAME = options['session-name']
55
+ if(options['session-secret']) process.env.SILEX_SESSION_SECRET = options['session-secret']
56
+ if(options['ssl-port']) process.env.SILEX_SSL_PORT = options['ssl-port']
24
57
  if(options['force-https']) process.env.SILEX_FORCE_HTTPS = options['force-https']
25
58
  if(options['ssl-private-key']) process.env.SILEX_SSL_PRIVATE_KEY = options['ssl-private-key']
26
59
  if(options['ssl-certificate']) process.env.SILEX_SSL_CERTIFICATE = options['ssl-certificate']
27
60
  if(options['force-https-trust-xfp-header']) process.env.SILEX_FORCE_HTTPS_TRUST_XFP_HEADER = options['force-https-trust-xfp-header']
28
- if(options['session-secret']) process.env.SILEX_SESSION_SECRET = options['session-secret']
29
61
  if(options['cors-url']) process.env.SILEX_CORS_URL = options['cors-url']
30
- if(options['client-config']) process.env.SILEX_CLIENT_CONFIG = options['client-config']
31
- if(options['fs-root']) process.env.FS_ROOT = options['fs-root']
62
+ if(options['express-json-limit']) process.env.SILEX_EXPRESS_JSON_LIMIT = options['express-json-limit']
63
+ if(options['express-text-limit']) process.env.SILEX_EXPRESS_TEXT_LIMIT = options['express-text-limit']
64
+ if(options['express-urlencoded-limit']) process.env.SILEX_EXPRESS_URLENCODED_LIMIT = options['express-urlencoded-limit']
65
+ if(options.debug) process.env.SILEX_DEBUG = options.debug
32
66
 
33
- import './index'
67
+ silex()