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 CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.178",
3
+ "version": "0.1.179",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -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;AAoBD,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;YAsKzE,kBAAkB;IA2ChC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAetB"}
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
- let css;
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.178";
1
+ export declare const VERSION = "0.1.179";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.178";
3
+ export const VERSION = "0.1.179";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.178",
3
+ "version": "0.1.179",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.178",
3
+ "version": "0.1.179",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -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
- let css: string | undefined;
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
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.178";
3
+ export const VERSION = "0.1.179";