@meekojs/meeko 0.0.2 → 0.0.4
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.
- package/README.md +40 -2
- package/dist/autoimports-ts.d.ts +26 -0
- package/dist/autoimports-ts.js +127 -0
- package/dist/autoimports-ts.js.map +1 -0
- package/dist/autoimports.d.ts +21 -0
- package/dist/autoimports.js +285 -0
- package/dist/autoimports.js.map +1 -0
- package/dist/check.js +35 -23
- package/dist/check.js.map +1 -0
- package/dist/cli.js +59 -19
- package/dist/cli.js.map +1 -0
- package/dist/compiler/import-graph.d.ts +8 -0
- package/dist/compiler/import-graph.js +33 -0
- package/dist/compiler/import-graph.js.map +1 -0
- package/dist/compiler/mapping.js +1 -0
- package/dist/compiler/mapping.js.map +1 -0
- package/dist/compiler/project-root.d.ts +2 -0
- package/dist/compiler/project-root.js +18 -0
- package/dist/compiler/project-root.js.map +1 -0
- package/dist/compiler/sfc.js +1 -0
- package/dist/compiler/sfc.js.map +1 -0
- package/dist/compiler/sourcemap.d.ts +3 -0
- package/dist/compiler/sourcemap.js +75 -0
- package/dist/compiler/sourcemap.js.map +1 -0
- package/dist/compiler/template.js +1 -0
- package/dist/compiler/template.js.map +1 -0
- package/dist/compiler.js +22 -11
- package/dist/compiler.js.map +1 -0
- package/dist/devtools-ui/index.js +56 -6
- package/dist/devtools-ui/index.js.map +1 -0
- package/dist/devtools.d.ts +9 -0
- package/dist/devtools.js +16 -6
- package/dist/devtools.js.map +1 -0
- package/dist/dom.d.ts +17 -6
- package/dist/dom.js +86 -19
- package/dist/dom.js.map +1 -0
- package/dist/framework/check-app.d.ts +5 -0
- package/dist/framework/check-app.js +59 -0
- package/dist/framework/check-app.js.map +1 -0
- package/dist/framework/client.d.ts +45 -0
- package/dist/framework/client.js +146 -0
- package/dist/framework/client.js.map +1 -0
- package/dist/framework/clients.d.ts +82 -0
- package/dist/framework/clients.js +182 -0
- package/dist/framework/clients.js.map +1 -0
- package/dist/framework/config-type.d.ts +10 -0
- package/dist/framework/config-type.js +4 -0
- package/dist/framework/config-type.js.map +1 -0
- package/dist/framework/config.d.ts +15 -0
- package/dist/framework/config.js +138 -0
- package/dist/framework/config.js.map +1 -0
- package/dist/framework/contracts-generate.d.ts +8 -0
- package/dist/framework/contracts-generate.js +227 -0
- package/dist/framework/contracts-generate.js.map +1 -0
- package/dist/framework/generate.d.ts +7 -0
- package/dist/framework/generate.js +67 -0
- package/dist/framework/generate.js.map +1 -0
- package/dist/framework/init.d.ts +2 -0
- package/dist/framework/init.js +362 -0
- package/dist/framework/init.js.map +1 -0
- package/dist/framework/modules.d.ts +22 -0
- package/dist/framework/modules.js +29 -0
- package/dist/framework/modules.js.map +1 -0
- package/dist/framework/page.d.ts +60 -0
- package/dist/framework/page.js +42 -0
- package/dist/framework/page.js.map +1 -0
- package/dist/framework/prerender.d.ts +14 -0
- package/dist/framework/prerender.js +104 -0
- package/dist/framework/prerender.js.map +1 -0
- package/dist/framework/router.d.ts +39 -0
- package/dist/framework/router.js +173 -0
- package/dist/framework/router.js.map +1 -0
- package/dist/framework/server.d.ts +51 -0
- package/dist/framework/server.js +192 -0
- package/dist/framework/server.js.map +1 -0
- package/dist/framework/socket-contracts-generate.d.ts +5 -0
- package/dist/framework/socket-contracts-generate.js +159 -0
- package/dist/framework/socket-contracts-generate.js.map +1 -0
- package/dist/framework/socket.d.ts +70 -0
- package/dist/framework/socket.js +150 -0
- package/dist/framework/socket.js.map +1 -0
- package/dist/framework/state.d.ts +15 -0
- package/dist/framework/state.js +72 -0
- package/dist/framework/state.js.map +1 -0
- package/dist/framework-server/auto-clients.d.ts +3 -0
- package/dist/framework-server/auto-clients.js +27 -0
- package/dist/framework-server/auto-clients.js.map +1 -0
- package/dist/framework-server/context.d.ts +21 -0
- package/dist/framework-server/context.js +22 -0
- package/dist/framework-server/context.js.map +1 -0
- package/dist/framework-server/contracts.d.ts +64 -0
- package/dist/framework-server/contracts.js +129 -0
- package/dist/framework-server/contracts.js.map +1 -0
- package/dist/framework-server/discovery.d.ts +40 -0
- package/dist/framework-server/discovery.js +252 -0
- package/dist/framework-server/discovery.js.map +1 -0
- package/dist/framework-server/local.d.ts +19 -0
- package/dist/framework-server/local.js +98 -0
- package/dist/framework-server/local.js.map +1 -0
- package/dist/framework-server/node-upgrade.d.ts +23 -0
- package/dist/framework-server/node-upgrade.js +78 -0
- package/dist/framework-server/node-upgrade.js.map +1 -0
- package/dist/framework-server/node-websocket.d.ts +16 -0
- package/dist/framework-server/node-websocket.js +125 -0
- package/dist/framework-server/node-websocket.js.map +1 -0
- package/dist/framework-server/openapi.d.ts +17 -0
- package/dist/framework-server/openapi.js +118 -0
- package/dist/framework-server/openapi.js.map +1 -0
- package/dist/framework-server/session-stores.d.ts +66 -0
- package/dist/framework-server/session-stores.js +96 -0
- package/dist/framework-server/session-stores.js.map +1 -0
- package/dist/framework-server/sessions.d.ts +64 -0
- package/dist/framework-server/sessions.js +136 -0
- package/dist/framework-server/sessions.js.map +1 -0
- package/dist/framework-server/socket.d.ts +83 -0
- package/dist/framework-server/socket.js +161 -0
- package/dist/framework-server/socket.js.map +1 -0
- package/dist/framework-server.d.ts +21 -0
- package/dist/framework-server.js +12 -0
- package/dist/framework-server.js.map +1 -0
- package/dist/framework.d.ts +29 -0
- package/dist/framework.js +13 -0
- package/dist/framework.js.map +1 -0
- package/dist/hmr.js +1 -0
- package/dist/hmr.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.js +209 -0
- package/dist/init.js.map +1 -0
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -0
- package/dist/node.d.ts +12 -0
- package/dist/node.js +52 -0
- package/dist/node.js.map +1 -0
- package/dist/reactivity.d.ts +25 -1
- package/dist/reactivity.js +69 -10
- package/dist/reactivity.js.map +1 -0
- package/dist/server.js +1 -0
- package/dist/server.js.map +1 -0
- package/dist/types.js +23 -8
- package/dist/types.js.map +1 -0
- package/dist/vite.js +91 -6
- package/dist/vite.js.map +1 -0
- package/package.json +19 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/compiler/template.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseFragment } from \"parse5\";\nimport { compileError } from \"./sfc.js\";\nimport type { SfcSection } from \"./sfc.js\";\n\n/** Atributo normalizado de una etiqueta de plantilla. */\nexport interface TemplateAttribute {\n name: string;\n value: string;\n start: number;\n end: number;\n}\n\n/** Nodo propio de plantilla con límites absolutos en el archivo .meeko. */\nexport interface TemplateNode {\n nodeName: string;\n tagName?: string;\n value?: string;\n attrs?: TemplateAttribute[];\n childNodes?: TemplateNode[];\n content?: { childNodes: TemplateNode[] };\n start: number;\n end: number;\n sourceCodeLocation?: {\n startOffset: number;\n endOffset: number;\n attrs?: Record<string, { startOffset: number; endOffset: number }>;\n };\n}\n\ninterface ParsedNode {\n nodeName: string;\n tagName?: string;\n value?: string;\n attrs?: Array<{ name: string; value: string }>;\n childNodes?: ParsedNode[];\n content?: { childNodes?: ParsedNode[] };\n sourceCodeLocation?: {\n startOffset: number;\n endOffset: number;\n attrs?: Record<string, { startOffset: number; endOffset: number }>;\n };\n}\n\nfunction normalize(node: ParsedNode, template: SfcSection): TemplateNode {\n const location = node.sourceCodeLocation;\n const attrs = node.attrs?.map((attribute) => {\n const span = location?.attrs?.[attribute.name];\n return {\n name: attribute.name,\n value: attribute.value,\n start: template.contentStart + (span?.startOffset ?? location?.startOffset ?? 0),\n end: template.contentStart + (span?.endOffset ?? location?.endOffset ?? 0),\n };\n });\n const result: TemplateNode = {\n nodeName: node.nodeName,\n start: template.contentStart + (location?.startOffset ?? 0),\n end: template.contentStart + (location?.endOffset ?? template.content.length),\n };\n if (node.tagName !== undefined) result.tagName = node.tagName;\n if (node.value !== undefined) result.value = node.value;\n if (attrs !== undefined) result.attrs = attrs;\n if (node.childNodes !== undefined) result.childNodes = node.childNodes.map((child) => normalize(child, template));\n if (node.content !== undefined) result.content = { childNodes: (node.content.childNodes ?? []).map((child) => normalize(child, template)) };\n if (location !== undefined) result.sourceCodeLocation = location;\n return result;\n}\n\n/** Analiza HTML y entrega un AST independiente del parser con posiciones originales. */\nexport function parseTemplate(source: string, template: SfcSection, filename: string): TemplateNode {\n const errors: Array<{ code: string; startOffset: number }> = [];\n const parsed = parseFragment(template.content, {\n sourceCodeLocationInfo: true,\n onParseError(error) { errors.push({ code: error.code, startOffset: error.startOffset }); },\n }) as unknown as ParsedNode;\n const error = errors[0];\n if (error) throw compileError(source, filename, \"MEEK008\", `Invalid template HTML: ${error.code}`, template.contentStart + error.startOffset);\n return normalize(parsed, template);\n}\n"]}
|
package/dist/compiler.js
CHANGED
|
@@ -154,9 +154,10 @@ function renderNodeContent(node, bindings, context) {
|
|
|
154
154
|
const position = node.start;
|
|
155
155
|
const referenceAttribute = node.attrs?.find((attribute) => attribute.name === "is");
|
|
156
156
|
const reference = referenceAttribute?.value ?? "";
|
|
157
|
-
if (
|
|
158
|
-
throw compileError(context.source, context.filename, "MEEK030", "A component requires is=\"
|
|
159
|
-
|
|
157
|
+
if (!reference.trim())
|
|
158
|
+
throw compileError(context.source, context.filename, "MEEK030", "A component requires is=\"expression\"", position);
|
|
159
|
+
const referenceOffset = attributeValueOffset(node, "is", context);
|
|
160
|
+
validateExpression(reference, context.source, context.filename, referenceOffset);
|
|
160
161
|
if ((node.childNodes ?? []).some((child) => child.nodeName !== "#text" || Boolean(child.value?.trim()))) {
|
|
161
162
|
throw compileError(context.source, context.filename, "MEEK031", "Component children are not supported; close the tag without content", position);
|
|
162
163
|
}
|
|
@@ -174,7 +175,6 @@ function renderNodeContent(node, bindings, context) {
|
|
|
174
175
|
props.push({ name, nameOffset: attribute.start + 5, expression: attribute.value, offset });
|
|
175
176
|
}
|
|
176
177
|
const id = context.nextRegion++;
|
|
177
|
-
const referenceOffset = attributeValueOffset(node, "is", context);
|
|
178
178
|
bindings.components.push({ id, reference, referenceOffset, props, offset: position });
|
|
179
179
|
const mappedProps = props.map((prop) => `${markSource(quote(prop.name), prop.nameOffset, prop.name.length)}: ${markSource(prop.expression, prop.offset)}`);
|
|
180
180
|
const object = markSource(`{ ${mappedProps.join(", ")} }`, position, node.end - position);
|
|
@@ -278,6 +278,11 @@ function compileScript(section, source, filename) {
|
|
|
278
278
|
types.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));
|
|
279
279
|
continue;
|
|
280
280
|
}
|
|
281
|
+
if (ts.isExportDeclaration(statement) && (statement.isTypeOnly ||
|
|
282
|
+
(statement.exportClause && ts.isNamedExports(statement.exportClause) && statement.exportClause.elements.every((element) => element.isTypeOnly)))) {
|
|
283
|
+
types.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
281
286
|
if (ts.isVariableStatement(statement)) {
|
|
282
287
|
if (statement.declarationList.declarations.length !== 1)
|
|
283
288
|
throw compileError(source, filename, "MEEK014", "Declare one variable per statement in .meeko scripts", section.contentStart + statement.getStart(file));
|
|
@@ -311,18 +316,20 @@ function compileScript(section, source, filename) {
|
|
|
311
316
|
}
|
|
312
317
|
return { imports, types, setup, names, propsType: propsType ?? "Record<string, never>", propsTypeOffset };
|
|
313
318
|
}
|
|
314
|
-
function hydrationBody(bindings, context, locals = new Map()) {
|
|
319
|
+
function hydrationBody(bindings, context, hot, locals = new Map()) {
|
|
315
320
|
const statements = [];
|
|
316
321
|
const mappedExpression = (expression, offset, expressionLocals = locals) => markSource(rewriteLocals(expression, expressionLocals), offset, expression.length);
|
|
317
322
|
for (const { id, expression, offset } of bindings.texts) {
|
|
318
323
|
const point = locate(context.source, offset);
|
|
319
324
|
const location = `${basename(context.filename)}:${point.line}:${point.column} (text ${id})`;
|
|
320
|
-
|
|
325
|
+
const source = hot ? `, { file: ${quote(context.filename)}, line: ${point.line}, column: ${point.column}, expression: ${quote(expression)}, kind: "text" }` : "";
|
|
326
|
+
statements.push(`cleanups.push(__meeko.bindText(__scope, ${id}, () => ${mappedExpression(expression, offset)}, ${quote(location)}${source}));`);
|
|
321
327
|
}
|
|
322
328
|
for (const { id, name, expression, offset } of bindings.attributes) {
|
|
323
329
|
const point = locate(context.source, offset);
|
|
324
330
|
const location = `${basename(context.filename)}:${point.line}:${point.column} (attribute ${name})`;
|
|
325
|
-
|
|
331
|
+
const source = hot ? `, { file: ${quote(context.filename)}, line: ${point.line}, column: ${point.column}, expression: ${quote(expression)}, kind: "attribute" }` : "";
|
|
332
|
+
statements.push(`cleanups.push(__meeko.bindAttribute(__scope, ${id}, ${quote(name)}, () => ${mappedExpression(expression, offset)}, ${quote(location)}${source}));`);
|
|
326
333
|
}
|
|
327
334
|
for (const { id, name, expression, offset } of bindings.events) {
|
|
328
335
|
const eventType = ["click", "input", "change", "submit", "keydown", "keyup", "focus", "blur"].includes(name)
|
|
@@ -340,12 +347,12 @@ function hydrationBody(bindings, context, locals = new Map()) {
|
|
|
340
347
|
const location = `${basename(context.filename)}:${point.line}:${point.column} (component ${entry.reference})`;
|
|
341
348
|
const props = entry.props.map((prop) => `${markSource(quote(prop.name), prop.nameOffset, prop.name.length)}: ${mappedExpression(prop.expression, prop.offset)}`);
|
|
342
349
|
const object = markSource(`{ ${props.join(", ")} }`, entry.offset, 1);
|
|
343
|
-
componentStatements.push(`cleanups.push(__meeko.bindComponent(__scope, ${entry.id}, ${mappedExpression(entry.reference, entry.referenceOffset)}, () => (${object}), ${quote(location)}));`);
|
|
350
|
+
componentStatements.push(`cleanups.push(__meeko.bindComponent(__scope, ${entry.id}, () => ${mappedExpression(entry.reference, entry.referenceOffset)}, () => (${object}), ${quote(location)}));`);
|
|
344
351
|
}
|
|
345
352
|
statements.unshift(...componentStatements);
|
|
346
353
|
for (const entry of bindings.regions) {
|
|
347
354
|
if (entry.kind === "condition") {
|
|
348
|
-
statements.push(`cleanups.push(__meeko.bindIf(__scope, ${entry.id}, () => ${mappedExpression(entry.expression, entry.offset)}, () => ${rewriteLocals(entry.render, locals)}, (__scope) => { ${hydrationBody(entry.bindings, context, locals)} }));`);
|
|
355
|
+
statements.push(`cleanups.push(__meeko.bindIf(__scope, ${entry.id}, () => ${mappedExpression(entry.expression, entry.offset)}, () => ${rewriteLocals(entry.render, locals)}, (__scope) => { ${hydrationBody(entry.bindings, context, hot, locals)} }));`);
|
|
349
356
|
}
|
|
350
357
|
else {
|
|
351
358
|
const outerLocals = new Map(locals);
|
|
@@ -354,7 +361,10 @@ function hydrationBody(bindings, context, locals = new Map()) {
|
|
|
354
361
|
const innerLocals = new Map(locals);
|
|
355
362
|
innerLocals.set(entry.itemName, "__meeko_item.value");
|
|
356
363
|
innerLocals.set(entry.indexName, "__meeko_index.value");
|
|
357
|
-
|
|
364
|
+
const innerHydration = hydrationBody(entry.bindings, context, hot, innerLocals);
|
|
365
|
+
// El callback generado sólo usa la señal de índice si aparece en su hidratación.
|
|
366
|
+
const trackIndex = innerHydration.includes("__meeko_index.value");
|
|
367
|
+
statements.push(`cleanups.push(__meeko.bindFor(__scope, ${entry.id}, () => ${mappedExpression(entry.expression, entry.offset)}, (${entry.itemName}, ${entry.indexName}) => ${mappedExpression(entry.key, entry.keyOffset, outerLocals)}, (${entry.itemName}, ${entry.indexName}) => ${rewriteLocals(entry.render, outerLocals)}, (__meeko_item, __meeko_index, __scope) => { ${innerHydration} }, ${trackIndex}));`);
|
|
358
368
|
}
|
|
359
369
|
}
|
|
360
370
|
return `const cleanups: Array<() => void> = [];
|
|
@@ -398,7 +408,8 @@ export function compile(source, filename = "anonymous.meeko", options = {}) {
|
|
|
398
408
|
const scopeHotRootParam = hot ? ", __hotRoot?: Element" : "";
|
|
399
409
|
const scopeForward = hot ? "__scope, __inputProps, __state, root" : "__scope, __inputProps, __state";
|
|
400
410
|
const propsType = scriptParts.propsTypeOffset === undefined ? scriptParts.propsType : markSource(scriptParts.propsType, scriptParts.propsTypeOffset);
|
|
401
|
-
const markedCode = `// Generated by Meeko. Edit the .meeko source instead.\nimport * as __meeko from "@meekojs/meeko/internal";\n${scriptParts.imports.join("\n")}\n${scriptParts.types.join("\n")}\nfunction __setup(__props: ${propsType}) {\n${scriptParts.setup.join("\n")}\nreturn { ${bindings} };\n}\nexport type ComponentProps = ${propsType};\nexport const css = ${quote(css)};\n${hotIdExport}export function renderWithState(__inputProps: ComponentProps): { html: string; state: __meeko.HotState } {\nreturn __meeko.createRoot((dispose) => {\nconst __meeko_transfer = true;\nconst __bindings = __setup(__inputProps);\nconst { ${bindings} } = __bindings;\ntry {\nconst html = ${html};\nconst state = __meeko.snapshotSignals(__bindings);\n__meeko.serializeJson(state);\nreturn { html, state };\n} finally { dispose(); }\n});\n}\nexport function renderToString(__inputProps: ComponentProps${stateParam}): string {\nreturn __meeko.createRoot((dispose) => {\nconst __meeko_transfer = false;\n${setupCode}\ntry { return ${html}; } finally { dispose(); }\n});\n}\nexport function hydrate(root: Element, __inputProps: ComponentProps${stateParam}): () => void {\nconst __scope: __meeko.DomScope = { root };\nreturn hydrateScope(${scopeForward});\n}\nexport function hydrateScope(__scope: __meeko.DomScope, __inputProps: ComponentProps${stateParam}${scopeHotRootParam}): () => void {\nreturn __meeko.createRoot((dispose) => {\nconst __meeko_transfer = false;\n${setupCode}\nconst __release = (() => { ${hydrationBody(bindingsForTemplate, context)} })();\n${releaseCode}\n});\n}\n`;
|
|
411
|
+
const markedCode = `// Generated by Meeko. Edit the .meeko source instead.\nimport * as __meeko from "@meekojs/meeko/internal";\n${scriptParts.imports.join("\n")}\n${scriptParts.types.join("\n")}\nfunction __setup(__props: ${propsType}) {\n${scriptParts.setup.join("\n")}\nreturn { ${bindings} };\n}\nexport type ComponentProps = ${propsType};\nexport const css = ${quote(css)};\n${hotIdExport}export function renderWithState(__inputProps: ComponentProps): { html: string; state: __meeko.HotState } {\nreturn __meeko.createRoot((dispose) => {\nconst __meeko_transfer = true;\nconst __bindings = __setup(__inputProps);\nconst { ${bindings} } = __bindings;\ntry {\nconst html = ${html};\nconst state = __meeko.snapshotSignals(__bindings);\n__meeko.serializeJson(state);\nreturn { html, state };\n} finally { dispose(); }\n});\n}\nexport function renderToString(__inputProps: ComponentProps${stateParam}): string {\nreturn __meeko.createRoot((dispose) => {\nconst __meeko_transfer = false;\n${setupCode}\ntry { return ${html}; } finally { dispose(); }\n});\n}\nexport function hydrate(root: Element, __inputProps: ComponentProps${stateParam}): () => void {\nconst __scope: __meeko.DomScope = { root };\nreturn hydrateScope(${scopeForward});\n}\nexport function hydrateScope(__scope: __meeko.DomScope, __inputProps: ComponentProps${stateParam}${scopeHotRootParam}): () => void {\nreturn __meeko.createRoot((dispose) => {\nconst __meeko_transfer = false;\n${setupCode}\nconst __release = (() => { ${hydrationBody(bindingsForTemplate, context, hot)} })();\n${releaseCode}\n});\n}\n`;
|
|
402
412
|
const { code, mappings } = extractSourceMappings(markedCode);
|
|
403
413
|
return { code, css, mappings };
|
|
404
414
|
}
|
|
415
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { basename } from \"node:path\";\nimport ts from \"@typescript/typescript6\";\nimport postcss from \"postcss\";\nimport selectorParser from \"postcss-selector-parser\";\nimport { extractSourceMappings, markSource } from \"./compiler/mapping.js\";\nimport type { SourceMapping } from \"./compiler/mapping.js\";\nimport { compileError, locate, parseSfc } from \"./compiler/sfc.js\";\nimport type { SfcSection } from \"./compiler/sfc.js\";\nimport { parseTemplate } from \"./compiler/template.js\";\nimport type { TemplateNode } from \"./compiler/template.js\";\n\ninterface DynamicText {\n id: number;\n expression: string;\n offset: number;\n}\n\ninterface EventBinding {\n id: number;\n name: string;\n expression: string;\n offset: number;\n}\n\ninterface AttributeBinding {\n id: number;\n name: string;\n expression: string;\n offset: number;\n}\n\ninterface ConditionBinding {\n kind: \"condition\";\n id: number;\n expression: string;\n offset: number;\n render: string;\n bindings: TemplateBindings;\n}\n\ninterface ListBinding {\n kind: \"list\";\n id: number;\n expression: string;\n offset: number;\n key: string;\n keyOffset: number;\n itemName: string;\n indexName: string;\n render: string;\n bindings: TemplateBindings;\n}\n\ninterface ComponentBinding {\n id: number;\n reference: string;\n referenceOffset: number;\n props: Array<{ name: string; nameOffset: number; expression: string; offset: number }>;\n offset: number;\n}\n\ninterface TemplateBindings {\n texts: DynamicText[];\n events: EventBinding[];\n attributes: AttributeBinding[];\n components: ComponentBinding[];\n regions: Array<ConditionBinding | ListBinding>;\n}\n\ninterface TemplateContext {\n source: string;\n filename: string;\n templateOffset: number;\n scopeAttribute: string | undefined;\n nextText: number;\n nextEvent: number;\n nextAttribute: number;\n nextRegion: number;\n}\n\nfunction emptyBindings(): TemplateBindings {\n return { texts: [], events: [], attributes: [], components: [], regions: [] };\n}\n\n/** Resultado del compilador de un componente .meeko. */\nexport interface CompileResult {\n code: string;\n css: string;\n mappings: readonly SourceMapping[];\n}\n\n/** Opciones de generación; HMR se incluye solo en módulos de desarrollo. */\nexport interface CompileOptions {\n hot?: boolean;\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction validateExpression(expression: string, source: string, filename: string, offset: number): void {\n const prefix = \"const __check = (\";\n const parsed = ts.createSourceFile(filename, `${prefix}${expression});`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS) as ts.SourceFile & { parseDiagnostics: readonly ts.DiagnosticWithLocation[] };\n const error = parsed.parseDiagnostics[0];\n if (error) {\n const position = Math.max(0, Math.min(expression.length, (error.start ?? prefix.length) - prefix.length));\n throw compileError(source, filename, \"MEEK020\", ts.flattenDiagnosticMessageText(error.messageText, \"\\n\"), offset + position);\n }\n}\n\nfunction attributeValueOffset(node: TemplateNode, name: string, context: TemplateContext): number {\n const position = node.sourceCodeLocation?.attrs?.[name];\n if (!position) return context.templateOffset + (node.sourceCodeLocation?.startOffset ?? 0);\n const raw = context.source.slice(context.templateOffset + position.startOffset, context.templateOffset + position.endOffset);\n const equals = raw.indexOf(\"=\");\n if (equals < 0) return context.templateOffset + position.startOffset;\n const after = raw.slice(equals + 1);\n const whitespace = after.length - after.trimStart().length;\n const quoteStart = equals + 1 + whitespace;\n const quoted = raw[quoteStart] === '\"' || raw[quoteStart] === \"'\";\n return context.templateOffset + position.startOffset + quoteStart + (quoted ? 1 : 0);\n}\n\nfunction rewriteLocals(expression: string, locals: ReadonlyMap<string, string>): string {\n if (locals.size === 0) return expression;\n const prefix = \"const __value = (\";\n const file = ts.createSourceFile(\"template-expression.ts\", `${prefix}${expression});`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);\n const changes: Array<{ start: number; end: number; text: string }> = [];\n function isShadowed(node: ts.Identifier): boolean {\n for (let parent = node.parent; parent; parent = parent.parent) {\n if ((ts.isArrowFunction(parent) || ts.isFunctionExpression(parent)) && parent.parameters.some((parameter) => ts.isIdentifier(parameter.name) && parameter.name.text === node.text)) return true;\n if (ts.isSourceFile(parent)) break;\n }\n return false;\n }\n function visit(node: ts.Node): void {\n if (ts.isIdentifier(node)) {\n const replacement = locals.get(node.text);\n const parent = node.parent;\n if (replacement && parent && !isShadowed(node)\n && !(ts.isPropertyAccessExpression(parent) && parent.name === node)\n && !(ts.isPropertyAssignment(parent) && parent.name === node)\n && !(ts.isParameter(parent) && parent.name === node)\n && !(ts.isVariableDeclaration(parent) && parent.name === node)) {\n const shorthand = ts.isShorthandPropertyAssignment(parent) && parent.name === node;\n changes.push({ start: node.getStart(file) - prefix.length, end: node.getEnd() - prefix.length, text: shorthand ? `${node.text}: (${replacement})` : `(${replacement})` });\n }\n }\n ts.forEachChild(node, visit);\n }\n visit(file);\n let result = expression;\n for (const change of changes.reverse()) {\n if (change.start >= 0 && change.end <= expression.length) result = result.slice(0, change.start) + change.text + result.slice(change.end);\n }\n return result;\n}\n\nfunction textParts(value: string, bindings: TemplateBindings, context: TemplateContext, offset: number): string[] {\n const parts: string[] = [];\n const pattern = /\\{([^{}]+)\\}/g;\n let cursor = 0;\n for (const match of value.matchAll(pattern)) {\n const index = match.index;\n const staticPart = value.slice(cursor, index);\n if (staticPart) parts.push(`__meeko.escapeHtml(${quote(staticPart)})`);\n const rawExpression = match[1] ?? \"\";\n const expression = rawExpression.trim();\n if (!expression) throw compileError(context.source, context.filename, \"MEEK009\", \"Empty template expression\", offset + index);\n validateExpression(expression, context.source, context.filename, offset + index + 1 + rawExpression.indexOf(expression));\n const id = context.nextText++;\n const expressionOffset = offset + index + 1 + rawExpression.indexOf(expression);\n bindings.texts.push({ id, expression, offset: expressionOffset });\n parts.push(`${quote(`<!--meeko:text:${id}-->`)} + __meeko.escapeHtml(${markSource(expression, expressionOffset)}) + ${quote(`<!--/meeko:text:${id}-->`)}`);\n cursor = index + match[0].length;\n }\n const tail = value.slice(cursor);\n if (tail.includes(\"{\")) throw compileError(context.source, context.filename, \"MEEK010\", \"Unclosed template expression\", offset + cursor + tail.indexOf(\"{\"));\n if (tail) parts.push(`__meeko.escapeHtml(${quote(tail)})`);\n return parts;\n}\n\nfunction renderNode(node: TemplateNode, bindings: TemplateBindings, context: TemplateContext): string {\n if (node.nodeName === \"#text\") {\n return textParts(node.value ?? \"\", bindings, context, context.templateOffset + (node.sourceCodeLocation?.startOffset ?? 0)).join(\" + \") || quote(\"\");\n }\n if (node.nodeName === \"#comment\") return quote(`<!--${node.value ?? \"\"}-->`);\n if (!node.tagName) return (node.childNodes ?? []).map((child) => renderNode(child, bindings, context)).join(\" + \") || quote(\"\");\n\n const attrsList = node.attrs ?? [];\n const position = context.templateOffset + (node.sourceCodeLocation?.startOffset ?? 0);\n const condition = attrsList.find((attribute) => attribute.name === \"if:when\");\n const list = attrsList.find((attribute) => attribute.name === \"each:of\");\n if (condition && list) throw compileError(context.source, context.filename, \"MEEK021\", \"A node cannot have both if:when and each:of\", position);\n if (condition || list) {\n const inner = emptyBindings();\n const excluded = new Set(condition ? [\"if:when\"] : [\"each:of\", \"each:as\", \"each:key\", \"each:index\"]);\n const clone: TemplateNode = { ...node, attrs: attrsList.filter((attribute) => !excluded.has(attribute.name)) };\n const html = renderNodeContent(clone, inner, context);\n const id = context.nextRegion++;\n if (condition) {\n const offset = attributeValueOffset(node, \"if:when\", context);\n validateExpression(condition.value, context.source, context.filename, offset);\n bindings.regions.push({ kind: \"condition\", id, expression: condition.value, offset, render: html, bindings: inner });\n return `__meeko.renderIf(${id}, ${markSource(condition.value, offset)}, () => ${html})`;\n }\n const itemName = attrsList.find((attribute) => attribute.name === \"each:as\")?.value;\n const key = attrsList.find((attribute) => attribute.name === \"each:key\")?.value;\n const indexName = attrsList.find((attribute) => attribute.name === \"each:index\")?.value ?? \"index\";\n if (!itemName || !/^[a-zA-Z_$][\\w$]*$/.test(itemName) || itemName.startsWith(\"__\") || !/^[a-zA-Z_$][\\w$]*$/.test(indexName) || indexName.startsWith(\"__\") || itemName === indexName) {\n throw compileError(context.source, context.filename, \"MEEK022\", \"A list needs valid, distinct each:as and each:index identifiers\", position);\n }\n if (!key) throw compileError(context.source, context.filename, \"MEEK023\", \"A list requires each:key\", position);\n const offset = attributeValueOffset(node, \"each:of\", context);\n const keyOffset = attributeValueOffset(node, \"each:key\", context);\n validateExpression(list!.value, context.source, context.filename, offset);\n validateExpression(key, context.source, context.filename, keyOffset);\n bindings.regions.push({ kind: \"list\", id, expression: list!.value, offset, key, keyOffset, itemName, indexName, render: html, bindings: inner });\n return `__meeko.renderFor(${id}, ${markSource(list!.value, offset)}, (${itemName}, ${indexName}) => ${markSource(key, keyOffset)}, (${itemName}, ${indexName}) => ${html})`;\n }\n if (attrsList.some((attribute) => attribute.name.startsWith(\"each:\") || attribute.name.startsWith(\"if:\"))) {\n throw compileError(context.source, context.filename, \"MEEK024\", \"Incomplete template directive\", position);\n }\n return renderNodeContent(node, bindings, context);\n}\n\nfunction renderNodeContent(node: TemplateNode, bindings: TemplateBindings, context: TemplateContext): string {\n if (node.tagName === \"template\") {\n return (node.content?.childNodes ?? []).map((child) => renderNode(child, bindings, context)).join(\" + \") || quote(\"\");\n }\n if (node.tagName === \"component\") {\n const position = node.start;\n const referenceAttribute = node.attrs?.find((attribute) => attribute.name === \"is\");\n const reference = referenceAttribute?.value ?? \"\";\n if (!reference.trim()) throw compileError(context.source, context.filename, \"MEEK030\", \"A component requires is=\\\"expression\\\"\", position);\n const referenceOffset = attributeValueOffset(node, \"is\", context);\n validateExpression(reference, context.source, context.filename, referenceOffset);\n if ((node.childNodes ?? []).some((child) => child.nodeName !== \"#text\" || Boolean(child.value?.trim()))) {\n throw compileError(context.source, context.filename, \"MEEK031\", \"Component children are not supported; close the tag without content\", position);\n }\n const props: ComponentBinding[\"props\"] = [];\n for (const attribute of node.attrs ?? []) {\n if (attribute.name === \"is\") continue;\n const rawName = /^[^\\s=]+/.exec(context.source.slice(attribute.start, attribute.end))?.[0] ?? attribute.name;\n if (!rawName.startsWith(\"bind:\") || !/^[a-zA-Z_$][\\w$]*$/.test(rawName.slice(5))) {\n throw compileError(context.source, context.filename, \"MEEK032\", \"Component props must use bind:prop=\\\"expression\\\"\", attribute.start);\n }\n const name = rawName.slice(5);\n const offset = attributeValueOffset(node, attribute.name, context);\n validateExpression(attribute.value, context.source, context.filename, offset);\n props.push({ name, nameOffset: attribute.start + 5, expression: attribute.value, offset });\n }\n const id = context.nextRegion++;\n bindings.components.push({ id, reference, referenceOffset, props, offset: position });\n const mappedProps = props.map((prop) => `${markSource(quote(prop.name), prop.nameOffset, prop.name.length)}: ${markSource(prop.expression, prop.offset)}`);\n const object = markSource(`{ ${mappedProps.join(\", \")} }`, position, node.end - position);\n return `__meeko.renderComponent(${id}, ${markSource(reference, referenceOffset)}, ${object}, __meeko_transfer)`;\n }\n const tag = node.tagName!;\n\n const attrs: Array<{ kind: \"static\"; value: string } | { kind: \"dynamic\"; expression: string }> = [];\n for (const attr of node.attrs ?? []) {\n if (attr.name.startsWith(\"on:\")) {\n const name = attr.name.slice(3);\n if (!/^[a-z]+$/.test(name)) throw compileError(context.source, context.filename, \"MEEK011\", `Invalid event name: ${name}`, context.templateOffset + (node.sourceCodeLocation?.startOffset ?? 0));\n const id = context.nextEvent++;\n const offset = attributeValueOffset(node, attr.name, context);\n validateExpression(attr.value, context.source, context.filename, offset);\n bindings.events.push({ id, name, expression: attr.value, offset });\n attrs.push({ kind: \"static\", value: ` data-meeko-e-${id}=\"\"` });\n } else if (attr.name.startsWith(\"bind:\")) {\n const name = attr.name.slice(5);\n if (!/^[a-z][a-z0-9:.-]*$/.test(name) || name.startsWith(\"on\")) {\n throw compileError(context.source, context.filename, \"MEEK012\", `Invalid dynamic attribute: ${name}`, context.templateOffset + (node.sourceCodeLocation?.startOffset ?? 0));\n }\n const offset = attributeValueOffset(node, attr.name, context);\n validateExpression(attr.value, context.source, context.filename, offset);\n const id = context.nextAttribute++;\n bindings.attributes.push({ id, name, expression: attr.value, offset });\n attrs.push({ kind: \"static\", value: ` data-meeko-a-${id}=\"\"` });\n attrs.push({ kind: \"dynamic\", expression: `__meeko.renderAttribute(${quote(name)}, ${markSource(attr.value, offset)})` });\n } else if (attr.name.startsWith(\":\")) {\n throw compileError(context.source, context.filename, \"MEEK012\", `Unsupported template directive: ${attr.name}`, context.templateOffset + (node.sourceCodeLocation?.startOffset ?? 0));\n } else {\n attrs.push({ kind: \"static\", value: ` ${attr.name}=\"${escapeAttribute(attr.value)}\"` });\n }\n }\n if (context.scopeAttribute) attrs.push({ kind: \"static\", value: ` ${context.scopeAttribute}=\"\"` });\n const openingParts: string[] = [quote(`<${tag}`)];\n for (const attr of attrs) {\n if (attr.kind === \"dynamic\") openingParts.push(attr.expression);\n else openingParts.push(quote(attr.value));\n }\n openingParts.push(quote(\">\"));\n const opening = openingParts.join(\" + \");\n const voidElements = new Set([\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\"]);\n if (voidElements.has(tag)) return opening;\n const children = (node.childNodes ?? []).map((child) => renderNode(child, bindings, context));\n return [opening, ...children, quote(`</${tag}>`)].join(\" + \");\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"<\", \"<\");\n}\n\nfunction scopeCss(css: string, scopeAttribute: string): string {\n const root = postcss.parse(css);\n root.walkRules((rule) => {\n let parent: postcss.Node | undefined = rule.parent;\n while (parent) {\n if (parent.type === \"atrule\" && /keyframes$/i.test((parent as postcss.AtRule).name)) return;\n parent = parent.parent;\n }\n if (rule.selector.includes(\":global\")) throw rule.error(\":global is not supported in scoped styles yet\", { index: rule.selector.indexOf(\":global\") });\n rule.selector = selectorParser((selectors) => {\n selectors.each((selector) => {\n const pseudoElement = selector.nodes.find((node) => node.type === \"pseudo\" && node.value.startsWith(\"::\"));\n const attribute = selectorParser.attribute({ attribute: scopeAttribute, value: undefined, raws: {} });\n if (pseudoElement) selector.insertBefore(pseudoElement, attribute);\n else selector.append(attribute);\n });\n }).processSync(rule.selector);\n });\n return root.toString();\n}\n\nfunction compileScript(section: SfcSection, source: string, filename: string): { imports: string[]; types: string[]; setup: string[]; names: string[]; propsType: string; propsTypeOffset: number | undefined } {\n const file = ts.createSourceFile(filename, section.content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS) as ts.SourceFile & { parseDiagnostics: readonly ts.DiagnosticWithLocation[] };\n const syntaxError = file.parseDiagnostics[0];\n if (syntaxError) {\n const message = ts.flattenDiagnosticMessageText(syntaxError.messageText, \"\\n\");\n throw compileError(source, filename, \"MEEK013\", message, section.contentStart + (syntaxError.start ?? 0));\n }\n const imports: string[] = [];\n const types: string[] = [];\n const setup: string[] = [];\n const names: string[] = [];\n let propsType: string | undefined;\n let propsTypeOffset: number | undefined;\n for (const statement of file.statements) {\n if (ts.isImportDeclaration(statement)) {\n imports.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));\n continue;\n }\n if (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) {\n types.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));\n continue;\n }\n if (ts.isExportDeclaration(statement) && (statement.isTypeOnly ||\n (statement.exportClause && ts.isNamedExports(statement.exportClause) && statement.exportClause.elements.every((element) => element.isTypeOnly)))) {\n types.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));\n continue;\n }\n if (ts.isVariableStatement(statement)) {\n if (statement.declarationList.declarations.length !== 1) throw compileError(source, filename, \"MEEK014\", \"Declare one variable per statement in .meeko scripts\", section.contentStart + statement.getStart(file));\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name)) throw compileError(source, filename, \"MEEK015\", \"Only simple variable declarations are supported in .meeko scripts\", section.contentStart + declaration.getStart(file));\n const name = declaration.name.text;\n names.push(name);\n if (declaration.initializer && ts.isCallExpression(declaration.initializer) && declaration.initializer.expression.getText(file) === \"defineProps\") {\n if (propsType) throw compileError(source, filename, \"MEEK016\", \"defineProps must appear once in its own declaration\", section.contentStart + declaration.getStart(file));\n const typeArgument = declaration.initializer.typeArguments?.[0];\n propsType = typeArgument?.getText(file);\n if (!propsType) throw compileError(source, filename, \"MEEK017\", \"defineProps requires a type argument\", section.contentStart + declaration.getStart(file));\n propsTypeOffset = section.contentStart + typeArgument!.getStart(file);\n setup.push(`const ${name}: ${markSource(propsType, propsTypeOffset)} = __props;`);\n } else {\n setup.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));\n }\n }\n continue;\n }\n if (ts.isFunctionDeclaration(statement) && statement.name) {\n names.push(statement.name.text);\n setup.push(markSource(statement.getText(file), section.contentStart + statement.getStart(file)));\n continue;\n }\n throw compileError(source, filename, \"MEEK018\", `Unsupported top-level script statement: ${ts.SyntaxKind[statement.kind]}`, section.contentStart + statement.getStart(file));\n }\n return { imports, types, setup, names, propsType: propsType ?? \"Record<string, never>\", propsTypeOffset };\n}\n\nfunction hydrationBody(bindings: TemplateBindings, context: TemplateContext, hot: boolean, locals: ReadonlyMap<string, string> = new Map()): string {\n const statements: string[] = [];\n const mappedExpression = (expression: string, offset: number, expressionLocals = locals): string =>\n markSource(rewriteLocals(expression, expressionLocals), offset, expression.length);\n for (const { id, expression, offset } of bindings.texts) {\n const point = locate(context.source, offset);\n const location = `${basename(context.filename)}:${point.line}:${point.column} (text ${id})`;\n const source = hot ? `, { file: ${quote(context.filename)}, line: ${point.line}, column: ${point.column}, expression: ${quote(expression)}, kind: \"text\" }` : \"\";\n statements.push(`cleanups.push(__meeko.bindText(__scope, ${id}, () => ${mappedExpression(expression, offset)}, ${quote(location)}${source}));`);\n }\n for (const { id, name, expression, offset } of bindings.attributes) {\n const point = locate(context.source, offset);\n const location = `${basename(context.filename)}:${point.line}:${point.column} (attribute ${name})`;\n const source = hot ? `, { file: ${quote(context.filename)}, line: ${point.line}, column: ${point.column}, expression: ${quote(expression)}, kind: \"attribute\" }` : \"\";\n statements.push(`cleanups.push(__meeko.bindAttribute(__scope, ${id}, ${quote(name)}, () => ${mappedExpression(expression, offset)}, ${quote(location)}${source}));`);\n }\n for (const { id, name, expression, offset } of bindings.events) {\n const eventType = [\"click\", \"input\", \"change\", \"submit\", \"keydown\", \"keyup\", \"focus\", \"blur\"].includes(name)\n ? `GlobalEventHandlersEventMap[${quote(name)}]` : \"Event\";\n const handler = markSource(`((__meeko_handler: (event: ${eventType}) => void) => __meeko_handler(event as ${eventType}))(${mappedExpression(expression, offset)});`, offset, expression.length);\n statements.push(`{\n cleanups.push(__meeko.bindEvent(__scope, ${id}, ${quote(name)}, (event: Event) => {\n ${handler}\n }));\n }`);\n }\n const componentStatements: string[] = [];\n for (const entry of bindings.components) {\n const point = locate(context.source, entry.offset);\n const location = `${basename(context.filename)}:${point.line}:${point.column} (component ${entry.reference})`;\n const props = entry.props.map((prop) => `${markSource(quote(prop.name), prop.nameOffset, prop.name.length)}: ${mappedExpression(prop.expression, prop.offset)}`);\n const object = markSource(`{ ${props.join(\", \")} }`, entry.offset, 1);\n componentStatements.push(`cleanups.push(__meeko.bindComponent(__scope, ${entry.id}, () => ${mappedExpression(entry.reference, entry.referenceOffset)}, () => (${object}), ${quote(location)}));`);\n }\n statements.unshift(...componentStatements);\n for (const entry of bindings.regions) {\n if (entry.kind === \"condition\") {\n statements.push(`cleanups.push(__meeko.bindIf(__scope, ${entry.id}, () => ${mappedExpression(entry.expression, entry.offset)}, () => ${rewriteLocals(entry.render, locals)}, (__scope) => { ${hydrationBody(entry.bindings, context, hot, locals)} }));`);\n } else {\n const outerLocals = new Map(locals);\n outerLocals.delete(entry.itemName);\n outerLocals.delete(entry.indexName);\n const innerLocals = new Map(locals);\n innerLocals.set(entry.itemName, \"__meeko_item.value\");\n innerLocals.set(entry.indexName, \"__meeko_index.value\");\n const innerHydration = hydrationBody(entry.bindings, context, hot, innerLocals);\n // El callback generado sólo usa la señal de índice si aparece en su hidratación.\n const trackIndex = innerHydration.includes(\"__meeko_index.value\");\n statements.push(`cleanups.push(__meeko.bindFor(__scope, ${entry.id}, () => ${mappedExpression(entry.expression, entry.offset)}, (${entry.itemName}, ${entry.indexName}) => ${mappedExpression(entry.key, entry.keyOffset, outerLocals)}, (${entry.itemName}, ${entry.indexName}) => ${rewriteLocals(entry.render, outerLocals)}, (__meeko_item, __meeko_index, __scope) => { ${innerHydration} }, ${trackIndex}));`);\n }\n }\n return `const cleanups: Array<() => void> = [];\n try {\n ${statements.join(\"\\n\")}\n return () => { for (const cleanup of cleanups.reverse()) cleanup(); };\n } catch (error) { for (const cleanup of cleanups.reverse()) cleanup(); throw error; }`;\n}\n\n/** Compila una parte tipada de .meeko para SSR e hidratación del HTML existente. */\nexport function compile(source: string, filename = \"anonymous.meeko\", options: CompileOptions = {}): CompileResult {\n const { script, template, style } = parseSfc(source, filename);\n const componentId = createHash(\"sha256\").update(filename).digest(\"hex\").slice(0, 12);\n const scopeAttribute = style?.attributes.some((attribute) => attribute.name === \"scoped\")\n ? `data-meeko-s-${createHash(\"sha256\").update(filename).digest(\"hex\").slice(0, 8)}`\n : undefined;\n let css: string;\n try {\n css = scopeAttribute ? scopeCss(style?.content ?? \"\", scopeAttribute) : style?.content ?? \"\";\n } catch (error) {\n if (error instanceof postcss.CssSyntaxError && style && error.line !== undefined && error.column !== undefined) {\n const lines = style.content.split(/\\r\\n|\\r|\\n/);\n const prior = lines.slice(0, error.line - 1).reduce((total, line) => total + line.length + 1, 0);\n throw compileError(source, filename, \"MEEK019\", error.reason, style.contentStart + prior + error.column - 1);\n }\n throw error;\n }\n const parsed = parseTemplate(source, template, filename);\n const bindingsForTemplate = emptyBindings();\n const context: TemplateContext = { source, filename, templateOffset: template.contentStart, scopeAttribute, nextText: 0, nextEvent: 0, nextAttribute: 0, nextRegion: 0 };\n const html = renderNode(parsed, bindingsForTemplate, context);\n const scriptParts = compileScript(script, source, filename);\n const bindings = scriptParts.names.join(\", \");\n const hot = options.hot === true;\n const setupCode = `const __bindings = __setup(__inputProps);\\n__meeko.restoreSignals(__bindings, __state);\\nconst { ${bindings} } = __bindings;`;\n const releaseCode = hot\n ? `const __cleanup = () => { __release(); dispose(); };\\nconst __component = { renderToString, hydrate, hydrateScope, css };\\nconst __snapshot = () => __meeko.snapshotSignals(__bindings);\\nconst __devtoolsStop = __meeko.registerDevtoolsInstance({ componentId: __hotId, name: ${quote(basename(filename, \".meeko\"))}, file: ${quote(filename)}, scope: __scope, props: __inputProps, bindings: __bindings });\\nconst __dispose = () => { try { __cleanup(); } finally { __devtoolsStop(); } };\\nconst __stop = __hotRoot ? __meeko.registerHotInstance(__hotId, __hotRoot, __inputProps, __component, __snapshot, __dispose) : __scope.start ? __meeko.registerHotScope(__hotId, __scope, __inputProps, __component, __snapshot, __dispose) : __dispose;\\nreturn __meeko.withStateSnapshot(__stop, __snapshot);`\n : `return __meeko.withStateSnapshot(() => { __release(); dispose(); }, () => __meeko.snapshotSignals(__bindings));`;\n const hotIdExport = hot ? `export const __hotId = ${quote(componentId)};\\n` : \"\";\n const stateParam = \", __state?: __meeko.HotState\";\n const scopeHotRootParam = hot ? \", __hotRoot?: Element\" : \"\";\n const scopeForward = hot ? \"__scope, __inputProps, __state, root\" : \"__scope, __inputProps, __state\";\n const propsType = scriptParts.propsTypeOffset === undefined ? scriptParts.propsType : markSource(scriptParts.propsType, scriptParts.propsTypeOffset);\n const markedCode = `// Generated by Meeko. Edit the .meeko source instead.\\nimport * as __meeko from \"@meekojs/meeko/internal\";\\n${scriptParts.imports.join(\"\\n\")}\\n${scriptParts.types.join(\"\\n\")}\\nfunction __setup(__props: ${propsType}) {\\n${scriptParts.setup.join(\"\\n\")}\\nreturn { ${bindings} };\\n}\\nexport type ComponentProps = ${propsType};\\nexport const css = ${quote(css)};\\n${hotIdExport}export function renderWithState(__inputProps: ComponentProps): { html: string; state: __meeko.HotState } {\\nreturn __meeko.createRoot((dispose) => {\\nconst __meeko_transfer = true;\\nconst __bindings = __setup(__inputProps);\\nconst { ${bindings} } = __bindings;\\ntry {\\nconst html = ${html};\\nconst state = __meeko.snapshotSignals(__bindings);\\n__meeko.serializeJson(state);\\nreturn { html, state };\\n} finally { dispose(); }\\n});\\n}\\nexport function renderToString(__inputProps: ComponentProps${stateParam}): string {\\nreturn __meeko.createRoot((dispose) => {\\nconst __meeko_transfer = false;\\n${setupCode}\\ntry { return ${html}; } finally { dispose(); }\\n});\\n}\\nexport function hydrate(root: Element, __inputProps: ComponentProps${stateParam}): () => void {\\nconst __scope: __meeko.DomScope = { root };\\nreturn hydrateScope(${scopeForward});\\n}\\nexport function hydrateScope(__scope: __meeko.DomScope, __inputProps: ComponentProps${stateParam}${scopeHotRootParam}): () => void {\\nreturn __meeko.createRoot((dispose) => {\\nconst __meeko_transfer = false;\\n${setupCode}\\nconst __release = (() => { ${hydrationBody(bindingsForTemplate, context, hot)} })();\\n${releaseCode}\\n});\\n}\\n`;\n const { code, mappings } = extractSourceMappings(markedCode);\n return { code, css, mappings };\n}\n"]}
|
|
@@ -25,7 +25,14 @@ button[aria-pressed="true"] { border-color: #79b8ff; background: #25476c; }
|
|
|
25
25
|
.muted { color: #aab7ca; }
|
|
26
26
|
.path { overflow-wrap: anywhere; }
|
|
27
27
|
pre { margin: 4px 0 0; padding: 8px; max-height: 130px; overflow: auto; border-radius: 6px; background: #0a111e; color: #dbeafe; font: 12px/1.45 ui-monospace, SFMono-Regular, Consolas, monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
28
|
-
.events { border-top: 1px solid #334155; padding: 10px 12px; max-height:
|
|
28
|
+
.events { border-top: 1px solid #334155; padding: 10px 12px; max-height: 160px; overflow: auto; }
|
|
29
|
+
.events-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px; }
|
|
30
|
+
.events-head label { color: #aab7ca; }
|
|
31
|
+
.event-button { width: 100%; text-align: left; }
|
|
32
|
+
.event-reads { margin: 4px 0 8px; color: #aab7ca; }
|
|
33
|
+
.event-reads summary { cursor: pointer; }
|
|
34
|
+
.event-reads li { overflow-wrap: anywhere; }
|
|
35
|
+
.event-reads code { color: #dbeafe; }
|
|
29
36
|
.events li { overflow-wrap: anywhere; }
|
|
30
37
|
.status { padding: 7px 12px; border-top: 1px solid #334155; color: #aab7ca; }
|
|
31
38
|
@media (max-width: 540px) {
|
|
@@ -81,7 +88,10 @@ function eventLabel(event) {
|
|
|
81
88
|
};
|
|
82
89
|
const time = Number.isFinite(event.at) ? new Date(event.at).toLocaleTimeString("es", { hour12: false }) : "hora desconocida";
|
|
83
90
|
const detail = event.detail ? ` · ${event.detail}` : "";
|
|
84
|
-
|
|
91
|
+
const source = event.componentName ? ` · ${event.componentName}` : "";
|
|
92
|
+
const file = event.file ? ` · ${event.file}` : "";
|
|
93
|
+
const value = event.kind === "signal" && "value" in event ? ` → ${formatValue(event.value).replace(/\s+/g, " ").slice(0, 240)}` : "";
|
|
94
|
+
return `${time} · ${kinds[event.kind]} · ${event.instanceId}${source}${file}${detail}${value}`;
|
|
85
95
|
}
|
|
86
96
|
/** Exige un documento conectado a una ventana para registrar eventos del hook. */
|
|
87
97
|
function requireView(document) {
|
|
@@ -131,9 +141,16 @@ export function mountDevtoolsPanel(options = {}) {
|
|
|
131
141
|
main.append(instancesSection, detailSection);
|
|
132
142
|
const eventsSection = element(ownerDocument, "section", undefined, "events");
|
|
133
143
|
const eventsTitle = element(ownerDocument, "h2", "Eventos recientes");
|
|
144
|
+
const eventsHead = element(ownerDocument, "div", undefined, "events-head");
|
|
145
|
+
const signalFilterLabel = element(ownerDocument, "label", " Sólo señales");
|
|
146
|
+
const signalFilter = element(ownerDocument, "input");
|
|
147
|
+
signalFilter.type = "checkbox";
|
|
148
|
+
signalFilter.setAttribute("aria-label", "Mostrar sólo eventos de señales");
|
|
149
|
+
signalFilterLabel.prepend(signalFilter);
|
|
150
|
+
eventsHead.append(eventsTitle, signalFilterLabel);
|
|
134
151
|
const eventsList = element(ownerDocument, "ol");
|
|
135
152
|
eventsList.setAttribute("aria-label", "Eventos recientes de Meeko");
|
|
136
|
-
eventsSection.append(
|
|
153
|
+
eventsSection.append(eventsHead, eventsList);
|
|
137
154
|
const status = element(ownerDocument, "div", undefined, "status");
|
|
138
155
|
status.setAttribute("role", "status");
|
|
139
156
|
status.setAttribute("aria-live", "polite");
|
|
@@ -262,11 +279,42 @@ export function mountDevtoolsPanel(options = {}) {
|
|
|
262
279
|
else {
|
|
263
280
|
detailSection.append(element(ownerDocument, "p", "Selecciona una instancia para ver props y señales."));
|
|
264
281
|
}
|
|
265
|
-
const recent = snapshot.events.slice(-30).reverse();
|
|
282
|
+
const recent = snapshot.events.filter((event) => !signalFilter.checked || event.kind === "signal").slice(-30).reverse();
|
|
266
283
|
if (recent.length === 0)
|
|
267
284
|
eventsList.append(element(ownerDocument, "li", "Sin eventos.", "muted"));
|
|
268
|
-
for (const event of recent)
|
|
269
|
-
|
|
285
|
+
for (const event of recent) {
|
|
286
|
+
const row = element(ownerDocument, "li");
|
|
287
|
+
const instance = byId.get(event.instanceId);
|
|
288
|
+
const label = eventLabel(event);
|
|
289
|
+
if (instance) {
|
|
290
|
+
const button = element(ownerDocument, "button", label, "event-button");
|
|
291
|
+
button.type = "button";
|
|
292
|
+
button.dataset.instanceId = instance.id;
|
|
293
|
+
button.dataset.action = "event";
|
|
294
|
+
button.addEventListener("click", () => {
|
|
295
|
+
hook?.select(instance.id);
|
|
296
|
+
showMobileView("detail");
|
|
297
|
+
render();
|
|
298
|
+
});
|
|
299
|
+
row.append(button);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
row.textContent = label;
|
|
303
|
+
}
|
|
304
|
+
if (event.kind === "signal" && event.reads?.length) {
|
|
305
|
+
const sites = element(ownerDocument, "details", undefined, "event-reads");
|
|
306
|
+
sites.append(element(ownerDocument, "summary", `${event.reads.length} expresión(es) que dependen de la señal`));
|
|
307
|
+
const list = element(ownerDocument, "ul");
|
|
308
|
+
for (const read of event.reads) {
|
|
309
|
+
const usage = element(ownerDocument, "li");
|
|
310
|
+
usage.append(element(ownerDocument, "code", `${read.file}:${read.line}:${read.column}`), element(ownerDocument, "span", ` ${read.kind}: `), element(ownerDocument, "code", read.expression));
|
|
311
|
+
list.append(usage);
|
|
312
|
+
}
|
|
313
|
+
sites.append(list);
|
|
314
|
+
row.append(sites);
|
|
315
|
+
}
|
|
316
|
+
eventsList.append(row);
|
|
317
|
+
}
|
|
270
318
|
restoreFocus(focusId, focusAction);
|
|
271
319
|
}
|
|
272
320
|
/** Descubre el hook al inicio, al recibir el evento de disponibilidad o al pulsar Actualizar. */
|
|
@@ -295,8 +343,10 @@ export function mountDevtoolsPanel(options = {}) {
|
|
|
295
343
|
hook = undefined;
|
|
296
344
|
}
|
|
297
345
|
view.addEventListener("meeko:devtools-ready", connect);
|
|
346
|
+
signalFilter.addEventListener("change", render);
|
|
298
347
|
refreshButton.addEventListener("click", connect);
|
|
299
348
|
closeButton.addEventListener("click", unmount);
|
|
300
349
|
connect();
|
|
301
350
|
return { refresh: connect, unmount };
|
|
302
351
|
}
|
|
352
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools-ui/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DevtoolsEvent, DevtoolsHook, DevtoolsInstance } from \"../devtools.js\";\n\n/** Opciones de montaje del panel integrado de desarrollo. */\nexport interface DevtoolsPanelOptions {\n /** Elemento que recibirá el host del Shadow DOM. El valor predeterminado es `document.body`. */\n container?: Element;\n}\n\n/** Control del ciclo de vida del panel. */\nexport interface DevtoolsPanel {\n /** Reintenta encontrar el hook y actualiza los datos visibles. */\n refresh(): void;\n /** Quita la interfaz y libera las suscripciones y eventos instalados. */\n unmount(): void;\n}\n\nconst styles = `\n:host { all: initial; position: fixed; z-index: 2147483647; right: 16px; bottom: 16px; width: min(680px, calc(100vw - 32px)); color: #e8ecf5; font: 13px/1.45 system-ui, sans-serif; color-scheme: dark; }\n* { box-sizing: border-box; }\n.panel { display: flex; flex-direction: column; max-height: min(560px, calc(100vh - 32px)); overflow: hidden; border: 1px solid #475569; border-radius: 12px; background: #101827; box-shadow: 0 16px 48px #0009; }\nheader { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid #334155; }\nheader strong { font-size: 14px; margin-right: auto; }\n.mobile-switch { display: none; gap: 6px; padding: 8px 12px; border-bottom: 1px solid #334155; }\n.mobile-switch button { flex: 1; }\n.content { display: grid; grid-template-columns: minmax(170px, 0.9fr) minmax(0, 1.6fr); min-height: 220px; overflow: auto; }\nsection { min-width: 0; padding: 12px; }\nsection + section { border-left: 1px solid #334155; }\nh2, h3 { margin: 0 0 8px; font-size: 13px; }\nh3 { margin-top: 12px; }\np { margin: 0 0 8px; color: #aab7ca; }\nul, ol { margin: 0; padding: 0; list-style: none; }\nli + li { margin-top: 6px; }\nbutton { appearance: none; border: 1px solid #52657d; border-radius: 6px; background: #202d40; color: inherit; padding: 5px 8px; font: inherit; cursor: pointer; }\nbutton:hover { background: #30425d; }\nbutton:focus-visible { outline: 2px solid #79b8ff; outline-offset: 2px; }\nbutton[aria-pressed=\"true\"] { border-color: #79b8ff; background: #25476c; }\n.tree-node { margin: 3px 0; }\n.tree-node > button { width: 100%; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.tree-children { margin: 4px 0 6px 8px; padding-left: 12px; border-left: 1px solid #52657d; }\n.actions { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }\n.muted { color: #aab7ca; }\n.path { overflow-wrap: anywhere; }\npre { margin: 4px 0 0; padding: 8px; max-height: 130px; overflow: auto; border-radius: 6px; background: #0a111e; color: #dbeafe; font: 12px/1.45 ui-monospace, SFMono-Regular, Consolas, monospace; white-space: pre-wrap; overflow-wrap: anywhere; }\n.events { border-top: 1px solid #334155; padding: 10px 12px; max-height: 160px; overflow: auto; }\n.events-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px; }\n.events-head label { color: #aab7ca; }\n.event-button { width: 100%; text-align: left; }\n.event-reads { margin: 4px 0 8px; color: #aab7ca; }\n.event-reads summary { cursor: pointer; }\n.event-reads li { overflow-wrap: anywhere; }\n.event-reads code { color: #dbeafe; }\n.events li { overflow-wrap: anywhere; }\n.status { padding: 7px 12px; border-top: 1px solid #334155; color: #aab7ca; }\n@media (max-width: 540px) {\n .mobile-switch { display: flex; }\n .content { display: block; min-height: 0; }\n .content[data-view=\"instances\"] .detail { display: none; }\n .content[data-view=\"detail\"] .instances { display: none; }\n section + section { border-left: 0; }\n}\n`;\n\n/** Formatea datos arbitrarios sin insertar HTML procedente de la aplicación. */\nfunction formatValue(value: unknown): string {\n const seen = new WeakSet<object>();\n try {\n const result = JSON.stringify(value, (_key, current: unknown) => {\n if (typeof current === \"bigint\") return `${current}n`;\n if (typeof current === \"function\") return \"[función]\";\n if (typeof current === \"symbol\") return String(current);\n if (typeof current === \"object\" && current !== null) {\n if (seen.has(current)) return \"[circular]\";\n seen.add(current);\n }\n return current;\n }, 2);\n return (result ?? String(value)).slice(0, 8000);\n } catch {\n return \"[valor no representable]\";\n }\n}\n\n/** Crea un elemento con texto seguro y una clase opcional. */\nfunction element<K extends keyof HTMLElementTagNameMap>(document: Document, tag: K, text?: string, className?: string): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (text !== undefined) node.textContent = text;\n if (className) node.className = className;\n return node;\n}\n\n/** Muestra el momento relativo comunicado por el runtime. */\nfunction eventLabel(event: DevtoolsEvent): string {\n const kinds: Record<DevtoolsEvent[\"kind\"], string> = {\n mount: \"Montaje\",\n unmount: \"Desmontaje\",\n signal: \"Señal\",\n breakpoint: \"Punto de parada\",\n select: \"Selección\",\n hmr: \"HMR\",\n };\n const time = Number.isFinite(event.at) ? new Date(event.at).toLocaleTimeString(\"es\", { hour12: false }) : \"hora desconocida\";\n const detail = event.detail ? ` · ${event.detail}` : \"\";\n const source = event.componentName ? ` · ${event.componentName}` : \"\";\n const file = event.file ? ` · ${event.file}` : \"\";\n const value = event.kind === \"signal\" && \"value\" in event ? ` → ${formatValue(event.value).replace(/\\s+/g, \" \").slice(0, 240)}` : \"\";\n return `${time} · ${kinds[event.kind]} · ${event.instanceId}${source}${file}${detail}${value}`;\n}\n\n/** Exige un documento conectado a una ventana para registrar eventos del hook. */\nfunction requireView(document: Document): Window {\n const view = document.defaultView;\n if (!view) throw new Error(\"Meeko DevTools requires a browser document\");\n return view;\n}\n\n/** Monta una interfaz aislada en Shadow DOM para inspeccionar instancias Meeko. */\nexport function mountDevtoolsPanel(options: DevtoolsPanelOptions = {}): DevtoolsPanel {\n const container = options.container ?? document.body;\n const ownerDocument = container.ownerDocument;\n const view = requireView(ownerDocument);\n\n const host = element(ownerDocument, \"div\");\n host.setAttribute(\"data-meeko-devtools-panel\", \"\");\n const shadow = host.attachShadow({ mode: \"open\" });\n const style = element(ownerDocument, \"style\", styles);\n const panel = element(ownerDocument, \"div\", undefined, \"panel\");\n const header = element(ownerDocument, \"header\");\n const title = element(ownerDocument, \"strong\", \"Meeko DevTools\");\n const refreshButton = element(ownerDocument, \"button\", \"Actualizar\");\n refreshButton.type = \"button\";\n refreshButton.setAttribute(\"aria-label\", \"Actualizar instancias de Meeko\");\n const closeButton = element(ownerDocument, \"button\", \"Cerrar\");\n closeButton.type = \"button\";\n closeButton.setAttribute(\"aria-label\", \"Cerrar Meeko DevTools\");\n header.append(title, refreshButton, closeButton);\n\n const mobileSwitch = element(ownerDocument, \"nav\", undefined, \"mobile-switch\");\n mobileSwitch.setAttribute(\"aria-label\", \"Vistas de Meeko DevTools\");\n const instancesButton = element(ownerDocument, \"button\", \"Instancias\");\n instancesButton.type = \"button\";\n instancesButton.setAttribute(\"aria-controls\", \"meeko-devtools-instances\");\n const detailButton = element(ownerDocument, \"button\", \"Detalle\");\n detailButton.type = \"button\";\n detailButton.setAttribute(\"aria-controls\", \"meeko-devtools-detail\");\n mobileSwitch.append(instancesButton, detailButton);\n\n const main = element(ownerDocument, \"div\", undefined, \"content\");\n const instancesSection = element(ownerDocument, \"section\", undefined, \"instances\");\n instancesSection.id = \"meeko-devtools-instances\";\n const instancesTitle = element(ownerDocument, \"h2\", \"Instancias\");\n const instancesList = element(ownerDocument, \"ul\");\n instancesList.setAttribute(\"aria-label\", \"Instancias de Meeko\");\n instancesSection.append(instancesTitle, instancesList);\n const detailSection = element(ownerDocument, \"section\", undefined, \"detail\");\n detailSection.id = \"meeko-devtools-detail\";\n detailSection.setAttribute(\"aria-label\", \"Detalle de instancia\");\n main.append(instancesSection, detailSection);\n\n const eventsSection = element(ownerDocument, \"section\", undefined, \"events\");\n const eventsTitle = element(ownerDocument, \"h2\", \"Eventos recientes\");\n const eventsHead = element(ownerDocument, \"div\", undefined, \"events-head\");\n const signalFilterLabel = element(ownerDocument, \"label\", \" Sólo señales\");\n const signalFilter = element(ownerDocument, \"input\");\n signalFilter.type = \"checkbox\";\n signalFilter.setAttribute(\"aria-label\", \"Mostrar sólo eventos de señales\");\n signalFilterLabel.prepend(signalFilter);\n eventsHead.append(eventsTitle, signalFilterLabel);\n const eventsList = element(ownerDocument, \"ol\");\n eventsList.setAttribute(\"aria-label\", \"Eventos recientes de Meeko\");\n eventsSection.append(eventsHead, eventsList);\n const status = element(ownerDocument, \"div\", undefined, \"status\");\n status.setAttribute(\"role\", \"status\");\n status.setAttribute(\"aria-live\", \"polite\");\n panel.append(header, mobileSwitch, main, eventsSection, status);\n shadow.append(style, panel);\n container.appendChild(host);\n\n let hook: DevtoolsHook | undefined;\n let unsubscribe: (() => void) | undefined;\n let highlightedId: string | null = null;\n let mounted = true;\n let mobileView: \"instances\" | \"detail\" = \"instances\";\n\n /** Cambia la vista móvil y comunica el botón activo a tecnologías de asistencia. */\n function showMobileView(next: \"instances\" | \"detail\"): void {\n mobileView = next;\n main.dataset.view = mobileView;\n instancesButton.setAttribute(\"aria-pressed\", String(mobileView === \"instances\"));\n detailButton.setAttribute(\"aria-pressed\", String(mobileView === \"detail\"));\n }\n\n showMobileView(mobileView);\n instancesButton.addEventListener(\"click\", () => showMobileView(\"instances\"));\n detailButton.addEventListener(\"click\", () => showMobileView(\"detail\"));\n\n /** Conserva el foco al reconstruir una fila después de recibir una notificación. */\n function restoreFocus(id: string | undefined, action: string | undefined): void {\n if (!id || !action) return;\n for (const button of shadow.querySelectorAll<HTMLButtonElement>(\"button[data-instance-id]\")) {\n if (button.dataset.instanceId === id && button.dataset.action === action) {\n button.focus();\n break;\n }\n }\n }\n\n /** Reconstruye sólo el contenido variable usando nodos de texto seguros. */\n function render(): void {\n if (!mounted) return;\n const active = shadow.activeElement as HTMLButtonElement | null;\n const focusId = active?.dataset.instanceId;\n const focusAction = active?.dataset.action;\n instancesList.replaceChildren();\n detailSection.replaceChildren();\n eventsList.replaceChildren();\n if (!hook) {\n status.textContent = \"Hook no disponible. Abre una página Meeko con Vite en desarrollo y pulsa Actualizar.\";\n instancesList.append(element(ownerDocument, \"li\", \"No hay instancias disponibles.\", \"muted\"));\n detailSection.append(element(ownerDocument, \"p\", \"El runtime de desarrollo aún no está conectado.\"));\n eventsList.append(element(ownerDocument, \"li\", \"Sin eventos.\", \"muted\"));\n return;\n }\n\n let snapshot: ReturnType<DevtoolsHook[\"snapshot\"]>;\n try {\n snapshot = hook.snapshot();\n } catch (error) {\n status.textContent = `No se pudo leer el hook: ${error instanceof Error ? error.message : String(error)}`;\n return;\n }\n status.textContent = `${snapshot.instances.length} instancia(s) · ${snapshot.events.length} evento(s)`;\n if (snapshot.instances.length === 0) instancesList.append(element(ownerDocument, \"li\", \"No hay componentes hidratados.\", \"muted\"));\n const byId = new Map(snapshot.instances.map((instance) => [instance.id, instance]));\n const rendered = new Set<string>();\n function appendInstance(instance: DevtoolsInstance, list: HTMLUListElement): void {\n if (rendered.has(instance.id)) return;\n rendered.add(instance.id);\n const row = element(ownerDocument, \"li\", undefined, \"tree-node\");\n const selectButton = element(ownerDocument, \"button\", instance.name || instance.componentId);\n selectButton.type = \"button\";\n selectButton.title = `${instance.name} · ${instance.file}`;\n selectButton.setAttribute(\"aria-label\", `Seleccionar ${instance.name || instance.componentId}`);\n selectButton.dataset.instanceId = instance.id;\n selectButton.dataset.action = \"select\";\n selectButton.setAttribute(\"aria-pressed\", String(snapshot.selectedId === instance.id));\n selectButton.addEventListener(\"click\", () => {\n hook?.select(instance.id);\n showMobileView(\"detail\");\n render();\n if (view.matchMedia(\"(max-width: 540px)\").matches) detailButton.focus();\n });\n row.append(selectButton);\n list.append(row);\n const children = instance.childIds.map((id) => byId.get(id)).filter((child): child is DevtoolsInstance => child !== undefined);\n if (children.length > 0) {\n const nested = element(ownerDocument, \"ul\", undefined, \"tree-children\");\n for (const child of children) appendInstance(child, nested);\n if (nested.childElementCount > 0) row.append(nested);\n }\n }\n for (const instance of snapshot.instances) if (!instance.parentId || !byId.has(instance.parentId)) appendInstance(instance, instancesList);\n for (const instance of snapshot.instances) appendInstance(instance, instancesList);\n\n const selected = snapshot.instances.find((instance: DevtoolsInstance) => instance.id === snapshot.selectedId);\n if (selected) {\n detailSection.append(element(ownerDocument, \"h2\", selected.name || selected.componentId));\n detailSection.append(element(ownerDocument, \"p\", selected.file, \"path\"));\n detailSection.append(element(ownerDocument, \"p\", `ID: ${selected.id} · Estado: ${selected.status === \"hydrated\" ? \"Hidratado\" : selected.status} · Padre: ${selected.parentId ?? \"ninguno\"} · Hijos: ${selected.childIds.length}`));\n const actions = element(ownerDocument, \"div\", undefined, \"actions\");\n const highlightButton = element(ownerDocument, \"button\", highlightedId === selected.id ? \"Quitar resaltado\" : \"Resaltar en página\");\n highlightButton.type = \"button\";\n highlightButton.setAttribute(\"aria-pressed\", String(highlightedId === selected.id));\n highlightButton.dataset.instanceId = selected.id;\n highlightButton.dataset.action = \"highlight\";\n highlightButton.addEventListener(\"click\", () => {\n highlightedId = highlightedId === selected.id ? null : selected.id;\n hook?.highlight(highlightedId);\n render();\n });\n const breakpointButton = element(ownerDocument, \"button\", selected.breakpoint ? \"Desactivar punto de parada\" : \"Activar punto de parada\");\n breakpointButton.type = \"button\";\n breakpointButton.setAttribute(\"aria-pressed\", String(selected.breakpoint));\n breakpointButton.dataset.instanceId = selected.id;\n breakpointButton.dataset.action = \"breakpoint\";\n breakpointButton.addEventListener(\"click\", () => {\n hook?.setBreakpoint(selected.id, !selected.breakpoint);\n render();\n });\n actions.append(highlightButton, breakpointButton);\n detailSection.append(actions, element(ownerDocument, \"h3\", \"Props\"), element(ownerDocument, \"pre\", formatValue(selected.props)), element(ownerDocument, \"h3\", \"Señales\"), element(ownerDocument, \"pre\", formatValue(selected.signals)));\n } else {\n detailSection.append(element(ownerDocument, \"p\", \"Selecciona una instancia para ver props y señales.\"));\n }\n\n const recent = snapshot.events.filter((event) => !signalFilter.checked || event.kind === \"signal\").slice(-30).reverse();\n if (recent.length === 0) eventsList.append(element(ownerDocument, \"li\", \"Sin eventos.\", \"muted\"));\n for (const event of recent) {\n const row = element(ownerDocument, \"li\");\n const instance = byId.get(event.instanceId);\n const label = eventLabel(event);\n if (instance) {\n const button = element(ownerDocument, \"button\", label, \"event-button\");\n button.type = \"button\";\n button.dataset.instanceId = instance.id;\n button.dataset.action = \"event\";\n button.addEventListener(\"click\", () => {\n hook?.select(instance.id);\n showMobileView(\"detail\");\n render();\n });\n row.append(button);\n } else {\n row.textContent = label;\n }\n if (event.kind === \"signal\" && event.reads?.length) {\n const sites = element(ownerDocument, \"details\", undefined, \"event-reads\");\n sites.append(element(ownerDocument, \"summary\", `${event.reads.length} expresión(es) que dependen de la señal`));\n const list = element(ownerDocument, \"ul\");\n for (const read of event.reads) {\n const usage = element(ownerDocument, \"li\");\n usage.append(element(ownerDocument, \"code\", `${read.file}:${read.line}:${read.column}`), element(ownerDocument, \"span\", ` ${read.kind}: `), element(ownerDocument, \"code\", read.expression));\n list.append(usage);\n }\n sites.append(list);\n row.append(sites);\n }\n eventsList.append(row);\n }\n restoreFocus(focusId, focusAction);\n }\n\n /** Descubre el hook al inicio, al recibir el evento de disponibilidad o al pulsar Actualizar. */\n function connect(): void {\n if (!mounted) return;\n const next = (view as Window & { __MEEKO_DEVTOOLS__?: DevtoolsHook }).__MEEKO_DEVTOOLS__;\n if (next !== hook) {\n unsubscribe?.();\n hook = next;\n unsubscribe = hook?.subscribe(render);\n }\n render();\n }\n\n function unmount(): void {\n if (!mounted) return;\n mounted = false;\n unsubscribe?.();\n view.removeEventListener(\"meeko:devtools-ready\", connect);\n refreshButton.removeEventListener(\"click\", connect);\n closeButton.removeEventListener(\"click\", unmount);\n if (highlightedId) hook?.highlight(null);\n host.remove();\n hook = undefined;\n }\n\n view.addEventListener(\"meeko:devtools-ready\", connect);\n signalFilter.addEventListener(\"change\", render);\n refreshButton.addEventListener(\"click\", connect);\n closeButton.addEventListener(\"click\", unmount);\n connect();\n return { refresh: connect, unmount };\n}\n"]}
|
package/dist/devtools.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DomScope } from "./dom.js";
|
|
2
|
+
import type { EffectSource } from "./reactivity.js";
|
|
2
3
|
/** Valores seguros para transportar una captura al panel de desarrollo. */
|
|
3
4
|
export type DevtoolsValue = null | boolean | number | string | DevtoolsValue[] | {
|
|
4
5
|
[key: string]: DevtoolsValue;
|
|
@@ -23,6 +24,14 @@ export interface DevtoolsEvent {
|
|
|
23
24
|
kind: "mount" | "unmount" | "signal" | "breakpoint" | "select" | "hmr";
|
|
24
25
|
instanceId: string;
|
|
25
26
|
detail?: string;
|
|
27
|
+
/** Identidad del componente conservada incluso después del desmontaje. */
|
|
28
|
+
componentName?: string;
|
|
29
|
+
/** Archivo fuente `.meeko` proporcionado por la compilación de desarrollo. */
|
|
30
|
+
file?: string;
|
|
31
|
+
/** Valor posterior de una señal, copiado con los mismos límites que una captura. */
|
|
32
|
+
value?: DevtoolsValue;
|
|
33
|
+
/** Expresiones de plantilla que dependían de la señal en esta instancia. No son el origen de la escritura. */
|
|
34
|
+
reads?: EffectSource[];
|
|
26
35
|
}
|
|
27
36
|
/** Captura independiente de referencias DOM y de valores no serializables. */
|
|
28
37
|
export interface DevtoolsSnapshot {
|
package/dist/devtools.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { effect, isWritableSignal, untrack } from "./reactivity.js";
|
|
1
|
+
import { currentEffectOwner, effect, isWritableSignal, signalReadSites, untrack } from "./reactivity.js";
|
|
2
2
|
const active = new Map();
|
|
3
3
|
const identities = new WeakMap();
|
|
4
4
|
const listeners = new Set();
|
|
@@ -82,10 +82,19 @@ function notify() {
|
|
|
82
82
|
catch { /* Un panel externo no debe romper la aplicación. */ }
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
function record(kind, instanceId, detail) {
|
|
85
|
+
function record(kind, instanceId, detail, value, source, reads) {
|
|
86
86
|
const event = { id: nextEvent++, at: Date.now(), kind, instanceId };
|
|
87
87
|
if (detail !== undefined)
|
|
88
88
|
event.detail = detail;
|
|
89
|
+
const entry = source ?? active.get(instanceId);
|
|
90
|
+
if (entry) {
|
|
91
|
+
event.componentName = entry.name;
|
|
92
|
+
event.file = entry.file;
|
|
93
|
+
}
|
|
94
|
+
if (value !== undefined)
|
|
95
|
+
event.value = value;
|
|
96
|
+
if (reads?.length)
|
|
97
|
+
event.reads = reads;
|
|
89
98
|
recent.push(event);
|
|
90
99
|
if (recent.length > 100)
|
|
91
100
|
recent.shift();
|
|
@@ -246,7 +255,7 @@ function unregister(entry) {
|
|
|
246
255
|
selectedId = null;
|
|
247
256
|
if (highlightedId === entry.id)
|
|
248
257
|
removeHighlight();
|
|
249
|
-
record("unmount", entry.id);
|
|
258
|
+
record("unmount", entry.id, undefined, undefined, entry);
|
|
250
259
|
}
|
|
251
260
|
/** Registra señales y ámbito de una instancia hidratada en Vite desarrollo. */
|
|
252
261
|
export function registerDevtoolsInstance(input) {
|
|
@@ -263,7 +272,7 @@ export function registerDevtoolsInstance(input) {
|
|
|
263
272
|
const existing = active.get(identity.id);
|
|
264
273
|
if (existing)
|
|
265
274
|
unregister(existing);
|
|
266
|
-
const entry = { ...input, id: identity.id, key, breakpoint: identity.breakpoint, stopSignals: [] };
|
|
275
|
+
const entry = { ...input, id: identity.id, key, owner: currentEffectOwner(), breakpoint: identity.breakpoint, stopSignals: [] };
|
|
267
276
|
active.set(entry.id, entry);
|
|
268
277
|
for (const [name, value] of Object.entries(input.bindings)) {
|
|
269
278
|
if (!isWritableSignal(value))
|
|
@@ -271,12 +280,12 @@ export function registerDevtoolsInstance(input) {
|
|
|
271
280
|
const signal = value;
|
|
272
281
|
let initial = true;
|
|
273
282
|
entry.stopSignals.push(effect(() => {
|
|
274
|
-
|
|
283
|
+
const current = signal.value;
|
|
275
284
|
if (initial) {
|
|
276
285
|
initial = false;
|
|
277
286
|
return;
|
|
278
287
|
}
|
|
279
|
-
record("signal", entry.id, name);
|
|
288
|
+
record("signal", entry.id, name, safeValue(current), entry, signalReadSites(signal, entry.owner));
|
|
280
289
|
if (entry.breakpoint) {
|
|
281
290
|
debugger;
|
|
282
291
|
}
|
|
@@ -285,3 +294,4 @@ export function registerDevtoolsInstance(input) {
|
|
|
285
294
|
record(previous ? "hmr" : "mount", entry.id);
|
|
286
295
|
return () => { unregister(entry); };
|
|
287
296
|
}
|
|
297
|
+
//# sourceMappingURL=devtools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DomScope } from \"./dom.js\";\nimport { currentEffectOwner, effect, isWritableSignal, signalReadSites, untrack } from \"./reactivity.js\";\nimport type { EffectSource, Signal } from \"./reactivity.js\";\n\n/** Valores seguros para transportar una captura al panel de desarrollo. */\nexport type DevtoolsValue = null | boolean | number | string | DevtoolsValue[] | { [key: string]: DevtoolsValue };\n\n/** Estado serializable de una instancia hidratada. */\nexport interface DevtoolsInstance {\n id: string;\n componentId: string;\n name: string;\n file: string;\n props: DevtoolsValue;\n signals: Record<string, DevtoolsValue>;\n parentId: string | null;\n childIds: string[];\n status: \"hydrated\";\n breakpoint: boolean;\n}\n\n/** Cambio reciente del árbol de componentes o de una señal. */\nexport interface DevtoolsEvent {\n id: number;\n at: number;\n kind: \"mount\" | \"unmount\" | \"signal\" | \"breakpoint\" | \"select\" | \"hmr\";\n instanceId: string;\n detail?: string;\n /** Identidad del componente conservada incluso después del desmontaje. */\n componentName?: string;\n /** Archivo fuente `.meeko` proporcionado por la compilación de desarrollo. */\n file?: string;\n /** Valor posterior de una señal, copiado con los mismos límites que una captura. */\n value?: DevtoolsValue;\n /** Expresiones de plantilla que dependían de la señal en esta instancia. No son el origen de la escritura. */\n reads?: EffectSource[];\n}\n\n/** Captura independiente de referencias DOM y de valores no serializables. */\nexport interface DevtoolsSnapshot {\n instances: DevtoolsInstance[];\n events: DevtoolsEvent[];\n selectedId: string | null;\n}\n\n/** Interfaz pública que consume una extensión o un panel de desarrollo. */\nexport interface DevtoolsHook {\n snapshot(): DevtoolsSnapshot;\n subscribe(listener: () => void): () => void;\n select(id: string | null): void;\n highlight(id: string | null): void;\n setBreakpoint(id: string, enabled: boolean): void;\n}\n\n/** Datos que entrega un componente compilado cuando se hidrata en desarrollo. */\nexport interface DevtoolsRegistration {\n componentId: string;\n name: string;\n file: string;\n scope: DomScope;\n props: unknown;\n bindings: Record<string, unknown>;\n}\n\ndeclare global {\n interface Window {\n __MEEKO_DEVTOOLS__?: DevtoolsHook;\n }\n}\n\ninterface ActiveInstance extends DevtoolsRegistration {\n id: string;\n key: Node;\n owner: object | undefined;\n breakpoint: boolean;\n stopSignals: Array<() => void>;\n}\n\nconst active = new Map<string, ActiveInstance>();\nconst identities = new WeakMap<Node, { id: string; breakpoint: boolean }>();\nconst listeners = new Set<() => void>();\nconst recent: DevtoolsEvent[] = [];\nlet nextInstance = 1;\nlet nextEvent = 1;\nlet selectedId: string | null = null;\nlet highlightedId: string | null = null;\nlet overlay: HTMLElement | undefined;\nlet highlightObserver: MutationObserver | undefined;\nlet highlightFrame: number | undefined;\n\n/** Copia datos arbitrarios con profundidad y tamaño acotados sin invocar getters. */\nfunction safeValue(value: unknown, depth = 0, seen = new WeakSet<object>()): DevtoolsValue {\n if (value === null || typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.length > 500 ? `${value.slice(0, 500)}…` : value;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : String(value);\n if (typeof value === \"undefined\") return \"[undefined]\";\n if (typeof value === \"bigint\") return `${value}n`;\n if (typeof value === \"symbol\") return \"[symbol]\";\n if (typeof value === \"function\") return \"[function]\";\n if (typeof value !== \"object\") return \"[unknown]\";\n if (typeof Node !== \"undefined\" && value instanceof Node) return \"[DOM node]\";\n try {\n if (typeof Reflect.get(value, \"nodeType\") === \"number\" && typeof Reflect.get(value, \"nodeName\") === \"string\") return \"[DOM node]\";\n } catch {\n return \"[uninspectable]\";\n }\n if (seen.has(value)) return \"[circular]\";\n if (depth >= 4) return \"[max depth]\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"[invalid date]\" : value.toISOString();\n if (value instanceof Error) return safeValue(`[${value.name}: ${value.message}]`);\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: DevtoolsValue[] = [];\n for (let index = 0; index < Math.min(value.length, 50); index++) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n items.push(descriptor && \"value\" in descriptor ? safeValue(descriptor.value, depth + 1, seen) : descriptor ? \"[accessor]\" : \"[empty]\");\n }\n if (value.length > 50) items.push(`[${value.length - 50} more]`);\n return items;\n }\n const result: Record<string, DevtoolsValue> = Object.create(null) as Record<string, DevtoolsValue>;\n const keys = Object.keys(value);\n for (const key of keys.slice(0, 50)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n result[key] = descriptor && \"value\" in descriptor ? safeValue(descriptor.value, depth + 1, seen) : \"[accessor]\";\n }\n if (keys.length > 50) result[\"…\"] = `[${keys.length - 50} more]`;\n return result;\n } catch {\n return \"[uninspectable]\";\n } finally {\n seen.delete(value);\n }\n}\n\nfunction notify(): void {\n for (const listener of [...listeners]) {\n try { untrack(listener); } catch { /* Un panel externo no debe romper la aplicación. */ }\n }\n}\n\nfunction record(kind: DevtoolsEvent[\"kind\"], instanceId: string, detail?: string, value?: DevtoolsValue, source?: ActiveInstance, reads?: EffectSource[]): void {\n const event: DevtoolsEvent = { id: nextEvent++, at: Date.now(), kind, instanceId };\n if (detail !== undefined) event.detail = detail;\n const entry = source ?? active.get(instanceId);\n if (entry) {\n event.componentName = entry.name;\n event.file = entry.file;\n }\n if (value !== undefined) event.value = value;\n if (reads?.length) event.reads = reads;\n recent.push(event);\n if (recent.length > 100) recent.shift();\n notify();\n}\n\nfunction keyOf(scope: DomScope): Node {\n return scope.start ?? scope.root;\n}\n\nfunction isInside(parent: ActiveInstance, child: ActiveInstance): boolean {\n if (parent.id === child.id || parent.key === child.key) return false;\n const node = child.key;\n if (!parent.scope.start || !parent.scope.end) return parent.scope.root.contains(node);\n const { start, end } = parent.scope;\n return Boolean(start.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING)\n && Boolean(end.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_PRECEDING);\n}\n\nfunction parentOf(child: ActiveInstance): ActiveInstance | undefined {\n let parent: ActiveInstance | undefined;\n for (const candidate of active.values()) {\n if (!isInside(candidate, child)) continue;\n if (!parent || isInside(parent, candidate)) parent = candidate;\n }\n return parent;\n}\n\nfunction bounds(instance: ActiveInstance): DOMRect {\n if (!instance.scope.start || !instance.scope.end) return instance.scope.root.getBoundingClientRect();\n const range = instance.scope.start.ownerDocument.createRange();\n range.setStartAfter(instance.scope.start);\n range.setEndBefore(instance.scope.end);\n return range.getBoundingClientRect();\n}\n\nfunction positionHighlight(): void {\n const entry = highlightedId ? active.get(highlightedId) : undefined;\n if (!entry || !overlay) return;\n try {\n const rect = bounds(entry);\n Object.assign(overlay.style, {\n left: `${rect.left}px`, top: `${rect.top}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n });\n } catch {\n removeHighlight();\n }\n}\n\nfunction scheduleHighlight(): void {\n if (highlightFrame !== undefined) return;\n highlightFrame = window.requestAnimationFrame(() => {\n highlightFrame = undefined;\n positionHighlight();\n });\n}\n\nfunction removeHighlight(): void {\n window.removeEventListener(\"scroll\", scheduleHighlight, true);\n window.removeEventListener(\"resize\", scheduleHighlight);\n highlightObserver?.disconnect();\n highlightObserver = undefined;\n if (highlightFrame !== undefined) window.cancelAnimationFrame(highlightFrame);\n highlightFrame = undefined;\n overlay?.remove();\n overlay = undefined;\n highlightedId = null;\n}\n\nconst hook: DevtoolsHook = {\n snapshot() {\n return untrack(() => {\n const instances: DevtoolsInstance[] = [];\n for (const entry of active.values()) {\n const signals: Record<string, DevtoolsValue> = Object.create(null) as Record<string, DevtoolsValue>;\n for (const [name, value] of Object.entries(entry.bindings)) {\n if (isWritableSignal(value)) signals[name] = safeValue(value.value);\n }\n instances.push({\n id: entry.id,\n componentId: entry.componentId,\n name: entry.name,\n file: entry.file,\n props: safeValue(entry.props),\n signals,\n parentId: parentOf(entry)?.id ?? null,\n childIds: [],\n status: \"hydrated\",\n breakpoint: entry.breakpoint,\n });\n }\n const byId = new Map(instances.map((instance) => [instance.id, instance]));\n for (const instance of instances) {\n if (instance.parentId) byId.get(instance.parentId)?.childIds.push(instance.id);\n }\n return { instances, events: recent.map((event) => ({ ...event })), selectedId };\n });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n select(id) {\n if (id !== null && !active.has(id)) return;\n selectedId = id;\n record(\"select\", id ?? \"\");\n },\n highlight(id) {\n removeHighlight();\n if (id === null) return;\n const entry = active.get(id);\n if (!entry) return;\n const document = entry.key.ownerDocument ?? window.document;\n const element = document.createElement(\"div\");\n element.setAttribute(\"data-meeko-devtools-highlight\", \"\");\n Object.assign(element.style, {\n position: \"fixed\",\n outline: \"2px solid #7c3aed\", background: \"rgba(124, 58, 237, 0.12)\",\n pointerEvents: \"none\", zIndex: \"2147483647\",\n });\n document.body.appendChild(element);\n overlay = element;\n highlightedId = id;\n positionHighlight();\n window.addEventListener(\"scroll\", scheduleHighlight, true);\n window.addEventListener(\"resize\", scheduleHighlight);\n highlightObserver = new window.MutationObserver((mutations) => {\n if (mutations.some((mutation) => mutation.target !== overlay && !overlay?.contains(mutation.target))) scheduleHighlight();\n });\n highlightObserver.observe(entry.scope.root, { attributes: true, characterData: true, childList: true, subtree: true });\n },\n setBreakpoint(id, enabled) {\n const entry = active.get(id);\n if (!entry) return;\n entry.breakpoint = enabled;\n const identity = identities.get(entry.key);\n if (identity) identity.breakpoint = enabled;\n record(\"breakpoint\", id, enabled ? \"enabled\" : \"disabled\");\n },\n};\n\nfunction unregister(entry: ActiveInstance): void {\n if (active.get(entry.id) !== entry) return;\n for (const stop of entry.stopSignals) stop();\n active.delete(entry.id);\n if (selectedId === entry.id) selectedId = null;\n if (highlightedId === entry.id) removeHighlight();\n record(\"unmount\", entry.id, undefined, undefined, entry);\n}\n\n/** Registra señales y ámbito de una instancia hidratada en Vite desarrollo. */\nexport function registerDevtoolsInstance(input: DevtoolsRegistration): () => void {\n if (typeof window === \"undefined\" || typeof Node === \"undefined\") return () => {};\n if (!window.__MEEKO_DEVTOOLS__) {\n window.__MEEKO_DEVTOOLS__ = hook;\n window.dispatchEvent(new window.Event(\"meeko:devtools-ready\"));\n }\n const key = keyOf(input.scope);\n const previous = identities.get(key);\n const identity = previous ?? { id: `meeko-${nextInstance++}`, breakpoint: false };\n identities.set(key, identity);\n const existing = active.get(identity.id);\n if (existing) unregister(existing);\n const entry: ActiveInstance = { ...input, id: identity.id, key, owner: currentEffectOwner(), breakpoint: identity.breakpoint, stopSignals: [] };\n active.set(entry.id, entry);\n for (const [name, value] of Object.entries(input.bindings)) {\n if (!isWritableSignal(value)) continue;\n const signal = value as Signal<unknown>;\n let initial = true;\n entry.stopSignals.push(effect(() => {\n const current = signal.value;\n if (initial) { initial = false; return; }\n record(\"signal\", entry.id, name, safeValue(current), entry, signalReadSites(signal, entry.owner));\n if (entry.breakpoint) {\n debugger;\n }\n }));\n }\n record(previous ? \"hmr\" : \"mount\", entry.id);\n return () => { unregister(entry); };\n}\n"]}
|