UNPKG

@discoveryjs/discovery

Version:

Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards

77 lines (76 loc) 2.29 kB
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; } }