@sanity/desk-tool
Version:
Tool for managing all sorts of content in a structured manner
134 lines (129 loc) • 6.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getInitialValueObservable = getInitialValueObservable;
var _initialValueTemplates = require("@sanity/base/initial-value-templates");
var _preview = require("part:@sanity/base/preview");
var _schema = _interopRequireDefault(require("part:@sanity/base/schema"));
var _draftUtils = require("part:@sanity/base/util/draft-utils");
var _rxjs = require("rxjs");
var _operators = require("rxjs/operators");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /* eslint-disable max-nested-callbacks */ // @todo: remove the following line when part imports has been removed from this file
///<reference types="@sanity/types/parts" />
var LOADING_MSG = {
type: 'loading'
};
/**
* @internal
*/
function getInitialValueObservable(opts) {
return (0, _rxjs.merge)((0, _preview.observePaths)((0, _draftUtils.getDraftId)(opts.documentId), ['_type']).pipe((0, _operators.map)(draft => ({
draft
}))), (0, _preview.observePaths)((0, _draftUtils.getPublishedId)(opts.documentId), ['_type']).pipe((0, _operators.map)(published => ({
published
})))).pipe((0, _operators.scan)((prev, res) => _objectSpread(_objectSpread({}, prev), res), {}),
// Wait until we know the state of both draft and published
(0, _operators.filter)(res => 'draft' in res && 'published' in res), (0, _operators.map)(res => res.draft || res.published),
// Only update if we didn't previously have a document but we now do
(0, _operators.distinctUntilChanged)((prev, next) => Boolean(prev) !== Boolean(next)),
// Prevent rapid re-resolving when transitioning between different templates
(0, _operators.debounceTime)(25), (0, _operators.switchMap)(document => {
var _ref = getInitialValueProps(document || null, opts) || {},
templateName = _ref.templateName,
parameters = _ref.parameters;
if (!templateName || !parameters) {
var msg = {
type: 'success',
value: null
};
return (0, _rxjs.of)(msg);
}
return (0, _rxjs.merge)((0, _rxjs.of)({
isResolving: true
}), resolveInitialValueWithParameters(templateName, parameters).pipe(
// @ts-expect-error NOTE: TypeScript fails for an unknown reason.
(0, _operators.catchError)(resolveError => {
/* eslint-disable no-console */
console.group('Failed to resolve initial value');
console.error(resolveError);
console.error('Template ID: %s', templateName);
console.error('Parameters: %o', parameters || {});
console.groupEnd();
/* eslint-enable no-console */
var msg = {
type: 'error',
error: resolveError
};
return (0, _rxjs.of)(msg);
}))).pipe((0, _operators.switchMap)(_ref2 => {
var isResolving = _ref2.isResolving,
initialValue = _ref2.initialValue,
resolveError = _ref2.resolveError;
if (resolveError) {
return (0, _rxjs.of)({
type: 'error',
message: 'Failed to resolve initial value'
});
}
if (isResolving) {
return (0, _rxjs.of)(LOADING_MSG);
}
var msg = {
type: 'success',
value: initialValue
};
return (0, _rxjs.of)(msg);
}));
}), (0, _operators.startWith)(LOADING_MSG), (0, _operators.distinctUntilChanged)());
}
/**
* @internal
*/
function getInitialValueProps(document, opts) {
if (document) {
return null;
}
var payload = opts.panePayload || {};
var structureNodeTemplate = opts.paneOptions.template;
if (opts.urlTemplate && structureNodeTemplate && structureNodeTemplate !== opts.urlTemplate) {
// eslint-disable-next-line no-console
console.warn("Conflicting templates: URL says \"".concat(opts.urlTemplate, "\", structure node says \"").concat(structureNodeTemplate, "\". Using \"").concat(structureNodeTemplate, "\"."));
}
var template = structureNodeTemplate || opts.urlTemplate;
var typeTemplates = (0, _initialValueTemplates.getTemplatesBySchemaType)(opts.paneOptions.type);
var parameters = _objectSpread(_objectSpread({}, opts.paneOptions.templateParameters), typeof payload === 'object' ? payload || {} : {});
var templateName = template;
// If we have not specified a specific template, and we only have a single
// template available for a schema type, use it
if (!template && typeTemplates.length === 1) {
templateName = typeTemplates[0].id;
}
return {
templateName: templateName,
parameters
};
}
/**
* @internal
*/
function resolveInitialValueWithParameters(templateName, parameters) {
if (!(0, _initialValueTemplates.templateExists)(templateName)) {
// eslint-disable-next-line no-console
console.warn('Template "%s" not defined, using empty initial value', templateName);
return (0, _rxjs.of)({
isResolving: false,
initialValue: undefined
});
}
var tpl = (0, _initialValueTemplates.getTemplateById)(templateName);
return (0, _rxjs.from)((0, _initialValueTemplates.resolveInitialValue)(_schema.default, tpl, parameters)).pipe((0, _operators.map)(initialValue => ({
isResolving: false,
initialValue
})));
}