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.
Files changed (157) hide show
  1. package/README.md +15 -1
  2. package/esm/deno.js +1 -1
  3. package/esm/proxy/cache/index.d.ts +41 -0
  4. package/esm/proxy/cache/index.d.ts.map +1 -0
  5. package/esm/proxy/cache/index.js +75 -0
  6. package/esm/proxy/cache/memory-cache.d.ts +18 -0
  7. package/esm/proxy/cache/memory-cache.d.ts.map +1 -0
  8. package/esm/proxy/cache/memory-cache.js +100 -0
  9. package/esm/proxy/cache/redis-cache.d.ts +27 -0
  10. package/esm/proxy/cache/redis-cache.d.ts.map +1 -0
  11. package/esm/proxy/cache/redis-cache.js +183 -0
  12. package/esm/proxy/cache/resilient-cache.d.ts +44 -0
  13. package/esm/proxy/cache/resilient-cache.d.ts.map +1 -0
  14. package/esm/proxy/cache/resilient-cache.js +178 -0
  15. package/esm/proxy/cache/types.d.ts +65 -0
  16. package/esm/proxy/cache/types.d.ts.map +1 -0
  17. package/esm/proxy/cache/types.js +7 -0
  18. package/esm/proxy/handler.d.ts +81 -0
  19. package/esm/proxy/handler.d.ts.map +1 -0
  20. package/esm/proxy/handler.js +417 -0
  21. package/esm/proxy/logger.d.ts +29 -0
  22. package/esm/proxy/logger.d.ts.map +1 -0
  23. package/esm/proxy/logger.js +258 -0
  24. package/esm/proxy/oauth-client.d.ts +15 -0
  25. package/esm/proxy/oauth-client.d.ts.map +1 -0
  26. package/esm/proxy/oauth-client.js +52 -0
  27. package/esm/proxy/token-manager.d.ts +59 -0
  28. package/esm/proxy/token-manager.d.ts.map +1 -0
  29. package/esm/proxy/token-manager.js +125 -0
  30. package/esm/proxy/tracing.d.ts +39 -0
  31. package/esm/proxy/tracing.d.ts.map +1 -0
  32. package/esm/proxy/tracing.js +194 -0
  33. package/esm/src/cache/backend.d.ts +22 -0
  34. package/esm/src/cache/backend.d.ts.map +1 -1
  35. package/esm/src/cache/backend.js +59 -0
  36. package/esm/src/cache/cache-key-builder.d.ts +0 -4
  37. package/esm/src/cache/cache-key-builder.d.ts.map +1 -1
  38. package/esm/src/cache/cache-key-builder.js +0 -6
  39. package/esm/src/cache/hash.d.ts +107 -0
  40. package/esm/src/cache/hash.d.ts.map +1 -0
  41. package/esm/src/cache/hash.js +166 -0
  42. package/esm/src/cache/index.d.ts +3 -0
  43. package/esm/src/cache/index.d.ts.map +1 -1
  44. package/esm/src/cache/index.js +3 -0
  45. package/esm/src/cache/module-cache.d.ts +82 -0
  46. package/esm/src/cache/module-cache.d.ts.map +1 -0
  47. package/esm/src/cache/module-cache.js +214 -0
  48. package/esm/src/cache/multi-tier.d.ts +148 -0
  49. package/esm/src/cache/multi-tier.d.ts.map +1 -0
  50. package/esm/src/cache/multi-tier.js +326 -0
  51. package/esm/src/cli/app/actions.d.ts +26 -0
  52. package/esm/src/cli/app/actions.d.ts.map +1 -0
  53. package/esm/src/cli/app/actions.js +152 -0
  54. package/esm/src/cli/app/components/inline-input.d.ts +35 -0
  55. package/esm/src/cli/app/components/inline-input.d.ts.map +1 -0
  56. package/esm/src/cli/app/components/inline-input.js +220 -0
  57. package/esm/src/cli/app/components/list-select.d.ts +69 -0
  58. package/esm/src/cli/app/components/list-select.d.ts.map +1 -0
  59. package/esm/src/cli/app/components/list-select.js +137 -0
  60. package/esm/src/cli/app/index.d.ts +45 -0
  61. package/esm/src/cli/app/index.d.ts.map +1 -0
  62. package/esm/src/cli/app/index.js +1252 -0
  63. package/esm/src/cli/app/state.d.ts +122 -0
  64. package/esm/src/cli/app/state.d.ts.map +1 -0
  65. package/esm/src/cli/app/state.js +232 -0
  66. package/esm/src/cli/app/views/dashboard.d.ts +19 -0
  67. package/esm/src/cli/app/views/dashboard.d.ts.map +1 -0
  68. package/esm/src/cli/app/views/dashboard.js +178 -0
  69. package/esm/src/cli/index/command-router.d.ts.map +1 -1
  70. package/esm/src/cli/index/command-router.js +9 -39
  71. package/esm/src/cli/index/start-handler.d.ts +3 -0
  72. package/esm/src/cli/index/start-handler.d.ts.map +1 -0
  73. package/esm/src/cli/index/start-handler.js +145 -0
  74. package/esm/src/cli/mcp/index.d.ts +11 -0
  75. package/esm/src/cli/mcp/index.d.ts.map +1 -0
  76. package/esm/src/cli/mcp/index.js +10 -0
  77. package/esm/src/cli/templates/integration-loader.d.ts.map +1 -1
  78. package/esm/src/cli/templates/integration-loader.js +2 -4
  79. package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts +2 -0
  80. package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts.map +1 -1
  81. package/esm/src/middleware/builtin/security/redis-rate-limit.js +23 -9
  82. package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts +10 -0
  83. package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts.map +1 -1
  84. package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.js +30 -42
  85. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
  86. package/esm/src/modules/react-loader/ssr-module-loader/loader.js +148 -20
  87. package/esm/src/observability/tracing/span-names.d.ts +2 -0
  88. package/esm/src/observability/tracing/span-names.d.ts.map +1 -1
  89. package/esm/src/observability/tracing/span-names.js +2 -0
  90. package/esm/src/platform/adapters/fs/cache/file-cache.d.ts.map +1 -1
  91. package/esm/src/platform/adapters/fs/cache/file-cache.js +9 -3
  92. package/esm/src/rendering/orchestrator/module-loader/cache.d.ts +10 -2
  93. package/esm/src/rendering/orchestrator/module-loader/cache.d.ts.map +1 -1
  94. package/esm/src/rendering/orchestrator/module-loader/cache.js +11 -6
  95. package/esm/src/rendering/orchestrator/module-loader/index.d.ts.map +1 -1
  96. package/esm/src/rendering/orchestrator/module-loader/index.js +72 -77
  97. package/esm/src/server/context/cache-invalidation.d.ts.map +1 -1
  98. package/esm/src/server/context/cache-invalidation.js +4 -0
  99. package/esm/src/server/handlers/dev/dashboard/api.js +4 -0
  100. package/esm/src/server/handlers/dev/projects/ui-handler.d.ts.map +1 -1
  101. package/esm/src/server/handlers/dev/projects/ui-handler.js +6 -0
  102. package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
  103. package/esm/src/transforms/esm/http-cache.js +145 -93
  104. package/esm/src/transforms/esm/transform-cache.d.ts +25 -0
  105. package/esm/src/transforms/esm/transform-cache.d.ts.map +1 -1
  106. package/esm/src/transforms/esm/transform-cache.js +45 -0
  107. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
  108. package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +2 -36
  109. package/esm/src/utils/constants/cache.d.ts +4 -0
  110. package/esm/src/utils/constants/cache.d.ts.map +1 -1
  111. package/esm/src/utils/constants/cache.js +14 -1
  112. package/esm/src/utils/index.d.ts +1 -1
  113. package/esm/src/utils/index.d.ts.map +1 -1
  114. package/esm/src/utils/index.js +1 -1
  115. package/package.json +2 -1
  116. package/src/deno.js +1 -1
  117. package/src/proxy/cache/index.ts +93 -0
  118. package/src/proxy/cache/memory-cache.ts +120 -0
  119. package/src/proxy/cache/redis-cache.ts +203 -0
  120. package/src/proxy/cache/resilient-cache.ts +205 -0
  121. package/src/proxy/cache/types.ts +72 -0
  122. package/src/proxy/handler.ts +593 -0
  123. package/src/proxy/logger.ts +329 -0
  124. package/src/proxy/oauth-client.ts +91 -0
  125. package/src/proxy/token-manager.ts +174 -0
  126. package/src/proxy/tracing.ts +237 -0
  127. package/src/src/cache/backend.ts +65 -0
  128. package/src/src/cache/cache-key-builder.ts +0 -9
  129. package/src/src/cache/hash.ts +205 -0
  130. package/src/src/cache/index.ts +3 -0
  131. package/src/src/cache/module-cache.ts +252 -0
  132. package/src/src/cache/multi-tier.ts +462 -0
  133. package/src/src/cli/app/actions.ts +190 -0
  134. package/src/src/cli/app/components/inline-input.ts +255 -0
  135. package/src/src/cli/app/components/list-select.ts +215 -0
  136. package/src/src/cli/app/index.ts +1471 -0
  137. package/src/src/cli/app/state.ts +385 -0
  138. package/src/src/cli/app/views/dashboard.ts +212 -0
  139. package/src/src/cli/index/command-router.ts +9 -40
  140. package/src/src/cli/index/start-handler.ts +195 -0
  141. package/src/src/cli/mcp/index.ts +11 -0
  142. package/src/src/cli/templates/integration-loader.ts +2 -8
  143. package/src/src/middleware/builtin/security/redis-rate-limit.ts +24 -11
  144. package/src/src/modules/react-loader/ssr-module-loader/cache/redis.ts +36 -50
  145. package/src/src/modules/react-loader/ssr-module-loader/loader.ts +168 -25
  146. package/src/src/observability/tracing/span-names.ts +2 -0
  147. package/src/src/platform/adapters/fs/cache/file-cache.ts +9 -3
  148. package/src/src/rendering/orchestrator/module-loader/cache.ts +14 -8
  149. package/src/src/rendering/orchestrator/module-loader/index.ts +94 -89
  150. package/src/src/server/context/cache-invalidation.ts +4 -0
  151. package/src/src/server/handlers/dev/dashboard/api.ts +2 -0
  152. package/src/src/server/handlers/dev/projects/ui-handler.ts +6 -0
  153. package/src/src/transforms/esm/http-cache.ts +160 -105
  154. package/src/src/transforms/esm/transform-cache.ts +53 -0
  155. package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +2 -40
  156. package/src/src/utils/constants/cache.ts +21 -1
  157. 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GZ,CAAC"}
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;IAoBnC;;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;IAmBtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAoB/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"}
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":"AAGA,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW/D;AAED,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvD;AAED,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEpD"}
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;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAUzE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA+DpE,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,CAuHjB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,CAiB3F"}
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 { TRANSFORM_CACHE_VERSION } from "../../../transforms/esm/package-registry.js";
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
- /** Cache for created directories to avoid repeated mkdir calls */
20
- const createdDirs = new Set();
21
- /**
22
- * Distributed transform cache for cross-pod sharing.
23
- * Caches transformed module code in Redis/API so other pods don't need to re-transform.
24
- */
25
- let distributedTransformCache;
26
- const distributedCacheInit = new Singleflight();
27
- /** TTL for cached transforms (24 hours) */
28
- const TRANSFORM_CACHE_TTL_SECONDS = 86400;
29
- function getDistributedTransformCache() {
30
- if (distributedTransformCache !== undefined) {
31
- return Promise.resolve(distributedTransformCache);
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
- return Math.abs(hash).toString(36);
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 transformCacheKey = getTransformCacheKey(effectiveProjectId, filePath, contentHash);
158
- let transformedCode = null;
159
- const distributedCache = await getDistributedTransformCache();
160
- if (distributedCache) {
161
- try {
162
- const cached = await distributedCache.get(transformCacheKey);
163
- if (cached) {
164
- transformedCode = cached;
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
- if (distributedCache) {
182
- distributedCache
183
- .set(transformCacheKey, transformedCode, TRANSFORM_CACHE_TTL_SECONDS)
184
- .catch((error) => {
185
- logger.debug("[ModuleLoader] Distributed cache set failed", { filePath, error });
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":"AAiBA,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,CA8Ff"}
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,CAwCvF"}
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":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAsCzE,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,eAAe,CAAC;IAC3B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAoUF;;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,CAwC9F;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,CAiFnB"}
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"}