@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,22 @@
1
+ /**
2
+ * MUCV — JSX/TSX Parser
3
+ * Convierte código JSX/TSX → VisualIR usando Babel AST.
4
+ *
5
+ * Estrategia:
6
+ * 1. Parsea el JSX con @babel/parser
7
+ * 2. Busca el return statement del primer componente funcional (o el JSX root)
8
+ * 3. Recorre el JSX AST recursivamente produciendo VisualNode[]
9
+ *
10
+ * @see docs/VIR-SPEC.md
11
+ * @see .claude/agents/parser-dev.md
12
+ */
13
+ import type { ParseResult } from './parse-result.js';
14
+ export declare const jsxParser: {
15
+ /**
16
+ * Parsea JSX/TSX y produce un VisualIR validado.
17
+ * @param raw — código fuente JSX o TSX
18
+ * @param sourceId — identificador externo opcional
19
+ */
20
+ parse(raw: string, sourceId?: string): ParseResult;
21
+ };
22
+ //# sourceMappingURL=jsx-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-parser.d.ts","sourceRoot":"","sources":["../../src/core/jsx-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AASpD,eAAO,MAAM,SAAS;IACpB;;;;OAIG;eACQ,MAAM,aAAa,MAAM,GAAG,WAAW;CAuDnD,CAAA"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * MUCV — JSX/TSX Parser
3
+ * Convierte código JSX/TSX → VisualIR usando Babel AST.
4
+ *
5
+ * Estrategia:
6
+ * 1. Parsea el JSX con @babel/parser
7
+ * 2. Busca el return statement del primer componente funcional (o el JSX root)
8
+ * 3. Recorre el JSX AST recursivamente produciendo VisualNode[]
9
+ *
10
+ * @see docs/VIR-SPEC.md
11
+ * @see .claude/agents/parser-dev.md
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { parse as babelParse } from '@babel/parser';
15
+ import { VisualIRSchema } from '../schemas/vir.schema.js';
16
+ import { mapJsxElement, HTML_HEADING_LEVEL_MAP } from './mapper.js';
17
+ import { normalizeText } from './normalizer.js';
18
+ import { logger } from '../utils/logger.js';
19
+ import { ParseError, VIRValidationError } from '../utils/errors.js';
20
+ // ─── Parser principal ─────────────────────────────────────────────────────────
21
+ export const jsxParser = {
22
+ /**
23
+ * Parsea JSX/TSX y produce un VisualIR validado.
24
+ * @param raw — código fuente JSX o TSX
25
+ * @param sourceId — identificador externo opcional
26
+ */
27
+ parse(raw, sourceId) {
28
+ if (typeof raw !== 'string') {
29
+ throw new ParseError('JSX input debe ser un string', { type: typeof raw });
30
+ }
31
+ let ast;
32
+ try {
33
+ ast = babelParse(raw, {
34
+ sourceType: 'module',
35
+ plugins: ['jsx', 'typescript'],
36
+ errorRecovery: true,
37
+ });
38
+ }
39
+ catch (err) {
40
+ throw new ParseError('JSX/TSX no pudo ser parseado por Babel', {
41
+ error: err instanceof Error ? err.message : String(err),
42
+ raw: raw.slice(0, 100),
43
+ });
44
+ }
45
+ const jsxRoots = extractJSXRoots(ast);
46
+ if (jsxRoots.length === 0) {
47
+ throw new ParseError('No se encontró JSX en el código fuente', {
48
+ raw: raw.slice(0, 100),
49
+ });
50
+ }
51
+ const root = jsxRoots.map((el, i) => parseJSXElement(el, i))
52
+ .filter((n) => n !== null);
53
+ if (root.length === 0) {
54
+ throw new ParseError('JSX no produjo nodos VIR válidos', {
55
+ raw: raw.slice(0, 100),
56
+ });
57
+ }
58
+ const virId = generateVIRId({ raw: raw.slice(0, 200), sourceId });
59
+ const vir = {
60
+ virVersion: '1.0.0',
61
+ id: virId,
62
+ source: {
63
+ type: 'react',
64
+ ...(sourceId !== undefined && { sourceId }),
65
+ },
66
+ root,
67
+ createdAt: new Date().toISOString(),
68
+ };
69
+ const result = VisualIRSchema.safeParse(vir);
70
+ if (!result.success) {
71
+ throw new VIRValidationError(result.error, { sourceType: 'react' });
72
+ }
73
+ logger.debug({ nodeCount: root.length, sourceId }, 'JSX VIR parsed');
74
+ return { vir: result.data, warnings: [] };
75
+ },
76
+ };
77
+ // ─── Extracción de JSX raíz ───────────────────────────────────────────────────
78
+ function extractJSXRoots(ast) {
79
+ const roots = [];
80
+ for (const node of ast.program.body) {
81
+ // export default function Component() { return <JSX> }
82
+ // function Component() { return <JSX> }
83
+ if (node.type === 'ExportDefaultDeclaration' ||
84
+ node.type === 'FunctionDeclaration' ||
85
+ node.type === 'ExportNamedDeclaration') {
86
+ const decl = node.type === 'ExportDefaultDeclaration' ||
87
+ node.type === 'ExportNamedDeclaration'
88
+ ? node.declaration
89
+ : node;
90
+ if (decl && 'body' in decl && decl.body) {
91
+ const body = decl.body;
92
+ const returnStmt = body.body?.find((s) => s.type === 'ReturnStatement');
93
+ const arg = returnStmt?.argument;
94
+ if (arg?.type === 'JSXElement') {
95
+ roots.push(arg);
96
+ }
97
+ else if (arg?.type === 'JSXFragment') {
98
+ const frag = arg;
99
+ roots.push(...frag.children.filter((c) => c.type === 'JSXElement'));
100
+ }
101
+ }
102
+ }
103
+ // Expresiones JSX de nivel superior: export default (<div>)
104
+ if (node.type === 'ExpressionStatement') {
105
+ const expr = node.expression;
106
+ if (expr.type === 'JSXElement') {
107
+ roots.push(expr);
108
+ }
109
+ }
110
+ }
111
+ return roots;
112
+ }
113
+ // ─── Parseo recursivo JSX ─────────────────────────────────────────────────────
114
+ function parseJSXElement(el, index) {
115
+ const nameNode = el.openingElement.name;
116
+ const name = jsxNameToString(nameNode);
117
+ if (!name)
118
+ return null;
119
+ const type = mapJsxElement(name);
120
+ const nodeId = generateNodeId(`${name}-${index}`, index);
121
+ const attrs = extractAttributes(el.openingElement.attributes);
122
+ const content = extractContent(el, name, type, attrs);
123
+ const children = el.children
124
+ .filter((c) => c.type === 'JSXElement')
125
+ .map((child, i) => parseJSXElement(child, i))
126
+ .filter((n) => n !== null);
127
+ const meta = {
128
+ originalType: name,
129
+ ...(attrs['id'] !== undefined && { originalId: String(attrs['id']) }),
130
+ ...(attrs['className'] !== undefined && {
131
+ cssClasses: String(attrs['className']).split(/\s+/).filter(Boolean),
132
+ }),
133
+ };
134
+ const node = {
135
+ id: nodeId,
136
+ type,
137
+ ...(content !== undefined && { content }),
138
+ ...(children.length > 0 && { children }),
139
+ meta,
140
+ };
141
+ return node;
142
+ }
143
+ // ─── Extracción de atributos JSX ─────────────────────────────────────────────
144
+ function extractAttributes(attrs) {
145
+ const result = {};
146
+ for (const attr of attrs) {
147
+ if (attr.type !== 'JSXAttribute')
148
+ continue;
149
+ const jsxAttr = attr;
150
+ const key = typeof jsxAttr.name === 'object' && 'name' in jsxAttr.name
151
+ ? String(jsxAttr.name.name)
152
+ : '';
153
+ if (!key)
154
+ continue;
155
+ const val = jsxAttr.value;
156
+ if (val === null) {
157
+ result[key] = true;
158
+ }
159
+ else if (val?.type === 'StringLiteral') {
160
+ result[key] = val.value;
161
+ }
162
+ else if (val?.type === 'JSXExpressionContainer') {
163
+ const expr = val.expression;
164
+ if (expr.type === 'StringLiteral') {
165
+ result[key] = expr.value;
166
+ }
167
+ else if (expr.type === 'NumericLiteral') {
168
+ result[key] = expr.value;
169
+ }
170
+ else if (expr.type === 'BooleanLiteral') {
171
+ result[key] = expr.value;
172
+ }
173
+ }
174
+ }
175
+ return result;
176
+ }
177
+ // ─── Extracción de contenido por tipo ────────────────────────────────────────
178
+ function extractContent(el, name, type, attrs) {
179
+ const textContent = extractTextContent(el);
180
+ switch (type) {
181
+ case 'heading': {
182
+ const level = HTML_HEADING_LEVEL_MAP[name.toLowerCase()] ?? 2;
183
+ return { level, ...(textContent !== undefined && { text: textContent }) };
184
+ }
185
+ case 'text':
186
+ return textContent !== undefined ? { text: textContent } : undefined;
187
+ case 'image': {
188
+ const src = attrs['src'];
189
+ const alt = attrs['alt'];
190
+ if (!src)
191
+ return undefined;
192
+ return { src, ...(alt !== undefined && { alt }) };
193
+ }
194
+ case 'button': {
195
+ const href = attrs['href'];
196
+ const to = attrs['to']; // React Router
197
+ const label = textContent;
198
+ const targetAttr = attrs['target'];
199
+ const target = targetAttr === '_blank' ? '_blank' : '_self';
200
+ return {
201
+ ...(label !== undefined && { label }),
202
+ ...(href !== undefined && { href }),
203
+ ...(to !== undefined && !href && { href: to }),
204
+ target,
205
+ };
206
+ }
207
+ case 'list': {
208
+ const listItems = el.children.filter((c) => c.type === 'JSXElement');
209
+ const items = listItems.map((li, i) => ({
210
+ id: generateNodeId(`li-${i}`, i),
211
+ text: extractTextContent(li) ?? '',
212
+ }));
213
+ return items.length > 0 ? { items } : undefined;
214
+ }
215
+ default:
216
+ return undefined;
217
+ }
218
+ }
219
+ // ─── Texto de un JSXElement ───────────────────────────────────────────────────
220
+ function extractTextContent(el) {
221
+ const parts = [];
222
+ for (const child of el.children) {
223
+ if (child.type === 'JSXText') {
224
+ const text = child.value.trim();
225
+ if (text)
226
+ parts.push(text);
227
+ }
228
+ else if (child.type === 'JSXExpressionContainer') {
229
+ const expr = child.expression;
230
+ if (expr.type === 'StringLiteral') {
231
+ parts.push(expr.value);
232
+ }
233
+ }
234
+ }
235
+ return normalizeText(parts.join(' '));
236
+ }
237
+ // ─── Utilidades ───────────────────────────────────────────────────────────────
238
+ function jsxNameToString(name) {
239
+ if (name.type === 'JSXIdentifier')
240
+ return name.name;
241
+ if (name.type === 'JSXMemberExpression') {
242
+ const obj = jsxNameToString(name.object);
243
+ return obj ? `${obj}.${name.property.name}` : null;
244
+ }
245
+ return null;
246
+ }
247
+ function generateNodeId(seed, index) {
248
+ const hash = createHash('sha256')
249
+ .update(`${seed}-${index}`)
250
+ .digest('hex')
251
+ .slice(0, 8);
252
+ return `node_${hash}`;
253
+ }
254
+ function generateVIRId(content) {
255
+ const hash = createHash('sha256')
256
+ .update(JSON.stringify(content))
257
+ .digest('hex')
258
+ .slice(0, 8);
259
+ return `vir_${hash}`;
260
+ }
261
+ //# sourceMappingURL=jsx-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-parser.js","sourceRoot":"","sources":["../../src/core/jsx-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * MUCV — Tablas de mapeo source-type → VisualNodeType
3
+ * Cada parser usa estas tablas para convertir tipos de su formato
4
+ * al vocabulario universal del VIR.
5
+ *
6
+ * @see docs/VIR-SPEC.md §2
7
+ */
8
+ import type { VisualNodeType } from './vir.js';
9
+ /**
10
+ * Mapeo de `elType` de Elementor → VisualNodeType.
11
+ * Aplica a section, column y container (Elementor v3.6+).
12
+ */
13
+ export declare const ELEMENTOR_ELTYPE_MAP: Readonly<Record<string, VisualNodeType>>;
14
+ /**
15
+ * Mapeo de `widgetType` de Elementor → VisualNodeType.
16
+ * Aplica únicamente cuando `elType === 'widget'`.
17
+ */
18
+ export declare const ELEMENTOR_WIDGET_MAP: Readonly<Record<string, VisualNodeType>>;
19
+ /**
20
+ * Resuelve el VisualNodeType para un elemento Elementor.
21
+ * @param elType — valor de la propiedad `elType`
22
+ * @param widgetType — valor de la propiedad `widgetType` (solo si elType === 'widget')
23
+ */
24
+ export declare function mapElementorType(elType: string, widgetType?: string): VisualNodeType;
25
+ /**
26
+ * Mapeo de etiqueta HTML → VisualNodeType.
27
+ * Las etiquetas en minúsculas según el estándar HTML.
28
+ */
29
+ export declare const HTML_TAG_MAP: Readonly<Record<string, VisualNodeType>>;
30
+ /** Etiquetas que representan encabezados con nivel numérico. */
31
+ export declare const HTML_HEADING_TAGS: Set<string>;
32
+ /** Mapeo de etiqueta HTML → nivel de heading (1-6). */
33
+ export declare const HTML_HEADING_LEVEL_MAP: Readonly<Record<string, 1 | 2 | 3 | 4 | 5 | 6>>;
34
+ /**
35
+ * Resuelve el VisualNodeType para una etiqueta HTML.
36
+ * Tiene en cuenta el `display` CSS para detectar flex/grid.
37
+ * @param tag — etiqueta HTML en minúsculas
38
+ * @param cssDisplay — valor del atributo style display, si existe
39
+ */
40
+ export declare function mapHtmlTag(tag: string, cssDisplay?: string): VisualNodeType;
41
+ /**
42
+ * Mapeo de nombre de componente JSX (PascalCase o etiqueta nativa) → VisualNodeType.
43
+ * Los elementos JSX nativos siguen las mismas reglas que HTML.
44
+ * Los componentes PascalCase se tratan por nombre de componente.
45
+ */
46
+ export declare const JSX_COMPONENT_MAP: Readonly<Record<string, VisualNodeType>>;
47
+ /**
48
+ * Resuelve el VisualNodeType para un elemento JSX.
49
+ * Primero intenta los componentes PascalCase, luego las etiquetas nativas (lowercase).
50
+ */
51
+ export declare function mapJsxElement(name: string): VisualNodeType;
52
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/core/mapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAIzE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAWzE,CAAA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAQhB;AAID;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuBjE,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,aAAgD,CAAA;AAE9E,uDAAuD;AACvD,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAOlF,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAI3E;AAID;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAqBtE,CAAA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAO1D"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * MUCV — Tablas de mapeo source-type → VisualNodeType
3
+ * Cada parser usa estas tablas para convertir tipos de su formato
4
+ * al vocabulario universal del VIR.
5
+ *
6
+ * @see docs/VIR-SPEC.md §2
7
+ */
8
+ // ─── Elementor ────────────────────────────────────────────────────────────────
9
+ /**
10
+ * Mapeo de `elType` de Elementor → VisualNodeType.
11
+ * Aplica a section, column y container (Elementor v3.6+).
12
+ */
13
+ export const ELEMENTOR_ELTYPE_MAP = {
14
+ section: 'section',
15
+ column: 'container',
16
+ container: 'container',
17
+ };
18
+ /**
19
+ * Mapeo de `widgetType` de Elementor → VisualNodeType.
20
+ * Aplica únicamente cuando `elType === 'widget'`.
21
+ */
22
+ export const ELEMENTOR_WIDGET_MAP = {
23
+ heading: 'heading',
24
+ 'text-editor': 'text',
25
+ image: 'image',
26
+ button: 'button',
27
+ 'icon-list': 'list',
28
+ video: 'custom',
29
+ spacer: 'custom',
30
+ divider: 'custom',
31
+ 'wp-widget-recent-posts': 'list',
32
+ 'wp-widget-categories': 'list',
33
+ };
34
+ /**
35
+ * Resuelve el VisualNodeType para un elemento Elementor.
36
+ * @param elType — valor de la propiedad `elType`
37
+ * @param widgetType — valor de la propiedad `widgetType` (solo si elType === 'widget')
38
+ */
39
+ export function mapElementorType(elType, widgetType) {
40
+ if (elType !== 'widget') {
41
+ return ELEMENTOR_ELTYPE_MAP[elType] ?? 'custom';
42
+ }
43
+ if (widgetType !== undefined) {
44
+ return ELEMENTOR_WIDGET_MAP[widgetType] ?? 'custom';
45
+ }
46
+ return 'custom';
47
+ }
48
+ // ─── HTML ─────────────────────────────────────────────────────────────────────
49
+ /**
50
+ * Mapeo de etiqueta HTML → VisualNodeType.
51
+ * Las etiquetas en minúsculas según el estándar HTML.
52
+ */
53
+ export const HTML_TAG_MAP = {
54
+ section: 'section',
55
+ article: 'section',
56
+ main: 'section',
57
+ header: 'section',
58
+ footer: 'section',
59
+ nav: 'container',
60
+ div: 'container',
61
+ h1: 'heading',
62
+ h2: 'heading',
63
+ h3: 'heading',
64
+ h4: 'heading',
65
+ h5: 'heading',
66
+ h6: 'heading',
67
+ p: 'text',
68
+ span: 'text',
69
+ blockquote: 'text',
70
+ img: 'image',
71
+ picture: 'image',
72
+ a: 'button',
73
+ button: 'button',
74
+ ul: 'list',
75
+ ol: 'list',
76
+ };
77
+ /** Etiquetas que representan encabezados con nivel numérico. */
78
+ export const HTML_HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);
79
+ /** Mapeo de etiqueta HTML → nivel de heading (1-6). */
80
+ export const HTML_HEADING_LEVEL_MAP = {
81
+ h1: 1,
82
+ h2: 2,
83
+ h3: 3,
84
+ h4: 4,
85
+ h5: 5,
86
+ h6: 6,
87
+ };
88
+ /**
89
+ * Resuelve el VisualNodeType para una etiqueta HTML.
90
+ * Tiene en cuenta el `display` CSS para detectar flex/grid.
91
+ * @param tag — etiqueta HTML en minúsculas
92
+ * @param cssDisplay — valor del atributo style display, si existe
93
+ */
94
+ export function mapHtmlTag(tag, cssDisplay) {
95
+ if (cssDisplay === 'flex')
96
+ return 'flex';
97
+ if (cssDisplay === 'grid')
98
+ return 'grid';
99
+ return HTML_TAG_MAP[tag.toLowerCase()] ?? 'custom';
100
+ }
101
+ // ─── JSX ─────────────────────────────────────────────────────────────────────
102
+ /**
103
+ * Mapeo de nombre de componente JSX (PascalCase o etiqueta nativa) → VisualNodeType.
104
+ * Los elementos JSX nativos siguen las mismas reglas que HTML.
105
+ * Los componentes PascalCase se tratan por nombre de componente.
106
+ */
107
+ export const JSX_COMPONENT_MAP = {
108
+ Section: 'section',
109
+ Hero: 'section',
110
+ Header: 'section',
111
+ Footer: 'section',
112
+ Article: 'section',
113
+ Container: 'container',
114
+ Wrapper: 'container',
115
+ Box: 'container',
116
+ Flex: 'flex',
117
+ Grid: 'grid',
118
+ Heading: 'heading',
119
+ Title: 'heading',
120
+ Text: 'text',
121
+ Paragraph: 'text',
122
+ Image: 'image',
123
+ Img: 'image',
124
+ Button: 'button',
125
+ Link: 'button',
126
+ List: 'list',
127
+ ListItem: 'custom',
128
+ };
129
+ /**
130
+ * Resuelve el VisualNodeType para un elemento JSX.
131
+ * Primero intenta los componentes PascalCase, luego las etiquetas nativas (lowercase).
132
+ */
133
+ export function mapJsxElement(name) {
134
+ // Componente PascalCase
135
+ if (name[0] === name[0]?.toUpperCase() && name[0] !== name[0]?.toLowerCase()) {
136
+ return JSX_COMPONENT_MAP[name] ?? 'custom';
137
+ }
138
+ // Etiqueta nativa HTML
139
+ return HTML_TAG_MAP[name.toLowerCase()] ?? 'custom';
140
+ }
141
+ //# sourceMappingURL=mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../src/core/mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * MUCV — Normalizer
3
+ * Funciones de normalización de estilos y contenido.
4
+ * Los parsers las usan para producir StyleConfig y ContentConfig
5
+ * compatibles con el schema Zod del VIR.
6
+ *
7
+ * @see docs/VIR-SPEC.md §3
8
+ */
9
+ import type { BoxModel, StyleConfig, TypographyConfig, BackgroundConfig } from './vir.js';
10
+ /**
11
+ * Normaliza un valor de tamaño de Elementor `{ size, unit }` a string CSS.
12
+ * @example normalizeSizeValue({ size: 48, unit: 'px' }) → "48px"
13
+ */
14
+ export declare function normalizeSizeValue(raw: unknown): string | undefined;
15
+ /**
16
+ * Normaliza un objeto de Elementor con propiedades top/right/bottom/left a BoxModel.
17
+ * Soporta el formato `{ top, right, bottom, left, unit }` de Elementor.
18
+ */
19
+ export declare function normalizeBoxModel(raw: unknown): BoxModel | undefined;
20
+ /**
21
+ * Normaliza un valor de color a string CSS.
22
+ * Acepta: hex (#fff, #ffffff), rgb(), rgba(), nombres CSS, variables CSS.
23
+ * Expande hex corto #fff → #ffffff.
24
+ */
25
+ export declare function normalizeColor(raw: unknown): string | undefined;
26
+ /**
27
+ * Extrae y normaliza la configuración tipográfica de los settings de Elementor.
28
+ */
29
+ export declare function normalizeTypographyFromElementor(settings: Record<string, unknown>): TypographyConfig | undefined;
30
+ /**
31
+ * Extrae y normaliza el background de los settings de Elementor.
32
+ */
33
+ export declare function normalizeBackgroundFromElementor(settings: Record<string, unknown>): BackgroundConfig | undefined;
34
+ /**
35
+ * Extrae padding de los settings de Elementor.
36
+ * Soporta `padding` (objeto) y `_padding` (nombre alternativo).
37
+ */
38
+ export declare function normalizePaddingFromElementor(settings: Record<string, unknown>): BoxModel | undefined;
39
+ /**
40
+ * Extrae margin de los settings de Elementor.
41
+ */
42
+ export declare function normalizeMarginFromElementor(settings: Record<string, unknown>): BoxModel | undefined;
43
+ /**
44
+ * Construye un StyleConfig desde los settings de Elementor.
45
+ * Solo incluye propiedades que tienen valor definido.
46
+ */
47
+ export declare function buildStyleFromElementor(settings: Record<string, unknown>): StyleConfig | undefined;
48
+ /**
49
+ * Construye un StyleConfig desde atributos de un elemento HTML.
50
+ * Parsea el atributo `style` inline y clases para detectar layout.
51
+ */
52
+ export declare function buildStyleFromHtml(inlineStyle: string | undefined, _classNames: string[]): StyleConfig | undefined;
53
+ /** Elimina etiquetas HTML de un string de texto. */
54
+ export declare function stripHtmlTags(raw: string): string;
55
+ /** Limpia y normaliza un string de texto plano. */
56
+ export declare function normalizeText(raw: unknown): string | undefined;
57
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../src/core/normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAIjB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,GACX,MAAM,GAAG,SAAS,CAcpB;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,GACX,QAAQ,GAAG,SAAS,CAmCtB;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAmB/D;AAID;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,gBAAgB,GAAG,SAAS,CA2B9B;AAkCD;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,gBAAgB,GAAG,SAAS,CAY9B;AAID;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,QAAQ,GAAG,SAAS,CAEtB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,QAAQ,GAAG,SAAS,CAEtB;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,WAAW,GAAG,SAAS,CAkBzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,EAAE,GACpB,WAAW,GAAG,SAAS,CA2CzB;AAID,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D"}