elegance-js 2.1.37 → 3.0.1
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 +90 -4
- package/bin/bootstrap.js +18 -0
- package/bin/run.js +2 -0
- package/dist/build/common.d.ts +147 -0
- package/dist/build/common.d.ts.map +1 -0
- package/dist/build/common.js +599 -0
- package/dist/build/dev.d.ts +2 -0
- package/dist/build/dev.d.ts.map +1 -0
- package/dist/build/dev.js +234 -0
- package/dist/build/prod.d.ts +2 -0
- package/dist/build/prod.d.ts.map +1 -0
- package/dist/build/prod.js +212 -0
- package/dist/build/render.d.ts +29 -0
- package/dist/build/render.d.ts.map +1 -0
- package/dist/build/render.js +234 -0
- package/dist/client.d.ts +13 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +677 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +80 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +20 -0
- package/dist/elements.d.ts +2 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +14 -0
- package/dist/error.d.ts +20 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +123 -0
- package/dist/globals.d.ts +6 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +106 -0
- package/dist/logger.d.ts +32 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +72 -0
- package/dist/page-tools.d.ts +19 -0
- package/dist/page-tools.d.ts.map +1 -0
- package/dist/page-tools.js +141 -0
- package/dist/processing/oxc.d.ts +17 -0
- package/dist/processing/oxc.d.ts.map +1 -0
- package/dist/processing/oxc.js +938 -0
- package/dist/processing/taglist.d.ts +2 -0
- package/dist/processing/taglist.d.ts.map +1 -0
- package/dist/processing/taglist.js +215 -0
- package/dist/processing/tsx.d.ts +2 -0
- package/dist/processing/tsx.d.ts.map +1 -0
- package/dist/processing/tsx.js +131 -0
- package/dist/run.d.ts +3 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +147 -0
- package/dist/server/dev.d.ts +2 -0
- package/dist/server/dev.d.ts.map +1 -0
- package/dist/server/dev.js +10 -0
- package/dist/server/prod.d.ts +2 -0
- package/dist/server/prod.d.ts.map +1 -0
- package/dist/server/prod.js +42 -0
- package/dist/server/security.d.ts +64 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +120 -0
- package/dist/server/server.d.ts +73 -99
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +830 -680
- package/dist/types/component.d.ts +85 -0
- package/dist/types/component.d.ts.map +1 -0
- package/dist/types/component.js +0 -0
- package/dist/types/config.d.ts +12 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +0 -0
- package/dist/types/elements.d.ts +412 -0
- package/dist/types/elements.d.ts.map +1 -0
- package/dist/types/elements.js +0 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/jsx.d.ts +976 -0
- package/dist/types/jsx.d.ts.map +1 -0
- package/dist/types/jsx.js +0 -0
- package/dist/types/server-actions.d.ts +60 -0
- package/dist/types/server-actions.d.ts.map +1 -0
- package/dist/types/server-actions.js +0 -0
- package/dist/user-utils.d.ts +23 -0
- package/dist/user-utils.d.ts.map +1 -0
- package/dist/user-utils.js +61 -0
- package/package.json +48 -27
- package/dist/client/effect.d.ts +0 -27
- package/dist/client/effect.js +0 -37
- package/dist/client/eventListener.d.ts +0 -39
- package/dist/client/eventListener.js +0 -52
- package/dist/client/loadHook.d.ts +0 -34
- package/dist/client/loadHook.js +0 -52
- package/dist/client/observer.d.ts +0 -36
- package/dist/client/observer.js +0 -66
- package/dist/client/runtime.d.ts +0 -105
- package/dist/client/runtime.js +0 -624
- package/dist/client/state.d.ts +0 -40
- package/dist/client/state.js +0 -110
- package/dist/compilation/compiler.d.ts +0 -163
- package/dist/compilation/compiler.js +0 -1164
- package/dist/components/ClientComponent.d.ts +0 -22
- package/dist/components/ClientComponent.js +0 -55
- package/dist/components/Link.d.ts +0 -16
- package/dist/components/Link.js +0 -21
- package/dist/components/Portal.d.ts +0 -2
- package/dist/components/Portal.js +0 -2
- package/dist/elements/element.d.ts +0 -87
- package/dist/elements/element.js +0 -33
- package/dist/elements/element_list.d.ts +0 -7
- package/dist/elements/element_list.js +0 -65
- package/dist/elements/raw.d.ts +0 -14
- package/dist/elements/raw.js +0 -78
- package/dist/elements/specific_props.d.ts +0 -750
- package/dist/elements/specific_props.js +0 -1
- package/dist/global.d.ts +0 -229
- package/dist/global.js +0 -1
- package/dist/index.d.ts +0 -16
- package/dist/index.js +0 -12
- package/dist/server/layout.d.ts +0 -34
- package/dist/server/layout.js +0 -6
- package/dist/server/log.d.ts +0 -12
- package/dist/server/log.js +0 -64
- package/dist/server/page.d.ts +0 -32
- package/dist/server/page.js +0 -6
- package/dist/server/runtime.d.ts +0 -6
- package/dist/server/runtime.js +0 -92
- package/scripts/bootstrap.js +0 -95
- package/scripts/bootstrap_files/elegance.txt +0 -40
- package/scripts/bootstrap_files/index.txt +0 -3
- package/scripts/bootstrap_files/layout.txt +0 -46
- package/scripts/bootstrap_files/middleware.txt +0 -18
- package/scripts/bootstrap_files/page.txt +0 -123
- package/scripts/bootstrap_files/route.txt +0 -6
- package/scripts/elegance_dev.ts +0 -42
- package/scripts/elegance_prod.ts +0 -42
- package/scripts/elegance_static.ts +0 -26
- package/scripts/prod.js +0 -13
- package/scripts/run.js +0 -13
- package/scripts/static.js +0 -13
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { hookGlobals } from "../globals.js";
|
|
2
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
|
+
hookGlobals();
|
|
4
|
+
const renderContextStorage = new AsyncLocalStorage();
|
|
5
|
+
function createRenderContext() {
|
|
6
|
+
return {
|
|
7
|
+
atomValues: /* @__PURE__ */ new Map(),
|
|
8
|
+
atomRegistry: [],
|
|
9
|
+
regions: [],
|
|
10
|
+
regionCounter: 0,
|
|
11
|
+
insideComponentDepth: 0
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async function runWithRenderContext(ctx, fn) {
|
|
15
|
+
return renderContextStorage.run(ctx, fn);
|
|
16
|
+
}
|
|
17
|
+
function getAtomSnapshot(ctx) {
|
|
18
|
+
const snapshot = {};
|
|
19
|
+
for (const { id } of ctx.atomRegistry) {
|
|
20
|
+
snapshot[id] = ctx.atomValues.get(id);
|
|
21
|
+
}
|
|
22
|
+
return snapshot;
|
|
23
|
+
}
|
|
24
|
+
const SELF_CLOSING_TAGS = /* @__PURE__ */ new Set([
|
|
25
|
+
"area",
|
|
26
|
+
"base",
|
|
27
|
+
"br",
|
|
28
|
+
"col",
|
|
29
|
+
"embed",
|
|
30
|
+
"hr",
|
|
31
|
+
"img",
|
|
32
|
+
"input",
|
|
33
|
+
"link",
|
|
34
|
+
"meta",
|
|
35
|
+
"source",
|
|
36
|
+
"track",
|
|
37
|
+
"wbr"
|
|
38
|
+
]);
|
|
39
|
+
function flattenVNodes(into, vs) {
|
|
40
|
+
for (const v of vs) {
|
|
41
|
+
if (v === null || v === false || v === void 0) continue;
|
|
42
|
+
if (Array.isArray(v)) flattenVNodes(into, v);
|
|
43
|
+
else into.push(v);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
class HtmlBuilder {
|
|
47
|
+
parts = [];
|
|
48
|
+
append(s) {
|
|
49
|
+
this.parts.push(s);
|
|
50
|
+
}
|
|
51
|
+
join() {
|
|
52
|
+
return this.parts.join("");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function generatePageHTML(pageRoot, metaNodes, route, bundleSrc, ctx, extraScripts) {
|
|
56
|
+
const bodyBuilder = new HtmlBuilder();
|
|
57
|
+
await renderTopLevel(pageRoot, bodyBuilder, ctx);
|
|
58
|
+
const headBuilder = new HtmlBuilder();
|
|
59
|
+
for (const node of metaNodes) {
|
|
60
|
+
const r = renderVirtualNode(node, headBuilder, ctx);
|
|
61
|
+
if (r) await r;
|
|
62
|
+
headBuilder.append("\n");
|
|
63
|
+
}
|
|
64
|
+
const hydrationPayload = JSON.stringify({ atoms: getAtomSnapshot(ctx) });
|
|
65
|
+
const bodyHtml = bodyBuilder.join();
|
|
66
|
+
const fullHtml = `<!DOCTYPE html>
|
|
67
|
+
<html>
|
|
68
|
+
<head>
|
|
69
|
+
<meta charset="UTF-8">
|
|
70
|
+
<link rel="modulepreload" href="/client.js">
|
|
71
|
+
<link rel="modulepreload" href="${bundleSrc}">
|
|
72
|
+
${(extraScripts || []).map((src) => `<link rel="modulepreload" href="${src}">`).join("")}
|
|
73
|
+
<script type="module" src="/client.js"></script>
|
|
74
|
+
<script data-pathname="${route.pathname}" type="module" data-bundle="true" src="${bundleSrc}"></script>
|
|
75
|
+
${headBuilder.join()}
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
${bodyHtml}
|
|
79
|
+
<script data-tag="iav" type="application/json">${hydrationPayload}</script>
|
|
80
|
+
</body>
|
|
81
|
+
</html>`;
|
|
82
|
+
return { fullHtml };
|
|
83
|
+
}
|
|
84
|
+
async function generateDynamicPageHTML(pageRoot, metaNodes, route, getClientCode, ctx) {
|
|
85
|
+
const bodyBuilder = new HtmlBuilder();
|
|
86
|
+
const bodyResult = renderTopLevel(pageRoot, bodyBuilder, ctx);
|
|
87
|
+
if (bodyResult) await bodyResult;
|
|
88
|
+
const headBuilder = new HtmlBuilder();
|
|
89
|
+
for (const node of metaNodes) {
|
|
90
|
+
const r = renderVirtualNode(node, headBuilder, ctx);
|
|
91
|
+
if (r) await r;
|
|
92
|
+
headBuilder.append("\n");
|
|
93
|
+
}
|
|
94
|
+
const clientCode = getClientCode();
|
|
95
|
+
const hydrationPayload = JSON.stringify({ atoms: getAtomSnapshot(ctx) });
|
|
96
|
+
return `<!DOCTYPE html>
|
|
97
|
+
<html>
|
|
98
|
+
<head>
|
|
99
|
+
<meta charset="UTF-8">
|
|
100
|
+
<link rel="modulepreload" href="/client.js">
|
|
101
|
+
${headBuilder.join()}
|
|
102
|
+
<script type="module" src="/client.js"></script>
|
|
103
|
+
</head>
|
|
104
|
+
<body>
|
|
105
|
+
${bodyBuilder.join()}
|
|
106
|
+
<script data-pathname="${route.pathname}" type="text/plain" data-bundle="true" id="__dyn_bundle">${clientCode}</script>
|
|
107
|
+
<script data-tag="iav" type="application/json">${hydrationPayload}</script>
|
|
108
|
+
</body>
|
|
109
|
+
</html>`;
|
|
110
|
+
}
|
|
111
|
+
function renderTopLevel(node, into, ctx) {
|
|
112
|
+
if (node === null || node === false || node === void 0) return;
|
|
113
|
+
if (Array.isArray(node)) return renderChildren(node, into, ctx);
|
|
114
|
+
if (typeof node === "object" && node.__type === "live") return renderChildren([node], into, ctx);
|
|
115
|
+
return renderVirtualNode(node, into, ctx);
|
|
116
|
+
}
|
|
117
|
+
function escapeHtml(str) {
|
|
118
|
+
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
119
|
+
}
|
|
120
|
+
function renderVirtualNode(node, into, ctx) {
|
|
121
|
+
if (node === false || node === void 0 || node === null) return;
|
|
122
|
+
if (typeof node === "string") {
|
|
123
|
+
into.append(escapeHtml(node));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (typeof node === "number") {
|
|
127
|
+
into.append(String(node));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (Array.isArray(node)) {
|
|
131
|
+
return renderChildren(node, into, ctx);
|
|
132
|
+
}
|
|
133
|
+
if (typeof node === "object" && "__rawHTML" in node) {
|
|
134
|
+
into.append(node.content);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (node.__type === "live") {
|
|
138
|
+
return renderLiveComponent(node, into, ctx);
|
|
139
|
+
}
|
|
140
|
+
if (node.__type === "element") {
|
|
141
|
+
return renderElement(node, into, ctx);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function renderElement(element, into, ctx) {
|
|
145
|
+
into.append(`<${element.tag}`);
|
|
146
|
+
if (ctx.insideComponentDepth === 0) {
|
|
147
|
+
const eid = element.options.__eid;
|
|
148
|
+
if (typeof eid === "number") {
|
|
149
|
+
into.append(` e-id="${eid}"`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for (const optionName in element.options) {
|
|
153
|
+
if (optionName.startsWith("on")) continue;
|
|
154
|
+
if (optionName === "__eid") continue;
|
|
155
|
+
const value = element.options[optionName];
|
|
156
|
+
const htmlOptionName = optionName === "className" ? "class" : optionName;
|
|
157
|
+
into.append(
|
|
158
|
+
` ${htmlOptionName}="${escapeHtml(String(value))}"`
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
if (SELF_CLOSING_TAGS.has(element.tag)) {
|
|
162
|
+
into.append("/>");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
into.append(">");
|
|
166
|
+
const childResult = renderChildren(element.children, into, ctx);
|
|
167
|
+
if (childResult) {
|
|
168
|
+
return childResult.then(() => {
|
|
169
|
+
into.append(`</${element.tag}>`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
into.append(`</${element.tag}>`);
|
|
173
|
+
}
|
|
174
|
+
function renderChildren(children, into, ctx) {
|
|
175
|
+
const flat = [];
|
|
176
|
+
flattenVNodes(flat, children);
|
|
177
|
+
for (let i = 0; i < flat.length; i++) {
|
|
178
|
+
const child = flat[i];
|
|
179
|
+
const isLive = typeof child === "object" && child !== null && !Array.isArray(child) && child.__type === "live";
|
|
180
|
+
if (isLive) {
|
|
181
|
+
return renderChildrenAsyncFrom(flat, i, into, ctx);
|
|
182
|
+
}
|
|
183
|
+
const result = renderVirtualNode(child, into, ctx);
|
|
184
|
+
if (result) {
|
|
185
|
+
return result.then(() => renderChildrenAsyncFrom(flat, i + 1, into, ctx));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function renderChildrenAsyncFrom(flat, startI, into, ctx) {
|
|
190
|
+
let i = startI;
|
|
191
|
+
while (i < flat.length) {
|
|
192
|
+
const child = flat[i];
|
|
193
|
+
const isLive = typeof child === "object" && child !== null && !Array.isArray(child) && child.__type === "live";
|
|
194
|
+
if (isLive) {
|
|
195
|
+
const regionIdx = ctx.regionCounter++;
|
|
196
|
+
ctx.regions[regionIdx] = [];
|
|
197
|
+
into.append(`<template data-region="${regionIdx}"></template>`);
|
|
198
|
+
while (i < flat.length) {
|
|
199
|
+
const c = flat[i];
|
|
200
|
+
const stillLive = typeof c === "object" && c !== null && !Array.isArray(c) && c.__type === "live";
|
|
201
|
+
if (!stillLive) break;
|
|
202
|
+
ctx.regions[regionIdx].push(c);
|
|
203
|
+
await renderLiveComponent(c, into, ctx);
|
|
204
|
+
i++;
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
const result = renderVirtualNode(child, into, ctx);
|
|
208
|
+
if (result) await result;
|
|
209
|
+
i++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function renderLiveComponent(component, into, ctx) {
|
|
214
|
+
const definition = component.__definition;
|
|
215
|
+
const props = component.props ?? {};
|
|
216
|
+
if (definition.serverInit) await definition.serverInit(ctx, props);
|
|
217
|
+
ctx.insideComponentDepth++;
|
|
218
|
+
try {
|
|
219
|
+
const vnode = definition.render(props);
|
|
220
|
+
const result = renderVirtualNode(vnode, into, ctx);
|
|
221
|
+
if (result) await result;
|
|
222
|
+
} finally {
|
|
223
|
+
ctx.insideComponentDepth--;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export {
|
|
227
|
+
HtmlBuilder,
|
|
228
|
+
createRenderContext,
|
|
229
|
+
generateDynamicPageHTML,
|
|
230
|
+
generatePageHTML,
|
|
231
|
+
getAtomSnapshot,
|
|
232
|
+
renderContextStorage,
|
|
233
|
+
runWithRenderContext
|
|
234
|
+
};
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
var __initialAtomValues: Record<string, any> | undefined;
|
|
3
|
+
var _getAtom: (id: string, initial?: any) => ReturnType<typeof atom>;
|
|
4
|
+
}
|
|
5
|
+
declare function atom(id: string, initial: any): {
|
|
6
|
+
id: string;
|
|
7
|
+
value: any;
|
|
8
|
+
_removeListener(c: any): void;
|
|
9
|
+
_addUserCallback(c: (_: any) => void): void;
|
|
10
|
+
_removeUserCallback(c: (_: any) => void): void;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;CACxE;AAWD,iBAAS,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;;WAUjB,GAAG;uBAOG,GAAG;wBACF,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI;2BACb,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI;EAG9C"}
|