decap-cms-core
Version:
Decap CMS core application, see decap-cms package for the main distribution.
364 lines (353 loc) • 12.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.getBackend = getBackend;
exports.getCustomFormats = getCustomFormats;
exports.getCustomFormatsExtensions = getCustomFormatsExtensions;
exports.getCustomFormatsFormatters = getCustomFormatsFormatters;
exports.getEditorComponents = getEditorComponents;
exports.getEventListeners = getEventListeners;
exports.getFormatter = getFormatter;
exports.getLocale = getLocale;
exports.getMediaLibrary = getMediaLibrary;
exports.getPreviewStyles = getPreviewStyles;
exports.getPreviewTemplate = getPreviewTemplate;
exports.getRemarkPlugins = getRemarkPlugins;
exports.getWidget = getWidget;
exports.getWidgetValueSerializer = getWidgetValueSerializer;
exports.getWidgets = getWidgets;
exports.invokeEvent = invokeEvent;
exports.registerBackend = registerBackend;
exports.registerCustomFormat = registerCustomFormat;
exports.registerEditorComponent = registerEditorComponent;
exports.registerEventListener = registerEventListener;
exports.registerLocale = registerLocale;
exports.registerMediaLibrary = registerMediaLibrary;
exports.registerPreviewStyle = registerPreviewStyle;
exports.registerPreviewTemplate = registerPreviewTemplate;
exports.registerRemarkPlugin = registerRemarkPlugin;
exports.registerWidget = registerWidget;
exports.registerWidgetValueSerializer = registerWidgetValueSerializer;
exports.removeEventListener = removeEventListener;
exports.resolveWidget = resolveWidget;
var _immutable = require("immutable");
var _immer = require("immer");
var _commonTags = require("common-tags");
var _EditorComponent = _interopRequireDefault(require("../valueObjects/EditorComponent"));
const _excluded = ["name", "controlComponent", "previewComponent", "schema", "allowMapValue", "globalStyles"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
const allowedEvents = ['prePublish', 'postPublish', 'preUnpublish', 'postUnpublish', 'preSave', 'postSave'];
const eventHandlers = {};
allowedEvents.forEach(e => {
eventHandlers[e] = [];
});
/**
* Global Registry Object
*/
const registry = {
backends: {},
templates: {},
previewStyles: [],
widgets: {},
editorComponents: (0, _immutable.Map)(),
remarkPlugins: [],
widgetValueSerializers: {},
mediaLibraries: [],
locales: {},
eventHandlers,
formats: {}
};
var _default = exports.default = {
registerPreviewStyle,
getPreviewStyles,
registerPreviewTemplate,
getPreviewTemplate,
registerWidget,
getWidget,
getWidgets,
resolveWidget,
registerEditorComponent,
getEditorComponents,
registerRemarkPlugin,
getRemarkPlugins,
registerWidgetValueSerializer,
getWidgetValueSerializer,
registerBackend,
getBackend,
registerMediaLibrary,
getMediaLibrary,
registerLocale,
getLocale,
registerEventListener,
removeEventListener,
getEventListeners,
invokeEvent,
registerCustomFormat,
getCustomFormats,
getCustomFormatsExtensions,
getCustomFormatsFormatters
};
/**
* Preview Styles
*
* Valid options:
* - raw {boolean} if `true`, `style` value is expected to be a CSS string
*/
function registerPreviewStyle(style, opts) {
registry.previewStyles.push(_objectSpread(_objectSpread({}, opts), {}, {
value: style
}));
}
function getPreviewStyles() {
return registry.previewStyles;
}
/**
* Preview Templates
*/
function registerPreviewTemplate(name, component) {
registry.templates[name] = component;
}
function getPreviewTemplate(name) {
return registry.templates[name];
}
/**
* Editor Widgets
*/
function registerWidget(name, control, preview, schema = {}) {
if (Array.isArray(name)) {
name.forEach(widget => {
if (typeof widget !== 'object') {
console.error(`Cannot register widget: ${widget}`);
} else {
registerWidget(widget);
}
});
} else if (typeof name === 'string') {
// A registered widget control can be reused by a new widget, allowing
// multiple copies with different previews.
const newControl = typeof control === 'string' ? registry.widgets[control].control : control;
registry.widgets[name] = {
control: newControl,
preview,
schema
};
} else if (typeof name === 'object') {
const {
name: widgetName,
controlComponent: control,
previewComponent: preview,
schema = {},
allowMapValue,
globalStyles
} = name,
options = _objectWithoutProperties(name, _excluded);
if (registry.widgets[widgetName]) {
console.warn((0, _commonTags.oneLine)`
Multiple widgets registered with name "${widgetName}". Only the last widget registered with
this name will be used.
`);
}
if (!control) {
throw Error(`Widget "${widgetName}" registered without \`controlComponent\`.`);
}
registry.widgets[widgetName] = _objectSpread({
control,
preview,
schema,
globalStyles,
allowMapValue
}, options);
} else {
console.error('`registerWidget` failed, called with incorrect arguments.');
}
}
function getWidget(name) {
return registry.widgets[name];
}
function getWidgets() {
return (0, _immer.produce)(Object.entries(registry.widgets), draft => {
return draft.map(([key, value]) => _objectSpread({
name: key
}, value));
});
}
function resolveWidget(name) {
return getWidget(name || 'string') || getWidget('unknown');
}
/**
* Markdown Editor Custom Components
*/
function registerEditorComponent(component) {
const plugin = (0, _EditorComponent.default)(component);
if (plugin.type === 'code-block') {
const codeBlock = registry.editorComponents.find(c => c.type === 'code-block');
if (codeBlock) {
console.warn((0, _commonTags.oneLine)`
Only one editor component of type "code-block" may be registered. Previously registered code
block component(s) will be overwritten.
`);
registry.editorComponents = registry.editorComponents.delete(codeBlock.id);
}
}
registry.editorComponents = registry.editorComponents.set(plugin.id, plugin);
}
function getEditorComponents() {
return registry.editorComponents;
}
/**
* Remark plugins
*/
/** @typedef {import('unified').Pluggable} RemarkPlugin */
/** @type {(plugin: RemarkPlugin) => void} */
function registerRemarkPlugin(plugin) {
registry.remarkPlugins.push(plugin);
}
/** @type {() => Array<RemarkPlugin>} */
function getRemarkPlugins() {
return registry.remarkPlugins;
}
/**
* Widget Serializers
*/
function registerWidgetValueSerializer(widgetName, serializer) {
registry.widgetValueSerializers[widgetName] = serializer;
}
function getWidgetValueSerializer(widgetName) {
return registry.widgetValueSerializers[widgetName];
}
/**
* Backend API
*/
function registerBackend(name, BackendClass) {
if (!name || !BackendClass) {
console.error("Backend parameters invalid. example: CMS.registerBackend('myBackend', BackendClass)");
} else if (registry.backends[name]) {
console.error(`Backend [${name}] already registered. Please choose a different name.`);
} else {
registry.backends[name] = {
init: (...args) => new BackendClass(...args)
};
}
}
function getBackend(name) {
return registry.backends[name];
}
/**
* Media Libraries
*/
function registerMediaLibrary(mediaLibrary, options) {
if (registry.mediaLibraries.find(ml => mediaLibrary.name === ml.name)) {
throw new Error(`A media library named ${mediaLibrary.name} has already been registered.`);
}
registry.mediaLibraries.push(_objectSpread(_objectSpread({}, mediaLibrary), {}, {
options
}));
}
function getMediaLibrary(name) {
return registry.mediaLibraries.find(ml => ml.name === name);
}
function validateEventName(name) {
if (!allowedEvents.includes(name)) {
throw new Error(`Invalid event name '${name}'`);
}
}
function getEventListeners(name) {
validateEventName(name);
return [...registry.eventHandlers[name]];
}
function registerEventListener({
name,
handler
}, options = {}) {
validateEventName(name);
registry.eventHandlers[name].push({
handler,
options
});
}
async function invokeEvent({
name,
data
}) {
validateEventName(name);
const handlers = registry.eventHandlers[name];
let _data = _objectSpread({}, data);
for (const {
handler,
options
} of handlers) {
const result = await handler(_data, options);
if (result !== undefined) {
const entry = _data.entry.set('data', result);
_data = _objectSpread(_objectSpread({}, data), {}, {
entry
});
}
}
return _data.entry.get('data');
}
function removeEventListener({
name,
handler
}) {
validateEventName(name);
if (handler) {
registry.eventHandlers[name] = registry.eventHandlers[name].filter(item => item.handler !== handler);
} else {
registry.eventHandlers[name] = [];
}
}
/**
* Locales
*/
function registerLocale(locale, phrases) {
if (!locale || !phrases) {
console.error("Locale parameters invalid. example: CMS.registerLocale('locale', phrases)");
} else {
registry.locales[locale] = phrases;
}
}
function getLocale(locale) {
return registry.locales[locale];
}
function registerCustomFormat(name, extension, formatter) {
registry.formats[name] = {
extension,
formatter
};
}
function getCustomFormats() {
return registry.formats;
}
function getCustomFormatsExtensions() {
return Object.entries(registry.formats).reduce(function (acc, [name, {
extension
}]) {
return _objectSpread(_objectSpread({}, acc), {}, {
[name]: extension
});
}, {});
}
/** @type {() => Record<string, unknown>} */
function getCustomFormatsFormatters() {
return Object.entries(registry.formats).reduce(function (acc, [name, {
formatter
}]) {
return _objectSpread(_objectSpread({}, acc), {}, {
[name]: formatter
});
}, {});
}
function getFormatter(name) {
var _registry$formats$nam;
return (_registry$formats$nam = registry.formats[name]) === null || _registry$formats$nam === void 0 ? void 0 : _registry$formats$nam.formatter;
}