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 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. Reading the `request` prop, request
111
- headers, cookies, or `requestUrl()` makes the completed render dynamic; it is never stored in the
112
- HTML response cache. `routeConfig.cache` is the sole authority for HTML caching; setting a
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.2",
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-20260726130435",
51
- "@litsx/core": "0.17.0-canary-feat-ssr-20260726130435",
52
- "@litsx/ssr": "0.2.0-canary-feat-ssr-20260726130435",
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 = Array.isArray(result.clientImports) ? result.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(result.hydrationData, projectRoot),
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(result.hydrationData, projectRoot),
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
- console.log("Usage: evolit <directory>");
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
- console.log(`Created evolit site: ${createdDirectory}`);
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
- console.log(`Built evolit app: ${path.relative(projectRoot, manifestPath)}`);
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
- console.log(`evolit start listening on http://localhost:${server.port}`);
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, options);
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
- console.error(error instanceof Error ? error.stack ?? error.message : String(error));
89
+ reportEvent({ type: "fatal-error", error });
83
90
  process.exitCode = 1;
84
91
  });