@teleporthq/teleport-uidl-resolver 0.44.0-alpha.0 → 0.44.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.
Files changed (164) hide show
  1. package/__tests__/abilities/data-source-links.ts +71 -0
  2. package/__tests__/abilities/link-wrapper-attributes.ts +52 -0
  3. package/__tests__/abilities/mocks.ts +31 -1
  4. package/__tests__/abilities/utils.ts +819 -2
  5. package/__tests__/embed-lottie-node/index.ts +10 -32
  6. package/__tests__/html-mapping/index.ts +28 -0
  7. package/__tests__/html-nesting/diagnostics.ts +95 -0
  8. package/__tests__/html-nesting/mocks.ts +66 -0
  9. package/__tests__/html-nesting/paragraph-repair.ts +251 -0
  10. package/__tests__/loading-branch/index.ts +56 -0
  11. package/__tests__/resolver.ts +15 -0
  12. package/__tests__/style-set-definitions/index.ts +84 -4
  13. package/__tests__/unbound-expressions/expression-fallback.ts +64 -0
  14. package/__tests__/unbound-expressions/expression-identifiers.ts +104 -0
  15. package/__tests__/unbound-expressions/index.ts +371 -0
  16. package/__tests__/utils.ts +80 -20
  17. package/dist/cjs/html-mapping.d.ts.map +1 -1
  18. package/dist/cjs/html-mapping.js +56 -0
  19. package/dist/cjs/html-mapping.js.map +1 -1
  20. package/dist/cjs/index.d.ts +2 -1
  21. package/dist/cjs/index.d.ts.map +1 -1
  22. package/dist/cjs/index.js +4 -1
  23. package/dist/cjs/index.js.map +1 -1
  24. package/dist/cjs/resolver.d.ts.map +1 -1
  25. package/dist/cjs/resolver.js +25 -11
  26. package/dist/cjs/resolver.js.map +1 -1
  27. package/dist/cjs/resolvers/abilities/index.d.ts.map +1 -1
  28. package/dist/cjs/resolvers/abilities/index.js +11 -1
  29. package/dist/cjs/resolvers/abilities/index.js.map +1 -1
  30. package/dist/cjs/resolvers/abilities/utils.d.ts +5 -2
  31. package/dist/cjs/resolvers/abilities/utils.d.ts.map +1 -1
  32. package/dist/cjs/resolvers/abilities/utils.js +469 -30
  33. package/dist/cjs/resolvers/abilities/utils.js.map +1 -1
  34. package/dist/cjs/resolvers/embed-node/utils.d.ts +0 -1
  35. package/dist/cjs/resolvers/embed-node/utils.d.ts.map +1 -1
  36. package/dist/cjs/resolvers/embed-node/utils.js +43 -27
  37. package/dist/cjs/resolvers/embed-node/utils.js.map +1 -1
  38. package/dist/cjs/resolvers/html-nesting/diagnostics.d.ts +23 -0
  39. package/dist/cjs/resolvers/html-nesting/diagnostics.d.ts.map +1 -0
  40. package/dist/cjs/resolvers/html-nesting/diagnostics.js +77 -0
  41. package/dist/cjs/resolvers/html-nesting/diagnostics.js.map +1 -0
  42. package/dist/cjs/resolvers/html-nesting/index.d.ts +33 -0
  43. package/dist/cjs/resolvers/html-nesting/index.d.ts.map +1 -0
  44. package/dist/cjs/resolvers/html-nesting/index.js +185 -0
  45. package/dist/cjs/resolvers/html-nesting/index.js.map +1 -0
  46. package/dist/cjs/resolvers/html-nesting/paragraph-repair.d.ts +15 -0
  47. package/dist/cjs/resolvers/html-nesting/paragraph-repair.d.ts.map +1 -0
  48. package/dist/cjs/resolvers/html-nesting/paragraph-repair.js +129 -0
  49. package/dist/cjs/resolvers/html-nesting/paragraph-repair.js.map +1 -0
  50. package/dist/cjs/resolvers/html-nesting/types.d.ts +37 -0
  51. package/dist/cjs/resolvers/html-nesting/types.d.ts.map +1 -0
  52. package/dist/cjs/resolvers/html-nesting/types.js +3 -0
  53. package/dist/cjs/resolvers/html-nesting/types.js.map +1 -0
  54. package/dist/cjs/resolvers/style-set-definitions/index.d.ts.map +1 -1
  55. package/dist/cjs/resolvers/style-set-definitions/index.js +35 -4
  56. package/dist/cjs/resolvers/style-set-definitions/index.js.map +1 -1
  57. package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.d.ts +43 -0
  58. package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.d.ts.map +1 -0
  59. package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.js +110 -0
  60. package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.js.map +1 -0
  61. package/dist/cjs/resolvers/unbound-expressions/expression-fallback.d.ts +22 -0
  62. package/dist/cjs/resolvers/unbound-expressions/expression-fallback.d.ts.map +1 -0
  63. package/dist/cjs/resolvers/unbound-expressions/expression-fallback.js +129 -0
  64. package/dist/cjs/resolvers/unbound-expressions/expression-fallback.js.map +1 -0
  65. package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.d.ts +37 -0
  66. package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.d.ts.map +1 -0
  67. package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.js +191 -0
  68. package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.js.map +1 -0
  69. package/dist/cjs/resolvers/unbound-expressions/expression-lexer.d.ts +41 -0
  70. package/dist/cjs/resolvers/unbound-expressions/expression-lexer.d.ts.map +1 -0
  71. package/dist/cjs/resolvers/unbound-expressions/expression-lexer.js +158 -0
  72. package/dist/cjs/resolvers/unbound-expressions/expression-lexer.js.map +1 -0
  73. package/dist/cjs/resolvers/unbound-expressions/index.d.ts +3 -0
  74. package/dist/cjs/resolvers/unbound-expressions/index.d.ts.map +1 -0
  75. package/dist/cjs/resolvers/unbound-expressions/index.js +256 -0
  76. package/dist/cjs/resolvers/unbound-expressions/index.js.map +1 -0
  77. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  78. package/dist/cjs/utils.d.ts +16 -12
  79. package/dist/cjs/utils.d.ts.map +1 -1
  80. package/dist/cjs/utils.js +269 -100
  81. package/dist/cjs/utils.js.map +1 -1
  82. package/dist/esm/html-mapping.d.ts.map +1 -1
  83. package/dist/esm/html-mapping.js +56 -0
  84. package/dist/esm/html-mapping.js.map +1 -1
  85. package/dist/esm/index.d.ts +2 -1
  86. package/dist/esm/index.d.ts.map +1 -1
  87. package/dist/esm/index.js +2 -1
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/resolver.d.ts.map +1 -1
  90. package/dist/esm/resolver.js +25 -11
  91. package/dist/esm/resolver.js.map +1 -1
  92. package/dist/esm/resolvers/abilities/index.d.ts.map +1 -1
  93. package/dist/esm/resolvers/abilities/index.js +11 -1
  94. package/dist/esm/resolvers/abilities/index.js.map +1 -1
  95. package/dist/esm/resolvers/abilities/utils.d.ts +5 -2
  96. package/dist/esm/resolvers/abilities/utils.d.ts.map +1 -1
  97. package/dist/esm/resolvers/abilities/utils.js +468 -30
  98. package/dist/esm/resolvers/abilities/utils.js.map +1 -1
  99. package/dist/esm/resolvers/embed-node/utils.d.ts +0 -1
  100. package/dist/esm/resolvers/embed-node/utils.d.ts.map +1 -1
  101. package/dist/esm/resolvers/embed-node/utils.js +41 -24
  102. package/dist/esm/resolvers/embed-node/utils.js.map +1 -1
  103. package/dist/esm/resolvers/html-nesting/diagnostics.d.ts +23 -0
  104. package/dist/esm/resolvers/html-nesting/diagnostics.d.ts.map +1 -0
  105. package/dist/esm/resolvers/html-nesting/diagnostics.js +72 -0
  106. package/dist/esm/resolvers/html-nesting/diagnostics.js.map +1 -0
  107. package/dist/esm/resolvers/html-nesting/index.d.ts +33 -0
  108. package/dist/esm/resolvers/html-nesting/index.d.ts.map +1 -0
  109. package/dist/esm/resolvers/html-nesting/index.js +181 -0
  110. package/dist/esm/resolvers/html-nesting/index.js.map +1 -0
  111. package/dist/esm/resolvers/html-nesting/paragraph-repair.d.ts +15 -0
  112. package/dist/esm/resolvers/html-nesting/paragraph-repair.d.ts.map +1 -0
  113. package/dist/esm/resolvers/html-nesting/paragraph-repair.js +123 -0
  114. package/dist/esm/resolvers/html-nesting/paragraph-repair.js.map +1 -0
  115. package/dist/esm/resolvers/html-nesting/types.d.ts +37 -0
  116. package/dist/esm/resolvers/html-nesting/types.d.ts.map +1 -0
  117. package/dist/esm/resolvers/html-nesting/types.js +2 -0
  118. package/dist/esm/resolvers/html-nesting/types.js.map +1 -0
  119. package/dist/esm/resolvers/style-set-definitions/index.d.ts.map +1 -1
  120. package/dist/esm/resolvers/style-set-definitions/index.js +35 -4
  121. package/dist/esm/resolvers/style-set-definitions/index.js.map +1 -1
  122. package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.d.ts +43 -0
  123. package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.d.ts.map +1 -0
  124. package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.js +106 -0
  125. package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.js.map +1 -0
  126. package/dist/esm/resolvers/unbound-expressions/expression-fallback.d.ts +22 -0
  127. package/dist/esm/resolvers/unbound-expressions/expression-fallback.d.ts.map +1 -0
  128. package/dist/esm/resolvers/unbound-expressions/expression-fallback.js +125 -0
  129. package/dist/esm/resolvers/unbound-expressions/expression-fallback.js.map +1 -0
  130. package/dist/esm/resolvers/unbound-expressions/expression-identifiers.d.ts +37 -0
  131. package/dist/esm/resolvers/unbound-expressions/expression-identifiers.d.ts.map +1 -0
  132. package/dist/esm/resolvers/unbound-expressions/expression-identifiers.js +187 -0
  133. package/dist/esm/resolvers/unbound-expressions/expression-identifiers.js.map +1 -0
  134. package/dist/esm/resolvers/unbound-expressions/expression-lexer.d.ts +41 -0
  135. package/dist/esm/resolvers/unbound-expressions/expression-lexer.d.ts.map +1 -0
  136. package/dist/esm/resolvers/unbound-expressions/expression-lexer.js +151 -0
  137. package/dist/esm/resolvers/unbound-expressions/expression-lexer.js.map +1 -0
  138. package/dist/esm/resolvers/unbound-expressions/index.d.ts +3 -0
  139. package/dist/esm/resolvers/unbound-expressions/index.d.ts.map +1 -0
  140. package/dist/esm/resolvers/unbound-expressions/index.js +252 -0
  141. package/dist/esm/resolvers/unbound-expressions/index.js.map +1 -0
  142. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  143. package/dist/esm/utils.d.ts +16 -12
  144. package/dist/esm/utils.d.ts.map +1 -1
  145. package/dist/esm/utils.js +265 -96
  146. package/dist/esm/utils.js.map +1 -1
  147. package/package.json +5 -5
  148. package/src/html-mapping.ts +56 -0
  149. package/src/index.ts +9 -1
  150. package/src/resolver.ts +36 -15
  151. package/src/resolvers/abilities/index.ts +19 -2
  152. package/src/resolvers/abilities/utils.ts +707 -30
  153. package/src/resolvers/embed-node/utils.ts +46 -38
  154. package/src/resolvers/html-nesting/diagnostics.ts +88 -0
  155. package/src/resolvers/html-nesting/index.ts +253 -0
  156. package/src/resolvers/html-nesting/paragraph-repair.ts +152 -0
  157. package/src/resolvers/html-nesting/types.ts +39 -0
  158. package/src/resolvers/style-set-definitions/index.ts +34 -1
  159. package/src/resolvers/unbound-expressions/ambient-identifiers.ts +105 -0
  160. package/src/resolvers/unbound-expressions/expression-fallback.ts +141 -0
  161. package/src/resolvers/unbound-expressions/expression-identifiers.ts +233 -0
  162. package/src/resolvers/unbound-expressions/expression-lexer.ts +156 -0
  163. package/src/resolvers/unbound-expressions/index.ts +278 -0
  164. package/src/utils.ts +317 -96
@@ -0,0 +1,71 @@
1
+ import { insertLinks } from '../../src/resolvers/abilities/utils'
2
+ import { elementNode } from '@teleporthq/teleport-uidl-builders'
3
+ import { UIDLElementNode, UIDLNavLinkNode } from '@teleporthq/teleport-types'
4
+
5
+ /**
6
+ * The editor exports an element bound to a data source as an ELEMENT whose
7
+ * content is the data provider, rendering the element itself inside it. A
8
+ * details-page link on that element reads its record off the provider, and was
9
+ * dropped: walked as a plain element the wrapper looked empty, so the link
10
+ * inside it was never resolved and the published element did not navigate.
11
+ */
12
+
13
+ const detailsLink: UIDLNavLinkNode = {
14
+ type: 'navlink',
15
+ content: {
16
+ // tslint:disable-next-line:no-invalid-template-strings
17
+ routeName: { type: 'expr', content: '`/page/${Templates_data_data?.items?.[3]?.slug}`' },
18
+ },
19
+ }
20
+
21
+ const providerWrapping = (child: UIDLElementNode, type: string): UIDLElementNode =>
22
+ ({
23
+ type: 'element',
24
+ content: {
25
+ type,
26
+ content: {
27
+ elementType: 'DataProvider',
28
+ renderPropIdentifier: 'Templates_data_data',
29
+ resourceDefinition: {
30
+ type: 'external-data-source',
31
+ dataSourceId: 'ds-rest',
32
+ tableName: 'data',
33
+ dataSourceType: 'rest-api',
34
+ },
35
+ nodes: {
36
+ success: { type: 'element', content: { elementType: 'fragment', children: [child] } },
37
+ },
38
+ },
39
+ children: [],
40
+ },
41
+ } as unknown as UIDLElementNode)
42
+
43
+ const linkedChildOf = (page: UIDLElementNode): UIDLElementNode => {
44
+ const wrapper = page.content.children[0] as unknown as {
45
+ content: { content: { nodes: { success: UIDLElementNode } } }
46
+ }
47
+ return wrapper.content.content.nodes.success.content.children[0] as UIDLElementNode
48
+ }
49
+
50
+ describe('insertLinks — an element wrapping a data provider', () => {
51
+ it.each(['data-source-item', 'data-source-list'])(
52
+ 'resolves the link of the element a %s renders',
53
+ (type) => {
54
+ const linked = elementNode('text')
55
+ linked.content.abilities = { link: detailsLink }
56
+ const page = elementNode('container', {}, [providerWrapping(linked, type)])
57
+
58
+ const resolved = linkedChildOf(insertLinks(page, {}, false))
59
+
60
+ expect(resolved.content.elementType).toBe('navlink')
61
+ expect(resolved.content.attrs.transitionTo).toEqual(detailsLink.content.routeName)
62
+ }
63
+ )
64
+
65
+ it('leaves an element with no link inside the provider as it was', () => {
66
+ const plain = elementNode('text')
67
+ const page = elementNode('container', {}, [providerWrapping(plain, 'data-source-item')])
68
+
69
+ expect(linkedChildOf(insertLinks(page, {}, false)).content.elementType).toBe('text')
70
+ })
71
+ })
@@ -0,0 +1,52 @@
1
+ import { insertLinks } from '../../src/resolvers/abilities/utils'
2
+ import { elementNode, staticNode } from '@teleporthq/teleport-uidl-builders'
3
+ import { UIDLElementNode, UIDLLinkNode } from '@teleporthq/teleport-types'
4
+
5
+ /**
6
+ * A styled element that is one link is wrapped in an `<a>`, which takes the
7
+ * attributes that belong to a link — a `data-` hook a script selects the link
8
+ * by among them. A listing card's anatomy (`data-tq-card-slot`, `-size`,
9
+ * `-tone`) describes the card's own box and stays on it: the card's styles
10
+ * answer it on the element that carries the card's class, and the blog's post
11
+ * card — one link to its post — lost every layout and its list rows when the
12
+ * attributes moved to the wrapper.
13
+ */
14
+
15
+ const postLink: UIDLLinkNode = {
16
+ type: 'url',
17
+ content: { url: staticNode('/blog/post'), newTab: false },
18
+ }
19
+
20
+ function linkedCard(): UIDLElementNode {
21
+ const card = elementNode('container', {
22
+ 'data-tq-card-slot': staticNode('root'),
23
+ 'data-tq-card-size': staticNode('wide'),
24
+ 'data-tq-card-tone': staticNode('default'),
25
+ 'data-tq-hook': staticNode('post-card'),
26
+ title: staticNode('A post'),
27
+ })
28
+ card.content.semanticType = 'article'
29
+ card.content.abilities = { link: postLink }
30
+ return card
31
+ }
32
+
33
+ describe('insertLinks — the wrapper of a linked element', () => {
34
+ it("keeps a card's anatomy on the card and hands the link's attributes to the wrapper", () => {
35
+ const page = elementNode('container', {}, [linkedCard()])
36
+ const wrapper = insertLinks(page, {}, false).content.children[0] as UIDLElementNode
37
+ const card = wrapper.content.children[0] as UIDLElementNode
38
+
39
+ expect(wrapper.content.elementType).toBe('link')
40
+ expect(Object.keys(wrapper.content.attrs)).toEqual(
41
+ expect.arrayContaining(['data-tq-hook', 'title'])
42
+ )
43
+ expect(Object.keys(wrapper.content.attrs).some((key) => key.startsWith('data-tq-card-'))).toBe(
44
+ false
45
+ )
46
+ expect(card.content.attrs).toEqual({
47
+ 'data-tq-card-slot': staticNode('root'),
48
+ 'data-tq-card-size': staticNode('wide'),
49
+ 'data-tq-card-tone': staticNode('default'),
50
+ })
51
+ })
52
+ })
@@ -4,6 +4,8 @@ import {
4
4
  UIDLMailLinkNode,
5
5
  UIDLPhoneLinkNode,
6
6
  UIDLSectionLinkNode,
7
+ UIDLDynamicReference,
8
+ UIDLPropDefinition,
7
9
  } from '@teleporthq/teleport-types'
8
10
  import { staticNode } from '@teleporthq/teleport-uidl-builders'
9
11
 
@@ -25,6 +27,16 @@ export const navlinkMockedDefinition = (): UIDLNavLinkNode => ({
25
27
  },
26
28
  })
27
29
 
30
+ export const exprNavlinkMockedDefinition = (): UIDLNavLinkNode => ({
31
+ type: 'navlink',
32
+ content: {
33
+ routeName: {
34
+ type: 'expr',
35
+ content: '`/blog/' + '$' + '{' + 'blogPost?.slug}' + '`',
36
+ },
37
+ },
38
+ })
39
+
28
40
  export const phoneMockedDefinition = (): UIDLPhoneLinkNode => ({
29
41
  type: 'phone',
30
42
  content: {
@@ -35,7 +47,10 @@ export const phoneMockedDefinition = (): UIDLPhoneLinkNode => ({
35
47
  export const sectionMockedDefinition = (): UIDLSectionLinkNode => ({
36
48
  type: 'section',
37
49
  content: {
38
- section: 'contact',
50
+ section: {
51
+ type: 'static',
52
+ content: 'contact',
53
+ },
39
54
  },
40
55
  })
41
56
 
@@ -47,3 +62,18 @@ export const mailMockedDefinition = (): UIDLMailLinkNode => ({
47
62
  body: "Is it me you're looking for?",
48
63
  },
49
64
  })
65
+
66
+ export const linkTypePropDefinitions = (): Record<string, UIDLPropDefinition> => ({
67
+ cardLink: {
68
+ type: 'link',
69
+ defaultValue: { url: '/', newTab: false },
70
+ },
71
+ })
72
+
73
+ export const linkTypePropDynamicReference = (): UIDLDynamicReference => ({
74
+ type: 'dynamic',
75
+ content: {
76
+ referenceType: 'prop',
77
+ id: 'cardLink',
78
+ },
79
+ })