@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,315 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = default_1;
7
+ const express_1 = require("express");
8
+ const formidable_1 = __importDefault(require("formidable"));
9
+ const constants_1 = require("../../constants");
10
+ const fs_1 = require("fs");
11
+ const types_1 = require("../../types");
12
+ const connectors_1 = require("../connectors/connectors");
13
+ const stream_1 = require("stream");
14
+ const validation_1 = require("../utils/validation");
15
+ const path_1 = require("path");
16
+ const events_1 = require("../events");
17
+ function default_1(config, opts = {}) {
18
+ const options = {
19
+ assetsPath: '/assets',
20
+ ...opts
21
+ };
22
+ const router = (0, express_1.Router)();
23
+ router.get(constants_1.API_WEBSITE_READ, async (req, res, next) => {
24
+ const query = req.query;
25
+ const { websiteId, connectorId } = query;
26
+ const session = req['session'];
27
+ if (!websiteId) {
28
+ next();
29
+ return;
30
+ }
31
+ try {
32
+ const websiteData = await readWebsite(session, websiteId, connectorId);
33
+ if (websiteData instanceof stream_1.Readable) {
34
+ websiteData.pipe(res.type('application/json'));
35
+ }
36
+ else {
37
+ res.json(websiteData);
38
+ }
39
+ }
40
+ catch (e) {
41
+ if (e.httpStatusCode) {
42
+ res.status(e.httpStatusCode).json({ message: e.message });
43
+ }
44
+ else {
45
+ res.status(500).json({ message: e.message });
46
+ }
47
+ }
48
+ });
49
+ router.get(constants_1.API_WEBSITE_LIST, async (req, res) => {
50
+ const query = req.query;
51
+ const { connectorId } = query;
52
+ const session = req['session'];
53
+ try {
54
+ const websites = await listWebsites(req['session'], query.connectorId);
55
+ res.json(websites);
56
+ }
57
+ catch (e) {
58
+ console.error('Error getting website data', e);
59
+ if (e.httpStatusCode) {
60
+ res.status(e.httpStatusCode).json({ message: e.message });
61
+ }
62
+ else {
63
+ res.status(500).json({ message: e.message });
64
+ }
65
+ }
66
+ });
67
+ router.post(constants_1.API_WEBSITE_WRITE, async (req, res) => {
68
+ try {
69
+ const query = req.query;
70
+ const body = req.body;
71
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
72
+ const websiteData = (0, validation_1.requiredParam)(body, 'Website data');
73
+ const connectorId = query.connectorId;
74
+ config.emit(events_1.ServerEvent.WEBSITE_STORE_START, { websiteId, websiteData, connectorId });
75
+ await writeWebsite(req['session'], websiteId, websiteData, connectorId);
76
+ config.emit(events_1.ServerEvent.WEBSITE_STORE_END, null);
77
+ res.status(200).json({ message: 'Website saved' });
78
+ }
79
+ catch (e) {
80
+ console.error('Error saving website data', e);
81
+ config.emit(events_1.ServerEvent.WEBSITE_STORE_END, e);
82
+ if (e.httpStatusCode) {
83
+ res.status(e.httpStatusCode).json({ message: e.message });
84
+ }
85
+ else {
86
+ res.status(500).json({ message: e.message });
87
+ }
88
+ }
89
+ });
90
+ router.put(constants_1.API_WEBSITE_CREATE, async (req, res) => {
91
+ try {
92
+ const session = req['session'];
93
+ const query = req.query;
94
+ const body = req.body;
95
+ const websiteMeta = (0, validation_1.requiredParam)(body, 'Website meta');
96
+ const connectorId = query.connectorId;
97
+ const connector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
98
+ if (!connector) {
99
+ throw new types_1.ApiError(`Connector ${connectorId} not found`, 500);
100
+ }
101
+ await connector.createWebsite(session, websiteMeta);
102
+ res.json({ message: 'Website meta saved' });
103
+ }
104
+ catch (e) {
105
+ console.error('Error saving website meta', e);
106
+ if (e.httpStatusCode) {
107
+ res.status(e.httpStatusCode).json({ message: e.message });
108
+ }
109
+ else {
110
+ res.status(500).json({ message: e.message });
111
+ }
112
+ }
113
+ });
114
+ router.post(constants_1.API_WEBSITE_META_WRITE, async (req, res) => {
115
+ try {
116
+ const session = req['session'];
117
+ const query = req.query;
118
+ const body = req.body;
119
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
120
+ const websiteMeta = (0, validation_1.requiredParam)(body, 'Website meta');
121
+ const connectorId = query.connectorId;
122
+ const connector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
123
+ if (!connector) {
124
+ throw new types_1.ApiError(`Connector ${connectorId} not found`, 500);
125
+ }
126
+ await connector.setWebsiteMeta(session, websiteId, websiteMeta);
127
+ res.json({ message: 'Website meta saved' });
128
+ }
129
+ catch (e) {
130
+ console.error('Error saving website meta', e);
131
+ if (e.httpStatusCode) {
132
+ res.status(e.httpStatusCode).json({ message: e.message });
133
+ }
134
+ else {
135
+ res.status(500).json({ message: e.message });
136
+ }
137
+ }
138
+ });
139
+ router.get(constants_1.API_WEBSITE_META_READ, async (req, res) => {
140
+ try {
141
+ const session = req['session'];
142
+ const query = req.query;
143
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
144
+ const connectorId = query.connectorId;
145
+ const connector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
146
+ if (!connector) {
147
+ throw new types_1.ApiError(`Connector ${connectorId} not found`, 500);
148
+ }
149
+ const websiteMeta = await connector.getWebsiteMeta(session, websiteId);
150
+ res.json(websiteMeta);
151
+ }
152
+ catch (e) {
153
+ console.error('Error getting website meta', e);
154
+ if (e.httpStatusCode) {
155
+ res.status(e.httpStatusCode).json({ message: e.message });
156
+ }
157
+ else {
158
+ res.status(500).json({ message: e.message });
159
+ }
160
+ }
161
+ });
162
+ router.delete(constants_1.API_WEBSITE_DELETE, async (req, res) => {
163
+ try {
164
+ const query = req.query;
165
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
166
+ await deleteWebsite(req['session'], websiteId, query.connectorId);
167
+ res.status(200).json({ message: 'Website deleted' });
168
+ }
169
+ catch (e) {
170
+ console.error('Error deleting website data', e);
171
+ if (e.httpStatusCode) {
172
+ res.status(e.httpStatusCode).json({ message: e.message });
173
+ }
174
+ else {
175
+ res.status(500).json({ message: e.message });
176
+ }
177
+ }
178
+ });
179
+ router.post(constants_1.API_WEBSITE_DUPLICATE, async (req, res) => {
180
+ try {
181
+ const query = req.query;
182
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'New website id');
183
+ await duplicateWebsite(req['session'], websiteId, query.connectorId);
184
+ res.status(200).json({ message: 'Website duplicated' });
185
+ }
186
+ catch (e) {
187
+ console.error('Error duplicating website data', e);
188
+ if (e.httpStatusCode) {
189
+ res.status(e.httpStatusCode).json({ message: e.message });
190
+ }
191
+ else {
192
+ res.status(500).json({ message: e.message });
193
+ }
194
+ }
195
+ });
196
+ router.get(constants_1.API_WEBSITE_ASSET_READ + '/:path', async (req, res) => {
197
+ {
198
+ try {
199
+ const query = req.query;
200
+ const params = req.params;
201
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
202
+ const path = (0, validation_1.requiredParam)(params.path, 'path');
203
+ const asset = await readAsset(req['session'], websiteId, path, query.connectorId);
204
+ res.contentType((0, path_1.basename)(path));
205
+ if (asset instanceof stream_1.Readable) {
206
+ asset.pipe(res);
207
+ }
208
+ else {
209
+ res.send(asset);
210
+ }
211
+ }
212
+ catch (e) {
213
+ console.error('Error getting asset', e);
214
+ if (e.httpStatusCode) {
215
+ res.status(e.httpStatusCode).json({ message: e.message });
216
+ }
217
+ else {
218
+ res.status(500).json({ message: e.message });
219
+ }
220
+ }
221
+ }
222
+ });
223
+ router.post(constants_1.API_WEBSITE_ASSETS_WRITE, async (req, res) => {
224
+ try {
225
+ const query = req.query;
226
+ const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
227
+ const form = (0, formidable_1.default)({
228
+ multiples: true,
229
+ keepExtensions: true,
230
+ });
231
+ const connectorId = query.connectorId;
232
+ const files = await new Promise((resolve, reject) => {
233
+ form.parse(req, async (err, fields, _files) => {
234
+ if (err) {
235
+ console.error('Error parsing upload data', err);
236
+ reject(new types_1.ApiError('Error parsing upload data: ' + err.message, 400));
237
+ }
238
+ else {
239
+ const files = [].concat(_files['files[]'])
240
+ .map(file => file.toJSON())
241
+ .map(file => ({
242
+ path: `/${file.originalFilename}`,
243
+ content: (0, fs_1.createReadStream)(file.filepath),
244
+ }));
245
+ resolve(files);
246
+ }
247
+ });
248
+ });
249
+ config.emit(events_1.ServerEvent.WEBSITE_ASSET_STORE_START, { files, websiteId, connectorId });
250
+ const result = await writeAssets(req['session'], websiteId, files, connectorId);
251
+ const baseUrl = new URL(config.url).pathname.replace(/\/$/, '');
252
+ const data = result.map(path => (0, path_1.join)(baseUrl, constants_1.API_PATH, constants_1.API_WEBSITE_PATH, constants_1.API_WEBSITE_ASSET_READ, path)
253
+ + `?websiteId=${websiteId}&connectorId=${connectorId ? connectorId : ''}`);
254
+ res.json({
255
+ data,
256
+ });
257
+ config.emit(events_1.ServerEvent.WEBSITE_ASSET_STORE_END, null);
258
+ }
259
+ catch (e) {
260
+ console.error('Error uploading assets', e);
261
+ if (e.httpStatusCode) {
262
+ res.status(e.httpStatusCode).json({ message: e.message });
263
+ }
264
+ else {
265
+ res.status(500).json({ message: e.message });
266
+ }
267
+ config.emit(events_1.ServerEvent.WEBSITE_ASSET_STORE_END, e);
268
+ }
269
+ });
270
+ async function getStorageConnector(session, connectorId) {
271
+ const storageConnector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
272
+ if (!storageConnector) {
273
+ throw new types_1.ApiError('No storage connector found', 404);
274
+ }
275
+ if (!await storageConnector.isLoggedIn(session)) {
276
+ throw new types_1.ApiError('Not logged in', 401);
277
+ }
278
+ return storageConnector;
279
+ }
280
+ async function readWebsite(session, websiteId, connectorId) {
281
+ const storageConnector = await getStorageConnector(session, connectorId);
282
+ return storageConnector.readWebsite(session, websiteId);
283
+ }
284
+ async function listWebsites(session, connectorId) {
285
+ const storageConnector = await getStorageConnector(session, connectorId);
286
+ return storageConnector.listWebsites(session);
287
+ }
288
+ async function writeWebsite(session, websiteId, websiteData, connectorId) {
289
+ const storageConnector = await getStorageConnector(session, connectorId);
290
+ await storageConnector.updateWebsite(session, websiteId, websiteData);
291
+ }
292
+ async function deleteWebsite(session, websiteId, connectorId) {
293
+ const storageConnector = await getStorageConnector(session, connectorId);
294
+ return storageConnector.deleteWebsite(session, websiteId);
295
+ }
296
+ async function duplicateWebsite(session, websiteId, connectorId) {
297
+ const storageConnector = await getStorageConnector(session, connectorId);
298
+ return storageConnector.duplicateWebsite(session, websiteId);
299
+ }
300
+ async function readAsset(session, websiteId, fileName, connectorId) {
301
+ const storageConnector = await getStorageConnector(session, connectorId);
302
+ return storageConnector.readAsset(session, websiteId, `/${fileName}`);
303
+ }
304
+ async function writeAssets(session, websiteId, files, connectorId) {
305
+ const storageConnector = await getStorageConnector(session, connectorId);
306
+ const cleanPathFiles = files.map(file => ({
307
+ ...file,
308
+ path: file.path.replace('/assets/', '/'),
309
+ }));
310
+ const result = await storageConnector.writeAssets(session, websiteId, cleanPathFiles);
311
+ return files
312
+ .map(({ path }, idx) => result && result[idx] ? result[idx] : path);
313
+ }
314
+ return router;
315
+ }
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const index_1 = __importDefault(require("./index"));
8
+ const cli_1 = require("cli");
9
+ const options = (0, cli_1.parse)({
10
+ 'url': ['', 'URL of your server', 'string'],
11
+ 'host': ['', 'Sets the host param of the express module "cookie-session".', 'string'],
12
+ 'port': ['p', 'Port to listen to', 'int'],
13
+ 'protocol': ['', 'Sets the protocol param of the express module "cookie-session".', 'string'],
14
+ 'server-config': ['s', 'Path for the server side config file to load at startup', 'file'],
15
+ 'client-config': ['c', 'Path to client config file to be served on .silex-client.js', 'file'],
16
+ 'fs-root': ['', 'Path to the root folder where to store websites. Used by the default storage connector (fs).', 'string'],
17
+ 'fs-hosting-root': ['', 'Path to the root folder where to publish websites. Used by the default hosting connector (fs).', 'string'],
18
+ 'session-name': ['', 'Sets the name param of the express module "cookie-session".', 'string'],
19
+ 'session-secret': ['', 'Session secret', 'string'],
20
+ 'ssl-port': [false, 'Port to listen to for SSL/HTTPS', 'int'],
21
+ 'force-https': [false, 'Force HTTPS', 'boolean'],
22
+ 'ssl-private-key': [false, 'Path to private key for SSL', 'file'],
23
+ 'ssl-certificate': [false, 'Path to SSL certificate', 'file'],
24
+ 'force-https-trust-xfp-header': [false, 'Sets the trustXFPHeader param of the express module "cookie-session". Use only with --force-https', 'boolean'],
25
+ 'cors-url': ['', 'Enable CORS for URL (can be "*")', 'string'],
26
+ 'express-json-limit': ['', 'Sets the limit param of the express module "json".', 'string'],
27
+ 'express-text-limit': ['', 'Sets the limit param of the express module "text".', 'string'],
28
+ 'express-urlencoded-limit': ['', 'Sets the limit param of the express module "urlencoded".', 'string'],
29
+ 'debug': [false, 'Debug mode, with live reload, source maps etc.', 'boolean'],
30
+ }, {});
31
+ if (options['url'])
32
+ process.env.SILEX_URL = options['url'];
33
+ if (options['host'])
34
+ process.env.SILEX_HOST = options['host'];
35
+ if (options.port)
36
+ process.env.SILEX_PORT = options.port;
37
+ if (options['protocol'])
38
+ process.env.SILEX_PROTOCOL = options['protocol'];
39
+ if (options['server-config'])
40
+ process.env.SILEX_SERVER_CONFIG = options['server-config'];
41
+ if (options['client-config'])
42
+ process.env.SILEX_CLIENT_CONFIG = options['client-config'];
43
+ if (options['fs-root'])
44
+ process.env.SILEX_FS_ROOT = options['fs-root'];
45
+ if (options['fs-hosting-root'])
46
+ process.env.SILEX_FS_HOSTING_ROOT = options['fs-hosting-root'];
47
+ if (options['session-name'])
48
+ process.env.SILEX_SESSION_NAME = options['session-name'];
49
+ if (options['session-secret'])
50
+ process.env.SILEX_SESSION_SECRET = options['session-secret'];
51
+ if (options['ssl-port'])
52
+ process.env.SILEX_SSL_PORT = options['ssl-port'];
53
+ if (options['force-https'])
54
+ process.env.SILEX_FORCE_HTTPS = options['force-https'];
55
+ if (options['ssl-private-key'])
56
+ process.env.SILEX_SSL_PRIVATE_KEY = options['ssl-private-key'];
57
+ if (options['ssl-certificate'])
58
+ process.env.SILEX_SSL_CERTIFICATE = options['ssl-certificate'];
59
+ if (options['force-https-trust-xfp-header'])
60
+ process.env.SILEX_FORCE_HTTPS_TRUST_XFP_HEADER = options['force-https-trust-xfp-header'];
61
+ if (options['cors-url'])
62
+ process.env.SILEX_CORS_URL = options['cors-url'];
63
+ if (options['express-json-limit'])
64
+ process.env.SILEX_EXPRESS_JSON_LIMIT = options['express-json-limit'];
65
+ if (options['express-text-limit'])
66
+ process.env.SILEX_EXPRESS_TEXT_LIMIT = options['express-text-limit'];
67
+ if (options['express-urlencoded-limit'])
68
+ process.env.SILEX_EXPRESS_URLENCODED_LIMIT = options['express-urlencoded-limit'];
69
+ if (options.debug)
70
+ process.env.SILEX_DEBUG = options.debug;
71
+ (0, index_1.default)();
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerConfig = void 0;
4
+ const silex_plugins_1 = require("@silexlabs/silex-plugins");
5
+ const path_1 = require("path");
6
+ const constants_1 = require("../constants");
7
+ const promises_1 = require("fs/promises");
8
+ const connectors_1 = require("./connectors/connectors");
9
+ const FsStorage_1 = require("./connectors/FsStorage");
10
+ const types_1 = require("../types");
11
+ const FsHosting_1 = require("./connectors/FsHosting");
12
+ class ServerConfig extends silex_plugins_1.Config {
13
+ expressOptions = {
14
+ jsonLimit: process.env.SILEX_EXPRESS_JSON_LIMIT,
15
+ textLimit: process.env.SILEX_EXPRESS_TEXT_LIMIT,
16
+ urlencodedLimit: process.env.SILEX_EXPRESS_URLENCODED_LIMIT,
17
+ sessionName: process.env.SILEX_SESSION_NAME,
18
+ sessionSecret: process.env.SILEX_SESSION_SECRET,
19
+ cors: process.env.SILEX_CORS_URL,
20
+ };
21
+ port = process.env.SILEX_PORT;
22
+ debug = process.env.SILEX_DEBUG === 'true';
23
+ url = process.env.SILEX_URL?.replace(/\/$/, '') ?? `${process.env.SILEX_PROTOCOL}://${process.env.SILEX_HOST}:${process.env.SILEX_PORT}`;
24
+ userConfigPath = process.env.SILEX_SERVER_CONFIG;
25
+ configFilePath = (0, path_1.resolve)(__dirname, '../../../.silex.js');
26
+ getConnectors(type = null) {
27
+ if (!type) {
28
+ const allConnectors = this.getStorageConnectors().concat(this.getHostingConnectors());
29
+ return [...new Set(allConnectors)];
30
+ }
31
+ const connectorType = (0, connectors_1.toConnectorEnum)(type.toString());
32
+ switch (connectorType) {
33
+ case types_1.ConnectorType.HOSTING: return this.getHostingConnectors();
34
+ case types_1.ConnectorType.STORAGE: return this.getStorageConnectors();
35
+ default: throw new Error(`Unknown connector type ${type}`);
36
+ }
37
+ }
38
+ storageConnectors = [];
39
+ addStorageConnector(storage) {
40
+ this.setStorageConnectors(this.storageConnectors.concat(storage));
41
+ }
42
+ setStorageConnectors(storageConnectors) {
43
+ this.storageConnectors = storageConnectors;
44
+ }
45
+ getStorageConnectors() {
46
+ return this.storageConnectors;
47
+ }
48
+ hostingConnectors = [];
49
+ addHostingConnector(hosting) {
50
+ this.setHostingConnectors(this.hostingConnectors.concat(hosting));
51
+ }
52
+ setHostingConnectors(hostings) {
53
+ this.hostingConnectors = hostings;
54
+ }
55
+ getHostingConnectors() { return this.hostingConnectors; }
56
+ async addRoutes(app) {
57
+ const path = process.env.SILEX_CLIENT_CONFIG;
58
+ if (path) {
59
+ console.info(`> Serving client side config ${path} at ${constants_1.CLIENT_CONFIG_FILE_NAME}`);
60
+ try {
61
+ let clientConfig = (await (0, promises_1.readFile)(path)).toString();
62
+ app.get(`/${constants_1.CLIENT_CONFIG_FILE_NAME}`, async (req, res) => {
63
+ if (this.debug) {
64
+ console.info('[Debug mode] Reloading config file', path);
65
+ clientConfig = (await (0, promises_1.readFile)(path)).toString();
66
+ }
67
+ res
68
+ .contentType('application/javascript')
69
+ .send(clientConfig);
70
+ });
71
+ }
72
+ catch (e) {
73
+ console.error(`Error loading client config file ${path}`, e);
74
+ throw new Error(`Error loading client config file ${path}: ${e.message}`);
75
+ }
76
+ }
77
+ }
78
+ async loadConfigFiles() {
79
+ await this.loadUserConfig();
80
+ await this.loadSilexConfig();
81
+ }
82
+ async loadUserConfig() {
83
+ if (this.userConfigPath) {
84
+ console.info('> Loading user config', this.userConfigPath);
85
+ try {
86
+ await this.addPlugin(this.userConfigPath, {});
87
+ }
88
+ catch (e) {
89
+ throw new Error(`\nUser config file ${this.userConfigPath} error:\n\n\t${e.message}\n\n`);
90
+ }
91
+ }
92
+ }
93
+ async loadSilexConfig() {
94
+ console.info('> Loading config', this.configFilePath);
95
+ try {
96
+ await this.addPlugin(this.configFilePath, {});
97
+ }
98
+ catch (e) {
99
+ if (e.code === 'MODULE_NOT_FOUND' && (!e.requireStack || !e.requireStack.find(path => path === this.configFilePath))) {
100
+ console.info('> /!\\ Config file not found', this.configFilePath);
101
+ }
102
+ else {
103
+ throw new Error(`Error in config file ${this.configFilePath}: ${e.message}`);
104
+ }
105
+ }
106
+ }
107
+ async initDefaultConnectors() {
108
+ if (!this.storageConnectors.length) {
109
+ this.addStorageConnector(new FsStorage_1.FsStorage(null, {
110
+ path: process.env.SILEX_FS_ROOT || (0, path_1.join)(process.cwd(), '/silex/storage'),
111
+ }));
112
+ }
113
+ if (!this.hostingConnectors.length) {
114
+ this.addHostingConnector(new FsHosting_1.FsHosting(null, {
115
+ path: process.env.SILEX_FS_HOSTING_ROOT || (0, path_1.join)(process.cwd(), '/silex/hosting'),
116
+ }));
117
+ }
118
+ }
119
+ }
120
+ exports.ServerConfig = ServerConfig;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FsHosting = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = require("path");
9
+ const FsStorage_1 = require("./FsStorage");
10
+ const types_1 = require("../../types");
11
+ class FsHosting extends FsStorage_1.FsStorage {
12
+ connectorId = 'fs-hosting';
13
+ displayName = 'File system hosting';
14
+ connectorType = types_1.ConnectorType.HOSTING;
15
+ async initFs() {
16
+ const stat = await promises_1.default.stat(this.options.path).catch(() => null);
17
+ if (!stat) {
18
+ await promises_1.default.mkdir((0, path_1.join)(this.options.path, 'assets'), { recursive: true });
19
+ await promises_1.default.mkdir((0, path_1.join)(this.options.path, 'css'), { recursive: true });
20
+ console.info(`> [FsHosting] Created folders assets/ and css/ in ${this.options.path}`);
21
+ }
22
+ }
23
+ async publish(session, id, files, { startJob, jobSuccess, jobError }) {
24
+ const job = startJob(`Publishing to ${this.displayName}`);
25
+ job.logs = [[`Publishing to ${this.displayName}`]];
26
+ job.errors = [[]];
27
+ await this.write(session, '', files, '', async ({ status, message }) => {
28
+ job.status = status;
29
+ job.message = message;
30
+ job.logs[0].push(message);
31
+ if (status === types_1.JobStatus.SUCCESS) {
32
+ jobSuccess(job.jobId, message);
33
+ }
34
+ else if (status === types_1.JobStatus.ERROR) {
35
+ job.errors[0].push(message);
36
+ jobError(job.jobId, message);
37
+ }
38
+ });
39
+ return job;
40
+ }
41
+ async getUrl(session, id) {
42
+ const filePath = (0, path_1.join)(this.options.path, id, 'index.html');
43
+ const fileUrl = new URL(filePath, 'file://');
44
+ return fileUrl.toString();
45
+ }
46
+ }
47
+ exports.FsHosting = FsHosting;