@builder.io/mitosis 0.5.24 → 0.5.26

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 (32) hide show
  1. package/dist/src/generators/alpine/generate.js +4 -3
  2. package/dist/src/generators/angular/index.js +35 -25
  3. package/dist/src/generators/angular/types.d.ts +12 -0
  4. package/dist/src/generators/helpers/rsc.js +2 -1
  5. package/dist/src/generators/html/generator.js +8 -7
  6. package/dist/src/generators/liquid/generator.js +2 -1
  7. package/dist/src/generators/lit/generate.js +2 -1
  8. package/dist/src/generators/marko/generate.js +2 -1
  9. package/dist/src/generators/mitosis/generator.js +6 -5
  10. package/dist/src/generators/qwik/helpers/add-prevent-default.js +3 -2
  11. package/dist/src/generators/qwik/helpers/handlers.js +2 -1
  12. package/dist/src/generators/qwik/src-generator.js +2 -1
  13. package/dist/src/generators/react/blocks.js +2 -1
  14. package/dist/src/generators/solid/blocks.js +2 -1
  15. package/dist/src/generators/stencil/helpers/index.js +2 -1
  16. package/dist/src/generators/svelte/blocks.js +3 -2
  17. package/dist/src/generators/swift/generator.js +2 -1
  18. package/dist/src/generators/template/generator.js +2 -1
  19. package/dist/src/generators/vue/blocks.js +3 -2
  20. package/dist/src/helpers/event-handlers.d.ts +2 -1
  21. package/dist/src/helpers/event-handlers.js +110 -3
  22. package/dist/src/parsers/jsx/helpers.d.ts +6 -0
  23. package/dist/src/parsers/jsx/helpers.js +28 -4
  24. package/dist/src/parsers/jsx/hooks/index.d.ts +4 -3
  25. package/dist/src/parsers/jsx/hooks/index.js +37 -26
  26. package/dist/src/parsers/jsx/hooks/use-metadata.d.ts +9 -0
  27. package/dist/src/parsers/jsx/hooks/use-metadata.js +184 -0
  28. package/dist/src/parsers/jsx/imports.d.ts +0 -2
  29. package/dist/src/parsers/jsx/imports.js +8 -26
  30. package/dist/src/parsers/jsx/jsx.js +87 -106
  31. package/dist/src/parsers/jsx/types.d.ts +7 -1
  32. package/package.json +1 -1
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.componentToAlpine = exports.isValidAlpineBinding = exports.checkIsComponentNode = void 0;
4
+ const html_tags_1 = require("../../constants/html_tags");
4
5
  const babel_transform_1 = require("../../helpers/babel-transform");
5
6
  const dash_case_1 = require("../../helpers/dash-case");
7
+ const event_handlers_1 = require("../../helpers/event-handlers");
6
8
  const fast_clone_1 = require("../../helpers/fast-clone");
7
9
  const get_refs_1 = require("../../helpers/get-refs");
8
10
  const get_state_object_string_1 = require("../../helpers/get-state-object-string");
@@ -12,11 +14,10 @@ const replace_identifiers_1 = require("../../helpers/replace-identifiers");
12
14
  const strip_meta_properties_1 = require("../../helpers/strip-meta-properties");
13
15
  const strip_state_and_props_refs_1 = require("../../helpers/strip-state-and-props-refs");
14
16
  const collect_css_1 = require("../../helpers/styles/collect-css");
17
+ const plugins_1 = require("../../modules/plugins");
15
18
  const mitosis_node_1 = require("../../types/mitosis-node");
16
19
  const lodash_1 = require("lodash");
17
20
  const standalone_1 = require("prettier/standalone");
18
- const html_tags_1 = require("../../constants/html_tags");
19
- const plugins_1 = require("../../modules/plugins");
20
21
  const render_mount_hook_1 = require("./render-mount-hook");
21
22
  const render_update_hooks_1 = require("./render-update-hooks");
22
23
  const checkIsComponentNode = (node) => node.name === '@builder.io/mitosis/component';
@@ -128,7 +129,7 @@ const blockToAlpine = (json, options = {}) => {
128
129
  const { code: value, type: bindingType } = json.bindings[key];
129
130
  // TODO: proper babel transform to replace. Util for this
130
131
  const useValue = (0, strip_state_and_props_refs_1.stripStateAndPropsRefs)(value);
131
- if (key.startsWith('on')) {
132
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
132
133
  str += bindEventHandler(options)(key, value);
133
134
  }
134
135
  else if (key === 'ref') {
@@ -67,6 +67,7 @@ const is_children_1 = __importDefault(require("../../helpers/is-children"));
67
67
  const on_mount_1 = require("../helpers/on-mount");
68
68
  const helpers_2 = require("./helpers");
69
69
  const types_1 = require("./types");
70
+ const event_handlers_1 = require("../../helpers/event-handlers");
70
71
  const parse_selector_1 = require("./parse-selector");
71
72
  const { types } = babel;
72
73
  const mappers = {
@@ -187,7 +188,7 @@ const processEventBinding = (key, code, nodeName, customArg) => {
187
188
  };
188
189
  };
189
190
  const stringifyBinding = (node, options, blockOptions) => ([key, binding]) => {
190
- var _a;
191
+ var _a, _b;
191
192
  if (key.startsWith('$') || key.startsWith('"') || key === 'key') {
192
193
  return;
193
194
  }
@@ -197,10 +198,15 @@ const stringifyBinding = (node, options, blockOptions) => ([key, binding]) => {
197
198
  const keyToUse = BINDINGS_MAPPER[key] || key;
198
199
  const { code, arguments: cusArgs = ['event'] } = binding;
199
200
  // TODO: proper babel transform to replace. Util for this
200
- if (keyToUse.startsWith('on')) {
201
+ if ((0, event_handlers_1.checkIsEvent)(keyToUse)) {
201
202
  const { event, value } = processEventBinding(keyToUse, code, node.name, cusArgs[0]);
202
- // Angular events are all lowerCased
203
- return ` (${event.toLowerCase()})="${value}"`;
203
+ // native events are all lowerCased
204
+ const lowerCaseEvent = event.toLowerCase();
205
+ const eventKey = (0, event_handlers_1.checkIsBindingNativeEvent)(event) ||
206
+ ((_a = blockOptions.nativeEvents) === null || _a === void 0 ? void 0 : _a.find((nativeEvent) => nativeEvent === keyToUse || nativeEvent === event || nativeEvent === lowerCaseEvent))
207
+ ? lowerCaseEvent
208
+ : event;
209
+ return ` (${eventKey})="${value}"`;
204
210
  }
205
211
  else if (keyToUse === 'class') {
206
212
  return ` [class]="${code}" `;
@@ -209,7 +215,7 @@ const stringifyBinding = (node, options, blockOptions) => ([key, binding]) => {
209
215
  return ` #${code} `;
210
216
  }
211
217
  else if ((html_tags_1.VALID_HTML_TAGS.includes(node.name.trim()) || keyToUse.includes('-')) &&
212
- !((_a = blockOptions.nativeAttributes) === null || _a === void 0 ? void 0 : _a.includes(keyToUse)) &&
218
+ !((_b = blockOptions.nativeAttributes) === null || _b === void 0 ? void 0 : _b.includes(keyToUse)) &&
213
219
  !Object.values(BINDINGS_MAPPER).includes(keyToUse)) {
214
220
  // standard html elements need the attr to satisfy the compiler in many cases: eg: svg elements and [fill]
215
221
  return ` [attr.${keyToUse}]="${code}" `;
@@ -249,7 +255,7 @@ const handleNgOutletBindings = (node, options) => {
249
255
  }
250
256
  let keyToUse = key.includes('-') ? `'${key}'` : key;
251
257
  keyToUse = keyToUse.replace('state.', '').replace('props.', '');
252
- if (key.startsWith('on')) {
258
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
253
259
  const { event, value } = processEventBinding(key, code, node.name, cusArgs[0]);
254
260
  allProps += `on${event.charAt(0).toUpperCase() + event.slice(1)}: ${value.replace(/\(.*?\)/g, '')}.bind(this), `;
255
261
  }
@@ -268,6 +274,7 @@ const handleNgOutletBindings = (node, options) => {
268
274
  };
269
275
  const blockToAngular = ({ root, json, options = {}, blockOptions = {
270
276
  nativeAttributes: [],
277
+ nativeEvents: [],
271
278
  }, }) => {
272
279
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
273
280
  const childComponents = (blockOptions === null || blockOptions === void 0 ? void 0 : blockOptions.childComponents) || [];
@@ -542,7 +549,7 @@ const handleBindings = (json, item, index, forName, indexName) => {
542
549
  continue;
543
550
  if (key === 'key')
544
551
  continue;
545
- if (key.startsWith('on')) {
552
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
546
553
  const { arguments: cusArgs = ['event'] } = item.bindings[key];
547
554
  const eventBindingName = `${generateNewBindingName(index, item.name)}_event`;
548
555
  if (((_a = item.bindings[key]) === null || _a === void 0 ? void 0 : _a.code.trim().startsWith('{')) &&
@@ -570,12 +577,12 @@ const handleBindings = (json, item, index, forName, indexName) => {
570
577
  }
571
578
  }
572
579
  else if ((_c = item.bindings[key]) === null || _c === void 0 ? void 0 : _c.code) {
573
- if (((_d = item.bindings[key]) === null || _d === void 0 ? void 0 : _d.type) !== 'spread' && !key.startsWith('on')) {
580
+ if (((_d = item.bindings[key]) === null || _d === void 0 ? void 0 : _d.type) !== 'spread' && !(0, event_handlers_1.checkIsEvent)(key)) {
574
581
  json.state[newBindingName] = { code: 'null', type: 'property' };
575
582
  (0, helpers_2.makeReactiveState)(json, newBindingName, `this.${newBindingName} = ${item.bindings[key].code}`);
576
583
  item.bindings[key].code = `state.${newBindingName}`;
577
584
  }
578
- else if (key.startsWith('on')) {
585
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
579
586
  const { arguments: cusArgs = ['event'] } = item.bindings[key];
580
587
  if (((_e = item.bindings[key]) === null || _e === void 0 ? void 0 : _e.code.trim().startsWith('{')) &&
581
588
  ((_f = item.bindings[key]) === null || _f === void 0 ? void 0 : _f.code.trim().endsWith('}'))) {
@@ -646,7 +653,7 @@ const classPropertiesPlugin = () => ({
646
653
  },
647
654
  });
648
655
  const componentToAngular = (userOptions = {}) => ({ component: _component }) => {
649
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
656
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
650
657
  // Make a copy we can safely mutate, similar to babel's toolchain
651
658
  let json = (0, fast_clone_1.fastClone)(_component);
652
659
  const useMetadata = (_a = json.meta) === null || _a === void 0 ? void 0 : _a.useMetadata;
@@ -770,7 +777,7 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
770
777
  const helperFunctions = new Set();
771
778
  let template = json.children
772
779
  .map((item) => {
773
- var _a, _b;
780
+ var _a, _b, _c, _d;
774
781
  const tmpl = (0, exports.blockToAngular)({
775
782
  root: json,
776
783
  json: item,
@@ -778,6 +785,7 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
778
785
  blockOptions: {
779
786
  childComponents,
780
787
  nativeAttributes: (_b = (_a = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _a === void 0 ? void 0 : _a.nativeAttributes) !== null && _b !== void 0 ? _b : [],
788
+ nativeEvents: (_d = (_c = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _c === void 0 ? void 0 : _c.nativeEvents) !== null && _d !== void 0 ? _d : [],
781
789
  },
782
790
  });
783
791
  if (options.state === 'inline-with-wrappers') {
@@ -793,6 +801,7 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
793
801
  const { components: dynamicComponents, dynamicTemplate } = traverseToGetAllDynamicComponents(json, options, {
794
802
  childComponents,
795
803
  nativeAttributes: (_d = (_c = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _c === void 0 ? void 0 : _c.nativeAttributes) !== null && _d !== void 0 ? _d : [],
804
+ nativeEvents: (_f = (_e = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _e === void 0 ? void 0 : _e.nativeEvents) !== null && _f !== void 0 ? _f : [],
796
805
  });
797
806
  (0, helpers_2.transformState)(json);
798
807
  const dataString = (0, get_state_object_string_1.getStateObjectStringFromComponent)(json, {
@@ -816,8 +825,8 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
816
825
  const styles = css.length ? [hostDisplayCss, css].join('\n') : hostDisplayCss;
817
826
  // Preparing built in component metadata parameters
818
827
  const componentMetadata = {
819
- selector: ((_e = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _e === void 0 ? void 0 : _e.selector)
820
- ? `'${(_f = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _f === void 0 ? void 0 : _f.selector}'`
828
+ selector: ((_g = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _g === void 0 ? void 0 : _g.selector)
829
+ ? `'${(_h = useMetadata === null || useMetadata === void 0 ? void 0 : useMetadata.angular) === null || _h === void 0 ? void 0 : _h.selector}'`
821
830
  : `'${(0, lodash_1.kebabCase)(json.name || 'my-component')}'`,
822
831
  template: `\`
823
832
  ${(0, indent_1.indent)(dynamicTemplate, 8).replace(/`/g, '\\`').replace(/\$\{/g, '\\${')}
@@ -843,7 +852,7 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
843
852
  const hasConstructor = Boolean(injectables.length) || dynamicComponents.size || refsForObjSpread.size;
844
853
  const angularCoreImports = [
845
854
  ...(outputs.length ? ['Output', 'EventEmitter'] : []),
846
- ...(((_g = options === null || options === void 0 ? void 0 : options.experimental) === null || _g === void 0 ? void 0 : _g.inject) ? ['Inject', 'forwardRef'] : []),
855
+ ...(((_j = options === null || options === void 0 ? void 0 : options.experimental) === null || _j === void 0 ? void 0 : _j.inject) ? ['Inject', 'forwardRef'] : []),
847
856
  'Component',
848
857
  ...(domRefs.size || dynamicComponents.size || refsForObjSpread.size
849
858
  ? ['ViewChild', 'ElementRef']
@@ -851,7 +860,7 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
851
860
  ...(refsForObjSpread.size ? ['Renderer2'] : []),
852
861
  ...(props.size ? ['Input'] : []),
853
862
  ...(dynamicComponents.size ? ['ViewContainerRef', 'TemplateRef'] : []),
854
- ...(((_h = json.hooks.onUpdate) === null || _h === void 0 ? void 0 : _h.length) && options.typescript ? ['SimpleChanges'] : []),
863
+ ...(((_k = json.hooks.onUpdate) === null || _k === void 0 ? void 0 : _k.length) && options.typescript ? ['SimpleChanges'] : []),
855
864
  ].join(', ');
856
865
  let str = (0, dedent_1.dedent) `
857
866
  import { ${angularCoreImports} } from '@angular/core';
@@ -881,9 +890,10 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
881
890
  ${Array.from(props)
882
891
  .filter((item) => !(0, slots_1.isSlotProperty)(item) && item !== 'children')
883
892
  .map((item) => {
893
+ const hasDefaultProp = json.defaultProps && json.defaultProps.hasOwnProperty(item);
884
894
  const propType = propsTypeRef ? `${propsTypeRef}["${item}"]` : 'any';
885
- let propDeclaration = `@Input() ${item}${options.typescript ? `!: ${propType}` : ''}`;
886
- if (json.defaultProps && json.defaultProps.hasOwnProperty(item)) {
895
+ let propDeclaration = `@Input() ${item}${options.typescript ? `${hasDefaultProp ? '' : '!'}: ${propType}` : ''}`;
896
+ if (hasDefaultProp) {
887
897
  propDeclaration += ` = defaultProps["${item}"]`;
888
898
  }
889
899
  return propDeclaration;
@@ -940,13 +950,13 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
940
950
  ? `\nprivate renderer${options.typescript ? ': Renderer2' : ''},\n`
941
951
  : ''}) {}
942
952
  `}
943
- ${!json.hooks.onMount.length && !dynamicComponents.size && !((_j = json.hooks.onInit) === null || _j === void 0 ? void 0 : _j.code)
953
+ ${!json.hooks.onMount.length && !dynamicComponents.size && !((_l = json.hooks.onInit) === null || _l === void 0 ? void 0 : _l.code)
944
954
  ? ''
945
955
  : `ngOnInit() {
946
- ${!((_k = json.hooks) === null || _k === void 0 ? void 0 : _k.onInit)
956
+ ${!((_m = json.hooks) === null || _m === void 0 ? void 0 : _m.onInit)
947
957
  ? ''
948
958
  : `
949
- ${(_l = json.hooks.onInit) === null || _l === void 0 ? void 0 : _l.code}
959
+ ${(_o = json.hooks.onInit) === null || _o === void 0 ? void 0 : _o.code}
950
960
  `}
951
961
  ${json.hooks.onMount.length > 0
952
962
  ? `
@@ -968,19 +978,19 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
968
978
 
969
979
  ${
970
980
  // hooks specific to Angular
971
- ((_o = (_m = json.compileContext) === null || _m === void 0 ? void 0 : _m.angular) === null || _o === void 0 ? void 0 : _o.hooks)
972
- ? Object.entries((_q = (_p = json.compileContext) === null || _p === void 0 ? void 0 : _p.angular) === null || _q === void 0 ? void 0 : _q.hooks).map(([key, value]) => {
981
+ ((_q = (_p = json.compileContext) === null || _p === void 0 ? void 0 : _p.angular) === null || _q === void 0 ? void 0 : _q.hooks)
982
+ ? Object.entries((_s = (_r = json.compileContext) === null || _r === void 0 ? void 0 : _r.angular) === null || _s === void 0 ? void 0 : _s.hooks).map(([key, value]) => {
973
983
  return `${key}() {
974
984
  ${value.code}
975
985
  }`;
976
986
  })
977
987
  : ''}
978
988
 
979
- ${!((_r = json.hooks.onUpdate) === null || _r === void 0 ? void 0 : _r.length)
989
+ ${!((_t = json.hooks.onUpdate) === null || _t === void 0 ? void 0 : _t.length)
980
990
  ? ''
981
991
  : `ngOnChanges(changes${options.typescript ? ': SimpleChanges' : ''}) {
982
992
  if (typeof window !== 'undefined') {
983
- ${(_s = json.hooks.onUpdate) === null || _s === void 0 ? void 0 : _s.reduce((code, hook) => {
993
+ ${(_u = json.hooks.onUpdate) === null || _u === void 0 ? void 0 : _u.reduce((code, hook) => {
984
994
  code += hook.code;
985
995
  return code + '\n';
986
996
  }, '')}
@@ -991,7 +1001,7 @@ const componentToAngular = (userOptions = {}) => ({ component: _component }) =>
991
1001
  ${!json.hooks.onUnMount && !refsForObjSpread.size
992
1002
  ? ''
993
1003
  : `ngOnDestroy() {
994
- ${((_t = json.hooks.onUnMount) === null || _t === void 0 ? void 0 : _t.code) || ''}
1004
+ ${((_v = json.hooks.onUnMount) === null || _v === void 0 ? void 0 : _v.code) || ''}
995
1005
  ${refsForObjSpread.size
996
1006
  ? `for (const fn of this._listenerFns.values()) { fn(); }`
997
1007
  : ''}
@@ -17,7 +17,19 @@ export interface ToAngularOptions extends BaseTranspilerOptions {
17
17
  }
18
18
  export declare const DEFAULT_ANGULAR_OPTIONS: ToAngularOptions;
19
19
  export type AngularMetadata = {
20
+ /**
21
+ * Mitosis uses `attr.XXX` as default see https://angular.io/guide/attribute-binding.
22
+ * If you want to skip some you can use the 'nativeAttributes'.
23
+ */
20
24
  nativeAttributes?: string[];
25
+ /**
26
+ * If you encounter some native events which aren't generated in lower-case.
27
+ * Create a new PR inside [event-handlers.ts](https://github.com/BuilderIO/mitosis/blob/main/packages/core/src/helpers/event-handlers.ts) to fix it for all.
28
+ */
29
+ nativeEvents?: string[];
30
+ /**
31
+ * Overwrite default selector for component. Default will be kebab case (MyComponent -> my-component)
32
+ */
21
33
  selector?: string;
22
34
  };
23
35
  export type AngularBlockOptions = {
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.checkIfIsClientComponent = void 0;
7
+ const event_handlers_1 = require("../../helpers/event-handlers");
7
8
  const is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
8
9
  const legacy_1 = __importDefault(require("neotraverse/legacy"));
9
10
  const checkIsNodeAMitosisComponent = (node) => node.name[0] === node.name[0].toUpperCase();
@@ -26,7 +27,7 @@ const checkIfIsClientComponent = (json) => {
26
27
  let foundEventListener = false;
27
28
  (0, legacy_1.default)(json).forEach(function (node) {
28
29
  if ((0, is_mitosis_node_1.isMitosisNode)(node) && !checkIsNodeAMitosisComponent(node)) {
29
- if (Object.keys(node.bindings).filter((item) => item.startsWith('on')).length) {
30
+ if (Object.keys(node.bindings).filter((item) => (0, event_handlers_1.checkIsEvent)(item)).length) {
30
31
  foundEventListener = true;
31
32
  this.stop();
32
33
  }
@@ -4,14 +4,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.componentToCustomElement = exports.componentToHtml = void 0;
7
- const core_1 = require("@babel/core");
8
- const function_1 = require("fp-ts/lib/function");
9
- const lodash_1 = require("lodash");
10
- const legacy_1 = __importDefault(require("neotraverse/legacy"));
11
- const standalone_1 = require("prettier/standalone");
12
7
  const html_tags_1 = require("../../constants/html_tags");
13
8
  const babel_transform_1 = require("../../helpers/babel-transform");
14
9
  const dash_case_1 = require("../../helpers/dash-case");
10
+ const event_handlers_1 = require("../../helpers/event-handlers");
15
11
  const fast_clone_1 = require("../../helpers/fast-clone");
16
12
  const get_prop_functions_1 = require("../../helpers/get-prop-functions");
17
13
  const get_props_1 = require("../../helpers/get-props");
@@ -22,7 +18,6 @@ const has_bindings_text_1 = require("../../helpers/has-bindings-text");
22
18
  const has_component_1 = require("../../helpers/has-component");
23
19
  const has_props_1 = require("../../helpers/has-props");
24
20
  const has_stateful_dom_1 = require("../../helpers/has-stateful-dom");
25
- const is_children_1 = __importDefault(require("../../helpers/is-children"));
26
21
  const is_html_attribute_1 = require("../../helpers/is-html-attribute");
27
22
  const is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
28
23
  const map_refs_1 = require("../../helpers/map-refs");
@@ -35,6 +30,12 @@ const strip_state_and_props_refs_1 = require("../../helpers/strip-state-and-prop
35
30
  const collect_css_1 = require("../../helpers/styles/collect-css");
36
31
  const plugins_1 = require("../../modules/plugins");
37
32
  const mitosis_node_1 = require("../../types/mitosis-node");
33
+ const core_1 = require("@babel/core");
34
+ const function_1 = require("fp-ts/lib/function");
35
+ const lodash_1 = require("lodash");
36
+ const legacy_1 = __importDefault(require("neotraverse/legacy"));
37
+ const is_children_1 = __importDefault(require("../../helpers/is-children"));
38
+ const standalone_1 = require("prettier/standalone");
38
39
  const on_mount_1 = require("../helpers/on-mount");
39
40
  const isAttribute = (key) => {
40
41
  return /-/.test(key);
@@ -295,7 +296,7 @@ const blockToHtml = (json, options, blockOptions = {}) => {
295
296
  const cusArg = ((_g = json.bindings[key]) === null || _g === void 0 ? void 0 : _g.arguments) || ['event'];
296
297
  // TODO: proper babel transform to replace. Util for this
297
298
  const useValue = value;
298
- if (key.startsWith('on')) {
299
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
299
300
  let event = key.replace('on', '').toLowerCase();
300
301
  const fnName = (0, lodash_1.camelCase)(`on-${elId}-${event}`);
301
302
  const codeContent = (0, remove_surrounding_block_1.removeSurroundingBlock)(updateReferencesInCode(useValue, options, blockOptions));
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.componentToLiquid = exports.isValidLiquidBinding = void 0;
4
+ const event_handlers_1 = require("../../helpers/event-handlers");
4
5
  const standalone_1 = require("prettier/standalone");
5
6
  const html_tags_1 = require("../../constants/html_tags");
6
7
  const fast_clone_1 = require("../../helpers/fast-clone");
@@ -89,7 +90,7 @@ const blockToLiquid = (json, options = {}) => {
89
90
  const { code: value } = json.bindings[key];
90
91
  // TODO: proper babel transform to replace. Util for this
91
92
  const useValue = (0, strip_state_and_props_refs_1.stripStateAndPropsRefs)(value);
92
- if (key.startsWith('on')) {
93
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
93
94
  // Do nothing
94
95
  }
95
96
  else if ((0, exports.isValidLiquidBinding)(useValue)) {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.componentToLit = void 0;
4
4
  const dash_case_1 = require("../../helpers/dash-case");
5
5
  const dedent_1 = require("../../helpers/dedent");
6
+ const event_handlers_1 = require("../../helpers/event-handlers");
6
7
  const fast_clone_1 = require("../../helpers/fast-clone");
7
8
  const filter_empty_text_nodes_1 = require("../../helpers/filter-empty-text-nodes");
8
9
  const get_props_1 = require("../../helpers/get-props");
@@ -80,7 +81,7 @@ const blockToLit = (json, options = {}) => {
80
81
  // https://lit.dev/docs/templates/directives/#ref
81
82
  str += ` ref="${code}" `;
82
83
  }
83
- else if (key.startsWith('on')) {
84
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
84
85
  const asyncKeyword = ((_g = json.bindings[key]) === null || _g === void 0 ? void 0 : _g.async) ? 'async ' : '';
85
86
  const useKey = '@' + key.substring(2).toLowerCase();
86
87
  str += ` ${useKey}=\${${asyncKeyword}(${cusArgs.join(',')}) => ${processBinding(code)}} `;
@@ -7,6 +7,7 @@ exports.markoFormatHtml = exports.postprocessHtml = exports.preprocessHtml = exp
7
7
  const html_tags_1 = require("../../constants/html_tags");
8
8
  const dash_case_1 = require("../../helpers/dash-case");
9
9
  const dedent_1 = require("../../helpers/dedent");
10
+ const event_handlers_1 = require("../../helpers/event-handlers");
10
11
  const fast_clone_1 = require("../../helpers/fast-clone");
11
12
  const filter_empty_text_nodes_1 = require("../../helpers/filter-empty-text-nodes");
12
13
  const get_refs_1 = require("../../helpers/get-refs");
@@ -76,7 +77,7 @@ const blockToMarko = (json, options) => {
76
77
  else if (key === 'ref') {
77
78
  str += ` key="${(0, lodash_1.camelCase)(code)}" `;
78
79
  }
79
- else if (key.startsWith('on')) {
80
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
80
81
  const asyncKeyword = async ? 'async ' : '';
81
82
  const useKey = key === 'onChange' && json.name === 'input' ? 'onInput' : key;
82
83
  str += ` ${(0, dash_case_1.dashCase)(useKey)}=(${asyncKeyword}(${cusArgs.join(',')}) => ${processBinding(options.component, code)}) `;
@@ -4,22 +4,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.componentToMitosis = exports.blockToMitosis = exports.DEFAULT_FORMAT = void 0;
7
- const is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
8
- const plugins_1 = require("../../modules/plugins");
9
- const json5_1 = __importDefault(require("json5"));
10
- const standalone_1 = require("prettier/standalone");
11
7
  const hooks_1 = require("../../constants/hooks");
12
8
  const html_tags_1 = require("../../constants/html_tags");
13
9
  const dedent_1 = require("../../helpers/dedent");
10
+ const event_handlers_1 = require("../../helpers/event-handlers");
14
11
  const fast_clone_1 = require("../../helpers/fast-clone");
15
12
  const get_components_1 = require("../../helpers/get-components");
16
13
  const get_refs_1 = require("../../helpers/get-refs");
17
14
  const get_state_object_string_1 = require("../../helpers/get-state-object-string");
15
+ const is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
18
16
  const is_root_text_node_1 = require("../../helpers/is-root-text-node");
19
17
  const map_refs_1 = require("../../helpers/map-refs");
20
18
  const render_imports_1 = require("../../helpers/render-imports");
21
19
  const state_1 = require("../../helpers/state");
20
+ const plugins_1 = require("../../modules/plugins");
22
21
  const mitosis_node_1 = require("../../types/mitosis-node");
22
+ const json5_1 = __importDefault(require("json5"));
23
+ const standalone_1 = require("prettier/standalone");
23
24
  const react_1 = require("../react");
24
25
  exports.DEFAULT_FORMAT = 'legacy';
25
26
  // Special isValidAttributeName for Mitosis so we can allow for $ in names
@@ -120,7 +121,7 @@ const blockToMitosis = (json, toMitosisOptions = {}, component, insideJsx) => {
120
121
  if (((_g = json.bindings[key]) === null || _g === void 0 ? void 0 : _g.type) === 'spread') {
121
122
  str += ` {...(${(_h = json.bindings[key]) === null || _h === void 0 ? void 0 : _h.code})} `;
122
123
  }
123
- else if (key.startsWith('on')) {
124
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
124
125
  const { arguments: cusArgs = ['event'], async } = json.bindings[key];
125
126
  const asyncKeyword = async ? 'async ' : '';
126
127
  str += ` ${key}={${asyncKeyword}(${cusArgs.join(',')}) => ${value.replace(/\s*;$/, '')}} `;
@@ -4,8 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.addPreventDefault = void 0;
7
- const legacy_1 = __importDefault(require("neotraverse/legacy"));
7
+ const event_handlers_1 = require("../../../helpers/event-handlers");
8
8
  const is_mitosis_node_1 = require("../../../helpers/is-mitosis-node");
9
+ const legacy_1 = __importDefault(require("neotraverse/legacy"));
9
10
  /**
10
11
  * Find event handlers that explicitly call .preventDefault() and
11
12
  * add preventdefault:event
@@ -17,7 +18,7 @@ function addPreventDefault(json) {
17
18
  if ((0, is_mitosis_node_1.isMitosisNode)(node)) {
18
19
  if (node.bindings) {
19
20
  for (const key of Object.keys(node.bindings)) {
20
- if (key.startsWith('on')) {
21
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
21
22
  if ((_a = node.bindings[key]) === null || _a === void 0 ? void 0 : _a.code.includes('.preventDefault()')) {
22
23
  const event = key.slice(2).toLowerCase();
23
24
  node.properties['preventdefault:' + event] = '';
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderHandlers = void 0;
4
+ const event_handlers_1 = require("../../../helpers/event-handlers");
4
5
  const component_1 = require("../component");
5
6
  const src_generator_1 = require("../src-generator");
6
7
  const IIF_START = '(() => {';
@@ -55,5 +56,5 @@ function renderHandler(file, symbol, code) {
55
56
  });
56
57
  }
57
58
  function isEventName(name) {
58
- return name.startsWith('on') && name.charAt(2).toUpperCase() == name.charAt(2);
59
+ return (0, event_handlers_1.checkIsEvent)(name) && name.charAt(2).toUpperCase() == name.charAt(2);
59
60
  }
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  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;
7
7
  const parser_typescript_1 = __importDefault(require("prettier/parser-typescript"));
8
8
  const standalone_1 = require("prettier/standalone");
9
+ const event_handlers_1 = require("../../helpers/event-handlers");
9
10
  const html_tags_1 = require("../../constants/html_tags");
10
11
  const builder_1 = require("../../parsers/builder");
11
12
  const stable_serialize_1 = require("./helpers/stable-serialize");
@@ -410,7 +411,7 @@ class SrcBuilder {
410
411
  }
411
412
  exports.SrcBuilder = SrcBuilder;
412
413
  function isEvent(name) {
413
- return name.startsWith('on') && isUppercase(name.charAt(2)) && !name.endsWith('$');
414
+ return (0, event_handlers_1.checkIsEvent)(name) && isUppercase(name.charAt(2)) && !name.endsWith('$');
414
415
  }
415
416
  function isUppercase(ch) {
416
417
  return ch == ch.toUpperCase();
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.blockToReact = void 0;
7
+ const event_handlers_1 = require("../../helpers/event-handlers");
7
8
  const filter_empty_text_nodes_1 = require("../../helpers/filter-empty-text-nodes");
8
9
  const is_children_1 = __importDefault(require("../../helpers/is-children"));
9
10
  const is_root_text_node_1 = require("../../helpers/is-root-text-node");
@@ -243,7 +244,7 @@ const blockToReact = (json, options, component, insideJsx, parentSlots = []) =>
243
244
  if (((_d = json.bindings[key]) === null || _d === void 0 ? void 0 : _d.type) === 'spread') {
244
245
  str += ` {...(${value})} `;
245
246
  }
246
- else if (key.startsWith('on')) {
247
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
247
248
  const asyncKeyword = ((_e = json.bindings[key]) === null || _e === void 0 ? void 0 : _e.async) ? 'async ' : '';
248
249
  const { arguments: cusArgs = ['event'] } = json.bindings[key];
249
250
  const eventName = options.type === 'native' ? NATIVE_EVENT_MAPPER[key] || key : key;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.blockToSolid = void 0;
4
4
  const babel_transform_1 = require("../../helpers/babel-transform");
5
+ const event_handlers_1 = require("../../helpers/event-handlers");
5
6
  const filter_empty_text_nodes_1 = require("../../helpers/filter-empty-text-nodes");
6
7
  const is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
7
8
  const typescript_1 = require("../../helpers/typescript");
@@ -80,7 +81,7 @@ const blockToSolid = (json, component, options, insideJsx) => {
80
81
  if (type === 'spread') {
81
82
  str += ` {...(${code})} `;
82
83
  }
83
- else if (key.startsWith('on')) {
84
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
84
85
  const useKey = key === 'onChange' && json.name === 'input' ? 'onInput' : key;
85
86
  const asyncKeyword = ((_d = json.bindings[key]) === null || _d === void 0 ? void 0 : _d.async) ? 'async ' : '';
86
87
  str += ` ${useKey}={${asyncKeyword}(${cusArg.join(',')}) => ${code}} `;
@@ -2,9 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getImports = exports.getStencilCoreImportsAsString = exports.needsWrap = exports.getPropsAsCode = exports.getTagName = exports.processBinding = exports.isEvent = void 0;
4
4
  const dash_case_1 = require("../../../helpers/dash-case");
5
+ const event_handlers_1 = require("../../../helpers/event-handlers");
5
6
  const render_imports_1 = require("../../../helpers/render-imports");
6
7
  const strip_state_and_props_refs_1 = require("../../../helpers/strip-state-and-props-refs");
7
- const isEvent = (key) => key.startsWith('on');
8
+ const isEvent = (key) => (0, event_handlers_1.checkIsEvent)(key);
8
9
  exports.isEvent = isEvent;
9
10
  /**
10
11
  * We need to "emit" events those can be on multiple places, so we do it as post step
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.blockToSvelte = void 0;
7
7
  const bindings_1 = require("../../helpers/bindings");
8
+ const event_handlers_1 = require("../../helpers/event-handlers");
8
9
  const is_children_1 = __importDefault(require("../../helpers/is-children"));
9
10
  const is_upper_case_1 = require("../../helpers/is-upper-case");
10
11
  const for_1 = require("../../helpers/nodes/for");
@@ -174,7 +175,7 @@ const stringifyBinding = (node, options) => ([key, binding]) => {
174
175
  const spreadValue = key === 'props' ? '$$props' : code;
175
176
  return ` {...${spreadValue}} `;
176
177
  }
177
- else if (key.startsWith('on') && isValidHtmlTag) {
178
+ else if ((0, event_handlers_1.checkIsEvent)(key) && isValidHtmlTag) {
178
179
  const { async } = binding;
179
180
  // handle html native on[event] props
180
181
  const event = key.replace('on', '').toLowerCase();
@@ -188,7 +189,7 @@ const stringifyBinding = (node, options) => ([key, binding]) => {
188
189
  return ` on:${event}="{${asyncKeyword}(${cusArgs.join(',')}) => {${valueWithoutBlock}}}" `;
189
190
  }
190
191
  }
191
- else if (key.startsWith('on')) {
192
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
192
193
  // handle on[custom event] props
193
194
  const valueWithoutBlock = (0, remove_surrounding_block_1.removeSurroundingBlock)(code);
194
195
  if (valueWithoutBlock === key) {
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.componentToSwift = void 0;
7
+ const event_handlers_1 = require("../../helpers/event-handlers");
7
8
  const legacy_1 = __importDefault(require("neotraverse/legacy"));
8
9
  const dedent_1 = require("../../helpers/dedent");
9
10
  const fast_clone_1 = require("../../helpers/fast-clone");
@@ -123,7 +124,7 @@ const blockToSwift = (json, options) => {
123
124
  key === 'className') {
124
125
  continue;
125
126
  }
126
- if (key.startsWith('on')) {
127
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
127
128
  if (key === 'onClick') {
128
129
  continue;
129
130
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.componentToTemplate = void 0;
4
+ const event_handlers_1 = require("../../helpers/event-handlers");
4
5
  const standalone_1 = require("prettier/standalone");
5
6
  const html_tags_1 = require("../../constants/html_tags");
6
7
  const dedent_1 = require("../../helpers/dedent");
@@ -62,7 +63,7 @@ const blockToTemplate = (json, options = {}) => {
62
63
  const value = (_e = json.bindings[key]) === null || _e === void 0 ? void 0 : _e.code;
63
64
  // TODO: proper babel transform to replace. Util for this
64
65
  const useValue = value;
65
- if (key.startsWith('on')) {
66
+ if ((0, event_handlers_1.checkIsEvent)(key)) {
66
67
  // Do nothing
67
68
  }
68
69
  else {
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.blockToVue = void 0;
7
7
  const bindings_1 = require("../../helpers/bindings");
8
+ const event_handlers_1 = require("../../helpers/event-handlers");
8
9
  const filter_empty_text_nodes_1 = require("../../helpers/filter-empty-text-nodes");
9
10
  const is_children_1 = __importDefault(require("../../helpers/is-children"));
10
11
  const is_mitosis_node_1 = require("../../helpers/is-mitosis-node");
@@ -104,7 +105,7 @@ const stringifyBinding = (node, options) => ([key, value]) => {
104
105
  else {
105
106
  // TODO: proper babel transform to replace. Util for this
106
107
  const useValue = (value === null || value === void 0 ? void 0 : value.code) || '';
107
- if (key.startsWith('on') && isValidHtmlTag) {
108
+ if ((0, event_handlers_1.checkIsEvent)(key) && isValidHtmlTag) {
108
109
  // handle html native on[event] props
109
110
  const { arguments: cusArgs = ['event'], async } = value;
110
111
  let event = key.replace('on', '').toLowerCase();
@@ -123,7 +124,7 @@ const stringifyBinding = (node, options) => ([key, value]) => {
123
124
  const eventHandlerKey = `${SPECIAL_PROPERTIES.V_ON_AT}${event}`;
124
125
  return `${eventHandlerKey}="${eventHandlerValue}"`;
125
126
  }
126
- else if (key.startsWith('on')) {
127
+ else if ((0, event_handlers_1.checkIsEvent)(key)) {
127
128
  // handle on[custom event] props
128
129
  const { arguments: cusArgs = ['event'] } = node.bindings[key];
129
130
  return `:${key}="(${cusArgs.join(',')}) => ${(0, helpers_1.encodeQuotes)(useValue)}"`;
@@ -1 +1,2 @@
1
- export declare const checkIsBindingEventHandler: (code: string) => boolean;
1
+ export declare const checkIsEvent: (code: string) => boolean;
2
+ export declare const checkIsBindingNativeEvent: (code: string) => boolean;