@builder.io/mitosis 0.0.93 → 0.0.95

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 (51) hide show
  1. package/dist/src/generators/builder.js +0 -1
  2. package/dist/src/generators/context/qwik.js +1 -1
  3. package/dist/src/generators/mitosis.js +2 -1
  4. package/dist/src/generators/qwik/component-generator.js +80 -163
  5. package/dist/src/generators/qwik/component.js +3 -3
  6. package/dist/src/generators/qwik/{add-prevent-default.d.ts → helpers/add-prevent-default.d.ts} +1 -1
  7. package/dist/src/generators/qwik/{add-prevent-default.js → helpers/add-prevent-default.js} +1 -1
  8. package/dist/src/generators/qwik/helpers/convert-method-to-function.d.ts +2 -0
  9. package/dist/src/generators/qwik/{convert-method-to-function.js → helpers/convert-method-to-function.js} +0 -1
  10. package/dist/src/generators/qwik/helpers/handlers.d.ts +3 -0
  11. package/dist/src/generators/qwik/{handlers.js → helpers/handlers.js} +3 -4
  12. package/dist/src/generators/qwik/helpers/state.d.ts +27 -0
  13. package/dist/src/generators/qwik/helpers/state.js +116 -0
  14. package/dist/src/generators/qwik/{styles.d.ts → helpers/styles.d.ts} +2 -2
  15. package/dist/src/generators/qwik/{styles.js → helpers/styles.js} +1 -1
  16. package/dist/src/generators/qwik/jsx.d.ts +1 -1
  17. package/dist/src/generators/qwik/jsx.js +3 -1
  18. package/dist/src/generators/qwik/src-generator.d.ts +0 -4
  19. package/dist/src/generators/qwik/src-generator.js +8 -13
  20. package/dist/src/generators/react/generator.js +2 -1
  21. package/dist/src/generators/{react-native.d.ts → react-native/index.d.ts} +3 -3
  22. package/dist/src/generators/{react-native.js → react-native/index.js} +46 -35
  23. package/dist/src/generators/react-native/sanitize-react-native-block-styles.d.ts +3 -0
  24. package/dist/src/generators/react-native/sanitize-react-native-block-styles.js +63 -0
  25. package/dist/src/generators/solid/index.js +4 -1
  26. package/dist/src/generators/svelte/svelte.js +13 -1
  27. package/dist/src/generators/vue/helpers.js +1 -1
  28. package/dist/src/helpers/babel-transform.d.ts +3 -3
  29. package/dist/src/helpers/babel-transform.js +42 -26
  30. package/dist/src/helpers/is-root-text-node.d.ts +4 -0
  31. package/dist/src/helpers/is-root-text-node.js +12 -0
  32. package/dist/src/helpers/map-refs.js +2 -26
  33. package/dist/src/helpers/parsers.js +11 -5
  34. package/dist/src/helpers/patterns.d.ts +1 -0
  35. package/dist/src/helpers/patterns.js +3 -1
  36. package/dist/src/helpers/plugins/process-code.d.ts +1 -1
  37. package/dist/src/helpers/plugins/process-code.js +9 -9
  38. package/dist/src/helpers/render-imports.js +1 -0
  39. package/dist/src/parsers/jsx/component-types.d.ts +2 -2
  40. package/dist/src/parsers/jsx/component-types.js +7 -16
  41. package/dist/src/parsers/jsx/index.d.ts +1 -1
  42. package/dist/src/parsers/jsx/index.js +3 -16
  43. package/dist/src/parsers/jsx/jsx.js +17 -22
  44. package/dist/tsconfig.build.tsbuildinfo +1 -1
  45. package/package.json +3 -3
  46. package/dist/src/generators/qwik/convert-method-to-function.d.ts +0 -1
  47. package/dist/src/generators/qwik/handlers.d.ts +0 -4
  48. /package/dist/src/generators/qwik/{stable-inject.d.ts → helpers/stable-inject.d.ts} +0 -0
  49. /package/dist/src/generators/qwik/{stable-inject.js → helpers/stable-inject.js} +0 -0
  50. /package/dist/src/generators/qwik/{stable-serialize.d.ts → helpers/stable-serialize.d.ts} +0 -0
  51. /package/dist/src/generators/qwik/{stable-serialize.js → helpers/stable-serialize.js} +0 -0
@@ -64,10 +64,6 @@ export declare class Imports {
64
64
  get(moduleName: string, symbolName: string, as?: string): Symbol;
65
65
  hasImport(localName: string): boolean;
66
66
  }
67
- export declare class Block {
68
- imports: Imports;
69
- constructor(imports: Imports);
70
- }
71
67
  export declare function quote(text: string): string;
72
68
  export declare function invoke(symbol: Symbol | string, args: any[], typeParameters?: string[]): (this: SrcBuilder) => void;
73
69
  export declare function arrowFnBlock(args: string[], statements: any[], argTypes?: string[]): (this: SrcBuilder) => void;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.iteratorProperty = exports.lastProperty = exports.isStatement = exports.iif = exports.arrowFnValue = exports.arrowFnBlock = exports.invoke = exports.quote = exports.Imports = exports.Symbol = exports.SrcBuilder = exports.File = void 0;
4
4
  var standalone_1 = require("prettier/standalone");
5
5
  var jsx_1 = require("../../parsers/jsx");
6
6
  var builder_1 = require("../../parsers/builder");
7
- var stable_serialize_1 = require("./stable-serialize");
7
+ var stable_serialize_1 = require("./helpers/stable-serialize");
8
8
  var File = /** @class */ (function () {
9
9
  function File(filename, options, qwikModule, qrlPrefix) {
10
10
  this.imports = new Imports();
@@ -111,7 +111,6 @@ function removeExt(filename) {
111
111
  var indx = filename.lastIndexOf('.');
112
112
  return indx == -1 ? filename : filename.substr(0, indx);
113
113
  }
114
- var spaces = [''];
115
114
  var SrcBuilder = /** @class */ (function () {
116
115
  function SrcBuilder(file, options) {
117
116
  this.buf = [];
@@ -373,8 +372,6 @@ var SrcBuilder = /** @class */ (function () {
373
372
  if (value) {
374
373
  if (key === 'innerHTML')
375
374
  key = 'dangerouslySetInnerHTML';
376
- if (key === 'for')
377
- key = 'htmlFor';
378
375
  if (key === 'dataSet')
379
376
  return; // ignore
380
377
  if (self.isJSX) {
@@ -494,13 +491,6 @@ function ignoreKey(key) {
494
491
  key == '' ||
495
492
  key.indexOf('.') !== -1);
496
493
  }
497
- var Block = /** @class */ (function () {
498
- function Block(imports) {
499
- this.imports = imports;
500
- }
501
- return Block;
502
- }());
503
- exports.Block = Block;
504
494
  function possiblyQuotePropertyName(key) {
505
495
  return /^\w[\w\d]*$/.test(key) ? key : quote(key);
506
496
  }
@@ -580,10 +570,15 @@ function literalTagName(symbol) {
580
570
  * it is not 100% but a good enough approximation
581
571
  */
582
572
  function isStatement(code) {
573
+ // remove trailing `!` as it is used to mark a non-null assertion in TS
574
+ // it messes up the logic afterwards
575
+ if (code.endsWith('!')) {
576
+ code = code.substr(0, code.length - 1);
577
+ }
583
578
  code = code.trim();
584
579
  if ((code.startsWith('(') && code.endsWith(')')) ||
585
580
  (code.startsWith('{') && code.endsWith('}'))) {
586
- // Code starting with `(` is most likely and IFF and hence is an expression.
581
+ // Code starting with `(` is most likely an IFF and hence is an expression.
587
582
  return false;
588
583
  }
589
584
  var codeNoStrings = code.replace(STRING_LITERAL, 'STRING_LITERAL');
@@ -48,11 +48,11 @@ var bindings_1 = require("../../helpers/bindings");
48
48
  var blocks_1 = require("./blocks");
49
49
  var merge_options_1 = require("../../helpers/merge-options");
50
50
  var replace_new_lines_in_strings_1 = require("../../helpers/replace-new-lines-in-strings");
51
+ var is_root_text_node_1 = require("../../helpers/is-root-text-node");
51
52
  exports.contextPropDrillingKey = '_context';
52
53
  /**
53
54
  * If the root Mitosis component only has 1 child, and it is a `Show`/`For` node, then we need to wrap it in a fragment.
54
55
  * Otherwise, we end up with invalid React render code.
55
- *
56
56
  */
57
57
  var isRootSpecialNode = function (json) {
58
58
  return json.children.length === 1 && ['Show', 'For'].includes(json.children[0].name);
@@ -278,6 +278,7 @@ var _componentToReact = function (json, options, isSubComponent) {
278
278
  reactLibImports.add('useEffect');
279
279
  }
280
280
  var wrap = (0, helpers_2.wrapInFragment)(json) ||
281
+ (0, is_root_text_node_1.isRootTextNode)(json) ||
281
282
  (componentHasStyles &&
282
283
  (options.stylesType === 'styled-jsx' || options.stylesType === 'style-tag')) ||
283
284
  isRootSpecialNode(json);
@@ -1,6 +1,6 @@
1
- import { ClassStyleMap } from '../helpers/styles/helpers';
2
- import { MitosisComponent } from '../types/mitosis-component';
3
- import { BaseTranspilerOptions, TranspilerGenerator } from '../types/transpiler';
1
+ import { ClassStyleMap } from '../../helpers/styles/helpers';
2
+ import { MitosisComponent } from '../../types/mitosis-component';
3
+ import { BaseTranspilerOptions, TranspilerGenerator } from '../../types/transpiler';
4
4
  export interface ToReactNativeOptions extends BaseTranspilerOptions {
5
5
  stylesType: 'emotion' | 'react-native';
6
6
  stateType: 'useState' | 'mobx' | 'valtio' | 'solid' | 'builder';
@@ -17,57 +17,68 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.componentToReactNative = exports.collectReactNativeStyles = void 0;
18
18
  var json5_1 = __importDefault(require("json5"));
19
19
  var lodash_1 = require("lodash");
20
- var fast_clone_1 = require("../helpers/fast-clone");
20
+ var fast_clone_1 = require("../../helpers/fast-clone");
21
21
  var traverse_1 = __importDefault(require("traverse"));
22
- var is_mitosis_node_1 = require("../helpers/is-mitosis-node");
23
- var react_1 = require("./react");
24
- var bindings_1 = require("../helpers/bindings");
25
- var merge_options_1 = require("../helpers/merge-options");
26
- var is_children_1 = __importDefault(require("../helpers/is-children"));
22
+ var is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
23
+ var react_1 = require("../react");
24
+ var bindings_1 = require("../../helpers/bindings");
25
+ var merge_options_1 = require("../../helpers/merge-options");
26
+ var is_children_1 = __importDefault(require("../../helpers/is-children"));
27
+ var sanitize_react_native_block_styles_1 = require("./sanitize-react-native-block-styles");
27
28
  var stylePropertiesThatMustBeNumber = new Set(['lineHeight']);
28
29
  var MEDIA_QUERY_KEY_REGEX = /^@media.*/;
30
+ var sanitizeStyle = function (obj) { return function (key, value) {
31
+ var propertyValue = obj[key];
32
+ if (key.match(MEDIA_QUERY_KEY_REGEX)) {
33
+ console.warn('Unsupported: skipping media queries for react-native: ', key, propertyValue);
34
+ delete obj[key];
35
+ return;
36
+ }
37
+ }; };
29
38
  var collectReactNativeStyles = function (json) {
30
39
  var styleMap = {};
31
40
  var componentIndexes = {};
41
+ var getStyleSheetName = function (item) {
42
+ var componentName = (0, lodash_1.camelCase)(item.name || 'view');
43
+ // If we have already seen this component name, we will increment the index. Otherwise, we will set the index to 1.
44
+ var index = (componentIndexes[componentName] = (componentIndexes[componentName] || 0) + 1);
45
+ return "".concat(componentName).concat(index);
46
+ };
32
47
  (0, traverse_1.default)(json).forEach(function (item) {
33
- var _a, _b;
34
- if (!(0, is_mitosis_node_1.isMitosisNode)(item) || typeof ((_a = item.bindings.css) === null || _a === void 0 ? void 0 : _a.code) !== 'string') {
48
+ var _a, _b, _c;
49
+ if (!(0, is_mitosis_node_1.isMitosisNode)(item)) {
35
50
  return;
36
51
  }
37
- var value = json5_1.default.parse(item.bindings.css.code);
52
+ var cssValue = json5_1.default.parse(((_a = item.bindings.css) === null || _a === void 0 ? void 0 : _a.code) || '{}');
38
53
  delete item.bindings.css;
39
- if (!(0, lodash_1.size)(value)) {
40
- return;
41
- }
42
- // Style properties like `"20px"` need to be numbers like `20` for react native
43
- for (var key in value) {
44
- var propertyValue = value[key];
45
- if (key.match(MEDIA_QUERY_KEY_REGEX)) {
46
- console.warn('Unsupported: skipping media queries for react-native: ', key, propertyValue);
47
- delete value[key];
48
- continue;
49
- }
50
- if (stylePropertiesThatMustBeNumber.has(key) && typeof propertyValue !== 'number') {
51
- console.warn("Style key ".concat(key, " must be a number, but had value `").concat(propertyValue, "`"));
52
- delete value[key];
53
- continue;
54
+ if ((0, lodash_1.size)(cssValue)) {
55
+ // Style properties like `"20px"` need to be numbers like `20` for react native
56
+ for (var key in cssValue) {
57
+ sanitizeStyle(cssValue)(key, cssValue[key]);
58
+ cssValue = (0, sanitize_react_native_block_styles_1.sanitizeReactNativeBlockStyles)(cssValue);
54
59
  }
55
- // convert strings to number if applicable
56
- if (typeof propertyValue === 'string' && propertyValue.match(/^\d/)) {
57
- var newValue = parseFloat(propertyValue);
58
- if (!isNaN(newValue)) {
59
- value[key] = newValue;
60
+ }
61
+ try {
62
+ var styleValue = json5_1.default.parse(((_b = item.bindings.style) === null || _b === void 0 ? void 0 : _b.code) || '{}');
63
+ if ((0, lodash_1.size)(styleValue)) {
64
+ // Style properties like `"20px"` need to be numbers like `20` for react native
65
+ for (var key in styleValue) {
66
+ sanitizeStyle(styleValue)(key, styleValue[key]);
67
+ styleValue = (0, sanitize_react_native_block_styles_1.sanitizeReactNativeBlockStyles)(styleValue);
60
68
  }
69
+ item.bindings.style.code = json5_1.default.stringify(styleValue);
61
70
  }
62
71
  }
63
- var componentName = (0, lodash_1.camelCase)(item.name || 'view');
64
- var index = (componentIndexes[componentName] = (componentIndexes[componentName] || 0) + 1);
65
- var className = "".concat(componentName).concat(index);
66
- var styleSheetName = "styles.".concat(className);
72
+ catch (e) { }
73
+ if (!(0, lodash_1.size)(cssValue)) {
74
+ return;
75
+ }
76
+ var styleSheetName = getStyleSheetName(item);
77
+ var styleSheetAccess = "styles.".concat(styleSheetName);
67
78
  item.bindings.style = (0, bindings_1.createSingleBinding)({
68
- code: ((_b = item.bindings.style) === null || _b === void 0 ? void 0 : _b.code.replace(/}$/, ", ...".concat(styleSheetName, " }"))) || styleSheetName,
79
+ code: ((_c = item.bindings.style) === null || _c === void 0 ? void 0 : _c.code.replace(/}$/, ", ...".concat(styleSheetAccess, " }"))) || styleSheetAccess,
69
80
  });
70
- styleMap[className] = value;
81
+ styleMap[styleSheetName] = cssValue;
71
82
  });
72
83
  return styleMap;
73
84
  };
@@ -0,0 +1,3 @@
1
+ declare type Styles = Record<string, string | number>;
2
+ export declare const sanitizeReactNativeBlockStyles: (styles: Styles) => Styles;
3
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.sanitizeReactNativeBlockStyles = void 0;
15
+ var propertiesThatMustBeNumber = new Set(['lineHeight']);
16
+ var displayValues = new Set(['flex', 'none']);
17
+ var normalizeNumber = function (value) {
18
+ if (Number.isNaN(value)) {
19
+ return undefined;
20
+ }
21
+ else if (value < 0) {
22
+ // TODO: why are negative values not allowed?
23
+ return 0;
24
+ }
25
+ else {
26
+ return value;
27
+ }
28
+ };
29
+ var sanitizeReactNativeBlockStyles = function (styles) {
30
+ return Object.keys(styles).reduce(function (acc, key) {
31
+ var _a, _b, _c;
32
+ var propertyValue = styles[key];
33
+ if (key === 'display' && !displayValues.has(propertyValue)) {
34
+ console.warn("Style value for key \"display\" must be \"flex\" or \"none\" but had ".concat(propertyValue));
35
+ return acc;
36
+ }
37
+ if (propertiesThatMustBeNumber.has(key) && typeof propertyValue !== 'number') {
38
+ console.warn("Style key ".concat(key, " must be a number, but had value `").concat(styles[key], "`"));
39
+ return acc;
40
+ }
41
+ if (typeof propertyValue === 'string') {
42
+ // `px` units need to be stripped and replaced with numbers
43
+ // https://regexr.com/6ualn
44
+ var isPixelUnit = propertyValue.match(/^-?(\d*)(\.?)(\d*)*px$/);
45
+ if (isPixelUnit) {
46
+ var newValue = parseFloat(propertyValue);
47
+ var normalizedValue = normalizeNumber(newValue);
48
+ if (normalizedValue) {
49
+ return __assign(__assign({}, acc), (_a = {}, _a[key] = normalizedValue, _a));
50
+ }
51
+ else {
52
+ return acc;
53
+ }
54
+ }
55
+ else if (propertyValue === '0') {
56
+ // 0 edge case needs to be handled
57
+ return __assign(__assign({}, acc), (_b = {}, _b[key] = 0, _b));
58
+ }
59
+ }
60
+ return __assign(__assign({}, acc), (_c = {}, _c[key] = propertyValue, _c));
61
+ }, {});
62
+ };
63
+ exports.sanitizeReactNativeBlockStyles = sanitizeReactNativeBlockStyles;
@@ -77,6 +77,7 @@ var process_code_1 = require("../../helpers/plugins/process-code");
77
77
  var context_1 = require("../helpers/context");
78
78
  var blocks_1 = require("./blocks");
79
79
  var bindings_1 = require("../../helpers/bindings");
80
+ var is_root_text_node_1 = require("../../helpers/is-root-text-node");
80
81
  // Transform <foo.bar key={value} /> to <Dynamic compnent={foo.bar} key={value} />
81
82
  function processDynamicComponents(json, options) {
82
83
  var found = false;
@@ -152,7 +153,9 @@ var componentToSolid = function (passedOptions) {
152
153
  }
153
154
  addProviderComponents(json, options);
154
155
  var componentHasStyles = (0, helpers_1.hasCss)(json);
155
- var addWrapper = json.children.filter(filter_empty_text_nodes_1.filterEmptyTextNodes).length !== 1 || options.stylesType === 'style-tag';
156
+ var addWrapper = json.children.filter(filter_empty_text_nodes_1.filterEmptyTextNodes).length !== 1 ||
157
+ options.stylesType === 'style-tag' ||
158
+ (0, is_root_text_node_1.isRootTextNode)(json);
156
159
  // we need to run this before we run the code processor plugin, so the dynamic component variables are transformed
157
160
  var foundDynamicComponents = processDynamicComponents(json, options);
158
161
  if (options.plugins) {
@@ -109,6 +109,18 @@ var componentToSvelte = function (userProvidedOptions) {
109
109
  var component = _a.component;
110
110
  var options = (0, merge_options_1.mergeOptions)(DEFAULT_OPTIONS, userProvidedOptions);
111
111
  options.plugins = __spreadArray(__spreadArray([], (options.plugins || []), true), [
112
+ // Strip types from any JS code that ends up in the template, because Svelte does not support TS code in templates.
113
+ (0, process_code_1.CODE_PROCESSOR_PLUGIN)(function (codeType) {
114
+ switch (codeType) {
115
+ case 'bindings':
116
+ case 'properties':
117
+ return babel_transform_1.convertTypeScriptToJS;
118
+ case 'hooks':
119
+ case 'hooks-deps':
120
+ case 'state':
121
+ return function (x) { return x; };
122
+ }
123
+ }),
112
124
  (0, process_code_1.CODE_PROCESSOR_PLUGIN)(function (codeType) {
113
125
  switch (codeType) {
114
126
  case 'hooks':
@@ -251,7 +263,7 @@ var componentToSvelte = function (userProvidedOptions) {
251
263
  }
252
264
  catch (err) {
253
265
  console.warn('Could not prettify');
254
- console.warn({ string: str }, err);
266
+ console.warn(str, err);
255
267
  }
256
268
  }
257
269
  str = str.replace(/<script>\n<\/script>/g, '').trim();
@@ -196,7 +196,7 @@ var processBinding = function (_a) {
196
196
  });
197
197
  }
198
198
  catch (e) {
199
- console.log('could not process bindings in ', { code: code });
199
+ console.error('could not process bindings in ', { code: code });
200
200
  throw e;
201
201
  }
202
202
  };
@@ -1,7 +1,7 @@
1
1
  import * as babel from '@babel/core';
2
2
  import type { Visitor } from '@babel/traverse';
3
- export declare const babelTransform: <VisitorContextType = any>(code: string, visitor?: babel.Visitor<VisitorContextType> | undefined) => babel.BabelFileResult | null;
4
- export declare const babelTransformCode: <VisitorContextType = any>(code: string, visitor?: babel.Visitor<VisitorContextType> | undefined) => string;
3
+ export declare const babelTransformCode: <VisitorContextType = any>(code: string, visitor?: babel.Visitor<VisitorContextType> | undefined, stripTypes?: boolean) => string;
5
4
  declare type ExpressionType = 'expression' | 'unknown' | 'block' | 'functionBody';
6
- export declare const babelTransformExpression: <VisitorContextType = any>(code: string, visitor: babel.Visitor<VisitorContextType>, initialType?: ExpressionType) => string;
5
+ export declare const babelTransformExpression: <VisitorContextType = any>(code: string, visitor: babel.Visitor<VisitorContextType>, initialType?: ExpressionType, stripTypes?: boolean) => string;
6
+ export declare const convertTypeScriptToJS: (code: string) => string;
7
7
  export {};
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
14
  if (k2 === undefined) k2 = k;
4
15
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -31,16 +42,19 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
31
42
  }
32
43
  return to.concat(ar || Array.prototype.slice.call(from));
33
44
  };
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
34
48
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.babelTransformExpression = exports.babelTransformCode = exports.babelTransform = void 0;
49
+ exports.convertTypeScriptToJS = exports.babelTransformExpression = exports.babelTransformCode = void 0;
50
+ var preset_typescript_1 = __importDefault(require("@babel/preset-typescript"));
36
51
  var babel = __importStar(require("@babel/core"));
37
- var jsxPlugin = require('@babel/plugin-syntax-jsx');
38
- var tsPreset = require('@babel/preset-typescript');
39
- var decorators = require('@babel/plugin-syntax-decorators');
52
+ var plugin_syntax_typescript_1 = __importDefault(require("@babel/plugin-syntax-typescript"));
53
+ var plugin_syntax_decorators_1 = __importDefault(require("@babel/plugin-syntax-decorators"));
40
54
  var function_1 = require("fp-ts/lib/function");
41
55
  var patterns_1 = require("./patterns");
42
56
  var handleErrorOrExpression = function (_a) {
43
- var code = _a.code, useCode = _a.useCode, result = _a.result, visitor = _a.visitor;
57
+ var code = _a.code, useCode = _a.useCode, result = _a.result, visitor = _a.visitor, stripTypes = _a.stripTypes;
44
58
  try {
45
59
  // If it can't, e.g. this is an expression or code fragment, modify the code below and try again
46
60
  // Detect method fragments. These get passed sometimes and otherwise
@@ -55,7 +69,7 @@ var handleErrorOrExpression = function (_a) {
55
69
  // Parse the code as an expression (instead of the default, a block) by giving it a fake variable assignment
56
70
  // e.g. if the code parsed is { ... } babel will treat that as a block by deafult, unless processed as an expression
57
71
  // that is an object
58
- "let _ = ".concat(useCode), function (code) { return (0, exports.babelTransformCode)(code, visitor); }, trimSemicolons,
72
+ "let _ = ".concat(useCode), function (code) { return (0, exports.babelTransformCode)(code, visitor, stripTypes); }, trimSemicolons,
59
73
  // Remove our fake variable assignment
60
74
  function (str) { return str.replace(/let _ =\s/, ''); });
61
75
  if (isMethodOrGetter) {
@@ -68,18 +82,18 @@ var handleErrorOrExpression = function (_a) {
68
82
  throw err;
69
83
  }
70
84
  };
71
- var babelTransform = function (code, visitor) {
72
- return babel.transform(code, {
73
- sourceFileName: 'file.tsx',
74
- configFile: false,
75
- babelrc: false,
76
- presets: [[tsPreset, { isTSX: true, allExtensions: true }]],
77
- parserOpts: { allowReturnOutsideFunction: true },
78
- plugins: __spreadArray([[decorators, { legacy: true }], jsxPlugin], (visitor ? [function () { return ({ visitor: visitor }); }] : []), true),
79
- });
85
+ var babelTransform = function (_a) {
86
+ var code = _a.code, visitor = _a.visitor, stripTypes = _a.stripTypes;
87
+ return babel.transform(code, __assign(__assign({ sourceFileName: 'file.tsx', configFile: false, babelrc: false, parserOpts: { allowReturnOutsideFunction: true } }, (stripTypes ? { presets: [[preset_typescript_1.default, { isTSX: true, allExtensions: true }]] } : {})), { plugins: __spreadArray([
88
+ [plugin_syntax_typescript_1.default, { isTSX: true }],
89
+ [plugin_syntax_decorators_1.default, { legacy: true }]
90
+ ], (visitor ? [function () { return ({ visitor: visitor }); }] : []), true) }));
91
+ };
92
+ var babelTransformCode = function (code, visitor, stripTypes) {
93
+ var _a;
94
+ if (stripTypes === void 0) { stripTypes = false; }
95
+ return ((_a = babelTransform({ code: code, visitor: visitor, stripTypes: stripTypes })) === null || _a === void 0 ? void 0 : _a.code) || '';
80
96
  };
81
- exports.babelTransform = babelTransform;
82
- var babelTransformCode = function (code, visitor) { var _a; return ((_a = (0, exports.babelTransform)(code, visitor)) === null || _a === void 0 ? void 0 : _a.code) || ''; };
83
97
  exports.babelTransformCode = babelTransformCode;
84
98
  // Babel adds trailing semicolons, but for expressions we need those gone
85
99
  // TODO: maybe detect if the original code ended with one, and keep it if so, for the case
@@ -106,14 +120,14 @@ var getType = function (code, initialType) {
106
120
  }
107
121
  return initialType;
108
122
  };
109
- var babelTransformExpression = function (code, visitor, initialType) {
123
+ var babelTransformExpression = function (code, visitor, initialType, stripTypes) {
110
124
  if (initialType === void 0) { initialType = 'unknown'; }
125
+ if (stripTypes === void 0) { stripTypes = false; }
111
126
  if (!code) {
112
127
  return '';
113
128
  }
114
129
  var isGetter = code.trim().startsWith('get ');
115
- return (0, function_1.pipe)(code, function (code) {
116
- code = isGetter ? code.replace('get', 'function ') : code;
130
+ return (0, function_1.pipe)(code, isGetter ? patterns_1.replaceGetterWithFunction : function_1.identity, function (code) {
117
131
  var type = getType(code, initialType);
118
132
  var useCode = type === 'functionBody' ? "function(){".concat(code, "}") : code;
119
133
  return { type: type, useCode: useCode };
@@ -121,17 +135,19 @@ var babelTransformExpression = function (code, visitor, initialType) {
121
135
  var type = _a.type, useCode = _a.useCode;
122
136
  if (type !== 'expression') {
123
137
  try {
124
- return (0, function_1.pipe)((0, exports.babelTransformCode)(useCode, visitor), trimExpression(type));
138
+ return (0, function_1.pipe)((0, exports.babelTransformCode)(useCode, visitor, stripTypes), trimExpression(type));
125
139
  }
126
140
  catch (error) {
127
- return handleErrorOrExpression({ code: code, useCode: useCode, result: null, visitor: visitor });
141
+ return handleErrorOrExpression({ code: code, useCode: useCode, result: null, visitor: visitor, stripTypes: stripTypes });
128
142
  }
129
143
  }
130
144
  else {
131
- return handleErrorOrExpression({ code: code, useCode: useCode, result: null, visitor: visitor });
145
+ return handleErrorOrExpression({ code: code, useCode: useCode, result: null, visitor: visitor, stripTypes: stripTypes });
132
146
  }
133
- }, function (transformed) {
134
- return isGetter ? transformed.replace('function ', 'get ') : transformed;
135
- });
147
+ }, isGetter ? patterns_1.replaceFunctionWithGetter : function_1.identity);
136
148
  };
137
149
  exports.babelTransformExpression = babelTransformExpression;
150
+ var convertTypeScriptToJS = function (code) {
151
+ return (0, exports.babelTransformExpression)(code, {}, 'unknown', true);
152
+ };
153
+ exports.convertTypeScriptToJS = convertTypeScriptToJS;
@@ -0,0 +1,4 @@
1
+ import { MitosisNode } from '../types/mitosis-node';
2
+ import { MitosisComponent } from '../types/mitosis-component';
3
+ export declare function isRootTextNode(json: MitosisComponent): boolean;
4
+ export declare function isTextNode(node: MitosisNode): boolean;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTextNode = exports.isRootTextNode = void 0;
4
+ function isRootTextNode(json) {
5
+ var firstChild = json.children[0];
6
+ return Boolean(firstChild && isTextNode(firstChild));
7
+ }
8
+ exports.isRootTextNode = isRootTextNode;
9
+ function isTextNode(node) {
10
+ return Boolean(node.properties._text || node.bindings._text);
11
+ }
12
+ exports.isTextNode = isTextNode;
@@ -10,48 +10,24 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || function (mod) {
30
- if (mod && mod.__esModule) return mod;
31
- var result = {};
32
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
- __setModuleDefault(result, mod);
34
- return result;
35
- };
36
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
37
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
15
  };
39
16
  Object.defineProperty(exports, "__esModule", { value: true });
40
17
  exports.mapRefs = void 0;
41
18
  var traverse_1 = __importDefault(require("traverse"));
42
- var babel = __importStar(require("@babel/core"));
19
+ var core_1 = require("@babel/core");
43
20
  var get_refs_1 = require("./get-refs");
44
21
  var is_mitosis_node_1 = require("./is-mitosis-node");
45
22
  var babel_transform_1 = require("./babel-transform");
46
23
  var patterns_1 = require("./patterns");
47
- var tsPreset = require('@babel/preset-typescript');
48
24
  var replaceRefsInString = function (code, refs, mapper) {
49
25
  return (0, babel_transform_1.babelTransformExpression)(code, {
50
26
  Identifier: function (path) {
51
27
  var name = path.node.name;
52
28
  var isRef = refs.includes(name);
53
29
  if (isRef) {
54
- path.replaceWith(babel.types.identifier(mapper(name)));
30
+ path.replaceWith(core_1.types.identifier(mapper(name)));
55
31
  }
56
32
  },
57
33
  });
@@ -22,16 +22,22 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
25
28
  Object.defineProperty(exports, "__esModule", { value: true });
26
29
  exports.isCodeBodyIdentifier = exports.isExpression = exports.isCodeBodyExpression = exports.parseCode = void 0;
27
30
  var babel = __importStar(require("@babel/core"));
28
- var jsxPlugin = require('@babel/plugin-syntax-jsx');
29
- var tsPreset = require('@babel/preset-typescript');
30
- var decorators = require('@babel/plugin-syntax-decorators');
31
+ var plugin_syntax_typescript_1 = __importDefault(require("@babel/plugin-syntax-typescript"));
32
+ var preset_typescript_1 = __importDefault(require("@babel/preset-typescript"));
33
+ var plugin_syntax_decorators_1 = __importDefault(require("@babel/plugin-syntax-decorators"));
31
34
  function parseCode(code) {
32
35
  var ast = babel.parse(code, {
33
- presets: [[tsPreset, { isTSX: true, allExtensions: true }]],
34
- plugins: [[decorators, { legacy: true }], jsxPlugin],
36
+ presets: [[preset_typescript_1.default, { isTSX: true, allExtensions: true }]],
37
+ plugins: [
38
+ [plugin_syntax_typescript_1.default, { isTSX: true }],
39
+ [plugin_syntax_decorators_1.default, { legacy: true }],
40
+ ],
35
41
  });
36
42
  var body = babel.types.isFile(ast)
37
43
  ? ast.program.body
@@ -3,4 +3,5 @@ export declare const SETTER: RegExp;
3
3
  export declare const checkIsGetter: (code: string) => RegExpMatchArray | null;
4
4
  export declare const stripGetter: (str: string) => string;
5
5
  export declare const replaceGetterWithFunction: (str: string) => string;
6
+ export declare const replaceFunctionWithGetter: (str: string) => string;
6
7
  export declare const prefixWithFunction: (str: string) => string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.prefixWithFunction = exports.replaceGetterWithFunction = exports.stripGetter = exports.checkIsGetter = exports.SETTER = exports.GETTER = void 0;
3
+ exports.prefixWithFunction = exports.replaceFunctionWithGetter = exports.replaceGetterWithFunction = exports.stripGetter = exports.checkIsGetter = exports.SETTER = exports.GETTER = void 0;
4
4
  exports.GETTER = /^\s*get /;
5
5
  exports.SETTER = /^\s*set /;
6
6
  var checkIsGetter = function (code) { return code.match(exports.GETTER); };
@@ -9,5 +9,7 @@ var stripGetter = function (str) { return str.replace(exports.GETTER, ''); };
9
9
  exports.stripGetter = stripGetter;
10
10
  var replaceGetterWithFunction = function (str) { return str.replace(/^(get )?/, 'function '); };
11
11
  exports.replaceGetterWithFunction = replaceGetterWithFunction;
12
+ var replaceFunctionWithGetter = function (str) { return str.replace(/^(function )?/, 'get '); };
13
+ exports.replaceFunctionWithGetter = replaceFunctionWithGetter;
12
14
  var prefixWithFunction = function (str) { return "function ".concat(str); };
13
15
  exports.prefixWithFunction = prefixWithFunction;
@@ -1,7 +1,7 @@
1
1
  import { Plugin } from '../../types/plugins';
2
2
  import { MitosisComponent } from '../../types/mitosis-component';
3
3
  declare type CodeType = 'hooks' | 'hooks-deps' | 'bindings' | 'properties' | 'state';
4
- declare function codeProcessor(codeType: CodeType): (code: string, hookType?: keyof MitosisComponent['hooks']) => string;
4
+ declare function codeProcessor(codeType: CodeType, json: MitosisComponent): (code: string, hookType: string) => string;
5
5
  declare type CodeProcessor = typeof codeProcessor;
6
6
  /**
7
7
  * Given a `codeProcessor` function, processes all code expressions within a Mitosis component.