veryfront 0.0.81 → 0.0.83
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 +15 -1
- package/esm/deno.js +1 -1
- package/esm/proxy/cache/index.d.ts +41 -0
- package/esm/proxy/cache/index.d.ts.map +1 -0
- package/esm/proxy/cache/index.js +75 -0
- package/esm/proxy/cache/memory-cache.d.ts +18 -0
- package/esm/proxy/cache/memory-cache.d.ts.map +1 -0
- package/esm/proxy/cache/memory-cache.js +100 -0
- package/esm/proxy/cache/redis-cache.d.ts +27 -0
- package/esm/proxy/cache/redis-cache.d.ts.map +1 -0
- package/esm/proxy/cache/redis-cache.js +183 -0
- package/esm/proxy/cache/resilient-cache.d.ts +44 -0
- package/esm/proxy/cache/resilient-cache.d.ts.map +1 -0
- package/esm/proxy/cache/resilient-cache.js +178 -0
- package/esm/proxy/cache/types.d.ts +65 -0
- package/esm/proxy/cache/types.d.ts.map +1 -0
- package/esm/proxy/cache/types.js +7 -0
- package/esm/proxy/handler.d.ts +81 -0
- package/esm/proxy/handler.d.ts.map +1 -0
- package/esm/proxy/handler.js +417 -0
- package/esm/proxy/logger.d.ts +29 -0
- package/esm/proxy/logger.d.ts.map +1 -0
- package/esm/proxy/logger.js +258 -0
- package/esm/proxy/oauth-client.d.ts +15 -0
- package/esm/proxy/oauth-client.d.ts.map +1 -0
- package/esm/proxy/oauth-client.js +52 -0
- package/esm/proxy/token-manager.d.ts +59 -0
- package/esm/proxy/token-manager.d.ts.map +1 -0
- package/esm/proxy/token-manager.js +125 -0
- package/esm/proxy/tracing.d.ts +39 -0
- package/esm/proxy/tracing.d.ts.map +1 -0
- package/esm/proxy/tracing.js +194 -0
- package/esm/src/cache/backend.d.ts +22 -0
- package/esm/src/cache/backend.d.ts.map +1 -1
- package/esm/src/cache/backend.js +59 -0
- package/esm/src/cache/cache-key-builder.d.ts +0 -4
- package/esm/src/cache/cache-key-builder.d.ts.map +1 -1
- package/esm/src/cache/cache-key-builder.js +0 -6
- package/esm/src/cache/hash.d.ts +107 -0
- package/esm/src/cache/hash.d.ts.map +1 -0
- package/esm/src/cache/hash.js +166 -0
- package/esm/src/cache/index.d.ts +3 -0
- package/esm/src/cache/index.d.ts.map +1 -1
- package/esm/src/cache/index.js +3 -0
- package/esm/src/cache/module-cache.d.ts +82 -0
- package/esm/src/cache/module-cache.d.ts.map +1 -0
- package/esm/src/cache/module-cache.js +214 -0
- package/esm/src/cache/multi-tier.d.ts +148 -0
- package/esm/src/cache/multi-tier.d.ts.map +1 -0
- package/esm/src/cache/multi-tier.js +326 -0
- package/esm/src/cli/app/actions.d.ts +26 -0
- package/esm/src/cli/app/actions.d.ts.map +1 -0
- package/esm/src/cli/app/actions.js +152 -0
- package/esm/src/cli/app/components/inline-input.d.ts +35 -0
- package/esm/src/cli/app/components/inline-input.d.ts.map +1 -0
- package/esm/src/cli/app/components/inline-input.js +220 -0
- package/esm/src/cli/app/components/list-select.d.ts +69 -0
- package/esm/src/cli/app/components/list-select.d.ts.map +1 -0
- package/esm/src/cli/app/components/list-select.js +137 -0
- package/esm/src/cli/app/index.d.ts +45 -0
- package/esm/src/cli/app/index.d.ts.map +1 -0
- package/esm/src/cli/app/index.js +1252 -0
- package/esm/src/cli/app/state.d.ts +122 -0
- package/esm/src/cli/app/state.d.ts.map +1 -0
- package/esm/src/cli/app/state.js +232 -0
- package/esm/src/cli/app/views/dashboard.d.ts +19 -0
- package/esm/src/cli/app/views/dashboard.d.ts.map +1 -0
- package/esm/src/cli/app/views/dashboard.js +178 -0
- package/esm/src/cli/index/command-router.d.ts.map +1 -1
- package/esm/src/cli/index/command-router.js +9 -39
- package/esm/src/cli/index/start-handler.d.ts +3 -0
- package/esm/src/cli/index/start-handler.d.ts.map +1 -0
- package/esm/src/cli/index/start-handler.js +145 -0
- package/esm/src/cli/mcp/index.d.ts +11 -0
- package/esm/src/cli/mcp/index.d.ts.map +1 -0
- package/esm/src/cli/mcp/index.js +10 -0
- package/esm/src/cli/templates/integration-loader.d.ts.map +1 -1
- package/esm/src/cli/templates/integration-loader.js +2 -4
- package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts +2 -0
- package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts.map +1 -1
- package/esm/src/middleware/builtin/security/redis-rate-limit.js +23 -9
- package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts +10 -0
- package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.js +30 -42
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +148 -20
- package/esm/src/observability/tracing/span-names.d.ts +2 -0
- package/esm/src/observability/tracing/span-names.d.ts.map +1 -1
- package/esm/src/observability/tracing/span-names.js +2 -0
- package/esm/src/platform/adapters/fs/cache/file-cache.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/cache/file-cache.js +9 -3
- package/esm/src/rendering/orchestrator/module-loader/cache.d.ts +10 -2
- package/esm/src/rendering/orchestrator/module-loader/cache.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-loader/cache.js +11 -6
- package/esm/src/rendering/orchestrator/module-loader/index.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-loader/index.js +72 -77
- package/esm/src/server/context/cache-invalidation.d.ts.map +1 -1
- package/esm/src/server/context/cache-invalidation.js +4 -0
- package/esm/src/server/handlers/dev/dashboard/api.js +4 -0
- package/esm/src/server/handlers/dev/projects/ui-handler.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/projects/ui-handler.js +6 -0
- package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-cache.js +145 -93
- package/esm/src/transforms/esm/transform-cache.d.ts +25 -0
- package/esm/src/transforms/esm/transform-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/transform-cache.js +45 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +2 -36
- package/esm/src/utils/constants/cache.d.ts +4 -0
- package/esm/src/utils/constants/cache.d.ts.map +1 -1
- package/esm/src/utils/constants/cache.js +14 -1
- package/esm/src/utils/index.d.ts +1 -1
- package/esm/src/utils/index.d.ts.map +1 -1
- package/esm/src/utils/index.js +1 -1
- package/package.json +2 -1
- package/src/deno.js +1 -1
- package/src/proxy/cache/index.ts +93 -0
- package/src/proxy/cache/memory-cache.ts +120 -0
- package/src/proxy/cache/redis-cache.ts +203 -0
- package/src/proxy/cache/resilient-cache.ts +205 -0
- package/src/proxy/cache/types.ts +72 -0
- package/src/proxy/handler.ts +593 -0
- package/src/proxy/logger.ts +329 -0
- package/src/proxy/oauth-client.ts +91 -0
- package/src/proxy/token-manager.ts +174 -0
- package/src/proxy/tracing.ts +237 -0
- package/src/src/cache/backend.ts +65 -0
- package/src/src/cache/cache-key-builder.ts +0 -9
- package/src/src/cache/hash.ts +205 -0
- package/src/src/cache/index.ts +3 -0
- package/src/src/cache/module-cache.ts +252 -0
- package/src/src/cache/multi-tier.ts +462 -0
- package/src/src/cli/app/actions.ts +190 -0
- package/src/src/cli/app/components/inline-input.ts +255 -0
- package/src/src/cli/app/components/list-select.ts +215 -0
- package/src/src/cli/app/index.ts +1471 -0
- package/src/src/cli/app/state.ts +385 -0
- package/src/src/cli/app/views/dashboard.ts +212 -0
- package/src/src/cli/index/command-router.ts +9 -40
- package/src/src/cli/index/start-handler.ts +195 -0
- package/src/src/cli/mcp/index.ts +11 -0
- package/src/src/cli/templates/integration-loader.ts +2 -8
- package/src/src/middleware/builtin/security/redis-rate-limit.ts +24 -11
- package/src/src/modules/react-loader/ssr-module-loader/cache/redis.ts +36 -50
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +168 -25
- package/src/src/observability/tracing/span-names.ts +2 -0
- package/src/src/platform/adapters/fs/cache/file-cache.ts +9 -3
- package/src/src/rendering/orchestrator/module-loader/cache.ts +14 -8
- package/src/src/rendering/orchestrator/module-loader/index.ts +94 -89
- package/src/src/server/context/cache-invalidation.ts +4 -0
- package/src/src/server/handlers/dev/dashboard/api.ts +2 -0
- package/src/src/server/handlers/dev/projects/ui-handler.ts +6 -0
- package/src/src/transforms/esm/http-cache.ts +160 -105
- package/src/src/transforms/esm/transform-cache.ts +53 -0
- package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +2 -40
- package/src/src/utils/constants/cache.ts +21 -1
- package/src/src/utils/index.ts +0 -1
|
@@ -80,6 +80,8 @@ export declare const SpanNames: {
|
|
|
80
80
|
readonly CACHE_REGISTRY_DELETE_REDIS_KEYS: "cache.registry.delete_redis_keys";
|
|
81
81
|
readonly CACHE_KEYS_GET_ALL_ASYNC: "cache.keys.get_all_async";
|
|
82
82
|
readonly CACHE_KEYS_DELETE_ALL_ASYNC: "cache.keys.delete_all_async";
|
|
83
|
+
readonly CACHE_MULTI_TIER_GET: "cache.multi_tier.get";
|
|
84
|
+
readonly CACHE_MULTI_TIER_SET: "cache.multi_tier.set";
|
|
83
85
|
readonly HTML_GENERATE_SHELL_PARTS: "html.generate_shell_parts";
|
|
84
86
|
readonly HTML_WRAP_IN_SHELL: "html.wrap_in_shell";
|
|
85
87
|
readonly HTML_GENERATE_TAILWIND_CSS: "html.generate_tailwind_css";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-names.d.ts","sourceRoot":"","sources":["../../../../src/src/observability/tracing/span-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"span-names.d.ts","sourceRoot":"","sources":["../../../../src/src/observability/tracing/span-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GZ,CAAC"}
|
|
@@ -80,6 +80,8 @@ export const SpanNames = {
|
|
|
80
80
|
CACHE_REGISTRY_DELETE_REDIS_KEYS: "cache.registry.delete_redis_keys",
|
|
81
81
|
CACHE_KEYS_GET_ALL_ASYNC: "cache.keys.get_all_async",
|
|
82
82
|
CACHE_KEYS_DELETE_ALL_ASYNC: "cache.keys.delete_all_async",
|
|
83
|
+
CACHE_MULTI_TIER_GET: "cache.multi_tier.get",
|
|
84
|
+
CACHE_MULTI_TIER_SET: "cache.multi_tier.set",
|
|
83
85
|
HTML_GENERATE_SHELL_PARTS: "html.generate_shell_parts",
|
|
84
86
|
HTML_WRAP_IN_SHELL: "html.wrap_in_shell",
|
|
85
87
|
HTML_GENERATE_TAILWIND_CSS: "html.generate_tailwind_css",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmC3E;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CAwBnE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,mCAA6B,CAAC;AAEnE,4DAA4D;AAC5D,eAAO,MAAM,uBAAuB,sCAAgC,CAAC;AAErE;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEP,OAAO,GAAE,gBAAqB;IAgB1C,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IA4BlC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAqChD;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmC3E;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CAwBnE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,mCAA6B,CAAC;AAEnE,4DAA4D;AAC5D,eAAO,MAAM,uBAAuB,sCAAgC,CAAC;AAErE;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEP,OAAO,GAAE,gBAAqB;IAgB1C,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IA4BlC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAqChD;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAsBnC;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD,mEAAmE;IACnE,OAAO,CAAC,aAAa;IAWrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAezB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAqBtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAsB/D,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB7E,KAAK,IAAI,IAAI;IAOb,KAAK,IAAI,UAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAazC,YAAY,IAAI,MAAM;IAetB,OAAO,CAAC,qBAAqB;CAuB9B"}
|
|
@@ -186,7 +186,9 @@ export class FileCache {
|
|
|
186
186
|
const serialized = JSON.stringify(entry);
|
|
187
187
|
// Update request-scoped cache so subsequent reads in same request see the new value
|
|
188
188
|
setInRequestCache(key, serialized);
|
|
189
|
-
backend.set(key, serialized, BACKEND_TTL_SECONDS).catch(() => {
|
|
189
|
+
backend.set(key, serialized, BACKEND_TTL_SECONDS).catch((error) => {
|
|
190
|
+
logger.debug("[FileCache] Backend set failed", { key, error });
|
|
191
|
+
});
|
|
190
192
|
return;
|
|
191
193
|
}
|
|
192
194
|
this.setToFallback(key, entry, size);
|
|
@@ -261,7 +263,9 @@ export class FileCache {
|
|
|
261
263
|
}
|
|
262
264
|
// Fire-and-forget backend deletion
|
|
263
265
|
// Note: prefix already includes "file:" from buildFileCacheKeyPrefix, don't add it again
|
|
264
|
-
cacheBackend?.delByPattern?.(`${prefix}*`).catch(() => {
|
|
266
|
+
cacheBackend?.delByPattern?.(`${prefix}*`).catch((error) => {
|
|
267
|
+
logger.debug("[FileCache] Backend invalidation failed", { prefix, error });
|
|
268
|
+
});
|
|
265
269
|
return count;
|
|
266
270
|
}
|
|
267
271
|
deleteByPrefixAsync(prefix) {
|
|
@@ -289,7 +293,9 @@ export class FileCache {
|
|
|
289
293
|
}
|
|
290
294
|
// Fire-and-forget backend deletion
|
|
291
295
|
// Note: prefix already includes "file:" from buildFileCacheKeyPrefix, don't add it again
|
|
292
|
-
cacheBackend?.delByPattern?.(`${prefix}*:${suffix}`).catch(() => {
|
|
296
|
+
cacheBackend?.delByPattern?.(`${prefix}*:${suffix}`).catch((error) => {
|
|
297
|
+
logger.debug("[FileCache] Backend invalidation failed", { prefix, suffix, error });
|
|
298
|
+
});
|
|
293
299
|
return count;
|
|
294
300
|
}
|
|
295
301
|
deleteByPrefixAndSuffixAsync(prefix, suffix) {
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module Loader Cache Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides hash generation and cache factory functions.
|
|
5
|
+
* Module caches are now pod-level singletons (see src/cache/module-cache.ts)
|
|
6
|
+
* to ensure caches persist across requests within the same pod.
|
|
7
|
+
*
|
|
8
|
+
* @module rendering/orchestrator/module-loader/cache
|
|
9
|
+
*/
|
|
10
|
+
export { createEsmCache, createModuleCache } from "../../../cache/module-cache.js";
|
|
1
11
|
export declare function generateHash(str: string): Promise<string>;
|
|
2
|
-
export declare function createModuleCache(): Map<string, string>;
|
|
3
|
-
export declare function createEsmCache(): Map<string, string>;
|
|
4
12
|
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/orchestrator/module-loader/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/orchestrator/module-loader/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInF,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW/D"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module Loader Cache Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides hash generation and cache factory functions.
|
|
5
|
+
* Module caches are now pod-level singletons (see src/cache/module-cache.ts)
|
|
6
|
+
* to ensure caches persist across requests within the same pod.
|
|
7
|
+
*
|
|
8
|
+
* @module rendering/orchestrator/module-loader/cache
|
|
9
|
+
*/
|
|
10
|
+
// Re-export pod-level cache factories
|
|
1
11
|
import * as dntShim from "../../../../_dnt.shims.js";
|
|
12
|
+
export { createEsmCache, createModuleCache } from "../../../cache/module-cache.js";
|
|
2
13
|
const HEX_CHARS = "0123456789abcdef";
|
|
3
14
|
export async function generateHash(str) {
|
|
4
15
|
const data = new TextEncoder().encode(str);
|
|
@@ -11,9 +22,3 @@ export async function generateHash(str) {
|
|
|
11
22
|
}
|
|
12
23
|
return hex;
|
|
13
24
|
}
|
|
14
|
-
export function createModuleCache() {
|
|
15
|
-
return new Map();
|
|
16
|
-
}
|
|
17
|
-
export function createEsmCache() {
|
|
18
|
-
return new Map();
|
|
19
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/orchestrator/module-loader/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/orchestrator/module-loader/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAkBzE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA4BpE,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAqDD;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,kBAAkB,EAC1B,eAAe,UAAQ,GACtB,OAAO,CAAC,MAAM,CAAC,CAsIjB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,CAmC3F"}
|
|
@@ -6,69 +6,41 @@
|
|
|
6
6
|
* @module rendering/orchestrator/module-loader
|
|
7
7
|
*/
|
|
8
8
|
import { parallelMap, rendererLogger as logger } from "../../../utils/index.js";
|
|
9
|
-
import { Singleflight } from "../../../utils/singleflight.js";
|
|
10
9
|
import { getLocalAdapter } from "../../../platform/adapters/registry.js";
|
|
11
10
|
import { generateHash } from "./cache.js";
|
|
12
11
|
import { findLocalLibFile, findSourceFile } from "../file-resolver/index.js";
|
|
13
12
|
import { transformToESM } from "../../../transforms/esm-transform.js";
|
|
14
13
|
import { getProjectTmpDir } from "../../../modules/react-loader/index.js";
|
|
15
|
-
import {
|
|
14
|
+
import { generateCacheKey as generateTransformCacheKey, getOrComputeTransform, initializeTransformCache, setCachedTransformAsync, } from "../../../transforms/esm/transform-cache.js";
|
|
15
|
+
import { hashString } from "../../../cache/hash.js";
|
|
16
|
+
import { TRANSFORM_DISTRIBUTED_TTL_SEC } from "../../../utils/constants/cache.js";
|
|
17
|
+
import { ensureHttpBundlesExist } from "../../../transforms/esm/http-cache.js";
|
|
18
|
+
import { getHttpBundleCacheDir } from "../../../utils/cache-dir.js";
|
|
16
19
|
// Re-export utilities
|
|
17
20
|
export { createEsmCache, createModuleCache, generateHash } from "./cache.js";
|
|
18
21
|
export { fetchEsmModule, rewriteEsmPaths } from "./esm-rewriter.js";
|
|
19
|
-
/**
|
|
20
|
-
const
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
let
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
return distributedCacheInit.do("init", async () => {
|
|
34
|
-
try {
|
|
35
|
-
const { CacheBackends } = await import("../../../cache/backend.js");
|
|
36
|
-
const backend = await CacheBackends.transform();
|
|
37
|
-
// Only use distributed cache if API or Redis (not memory - that's per-process)
|
|
38
|
-
if (backend.type === "memory") {
|
|
39
|
-
distributedTransformCache = null;
|
|
40
|
-
logger.debug("[ModuleLoader] No distributed transform cache (memory only)");
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
distributedTransformCache = backend;
|
|
44
|
-
logger.debug("[ModuleLoader] Distributed transform cache initialized", {
|
|
45
|
-
type: backend.type,
|
|
46
|
-
});
|
|
47
|
-
return backend;
|
|
22
|
+
/** Pattern to match HTTP bundle file:// paths in transformed code */
|
|
23
|
+
const HTTP_BUNDLE_PATTERN = /file:\/\/([^"'\s]+veryfront-http-bundle\/http-([a-f0-9]+)\.mjs)/gi;
|
|
24
|
+
/** Extract HTTP bundle paths from transformed code for proactive recovery */
|
|
25
|
+
function extractHttpBundlePaths(code) {
|
|
26
|
+
const bundles = [];
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
let match;
|
|
29
|
+
while ((match = HTTP_BUNDLE_PATTERN.exec(code)) !== null) {
|
|
30
|
+
const path = match[1];
|
|
31
|
+
const hash = match[2];
|
|
32
|
+
if (!seen.has(hash)) {
|
|
33
|
+
seen.add(hash);
|
|
34
|
+
bundles.push({ path, hash });
|
|
48
35
|
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
logger.debug("[ModuleLoader] Failed to init distributed transform cache", { error });
|
|
51
|
-
distributedTransformCache = null;
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Build cache key for transformed module.
|
|
58
|
-
* Includes content hash so cache invalidates when source changes.
|
|
59
|
-
*/
|
|
60
|
-
function getTransformCacheKey(projectId, filePath, contentHash) {
|
|
61
|
-
return `v${TRANSFORM_CACHE_VERSION}:${projectId}:${filePath}:${contentHash}`;
|
|
62
|
-
}
|
|
63
|
-
/** Simple string hash for cache keys */
|
|
64
|
-
function hashString(str) {
|
|
65
|
-
let hash = 0;
|
|
66
|
-
for (let i = 0; i < str.length; i++) {
|
|
67
|
-
hash = ((hash << 5) - hash) + str.charCodeAt(i);
|
|
68
|
-
hash &= hash;
|
|
69
36
|
}
|
|
70
|
-
|
|
37
|
+
HTTP_BUNDLE_PATTERN.lastIndex = 0;
|
|
38
|
+
return bundles;
|
|
71
39
|
}
|
|
40
|
+
/** Cache for created directories to avoid repeated mkdir calls */
|
|
41
|
+
const createdDirs = new Set();
|
|
42
|
+
/** TTL for cached transforms (uses centralized config) */
|
|
43
|
+
const TRANSFORM_CACHE_TTL_SECONDS = TRANSFORM_DISTRIBUTED_TTL_SEC;
|
|
72
44
|
function getModuleCacheKey(filePath, projectId, projectDir) {
|
|
73
45
|
return `${projectId ?? projectDir ?? "default"}:${filePath}`;
|
|
74
46
|
}
|
|
@@ -154,35 +126,41 @@ export async function transformModuleWithDeps(filePath, tmpDir, localAdapter, co
|
|
|
154
126
|
}
|
|
155
127
|
const contentHash = hashString(fileContent);
|
|
156
128
|
const effectiveProjectId = projectId ?? projectDir;
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
logger.debug("[ModuleLoader] Distributed transform cache HIT", {
|
|
166
|
-
filePath,
|
|
167
|
-
cacheKey: transformCacheKey,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
logger.debug("[ModuleLoader] Distributed cache get failed", { filePath, error });
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (!transformedCode) {
|
|
176
|
-
transformedCode = await transformToESM(fileContent, filePath, projectDir, adapter, {
|
|
129
|
+
const scopedPath = `${effectiveProjectId}:${filePath}`;
|
|
130
|
+
const transformCacheKey = generateTransformCacheKey(scopedPath, contentHash, true); // ssr=true
|
|
131
|
+
// Initialize transform cache (lazy, only once per pod)
|
|
132
|
+
await initializeTransformCache();
|
|
133
|
+
// Use consolidated transform cache with getOrCompute pattern
|
|
134
|
+
let transformedCode = await getOrComputeTransform(transformCacheKey, () => {
|
|
135
|
+
logger.debug("[ModuleLoader] Transform cache miss, transforming", { filePath });
|
|
136
|
+
return transformToESM(fileContent, filePath, projectDir, adapter, {
|
|
177
137
|
projectId: effectiveProjectId,
|
|
178
138
|
dev: mode === "development",
|
|
179
139
|
ssr: true,
|
|
180
140
|
});
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
141
|
+
}, TRANSFORM_CACHE_TTL_SECONDS);
|
|
142
|
+
// Proactively ensure HTTP bundles exist before writing the module.
|
|
143
|
+
// Cached transforms from a different pod may reference file:// paths
|
|
144
|
+
// to HTTP bundles that don't exist locally.
|
|
145
|
+
const bundlePaths = extractHttpBundlePaths(transformedCode);
|
|
146
|
+
if (bundlePaths.length > 0) {
|
|
147
|
+
const cacheDir = getHttpBundleCacheDir();
|
|
148
|
+
const failed = await ensureHttpBundlesExist(bundlePaths, cacheDir);
|
|
149
|
+
if (failed.length > 0) {
|
|
150
|
+
logger.warn("[ModuleLoader] HTTP bundle recovery failed, re-transforming", {
|
|
151
|
+
filePath,
|
|
152
|
+
failed,
|
|
153
|
+
});
|
|
154
|
+
transformedCode = await transformToESM(fileContent, filePath, projectDir, adapter, {
|
|
155
|
+
projectId: effectiveProjectId,
|
|
156
|
+
dev: mode === "development",
|
|
157
|
+
ssr: true,
|
|
158
|
+
});
|
|
159
|
+
setCachedTransformAsync(transformCacheKey, transformedCode, contentHash, TRANSFORM_CACHE_TTL_SECONDS).catch((error) => {
|
|
160
|
+
logger.debug("[ModuleLoader] Failed to update transform cache after re-transform", {
|
|
161
|
+
filePath,
|
|
162
|
+
error,
|
|
163
|
+
});
|
|
186
164
|
});
|
|
187
165
|
}
|
|
188
166
|
}
|
|
@@ -219,6 +197,23 @@ export async function loadModule(filePath, config) {
|
|
|
219
197
|
return await import(moduleUrl);
|
|
220
198
|
}
|
|
221
199
|
catch (error) {
|
|
200
|
+
// If import fails due to missing HTTP bundle, try to recover and retry once
|
|
201
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
202
|
+
const bundleMatch = errorMsg.match(/veryfront-http-bundle\/http-([a-f0-9]+)\.mjs/);
|
|
203
|
+
if (bundleMatch) {
|
|
204
|
+
const hash = bundleMatch[1];
|
|
205
|
+
logger.warn("[ModuleLoader] Import failed due to missing HTTP bundle, attempting recovery", {
|
|
206
|
+
filePath,
|
|
207
|
+
hash,
|
|
208
|
+
});
|
|
209
|
+
const { recoverHttpBundleByHash } = await import("../../../transforms/esm/http-cache.js");
|
|
210
|
+
const cacheDir = getHttpBundleCacheDir();
|
|
211
|
+
const recovered = await recoverHttpBundleByHash(hash, cacheDir);
|
|
212
|
+
if (recovered) {
|
|
213
|
+
logger.info("[ModuleLoader] HTTP bundle recovered, retrying import", { hash });
|
|
214
|
+
return await import(`file://${tempFilePath}?t=${Date.now()}&retry=1`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
222
217
|
logger.error("[ModuleLoader] Failed to import module:", {
|
|
223
218
|
filePath,
|
|
224
219
|
tempFilePath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-invalidation.d.ts","sourceRoot":"","sources":["../../../../src/src/server/context/cache-invalidation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-invalidation.d.ts","sourceRoot":"","sources":["../../../../src/src/server/context/cache-invalidation.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAiGf"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { serverLogger as logger } from "../../utils/index.js";
|
|
2
2
|
import { clearModulePathCache, invalidateModulePaths, } from "../../transforms/mdx/esm-module-loader/index.js";
|
|
3
|
+
import { clearModuleCacheForProject } from "../../cache/module-cache.js";
|
|
3
4
|
import { clearSSRModuleCache, clearSSRModuleCacheForProject, } from "../../modules/react-loader/ssr-module-loader/index.js";
|
|
4
5
|
import { clearRendererCacheForProject, clearRendererCaches } from "../../rendering/renderer.js";
|
|
5
6
|
import { clearRouterDetectionCache } from "../../rendering/router-detection.js";
|
|
@@ -38,6 +39,9 @@ export async function invalidateProjectCaches(projectSlug, changedPaths, options
|
|
|
38
39
|
});
|
|
39
40
|
if (projectId) {
|
|
40
41
|
clearSSRModuleCacheForProject(projectId);
|
|
42
|
+
// Also clear the pod-level module cache (used by RenderPipeline)
|
|
43
|
+
// This was previously missed, causing stale renders despite SSR module cache clearing
|
|
44
|
+
clearModuleCacheForProject(projectId);
|
|
41
45
|
}
|
|
42
46
|
else {
|
|
43
47
|
clearSSRModuleCache();
|
|
@@ -321,6 +321,8 @@ async function handleListFiles(req, ctx) {
|
|
|
321
321
|
if (!projectDir)
|
|
322
322
|
return errorResponse("No project directory configured", 500);
|
|
323
323
|
const relativePath = new URL(req.url).searchParams.get("path") || "";
|
|
324
|
+
if (relativePath.includes(".."))
|
|
325
|
+
return errorResponse("Invalid path", 400);
|
|
324
326
|
const fullPath = relativePath ? `${projectDir}/${relativePath}` : projectDir;
|
|
325
327
|
try {
|
|
326
328
|
const files = [];
|
|
@@ -352,6 +354,8 @@ async function handleReadFileContent(req, ctx) {
|
|
|
352
354
|
const relativePath = new URL(req.url).searchParams.get("path") || "";
|
|
353
355
|
if (!relativePath)
|
|
354
356
|
return errorResponse("path parameter is required", 400);
|
|
357
|
+
if (relativePath.includes(".."))
|
|
358
|
+
return errorResponse("Invalid path", 400);
|
|
355
359
|
try {
|
|
356
360
|
const content = await adapter.fs.readFile(`${projectDir}/${relativePath}`);
|
|
357
361
|
const extension = relativePath.split(".").pop() || "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/dev/projects/ui-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AA6ExD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"ui-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/dev/projects/ui-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AA6ExD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA8CvF"}
|
|
@@ -62,6 +62,12 @@ export function handleProjectsUI(req) {
|
|
|
62
62
|
return Promise.resolve(null);
|
|
63
63
|
return withSpan("server.dev.projectsUI.handle", async () => {
|
|
64
64
|
const relativePath = pathname.replace("/_projects/ui/", "").replace(/\.js$/, "");
|
|
65
|
+
if (relativePath.includes("..")) {
|
|
66
|
+
return new dntShim.Response("Invalid path", {
|
|
67
|
+
status: 400,
|
|
68
|
+
headers: { "Content-Type": "text/plain" },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
65
71
|
const uiDir = getUiDirectory();
|
|
66
72
|
const module = await readUiSource(uiDir, relativePath);
|
|
67
73
|
if (!module) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-cache.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/http-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-cache.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/http-cache.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAmBzE,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,eAAe,CAAC;IAC3B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAyUF;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8D9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAiInB"}
|