@discoveryjs/discovery
Version:
Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards
77 lines (76 loc) • 2.29 kB
JavaScript
import { hasOwn } from "../core/utils/object-utils.js";
import jora from "jora";
export function createExtensionApi(host, options) {
return {
before() {
host.objectMarkers.reset();
},
contextApi: {
markers: host.objectMarkers.markerMap(),
setWorkTitle: options?.setPrepareWorkTitle || (() => Promise.resolve()),
rejectData(message, renderContent) {
throw Object.assign(new Error(message), { renderContent });
}
}
};
}
export function setupModel(host, setup) {
const objectMarkers = host.objectMarkers;
const methods = {
setPrepare: host.setPrepare.bind(host),
defineObjectMarker,
addQueryHelpers(helpers) {
queryCustomMethods = {
...queryCustomMethods,
...helpers
};
}
};
let queryCustomMethods = {
query: host.query.bind(host),
overrideProps,
pageLink: (pageRef, pageId, pageParams, pageAnchor) => host.encodePageHash(pageId, pageRef, pageParams, pageAnchor),
marker: objectMarkers.lookup.bind(objectMarkers),
markerAll: objectMarkers.lookupAll.bind(objectMarkers),
callAction,
actionHandler: (actionName, ...args) => host.action.has(actionName) ? () => callAction(actionName, ...args) : void 0
};
if (typeof setup === "function") {
setup(methods);
}
objectMarkers.lock();
host.queryFnFromString = jora.setup({ methods: queryCustomMethods });
function defineObjectMarker(name, options) {
const { mark, lookup } = objectMarkers.define(name, options);
if (!lookup) {
return () => {
};
}
return mark;
}
function overrideProps(current, props = this.context.props) {
if (!props) {
return current;
}
const result = { ...current };
for (const key of Object.keys(result)) {
if (hasOwn(props, key)) {
result[key] = props[key];
}
}
return result;
}
function callAction(actionName, ...args) {
const lastArg = args[args.length - 1];
let callback = null;
if (typeof lastArg === "function") {
callback = lastArg;
args.pop();
}
const ret = host.action.call(actionName, ...args);
if (ret && callback && typeof ret.then === "function") {
return ret.then(callback);
}
return callback ? callback(ret) : ret;
}
}