feat(core): expose McFly global to app server scripts

This commit is contained in:
Ayo Ayco 2025-06-27 22:17:59 +02:00
parent d46bf2255b
commit abaab2b73f
3 changed files with 45 additions and 5 deletions

View file

@ -75,7 +75,7 @@ export default eventHandler(async (event) => {
const transforms = [
{
fn: evaluateServerScripts,
args: [''],
args: [event],
hook: mcflyHooks.serverScriptsEvaluated,
},
{

View file

@ -2,6 +2,15 @@ import { ELEMENT_NODE, parse, renderSync, walkSync } from 'ultrahtml'
import { parseScript } from 'esprima'
import { consola } from 'consola'
import type { BaseNode as JsNode } from 'estree'
import type { H3Event } from 'h3'
const McFlyGlobal: {
hello: string
event: any
} = {
hello: 'world',
event: undefined,
}
/**
* @typedef {import('estree').BaseNode} JsNode
@ -12,7 +21,13 @@ import type { BaseNode as JsNode } from 'estree'
* @param {string} _html
* @returns {string}
*/
export function evaluateServerScripts(_html: string) {
export function evaluateServerScripts(_html: string, event: H3Event) {
McFlyGlobal.event = {
url: event.node.req.url,
method: event.node.req.method,
statusCode: event.node.req.statusCode,
statusMessage: event.node.req.statusMessage,
}
let html = evaluateServerScript(_html)
html = deleteServerScripts(html)
return html
@ -52,9 +67,15 @@ function evaluateServerScript(html: string) {
// @ts-ignore
.map((n) => n.declarations[0].id.name) //['declarations'][0].id.name)
const constructor = `(function(){}.constructor)(\`${script}; return {${keys.join(
','
)}}\`);`
// const McFly=${JSON.stringify(McFlyGlobal)};
const constructor = `(function(){}.constructor)(\`
const McFly=${JSON.stringify(McFlyGlobal)}
${script};
return {
${keys.join(',')},
McFly: ${JSON.stringify(McFlyGlobal)}
}\`);`
const evalStore = eval(constructor)
Object.assign(setupMap, new evalStore())
})

19
site/src/pages/cozy.html Normal file
View file

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<my-head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cozy (McFly)</title>
<script server:setup>
const appName = "Cozy"
console.log('>>> Event (from app)', McFly.event)
</script>
</my-head>
<body>
<h1>{{ appName }} - {{McFly.hello}}</h1>
<form>
<input id="url" name="url" />
<button type="submit">Extract</button>
</form>
</body>
</html>