@sn4p.dev/mucv 0.5.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 (110) hide show
  1. package/README.md +126 -0
  2. package/dist/core/elementor-parser.d.ts +22 -0
  3. package/dist/core/elementor-parser.d.ts.map +1 -0
  4. package/dist/core/elementor-parser.js +186 -0
  5. package/dist/core/elementor-parser.js.map +1 -0
  6. package/dist/core/html-parser.d.ts +27 -0
  7. package/dist/core/html-parser.d.ts.map +1 -0
  8. package/dist/core/html-parser.js +247 -0
  9. package/dist/core/html-parser.js.map +1 -0
  10. package/dist/core/jsx-parser.d.ts +22 -0
  11. package/dist/core/jsx-parser.d.ts.map +1 -0
  12. package/dist/core/jsx-parser.js +261 -0
  13. package/dist/core/jsx-parser.js.map +1 -0
  14. package/dist/core/mapper.d.ts +52 -0
  15. package/dist/core/mapper.d.ts.map +1 -0
  16. package/dist/core/mapper.js +141 -0
  17. package/dist/core/mapper.js.map +1 -0
  18. package/dist/core/normalizer.d.ts +57 -0
  19. package/dist/core/normalizer.d.ts.map +1 -0
  20. package/dist/core/normalizer.js +285 -0
  21. package/dist/core/normalizer.js.map +1 -0
  22. package/dist/core/optimizer.d.ts +21 -0
  23. package/dist/core/optimizer.d.ts.map +1 -0
  24. package/dist/core/optimizer.js +75 -0
  25. package/dist/core/optimizer.js.map +1 -0
  26. package/dist/core/parse-result.d.ts +10 -0
  27. package/dist/core/parse-result.d.ts.map +1 -0
  28. package/dist/core/parse-result.js +6 -0
  29. package/dist/core/parse-result.js.map +1 -0
  30. package/dist/core/vir.d.ts +136 -0
  31. package/dist/core/vir.d.ts.map +1 -0
  32. package/dist/core/vir.js +9 -0
  33. package/dist/core/vir.js.map +1 -0
  34. package/dist/generators/style-serializer.d.ts +25 -0
  35. package/dist/generators/style-serializer.d.ts.map +1 -0
  36. package/dist/generators/style-serializer.js +129 -0
  37. package/dist/generators/style-serializer.js.map +1 -0
  38. package/dist/generators/to-elementor.d.ts +13 -0
  39. package/dist/generators/to-elementor.d.ts.map +1 -0
  40. package/dist/generators/to-elementor.js +150 -0
  41. package/dist/generators/to-elementor.js.map +1 -0
  42. package/dist/generators/to-html-css.d.ts +22 -0
  43. package/dist/generators/to-html-css.d.ts.map +1 -0
  44. package/dist/generators/to-html-css.js +127 -0
  45. package/dist/generators/to-html-css.js.map +1 -0
  46. package/dist/generators/to-react.d.ts +22 -0
  47. package/dist/generators/to-react.d.ts.map +1 -0
  48. package/dist/generators/to-react.js +123 -0
  49. package/dist/generators/to-react.js.map +1 -0
  50. package/dist/generators/to-svelte.d.ts +15 -0
  51. package/dist/generators/to-svelte.d.ts.map +1 -0
  52. package/dist/generators/to-svelte.js +105 -0
  53. package/dist/generators/to-svelte.js.map +1 -0
  54. package/dist/generators/to-vue.d.ts +17 -0
  55. package/dist/generators/to-vue.d.ts.map +1 -0
  56. package/dist/generators/to-vue.js +108 -0
  57. package/dist/generators/to-vue.js.map +1 -0
  58. package/dist/index.d.ts +8 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +228 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/schemas/input.schema.d.ts +245 -0
  63. package/dist/schemas/input.schema.d.ts.map +1 -0
  64. package/dist/schemas/input.schema.js +66 -0
  65. package/dist/schemas/input.schema.js.map +1 -0
  66. package/dist/schemas/vir.schema.d.ts +1786 -0
  67. package/dist/schemas/vir.schema.d.ts.map +1 -0
  68. package/dist/schemas/vir.schema.js +201 -0
  69. package/dist/schemas/vir.schema.js.map +1 -0
  70. package/dist/tools/convert-design.d.ts +40 -0
  71. package/dist/tools/convert-design.d.ts.map +1 -0
  72. package/dist/tools/convert-design.js +106 -0
  73. package/dist/tools/convert-design.js.map +1 -0
  74. package/dist/tools/validate-vir.d.ts +18 -0
  75. package/dist/tools/validate-vir.d.ts.map +1 -0
  76. package/dist/tools/validate-vir.js +32 -0
  77. package/dist/tools/validate-vir.js.map +1 -0
  78. package/dist/tools/wp-connector.d.ts +55 -0
  79. package/dist/tools/wp-connector.d.ts.map +1 -0
  80. package/dist/tools/wp-connector.js +146 -0
  81. package/dist/tools/wp-connector.js.map +1 -0
  82. package/dist/tools/wp-tools.d.ts +51 -0
  83. package/dist/tools/wp-tools.d.ts.map +1 -0
  84. package/dist/tools/wp-tools.js +126 -0
  85. package/dist/tools/wp-tools.js.map +1 -0
  86. package/dist/utils/errors.d.ts +35 -0
  87. package/dist/utils/errors.d.ts.map +1 -0
  88. package/dist/utils/errors.js +67 -0
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/id-generator.d.ts +27 -0
  91. package/dist/utils/id-generator.d.ts.map +1 -0
  92. package/dist/utils/id-generator.js +43 -0
  93. package/dist/utils/id-generator.js.map +1 -0
  94. package/dist/utils/logger.d.ts +8 -0
  95. package/dist/utils/logger.d.ts.map +1 -0
  96. package/dist/utils/logger.js +19 -0
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/metrics.d.ts +30 -0
  99. package/dist/utils/metrics.d.ts.map +1 -0
  100. package/dist/utils/metrics.js +50 -0
  101. package/dist/utils/metrics.js.map +1 -0
  102. package/dist/utils/rate-limiter.d.ts +25 -0
  103. package/dist/utils/rate-limiter.d.ts.map +1 -0
  104. package/dist/utils/rate-limiter.js +41 -0
  105. package/dist/utils/rate-limiter.js.map +1 -0
  106. package/dist/utils/url-validator.d.ts +14 -0
  107. package/dist/utils/url-validator.d.ts.map +1 -0
  108. package/dist/utils/url-validator.js +37 -0
  109. package/dist/utils/url-validator.js.map +1 -0
  110. package/package.json +73 -0
@@ -0,0 +1,15 @@
1
+ /**
2
+ * MUCV — Generator: VIR → Svelte Component
3
+ * Produce un componente Svelte con <script>, template y <style>.
4
+ *
5
+ * @see docs/VIR-SPEC.md §6
6
+ */
7
+ import type { VisualIR } from '../core/vir.js';
8
+ export interface SvelteOptions {
9
+ /** Prefijo de clase CSS (default: 'mucv') */
10
+ cssPrefix?: string;
11
+ }
12
+ export declare const svelteGenerator: {
13
+ generate(vir: VisualIR, options?: SvelteOptions): string;
14
+ };
15
+ //# sourceMappingURL=to-svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-svelte.d.ts","sourceRoot":"","sources":["../../src/generators/to-svelte.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAA;AAO1D,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,eAAO,MAAM,eAAe;kBACZ,QAAQ,YAAW,aAAa,GAAQ,MAAM;CAsB7D,CAAA"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * MUCV — Generator: VIR → Svelte Component
3
+ * Produce un componente Svelte con <script>, template y <style>.
4
+ *
5
+ * @see docs/VIR-SPEC.md §6
6
+ */
7
+ import { styleToDeclarations, declsToBlock } from './style-serializer.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { GenerateError } from '../utils/errors.js';
10
+ // ─── Generator principal ──────────────────────────────────────────────────────
11
+ export const svelteGenerator = {
12
+ generate(vir, options = {}) {
13
+ const prefix = options.cssPrefix ?? 'mucv';
14
+ const cssRules = [];
15
+ try {
16
+ const templateLines = vir.root
17
+ .map((node) => renderNode(node, 0, prefix, cssRules))
18
+ .filter(Boolean);
19
+ const template = templateLines.join('\n');
20
+ const script = `<script lang="ts">\n // Component generated by MUCV\n</script>`;
21
+ const style = `<style>\n${cssRules.filter(Boolean).join('\n\n')}\n</style>`;
22
+ logger.debug({ nodeCount: vir.root.length }, 'Svelte component generated');
23
+ return [script, template, style].join('\n\n');
24
+ }
25
+ catch (err) {
26
+ throw new GenerateError('Error generating Svelte component from VIR', {
27
+ error: err instanceof Error ? err.message : String(err),
28
+ virId: vir.id,
29
+ });
30
+ }
31
+ },
32
+ };
33
+ // ─── Renderizado recursivo ────────────────────────────────────────────────────
34
+ function renderNode(node, depth, prefix, cssRules) {
35
+ const pad = ' '.repeat(depth);
36
+ const nodeClass = `${prefix}-node-${node.id}`;
37
+ const typeClass = `${prefix}-${node.type}`;
38
+ const extraClasses = node.meta?.cssClasses?.join(' ') ?? '';
39
+ const classes = [typeClass, nodeClass, extraClasses].filter(Boolean).join(' ');
40
+ if (node.styles) {
41
+ const block = declsToBlock(`.${nodeClass}`, styleToDeclarations(node.styles));
42
+ if (block)
43
+ cssRules.push(block);
44
+ }
45
+ const children = node.children
46
+ ?.map((c) => renderNode(c, depth + 1, prefix, cssRules))
47
+ .filter(Boolean)
48
+ .join('\n') ?? '';
49
+ const inner = children ? `\n${children}\n${pad}` : '';
50
+ return renderSvelteTag(node, classes, pad, inner);
51
+ }
52
+ // ─── Renderizado de cada tipo de nodo ─────────────────────────────────────────
53
+ function renderSvelteTag(node, classes, pad, inner) {
54
+ const cls = `class="${classes}"`;
55
+ switch (node.type) {
56
+ case 'section':
57
+ return `${pad}<section ${cls}>${inner}</section>`;
58
+ case 'container':
59
+ case 'custom':
60
+ return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
61
+ case 'flex':
62
+ case 'grid':
63
+ return `${pad}<div ${cls}>${inner}</div>`;
64
+ case 'heading': {
65
+ const h = node.content?.level ?? 2;
66
+ return `${pad}<h${h} ${cls}>${esc(node.content?.text ?? '')}</h${h}>`;
67
+ }
68
+ case 'text': {
69
+ const content = node.content?.richText
70
+ ? `{@html ${JSON.stringify(node.content.richText)}}`
71
+ : esc(node.content?.text ?? '');
72
+ return content ? `${pad}<p ${cls}>${content}</p>` : '';
73
+ }
74
+ case 'image': {
75
+ const src = node.content?.src;
76
+ const alt = esc(node.content?.alt ?? '');
77
+ return src ? `${pad}<img ${cls} src="${src}" alt="${alt}" />` : '';
78
+ }
79
+ case 'button': {
80
+ const label = esc(node.content?.label ?? '');
81
+ const href = node.content?.href;
82
+ const target = node.content?.target === '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '';
83
+ return href
84
+ ? `${pad}<a ${cls} href="${href}"${target}>${label}</a>`
85
+ : `${pad}<button ${cls}>${label}</button>`;
86
+ }
87
+ case 'list': {
88
+ const items = (node.content?.items ?? [])
89
+ .map((item) => {
90
+ const text = esc(item.text ?? '');
91
+ return item.href
92
+ ? `${pad} <li><a href="${item.href}">${text}</a></li>`
93
+ : `${pad} <li>${text}</li>`;
94
+ })
95
+ .join('\n');
96
+ return items ? `${pad}<ul ${cls}>\n${items}\n${pad}</ul>` : '';
97
+ }
98
+ default:
99
+ return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
100
+ }
101
+ }
102
+ function esc(text) {
103
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
104
+ }
105
+ //# sourceMappingURL=to-svelte.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-svelte.js","sourceRoot":"","sources":["../../src/generators/to-svelte.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AASlD,iFAAiF;AAEjF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,CAAC,GAAa,EAAE,UAAyB,EAAE;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAA;QAC1C,MAAM,QAAQ,GAAa,EAAE,CAAA;QAE7B,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI;iBAC3B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;iBACpD,MAAM,CAAC,OAAO,CAAC,CAAA;YAElB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,iEAAiE,CAAA;YAChF,MAAM,KAAK,GAAG,YAAY,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAA;YAE3E,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAA;YAC1E,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,4CAA4C,EAAE;gBACpE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACvD,KAAK,EAAE,GAAG,CAAC,EAAE;aACd,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AAED,iFAAiF;AAEjF,SAAS,UAAU,CACjB,IAAgB,EAChB,KAAa,EACb,MAAc,EACd,QAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,SAAS,GAAG,GAAG,MAAM,SAAS,IAAI,CAAC,EAAE,EAAE,CAAA;IAC7C,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAC3D,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE9E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,SAAS,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7E,IAAI,KAAK;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC5B,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;SACvD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAErD,OAAO,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AACnD,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe,CAAC,IAAgB,EAAE,OAAe,EAAE,GAAW,EAAE,KAAa;IACpF,MAAM,GAAG,GAAG,UAAU,OAAO,GAAG,CAAA;IAEhC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,GAAG,GAAG,YAAY,GAAG,IAAI,KAAK,YAAY,CAAA;QAEnD,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QAExD,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,GAAG,GAAG,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAA;QAE3C,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;YAClC,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAA;QACvE,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ;gBACpC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBACpD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;YACjC,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,GAAG,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAA;YAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;YACxC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QACpE,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAA;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,EAAE,CAAA;YACpG,OAAO,IAAI;gBACT,CAAC,CAAC,GAAG,GAAG,MAAM,GAAG,UAAU,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;gBACxD,CAAC,CAAC,GAAG,GAAG,WAAW,GAAG,IAAI,KAAK,WAAW,CAAA;QAC9C,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;iBACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;gBACjC,OAAO,IAAI,CAAC,IAAI;oBACd,CAAC,CAAC,GAAG,GAAG,kBAAkB,IAAI,CAAC,IAAI,KAAK,IAAI,WAAW;oBACvD,CAAC,CAAC,GAAG,GAAG,SAAS,IAAI,OAAO,CAAA;YAChC,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAA;YACb,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,KAAK,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAChE,CAAC;QAED;YACE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACxG,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MUCV — Generator: VIR → Vue 3 SFC
3
+ * Produce un Single File Component Vue 3 con <template>, <script setup> y <style scoped>.
4
+ *
5
+ * @see docs/VIR-SPEC.md §6
6
+ */
7
+ import type { VisualIR } from '../core/vir.js';
8
+ export interface VueOptions {
9
+ /** Nombre del componente (default: 'GeneratedComponent') */
10
+ componentName?: string;
11
+ /** Prefijo de clase CSS (default: 'mucv') */
12
+ cssPrefix?: string;
13
+ }
14
+ export declare const vueGenerator: {
15
+ generate(vir: VisualIR, options?: VueOptions): string;
16
+ };
17
+ //# sourceMappingURL=to-vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-vue.d.ts","sourceRoot":"","sources":["../../src/generators/to-vue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAA;AAO1D,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID,eAAO,MAAM,YAAY;kBACT,QAAQ,YAAW,UAAU,GAAQ,MAAM;CA0B1D,CAAA"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * MUCV — Generator: VIR → Vue 3 SFC
3
+ * Produce un Single File Component Vue 3 con <template>, <script setup> y <style scoped>.
4
+ *
5
+ * @see docs/VIR-SPEC.md §6
6
+ */
7
+ import { styleToDeclarations, declsToBlock } from './style-serializer.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { GenerateError } from '../utils/errors.js';
10
+ // ─── Generator principal ──────────────────────────────────────────────────────
11
+ export const vueGenerator = {
12
+ generate(vir, options = {}) {
13
+ const name = options.componentName ?? 'GeneratedComponent';
14
+ const prefix = options.cssPrefix ?? 'mucv';
15
+ const cssRules = [];
16
+ try {
17
+ const templateLines = vir.root
18
+ .map((node) => renderNode(node, 1, prefix, cssRules))
19
+ .filter(Boolean);
20
+ const template = templateLines.length === 1
21
+ ? `<template>\n${templateLines[0]}\n</template>`
22
+ : `<template>\n <div class="${prefix}-root">\n${templateLines.join('\n')}\n </div>\n</template>`;
23
+ const script = `<script setup lang="ts">\n// ${name}\n</script>`;
24
+ const style = `<style scoped>\n${cssRules.filter(Boolean).join('\n\n')}\n</style>`;
25
+ logger.debug({ componentName: name, nodeCount: vir.root.length }, 'Vue SFC generated');
26
+ return [template, script, style].join('\n\n');
27
+ }
28
+ catch (err) {
29
+ throw new GenerateError('Error generating Vue SFC from VIR', {
30
+ error: err instanceof Error ? err.message : String(err),
31
+ virId: vir.id,
32
+ });
33
+ }
34
+ },
35
+ };
36
+ // ─── Renderizado recursivo ────────────────────────────────────────────────────
37
+ function renderNode(node, depth, prefix, cssRules) {
38
+ const pad = ' '.repeat(depth);
39
+ const nodeClass = `${prefix}-node-${node.id}`;
40
+ const typeClass = `${prefix}-${node.type}`;
41
+ const extraClasses = node.meta?.cssClasses?.join(' ') ?? '';
42
+ const classes = [typeClass, nodeClass, extraClasses].filter(Boolean).join(' ');
43
+ if (node.styles) {
44
+ const block = declsToBlock(`.${nodeClass}`, styleToDeclarations(node.styles));
45
+ if (block)
46
+ cssRules.push(block);
47
+ }
48
+ const children = node.children
49
+ ?.map((c) => renderNode(c, depth + 1, prefix, cssRules))
50
+ .filter(Boolean)
51
+ .join('\n') ?? '';
52
+ const inner = children ? `\n${children}\n${pad}` : '';
53
+ return renderVueTag(node, classes, pad, inner);
54
+ }
55
+ // ─── Renderizado de cada tipo de nodo ─────────────────────────────────────────
56
+ function renderVueTag(node, classes, pad, inner) {
57
+ const cls = `class="${classes}"`;
58
+ switch (node.type) {
59
+ case 'section':
60
+ return `${pad}<section ${cls}>${inner}</section>`;
61
+ case 'container':
62
+ case 'custom':
63
+ return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
64
+ case 'flex':
65
+ case 'grid':
66
+ return `${pad}<div ${cls}>${inner}</div>`;
67
+ case 'heading': {
68
+ const h = node.content?.level ?? 2;
69
+ return `${pad}<h${h} ${cls}>${esc(node.content?.text ?? '')}</h${h}>`;
70
+ }
71
+ case 'text': {
72
+ const content = node.content?.richText
73
+ ? `<span v-html="${JSON.stringify(node.content.richText)}" />`
74
+ : esc(node.content?.text ?? '');
75
+ return content ? `${pad}<p ${cls}>${content}</p>` : '';
76
+ }
77
+ case 'image': {
78
+ const src = node.content?.src;
79
+ const alt = esc(node.content?.alt ?? '');
80
+ return src ? `${pad}<img ${cls} src="${src}" alt="${alt}" />` : '';
81
+ }
82
+ case 'button': {
83
+ const label = esc(node.content?.label ?? '');
84
+ const href = node.content?.href;
85
+ const target = node.content?.target === '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '';
86
+ return href
87
+ ? `${pad}<a ${cls} href="${href}"${target}>${label}</a>`
88
+ : `${pad}<button ${cls}>${label}</button>`;
89
+ }
90
+ case 'list': {
91
+ const items = (node.content?.items ?? [])
92
+ .map((item) => {
93
+ const text = esc(item.text ?? '');
94
+ return item.href
95
+ ? `${pad} <li><a href="${item.href}">${text}</a></li>`
96
+ : `${pad} <li>${text}</li>`;
97
+ })
98
+ .join('\n');
99
+ return items ? `${pad}<ul ${cls}>\n${items}\n${pad}</ul>` : '';
100
+ }
101
+ default:
102
+ return inner ? `${pad}<div ${cls}>${inner}</div>` : '';
103
+ }
104
+ }
105
+ function esc(text) {
106
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
107
+ }
108
+ //# sourceMappingURL=to-vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-vue.js","sourceRoot":"","sources":["../../src/generators/to-vue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MUCV — Motor Universal de Conversión Visual
4
+ * Servidor MCP que expone herramientas de conversión visual
5
+ * y gestión de diseños en WordPress.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
package/dist/index.js ADDED
@@ -0,0 +1,228 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MUCV — Motor Universal de Conversión Visual
4
+ * Servidor MCP que expone herramientas de conversión visual
5
+ * y gestión de diseños en WordPress.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { z } from 'zod';
10
+ import { SourceTypeInputSchema, TargetTypeInputSchema, PostTypeSchema, } from './schemas/input.schema.js';
11
+ import { convertDesign } from './tools/convert-design.js';
12
+ import { validateVir } from './tools/validate-vir.js';
13
+ import { WordPressConnector } from './tools/wp-connector.js';
14
+ import { getPageDesign, publishDesign, listPages } from './tools/wp-tools.js';
15
+ import { isMUCVError } from './utils/errors.js';
16
+ import { logger } from './utils/logger.js';
17
+ import { RateLimiter } from './utils/rate-limiter.js';
18
+ import { metrics } from './utils/metrics.js';
19
+ const VERSION = '0.5.0';
20
+ // ─── Rate limiter global ──────────────────────────────────────────────────
21
+ const rateLimiter = new RateLimiter({ maxRequestsPerMinute: 60 });
22
+ const startTime = Date.now();
23
+ // ─── Lazy WordPress connector ───────────────────────────────────────────────
24
+ let wpConnector = null;
25
+ function getWPConnector() {
26
+ if (!wpConnector) {
27
+ wpConnector = new WordPressConnector();
28
+ }
29
+ return wpConnector;
30
+ }
31
+ // ─── Helper para formatear errores MCP ──────────────────────────────────────
32
+ function errorResult(error) {
33
+ const message = isMUCVError(error)
34
+ ? `[${error.code}] ${error.message}`
35
+ : error instanceof Error
36
+ ? error.message
37
+ : 'Unknown error';
38
+ return {
39
+ content: [{ type: 'text', text: message }],
40
+ isError: true,
41
+ };
42
+ }
43
+ // ─── Servidor MCP ───────────────────────────────────────────────────────────
44
+ const server = new McpServer({ name: 'mucv', version: VERSION }, { capabilities: { logging: {} } });
45
+ // ─── Tool: convert_design ───────────────────────────────────────────────────
46
+ server.registerTool('convert_design', {
47
+ title: 'Convert Visual Design',
48
+ description: 'Convert designs between Elementor, HTML, React, Vue, and Svelte formats via VIR intermediate representation.',
49
+ inputSchema: z.object({
50
+ sourceType: SourceTypeInputSchema.describe('Source format'),
51
+ targetType: TargetTypeInputSchema.describe('Target format'),
52
+ content: z.string().min(1).describe('Design content (JSON string for Elementor, HTML string, or JSX/TSX code)'),
53
+ options: z.object({
54
+ optimize: z.boolean().default(true).describe('Apply VIR optimizer before generation'),
55
+ cssNaming: z.enum(['bem', 'utility']).default('bem').describe('CSS naming convention for HTML output'),
56
+ includeVIR: z.boolean().default(false).describe('Include intermediate VIR in response'),
57
+ preserveMeta: z.boolean().default(true).describe('Preserve source metadata for round-trip'),
58
+ }).optional().describe('Conversion options'),
59
+ }),
60
+ }, async (input) => {
61
+ try {
62
+ rateLimiter.check();
63
+ const output = convertDesign(input);
64
+ metrics.record(input.sourceType, input.targetType, output.meta.durationMs, true);
65
+ return {
66
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
67
+ };
68
+ }
69
+ catch (error) {
70
+ metrics.record(input.sourceType, input.targetType, 0, false);
71
+ return errorResult(error);
72
+ }
73
+ });
74
+ // ─── Tool: validate_vir ─────────────────────────────────────────────────────
75
+ server.registerTool('validate_vir', {
76
+ title: 'Validate VIR',
77
+ description: 'Validate a Visual Intermediate Representation object against the current VIR schema.',
78
+ inputSchema: z.object({
79
+ vir: z.record(z.string(), z.unknown()).describe('VIR object to validate'),
80
+ }),
81
+ }, async ({ vir }) => {
82
+ try {
83
+ rateLimiter.check();
84
+ const output = validateVir(vir);
85
+ return {
86
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
87
+ };
88
+ }
89
+ catch (error) {
90
+ return errorResult(error);
91
+ }
92
+ });
93
+ // ─── Tool: get_page_design ──────────────────────────────────────────────────
94
+ server.registerTool('get_page_design', {
95
+ title: 'Get Page Design',
96
+ description: 'Fetch a page/post/template design from WordPress and return its VIR representation.',
97
+ inputSchema: z.object({
98
+ pageId: z.number().int().positive().describe('WordPress post/page ID'),
99
+ postType: PostTypeSchema.default('page').describe('WordPress post type'),
100
+ targetType: TargetTypeInputSchema.default('elementor').describe('Optional target format for conversion'),
101
+ }),
102
+ }, async (input) => {
103
+ try {
104
+ rateLimiter.check();
105
+ const connector = getWPConnector();
106
+ const output = await getPageDesign(input, connector);
107
+ return {
108
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
109
+ };
110
+ }
111
+ catch (error) {
112
+ return errorResult(error);
113
+ }
114
+ });
115
+ // ─── Tool: publish_design ───────────────────────────────────────────────────
116
+ server.registerTool('publish_design', {
117
+ title: 'Publish Design',
118
+ description: 'Publish a design to WordPress. Converts to Elementor format if needed, then creates or updates a page/post.',
119
+ inputSchema: z.object({
120
+ content: z.string().min(1).describe('Design content to publish'),
121
+ sourceType: SourceTypeInputSchema.describe('Format of the content'),
122
+ postType: z.enum(['page', 'post']).default('page').describe('WordPress post type to create/update'),
123
+ pageId: z.number().int().positive().optional().describe('Existing page/post ID to update (omit to create new)'),
124
+ title: z.string().min(1).optional().describe('Page/post title'),
125
+ status: z.enum(['publish', 'draft', 'private']).default('draft').describe('Publication status'),
126
+ }),
127
+ }, async (input) => {
128
+ try {
129
+ rateLimiter.check();
130
+ const connector = getWPConnector();
131
+ const output = await publishDesign(input, connector);
132
+ return {
133
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
134
+ };
135
+ }
136
+ catch (error) {
137
+ return errorResult(error);
138
+ }
139
+ });
140
+ // ─── Tool: list_pages ───────────────────────────────────────────────────────
141
+ server.registerTool('list_pages', {
142
+ title: 'List Pages',
143
+ description: 'List pages, posts, or Elementor templates from WordPress with their Elementor status.',
144
+ inputSchema: z.object({
145
+ postType: PostTypeSchema.default('page').describe('WordPress post type to list'),
146
+ limit: z.number().int().min(1).max(100).default(20).describe('Number of results per page'),
147
+ offset: z.number().int().min(0).default(0).describe('Offset for pagination'),
148
+ status: z.enum(['publish', 'draft', 'private', 'any']).default('any').describe('Filter by post status'),
149
+ search: z.string().optional().describe('Search by title'),
150
+ }),
151
+ }, async (input) => {
152
+ try {
153
+ rateLimiter.check();
154
+ const connector = getWPConnector();
155
+ const output = await listPages(input, connector);
156
+ return {
157
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
158
+ };
159
+ }
160
+ catch (error) {
161
+ return errorResult(error);
162
+ }
163
+ });
164
+ // ─── Tool: health_check ──────────────────────────────────────────────────
165
+ server.registerTool('health_check', {
166
+ title: 'Health Check',
167
+ description: 'Returns the health status of the MUCV MCP server including uptime, memory usage, and rate limiter stats.',
168
+ inputSchema: z.object({}),
169
+ }, async () => {
170
+ const uptimeMs = Date.now() - startTime;
171
+ const memoryUsage = process.memoryUsage();
172
+ const health = {
173
+ status: 'healthy',
174
+ version: VERSION,
175
+ uptimeMs,
176
+ uptimeFormatted: formatUptime(uptimeMs),
177
+ memory: {
178
+ rss: formatBytes(memoryUsage.rss),
179
+ heapUsed: formatBytes(memoryUsage.heapUsed),
180
+ heapTotal: formatBytes(memoryUsage.heapTotal),
181
+ },
182
+ rateLimiter: rateLimiter.getStats(),
183
+ };
184
+ return {
185
+ content: [{ type: 'text', text: JSON.stringify(health, null, 2) }],
186
+ };
187
+ });
188
+ // ─── Tool: get_metrics ───────────────────────────────────────────────────
189
+ server.registerTool('get_metrics', {
190
+ title: 'Get Metrics',
191
+ description: 'Returns conversion metrics including totals, success/failure rates, and recent conversions.',
192
+ inputSchema: z.object({}),
193
+ }, async () => {
194
+ const metricsData = metrics.getMetrics();
195
+ return {
196
+ content: [{ type: 'text', text: JSON.stringify(metricsData, null, 2) }],
197
+ };
198
+ });
199
+ // ─── Helpers de formato ──────────────────────────────────────────────────
200
+ function formatUptime(ms) {
201
+ const seconds = Math.floor(ms / 1000) % 60;
202
+ const minutes = Math.floor(ms / 60_000) % 60;
203
+ const hours = Math.floor(ms / 3_600_000);
204
+ return `${hours}h ${minutes}m ${seconds}s`;
205
+ }
206
+ function formatBytes(bytes) {
207
+ const mb = (bytes / 1_048_576).toFixed(1);
208
+ return `${mb} MB`;
209
+ }
210
+ // ─── Startup ────────────────────────────────────────────────────────────────
211
+ async function main() {
212
+ const transport = new StdioServerTransport();
213
+ await server.connect(transport);
214
+ logger.info({ version: VERSION }, 'MUCV MCP Server started');
215
+ }
216
+ main().catch((error) => {
217
+ logger.error({ error }, 'Fatal error starting MUCV MCP Server');
218
+ process.exit(1);
219
+ });
220
+ // ─── Graceful shutdown ──────────────────────────────────────────────────────
221
+ function shutdown() {
222
+ logger.info('Shutting down MUCV MCP Server');
223
+ server.close().catch(() => { });
224
+ process.exit(0);
225
+ }
226
+ process.on('SIGINT', shutdown);
227
+ process.on('SIGTERM', shutdown);
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}