-
Notifications
You must be signed in to change notification settings - Fork 13
/
server.ts
100 lines (90 loc) · 2.75 KB
/
server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { jsx } from "@builder.io/qwik";
import { renderToString } from "@builder.io/qwik/server";
import type { RendererContext } from "./types";
import { manifest } from "@qwik-client-manifest";
import { isDev } from "@builder.io/qwik/build";
import type {
QwikManifest,
SymbolMapper,
SymbolMapperFn,
} from "@builder.io/qwik/optimizer";
async function check(
this: RendererContext,
Component: any,
props: Record<string, any>,
slotted: any
) {
try {
if (typeof Component !== "function") return false;
const { html } = await renderToStaticMarkup.call(
this,
Component,
props,
slotted
);
return typeof html === "string";
} catch (error) {
console.error("Error in check function of @qwikdev/astro: ", error);
}
}
export async function renderToStaticMarkup(
this: RendererContext,
Component: any,
props: Record<string, any>,
slotted: any
) {
try {
const slots: { [key: string]: any } = {};
let defaultSlot;
// getting functions from index causes a rollup issue.
for (const [key, value] of Object.entries(slotted)) {
const jsxElement = jsx("span", {
dangerouslySetInnerHTML: String(value),
style: "display: contents",
...(key !== "default" && { "q:slot": key }),
"q:key": Math.random().toString(26).split(".").pop(),
});
if (key === "default") {
defaultSlot = jsxElement;
} else {
slots[key] = jsxElement;
}
}
const app = jsx(Component, {
...props,
children: [defaultSlot, ...Object.values(slots)],
});
const symbolMapper: SymbolMapperFn = (
symbolName: string,
mapper: SymbolMapper | undefined
) => {
return [
symbolName,
`/${process.env.SRC_DIR}/` + symbolName.toLocaleLowerCase() + ".js",
];
};
// TODO: `jsx` must correctly be imported.
// Currently the vite loads `core.mjs` and `core.prod.mjs` at the same time and this causes issues.
// WORKAROUND: ensure that `npm postinstall` is run to patch the `@builder.io/qwik/package.json` file.
const result = await renderToString(app, {
containerTagName: "div",
containerAttributes: { style: "display: contents" },
manifest: isDev ? ({} as QwikManifest) : manifest,
symbolMapper: manifest ? undefined : symbolMapper,
qwikLoader: { include: "never" },
});
// In dev mode we use the symbolMapper not the manifest, the empty object prevents a warning of a missing manifest. This should be fixed in Qwik core.
return result;
} catch (error) {
console.error(
"Error in renderToStaticMarkup function of @qwikdev/astro: ",
error
);
throw error;
}
}
export default {
renderToStaticMarkup,
supportsAstroStaticSlot: true,
check,
};