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