@atlaskit/adf-utils 19.15.0 → 19.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/adf-utils
2
2
 
3
+ ## 19.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#102696](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/102696)
8
+ [`68e5aef5beb02`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/68e5aef5beb02) -
9
+ Validate Forge macro paramters to the rules of Confluence parameter processing
10
+
11
+ ## 19.16.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#101826](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/101826)
16
+ [`efd5cf5ab0eb2`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/efd5cf5ab0eb2) -
17
+ ED-26205 Prevent transform of nested tables inside bodied macros for renderer only
18
+
3
19
  ## 19.15.0
4
20
 
5
21
  ### Minor Changes
@@ -34,11 +34,32 @@ var transformNestedTableExtension = function transformNestedTableExtension(neste
34
34
  throw new _errors.NodeNestingTransformError('Failed to parse nested table content');
35
35
  }
36
36
  };
37
+ function isInsideBodiedExtension(parent) {
38
+ var _parent$parent;
39
+ if (parent.node === undefined) {
40
+ return false;
41
+ }
42
+ if (parent.node.type === 'bodiedExtension') {
43
+ return true;
44
+ }
45
+ if (parent !== null && parent !== void 0 && (_parent$parent = parent.parent) !== null && _parent$parent !== void 0 && _parent$parent.node) {
46
+ return isInsideBodiedExtension(parent.parent);
47
+ }
48
+ return false;
49
+ }
37
50
  var transformNestedTablesIncomingDocument = exports.transformNestedTablesIncomingDocument = function transformNestedTablesIncomingDocument(adf) {
51
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
38
52
  var isTransformed = false;
39
53
  var transformedAdf = (0, _traverse.traverse)(adf, {
40
- extension: function extension(node) {
54
+ extension: function extension(node, parent) {
41
55
  if (isNestedTableExtension(node)) {
56
+ // Bodied extensions in renderer use their own nested renderer to render the content.
57
+ // This results in the document being validated/transformed twice, once with untransformed content and again with transformed content.
58
+ // Since the untransformed content is valid ADF (table as extension in table) but the transformed content is not valid ADF, (table in table)
59
+ // we need to skip transforming nested tables inside bodied extensions in renderer on the first pass or else it will fail validation and render an unsupported block.
60
+ if (options.environment === 'renderer' && isInsideBodiedExtension(parent)) {
61
+ return undefined;
62
+ }
42
63
  isTransformed = true;
43
64
  return transformNestedTableExtension(node);
44
65
  }
@@ -58,7 +58,7 @@ var partitionObject = function partitionObject(obj, predicate) {
58
58
  };
59
59
 
60
60
  /**
61
- * Normalizes the structure of files imported form './specs'.
61
+ * Normalizes the structure of files imported from './specs'.
62
62
  * We denormalised the spec to save bundle size.
63
63
  */
64
64
  function createSpec(nodes, marks) {
@@ -24,11 +24,31 @@ const transformNestedTableExtension = nestedTableExtension => {
24
24
  throw new NodeNestingTransformError('Failed to parse nested table content');
25
25
  }
26
26
  };
27
- export const transformNestedTablesIncomingDocument = adf => {
27
+ function isInsideBodiedExtension(parent) {
28
+ var _parent$parent;
29
+ if (parent.node === undefined) {
30
+ return false;
31
+ }
32
+ if (parent.node.type === 'bodiedExtension') {
33
+ return true;
34
+ }
35
+ if (parent !== null && parent !== void 0 && (_parent$parent = parent.parent) !== null && _parent$parent !== void 0 && _parent$parent.node) {
36
+ return isInsideBodiedExtension(parent.parent);
37
+ }
38
+ return false;
39
+ }
40
+ export const transformNestedTablesIncomingDocument = (adf, options = {}) => {
28
41
  let isTransformed = false;
29
42
  const transformedAdf = traverse(adf, {
30
- extension: node => {
43
+ extension: (node, parent) => {
31
44
  if (isNestedTableExtension(node)) {
45
+ // Bodied extensions in renderer use their own nested renderer to render the content.
46
+ // This results in the document being validated/transformed twice, once with untransformed content and again with transformed content.
47
+ // Since the untransformed content is valid ADF (table as extension in table) but the transformed content is not valid ADF, (table in table)
48
+ // we need to skip transforming nested tables inside bodied extensions in renderer on the first pass or else it will fail validation and render an unsupported block.
49
+ if (options.environment === 'renderer' && isInsideBodiedExtension(parent)) {
50
+ return undefined;
51
+ }
32
52
  isTransformed = true;
33
53
  return transformNestedTableExtension(node);
34
54
  }
@@ -42,7 +42,7 @@ const partitionObject = (obj, predicate) => Object.keys(obj).reduce((acc, key) =
42
42
  }, [[], []]);
43
43
 
44
44
  /**
45
- * Normalizes the structure of files imported form './specs'.
45
+ * Normalizes the structure of files imported from './specs'.
46
46
  * We denormalised the spec to save bundle size.
47
47
  */
48
48
  function createSpec(nodes, marks) {
@@ -27,11 +27,32 @@ var transformNestedTableExtension = function transformNestedTableExtension(neste
27
27
  throw new NodeNestingTransformError('Failed to parse nested table content');
28
28
  }
29
29
  };
30
+ function isInsideBodiedExtension(parent) {
31
+ var _parent$parent;
32
+ if (parent.node === undefined) {
33
+ return false;
34
+ }
35
+ if (parent.node.type === 'bodiedExtension') {
36
+ return true;
37
+ }
38
+ if (parent !== null && parent !== void 0 && (_parent$parent = parent.parent) !== null && _parent$parent !== void 0 && _parent$parent.node) {
39
+ return isInsideBodiedExtension(parent.parent);
40
+ }
41
+ return false;
42
+ }
30
43
  export var transformNestedTablesIncomingDocument = function transformNestedTablesIncomingDocument(adf) {
44
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
31
45
  var isTransformed = false;
32
46
  var transformedAdf = traverse(adf, {
33
- extension: function extension(node) {
47
+ extension: function extension(node, parent) {
34
48
  if (isNestedTableExtension(node)) {
49
+ // Bodied extensions in renderer use their own nested renderer to render the content.
50
+ // This results in the document being validated/transformed twice, once with untransformed content and again with transformed content.
51
+ // Since the untransformed content is valid ADF (table as extension in table) but the transformed content is not valid ADF, (table in table)
52
+ // we need to skip transforming nested tables inside bodied extensions in renderer on the first pass or else it will fail validation and render an unsupported block.
53
+ if (options.environment === 'renderer' && isInsideBodiedExtension(parent)) {
54
+ return undefined;
55
+ }
35
56
  isTransformed = true;
36
57
  return transformNestedTableExtension(node);
37
58
  }
@@ -49,7 +49,7 @@ var partitionObject = function partitionObject(obj, predicate) {
49
49
  };
50
50
 
51
51
  /**
52
- * Normalizes the structure of files imported form './specs'.
52
+ * Normalizes the structure of files imported from './specs'.
53
53
  * We denormalised the spec to save bundle size.
54
54
  */
55
55
  function createSpec(nodes, marks) {
@@ -1,6 +1,8 @@
1
1
  import type { ADFEntity } from '../types';
2
2
  export declare const isNestedTableExtension: (extensionNode: ADFEntity) => boolean;
3
- export declare const transformNestedTablesIncomingDocument: (adf: ADFEntity) => {
3
+ export declare const transformNestedTablesIncomingDocument: (adf: ADFEntity, options?: {
4
+ environment?: 'renderer' | 'editor';
5
+ }) => {
4
6
  transformedAdf: ADFEntity;
5
7
  isTransformed: boolean;
6
8
  };
@@ -4,6 +4,6 @@ export { transformDedupeMarks } from './transforms/dedupe-marks-transform';
4
4
  export { transformNodesMissingContent } from './transforms/nodes-missing-content-transform';
5
5
  export { transformIndentationMarks } from './transforms/indentation-marks-transform';
6
6
  export { transformInvalidMediaContent } from './transforms/invalid-media-content-transform';
7
- export { transformNestedTablesIncomingDocument, isNestedTableExtension } from './transforms/nested-table-transform';
7
+ export { transformNestedTablesIncomingDocument, isNestedTableExtension, } from './transforms/nested-table-transform';
8
8
  export { transformNestedTableNodeOutgoingDocument } from './transforms/nested-table-transform';
9
9
  export { NodeNestingTransformError } from './transforms/errors';
@@ -1,6 +1,8 @@
1
1
  import type { ADFEntity } from '../types';
2
2
  export declare const isNestedTableExtension: (extensionNode: ADFEntity) => boolean;
3
- export declare const transformNestedTablesIncomingDocument: (adf: ADFEntity) => {
3
+ export declare const transformNestedTablesIncomingDocument: (adf: ADFEntity, options?: {
4
+ environment?: 'renderer' | 'editor';
5
+ }) => {
4
6
  transformedAdf: ADFEntity;
5
7
  isTransformed: boolean;
6
8
  };
@@ -4,6 +4,6 @@ export { transformDedupeMarks } from './transforms/dedupe-marks-transform';
4
4
  export { transformNodesMissingContent } from './transforms/nodes-missing-content-transform';
5
5
  export { transformIndentationMarks } from './transforms/indentation-marks-transform';
6
6
  export { transformInvalidMediaContent } from './transforms/invalid-media-content-transform';
7
- export { transformNestedTablesIncomingDocument, isNestedTableExtension } from './transforms/nested-table-transform';
7
+ export { transformNestedTablesIncomingDocument, isNestedTableExtension, } from './transforms/nested-table-transform';
8
8
  export { transformNestedTableNodeOutgoingDocument } from './transforms/nested-table-transform';
9
9
  export { NodeNestingTransformError } from './transforms/errors';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/adf-utils",
3
- "version": "19.15.0",
3
+ "version": "19.17.0",
4
4
  "description": "Set of utilities to traverse, modify and create ADF documents.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"