UNPKG

@silexlabs/silex

Version:

Free and easy website builder for everyone.

202 lines (177 loc) 5.96 kB
/* * Silex website builder, free/libre no-code tool for makers. * Copyright (c) 2023 lexoyo and Silex Labs foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. */ import { Config } from '@silexlabs/silex-plugins' import { getEditor, getEditorConfig } from './grapesjs' import { CLIENT_CONFIG_FILE_NAME, DEFAULT_LANGUAGE, DEFAULT_WEBSITE_ID, SILEX_VERSION } from '../constants' import { ConnectorId, WebsiteId } from '../types' import { Editor, EditorConfig, Page } from 'grapesjs' import { PublicationTransformer, publicationTransformerDefault, validatePublicationTransformer } from './publication-transformers' import * as api from './api' import { assetsPublicationTransformer } from './assetUrl' import { SettingsSection } from './grapesjs/settings-sections' import { addSection, removeSection } from './grapesjs/settings' // Plugins import publishCustomCodeBlock from './publish-custom-code-block' import publishFonts from './publish-fonts' /** * @fileoverview Silex client side config */ export class ClientConfig extends Config { api = api /** * The website to load * This is the id of the website in the storage connector */ websiteId: WebsiteId = new URL(location.href).searchParams.get('id') ?? DEFAULT_WEBSITE_ID /** * The storage connector to use * If not found in the URL and the user is not logged in to any storage, use the first storage */ storageId: ConnectorId = new URL(location.href).searchParams.get('connectorId') /** * language for I18n module */ lang = new URL(location.href).searchParams.get('lang') ?? DEFAULT_LANGUAGE /** * root url of Silex app */ rootUrl = window.location.origin + window.location.pathname.replace(/\/$/, '') /** * debug mode */ debug = false /** * Add hash in the file name of CSS at the time of publication * If true, CSS files of generated pages will look like `page-name.123456.css` instead of `page-name.css` * This is useful to avoid caching issues * @default true */ addHashInCssFileName = true /** * Replaced elements * This is a list of elements which support the object-fit and object-position CSS properties * https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element * When selected, Silex will show the object-fit and object-position properties in the style panel */ replacedElements = [ 'img', 'video', 'iframe', 'embed', 'object', 'audio', 'canvas', // 'option', ] /** * Grapesjs config */ grapesJsConfig: EditorConfig = { plugins: [], pluginsOpts: {}, } /** * Client config url * This is the url of the config file which is a plugin */ clientConfigUrl = `${this.rootUrl}/${CLIENT_CONFIG_FILE_NAME}?${ SILEX_VERSION }` /** * Google fonts API key, see this doc to get an API key: https://developers.google.com/fonts/docs/developer_api#APIKey * @default Test key for local dev */ fontsApiKey = 'AIzaSyAdJTYSLPlKz4w5Iqyy-JAF2o8uQKd1FKc' /** * 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 * @see https://github.com/coollabsio/fonts * @see https://fontlay.com/ * @default Google Fonts */ fontsServerUrl = 'https://fonts.googleapis.com' fontsApiUrl = 'https://www.googleapis.com' /** * Init GrapesJS config which depend on the config file properties */ initGrapesConfig() { // Get the initial config const config = getEditorConfig(this) // Merge with the config modified by plugins this.grapesJsConfig = { ...this.grapesJsConfig, ...config, plugins: [ ...this.grapesJsConfig.plugins, ...config.plugins, ], pluginsOpts: { ...this.grapesJsConfig.pluginsOpts, ...config.pluginsOpts, }, } } /** * Get grapesjs editor */ getEditor(): Editor { return getEditor() } /** * Publication transformers let plugins change files before they are published */ publicationTransformers: Array<PublicationTransformer> = [assetsPublicationTransformer, publicationTransformerDefault] /** * Reset publication transformers */ resetPublicationTransformers() { this.publicationTransformers = [assetsPublicationTransformer] } /** * Add a publication transformer(s) */ addPublicationTransformers(transformers: PublicationTransformer | PublicationTransformer[]) { // Make sure it is an array if (!Array.isArray(transformers)) { transformers = [transformers] } // Validate transformers.forEach(transformer => { validatePublicationTransformer(transformer) }) // Add to the list this.publicationTransformers = this.publicationTransformers.concat(transformers) } /** * Add a section to the settings dialog */ addSettings(section: SettingsSection, siteOrPage: 'site' | 'page', position: 'first' | 'last' | number = 'last') { addSection(section, siteOrPage, position) } /** * Remove a section from the settings dialog */ removeSettings(id: string, siteOrPage: 'site' | 'page') { removeSection(id, siteOrPage) } /** * Add default plugins */ async addDefaultPlugins() { await this.addPlugin([ publishCustomCodeBlock, publishFonts, ], {}) } }