@builder.io/mitosis 0.0.75 → 0.0.77-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/src/generators/alpine/generate.d.ts +20 -0
  2. package/dist/src/generators/alpine/generate.js +207 -0
  3. package/dist/src/generators/alpine/index.d.ts +1 -0
  4. package/dist/src/generators/alpine/index.js +17 -0
  5. package/dist/src/generators/alpine/render-mount-hook.d.ts +2 -0
  6. package/dist/src/generators/alpine/render-mount-hook.js +14 -0
  7. package/dist/src/generators/alpine/render-update-hooks.d.ts +5 -0
  8. package/dist/src/generators/alpine/render-update-hooks.js +44 -0
  9. package/dist/src/generators/angular.d.ts +2 -3
  10. package/dist/src/generators/angular.js +89 -97
  11. package/dist/src/generators/helpers/functions.js +2 -1
  12. package/dist/src/generators/html.js +1 -1
  13. package/dist/src/generators/qwik/component-generator.js +8 -1
  14. package/dist/src/generators/svelte/blocks.js +19 -21
  15. package/dist/src/generators/svelte/helpers.d.ts +5 -1
  16. package/dist/src/generators/svelte/helpers.js +8 -5
  17. package/dist/src/generators/svelte/svelte.js +34 -31
  18. package/dist/src/generators/swift-ui.js +1 -1
  19. package/dist/src/generators/vue/blocks.js +4 -2
  20. package/dist/src/generators/vue/compositionApi.js +3 -1
  21. package/dist/src/generators/vue/helpers.d.ts +2 -2
  22. package/dist/src/generators/vue/helpers.js +13 -5
  23. package/dist/src/generators/vue/optionsApi.js +0 -5
  24. package/dist/src/generators/vue/vue.js +4 -26
  25. package/dist/src/helpers/babel-transform.d.ts +2 -1
  26. package/dist/src/helpers/babel-transform.js +16 -19
  27. package/dist/src/helpers/get-state-object-string.d.ts +1 -1
  28. package/dist/src/helpers/get-state-object-string.js +5 -5
  29. package/dist/src/helpers/has-bindings-text.js +1 -1
  30. package/dist/src/helpers/is-children.d.ts +4 -1
  31. package/dist/src/helpers/is-children.js +5 -4
  32. package/dist/src/helpers/patterns.d.ts +1 -0
  33. package/dist/src/helpers/patterns.js +3 -1
  34. package/dist/src/helpers/plugins/process-code.js +1 -1
  35. package/dist/src/helpers/render-imports.d.ts +11 -3
  36. package/dist/src/helpers/render-imports.js +18 -4
  37. package/dist/src/helpers/styles/helpers.d.ts +0 -1
  38. package/dist/src/helpers/traverse-nodes.d.ts +1 -1
  39. package/dist/src/helpers/traverse-nodes.js +3 -3
  40. package/dist/src/index.d.ts +1 -1
  41. package/dist/src/index.js +2 -3
  42. package/dist/src/parsers/builder.d.ts +4 -4
  43. package/dist/src/parsers/jsx/function-parser.js +8 -0
  44. package/dist/src/parsers/jsx/metadata.js +17 -1
  45. package/dist/src/parsers/jsx/state.js +6 -1
  46. package/dist/src/plugins/map-styles.js +1 -1
  47. package/dist/src/targets.d.ts +1 -0
  48. package/dist/src/targets.js +2 -0
  49. package/dist/src/types/mitosis-component.d.ts +4 -8
  50. package/dist/tsconfig.build.tsbuildinfo +1 -1
  51. package/jsx-runtime.d.ts +2 -0
  52. package/package.json +9 -10
@@ -0,0 +1,20 @@
1
+ import { MitosisNode } from '../../types/mitosis-node';
2
+ import { BaseTranspilerOptions, TranspilerGenerator } from '../../types/transpiler';
3
+ export interface ToAlpineOptions extends BaseTranspilerOptions {
4
+ /**
5
+ * use @on and : instead of `x-on` and `x-bind`
6
+ */
7
+ useShorthandSyntax?: boolean;
8
+ /**
9
+ * If true, the javascript won't be extracted into a separate script block.
10
+ */
11
+ inlineState?: boolean;
12
+ }
13
+ export declare const checkIsComponentNode: (node: MitosisNode) => boolean;
14
+ /**
15
+ * Test if the binding expression would be likely to generate
16
+ * valid or invalid liquid. If we generate invalid liquid tags
17
+ * Shopify will reject our PUT to update the template
18
+ */
19
+ export declare const isValidAlpineBinding: (str?: string) => boolean;
20
+ export declare const componentToAlpine: TranspilerGenerator<ToAlpineOptions>;
@@ -0,0 +1,207 @@
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.componentToAlpine = exports.isValidAlpineBinding = exports.checkIsComponentNode = void 0;
15
+ var standalone_1 = require("prettier/standalone");
16
+ var collect_css_1 = require("../../helpers/styles/collect-css");
17
+ var fast_clone_1 = require("../../helpers/fast-clone");
18
+ var strip_state_and_props_refs_1 = require("../../helpers/strip-state-and-props-refs");
19
+ var jsx_1 = require("../../parsers/jsx");
20
+ var mitosis_node_1 = require("../../types/mitosis-node");
21
+ var plugins_1 = require("../../modules/plugins");
22
+ var strip_meta_properties_1 = require("../../helpers/strip-meta-properties");
23
+ var get_state_object_string_1 = require("../../helpers/get-state-object-string");
24
+ var dash_case_1 = require("../../helpers/dash-case");
25
+ var remove_surrounding_block_1 = require("../../helpers/remove-surrounding-block");
26
+ var lodash_1 = require("lodash");
27
+ var get_refs_1 = require("../../helpers/get-refs");
28
+ var render_update_hooks_1 = require("./render-update-hooks");
29
+ var render_mount_hook_1 = require("./render-mount-hook");
30
+ var babel_transform_1 = require("../../helpers/babel-transform");
31
+ var checkIsComponentNode = function (node) {
32
+ return node.name === '@builder.io/mitosis/component';
33
+ };
34
+ exports.checkIsComponentNode = checkIsComponentNode;
35
+ /**
36
+ * Test if the binding expression would be likely to generate
37
+ * valid or invalid liquid. If we generate invalid liquid tags
38
+ * Shopify will reject our PUT to update the template
39
+ */
40
+ var isValidAlpineBinding = function (str) {
41
+ if (str === void 0) { str = ''; }
42
+ return true;
43
+ /*
44
+ const strictMatches = Boolean(
45
+ // Test for our `context.shopify.liquid.*(expression), which
46
+ // we regex out later to transform back into valid liquid expressions
47
+ str.match(/(context|ctx)\s*(\.shopify\s*)?\.liquid\s*\./),
48
+ );
49
+
50
+ return (
51
+ strictMatches ||
52
+ // Test is the expression is simple and would map to Shopify bindings // Test for our `context.shopify.liquid.*(expression), which
53
+ // e.g. `state.product.price` -> `{{product.price}} // we regex out later to transform back into valid liquid expressions
54
+ Boolean(str.match(/^[a-z0-9_\.\s]+$/i))
55
+ );
56
+ */
57
+ };
58
+ exports.isValidAlpineBinding = isValidAlpineBinding;
59
+ var removeOnFromEventName = function (str) { return str.replace(/^on/, ''); };
60
+ var prefixEvent = function (str) { return str.replace(/(?<=[\s]|^)event/gm, '$event'); };
61
+ var removeTrailingSemicolon = function (str) { return str.replace(/;$/, ''); };
62
+ var trim = function (str) { return str.trim(); };
63
+ var replaceInputRefs = (0, lodash_1.curry)(function (json, str) {
64
+ (0, get_refs_1.getRefs)(json).forEach(function (value) {
65
+ str = str.replaceAll(value, "this.$refs.".concat(value));
66
+ });
67
+ return str;
68
+ });
69
+ var replaceStateWithThis = function (str) { return str.replaceAll('state.', 'this.'); };
70
+ var getStateObjectString = function (json) {
71
+ return (0, lodash_1.flow)(get_state_object_string_1.getStateObjectStringFromComponent, trim, replaceInputRefs(json), (0, render_mount_hook_1.renderMountHook)(json), (0, render_update_hooks_1.renderUpdateHooks)(json), replaceStateWithThis)(json);
72
+ };
73
+ var bindEventHandlerKey = (0, lodash_1.flowRight)(dash_case_1.dashCase, removeOnFromEventName);
74
+ var bindEventHandlerValue = (0, lodash_1.flowRight)(prefixEvent, removeTrailingSemicolon, trim, remove_surrounding_block_1.removeSurroundingBlock, strip_state_and_props_refs_1.stripStateAndPropsRefs);
75
+ var bindEventHandler = function (_a) {
76
+ var useShorthandSyntax = _a.useShorthandSyntax;
77
+ return function (eventName, code) {
78
+ var bind = useShorthandSyntax ? '@' : 'x-on:';
79
+ return " ".concat(bind).concat(bindEventHandlerKey(eventName), "=\"").concat(bindEventHandlerValue(code).trim(), "\"");
80
+ };
81
+ };
82
+ var mappers = {
83
+ For: function (json, options) {
84
+ var _a, _b, _c;
85
+ return !((0, mitosis_node_1.checkIsForNode)(json) &&
86
+ (0, exports.isValidAlpineBinding)((_a = json.bindings.each) === null || _a === void 0 ? void 0 : _a.code) &&
87
+ (0, exports.isValidAlpineBinding)(json.scope.forName))
88
+ ? ''
89
+ : "<template x-for=\"".concat(json.scope.forName, " in ").concat((0, strip_state_and_props_refs_1.stripStateAndPropsRefs)((_b = json.bindings.each) === null || _b === void 0 ? void 0 : _b.code), "\">\n ").concat(((_c = json.children) !== null && _c !== void 0 ? _c : []).map(function (item) { return blockToAlpine(item, options); }).join('\n'), "\n </template>");
90
+ },
91
+ Fragment: function (json, options) { return blockToAlpine(__assign(__assign({}, json), { name: 'div' }), options); },
92
+ Show: function (json, options) {
93
+ var _a, _b, _c;
94
+ return !(0, exports.isValidAlpineBinding)((_a = json.bindings.when) === null || _a === void 0 ? void 0 : _a.code)
95
+ ? ''
96
+ : "<template x-if=\"".concat((0, strip_state_and_props_refs_1.stripStateAndPropsRefs)((_b = json.bindings.when) === null || _b === void 0 ? void 0 : _b.code), "\">\n ").concat(((_c = json.children) !== null && _c !== void 0 ? _c : []).map(function (item) { return blockToAlpine(item, options); }).join('\n'), "\n </template>");
97
+ },
98
+ };
99
+ // TODO: spread support
100
+ var blockToAlpine = function (json, options) {
101
+ var _a, _b;
102
+ if (options === void 0) { options = {}; }
103
+ if (mappers[json.name]) {
104
+ return mappers[json.name](json, options);
105
+ }
106
+ // TODO: Add support for `{props.children}` bindings
107
+ if (json.properties._text) {
108
+ return json.properties._text;
109
+ }
110
+ if ((_a = json.bindings._text) === null || _a === void 0 ? void 0 : _a.code) {
111
+ return (0, exports.isValidAlpineBinding)(json.bindings._text.code)
112
+ ? "<span x-html=\"".concat((0, strip_state_and_props_refs_1.stripStateAndPropsRefs)(json.bindings._text.code), "\"></span>")
113
+ : '';
114
+ }
115
+ var str = "<".concat(json.name, " ");
116
+ /*
117
+ // Copied from the liquid generator. Not sure what it does.
118
+ if (
119
+ json.bindings._spread?.code === '_spread' &&
120
+ isValidAlpineBinding(json.bindings._spread.code)
121
+ ) {
122
+ str += `
123
+ <template x-for="_attr in ${json.bindings._spread.code}">
124
+ {{ _attr[0] }}="{{ _attr[1] }}"
125
+ </template>
126
+ `;
127
+ }
128
+ */
129
+ for (var key in json.properties) {
130
+ var value = json.properties[key];
131
+ str += " ".concat(key, "=\"").concat(value, "\" ");
132
+ }
133
+ for (var key in json.bindings) {
134
+ if (key === '_spread' || key === 'css') {
135
+ continue;
136
+ }
137
+ var _c = json.bindings[key], value = _c.code, bindingType = _c.type;
138
+ // TODO: proper babel transform to replace. Util for this
139
+ var useValue = (0, strip_state_and_props_refs_1.stripStateAndPropsRefs)(value);
140
+ if (key.startsWith('on')) {
141
+ str += bindEventHandler(options)(key, value);
142
+ }
143
+ else if (key === 'ref') {
144
+ str += " x-ref=\"".concat(useValue, "\"");
145
+ }
146
+ else if ((0, exports.isValidAlpineBinding)(useValue)) {
147
+ var bind = options.useShorthandSyntax && bindingType !== 'spread' ? ':' : 'x-bind:';
148
+ str += " ".concat(bind).concat(bindingType === 'spread' ? '' : key, "=\"").concat(useValue, "\" ").replace(':=', '=');
149
+ }
150
+ }
151
+ return jsx_1.selfClosingTags.has(json.name)
152
+ ? "".concat(str, " />")
153
+ : "".concat(str, ">").concat(((_b = json.children) !== null && _b !== void 0 ? _b : []).map(function (item) { return blockToAlpine(item, options); }).join('\n'), "</").concat(json.name, ">");
154
+ };
155
+ var componentToAlpine = function (options) {
156
+ if (options === void 0) { options = {}; }
157
+ return function (_a) {
158
+ var component = _a.component;
159
+ var json = (0, fast_clone_1.fastClone)(component);
160
+ if (options.plugins) {
161
+ json = (0, plugins_1.runPreJsonPlugins)(json, options.plugins);
162
+ }
163
+ var css = (0, collect_css_1.collectCss)(json);
164
+ (0, strip_meta_properties_1.stripMetaProperties)(json);
165
+ if (options.plugins) {
166
+ json = (0, plugins_1.runPostJsonPlugins)(json, options.plugins);
167
+ }
168
+ var stateObjectString = getStateObjectString(json);
169
+ // Set x-data on root element
170
+ json.children[0].properties['x-data'] = options.inlineState
171
+ ? stateObjectString
172
+ : "".concat((0, lodash_1.camelCase)(json.name), "()");
173
+ if ((0, render_update_hooks_1.hasRootUpdateHook)(json)) {
174
+ json.children[0].properties['x-effect'] = 'onUpdate';
175
+ }
176
+ var str = css.trim().length ? "<style>".concat(css, "</style>") : '';
177
+ str += json.children.map(function (item) { return blockToAlpine(item, options); }).join('\n');
178
+ if (!options.inlineState) {
179
+ str += "<script>\n ".concat((0, babel_transform_1.babelTransformCode)("document.addEventListener('alpine:init', () => {\n Alpine.data('".concat((0, lodash_1.camelCase)(json.name), "', () => (").concat(stateObjectString, "))\n })")), "\n </script>");
180
+ }
181
+ if (options.plugins) {
182
+ str = (0, plugins_1.runPreCodePlugins)(str, options.plugins);
183
+ }
184
+ if (options.prettier !== false) {
185
+ try {
186
+ str = (0, standalone_1.format)(str, {
187
+ parser: 'html',
188
+ htmlWhitespaceSensitivity: 'ignore',
189
+ plugins: [
190
+ // To support running in browsers
191
+ require('prettier/parser-html'),
192
+ require('prettier/parser-postcss'),
193
+ require('prettier/parser-babel'),
194
+ ],
195
+ });
196
+ }
197
+ catch (err) {
198
+ console.warn('Could not prettify', { string: str }, err);
199
+ }
200
+ }
201
+ if (options.plugins) {
202
+ str = (0, plugins_1.runPostCodePlugins)(str, options.plugins);
203
+ }
204
+ return str;
205
+ };
206
+ };
207
+ exports.componentToAlpine = componentToAlpine;
@@ -0,0 +1 @@
1
+ export * from './generate';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./generate"), exports);
@@ -0,0 +1,2 @@
1
+ import { MitosisComponent } from '../../types/mitosis-component';
2
+ export declare const renderMountHook: import("lodash").CurriedFunction2<MitosisComponent, string, string>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMountHook = void 0;
4
+ var lodash_1 = require("lodash");
5
+ var render_update_hooks_1 = require("./render-update-hooks");
6
+ function shouldRenderMountHook(json) {
7
+ return json.hooks.onMount !== undefined || (0, render_update_hooks_1.hasWatchHooks)(json);
8
+ }
9
+ exports.renderMountHook = (0, lodash_1.curry)(function (json, objectString) {
10
+ var _a, _b;
11
+ return shouldRenderMountHook(json)
12
+ ? objectString.replace(/(?:,)?(\s*)(}\s*)$/, ", init() {\n ".concat((0, render_update_hooks_1.renderWatchHooks)(json), "\n ").concat((_b = (_a = json.hooks.onMount) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : '', "\n }$1$2"))
13
+ : objectString;
14
+ });
@@ -0,0 +1,5 @@
1
+ import { MitosisComponent } from '../../types/mitosis-component';
2
+ export declare function hasRootUpdateHook(json: MitosisComponent): boolean;
3
+ export declare const renderUpdateHooks: import("lodash").CurriedFunction2<MitosisComponent, string, string>;
4
+ export declare const hasWatchHooks: (json: MitosisComponent) => boolean;
5
+ export declare const renderWatchHooks: (json: MitosisComponent) => string;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderWatchHooks = exports.hasWatchHooks = exports.renderUpdateHooks = exports.hasRootUpdateHook = void 0;
4
+ var lodash_1 = require("lodash");
5
+ var extractCode = function (hook) { return hook.code; };
6
+ function renderRootUpdateHook(hooks, output) {
7
+ if (hooks.length === 0) {
8
+ return output;
9
+ }
10
+ var str = "onUpdate() {\n ".concat(hooks.map(extractCode).join('\n'), "\n }");
11
+ return output.replace(/,?(\s*})$/, ",\n".concat(str, "$1"));
12
+ }
13
+ function getRootUpdateHooks(json) {
14
+ var _a;
15
+ return ((_a = json.hooks.onUpdate) !== null && _a !== void 0 ? _a : []).filter(function (hook) { return hook.deps == ''; });
16
+ }
17
+ function hasRootUpdateHook(json) {
18
+ return getRootUpdateHooks(json).length > 0;
19
+ }
20
+ exports.hasRootUpdateHook = hasRootUpdateHook;
21
+ exports.renderUpdateHooks = (0, lodash_1.curry)(function (json, output) {
22
+ return renderRootUpdateHook(getRootUpdateHooks(json), output);
23
+ });
24
+ function getWatchHooks(json) {
25
+ var _a;
26
+ return ((_a = json.hooks.onUpdate) !== null && _a !== void 0 ? _a : []).filter(function (hook) { var _a; return (_a = hook.deps) === null || _a === void 0 ? void 0 : _a.match(/state|this/); });
27
+ }
28
+ var hasWatchHooks = function (json) {
29
+ return getWatchHooks(json).length > 0;
30
+ };
31
+ exports.hasWatchHooks = hasWatchHooks;
32
+ function renderWatchHook(hook) {
33
+ var _a, _b;
34
+ var deps = (_b = ((_a = hook.deps) !== null && _a !== void 0 ? _a : '')) === null || _b === void 0 ? void 0 : _b.slice(1).slice(0, -1).split(', ').filter(function (dep) { return dep.match(/state|this/); });
35
+ return deps
36
+ .map(function (dep) {
37
+ return "this.$watch('".concat(dep.replace(/(state|this)\./, ''), "', (value, oldValue) => { ").concat(hook.code, " });");
38
+ })
39
+ .join('\n');
40
+ }
41
+ var renderWatchHooks = function (json) {
42
+ return (0, exports.hasWatchHooks)(json) ? getWatchHooks(json).map(renderWatchHook).join('\n') : '';
43
+ };
44
+ exports.renderWatchHooks = renderWatchHooks;
@@ -4,12 +4,11 @@ export interface ToAngularOptions extends BaseTranspilerOptions {
4
4
  standalone?: boolean;
5
5
  preserveImports?: boolean;
6
6
  preserveFileExtensions?: boolean;
7
+ importMapper?: Function;
8
+ bootstrapMapper?: Function;
7
9
  }
8
10
  interface AngularBlockOptions {
9
- contextVars?: string[];
10
- outputVars?: string[];
11
11
  childComponents?: string[];
12
- domRefs?: string[];
13
12
  }
14
13
  export declare const blockToAngular: (json: MitosisNode, options?: ToAngularOptions, blockOptions?: AngularBlockOptions) => string;
15
14
  export declare const componentToAngular: TranspilerGenerator<ToAngularOptions>;