@silexlabs/silex 3.0.1-alpha.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +92 -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 +80 -19
- 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
package/src/ts/client/config.ts
CHANGED
|
@@ -1,39 +1,201 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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 { Config } from '@silexlabs/silex-plugins'
|
|
19
|
+
import { getEditor, getEditorConfig } from './grapesjs'
|
|
20
|
+
import { CLIENT_CONFIG_FILE_NAME, DEFAULT_LANGUAGE, DEFAULT_WEBSITE_ID } from '../constants'
|
|
21
|
+
import { ConnectorId, WebsiteId } from '../types'
|
|
22
|
+
import { Editor, EditorConfig, Page } from 'grapesjs'
|
|
23
|
+
import { PublicationTransformer, publicationTransformerDefault, validatePublicationTransformer } from './publication-transformers'
|
|
24
|
+
import * as api from './api'
|
|
25
|
+
import { assetsPublicationTransformer } from './assetUrl'
|
|
26
|
+
import { SettingsSection } from './grapesjs/settings-sections'
|
|
27
|
+
import { addSection, removeSection } from './grapesjs/settings'
|
|
28
|
+
|
|
29
|
+
// Plugins
|
|
30
|
+
import publishCustomCodeBlock from './publish-custom-code-block'
|
|
31
|
+
import publishFonts from './publish-fonts'
|
|
4
32
|
|
|
5
33
|
/**
|
|
6
34
|
* @fileoverview Silex client side config
|
|
7
35
|
*/
|
|
8
36
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
37
|
+
export class ClientConfig extends Config {
|
|
38
|
+
api = api
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The website to load
|
|
42
|
+
* This is the id of the website in the storage connector
|
|
43
|
+
*/
|
|
44
|
+
websiteId: WebsiteId = new URL(location.href).searchParams.get('id') ?? DEFAULT_WEBSITE_ID
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The storage connector to use
|
|
48
|
+
* If not found in the URL and the user is not logged in to any storage, use the first storage
|
|
49
|
+
*/
|
|
50
|
+
storageId: ConnectorId = new URL(location.href).searchParams.get('connectorId')
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* language for I18n module
|
|
54
|
+
*/
|
|
55
|
+
lang = new URL(location.href).searchParams.get('lang') ?? DEFAULT_LANGUAGE
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* root url of Silex app
|
|
59
|
+
*/
|
|
60
|
+
rootUrl = window.location.origin + window.location.pathname.replace(/\/$/, '')
|
|
12
61
|
|
|
13
|
-
export class SilexConfig extends Config {
|
|
14
62
|
/**
|
|
15
63
|
* debug mode
|
|
16
64
|
*/
|
|
17
65
|
debug = false
|
|
18
66
|
|
|
19
67
|
/**
|
|
20
|
-
*
|
|
68
|
+
* Add hash in the file name of CSS at the time of publication
|
|
69
|
+
* If true, CSS files of generated pages will look like `page-name.123456.css` instead of `page-name.css`
|
|
70
|
+
* This is useful to avoid caching issues
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
addHashInCssFileName = true
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Replaced elements
|
|
77
|
+
* This is a list of elements which support the object-fit and object-position CSS properties
|
|
78
|
+
* https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element
|
|
79
|
+
* When selected, Silex will show the object-fit and object-position properties in the style panel
|
|
21
80
|
*/
|
|
22
|
-
|
|
81
|
+
replacedElements = [
|
|
82
|
+
'img',
|
|
83
|
+
'video',
|
|
84
|
+
'iframe',
|
|
85
|
+
'embed',
|
|
86
|
+
'object',
|
|
87
|
+
'audio',
|
|
88
|
+
'canvas',
|
|
89
|
+
// 'option',
|
|
90
|
+
]
|
|
23
91
|
|
|
24
92
|
/**
|
|
25
93
|
* Grapesjs config
|
|
26
94
|
*/
|
|
27
|
-
|
|
95
|
+
grapesJsConfig: EditorConfig = {
|
|
96
|
+
plugins: [],
|
|
97
|
+
pluginsOpts: {},
|
|
98
|
+
}
|
|
28
99
|
|
|
29
100
|
/**
|
|
30
101
|
* Client config url
|
|
31
102
|
* This is the url of the config file which is a plugin
|
|
32
103
|
*/
|
|
33
|
-
clientConfigUrl = `${rootUrl}
|
|
104
|
+
clientConfigUrl = `${this.rootUrl}/${CLIENT_CONFIG_FILE_NAME}`
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Google fonts API key, see this doc to get an API key: https://developers.google.com/fonts/docs/developer_api#APIKey
|
|
108
|
+
* @default Test key for local dev
|
|
109
|
+
*/
|
|
110
|
+
fontsApiKey = 'AIzaSyAdJTYSLPlKz4w5Iqyy-JAF2o8uQKd1FKc'
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Google fonts server or a free privacy-friendly drop-in replacement for Google Fonts or a proxy server to speed up the load and protect privacy
|
|
114
|
+
* @see https://github.com/coollabsio/fonts
|
|
115
|
+
* @see https://fontlay.com/
|
|
116
|
+
* @default Google Fonts
|
|
117
|
+
*/
|
|
118
|
+
fontsServerUrl = 'https://fonts.googleapis.com'
|
|
119
|
+
fontsApiUrl = 'https://www.googleapis.com'
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Init GrapesJS config which depend on the config file properties
|
|
123
|
+
*/
|
|
124
|
+
initGrapesConfig() {
|
|
125
|
+
// Get the initial config
|
|
126
|
+
const config = getEditorConfig(this)
|
|
127
|
+
|
|
128
|
+
// Merge with the config modified by plugins
|
|
129
|
+
this.grapesJsConfig = {
|
|
130
|
+
...this.grapesJsConfig,
|
|
131
|
+
...config,
|
|
132
|
+
plugins: [
|
|
133
|
+
...this.grapesJsConfig.plugins,
|
|
134
|
+
...config.plugins,
|
|
135
|
+
],
|
|
136
|
+
pluginsOpts: {
|
|
137
|
+
...this.grapesJsConfig.pluginsOpts,
|
|
138
|
+
...config.pluginsOpts,
|
|
139
|
+
},
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get grapesjs editor
|
|
145
|
+
*/
|
|
146
|
+
getEditor(): Editor {
|
|
147
|
+
return getEditor()
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Publication transformers let plugins change files before they are published
|
|
152
|
+
*/
|
|
153
|
+
publicationTransformers: Array<PublicationTransformer> = [assetsPublicationTransformer, publicationTransformerDefault]
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Reset publication transformers
|
|
157
|
+
*/
|
|
158
|
+
resetPublicationTransformers() {
|
|
159
|
+
this.publicationTransformers = [assetsPublicationTransformer]
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Add a publication transformer(s)
|
|
164
|
+
*/
|
|
165
|
+
addPublicationTransformers(transformers: PublicationTransformer | PublicationTransformer[]) {
|
|
166
|
+
// Make sure it is an array
|
|
167
|
+
if (!Array.isArray(transformers)) {
|
|
168
|
+
transformers = [transformers]
|
|
169
|
+
}
|
|
170
|
+
// Validate
|
|
171
|
+
transformers.forEach(transformer => {
|
|
172
|
+
validatePublicationTransformer(transformer)
|
|
173
|
+
})
|
|
174
|
+
// Add to the list
|
|
175
|
+
this.publicationTransformers = this.publicationTransformers.concat(transformers)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Add a section to the settings dialog
|
|
180
|
+
*/
|
|
181
|
+
addSettings(section: SettingsSection, siteOrPage: 'site' | 'page', position: 'first' | 'last' | number = 'last') {
|
|
182
|
+
addSection(section, siteOrPage, position)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Remove a section from the settings dialog
|
|
187
|
+
*/
|
|
188
|
+
removeSettings(id: string, siteOrPage: 'site' | 'page') {
|
|
189
|
+
removeSection(id, siteOrPage)
|
|
190
|
+
}
|
|
34
191
|
|
|
35
192
|
/**
|
|
36
|
-
*
|
|
193
|
+
* Add default plugins
|
|
37
194
|
*/
|
|
38
|
-
|
|
195
|
+
async addDefaultPlugins() {
|
|
196
|
+
await this.addPlugin([
|
|
197
|
+
publishCustomCodeBlock,
|
|
198
|
+
publishFonts,
|
|
199
|
+
], {})
|
|
200
|
+
}
|
|
39
201
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
export enum ClientEvent {
|
|
19
|
+
// Sent on the config object
|
|
20
|
+
STARTUP_START = 'silex:startup:start', /* Loading is over and Silex is starting */
|
|
21
|
+
STARTUP_END = 'silex:startup:end', /* Silex is ready to be used */
|
|
22
|
+
GRAPESJS_START = 'silex:grapesjs:start', /* GrapesJS is about to be initialized, it is time to edit config.grapesJsConfig */
|
|
23
|
+
GRAPESJS_END = 'silex:grapesjs:end', /* GrapesJS is ready to be used, `editor` is passed as an argument */
|
|
24
|
+
|
|
25
|
+
// Sent on GrapesJs editor object (returned by silex.getEditor())
|
|
26
|
+
PUBLICATION_UI_OPEN = 'silex:publication-ui:open', /* The publication UI is opened, you can access it with { publicationUi } */
|
|
27
|
+
PUBLICATION_UI_CLOSE = 'silex:publication-ui:close', /* The publication UI is closed, you can access it with { publicationUi } */
|
|
28
|
+
PUBLISH_BEFORE = 'silex:publish:before', /* Publication is about to start, you can read+write {projectData, siteSettings} */
|
|
29
|
+
PUBLISH_START = 'silex:publish:start', /* Publication starts, you can read+write project data/settings, use publication manager/ui, prevent publication {projectData, siteSettings, publicationManager, prenventDefault} */
|
|
30
|
+
PUBLISH_PAGE = 'silex:publish:page', /* Publication of a page, read+write settings and page data, use publication manager and prevent publication { siteSettings, pageSettings, page, publicationManager, preventDefault } */
|
|
31
|
+
PUBLISH_DATA = 'silex:publish:data', /* Just before we send the published data to the server, read+write all publication data, check PublicationData type in types.ts { data, publicationManager } */
|
|
32
|
+
PUBLISH_END = 'silex:publish:end', /* Publication is over, the argument is the publication result with {success: boolean, message: string} */
|
|
33
|
+
PUBLISH_ERROR = 'silex:publish:error', /* Publication failed, the argument is the publication result with {success: boolean, message: string} */
|
|
34
|
+
PUBLISH_LOGIN_START = 'silex:publish:login:start', /* The user is about to login before publication, you can read+write connector data and use publication manager and prevent publication {connector, publicationManager, preventDefault} */
|
|
35
|
+
PUBLISH_LOGIN_END = 'silex:publish:login:end',
|
|
36
|
+
ASSET_WRITE_END = 'silex:asset:write:end',
|
|
37
|
+
WRITE_END = 'silex:write:end',
|
|
38
|
+
SETTINGS_OPEN = 'silex:settings:open', /* The settings dialog is opened */
|
|
39
|
+
SETTINGS_CLOSE = 'silex:settings:close', /* The settings dialog is closed */
|
|
40
|
+
SETTINGS_SAVE_START = 'silex:settings:save:start', /* The settings dialog is closed and the settings are about to be saved */
|
|
41
|
+
SETTINGS_SAVE_END = 'silex:settings:save:end', /* The settings dialog is closed and the settings are saved */
|
|
42
|
+
SETTINGS_SECTION_CHANGE = 'silex:settings:section-change', /* The user clicked on a section in the settings dialog */
|
|
43
|
+
}
|
package/src/ts/client/expose.ts
CHANGED
|
@@ -1,4 +1,30 @@
|
|
|
1
|
-
|
|
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
|
+
|
|
2
18
|
export * from './grapesjs/index'
|
|
3
19
|
export * from './config'
|
|
4
20
|
|
|
21
|
+
export * as constants from '../constants'
|
|
22
|
+
export * as utils from './utils'
|
|
23
|
+
export * as api from './api'
|
|
24
|
+
export * as events from './events'
|
|
25
|
+
export * as page from '../page'
|
|
26
|
+
export * as types from '../types'
|
|
27
|
+
|
|
28
|
+
console.info(`
|
|
29
|
+
Silex client loaded
|
|
30
|
+
`)
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { html, render } from 'lit-html'
|
|
2
|
+
import { Editor } from 'grapesjs'
|
|
3
|
+
import { ApiConnectorLoggedInPostMessage, ConnectorData, ConnectorId, ConnectorType, ConnectorUser } from '../../types'
|
|
4
|
+
import { connectorList, getUser, logout } from '../api'
|
|
5
|
+
import { WebsiteId } from '../../types'
|
|
6
|
+
import { API_CONNECTOR_LOGIN, API_CONNECTOR_PATH, API_PATH } from '../../constants'
|
|
7
|
+
|
|
8
|
+
export const cmdLogin = 'silex:auth:login'
|
|
9
|
+
export const cmdLogout = 'silex:auth:logout'
|
|
10
|
+
export const eventLoggingIn = 'silex:auth:logging-in'
|
|
11
|
+
export const eventLoggedIn = 'silex:auth:logged-in'
|
|
12
|
+
export const eventLoginFailed = 'silex:auth:login-failed'
|
|
13
|
+
export const eventLoggedOut = 'silex:auth:logged-out'
|
|
14
|
+
|
|
15
|
+
export interface LoginDialogOptions {
|
|
16
|
+
id: WebsiteId,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function getCurrentUser(editor: Editor): Promise<ConnectorUser> {
|
|
20
|
+
return editor.getModel().get('user') as ConnectorUser
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function updateUser(editor: Editor, type: ConnectorType, connectorId?: ConnectorId): Promise<ConnectorUser> {
|
|
24
|
+
const user = await getUser({type, connectorId})
|
|
25
|
+
editor.getModel().set('user', user)
|
|
26
|
+
return user
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Orging and path, should we use config.rootUrl?
|
|
30
|
+
const SERVER_URL = window.location.origin + window.location.pathname.replace(/\/$/, '')
|
|
31
|
+
|
|
32
|
+
let open = false
|
|
33
|
+
let body: HTMLElement | null = null
|
|
34
|
+
export default function loginDialogPlugin(editor, opts) {
|
|
35
|
+
// Options
|
|
36
|
+
const options: LoginDialogOptions = {
|
|
37
|
+
...opts,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Commands and events
|
|
41
|
+
editor.Commands.add(cmdLogin, {
|
|
42
|
+
async run(editor: Editor) { await openDialog() },
|
|
43
|
+
stop(editor: Editor) { closeDialog() },
|
|
44
|
+
})
|
|
45
|
+
editor.Commands.add(cmdLogout, {
|
|
46
|
+
async run(editor: Editor) {
|
|
47
|
+
await logout({type: ConnectorType.STORAGE })
|
|
48
|
+
editor.getModel().set('user', null)
|
|
49
|
+
editor.trigger(eventLoggedOut)
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
editor.on(eventLoggedOut, async () => openDialog())
|
|
53
|
+
|
|
54
|
+
// Dialog API
|
|
55
|
+
function closeDialog() {
|
|
56
|
+
if (open) {
|
|
57
|
+
editor.Modal.close()
|
|
58
|
+
open = false
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function openDialog() {
|
|
62
|
+
editor.trigger(eventLoggingIn)
|
|
63
|
+
open = true
|
|
64
|
+
editor.Modal.open({
|
|
65
|
+
title: 'Login',
|
|
66
|
+
content: '<div id="LoginDialog__content"></div>',
|
|
67
|
+
}, {
|
|
68
|
+
closeOnConfirm: false,
|
|
69
|
+
closeOnEscape: false,
|
|
70
|
+
closeOnOverlayClick: false,
|
|
71
|
+
})
|
|
72
|
+
body = document.querySelector('#LoginDialog__content')
|
|
73
|
+
if (!body) {
|
|
74
|
+
throw new Error('Dialog creation failed')
|
|
75
|
+
}
|
|
76
|
+
render(html`Logging in...`, body)
|
|
77
|
+
return loadStorageList(async list => onStorageList(list))
|
|
78
|
+
}
|
|
79
|
+
async function onStorageList(list) {
|
|
80
|
+
const loggedIn = list.find(connector => connector.isLoggedIn)
|
|
81
|
+
if (loggedIn) {
|
|
82
|
+
try {
|
|
83
|
+
const status = await updateUser(editor, loggedIn.type, loggedIn.connectorId)
|
|
84
|
+
editor.trigger(eventLoggedIn, status)
|
|
85
|
+
return closeDialog()
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.error('Error with updating login status', err)
|
|
88
|
+
render(html`
|
|
89
|
+
<main>
|
|
90
|
+
<p>There was an error with updating the login status. ${err.message}</p>
|
|
91
|
+
</main>
|
|
92
|
+
<footer>
|
|
93
|
+
<button class="silex-button silex-button--primary" @click=${() => loadStorageList(async list => onStorageList(list))}>Retry</button>
|
|
94
|
+
<button class="silex-button" @click=${async () => {
|
|
95
|
+
await logout({type: loggedIn.type, connectorId: loggedIn.connectorId})
|
|
96
|
+
openDialog()
|
|
97
|
+
}}>Login with another connector</button>
|
|
98
|
+
</footer>
|
|
99
|
+
`, body)
|
|
100
|
+
}
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
// Display the list of storage and continue to login
|
|
104
|
+
render(html`
|
|
105
|
+
<main>
|
|
106
|
+
<p>Login and give Silex access to a file storage.</p>
|
|
107
|
+
${list.map(connector => html`
|
|
108
|
+
<button
|
|
109
|
+
class="silex-button silex-button--primary"
|
|
110
|
+
id="publish-button--primary"
|
|
111
|
+
@click=${() => loginWithConnector(connector)}
|
|
112
|
+
>Login with ${connector.displayName}</button>
|
|
113
|
+
`)}
|
|
114
|
+
</main>
|
|
115
|
+
<footer>
|
|
116
|
+
</footer>
|
|
117
|
+
`, body)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Auth management
|
|
121
|
+
async function loadStorageList(done: (list: ConnectorData[]) => Promise<void>) {
|
|
122
|
+
try {
|
|
123
|
+
const storageConnectors = await connectorList({type: ConnectorType.STORAGE})
|
|
124
|
+
await done(storageConnectors)
|
|
125
|
+
} catch (err) {
|
|
126
|
+
console.error('Error with loading storage connectors', err)
|
|
127
|
+
render(html`
|
|
128
|
+
<main>
|
|
129
|
+
An error occured while loading the storage connectors: ${err.message}
|
|
130
|
+
</main>
|
|
131
|
+
<footer>
|
|
132
|
+
<button type="button" class="gjs-btn-prim" @click=${() => loadStorageList(done)}>Retry</button>
|
|
133
|
+
</footer>
|
|
134
|
+
`, body)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function loginWithConnector(connector: ConnectorData) {
|
|
138
|
+
const nonOAuthUrl = `${SERVER_URL}${API_PATH}${API_CONNECTOR_PATH}${API_CONNECTOR_LOGIN}?connectorId=${connector.connectorId}&type=${connector.type}`
|
|
139
|
+
window.open(connector.oauthUrl ?? nonOAuthUrl, '_blank')
|
|
140
|
+
return new Promise(resolve => {
|
|
141
|
+
render(html`
|
|
142
|
+
<main>
|
|
143
|
+
<p>Waiting for your authorization in popup window...</p>
|
|
144
|
+
</main>
|
|
145
|
+
<footer>
|
|
146
|
+
<button type="button" class="gjs-btn-prim" @click=${() => openDialog()}>Cancel</button>
|
|
147
|
+
</footer>
|
|
148
|
+
`, body)
|
|
149
|
+
const onMessage = async (event) => {
|
|
150
|
+
const data = event.data as ApiConnectorLoggedInPostMessage
|
|
151
|
+
if (data?.type === 'login') {
|
|
152
|
+
window.removeEventListener('message', onMessage)
|
|
153
|
+
const { connectorId, error, message } = data // TODO: use options from the connector? For now they are stored in the session
|
|
154
|
+
if (error) {
|
|
155
|
+
// Error, start over
|
|
156
|
+
console.error('login error', message)
|
|
157
|
+
render(html`
|
|
158
|
+
<main>
|
|
159
|
+
<p>Login failed with error: ${message}</p>
|
|
160
|
+
<footer>
|
|
161
|
+
<button type="button" class="gjs-btn-prim" @click=${() => openDialog()}>Retry</button>
|
|
162
|
+
${ connectorId ? html`<button class="silex-button" @click=${async () => {
|
|
163
|
+
await logout({type: connector.type, connectorId})
|
|
164
|
+
openDialog()
|
|
165
|
+
}}>Login with another connector</button>` : '' }
|
|
166
|
+
|
|
167
|
+
</footer>
|
|
168
|
+
`, body)
|
|
169
|
+
editor.trigger(eventLoginFailed)
|
|
170
|
+
} else {
|
|
171
|
+
try {
|
|
172
|
+
render(html`
|
|
173
|
+
<main>
|
|
174
|
+
<p>Loging in...</p>
|
|
175
|
+
</main>
|
|
176
|
+
<footer>
|
|
177
|
+
</footer>
|
|
178
|
+
`, body)
|
|
179
|
+
const status = await updateUser(editor, connector.type, connectorId)
|
|
180
|
+
editor.trigger(eventLoggedIn, status)
|
|
181
|
+
closeDialog()
|
|
182
|
+
} catch (err) {
|
|
183
|
+
console.error('Error with loading login status', err)
|
|
184
|
+
render(html`
|
|
185
|
+
<main>
|
|
186
|
+
An error occured, could not get your data.
|
|
187
|
+
${err.message}
|
|
188
|
+
</main>
|
|
189
|
+
<footer>
|
|
190
|
+
<button type="button" class="gjs-btn-prim" @click=${() => openDialog()}>Retry</button>
|
|
191
|
+
<button class="silex-button" @click=${async () => {
|
|
192
|
+
await logout({type: connector.type, connectorId})
|
|
193
|
+
openDialog()
|
|
194
|
+
}}>Login with another connector</button>
|
|
195
|
+
</footer>
|
|
196
|
+
`, body)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
window.addEventListener('message', onMessage, false)
|
|
202
|
+
})
|
|
203
|
+
}
|
|
204
|
+
}
|