@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.
- package/__tests__/abilities/data-source-links.ts +71 -0
- package/__tests__/abilities/link-wrapper-attributes.ts +52 -0
- package/__tests__/abilities/mocks.ts +31 -1
- package/__tests__/abilities/utils.ts +819 -2
- package/__tests__/embed-lottie-node/index.ts +10 -32
- package/__tests__/html-mapping/index.ts +28 -0
- package/__tests__/html-nesting/diagnostics.ts +95 -0
- package/__tests__/html-nesting/mocks.ts +66 -0
- package/__tests__/html-nesting/paragraph-repair.ts +251 -0
- package/__tests__/loading-branch/index.ts +56 -0
- package/__tests__/resolver.ts +15 -0
- package/__tests__/style-set-definitions/index.ts +84 -4
- package/__tests__/unbound-expressions/expression-fallback.ts +64 -0
- package/__tests__/unbound-expressions/expression-identifiers.ts +104 -0
- package/__tests__/unbound-expressions/index.ts +371 -0
- package/__tests__/utils.ts +80 -20
- package/dist/cjs/html-mapping.d.ts.map +1 -1
- package/dist/cjs/html-mapping.js +56 -0
- package/dist/cjs/html-mapping.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +4 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/resolver.d.ts.map +1 -1
- package/dist/cjs/resolver.js +25 -11
- package/dist/cjs/resolver.js.map +1 -1
- package/dist/cjs/resolvers/abilities/index.d.ts.map +1 -1
- package/dist/cjs/resolvers/abilities/index.js +11 -1
- package/dist/cjs/resolvers/abilities/index.js.map +1 -1
- package/dist/cjs/resolvers/abilities/utils.d.ts +5 -2
- package/dist/cjs/resolvers/abilities/utils.d.ts.map +1 -1
- package/dist/cjs/resolvers/abilities/utils.js +469 -30
- package/dist/cjs/resolvers/abilities/utils.js.map +1 -1
- package/dist/cjs/resolvers/embed-node/utils.d.ts +0 -1
- package/dist/cjs/resolvers/embed-node/utils.d.ts.map +1 -1
- package/dist/cjs/resolvers/embed-node/utils.js +43 -27
- package/dist/cjs/resolvers/embed-node/utils.js.map +1 -1
- package/dist/cjs/resolvers/html-nesting/diagnostics.d.ts +23 -0
- package/dist/cjs/resolvers/html-nesting/diagnostics.d.ts.map +1 -0
- package/dist/cjs/resolvers/html-nesting/diagnostics.js +77 -0
- package/dist/cjs/resolvers/html-nesting/diagnostics.js.map +1 -0
- package/dist/cjs/resolvers/html-nesting/index.d.ts +33 -0
- package/dist/cjs/resolvers/html-nesting/index.d.ts.map +1 -0
- package/dist/cjs/resolvers/html-nesting/index.js +185 -0
- package/dist/cjs/resolvers/html-nesting/index.js.map +1 -0
- package/dist/cjs/resolvers/html-nesting/paragraph-repair.d.ts +15 -0
- package/dist/cjs/resolvers/html-nesting/paragraph-repair.d.ts.map +1 -0
- package/dist/cjs/resolvers/html-nesting/paragraph-repair.js +129 -0
- package/dist/cjs/resolvers/html-nesting/paragraph-repair.js.map +1 -0
- package/dist/cjs/resolvers/html-nesting/types.d.ts +37 -0
- package/dist/cjs/resolvers/html-nesting/types.d.ts.map +1 -0
- package/dist/cjs/resolvers/html-nesting/types.js +3 -0
- package/dist/cjs/resolvers/html-nesting/types.js.map +1 -0
- package/dist/cjs/resolvers/style-set-definitions/index.d.ts.map +1 -1
- package/dist/cjs/resolvers/style-set-definitions/index.js +35 -4
- package/dist/cjs/resolvers/style-set-definitions/index.js.map +1 -1
- package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.d.ts +43 -0
- package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.d.ts.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.js +110 -0
- package/dist/cjs/resolvers/unbound-expressions/ambient-identifiers.js.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-fallback.d.ts +22 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-fallback.d.ts.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-fallback.js +129 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-fallback.js.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.d.ts +37 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.d.ts.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.js +191 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-identifiers.js.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-lexer.d.ts +41 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-lexer.d.ts.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-lexer.js +158 -0
- package/dist/cjs/resolvers/unbound-expressions/expression-lexer.js.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/index.d.ts +3 -0
- package/dist/cjs/resolvers/unbound-expressions/index.d.ts.map +1 -0
- package/dist/cjs/resolvers/unbound-expressions/index.js +256 -0
- package/dist/cjs/resolvers/unbound-expressions/index.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils.d.ts +16 -12
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +269 -100
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/html-mapping.d.ts.map +1 -1
- package/dist/esm/html-mapping.js +56 -0
- package/dist/esm/html-mapping.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resolver.d.ts.map +1 -1
- package/dist/esm/resolver.js +25 -11
- package/dist/esm/resolver.js.map +1 -1
- package/dist/esm/resolvers/abilities/index.d.ts.map +1 -1
- package/dist/esm/resolvers/abilities/index.js +11 -1
- package/dist/esm/resolvers/abilities/index.js.map +1 -1
- package/dist/esm/resolvers/abilities/utils.d.ts +5 -2
- package/dist/esm/resolvers/abilities/utils.d.ts.map +1 -1
- package/dist/esm/resolvers/abilities/utils.js +468 -30
- package/dist/esm/resolvers/abilities/utils.js.map +1 -1
- package/dist/esm/resolvers/embed-node/utils.d.ts +0 -1
- package/dist/esm/resolvers/embed-node/utils.d.ts.map +1 -1
- package/dist/esm/resolvers/embed-node/utils.js +41 -24
- package/dist/esm/resolvers/embed-node/utils.js.map +1 -1
- package/dist/esm/resolvers/html-nesting/diagnostics.d.ts +23 -0
- package/dist/esm/resolvers/html-nesting/diagnostics.d.ts.map +1 -0
- package/dist/esm/resolvers/html-nesting/diagnostics.js +72 -0
- package/dist/esm/resolvers/html-nesting/diagnostics.js.map +1 -0
- package/dist/esm/resolvers/html-nesting/index.d.ts +33 -0
- package/dist/esm/resolvers/html-nesting/index.d.ts.map +1 -0
- package/dist/esm/resolvers/html-nesting/index.js +181 -0
- package/dist/esm/resolvers/html-nesting/index.js.map +1 -0
- package/dist/esm/resolvers/html-nesting/paragraph-repair.d.ts +15 -0
- package/dist/esm/resolvers/html-nesting/paragraph-repair.d.ts.map +1 -0
- package/dist/esm/resolvers/html-nesting/paragraph-repair.js +123 -0
- package/dist/esm/resolvers/html-nesting/paragraph-repair.js.map +1 -0
- package/dist/esm/resolvers/html-nesting/types.d.ts +37 -0
- package/dist/esm/resolvers/html-nesting/types.d.ts.map +1 -0
- package/dist/esm/resolvers/html-nesting/types.js +2 -0
- package/dist/esm/resolvers/html-nesting/types.js.map +1 -0
- package/dist/esm/resolvers/style-set-definitions/index.d.ts.map +1 -1
- package/dist/esm/resolvers/style-set-definitions/index.js +35 -4
- package/dist/esm/resolvers/style-set-definitions/index.js.map +1 -1
- package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.d.ts +43 -0
- package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.d.ts.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.js +106 -0
- package/dist/esm/resolvers/unbound-expressions/ambient-identifiers.js.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/expression-fallback.d.ts +22 -0
- package/dist/esm/resolvers/unbound-expressions/expression-fallback.d.ts.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/expression-fallback.js +125 -0
- package/dist/esm/resolvers/unbound-expressions/expression-fallback.js.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/expression-identifiers.d.ts +37 -0
- package/dist/esm/resolvers/unbound-expressions/expression-identifiers.d.ts.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/expression-identifiers.js +187 -0
- package/dist/esm/resolvers/unbound-expressions/expression-identifiers.js.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/expression-lexer.d.ts +41 -0
- package/dist/esm/resolvers/unbound-expressions/expression-lexer.d.ts.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/expression-lexer.js +151 -0
- package/dist/esm/resolvers/unbound-expressions/expression-lexer.js.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/index.d.ts +3 -0
- package/dist/esm/resolvers/unbound-expressions/index.d.ts.map +1 -0
- package/dist/esm/resolvers/unbound-expressions/index.js +252 -0
- package/dist/esm/resolvers/unbound-expressions/index.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +16 -12
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +265 -96
- package/dist/esm/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/html-mapping.ts +56 -0
- package/src/index.ts +9 -1
- package/src/resolver.ts +36 -15
- package/src/resolvers/abilities/index.ts +19 -2
- package/src/resolvers/abilities/utils.ts +707 -30
- package/src/resolvers/embed-node/utils.ts +46 -38
- package/src/resolvers/html-nesting/diagnostics.ts +88 -0
- package/src/resolvers/html-nesting/index.ts +253 -0
- package/src/resolvers/html-nesting/paragraph-repair.ts +152 -0
- package/src/resolvers/html-nesting/types.ts +39 -0
- package/src/resolvers/style-set-definitions/index.ts +34 -1
- package/src/resolvers/unbound-expressions/ambient-identifiers.ts +105 -0
- package/src/resolvers/unbound-expressions/expression-fallback.ts +141 -0
- package/src/resolvers/unbound-expressions/expression-identifiers.ts +233 -0
- package/src/resolvers/unbound-expressions/expression-lexer.ts +156 -0
- package/src/resolvers/unbound-expressions/index.ts +278 -0
- 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:
|
|
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
|
+
})
|