@ecopages/core 0.2.0-beta.2 → 0.2.0-beta.21
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 +1 -1
- package/package.json +163 -3
- package/src/adapters/abstract/application-adapter.d.ts +104 -5
- package/src/adapters/abstract/application-adapter.js +125 -1
- package/src/adapters/abstract/server-adapter.d.ts +6 -2
- package/src/adapters/abstract/ws-pattern-matcher.d.ts +60 -0
- package/src/adapters/abstract/ws-pattern-matcher.js +61 -0
- package/src/adapters/bun/client-bridge.d.ts +1 -0
- package/src/adapters/bun/client-bridge.js +3 -0
- package/src/adapters/bun/create-app.d.ts +6 -4
- package/src/adapters/bun/create-app.js +65 -43
- package/src/adapters/bun/server-adapter.d.ts +90 -22
- package/src/adapters/bun/server-adapter.js +266 -84
- package/src/adapters/bun/static-preview-host.js +25 -20
- package/src/adapters/create-app.d.ts +13 -11
- package/src/adapters/create-app.js +2 -51
- package/src/adapters/index.d.ts +1 -1
- package/src/adapters/index.js +1 -2
- package/src/adapters/node/create-app.d.ts +5 -1
- package/src/adapters/node/create-app.js +51 -12
- package/src/adapters/node/node-client-bridge.d.ts +1 -0
- package/src/adapters/node/node-client-bridge.js +3 -0
- package/src/adapters/node/server-adapter-dependencies.js +4 -0
- package/src/adapters/node/server-adapter.d.ts +62 -20
- package/src/adapters/node/server-adapter.js +160 -131
- package/src/adapters/node/static-content-server.d.ts +1 -0
- package/src/adapters/node/static-content-server.js +10 -2
- package/src/adapters/node/static-preview-host.js +27 -12
- package/src/adapters/shared/bun-user-websocket-lifecycle.d.ts +22 -0
- package/src/adapters/shared/bun-user-websocket-lifecycle.js +96 -0
- package/src/adapters/shared/copy-runtime-public-dir.d.ts +6 -0
- package/src/adapters/shared/copy-runtime-public-dir.js +24 -0
- package/src/adapters/shared/fs-server-response-matcher.d.ts +2 -0
- package/src/adapters/shared/fs-server-response-matcher.js +40 -18
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +21 -30
- package/src/adapters/shared/hmr-entrypoint-registrar.js +49 -54
- package/src/adapters/shared/hmr-html-response.d.ts +1 -1
- package/src/adapters/shared/hmr-html-response.js +4 -1
- package/src/adapters/shared/node-http-websocket-upgrades.d.ts +21 -0
- package/src/adapters/shared/node-http-websocket-upgrades.js +100 -0
- package/src/adapters/shared/port-manager.d.ts +116 -0
- package/src/adapters/shared/port-manager.js +196 -0
- package/src/adapters/shared/runtime-app-bootstrap.d.ts +2 -1
- package/src/adapters/shared/runtime-app-bootstrap.js +3 -6
- package/src/adapters/shared/runtime-server-lifecycle.d.ts +46 -0
- package/src/adapters/shared/runtime-server-lifecycle.js +50 -0
- package/src/adapters/shared/server-adapter.d.ts +2 -1
- package/src/adapters/shared/server-adapter.js +13 -6
- package/src/adapters/shared/server-route-handler.d.ts +4 -1
- package/src/adapters/shared/server-route-handler.js +5 -2
- package/src/adapters/shared/server-static-builder.d.ts +23 -32
- package/src/adapters/shared/server-static-builder.js +100 -73
- package/src/adapters/shared/shared-hmr-manager.d.ts +45 -11
- package/src/adapters/shared/shared-hmr-manager.js +204 -58
- package/src/adapters/shared/static-preview-host.d.ts +5 -0
- package/src/adapters/shared/websocket-lifecycle.d.ts +24 -0
- package/src/adapters/shared/websocket-lifecycle.js +55 -0
- package/src/build/README.md +77 -14
- package/src/build/app-build-manifest-runtime.d.ts +9 -0
- package/src/build/app-build-manifest-runtime.js +87 -0
- package/src/build/build-adapter.d.ts +17 -319
- package/src/build/build-adapter.js +28 -94
- package/src/build/build-contracts.d.ts +97 -0
- package/src/build/build-contracts.js +0 -0
- package/src/build/build-input-fingerprint.d.ts +28 -0
- package/src/build/build-input-fingerprint.js +31 -0
- package/src/build/build-profile-options.d.ts +7 -0
- package/src/build/build-profile-options.js +37 -0
- package/src/build/build-runtime.d.ts +24 -0
- package/src/build/build-runtime.js +65 -0
- package/src/build/deduping-build-executor.d.ts +28 -0
- package/src/build/deduping-build-executor.js +56 -0
- package/src/build/jsx-ownership-plugins.d.ts +24 -0
- package/src/build/jsx-ownership-plugins.js +41 -0
- package/src/build/pages-unified-graph-build.d.ts +31 -0
- package/src/build/pages-unified-graph-build.js +206 -0
- package/src/build/parallel-build-executor.d.ts +21 -0
- package/src/build/parallel-build-executor.js +52 -0
- package/src/build/production-build-cache.d.ts +20 -0
- package/src/build/production-build-cache.js +63 -0
- package/src/build/rolldown-adapter-helpers.d.ts +3 -6
- package/src/build/rolldown-adapter-helpers.js +71 -6
- package/src/build/rolldown-build-adapter.d.ts +2 -6
- package/src/build/rolldown-build-adapter.js +3 -3
- package/src/build/rolldown-build-invocation-metrics.d.ts +12 -0
- package/src/build/rolldown-build-invocation-metrics.js +43 -0
- package/src/build/rolldown-plugin-bridge.d.ts +15 -1
- package/src/build/rolldown-plugin-bridge.js +20 -5
- package/src/build/rolldown-source-transform-pass.d.ts +15 -0
- package/src/build/rolldown-source-transform-pass.js +58 -0
- package/src/build/runtime-build-executor.d.ts +8 -15
- package/src/build/runtime-build-executor.js +12 -15
- package/src/build/runtime-build-output-normalizer.d.ts +7 -0
- package/src/build/runtime-build-output-normalizer.js +94 -2
- package/src/build/server-entry-build-cache.d.ts +44 -0
- package/src/build/server-entry-build-cache.js +161 -0
- package/src/client/navigation-scripts/classification.d.ts +16 -0
- package/src/client/navigation-scripts/classification.js +41 -0
- package/src/client/navigation-scripts/index.d.ts +3 -0
- package/src/client/navigation-scripts/index.js +23 -0
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
- package/src/client/navigation-scripts/registry.d.ts +11 -0
- package/src/client/navigation-scripts/registry.js +12 -0
- package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
- package/src/client/navigation-scripts/rerun-queue.js +73 -0
- package/src/client/scroll.d.ts +17 -0
- package/src/client/scroll.js +25 -0
- package/src/client/scroll.test.browser.js +37 -0
- package/src/client/view-transitions.d.ts +16 -0
- package/src/client/view-transitions.js +63 -0
- package/src/config/config-builder.d.ts +12 -7
- package/src/config/config-builder.js +12 -9
- package/src/dev/client-bridge-registry.d.ts +5 -0
- package/src/dev/client-bridge-registry.js +15 -0
- package/src/dev/dev-client-ownership.d.ts +7 -0
- package/src/dev/dev-client-ownership.js +6 -0
- package/src/dev/hmr-manager-registry.d.ts +8 -0
- package/src/dev/hmr-manager-registry.js +15 -0
- package/src/dev/host-runtime.d.ts +3 -0
- package/src/dev/host-runtime.js +7 -0
- package/src/dev/runtime-server-started-message.d.ts +2 -0
- package/src/dev/runtime-server-started-message.js +6 -0
- package/src/eco/README.md +11 -0
- package/src/eco/eco-declared-component.d.ts +14 -0
- package/src/eco/eco-declared-component.js +16 -0
- package/src/eco/eco.browser.js +5 -6
- package/src/eco/eco.js +5 -6
- package/src/eco/eco.types.d.ts +2 -2
- package/src/eco/page-layout-normalization.d.ts +21 -0
- package/src/eco/page-layout-normalization.js +59 -0
- package/src/errors/index.d.ts +1 -0
- package/src/errors/index.js +7 -1
- package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
- package/src/errors/undeclared-component-dependency-error.js +17 -0
- package/src/hmr/client/hmr-runtime.js +5 -2
- package/src/hmr/hmr-entrypoint-output.d.ts +43 -0
- package/src/hmr/hmr-entrypoint-output.js +53 -0
- package/src/hmr/hmr-strategy.d.ts +15 -0
- package/src/hmr/hmr-strategy.js +19 -0
- package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
- package/src/hmr/strategies/js-hmr-strategy.js +67 -19
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
- package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
- package/src/integrations/ghtml/ghtml-renderer.js +2 -51
- package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
- package/src/integrations/ghtml/ghtml.plugin.js +7 -14
- package/src/plugins/define-integration.d.ts +26 -0
- package/src/plugins/define-integration.js +19 -0
- package/src/plugins/eco-component-meta-plugin.js +5 -8
- package/src/plugins/foreign-jsx-override-plugin.js +4 -6
- package/src/plugins/integration-plugin.d.ts +19 -9
- package/src/plugins/integration-plugin.js +7 -4
- package/src/plugins/jsx-import-source.utils.d.ts +8 -0
- package/src/plugins/jsx-import-source.utils.js +26 -0
- package/src/plugins/processor.d.ts +19 -4
- package/src/plugins/processor.js +22 -4
- package/src/plugins/source-transform.d.ts +31 -0
- package/src/plugins/source-transform.js +23 -1
- package/src/route-renderer/GRAPH.md +8 -8
- package/src/route-renderer/README.md +30 -28
- package/src/route-renderer/orchestration/component-graph-collectors.d.ts +10 -0
- package/src/route-renderer/orchestration/component-graph-collectors.js +143 -0
- package/src/route-renderer/orchestration/component-graph.d.ts +36 -0
- package/src/route-renderer/orchestration/component-graph.js +98 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +3 -10
- package/src/route-renderer/orchestration/component-render-context.js +3 -1
- package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +1 -18
- package/src/route-renderer/orchestration/declared-ownership-graph.js +5 -31
- package/src/route-renderer/orchestration/document-shell-render.service.d.ts +90 -0
- package/src/route-renderer/orchestration/document-shell-render.service.js +120 -0
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +59 -29
- package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +164 -35
- package/src/route-renderer/orchestration/global-injector-assets.service.d.ts +7 -0
- package/src/route-renderer/orchestration/global-injector-assets.service.js +32 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +18 -54
- package/src/route-renderer/orchestration/integration-renderer.js +113 -195
- package/src/route-renderer/orchestration/integration-route-render-adapter.d.ts +38 -0
- package/src/route-renderer/orchestration/integration-route-render-adapter.js +27 -0
- package/src/route-renderer/orchestration/layout-shell-props.service.d.ts +20 -0
- package/src/route-renderer/orchestration/layout-shell-props.service.js +31 -0
- package/src/route-renderer/orchestration/ownership-validation.service.d.ts +5 -0
- package/src/route-renderer/orchestration/ownership-validation.service.js +29 -1
- package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.d.ts +9 -0
- package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.js +7 -0
- package/src/route-renderer/orchestration/page-browser-graph.service.d.ts +25 -0
- package/src/route-renderer/orchestration/page-browser-graph.service.js +174 -0
- package/src/route-renderer/orchestration/render-output.utils.d.ts +2 -0
- package/src/route-renderer/orchestration/render-output.utils.js +4 -0
- package/src/route-renderer/orchestration/route-html-finalization.service.d.ts +17 -0
- package/src/route-renderer/orchestration/route-html-finalization.service.js +26 -0
- package/src/route-renderer/orchestration/route-prepared-options.builder.d.ts +26 -0
- package/src/route-renderer/orchestration/route-prepared-options.builder.js +54 -0
- package/src/route-renderer/orchestration/route-prepared-options.utils.d.ts +4 -0
- package/src/route-renderer/orchestration/route-prepared-options.utils.js +33 -0
- package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +8 -39
- package/src/route-renderer/orchestration/route-render-orchestrator.js +53 -461
- package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
- package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
- package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
- package/src/router/client/link-intent.d.ts +11 -21
- package/src/router/client/link-intent.js +10 -0
- package/src/router/client/link-intent.test.browser.js +12 -1
- package/src/router/client/link-navigation-policy.d.ts +45 -0
- package/src/router/client/link-navigation-policy.js +101 -0
- package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
- package/src/router/client/link-navigation-policy.test.browser.js +92 -0
- package/src/router/client/navigation-coordinator.d.ts +1 -1
- package/src/router/client/navigation-coordinator.js +12 -2
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +27 -7
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
- package/src/services/assets/browser-bundle.service.d.ts +3 -1
- package/src/services/assets/browser-bundle.service.js +17 -5
- package/src/services/html/html-transformer.service.d.ts +1 -1
- package/src/services/html/html-transformer.service.js +4 -4
- package/src/services/invalidation/development-invalidation.service.d.ts +20 -2
- package/src/services/invalidation/development-invalidation.service.js +56 -2
- package/src/services/module-loading/README.md +49 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +5 -17
- package/src/services/module-loading/page-module-import.service.d.ts +5 -1
- package/src/services/module-loading/page-module-import.service.js +96 -45
- package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
- package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
- package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
- package/src/services/module-loading/route-module-build-cache.js +38 -0
- package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
- package/src/services/module-loading/route-module-build-cache.store.js +207 -0
- package/src/services/module-loading/route-module-build-manifest.d.ts +61 -0
- package/src/services/module-loading/route-module-build-manifest.js +116 -0
- package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
- package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
- package/src/services/module-loading/server-module-transpiler.service.js +1 -1
- package/src/static-site-generator/README.md +33 -0
- package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
- package/src/static-site-generator/static-build-invalidation.js +59 -0
- package/src/static-site-generator/static-export-context.d.ts +22 -0
- package/src/static-site-generator/static-export-context.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +17 -20
- package/src/static-site-generator/static-site-generator.js +188 -85
- package/src/types/internal-types.d.ts +16 -9
- package/src/types/public-types.d.ts +144 -40
- package/src/utils/parse-cli-args.d.ts +2 -0
- package/src/utils/parse-cli-args.js +6 -0
- package/src/utils/server-utils.module.d.ts +3 -2
- package/src/utils/server-utils.module.js +5 -6
- package/src/utils/static-file-extensions.d.ts +12 -0
- package/src/utils/static-file-extensions.js +48 -0
- package/src/watchers/project-watcher-ignore.d.ts +11 -0
- package/src/watchers/project-watcher-ignore.js +16 -0
- package/src/watchers/project-watcher.d.ts +26 -3
- package/src/watchers/project-watcher.js +132 -30
- package/src/watchers/project-watcher.test-helpers.js +5 -5
- package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
- package/src/build/rolldown-dev-build-adapter.js +0 -166
- package/src/hmr/hmr.postcss.test.e2e.js +0 -31
- package/src/hmr/hmr.test.e2e.js +0 -43
- package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
- package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
- package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
- /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
- /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
3
|
+
class RouteModuleDependencyHasher {
|
|
4
|
+
memo = /* @__PURE__ */ new Map();
|
|
5
|
+
hashFile;
|
|
6
|
+
exists;
|
|
7
|
+
constructor(dependencies) {
|
|
8
|
+
this.hashFile = dependencies?.hashFile ?? ((filePath) => fileSystem.hash(filePath));
|
|
9
|
+
this.exists = dependencies?.exists ?? ((filePath) => fileSystem.exists(filePath));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Returns a memoized content hash for one trackable dependency path.
|
|
13
|
+
*
|
|
14
|
+
* @param filePath - Absolute or project-relative source path.
|
|
15
|
+
* @returns The content hash, or `undefined` when the path is not trackable or missing.
|
|
16
|
+
*/
|
|
17
|
+
hashDependency(filePath) {
|
|
18
|
+
const normalizedPath = path.normalize(filePath);
|
|
19
|
+
if (!isTrackableRouteModuleDependency(normalizedPath)) {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
if (!this.exists(normalizedPath)) {
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
const cachedHash = this.memo.get(normalizedPath);
|
|
26
|
+
if (cachedHash) {
|
|
27
|
+
return cachedHash;
|
|
28
|
+
}
|
|
29
|
+
const nextHash = this.hashFile(normalizedPath);
|
|
30
|
+
this.memo.set(normalizedPath, nextHash);
|
|
31
|
+
return nextHash;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Builds the dependency-hash map for one route entrypoint graph.
|
|
35
|
+
*
|
|
36
|
+
* @param modulePaths - Raw module ids from the bundler dependency graph.
|
|
37
|
+
* @returns Hashes for every trackable, existing source file in the graph.
|
|
38
|
+
*/
|
|
39
|
+
createDependencyHashes(modulePaths) {
|
|
40
|
+
const dependencyHashes = {};
|
|
41
|
+
for (const modulePath of filterTrackableRouteModuleDependencies(modulePaths)) {
|
|
42
|
+
const dependencyHash = this.hashDependency(modulePath);
|
|
43
|
+
if (dependencyHash) {
|
|
44
|
+
dependencyHashes[modulePath] = dependencyHash;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return dependencyHashes;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns whether every stored dependency hash still matches the current file contents.
|
|
51
|
+
*
|
|
52
|
+
* @param storedHashes - Dependency hashes previously persisted for one route module.
|
|
53
|
+
* @param entrypointPath - Route entry file whose hash is validated separately.
|
|
54
|
+
* @param entrypointSourceHash - Already-validated content hash for {@link entrypointPath}.
|
|
55
|
+
* @returns `true` when all stored hashes are present and still valid.
|
|
56
|
+
*/
|
|
57
|
+
matchesStoredHashes(storedHashes, entrypointPath, entrypointSourceHash) {
|
|
58
|
+
this.clearMemo();
|
|
59
|
+
if (!storedHashes || Object.keys(storedHashes).length === 0) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const normalizedEntrypoint = entrypointPath ? path.normalize(entrypointPath) : void 0;
|
|
63
|
+
for (const [dependencyPath, storedHash] of Object.entries(storedHashes)) {
|
|
64
|
+
if (normalizedEntrypoint && path.normalize(dependencyPath) === normalizedEntrypoint) {
|
|
65
|
+
if (entrypointSourceHash && storedHash !== entrypointSourceHash) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const currentHash = this.hashDependency(dependencyPath);
|
|
71
|
+
if (!currentHash || currentHash !== storedHash) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/** Clears the per-build memo so subsequent reads reflect current file contents. */
|
|
78
|
+
clearMemo() {
|
|
79
|
+
this.memo.clear();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function isTrackableRouteModuleDependency(modulePath) {
|
|
83
|
+
const normalizedPath = path.normalize(modulePath);
|
|
84
|
+
if (normalizedPath.startsWith("node:")) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (normalizedPath.includes(`${path.sep}node_modules${path.sep}`)) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return /\.(?:[cm]?[jt]sx?|mdx)$/iu.test(normalizedPath) || normalizedPath.endsWith(".json");
|
|
91
|
+
}
|
|
92
|
+
function filterTrackableRouteModuleDependencies(modulePaths) {
|
|
93
|
+
const uniquePaths = /* @__PURE__ */ new Set();
|
|
94
|
+
for (const modulePath of modulePaths) {
|
|
95
|
+
const normalizedPath = path.normalize(modulePath);
|
|
96
|
+
if (isTrackableRouteModuleDependency(normalizedPath)) {
|
|
97
|
+
uniquePaths.add(normalizedPath);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return Array.from(uniquePaths).sort();
|
|
101
|
+
}
|
|
102
|
+
function resolveRouteModuleDependencyPaths(buildResult, entrypointPath, rootDir) {
|
|
103
|
+
const normalizedEntrypoint = path.isAbsolute(entrypointPath) ? path.normalize(entrypointPath) : path.normalize(path.resolve(rootDir, entrypointPath));
|
|
104
|
+
const graphEntrypoints = buildResult.dependencyGraph?.entrypoints ?? {};
|
|
105
|
+
const dependencyPaths = graphEntrypoints[normalizedEntrypoint] ?? graphEntrypoints[entrypointPath] ?? Object.entries(graphEntrypoints).find(([candidate]) => path.normalize(candidate) === normalizedEntrypoint)?.[1];
|
|
106
|
+
if (!dependencyPaths || dependencyPaths.length === 0) {
|
|
107
|
+
return [normalizedEntrypoint];
|
|
108
|
+
}
|
|
109
|
+
return dependencyPaths.map(
|
|
110
|
+
(dependencyPath) => path.isAbsolute(dependencyPath) ? path.normalize(dependencyPath) : path.normalize(path.resolve(rootDir, dependencyPath))
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
function createRouteModuleDependencyHashes(hasher, buildResult, entrypointPath, rootDir) {
|
|
114
|
+
return hasher.createDependencyHashes(resolveRouteModuleDependencyPaths(buildResult, entrypointPath, rootDir));
|
|
115
|
+
}
|
|
116
|
+
export {
|
|
117
|
+
RouteModuleDependencyHasher,
|
|
118
|
+
createRouteModuleDependencyHashes,
|
|
119
|
+
filterTrackableRouteModuleDependencies,
|
|
120
|
+
isTrackableRouteModuleDependency,
|
|
121
|
+
resolveRouteModuleDependencyPaths
|
|
122
|
+
};
|
|
@@ -11,7 +11,7 @@ class ServerModuleTranspiler {
|
|
|
11
11
|
* context.
|
|
12
12
|
*/
|
|
13
13
|
constructor(args) {
|
|
14
|
-
this.pageModuleImportService = args.pageModuleImportService ?? new PageModuleImportService({
|
|
14
|
+
this.pageModuleImportService = args.pageModuleImportService ?? new PageModuleImportService(void 0, {
|
|
15
15
|
canLoadSourceModuleFromHost: args.canLoadSourceModuleFromHost,
|
|
16
16
|
getHostModuleLoader: args.getHostModuleLoader
|
|
17
17
|
});
|
|
@@ -24,3 +24,36 @@ That means it should reuse:
|
|
|
24
24
|
- asset processing
|
|
25
25
|
|
|
26
26
|
It should not invent a parallel rendering stack just for build mode.
|
|
27
|
+
|
|
28
|
+
## Files
|
|
29
|
+
|
|
30
|
+
| File | Role |
|
|
31
|
+
| ------------------------------ | ---------------------------------------------------------------------------- |
|
|
32
|
+
| `static-site-generator.ts` | Route enumeration, HTML artifact writes, integration export hooks |
|
|
33
|
+
| `static-export-context.ts` | Hook context type for `beforeStaticExport` / `afterStaticExport` |
|
|
34
|
+
| `static-build-invalidation.ts` | `dist/` reset policy, production cache clearing, static-render cache context |
|
|
35
|
+
|
|
36
|
+
Build-input fingerprinting (`hashAppConfigFile`, `createBuildInputsFingerprint`) lives in `packages/core/src/build/build-input-fingerprint.ts` and is shared with server-entry and unified-graph caches.
|
|
37
|
+
|
|
38
|
+
## Incremental static export
|
|
39
|
+
|
|
40
|
+
`ServerStaticBuilder.prepareExportDirectory()` decides whether to wipe `dist/`:
|
|
41
|
+
|
|
42
|
+
1. `force: true` → always reset
|
|
43
|
+
2. Any processor/integration reports `didChange()` → reset
|
|
44
|
+
3. Route-module manifest lacks matching `configHash` + `buildInputsFingerprint` → reset
|
|
45
|
+
|
|
46
|
+
When `dist/` is preserved (`preserveExportDirectory: true`), `StaticSiteGenerator.run()` prunes HTML files no longer in the active route set.
|
|
47
|
+
|
|
48
|
+
Rendered HTML reuse is tracked in `.eco/.server-modules/.build-cache.json` under each route module's `renderedOutputs`. `canReuseStaticRender()` skips re-rendering when the source file, dependency hashes, and output path are unchanged.
|
|
49
|
+
|
|
50
|
+
`clearProductionBuildCaches()` runs on `force` builds and removes all persisted `.eco` build manifests (route modules, server entry, unified pages graph).
|
|
51
|
+
|
|
52
|
+
## Integration hooks
|
|
53
|
+
|
|
54
|
+
Integrations may implement:
|
|
55
|
+
|
|
56
|
+
- `beforeStaticExport(context)` — runs after unified-graph prebuild, before page rendering
|
|
57
|
+
- `afterStaticExport(context)` — runs in a `finally` block after generation completes
|
|
58
|
+
|
|
59
|
+
See `StaticExportContext` in `static-export-context.ts`.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
2
|
+
import { type RouteModuleStaticRenderCacheContext } from '../services/module-loading/route-module-build-manifest.js';
|
|
3
|
+
export type { BuildInputChangeContributor, IntegrationPlugin, Processor } from '../build/build-input-fingerprint.js';
|
|
4
|
+
export { collectBuildInputContributors, createBuildInputsFingerprint, didBuildInputContributorChange, hashAppConfigFile, haveBuildInputsChanged, } from '../build/build-input-fingerprint.js';
|
|
5
|
+
/** Builds the static-render invalidation context for one app config. */
|
|
6
|
+
export declare function createRouteModuleStaticRenderCacheContext(appConfig: EcoPagesAppConfig): RouteModuleStaticRenderCacheContext;
|
|
7
|
+
/** Returns whether `dist/` should be wiped before the next static export. */
|
|
8
|
+
export declare function shouldResetStaticExportDirectory(appConfig: EcoPagesAppConfig, force?: boolean): boolean;
|
|
9
|
+
/** Removes persisted production build caches so the next build recomputes everything. */
|
|
10
|
+
export declare function clearProductionBuildCaches(appConfig: EcoPagesAppConfig): void;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createBuildInputsFingerprint,
|
|
3
|
+
hashAppConfigFile,
|
|
4
|
+
haveBuildInputsChanged
|
|
5
|
+
} from "../build/build-input-fingerprint.js";
|
|
6
|
+
import { clearPersistedProductionBuildCacheManifests } from "../build/production-build-cache.js";
|
|
7
|
+
import {} from "../services/module-loading/route-module-build-manifest.js";
|
|
8
|
+
import {
|
|
9
|
+
getSharedRouteModuleBuildCache,
|
|
10
|
+
getServerModuleBuildCacheOutdir
|
|
11
|
+
} from "../services/module-loading/route-module-build-cache-registry.js";
|
|
12
|
+
import {
|
|
13
|
+
collectBuildInputContributors,
|
|
14
|
+
createBuildInputsFingerprint as createBuildInputsFingerprint2,
|
|
15
|
+
didBuildInputContributorChange,
|
|
16
|
+
hashAppConfigFile as hashAppConfigFile2,
|
|
17
|
+
haveBuildInputsChanged as haveBuildInputsChanged2
|
|
18
|
+
} from "../build/build-input-fingerprint.js";
|
|
19
|
+
function createRouteModuleStaticRenderCacheContext(appConfig) {
|
|
20
|
+
return {
|
|
21
|
+
configHash: hashAppConfigFile(appConfig),
|
|
22
|
+
buildInputsFingerprint: createBuildInputsFingerprint(appConfig)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function shouldResetStaticExportDirectory(appConfig, force = false) {
|
|
26
|
+
if (force) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (haveBuildInputsChanged(appConfig)) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
const routeModuleCache = getSharedRouteModuleBuildCache(getServerModuleBuildCacheOutdir(appConfig), appConfig);
|
|
33
|
+
return !routeModuleCache.isIncrementalStaticGenerationAvailable(
|
|
34
|
+
createRouteModuleStaticRenderCacheContext(appConfig)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
function clearProductionBuildCaches(appConfig) {
|
|
38
|
+
if (process.env.NODE_ENV !== "production") {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
clearPersistedProductionBuildCacheManifests(appConfig);
|
|
42
|
+
for (const cache of appConfig.runtime?.routeModuleBuildCaches?.values() ?? []) {
|
|
43
|
+
cache.resetMemory();
|
|
44
|
+
}
|
|
45
|
+
appConfig.runtime?.routeModuleBuildCaches?.clear();
|
|
46
|
+
if (appConfig.runtime) {
|
|
47
|
+
appConfig.runtime.buildRuntime = void 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
clearProductionBuildCaches,
|
|
52
|
+
collectBuildInputContributors,
|
|
53
|
+
createBuildInputsFingerprint2 as createBuildInputsFingerprint,
|
|
54
|
+
createRouteModuleStaticRenderCacheContext,
|
|
55
|
+
didBuildInputContributorChange,
|
|
56
|
+
hashAppConfigFile2 as hashAppConfigFile,
|
|
57
|
+
haveBuildInputsChanged2 as haveBuildInputsChanged,
|
|
58
|
+
shouldResetStaticExportDirectory
|
|
59
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
2
|
+
import type { StaticRoute } from '../types/public-types.js';
|
|
3
|
+
import type { StaticGenerationRendererResolver } from '../route-renderer/route-renderer.js';
|
|
4
|
+
import type { StaticGenerationRoute } from '../router/server/route-registry.js';
|
|
5
|
+
type StaticGenerationRouteSource = {
|
|
6
|
+
listStaticGenerationRoutes(input: {
|
|
7
|
+
runtimeOrigin: string;
|
|
8
|
+
}): Promise<readonly StaticGenerationRoute[]>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Context passed to integration plugins during static export lifecycle hooks.
|
|
12
|
+
*/
|
|
13
|
+
export interface StaticExportContext {
|
|
14
|
+
appConfig: EcoPagesAppConfig;
|
|
15
|
+
router: StaticGenerationRouteSource;
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
routeRendererFactory?: StaticGenerationRendererResolver;
|
|
18
|
+
staticRoutes?: StaticRoute[];
|
|
19
|
+
force: boolean;
|
|
20
|
+
preserveExportDirectory: boolean;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
File without changes
|
|
@@ -2,6 +2,7 @@ import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
|
2
2
|
import type { StaticRoute } from '../types/public-types.js';
|
|
3
3
|
import type { PageRendererResolver, StaticGenerationRendererResolver } from '../route-renderer/route-renderer.js';
|
|
4
4
|
import type { StaticGenerationRoute } from '../router/server/route-registry.js';
|
|
5
|
+
import type { RouteModuleBuildCache } from '../services/module-loading/route-module-build-cache.store.js';
|
|
5
6
|
type StaticGenerationRouteSource = {
|
|
6
7
|
listStaticGenerationRoutes(input: {
|
|
7
8
|
runtimeOrigin: string;
|
|
@@ -27,26 +28,19 @@ export declare const STATIC_SITE_GENERATOR_ERRORS: {
|
|
|
27
28
|
*/
|
|
28
29
|
export declare class StaticSiteGenerator {
|
|
29
30
|
appConfig: EcoPagesAppConfig;
|
|
31
|
+
private readonly routeModuleBuildCacheOverride?;
|
|
32
|
+
private staticRenderCacheContext;
|
|
33
|
+
private forceFullStaticGeneration;
|
|
30
34
|
/**
|
|
31
35
|
* Creates the static-site generator for one app config.
|
|
32
36
|
*/
|
|
33
|
-
constructor({ appConfig }: {
|
|
37
|
+
constructor({ appConfig, routeModuleBuildCache, }: {
|
|
34
38
|
appConfig: EcoPagesAppConfig;
|
|
39
|
+
routeModuleBuildCache?: RouteModuleBuildCache;
|
|
35
40
|
});
|
|
41
|
+
private getRouteModuleBuildCache;
|
|
36
42
|
private getExportDir;
|
|
37
|
-
/**
|
|
38
|
-
* Logs the standardized warning emitted when a dynamic-cache page is skipped.
|
|
39
|
-
*/
|
|
40
|
-
private warnDynamicPageSkipped;
|
|
41
|
-
/**
|
|
42
|
-
* Determines whether one filesystem-discovered page should be excluded from
|
|
43
|
-
* static generation.
|
|
44
|
-
*/
|
|
45
43
|
private shouldSkipStaticPageFile;
|
|
46
|
-
/**
|
|
47
|
-
* Determines whether one explicit static route view should be excluded from
|
|
48
|
-
* static generation.
|
|
49
|
-
*/
|
|
50
44
|
private shouldSkipStaticView;
|
|
51
45
|
/**
|
|
52
46
|
* Writes the robots.txt file declared by the app config.
|
|
@@ -61,32 +55,35 @@ export declare class StaticSiteGenerator {
|
|
|
61
55
|
*/
|
|
62
56
|
getDirectories(routes: string[]): string[];
|
|
63
57
|
private writeStaticOutput;
|
|
64
|
-
private
|
|
58
|
+
private writeStaticPageArtifact;
|
|
59
|
+
private pruneStaleStaticOutputs;
|
|
65
60
|
private createFilesystemStaticContents;
|
|
66
61
|
/**
|
|
67
62
|
* Generates static output for all filesystem-discovered routes.
|
|
68
63
|
*
|
|
69
64
|
* @remarks
|
|
70
|
-
* Routes
|
|
71
|
-
* issuing a request against the running server origin. Render-strategy routes
|
|
72
|
-
* go through the normal route renderer directly.
|
|
65
|
+
* Routes are rendered through the normal route renderer directly.
|
|
73
66
|
*/
|
|
74
|
-
generateStaticPages(router: StaticGenerationRouteSource, baseUrl: string, routeRendererFactory?: StaticPageRouteRendererFactory): Promise<void>;
|
|
75
|
-
private
|
|
67
|
+
generateStaticPages(router: StaticGenerationRouteSource, baseUrl: string, routeRendererFactory?: StaticPageRouteRendererFactory, skipped?: string[], activeStaticPathnames?: Set<string>, preloadedRoutes?: readonly StaticGenerationRoute[]): Promise<void>;
|
|
68
|
+
private createStaticExportContext;
|
|
69
|
+
private invokeStaticExportHook;
|
|
76
70
|
/**
|
|
77
71
|
* Executes the full static-generation workflow for one app run.
|
|
78
72
|
*/
|
|
79
|
-
run({ router, baseUrl, routeRendererFactory, staticRoutes, }: {
|
|
73
|
+
run({ router, baseUrl, routeRendererFactory, staticRoutes, force, preserveExportDirectory, }: {
|
|
80
74
|
router: StaticGenerationRouteSource;
|
|
81
75
|
baseUrl: string;
|
|
82
76
|
routeRendererFactory?: StaticGenerationRendererFactory;
|
|
83
77
|
staticRoutes?: StaticRoute[];
|
|
78
|
+
force?: boolean;
|
|
79
|
+
preserveExportDirectory?: boolean;
|
|
84
80
|
}): Promise<void>;
|
|
85
81
|
/**
|
|
86
82
|
* Generates static pages from explicit static routes registered via app.static().
|
|
87
83
|
* These routes use eco.page views via loader functions for HMR support.
|
|
88
84
|
*/
|
|
89
85
|
private generateExplicitStaticPages;
|
|
86
|
+
private resolveExplicitViewSourceFile;
|
|
90
87
|
private generateExplicitStaticRoute;
|
|
91
88
|
private planExplicitStaticRoute;
|
|
92
89
|
private createExplicitStaticContents;
|