evolit 0.1.0-alpha.2 → 0.1.0-alpha.20
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 +9 -3
- package/package.json +6 -5
- package/src/build.js +28 -6
- package/src/cli.js +16 -9
- package/src/client-assets.js +311 -70
- package/src/compiler.js +176 -9
- package/src/deployment-runtime.js +192 -35
- package/src/development-events.js +87 -0
- package/src/render.js +19 -5
- package/src/route-config.js +3 -1
- package/src/scaffold.js +4 -0
- package/src/server.js +152 -13
- package/src/terminal.js +32 -0
- package/templates/default/yarnrc.yml.template +1 -0
package/README.md
CHANGED
|
@@ -104,12 +104,18 @@ export const routeConfig = {
|
|
|
104
104
|
- `static`: prerender in `build` and serve from the response cache in `start`
|
|
105
105
|
- `revalidate`: cache the HTML response for `N` seconds and regenerate on expiry
|
|
106
106
|
|
|
107
|
+
Pages without `routeConfig.cache` default to `{ revalidate: 60 }`. This caches a normal SSR
|
|
108
|
+
render by pathname and query string while keeping content fresh without requiring a cache
|
|
109
|
+
declaration on every catalog or CMS page. Declare `cache: "static"` for fully static pages or
|
|
110
|
+
`cache: "dynamic"` when a page must always render per request.
|
|
111
|
+
|
|
107
112
|
The same semantics work in local development and in production runtimes. Only the backing cache
|
|
108
113
|
store changes.
|
|
109
114
|
|
|
110
|
-
The default cache key includes the pathname and query string
|
|
111
|
-
headers, cookies, or `requestUrl()` makes
|
|
112
|
-
|
|
115
|
+
The default cache key includes the pathname and query string, so `params` and `searchParams` are
|
|
116
|
+
cacheable by URL. Reading the `request` prop, request headers, cookies, or `requestUrl()` makes
|
|
117
|
+
the completed render dynamic; it is never stored in the HTML response cache. `routeConfig.cache`
|
|
118
|
+
is the sole authority for HTML caching; setting a
|
|
113
119
|
`Cache-Control` response header does not alter that policy.
|
|
114
120
|
|
|
115
121
|
## Request APIs
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evolit",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.20",
|
|
4
4
|
"description": "A convention-driven application framework for LitSX and web components.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "yarn@4.10.3",
|
|
@@ -47,15 +47,16 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@jridgewell/remapping": "^2.3.5",
|
|
50
|
-
"@litsx/compiler": "0.9.5-canary-feat-ssr-
|
|
51
|
-
"@litsx/core": "0.17.0-canary-feat-ssr-
|
|
52
|
-
"@litsx/ssr": "0.2.0-canary-feat-ssr-
|
|
50
|
+
"@litsx/compiler": "0.9.5-canary-feat-ssr-20260726184312",
|
|
51
|
+
"@litsx/core": "0.17.0-canary-feat-ssr-20260726184312",
|
|
52
|
+
"@litsx/ssr": "0.2.0-canary-feat-ssr-20260726184312",
|
|
53
53
|
"@litsx/typescript": "^0.9.0",
|
|
54
54
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
55
55
|
"lit": "^3.3.3",
|
|
56
56
|
"magic-string": "^1.1.0",
|
|
57
57
|
"rollup": "^4.46.1",
|
|
58
|
-
"typescript": "^6.0.0"
|
|
58
|
+
"typescript": "^6.0.0",
|
|
59
|
+
"ws": "^8.18.3"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"vite": "^8.1.5"
|
package/src/build.js
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
emitBundledClientAssets,
|
|
16
16
|
emitHashedClientAssets,
|
|
17
17
|
normalizeHydrationDataForClient,
|
|
18
|
+
resolveRouteClientImports,
|
|
18
19
|
resolveSharedVendorModuleUrl,
|
|
19
20
|
rewriteHydrationDataScript,
|
|
20
21
|
rewriteServerAssetPlaceholders,
|
|
@@ -241,8 +242,11 @@ export async function buildProject(projectRoot) {
|
|
|
241
242
|
);
|
|
242
243
|
const ssrAdapter = createSsrAdapter({
|
|
243
244
|
assetResolver,
|
|
244
|
-
async resolveAdditionalHead({ result }) {
|
|
245
|
-
const clientImports =
|
|
245
|
+
async resolveAdditionalHead({ routeResult, result }) {
|
|
246
|
+
const clientImports = [
|
|
247
|
+
...(Array.isArray(result.clientImports) ? result.clientImports : []),
|
|
248
|
+
...resolveRouteClientImports(routeResult, projectRoot, clientAssets),
|
|
249
|
+
];
|
|
246
250
|
const urls = collectTransitiveAssetPreloads(clientImports, clientAssets);
|
|
247
251
|
const styleUrls = collectTransitiveStyleUrls(clientImports, clientAssets);
|
|
248
252
|
|
|
@@ -251,17 +255,35 @@ export async function buildProject(projectRoot) {
|
|
|
251
255
|
...styleUrls.map((href) => `<link rel="stylesheet" href="${href}">`),
|
|
252
256
|
].join("\n");
|
|
253
257
|
},
|
|
254
|
-
resolveBootstrap({ result }) {
|
|
258
|
+
resolveBootstrap({ routeResult, result }) {
|
|
259
|
+
const routeClientImports = resolveRouteClientImports(
|
|
260
|
+
routeResult,
|
|
261
|
+
projectRoot,
|
|
262
|
+
clientAssets,
|
|
263
|
+
);
|
|
255
264
|
return createHydrationBootstrap({
|
|
256
|
-
hydrationData: normalizeHydrationDataForClient(
|
|
265
|
+
hydrationData: normalizeHydrationDataForClient(
|
|
266
|
+
result.hydrationData,
|
|
267
|
+
projectRoot,
|
|
268
|
+
routeClientImports,
|
|
269
|
+
),
|
|
257
270
|
assetResolver,
|
|
258
271
|
hydrationModuleUrl,
|
|
259
272
|
});
|
|
260
273
|
},
|
|
261
|
-
transformDocument({ result, document }) {
|
|
274
|
+
transformDocument({ routeResult, result, document }) {
|
|
275
|
+
const routeClientImports = resolveRouteClientImports(
|
|
276
|
+
routeResult,
|
|
277
|
+
projectRoot,
|
|
278
|
+
clientAssets,
|
|
279
|
+
);
|
|
262
280
|
return rewriteHydrationDataScript(
|
|
263
281
|
document,
|
|
264
|
-
normalizeHydrationDataForClient(
|
|
282
|
+
normalizeHydrationDataForClient(
|
|
283
|
+
result.hydrationData,
|
|
284
|
+
projectRoot,
|
|
285
|
+
routeClientImports,
|
|
286
|
+
),
|
|
265
287
|
);
|
|
266
288
|
},
|
|
267
289
|
});
|
package/src/cli.js
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import process from "node:process";
|
|
5
5
|
import { scaffoldSite } from "./scaffold.js";
|
|
6
|
+
import { createDevelopmentEventReporter } from "./development-events.js";
|
|
7
|
+
|
|
8
|
+
const reportEvent = createDevelopmentEventReporter();
|
|
6
9
|
|
|
7
10
|
function parseArguments(argv) {
|
|
8
11
|
const [command, ...rest] = argv;
|
|
@@ -24,9 +27,7 @@ function parseArguments(argv) {
|
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
function printUsage() {
|
|
27
|
-
|
|
28
|
-
console.log(" evolit init <directory>");
|
|
29
|
-
console.log(" evolit <dev|build|start> [--port 3000]");
|
|
30
|
+
reportEvent({ type: "usage" });
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
async function createSite(projectRoot, targetDirectory) {
|
|
@@ -35,7 +36,7 @@ async function createSite(projectRoot, targetDirectory) {
|
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
const createdDirectory = await scaffoldSite(path.resolve(projectRoot, targetDirectory));
|
|
38
|
-
|
|
39
|
+
reportEvent({ type: "site-created", directory: createdDirectory });
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
async function run() {
|
|
@@ -55,23 +56,29 @@ async function run() {
|
|
|
55
56
|
if (command === "build") {
|
|
56
57
|
const { buildProject } = await import("./build.js");
|
|
57
58
|
const manifestPath = await buildProject(projectRoot);
|
|
58
|
-
|
|
59
|
+
reportEvent({
|
|
60
|
+
type: "build-ready",
|
|
61
|
+
manifestPath: path.relative(projectRoot, manifestPath),
|
|
62
|
+
});
|
|
59
63
|
return;
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
if (command === "start") {
|
|
63
67
|
const { createStartServer } = await import("./server.js");
|
|
68
|
+
reportEvent({ type: "server-starting", mode: "start" });
|
|
64
69
|
const server = await createStartServer(projectRoot, options);
|
|
65
70
|
await server.listen();
|
|
66
|
-
|
|
71
|
+
reportEvent({ type: "server-ready", port: server.port });
|
|
67
72
|
return;
|
|
68
73
|
}
|
|
69
74
|
|
|
70
75
|
if (command === "dev") {
|
|
71
76
|
const { createDevServer } = await import("./server.js");
|
|
72
|
-
const server = await createDevServer(projectRoot,
|
|
77
|
+
const server = await createDevServer(projectRoot, {
|
|
78
|
+
...options,
|
|
79
|
+
onDevelopmentEvent: reportEvent,
|
|
80
|
+
});
|
|
73
81
|
await server.listen();
|
|
74
|
-
console.log(`evolit dev listening on http://localhost:${server.port}`);
|
|
75
82
|
return;
|
|
76
83
|
}
|
|
77
84
|
|
|
@@ -79,6 +86,6 @@ async function run() {
|
|
|
79
86
|
}
|
|
80
87
|
|
|
81
88
|
run().catch((error) => {
|
|
82
|
-
|
|
89
|
+
reportEvent({ type: "fatal-error", error });
|
|
83
90
|
process.exitCode = 1;
|
|
84
91
|
});
|