@teleporthq/teleport-plugin-common 0.41.0 → 0.42.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__/builders/html-builders.ts +9 -2
- package/__tests__/node-handlers/node-to-html/index.ts +2 -0
- package/__tests__/node-handlers/node-to-jsx/index.ts +1 -1
- package/__tests__/node-handlers/node-to-jsx/utils.ts +16 -3
- package/dist/cjs/builders/ast-builders.d.ts +1 -0
- package/dist/cjs/builders/ast-builders.d.ts.map +1 -1
- package/dist/cjs/builders/ast-builders.js +19 -3
- package/dist/cjs/builders/ast-builders.js.map +1 -1
- package/dist/cjs/builders/hast-builders.d.ts +1 -0
- package/dist/cjs/builders/hast-builders.d.ts.map +1 -1
- package/dist/cjs/builders/hast-builders.js +11 -1
- package/dist/cjs/builders/hast-builders.js.map +1 -1
- package/dist/cjs/builders/style-builders.d.ts +2 -2
- package/dist/cjs/builders/style-builders.d.ts.map +1 -1
- package/dist/cjs/builders/style-builders.js +39 -19
- package/dist/cjs/builders/style-builders.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 +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/constants.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/constants.js +2 -0
- package/dist/cjs/node-handlers/node-to-html/constants.js.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/index.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/index.js +53 -1
- package/dist/cjs/node-handlers/node-to-html/index.js.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/types.d.ts +5 -1
- package/dist/cjs/node-handlers/node-to-html/types.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/utils.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-html/utils.js +48 -4
- package/dist/cjs/node-handlers/node-to-html/utils.js.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/index.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/index.js +325 -44
- package/dist/cjs/node-handlers/node-to-jsx/index.js.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/types.d.ts +5 -5
- package/dist/cjs/node-handlers/node-to-jsx/types.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/utils.d.ts +5 -5
- package/dist/cjs/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/utils.js +79 -36
- package/dist/cjs/node-handlers/node-to-jsx/utils.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils/ast-utils.d.ts +16 -6
- package/dist/cjs/utils/ast-utils.d.ts.map +1 -1
- package/dist/cjs/utils/ast-utils.js +182 -40
- package/dist/cjs/utils/ast-utils.js.map +1 -1
- package/dist/cjs/utils/hast-utils.d.ts +8 -6
- package/dist/cjs/utils/hast-utils.d.ts.map +1 -1
- package/dist/cjs/utils/hast-utils.js +28 -4
- package/dist/cjs/utils/hast-utils.js.map +1 -1
- package/dist/cjs/utils/types.d.ts +3 -0
- package/dist/cjs/utils/types.d.ts.map +1 -0
- package/dist/cjs/utils/types.js +3 -0
- package/dist/cjs/utils/types.js.map +1 -0
- package/dist/esm/builders/ast-builders.d.ts +1 -0
- package/dist/esm/builders/ast-builders.d.ts.map +1 -1
- package/dist/esm/builders/ast-builders.js +18 -3
- package/dist/esm/builders/ast-builders.js.map +1 -1
- package/dist/esm/builders/hast-builders.d.ts +1 -0
- package/dist/esm/builders/hast-builders.d.ts.map +1 -1
- package/dist/esm/builders/hast-builders.js +9 -0
- package/dist/esm/builders/hast-builders.js.map +1 -1
- package/dist/esm/builders/style-builders.d.ts +2 -2
- package/dist/esm/builders/style-builders.d.ts.map +1 -1
- package/dist/esm/builders/style-builders.js +37 -18
- package/dist/esm/builders/style-builders.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/node-handlers/node-to-html/constants.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-html/constants.js +2 -0
- package/dist/esm/node-handlers/node-to-html/constants.js.map +1 -1
- package/dist/esm/node-handlers/node-to-html/index.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-html/index.js +54 -2
- package/dist/esm/node-handlers/node-to-html/index.js.map +1 -1
- package/dist/esm/node-handlers/node-to-html/types.d.ts +5 -1
- package/dist/esm/node-handlers/node-to-html/types.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-html/utils.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-html/utils.js +45 -4
- package/dist/esm/node-handlers/node-to-html/utils.js.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/index.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/index.js +326 -45
- package/dist/esm/node-handlers/node-to-jsx/index.js.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/types.d.ts +5 -5
- package/dist/esm/node-handlers/node-to-jsx/types.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/utils.d.ts +5 -5
- package/dist/esm/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/utils.js +79 -36
- package/dist/esm/node-handlers/node-to-jsx/utils.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils/ast-utils.d.ts +16 -6
- package/dist/esm/utils/ast-utils.d.ts.map +1 -1
- package/dist/esm/utils/ast-utils.js +176 -39
- package/dist/esm/utils/ast-utils.js.map +1 -1
- package/dist/esm/utils/hast-utils.d.ts +8 -6
- package/dist/esm/utils/hast-utils.d.ts.map +1 -1
- package/dist/esm/utils/hast-utils.js +26 -3
- package/dist/esm/utils/hast-utils.js.map +1 -1
- package/dist/esm/utils/types.d.ts +3 -0
- package/dist/esm/utils/types.d.ts.map +1 -0
- package/dist/esm/utils/types.js +2 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/package.json +4 -4
- package/src/builders/ast-builders.ts +36 -2
- package/src/builders/hast-builders.ts +11 -0
- package/src/builders/style-builders.ts +51 -27
- package/src/index.ts +12 -1
- package/src/node-handlers/node-to-html/constants.ts +2 -0
- package/src/node-handlers/node-to-html/index.ts +95 -5
- package/src/node-handlers/node-to-html/types.ts +6 -0
- package/src/node-handlers/node-to-html/utils.ts +60 -5
- package/src/node-handlers/node-to-jsx/index.ts +566 -62
- package/src/node-handlers/node-to-jsx/types.ts +10 -29
- package/src/node-handlers/node-to-jsx/utils.ts +106 -42
- package/src/utils/ast-utils.ts +283 -82
- package/src/utils/hast-utils.ts +37 -9
- package/src/utils/types.ts +25 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hast-utils.js","sourceRoot":"","sources":["../../../src/utils/hast-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,MAAM,CAAC,IAAM,yBAAyB,GAAG,
|
|
1
|
+
{"version":3,"file":"hast-utils.js","sourceRoot":"","sources":["../../../src/utils/hast-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,CAAC,IAAM,yBAAyB,GAAG,UACvC,IAA2B,EAC3B,GAAW,EACX,KAAqB;IAArB,sBAAA,EAAA,YAAqB;IAErB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAvD,CAAuD,CAAC,CAAA;QAClF,OAAM;KACP;IACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAClD,gFAAgF;AAClF,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,IAA2B,EAAE,GAAW,EAAE,KAAa;IACxF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAjC,CAAiC,CAAC,CAAA;QAC5D,OAAM;KACP;IACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,cAAc,GAAG,UAAC,IAA2B,EAAE,SAAiB;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,EAAtC,CAAsC,CAAC,CAAA;QACjE,OAAM;KACP;IACD,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;AACnC,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,YAAY,GAAG,UAAC,IAA2B,EAAE,KAA0B;IAClF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAA5B,CAA4B,CAAC,CAAA;QACvD,OAAM;KACP;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,WAAW,GAAG,UAAC,IAA2B,EAAE,IAAY;IACnE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAA3C,CAA2C,CAAC,CAAA;QACtE,OAAM;KACP;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,aAAa,GAAG,UAAC,KAA4B;IACxD,OAAA,YAAY,CAAC,KAAK,CAAC,KAAK,KAAK;QAC7B,CAAC,YAAY,IAAI,KAAK,IAAI,UAAU,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,CAAC;AADpE,CACoE,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type BinaryOperator = '===' | '+' | '-' | '/' | '%' | '*' | '**' | '&' | '|' | '>>' | '>>>' | '<<' | '^' | '==' | '!=' | '!==' | 'in' | 'instanceof' | '>' | '<' | '>=' | '<=';
|
|
2
|
+
export type UnaryOperation = '+' | '-' | 'void' | 'throw' | 'delete' | '!' | '~' | 'typeof';
|
|
3
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,IAAI,GACJ,GAAG,GACH,GAAG,GACH,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,YAAY,GACZ,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,CAAA;AAER,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teleporthq/teleport-plugin-common",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
4
4
|
"description": "Common building and modelating functions for ASTs and HASTs",
|
|
5
5
|
"author": "teleportHQ",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"@babel/core": "^7.5.5",
|
|
28
28
|
"@babel/preset-react": "^7.22.5",
|
|
29
29
|
"@babel/types": "^7.5.5",
|
|
30
|
-
"@teleporthq/teleport-shared": "^0.
|
|
31
|
-
"@teleporthq/teleport-types": "^0.
|
|
30
|
+
"@teleporthq/teleport-shared": "^0.42.0",
|
|
31
|
+
"@teleporthq/teleport-types": "^0.42.0",
|
|
32
32
|
"jss": "^10.0.0",
|
|
33
33
|
"jss-preset-default": "^10.0.0"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "5460b740bf90a0a320f7a6b56119e3aa03fc3609"
|
|
36
36
|
}
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
objectToObjectExpression,
|
|
5
5
|
addAttributeToJSXTag,
|
|
6
6
|
addChildJSXTag,
|
|
7
|
+
addDynamicExpressionAttributeToJSXTag,
|
|
7
8
|
} from '../utils/ast-utils'
|
|
8
9
|
import {
|
|
9
10
|
ImportIdentifier,
|
|
@@ -151,7 +152,7 @@ export const createFunctionalComponent = (
|
|
|
151
152
|
t = types
|
|
152
153
|
) => {
|
|
153
154
|
const returnStatement = t.returnStatement(jsxRoot)
|
|
154
|
-
const arrowFunction = t.arrowFunctionExpression([], t.blockStatement([returnStatement]
|
|
155
|
+
const arrowFunction = t.arrowFunctionExpression([], t.blockStatement([returnStatement]))
|
|
155
156
|
|
|
156
157
|
const declarator = t.variableDeclarator(t.identifier(componentName), arrowFunction)
|
|
157
158
|
const component = t.variableDeclaration('const', [declarator])
|
|
@@ -245,7 +246,18 @@ export const appendAssetsAST = (
|
|
|
245
246
|
addAttributeToJSXTag(scriptTag, 'type', 'text/javascript')
|
|
246
247
|
|
|
247
248
|
if (assetPath) {
|
|
248
|
-
|
|
249
|
+
// If the path contains a template expression (e.g., ${process.env.KEY}),
|
|
250
|
+
// set it as a dynamic expression so it renders with backticks instead of a plain string.
|
|
251
|
+
if (assetPath.includes('${')) {
|
|
252
|
+
// Wrap in backticks so it's parsed as a template literal expression
|
|
253
|
+
addDynamicExpressionAttributeToJSXTag(
|
|
254
|
+
scriptTag,
|
|
255
|
+
{ type: 'expr', content: `\`${assetPath}\`` },
|
|
256
|
+
'src'
|
|
257
|
+
)
|
|
258
|
+
} else {
|
|
259
|
+
addAttributeToJSXTag(scriptTag, 'src', assetPath)
|
|
260
|
+
}
|
|
249
261
|
if (asset.options && asset.options.defer) {
|
|
250
262
|
addAttributeToJSXTag(scriptTag, 'defer', true)
|
|
251
263
|
}
|
|
@@ -282,3 +294,25 @@ export const appendAssetsAST = (
|
|
|
282
294
|
}
|
|
283
295
|
})
|
|
284
296
|
}
|
|
297
|
+
|
|
298
|
+
export const createDOMInjectionNode = (content: string) => {
|
|
299
|
+
return types.jsxElement(
|
|
300
|
+
types.jsxOpeningElement(
|
|
301
|
+
types.jsxIdentifier('span'),
|
|
302
|
+
[
|
|
303
|
+
types.jsxAttribute(
|
|
304
|
+
types.jsxIdentifier('dangerouslySetInnerHTML'),
|
|
305
|
+
types.jsxExpressionContainer(
|
|
306
|
+
types.objectExpression([
|
|
307
|
+
types.objectProperty(types.identifier('__html'), types.stringLiteral(content)),
|
|
308
|
+
])
|
|
309
|
+
)
|
|
310
|
+
),
|
|
311
|
+
],
|
|
312
|
+
true
|
|
313
|
+
),
|
|
314
|
+
null,
|
|
315
|
+
[],
|
|
316
|
+
true
|
|
317
|
+
)
|
|
318
|
+
}
|
|
@@ -4,6 +4,10 @@ export const createHTMLNode = (
|
|
|
4
4
|
tagName: string,
|
|
5
5
|
children: Array<HastNode | HastText> = []
|
|
6
6
|
): HastNode => {
|
|
7
|
+
if (tagName === undefined) {
|
|
8
|
+
console.trace({ tagName, children })
|
|
9
|
+
}
|
|
10
|
+
|
|
7
11
|
return {
|
|
8
12
|
type: 'element',
|
|
9
13
|
tagName,
|
|
@@ -18,3 +22,10 @@ export const createTextNode = (content: string): HastText => {
|
|
|
18
22
|
value: content,
|
|
19
23
|
}
|
|
20
24
|
}
|
|
25
|
+
|
|
26
|
+
export const createComment = (content: string): HastText => {
|
|
27
|
+
return {
|
|
28
|
+
type: 'comment',
|
|
29
|
+
value: content,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -13,6 +13,9 @@ import {
|
|
|
13
13
|
getContentOfStyleObject,
|
|
14
14
|
getCSSVariablesContentFromTokenStyles,
|
|
15
15
|
} from '../utils/style-utils'
|
|
16
|
+
import { isJSXElement } from '../utils/ast-utils'
|
|
17
|
+
import { isHastElement } from '../utils/hast-utils'
|
|
18
|
+
|
|
16
19
|
jss.setup(preset())
|
|
17
20
|
|
|
18
21
|
export const createCSSClass = (key: string, styleObject: Record<string, string | number>) => {
|
|
@@ -47,6 +50,14 @@ export const createCSSClassWithSelector = (
|
|
|
47
50
|
.toString()
|
|
48
51
|
}
|
|
49
52
|
|
|
53
|
+
export const createFontDecleration = (styleObject: Record<string, string | number>) => {
|
|
54
|
+
return jss
|
|
55
|
+
.createStyleSheet({
|
|
56
|
+
'@font-face': styleObject,
|
|
57
|
+
})
|
|
58
|
+
.toString()
|
|
59
|
+
}
|
|
60
|
+
|
|
50
61
|
export const createCSSClassWithMediaQuery = (
|
|
51
62
|
mediaOffset: string,
|
|
52
63
|
styleObject: Record<string, string | number | Record<string, string | number>>
|
|
@@ -99,8 +110,25 @@ export const generateMediaStyle = (
|
|
|
99
110
|
createCSSClassWithMediaQuery(
|
|
100
111
|
`max-width: ${mediaOffset}px`,
|
|
101
112
|
(styleMap[String(mediaOffset)] || []).reduce(
|
|
102
|
-
(acc: Record<string, string | number
|
|
103
|
-
|
|
113
|
+
(acc: Record<string, string | number | Record<string, string | number>>, style) => {
|
|
114
|
+
// Deep merge to handle both direct styles and nested subselectors
|
|
115
|
+
Object.keys(style).forEach((className) => {
|
|
116
|
+
const existingValue = acc[className]
|
|
117
|
+
const newValue = style[className]
|
|
118
|
+
|
|
119
|
+
if (!existingValue) {
|
|
120
|
+
acc[className] = newValue as Record<string, string | number>
|
|
121
|
+
} else if (typeof existingValue === 'object' && typeof newValue === 'object') {
|
|
122
|
+
// Both are objects, merge them
|
|
123
|
+
acc[className] = {
|
|
124
|
+
...existingValue,
|
|
125
|
+
...(newValue as Record<string, string | number>),
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
// One or both are primitives, new value overwrites
|
|
129
|
+
acc[className] = newValue as Record<string, string | number>
|
|
130
|
+
}
|
|
131
|
+
})
|
|
104
132
|
return acc
|
|
105
133
|
},
|
|
106
134
|
{}
|
|
@@ -122,6 +150,7 @@ export const generateStylesFromStyleSetDefinitions = (
|
|
|
122
150
|
) => {
|
|
123
151
|
Object.keys(styleSetDefinitions).forEach((styleId) => {
|
|
124
152
|
const style = styleSetDefinitions[styleId]
|
|
153
|
+
|
|
125
154
|
const { content, conditions = [], type } = style
|
|
126
155
|
const name = className(style.className || styleId)
|
|
127
156
|
const subselectors = style.subselectors
|
|
@@ -136,6 +165,7 @@ export const generateStylesFromStyleSetDefinitions = (
|
|
|
136
165
|
const cls = subselectors
|
|
137
166
|
? createCSSClassWithSelector(name, `&${subselectors}`, collectedStyles)
|
|
138
167
|
: createCSSClass(name, collectedStyles)
|
|
168
|
+
|
|
139
169
|
if (type === 'reusable-component-style-map') {
|
|
140
170
|
cssMap.unshift(cls)
|
|
141
171
|
} else {
|
|
@@ -196,34 +226,28 @@ export const generateStylesFromStyleSetDefinitions = (
|
|
|
196
226
|
|
|
197
227
|
export const setPropValueForCompStyle = (params: {
|
|
198
228
|
attrs: Record<string, UIDLAttributeValue>
|
|
199
|
-
|
|
200
|
-
jsxNodesLookup: Record<string, types.JSXElement | HastNode>
|
|
229
|
+
root: types.JSXElement | HastNode
|
|
201
230
|
templateStyle?: 'jsx' | 'html'
|
|
202
231
|
getClassName: (str: string) => string
|
|
203
232
|
}) => {
|
|
204
|
-
const { attrs,
|
|
205
|
-
Object.keys(attrs)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
233
|
+
const { attrs, root, templateStyle = 'jsx', getClassName } = params
|
|
234
|
+
Object.keys(attrs)
|
|
235
|
+
.filter((attr) => attrs[attr].type === 'comp-style')
|
|
236
|
+
.forEach((attr) => {
|
|
237
|
+
if (templateStyle === 'jsx' && isJSXElement(root)) {
|
|
238
|
+
root.openingElement?.attributes.forEach((attribute: types.JSXAttribute) => {
|
|
239
|
+
if (
|
|
240
|
+
attribute.value?.type === 'StringLiteral' &&
|
|
241
|
+
attribute.value?.value &&
|
|
242
|
+
attribute.name?.name === attr
|
|
243
|
+
) {
|
|
244
|
+
attribute.value.value = getClassName(attribute.value.value)
|
|
245
|
+
}
|
|
246
|
+
})
|
|
247
|
+
}
|
|
220
248
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (!compInstanceNode?.properties[attr]) {
|
|
224
|
-
return
|
|
249
|
+
if (templateStyle === 'html' && isHastElement(root)) {
|
|
250
|
+
root.properties[attr] = getClassName(String(root.properties[attr]))
|
|
225
251
|
}
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
})
|
|
252
|
+
})
|
|
229
253
|
}
|
package/src/index.ts
CHANGED
|
@@ -7,7 +7,18 @@ import * as StyleUtils from './utils/style-utils'
|
|
|
7
7
|
import * as HASTUtils from './utils/hast-utils'
|
|
8
8
|
import ParsedASTNode from './utils/parsed-ast'
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
import { createBinaryExpression } from './node-handlers/node-to-jsx/utils'
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
ASTBuilders,
|
|
14
|
+
StyleBuilders,
|
|
15
|
+
HASTBuilders,
|
|
16
|
+
ASTUtils,
|
|
17
|
+
StyleUtils,
|
|
18
|
+
HASTUtils,
|
|
19
|
+
ParsedASTNode,
|
|
20
|
+
createBinaryExpression,
|
|
21
|
+
}
|
|
11
22
|
|
|
12
23
|
export { default as createHTMLTemplateSyntax } from './node-handlers/node-to-html'
|
|
13
24
|
export { default as createJSXSyntax } from './node-handlers/node-to-jsx'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as hastUtils from '../../utils/hast-utils'
|
|
2
|
-
import { createHTMLNode } from '../../builders/hast-builders'
|
|
2
|
+
import { createComment, createHTMLNode } from '../../builders/hast-builders'
|
|
3
3
|
import { UIDLUtils, StringUtils } from '@teleporthq/teleport-shared'
|
|
4
4
|
import {
|
|
5
5
|
UIDLRepeatNode,
|
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
UIDLNode,
|
|
9
9
|
UIDLElementNode,
|
|
10
10
|
HastNode,
|
|
11
|
+
HastText,
|
|
12
|
+
UIDLDynamicReference,
|
|
11
13
|
} from '@teleporthq/teleport-types'
|
|
12
14
|
import { createConditionalStatement, handleAttribute, handleEvent } from './utils'
|
|
13
15
|
import { NodeToHTML } from './types'
|
|
@@ -86,7 +88,11 @@ const generateElementNode: NodeToHTML<UIDLElementNode, HastNode> = (node, params
|
|
|
86
88
|
|
|
87
89
|
export default generateElementNode
|
|
88
90
|
|
|
89
|
-
const generateNode: NodeToHTML<UIDLNode, HastNode | string> = (
|
|
91
|
+
const generateNode: NodeToHTML<UIDLNode, HastNode | HastText | string> = (
|
|
92
|
+
node,
|
|
93
|
+
params,
|
|
94
|
+
templateSyntax
|
|
95
|
+
) => {
|
|
90
96
|
switch (node.type) {
|
|
91
97
|
case 'inject':
|
|
92
98
|
if (node?.dependency) {
|
|
@@ -102,7 +108,7 @@ const generateNode: NodeToHTML<UIDLNode, HastNode | string> = (node, params, tem
|
|
|
102
108
|
return StringUtils.encode(node.content.toString())
|
|
103
109
|
|
|
104
110
|
case 'dynamic':
|
|
105
|
-
return
|
|
111
|
+
return generateDynamicNode(node, params, templateSyntax)
|
|
106
112
|
|
|
107
113
|
case 'element':
|
|
108
114
|
return generateElementNode(node, params, templateSyntax)
|
|
@@ -116,6 +122,10 @@ const generateNode: NodeToHTML<UIDLNode, HastNode | string> = (node, params, tem
|
|
|
116
122
|
case 'slot':
|
|
117
123
|
return generateSlotNode(node, params, templateSyntax)
|
|
118
124
|
|
|
125
|
+
case 'expr':
|
|
126
|
+
return 'Expression nodes are not supported'
|
|
127
|
+
case 'cms-list-repeater':
|
|
128
|
+
return 'CMS repeater nodes are not supported'
|
|
119
129
|
default:
|
|
120
130
|
throw new Error(
|
|
121
131
|
`generateHTMLSyntax encountered a node of unsupported type: ${JSON.stringify(
|
|
@@ -127,6 +137,74 @@ const generateNode: NodeToHTML<UIDLNode, HastNode | string> = (node, params, tem
|
|
|
127
137
|
}
|
|
128
138
|
}
|
|
129
139
|
|
|
140
|
+
const generateDynamicNode: NodeToHTML<UIDLDynamicReference, HastNode | HastText | string> = (
|
|
141
|
+
node,
|
|
142
|
+
params,
|
|
143
|
+
templateSyntax
|
|
144
|
+
) => {
|
|
145
|
+
if (node.content.referenceType === 'global') {
|
|
146
|
+
// TODO: Check this in the future. Not throwing an error for now
|
|
147
|
+
console.info(`Global dynamic values are not supported in the HTML generator`)
|
|
148
|
+
const spanNode = createHTMLNode('span')
|
|
149
|
+
return spanNode
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const usedPropType = params.propDefinitions[node.content.id]
|
|
153
|
+
if (usedPropType && usedPropType.type === 'element') {
|
|
154
|
+
let slotNode = createHTMLNode('slot')
|
|
155
|
+
const commentNode = createComment(`Default content for ${node.content.id}`)
|
|
156
|
+
hastUtils.addChildNode(slotNode, commentNode)
|
|
157
|
+
|
|
158
|
+
// Named slot handling for VueJS
|
|
159
|
+
if (templateSyntax.slotBinding === 'v-slot') {
|
|
160
|
+
hastUtils.addAttributeToNode(slotNode, 'name', node.content.id)
|
|
161
|
+
if (usedPropType.defaultValue) {
|
|
162
|
+
const defaultSlotContent = generateNode(
|
|
163
|
+
usedPropType.defaultValue as UIDLElementNode,
|
|
164
|
+
params,
|
|
165
|
+
templateSyntax
|
|
166
|
+
) as HastNode
|
|
167
|
+
hastUtils.addChildNode(slotNode, defaultSlotContent)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return slotNode
|
|
171
|
+
} else {
|
|
172
|
+
const slotWrapper = createHTMLNode('ng-container')
|
|
173
|
+
slotNode = createHTMLNode('ng-container')
|
|
174
|
+
|
|
175
|
+
if (usedPropType.defaultValue) {
|
|
176
|
+
const defaultSlotTemplateName = StringUtils.dashCaseToCamelCase(
|
|
177
|
+
`default-${node.content.id}`
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
hastUtils.addAttributeToNode(
|
|
181
|
+
slotNode,
|
|
182
|
+
'*ngTemplateOutlet',
|
|
183
|
+
`${node.content.id} ? ${node.content.id} : ${defaultSlotTemplateName}`
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
const templateNode = createHTMLNode('ng-template')
|
|
187
|
+
hastUtils.addBooleanAttributeToNode(templateNode, `#${defaultSlotTemplateName}`)
|
|
188
|
+
|
|
189
|
+
const defaultSlotContent = generateNode(
|
|
190
|
+
usedPropType.defaultValue as UIDLElementNode,
|
|
191
|
+
params,
|
|
192
|
+
templateSyntax
|
|
193
|
+
) as HastNode
|
|
194
|
+
hastUtils.addChildNode(templateNode, defaultSlotContent)
|
|
195
|
+
hastUtils.addChildNode(slotWrapper, templateNode)
|
|
196
|
+
} else {
|
|
197
|
+
hastUtils.addAttributeToNode(slotNode, '*ngTemplateOutlet', node.content.id)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
hastUtils.addChildNode(slotWrapper, slotNode)
|
|
201
|
+
return slotWrapper
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return templateSyntax.interpolation(node.content.id)
|
|
206
|
+
}
|
|
207
|
+
|
|
130
208
|
const generateRawHTMLNode: NodeToHTML<UIDLNode, HastNode> = (node, params, templateSyntax) => {
|
|
131
209
|
const attrKey = templateSyntax.domHTMLInjection ? templateSyntax.domHTMLInjection : 'innerHTML'
|
|
132
210
|
const htmlNode = createHTMLNode('span')
|
|
@@ -159,12 +237,20 @@ const generateRepeatNode: NodeToHTML<UIDLRepeatNode, HastNode> = (node, params,
|
|
|
159
237
|
return repeatContentTag
|
|
160
238
|
}
|
|
161
239
|
|
|
162
|
-
const generateConditionalNode: NodeToHTML<UIDLConditionalNode, HastNode> = (
|
|
240
|
+
const generateConditionalNode: NodeToHTML<UIDLConditionalNode, HastNode | HastText> = (
|
|
163
241
|
node,
|
|
164
242
|
params,
|
|
165
243
|
templateSyntax
|
|
166
244
|
) => {
|
|
167
245
|
let conditionalTag = generateNode(node.content.node, params, templateSyntax)
|
|
246
|
+
|
|
247
|
+
// We can add attributes only to tags, so in case of a text node we wrap it with a 'span'
|
|
248
|
+
if (typeof conditionalTag === 'object' && !('properties' in conditionalTag)) {
|
|
249
|
+
const wrappingSpan = createHTMLNode('span')
|
|
250
|
+
hastUtils.addTextNode(wrappingSpan, conditionalTag.value)
|
|
251
|
+
conditionalTag = wrappingSpan
|
|
252
|
+
}
|
|
253
|
+
|
|
168
254
|
// conditional attribute needs to be added on a tag, so in case of a text node we wrap it with
|
|
169
255
|
// a 'span' which is the less intrusive of all
|
|
170
256
|
if (typeof conditionalTag === 'string') {
|
|
@@ -178,7 +264,11 @@ const generateConditionalNode: NodeToHTML<UIDLConditionalNode, HastNode> = (
|
|
|
178
264
|
return conditionalTag
|
|
179
265
|
}
|
|
180
266
|
|
|
181
|
-
const generateSlotNode: NodeToHTML<UIDLSlotNode, HastNode> = (
|
|
267
|
+
const generateSlotNode: NodeToHTML<UIDLSlotNode, HastNode | HastText> = (
|
|
268
|
+
node,
|
|
269
|
+
params,
|
|
270
|
+
templateSyntax
|
|
271
|
+
) => {
|
|
182
272
|
const slotNode = createHTMLNode('slot')
|
|
183
273
|
|
|
184
274
|
if (node.content.name) {
|
|
@@ -2,6 +2,8 @@ import {
|
|
|
2
2
|
UIDLDependency,
|
|
3
3
|
UIDLEventHandlerStatement,
|
|
4
4
|
UIDLElementNode,
|
|
5
|
+
UIDLPropDefinition,
|
|
6
|
+
UIDLStateDefinition,
|
|
5
7
|
} from '@teleporthq/teleport-types'
|
|
6
8
|
|
|
7
9
|
export interface HTMLTemplateGenerationParams {
|
|
@@ -11,6 +13,8 @@ export interface HTMLTemplateGenerationParams {
|
|
|
11
13
|
// tslint:disable-next-line no-any
|
|
12
14
|
dataObject: Record<string, any>
|
|
13
15
|
methodsObject: Record<string, UIDLEventHandlerStatement[]>
|
|
16
|
+
propDefinitions: Record<string, UIDLPropDefinition>
|
|
17
|
+
stateDefinitions: Record<string, UIDLStateDefinition>
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
export interface HTMLTemplateSyntax {
|
|
@@ -25,6 +29,8 @@ export interface HTMLTemplateSyntax {
|
|
|
25
29
|
customElementTagName?: (value: string) => string
|
|
26
30
|
dependencyHandling?: 'import' | 'ignore'
|
|
27
31
|
domHTMLInjection?: string
|
|
32
|
+
slotBinding?: string
|
|
33
|
+
slotTagName?: string
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
export type NodeToHTML<NodeType, ReturnType> = (
|
|
@@ -7,8 +7,12 @@ import {
|
|
|
7
7
|
UIDLAttributeValue,
|
|
8
8
|
UIDLEventHandlerStatement,
|
|
9
9
|
UIDLElementNode,
|
|
10
|
+
UIDLExpressionValue,
|
|
11
|
+
UIDLDynamicReference,
|
|
10
12
|
} from '@teleporthq/teleport-types'
|
|
11
13
|
import { HTMLTemplateGenerationParams, HTMLTemplateSyntax } from './types'
|
|
14
|
+
import { createHTMLNode } from '../../builders/hast-builders'
|
|
15
|
+
import generateElementNode from '../node-to-html'
|
|
12
16
|
|
|
13
17
|
export const handleAttribute = (
|
|
14
18
|
htmlNode: HastNode,
|
|
@@ -58,6 +62,35 @@ export const handleAttribute = (
|
|
|
58
62
|
hastUtils.addAttributeToNode(htmlNode, dynamicAttrKey, attrValue.content.toString())
|
|
59
63
|
}
|
|
60
64
|
break
|
|
65
|
+
|
|
66
|
+
case 'element':
|
|
67
|
+
const templateNode = createHTMLNode(templateSyntax.slotTagName)
|
|
68
|
+
const templateContent = generateElementNode(attrValue, params, templateSyntax)
|
|
69
|
+
|
|
70
|
+
if (templateSyntax.slotBinding === 'v-slot') {
|
|
71
|
+
hastUtils.addBooleanAttributeToNode(
|
|
72
|
+
templateNode,
|
|
73
|
+
`${templateSyntax.slotBinding}:${attrKey}`
|
|
74
|
+
)
|
|
75
|
+
} else {
|
|
76
|
+
hastUtils.addBooleanAttributeToNode(templateNode, `${templateSyntax.slotBinding}${attrKey}`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
hastUtils.addChildNode(templateNode, templateContent)
|
|
80
|
+
hastUtils.addChildNode(htmlNode, templateNode)
|
|
81
|
+
break
|
|
82
|
+
|
|
83
|
+
case 'object': {
|
|
84
|
+
dataObject[attrKey] = attrValue.content
|
|
85
|
+
hastUtils.addAttributeToNode(htmlNode, dynamicAttrKey, attrKey)
|
|
86
|
+
break
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
case 'expr':
|
|
90
|
+
// TODO: Check this in the future. Not throwing an error for now
|
|
91
|
+
console.info(`Expressions are not supported in HTML templates`)
|
|
92
|
+
break
|
|
93
|
+
|
|
61
94
|
default:
|
|
62
95
|
throw new Error(
|
|
63
96
|
`generateElementNode could not generate code for attribute of type ${JSON.stringify(
|
|
@@ -112,13 +145,20 @@ export const createConditionalStatement = (node: UIDLConditionalNode): string =>
|
|
|
112
145
|
const { node: childNode, reference, value, condition } = node.content
|
|
113
146
|
|
|
114
147
|
const expression = standardizeUIDLConditionalExpression(value, condition)
|
|
115
|
-
|
|
148
|
+
if (reference.type === 'dynamic') {
|
|
149
|
+
const statement = createConditional(reference.content.id, expression)
|
|
150
|
+
|
|
151
|
+
if (childNode.type === 'conditional') {
|
|
152
|
+
return `${statement} && ${createConditionalStatement(childNode)}`
|
|
153
|
+
}
|
|
116
154
|
|
|
117
|
-
|
|
118
|
-
return `${statement} && ${createConditionalStatement(childNode)}`
|
|
155
|
+
return statement
|
|
119
156
|
}
|
|
120
157
|
|
|
121
|
-
|
|
158
|
+
// expression nodes are not supported in html based templates.
|
|
159
|
+
if (reference.type === 'expr') {
|
|
160
|
+
return ''
|
|
161
|
+
}
|
|
122
162
|
}
|
|
123
163
|
|
|
124
164
|
const standardizeUIDLConditionalExpression = (
|
|
@@ -144,6 +184,9 @@ const createConditional = (
|
|
|
144
184
|
}
|
|
145
185
|
|
|
146
186
|
const stringConditions = conditions.map(({ operation, operand }) => {
|
|
187
|
+
// @todo
|
|
188
|
+
// unlike jsx code generation, we are not converting the operand to binary or unary operation.
|
|
189
|
+
// Please refer to https://github.com/teleporthq/teleport-code-generators/blob/development/packages/teleport-plugin-common/src/node-handlers/node-to-jsx/utils.ts#L303-L319
|
|
147
190
|
return `(${stringifyConditionalExpression(conditionalKey, operation, operand)})`
|
|
148
191
|
})
|
|
149
192
|
|
|
@@ -154,7 +197,7 @@ const createConditional = (
|
|
|
154
197
|
const stringifyConditionalExpression = (
|
|
155
198
|
identifier: string,
|
|
156
199
|
operation: string,
|
|
157
|
-
value: string | number | boolean
|
|
200
|
+
value: string | number | boolean | UIDLDynamicReference | UIDLExpressionValue
|
|
158
201
|
) => {
|
|
159
202
|
if (typeof value === 'boolean') {
|
|
160
203
|
return `${value ? '' : '!'}${identifier}`
|
|
@@ -164,5 +207,17 @@ const stringifyConditionalExpression = (
|
|
|
164
207
|
return `${identifier} ${operation} '${value}'`
|
|
165
208
|
}
|
|
166
209
|
|
|
210
|
+
if (typeof value === 'number') {
|
|
211
|
+
return `${identifier} ${operation} ${value}`
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (value.type === 'dynamic') {
|
|
215
|
+
return `${identifier} ${operation} ${value.content.id}`
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (value.type === 'expr') {
|
|
219
|
+
return `${identifier} ${operation} ${value.content}`
|
|
220
|
+
}
|
|
221
|
+
|
|
167
222
|
return `${identifier} ${operation} ${value}`
|
|
168
223
|
}
|