@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.
- package/.env.default +20 -0
- package/.silex.js +67 -8
- package/LICENSE +661 -203
- package/README.md +37 -35
- package/dist/client/client/api.d.ts +90 -0
- package/dist/client/client/assetUrl.d.ts +54 -0
- package/dist/client/client/config.d.ts +102 -0
- package/dist/client/client/events.d.ts +23 -0
- package/dist/client/client/expose.d.ts +8 -0
- package/dist/client/client/grapesjs/LoginDialog.d.ts +15 -0
- package/dist/client/client/grapesjs/PublicationManager.d.ts +73 -0
- package/dist/client/client/grapesjs/PublicationUi.d.ts +59 -0
- package/dist/client/client/grapesjs/blocks.d.ts +1 -0
- package/dist/client/client/grapesjs/breadcrumbs.d.ts +1 -0
- package/dist/client/client/grapesjs/css-props.d.ts +6 -0
- package/dist/client/client/grapesjs/footer.d.ts +2 -0
- package/dist/client/client/grapesjs/img.d.ts +6 -0
- package/dist/client/client/grapesjs/index.d.ts +9 -0
- package/dist/client/client/grapesjs/internal-links.d.ts +1 -0
- package/dist/client/client/grapesjs/keymaps.d.ts +123 -0
- package/dist/client/client/grapesjs/new-page-dialog.d.ts +2 -0
- package/dist/client/client/grapesjs/openImport.d.ts +9 -0
- package/dist/client/client/grapesjs/page-panel.d.ts +9 -0
- package/dist/client/client/grapesjs/project-bar.d.ts +21 -0
- package/dist/client/client/grapesjs/resize-panel.d.ts +1 -0
- package/dist/client/client/grapesjs/rich-text.d.ts +4 -0
- package/dist/client/client/grapesjs/semantic.d.ts +1 -0
- package/dist/client/client/grapesjs/settings-sections.d.ts +16 -0
- package/dist/client/client/grapesjs/settings.d.ts +4 -0
- package/dist/client/client/grapesjs/storage.d.ts +2 -0
- package/dist/client/client/grapesjs/symbolDialogs.d.ts +3 -0
- package/dist/client/client/grapesjs/view-buttons.d.ts +1 -0
- package/dist/client/client/index.d.ts +10 -0
- package/dist/client/client/publication-transformers.d.ts +42 -0
- package/dist/client/client/publish-custom-code-block.d.ts +4 -0
- package/dist/client/client/publish-fonts.d.ts +4 -0
- package/dist/client/client/utils.d.ts +22 -0
- package/dist/client/constants.d.ts +32 -0
- package/dist/client/css/admin.css +1114 -328
- package/dist/client/css/admin.css.map +1 -0
- package/dist/client/grapesjs-filter-styles/dist/index.d.ts +4 -0
- package/dist/client/grapesjs-fonts/dist/index.d.ts +4 -0
- package/dist/client/grapesjs-fonts/src/commands.d.ts +3 -0
- package/dist/client/grapesjs-fonts/src/fonts.d.ts +4 -0
- package/dist/client/grapesjs-storage-rate-limit/dist/index.d.ts +4 -0
- package/dist/client/grapesjs-ui-suggest-classes/dist/index.d.ts +4 -0
- package/dist/client/index.html +3 -2
- package/dist/client/js/main.js +356 -131
- package/dist/client/js/main.js.LICENSE.txt +15 -1
- package/dist/client/page.d.ts +2 -0
- package/dist/client/silex-lib/src/ts/client/api.d.ts +90 -0
- package/dist/client/silex-lib/src/ts/client/assetUrl.d.ts +54 -0
- package/dist/client/silex-lib/src/ts/client/config.d.ts +102 -0
- package/dist/client/silex-lib/src/ts/client/events.d.ts +23 -0
- package/dist/client/silex-lib/src/ts/client/expose.d.ts +8 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/LoginDialog.d.ts +15 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationManager.d.ts +73 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationUi.d.ts +59 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/blocks.d.ts +1 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/breadcrumbs.d.ts +1 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/css-props.d.ts +6 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/footer.d.ts +2 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/img.d.ts +6 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/index.d.ts +9 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/internal-links.d.ts +1 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/keymaps.d.ts +123 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/new-page-dialog.d.ts +2 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/openImport.d.ts +9 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/page-panel.d.ts +9 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/project-bar.d.ts +21 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/resize-panel.d.ts +1 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/rich-text.d.ts +4 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/semantic.d.ts +1 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/settings-sections.d.ts +16 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/settings.d.ts +4 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/storage.d.ts +2 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/symbolDialogs.d.ts +3 -0
- package/dist/client/silex-lib/src/ts/client/grapesjs/view-buttons.d.ts +1 -0
- package/dist/client/silex-lib/src/ts/client/index.d.ts +10 -0
- package/dist/client/silex-lib/src/ts/client/publication-transformers.d.ts +42 -0
- package/dist/client/silex-lib/src/ts/client/publish-custom-code-block.d.ts +4 -0
- package/dist/client/silex-lib/src/ts/client/publish-fonts.d.ts +4 -0
- package/dist/client/silex-lib/src/ts/client/utils.d.ts +22 -0
- package/dist/client/silex-lib/src/ts/constants.d.ts +32 -0
- package/dist/client/silex-lib/src/ts/page.d.ts +2 -0
- package/dist/client/silex-lib/src/ts/types.d.ts +339 -0
- package/dist/client/types.d.ts +339 -0
- package/dist/plugins/client/client/events.d.ts +23 -0
- package/dist/plugins/client/client/events.js +43 -0
- package/dist/plugins/client/client/events.js.map +1 -0
- package/dist/plugins/client/plugins/client/template.d.ts +2 -0
- package/dist/plugins/client/plugins/client/template.js +234 -0
- package/dist/plugins/client/plugins/client/template.js.map +1 -0
- package/dist/plugins/client/plugins/client/website-info.d.ts +1 -0
- package/dist/plugins/client/plugins/client/website-info.js +72 -0
- package/dist/plugins/client/plugins/client/website-info.js.map +1 -0
- package/dist/plugins/client/types.d.ts +339 -0
- package/dist/plugins/client/types.js +80 -0
- package/dist/plugins/client/types.js.map +1 -0
- package/dist/plugins/server/constants.d.ts +32 -0
- package/dist/plugins/server/constants.js +76 -0
- package/dist/plugins/server/constants.js.map +1 -0
- package/dist/plugins/server/plugins/server/Cache.d.ts +2 -0
- package/dist/plugins/server/plugins/server/Cache.js +36 -0
- package/dist/plugins/server/plugins/server/Cache.js.map +1 -0
- package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +29 -0
- package/dist/plugins/server/plugins/server/DownloadConnector.js +127 -0
- package/dist/plugins/server/plugins/server/DownloadConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/FtpConnector.d.ts +86 -0
- package/dist/plugins/server/plugins/server/FtpConnector.js +536 -0
- package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +135 -0
- package/dist/plugins/server/plugins/server/GitlabConnector.js +649 -0
- package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/GitlabHostingConnector.d.ts +16 -0
- package/dist/plugins/server/plugins/server/GitlabHostingConnector.js +209 -0
- package/dist/plugins/server/plugins/server/GitlabHostingConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/PublicationOptimizer.d.ts +0 -0
- package/dist/plugins/server/plugins/server/PublicationOptimizer.js +14 -0
- package/dist/plugins/server/plugins/server/PublicationOptimizer.js.map +1 -0
- package/dist/plugins/server/plugins/server/SslPlugin.d.ts +1 -0
- package/dist/plugins/server/plugins/server/SslPlugin.js +86 -0
- package/dist/plugins/server/plugins/server/SslPlugin.js.map +1 -0
- package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +8 -0
- package/dist/plugins/server/plugins/server/StaticPlugin.js +45 -0
- package/dist/plugins/server/plugins/server/StaticPlugin.js.map +1 -0
- package/dist/plugins/server/server/config.d.ts +59 -0
- package/dist/plugins/server/server/config.js +181 -0
- package/dist/plugins/server/server/config.js.map +1 -0
- package/dist/plugins/server/server/connectors/FsHosting.d.ts +14 -0
- package/dist/plugins/server/server/connectors/FsHosting.js +66 -0
- package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -0
- package/dist/plugins/server/server/connectors/FsStorage.d.ts +44 -0
- package/dist/plugins/server/server/connectors/FsStorage.js +261 -0
- package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -0
- package/dist/plugins/server/server/connectors/connectors.d.ts +86 -0
- package/dist/plugins/server/server/connectors/connectors.js +126 -0
- package/dist/plugins/server/server/connectors/connectors.js.map +1 -0
- package/dist/plugins/server/server/events.d.ts +26 -0
- package/dist/plugins/server/server/events.js +31 -0
- package/dist/plugins/server/server/events.js.map +1 -0
- package/dist/plugins/server/server/jobs.d.ts +12 -0
- package/dist/plugins/server/server/jobs.js +79 -0
- package/dist/plugins/server/server/jobs.js.map +1 -0
- package/dist/plugins/server/server/utils/validation.d.ts +7 -0
- package/dist/plugins/server/server/utils/validation.js +37 -0
- package/dist/plugins/server/server/utils/validation.js.map +1 -0
- package/dist/plugins/server/types.d.ts +339 -0
- package/dist/plugins/server/types.js +84 -0
- package/dist/plugins/server/types.js.map +1 -0
- package/dist/server/constants.js +55 -0
- package/dist/server/plugins/server/Cache.js +19 -0
- package/dist/server/server/api/api.js +20 -0
- package/dist/server/server/api/connectorApi.js +334 -0
- package/dist/server/server/api/publicationApi.js +106 -0
- package/dist/server/server/api/websiteApi.js +315 -0
- package/dist/server/server/cli.js +71 -0
- package/dist/server/server/config.js +120 -0
- package/dist/server/server/connectors/FsHosting.js +47 -0
- package/dist/server/server/connectors/FsStorage.js +228 -0
- package/dist/server/server/connectors/connectors.js +88 -0
- package/dist/server/server/events.js +14 -0
- package/dist/server/server/expose.js +27 -0
- package/dist/server/server/express.js +46 -0
- package/dist/server/server/index.js +94 -0
- package/dist/server/server/jobs.js +50 -0
- package/dist/server/server/utils/validation.js +14 -0
- package/dist/server/types.js +40 -0
- package/package.json +99 -49
- package/public/assets/download.png +0 -0
- package/public/assets/favicon.ico +0 -0
- package/public/assets/favicon.png +0 -0
- package/public/assets/ftp.png +0 -0
- package/public/assets/gitlab.png +0 -0
- package/public/assets/gitlab2.png +0 -0
- package/public/assets/laptop.png +0 -0
- package/public/assets/logo-silex-small.png +0 -0
- package/public/silex.js +22 -23
- package/src/css/_variables.scss +24 -20
- package/src/css/dialog.scss +35 -2
- package/src/css/fonts.scss +31 -0
- package/src/css/footer.scss +12 -0
- package/src/css/grapesjs-light.scss +180 -0
- package/src/css/grapesjs-plugins.scss +227 -0
- package/src/css/grapesjs.scss +159 -1
- package/src/css/index.scss +12 -1
- package/src/css/light.scss +7 -0
- package/src/css/loader.scss +2 -0
- package/src/css/project-bar.scss +32 -16
- package/src/css/silex.scss +79 -5
- package/src/css/website-info.scss +14 -0
- package/src/html/index.pug +3 -3
- package/src/html/templates/includes.pug +0 -1
- package/src/ts/client/api.ts +156 -0
- package/src/ts/client/assetUrl.test.ts +164 -0
- package/src/ts/client/assetUrl.ts +254 -0
- package/src/ts/client/config.ts +175 -13
- package/src/ts/client/events.ts +43 -0
- package/src/ts/client/expose.ts +27 -1
- package/src/ts/client/grapesjs/LoginDialog.ts +204 -0
- package/src/ts/client/grapesjs/PublicationManager.ts +433 -0
- package/src/ts/client/grapesjs/PublicationUi.ts +366 -0
- package/src/ts/client/grapesjs/blocks.ts +17 -0
- package/src/ts/client/grapesjs/breadcrumbs.ts +79 -0
- package/src/ts/client/grapesjs/css-props.ts +910 -0
- package/src/ts/client/grapesjs/eleventy.ts +30 -7
- package/src/ts/client/grapesjs/footer.ts +42 -0
- package/src/ts/client/grapesjs/img.ts +147 -0
- package/src/ts/client/grapesjs/index.ts +311 -122
- package/src/ts/client/grapesjs/internal-links.test.ts +19 -1
- package/src/ts/client/grapesjs/internal-links.ts +31 -7
- package/src/ts/client/grapesjs/keymaps.ts +207 -0
- package/src/ts/client/grapesjs/new-page-dialog.ts +19 -3
- package/src/ts/client/grapesjs/openImport.ts +22 -0
- package/src/ts/client/grapesjs/page-panel.ts +109 -7
- package/src/ts/client/grapesjs/project-bar.ts +133 -72
- package/src/ts/client/grapesjs/resize-panel.ts +20 -0
- package/src/ts/client/grapesjs/rich-text.ts +38 -13
- package/src/ts/client/grapesjs/semantic.ts +20 -3
- package/src/ts/client/grapesjs/settings-sections.ts +117 -0
- package/src/ts/client/grapesjs/settings.ts +191 -96
- package/src/ts/client/grapesjs/storage.ts +187 -0
- package/src/ts/client/grapesjs/symbolDialogs.ts +21 -5
- package/src/ts/client/grapesjs/view-buttons.ts +42 -0
- package/src/ts/client/index.ts +80 -21
- package/src/ts/client/publication-transformers.test.ts +207 -0
- package/src/ts/client/publication-transformers.ts +280 -0
- package/src/ts/client/publish-custom-code-block.ts +31 -0
- package/src/ts/client/publish-fonts.ts +36 -0
- package/src/ts/client/utils.ts +70 -1
- package/src/ts/constants.ts +78 -0
- package/src/ts/externs.ts +17 -0
- package/src/ts/page.ts +20 -3
- package/src/ts/plugins/client/template.ts +246 -0
- package/src/ts/plugins/client/website-info.ts +84 -0
- package/src/ts/plugins/server/Cache.ts +32 -0
- package/src/ts/plugins/server/DownloadConnector.ts +146 -0
- package/src/ts/plugins/server/FtpConnector.test.ts +82 -0
- package/src/ts/plugins/server/FtpConnector.ts +621 -0
- package/src/ts/plugins/server/GitlabConnector.ts +749 -0
- package/src/ts/plugins/server/GitlabHostingConnector.ts +215 -0
- package/src/ts/plugins/server/PublicationOptimizer.ts +14 -0
- package/src/ts/plugins/server/SslPlugin.ts +84 -0
- package/src/ts/plugins/server/StaticPlugin.ts +45 -0
- package/src/ts/server/api/api.ts +19 -0
- package/src/ts/server/api/connectorApi.ts +464 -0
- package/src/ts/server/api/publicationApi.ts +159 -0
- package/src/ts/server/api/websiteApi.ts +462 -0
- package/src/ts/server/cli.ts +48 -14
- package/src/ts/server/config.ts +158 -60
- package/src/ts/server/connectors/FsHosting.ts +66 -0
- package/src/ts/server/connectors/FsStorage.test.ts +51 -0
- package/src/ts/server/connectors/FsStorage.ts +290 -0
- package/src/ts/server/connectors/connectors.ts +203 -0
- package/src/ts/server/events.ts +37 -0
- package/src/ts/server/expose.ts +19 -0
- package/src/ts/server/express.ts +57 -5
- package/src/ts/server/index.ts +79 -16
- package/src/ts/server/jobs.test.ts +75 -0
- package/src/ts/server/jobs.ts +89 -0
- package/src/ts/server/utils/BackwardCompat.ts +546 -528
- package/src/ts/server/utils/validation.ts +34 -0
- package/src/ts/types.ts +295 -85
- package/.dockerignore +0 -5
- package/.editorconfig +0 -14
- package/.eslintrc.json +0 -43
- package/.github/FUNDING.yml +0 -13
- package/.github/workflows/docker-hub-publish.yml +0 -36
- package/.github/workflows/npm-publish.yml +0 -19
- package/.github/workflows/test.yml +0 -26
- package/.nvmrc +0 -1
- package/.silex/default/.silex.data.json +0 -1
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -131
- package/Dockerfile +0 -15
- package/directus.silex.js +0 -7
- package/dist/constants.js +0 -4
- package/dist/events.js +0 -5
- package/dist/page.js +0 -15
- package/dist/server/cli.js +0 -43
- package/dist/server/config.js +0 -70
- package/dist/server/express.js +0 -18
- package/dist/server/index.js +0 -58
- package/dist/types.js +0 -34
- package/jest.config.js +0 -10
- package/logos/logo_by_ceubri/silex-icon-2018@200px.png +0 -0
- package/logos/logo_by_ceubri/silex-icon-2018@4x.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white-transp.pdf +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white.jpg +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white.pdf +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white@0.5x.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white@0.75x.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white@4x.jpg +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018-white@4x.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018.ai +5 -2521
- package/logos/logo_by_ceubri/silex-logo-2018.jpg +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018.pdf +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018@0.5x.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018@0.75x.png +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018@4x.jpg +0 -0
- package/logos/logo_by_ceubri/silex-logo-2018@4x.png +0 -0
- package/logos/silexlabs.png +0 -0
- package/src/example-client-config.js +0 -47
- package/src/plugins/AuthPlugin.js +0 -21
- package/src/plugins/Cache.js +0 -11
- package/src/plugins/DefaultBackend.js +0 -149
- package/src/plugins/ExpressPlugin.js +0 -39
- package/src/plugins/HooksPlugin.js +0 -58
- package/src/plugins/PublishPlugin.js +0 -69
- package/src/plugins/SslPlugin.js +0 -66
- package/src/plugins/StaticPlugin.js +0 -48
- package/src/plugins/WebsitePlugin.js +0 -207
- package/src/ts/client/grapesjs/publish.ts +0 -386
- package/src/ts/client/grapesjs/template.ts +0 -166
- package/src/ts/events.ts +0 -2
- package/tsconfig-server-debug.json +0 -19
- package/tsconfig-server-release.json +0 -19
- package/tsconfig.jest.json +0 -9
- package/tsconfig.json +0 -26
- package/webpack.config.js +0 -28
- 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
|
+
}
|
package/src/ts/server/cli.ts
CHANGED
|
@@ -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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
'
|
|
17
|
-
'
|
|
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
|
|
21
|
-
if(options
|
|
22
|
-
if(options.
|
|
23
|
-
if(options['
|
|
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['
|
|
31
|
-
if(options['
|
|
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
|
-
|
|
67
|
+
silex()
|