@builder.io/mitosis 0.0.93 → 0.0.94

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 (49) hide show
  1. package/dist/src/generators/context/qwik.js +1 -1
  2. package/dist/src/generators/mitosis.js +2 -1
  3. package/dist/src/generators/qwik/component-generator.js +80 -163
  4. package/dist/src/generators/qwik/component.js +3 -3
  5. package/dist/src/generators/qwik/{add-prevent-default.d.ts → helpers/add-prevent-default.d.ts} +1 -1
  6. package/dist/src/generators/qwik/{add-prevent-default.js → helpers/add-prevent-default.js} +1 -1
  7. package/dist/src/generators/qwik/helpers/convert-method-to-function.d.ts +2 -0
  8. package/dist/src/generators/qwik/helpers/handlers.d.ts +3 -0
  9. package/dist/src/generators/qwik/{handlers.js → helpers/handlers.js} +3 -4
  10. package/dist/src/generators/qwik/helpers/state.d.ts +27 -0
  11. package/dist/src/generators/qwik/helpers/state.js +118 -0
  12. package/dist/src/generators/qwik/{styles.d.ts → helpers/styles.d.ts} +2 -2
  13. package/dist/src/generators/qwik/{styles.js → helpers/styles.js} +1 -1
  14. package/dist/src/generators/qwik/helpers/transform-code.d.ts +1 -0
  15. package/dist/src/generators/qwik/helpers/transform-code.js +8 -0
  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/helpers/babel-transform.js +13 -10
  27. package/dist/src/helpers/is-root-text-node.d.ts +4 -0
  28. package/dist/src/helpers/is-root-text-node.js +12 -0
  29. package/dist/src/helpers/map-refs.js +2 -26
  30. package/dist/src/helpers/parsers.js +11 -5
  31. package/dist/src/helpers/patterns.d.ts +1 -0
  32. package/dist/src/helpers/patterns.js +3 -1
  33. package/dist/src/helpers/plugins/process-code.d.ts +1 -1
  34. package/dist/src/helpers/plugins/process-code.js +9 -9
  35. package/dist/src/helpers/render-imports.js +1 -0
  36. package/dist/src/parsers/jsx/component-types.d.ts +2 -2
  37. package/dist/src/parsers/jsx/component-types.js +7 -16
  38. package/dist/src/parsers/jsx/index.d.ts +1 -1
  39. package/dist/src/parsers/jsx/index.js +3 -16
  40. package/dist/src/parsers/jsx/jsx.js +17 -22
  41. package/dist/tsconfig.build.tsbuildinfo +1 -1
  42. package/package.json +2 -2
  43. package/dist/src/generators/qwik/convert-method-to-function.d.ts +0 -1
  44. package/dist/src/generators/qwik/handlers.d.ts +0 -4
  45. /package/dist/src/generators/qwik/{convert-method-to-function.js → helpers/convert-method-to-function.js} +0 -0
  46. /package/dist/src/generators/qwik/{stable-inject.d.ts → helpers/stable-inject.d.ts} +0 -0
  47. /package/dist/src/generators/qwik/{stable-inject.js → helpers/stable-inject.js} +0 -0
  48. /package/dist/src/generators/qwik/{stable-serialize.d.ts → helpers/stable-serialize.d.ts} +0 -0
  49. /package/dist/src/generators/qwik/{stable-serialize.js → helpers/stable-serialize.js} +0 -0
@@ -6,7 +6,7 @@ var contextToQwik = function (options) {
6
6
  if (options === void 0) { options = {}; }
7
7
  return function (_a) {
8
8
  var context = _a.context;
9
- var str = "\n import { createContext } from '@builder.io/qwik';\n\n export default createContext<any>(\"".concat(context.name, "\")\n ");
9
+ var str = "\n import { createContextId } from '@builder.io/qwik';\n\n export default createContextId<any>(\"".concat(context.name, "\")\n ");
10
10
  if (options.format !== false) {
11
11
  try {
12
12
  str = (0, standalone_1.format)(str, {
@@ -41,6 +41,7 @@ var jsx_1 = require("../parsers/jsx");
41
41
  var mitosis_node_1 = require("../types/mitosis-node");
42
42
  var react_1 = require("./react");
43
43
  var state_1 = require("../helpers/state");
44
+ var is_root_text_node_1 = require("../helpers/is-root-text-node");
44
45
  exports.DEFAULT_FORMAT = 'legacy';
45
46
  // Special isValidAttributeName for Mitosis so we can allow for $ in names
46
47
  var isValidAttributeName = function (str) {
@@ -148,7 +149,7 @@ var componentToMitosis = function (toMitosisOptions) {
148
149
  (0, map_refs_1.mapRefs)(json, function (refName) {
149
150
  return "".concat(refName).concat(domRefs.has(refName) ? ".current" : '');
150
151
  });
151
- var addWrapper = json.children.length !== 1;
152
+ var addWrapper = json.children.length !== 1 || (0, is_root_text_node_1.isRootTextNode)(json);
152
153
  var components = Array.from((0, get_components_1.getComponents)(json));
153
154
  var mitosisComponents = components.filter(function (item) { return mitosisCoreComponents.includes(item); });
154
155
  var otherComponents = components.filter(function (item) { return !mitosisCoreComponents.includes(item); });
@@ -1,33 +1,60 @@
1
1
  "use strict";
2
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
- if (ar || !(i in from)) {
5
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
- ar[i] = from[i];
7
- }
8
- }
9
- return to.concat(ar || Array.prototype.slice.call(from));
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
2
  Object.defineProperty(exports, "__esModule", { value: true });
15
3
  exports.componentToQwik = void 0;
16
4
  var standalone_1 = require("prettier/standalone");
17
- var babel_transform_1 = require("../../helpers/babel-transform");
18
5
  var fast_clone_1 = require("../../helpers/fast-clone");
19
6
  var collect_css_1 = require("../../helpers/styles/collect-css");
20
7
  var state_1 = require("../../helpers/state");
21
- var add_prevent_default_1 = require("./add-prevent-default");
22
- var convert_method_to_function_1 = require("./convert-method-to-function");
8
+ var add_prevent_default_1 = require("./helpers/add-prevent-default");
9
+ var convert_method_to_function_1 = require("./helpers/convert-method-to-function");
23
10
  var jsx_1 = require("./jsx");
24
11
  var src_generator_1 = require("./src-generator");
25
12
  var plugins_1 = require("../../modules/plugins");
26
- var traverse_1 = __importDefault(require("traverse"));
27
- var stable_inject_1 = require("./stable-inject");
13
+ var stable_inject_1 = require("./helpers/stable-inject");
14
+ var merge_options_1 = require("../../helpers/merge-options");
15
+ var state_2 = require("./helpers/state");
16
+ var transform_code_1 = require("./helpers/transform-code");
17
+ var process_code_1 = require("../../helpers/plugins/process-code");
18
+ var replace_identifiers_1 = require("../../helpers/replace-identifiers");
28
19
  Error.stackTraceLimit = 9999;
29
- // TODO(misko): styles are not processed.
30
20
  var DEBUG = false;
21
+ var PLUGINS = [
22
+ function () { return ({
23
+ json: {
24
+ post: function (json) {
25
+ (0, add_prevent_default_1.addPreventDefault)(json);
26
+ return json;
27
+ },
28
+ },
29
+ }); },
30
+ (0, process_code_1.CODE_PROCESSOR_PLUGIN)(function (codeType, json) {
31
+ switch (codeType) {
32
+ case 'bindings':
33
+ case 'state':
34
+ case 'hooks':
35
+ case 'hooks-deps':
36
+ case 'properties':
37
+ // update signal getters to have `.value`
38
+ return function (code, k) {
39
+ // `ref` should not update the signal value access
40
+ if (k === 'ref') {
41
+ return code;
42
+ }
43
+ Object.keys(json.refs).forEach(function (ref) {
44
+ code = (0, replace_identifiers_1.replaceIdentifiers)({
45
+ code: code,
46
+ from: ref,
47
+ to: function (x) { return (x === ref ? "".concat(x, ".value") : "".concat(ref, ".value.").concat(x)); },
48
+ });
49
+ });
50
+ return code;
51
+ };
52
+ }
53
+ }),
54
+ ];
55
+ var DEFAULT_OPTIONS = {
56
+ plugins: PLUGINS,
57
+ };
31
58
  var componentToQwik = function (userOptions) {
32
59
  if (userOptions === void 0) { userOptions = {}; }
33
60
  return function (_a) {
@@ -35,14 +62,10 @@ var componentToQwik = function (userOptions) {
35
62
  var _component = _a.component, path = _a.path;
36
63
  // Make a copy we can safely mutate, similar to babel's toolchain
37
64
  var component = (0, fast_clone_1.fastClone)(_component);
38
- if (userOptions.plugins) {
39
- component = (0, plugins_1.runPreJsonPlugins)(component, userOptions.plugins);
40
- }
41
- (0, add_prevent_default_1.addPreventDefault)(component);
42
- if (userOptions.plugins) {
43
- component = (0, plugins_1.runPostJsonPlugins)(component, userOptions.plugins);
44
- }
45
- var isTypeScript = !!userOptions.typescript;
65
+ var options = (0, merge_options_1.mergeOptions)(DEFAULT_OPTIONS, userOptions);
66
+ component = (0, plugins_1.runPreJsonPlugins)(component, options.plugins);
67
+ component = (0, plugins_1.runPostJsonPlugins)(component, options.plugins);
68
+ var isTypeScript = !!options.typescript;
46
69
  var file = new src_generator_1.File(component.name + (isTypeScript ? '.ts' : '.js'), {
47
70
  isPretty: true,
48
71
  isJSX: true,
@@ -57,9 +80,9 @@ var componentToQwik = function (userOptions) {
57
80
  var metadata = component.meta.useMetadata || {};
58
81
  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;
59
82
  var mutable_1 = ((_d = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _d === void 0 ? void 0 : _d.mutable) || [];
60
- var imports_1 = (_e = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _e === void 0 ? void 0 : _e.imports;
61
- imports_1 && Object.keys(imports_1).forEach(function (key) { return file.import(imports_1[key], key); });
62
- var state_2 = emitStateMethodsAndRewriteBindings(file, component, metadata);
83
+ var imports_1 = ((_e = metadata === null || metadata === void 0 ? void 0 : metadata.qwik) === null || _e === void 0 ? void 0 : _e.imports) || {};
84
+ Object.keys(imports_1).forEach(function (key) { return file.import(imports_1[key], key); });
85
+ var state_3 = (0, state_2.emitStateMethodsAndRewriteBindings)(file, component, metadata);
63
86
  var hasState_1 = (0, state_1.checkHasState)(component);
64
87
  var css_1 = null;
65
88
  var componentFn = (0, src_generator_1.arrowFnBlock)(['props'], [
@@ -68,12 +91,11 @@ var componentToQwik = function (userOptions) {
68
91
  css_1 = emitUseStyles(file, component);
69
92
  emitUseContext(file, component);
70
93
  emitUseRef(file, component);
71
- hasState_1 && emitUseStore(file, state_2);
94
+ hasState_1 && (0, state_2.emitUseStore)(file, state_3);
72
95
  emitUseContextProvider(file, component);
73
96
  emitUseClientEffect(file, component);
74
97
  emitUseMount(file, component);
75
98
  emitUseTask(file, component);
76
- emitUseCleanup(file, component);
77
99
  emitTagNameHack(file, component, (_a = component.meta.useMetadata) === null || _a === void 0 ? void 0 : _a.elementTag);
78
100
  emitTagNameHack(file, component, (_b = component.meta.useMetadata) === null || _b === void 0 ? void 0 : _b.componentElementTag);
79
101
  emitJSX(file, component, mutable_1);
@@ -86,10 +108,8 @@ var componentToQwik = function (userOptions) {
86
108
  emitStyles(file, css_1);
87
109
  DEBUG && file.exportConst('COMPONENT', JSON.stringify(component));
88
110
  var sourceFile = file.toString();
89
- if (userOptions.plugins) {
90
- sourceFile = (0, plugins_1.runPreCodePlugins)(sourceFile, userOptions.plugins);
91
- sourceFile = (0, plugins_1.runPostCodePlugins)(sourceFile, userOptions.plugins);
92
- }
111
+ sourceFile = (0, plugins_1.runPreCodePlugins)(sourceFile, options.plugins);
112
+ sourceFile = (0, plugins_1.runPostCodePlugins)(sourceFile, options.plugins);
93
113
  return sourceFile;
94
114
  }
95
115
  catch (e) {
@@ -108,7 +128,7 @@ function emitExports(file, component) {
108
128
  }
109
129
  function emitTagNameHack(file, component, metadataValue) {
110
130
  if (typeof metadataValue === 'string' && metadataValue) {
111
- file.src.emit(metadataValue, '=', (0, convert_method_to_function_1.convertMethodToFunction)(metadataValue, getStateMethodsAndGetters(component.state), getLexicalScopeVars(component)), ';');
131
+ file.src.emit(metadataValue, '=', (0, convert_method_to_function_1.convertMethodToFunction)(metadataValue, (0, state_2.getStateMethodsAndGetters)(component.state), (0, state_2.getLexicalScopeVars)(component)), ';');
112
132
  }
113
133
  }
114
134
  function emitUseClientEffect(file, component) {
@@ -116,13 +136,13 @@ function emitUseClientEffect(file, component) {
116
136
  // This is called useMount, but in practice it is used as
117
137
  // useClientEffect. Not sure if this is correct, but for now.
118
138
  var code = component.hooks.onMount.code;
119
- file.src.emit(file.import(file.qwikModule, 'useClientEffect$').localName, '(()=>{', code, '});');
139
+ file.src.emit(file.import(file.qwikModule, 'useVisibleTask$').localName, '(()=>{', code, '});');
120
140
  }
121
141
  }
122
142
  function emitUseMount(file, component) {
123
143
  if (component.hooks.onInit) {
124
144
  var code = component.hooks.onInit.code;
125
- file.src.emit(file.import(file.qwikModule, 'useMount$').localName, '(()=>{', code, '});');
145
+ file.src.emit(file.import(file.qwikModule, 'useTask$').localName, '(()=>{', code, '});');
126
146
  }
127
147
  }
128
148
  function emitUseTask(file, component) {
@@ -130,7 +150,7 @@ function emitUseTask(file, component) {
130
150
  component.hooks.onUpdate.forEach(function (onUpdate) {
131
151
  file.src.emit(file.import(file.qwikModule, 'useTask$').localName, '(({track})=>{');
132
152
  emitTrackExpressions(file.src, onUpdate.deps);
133
- file.src.emit(convertTypeScriptToJS(onUpdate.code));
153
+ file.src.emit((0, transform_code_1.convertTypeScriptToJS)(onUpdate.code));
134
154
  file.src.emit('});');
135
155
  });
136
156
  }
@@ -144,12 +164,6 @@ function emitTrackExpressions(src, deps) {
144
164
  src.emit("track(() => ".concat(dep, ");"));
145
165
  });
146
166
  }
147
- function emitUseCleanup(file, component) {
148
- if (component.hooks.onUnMount) {
149
- var code = component.hooks.onUnMount.code;
150
- file.src.emit(file.import(file.qwikModule, 'useCleanup$').localName, '(()=>{', code, '});');
151
- }
152
- }
153
167
  function emitJSX(file, component, mutable) {
154
168
  var directives = new Map();
155
169
  var handlers = new Map();
@@ -191,7 +205,7 @@ function emitUseContext(file, component) {
191
205
  }
192
206
  function emitUseRef(file, component) {
193
207
  Object.keys(component.refs).forEach(function (refKey) {
194
- file.src.emit("const ", refKey, '=', file.import(file.qwikModule, 'useRef').localName, '();');
208
+ file.src.emit("const ", refKey, '=', file.import(file.qwikModule, 'useSignal').localName, "".concat(file.options.isTypeScript ? '<Element>' : '', "();"));
195
209
  });
196
210
  }
197
211
  function emitUseStyles(file, component) {
@@ -205,49 +219,29 @@ function emitUseStyles(file, component) {
205
219
  return css;
206
220
  }
207
221
  function emitStyles(file, css) {
208
- if (css) {
209
- if (file.options.isPretty) {
210
- file.src.emit('\n\n');
211
- try {
212
- css = (0, standalone_1.format)(css, {
213
- parser: 'css',
214
- plugins: [
215
- // To support running in browsers
216
- require('prettier/parser-postcss'),
217
- ],
218
- });
219
- }
220
- catch (e) {
221
- throw new Error(e +
222
- '\n' +
223
- '========================================================================\n' +
224
- css +
225
- '\n\n========================================================================');
226
- }
227
- }
228
- file.exportConst('STYLES', '`\n' + css.replace(/`/g, '\\`') + '`\n');
222
+ if (!css) {
223
+ return;
229
224
  }
230
- }
231
- /**
232
- * @param file
233
- * @param stateInit
234
- */
235
- function emitUseStore(file, stateInit) {
236
- var state = stateInit[0];
237
- var hasState = state && Object.keys(state).length > 0;
238
- if (hasState) {
239
- file.src.emit('const state=', file.import(file.qwikModule, 'useStore').localName);
240
- if (file.options.isTypeScript) {
241
- file.src.emit('<any>');
225
+ if (file.options.isPretty) {
226
+ file.src.emit('\n\n');
227
+ try {
228
+ css = (0, standalone_1.format)(css, {
229
+ parser: 'css',
230
+ plugins: [
231
+ // To support running in browsers
232
+ require('prettier/parser-postcss'),
233
+ ],
234
+ });
235
+ }
236
+ catch (e) {
237
+ throw new Error(e +
238
+ '\n' +
239
+ '========================================================================\n' +
240
+ css +
241
+ '\n\n========================================================================');
242
242
  }
243
- file.src.emit('(');
244
- file.src.emit((0, stable_inject_1.stableInject)(state));
245
- file.src.emit(');');
246
- }
247
- else {
248
- // TODO hack for now so that `state` variable is defined, even though it is never read.
249
- file.src.emit('const state' + (file.options.isTypeScript ? ': any' : '') + ' = {};');
250
243
  }
244
+ file.exportConst('STYLES', '`\n' + css.replace(/`/g, '\\`') + '`\n');
251
245
  }
252
246
  function emitTypes(file, component) {
253
247
  var _a;
@@ -255,33 +249,6 @@ function emitTypes(file, component) {
255
249
  (_a = component.types) === null || _a === void 0 ? void 0 : _a.forEach(function (t) { return file.src.emit(t, '\n'); });
256
250
  }
257
251
  }
258
- function emitStateMethodsAndRewriteBindings(file, component, metadata) {
259
- var _a;
260
- var lexicalArgs = getLexicalScopeVars(component);
261
- var state = emitStateMethods(file, component.state, lexicalArgs);
262
- var methodMap = getStateMethodsAndGetters(component.state);
263
- rewriteCodeExpr(component, methodMap, lexicalArgs, (_a = metadata.qwik) === null || _a === void 0 ? void 0 : _a.replace);
264
- return state;
265
- }
266
- var checkIsObjectWithCodeBlock = function (obj) {
267
- return typeof obj == 'object' && (obj === null || obj === void 0 ? void 0 : obj.code) && typeof obj.code === 'string';
268
- };
269
- function rewriteCodeExpr(component, methodMap, lexicalArgs, replace) {
270
- if (replace === void 0) { replace = {}; }
271
- (0, traverse_1.default)(component).forEach(function (item) {
272
- if (!checkIsObjectWithCodeBlock(item)) {
273
- return;
274
- }
275
- var code = (0, convert_method_to_function_1.convertMethodToFunction)(item.code, methodMap, lexicalArgs);
276
- Object.keys(replace).forEach(function (key) {
277
- code = code.replace(key, replace[key]);
278
- });
279
- item.code = code;
280
- });
281
- }
282
- function getLexicalScopeVars(component) {
283
- return __spreadArray(__spreadArray(['props', 'state'], Object.keys(component.refs), true), Object.keys(component.context.get), true);
284
- }
285
252
  function emitImports(file, component) {
286
253
  var _a;
287
254
  // <SELF> is used for self-referencing within the file.
@@ -293,58 +260,8 @@ function emitImports(file, component) {
293
260
  });
294
261
  });
295
262
  }
296
- function emitStateMethods(file, componentState, lexicalArgs) {
297
- var stateValues = {};
298
- var stateInit = [stateValues];
299
- var methodMap = getStateMethodsAndGetters(componentState);
300
- for (var key in componentState) {
301
- var stateValue = componentState[key];
302
- switch (stateValue === null || stateValue === void 0 ? void 0 : stateValue.type) {
303
- case 'method':
304
- case 'getter':
305
- case 'function':
306
- var code = stateValue.code;
307
- var prefixIdx = 0;
308
- if (stateValue.type === 'getter') {
309
- prefixIdx += 'get '.length;
310
- }
311
- else if (stateValue.type === 'function') {
312
- prefixIdx += 'function '.length;
313
- }
314
- code = code.substring(prefixIdx);
315
- code = (0, convert_method_to_function_1.convertMethodToFunction)(code, methodMap, lexicalArgs).replace('(', "(".concat(lexicalArgs.join(','), ","));
316
- var functionName = code.split(/\(/)[0];
317
- if (stateValue.type === 'getter') {
318
- stateInit.push("state.".concat(key, "=").concat(functionName, "(").concat(lexicalArgs.join(','), ")"));
319
- }
320
- if (!file.options.isTypeScript) {
321
- // Erase type information
322
- code = convertTypeScriptToJS(code);
323
- }
324
- file.exportConst(functionName, 'function ' + code, true);
325
- continue;
326
- case 'property':
327
- stateValues[key] = stateValue.code;
328
- continue;
329
- }
330
- }
331
- return stateInit;
332
- }
333
- function convertTypeScriptToJS(code) {
334
- return (0, babel_transform_1.babelTransformExpression)(code, {});
335
- }
336
263
  function extractGetterBody(code) {
337
264
  var start = code.indexOf('{');
338
265
  var end = code.lastIndexOf('}');
339
266
  return code.substring(start + 1, end).trim();
340
267
  }
341
- function getStateMethodsAndGetters(state) {
342
- var methodMap = {};
343
- Object.keys(state).forEach(function (key) {
344
- var stateVal = state[key];
345
- if ((stateVal === null || stateVal === void 0 ? void 0 : stateVal.type) === 'getter' || (stateVal === null || stateVal === void 0 ? void 0 : stateVal.type) === 'method') {
346
- methodMap[key] = stateVal.type;
347
- }
348
- });
349
- return methodMap;
350
- }
@@ -22,11 +22,11 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
23
  exports.addCommonStyles = exports.renderUseLexicalScope = exports.addComponent = exports.createFileSet = void 0;
24
24
  var compile_away_builder_components_1 = require("../../plugins/compile-away-builder-components");
25
- var handlers_1 = require("./handlers");
25
+ var handlers_1 = require("./helpers/handlers");
26
26
  var jsx_1 = require("./jsx");
27
27
  var src_generator_1 = require("./src-generator");
28
- var stable_serialize_1 = require("./stable-serialize");
29
- var styles_1 = require("./styles");
28
+ var stable_serialize_1 = require("./helpers/stable-serialize");
29
+ var styles_1 = require("./helpers/styles");
30
30
  function createFileSet(options) {
31
31
  if (options === void 0) { options = {}; }
32
32
  var opts = __assign({ qwikLib: '@builder.io/qwik', qrlPrefix: './', output: 'ts', minify: false, jsx: true }, options);
@@ -1,4 +1,4 @@
1
- import { MitosisComponent } from '../../types/mitosis-component';
1
+ import { MitosisComponent } from '../../../types/mitosis-component';
2
2
  /**
3
3
  * Find event handlers that explicitly call .preventDefault() and
4
4
  * add preventdefault:event
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.addPreventDefault = void 0;
7
7
  var traverse_1 = __importDefault(require("traverse"));
8
- var is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
8
+ var is_mitosis_node_1 = require("../../../helpers/is-mitosis-node");
9
9
  /**
10
10
  * Find event handlers that explicitly call .preventDefault() and
11
11
  * add preventdefault:event
@@ -0,0 +1,2 @@
1
+ import type { MethodMap } from './state';
2
+ export declare function convertMethodToFunction(code: string, properties: MethodMap, lexicalArgs: string[]): string;
@@ -0,0 +1,3 @@
1
+ import { MitosisNode } from '../../../types/mitosis-node';
2
+ import { File } from '../src-generator';
3
+ export declare function renderHandlers(file: File, componentName: string, children: MitosisNode[]): Map<string, string>;
@@ -9,9 +9,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
9
9
  return to.concat(ar || Array.prototype.slice.call(from));
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.renderHandlers = exports.extractJSBlock = void 0;
13
- var component_1 = require("./component");
14
- var src_generator_1 = require("./src-generator");
12
+ exports.renderHandlers = void 0;
13
+ var component_1 = require("../component");
14
+ var src_generator_1 = require("../src-generator");
15
15
  var IIF_START = '(() => {';
16
16
  var IIF_END = '})()';
17
17
  function extractJSBlock(binding) {
@@ -28,7 +28,6 @@ function extractJSBlock(binding) {
28
28
  }
29
29
  return null;
30
30
  }
31
- exports.extractJSBlock = extractJSBlock;
32
31
  function renderHandlers(file, componentName, children) {
33
32
  var id = 0;
34
33
  var map = new Map();
@@ -0,0 +1,27 @@
1
+ import { MitosisComponent } from '../../../types/mitosis-component';
2
+ import { File } from '../src-generator';
3
+ /**
4
+ * Stores getters and initialization map.
5
+ */
6
+ export declare type StateInit = [
7
+ StateValues,
8
+ /**
9
+ * Set of state initializers.
10
+ */
11
+ ...string[]
12
+ ];
13
+ export declare type PropertyName = string;
14
+ export declare type StateValue = string;
15
+ /**
16
+ * Map of getters that need to be rewritten to function invocations.
17
+ */
18
+ export declare type StateValues = Record<PropertyName, StateValue>;
19
+ /**
20
+ * @param file
21
+ * @param stateInit
22
+ */
23
+ export declare function emitUseStore(file: File, stateInit: StateInit): void;
24
+ export declare function emitStateMethodsAndRewriteBindings(file: File, component: MitosisComponent, metadata: Record<string, any>): StateInit;
25
+ export declare function getLexicalScopeVars(component: MitosisComponent): string[];
26
+ export declare type MethodMap = Record<string, 'method' | 'getter'>;
27
+ export declare function getStateMethodsAndGetters(state: MitosisComponent['state']): MethodMap;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getStateMethodsAndGetters = exports.getLexicalScopeVars = exports.emitStateMethodsAndRewriteBindings = exports.emitUseStore = void 0;
16
+ var traverse_1 = __importDefault(require("traverse"));
17
+ var convert_method_to_function_1 = require("./convert-method-to-function");
18
+ var stable_inject_1 = require("./stable-inject");
19
+ var transform_code_1 = require("./transform-code");
20
+ /**
21
+ * @param file
22
+ * @param stateInit
23
+ */
24
+ function emitUseStore(file, stateInit) {
25
+ var state = stateInit[0];
26
+ var hasState = state && Object.keys(state).length > 0;
27
+ if (hasState) {
28
+ file.src.emit('const state=', file.import(file.qwikModule, 'useStore').localName);
29
+ if (file.options.isTypeScript) {
30
+ file.src.emit('<any>');
31
+ }
32
+ file.src.emit("(".concat((0, stable_inject_1.stableInject)(state), ");"));
33
+ }
34
+ else {
35
+ // TODO hack for now so that `state` variable is defined, even though it is never read.
36
+ file.src.emit("const state".concat(file.options.isTypeScript ? ': any' : '', " = {};"));
37
+ }
38
+ }
39
+ exports.emitUseStore = emitUseStore;
40
+ function emitStateMethods(file, componentState, lexicalArgs) {
41
+ var stateValues = {};
42
+ var stateInit = [stateValues];
43
+ var methodMap = getStateMethodsAndGetters(componentState);
44
+ for (var key in componentState) {
45
+ var stateValue = componentState[key];
46
+ console.log(componentState);
47
+ switch (stateValue === null || stateValue === void 0 ? void 0 : stateValue.type) {
48
+ case 'method':
49
+ case 'getter':
50
+ case 'function':
51
+ var code = stateValue.code;
52
+ var prefixIdx = 0;
53
+ if (stateValue.type === 'getter') {
54
+ prefixIdx += 'get '.length;
55
+ }
56
+ else if (stateValue.type === 'function') {
57
+ prefixIdx += 'function '.length;
58
+ }
59
+ code = code.substring(prefixIdx);
60
+ code = (0, convert_method_to_function_1.convertMethodToFunction)(code, methodMap, lexicalArgs).replace('(', "(".concat(lexicalArgs.join(','), ","));
61
+ var functionName = code.split(/\(/)[0];
62
+ if (stateValue.type === 'getter') {
63
+ stateInit.push("state.".concat(key, "=").concat(functionName, "(").concat(lexicalArgs.join(','), ")"));
64
+ }
65
+ if (!file.options.isTypeScript) {
66
+ // Erase type information
67
+ code = (0, transform_code_1.convertTypeScriptToJS)(code);
68
+ }
69
+ file.exportConst(functionName, 'function ' + code, true);
70
+ console.log(functionName, 'function ' + code);
71
+ continue;
72
+ case 'property':
73
+ stateValues[key] = stateValue.code;
74
+ continue;
75
+ }
76
+ }
77
+ return stateInit;
78
+ }
79
+ function emitStateMethodsAndRewriteBindings(file, component, metadata) {
80
+ var _a;
81
+ var lexicalArgs = getLexicalScopeVars(component);
82
+ var state = emitStateMethods(file, component.state, lexicalArgs);
83
+ var methodMap = getStateMethodsAndGetters(component.state);
84
+ rewriteCodeExpr(component, methodMap, lexicalArgs, (_a = metadata.qwik) === null || _a === void 0 ? void 0 : _a.replace);
85
+ return state;
86
+ }
87
+ exports.emitStateMethodsAndRewriteBindings = emitStateMethodsAndRewriteBindings;
88
+ var checkIsObjectWithCodeBlock = function (obj) {
89
+ return typeof obj == 'object' && (obj === null || obj === void 0 ? void 0 : obj.code) && typeof obj.code === 'string';
90
+ };
91
+ function getLexicalScopeVars(component) {
92
+ return __spreadArray(__spreadArray(['props', 'state'], Object.keys(component.refs), true), Object.keys(component.context.get), true);
93
+ }
94
+ exports.getLexicalScopeVars = getLexicalScopeVars;
95
+ function rewriteCodeExpr(component, methodMap, lexicalArgs, replace) {
96
+ if (replace === void 0) { replace = {}; }
97
+ (0, traverse_1.default)(component).forEach(function (item) {
98
+ if (!checkIsObjectWithCodeBlock(item)) {
99
+ return;
100
+ }
101
+ var code = (0, convert_method_to_function_1.convertMethodToFunction)(item.code, methodMap, lexicalArgs);
102
+ Object.keys(replace).forEach(function (key) {
103
+ code = code.replace(key, replace[key]);
104
+ });
105
+ item.code = code;
106
+ });
107
+ }
108
+ function getStateMethodsAndGetters(state) {
109
+ var methodMap = {};
110
+ Object.keys(state).forEach(function (key) {
111
+ var stateVal = state[key];
112
+ if ((stateVal === null || stateVal === void 0 ? void 0 : stateVal.type) === 'getter' || (stateVal === null || stateVal === void 0 ? void 0 : stateVal.type) === 'method') {
113
+ methodMap[key] = stateVal.type;
114
+ }
115
+ });
116
+ return methodMap;
117
+ }
118
+ exports.getStateMethodsAndGetters = getStateMethodsAndGetters;
@@ -1,5 +1,5 @@
1
- import { MitosisNode } from '../..';
2
- import { SrcBuilder } from './src-generator';
1
+ import { MitosisNode } from '../../..';
2
+ import { SrcBuilder } from '../src-generator';
3
3
  export declare type CssStyles = {
4
4
  CLASS_NAME: string;
5
5
  } & Record<string, string>;
@@ -25,7 +25,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.renderStyles = exports.collectStyles = void 0;
27
27
  var json5_1 = __importDefault(require("json5"));
28
- var dash_case_1 = require("../../helpers/dash-case");
28
+ var dash_case_1 = require("../../../helpers/dash-case");
29
29
  function collectStyles(children, styleMap) {
30
30
  var _a;
31
31
  var nodes = __spreadArray([], children, true);
@@ -0,0 +1 @@
1
+ export declare function convertTypeScriptToJS(code: string): string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertTypeScriptToJS = void 0;
4
+ var babel_transform_1 = require("../../../helpers/babel-transform");
5
+ function convertTypeScriptToJS(code) {
6
+ return (0, babel_transform_1.babelTransformExpression)(code, {});
7
+ }
8
+ exports.convertTypeScriptToJS = convertTypeScriptToJS;
@@ -1,6 +1,6 @@
1
1
  import { MitosisNode } from '../../types/mitosis-node';
2
2
  import { File } from './src-generator';
3
- import { CssStyles } from './styles';
3
+ import { CssStyles } from './helpers/styles';
4
4
  /**
5
5
  * Convert a Mitosis nodes to a JSX nodes.
6
6
  *
@@ -45,7 +45,9 @@ function renderJSXNodes(file, directives, handlers, children, styles, parentSymb
45
45
  return;
46
46
  if (root)
47
47
  this.emit('(');
48
- var needsFragment = root && (children.length > 1 || (children.length && isInlinedDirective(children[0])));
48
+ var needsFragment = root &&
49
+ (children.length > 1 ||
50
+ (children.length && (isInlinedDirective(children[0]) || isTextNode(children[0]))));
49
51
  file.import(file.qwikModule, 'h');
50
52
  var fragmentSymbol = file.import(file.qwikModule, 'Fragment');
51
53
  if (needsFragment) {