veryfront 0.1.178 → 0.1.179
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/deno.js +1 -1
- package/esm/src/rendering/orchestrator/pipeline.d.ts +2 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +60 -52
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/rendering/orchestrator/pipeline.ts +92 -65
- package/src/src/utils/version-constant.ts +1 -1
package/esm/deno.js
CHANGED
|
@@ -76,6 +76,8 @@ export declare class RenderPipeline {
|
|
|
76
76
|
/** Resolve page data for SPA client-side navigation without rendering HTML. */
|
|
77
77
|
resolvePageData(slug: string, options?: RenderOptions): Promise<PageDataResponse>;
|
|
78
78
|
private extractMdxMetadata;
|
|
79
|
+
private resolvePageDataCss;
|
|
80
|
+
private generatePageCssFromHtml;
|
|
79
81
|
/**
|
|
80
82
|
* Build a cache key that is safe for multi-tenant + query-param aware caching.
|
|
81
83
|
* Returns null when request contains sensitive headers (Authorization/Cookie) and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AAyBD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,sBAAsB;YAIhB,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;IAiGjC,OAAO,CAAC,uBAAuB;IAkCzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA+P9E,+EAA+E;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAsGzE,kBAAkB;YA2ClB,kBAAkB;YAmElB,uBAAuB;IAmBrC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAetB"}
|
|
@@ -433,58 +433,7 @@ export class RenderPipeline {
|
|
|
433
433
|
break;
|
|
434
434
|
}
|
|
435
435
|
}
|
|
436
|
-
|
|
437
|
-
let cssError;
|
|
438
|
-
const cssCacheKey = getPageCssCacheKey(options?.projectId, options?.environment, slug, projectUpdatedAt);
|
|
439
|
-
const cachedCss = getCachedPageCss(cssCacheKey);
|
|
440
|
-
if (cachedCss) {
|
|
441
|
-
css = cachedCss;
|
|
442
|
-
resolvePageDataLog.debug("CSS cache hit", { slug, cssLength: css.length });
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
try {
|
|
446
|
-
const renderResult = await withTimeout(this.renderPage(slug, {
|
|
447
|
-
...options,
|
|
448
|
-
delivery: "string",
|
|
449
|
-
skipCacheCheck: true,
|
|
450
|
-
skipCachePersist: true,
|
|
451
|
-
}), CSS_SSR_TIMEOUT_MS, `CSS SSR for ${slug}`);
|
|
452
|
-
if (renderResult?.html) {
|
|
453
|
-
css = await this.resolveCssFromRenderedHtml(renderResult.html, options?.projectSlug ?? options?.projectId);
|
|
454
|
-
if (css) {
|
|
455
|
-
resolvePageDataLog.debug("Reused SSR CSS for page data", {
|
|
456
|
-
slug,
|
|
457
|
-
cssLength: css.length,
|
|
458
|
-
source: "rendered-html-hash",
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
else {
|
|
462
|
-
const candidates = extractCandidates(renderResult.html);
|
|
463
|
-
css = (await generateTailwindCSS(undefined, candidates, {
|
|
464
|
-
projectSlug: options?.projectSlug,
|
|
465
|
-
})).css;
|
|
466
|
-
resolvePageDataLog.debug("Fell back to HTML candidate CSS generation", {
|
|
467
|
-
slug,
|
|
468
|
-
htmlLength: renderResult.html.length,
|
|
469
|
-
cssLength: css?.length || 0,
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
if (css)
|
|
473
|
-
cachePageCss(cssCacheKey, css);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
catch (error) {
|
|
477
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
478
|
-
// Surface CSS generation failures instead of silently swallowing them.
|
|
479
|
-
// This allows clients to show a warning or fall back gracefully.
|
|
480
|
-
cssError = `CSS generation failed: ${errorMessage}`;
|
|
481
|
-
resolvePageDataLog.error("CSS generation failed", {
|
|
482
|
-
slug,
|
|
483
|
-
error: errorMessage,
|
|
484
|
-
projectId: options?.projectId,
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
}
|
|
436
|
+
const { css, cssError } = await this.resolvePageDataCss(slug, options, projectUpdatedAt);
|
|
488
437
|
resolvePageDataLog.debug("Resolved page data", {
|
|
489
438
|
slug,
|
|
490
439
|
pagePath,
|
|
@@ -540,6 +489,65 @@ export class RenderPipeline {
|
|
|
540
489
|
return { frontmatter: {}, headings: [] };
|
|
541
490
|
}
|
|
542
491
|
}
|
|
492
|
+
async resolvePageDataCss(slug, options, projectUpdatedAt) {
|
|
493
|
+
const cssCacheKey = getPageCssCacheKey(options?.projectId, options?.environment, slug, projectUpdatedAt);
|
|
494
|
+
const cachedCss = getCachedPageCss(cssCacheKey);
|
|
495
|
+
if (cachedCss) {
|
|
496
|
+
resolvePageDataLog.debug("CSS cache hit", { slug, cssLength: cachedCss.length });
|
|
497
|
+
return { css: cachedCss, cssError: undefined };
|
|
498
|
+
}
|
|
499
|
+
try {
|
|
500
|
+
const renderResult = await withTimeout(this.renderPage(slug, {
|
|
501
|
+
...options,
|
|
502
|
+
delivery: "string",
|
|
503
|
+
skipCacheCheck: true,
|
|
504
|
+
skipCachePersist: true,
|
|
505
|
+
}), CSS_SSR_TIMEOUT_MS, `CSS SSR for ${slug}`);
|
|
506
|
+
if (!renderResult?.html) {
|
|
507
|
+
return { css: undefined, cssError: undefined };
|
|
508
|
+
}
|
|
509
|
+
let css = await this.resolveCssFromRenderedHtml(renderResult.html, options?.projectSlug ?? options?.projectId);
|
|
510
|
+
if (css) {
|
|
511
|
+
resolvePageDataLog.debug("Reused SSR CSS for page data", {
|
|
512
|
+
slug,
|
|
513
|
+
cssLength: css.length,
|
|
514
|
+
source: "rendered-html-hash",
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
css = await this.generatePageCssFromHtml(slug, renderResult.html, options);
|
|
519
|
+
}
|
|
520
|
+
if (css)
|
|
521
|
+
cachePageCss(cssCacheKey, css);
|
|
522
|
+
return { css, cssError: undefined };
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
526
|
+
// Surface CSS generation failures instead of silently swallowing them.
|
|
527
|
+
// This allows clients to show a warning or fall back gracefully.
|
|
528
|
+
resolvePageDataLog.error("CSS generation failed", {
|
|
529
|
+
slug,
|
|
530
|
+
error: errorMessage,
|
|
531
|
+
projectId: options?.projectId,
|
|
532
|
+
});
|
|
533
|
+
return {
|
|
534
|
+
css: undefined,
|
|
535
|
+
cssError: `CSS generation failed: ${errorMessage}`,
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
async generatePageCssFromHtml(slug, html, options) {
|
|
540
|
+
const candidates = extractCandidates(html);
|
|
541
|
+
const generatedCss = (await generateTailwindCSS(undefined, candidates, {
|
|
542
|
+
projectSlug: options?.projectSlug,
|
|
543
|
+
})).css;
|
|
544
|
+
resolvePageDataLog.debug("Fell back to HTML candidate CSS generation", {
|
|
545
|
+
slug,
|
|
546
|
+
htmlLength: html.length,
|
|
547
|
+
cssLength: generatedCss?.length || 0,
|
|
548
|
+
});
|
|
549
|
+
return generatedCss;
|
|
550
|
+
}
|
|
543
551
|
/**
|
|
544
552
|
* Build a cache key that is safe for multi-tenant + query-param aware caching.
|
|
545
553
|
* Returns null when request contains sensitive headers (Authorization/Cookie) and
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.179";
|
|
2
2
|
//# sourceMappingURL=version-constant.d.ts.map
|
package/package.json
CHANGED
package/src/deno.js
CHANGED
|
@@ -116,6 +116,11 @@ interface MdxMetadataResult {
|
|
|
116
116
|
headings: Array<{ id: string; text: string; level: number }>;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
interface PageCssResult {
|
|
120
|
+
css: string | undefined;
|
|
121
|
+
cssError: string | undefined;
|
|
122
|
+
}
|
|
123
|
+
|
|
119
124
|
interface FetchedDataResult {
|
|
120
125
|
type: "page" | "layout";
|
|
121
126
|
id: string;
|
|
@@ -700,71 +705,7 @@ export class RenderPipeline {
|
|
|
700
705
|
}
|
|
701
706
|
}
|
|
702
707
|
|
|
703
|
-
|
|
704
|
-
let cssError: string | undefined;
|
|
705
|
-
const cssCacheKey = getPageCssCacheKey(
|
|
706
|
-
options?.projectId,
|
|
707
|
-
options?.environment,
|
|
708
|
-
slug,
|
|
709
|
-
projectUpdatedAt,
|
|
710
|
-
);
|
|
711
|
-
|
|
712
|
-
const cachedCss = getCachedPageCss(cssCacheKey);
|
|
713
|
-
if (cachedCss) {
|
|
714
|
-
css = cachedCss;
|
|
715
|
-
resolvePageDataLog.debug("CSS cache hit", { slug, cssLength: css.length });
|
|
716
|
-
} else {
|
|
717
|
-
try {
|
|
718
|
-
const renderResult = await withTimeout(
|
|
719
|
-
this.renderPage(slug, {
|
|
720
|
-
...options,
|
|
721
|
-
delivery: "string",
|
|
722
|
-
skipCacheCheck: true,
|
|
723
|
-
skipCachePersist: true,
|
|
724
|
-
}),
|
|
725
|
-
CSS_SSR_TIMEOUT_MS,
|
|
726
|
-
`CSS SSR for ${slug}`,
|
|
727
|
-
);
|
|
728
|
-
|
|
729
|
-
if (renderResult?.html) {
|
|
730
|
-
css = await this.resolveCssFromRenderedHtml(
|
|
731
|
-
renderResult.html,
|
|
732
|
-
options?.projectSlug ?? options?.projectId,
|
|
733
|
-
);
|
|
734
|
-
|
|
735
|
-
if (css) {
|
|
736
|
-
resolvePageDataLog.debug("Reused SSR CSS for page data", {
|
|
737
|
-
slug,
|
|
738
|
-
cssLength: css.length,
|
|
739
|
-
source: "rendered-html-hash",
|
|
740
|
-
});
|
|
741
|
-
} else {
|
|
742
|
-
const candidates = extractCandidates(renderResult.html);
|
|
743
|
-
css = (await generateTailwindCSS(undefined, candidates, {
|
|
744
|
-
projectSlug: options?.projectSlug,
|
|
745
|
-
})).css;
|
|
746
|
-
|
|
747
|
-
resolvePageDataLog.debug("Fell back to HTML candidate CSS generation", {
|
|
748
|
-
slug,
|
|
749
|
-
htmlLength: renderResult.html.length,
|
|
750
|
-
cssLength: css?.length || 0,
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
if (css) cachePageCss(cssCacheKey, css);
|
|
755
|
-
}
|
|
756
|
-
} catch (error) {
|
|
757
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
758
|
-
// Surface CSS generation failures instead of silently swallowing them.
|
|
759
|
-
// This allows clients to show a warning or fall back gracefully.
|
|
760
|
-
cssError = `CSS generation failed: ${errorMessage}`;
|
|
761
|
-
resolvePageDataLog.error("CSS generation failed", {
|
|
762
|
-
slug,
|
|
763
|
-
error: errorMessage,
|
|
764
|
-
projectId: options?.projectId,
|
|
765
|
-
});
|
|
766
|
-
}
|
|
767
|
-
}
|
|
708
|
+
const { css, cssError } = await this.resolvePageDataCss(slug, options, projectUpdatedAt);
|
|
768
709
|
|
|
769
710
|
resolvePageDataLog.debug("Resolved page data", {
|
|
770
711
|
slug,
|
|
@@ -838,6 +779,92 @@ export class RenderPipeline {
|
|
|
838
779
|
}
|
|
839
780
|
}
|
|
840
781
|
|
|
782
|
+
private async resolvePageDataCss(
|
|
783
|
+
slug: string,
|
|
784
|
+
options: RenderOptions | undefined,
|
|
785
|
+
projectUpdatedAt: string | undefined,
|
|
786
|
+
): Promise<PageCssResult> {
|
|
787
|
+
const cssCacheKey = getPageCssCacheKey(
|
|
788
|
+
options?.projectId,
|
|
789
|
+
options?.environment,
|
|
790
|
+
slug,
|
|
791
|
+
projectUpdatedAt,
|
|
792
|
+
);
|
|
793
|
+
|
|
794
|
+
const cachedCss = getCachedPageCss(cssCacheKey);
|
|
795
|
+
if (cachedCss) {
|
|
796
|
+
resolvePageDataLog.debug("CSS cache hit", { slug, cssLength: cachedCss.length });
|
|
797
|
+
return { css: cachedCss, cssError: undefined };
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
try {
|
|
801
|
+
const renderResult = await withTimeout(
|
|
802
|
+
this.renderPage(slug, {
|
|
803
|
+
...options,
|
|
804
|
+
delivery: "string",
|
|
805
|
+
skipCacheCheck: true,
|
|
806
|
+
skipCachePersist: true,
|
|
807
|
+
}),
|
|
808
|
+
CSS_SSR_TIMEOUT_MS,
|
|
809
|
+
`CSS SSR for ${slug}`,
|
|
810
|
+
);
|
|
811
|
+
|
|
812
|
+
if (!renderResult?.html) {
|
|
813
|
+
return { css: undefined, cssError: undefined };
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
let css = await this.resolveCssFromRenderedHtml(
|
|
817
|
+
renderResult.html,
|
|
818
|
+
options?.projectSlug ?? options?.projectId,
|
|
819
|
+
);
|
|
820
|
+
|
|
821
|
+
if (css) {
|
|
822
|
+
resolvePageDataLog.debug("Reused SSR CSS for page data", {
|
|
823
|
+
slug,
|
|
824
|
+
cssLength: css.length,
|
|
825
|
+
source: "rendered-html-hash",
|
|
826
|
+
});
|
|
827
|
+
} else {
|
|
828
|
+
css = await this.generatePageCssFromHtml(slug, renderResult.html, options);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
if (css) cachePageCss(cssCacheKey, css);
|
|
832
|
+
return { css, cssError: undefined };
|
|
833
|
+
} catch (error) {
|
|
834
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
835
|
+
// Surface CSS generation failures instead of silently swallowing them.
|
|
836
|
+
// This allows clients to show a warning or fall back gracefully.
|
|
837
|
+
resolvePageDataLog.error("CSS generation failed", {
|
|
838
|
+
slug,
|
|
839
|
+
error: errorMessage,
|
|
840
|
+
projectId: options?.projectId,
|
|
841
|
+
});
|
|
842
|
+
return {
|
|
843
|
+
css: undefined,
|
|
844
|
+
cssError: `CSS generation failed: ${errorMessage}`,
|
|
845
|
+
};
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
private async generatePageCssFromHtml(
|
|
850
|
+
slug: string,
|
|
851
|
+
html: string,
|
|
852
|
+
options: RenderOptions | undefined,
|
|
853
|
+
): Promise<string | undefined> {
|
|
854
|
+
const candidates = extractCandidates(html);
|
|
855
|
+
const generatedCss = (await generateTailwindCSS(undefined, candidates, {
|
|
856
|
+
projectSlug: options?.projectSlug,
|
|
857
|
+
})).css;
|
|
858
|
+
|
|
859
|
+
resolvePageDataLog.debug("Fell back to HTML candidate CSS generation", {
|
|
860
|
+
slug,
|
|
861
|
+
htmlLength: html.length,
|
|
862
|
+
cssLength: generatedCss?.length || 0,
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
return generatedCss;
|
|
866
|
+
}
|
|
867
|
+
|
|
841
868
|
/**
|
|
842
869
|
* Build a cache key that is safe for multi-tenant + query-param aware caching.
|
|
843
870
|
* Returns null when request contains sensitive headers (Authorization/Cookie) and
|