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.
Files changed (97) hide show
  1. package/esm/cli/commands/styles/command-help.d.ts +3 -0
  2. package/esm/cli/commands/styles/command-help.d.ts.map +1 -0
  3. package/esm/cli/commands/styles/command-help.js +19 -0
  4. package/esm/cli/commands/styles/command.d.ts +3 -0
  5. package/esm/cli/commands/styles/command.d.ts.map +1 -0
  6. package/esm/cli/commands/styles/command.js +198 -0
  7. package/esm/cli/commands/styles/handler.d.ts +24 -0
  8. package/esm/cli/commands/styles/handler.d.ts.map +1 -0
  9. package/esm/cli/commands/styles/handler.js +17 -0
  10. package/esm/cli/help/command-definitions.d.ts.map +1 -1
  11. package/esm/cli/help/command-definitions.js +2 -0
  12. package/esm/cli/router.d.ts.map +1 -1
  13. package/esm/cli/router.js +2 -0
  14. package/esm/deno.d.ts +1 -0
  15. package/esm/deno.js +2 -1
  16. package/esm/src/html/styles-builder/css-pregeneration.d.ts +9 -0
  17. package/esm/src/html/styles-builder/css-pregeneration.d.ts.map +1 -1
  18. package/esm/src/html/styles-builder/css-pregeneration.js +26 -15
  19. package/esm/src/jobs/schemas.d.ts +40 -40
  20. package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
  21. package/esm/src/platform/adapters/fs/veryfront/adapter.js +15 -3
  22. package/esm/src/platform/adapters/fs/veryfront/types.d.ts +2 -0
  23. package/esm/src/platform/adapters/fs/veryfront/types.d.ts.map +1 -1
  24. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +5 -1
  25. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
  26. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +10 -2
  27. package/esm/src/platform/adapters/veryfront-api-client/client.d.ts +2 -1
  28. package/esm/src/platform/adapters/veryfront-api-client/client.d.ts.map +1 -1
  29. package/esm/src/platform/adapters/veryfront-api-client/client.js +3 -0
  30. package/esm/src/platform/adapters/veryfront-api-client/index.d.ts +1 -1
  31. package/esm/src/platform/adapters/veryfront-api-client/index.d.ts.map +1 -1
  32. package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts +11 -2
  33. package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts.map +1 -1
  34. package/esm/src/platform/adapters/veryfront-api-client/operations.js +30 -0
  35. package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.d.ts +14 -3
  36. package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.d.ts.map +1 -1
  37. package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.js +8 -1
  38. package/esm/src/rendering/styles.d.ts +9 -0
  39. package/esm/src/rendering/styles.d.ts.map +1 -0
  40. package/esm/src/rendering/styles.js +8 -0
  41. package/esm/src/sandbox/index.d.ts +1 -1
  42. package/esm/src/sandbox/index.d.ts.map +1 -1
  43. package/esm/src/sandbox/sandbox.d.ts +14 -3
  44. package/esm/src/sandbox/sandbox.d.ts.map +1 -1
  45. package/esm/src/sandbox/sandbox.js +20 -6
  46. package/esm/src/security/http/base-handler.d.ts.map +1 -1
  47. package/esm/src/security/http/base-handler.js +5 -2
  48. package/esm/src/server/context/request-context.d.ts.map +1 -1
  49. package/esm/src/server/context/request-context.js +4 -2
  50. package/esm/src/server/handlers/dev/scripts/hmr-scripts.d.ts.map +1 -1
  51. package/esm/src/server/handlers/dev/scripts/hmr-scripts.js +91 -4
  52. package/esm/src/server/handlers/dev/styles-css.handler.d.ts +2 -0
  53. package/esm/src/server/handlers/dev/styles-css.handler.d.ts.map +1 -1
  54. package/esm/src/server/handlers/dev/styles-css.handler.js +23 -0
  55. package/esm/src/server/handlers/preview/hmr-message-router.d.ts +2 -1
  56. package/esm/src/server/handlers/preview/hmr-message-router.d.ts.map +1 -1
  57. package/esm/src/server/handlers/preview/hmr-message-router.js +15 -5
  58. package/esm/src/server/handlers/preview/hmr.handler.js +1 -1
  59. package/esm/src/server/handlers/preview/markdown-preview.handler.d.ts.map +1 -1
  60. package/esm/src/server/handlers/preview/markdown-preview.handler.js +4 -2
  61. package/esm/src/server/handlers/request/css.handler.d.ts.map +1 -1
  62. package/esm/src/server/handlers/request/css.handler.js +4 -2
  63. package/esm/src/server/handlers/request/ssr/ssr.handler.d.ts.map +1 -1
  64. package/esm/src/server/handlers/request/ssr/ssr.handler.js +4 -2
  65. package/esm/src/server/reload-notifier.d.ts +3 -1
  66. package/esm/src/server/reload-notifier.d.ts.map +1 -1
  67. package/esm/src/utils/version.d.ts +1 -1
  68. package/esm/src/utils/version.js +1 -1
  69. package/package.json +1 -1
  70. package/src/cli/commands/styles/command-help.ts +21 -0
  71. package/src/cli/commands/styles/command.ts +296 -0
  72. package/src/cli/commands/styles/handler.ts +23 -0
  73. package/src/cli/help/command-definitions.ts +2 -0
  74. package/src/cli/router.ts +2 -0
  75. package/src/deno.js +2 -1
  76. package/src/src/html/styles-builder/css-pregeneration.ts +57 -29
  77. package/src/src/platform/adapters/fs/veryfront/adapter.ts +18 -4
  78. package/src/src/platform/adapters/fs/veryfront/types.ts +2 -0
  79. package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +18 -3
  80. package/src/src/platform/adapters/veryfront-api-client/client.ts +8 -0
  81. package/src/src/platform/adapters/veryfront-api-client/index.ts +1 -0
  82. package/src/src/platform/adapters/veryfront-api-client/operations.ts +48 -2
  83. package/src/src/platform/adapters/veryfront-api-client/schemas/api.schema.ts +9 -1
  84. package/src/src/rendering/styles.ts +15 -0
  85. package/src/src/sandbox/index.ts +1 -0
  86. package/src/src/sandbox/sandbox.ts +33 -6
  87. package/src/src/security/http/base-handler.ts +5 -2
  88. package/src/src/server/context/request-context.ts +4 -2
  89. package/src/src/server/handlers/dev/scripts/hmr-scripts.ts +93 -4
  90. package/src/src/server/handlers/dev/styles-css.handler.ts +31 -0
  91. package/src/src/server/handlers/preview/hmr-message-router.ts +15 -5
  92. package/src/src/server/handlers/preview/hmr.handler.ts +1 -1
  93. package/src/src/server/handlers/preview/markdown-preview.handler.ts +4 -2
  94. package/src/src/server/handlers/request/css.handler.ts +4 -2
  95. package/src/src/server/handlers/request/ssr/ssr.handler.ts +4 -2
  96. package/src/src/server/reload-notifier.ts +3 -1
  97. 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;AAG9B,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;CAwDd"}
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 && !ctx?.adapter.env.get("VERYFRONT_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
- const effectiveToken = ctx.proxyToken || ctx.adapter.env.get("VERYFRONT_API_TOKEN") || "";
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,CAwBzE;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
+ {"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 { getEnv } from "../../platform/compat/process.js";
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
- token: req.headers.get("x-token") ?? getEnv("VERYFRONT_API_TOKEN") ?? "",
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;AAmUH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
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
- refreshStylesheets();
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 = refreshStylesheets(update.path) || refreshStylesheets();
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;AA+BnG,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;YAiD3B,oBAAoB;YASpB,2BAA2B;CA0B1C"}
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[], projectSlug?: string): void;
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":"AAKA,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;AAOD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAyBnF;AAsBD,wBAAgB,YAAY,IAAI,IAAI,CAInC"}
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, projectSlug) {
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?.projectSlug);
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;YAiEjE,cAAc;CAiF7B"}
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 { getEnv } from "../../../platform/compat/process.js";
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
- const effectiveToken = ctx.proxyToken || getEnv("VERYFRONT_API_TOKEN") || "";
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;CAkEhF"}
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 { getEnv } from "../../../platform/compat/process.js";
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
- const effectiveToken = ctx.proxyToken || getEnv("VERYFRONT_API_TOKEN") || "";
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;IAgE7B,OAAO,CAAC,iBAAiB;YAuDX,cAAc;YA6Bd,sBAAsB;YAgBtB,aAAa;CAU5B"}
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 { getEnv } from "../../../../platform/compat/process.js";
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
- const effectiveToken = ctx.proxyToken || getEnv("VERYFRONT_API_TOKEN") || "";
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,UAAU,iBAAiB;IACzB,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;CAC3B;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
+ {"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.92";
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;
@@ -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.92";
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.92",
3
+ "version": "0.1.94",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
@@ -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
+ };