@uibit/codegen 0.1.0 → 0.2.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.
@@ -1,43 +1,159 @@
1
- import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports, toReactEventName } from '../core/utils.js';
1
+ import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports, toReactEventName, sanitizeEventType } from '../core/utils.js';
2
+ import swc from '@swc/core';
2
3
  export const reactPlugin = {
3
4
  name: 'react',
4
5
  generate(component) {
5
6
  return {
6
- 'index.d.ts': buildDTS(component)
7
+ 'index.ts': buildTS(component)
7
8
  };
8
9
  }
9
10
  };
10
- function buildDTS(component) {
11
+ function buildTS(component) {
11
12
  const { name, tagName, properties, attributes, events = [], referencedTypes, importPath = '../../index.js' } = component;
12
13
  const builder = new SourceBuilder();
13
- builder.append(`import type { HTMLAttributes, ClassAttributes } from 'react';
14
+ const propMap = mergePropertiesAndAttributes(properties, attributes);
15
+ builder.append(`import React, { useRef, useEffect, useLayoutEffect, useImperativeHandle } from 'react';
14
16
  import type { ${name} as HTMLElementClass } from '${importPath}';
15
17
  import '${importPath}';
16
- ${generateTypeImports(referencedTypes, importPath)}`);
17
- const propMap = mergePropertiesAndAttributes(properties, attributes);
18
- let propTypes = Array.from(propMap.entries()).map(([propName, propType]) => {
19
- return ` ${propName}?: ${propType};`;
18
+ ${generateTypeImports(referencedTypes, importPath)}
19
+
20
+ const useTypeOfLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;`);
21
+ const eventMap = new Map();
22
+ for (const e of events) {
23
+ eventMap.set(e.name, toReactEventName(e.name));
24
+ }
25
+ const reactProps = new Map();
26
+ for (const [eventName, reactPropName] of eventMap.entries()) {
27
+ if (!reactProps.has(reactPropName)) {
28
+ reactProps.set(reactPropName, []);
29
+ }
30
+ reactProps.get(reactPropName).push(eventName);
31
+ }
32
+ const propTypes = Array.from(propMap.entries()).map(([propName, propType]) => {
33
+ const isComplex = propType.includes('[]') || propType.includes('Array') || propType.includes('Record') || propType.includes('Object') || propType.startsWith('{');
34
+ const typeStr = isComplex ? `${propType} | string` : propType;
35
+ return ` ${propName}?: ${typeStr};`;
36
+ }).join('\n');
37
+ const eventTypes = Array.from(reactProps.entries()).map(([reactPropName, eventNames]) => {
38
+ const unionTypes = eventNames.map(eventName => {
39
+ const e = events.find(event => event.name === eventName);
40
+ return e.type?.text
41
+ ? `CustomEvent<${sanitizeEventType(e.type.text)}>`
42
+ : `Event`;
43
+ });
44
+ const uniqueTypes = Array.from(new Set(unionTypes));
45
+ return ` ${reactPropName}?: (event: ${uniqueTypes.join(' | ')}) => void;`;
20
46
  }).join('\n');
21
- if (events.length > 0) {
22
- const eventTypes = events.map(e => {
23
- const reactEventName = toReactEventName(e.name);
24
- return ` ${reactEventName}?: (event: any) => void;`;
25
- }).join('\n');
26
- propTypes = propTypes + '\n' + eventTypes;
27
- }
28
- builder.append(`declare global {
47
+ const uniqueReactEventProps = Array.from(reactProps.keys());
48
+ const omitKeys = [
49
+ ...Array.from(propMap.keys()).map(k => `'${k}'`),
50
+ ...uniqueReactEventProps.map(k => `'${k}'`)
51
+ ].join(' | ');
52
+ builder.append(`export interface ${name}Props extends Omit<React.HTMLAttributes<HTMLElementClass>, ${omitKeys}> {
53
+ children?: React.ReactNode;
54
+ ${propTypes}
55
+ ${eventTypes}
56
+ }`);
57
+ const effectHooks = [];
58
+ // Prop-sync effects
59
+ for (const propName of propMap.keys()) {
60
+ effectHooks.push(` useTypeOfLayoutEffect(() => {
61
+ const element = innerRef.current;
62
+ if (element && props.${propName} !== undefined) {
63
+ (element as any).${propName} = props.${propName};
64
+ }
65
+ }, [props.${propName}]);`);
66
+ }
67
+ // Event-listener effects
68
+ for (const [eventName, reactPropName] of eventMap.entries()) {
69
+ effectHooks.push(` useTypeOfLayoutEffect(() => {
70
+ const element = innerRef.current;
71
+ if (!element) return;
72
+
73
+ const handleEvent = (event: Event) => {
74
+ if (propsRef.current.${reactPropName}) {
75
+ propsRef.current.${reactPropName}(event as any);
76
+ }
77
+ };
78
+
79
+ element.addEventListener('${eventName}', handleEvent);
80
+ return () => {
81
+ element.removeEventListener('${eventName}', handleEvent);
82
+ };
83
+ }, []);`);
84
+ }
85
+ const customPropNames = [
86
+ ...Array.from(propMap.keys()).map(k => `'${k}'`),
87
+ ...uniqueReactEventProps.map(k => `'${k}'`)
88
+ ];
89
+ builder.append(`export const ${name} = ({
90
+ ref,
91
+ children,
92
+ ...props
93
+ }: ${name}Props & { ref?: React.Ref<HTMLElementClass> }) => {
94
+ const innerRef = useRef<HTMLElementClass>(null);
95
+ const propsRef = useRef(props);
96
+ propsRef.current = props;
97
+
98
+ useImperativeHandle(ref, () => innerRef.current!);
99
+
100
+ ${effectHooks.join('\n\n')}
101
+
102
+ const domProps = { ...props };
103
+ const customPropNames = [${customPropNames.join(', ')}];
104
+ for (const key of customPropNames) {
105
+ delete (domProps as any)[key];
106
+ }
107
+
108
+ return React.createElement('${tagName}', {
109
+ ref: innerRef,
110
+ ...domProps
111
+ }, children);
112
+ };
113
+
114
+ declare global {
29
115
  namespace React {
30
116
  namespace JSX {
31
117
  interface IntrinsicElements {
32
- '${tagName}': ClassAttributes<HTMLElementClass> & HTMLAttributes<HTMLElementClass> & {
118
+ '${tagName}': React.ClassAttributes<HTMLElementClass> & React.HTMLAttributes<HTMLElementClass> & {
33
119
  children?: React.ReactNode;
34
120
  class?: string;
35
- ${propTypes}
121
+ ${Array.from(propMap.entries()).map(([name, type]) => {
122
+ const isComplex = type.includes('[]') || type.includes('Array') || type.includes('Record') || type.includes('Object') || type.startsWith('{');
123
+ const typeStr = isComplex ? `${type} | string` : type;
124
+ return ` ${name}?: ${typeStr};`;
125
+ }).join('\n')}
126
+ ${Array.from(reactProps.entries()).map(([reactPropName, eventNames]) => {
127
+ const unionTypes = eventNames.map(eventName => {
128
+ const e = events.find(event => event.name === eventName);
129
+ return `CustomEvent<${sanitizeEventType(e.type?.text)}>`;
130
+ });
131
+ const uniqueTypes = Array.from(new Set(unionTypes));
132
+ return ` ${reactPropName}?: (event: ${uniqueTypes.join(' | ')}) => void;`;
133
+ }).join('\n')}
36
134
  };
37
135
  }
38
136
  }
39
137
  }
40
- }`);
41
- return builder.toString();
138
+ }
139
+ `);
140
+ const rawSource = builder.toString();
141
+ try {
142
+ const ast = swc.parseSync(rawSource, {
143
+ syntax: 'typescript',
144
+ tsx: true,
145
+ decorators: true,
146
+ comments: true,
147
+ target: 'es2022'
148
+ });
149
+ const output = swc.printSync(ast, {
150
+ minify: false
151
+ });
152
+ return output.code;
153
+ }
154
+ catch (e) {
155
+ console.error(`Error: Failed to parse generated React component for ${component.name}:`, e);
156
+ throw e;
157
+ }
42
158
  }
43
159
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/templates/react.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,OAAO;IACb,QAAQ,CAAC,SAA4B;QACnC,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC;SAClC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,QAAQ,CAAC,SAA4B;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,EAAE,eAAe,EAAE,UAAU,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACzH,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAEpC,OAAO,CAAC,MAAM,CAAC;gBACD,IAAI,gCAAgC,UAAU;UACpD,UAAU;EAClB,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,4BAA4B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;QACzE,OAAO,SAAS,QAAQ,MAAM,QAAQ,GAAG,CAAC;IAC5C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAChC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,SAAS,cAAc,0BAA0B,CAAC;QAC3D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,UAAU,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,MAAM,CAAC;;;;WAIN,OAAO;;;EAGhB,SAAS;;;;;EAKT,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/templates/react.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports } from '../core/utils.js';
1
+ import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports, sanitizeEventType } from '../core/utils.js';
2
2
  export const solidPlugin = {
3
3
  name: 'solid',
4
4
  generate(component) {
@@ -16,13 +16,16 @@ function renderSolidImports(name, referencedTypes, importPath) {
16
16
  ].filter(Boolean).join('\n');
17
17
  }
18
18
  function renderSolidModuleDeclaration(component) {
19
- const { tagName, properties, attributes, events } = component;
19
+ const { tagName, properties, attributes, events = [] } = component;
20
20
  const propMap = mergePropertiesAndAttributes(properties, attributes);
21
21
  const propTypes = Array.from(propMap.entries())
22
22
  .map(([propName, propType]) => ` ${propName}?: ${propType};`)
23
23
  .join('\n');
24
24
  const eventTypes = events
25
- .map(e => ` "on:${e.name}"?: (event: CustomEvent) => void;`)
25
+ .map(e => {
26
+ const detailType = e.type?.text ? `CustomEvent<${sanitizeEventType(e.type.text)}>` : `Event`;
27
+ return ` "on:${e.name}"?: (event: ${detailType}) => void;`;
28
+ })
26
29
  .join('\n');
27
30
  return `declare module 'solid-js' {
28
31
  namespace JSX {
@@ -1 +1 @@
1
- {"version":3,"file":"solid.js","sourceRoot":"","sources":["../../src/templates/solid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEpG,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,OAAO;IACb,QAAQ,CAAC,SAA4B;QACnC,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC;SAClC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,kBAAkB,CAAC,IAAY,EAAE,eAAyB,EAAE,UAAkB;IACrF,OAAO;QACL,sCAAsC;QACtC,iBAAiB,IAAI,gCAAgC,UAAU,IAAI;QACnE,WAAW,UAAU,IAAI;QACzB,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC;KACjD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,4BAA4B,CAAC,SAA4B;IAChE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9D,MAAM,OAAO,GAAG,4BAA4B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,QAAQ,MAAM,QAAQ,GAAG,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,MAAM;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,mCAAmC,CAAC;SAChE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;SAGA,OAAO;UACN,SAAS;EACjB,UAAU;;;;EAIV,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,SAA4B;IAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,gBAAgB,CAAC;IAC5D,OAAO,IAAI,aAAa,EAAE;SACvB,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;SACjF,MAAM,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;SAC/C,QAAQ,EAAE,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"solid.js","sourceRoot":"","sources":["../../src/templates/solid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEvH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,OAAO;IACb,QAAQ,CAAC,SAA4B;QACnC,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC;SAClC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,kBAAkB,CAAC,IAAY,EAAE,eAAyB,EAAE,UAAkB;IACrF,OAAO;QACL,sCAAsC;QACtC,iBAAiB,IAAI,gCAAgC,UAAU,IAAI;QACnE,WAAW,UAAU,IAAI;QACzB,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC;KACjD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,4BAA4B,CAAC,SAA4B;IAChE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC;IACnE,MAAM,OAAO,GAAG,4BAA4B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,SAAS,QAAQ,MAAM,QAAQ,GAAG,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,MAAM;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7F,OAAO,aAAa,CAAC,CAAC,IAAI,eAAe,UAAU,YAAY,CAAC;IAClE,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;SAGA,OAAO;UACN,SAAS;EACjB,UAAU;;;;EAIV,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,SAA4B;IAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,gBAAgB,CAAC;IAC5D,OAAO,IAAI,aAAa,EAAE;SACvB,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;SACjF,MAAM,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;SAC/C,QAAQ,EAAE,CAAC;AAChB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports } from '../core/utils.js';
1
+ import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports, toReactEventName, sanitizeEventType } from '../core/utils.js';
2
2
  export const stencilPlugin = {
3
3
  name: 'stencil',
4
4
  generate(component) {
@@ -8,7 +8,7 @@ export const stencilPlugin = {
8
8
  }
9
9
  };
10
10
  function buildDTS(component) {
11
- const { name, tagName, properties, attributes, referencedTypes, importPath = '../../index.js' } = component;
11
+ const { name, tagName, properties, attributes, events = [], referencedTypes, importPath = '../../index.js' } = component;
12
12
  const builder = new SourceBuilder();
13
13
  builder.append(`import type { ${name} as HTMLElementClass } from '${importPath}';
14
14
  import '${importPath}';
@@ -17,11 +17,17 @@ ${generateTypeImports(referencedTypes, importPath)}`);
17
17
  const propTypes = Array.from(propMap.entries()).map(([propName, propType]) => {
18
18
  return ` ${propName}?: ${propType};`;
19
19
  }).join('\n');
20
+ const eventTypes = events.map(e => {
21
+ const detailType = e.type?.text ? `CustomEvent<${sanitizeEventType(e.type.text)}>` : `Event`;
22
+ const reactName = toReactEventName(e.name);
23
+ return ` ${reactName}?: (event: ${detailType}) => void;\n "on:${e.name}"?: (event: ${detailType}) => void;`;
24
+ }).join('\n');
20
25
  builder.append(`declare module '@stencil/core' {
21
26
  export namespace JSX {
22
27
  interface IntrinsicElements {
23
28
  '${tagName}': HTMLElementClass & {
24
29
  ${propTypes}
30
+ ${eventTypes}
25
31
  };
26
32
  }
27
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stencil.js","sourceRoot":"","sources":["../../src/templates/stencil.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEpG,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,SAAS;IACf,QAAQ,CAAC,SAA4B;QACnC,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC;SAClC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,QAAQ,CAAC,SAA4B;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC5G,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAEpC,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,gCAAgC,UAAU;UACtE,UAAU;EAClB,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,4BAA4B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC3E,OAAO,OAAO,QAAQ,MAAM,QAAQ,GAAG,CAAC;IAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,CAAC,MAAM,CAAC;;;SAGR,OAAO;EACd,SAAS;;;;EAIT,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"stencil.js","sourceRoot":"","sources":["../../src/templates/stencil.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEzI,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,SAAS;IACf,QAAQ,CAAC,SAA4B;QACnC,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC;SAClC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,QAAQ,CAAC,SAA4B;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,EAAE,eAAe,EAAE,UAAU,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACzH,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAEpC,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,gCAAgC,UAAU;UACtE,UAAU;EAClB,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,4BAA4B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC3E,OAAO,OAAO,QAAQ,MAAM,QAAQ,GAAG,CAAC;IAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAChC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7F,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,OAAO,SAAS,cAAc,UAAU,uBAAuB,CAAC,CAAC,IAAI,eAAe,UAAU,YAAY,CAAC;IACpH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,CAAC,MAAM,CAAC;;;SAGR,OAAO;EACd,SAAS;EACT,UAAU;;;;EAIV,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -7,61 +7,70 @@ export const sveltePlugin = {
7
7
  };
8
8
  }
9
9
  };
10
- function renderSvelteScriptImports(name, referencedTypes, importPath) {
11
- return [
12
- `import '${importPath}';`,
13
- `import type { ${name} as HTMLElementClass } from '${importPath}';`,
14
- generateTypeImports(referencedTypes, importPath)
15
- ].filter(Boolean).join('\n');
16
- }
17
- function renderSveltePropsDeclaration(propMap, namedSlots) {
18
- const svelteProps = Array.from(propMap.keys()).map(name => `${name} = undefined`).join(',\n ');
19
- const slotProps = namedSlots.map(s => `${s.name} = undefined`).join(',\n ');
20
- const allProps = [svelteProps, slotProps, 'children'].filter(Boolean).join(',\n ');
10
+ function buildSvelte(component) {
11
+ const { name, tagName, properties, attributes, events = [], slots, referencedTypes, importPath = '../../index.js' } = component;
12
+ const propMap = mergePropertiesAndAttributes(properties, attributes);
13
+ const namedSlots = slots.filter(s => s.name && s.name !== '');
14
+ const builder = new SourceBuilder();
15
+ // Imports
16
+ builder.append(`<script lang="ts">
17
+ import '${importPath}';
18
+ import type { ${name} as HTMLElementClass } from '${importPath}';
19
+ ${generateTypeImports(referencedTypes, importPath)}`);
20
+ // Props declaration using Svelte 5 $bindable() and restProps
21
+ const svelteProps = Array.from(propMap.keys()).map(name => ` ${name} = $bindable()`).join(',\n');
22
+ const slotProps = namedSlots.map(s => ` ${s.name} = undefined`).join(',\n');
23
+ const allProps = [svelteProps, slotProps, ' children', ' ...restProps'].filter(Boolean).join(',\n');
21
24
  const svelteTypes = Array.from(propMap.entries()).map(([propName, propType]) => {
22
- return ` ${propName}?: ${propType};`;
25
+ return ` ${propName}?: ${propType};`;
23
26
  }).join('\n');
24
- const slotTypes = namedSlots.map(s => ` ${s.name}?: import('svelte').Snippet;`).join('\n');
25
- return `let {
26
- ${allProps}
27
- } = $props<{
28
- children?: any;
27
+ const slotTypes = namedSlots.map(s => ` ${s.name}?: import('svelte').Snippet;`).join('\n');
28
+ builder.append(` let {
29
+ ${allProps}
30
+ } = $props<{
31
+ children?: import('svelte').Snippet;
29
32
  ${svelteTypes}
30
33
  ${slotTypes}
31
- }>();`;
32
- }
33
- function renderSvelteEffects(propMap) {
34
- const svelteEffects = Array.from(propMap.keys()).map(propName => {
35
- return ` if (elementRef && ${propName} !== undefined) {
36
- elementRef.${propName} = ${propName};
37
- }`;
34
+ [key: string]: any;
35
+ }>();`);
36
+ // Element ref
37
+ builder.append(` let elementRef: HTMLElementClass | null = $state(null);`);
38
+ // Effect to sync properties from Svelte to Web Component
39
+ const syncToElement = Array.from(propMap.keys()).map(propName => {
40
+ return ` if (elementRef && ${propName} !== undefined && elementRef.${propName} !== ${propName}) {
41
+ elementRef.${propName} = ${propName};
42
+ }`;
43
+ }).join('\n');
44
+ builder.append(` $effect(() => {
45
+ ${syncToElement}
46
+ });`);
47
+ // Effect to sync properties from Web Component back to Svelte when events fire
48
+ const syncToSvelte = Array.from(propMap.keys()).map(propName => {
49
+ return ` if (${propName} !== element.${propName}) {
50
+ ${propName} = element.${propName} as any;
51
+ }`;
38
52
  }).join('\n');
39
- return `let elementRef: HTMLElementClass | null = $state(null);
53
+ const eventsList = Array.from(new Set(['change', 'input', ...events.map(e => e.name)]));
54
+ builder.append(` $effect(() => {
55
+ const element = elementRef;
56
+ if (!element) return;
40
57
 
41
- $effect(() => {
42
- ${svelteEffects}
43
- });`;
44
- }
45
- function renderSvelteScriptBlock(component) {
46
- const { name, properties, attributes, slots, referencedTypes, importPath = '../../index.js' } = component;
47
- const propMap = mergePropertiesAndAttributes(properties, attributes);
48
- const namedSlots = slots.filter(s => s.name && s.name !== '');
49
- const scriptContent = new SourceBuilder()
50
- .append(renderSvelteScriptImports(name, referencedTypes, importPath))
51
- .append(renderSveltePropsDeclaration(propMap, namedSlots))
52
- .append(renderSvelteEffects(propMap))
53
- .toString();
54
- const indentedContent = scriptContent
55
- .split('\n')
56
- .map(line => ' ' + line)
57
- .join('\n');
58
- return `<script lang="ts">
59
- ${indentedContent}
60
- </script>`;
61
- }
62
- function renderSvelteTemplate(component) {
63
- const { tagName, slots } = component;
64
- const namedSlots = slots.filter(s => s.name && s.name !== '');
58
+ const handleEvent = () => {
59
+ ${syncToSvelte}
60
+ };
61
+
62
+ const events = [${eventsList.map(e => `'${e}'`).join(', ')}];
63
+ for (const event of events) {
64
+ element.addEventListener(event, handleEvent);
65
+ }
66
+ return () => {
67
+ for (const event of events) {
68
+ element.removeEventListener(event, handleEvent);
69
+ }
70
+ };
71
+ });`);
72
+ builder.append(`</script>`);
73
+ // Template section
65
74
  const projectedSlots = namedSlots.map(s => {
66
75
  return ` {#if ${s.name}}
67
76
  <div slot="${s.name}">
@@ -69,19 +78,14 @@ function renderSvelteTemplate(component) {
69
78
  </div>
70
79
  {/if}`;
71
80
  }).join('\n');
72
- return `<${tagName} bind:this={elementRef} {...$$restProps}>
81
+ builder.append(`<${tagName} bind:this={elementRef} {...restProps}>
73
82
  ${projectedSlots}
74
83
  {#if children}
75
84
  {@render children()}
76
85
  {:else}
77
86
  <slot />
78
87
  {/if}
79
- </${tagName}>`;
80
- }
81
- function buildSvelte(component) {
82
- return new SourceBuilder()
83
- .append(renderSvelteScriptBlock(component))
84
- .append(renderSvelteTemplate(component))
85
- .toString();
88
+ </${tagName}>`);
89
+ return builder.toString();
86
90
  }
87
91
  //# sourceMappingURL=svelte.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"svelte.js","sourceRoot":"","sources":["../../src/templates/svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"svelte.js","sourceRoot":"","sources":["../../src/templates/svelte.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../src/templates/vue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,eAAO,MAAM,SAAS;IACpB,IAAI;IACJ,QAAQ,YAAY,iBAAiB;QAEjC,UAAU;;CAGf,CAAC"}
1
+ {"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../src/templates/vue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,eAAO,MAAM,SAAS;IACpB,IAAI;IACJ,QAAQ,YAAY,iBAAiB;QAEjC,UAAU;;CAGf,CAAC"}
@@ -1,4 +1,5 @@
1
- import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports } from '../core/utils.js';
1
+ import { SourceBuilder, mergePropertiesAndAttributes, generateTypeImports, capitalize, isEventAssociatedWithProp } from '../core/utils.js';
2
+ import swc from '@swc/core';
2
3
  export const vuePlugin = {
3
4
  name: 'vue',
4
5
  generate(component) {
@@ -7,51 +8,117 @@ export const vuePlugin = {
7
8
  };
8
9
  }
9
10
  };
10
- function renderVueImports(name, referencedTypes, importPath) {
11
- return [
12
- `import { defineComponent, h } from 'vue';`,
13
- `import type { ${name} as HTMLElementClass } from '${importPath}';`,
14
- `import '${importPath}';`,
15
- generateTypeImports(referencedTypes, importPath)
16
- ].filter(Boolean).join('\n');
17
- }
18
- function renderVueComponent(component) {
19
- const { name, tagName, events, properties, attributes } = component;
11
+ function buildTS(component) {
12
+ const { name, tagName, events = [], properties, attributes, formAssociated, referencedTypes, importPath = '../../index.js' } = component;
20
13
  const propMap = mergePropertiesAndAttributes(properties, attributes);
21
- const propsList = Array.from(propMap.keys())
22
- .map(propName => ` ${propName}: { type: [String, Number, Boolean, Array, Object] as any }`)
23
- .join(',\n');
24
- const emitsList = events.map(e => `'${e.name}'`).join(', ');
25
- const eventBindings = events.map(e => {
26
- const vueEventName = `on${e.name.charAt(0).toUpperCase() + e.name.slice(1)}`;
27
- return ` eventListeners['${vueEventName}'] = (event: Event) => {
28
- emit('${e.name}', event);
29
- };`;
30
- }).join('\n');
31
- return `export const ${name} = defineComponent({
14
+ const builder = new SourceBuilder();
15
+ // Imports
16
+ builder.append(`import { defineComponent, h, ref, watch } from 'vue';
17
+ import type { ${name} as HTMLElementClass } from '${importPath}';
18
+ import '${importPath}';
19
+ ${generateTypeImports(referencedTypes, importPath)}`);
20
+ // Build props list
21
+ const propsObj = [];
22
+ for (const propName of propMap.keys()) {
23
+ propsObj.push(` ${propName}: { type: [String, Number, Boolean, Array, Object] as any }`);
24
+ }
25
+ if (formAssociated) {
26
+ propsObj.push(` modelValue: { type: [String, Number, Boolean, Array, Object] as any }`);
27
+ }
28
+ // Build emits list
29
+ const emitsList = events.map(e => `'${e.name}'`);
30
+ if (formAssociated) {
31
+ emitsList.push(`'update:modelValue'`);
32
+ }
33
+ // Setup function with event listeners and property sync
34
+ const eventBindings = [];
35
+ const handledValueChangeEvents = new Set();
36
+ for (const e of events) {
37
+ const vueEventName = 'on' + capitalize(e.name);
38
+ let handlerBody = `emit('${e.name}', event);`;
39
+ if (formAssociated && isEventAssociatedWithProp(component, e.name, 'value')) {
40
+ handlerBody += `\n emit('update:modelValue', (event.target as any).value);`;
41
+ handledValueChangeEvents.add(e.name);
42
+ }
43
+ eventBindings.push(` eventListeners['${vueEventName}'] = (event: Event) => {
44
+ ${handlerBody}
45
+ };`);
46
+ }
47
+ // Fallback for formAssociated if no custom value-change event was found in the events list
48
+ if (formAssociated && handledValueChangeEvents.size === 0) {
49
+ eventBindings.push(` eventListeners['onChange'] = (event: Event) => {
50
+ emit('update:modelValue', (event.target as any).value);
51
+ };`);
52
+ eventBindings.push(` eventListeners['onInput'] = (event: Event) => {
53
+ emit('update:modelValue', (event.target as any).value);
54
+ };`);
55
+ }
56
+ builder.append(`export const ${name} = defineComponent({
32
57
  name: '${name}',
33
58
  props: {
34
- ${propsList}
59
+ ${propsObj.join(',\n')}
35
60
  },
36
- emits: [${emitsList}],
61
+ emits: [${emitsList.join(', ')}],
37
62
  setup(props, { slots, emit }) {
63
+ const elementRef = ref<HTMLElementClass | null>(null);
64
+
65
+ // Sync modelValue or value prop to the element's value property
66
+ if (${formAssociated}) {
67
+ watch(() => props.modelValue, (newVal) => {
68
+ if (elementRef.value && newVal !== undefined && elementRef.value.value !== newVal) {
69
+ elementRef.value.value = newVal;
70
+ }
71
+ });
72
+ watch(() => props.value, (newVal) => {
73
+ if (elementRef.value && newVal !== undefined && elementRef.value.value !== newVal) {
74
+ elementRef.value.value = newVal;
75
+ }
76
+ });
77
+ }
78
+
79
+ // Watch other props to sync to element properties
80
+ ${Array.from(propMap.keys()).filter(k => k !== 'value').map(propName => `
81
+ watch(() => props.${propName}, (newVal) => {
82
+ if (elementRef.value && newVal !== undefined) {
83
+ (elementRef.value as any).${propName} = newVal;
84
+ }
85
+ });`).join('')}
86
+
38
87
  return () => {
39
88
  const eventListeners: Record<string, any> = {};
40
- ${eventBindings}
89
+ ${eventBindings.join('\n')}
41
90
 
42
- return h('${tagName}', {
91
+ const mergedProps = {
43
92
  ...props,
44
- ...eventListeners
45
- }, slots.default?.());
93
+ ...eventListeners,
94
+ ref: elementRef
95
+ };
96
+
97
+ if (${formAssociated} && props.modelValue !== undefined) {
98
+ (mergedProps as any).value = props.modelValue;
99
+ }
100
+
101
+ return h('${tagName}', mergedProps, slots.default?.());
46
102
  };
47
103
  }
48
- });`;
49
- }
50
- function buildTS(component) {
51
- const importPath = component.importPath || '../../index.js';
52
- return new SourceBuilder()
53
- .append(renderVueImports(component.name, component.referencedTypes, importPath))
54
- .append(renderVueComponent(component))
55
- .toString();
104
+ });`);
105
+ const rawSource = builder.toString();
106
+ try {
107
+ const ast = swc.parseSync(rawSource, {
108
+ syntax: 'typescript',
109
+ tsx: false,
110
+ decorators: true,
111
+ comments: true,
112
+ target: 'es2022'
113
+ });
114
+ const output = swc.printSync(ast, {
115
+ minify: false
116
+ });
117
+ return output.code;
118
+ }
119
+ catch (e) {
120
+ console.error(`Error: Failed to parse generated Vue component for ${component.name}:`, e);
121
+ throw e;
122
+ }
56
123
  }
57
124
  //# sourceMappingURL=vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue.js","sourceRoot":"","sources":["../../src/templates/vue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEpG,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,KAAK;IACX,QAAQ,CAAC,SAA4B;QACnC,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC;SAC/B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,IAAY,EAAE,eAAyB,EAAE,UAAkB;IACnF,OAAO;QACL,2CAA2C;QAC3C,iBAAiB,IAAI,gCAAgC,UAAU,IAAI;QACnE,WAAW,UAAU,IAAI;QACzB,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC;KACjD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA4B;IACtD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACpE,MAAM,OAAO,GAAG,4BAA4B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SACzC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,QAAQ,6DAA6D,CAAC;SAC7F,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACnC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,yBAAyB,YAAY;gBAChC,CAAC,CAAC,IAAI;SACb,CAAC;IACR,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,gBAAgB,IAAI;WAClB,IAAI;;EAEb,SAAS;;YAEC,SAAS;;;;EAInB,aAAa;;kBAEG,OAAO;;;;;;IAMrB,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CAAC,SAA4B;IAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,gBAAgB,CAAC;IAC5D,OAAO,IAAI,aAAa,EAAE;SACvB,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;SAC/E,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;SACrC,QAAQ,EAAE,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"vue.js","sourceRoot":"","sources":["../../src/templates/vue.ts"],"names":[],"mappings":"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"}