veryfront 0.1.0-rc.1663 → 0.1.0-rc.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/src/errors/veryfront-error.d.ts +5 -1
- package/esm/src/errors/veryfront-error.d.ts.map +1 -1
- package/esm/src/html/styles-builder/tailwind-compiler.d.ts.map +1 -1
- package/esm/src/html/styles-builder/tailwind-compiler.js +24 -9
- package/esm/src/modules/react-loader/ssr-module-loader/http-bundle-helpers.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/http-bundle-helpers.js +6 -8
- 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 +35 -4
- package/esm/src/platform/adapters/fs/veryfront/stat-operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/stat-operations.js +3 -2
- package/esm/src/routing/registry/types.d.ts +1 -1
- package/esm/src/routing/registry/types.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/styles-css-handler.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/styles-css-handler.js +9 -4
- package/esm/src/transforms/esm/import-parser.js +5 -1
- package/esm/src/transforms/mdx/esm-module-loader/jsx-cache.d.ts +13 -0
- package/esm/src/transforms/mdx/esm-module-loader/jsx-cache.d.ts.map +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/jsx-cache.js +37 -0
- package/esm/src/transforms/mdx/esm-module-loader/loader.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/loader.js +28 -8
- package/esm/src/transforms/mdx/esm-module-loader/missing-module.d.ts +13 -0
- package/esm/src/transforms/mdx/esm-module-loader/missing-module.d.ts.map +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/missing-module.js +43 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts +15 -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 +61 -8
- package/esm/src/transforms/mdx/esm-module-loader/resolution/file-finder.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/resolution/file-finder.js +10 -2
- package/esm/src/transforms/mdx/esm-module-loader/types.d.ts +10 -0
- package/esm/src/transforms/mdx/esm-module-loader/types.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/index.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/index.js +31 -1
- package/esm/src/utils/constants/cache.d.ts.map +1 -1
- package/esm/src/utils/constants/cache.js +4 -2
- package/package.json +1 -1
- package/src/src/errors/veryfront-error.ts +6 -1
- package/src/src/html/styles-builder/tailwind-compiler.ts +27 -9
- package/src/src/modules/react-loader/ssr-module-loader/http-bundle-helpers.ts +6 -10
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +38 -4
- package/src/src/platform/adapters/fs/veryfront/stat-operations.ts +5 -2
- package/src/src/routing/registry/types.ts +1 -0
- package/src/src/server/handlers/dev/styles-css-handler.ts +10 -3
- package/src/src/transforms/esm/import-parser.ts +6 -1
- package/src/src/transforms/mdx/esm-module-loader/jsx-cache.ts +41 -0
- package/src/src/transforms/mdx/esm-module-loader/loader.ts +41 -7
- package/src/src/transforms/mdx/esm-module-loader/missing-module.ts +61 -0
- package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +96 -6
- package/src/src/transforms/mdx/esm-module-loader/resolution/file-finder.ts +13 -2
- package/src/src/transforms/mdx/esm-module-loader/types.ts +10 -0
- package/src/src/transforms/pipeline/index.ts +40 -1
- package/src/src/utils/constants/cache.ts +4 -2
|
@@ -3,7 +3,7 @@ export interface BuildContext {
|
|
|
3
3
|
line?: number;
|
|
4
4
|
column?: number;
|
|
5
5
|
moduleId?: string;
|
|
6
|
-
phase?: "parse" | "transform" | "bundle" | "optimize" | "dependency-resolution" | "circuit-breaker";
|
|
6
|
+
phase?: "parse" | "transform" | "bundle" | "optimize" | "dependency-resolution" | "circuit-breaker" | "http-bundle-validation";
|
|
7
7
|
/** Number of failures (for circuit breaker) */
|
|
8
8
|
failures?: number;
|
|
9
9
|
/** Missing dependencies list */
|
|
@@ -12,6 +12,10 @@ export interface BuildContext {
|
|
|
12
12
|
fromFile: string;
|
|
13
13
|
reason: string;
|
|
14
14
|
}>;
|
|
15
|
+
/** Failed HTTP bundle specifiers */
|
|
16
|
+
failed?: string[];
|
|
17
|
+
/** Cache directory path */
|
|
18
|
+
cacheDir?: string;
|
|
15
19
|
}
|
|
16
20
|
export interface APIContext {
|
|
17
21
|
endpoint?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"veryfront-error.d.ts","sourceRoot":"","sources":["../../../src/src/errors/veryfront-error.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EACF,OAAO,GACP,WAAW,GACX,QAAQ,GACR,UAAU,GACV,uBAAuB,GACvB,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"veryfront-error.d.ts","sourceRoot":"","sources":["../../../src/src/errors/veryfront-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-compiler.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/tailwind-compiler.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA2ED;;;;;GAKG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAuBlE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"tailwind-compiler.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/tailwind-compiler.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA2ED;;;;;GAKG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAuBlE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAiG5D;AAUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAY9D;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF;AAkCD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAqCD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe/E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7D;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyBjF;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAkFD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqD3F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW3D;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,GAAG,CAAC,MAAM,CAAC,CAcb;AAoDD,wBAAgB,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAelD;AAiFD,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E,CAWA;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,YAAY,CA4ClE;AAED,2EAA2E;AAC3E,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxE;AAED,kDAAkD;AAClD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE"}
|
|
@@ -129,8 +129,13 @@ export async function getProjectCSS(projectSlug, stylesheet, candidates, options
|
|
|
129
129
|
// Generate CSS (cache miss)
|
|
130
130
|
const result = await generateTailwindCSS(stylesheet, candidates, options);
|
|
131
131
|
if (result.error) {
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
const formatted = formatCSSError(result.error);
|
|
133
|
+
logger.error("[tailwind] Project CSS generation failed", {
|
|
134
|
+
projectSlug,
|
|
135
|
+
error: formatted.message,
|
|
136
|
+
suggestion: formatted.suggestion,
|
|
137
|
+
});
|
|
138
|
+
throw new Error(`[tailwind] ${formatted.title}: ${formatted.message} Suggestion: ${formatted.suggestion}`);
|
|
134
139
|
}
|
|
135
140
|
const hash = hashCSS(result.css);
|
|
136
141
|
const entry = { css: result.css, hash, candidatesHash };
|
|
@@ -492,11 +497,11 @@ async function loadPlugin(id, pluginCache, pluginErrors) {
|
|
|
492
497
|
mod = await import(id);
|
|
493
498
|
}
|
|
494
499
|
catch {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
500
|
+
const errorMsg = `Failed to load plugin "${id}": plugin not installed`;
|
|
501
|
+
logger.warn("[tailwind] Plugin not installed", { id });
|
|
502
|
+
pluginErrors.set(id, errorMsg);
|
|
498
503
|
pluginCache.set(id, null);
|
|
499
|
-
|
|
504
|
+
throw new Error(errorMsg);
|
|
500
505
|
}
|
|
501
506
|
}
|
|
502
507
|
const plugin = mod.default ?? mod;
|
|
@@ -561,10 +566,11 @@ async function getCompiler(stylesheet) {
|
|
|
561
566
|
},
|
|
562
567
|
loadModule: async (id) => {
|
|
563
568
|
const plugin = await loadPlugin(id, pluginCache, pluginErrors);
|
|
564
|
-
|
|
565
|
-
|
|
569
|
+
if (!plugin) {
|
|
570
|
+
throw new Error(`Failed to load plugin "${id}": plugin not installed`);
|
|
571
|
+
}
|
|
566
572
|
// deno-lint-ignore no-explicit-any
|
|
567
|
-
return { module:
|
|
573
|
+
return { module: plugin, base: "/", path: "/" };
|
|
568
574
|
},
|
|
569
575
|
});
|
|
570
576
|
// Evict oldest entry if at capacity
|
|
@@ -639,6 +645,15 @@ export async function generateTailwindCSS(stylesheet, candidates, options) {
|
|
|
639
645
|
}
|
|
640
646
|
export function formatCSSError(error) {
|
|
641
647
|
const msg = typeof error === "string" ? error : error.message;
|
|
648
|
+
if (msg.includes("does not accept options")) {
|
|
649
|
+
const pluginMatch = msg.match(/"([^"]+)"/);
|
|
650
|
+
const pluginName = pluginMatch?.[1] ?? "unknown plugin";
|
|
651
|
+
return {
|
|
652
|
+
title: "Plugin Options Not Supported",
|
|
653
|
+
message: `${pluginName} does not accept options in Tailwind CSS v4`,
|
|
654
|
+
suggestion: `Remove the options block from @plugin. Use: @plugin "${pluginName}";`,
|
|
655
|
+
};
|
|
656
|
+
}
|
|
642
657
|
if (msg.includes("Could not resolve") || msg.includes("Failed to load plugin")) {
|
|
643
658
|
const pluginMatch = msg.match(/plugin\s*["']([^"']+)["']/i) || msg.match(/"([^"]+)"/);
|
|
644
659
|
const pluginName = pluginMatch?.[1] ?? "unknown";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-bundle-helpers.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/http-bundle-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"http-bundle-helpers.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/http-bundle-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAe1F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAc1D;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,wBAAmD,CAAC"}
|
|
@@ -7,16 +7,14 @@
|
|
|
7
7
|
* @module module-system/react-loader/ssr-module-loader/http-bundle-helpers
|
|
8
8
|
*/
|
|
9
9
|
import { LRUCache } from "../../../utils/lru-wrapper.js";
|
|
10
|
-
/** Pattern to match HTTP bundle file:// paths in transformed code */
|
|
11
|
-
const HTTP_BUNDLE_PATTERN = /file:\/\/([^"'\s]+veryfront-http-bundle\/http-([a-f0-9]+)\.mjs)/gi;
|
|
12
|
-
/** Pattern to match ALL file:// paths in transformed code (local imports + HTTP bundles) */
|
|
13
|
-
const ALL_FILE_PATHS_PATTERN = /file:\/\/([^"'\s]+\.(?:mjs|js))/gi;
|
|
14
10
|
/** Extract HTTP bundle paths from transformed code for proactive recovery */
|
|
15
11
|
export function extractHttpBundlePaths(code) {
|
|
12
|
+
// Create regex per call to avoid shared lastIndex state across concurrent calls.
|
|
13
|
+
const httpBundlePattern = /file:\/\/([^"'\s]+veryfront-http-bundle\/http-([a-f0-9]+)\.mjs)/gi;
|
|
16
14
|
const bundles = [];
|
|
17
15
|
const seen = new Set();
|
|
18
16
|
let match;
|
|
19
|
-
while ((match =
|
|
17
|
+
while ((match = httpBundlePattern.exec(code)) !== null) {
|
|
20
18
|
const path = match[1];
|
|
21
19
|
const hash = match[2];
|
|
22
20
|
if (!seen.has(hash)) {
|
|
@@ -24,7 +22,6 @@ export function extractHttpBundlePaths(code) {
|
|
|
24
22
|
bundles.push({ path, hash });
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
|
-
HTTP_BUNDLE_PATTERN.lastIndex = 0;
|
|
28
25
|
return bundles;
|
|
29
26
|
}
|
|
30
27
|
/**
|
|
@@ -34,17 +31,18 @@ export function extractHttpBundlePaths(code) {
|
|
|
34
31
|
* other pods with different temp directories.
|
|
35
32
|
*/
|
|
36
33
|
export function extractAllFilePaths(code) {
|
|
34
|
+
// Create regex per call to avoid shared lastIndex state across concurrent calls.
|
|
35
|
+
const allFilePathsPattern = /file:\/\/([^"'\s]+\.(?:mjs|js))/gi;
|
|
37
36
|
const paths = [];
|
|
38
37
|
const seen = new Set();
|
|
39
38
|
let match;
|
|
40
|
-
while ((match =
|
|
39
|
+
while ((match = allFilePathsPattern.exec(code)) !== null) {
|
|
41
40
|
const path = match[1];
|
|
42
41
|
if (!seen.has(path)) {
|
|
43
42
|
seen.add(path);
|
|
44
43
|
paths.push(path);
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
|
-
ALL_FILE_PATHS_PATTERN.lastIndex = 0;
|
|
48
46
|
return paths;
|
|
49
47
|
}
|
|
50
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/loader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AA0CpC,OAAO,KAAK,EAAoB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAY3E;;;;;GAKG;AACH,qBAAa,eAAe;IAKd,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,EAAE,CAAsB;IAChC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAqB;gBAEzB,OAAO,EAAE,sBAAsB;IAEnD,2DAA2D;IAC3D,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/loader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AA0CpC,OAAO,KAAK,EAAoB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAY3E;;;;;GAKG;AACH,qBAAa,eAAe;IAKd,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,EAAE,CAAsB;IAChC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAqB;gBAEzB,OAAO,EAAE,sBAAsB;IAEnD,2DAA2D;IAC3D,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IA4HxD,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,yBAAyB;IAuBjC,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;YACW,2BAA2B;IAqHzC,OAAO,CAAC,yBAAyB;YAiBnB,2BAA2B;IAoczC;;;OAGG;YACW,mBAAmB;YA2CnB,uBAAuB;IAyCrC;;;OAGG;YACW,gBAAgB;YAgBhB,WAAW;YAeX,YAAY;CA6B3B"}
|
|
@@ -107,7 +107,11 @@ export class SSRModuleLoader {
|
|
|
107
107
|
mod = await import(`file://${cacheEntry.tempPath}?v=${cacheEntry.contentHash}&retry=1`);
|
|
108
108
|
}
|
|
109
109
|
else {
|
|
110
|
-
|
|
110
|
+
// Recovery failed — invalidate cache so the next request triggers
|
|
111
|
+
// a fresh transform instead of hitting the same broken entry.
|
|
112
|
+
const cacheKey = this.getCacheKey(filePath);
|
|
113
|
+
globalModuleCache.delete(cacheKey);
|
|
114
|
+
logger.error("[SSR-MODULE-LOADER] HTTP bundle recovery failed, cache invalidated", {
|
|
111
115
|
hash,
|
|
112
116
|
file: filePath.slice(-40),
|
|
113
117
|
cacheDir,
|
|
@@ -613,21 +617,48 @@ export class SSRModuleLoader {
|
|
|
613
617
|
const cacheDir = getHttpBundleCacheDir();
|
|
614
618
|
const failed = await ensureHttpBundlesExist(bundlePaths, cacheDir);
|
|
615
619
|
if (failed.length > 0) {
|
|
616
|
-
logger.
|
|
620
|
+
logger.error("[SSR-MODULE-LOADER] Unrecoverable HTTP bundles", {
|
|
617
621
|
file: filePath.slice(-40),
|
|
618
622
|
failed,
|
|
619
623
|
totalBundles: bundlePaths.length,
|
|
620
624
|
cacheDir,
|
|
621
625
|
source: "fresh-transform",
|
|
622
626
|
});
|
|
627
|
+
throw toError(createError({
|
|
628
|
+
type: "build",
|
|
629
|
+
message: `Missing HTTP bundles after transform (${failed.length}).`,
|
|
630
|
+
context: {
|
|
631
|
+
file: filePath,
|
|
632
|
+
phase: "http-bundle-validation",
|
|
633
|
+
failed,
|
|
634
|
+
cacheDir,
|
|
635
|
+
},
|
|
636
|
+
}));
|
|
623
637
|
}
|
|
624
638
|
}
|
|
625
639
|
// Hash the TRANSFORMED content (after import rewrites) for cache busting
|
|
626
640
|
// This ensures Deno's module cache is invalidated when dependencies change
|
|
627
641
|
const transformedHash = await this.hashContentAsync(transformed);
|
|
628
642
|
const tempPath = await this.getTempPath(filePath, transformedHash);
|
|
629
|
-
|
|
630
|
-
|
|
643
|
+
try {
|
|
644
|
+
await this.fs.mkdir(tempPath.substring(0, tempPath.lastIndexOf("/")), {
|
|
645
|
+
recursive: true,
|
|
646
|
+
});
|
|
647
|
+
await this.fs.writeTextFile(tempPath, transformed);
|
|
648
|
+
}
|
|
649
|
+
catch (writeError) {
|
|
650
|
+
// Cache directory may have been removed during test cleanup or pod shutdown.
|
|
651
|
+
// Log and continue - the module will be re-transformed on next request.
|
|
652
|
+
if (writeError?.code === "ENOENT" ||
|
|
653
|
+
(writeError instanceof dntShim.Deno.errors.NotFound)) {
|
|
654
|
+
logger.debug("[SSR-MODULE-LOADER] Cache write skipped (directory removed)", {
|
|
655
|
+
filePath,
|
|
656
|
+
tempPath,
|
|
657
|
+
});
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
throw writeError;
|
|
661
|
+
}
|
|
631
662
|
if (isSSRDistributedCacheEnabled()) {
|
|
632
663
|
setInRedis(contentCacheKey, transformed, {
|
|
633
664
|
isProduction: this.isProductionContentSource(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stat-operations.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/stat-operations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAYnE,qBAAa,cAAc;IAcvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAhBnC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,aAAa,CAA8B;IAEnD,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,OAAO,CAAC,WAAW,CAAkC;IAErD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,sBAAsB,CAAK;gBAGhB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,sBAAsB,YAAA;IAG3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YA+DvB,gBAAgB;YAwChB,UAAU;IA0DxB,UAAU,IAAI,IAAI;IAMlB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;YAIpC,cAAc;IAiEtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"stat-operations.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/stat-operations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAYnE,qBAAa,cAAc;IAcvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAhBnC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,aAAa,CAA8B;IAEnD,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,OAAO,CAAC,WAAW,CAAkC;IAErD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,sBAAsB,CAAK;gBAGhB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,sBAAsB,YAAA;IAG3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YA+DvB,gBAAgB;YAwChB,UAAU;IA0DxB,UAAU,IAAI,IAAI;IAMlB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;YAIpC,cAAc;IAiEtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA8K5D"}
|
|
@@ -4,7 +4,7 @@ import { buildFileCacheKeyPrefix, buildFileListCacheKey, buildStatCacheKeyPrefix
|
|
|
4
4
|
import { withSpan } from "../../../../observability/tracing/otlp-setup.js";
|
|
5
5
|
const EXTENSION_PRIORITY = [".mdx", ".md", ".tsx", ".jsx", ".ts", ".js"];
|
|
6
6
|
const NOT_FOUND_SENTINEL = "__NOT_FOUND__";
|
|
7
|
-
const FRAMEWORK_PREFIXES = ["exports/", "react/", "veryfront/"];
|
|
7
|
+
const FRAMEWORK_PREFIXES = ["exports/", "react/", "veryfront/", "node_modules/veryfront/"];
|
|
8
8
|
export class StatOperations {
|
|
9
9
|
client;
|
|
10
10
|
cache;
|
|
@@ -296,7 +296,8 @@ export class StatOperations {
|
|
|
296
296
|
});
|
|
297
297
|
return indexPath;
|
|
298
298
|
}
|
|
299
|
-
if (FRAMEWORK_PREFIXES.some((prefix) => normalizedPath.startsWith(prefix))
|
|
299
|
+
if (FRAMEWORK_PREFIXES.some((prefix) => normalizedPath.startsWith(prefix)) ||
|
|
300
|
+
normalizedPath.includes("node_modules/veryfront/")) {
|
|
300
301
|
logger.debug("[StatOperations] Skipping API search for framework path", { normalizedPath });
|
|
301
302
|
return null;
|
|
302
303
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { Handler, HandlerContext, HandlerPriority, RouteRegistryConfig, } from "../../types/index.js";
|
|
1
|
+
export type { Handler, HandlerContext, HandlerPriority, HandlerResult, RouteRegistryConfig, } from "../../types/index.js";
|
|
2
2
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/registry/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/registry/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,aAAa,EACb,mBAAmB,GACpB,MAAM,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles-css-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/dev/styles-css-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"styles-css-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/dev/styles-css-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAcnG,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;YAmEjE,cAAc;YAqBd,wBAAwB;IA2CtC;;;OAGG;YACW,cAAc;CAkD7B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseHandler } from "../response/base.js";
|
|
2
2
|
import { HTTP_OK, PRIORITY_HIGH_DEV } from "../../../utils/constants/index.js";
|
|
3
3
|
import { joinPath } from "../../../utils/path-utils.js";
|
|
4
|
-
import { extractCandidates, generateTailwindCSS, } from "../../../html/styles-builder/tailwind-compiler.js";
|
|
4
|
+
import { extractCandidates, formatCSSError, generateTailwindCSS, } from "../../../html/styles-builder/tailwind-compiler.js";
|
|
5
5
|
import { serverLogger as logger } from "../../../utils/index.js";
|
|
6
6
|
import { createFileSystem } from "../../../platform/compat/fs.js";
|
|
7
7
|
import { join } from "../../../platform/compat/path/index.js";
|
|
@@ -23,18 +23,23 @@ export class StylesCSSHandler extends BaseHandler {
|
|
|
23
23
|
const candidates = await this.extractProjectCandidates(ctx);
|
|
24
24
|
const result = await generateTailwindCSS(rawCss, candidates);
|
|
25
25
|
if (result.error) {
|
|
26
|
-
|
|
26
|
+
const formatted = formatCSSError(result.error);
|
|
27
|
+
logger.error("[StylesCSSHandler] Tailwind error", {
|
|
28
|
+
error: formatted.message,
|
|
29
|
+
suggestion: formatted.suggestion,
|
|
30
|
+
});
|
|
31
|
+
const errorMessage = `${formatted.title}: ${formatted.message}\nSuggestion: ${formatted.suggestion}`;
|
|
27
32
|
// Surface error in CSS so developers can see it
|
|
28
33
|
const errorCSS = `/*
|
|
29
34
|
╔══════════════════════════════════════════════════════════════╗
|
|
30
35
|
║ TAILWIND CSS COMPILATION ERROR ║
|
|
31
36
|
╠══════════════════════════════════════════════════════════════╣
|
|
32
|
-
║ ${
|
|
37
|
+
║ ${errorMessage.replace(/\n/g, "\n ║ ")}
|
|
33
38
|
╚══════════════════════════════════════════════════════════════╝
|
|
34
39
|
*/
|
|
35
40
|
|
|
36
41
|
body::before {
|
|
37
|
-
content: "CSS Error: ${
|
|
42
|
+
content: "CSS Error: ${errorMessage.replace(/"/g, '\\"').replace(/\n/g, " ")}";
|
|
38
43
|
position: fixed;
|
|
39
44
|
top: 0;
|
|
40
45
|
left: 0;
|
|
@@ -132,7 +132,11 @@ async function resolveAliasImportPath(basePath, projectDir, adapter) {
|
|
|
132
132
|
if (found)
|
|
133
133
|
return found;
|
|
134
134
|
}
|
|
135
|
-
|
|
135
|
+
// Skip the API adapter for paths that are clearly framework-internal
|
|
136
|
+
// (e.g. "usr/local/lib/node_modules/veryfront/..." after leading-slash stripping).
|
|
137
|
+
const isFrameworkPath = normalizedPath.includes("node_modules/veryfront/") ||
|
|
138
|
+
(FRAMEWORK_ROOT && normalizedPath.startsWith(FRAMEWORK_ROOT.replace(/^\/+/, "")));
|
|
139
|
+
if (adapter?.fs.resolveFile && !isFrameworkPath) {
|
|
136
140
|
try {
|
|
137
141
|
const resolved = await adapter.fs.resolveFile(normalizedPath);
|
|
138
142
|
if (resolved)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cached JSX module normalization utilities.
|
|
3
|
+
*
|
|
4
|
+
* Ensures cached JSX modules don't contain relative _dnt.* imports that break
|
|
5
|
+
* when the file is moved into the MDX cache directory.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validate and patch a cached JSX module in-place.
|
|
9
|
+
*
|
|
10
|
+
* Returns true if the cached module is usable, false if it should be re-generated.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureCachedJsxModulePatched(transformedPath: string, sourceFilePath: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=jsx-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-cache.d.ts","sourceRoot":"","sources":["../../../../../src/src/transforms/mdx/esm-module-loader/jsx-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cached JSX module normalization utilities.
|
|
3
|
+
*
|
|
4
|
+
* Ensures cached JSX modules don't contain relative _dnt.* imports that break
|
|
5
|
+
* when the file is moved into the MDX cache directory.
|
|
6
|
+
*/
|
|
7
|
+
import { rendererLogger as logger } from "../../../utils/index.js";
|
|
8
|
+
import { LOG_PREFIX_MDX_LOADER } from "./constants.js";
|
|
9
|
+
import { getLocalFs } from "./cache/index.js";
|
|
10
|
+
import { rewriteDntImports } from "./module-fetcher/index.js";
|
|
11
|
+
/**
|
|
12
|
+
* Validate and patch a cached JSX module in-place.
|
|
13
|
+
*
|
|
14
|
+
* Returns true if the cached module is usable, false if it should be re-generated.
|
|
15
|
+
*/
|
|
16
|
+
export async function ensureCachedJsxModulePatched(transformedPath, sourceFilePath) {
|
|
17
|
+
try {
|
|
18
|
+
const cachedCode = await getLocalFs().readTextFile(transformedPath);
|
|
19
|
+
const rewritten = rewriteDntImports(cachedCode, sourceFilePath);
|
|
20
|
+
if (rewritten !== cachedCode) {
|
|
21
|
+
await getLocalFs().writeTextFile(transformedPath, rewritten);
|
|
22
|
+
logger.debug(`${LOG_PREFIX_MDX_LOADER} Rewrote cached JSX dnt imports`, {
|
|
23
|
+
sourceFilePath,
|
|
24
|
+
transformedPath,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger.debug(`${LOG_PREFIX_MDX_LOADER} Failed to read cached JSX module`, {
|
|
31
|
+
sourceFilePath,
|
|
32
|
+
transformedPath,
|
|
33
|
+
error: error instanceof Error ? error.message : String(error),
|
|
34
|
+
});
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/transforms/mdx/esm-module-loader/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/transforms/mdx/esm-module-loader/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA8YnD,wBAAsB,aAAa,CACjC,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,SAAS,CAAC,CAWpB"}
|
|
@@ -25,7 +25,9 @@ import { ESBUILD_JSX_FACTORY, ESBUILD_JSX_FRAGMENT, FRAMEWORK_ROOT, JSX_IMPORT_P
|
|
|
25
25
|
import { getLocalFs } from "./cache/index.js";
|
|
26
26
|
import { hashString } from "./utils/hash.js";
|
|
27
27
|
import { createStubModule } from "./utils/stub-module.js";
|
|
28
|
-
import { createModuleFetcherContext, fetchAndCacheModule } from "./module-fetcher/index.js";
|
|
28
|
+
import { createModuleFetcherContext, fetchAndCacheModule, rewriteDntImports, } from "./module-fetcher/index.js";
|
|
29
|
+
import { ensureCachedJsxModulePatched } from "./jsx-cache.js";
|
|
30
|
+
import { buildMissingModuleError } from "./missing-module.js";
|
|
29
31
|
/** Singleflight for MDX module file writes to prevent race conditions */
|
|
30
32
|
const mdxWriteFlight = new Singleflight();
|
|
31
33
|
function resolveProjectDir(context) {
|
|
@@ -134,7 +136,7 @@ function findVfModuleImports(code) {
|
|
|
134
136
|
/**
|
|
135
137
|
* Process /_vf_modules/ imports and replace them with file:// paths.
|
|
136
138
|
*/
|
|
137
|
-
async function processVfModuleImports(code, imports, context, projectDir) {
|
|
139
|
+
async function processVfModuleImports(code, imports, context, projectDir, strictMissingModules) {
|
|
138
140
|
const projectSlug = context.projectSlug || "unknown";
|
|
139
141
|
const adapter = context.adapter;
|
|
140
142
|
if (!adapter) {
|
|
@@ -162,6 +164,7 @@ async function processVfModuleImports(code, imports, context, projectDir) {
|
|
|
162
164
|
project_id: context.projectId,
|
|
163
165
|
project_slug: context.projectSlug,
|
|
164
166
|
}),
|
|
167
|
+
strictMissingModules,
|
|
165
168
|
});
|
|
166
169
|
const fetchStart = performance.now();
|
|
167
170
|
const results = await Promise.all(imports.map(async ({ original, path }, index) => {
|
|
@@ -197,6 +200,15 @@ async function processVfModuleImports(code, imports, context, projectDir) {
|
|
|
197
200
|
result = result.replace(original, `from "file://${filePath}"`);
|
|
198
201
|
continue;
|
|
199
202
|
}
|
|
203
|
+
if (strictMissingModules) {
|
|
204
|
+
throw buildMissingModuleError({
|
|
205
|
+
modulePath: path,
|
|
206
|
+
importer: projectSlug,
|
|
207
|
+
importStatement: original,
|
|
208
|
+
code,
|
|
209
|
+
projectSlug,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
200
212
|
const stubPath = await createStubModule(path, result, original, context.esmCacheDir);
|
|
201
213
|
if (stubPath)
|
|
202
214
|
result = result.replace(original, `from "file://${stubPath}"`);
|
|
@@ -235,11 +247,14 @@ async function transformJsxImports(code, adapter, esmCacheDir) {
|
|
|
235
247
|
try {
|
|
236
248
|
const stat = await getLocalFs().stat(transformedPath);
|
|
237
249
|
if (stat?.isFile) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
250
|
+
const useCached = await ensureCachedJsxModulePatched(transformedPath, filePath);
|
|
251
|
+
if (useCached) {
|
|
252
|
+
return {
|
|
253
|
+
original: fullMatch,
|
|
254
|
+
transformed: `import ${importClause} from "file://${transformedPath}";`,
|
|
255
|
+
cached: true,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
243
258
|
}
|
|
244
259
|
}
|
|
245
260
|
catch {
|
|
@@ -267,6 +282,10 @@ async function transformJsxImports(code, adapter, esmCacheDir) {
|
|
|
267
282
|
if (!REACT_IMPORT_PATTERN.test(transformed)) {
|
|
268
283
|
transformed = `import React from 'react';\n${transformed}`;
|
|
269
284
|
}
|
|
285
|
+
// Rewrite _dnt.polyfills.js / _dnt.shims.js relative imports to absolute file:// paths.
|
|
286
|
+
// Framework files from the npm package contain relative dnt imports that resolve
|
|
287
|
+
// incorrectly when cached to a different directory.
|
|
288
|
+
transformed = rewriteDntImports(transformed, filePath);
|
|
270
289
|
await getLocalFs().writeTextFile(transformedPath, transformed);
|
|
271
290
|
return {
|
|
272
291
|
original: fullMatch,
|
|
@@ -336,7 +355,8 @@ async function doLoadModuleESM(compiledProgramCode, context) {
|
|
|
336
355
|
rewritten = transformImports(rewritten, importMap);
|
|
337
356
|
logger.debug(`${LOG_PREFIX_MDX_LOADER} Step: processVfModuleImports START`, { projectSlug });
|
|
338
357
|
const vfModuleImports = findVfModuleImports(rewritten);
|
|
339
|
-
|
|
358
|
+
const strictMissingModules = context.strictMissingModules ?? true;
|
|
359
|
+
rewritten = await withSpan(SpanNames.MDX_PROCESS_VF_MODULES, () => processVfModuleImports(rewritten, vfModuleImports, context, projectDir, strictMissingModules), { "mdx.vf_module_count": vfModuleImports.length });
|
|
340
360
|
logger.debug(`${LOG_PREFIX_MDX_LOADER} Step: processVfModuleImports DONE`, { projectSlug });
|
|
341
361
|
logger.debug(`${LOG_PREFIX_MDX_LOADER} Step: transformJsxImports START`, { projectSlug });
|
|
342
362
|
rewritten = await withSpan(SpanNames.MDX_TRANSFORM_JSX, () => transformJsxImports(rewritten, adapter, esmCacheDir), { "mdx.project_slug": projectSlug });
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Missing module error helpers for MDX ESM loader.
|
|
3
|
+
*/
|
|
4
|
+
type MissingModuleContext = {
|
|
5
|
+
modulePath: string;
|
|
6
|
+
importer?: string;
|
|
7
|
+
importStatement?: string;
|
|
8
|
+
code?: string;
|
|
9
|
+
projectSlug?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function buildMissingModuleError(ctx: MissingModuleContext): Error;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=missing-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-module.d.ts","sourceRoot":"","sources":["../../../../../src/src/transforms/mdx/esm-module-loader/missing-module.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAcF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,KAAK,CAiCxE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Missing module error helpers for MDX ESM loader.
|
|
3
|
+
*/
|
|
4
|
+
import { getErrorCollector } from "../../../cli/mcp/error-collector.js";
|
|
5
|
+
import { extractNamedImports } from "./utils/stub-module.js";
|
|
6
|
+
function getSuggestion(modulePath, namedImports) {
|
|
7
|
+
if (modulePath.includes("lib/utils")) {
|
|
8
|
+
const missingCn = namedImports.includes("cn");
|
|
9
|
+
if (missingCn) {
|
|
10
|
+
return "Add lib/utils.ts exporting `cn`, or remove the `cn` import.";
|
|
11
|
+
}
|
|
12
|
+
return "Add lib/utils.ts or update the import path.";
|
|
13
|
+
}
|
|
14
|
+
return "Ensure the file exists in the project and is included in the release.";
|
|
15
|
+
}
|
|
16
|
+
export function buildMissingModuleError(ctx) {
|
|
17
|
+
const namedImports = ctx.code && ctx.importStatement
|
|
18
|
+
? extractNamedImports(ctx.code, ctx.importStatement)
|
|
19
|
+
: [];
|
|
20
|
+
const parts = [];
|
|
21
|
+
parts.push(`[MDX] Missing module: ${ctx.modulePath}.`);
|
|
22
|
+
if (ctx.importer)
|
|
23
|
+
parts.push(`Imported by: ${ctx.importer}.`);
|
|
24
|
+
if (namedImports.length > 0) {
|
|
25
|
+
parts.push(`Missing exports: ${namedImports.join(", ")}.`);
|
|
26
|
+
}
|
|
27
|
+
parts.push(`Suggestion: ${getSuggestion(ctx.modulePath, namedImports)}`);
|
|
28
|
+
const message = parts.join(" ");
|
|
29
|
+
const error = new Error(message);
|
|
30
|
+
error.name = "MissingModuleError";
|
|
31
|
+
try {
|
|
32
|
+
getErrorCollector().addModuleError(message, ctx.modulePath, {
|
|
33
|
+
importer: ctx.importer,
|
|
34
|
+
namedImports,
|
|
35
|
+
importStatement: ctx.importStatement,
|
|
36
|
+
projectSlug: ctx.projectSlug,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Error collector may not be initialized in all contexts
|
|
41
|
+
}
|
|
42
|
+
return error;
|
|
43
|
+
}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import type { Logger } from "../../../../utils/logger/logger.js";
|
|
2
2
|
import type { RuntimeAdapter } from "../../../../platform/adapters/base.js";
|
|
3
3
|
import type { ModuleFetcherContext } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Rewrite _dnt.polyfills.js and _dnt.shims.js relative imports to absolute file:// paths.
|
|
6
|
+
*
|
|
7
|
+
* The dnt (Deno-to-Node) build tool generates relative imports like:
|
|
8
|
+
* import "../../../_dnt.polyfills.js"
|
|
9
|
+
* import * as dntShim from "../../_dnt.shims.js"
|
|
10
|
+
*
|
|
11
|
+
* These resolve correctly when loaded from the npm package directory, but break when
|
|
12
|
+
* the transformed code is cached to a different directory (e.g., /app/.cache/veryfront-mdx-esm/...).
|
|
13
|
+
* The relative path would resolve to /app/.cache/_dnt.polyfills.js which doesn't exist.
|
|
14
|
+
*
|
|
15
|
+
* Fix: Replace relative _dnt imports with absolute file:// paths to the npm package.
|
|
16
|
+
*/
|
|
17
|
+
export declare function rewriteDntImports(code: string, sourceFilePath: string): string;
|
|
4
18
|
/**
|
|
5
19
|
* Start a render session to track module loading.
|
|
6
20
|
* Call this before rendering a page.
|
|
@@ -23,5 +37,6 @@ export declare function createModuleFetcherContext(esmCacheDir: string, adapter:
|
|
|
23
37
|
projectSlug?: string;
|
|
24
38
|
reactVersion?: string;
|
|
25
39
|
logger?: Logger;
|
|
40
|
+
strictMissingModules?: boolean;
|
|
26
41
|
}): ModuleFetcherContext;
|
|
27
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAGjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAiB5E,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAGjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAiB5E,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,aAAa,CAAC;AAqD5E;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAsB9E;AAsGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAmCxD;AAoOD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,EAC7B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB;AA6VD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,GACA,oBAAoB,CAUtB"}
|