@builder.io/mitosis 0.0.56-99 → 0.0.58

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 (254) hide show
  1. package/dist/src/__tests__/data/blocks/content-slot-jsx.raw.jsx +4 -1
  2. package/dist/src/__tests__/data/blocks/form.raw.jsx +5 -5
  3. package/dist/src/__tests__/data/blocks/onUpdateWithDeps.raw.d.ts +5 -1
  4. package/dist/src/__tests__/data/blocks/onUpdateWithDeps.raw.jsx +3 -3
  5. package/dist/src/__tests__/data/jsx-json.spec.d.ts +2 -0
  6. package/dist/src/__tests__/data/jsx-json.spec.js +10226 -0
  7. package/dist/src/__tests__/shared.d.ts +7 -2
  8. package/dist/src/__tests__/shared.js +66 -9
  9. package/dist/src/constants/method-literal-prefix.d.ts +0 -1
  10. package/dist/src/constants/method-literal-prefix.js +0 -3
  11. package/dist/src/generators/angular.d.ts +2 -2
  12. package/dist/src/generators/angular.js +14 -6
  13. package/dist/src/generators/builder.d.ts +4 -11
  14. package/dist/src/generators/builder.js +3 -2
  15. package/dist/src/generators/context/qwik.js +1 -1
  16. package/dist/src/generators/context/svelte.d.ts +3 -0
  17. package/dist/src/generators/context/svelte.js +3 -0
  18. package/dist/src/generators/helpers/functions.d.ts +2 -0
  19. package/dist/src/generators/helpers/functions.js +28 -0
  20. package/dist/src/generators/html.d.ts +3 -3
  21. package/dist/src/generators/html.js +9 -7
  22. package/dist/src/generators/liquid.d.ts +2 -2
  23. package/dist/src/generators/liquid.js +4 -4
  24. package/dist/src/generators/lit/generate.d.ts +2 -2
  25. package/dist/src/generators/lit/generate.js +3 -2
  26. package/dist/src/generators/marko/generate.d.ts +2 -2
  27. package/dist/src/generators/marko/generate.js +10 -8
  28. package/dist/src/generators/mitosis.d.ts +3 -4
  29. package/dist/src/generators/mitosis.js +3 -2
  30. package/dist/src/generators/qwik/component-generator.d.ts +2 -2
  31. package/dist/src/generators/qwik/component-generator.js +68 -64
  32. package/dist/src/generators/qwik/component.d.ts +0 -1
  33. package/dist/src/generators/qwik/component.js +22 -19
  34. package/dist/src/generators/qwik/directives.d.ts +1 -0
  35. package/dist/src/generators/qwik/directives.js +11 -14
  36. package/dist/src/generators/qwik/jsx.d.ts +1 -1
  37. package/dist/src/generators/qwik/jsx.js +9 -5
  38. package/dist/src/generators/qwik/src-generator.js +11 -3
  39. package/dist/src/generators/qwik/stable-serialize.d.ts +6 -0
  40. package/dist/src/generators/qwik/stable-serialize.js +51 -0
  41. package/dist/src/generators/react/generator.d.ts +6 -0
  42. package/dist/src/generators/{react.js → react/generator.js} +58 -150
  43. package/dist/src/generators/react/helpers.d.ts +2 -0
  44. package/dist/src/generators/react/helpers.js +14 -0
  45. package/dist/src/generators/react/index.d.ts +2 -0
  46. package/dist/src/generators/react/index.js +18 -0
  47. package/dist/src/generators/react/state.d.ts +9 -0
  48. package/dist/src/generators/react/state.js +107 -0
  49. package/dist/src/generators/react/types.d.ts +10 -0
  50. package/dist/src/{types/string-map.js → generators/react/types.js} +0 -0
  51. package/dist/src/generators/react-native.d.ts +2 -2
  52. package/dist/src/generators/solid/index.d.ts +3 -0
  53. package/dist/src/generators/{solid.js → solid/index.js} +80 -40
  54. package/dist/src/generators/solid/state.d.ts +19 -0
  55. package/dist/src/generators/solid/state.js +144 -0
  56. package/dist/src/generators/solid/types.d.ts +6 -0
  57. package/dist/src/generators/solid/types.js +2 -0
  58. package/dist/src/generators/stencil/generate.d.ts +2 -2
  59. package/dist/src/generators/stencil/generate.js +5 -2
  60. package/dist/src/generators/svelte.d.ts +6 -7
  61. package/dist/src/generators/svelte.js +43 -40
  62. package/dist/src/generators/swift-ui.d.ts +3 -5
  63. package/dist/src/generators/swift-ui.js +3 -2
  64. package/dist/src/generators/template.d.ts +2 -2
  65. package/dist/src/generators/template.js +3 -2
  66. package/dist/src/generators/vue.d.ts +5 -3
  67. package/dist/src/generators/vue.js +256 -113
  68. package/dist/src/helpers/babel-transform.d.ts +3 -1
  69. package/dist/src/helpers/babel-transform.js +52 -56
  70. package/dist/src/helpers/get-bindings.js +3 -5
  71. package/dist/src/helpers/get-props.js +14 -1
  72. package/dist/src/helpers/get-state-object-string.js +24 -21
  73. package/dist/src/helpers/getters-to-functions.js +1 -11
  74. package/dist/src/helpers/map-refs.js +25 -25
  75. package/dist/src/helpers/nodes/for.d.ts +4 -0
  76. package/dist/src/helpers/nodes/for.js +13 -0
  77. package/dist/src/helpers/nullable.d.ts +2 -0
  78. package/dist/src/helpers/nullable.js +7 -0
  79. package/dist/src/helpers/patterns.d.ts +2 -0
  80. package/dist/src/helpers/patterns.js +5 -1
  81. package/dist/src/helpers/render-imports.js +3 -3
  82. package/dist/src/helpers/replace-identifiers.d.ts +5 -0
  83. package/dist/src/helpers/{replace-idenifiers.js → replace-identifiers.js} +2 -1
  84. package/dist/src/helpers/slots.d.ts +2 -0
  85. package/dist/src/helpers/slots.js +15 -1
  86. package/dist/src/helpers/state.d.ts +0 -2
  87. package/dist/src/helpers/state.js +1 -10
  88. package/dist/src/helpers/strip-state-and-props-refs.d.ts +1 -1
  89. package/dist/src/helpers/strip-state-and-props-refs.js +43 -31
  90. package/dist/src/helpers/styles/helpers.d.ts +3 -2
  91. package/dist/src/index.d.ts +0 -2
  92. package/dist/src/index.js +0 -2
  93. package/dist/src/parsers/angular.js +2 -2
  94. package/dist/src/parsers/builder.d.ts +2 -2
  95. package/dist/src/parsers/builder.js +61 -43
  96. package/dist/src/parsers/constants/outdated-prefixes.d.ts +10 -0
  97. package/dist/src/parsers/constants/outdated-prefixes.js +13 -0
  98. package/dist/src/parsers/context.js +2 -2
  99. package/dist/src/parsers/helpers/state.d.ts +3 -0
  100. package/dist/src/parsers/helpers/state.js +30 -0
  101. package/dist/src/parsers/jsx/component-types.d.ts +1 -1
  102. package/dist/src/parsers/jsx/component-types.js +15 -2
  103. package/dist/src/parsers/jsx/context.js +1 -1
  104. package/dist/src/parsers/jsx/element-parser.d.ts +6 -0
  105. package/dist/src/parsers/jsx/element-parser.js +243 -0
  106. package/dist/src/parsers/jsx/exports.d.ts +3 -0
  107. package/dist/src/parsers/jsx/exports.js +78 -0
  108. package/dist/src/parsers/jsx/function-parser.d.ts +7 -0
  109. package/dist/src/parsers/jsx/function-parser.js +291 -0
  110. package/dist/src/parsers/jsx/helpers.d.ts +2 -0
  111. package/dist/src/parsers/jsx/helpers.js +30 -1
  112. package/dist/src/parsers/jsx/imports.d.ts +7 -0
  113. package/dist/src/parsers/jsx/imports.js +65 -0
  114. package/dist/src/parsers/jsx/index.d.ts +1 -1
  115. package/dist/src/parsers/jsx/index.js +1 -2
  116. package/dist/src/parsers/jsx/jsx.js +29 -516
  117. package/dist/src/parsers/jsx/state.d.ts +2 -3
  118. package/dist/src/parsers/jsx/state.js +15 -22
  119. package/dist/src/plugins/compile-away-builder-components.js +6 -0
  120. package/dist/src/symbols/symbol-processor.js +3 -0
  121. package/dist/src/targets.d.ts +21 -28
  122. package/dist/src/targets.js +2 -2
  123. package/dist/src/types/config.d.ts +11 -1
  124. package/dist/src/types/mitosis-component.d.ts +12 -6
  125. package/dist/src/types/mitosis-component.js +11 -0
  126. package/dist/src/types/mitosis-context.d.ts +2 -2
  127. package/dist/src/types/mitosis-node.d.ts +14 -5
  128. package/dist/src/types/mitosis-node.js +3 -0
  129. package/dist/src/types/transpiler.d.ts +6 -1
  130. package/dist/tsconfig.build.tsbuildinfo +1 -1
  131. package/package.json +9 -9
  132. package/dist/src/__tests__/angular.test.d.ts +0 -1
  133. package/dist/src/__tests__/angular.test.js +0 -10
  134. package/dist/src/__tests__/builder.test.d.ts +0 -1
  135. package/dist/src/__tests__/builder.test.js +0 -235
  136. package/dist/src/__tests__/context.test.d.ts +0 -1
  137. package/dist/src/__tests__/context.test.js +0 -35
  138. package/dist/src/__tests__/hash-code.test.d.ts +0 -1
  139. package/dist/src/__tests__/hash-code.test.js +0 -11
  140. package/dist/src/__tests__/html.test.d.ts +0 -1
  141. package/dist/src/__tests__/html.test.js +0 -7
  142. package/dist/src/__tests__/liquid.test.d.ts +0 -1
  143. package/dist/src/__tests__/liquid.test.js +0 -7
  144. package/dist/src/__tests__/lit.test.d.ts +0 -1
  145. package/dist/src/__tests__/lit.test.js +0 -7
  146. package/dist/src/__tests__/marko.test.d.ts +0 -1
  147. package/dist/src/__tests__/marko.test.js +0 -14
  148. package/dist/src/__tests__/parse-jsx.test.d.ts +0 -1
  149. package/dist/src/__tests__/parse-jsx.test.js +0 -37
  150. package/dist/src/__tests__/qwik/convert-method-to-function.test.d.ts +0 -1
  151. package/dist/src/__tests__/qwik/convert-method-to-function.test.js +0 -37
  152. package/dist/src/__tests__/qwik/src-generator.test.d.ts +0 -1
  153. package/dist/src/__tests__/qwik/src-generator.test.js +0 -65
  154. package/dist/src/__tests__/qwik.directive.test.d.ts +0 -1
  155. package/dist/src/__tests__/qwik.directive.test.js +0 -108
  156. package/dist/src/__tests__/qwik.test.d.ts +0 -1
  157. package/dist/src/__tests__/qwik.test.js +0 -465
  158. package/dist/src/__tests__/react-native.test.d.ts +0 -1
  159. package/dist/src/__tests__/react-native.test.js +0 -7
  160. package/dist/src/__tests__/react.test.d.ts +0 -1
  161. package/dist/src/__tests__/react.test.js +0 -20
  162. package/dist/src/__tests__/solid.test.d.ts +0 -1
  163. package/dist/src/__tests__/solid.test.js +0 -10
  164. package/dist/src/__tests__/stencil.test.d.ts +0 -1
  165. package/dist/src/__tests__/stencil.test.js +0 -7
  166. package/dist/src/__tests__/styles.test.d.ts +0 -1
  167. package/dist/src/__tests__/styles.test.js +0 -23
  168. package/dist/src/__tests__/svelte.test.d.ts +0 -1
  169. package/dist/src/__tests__/svelte.test.js +0 -7
  170. package/dist/src/__tests__/vue.test.d.ts +0 -1
  171. package/dist/src/__tests__/vue.test.js +0 -7
  172. package/dist/src/__tests__/webcomponent.test.d.ts +0 -1
  173. package/dist/src/__tests__/webcomponent.test.js +0 -15
  174. package/dist/src/constants/function-literal-prefix.d.ts +0 -1
  175. package/dist/src/constants/function-literal-prefix.js +0 -4
  176. package/dist/src/generators/react.d.ts +0 -14
  177. package/dist/src/generators/solid.d.ts +0 -5
  178. package/dist/src/helpers/babel-transform.test.d.ts +0 -1
  179. package/dist/src/helpers/babel-transform.test.js +0 -7
  180. package/dist/src/helpers/generic-format.test.d.ts +0 -1
  181. package/dist/src/helpers/generic-format.test.js +0 -8
  182. package/dist/src/helpers/map-to-attributes.d.ts +0 -2
  183. package/dist/src/helpers/map-to-attributes.js +0 -19
  184. package/dist/src/helpers/map-to-css.d.ts +0 -2
  185. package/dist/src/helpers/map-to-css.js +0 -16
  186. package/dist/src/helpers/parse-reactive-script.d.ts +0 -7
  187. package/dist/src/helpers/parse-reactive-script.js +0 -87
  188. package/dist/src/helpers/remove-surrounding-block.test.d.ts +0 -1
  189. package/dist/src/helpers/remove-surrounding-block.test.js +0 -9
  190. package/dist/src/helpers/render-imports.test.d.ts +0 -1
  191. package/dist/src/helpers/render-imports.test.js +0 -33
  192. package/dist/src/helpers/replace-idenifiers.d.ts +0 -1
  193. package/dist/src/helpers/styles/collect-css.test.d.ts +0 -1
  194. package/dist/src/helpers/styles/collect-css.test.js +0 -18
  195. package/dist/src/parsers/html.d.ts +0 -0
  196. package/dist/src/parsers/html.js +0 -2
  197. package/dist/src/parsers/liquid.d.ts +0 -70
  198. package/dist/src/parsers/liquid.js +0 -2538
  199. package/dist/src/types/string-map.d.ts +0 -3
  200. package/dist/test/qwik/Accordion/high.jsx +0 -0
  201. package/dist/test/qwik/Accordion/low.jsx +0 -240
  202. package/dist/test/qwik/Accordion/med.jsx +0 -4
  203. package/dist/test/qwik/For/high.jsx +0 -0
  204. package/dist/test/qwik/For/low.jsx +0 -52
  205. package/dist/test/qwik/For/med.jsx +0 -4
  206. package/dist/test/qwik/Image/high.js +0 -9
  207. package/dist/test/qwik/Image/low.js +0 -0
  208. package/dist/test/qwik/Image/med.js +0 -155
  209. package/dist/test/qwik/Image.slow/high.js +0 -9
  210. package/dist/test/qwik/Image.slow/low.js +0 -0
  211. package/dist/test/qwik/Image.slow/med.js +0 -155
  212. package/dist/test/qwik/bindings/high.cjs +0 -0
  213. package/dist/test/qwik/bindings/low.cjs +0 -45
  214. package/dist/test/qwik/bindings/med.cjs +0 -3
  215. package/dist/test/qwik/button/high.js +0 -3
  216. package/dist/test/qwik/button/low.js +0 -25
  217. package/dist/test/qwik/button/med.js +0 -31
  218. package/dist/test/qwik/component/bindings/high.jsx +0 -0
  219. package/dist/test/qwik/component/bindings/low.jsx +0 -104
  220. package/dist/test/qwik/component/bindings/med.jsx +0 -7
  221. package/dist/test/qwik/component/component/inputs/high.cjsx +0 -9
  222. package/dist/test/qwik/component/component/inputs/low.cjsx +0 -0
  223. package/dist/test/qwik/component/component/inputs/med.cjsx +0 -68
  224. package/dist/test/qwik/for-loop.bindings/high.cjs +0 -0
  225. package/dist/test/qwik/for-loop.bindings/low.cjs +0 -56
  226. package/dist/test/qwik/for-loop.bindings/med.cjs +0 -5
  227. package/dist/test/qwik/hello_world/stylesheet/high.jsx +0 -0
  228. package/dist/test/qwik/hello_world/stylesheet/low.jsx +0 -26
  229. package/dist/test/qwik/hello_world/stylesheet/med.jsx +0 -4
  230. package/dist/test/qwik/mount/high.cjs +0 -0
  231. package/dist/test/qwik/mount/low.cjs +0 -47
  232. package/dist/test/qwik/mount/med.cjs +0 -3
  233. package/dist/test/qwik/page-with-symbol/high.js +0 -0
  234. package/dist/test/qwik/page-with-symbol/low.js +0 -33
  235. package/dist/test/qwik/page-with-symbol/med.js +0 -4
  236. package/dist/test/qwik/show-hide/high.jsx +0 -9
  237. package/dist/test/qwik/show-hide/low.jsx +0 -0
  238. package/dist/test/qwik/show-hide/med.jsx +0 -181
  239. package/dist/test/qwik/svg/high.js +0 -0
  240. package/dist/test/qwik/svg/low.js +0 -30
  241. package/dist/test/qwik/svg/med.js +0 -4
  242. package/dist/test/qwik/todo/Todo.cjs/high.cjs +0 -19
  243. package/dist/test/qwik/todo/Todo.cjs/low.cjs +0 -0
  244. package/dist/test/qwik/todo/Todo.cjs/med.cjs +0 -51
  245. package/dist/test/qwik/todo/Todo.js/high.js +0 -19
  246. package/dist/test/qwik/todo/Todo.js/low.js +0 -0
  247. package/dist/test/qwik/todo/Todo.js/med.js +0 -47
  248. package/dist/test/qwik/todo/Todo.tsx/high.tsx +0 -19
  249. package/dist/test/qwik/todo/Todo.tsx/low.tsx +0 -0
  250. package/dist/test/qwik/todo/Todo.tsx/med.tsx +0 -43
  251. package/dist/test/qwik/todos/Todo.tsx/high.tsx +0 -7
  252. package/dist/test/qwik/todos/Todo.tsx/low.tsx +0 -32
  253. package/dist/test/qwik/todos/Todo.tsx/med.tsx +0 -4
  254. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -8,24 +8,30 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
8
8
  }
9
9
  return to.concat(ar || Array.prototype.slice.call(from));
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.componentToQwik = void 0;
13
16
  var babel_transform_1 = require("../../helpers/babel-transform");
14
17
  var fast_clone_1 = require("../../helpers/fast-clone");
15
18
  var collect_css_1 = require("../../helpers/styles/collect-css");
19
+ var mitosis_component_1 = require("../../types/mitosis-component");
16
20
  var state_1 = require("../../helpers/state");
17
21
  var add_prevent_default_1 = require("./add-prevent-default");
18
22
  var convert_method_to_function_1 = require("./convert-method-to-function");
19
23
  var jsx_1 = require("./jsx");
20
24
  var src_generator_1 = require("./src-generator");
21
25
  var plugins_1 = require("../../modules/plugins");
26
+ var traverse_1 = __importDefault(require("traverse"));
27
+ var stable_serialize_1 = require("./stable-serialize");
22
28
  Error.stackTraceLimit = 9999;
23
29
  // TODO(misko): styles are not processed.
24
30
  var DEBUG = false;
25
31
  var componentToQwik = function (userOptions) {
26
32
  if (userOptions === void 0) { userOptions = {}; }
27
33
  return function (_a) {
28
- var _b, _c, _d;
34
+ var _b, _c, _d, _e;
29
35
  var _component = _a.component, path = _a.path;
30
36
  // Make a copy we can safely mutate, similar to babel's toolchain
31
37
  var component = (0, fast_clone_1.fastClone)(_component);
@@ -36,10 +42,11 @@ var componentToQwik = function (userOptions) {
36
42
  if (userOptions.plugins) {
37
43
  component = (0, plugins_1.runPostJsonPlugins)(component, userOptions.plugins);
38
44
  }
39
- var file = new src_generator_1.File(component.name + '.js', {
45
+ var isTypeScript = !!userOptions.typescript;
46
+ var file = new src_generator_1.File(component.name + (isTypeScript ? '.ts' : '.js'), {
40
47
  isPretty: true,
41
48
  isJSX: true,
42
- isTypeScript: false,
49
+ isTypeScript: isTypeScript,
43
50
  isModule: true,
44
51
  isBuilder: false,
45
52
  }, '@builder.io/qwik', '');
@@ -48,12 +55,13 @@ var componentToQwik = function (userOptions) {
48
55
  emitTypes(file, component);
49
56
  var metadata = component.meta.useMetadata || {};
50
57
  var isLightComponent = ((_c = (_b = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _b === void 0 ? void 0 : _b.component) === null || _c === void 0 ? void 0 : _c.isLight) || false;
51
- var imports_1 = (_d = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _d === void 0 ? void 0 : _d.imports;
58
+ var mutable_1 = ((_d = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _d === void 0 ? void 0 : _d.mutable) || [];
59
+ var imports_1 = (_e = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _e === void 0 ? void 0 : _e.imports;
52
60
  imports_1 && Object.keys(imports_1).forEach(function (key) { return file.import(imports_1[key], key); });
53
61
  var state_2 = emitStateMethodsAndRewriteBindings(file, component, metadata);
54
62
  var hasState_1 = (0, state_1.checkHasState)(component);
55
63
  var css_1 = null;
56
- var componentBody = (0, src_generator_1.arrowFnBlock)(['props'], [
64
+ var componentFn = (0, src_generator_1.arrowFnBlock)(['props'], [
57
65
  function () {
58
66
  css_1 = emitUseStyles(file, component);
59
67
  emitUseContext(file, component);
@@ -64,16 +72,21 @@ var componentToQwik = function (userOptions) {
64
72
  emitUseWatch(file, component);
65
73
  emitUseCleanup(file, component);
66
74
  emitTagNameHack(file, component);
67
- emitJSX(file, component);
75
+ emitJSX(file, component, mutable_1);
68
76
  },
69
- ], [component.propsTypeRef || 'any']);
77
+ ], [component.propsTypeRef + (isLightComponent ? '&{key?:any}' : '') || 'any']);
70
78
  file.src.const(component.name, isLightComponent
71
- ? componentBody
72
- : (0, src_generator_1.invoke)(file.import(file.qwikModule, 'component$'), [componentBody]), true, true);
79
+ ? componentFn
80
+ : (0, src_generator_1.invoke)(file.import(file.qwikModule, 'component$'), [componentFn]), true, true);
73
81
  file.exportDefault(component.name);
74
82
  emitStyles(file, css_1);
75
- DEBUG && file.exportConst('COMPONENT', JSON.stringify(component, null, 2));
76
- return '// GENERATED BY MITOSIS\n\n' + file.toString();
83
+ DEBUG && file.exportConst('COMPONENT', (0, stable_serialize_1.stableJSONserialize)(component));
84
+ var sourceFile = '// GENERATED BY MITOSIS\n\n' + file.toString();
85
+ if (userOptions.plugins) {
86
+ sourceFile = (0, plugins_1.runPreCodePlugins)(sourceFile, userOptions.plugins);
87
+ sourceFile = (0, plugins_1.runPostCodePlugins)(sourceFile, userOptions.plugins);
88
+ }
89
+ return sourceFile;
77
90
  }
78
91
  catch (e) {
79
92
  console.error(e);
@@ -126,12 +139,19 @@ function emitUseCleanup(file, component) {
126
139
  file.src.emit(file.import(file.qwikModule, 'useCleanup$').localName, '(()=>{', code, '});');
127
140
  }
128
141
  }
129
- function emitJSX(file, component) {
142
+ function emitJSX(file, component, mutable) {
130
143
  var directives = new Map();
131
144
  var handlers = new Map();
132
145
  var styles = new Map();
133
146
  var parentSymbolBindings = {};
134
- file.src.emit('return ', (0, jsx_1.renderJSXNodes)(file, directives, handlers, component.children, styles, parentSymbolBindings));
147
+ var mutablePredicate = mutable.length > 0
148
+ ? function (code) {
149
+ return !!mutable.find(function (txt) {
150
+ return code.indexOf(txt) !== -1;
151
+ });
152
+ }
153
+ : undefined;
154
+ file.src.emit('return ', (0, jsx_1.renderJSXNodes)(file, directives, handlers, component.children, styles, parentSymbolBindings, mutablePredicate));
135
155
  }
136
156
  function emitUseContextProvider(file, component) {
137
157
  Object.keys(component.context.set).forEach(function (ctxKey) {
@@ -141,14 +161,14 @@ function emitUseContextProvider(file, component) {
141
161
  Object.keys(context.value).forEach(function (prop) {
142
162
  var propValue = context.value[prop];
143
163
  file.src.emit(prop, ':');
144
- if (isGetter(propValue)) {
145
- file.src.emit('(()=>{', extractGetterBody(propValue), '})(),');
164
+ if ((propValue === null || propValue === void 0 ? void 0 : propValue.type) === 'getter') {
165
+ file.src.emit('(()=>{', extractGetterBody(propValue.code), '})(),');
146
166
  }
147
167
  else if (typeof propValue == 'function') {
148
168
  throw new Error('Qwik: Functions are not supported in context');
149
169
  }
150
170
  else {
151
- file.src.emit(JSON.stringify(propValue));
171
+ file.src.emit((0, stable_serialize_1.stableJSONserialize)(propValue));
152
172
  }
153
173
  });
154
174
  file.src.emit('})', ');');
@@ -185,13 +205,17 @@ function emitUseStore(file, stateInit) {
185
205
  var state = stateInit[0];
186
206
  var hasState = state && Object.keys(state).length > 0;
187
207
  if (hasState) {
188
- file.src.emit('const state=', file.import(file.qwikModule, 'useStore').localName, '(');
189
- file.src.emit(JSON.stringify(state));
208
+ file.src.emit('const state=', file.import(file.qwikModule, 'useStore').localName);
209
+ if (file.options.isTypeScript) {
210
+ file.src.emit('<any>');
211
+ }
212
+ file.src.emit('(');
213
+ file.src.emit((0, stable_serialize_1.stableJSONserialize)(state));
190
214
  file.src.emit(');');
191
215
  }
192
216
  else {
193
217
  // TODO hack for now so that `state` variable is defined, even though it is never read.
194
- file.src.emit('const state={};');
218
+ file.src.emit('const state={tagName:""' + (file.options.isTypeScript ? 'as any' : '') + '};');
195
219
  }
196
220
  }
197
221
  function emitTypes(file, component) {
@@ -208,26 +232,21 @@ function emitStateMethodsAndRewriteBindings(file, component, metadata) {
208
232
  rewriteCodeExpr(component, methodMap, lexicalArgs, (_a = metadata.qwik) === null || _a === void 0 ? void 0 : _a.replace);
209
233
  return state;
210
234
  }
211
- function rewriteCodeExpr(obj, methodMap, lexicalArgs, replace) {
212
- if (obj && typeof obj == 'object') {
213
- if (Array.isArray(obj)) {
214
- obj.forEach(function (item) { return rewriteCodeExpr(item, methodMap, lexicalArgs, replace); });
215
- }
216
- else {
217
- Object.keys(obj).forEach(function (key) {
218
- var value = obj[key];
219
- if (typeof value == 'string') {
220
- if (value.startsWith(CODE_PREFIX) || key == 'code') {
221
- var code_1 = (0, convert_method_to_function_1.convertMethodToFunction)(value, methodMap, lexicalArgs);
222
- replace &&
223
- Object.keys(replace).forEach(function (key) { return (code_1 = code_1.replace(key, replace[key])); });
224
- obj[key] = code_1;
225
- }
226
- }
227
- rewriteCodeExpr(value, methodMap, lexicalArgs, replace);
228
- });
235
+ var checkIsObjectWithCodeBlock = function (obj) {
236
+ return typeof obj == 'object' && (obj === null || obj === void 0 ? void 0 : obj.code) && typeof obj.code === 'string';
237
+ };
238
+ function rewriteCodeExpr(component, methodMap, lexicalArgs, replace) {
239
+ if (replace === void 0) { replace = {}; }
240
+ (0, traverse_1.default)(component).forEach(function (item) {
241
+ if (!((0, mitosis_component_1.checkIsCodeValue)(item) || checkIsObjectWithCodeBlock(item))) {
242
+ return;
229
243
  }
230
- }
244
+ var code = (0, convert_method_to_function_1.convertMethodToFunction)(item.code, methodMap, lexicalArgs);
245
+ Object.keys(replace).forEach(function (key) {
246
+ code = code.replace(key, replace[key]);
247
+ });
248
+ item.code = code;
249
+ });
231
250
  }
232
251
  function getLexicalScopeVars(component) {
233
252
  return __spreadArray(__spreadArray(['props', 'state'], Object.keys(component.refs), true), Object.keys(component.context.get), true);
@@ -243,30 +262,25 @@ function emitImports(file, component) {
243
262
  });
244
263
  });
245
264
  }
246
- var CODE_PREFIX = '@builder.io/mitosis/';
247
- var FUNCTION = CODE_PREFIX + 'function:';
248
- var METHOD = CODE_PREFIX + 'method:';
249
- var GETTER = CODE_PREFIX + 'method:get ';
250
265
  function emitStateMethods(file, componentState, lexicalArgs) {
251
266
  var stateValues = {};
252
267
  var stateInit = [stateValues];
253
268
  var methodMap = stateToMethodOrGetter(componentState);
254
269
  Object.keys(componentState).forEach(function (key) {
255
- var _a;
256
- var code = (_a = componentState[key]) === null || _a === void 0 ? void 0 : _a.code;
257
- if (isCode(code)) {
258
- var codeIisGetter = isGetter(code);
259
- var prefixIdx = code.indexOf(':') + 1;
260
- if (codeIisGetter) {
270
+ var stateValue = componentState[key];
271
+ if ((0, mitosis_component_1.checkIsCodeValue)(stateValue)) {
272
+ var code = stateValue.code;
273
+ var prefixIdx = 0;
274
+ if (stateValue.type === 'getter') {
261
275
  prefixIdx += 'get '.length;
262
276
  }
263
- else if (isFunction(code)) {
277
+ else if (stateValue.type === 'function') {
264
278
  prefixIdx += 'function '.length;
265
279
  }
266
280
  code = code.substring(prefixIdx);
267
281
  code = (0, convert_method_to_function_1.convertMethodToFunction)(code, methodMap, lexicalArgs).replace('(', "(".concat(lexicalArgs.join(','), ","));
268
282
  var functionName = code.split(/\(/)[0];
269
- if (codeIisGetter) {
283
+ if (stateValue.type === 'getter') {
270
284
  stateInit.push("state.".concat(key, "=").concat(functionName, "(").concat(lexicalArgs.join(','), ")"));
271
285
  }
272
286
  if (!file.options.isTypeScript) {
@@ -276,7 +290,7 @@ function emitStateMethods(file, componentState, lexicalArgs) {
276
290
  file.exportConst(functionName, 'function ' + code, true);
277
291
  }
278
292
  else {
279
- stateValues[key] = code;
293
+ stateValues[key] = stateValue === null || stateValue === void 0 ? void 0 : stateValue.code;
280
294
  }
281
295
  });
282
296
  return stateInit;
@@ -284,15 +298,6 @@ function emitStateMethods(file, componentState, lexicalArgs) {
284
298
  function convertTypeScriptToJS(code) {
285
299
  return (0, babel_transform_1.babelTransformExpression)(code, {});
286
300
  }
287
- function isGetter(code) {
288
- return typeof code === 'string' && code.startsWith(GETTER);
289
- }
290
- function isCode(code) {
291
- return typeof code === 'string' && code.startsWith(CODE_PREFIX);
292
- }
293
- function isFunction(code) {
294
- return typeof code === 'string' && code.startsWith(FUNCTION);
295
- }
296
301
  function extractGetterBody(code) {
297
302
  var start = code.indexOf('{');
298
303
  var end = code.lastIndexOf('}');
@@ -301,10 +306,9 @@ function extractGetterBody(code) {
301
306
  function stateToMethodOrGetter(state) {
302
307
  var methodMap = {};
303
308
  Object.keys(state).forEach(function (key) {
304
- var _a;
305
- var code = (_a = state[key]) === null || _a === void 0 ? void 0 : _a.code;
306
- if (typeof code == 'string' && code.startsWith(METHOD)) {
307
- methodMap[key] = code.startsWith(GETTER) ? 'getter' : 'method';
309
+ var stateVal = state[key];
310
+ if ((stateVal === null || stateVal === void 0 ? void 0 : stateVal.type) === 'getter' || (stateVal === null || stateVal === void 0 ? void 0 : stateVal.type) === 'method') {
311
+ methodMap[key] = stateVal.type;
308
312
  }
309
313
  });
310
314
  return methodMap;
@@ -16,7 +16,6 @@ export declare function createFileSet(options?: QwikOptions): FileSet;
16
16
  export declare function addComponent(fileSet: FileSet, component: MitosisComponent, opts?: {
17
17
  isRoot?: boolean;
18
18
  shareStyles?: boolean;
19
- hostProps?: Record<string, string>;
20
19
  }): void;
21
20
  export declare function renderUseLexicalScope(file: File): (this: SrcBuilder) => SrcBuilder;
22
21
  export declare function addCommonStyles(fileSet: FileSet): void;
@@ -21,11 +21,11 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
23
  exports.addCommonStyles = exports.renderUseLexicalScope = exports.addComponent = exports.createFileSet = void 0;
24
- var create_mitosis_node_1 = require("../../helpers/create-mitosis-node");
25
24
  var compile_away_builder_components_1 = require("../../plugins/compile-away-builder-components");
26
25
  var handlers_1 = require("./handlers");
27
26
  var jsx_1 = require("./jsx");
28
27
  var src_generator_1 = require("./src-generator");
28
+ var stable_serialize_1 = require("./stable-serialize");
29
29
  var styles_1 = require("./styles");
30
30
  function createFileSet(options) {
31
31
  if (options === void 0) { options = {}; }
@@ -43,7 +43,7 @@ function createFileSet(options) {
43
43
  med: new src_generator_1.File('med.' + extension, srcOptions, opts.qwikLib, opts.qrlPrefix),
44
44
  low: new src_generator_1.File('low.' + extension, srcOptions, opts.qwikLib, opts.qrlPrefix),
45
45
  };
46
- Object.defineProperty(fileSet, '_commonStyles', {
46
+ Object.defineProperty(fileSet, 'CommonStyles', {
47
47
  enumerable: false,
48
48
  value: { styles: new Map(), symbolName: null },
49
49
  });
@@ -51,11 +51,11 @@ function createFileSet(options) {
51
51
  }
52
52
  exports.createFileSet = createFileSet;
53
53
  function getCommonStyles(fileSet) {
54
- return fileSet['_commonStyles'];
54
+ return fileSet['CommonStyles'];
55
55
  }
56
56
  function addComponent(fileSet, component, opts) {
57
57
  if (opts === void 0) { opts = {}; }
58
- var _opts = __assign({ isRoot: false, shareStyles: false, hostProps: null }, opts);
58
+ var _opts = __assign({ isRoot: false, shareStyles: false }, opts);
59
59
  (0, compile_away_builder_components_1.compileAwayBuilderComponentsFromTree)(component, __assign(__assign({}, compile_away_builder_components_1.components), {
60
60
  // A set of components that should not be compiled away because they are implemented as runtime components.
61
61
  Image: undefined, CoreButton: undefined }));
@@ -74,32 +74,33 @@ function addComponent(fileSet, component, opts) {
74
74
  if (styles.size) {
75
75
  if (_opts.shareStyles) {
76
76
  if (_opts.isRoot) {
77
- var symbolName = componentName + '_styles';
77
+ var symbolName = componentName + 'Styles';
78
78
  getCommonStyles(fileSet).symbolName = symbolName;
79
79
  useStyles = generateStyles(onRenderFile, fileSet.low, symbolName, false);
80
80
  }
81
81
  }
82
82
  else {
83
- var symbolName = componentName + '_styles';
83
+ var symbolName = componentName + 'Styles';
84
84
  onRenderFile.exportConst(symbolName, (0, styles_1.renderStyles)(styles));
85
85
  useStyles = generateStyles(onRenderFile, onRenderFile, symbolName, true);
86
86
  }
87
87
  }
88
+ if (component.meta.cssCode) {
89
+ var symbolName = componentName + 'UsrStyles';
90
+ onRenderFile.exportConst(symbolName, (0, stable_serialize_1.stableJSONserialize)(component.meta.cssCode));
91
+ useStyles = (function (fns) {
92
+ return function () {
93
+ var _this = this;
94
+ fns.forEach(function (fn) { return fn.apply(_this); });
95
+ };
96
+ })([useStyles, generateStyles(onRenderFile, onRenderFile, symbolName, false)]);
97
+ }
88
98
  var directives = new Map();
89
99
  var rootChildren = component.children;
90
- if (_opts.hostProps) {
91
- rootChildren = [
92
- (0, create_mitosis_node_1.createMitosisNode)({
93
- name: 'Host',
94
- properties: _opts.hostProps,
95
- children: component.children,
96
- }),
97
- ];
98
- }
99
100
  addComponentOnMount(onRenderFile, function () {
100
101
  return this.emit('return ', (0, jsx_1.renderJSXNodes)(onRenderFile, directives, handlers, rootChildren, styles, {}), ';');
101
102
  }, componentName, component, useStyles);
102
- componentFile.exportConst(componentName, (0, src_generator_1.invoke)(componentFile.import(componentFile.qwikModule, 'componentQrl'), [generateQrl(componentFile, onRenderFile, componentName + '_onMount')], ['any', 'any']));
103
+ componentFile.exportConst(componentName, (0, src_generator_1.invoke)(componentFile.import(componentFile.qwikModule, 'componentQrl'), [generateQrl(componentFile, onRenderFile, componentName + 'OnMount')], ['any', 'any']));
103
104
  directives.forEach(function (code, name) {
104
105
  fileSet.med.import(fileSet.med.qwikModule, 'h');
105
106
  fileSet.med.exportConst(name, code, true);
@@ -108,7 +109,9 @@ function addComponent(fileSet, component, opts) {
108
109
  exports.addComponent = addComponent;
109
110
  function generateStyles(fromFile, dstFile, symbol, scoped) {
110
111
  return function () {
111
- this.emit((0, src_generator_1.invoke)(fromFile.import(fromFile.qwikModule, scoped ? 'withScopedStylesQrl' : 'useStylesQrl'), [generateQrl(fromFile, dstFile, symbol)]), ';');
112
+ this.emit((0, src_generator_1.invoke)(fromFile.import(fromFile.qwikModule, scoped ? 'useStylesScopedQrl' : 'useStylesQrl'), [
113
+ generateQrl(fromFile, dstFile, symbol),
114
+ ]), ';');
112
115
  };
113
116
  }
114
117
  function addBuilderBlockClass(children) {
@@ -138,10 +141,10 @@ function addComponentOnMount(componentFile, onRenderEmit, componentName, compone
138
141
  if (component.inputs) {
139
142
  component.inputs.forEach(function (input) {
140
143
  input.defaultValue !== undefined &&
141
- inputInitializer.push('if(!state.hasOwnProperty("', input.name, '"))state.', input.name, '=', JSON.stringify(input.defaultValue), ';');
144
+ inputInitializer.push('if(!state.hasOwnProperty("', input.name, '"))state.', input.name, '=', (0, stable_serialize_1.stableJSONserialize)(input.defaultValue), ';');
142
145
  });
143
146
  }
144
- componentFile.exportConst(componentName + '_onMount', function () {
147
+ componentFile.exportConst(componentName + 'OnMount', function () {
145
148
  var _this = this;
146
149
  this.emit((0, src_generator_1.arrowFnValue)(['props'], function () {
147
150
  var _a;
@@ -18,6 +18,7 @@ interface ImageProps {
18
18
  lazy?: boolean;
19
19
  class?: string;
20
20
  children?: any[];
21
+ noWebp?: boolean;
21
22
  }
22
23
  export declare function Image(props: ImageProps): any;
23
24
  export declare function __passThroughProps__(dstProps: Record<string, any>, srcProps: Record<string, any>): Record<string, any>;
@@ -5,6 +5,7 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.CoreButton = exports.__passThroughProps__ = exports.Image = exports.DIRECTIVES = void 0;
8
+ var for_1 = require("../../helpers/nodes/for");
8
9
  var minify_1 = require("../minify");
9
10
  var src_generator_1 = require("./src-generator");
10
11
  exports.DIRECTIVES = {
@@ -27,32 +28,28 @@ exports.DIRECTIVES = {
27
28
  });
28
29
  };
29
30
  },
30
- For: function (node, blockFn) {
31
+ For: function (_node, blockFn) {
31
32
  return function () {
32
33
  var _this = this;
33
34
  var _a;
35
+ var node = _node;
34
36
  var expr = (_a = node.bindings.each) === null || _a === void 0 ? void 0 : _a.code;
35
37
  this.jsxExpression(function () {
36
- var forName = node.properties._forName || '_';
37
- var indexName = node.properties._indexName;
38
- _this.emit('(', expr, '||[]).map(', '((', forName, indexName ? ',' : '', indexName ? indexName : '', ') => {');
38
+ var forArgs = (0, for_1.getForArguments)(node);
39
+ var forName = forArgs[0];
40
+ _this.emit('(', expr, '||[]).map(');
41
+ _this.isBuilder && _this.emit('(('), _this.emit('function(', forArgs, '){');
39
42
  if (_this.isBuilder) {
40
43
  _this.emit('var state=Object.assign({},this,{', (0, src_generator_1.iteratorProperty)(expr), ':', forName, '==null?{}:', forName, '});');
41
44
  }
42
45
  _this.emit('return(');
43
46
  blockFn();
44
- _this.emit(');}))');
47
+ _this.emit(');}');
48
+ _this.isBuilder && _this.emit(').bind(state))');
49
+ _this.emit(')');
45
50
  });
46
51
  };
47
52
  },
48
- Host: function (node, blockFn) {
49
- return function () {
50
- var host = this.file.import(this.file.qwikModule, 'Host').localName;
51
- this.jsxBegin(host, node.properties, node.bindings);
52
- blockFn();
53
- this.jsxEnd(host);
54
- };
55
- },
56
53
  Image: (0, minify_1.minify)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["", ""], ["", ""])), Image),
57
54
  CoreButton: (0, minify_1.minify)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["", ""], ["", ""])), CoreButton),
58
55
  __passThroughProps__: (0, minify_1.minify)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["", ""], ["", ""])), __passThroughProps__),
@@ -62,7 +59,7 @@ function Image(props) {
62
59
  var jsx = props.children || [];
63
60
  var image = props.image;
64
61
  if (image) {
65
- var isBuilderIoImage = !!(image || '').match(/\.builder\.io/);
62
+ var isBuilderIoImage = !!(image || '').match(/\.builder\.io/) && !props.noWebp;
66
63
  var isPixel = (_a = props.builderBlock) === null || _a === void 0 ? void 0 : _a.id.startsWith('builder-pixel-');
67
64
  var imgProps = {
68
65
  src: props.image,
@@ -13,4 +13,4 @@ import { CssStyles } from './styles';
13
13
  * @param root True if this is the root JSX, and may need a Fragment wrapper.
14
14
  * @returns
15
15
  */
16
- export declare function renderJSXNodes(file: File, directives: Map<string, string>, handlers: Map<string, string>, children: MitosisNode[], styles: Map<string, CssStyles>, parentSymbolBindings: Record<string, string>, root?: boolean): any;
16
+ export declare function renderJSXNodes(file: File, directives: Map<string, string>, handlers: Map<string, string>, children: MitosisNode[], styles: Map<string, CssStyles>, parentSymbolBindings: Record<string, string>, mutablePredicate?: (code: string) => boolean, root?: boolean): any;
@@ -36,7 +36,7 @@ var src_generator_1 = require("./src-generator");
36
36
  * @param root True if this is the root JSX, and may need a Fragment wrapper.
37
37
  * @returns
38
38
  */
39
- function renderJSXNodes(file, directives, handlers, children, styles, parentSymbolBindings, root) {
39
+ function renderJSXNodes(file, directives, handlers, children, styles, parentSymbolBindings, mutablePredicate, root) {
40
40
  if (root === void 0) { root = true; }
41
41
  return function () {
42
42
  var _this = this;
@@ -121,9 +121,9 @@ function renderJSXNodes(file, directives, handlers, children, styles, parentSymb
121
121
  }
122
122
  }
123
123
  var symbolBindings = {};
124
- var bindings = rewriteHandlers(file, handlers, child.bindings, symbolBindings);
124
+ var bindings = rewriteHandlers(file, handlers, child.bindings, symbolBindings, mutablePredicate);
125
125
  _this.jsxBegin(childName, props, __assign(__assign(__assign({}, bindings), parentSymbolBindings), specialBindings));
126
- renderJSXNodes(file, directives, handlers, child.children, styles, symbolBindings, false).call(_this);
126
+ renderJSXNodes(file, directives, handlers, child.children, styles, symbolBindings, mutablePredicate, false).call(_this);
127
127
  _this.jsxEnd(childName);
128
128
  }
129
129
  }
@@ -138,7 +138,7 @@ function renderJSXNodes(file, directives, handlers, children, styles, parentSymb
138
138
  children = children.filter(function (c) { return !isEmptyTextNode(c); });
139
139
  var childNeedsFragment = children.length > 1 || (children.length && isTextNode(children[0]));
140
140
  childNeedsFragment && srcBuilder.jsxBeginFragment(fragmentSymbol);
141
- renderJSXNodes(file, directives, handlers, children, styles, {}, false).call(srcBuilder);
141
+ renderJSXNodes(file, directives, handlers, children, styles, {}, mutablePredicate, false).call(srcBuilder);
142
142
  childNeedsFragment && srcBuilder.jsxEndFragment();
143
143
  };
144
144
  }
@@ -182,7 +182,7 @@ function isSlotProjection(child) {
182
182
  * @param symbolBindings Options record which will receive the symbol bindings
183
183
  * @returns
184
184
  */
185
- function rewriteHandlers(file, handlers, bindings, symbolBindings) {
185
+ function rewriteHandlers(file, handlers, bindings, symbolBindings, mutablePredicate) {
186
186
  var _a;
187
187
  var outBindings = {};
188
188
  for (var key in bindings) {
@@ -207,6 +207,10 @@ function rewriteHandlers(file, handlers, bindings, symbolBindings) {
207
207
  else if (key.startsWith('component.options.')) {
208
208
  key = (0, src_generator_1.lastProperty)(key);
209
209
  }
210
+ if (mutablePredicate && bindingExpr && mutablePredicate(bindingExpr)) {
211
+ file.import(file.qwikModule, 'mutable');
212
+ bindingExpr = "mutable(".concat(bindingExpr, ")");
213
+ }
210
214
  outBindings[key] = { code: bindingExpr };
211
215
  }
212
216
  }
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.iteratorProperty = exports.lastProperty = exports.isStatement = exports.iif = exports.arrowFnValue = exports.arrowFnBlock = exports.invoke = exports.quote = exports.Block = exports.Imports = exports.Symbol = exports.SrcBuilder = exports.File = void 0;
4
4
  var standalone_1 = require("prettier/standalone");
5
+ var builder_1 = require("../../parsers/builder");
6
+ var stable_serialize_1 = require("./stable-serialize");
5
7
  var File = /** @class */ (function () {
6
8
  function File(filename, options, qwikModule, qrlPrefix) {
7
9
  this.imports = new Imports();
@@ -320,7 +322,7 @@ var SrcBuilder = /** @class */ (function () {
320
322
  key = key + '$';
321
323
  binding_1 = "(event)=>".concat(binding_1);
322
324
  }
323
- if (!binding_1 && rawKey in props) {
325
+ else if (!binding_1 && rawKey in props) {
324
326
  binding_1 = quote(props[rawKey]);
325
327
  }
326
328
  else if (binding_1 != null && binding_1 === props[key]) {
@@ -356,6 +358,8 @@ var SrcBuilder = /** @class */ (function () {
356
358
  if (value) {
357
359
  if (key === 'innerHTML')
358
360
  key = 'dangerouslySetInnerHTML';
361
+ if (key === 'dataSet')
362
+ return; // ignore
359
363
  if (self.isJSX) {
360
364
  self.emit(' ', key, '=');
361
365
  if (typeof value == 'string' && value.startsWith('"') && value.endsWith('"')) {
@@ -476,7 +480,7 @@ function possiblyQuotePropertyName(key) {
476
480
  return /^\w[\w\d]*$/.test(key) ? key : quote(key);
477
481
  }
478
482
  function quote(text) {
479
- var string = JSON.stringify(text);
483
+ var string = (0, stable_serialize_1.stableJSONserialize)(text);
480
484
  // So \u2028 is a line separator character and prettier treats it as such
481
485
  // https://www.fileformat.info/info/unicode/char/2028/index.htm
482
486
  // That means it can't be inside of a string, so we replace it with `\\u2028`.
@@ -524,6 +528,9 @@ function iif(code) {
524
528
  if (code.endsWith(_virtual_index) && !code.endsWith(return_virtual_index)) {
525
529
  code = code.substr(0, code.length - _virtual_index.length) + return_virtual_index;
526
530
  }
531
+ if (code.indexOf('export') !== -1) {
532
+ code = (0, builder_1.convertExportDefaultToReturn)(code);
533
+ }
527
534
  return function () {
528
535
  code && this.emit('(()=>{', code, '})()');
529
536
  };
@@ -549,7 +556,8 @@ function literalTagName(symbol) {
549
556
  */
550
557
  function isStatement(code) {
551
558
  code = code.trim();
552
- if (code.startsWith('(') || code.startsWith('{') || code.endsWith('}')) {
559
+ if ((code.startsWith('(') && code.endsWith(')')) ||
560
+ (code.startsWith('{') && code.endsWith('}'))) {
553
561
  // Code starting with `(` is most likely and IFF and hence is an expression.
554
562
  return false;
555
563
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Same as JSON.stringify, but sorts keys ensuring that the output is stable across runs.
3
+ * @param obj
4
+ * @returns JSON serialized string
5
+ */
6
+ export declare function stableJSONserialize(obj: any): string;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stableJSONserialize = void 0;
4
+ /**
5
+ * Same as JSON.stringify, but sorts keys ensuring that the output is stable across runs.
6
+ * @param obj
7
+ * @returns JSON serialized string
8
+ */
9
+ function stableJSONserialize(obj) {
10
+ var output = [];
11
+ _serialize(output, obj);
12
+ return output.join('');
13
+ }
14
+ exports.stableJSONserialize = stableJSONserialize;
15
+ function _serialize(output, obj) {
16
+ if (obj == null) {
17
+ output.push('null');
18
+ }
19
+ else if (typeof obj === 'object') {
20
+ if (Array.isArray(obj)) {
21
+ output.push('[');
22
+ var sep = '';
23
+ for (var i = 0; i < obj.length; i++) {
24
+ output.push(sep);
25
+ _serialize(output, obj[i]);
26
+ sep = ',';
27
+ }
28
+ output.push(']');
29
+ }
30
+ else {
31
+ var keys = Object.keys(obj).sort();
32
+ output.push('{');
33
+ var sep = '';
34
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
35
+ var key = keys_1[_i];
36
+ var value = obj[key];
37
+ if (value !== undefined) {
38
+ output.push(sep);
39
+ output.push(JSON.stringify(key));
40
+ output.push(':');
41
+ _serialize(output, value);
42
+ sep = ',';
43
+ }
44
+ }
45
+ output.push('}');
46
+ }
47
+ }
48
+ else {
49
+ output.push(JSON.stringify(obj));
50
+ }
51
+ }
@@ -0,0 +1,6 @@
1
+ import { TranspilerGenerator } from '../../types/transpiler';
2
+ import { MitosisNode } from '../../types/mitosis-node';
3
+ import { ToReactOptions } from './types';
4
+ export declare const blockToReact: (json: MitosisNode, options: ToReactOptions, parentSlots?: any[]) => string;
5
+ export declare const componentToPreact: TranspilerGenerator<ToReactOptions>;
6
+ export declare const componentToReact: TranspilerGenerator<ToReactOptions>;