@atlaskit/renderer
Version:
Renderer component
270 lines (257 loc) • 11.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.renderDocument = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _schemaDefault = require("@atlaskit/adf-schema/schema-default");
var _transforms = require("@atlaskit/adf-utils/transforms");
var _analytics = require("@atlaskit/editor-common/analytics");
var _utils = require("@atlaskit/editor-common/utils");
var _validator = require("@atlaskit/editor-common/validator");
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
var _events = require("./analytics/events");
var _unsupportedContent = require("./analytics/unsupported-content");
var _countNodes = require("./ui/Renderer/count-nodes");
/* eslint-disable @atlaskit/editor/no-re-export */
// Entry file in package.json
var SUPPORTS_HIRES_TIMER_API = !!(typeof window !== 'undefined' && window.performance && performance.now);
var withStopwatch = function withStopwatch(cb) {
var startTime = SUPPORTS_HIRES_TIMER_API ? performance.now() : Date.now();
var output = cb();
var endTime = SUPPORTS_HIRES_TIMER_API ? performance.now() : Date.now();
var time = endTime - startTime;
return {
output: output,
time: time
};
};
var _validation = function _validation(doc, schema, adfStage, useSpecBasedValidator, dispatchAnalyticsEvent, skipValidation, validationOverrides) {
var result;
if (useSpecBasedValidator) {
// link mark on mediaSingle is deprecated, need to move link mark to child media node
// https://product-fabric.atlassian.net/browse/ED-14043
var _transformMediaLinkMa = (0, _transforms.transformMediaLinkMarks)(doc),
transformedAdf = _transformMediaLinkMa.transformedAdf,
isTransformed = _transformMediaLinkMa.isTransformed;
if (isTransformed && dispatchAnalyticsEvent) {
dispatchAnalyticsEvent({
action: _analytics.ACTION.MEDIA_LINK_TRANSFORMED,
actionSubject: _analytics.ACTION_SUBJECT.RENDERER,
eventType: _analytics.EVENT_TYPE.OPERATIONAL
});
}
result = skipValidation ? transformedAdf || doc : (0, _utils.validateADFEntity)(schema, transformedAdf || doc, dispatchAnalyticsEvent, validationOverrides);
} else {
result = (0, _validator.getValidDocument)(doc, schema, adfStage);
}
if (!result) {
return result;
}
// ProseMirror always require a child under doc
if (result.type === 'doc' && useSpecBasedValidator) {
if (Array.isArray(result.content) && result.content.length === 0) {
result.content.push({
type: 'paragraph',
content: []
});
}
// Just making sure doc is always valid
if (!result.version) {
result.version = 1;
}
}
// Convert nested-table extensions into nested tables
try {
var _transformNestedTable = (0, _transforms.transformNestedTablesIncomingDocument)(result),
_transformedAdf = _transformNestedTable.transformedAdf,
_isTransformed = _transformNestedTable.isTransformed;
if (_isTransformed) {
dispatchAnalyticsEvent === null || dispatchAnalyticsEvent === void 0 || dispatchAnalyticsEvent({
action: _analytics.ACTION.NESTED_TABLE_TRANSFORMED,
actionSubject: _analytics.ACTION_SUBJECT.RENDERER,
eventType: _analytics.EVENT_TYPE.OPERATIONAL
});
result = _transformedAdf;
}
} catch (e) {
dispatchAnalyticsEvent === null || dispatchAnalyticsEvent === void 0 || dispatchAnalyticsEvent({
action: _analytics.ACTION.INVALID_PROSEMIRROR_DOCUMENT,
actionSubject: _analytics.ACTION_SUBJECT.RENDERER,
eventType: _analytics.EVENT_TYPE.OPERATIONAL,
attributes: {
platform: _events.PLATFORM.WEB,
errorStack: "".concat(e instanceof Error && e.name === 'NodeNestingTransformError' ? 'NodeNestingTransformError - Failed to encode one or more nested tables' : undefined)
}
});
}
// Upgrade panel → panel_c1 where the schema allows it
if (result && (0, _expValEquals.expValEquals)('platform_editor_nest_table_in_panel', 'isEnabled', true)) {
try {
var _transformContainerNo = (0, _transforms.transformContainerNodes)(result, schema),
_transformedAdf2 = _transformContainerNo.transformedAdf,
_isTransformed2 = _transformContainerNo.isTransformed;
if (_isTransformed2 && _transformedAdf2) {
// TODO: EDITOR-7175 - Add analytics
result = _transformedAdf2;
}
} catch (e) {
// TODO: EDITOR-7175 - Add analytics
}
}
if (result && !(0, _expValEquals.expValEquals)('cc-maui-experiment', 'isEnabled', true) && !(0, _platformFeatureFlags.fg)('platform_native_embeds_rollout_non_maui_experience') && (0, _platformFeatureFlags.fg)('platform_editor_native_embeds_fallback_transform')) {
var _nativeEmbedsFallback = (0, _transforms.nativeEmbedsFallbackTransform)(result, schema),
_transformedAdf3 = _nativeEmbedsFallback.transformedAdf,
hasValidTransform = _nativeEmbedsFallback.hasValidTransform;
if (hasValidTransform && _transformedAdf3) {
dispatchAnalyticsEvent === null || dispatchAnalyticsEvent === void 0 || dispatchAnalyticsEvent({
action: _analytics.ACTION.NATIVE_EMBEDS_TRANSFORMED,
actionSubject: _analytics.ACTION_SUBJECT.RENDERER,
eventType: _analytics.EVENT_TYPE.OPERATIONAL
});
result = _transformedAdf3;
}
}
return result;
};
var memoValidation = (0, _memoizeOne.default)(_validation, function (newArgs, lastArgs) {
var _newArgs = (0, _slicedToArray2.default)(newArgs, 7),
newDoc = _newArgs[0],
newSchema = _newArgs[1],
newADFStage = _newArgs[2],
newUseSpecValidator = _newArgs[3],
/* ignoring dispatchAnalyticsEvent */newSkipValidation = _newArgs[5],
newValidationOverrides = _newArgs[6];
var _lastArgs = (0, _slicedToArray2.default)(lastArgs, 7),
oldDoc = _lastArgs[0],
oldSchema = _lastArgs[1],
oldADFStage = _lastArgs[2],
oldUseSpecValidator = _lastArgs[3],
/* ignoring dispatchAnalyticsEvent */oldSkipValidation = _lastArgs[5],
oldValidationOverrides = _lastArgs[6];
return areDocsEqual(newDoc, oldDoc) && newSchema === oldSchema && newADFStage === oldADFStage && newUseSpecValidator === oldUseSpecValidator && newSkipValidation === oldSkipValidation && newValidationOverrides === oldValidationOverrides;
});
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var areDocsEqual = function areDocsEqual(docA, docB) {
if (docA === docB) {
return true;
}
if (typeof docA === 'string' && typeof docB === 'string') {
return docA === docB;
}
// PMNode
if (docA.type && docA.toJSON && docB.type && docB.toJSON) {
return JSON.stringify(docA.toJSON()) === JSON.stringify(docB.toJSON());
}
// Object
return JSON.stringify(docA) === JSON.stringify(docB);
};
var _serializeFragment = function _serializeFragment(serializer, doc) {
return serializer.serializeFragment(doc.content);
};
var memoSerializeFragment = (0, _memoizeOne.default)(_serializeFragment, function (newArgs, lastArgs) {
var _newArgs2 = (0, _slicedToArray2.default)(newArgs, 2),
newSerializer = _newArgs2[0],
newDoc = _newArgs2[1];
var _lastArgs2 = (0, _slicedToArray2.default)(lastArgs, 2),
oldSerializer = _lastArgs2[0],
oldDoc = _lastArgs2[1];
return newSerializer === oldSerializer && areDocsEqual(newDoc, oldDoc);
});
var _createNodeAndCheck = function _createNodeAndCheck(schema, doc, dispatchAnalyticsEvent) {
var pmNode = schema.nodeFromJSON(doc);
try {
pmNode.check();
} catch (err) {
if (dispatchAnalyticsEvent) {
dispatchAnalyticsEvent({
action: _analytics.ACTION.INVALID_PROSEMIRROR_DOCUMENT,
actionSubject: _analytics.ACTION_SUBJECT.RENDERER,
attributes: {
platform: _events.PLATFORM.WEB,
errorStack: err instanceof Error ? err.message : String(err)
},
eventType: _analytics.EVENT_TYPE.OPERATIONAL
});
}
}
return pmNode;
};
var memoCreateNodeAndCheck = (0, _memoizeOne.default)(_createNodeAndCheck, function (newArgs, lastArgs) {
// ignore dispatchAnalyticsEvent
var _newArgs3 = (0, _slicedToArray2.default)(newArgs, 2),
newSchema = _newArgs3[0],
newDoc = _newArgs3[1];
var _lastArgs3 = (0, _slicedToArray2.default)(lastArgs, 2),
oldSchema = _lastArgs3[0],
oldDoc = _lastArgs3[1];
return newSchema === oldSchema && areDocsEqual(newDoc, oldDoc);
});
var renderDocument = exports.renderDocument = function renderDocument(doc, serializer) {
var schema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _schemaDefault.defaultSchema;
var adfStage = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'final';
var useSpecBasedValidator = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
var rendererId = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'noid';
var dispatchAnalyticsEvent = arguments.length > 6 ? arguments[6] : undefined;
var unsupportedContentLevelsTracking = arguments.length > 7 ? arguments[7] : undefined;
var appearance = arguments.length > 8 ? arguments[8] : undefined;
var includeNodesCountInStats = arguments.length > 9 ? arguments[9] : undefined;
var skipValidation = arguments.length > 10 ? arguments[10] : undefined;
var validationOverrides = arguments.length > 11 ? arguments[11] : undefined;
var stat = {
sanitizeTime: 0
};
if ((0, _platformFeatureFlags.fg)('platform_editor_renderer_rm_usespecbasedvalidator')) {
useSpecBasedValidator = true;
}
var _withStopwatch = withStopwatch(function () {
return memoValidation(doc, schema, adfStage, useSpecBasedValidator, dispatchAnalyticsEvent, skipValidation, validationOverrides);
}),
validDoc = _withStopwatch.output,
sanitizeTime = _withStopwatch.time;
// save sanitize time to stats
stat.sanitizeTime = sanitizeTime;
if (!validDoc) {
return {
stat: stat,
result: null
};
}
var _withStopwatch2 = withStopwatch(function () {
return memoCreateNodeAndCheck(schema, validDoc, dispatchAnalyticsEvent);
}),
node = _withStopwatch2.output,
buildTreeTime = _withStopwatch2.time;
// save build tree time to stats
stat.buildTreeTime = buildTreeTime;
var _withStopwatch3 = withStopwatch(function () {
return memoSerializeFragment(serializer, node);
}),
result = _withStopwatch3.output,
serializeTime = _withStopwatch3.time;
// save serialize tree time to stats
stat.serializeTime = serializeTime;
if (dispatchAnalyticsEvent && useSpecBasedValidator) {
(0, _utils.findAndTrackUnsupportedContentNodes)(node, schema, dispatchAnalyticsEvent);
if (unsupportedContentLevelsTracking !== null && unsupportedContentLevelsTracking !== void 0 && unsupportedContentLevelsTracking.enabled) {
var documentData = {
doc: validDoc,
appearance: appearance,
rendererId: rendererId
};
(0, _unsupportedContent.trackUnsupportedContentLevels)(documentData, unsupportedContentLevelsTracking, dispatchAnalyticsEvent);
}
}
if (includeNodesCountInStats) {
stat.nodesCount = (0, _countNodes.countNodes)(doc);
}
return {
result: result,
stat: stat,
pmDoc: node
};
};