@silexlabs/silex
Version:
Free and easy website builder for everyone.
333 lines (315 loc) • 8.24 kB
text/typescript
import { DataSourceType, Field, IDataSource, Type, addDataSource, addFilters, removeFilters } from '@silexlabs/grapesjs-data-source'
import { EleventyPluginOptions, Silex11tyPluginWebsiteSettings } from './index'
import { Editor } from 'grapesjs'
import { i18nFilters } from './filters'
import { ClientEvent } from '../../events'
//import { cmdPauseAutoSave } from '@silexlabs/silex/src/ts/client/grapesjs/storage'
const cmdPauseAutoSave = 'pause-auto-save'
export default function(editor: Editor, opts: EleventyPluginOptions): void {
editor.on(`
${ ClientEvent.SETTINGS_SAVE_END }
storage:after:load
`, () => {
updateFilters(editor, opts)
})
updateFilters(editor, opts)
if(opts.enable11ty) {
// Add the 11ty data source using the new functional API
const ds = new EleventyDataSource()
editor.runCommand(cmdPauseAutoSave)
// Add the data source
addDataSource(ds)
// Wait for the next tick to avoid triggering a save
setTimeout(() => {
editor.stopCommand(cmdPauseAutoSave)
})
}
}
function updateFilters(editor: Editor, opts: EleventyPluginOptions) {
const settings = (editor.getModel().get('settings') || {}) as Silex11tyPluginWebsiteSettings
if(settings.eleventyI18n) {
addFilters(i18nFilters)
} else if (!opts.i18nPlugin) {
removeFilters(i18nFilters)
}
}
export const EleventyDataSourceId = 'eleventy'
export class EleventyDataSource implements IDataSource {
/**
* Unique identifier of the data source
* This is used to retrieve the data source from the editor
*/
public id = EleventyDataSourceId
public label = 'Eleventy'
public url = ''
public type = 'graphql' as DataSourceType
public method = 'POST'
public headers = {}
public hidden = true
public readonly = true
private eventListeners: Record<string, ((...args: unknown[]) => void)[]> = {}
// Simple event handling
on(event: string, callback: (...args: unknown[]) => void): void {
if (!this.eventListeners[event]) {
this.eventListeners[event] = []
}
this.eventListeners[event].push(callback)
}
off(event: string, callback?: (...args: unknown[]) => void): void {
if (!this.eventListeners[event]) return
if (callback) {
this.eventListeners[event] = this.eventListeners[event].filter(cb => cb !== callback)
} else {
this.eventListeners[event] = []
}
}
trigger(event: string, ...args: unknown[]): void {
if (!this.eventListeners[event]) return
this.eventListeners[event].forEach(callback => callback(...args))
}
/**
* Implement IDatasource
*/
async connect(): Promise<void> {}
isConnected(): boolean { return true }
/**
* Implement IDatasource
*/
getQuery(/*expressions: Expression[]*/): string { return '' }
/**
* Implement IDatasource
*/
getTypes(): Type[] {
return [{
id: 'string',
label: 'String',
dataSourceId: 'eleventy',
fields: [],
}, {
id: 'number',
label: 'Number',
dataSourceId: 'eleventy',
fields: [],
}, {
id: 'date',
label: 'Date',
dataSourceId: 'eleventy',
fields: [],
}, {
id: 'page',
label: 'page',
dataSourceId: 'eleventy',
fields: [{
id: 'url',
label: 'url',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'fileSlug',
label: 'fileSlug',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'filePathStem',
label: 'filePathStem',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'date',
label: 'date',
typeIds: ['date'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'inputPath',
label: 'inputPath',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'outputPath',
label: 'outputPath',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'outputFileExtension',
label: 'outputFileExtension',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'lang',
label: 'lang',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}],
}, {
id: 'pagination',
label: 'pagination',
dataSourceId: 'eleventy',
fields: [{
id: 'hrefs',
label: 'hrefs',
typeIds: ['string'],
kind: 'list',
dataSourceId: 'eleventy',
}, {
id: 'href',
label: 'href',
typeIds: ['paginationHref'],
kind: 'object',
dataSourceId: 'eleventy',
}, {
id: 'pageNumber',
label: 'pageNumber',
typeIds: ['number'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'pages',
label: 'pages',
typeIds: ['page'],
kind: 'list',
dataSourceId: 'eleventy',
}],
}, {
id: 'paginationHref',
label: 'paginationHref',
dataSourceId: 'eleventy',
fields: [{
id: 'next',
label: 'next',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'previous',
label: 'previous',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'first',
label: 'first',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'last',
label: 'last',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}],
}, {
id: 'eleventy',
label: 'eleventy',
dataSourceId: 'eleventy',
fields: [{
id: 'version',
label: 'version',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'generator',
label: 'generator',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'env',
label: 'env',
typeIds: ['env'],
kind: 'object',
dataSourceId: 'eleventy',
}]
}, {
id: 'env',
label: 'env',
dataSourceId: 'eleventy',
fields: [{
id: 'root',
label: 'root',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'config',
label: 'config',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'source',
label: 'source',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'runMode',
label: 'runMode',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}],
}, {
id: 'locale_link',
label: 'locale_link',
dataSourceId: 'eleventy',
fields: [{
id: 'url',
label: 'url',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'lang',
label: 'lang',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}, {
id: 'label',
label: 'label',
typeIds: ['string'],
kind: 'scalar',
dataSourceId: 'eleventy',
}],
}]
}
/**
* Implement IDatasource
*/
getQueryables(): Field[] {
return [{
id: 'page',
label: 'page',
typeIds: ['page'],
kind: 'object',
dataSourceId: 'eleventy',
//}, {
// id: 'eleventy',
// label: 'eleventy',
// typeIds: ['eleventy'],
// kind: 'object',
// dataSourceId: 'eleventy',
//}, {
// id: 'env',
// label: 'env',
// typeIds: ['env'],
// kind: 'object',
// dataSourceId: 'eleventy',
}]
}
fetchValues(query: string): Promise<unknown> {
throw new Error('not implemented yet')
}
}
export class EleventyDataSourceTest extends EleventyDataSource {
}