veryfront 0.1.92 → 0.1.94
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/esm/cli/commands/styles/command-help.d.ts +3 -0
- package/esm/cli/commands/styles/command-help.d.ts.map +1 -0
- package/esm/cli/commands/styles/command-help.js +19 -0
- package/esm/cli/commands/styles/command.d.ts +3 -0
- package/esm/cli/commands/styles/command.d.ts.map +1 -0
- package/esm/cli/commands/styles/command.js +198 -0
- package/esm/cli/commands/styles/handler.d.ts +24 -0
- package/esm/cli/commands/styles/handler.d.ts.map +1 -0
- package/esm/cli/commands/styles/handler.js +17 -0
- package/esm/cli/help/command-definitions.d.ts.map +1 -1
- package/esm/cli/help/command-definitions.js +2 -0
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +2 -0
- package/esm/deno.d.ts +1 -0
- package/esm/deno.js +2 -1
- package/esm/src/html/styles-builder/css-pregeneration.d.ts +9 -0
- package/esm/src/html/styles-builder/css-pregeneration.d.ts.map +1 -1
- package/esm/src/html/styles-builder/css-pregeneration.js +26 -15
- package/esm/src/jobs/schemas.d.ts +40 -40
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +15 -3
- package/esm/src/platform/adapters/fs/veryfront/types.d.ts +2 -0
- package/esm/src/platform/adapters/fs/veryfront/types.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +5 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +10 -2
- package/esm/src/platform/adapters/veryfront-api-client/client.d.ts +2 -1
- package/esm/src/platform/adapters/veryfront-api-client/client.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/client.js +3 -0
- package/esm/src/platform/adapters/veryfront-api-client/index.d.ts +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/index.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts +11 -2
- package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/operations.js +30 -0
- package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.d.ts +14 -3
- package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.js +8 -1
- package/esm/src/rendering/styles.d.ts +9 -0
- package/esm/src/rendering/styles.d.ts.map +1 -0
- package/esm/src/rendering/styles.js +8 -0
- package/esm/src/sandbox/index.d.ts +1 -1
- package/esm/src/sandbox/index.d.ts.map +1 -1
- package/esm/src/sandbox/sandbox.d.ts +14 -3
- package/esm/src/sandbox/sandbox.d.ts.map +1 -1
- package/esm/src/sandbox/sandbox.js +20 -6
- package/esm/src/security/http/base-handler.d.ts.map +1 -1
- package/esm/src/security/http/base-handler.js +5 -2
- package/esm/src/server/context/request-context.d.ts.map +1 -1
- package/esm/src/server/context/request-context.js +4 -2
- package/esm/src/server/handlers/dev/scripts/hmr-scripts.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/scripts/hmr-scripts.js +91 -4
- package/esm/src/server/handlers/dev/styles-css.handler.d.ts +2 -0
- package/esm/src/server/handlers/dev/styles-css.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/styles-css.handler.js +23 -0
- package/esm/src/server/handlers/preview/hmr-message-router.d.ts +2 -1
- package/esm/src/server/handlers/preview/hmr-message-router.d.ts.map +1 -1
- package/esm/src/server/handlers/preview/hmr-message-router.js +15 -5
- package/esm/src/server/handlers/preview/hmr.handler.js +1 -1
- package/esm/src/server/handlers/preview/markdown-preview.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/preview/markdown-preview.handler.js +4 -2
- package/esm/src/server/handlers/request/css.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/css.handler.js +4 -2
- package/esm/src/server/handlers/request/ssr/ssr.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/ssr/ssr.handler.js +4 -2
- package/esm/src/server/reload-notifier.d.ts +3 -1
- package/esm/src/server/reload-notifier.d.ts.map +1 -1
- package/esm/src/utils/version.d.ts +1 -1
- package/esm/src/utils/version.js +1 -1
- package/package.json +1 -1
- package/src/cli/commands/styles/command-help.ts +21 -0
- package/src/cli/commands/styles/command.ts +296 -0
- package/src/cli/commands/styles/handler.ts +23 -0
- package/src/cli/help/command-definitions.ts +2 -0
- package/src/cli/router.ts +2 -0
- package/src/deno.js +2 -1
- package/src/src/html/styles-builder/css-pregeneration.ts +57 -29
- package/src/src/platform/adapters/fs/veryfront/adapter.ts +18 -4
- package/src/src/platform/adapters/fs/veryfront/types.ts +2 -0
- package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +18 -3
- package/src/src/platform/adapters/veryfront-api-client/client.ts +8 -0
- package/src/src/platform/adapters/veryfront-api-client/index.ts +1 -0
- package/src/src/platform/adapters/veryfront-api-client/operations.ts +48 -2
- package/src/src/platform/adapters/veryfront-api-client/schemas/api.schema.ts +9 -1
- package/src/src/rendering/styles.ts +15 -0
- package/src/src/sandbox/index.ts +1 -0
- package/src/src/sandbox/sandbox.ts +33 -6
- package/src/src/security/http/base-handler.ts +5 -2
- package/src/src/server/context/request-context.ts +4 -2
- package/src/src/server/handlers/dev/scripts/hmr-scripts.ts +93 -4
- package/src/src/server/handlers/dev/styles-css.handler.ts +31 -0
- package/src/src/server/handlers/preview/hmr-message-router.ts +15 -5
- package/src/src/server/handlers/preview/hmr.handler.ts +1 -1
- package/src/src/server/handlers/preview/markdown-preview.handler.ts +4 -2
- package/src/src/server/handlers/request/css.handler.ts +4 -2
- package/src/src/server/handlers/request/ssr/ssr.handler.ts +4 -2
- package/src/src/server/reload-notifier.ts +3 -1
- package/src/src/utils/version.ts +1 -1
|
@@ -132,11 +132,11 @@ export class Sandbox {
|
|
|
132
132
|
throw TIMEOUT_ERROR.create({ detail: "Sandbox did not become ready within timeout" });
|
|
133
133
|
}
|
|
134
134
|
/** Execute a bash command in the sandbox and return buffered result. */
|
|
135
|
-
async executeCommand(command) {
|
|
135
|
+
async executeCommand(command, options) {
|
|
136
136
|
let stdout = "";
|
|
137
137
|
let stderr = "";
|
|
138
138
|
let exitCode = 1;
|
|
139
|
-
for await (const event of this.executeStream(command)) {
|
|
139
|
+
for await (const event of this.executeStream(command, options)) {
|
|
140
140
|
switch (event.type) {
|
|
141
141
|
case "stdout":
|
|
142
142
|
stdout += event.data ?? "";
|
|
@@ -152,14 +152,14 @@ export class Sandbox {
|
|
|
152
152
|
return { stdout, stderr, exitCode };
|
|
153
153
|
}
|
|
154
154
|
/** Execute a bash command with streaming output (NDJSON). */
|
|
155
|
-
async *executeStream(command) {
|
|
155
|
+
async *executeStream(command, options) {
|
|
156
156
|
const res = await dntShim.fetch(`${this.endpoint}/exec`, {
|
|
157
157
|
method: "POST",
|
|
158
158
|
headers: {
|
|
159
159
|
Authorization: `Bearer ${this.authToken}`,
|
|
160
160
|
"Content-Type": "application/json",
|
|
161
161
|
},
|
|
162
|
-
body: JSON.stringify({ command }),
|
|
162
|
+
body: JSON.stringify({ command, ...options }),
|
|
163
163
|
});
|
|
164
164
|
if (!res.ok) {
|
|
165
165
|
throw REQUEST_ERROR.create({ detail: `Exec failed: ${res.status} ${await res.text()}` });
|
|
@@ -214,14 +214,14 @@ export class Sandbox {
|
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
/** Start an async command job in the sandbox. */
|
|
217
|
-
async startCommandJob(command) {
|
|
217
|
+
async startCommandJob(command, options) {
|
|
218
218
|
const res = await dntShim.fetch(`${this.endpoint}/exec/jobs`, {
|
|
219
219
|
method: "POST",
|
|
220
220
|
headers: {
|
|
221
221
|
Authorization: `Bearer ${this.authToken}`,
|
|
222
222
|
"Content-Type": "application/json",
|
|
223
223
|
},
|
|
224
|
-
body: JSON.stringify({ command }),
|
|
224
|
+
body: JSON.stringify({ command, ...options }),
|
|
225
225
|
});
|
|
226
226
|
if (!res.ok) {
|
|
227
227
|
throw REQUEST_ERROR.create({
|
|
@@ -261,6 +261,20 @@ export class Sandbox {
|
|
|
261
261
|
stderrTruncated: json.stderr_truncated,
|
|
262
262
|
};
|
|
263
263
|
}
|
|
264
|
+
/** List all command jobs in the sandbox. */
|
|
265
|
+
async listCommandJobs() {
|
|
266
|
+
const res = await dntShim.fetch(`${this.endpoint}/exec/jobs`, {
|
|
267
|
+
headers: { Authorization: `Bearer ${this.authToken}` },
|
|
268
|
+
});
|
|
269
|
+
if (!res.ok) {
|
|
270
|
+
throw REQUEST_ERROR.create({
|
|
271
|
+
detail: `List command jobs failed: ${res.status} ${await res.text()}`,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
const json = await res.json();
|
|
275
|
+
const jobs = Array.isArray(json) ? json : (json.jobs ?? []);
|
|
276
|
+
return jobs.map((j) => Sandbox.mapCommandJob(j));
|
|
277
|
+
}
|
|
264
278
|
/** Cancel an async command job. */
|
|
265
279
|
async cancelCommandJob(jobId) {
|
|
266
280
|
const res = await dntShim.fetch(`${this.endpoint}/exec/jobs/${jobId}/cancel`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/base-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,aAAa,EAEd,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/base-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,aAAa,EAEd,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,qBAAqB,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,eAAe,CAAC;IAChF,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,aAAa,CAAC;IAC3F,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3F,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,QAAQ,EAAE,MAAM,aAAa,CAAC;CAC/B;AAED,8BAAsB,WAAY,YAAW,OAAO;IAClD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAMxC;IAEF,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAElF,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO;IAY1E,OAAO,CAAC,cAAc;IAmBtB,SAAS,CAAC,qBAAqB,CAC7B,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,eAAe;IAWlB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,GAAG,IAAI;IAKhG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI;IAIhG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI;IAIhG,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAKjD,SAAS,CAAC,QAAQ,IAAI,aAAa;IAInC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAIhG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAC1B,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC,CAAC,CAAC;CA0Dd"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runWithCacheBatching } from "../../cache/request-cache-batcher.js";
|
|
2
|
+
import { getHostEnv } from "../../platform/compat/process.js";
|
|
2
3
|
import { serverLogger } from "../../utils/index.js";
|
|
3
4
|
import { ResponseBuilder } from "./response/index.js";
|
|
4
5
|
export class BaseHandler {
|
|
@@ -44,7 +45,7 @@ export class BaseHandler {
|
|
|
44
45
|
});
|
|
45
46
|
}
|
|
46
47
|
logDebug(message, extra, ctx) {
|
|
47
|
-
if (!ctx?.debug && !
|
|
48
|
+
if (!ctx?.debug && !getHostEnv("VERYFRONT_DEBUG"))
|
|
48
49
|
return;
|
|
49
50
|
serverLogger.debug(`[${this.metadata.name}] ${message}`, extra ?? undefined);
|
|
50
51
|
}
|
|
@@ -66,7 +67,9 @@ export class BaseHandler {
|
|
|
66
67
|
return { response, continue: false, metadata };
|
|
67
68
|
}
|
|
68
69
|
withProxyContext(ctx, fn, options = {}) {
|
|
69
|
-
|
|
70
|
+
// Framework-owned token: bypass project env overlay so proxy mode works
|
|
71
|
+
// when a remote project overlay is active.
|
|
72
|
+
const effectiveToken = ctx.proxyToken || getHostEnv("VERYFRONT_API_TOKEN") || "";
|
|
70
73
|
const fsWrapper = ctx.adapter.fs;
|
|
71
74
|
if (typeof fsWrapper.setRequestBranch === "function") {
|
|
72
75
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/src/server/context/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAIlD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,SAAS,GAAG,YAAY,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../src/src/server/context/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAIlD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,SAAS,GAAG,YAAY,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,cAAc,CA0BzE;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,cAAc,EACnB,cAAc,CAAC,EAAE,OAAO,GACvB,MAAM,GAAG,YAAY,GAAG,WAAW,CAIrC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAExF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAG/F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getHostEnv } from "../../platform/compat/process.js";
|
|
2
2
|
import { parseProjectDomain } from "../utils/domain-parser.js";
|
|
3
3
|
export function createRequestContext(req) {
|
|
4
4
|
const { hostname } = new URL(req.url);
|
|
@@ -15,7 +15,9 @@ export function createRequestContext(req) {
|
|
|
15
15
|
? "preview"
|
|
16
16
|
: "production";
|
|
17
17
|
return {
|
|
18
|
-
|
|
18
|
+
// Framework-owned token: bypass project env overlay so proxy mode works
|
|
19
|
+
// when a remote project overlay is active.
|
|
20
|
+
token: req.headers.get("x-token") ?? getHostEnv("VERYFRONT_API_TOKEN") ?? "",
|
|
19
21
|
slug: req.headers.get("x-project-slug") ?? parsed.slug ?? "",
|
|
20
22
|
branch: parsed.branch,
|
|
21
23
|
mode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmr-scripts.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/dev/scripts/hmr-scripts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"hmr-scripts.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/dev/scripts/hmr-scripts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4ZH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|
|
@@ -45,11 +45,92 @@ function getUpdateJSFunction(logPrefix) {
|
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
async function swapTailwindStylesheet(nextHref) {
|
|
49
|
+
const current = document.getElementById('vf-tailwind-css');
|
|
50
|
+
if (!(current instanceof HTMLLinkElement) || !nextHref || !current.parentNode) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const nextUrl = new URL(nextHref, window.location.origin).toString();
|
|
55
|
+
const currentHref = current.getAttribute('href');
|
|
56
|
+
const currentUrl = currentHref ? new URL(currentHref, window.location.href).toString() : '';
|
|
57
|
+
if (currentUrl === nextUrl) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const pending = current.cloneNode(false);
|
|
62
|
+
if (!(pending instanceof HTMLLinkElement)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
pending.removeAttribute('id');
|
|
67
|
+
pending.setAttribute('data-vf-tailwind-pending', 'true');
|
|
68
|
+
pending.href = nextHref;
|
|
69
|
+
|
|
70
|
+
await new Promise((resolve, reject) => {
|
|
71
|
+
const timeoutId = window.setTimeout(() => {
|
|
72
|
+
cleanup(new Error('stylesheet-timeout'));
|
|
73
|
+
}, 5000);
|
|
74
|
+
|
|
75
|
+
let settled = false;
|
|
76
|
+
|
|
77
|
+
function cleanup(error) {
|
|
78
|
+
if (settled) return;
|
|
79
|
+
settled = true;
|
|
80
|
+
window.clearTimeout(timeoutId);
|
|
81
|
+
pending.removeEventListener('load', onLoad);
|
|
82
|
+
pending.removeEventListener('error', onError);
|
|
83
|
+
|
|
84
|
+
if (error) {
|
|
85
|
+
pending.remove();
|
|
86
|
+
reject(error);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
pending.id = 'vf-tailwind-css';
|
|
91
|
+
current.remove();
|
|
92
|
+
resolve(true);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function onLoad() {
|
|
96
|
+
cleanup(null);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function onError() {
|
|
100
|
+
cleanup(new Error('stylesheet-load-failed'));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
pending.addEventListener('load', onLoad, { once: true });
|
|
104
|
+
pending.addEventListener('error', onError, { once: true });
|
|
105
|
+
current.parentNode.insertBefore(pending, current.nextSibling);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function applyStyleUpdate(changedPath, styleHref) {
|
|
112
|
+
if (styleHref) {
|
|
113
|
+
try {
|
|
114
|
+
const swapped = await swapTailwindStylesheet(styleHref);
|
|
115
|
+
if (swapped) {
|
|
116
|
+
${logPrefix === "[HMR]"
|
|
117
|
+
? `console.log('${logPrefix} Swapped stylesheet:', styleHref);`
|
|
118
|
+
: `dlog('${logPrefix} Swapped stylesheet:', styleHref);`}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.warn('${logPrefix} Failed to swap stylesheet:', error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return refreshStylesheets(changedPath) || refreshStylesheets();
|
|
127
|
+
}
|
|
128
|
+
|
|
48
129
|
function getRenderPath() {
|
|
49
130
|
return window.location.pathname + window.location.search + window.location.hash;
|
|
50
131
|
}
|
|
51
132
|
|
|
52
|
-
async function updateJS(path) {
|
|
133
|
+
async function updateJS(path, styleHref) {
|
|
53
134
|
${logPrefix === "[HMR]"
|
|
54
135
|
? `console.log('${logPrefix} Updating JS module:', path);`
|
|
55
136
|
: `dlog('${logPrefix} Updating JS module:', path);`}
|
|
@@ -69,7 +150,7 @@ function getUpdateJSFunction(logPrefix) {
|
|
|
69
150
|
}
|
|
70
151
|
|
|
71
152
|
// Refresh Tailwind CSS (new classes may be needed from JS changes)
|
|
72
|
-
|
|
153
|
+
await applyStyleUpdate(path, styleHref);
|
|
73
154
|
|
|
74
155
|
// Re-render the page with fresh modules
|
|
75
156
|
if (window.__veryfrontRenderPage) {
|
|
@@ -253,6 +334,7 @@ function generateHMRClient(opts) {
|
|
|
253
334
|
|
|
254
335
|
// Debounce updates to prevent flashing from rapid-fire changes
|
|
255
336
|
let pendingPaths = [];
|
|
337
|
+
let pendingStyleHref = null;
|
|
256
338
|
let updateDebounceTimer = null;
|
|
257
339
|
const UPDATE_DEBOUNCE_MS = 150;
|
|
258
340
|
|
|
@@ -264,7 +346,7 @@ function generateHMRClient(opts) {
|
|
|
264
346
|
|
|
265
347
|
// CSS changes: hot-swap stylesheet without full page reload
|
|
266
348
|
if (update.path.endsWith('.css')) {
|
|
267
|
-
const didRefresh =
|
|
349
|
+
const didRefresh = await applyStyleUpdate(update.path, update.styleHref);
|
|
268
350
|
if (!didRefresh) {
|
|
269
351
|
notifyStudioAndReload('css-update-no-stylesheet');
|
|
270
352
|
return;
|
|
@@ -275,12 +357,17 @@ function generateHMRClient(opts) {
|
|
|
275
357
|
|
|
276
358
|
// Debounce JS updates — batch rapid updates into single re-render
|
|
277
359
|
pendingPaths.push(update.path);
|
|
360
|
+
if (typeof update.styleHref === 'string') {
|
|
361
|
+
pendingStyleHref = update.styleHref;
|
|
362
|
+
}
|
|
278
363
|
|
|
279
364
|
if (updateDebounceTimer) clearTimeout(updateDebounceTimer);
|
|
280
365
|
|
|
281
366
|
updateDebounceTimer = setTimeout(async () => {
|
|
282
367
|
const paths = pendingPaths;
|
|
368
|
+
const styleHref = pendingStyleHref;
|
|
283
369
|
pendingPaths = [];
|
|
370
|
+
pendingStyleHref = null;
|
|
284
371
|
updateDebounceTimer = null;
|
|
285
372
|
|
|
286
373
|
if (paths.length > 1) {
|
|
@@ -288,7 +375,7 @@ function generateHMRClient(opts) {
|
|
|
288
375
|
}
|
|
289
376
|
|
|
290
377
|
// Single re-render handles all paths (server propagates timestamps to all imports)
|
|
291
|
-
if (paths.length > 0) await updateJS(paths[0]);
|
|
378
|
+
if (paths.length > 0) await updateJS(paths[0], styleHref);
|
|
292
379
|
}, UPDATE_DEBOUNCE_MS);
|
|
293
380
|
}
|
|
294
381
|
${getUpdateJSFunction(logPrefix)}
|
|
@@ -19,5 +19,7 @@ export declare class StylesCSSHandler extends BaseHandler {
|
|
|
19
19
|
private tryResolveRemotePreparedCSS;
|
|
20
20
|
private getPreparedCSSByHash;
|
|
21
21
|
private registerPreparedCSSArtifact;
|
|
22
|
+
private shouldEnsureRemoteStyleArtifactBuild;
|
|
23
|
+
private ensureRemotePreparedCSSBuild;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=styles-css.handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles-css.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/dev/styles-css.handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"styles-css.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/dev/styles-css.handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAgCnG,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,EAAE,eAAe,CAKvB;IAEI,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;YAiKjE,cAAc;IAkB5B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,wBAAwB;IA0BhC,OAAO,CAAC,4BAA4B;YA2CtB,2BAA2B;YAoD3B,oBAAoB;YASpB,2BAA2B;IA2BzC,OAAO,CAAC,oCAAoC;YAI9B,4BAA4B;CAsB3C"}
|
|
@@ -238,6 +238,9 @@ body::before {
|
|
|
238
238
|
styleProfileHash,
|
|
239
239
|
});
|
|
240
240
|
if (resolved.status !== "ready" || !resolved.artifactHash) {
|
|
241
|
+
if (resolved.status !== "building") {
|
|
242
|
+
await this.ensureRemotePreparedCSSBuild(client, selector, styleProfileHash);
|
|
243
|
+
}
|
|
241
244
|
return undefined;
|
|
242
245
|
}
|
|
243
246
|
const css = await this.getPreparedCSSByHash(resolved.artifactHash, projectScope);
|
|
@@ -291,4 +294,24 @@ body::before {
|
|
|
291
294
|
});
|
|
292
295
|
}
|
|
293
296
|
}
|
|
297
|
+
shouldEnsureRemoteStyleArtifactBuild(selector) {
|
|
298
|
+
return Boolean(selector.environmentName || selector.releaseId);
|
|
299
|
+
}
|
|
300
|
+
async ensureRemotePreparedCSSBuild(client, selector, styleProfileHash) {
|
|
301
|
+
if (!this.shouldEnsureRemoteStyleArtifactBuild(selector))
|
|
302
|
+
return;
|
|
303
|
+
try {
|
|
304
|
+
await client.ensureStyleArtifactBuild({
|
|
305
|
+
...selector,
|
|
306
|
+
styleProfileHash,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
logger.debug("Failed to ensure remote prepared CSS build", {
|
|
311
|
+
selector,
|
|
312
|
+
styleProfileHash,
|
|
313
|
+
error: error instanceof Error ? error.message : String(error),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
294
317
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ReloadProjectInfo } from "../../reload-notifier.js";
|
|
1
2
|
interface HMRMetrics {
|
|
2
3
|
broadcastsSent: number;
|
|
3
4
|
messagesForwarded: number;
|
|
@@ -10,7 +11,7 @@ export declare function getMetrics(): {
|
|
|
10
11
|
* Broadcast update to all connected HMR clients, optionally filtered by projectSlug.
|
|
11
12
|
* No server-side debounce here — ReloadNotifier already debounces (300ms).
|
|
12
13
|
*/
|
|
13
|
-
export declare function broadcastUpdate(changedPaths?: string[],
|
|
14
|
+
export declare function broadcastUpdate(changedPaths?: string[], project?: ReloadProjectInfo): void;
|
|
14
15
|
export declare function resetMetrics(): void;
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=hmr-message-router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmr-message-router.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/preview/hmr-message-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hmr-message-router.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/preview/hmr-message-router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKlE,UAAU,UAAU;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAQD,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAE7D;AAcD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CA2B1F;AAsBD,wBAAgB,YAAY,IAAI,IAAI,CAInC"}
|
|
@@ -9,6 +9,14 @@ const metrics = {
|
|
|
9
9
|
export function getMetrics() {
|
|
10
10
|
return { clients: getClientCount(), ...metrics };
|
|
11
11
|
}
|
|
12
|
+
function buildStyleUpdatePayload(project) {
|
|
13
|
+
const payload = {};
|
|
14
|
+
if (project?.styleAssetPath)
|
|
15
|
+
payload.styleHref = project.styleAssetPath;
|
|
16
|
+
if (project?.styleArtifactHash)
|
|
17
|
+
payload.styleHash = project.styleArtifactHash;
|
|
18
|
+
return payload;
|
|
19
|
+
}
|
|
12
20
|
function requiresFullReload(path) {
|
|
13
21
|
const ext = path.split(".").pop()?.toLowerCase();
|
|
14
22
|
return ext === "mdx" || ext === "md" || path.includes("veryfront.config");
|
|
@@ -17,11 +25,12 @@ function requiresFullReload(path) {
|
|
|
17
25
|
* Broadcast update to all connected HMR clients, optionally filtered by projectSlug.
|
|
18
26
|
* No server-side debounce here — ReloadNotifier already debounces (300ms).
|
|
19
27
|
*/
|
|
20
|
-
export function broadcastUpdate(changedPaths,
|
|
28
|
+
export function broadcastUpdate(changedPaths, project) {
|
|
21
29
|
logger.debug("broadcastUpdate called", {
|
|
22
30
|
changedPaths,
|
|
23
31
|
totalClients: getClientCount(),
|
|
24
|
-
projectSlug,
|
|
32
|
+
projectSlug: project?.projectSlug,
|
|
33
|
+
styleAssetPath: project?.styleAssetPath,
|
|
25
34
|
});
|
|
26
35
|
const timestamp = Date.now();
|
|
27
36
|
metrics.broadcastsSent++;
|
|
@@ -30,13 +39,14 @@ export function broadcastUpdate(changedPaths, projectSlug) {
|
|
|
30
39
|
changedPaths.some((path) => requiresFullReload(path));
|
|
31
40
|
if (needsFullReload) {
|
|
32
41
|
const message = JSON.stringify({ type: "reload", timestamp });
|
|
33
|
-
broadcastMessage(message, projectSlug);
|
|
42
|
+
broadcastMessage(message, project?.projectSlug);
|
|
34
43
|
metrics.messagesForwarded++;
|
|
35
44
|
}
|
|
36
45
|
else {
|
|
46
|
+
const stylePayload = buildStyleUpdatePayload(project);
|
|
37
47
|
for (const path of changedPaths) {
|
|
38
|
-
const message = JSON.stringify({ type: "update", path, timestamp });
|
|
39
|
-
broadcastMessage(message, projectSlug);
|
|
48
|
+
const message = JSON.stringify({ type: "update", path, timestamp, ...stylePayload });
|
|
49
|
+
broadcastMessage(message, project?.projectSlug);
|
|
40
50
|
metrics.messagesForwarded++;
|
|
41
51
|
}
|
|
42
52
|
}
|
|
@@ -48,7 +48,7 @@ export class HMRHandler extends BaseHandler {
|
|
|
48
48
|
});
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
|
-
broadcastUpdate(changedPaths, project
|
|
51
|
+
broadcastUpdate(changedPaths, project);
|
|
52
52
|
});
|
|
53
53
|
startPingInterval();
|
|
54
54
|
logger.debug("Initialized - listening for reload events", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-preview.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/preview/markdown-preview.handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAgBnG,qBAAa,sBAAuB,SAAQ,WAAW;IACrD,QAAQ,EAAE,eAAe,CAKvB;IAEI,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-preview.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/preview/markdown-preview.handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAgBnG,qBAAa,sBAAuB,SAAQ,WAAW;IACrD,QAAQ,EAAE,eAAe,CAKvB;IAEI,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;YAmEjE,cAAc;CAiF7B"}
|
|
@@ -4,7 +4,7 @@ import { HTTP_OK } from "../../../utils/constants/index.js";
|
|
|
4
4
|
import { compileMarkdownRuntime } from "../../../transforms/md/compiler/md-compiler.js";
|
|
5
5
|
import { extract } from "../../../platform/compat/std/front-matter-yaml.js";
|
|
6
6
|
import { isExtendedFSAdapter } from "../../../platform/adapters/fs/wrapper.js";
|
|
7
|
-
import {
|
|
7
|
+
import { getHostEnv } from "../../../platform/compat/process.js";
|
|
8
8
|
import { tryNotFoundFallback } from "../request/ssr/not-found-fallback.js";
|
|
9
9
|
import { generateMarkdownHtml } from "./markdown-html-generator.js";
|
|
10
10
|
import { validatePathSync } from "../../../security/index.js";
|
|
@@ -45,7 +45,9 @@ export class MarkdownPreviewHandler extends BaseHandler {
|
|
|
45
45
|
});
|
|
46
46
|
const hasMultiProjectSupport = isExtendedFSAdapter(fsAdapter) && fsAdapter.isMultiProjectMode();
|
|
47
47
|
if (ctx.projectSlug && hasMultiProjectSupport) {
|
|
48
|
-
|
|
48
|
+
// Framework-owned token: bypass project env overlay so proxy mode works
|
|
49
|
+
// when a remote project overlay is active.
|
|
50
|
+
const effectiveToken = ctx.proxyToken || getHostEnv("VERYFRONT_API_TOKEN") || "";
|
|
49
51
|
const branch = ctx.parsedDomain?.branch ?? null;
|
|
50
52
|
return await fsAdapter.runWithContext(ctx.projectSlug, effectiveToken, () => this.renderMarkdown(req, ctx, filePath, url), ctx.projectId, {
|
|
51
53
|
productionMode: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/css.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AA0BnG,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,EAAE,eAAe,CAOvB;IAEI,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"css.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/css.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AA0BnG,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,EAAE,eAAe,CAOvB;IAEI,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAoEhF"}
|
|
@@ -2,7 +2,7 @@ import { BaseHandler } from "../response/base.js";
|
|
|
2
2
|
import { getCSSByHashAsync, regenerateCSSByHash, } from "../../../html/styles-builder/tailwind-compiler.js";
|
|
3
3
|
import { HTTP_OK, PRIORITY_HIGH } from "../../../utils/constants/index.js";
|
|
4
4
|
import { extractCacheKeyContext, runWithCacheKeyContext, } from "../../../cache/cache-key-builder.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getHostEnv } from "../../../platform/compat/process.js";
|
|
6
6
|
import { runWithRequestContext } from "../../../platform/adapters/fs/veryfront/multi-project-adapter.js";
|
|
7
7
|
/** Pattern to match hashed CSS URLs: /_vf/css/[8-char-hash].css */
|
|
8
8
|
const CSS_URL_PATTERN = /^\/_vf\/css\/([a-z0-9-]{1,16})\.css$/;
|
|
@@ -34,7 +34,9 @@ export class CSSHandler extends BaseHandler {
|
|
|
34
34
|
// the distributed API cache backend can't authenticate and silently returns
|
|
35
35
|
// null — causing cross-pod cache misses. Wrap the lookup in request context
|
|
36
36
|
// so the API backend can resolve the token and project.
|
|
37
|
-
|
|
37
|
+
// Framework-owned token: bypass project env overlay so proxy mode works
|
|
38
|
+
// when a remote project overlay is active.
|
|
39
|
+
const effectiveToken = ctx.proxyToken || getHostEnv("VERYFRONT_API_TOKEN") || "";
|
|
38
40
|
const lookup = () => runWithCacheKeyContext(cacheCtx, () => getCSSWithJITFallback(cssHash, ctx.projectSlug ?? ctx.projectId));
|
|
39
41
|
const css = ctx.projectSlug
|
|
40
42
|
? await runWithRequestContext({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.handler.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/request/ssr/ssr.handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,aAAa,EACd,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,4CAA4C,CAAC;AAMpD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAKzE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,EAAE,eAAe,CAIvB;IAEF,OAAO,CAAC,UAAU,CAAiB;gBAEvB,UAAU,CAAC,EAAE,cAAc;IAKvC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BzE,OAAO,CAAC,qBAAqB;
|
|
1
|
+
{"version":3,"file":"ssr.handler.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/request/ssr/ssr.handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,aAAa,EACd,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,4CAA4C,CAAC;AAMpD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAKzE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,EAAE,eAAe,CAIvB;IAEF,OAAO,CAAC,UAAU,CAAiB;gBAEvB,UAAU,CAAC,EAAE,cAAc;IAKvC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BzE,OAAO,CAAC,qBAAqB;IAkE7B,OAAO,CAAC,iBAAiB;YAuDX,cAAc;YA6Bd,sBAAsB;YAgBtB,aAAa;CAU5B"}
|
|
@@ -2,7 +2,7 @@ import { BaseHandler } from "../../response/base.js";
|
|
|
2
2
|
import { PRIORITY_LOW } from "../../../../utils/constants/index.js";
|
|
3
3
|
import { generateNonce } from "../../../../security/http/response/security-handler.js";
|
|
4
4
|
import { isExtendedFSAdapter } from "../../../../platform/adapters/fs/wrapper.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getHostEnv } from "../../../../platform/compat/process.js";
|
|
6
6
|
import { shouldUseNoCacheHeadersFromHandler } from "../../../context/enriched-context.js";
|
|
7
7
|
import { withSpan } from "../../../../observability/tracing/otlp-setup.js";
|
|
8
8
|
import { serverLogger } from "../../../../utils/index.js";
|
|
@@ -76,7 +76,9 @@ export class SSRHandler extends BaseHandler {
|
|
|
76
76
|
if (ctx.projectSlug && isExtended && fsAdapter.isMultiProjectMode()) {
|
|
77
77
|
const prodMode = isProductionMode(ctx, url);
|
|
78
78
|
const branch = ctx.parsedDomain?.branch ?? null;
|
|
79
|
-
|
|
79
|
+
// Framework-owned token: bypass project env overlay so proxy mode works
|
|
80
|
+
// when a remote project overlay is active.
|
|
81
|
+
const effectiveToken = ctx.proxyToken || getHostEnv("VERYFRONT_API_TOKEN") || "";
|
|
80
82
|
logger.debug("Using multi-project context", {
|
|
81
83
|
projectSlug: ctx.projectSlug,
|
|
82
84
|
productionMode: prodMode,
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
interface ReloadProjectInfo {
|
|
1
|
+
export interface ReloadProjectInfo {
|
|
2
2
|
projectSlug?: string;
|
|
3
3
|
projectId?: string;
|
|
4
4
|
projectDir?: string;
|
|
5
5
|
environment?: "preview" | "production";
|
|
6
6
|
branch?: string | null;
|
|
7
7
|
releaseId?: string | null;
|
|
8
|
+
styleArtifactHash?: string;
|
|
9
|
+
styleAssetPath?: string;
|
|
8
10
|
}
|
|
9
11
|
type ReloadListener = (changedPaths?: string[], project?: ReloadProjectInfo) => void;
|
|
10
12
|
type InvalidateListener = () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reload-notifier.d.ts","sourceRoot":"","sources":["../../../src/src/server/reload-notifier.ts"],"names":[],"mappings":"AAKA,
|
|
1
|
+
{"version":3,"file":"reload-notifier.d.ts","sourceRoot":"","sources":["../../../src/src/server/reload-notifier.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,cAAc,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;AACrF,KAAK,kBAAkB,GAAG,MAAM,IAAI,CAAC;AACrC,KAAK,kBAAkB,GAAG,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAC;AAIjE,cAAM,kBAAkB;IACtB,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,cAAc,CAAC,CAAoB;IAC3C,OAAO,CAAC,OAAO,CAIb;IAEF,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAK/C,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI;IAK7D,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAyC1E,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,eAAe;IAkBvB,gBAAgB,IAAI,MAAM;IAI1B,0BAA0B,IAAI,MAAM;IAIpC,UAAU,IAAI;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,yBAAyB,EAAE,MAAM,CAAC;KACnC;IAQD,KAAK,IAAI,IAAI;CAiBd;AAED,eAAO,MAAM,cAAc,oBAA2B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.94";
|
|
2
2
|
export declare function normalizeVeryfrontVersion(version: string | undefined): string | undefined;
|
|
3
3
|
export declare function resolveRuntimeVersion(options?: {
|
|
4
4
|
veryfrontVersion?: string;
|
package/esm/src/utils/version.js
CHANGED
|
@@ -2,7 +2,7 @@ import denoConfig from "../../deno.js";
|
|
|
2
2
|
import { getEnv } from "../platform/compat/process.js";
|
|
3
3
|
// Keep in sync with deno.json version.
|
|
4
4
|
// scripts/release.ts updates this constant during releases.
|
|
5
|
-
export const VERSION = "0.1.
|
|
5
|
+
export const VERSION = "0.1.94";
|
|
6
6
|
export function normalizeVeryfrontVersion(version) {
|
|
7
7
|
if (!version)
|
|
8
8
|
return undefined;
|
package/package.json
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CommandHelp } from "../../help/types.js";
|
|
2
|
+
|
|
3
|
+
export const stylesHelp: CommandHelp = {
|
|
4
|
+
name: "styles",
|
|
5
|
+
description: "Build project CSS artifacts",
|
|
6
|
+
usage: "veryfront styles build-artifact --config <json>",
|
|
7
|
+
options: [
|
|
8
|
+
{
|
|
9
|
+
flag: "--config <json>",
|
|
10
|
+
description: "JSON build config with exactly one selector and an optional style_profile_hash",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
flag: "--debug",
|
|
14
|
+
description: "Enable debug logging",
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
examples: [
|
|
18
|
+
'veryfront styles build-artifact --config \'{"branch":"main"}\'',
|
|
19
|
+
'veryfront styles build-artifact --config \'{"style_profile_hash":"profile-1","environment_name":"Production"}\'',
|
|
20
|
+
],
|
|
21
|
+
};
|