@timber-js/app 0.2.0-alpha.121 → 0.2.0-alpha.123
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/LICENSE +8 -0
- package/dist/_chunks/{actions-Dy8vOjFt.js → actions-ZlcKx0H9.js} +5 -5
- package/dist/_chunks/actions-ZlcKx0H9.js.map +1 -0
- package/dist/_chunks/{build-output-helper-B1n0sUqj.js → build-output-helper-DYOWsPjZ.js} +47 -6
- package/dist/_chunks/build-output-helper-DYOWsPjZ.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-4HcQIziG.js +2 -0
- package/dist/_chunks/{cli-schema-sync-ByZPGGmS.js → cli-schema-sync-VcCf1TFY.js} +17 -3
- package/dist/_chunks/{cli-schema-sync-ByZPGGmS.js.map → cli-schema-sync-VcCf1TFY.js.map} +1 -1
- package/dist/_chunks/{define-CPVQaWbx.js → define-C0V_eKiW.js} +6 -18
- package/dist/_chunks/define-C0V_eKiW.js.map +1 -0
- package/dist/_chunks/{handler-store-CcwNX-gk.js → handler-store-bIAstrxQ.js} +1 -1
- package/dist/_chunks/{handler-store-CcwNX-gk.js.map → handler-store-bIAstrxQ.js.map} +1 -1
- package/dist/_chunks/{merge-search-params-az6ZiBeU.js → merge-search-params-Cm1j99HC.js} +1 -1
- package/dist/_chunks/{merge-search-params-az6ZiBeU.js.map → merge-search-params-Cm1j99HC.js.map} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DESG8uk5.js} +32 -19
- package/dist/_chunks/metadata-routes-DESG8uk5.js.map +1 -0
- package/dist/_chunks/{navigation-root-DoRTeBm5.js → navigation-root-Ds_hDtRW.js} +2 -2
- package/dist/_chunks/{navigation-root-DoRTeBm5.js.map → navigation-root-Ds_hDtRW.js.map} +1 -1
- package/dist/_chunks/{resolve-schema-Bf8eC6q6.js → resolve-schema-DU2nbVOi.js} +5 -1
- package/dist/_chunks/resolve-schema-DU2nbVOi.js.map +1 -0
- package/dist/_chunks/{router-ref-CpvjBqdu.js → router-ref-B2-2kIIC.js} +2 -2
- package/dist/_chunks/{router-ref-CpvjBqdu.js.map → router-ref-B2-2kIIC.js.map} +1 -1
- package/dist/_chunks/{segment-classify-CnfLLvir.js → segment-classify-BjfuctV2.js} +1 -1
- package/dist/_chunks/{segment-classify-CnfLLvir.js.map → segment-classify-BjfuctV2.js.map} +1 -1
- package/dist/_chunks/{segment-context-EsfQpS--.js → segment-context-Bg0pFbLT.js} +1 -1
- package/dist/_chunks/{segment-context-EsfQpS--.js.map → segment-context-Bg0pFbLT.js.map} +1 -1
- package/dist/_chunks/{ssr-data-m9-cNEIw.js → ssr-data-DVX8S7vj.js} +1 -1
- package/dist/_chunks/{ssr-data-m9-cNEIw.js.map → ssr-data-DVX8S7vj.js.map} +1 -1
- package/dist/_chunks/{use-segment-params-CtIAjqK0.js → use-segment-params-Du7u25cK.js} +3 -8
- package/dist/_chunks/{use-segment-params-CtIAjqK0.js.map → use-segment-params-Du7u25cK.js.map} +1 -1
- package/dist/_chunks/{validation-BMU5MPzP.js → validation-AfEFM5ze.js} +1 -1
- package/dist/_chunks/{validation-BMU5MPzP.js.map → validation-AfEFM5ze.js.map} +1 -1
- package/dist/_chunks/{walkers-DNp9tHyV.js → walkers-tkw7sDlj.js} +12 -9
- package/dist/_chunks/walkers-tkw7sDlj.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +1 -1
- package/dist/adapters/nitro.js +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cli-schema-sync.d.ts.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -2
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +48 -15
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.js +67 -32
- package/dist/client/internal.js.map +1 -1
- package/dist/client/link.d.ts +9 -5
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +8 -0
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/cookies/index.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -10
- package/dist/index.js.map +1 -1
- package/dist/params/index.js +1 -1
- package/dist/params/resolve-schema.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +5 -4
- package/dist/routing/codegen-shared.d.ts.map +1 -1
- package/dist/routing/index.js +3 -3
- package/dist/segment-params/define.d.ts +0 -6
- package/dist/segment-params/define.d.ts.map +1 -1
- package/dist/segment-params/index.js +1 -1
- package/dist/server/actions.d.ts +3 -8
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +6 -0
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/internal.d.ts +1 -1
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +15 -6
- package/dist/server/internal.js.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +1 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +4 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +12 -4
- package/dist/server/tree-match.d.ts.map +1 -1
- package/dist/server/types.d.ts +2 -2
- package/package.json +6 -7
- package/src/adapters/build-output-helper.ts +67 -5
- package/src/cli-schema-sync.ts +25 -4
- package/src/cli.ts +0 -0
- package/src/client/browser-entry/action-dispatch.ts +9 -10
- package/src/client/browser-entry/index.ts +1 -1
- package/src/client/browser-entry/post-hydration.ts +12 -6
- package/src/client/index.ts +1 -5
- package/src/client/link.tsx +34 -21
- package/src/client/router.ts +74 -25
- package/src/client/rsc-fetch.ts +20 -5
- package/src/client/shallow-url.ts +22 -0
- package/src/index.ts +2 -0
- package/src/params/resolve-schema.ts +15 -0
- package/src/plugins/build-manifest.ts +57 -5
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/dev-server.ts +4 -2
- package/src/plugins/routing.ts +1 -1
- package/src/routing/codegen-shared.ts +8 -5
- package/src/routing/codegen.ts +5 -0
- package/src/routing/link-codegen.ts +1 -1
- package/src/segment-params/define.ts +2 -29
- package/src/server/actions.ts +4 -14
- package/src/server/build-manifest.ts +7 -0
- package/src/server/internal.ts +7 -1
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/pipeline-phases.ts +8 -0
- package/src/server/request-context.ts +0 -4
- package/src/server/route-element-builder.ts +57 -11
- package/src/server/route-matcher.ts +81 -49
- package/src/server/rsc-entry/index.ts +7 -1
- package/src/server/rsc-entry/render-route.ts +7 -1
- package/src/server/ssr-entry.ts +6 -0
- package/src/server/tree-match.ts +23 -11
- package/src/server/types.ts +2 -2
- package/dist/_chunks/actions-Dy8vOjFt.js.map +0 -1
- package/dist/_chunks/build-output-helper-B1n0sUqj.js.map +0 -1
- package/dist/_chunks/cli-schema-sync-DHQLjFu3.js +0 -2
- package/dist/_chunks/define-CPVQaWbx.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js.map +0 -1
- package/dist/_chunks/walkers-DNp9tHyV.js.map +0 -1
|
@@ -18,7 +18,7 @@ export interface MetadataRouteInfo {
|
|
|
18
18
|
/** Whether this route can appear in nested segments (not just app root). */
|
|
19
19
|
nestable: boolean;
|
|
20
20
|
}
|
|
21
|
-
export type MetadataRouteType = 'sitemap' | 'robots' | 'manifest' | 'favicon' | 'icon' | 'opengraph-image' | '
|
|
21
|
+
export type MetadataRouteType = 'sitemap' | 'robots' | 'manifest' | 'favicon' | 'icon' | 'opengraph-image' | 'apple-icon';
|
|
22
22
|
/**
|
|
23
23
|
* All recognized metadata route file conventions.
|
|
24
24
|
*
|
|
@@ -78,17 +78,33 @@ export declare function classifyMetadataRoute(fileName: string): MetadataRouteIn
|
|
|
78
78
|
* @returns The URL path fragment this route serves at
|
|
79
79
|
*/
|
|
80
80
|
export declare function getMetadataRouteServePath(type: MetadataRouteType): string;
|
|
81
|
+
export declare function isMetadataRouteServePath(pathname: string): boolean;
|
|
82
|
+
/** A <link> auto-link tag. */
|
|
83
|
+
export interface AutoLinkLink {
|
|
84
|
+
tag: 'link';
|
|
85
|
+
rel: string;
|
|
86
|
+
href: string;
|
|
87
|
+
type?: string;
|
|
88
|
+
}
|
|
89
|
+
/** A <meta> auto-link tag. */
|
|
90
|
+
export interface AutoLinkMeta {
|
|
91
|
+
tag: 'meta';
|
|
92
|
+
property?: string;
|
|
93
|
+
name?: string;
|
|
94
|
+
content: string;
|
|
95
|
+
}
|
|
96
|
+
export type AutoLinkTag = AutoLinkLink | AutoLinkMeta;
|
|
81
97
|
/**
|
|
82
98
|
* Get the auto-link tags to inject into <head> for metadata route files
|
|
83
99
|
* discovered in a segment.
|
|
84
100
|
*
|
|
101
|
+
* Returns link tags for icon/apple-icon/manifest, and meta tags for
|
|
102
|
+
* opengraph-image (emits both og:image and twitter:image). Returns null
|
|
103
|
+
* for types that don't auto-link (favicon, sitemap, robots).
|
|
104
|
+
*
|
|
85
105
|
* @param type - The metadata route type
|
|
86
106
|
* @param href - The resolved URL path to the metadata route
|
|
87
|
-
* @returns
|
|
107
|
+
* @returns Tag descriptor(s) for the <head>, or null if no auto-link
|
|
88
108
|
*/
|
|
89
|
-
export declare function getMetadataRouteAutoLink(type: MetadataRouteType, href: string):
|
|
90
|
-
rel: string;
|
|
91
|
-
href: string;
|
|
92
|
-
type?: string;
|
|
93
|
-
} | null;
|
|
109
|
+
export declare function getMetadataRouteAutoLink(type: MetadataRouteType, href: string): AutoLinkTag[];
|
|
94
110
|
//# sourceMappingURL=metadata-routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-routes.d.ts","sourceRoot":"","sources":["../../src/server/metadata-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,GACN,iBAAiB,GACjB,
|
|
1
|
+
{"version":3,"file":"metadata-routes.d.ts","sourceRoot":"","sources":["../../src/server/metadata-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,GACN,iBAAiB,GACjB,YAAY,CAAC;AAIjB;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAC7C,MAAM,EACN;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB,CA2DF,CAAC;AAoBF;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,qBAAqB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKjG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAItF;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAIvF;AAID;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAoBhF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAKzE;AAMD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAgB7F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-phases.d.ts","sourceRoot":"","sources":["../../src/server/pipeline-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKrF,UAAU,aAAa;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAID;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAavB;AAID;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,oBAAoB,EAAE,OAAO,EAC7B,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,oBAAoB,EAAE,OAAO,EAC7B,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,aAAa,GACjD,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"pipeline-phases.d.ts","sourceRoot":"","sources":["../../src/server/pipeline-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKrF,UAAU,aAAa;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAID;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAavB;AAID;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,oBAAoB,EAAE,OAAO,EAC7B,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,oBAAoB,EAAE,OAAO,EAC7B,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,aAAa,GACjD,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAyQnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,iBAAiB,EAA4B,MAAM,mBAAmB,CAAC;AAOhF,OAAO,EAAE,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,iBAAiB,EAA4B,MAAM,mBAAmB,CAAC;AAOhF,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAI7B;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,eAAe,CAS5C;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,eAAe,CASjD;AAaD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CA+CxF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAMhF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACxC,IAAI,CAKN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAI/D;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAID;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,OAAO,EACP,KAAK,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,MAAM,CAAC,QAAQ,CACnF,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAmBrE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAK9D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBhE"}
|
|
@@ -95,5 +95,5 @@ export declare class RouteSignalWithContext extends Error {
|
|
|
95
95
|
* AccessPreRunner during renderToReadableStream so that access.ts and
|
|
96
96
|
* render components share the same React.cache scope (TIM-662).
|
|
97
97
|
*/
|
|
98
|
-
export declare function buildRouteElement(req: Request, match: RouteMatch, interception?: InterceptionContext, clientStateTree?: Set<string> | null): Promise<RouteElementResult>;
|
|
98
|
+
export declare function buildRouteElement(req: Request, match: RouteMatch, interception?: InterceptionContext, clientStateTree?: Set<string> | null, metadataRouteHashes?: Record<string, string>): Promise<RouteElementResult>;
|
|
99
99
|
//# sourceMappingURL=route-element-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-element-builder.d.ts","sourceRoot":"","sources":["../../src/server/route-element-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"route-element-builder.d.ts","sourceRoot":"","sources":["../../src/server/route-element-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAY9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAa7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAezD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAM7D;AAID;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAID,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACvC;AAED,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAC3C,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC;IAC5B,2CAA2C;IAC3C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,wDAAwD;IACxD,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,qCAAqC;IACrC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,MAAM,EAAE,UAAU,GAAG,cAAc;aACnC,gBAAgB,EAAE,oBAAoB,EAAE;aACxC,QAAQ,EAAE,mBAAmB,EAAE;gBAF/B,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,gBAAgB,EAAE,oBAAoB,EAAE,EACxC,QAAQ,EAAE,mBAAmB,EAAE;CAIlD;AA8DD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,YAAY,CAAC,EAAE,mBAAmB,EAClC,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,kBAAkB,CAAC,CA0Y7B"}
|
|
@@ -57,12 +57,14 @@ export interface MetadataRouteMatch {
|
|
|
57
57
|
* that should be served from disk rather than executed as a handler.
|
|
58
58
|
*/
|
|
59
59
|
isStatic: boolean;
|
|
60
|
+
/** Extracted segment params from dynamic segments in the URL prefix. */
|
|
61
|
+
segmentParams: Record<string, string | string[]>;
|
|
60
62
|
}
|
|
61
63
|
/**
|
|
62
64
|
* Create a metadata route matcher from a manifest.
|
|
63
65
|
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
+
* Uses dynamic tree matching to resolve metadata routes, supporting
|
|
67
|
+
* dynamic segments like /docs/[slug]/opengraph-image.
|
|
66
68
|
*
|
|
67
69
|
* See design/16-metadata.md §"Metadata Routes"
|
|
68
70
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-matcher.d.ts","sourceRoot":"","sources":["../../src/server/route-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAY9B,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,YAAY,CAAC;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,GACrB,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,CAEzC;AAsCD,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,IAAI,EAAE,iBAAiB,CAAC;IACxB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,IAAI,EAAE,YAAY,CAAC;IACnB,0DAA0D;IAC1D,OAAO,EAAE,mBAAmB,CAAC;IAC7B;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"route-matcher.d.ts","sourceRoot":"","sources":["../../src/server/route-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAY9B,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,YAAY,CAAC;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,GACrB,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,CAEzC;AAsCD,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,IAAI,EAAE,iBAAiB,CAAC;IACxB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,IAAI,EAAE,YAAY,CAAC;IACnB,0DAA0D;IAC1D,OAAO,EAAE,mBAAmB,CAAC;IAC7B;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAClD;AAQD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,YAAY,GACrB,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,GAAG,IAAI,CAEjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/index.ts"],"names":[],"mappings":"AAuBA,OAAO,uCAAuC,CAAC;AAqB/C,OAAO,KAAK,EAAuB,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAqCtF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAE5E;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/index.ts"],"names":[],"mappings":"AAuBA,OAAO,uCAAuC,CAAC;AAqB/C,OAAO,KAAK,EAAuB,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAqCtF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAE5E;AAoXD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,QAAA,MAAiB,QAAQ,qCAGxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,gBAAkB,CAAC;AAE9C,eAAe,QAAQ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-route.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/render-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB/D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,IAAI,EAAE,eAAe,EACrB,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"render-route.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/render-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB/D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,IAAI,EAAE,eAAe,EACrB,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,QAAQ,CAAC,CAwOnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-entry.d.ts","sourceRoot":"","sources":["../../src/server/ssr-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"ssr-entry.d.ts","sourceRoot":"","sources":["../../src/server/ssr-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,uCAAuC,CAAC;AAiF/C;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,eAAe,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,SAAS,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACvC;;;0DAGsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;iFAE6E;IAC7E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;4DACwD;IACxD,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE;QACZ,gFAAgF;QAChF,QAAQ,EAAE,MAAM,CAAC;QACjB,uDAAuD;QACvD,OAAO,EAAE,MAAM,CAAC;QAChB,gEAAgE;QAChE,MAAM,EAAE,MAAM,CAAC;QACf,wEAAwE;QACxE,UAAU,EAAE,MAAM,CAAC;QACnB,+CAA+C;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,sDAAsD;QACtD,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IAEF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,QAAQ,CAAC,CA6LnB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -22,6 +22,14 @@ export interface TreeMatchResult<TFile> {
|
|
|
22
22
|
/** Collected params, keyed by param name. Catch-all params are string[]. */
|
|
23
23
|
params: Record<string, string | string[]>;
|
|
24
24
|
}
|
|
25
|
+
export interface TreeMatchOptions {
|
|
26
|
+
/**
|
|
27
|
+
* When true (default), only match if the leaf node has a page or route
|
|
28
|
+
* handler. Set to false for metadata route matching, where we just need
|
|
29
|
+
* to find the owning segment regardless of whether it has a page.
|
|
30
|
+
*/
|
|
31
|
+
requireTerminal?: boolean;
|
|
32
|
+
}
|
|
25
33
|
/**
|
|
26
34
|
* Match URL path parts against a segment tree.
|
|
27
35
|
*
|
|
@@ -29,13 +37,13 @@ export interface TreeMatchResult<TFile> {
|
|
|
29
37
|
* ordering globally across group boundaries. Returns the matched
|
|
30
38
|
* segment chain and collected params, or null if no route matches.
|
|
31
39
|
*
|
|
32
|
-
*
|
|
33
|
-
* the leaf.
|
|
34
|
-
*
|
|
40
|
+
* By default, a match requires a terminal node (one with `page` or
|
|
41
|
+
* `route`) at the leaf. Pass `{ requireTerminal: false }` to match
|
|
42
|
+
* any segment (used by metadata route matching).
|
|
35
43
|
*
|
|
36
44
|
* @param root The root segment node to start matching from.
|
|
37
45
|
* @param parts URL path parts (e.g. ['blog', 'hello-world']).
|
|
38
46
|
* Empty array matches the root itself (if terminal).
|
|
39
47
|
*/
|
|
40
|
-
export declare function matchUrlParts<TFile>(root: SegmentNode<TFile>, parts: string[]): TreeMatchResult<TFile> | null;
|
|
48
|
+
export declare function matchUrlParts<TFile>(root: SegmentNode<TFile>, parts: string[], options?: TreeMatchOptions): TreeMatchResult<TFile> | null;
|
|
41
49
|
//# sourceMappingURL=tree-match.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-match.d.ts","sourceRoot":"","sources":["../../src/server/tree-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,2DAA2D;AAC3D,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,0DAA0D;IAC1D,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EACjC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EACxB,KAAK,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tree-match.d.ts","sourceRoot":"","sources":["../../src/server/tree-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,2DAA2D;AAC3D,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,0DAA0D;IAC1D,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EACjC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EACxB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,gBAAgB,GACzB,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,CAS/B"}
|
package/dist/server/types.d.ts
CHANGED
|
@@ -250,7 +250,7 @@ export declare namespace MetadataRoute {
|
|
|
250
250
|
* This is a structural union — the pipeline dispatches on the shape at
|
|
251
251
|
* request time (see `pipeline-phases.ts`):
|
|
252
252
|
* - `Response` → returned as-is (e.g. `ImageResponse`, `Response.redirect()`).
|
|
253
|
-
* Used by `icon.tsx`, `opengraph-image.tsx`,
|
|
253
|
+
* Used by `icon.tsx`, `opengraph-image.tsx`,
|
|
254
254
|
* `apple-icon.tsx`.
|
|
255
255
|
* - `string` → written as the response body verbatim. Used by `robots.ts`
|
|
256
256
|
* and by any handler that wants to emit a pre-serialized payload.
|
|
@@ -265,7 +265,7 @@ export type MetadataResult = Response | string | MetadataRoute.Sitemap | Metadat
|
|
|
265
265
|
/**
|
|
266
266
|
* Default export signature for a dynamic metadata route file
|
|
267
267
|
* (`sitemap.ts`, `robots.ts`, `manifest.ts`, `icon.tsx`,
|
|
268
|
-
* `opengraph-image.tsx`, `
|
|
268
|
+
* `opengraph-image.tsx`, `apple-icon.tsx`).
|
|
269
269
|
*
|
|
270
270
|
* Parameterize `TResult` to narrow the return type for a specific route:
|
|
271
271
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@timber-js/app",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.123",
|
|
4
4
|
"description": "Vite-native React framework built for Servers and Serverless Platforms — correct HTTP semantics, real status codes, pages that work without JavaScript",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudflare-workers",
|
|
@@ -114,11 +114,6 @@
|
|
|
114
114
|
"publishConfig": {
|
|
115
115
|
"access": "public"
|
|
116
116
|
},
|
|
117
|
-
"scripts": {
|
|
118
|
-
"build": "vite build --config vite.lib.config.ts && tsc --emitDeclarationOnly --project tsconfig.json --outDir dist",
|
|
119
|
-
"typecheck": "tsgo --noEmit",
|
|
120
|
-
"prepublishOnly": "pnpm run build"
|
|
121
|
-
},
|
|
122
117
|
"dependencies": {
|
|
123
118
|
"@opentelemetry/api": "^1.9.1",
|
|
124
119
|
"@opentelemetry/context-async-hooks": "^2.6.1",
|
|
@@ -162,5 +157,9 @@
|
|
|
162
157
|
},
|
|
163
158
|
"engines": {
|
|
164
159
|
"node": ">=22.12.0"
|
|
160
|
+
},
|
|
161
|
+
"scripts": {
|
|
162
|
+
"build": "vite build --config vite.lib.config.ts && tsc --emitDeclarationOnly --project tsconfig.json --outDir dist",
|
|
163
|
+
"typecheck": "tsgo --noEmit"
|
|
165
164
|
}
|
|
166
|
-
}
|
|
165
|
+
}
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
// IMPORTANT: This module must remain a leaf — no imports from ../server/,
|
|
12
12
|
// ../client/, or Vite-dependent code. See adapters/shared.ts header.
|
|
13
13
|
|
|
14
|
-
import { writeFile, mkdir, cp } from 'node:fs/promises';
|
|
15
|
-
import { join } from 'node:path';
|
|
14
|
+
import { writeFile, mkdir, cp, readdir, readFile } from 'node:fs/promises';
|
|
15
|
+
import { join, basename } from 'node:path';
|
|
16
16
|
import { generateHeadersFile } from './shared.js';
|
|
17
17
|
import type { TimberConfig } from './types';
|
|
18
18
|
|
|
@@ -54,11 +54,23 @@ export async function runSharedBuildSteps(opts: BuildOutputBaseOptions): Promise
|
|
|
54
54
|
const clientDir = join(buildDir, 'client');
|
|
55
55
|
const publicDir = join(outDir, publicDirName);
|
|
56
56
|
await mkdir(publicDir, { recursive: true });
|
|
57
|
+
// Find WASM files that are referenced by client JS (legitimate client WASM)
|
|
58
|
+
// vs orphaned server-only WASM (e.g. @takumi-rs for OG image generation).
|
|
59
|
+
// Only strip orphaned WASM to avoid breaking client-side WASM usage.
|
|
60
|
+
const referencedWasm = await findReferencedWasm(clientDir);
|
|
61
|
+
|
|
57
62
|
await cp(clientDir, publicDir, {
|
|
58
63
|
recursive: true,
|
|
59
|
-
filter:
|
|
60
|
-
|
|
64
|
+
filter: (src: string) => {
|
|
65
|
+
if (src.endsWith('.wasm') && !referencedWasm.has(basename(src))) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (config.clientJavascriptDisabled && src.endsWith('.js')) return false;
|
|
69
|
+
return true;
|
|
70
|
+
},
|
|
71
|
+
}).catch((e: NodeJS.ErrnoException) => {
|
|
61
72
|
// Client dir may not exist when client JavaScript is disabled
|
|
73
|
+
if (e.code !== 'ENOENT') throw e;
|
|
62
74
|
});
|
|
63
75
|
|
|
64
76
|
// 3. Write _headers file for static asset cache control.
|
|
@@ -66,7 +78,12 @@ export async function runSharedBuildSteps(opts: BuildOutputBaseOptions): Promise
|
|
|
66
78
|
|
|
67
79
|
// 4. Copy RSC + SSR server bundles into the output directory.
|
|
68
80
|
await cp(join(buildDir, 'rsc'), join(outDir, 'rsc'), { recursive: true });
|
|
69
|
-
await cp(join(buildDir, 'ssr'), join(outDir, 'ssr'), { recursive: true }).catch(
|
|
81
|
+
await cp(join(buildDir, 'ssr'), join(outDir, 'ssr'), { recursive: true }).catch(
|
|
82
|
+
(e: NodeJS.ErrnoException) => {
|
|
83
|
+
// SSR dir may not exist for static-only builds
|
|
84
|
+
if (e.code !== 'ENOENT') throw e;
|
|
85
|
+
}
|
|
86
|
+
);
|
|
70
87
|
|
|
71
88
|
// 5. Write manifest-init module if present.
|
|
72
89
|
if (config.manifestInit) {
|
|
@@ -75,3 +92,48 @@ export async function runSharedBuildSteps(opts: BuildOutputBaseOptions): Promise
|
|
|
75
92
|
|
|
76
93
|
return publicDir;
|
|
77
94
|
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Scan client JS files for references to .wasm filenames.
|
|
98
|
+
* Returns the set of WASM basenames that are actually imported/referenced
|
|
99
|
+
* by client code and must be preserved in the static output.
|
|
100
|
+
*/
|
|
101
|
+
async function findReferencedWasm(clientDir: string): Promise<Set<string>> {
|
|
102
|
+
const referenced = new Set<string>();
|
|
103
|
+
|
|
104
|
+
let files: string[];
|
|
105
|
+
try {
|
|
106
|
+
files = await collectFiles(clientDir);
|
|
107
|
+
} catch {
|
|
108
|
+
return referenced;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const jsFiles = files.filter((f) => f.endsWith('.js'));
|
|
112
|
+
const wasmFiles = files.filter((f) => f.endsWith('.wasm')).map((f) => basename(f));
|
|
113
|
+
if (wasmFiles.length === 0) return referenced;
|
|
114
|
+
|
|
115
|
+
for (const jsFile of jsFiles) {
|
|
116
|
+
const content = await readFile(jsFile, 'utf-8');
|
|
117
|
+
for (const wasmName of wasmFiles) {
|
|
118
|
+
if (content.includes(wasmName)) {
|
|
119
|
+
referenced.add(wasmName);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return referenced;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function collectFiles(dir: string): Promise<string[]> {
|
|
128
|
+
const result: string[] = [];
|
|
129
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const fullPath = join(dir, entry.name);
|
|
132
|
+
if (entry.isDirectory()) {
|
|
133
|
+
result.push(...(await collectFiles(fullPath)));
|
|
134
|
+
} else {
|
|
135
|
+
result.push(fullPath);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
package/src/cli-schema-sync.ts
CHANGED
|
@@ -89,11 +89,32 @@ function generateNewSchema(segments: string[]): string {
|
|
|
89
89
|
* Append missing segment entries to an existing schema file.
|
|
90
90
|
* Inserts new entries before the closing `}` of segmentParams.
|
|
91
91
|
*/
|
|
92
|
+
const CODEC_IMPORT = "import { codec } from '@timber-js/app/codec';";
|
|
93
|
+
|
|
94
|
+
function hasCodecImport(content: string): boolean {
|
|
95
|
+
return /import\s+\{[^}]*\bcodec\b[^}]*\}\s+from\s+['"]@timber-js\/app\/codec['"]/.test(content);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function ensureCodecImport(content: string): string {
|
|
99
|
+
if (hasCodecImport(content)) return content;
|
|
100
|
+
|
|
101
|
+
// Insert after the last existing import statement
|
|
102
|
+
const lines = content.split('\n');
|
|
103
|
+
let lastImportIndex = -1;
|
|
104
|
+
for (let i = 0; i < lines.length; i++) {
|
|
105
|
+
if (/^\s*import\s/.test(lines[i])) lastImportIndex = i;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (lastImportIndex === -1) {
|
|
109
|
+
return CODEC_IMPORT + '\n' + content;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
lines.splice(lastImportIndex + 1, 0, CODEC_IMPORT);
|
|
113
|
+
return lines.join('\n');
|
|
114
|
+
}
|
|
115
|
+
|
|
92
116
|
function appendToSchema(content: string, newSegments: string[]): string {
|
|
93
|
-
|
|
94
|
-
// Strategy: find the last entry in segmentParams block, insert after it.
|
|
95
|
-
// Look for the pattern: segmentParams: { ... }
|
|
96
|
-
// We find the closing `},` or `}` that ends segmentParams.
|
|
117
|
+
content = ensureCodecImport(content);
|
|
97
118
|
|
|
98
119
|
// Find "segmentParams" key position
|
|
99
120
|
const spIndex = content.indexOf('segmentParams');
|
package/src/cli.ts
CHANGED
|
File without changes
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { setServerCallback, encodeReply, createFromFetch } from '../../rsc-runtime/browser.js';
|
|
18
|
-
import { getRouter } from '#client-internal';
|
|
18
|
+
import { getRouter, getRouterOrNull } from '#client-internal';
|
|
19
19
|
import { setHardNavigating } from '../navigation-root.js';
|
|
20
20
|
import { isStaleClientReference, triggerStaleReload } from '../stale-reload.js';
|
|
21
21
|
import { getClientDeploymentId, DEPLOYMENT_ID_HEADER, RELOAD_HEADER } from '../rsc-fetch.js';
|
|
@@ -96,15 +96,14 @@ export function setupServerActions(): void {
|
|
|
96
96
|
// Piggybacked response: wrapper object { _action, _tree }
|
|
97
97
|
// Apply the revalidated tree directly — no separate router.refresh() needed.
|
|
98
98
|
const wrapper = decoded as { _action: unknown; _tree: unknown };
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
'[timber]
|
|
106
|
-
|
|
107
|
-
);
|
|
99
|
+
const router = getRouterOrNull();
|
|
100
|
+
if (router) {
|
|
101
|
+
try {
|
|
102
|
+
const headElements = headElementsJson ? JSON.parse(headElementsJson) : null;
|
|
103
|
+
router.applyRevalidation(wrapper._tree, headElements);
|
|
104
|
+
} catch (e) {
|
|
105
|
+
console.error('[timber] applyRevalidation failed after server action', e);
|
|
106
|
+
}
|
|
108
107
|
}
|
|
109
108
|
return wrapper._action;
|
|
110
109
|
}
|
|
@@ -39,7 +39,7 @@ import 'virtual:timber-search-params-registry';
|
|
|
39
39
|
// @ts-expect-error — virtual module provided by timber-routing plugin
|
|
40
40
|
import schemaCodecs from 'virtual:timber-schema';
|
|
41
41
|
import { setLinkCodecs } from '../../params/codec-registry.js';
|
|
42
|
-
|
|
42
|
+
setLinkCodecs(schemaCodecs);
|
|
43
43
|
|
|
44
44
|
import { setClientDeploymentId } from '../rsc-fetch.js';
|
|
45
45
|
import {
|
|
@@ -58,12 +58,18 @@ export function setupPostHydration({
|
|
|
58
58
|
delete (self as unknown as Record<string, unknown>).__timber_segments;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
//
|
|
62
|
-
// The
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
|
|
61
|
+
// Cache segment elements from the initial RSC payload after hydration.
|
|
62
|
+
// The element from createFromReadableStream is a Flight thenable that
|
|
63
|
+
// React resolves during hydration. Once resolved (status='fulfilled'),
|
|
64
|
+
// its .value contains the React element tree we can walk.
|
|
65
|
+
// Use requestAnimationFrame to run after hydration commits.
|
|
66
|
+
if (initialElement != null) {
|
|
67
|
+
requestAnimationFrame(() => {
|
|
68
|
+
const el = initialElement as { status?: string; value?: unknown };
|
|
69
|
+
const resolved = el.status === 'fulfilled' && el.value != null ? el.value : initialElement;
|
|
70
|
+
router.cacheElementTree(resolved);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
67
73
|
|
|
68
74
|
// If the hydration path was skipped (no RSC payload), populate the
|
|
69
75
|
// fallback params from server embed here.
|
package/src/client/index.ts
CHANGED
|
@@ -66,6 +66,7 @@ export type { LinkStatus } from './use-link-status';
|
|
|
66
66
|
export { useRouter } from './use-router';
|
|
67
67
|
export type { AppRouterInstance } from './use-router';
|
|
68
68
|
export { usePathname } from './use-pathname';
|
|
69
|
+
export { replaceUrl } from './shallow-url';
|
|
69
70
|
// useSearchParams removed from public exports — lives in next/navigation shim only.
|
|
70
71
|
export { useSelectedLayoutSegment, useSelectedLayoutSegments } from './use-selected-layout-segment';
|
|
71
72
|
|
|
@@ -82,8 +83,3 @@ export { useSegmentParams } from './use-segment-params';
|
|
|
82
83
|
// Cookies — useCookie lives on defineCookie().useCookie().
|
|
83
84
|
// Types still exported for advanced use.
|
|
84
85
|
export type { ClientCookieOptions, CookieSetter } from './use-cookie';
|
|
85
|
-
|
|
86
|
-
// Register the client useSegmentParams hook with defineSegmentParams.
|
|
87
|
-
import { useSegmentParams as _useSegmentParams } from './use-segment-params.js';
|
|
88
|
-
import { _registerUseSegmentParams } from '../segment-params/define.js';
|
|
89
|
-
_registerUseSegmentParams(_useSegmentParams);
|
package/src/client/link.tsx
CHANGED
|
@@ -143,6 +143,9 @@ export type LinkSegmentParams<T> = {
|
|
|
143
143
|
// because there is no way to look up a definition from a computed string.
|
|
144
144
|
//
|
|
145
145
|
// `resolveHref` discriminates at runtime by presence of a `definition` key.
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
+
export type ParamValue = string | number | string[] | { toString(): string; [key: string]: any };
|
|
148
|
+
|
|
146
149
|
type WrappedSearchParamsProp = {
|
|
147
150
|
definition: SearchParamsDefinition<Record<string, unknown>>;
|
|
148
151
|
values: Record<string, unknown>;
|
|
@@ -156,7 +159,7 @@ type LinkSearchParamsProp = WrappedSearchParamsProp | FlatSearchParamsProp;
|
|
|
156
159
|
*/
|
|
157
160
|
interface LinkRuntimeProps extends LinkBaseProps {
|
|
158
161
|
href: string;
|
|
159
|
-
segmentParams?: Record<string,
|
|
162
|
+
segmentParams?: Record<string, ParamValue>;
|
|
160
163
|
searchParams?: LinkSearchParamsProp;
|
|
161
164
|
}
|
|
162
165
|
|
|
@@ -167,7 +170,7 @@ export type LinkPropsWithHref = LinkBaseProps & {
|
|
|
167
170
|
searchParams?: LinkSearchParamsProp;
|
|
168
171
|
};
|
|
169
172
|
export type LinkPropsWithParams = LinkRuntimeProps & {
|
|
170
|
-
segmentParams: Record<string,
|
|
173
|
+
segmentParams: Record<string, ParamValue>;
|
|
171
174
|
};
|
|
172
175
|
export type LinkProps = LinkRuntimeProps;
|
|
173
176
|
|
|
@@ -232,7 +235,7 @@ export function parseSegments(pattern: string): UrlSegment[] {
|
|
|
232
235
|
*/
|
|
233
236
|
function resolveSegment(
|
|
234
237
|
seg: UrlSegment,
|
|
235
|
-
params: Record<string,
|
|
238
|
+
params: Record<string, ParamValue>,
|
|
236
239
|
pattern: string
|
|
237
240
|
): string | null {
|
|
238
241
|
switch (seg.kind) {
|
|
@@ -313,10 +316,7 @@ function splitPatternSuffix(pattern: string): [path: string, suffix: string] {
|
|
|
313
316
|
return [path, suffix];
|
|
314
317
|
}
|
|
315
318
|
|
|
316
|
-
export function interpolateParams(
|
|
317
|
-
pattern: string,
|
|
318
|
-
params: Record<string, string | number | string[]>
|
|
319
|
-
): string {
|
|
319
|
+
export function interpolateParams(pattern: string, params: Record<string, ParamValue>): string {
|
|
320
320
|
const [pathPart, suffix] = splitPatternSuffix(pattern);
|
|
321
321
|
|
|
322
322
|
const resolved = parseSegments(pathPart)
|
|
@@ -346,7 +346,7 @@ function isWrappedSearchParamsProp(sp: LinkSearchParamsProp): sp is WrappedSearc
|
|
|
346
346
|
|
|
347
347
|
export function resolveHref(
|
|
348
348
|
href: string,
|
|
349
|
-
params?: Record<string,
|
|
349
|
+
params?: Record<string, ParamValue>,
|
|
350
350
|
searchParams?: LinkSearchParamsProp
|
|
351
351
|
): string {
|
|
352
352
|
let resolvedPath = href;
|
|
@@ -384,20 +384,28 @@ export function resolveHref(
|
|
|
384
384
|
| SearchParamsDefinition<Record<string, unknown>>
|
|
385
385
|
| undefined;
|
|
386
386
|
values = searchParams;
|
|
387
|
-
if (!definition) {
|
|
388
|
-
throw new Error(
|
|
389
|
-
`<Link> received a flat searchParams object for href "${href}", but no ` +
|
|
390
|
-
`SearchParamsDefinition is registered for that route. ` +
|
|
391
|
-
`Either the route does not export \`searchParams\` from its \`params.ts\`/\`page.tsx\`, ` +
|
|
392
|
-
`or the search-params registry module was not loaded. ` +
|
|
393
|
-
`For external or computed hrefs, pass the legacy \`{ definition, values }\` shape instead.`
|
|
394
|
-
);
|
|
395
|
-
}
|
|
396
387
|
}
|
|
397
388
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
389
|
+
if (definition) {
|
|
390
|
+
const qs = definition.serialize(values);
|
|
391
|
+
if (qs) {
|
|
392
|
+
resolvedPath = `${resolvedPath}?${qs}`;
|
|
393
|
+
}
|
|
394
|
+
} else {
|
|
395
|
+
// No registered definition — serialize flat object as plain query params.
|
|
396
|
+
const usp = new URLSearchParams();
|
|
397
|
+
for (const [key, val] of Object.entries(values)) {
|
|
398
|
+
if (val === undefined || val === null) continue;
|
|
399
|
+
if (Array.isArray(val)) {
|
|
400
|
+
for (const item of val) usp.append(key, String(item));
|
|
401
|
+
} else {
|
|
402
|
+
usp.set(key, String(val));
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
const qs = usp.toString();
|
|
406
|
+
if (qs) {
|
|
407
|
+
resolvedPath = `${resolvedPath}?${qs}`;
|
|
408
|
+
}
|
|
401
409
|
}
|
|
402
410
|
}
|
|
403
411
|
|
|
@@ -416,7 +424,7 @@ interface LinkOutputProps {
|
|
|
416
424
|
*/
|
|
417
425
|
export function buildLinkProps(
|
|
418
426
|
props: Pick<LinkPropsWithHref, 'href'> & {
|
|
419
|
-
params?: Record<string,
|
|
427
|
+
params?: Record<string, ParamValue>;
|
|
420
428
|
searchParams?: LinkSearchParamsProp;
|
|
421
429
|
}
|
|
422
430
|
): LinkOutputProps {
|
|
@@ -591,6 +599,11 @@ export const Link: LinkFunction = function LinkImpl(props: any) {
|
|
|
591
599
|
return;
|
|
592
600
|
}
|
|
593
601
|
|
|
602
|
+
// Hash-only hrefs — let the browser handle scroll-to-anchor natively.
|
|
603
|
+
// The Navigation API path already skips these via event.hashChange;
|
|
604
|
+
// this covers the fallback (Safari/Firefox) where we drive navigation manually.
|
|
605
|
+
if (resolvedHref.startsWith('#')) return;
|
|
606
|
+
|
|
594
607
|
// History API fallback — prevent default and navigate via router
|
|
595
608
|
event.preventDefault();
|
|
596
609
|
|