veryfront 0.1.791 → 0.1.795
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 +38 -87
- package/esm/deno.js +1 -1
- package/esm/src/agent/hosted/chat-runtime-agent-adapter.d.ts +1 -0
- package/esm/src/agent/hosted/chat-runtime-agent-adapter.d.ts.map +1 -1
- package/esm/src/agent/hosted/chat-runtime-agent-adapter.js +1 -0
- package/esm/src/agent/hosted/default-chat-runtime.d.ts.map +1 -1
- package/esm/src/agent/hosted/default-chat-runtime.js +1 -0
- package/esm/src/agent/runtime/skill-policy-enforcement.d.ts.map +1 -1
- package/esm/src/agent/runtime/skill-policy-enforcement.js +4 -2
- package/esm/src/agent/service/mcp-server-config.d.ts.map +1 -1
- package/esm/src/agent/service/mcp-server-config.js +5 -2
- package/esm/src/html/hydration-script-builder/templates/router.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/templates/router.js +6 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +38 -18
- package/esm/src/release-assets/build-executor.d.ts +23 -0
- package/esm/src/release-assets/build-executor.d.ts.map +1 -1
- package/esm/src/release-assets/build-executor.js +262 -8
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +1 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline-helpers.js +4 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts +1 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +25 -5
- package/esm/src/rendering/orchestrator/types.d.ts +2 -0
- package/esm/src/rendering/orchestrator/types.d.ts.map +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,44 @@ It gives you agents, tools, workflows, and a complete React rendering stack in a
|
|
|
14
14
|
<img src="./assets/banner.svg" alt="Veryfront" width="100%">
|
|
15
15
|
</p>
|
|
16
16
|
|
|
17
|
+
## Get started
|
|
18
|
+
|
|
19
|
+
Create a new Veryfront Code app:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm create veryfront
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
<details>
|
|
26
|
+
<summary>Use another package manager</summary>
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pnpm create veryfront
|
|
30
|
+
yarn create veryfront
|
|
31
|
+
bun create veryfront
|
|
32
|
+
deno init --npm veryfront
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
</details>
|
|
36
|
+
|
|
37
|
+
Start from a template directly:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx veryfront init <PROJECT_NAME> --template <TEMPLATE>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Available starters: `ai-agent`, `minimal`, `agentic-workflow`.
|
|
44
|
+
|
|
45
|
+
Install the `veryfront` binary for local development commands and the TUI:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
curl -fsSL https://veryfront.com/install.sh | sh
|
|
49
|
+
# or
|
|
50
|
+
brew install veryfront/tap/veryfront
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Follow the [Quickstart guide](https://veryfront.com/docs/code/getting-started/quickstart) to build your first app. For project setup options and template details, see [Create a project](https://veryfront.com/docs/code/getting-started/create-a-project). For the full documentation, visit [veryfront.com/docs/code](https://veryfront.com/docs/code).
|
|
54
|
+
|
|
17
55
|
## Why Veryfront Code?
|
|
18
56
|
|
|
19
57
|
Purpose-built for TypeScript and React, Veryfront Code gives you everything you need to build agentic full-stack applications out-of-the-box.
|
|
@@ -50,99 +88,12 @@ Purpose-built for TypeScript and React, Veryfront Code gives you everything you
|
|
|
50
88
|
|
|
51
89
|
- [**Extensions**](https://veryfront.com/docs/code/guides/extensions) - Extend Veryfront Code with contract-based packages for LLM providers, bundling, CSS, tracing, caching, and more.
|
|
52
90
|
|
|
53
|
-
## Get Started
|
|
54
|
-
|
|
55
|
-
Use the interactive project wizard when you want to compare templates:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
npm create veryfront
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Choose a starting point directly with `npx` when you already know what you want
|
|
62
|
-
to build:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
# Agent app with a chat UI, tool, and AG-UI route
|
|
66
|
-
npx veryfront init support-agent --template ai-agent
|
|
67
|
-
|
|
68
|
-
# Blank full-stack app with pages and routing
|
|
69
|
-
npx veryfront init my-app --template minimal
|
|
70
|
-
|
|
71
|
-
# Durable multi-step AI pipeline
|
|
72
|
-
npx veryfront init my-workflow --template agentic-workflow
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
<details>
|
|
76
|
-
<summary>pnpm, yarn, bun, deno</summary>
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
pnpm create veryfront
|
|
80
|
-
yarn create veryfront
|
|
81
|
-
bun create veryfront
|
|
82
|
-
deno init --npm veryfront
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Binary install (recommended for the CLI/TUI):
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
curl -fsSL https://veryfront.com/install.sh | sh
|
|
89
|
-
# or
|
|
90
|
-
brew install veryfront/tap/veryfront
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
</details>
|
|
94
|
-
|
|
95
|
-
Follow the [Quickstart guide](https://veryfront.com/docs/code/getting-started/quickstart) to build the agent app end-to-end, or use [Create a project](https://veryfront.com/docs/code/getting-started/create-a-project) to compare templates before you scaffold. For the full documentation, visit [veryfront.com/docs/code](https://veryfront.com/docs/code).
|
|
96
|
-
|
|
97
|
-
## Project Structure
|
|
98
|
-
|
|
99
|
-
```
|
|
100
|
-
veryfront/
|
|
101
|
-
├── src/ # Framework core modules
|
|
102
|
-
│ ├── agent/ # Agent runtime, AG-UI, hosted execution
|
|
103
|
-
│ ├── tool/ # Tool definitions and registry
|
|
104
|
-
│ ├── workflow/ # Durable DAG workflows with crash recovery
|
|
105
|
-
│ ├── mcp/ # Model Context Protocol server
|
|
106
|
-
│ ├── skill/ # Agent skills system (SKILL.md)
|
|
107
|
-
│ ├── chat/ # Chat UI components and streaming
|
|
108
|
-
│ ├── discovery/ # Auto-discovery of tools, agents, workflows
|
|
109
|
-
│ ├── sandbox/ # Ephemeral compute environments
|
|
110
|
-
│ ├── runs/ # Durable runs client
|
|
111
|
-
│ ├── task/ # Task definitions and runner
|
|
112
|
-
│ ├── channels/ # Control-plane agent routing
|
|
113
|
-
│ ├── integrations/ # Third-party connector metadata
|
|
114
|
-
│ ├── provider/ # AI model provider adapters
|
|
115
|
-
│ ├── rendering/ # SSR/RSC engine
|
|
116
|
-
│ ├── server/ # HTTP servers (dev + production)
|
|
117
|
-
│ ├── routing/ # File-based routing
|
|
118
|
-
│ ├── security/ # Rate limiting, CORS, CSP, validation
|
|
119
|
-
│ └── ... # See src/README.md for full list
|
|
120
|
-
├── cli/ # CLI and TUI dashboard
|
|
121
|
-
├── extensions/ # First-party extension packages
|
|
122
|
-
├── docs/ # Architecture diagrams and guides
|
|
123
|
-
├── tests/ # Integration and E2E tests
|
|
124
|
-
└── scripts/ # Development and build scripts
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Examples
|
|
128
|
-
|
|
129
|
-
You can find standalone, runnable examples in the [veryfront-examples](https://github.com/veryfront/veryfront-examples) repo.
|
|
130
|
-
|
|
131
91
|
## Contributing
|
|
132
92
|
|
|
133
93
|
Looking to contribute? All types of help are appreciated, from coding to testing and feature specification. Read [CONTRIBUTING.md](./CONTRIBUTING.md) for more details on how to get involved.
|
|
134
94
|
|
|
135
95
|
If you are a developer and would like to contribute with code, please open an issue to discuss before opening a Pull Request.
|
|
136
96
|
|
|
137
|
-
## Supply-Chain Hardening
|
|
138
|
-
|
|
139
|
-
Veryfront Code treats dependency changes as reviewed code changes.
|
|
140
|
-
|
|
141
|
-
- Workspace Deno dependencies use exact versions and are resolved through the checked-in `deno.lock`.
|
|
142
|
-
- `deno.json` sets `minimumDependencyAge` to delay freshly published dependency versions during Deno resolution.
|
|
143
|
-
- `.npmrc` sets `save-exact=true` so npm-compatible tooling records exact versions.
|
|
144
|
-
- The npm package generator pins automatic `dependencies`, `optionalDependencies`, and `devDependencies`; peer ranges remain available only for opt-in compatibility constraints.
|
|
145
|
-
|
|
146
97
|
## Support
|
|
147
98
|
|
|
148
99
|
We have an [open community Discord](https://discord.gg/xWuRjafrtV). Come say hello and let us know if you have any questions or need help getting things running.
|
package/esm/deno.js
CHANGED
|
@@ -12,6 +12,7 @@ export type HostedChatRuntimeAgentAdapterInput = {
|
|
|
12
12
|
runtimeAgent: Pick<Agent, "stream">;
|
|
13
13
|
runId?: string;
|
|
14
14
|
agentId?: string;
|
|
15
|
+
authToken?: string;
|
|
15
16
|
runStream?: HostedChatRuntimeAgentAdapterRunner;
|
|
16
17
|
warnOrphanedToolInput?: (message: string, metadata: HostedChatRuntimeAgentAdapterWarning) => void;
|
|
17
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-runtime-agent-adapter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-runtime-agent-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wEAAwE;AACxE,MAAM,MAAM,mCAAmC,GAAG,CAAC,OAAO,EACxD,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,yEAAyE;AACzE,MAAM,MAAM,oCAAoC,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,kCAAkC,GAAG;IAC/C,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,mCAAmC,CAAC;IAChD,qBAAqB,CAAC,EAAE,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,oCAAoC,KAC3C,IAAI,CAAC;CACX,CAAC;AAMF,gDAAgD;AAChD,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,kCAAkC,GACxC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"chat-runtime-agent-adapter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-runtime-agent-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wEAAwE;AACxE,MAAM,MAAM,mCAAmC,GAAG,CAAC,OAAO,EACxD,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,yEAAyE;AACzE,MAAM,MAAM,oCAAoC,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,kCAAkC,GAAG;IAC/C,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,mCAAmC,CAAC;IAChD,qBAAqB,CAAC,EAAE,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,oCAAoC,KAC3C,IAAI,CAAC;CACX,CAAC;AAMF,gDAAgD;AAChD,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,kCAAkC,GACxC,sBAAsB,CAyDxB"}
|
|
@@ -14,6 +14,7 @@ export function createHostedChatRuntimeAgentAdapter(input) {
|
|
|
14
14
|
context: {
|
|
15
15
|
...(input.runId ? { runId: input.runId } : {}),
|
|
16
16
|
...(input.agentId ? { agentId: input.agentId } : {}),
|
|
17
|
+
...(input.authToken ? { authToken: input.authToken } : {}),
|
|
17
18
|
abortSignal: streamInput.abortSignal,
|
|
18
19
|
publishDataEvent: (event) => publishDataEvent(event),
|
|
19
20
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-chat-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/default-chat-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"default-chat-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/default-chat-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -157,6 +157,7 @@ export async function createDefaultHostedChatRuntime(input) {
|
|
|
157
157
|
runtimeAgent,
|
|
158
158
|
runId: taskContext.runId,
|
|
159
159
|
agentId: taskContext.agentId,
|
|
160
|
+
authToken: taskContext.authToken,
|
|
160
161
|
runStream: (operation) => runWithDefaultHostedRequestContext({
|
|
161
162
|
taskContext,
|
|
162
163
|
cloudContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAO/C,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AAOD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAO/C,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AAOD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAoCtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAsBnB"}
|
|
@@ -78,9 +78,11 @@ export function narrowPolicyAfterSubmittedForm(activeSkillId, activeSkillPolicy)
|
|
|
78
78
|
"update_file",
|
|
79
79
|
].includes(allowedToolName));
|
|
80
80
|
}
|
|
81
|
-
if (activeSkillId === "
|
|
82
|
-
activeSkillId === "create-agent" ||
|
|
81
|
+
if (activeSkillId === "create-agent" ||
|
|
83
82
|
activeSkillId === "create-agentic-workflow") {
|
|
83
|
+
return activeSkillPolicy.filter((allowedToolName) => allowedToolName !== FORM_INPUT_TOOL_ID);
|
|
84
|
+
}
|
|
85
|
+
if (activeSkillId === "plan") {
|
|
84
86
|
return activeSkillPolicy.filter((allowedToolName) => [
|
|
85
87
|
"studio_suggestions",
|
|
86
88
|
"list_files",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-config.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/service/mcp-server-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,MAAM,MAAM,uCAAuC,GAAG;IACpD,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0CAA0C,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC,uCAAuC,GACvC,0CAA0C,GAC1C,kCAAkC,CAAC;AAEvC,MAAM,MAAM,sCAAsC,GAAG;IACnD,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,6BAA6B,IAAI,2BAA2B,EAAE,CAE7E;
|
|
1
|
+
{"version":3,"file":"mcp-server-config.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/service/mcp-server-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,MAAM,MAAM,uCAAuC,GAAG;IACpD,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0CAA0C,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC,uCAAuC,GACvC,0CAA0C,GAC1C,kCAAkC,CAAC;AAEvC,MAAM,MAAM,sCAAsC,GAAG;IACnD,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,6BAA6B,IAAI,2BAA2B,EAAE,CAE7E;AA4DD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,sCAAsC,GAC5C,yBAAyB,GAAG,IAAI,CAUlC"}
|
|
@@ -23,8 +23,11 @@ function createVeryfrontApiRemoteMcpConfig(input, server) {
|
|
|
23
23
|
return {
|
|
24
24
|
id: server.id ?? input.defaultSourceId ?? "veryfront-mcp",
|
|
25
25
|
endpoint: input.apiMcpUrl,
|
|
26
|
-
headers: {
|
|
27
|
-
|
|
26
|
+
headers: (context) => {
|
|
27
|
+
const authToken = typeof context?.authToken === "string" && context.authToken.length > 0
|
|
28
|
+
? context.authToken
|
|
29
|
+
: input.authToken;
|
|
30
|
+
return { Authorization: `Bearer ${authToken}` };
|
|
28
31
|
},
|
|
29
32
|
};
|
|
30
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cAyrB3B,CAAC"}
|
|
@@ -444,6 +444,12 @@ export const getRouterScript = () => `
|
|
|
444
444
|
document.head.appendChild(styleEl);
|
|
445
445
|
}
|
|
446
446
|
log('Injected CSS for SPA navigation', { cssLength: pageData.css.length });
|
|
447
|
+
} else if (pageData.cssAction === 'clear') {
|
|
448
|
+
const existingStyle = document.getElementById('veryfront-spa-css');
|
|
449
|
+
if (existingStyle) {
|
|
450
|
+
existingStyle.remove();
|
|
451
|
+
log('Cleared SPA CSS for release stylesheet navigation');
|
|
452
|
+
}
|
|
447
453
|
}
|
|
448
454
|
|
|
449
455
|
let tree = React.createElement(PageComponent, {
|
|
@@ -31,6 +31,7 @@ export declare class VeryfrontFSAdapter implements FSAdapter {
|
|
|
31
31
|
/** Whether running in proxy mode (shared adapter with per-request OAuth tokens) */
|
|
32
32
|
private proxyMode;
|
|
33
33
|
private getCurrentFileListCacheKey;
|
|
34
|
+
private syncClientContext;
|
|
34
35
|
private getCachedFileListSync;
|
|
35
36
|
private getCachedFileListAsync;
|
|
36
37
|
constructor(config: FSAdapterConfig);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAEV,cAAc,EACd,SAAS,EACT,eAAe,EAEf,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAoDnE,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,WAAW,CAAS;IAE5B,kFAAkF;IAClF,OAAO,CAAC,oBAAoB,CAA6B;IACzD,0EAA0E;IAC1E,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,OAAO,CAAC,WAAW,CAAC,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAmB;IAEpC,4DAA4D;IAC5D,OAAO,CAAC,aAAa,CAAuB;IAE5C,+CAA+C;IAC/C,OAAO,CAAC,aAAa,CAAgB;IACrC,iGAAiG;IACjG,OAAO,CAAC,cAAc,CAAuC;IAC7D,mFAAmF;IACnF,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,qBAAqB;YAMf,sBAAsB;gBA4BxB,MAAM,EAAE,eAAe;IAmI7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,18 @@ export class VeryfrontFSAdapter {
|
|
|
61
61
|
getCurrentFileListCacheKey() {
|
|
62
62
|
return this.contentContext ? buildFileListCacheKey(this.contentContext) : undefined;
|
|
63
63
|
}
|
|
64
|
+
syncClientContext() {
|
|
65
|
+
this.client.clearRequestBranch();
|
|
66
|
+
if (this.contentContext) {
|
|
67
|
+
this.client.setContext(toClientContext(this.contentContext));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.client.clearContext();
|
|
71
|
+
}
|
|
72
|
+
if (this.requestBranch) {
|
|
73
|
+
this.client.setRequestBranch(this.requestBranch);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
64
76
|
getCachedFileListSync() {
|
|
65
77
|
const cacheKey = this.getCurrentFileListCacheKey();
|
|
66
78
|
if (!cacheKey)
|
|
@@ -204,10 +216,11 @@ export class VeryfrontFSAdapter {
|
|
|
204
216
|
if (!this.contentContext) {
|
|
205
217
|
logger.debug("Step 3: resolveContentSource START", { projectSlug });
|
|
206
218
|
const step3Start = performance.now();
|
|
207
|
-
|
|
219
|
+
const resolvedContext = await resolveContentContext(this.client, this.contentSource, this.projectSlug);
|
|
220
|
+
this.setContentContext(resolvedContext);
|
|
208
221
|
logger.debug("Step 3: resolveContentSource DONE", {
|
|
209
222
|
projectSlug,
|
|
210
|
-
sourceType:
|
|
223
|
+
sourceType: resolvedContext.sourceType,
|
|
211
224
|
duration: `${(performance.now() - step3Start).toFixed(2)}ms`,
|
|
212
225
|
});
|
|
213
226
|
}
|
|
@@ -217,17 +230,24 @@ export class VeryfrontFSAdapter {
|
|
|
217
230
|
sourceType: this.contentContext.sourceType,
|
|
218
231
|
});
|
|
219
232
|
}
|
|
233
|
+
const contentContext = this.contentContext;
|
|
234
|
+
if (!contentContext) {
|
|
235
|
+
throw toError(createError({
|
|
236
|
+
type: "config",
|
|
237
|
+
message: "Veryfront adapter content context resolution failed",
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
220
240
|
logger.debug("Content context resolved", {
|
|
221
|
-
sourceType:
|
|
222
|
-
projectSlug:
|
|
223
|
-
branch:
|
|
224
|
-
environmentName:
|
|
225
|
-
releaseId:
|
|
241
|
+
sourceType: contentContext.sourceType,
|
|
242
|
+
projectSlug: contentContext.projectSlug,
|
|
243
|
+
branch: contentContext.branch,
|
|
244
|
+
environmentName: contentContext.environmentName,
|
|
245
|
+
releaseId: contentContext.releaseId,
|
|
226
246
|
});
|
|
227
|
-
const cacheKey = buildFileListCacheKey(
|
|
247
|
+
const cacheKey = buildFileListCacheKey(contentContext);
|
|
228
248
|
logger.debug("Step 4: fetchFileList START", { projectSlug, cacheKey });
|
|
229
249
|
try {
|
|
230
|
-
const files = await fetchFileListForContext(this.client,
|
|
250
|
+
const files = await fetchFileListForContext(this.client, contentContext);
|
|
231
251
|
const fileSummary = summarizeFileList(files);
|
|
232
252
|
await this.cache.setAsync(cacheKey, files);
|
|
233
253
|
this.fileListReadyResolve?.();
|
|
@@ -253,11 +273,11 @@ export class VeryfrontFSAdapter {
|
|
|
253
273
|
fileCount: files.length,
|
|
254
274
|
totalDuration: `${(performance.now() - initStartTime).toFixed(2)}ms`,
|
|
255
275
|
});
|
|
256
|
-
if (
|
|
276
|
+
if (contentContext.sourceType === "branch") {
|
|
257
277
|
logger.debug("Initialized (branch mode)", {
|
|
258
278
|
projectId: this.client.getProjectId(),
|
|
259
279
|
files: files.length,
|
|
260
|
-
branch:
|
|
280
|
+
branch: contentContext.branch,
|
|
261
281
|
proxyMode: this.proxyMode,
|
|
262
282
|
});
|
|
263
283
|
this.wsManager.connect(projectId);
|
|
@@ -266,13 +286,13 @@ export class VeryfrontFSAdapter {
|
|
|
266
286
|
logger.debug("Initialized (published mode)", {
|
|
267
287
|
projectId: this.client.getProjectId(),
|
|
268
288
|
files: files.length,
|
|
269
|
-
sourceType:
|
|
270
|
-
environmentName:
|
|
271
|
-
releaseId:
|
|
289
|
+
sourceType: contentContext.sourceType,
|
|
290
|
+
environmentName: contentContext.environmentName,
|
|
291
|
+
releaseId: contentContext.releaseId,
|
|
272
292
|
});
|
|
273
293
|
// Keep a WebSocket connection in environment mode to receive deployment pokes.
|
|
274
294
|
// Release mode is immutable, so no need to keep a live connection.
|
|
275
|
-
if (
|
|
295
|
+
if (contentContext.sourceType === "environment") {
|
|
276
296
|
this.wsManager.connect(projectId);
|
|
277
297
|
}
|
|
278
298
|
}
|
|
@@ -475,14 +495,14 @@ export class VeryfrontFSAdapter {
|
|
|
475
495
|
}
|
|
476
496
|
setRequestBranch(branch) {
|
|
477
497
|
this.requestBranch = branch;
|
|
478
|
-
this.
|
|
498
|
+
this.syncClientContext();
|
|
479
499
|
}
|
|
480
500
|
getRequestBranch() {
|
|
481
501
|
return this.requestBranch;
|
|
482
502
|
}
|
|
483
503
|
clearRequestBranch() {
|
|
484
504
|
this.requestBranch = null;
|
|
485
|
-
this.
|
|
505
|
+
this.syncClientContext();
|
|
486
506
|
}
|
|
487
507
|
setContentContext(context) {
|
|
488
508
|
const oldContext = this.contentContext;
|
|
@@ -513,7 +533,7 @@ export class VeryfrontFSAdapter {
|
|
|
513
533
|
registerManifestFetcherForRelease(nextReleaseId, buildManifestFetcher(this.client));
|
|
514
534
|
}
|
|
515
535
|
this.contentContext = context;
|
|
516
|
-
this.
|
|
536
|
+
this.syncClientContext();
|
|
517
537
|
if (contextChanged) {
|
|
518
538
|
this.statOps.clearIndex();
|
|
519
539
|
this.dirOps.clearTree();
|
|
@@ -44,6 +44,11 @@ export interface ReleaseAssetBuildInput {
|
|
|
44
44
|
* Injectable for tests.
|
|
45
45
|
*/
|
|
46
46
|
transform?: ReleaseAssetTransform;
|
|
47
|
+
/**
|
|
48
|
+
* Optional HTTP dependency vendor. Defaults to the existing HTTP module cache
|
|
49
|
+
* and is injectable so tests do not depend on live package CDN behavior.
|
|
50
|
+
*/
|
|
51
|
+
vendorHttpImports?: ReleaseAssetHttpDependencyVendor;
|
|
47
52
|
}
|
|
48
53
|
export type ReleaseAssetTransform = (source: string, sourceFile: string, projectDir: string, adapter: any, options: {
|
|
49
54
|
projectId: string;
|
|
@@ -51,6 +56,24 @@ export type ReleaseAssetTransform = (source: string, sourceFile: string, project
|
|
|
51
56
|
ssr: boolean;
|
|
52
57
|
reactVersion?: string;
|
|
53
58
|
}) => Promise<string>;
|
|
59
|
+
export interface ReleaseAssetVendorDependency {
|
|
60
|
+
/** Specifier currently used by transformed code after vendoring. */
|
|
61
|
+
specifier: string;
|
|
62
|
+
/** Stable manifest key, normally the original HTTP source URL. */
|
|
63
|
+
manifestKey: string;
|
|
64
|
+
/** Absolute local cache path when the dependency came from disk. */
|
|
65
|
+
sourcePath?: string;
|
|
66
|
+
/** Browser ESM source for this dependency. */
|
|
67
|
+
code: string;
|
|
68
|
+
}
|
|
69
|
+
export interface ReleaseAssetVendorResult {
|
|
70
|
+
code: string;
|
|
71
|
+
dependencies: ReleaseAssetVendorDependency[];
|
|
72
|
+
}
|
|
73
|
+
export type ReleaseAssetHttpDependencyVendor = (code: string, options: {
|
|
74
|
+
tempDir: string;
|
|
75
|
+
reactVersion?: string;
|
|
76
|
+
}) => Promise<ReleaseAssetVendorResult>;
|
|
54
77
|
/** Subset of the API client used by the builder (eases testing). */
|
|
55
78
|
export interface ReleaseAssetBuildClient {
|
|
56
79
|
beginReleaseAssetManifestBuild(version: string): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-executor.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/build-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"build-executor.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/build-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,9 +17,11 @@
|
|
|
17
17
|
import { serverLogger } from "../utils/index.js";
|
|
18
18
|
import { VERSION } from "../utils/version.js";
|
|
19
19
|
import { createFileSystem } from "../platform/compat/fs.js";
|
|
20
|
-
import { dirname, join } from "../platform/compat/path/index.js";
|
|
20
|
+
import { dirname, join, normalize } from "../platform/compat/path/index.js";
|
|
21
21
|
import { resolveFrameworkSourcePath } from "../platform/compat/framework-source-resolver.js";
|
|
22
22
|
import { transformToESM } from "../transforms/esm-transform.js";
|
|
23
|
+
import { cacheHttpImportsToLocal } from "../transforms/esm/http-cache.js";
|
|
24
|
+
import { extractSourceUrl } from "../transforms/esm/source-url-embed.js";
|
|
23
25
|
import { parseImports, replaceSpecifiers } from "../transforms/esm/lexer.js";
|
|
24
26
|
import { PLATFORM_UTILITIES } from "../html/utils.js";
|
|
25
27
|
import { extractCandidatesFromFiles } from "../html/styles-builder/candidate-extractor.js";
|
|
@@ -191,6 +193,9 @@ async function collectProjectModuleImports(code, logicalPath, knownPaths) {
|
|
|
191
193
|
}
|
|
192
194
|
async function rewriteProjectModuleImports(code, logicalPath, moduleAssets, knownPaths, dependencyUrls) {
|
|
193
195
|
function rewriteSpecifier(specifier) {
|
|
196
|
+
const dependencyUrl = dependencyUrls.get(specifier.replace(/[?#].*$/, ""));
|
|
197
|
+
if (dependencyUrl)
|
|
198
|
+
return dependencyUrl;
|
|
194
199
|
if (specifier.startsWith("/_vf_modules/")) {
|
|
195
200
|
const dependencyUrl = dependencyUrls.get(specifier.replace(/[?#].*$/, ""));
|
|
196
201
|
if (dependencyUrl)
|
|
@@ -202,11 +207,210 @@ async function rewriteProjectModuleImports(code, logicalPath, moduleAssets, know
|
|
|
202
207
|
}
|
|
203
208
|
return await replaceSpecifiers(code, (specifier) => rewriteSpecifier(specifier));
|
|
204
209
|
}
|
|
205
|
-
function buildDependencyUrlMap(
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
+
function buildDependencyUrlMap(dependencies, dependencyModules) {
|
|
211
|
+
const urls = new Map();
|
|
212
|
+
for (const [manifestKey, entry] of Object.entries(dependencies)) {
|
|
213
|
+
const dependency = dependencyModules?.get(manifestKey);
|
|
214
|
+
if (!dependency)
|
|
215
|
+
continue;
|
|
216
|
+
const url = releaseAssetUrl(entry.contentHash, "js");
|
|
217
|
+
urls.set(manifestKey, url);
|
|
218
|
+
urls.set(entry.logicalPath, url);
|
|
219
|
+
for (const specifier of dependency.specifiers) {
|
|
220
|
+
urls.set(normalizeDependencySpecifier(specifier), url);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return urls;
|
|
224
|
+
}
|
|
225
|
+
function addDependencyModule(dependencies, dependency) {
|
|
226
|
+
const sourcePath = dependency.sourcePath ?? resolveLocalDependencyPath(dependency.specifier) ??
|
|
227
|
+
undefined;
|
|
228
|
+
const existing = dependencies.get(dependency.manifestKey);
|
|
229
|
+
if (existing) {
|
|
230
|
+
existing.specifiers.add(dependency.specifier);
|
|
231
|
+
existing.sourcePath ??= sourcePath;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
dependencies.set(dependency.manifestKey, {
|
|
235
|
+
manifestKey: dependency.manifestKey,
|
|
236
|
+
specifiers: new Set([dependency.specifier]),
|
|
237
|
+
sourcePath,
|
|
238
|
+
code: dependency.code,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function normalizeDependencySpecifier(specifier) {
|
|
242
|
+
return specifier.replace(/[?#].*$/, "");
|
|
243
|
+
}
|
|
244
|
+
function resolveLocalDependencyPath(specifier, parentFilePath) {
|
|
245
|
+
const normalized = normalizeDependencySpecifier(specifier);
|
|
246
|
+
if (normalized.startsWith("file://")) {
|
|
247
|
+
try {
|
|
248
|
+
return normalize(decodeURIComponent(new URL(normalized).pathname));
|
|
249
|
+
}
|
|
250
|
+
catch (_) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (!parentFilePath || (!normalized.startsWith("./") && !normalized.startsWith("../"))) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
return normalize(join(dirname(parentFilePath), normalized));
|
|
258
|
+
}
|
|
259
|
+
function isPathInsideRoot(filePath, rootPath) {
|
|
260
|
+
const file = normalize(filePath);
|
|
261
|
+
const root = normalize(rootPath);
|
|
262
|
+
return file === root || file.startsWith(`${root}/`) || file.startsWith(`${root}\\`);
|
|
263
|
+
}
|
|
264
|
+
async function collectLocalHttpDependencyModules(code, dependencies, cacheDir) {
|
|
265
|
+
const fs = createFileSystem();
|
|
266
|
+
const cacheRoot = normalize(cacheDir);
|
|
267
|
+
const seen = new Set();
|
|
268
|
+
const queue = [];
|
|
269
|
+
for (const imp of await parseImports(code)) {
|
|
270
|
+
if (imp.n)
|
|
271
|
+
queue.push({ specifier: imp.n });
|
|
272
|
+
}
|
|
273
|
+
while (queue.length > 0) {
|
|
274
|
+
const { specifier, parentFilePath } = queue.shift();
|
|
275
|
+
const filePath = resolveLocalDependencyPath(specifier, parentFilePath);
|
|
276
|
+
if (!filePath || seen.has(filePath))
|
|
277
|
+
continue;
|
|
278
|
+
if (!isPathInsideRoot(filePath, cacheRoot)) {
|
|
279
|
+
throw new Error(`Vendored HTTP dependency resolved outside cache root: ${specifier}`);
|
|
280
|
+
}
|
|
281
|
+
seen.add(filePath);
|
|
282
|
+
const depCode = await fs.readTextFile(filePath);
|
|
283
|
+
const manifestKey = extractSourceUrl(depCode) ?? `file://${filePath}`;
|
|
284
|
+
const depSpecifiers = new Set([
|
|
285
|
+
normalizeDependencySpecifier(specifier),
|
|
286
|
+
`file://${filePath}`,
|
|
287
|
+
]);
|
|
288
|
+
const existing = dependencies.get(manifestKey);
|
|
289
|
+
if (existing) {
|
|
290
|
+
for (const depSpecifier of depSpecifiers)
|
|
291
|
+
existing.specifiers.add(depSpecifier);
|
|
292
|
+
existing.sourcePath ??= filePath;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
dependencies.set(manifestKey, {
|
|
296
|
+
manifestKey,
|
|
297
|
+
specifiers: depSpecifiers,
|
|
298
|
+
sourcePath: filePath,
|
|
299
|
+
code: depCode,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
for (const imp of await parseImports(depCode)) {
|
|
303
|
+
if (imp.n)
|
|
304
|
+
queue.push({ specifier: imp.n, parentFilePath: filePath });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async function vendorHttpImportsWithCache(code, options) {
|
|
309
|
+
const imports = await parseImports(code);
|
|
310
|
+
if (!imports.some((imp) => imp.n &&
|
|
311
|
+
(imp.n.startsWith("http://") || imp.n.startsWith("https://") || imp.n.startsWith("npm:")))) {
|
|
312
|
+
return { code, dependencies: [] };
|
|
313
|
+
}
|
|
314
|
+
const cacheDir = join(options.tempDir, ".veryfront-http-bundle");
|
|
315
|
+
const result = await cacheHttpImportsToLocal(code, {
|
|
316
|
+
cacheDir,
|
|
317
|
+
importMap: { imports: {}, scopes: {} },
|
|
318
|
+
reactVersion: options.reactVersion,
|
|
319
|
+
});
|
|
320
|
+
const dependencies = new Map();
|
|
321
|
+
await collectLocalHttpDependencyModules(result.code, dependencies, cacheDir);
|
|
322
|
+
return {
|
|
323
|
+
code: result.code,
|
|
324
|
+
dependencies: [...dependencies.values()].flatMap((dependency) => [...dependency.specifiers].map((specifier) => ({
|
|
325
|
+
specifier,
|
|
326
|
+
manifestKey: dependency.manifestKey,
|
|
327
|
+
sourcePath: dependency.sourcePath,
|
|
328
|
+
code: dependency.code,
|
|
329
|
+
}))),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
async function finalizeDependencyModules(dependencyModules, uploadQueue, pendingBytes) {
|
|
333
|
+
const bySpecifier = new Map();
|
|
334
|
+
const byFilePath = new Map();
|
|
335
|
+
for (const dependency of dependencyModules.values()) {
|
|
336
|
+
for (const specifier of dependency.specifiers) {
|
|
337
|
+
bySpecifier.set(normalizeDependencySpecifier(specifier), dependency);
|
|
338
|
+
const filePath = resolveLocalDependencyPath(specifier);
|
|
339
|
+
if (filePath)
|
|
340
|
+
byFilePath.set(filePath, dependency);
|
|
341
|
+
}
|
|
342
|
+
if (dependency.sourcePath)
|
|
343
|
+
byFilePath.set(dependency.sourcePath, dependency);
|
|
344
|
+
}
|
|
345
|
+
const finalized = new Map();
|
|
346
|
+
const visiting = [];
|
|
347
|
+
function resolveDependencyImport(specifier, parent) {
|
|
348
|
+
const filePath = resolveLocalDependencyPath(specifier, parent.sourcePath);
|
|
349
|
+
if (filePath) {
|
|
350
|
+
const localDependency = byFilePath.get(filePath);
|
|
351
|
+
if (localDependency)
|
|
352
|
+
return localDependency;
|
|
353
|
+
}
|
|
354
|
+
return bySpecifier.get(normalizeDependencySpecifier(specifier)) ?? null;
|
|
355
|
+
}
|
|
356
|
+
async function finalize(manifestKey) {
|
|
357
|
+
const existing = finalized.get(manifestKey);
|
|
358
|
+
if (existing)
|
|
359
|
+
return existing;
|
|
360
|
+
if (visiting.includes(manifestKey)) {
|
|
361
|
+
const cycle = [...visiting.slice(visiting.indexOf(manifestKey)), manifestKey].join(" -> ");
|
|
362
|
+
throw new Error(`Circular release asset dependency graph: ${cycle}`);
|
|
363
|
+
}
|
|
364
|
+
const dependency = dependencyModules.get(manifestKey);
|
|
365
|
+
if (!dependency)
|
|
366
|
+
return null;
|
|
367
|
+
visiting.push(manifestKey);
|
|
368
|
+
try {
|
|
369
|
+
const imports = await parseImports(dependency.code);
|
|
370
|
+
for (const imp of imports) {
|
|
371
|
+
if (!imp.n)
|
|
372
|
+
continue;
|
|
373
|
+
const filePath = resolveLocalDependencyPath(imp.n, dependency.sourcePath);
|
|
374
|
+
if (filePath && !byFilePath.has(filePath)) {
|
|
375
|
+
throw new Error(`Unresolved vendored file dependency: ${imp.n}`);
|
|
376
|
+
}
|
|
377
|
+
const child = resolveDependencyImport(imp.n, dependency);
|
|
378
|
+
if (!child)
|
|
379
|
+
continue;
|
|
380
|
+
if (child.manifestKey === manifestKey) {
|
|
381
|
+
throw new Error(`Circular release asset dependency graph: ${manifestKey} -> ${manifestKey}`);
|
|
382
|
+
}
|
|
383
|
+
await finalize(child.manifestKey);
|
|
384
|
+
}
|
|
385
|
+
const rewritten = await replaceSpecifiers(dependency.code, (specifier) => {
|
|
386
|
+
const child = resolveDependencyImport(specifier, dependency);
|
|
387
|
+
if (!child)
|
|
388
|
+
return null;
|
|
389
|
+
const asset = finalized.get(child.manifestKey);
|
|
390
|
+
return asset ? releaseAssetUrl(asset.contentHash, "js") : null;
|
|
391
|
+
});
|
|
392
|
+
const entry = await addPreparedJavaScriptAsset(`__dependencies__/${manifestKey}`, rewritten, uploadQueue, pendingBytes);
|
|
393
|
+
if (!entry) {
|
|
394
|
+
throw new Error(`Vendored dependency exceeds release asset size limit: ${manifestKey}`);
|
|
395
|
+
}
|
|
396
|
+
for (const specifier of dependency.specifiers) {
|
|
397
|
+
bySpecifier.set(normalizeDependencySpecifier(specifier), dependency);
|
|
398
|
+
}
|
|
399
|
+
finalized.set(manifestKey, entry);
|
|
400
|
+
return entry;
|
|
401
|
+
}
|
|
402
|
+
finally {
|
|
403
|
+
visiting.pop();
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
for (const manifestKey of dependencyModules.keys())
|
|
408
|
+
await finalize(manifestKey);
|
|
409
|
+
}
|
|
410
|
+
finally {
|
|
411
|
+
visiting.length = 0;
|
|
412
|
+
}
|
|
413
|
+
return Object.fromEntries(finalized);
|
|
210
414
|
}
|
|
211
415
|
async function finalizeProjectModules(transformedModules, knownPaths, dependencyUrls, uploadQueue, pendingBytes, gaps) {
|
|
212
416
|
const finalized = new Map();
|
|
@@ -446,11 +650,13 @@ async function runBuildInner(input, tempDir, client, transform) {
|
|
|
446
650
|
// 3 + 4. Collect the browser module closure and transform each module
|
|
447
651
|
// through the SAME pipeline serveModule uses (browser, non-SSR).
|
|
448
652
|
const transformedModules = new Map();
|
|
653
|
+
const dependencyModules = new Map();
|
|
449
654
|
const gaps = [];
|
|
450
655
|
const uploadQueue = [];
|
|
451
656
|
// Bytes are held per-hash only until uploaded, then dropped (M3).
|
|
452
657
|
const pendingBytes = new Map();
|
|
453
658
|
const knownPaths = new Set(sourceByPath.keys());
|
|
659
|
+
const vendorHttpImports = input.vendorHttpImports ?? vendorHttpImportsWithCache;
|
|
454
660
|
for (const [logicalPath, source] of sourceByPath) {
|
|
455
661
|
if (!isBrowserModule(logicalPath))
|
|
456
662
|
continue;
|
|
@@ -484,10 +690,58 @@ async function runBuildInner(input, tempDir, client, transform) {
|
|
|
484
690
|
error: sanitized,
|
|
485
691
|
};
|
|
486
692
|
}
|
|
693
|
+
try {
|
|
694
|
+
const vendored = await vendorHttpImports(code, {
|
|
695
|
+
tempDir,
|
|
696
|
+
reactVersion: input.reactVersion,
|
|
697
|
+
});
|
|
698
|
+
code = vendored.code;
|
|
699
|
+
for (const dependency of vendored.dependencies) {
|
|
700
|
+
addDependencyModule(dependencyModules, dependency);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
catch (error) {
|
|
704
|
+
const sanitized = sanitizeError(error);
|
|
705
|
+
logger.warn("HTTP dependency vendoring failed during release asset build", {
|
|
706
|
+
path: logicalPath,
|
|
707
|
+
error: sanitized,
|
|
708
|
+
});
|
|
709
|
+
await client.reportReleaseAssetManifestState(input.releaseVersionRef, "failed", sanitized);
|
|
710
|
+
return {
|
|
711
|
+
success: false,
|
|
712
|
+
state: "failed",
|
|
713
|
+
moduleCount: 0,
|
|
714
|
+
cssCount: 0,
|
|
715
|
+
routeCount: 0,
|
|
716
|
+
gaps,
|
|
717
|
+
error: sanitized,
|
|
718
|
+
};
|
|
719
|
+
}
|
|
487
720
|
transformedModules.set(logicalPath, { logicalPath, code });
|
|
488
721
|
}
|
|
489
|
-
const
|
|
490
|
-
|
|
722
|
+
const frameworkDependencies = await buildFrameworkDependencies(input, tempDir, transform, uploadQueue, pendingBytes, gaps);
|
|
723
|
+
let httpDependencies;
|
|
724
|
+
try {
|
|
725
|
+
httpDependencies = await finalizeDependencyModules(dependencyModules, uploadQueue, pendingBytes);
|
|
726
|
+
}
|
|
727
|
+
catch (error) {
|
|
728
|
+
const sanitized = sanitizeError(error);
|
|
729
|
+
logger.warn("HTTP dependency finalization failed during release asset build", {
|
|
730
|
+
error: sanitized,
|
|
731
|
+
});
|
|
732
|
+
await client.reportReleaseAssetManifestState(input.releaseVersionRef, "failed", sanitized);
|
|
733
|
+
return {
|
|
734
|
+
success: false,
|
|
735
|
+
state: "failed",
|
|
736
|
+
moduleCount: 0,
|
|
737
|
+
cssCount: 0,
|
|
738
|
+
routeCount: 0,
|
|
739
|
+
gaps,
|
|
740
|
+
error: sanitized,
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
const dependencies = { ...frameworkDependencies, ...httpDependencies };
|
|
744
|
+
const dependencyUrls = buildDependencyUrlMap(dependencies, dependencyModules);
|
|
491
745
|
const { modules, skippedModules } = await finalizeProjectModules(transformedModules, knownPaths, dependencyUrls, uploadQueue, pendingBytes, gaps);
|
|
492
746
|
for (const logicalPath of transformedModules.keys()) {
|
|
493
747
|
if (modules[logicalPath])
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { LayoutItem } from "../../types/index.js";
|
|
2
2
|
export declare function extractRenderedCssHash(html: string): string | undefined;
|
|
3
|
+
export declare function hasRenderedReleaseAssetCss(html: string): boolean;
|
|
3
4
|
export declare function serializeLayouts(nestedLayouts: LayoutItem[], projectDir: string): Array<{
|
|
4
5
|
kind: LayoutItem["kind"];
|
|
5
6
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,UAAU,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUnD;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQzC"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { extractRelativePath as extractRelativePathShared } from "../../utils/route-path-utils.js";
|
|
2
2
|
const RENDERED_CSS_HASH_RE = /href="\/_vf\/css\/([a-z0-9-]{1,16})\.css"/i;
|
|
3
|
+
const RENDERED_RELEASE_ASSET_CSS_RE = /href="\/_vf\/assets\/([a-f0-9]{64})\.css"/i;
|
|
3
4
|
export function extractRenderedCssHash(html) {
|
|
4
5
|
return html.match(RENDERED_CSS_HASH_RE)?.[1];
|
|
5
6
|
}
|
|
7
|
+
export function hasRenderedReleaseAssetCss(html) {
|
|
8
|
+
return RENDERED_RELEASE_ASSET_CSS_RE.test(html);
|
|
9
|
+
}
|
|
6
10
|
export function serializeLayouts(nestedLayouts, projectDir) {
|
|
7
11
|
return nestedLayouts
|
|
8
12
|
.filter((layout) => layout.componentPath || layout.path)
|
|
@@ -78,6 +78,7 @@ export declare class RenderPipeline {
|
|
|
78
78
|
private resolveAppPath;
|
|
79
79
|
private resolveProjectUpdatedAt;
|
|
80
80
|
private resolvePageDataCss;
|
|
81
|
+
private hasReadyReleaseCss;
|
|
81
82
|
private generatePageCssFromHtml;
|
|
82
83
|
/**
|
|
83
84
|
* Build a cache key that is safe for multi-tenant + query-param aware caching.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AA0BD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;YAIJ,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;IAiGjC,OAAO,CAAC,uBAAuB;IAkCzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA+P9E,+EAA+E;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAqFzE,kBAAkB;YA2ClB,cAAc;IAW5B,OAAO,CAAC,uBAAuB;YAYjB,kBAAkB;IA8EhC,OAAO,CAAC,kBAAkB;YAMZ,uBAAuB;IAmBrC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAetB"}
|
|
@@ -22,7 +22,7 @@ import { VeryfrontError } from "../../errors/index.js";
|
|
|
22
22
|
import { FILE_NOT_FOUND, RENDER_ERROR } from "../../errors/error-registry.js";
|
|
23
23
|
import { buildQueryAwareCacheKey } from "../../cache/keys.js";
|
|
24
24
|
import { extractRelativePath as extractRelativePathShared, extractRouteParams as extractRouteParamsShared, } from "../../utils/route-path-utils.js";
|
|
25
|
-
import { extractRenderedCssHash, serializeLayoutProps, serializeLayouts, } from "./pipeline-helpers.js";
|
|
25
|
+
import { extractRenderedCssHash, hasRenderedReleaseAssetCss, serializeLayoutProps, serializeLayouts, } from "./pipeline-helpers.js";
|
|
26
26
|
import { join } from "../../platform/compat/path/index.js";
|
|
27
27
|
import { isExtendedFSAdapter } from "../../platform/adapters/fs/wrapper.js";
|
|
28
28
|
import { DataFetcher } from "../../data/index.js";
|
|
@@ -32,6 +32,7 @@ import { LAYOUT_EXTENSIONS } from "../layouts/types.js";
|
|
|
32
32
|
import { withTimeout, withTimeoutThrow } from "../utils/stream-utils.js";
|
|
33
33
|
import { extractCandidates, generateTailwindCSS } from "../../html/styles-builder/index.js";
|
|
34
34
|
import { getCSSByHashAsync, regenerateCSSByHash, } from "../../html/styles-builder/tailwind-compiler.js";
|
|
35
|
+
import { getReadyManifestForRender } from "../../release-assets/manifest-cache.js";
|
|
35
36
|
import { createEsmCache, createModuleCache, loadModule } from "./module-loader/index.js";
|
|
36
37
|
import { getCSSImports, runWithCSSCollector, } from "../../modules/react-loader/css-import-collector.js";
|
|
37
38
|
// Extracted modules
|
|
@@ -410,7 +411,7 @@ export class RenderPipeline {
|
|
|
410
411
|
const providers = [];
|
|
411
412
|
const projectUpdatedAt = this.resolveProjectUpdatedAt();
|
|
412
413
|
const appPath = await this.resolveAppPath();
|
|
413
|
-
const { css, cssError } = await this.resolvePageDataCss(slug, options, projectUpdatedAt);
|
|
414
|
+
const { css, cssAction, cssError } = await this.resolvePageDataCss(slug, options, projectUpdatedAt);
|
|
414
415
|
resolvePageDataLog.debug("Resolved page data", {
|
|
415
416
|
slug,
|
|
416
417
|
pagePath,
|
|
@@ -419,6 +420,7 @@ export class RenderPipeline {
|
|
|
419
420
|
appPath,
|
|
420
421
|
headingsCount: headings.length,
|
|
421
422
|
hasCss: !!css,
|
|
423
|
+
cssAction,
|
|
422
424
|
hasCssError: !!cssError,
|
|
423
425
|
});
|
|
424
426
|
return {
|
|
@@ -435,6 +437,7 @@ export class RenderPipeline {
|
|
|
435
437
|
appPath,
|
|
436
438
|
headings,
|
|
437
439
|
css,
|
|
440
|
+
cssAction,
|
|
438
441
|
cssError,
|
|
439
442
|
};
|
|
440
443
|
}
|
|
@@ -484,11 +487,14 @@ export class RenderPipeline {
|
|
|
484
487
|
return wrappedAdapter.getProjectData?.()?.updated_at;
|
|
485
488
|
}
|
|
486
489
|
async resolvePageDataCss(slug, options, projectUpdatedAt) {
|
|
490
|
+
if (this.hasReadyReleaseCss(options)) {
|
|
491
|
+
return { css: undefined, cssAction: "clear", cssError: undefined };
|
|
492
|
+
}
|
|
487
493
|
const cssCacheKey = getPageCssCacheKey(options?.projectId, options?.environment, slug, projectUpdatedAt);
|
|
488
494
|
const cachedCss = getCachedPageCss(cssCacheKey);
|
|
489
495
|
if (cachedCss) {
|
|
490
496
|
resolvePageDataLog.debug("CSS cache hit", { slug, cssLength: cachedCss.length });
|
|
491
|
-
return { css: cachedCss, cssError: undefined };
|
|
497
|
+
return { css: cachedCss, cssAction: undefined, cssError: undefined };
|
|
492
498
|
}
|
|
493
499
|
try {
|
|
494
500
|
const renderResult = await withTimeout(this.renderPage(slug, {
|
|
@@ -498,8 +504,9 @@ export class RenderPipeline {
|
|
|
498
504
|
skipCachePersist: true,
|
|
499
505
|
}), CSS_SSR_TIMEOUT_MS, `CSS SSR for ${slug}`);
|
|
500
506
|
if (!renderResult?.html) {
|
|
501
|
-
return { css: undefined, cssError: undefined };
|
|
507
|
+
return { css: undefined, cssAction: undefined, cssError: undefined };
|
|
502
508
|
}
|
|
509
|
+
let cssAction;
|
|
503
510
|
let css = await this.resolveCssFromRenderedHtml(renderResult.html, options?.projectSlug ?? options?.projectId);
|
|
504
511
|
if (css) {
|
|
505
512
|
resolvePageDataLog.debug("Reused SSR CSS for page data", {
|
|
@@ -508,12 +515,18 @@ export class RenderPipeline {
|
|
|
508
515
|
source: "rendered-html-hash",
|
|
509
516
|
});
|
|
510
517
|
}
|
|
518
|
+
else if (hasRenderedReleaseAssetCss(renderResult.html)) {
|
|
519
|
+
cssAction = "clear";
|
|
520
|
+
resolvePageDataLog.debug("Skipped SPA CSS fallback; rendered HTML uses release CSS asset", {
|
|
521
|
+
slug,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
511
524
|
else {
|
|
512
525
|
css = await this.generatePageCssFromHtml(slug, renderResult.html, options);
|
|
513
526
|
}
|
|
514
527
|
if (css)
|
|
515
528
|
cachePageCss(cssCacheKey, css);
|
|
516
|
-
return { css, cssError: undefined };
|
|
529
|
+
return { css, cssAction, cssError: undefined };
|
|
517
530
|
}
|
|
518
531
|
catch (error) {
|
|
519
532
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -526,10 +539,17 @@ export class RenderPipeline {
|
|
|
526
539
|
});
|
|
527
540
|
return {
|
|
528
541
|
css: undefined,
|
|
542
|
+
cssAction: undefined,
|
|
529
543
|
cssError: `CSS generation failed: ${errorMessage}`,
|
|
530
544
|
};
|
|
531
545
|
}
|
|
532
546
|
}
|
|
547
|
+
hasReadyReleaseCss(options) {
|
|
548
|
+
if (options?.environment !== "production")
|
|
549
|
+
return false;
|
|
550
|
+
const releaseManifest = getReadyManifestForRender(options?.releaseId);
|
|
551
|
+
return (releaseManifest?.css?.length ?? 0) > 0;
|
|
552
|
+
}
|
|
533
553
|
async generatePageCssFromHtml(slug, html, options) {
|
|
534
554
|
const candidates = extractCandidates(html);
|
|
535
555
|
const generatedCss = (await generateTailwindCSS(undefined, candidates, {
|
|
@@ -86,6 +86,8 @@ export interface PageDataResponse {
|
|
|
86
86
|
}>;
|
|
87
87
|
/** JIT-compiled Tailwind CSS for this page (for SPA navigation in prod mode) */
|
|
88
88
|
css?: string;
|
|
89
|
+
/** Client action for the SPA CSS tag when no route CSS payload is sent. */
|
|
90
|
+
cssAction?: "clear";
|
|
89
91
|
/**
|
|
90
92
|
* Error message if CSS generation failed.
|
|
91
93
|
* When set, the css field will be undefined and clients should fall back
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"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"}
|