@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.
Files changed (117) hide show
  1. package/__tests__/builders/html-builders.ts +9 -2
  2. package/__tests__/node-handlers/node-to-html/index.ts +2 -0
  3. package/__tests__/node-handlers/node-to-jsx/index.ts +1 -1
  4. package/__tests__/node-handlers/node-to-jsx/utils.ts +16 -3
  5. package/dist/cjs/builders/ast-builders.d.ts +1 -0
  6. package/dist/cjs/builders/ast-builders.d.ts.map +1 -1
  7. package/dist/cjs/builders/ast-builders.js +19 -3
  8. package/dist/cjs/builders/ast-builders.js.map +1 -1
  9. package/dist/cjs/builders/hast-builders.d.ts +1 -0
  10. package/dist/cjs/builders/hast-builders.d.ts.map +1 -1
  11. package/dist/cjs/builders/hast-builders.js +11 -1
  12. package/dist/cjs/builders/hast-builders.js.map +1 -1
  13. package/dist/cjs/builders/style-builders.d.ts +2 -2
  14. package/dist/cjs/builders/style-builders.d.ts.map +1 -1
  15. package/dist/cjs/builders/style-builders.js +39 -19
  16. package/dist/cjs/builders/style-builders.js.map +1 -1
  17. package/dist/cjs/index.d.ts +2 -1
  18. package/dist/cjs/index.d.ts.map +1 -1
  19. package/dist/cjs/index.js +3 -1
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/node-handlers/node-to-html/constants.d.ts.map +1 -1
  22. package/dist/cjs/node-handlers/node-to-html/constants.js +2 -0
  23. package/dist/cjs/node-handlers/node-to-html/constants.js.map +1 -1
  24. package/dist/cjs/node-handlers/node-to-html/index.d.ts.map +1 -1
  25. package/dist/cjs/node-handlers/node-to-html/index.js +53 -1
  26. package/dist/cjs/node-handlers/node-to-html/index.js.map +1 -1
  27. package/dist/cjs/node-handlers/node-to-html/types.d.ts +5 -1
  28. package/dist/cjs/node-handlers/node-to-html/types.d.ts.map +1 -1
  29. package/dist/cjs/node-handlers/node-to-html/utils.d.ts.map +1 -1
  30. package/dist/cjs/node-handlers/node-to-html/utils.js +48 -4
  31. package/dist/cjs/node-handlers/node-to-html/utils.js.map +1 -1
  32. package/dist/cjs/node-handlers/node-to-jsx/index.d.ts.map +1 -1
  33. package/dist/cjs/node-handlers/node-to-jsx/index.js +325 -44
  34. package/dist/cjs/node-handlers/node-to-jsx/index.js.map +1 -1
  35. package/dist/cjs/node-handlers/node-to-jsx/types.d.ts +5 -5
  36. package/dist/cjs/node-handlers/node-to-jsx/types.d.ts.map +1 -1
  37. package/dist/cjs/node-handlers/node-to-jsx/utils.d.ts +5 -5
  38. package/dist/cjs/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
  39. package/dist/cjs/node-handlers/node-to-jsx/utils.js +79 -36
  40. package/dist/cjs/node-handlers/node-to-jsx/utils.js.map +1 -1
  41. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  42. package/dist/cjs/utils/ast-utils.d.ts +16 -6
  43. package/dist/cjs/utils/ast-utils.d.ts.map +1 -1
  44. package/dist/cjs/utils/ast-utils.js +182 -40
  45. package/dist/cjs/utils/ast-utils.js.map +1 -1
  46. package/dist/cjs/utils/hast-utils.d.ts +8 -6
  47. package/dist/cjs/utils/hast-utils.d.ts.map +1 -1
  48. package/dist/cjs/utils/hast-utils.js +28 -4
  49. package/dist/cjs/utils/hast-utils.js.map +1 -1
  50. package/dist/cjs/utils/types.d.ts +3 -0
  51. package/dist/cjs/utils/types.d.ts.map +1 -0
  52. package/dist/cjs/utils/types.js +3 -0
  53. package/dist/cjs/utils/types.js.map +1 -0
  54. package/dist/esm/builders/ast-builders.d.ts +1 -0
  55. package/dist/esm/builders/ast-builders.d.ts.map +1 -1
  56. package/dist/esm/builders/ast-builders.js +18 -3
  57. package/dist/esm/builders/ast-builders.js.map +1 -1
  58. package/dist/esm/builders/hast-builders.d.ts +1 -0
  59. package/dist/esm/builders/hast-builders.d.ts.map +1 -1
  60. package/dist/esm/builders/hast-builders.js +9 -0
  61. package/dist/esm/builders/hast-builders.js.map +1 -1
  62. package/dist/esm/builders/style-builders.d.ts +2 -2
  63. package/dist/esm/builders/style-builders.d.ts.map +1 -1
  64. package/dist/esm/builders/style-builders.js +37 -18
  65. package/dist/esm/builders/style-builders.js.map +1 -1
  66. package/dist/esm/index.d.ts +2 -1
  67. package/dist/esm/index.d.ts.map +1 -1
  68. package/dist/esm/index.js +2 -1
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/node-handlers/node-to-html/constants.d.ts.map +1 -1
  71. package/dist/esm/node-handlers/node-to-html/constants.js +2 -0
  72. package/dist/esm/node-handlers/node-to-html/constants.js.map +1 -1
  73. package/dist/esm/node-handlers/node-to-html/index.d.ts.map +1 -1
  74. package/dist/esm/node-handlers/node-to-html/index.js +54 -2
  75. package/dist/esm/node-handlers/node-to-html/index.js.map +1 -1
  76. package/dist/esm/node-handlers/node-to-html/types.d.ts +5 -1
  77. package/dist/esm/node-handlers/node-to-html/types.d.ts.map +1 -1
  78. package/dist/esm/node-handlers/node-to-html/utils.d.ts.map +1 -1
  79. package/dist/esm/node-handlers/node-to-html/utils.js +45 -4
  80. package/dist/esm/node-handlers/node-to-html/utils.js.map +1 -1
  81. package/dist/esm/node-handlers/node-to-jsx/index.d.ts.map +1 -1
  82. package/dist/esm/node-handlers/node-to-jsx/index.js +326 -45
  83. package/dist/esm/node-handlers/node-to-jsx/index.js.map +1 -1
  84. package/dist/esm/node-handlers/node-to-jsx/types.d.ts +5 -5
  85. package/dist/esm/node-handlers/node-to-jsx/types.d.ts.map +1 -1
  86. package/dist/esm/node-handlers/node-to-jsx/utils.d.ts +5 -5
  87. package/dist/esm/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
  88. package/dist/esm/node-handlers/node-to-jsx/utils.js +79 -36
  89. package/dist/esm/node-handlers/node-to-jsx/utils.js.map +1 -1
  90. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  91. package/dist/esm/utils/ast-utils.d.ts +16 -6
  92. package/dist/esm/utils/ast-utils.d.ts.map +1 -1
  93. package/dist/esm/utils/ast-utils.js +176 -39
  94. package/dist/esm/utils/ast-utils.js.map +1 -1
  95. package/dist/esm/utils/hast-utils.d.ts +8 -6
  96. package/dist/esm/utils/hast-utils.d.ts.map +1 -1
  97. package/dist/esm/utils/hast-utils.js +26 -3
  98. package/dist/esm/utils/hast-utils.js.map +1 -1
  99. package/dist/esm/utils/types.d.ts +3 -0
  100. package/dist/esm/utils/types.d.ts.map +1 -0
  101. package/dist/esm/utils/types.js +2 -0
  102. package/dist/esm/utils/types.js.map +1 -0
  103. package/package.json +4 -4
  104. package/src/builders/ast-builders.ts +36 -2
  105. package/src/builders/hast-builders.ts +11 -0
  106. package/src/builders/style-builders.ts +51 -27
  107. package/src/index.ts +12 -1
  108. package/src/node-handlers/node-to-html/constants.ts +2 -0
  109. package/src/node-handlers/node-to-html/index.ts +95 -5
  110. package/src/node-handlers/node-to-html/types.ts +6 -0
  111. package/src/node-handlers/node-to-html/utils.ts +60 -5
  112. package/src/node-handlers/node-to-jsx/index.ts +566 -62
  113. package/src/node-handlers/node-to-jsx/types.ts +10 -29
  114. package/src/node-handlers/node-to-jsx/utils.ts +106 -42
  115. package/src/utils/ast-utils.ts +283 -82
  116. package/src/utils/hast-utils.ts +37 -9
  117. 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,UAAC,IAAc,EAAE,GAAW,EAAE,KAAqB;IAArB,sBAAA,EAAA,YAAqB;IAC1F,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAClD;;gCAE4B;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,IAAc,EAAE,GAAW,EAAE,KAAa;IAC3E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,cAAc,GAAG,UAAC,IAAc,EAAE,SAAiB;IAC9D,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;AACnC,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,YAAY,GAAG,UAAC,IAAc,EAAE,KAAe;IAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,WAAW,GAAG,UAAC,IAAc,EAAE,IAAY;IACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1C,CAAC,CAAA"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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.41.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.41.0",
31
- "@teleporthq/teleport-types": "^0.41.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": "e27d8195d1be04c1991e23cad87bcf65d87ab2f3"
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
- addAttributeToJSXTag(scriptTag, 'src', assetPath)
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>, style) => {
103
- Object.assign(acc, style)
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
- key: string
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, jsxNodesLookup, key, templateStyle = 'jsx', getClassName } = params
205
- Object.keys(attrs).forEach((attr) => {
206
- if (attrs[attr].type !== 'comp-style') {
207
- return
208
- }
209
-
210
- if (templateStyle === 'jsx') {
211
- const compInstanceNode = jsxNodesLookup[key] as types.JSXElement
212
- compInstanceNode.openingElement?.attributes.forEach((attribute: types.JSXAttribute) => {
213
- if (attribute.name?.name === attr && (attribute.value as types.StringLiteral)?.value) {
214
- ;(attribute.value as types.StringLiteral).value = getClassName(
215
- (attribute.value as types.StringLiteral).value
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
- if (templateStyle === 'html') {
222
- const compInstanceNode = jsxNodesLookup[key] as HastNode
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
- compInstanceNode.properties[attr] = getClassName(String(compInstanceNode.properties[attr]))
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
- export { ASTBuilders, StyleBuilders, HASTBuilders, ASTUtils, StyleUtils, HASTUtils, ParsedASTNode }
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'
@@ -16,4 +16,6 @@ export const DEFAULT_TEMPLATE_SYNTAX: HTMLTemplateSyntax = {
16
16
  customElementTagName: (value) => value,
17
17
  dependencyHandling: 'import',
18
18
  domHTMLInjection: 'innerHTML',
19
+ slotBinding: `v-slot`,
20
+ slotTagName: 'template',
19
21
  }
@@ -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> = (node, params, templateSyntax) => {
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 templateSyntax.interpolation(node.content.id)
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> = (node, params, templateSyntax) => {
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
- const statement = createConditional(reference.content.id, expression)
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
- if (childNode.type === 'conditional') {
118
- return `${statement} && ${createConditionalStatement(childNode)}`
155
+ return statement
119
156
  }
120
157
 
121
- return statement
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
  }