vinext 0.0.30 → 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +15 -7
  2. package/dist/build/prerender.d.ts +188 -0
  3. package/dist/build/prerender.js +675 -0
  4. package/dist/build/prerender.js.map +1 -0
  5. package/dist/build/report.d.ts +45 -46
  6. package/dist/build/report.js +581 -276
  7. package/dist/build/report.js.map +1 -1
  8. package/dist/build/run-prerender.d.ts +62 -0
  9. package/dist/build/run-prerender.js +183 -0
  10. package/dist/build/run-prerender.js.map +1 -0
  11. package/dist/build/server-manifest.d.ts +19 -0
  12. package/dist/build/server-manifest.js +29 -0
  13. package/dist/build/server-manifest.js.map +1 -0
  14. package/dist/build/static-export.d.ts +51 -66
  15. package/dist/build/static-export.js +51 -545
  16. package/dist/build/static-export.js.map +1 -1
  17. package/dist/check.d.ts +26 -24
  18. package/dist/check.js +681 -571
  19. package/dist/check.js.map +1 -1
  20. package/dist/cli.d.ts +1 -15
  21. package/dist/cli.js +432 -491
  22. package/dist/cli.js.map +1 -1
  23. package/dist/client/entry.d.ts +1 -2
  24. package/dist/client/entry.js +49 -62
  25. package/dist/client/entry.js.map +1 -1
  26. package/dist/client/validate-module-path.d.ts +4 -1
  27. package/dist/client/validate-module-path.js +23 -28
  28. package/dist/client/validate-module-path.js.map +1 -1
  29. package/dist/client/vinext-next-data.d.ts +15 -20
  30. package/dist/client/vinext-next-data.js +0 -1
  31. package/dist/cloudflare/index.d.ts +3 -8
  32. package/dist/cloudflare/index.js +3 -8
  33. package/dist/cloudflare/kv-cache-handler.d.ts +95 -105
  34. package/dist/cloudflare/kv-cache-handler.js +354 -380
  35. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  36. package/dist/cloudflare/tpr.d.ts +36 -34
  37. package/dist/cloudflare/tpr.js +460 -603
  38. package/dist/cloudflare/tpr.js.map +1 -1
  39. package/dist/config/config-matchers.d.ts +31 -40
  40. package/dist/config/config-matchers.js +727 -936
  41. package/dist/config/config-matchers.js.map +1 -1
  42. package/dist/config/dotenv.d.ts +18 -11
  43. package/dist/config/dotenv.js +79 -84
  44. package/dist/config/dotenv.js.map +1 -1
  45. package/dist/config/next-config.d.ts +156 -146
  46. package/dist/config/next-config.js +376 -464
  47. package/dist/config/next-config.js.map +1 -1
  48. package/dist/deploy.d.ts +87 -96
  49. package/dist/deploy.js +490 -628
  50. package/dist/deploy.js.map +1 -1
  51. package/dist/entries/app-browser-entry.d.ts +4 -1
  52. package/dist/entries/app-browser-entry.js +12 -8
  53. package/dist/entries/app-browser-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-entry.d.ts +33 -20
  55. package/dist/entries/app-rsc-entry.js +444 -212
  56. package/dist/entries/app-rsc-entry.js.map +1 -1
  57. package/dist/entries/app-ssr-entry.d.ts +9 -1
  58. package/dist/entries/app-ssr-entry.js +61 -28
  59. package/dist/entries/app-ssr-entry.js.map +1 -1
  60. package/dist/entries/pages-client-entry.d.ts +6 -2
  61. package/dist/entries/pages-client-entry.js +30 -33
  62. package/dist/entries/pages-client-entry.js.map +1 -1
  63. package/dist/entries/pages-entry-helpers.d.ts +5 -1
  64. package/dist/entries/pages-entry-helpers.js +17 -14
  65. package/dist/entries/pages-entry-helpers.js.map +1 -1
  66. package/dist/entries/pages-server-entry.d.ts +6 -2
  67. package/dist/entries/pages-server-entry.js +86 -114
  68. package/dist/entries/pages-server-entry.js.map +1 -1
  69. package/dist/index.d.ts +92 -60
  70. package/dist/index.js +2151 -3133
  71. package/dist/index.js.map +1 -1
  72. package/dist/init.d.ts +40 -37
  73. package/dist/init.js +201 -258
  74. package/dist/init.js.map +1 -1
  75. package/dist/plugins/async-hooks-stub.d.ts +7 -3
  76. package/dist/plugins/async-hooks-stub.js +39 -42
  77. package/dist/plugins/async-hooks-stub.js.map +1 -1
  78. package/dist/plugins/client-reference-dedup.d.ts +7 -3
  79. package/dist/plugins/client-reference-dedup.js +63 -88
  80. package/dist/plugins/client-reference-dedup.js.map +1 -1
  81. package/dist/routing/app-router.d.ts +100 -96
  82. package/dist/routing/app-router.js +560 -670
  83. package/dist/routing/app-router.js.map +1 -1
  84. package/dist/routing/file-matcher.d.ts +18 -15
  85. package/dist/routing/file-matcher.js +65 -65
  86. package/dist/routing/file-matcher.js.map +1 -1
  87. package/dist/routing/pages-router.d.ts +23 -24
  88. package/dist/routing/pages-router.js +147 -172
  89. package/dist/routing/pages-router.js.map +1 -1
  90. package/dist/routing/route-trie.d.ts +23 -20
  91. package/dist/routing/route-trie.js +131 -151
  92. package/dist/routing/route-trie.js.map +1 -1
  93. package/dist/routing/route-validation.d.ts +5 -2
  94. package/dist/routing/route-validation.js +98 -130
  95. package/dist/routing/route-validation.js.map +1 -1
  96. package/dist/routing/utils.d.ts +10 -7
  97. package/dist/routing/utils.js +75 -111
  98. package/dist/routing/utils.js.map +1 -1
  99. package/dist/server/api-handler.d.ts +8 -13
  100. package/dist/server/api-handler.js +160 -193
  101. package/dist/server/api-handler.js.map +1 -1
  102. package/dist/server/app-router-entry.d.ts +6 -16
  103. package/dist/server/app-router-entry.js +26 -54
  104. package/dist/server/app-router-entry.js.map +1 -1
  105. package/dist/server/dev-module-runner.d.ts +11 -64
  106. package/dist/server/dev-module-runner.js +89 -101
  107. package/dist/server/dev-module-runner.js.map +1 -1
  108. package/dist/server/dev-origin-check.d.ts +12 -10
  109. package/dist/server/dev-origin-check.js +98 -108
  110. package/dist/server/dev-origin-check.js.map +1 -1
  111. package/dist/server/dev-server.d.ts +19 -15
  112. package/dist/server/dev-server.js +543 -871
  113. package/dist/server/dev-server.js.map +1 -1
  114. package/dist/server/html.d.ts +4 -1
  115. package/dist/server/html.js +25 -26
  116. package/dist/server/html.js.map +1 -1
  117. package/dist/server/image-optimization.d.ts +31 -28
  118. package/dist/server/image-optimization.js +181 -210
  119. package/dist/server/image-optimization.js.map +1 -1
  120. package/dist/server/instrumentation.d.ts +34 -59
  121. package/dist/server/instrumentation.js +112 -125
  122. package/dist/server/instrumentation.js.map +1 -1
  123. package/dist/server/isr-cache.d.ts +16 -26
  124. package/dist/server/isr-cache.js +106 -128
  125. package/dist/server/isr-cache.js.map +1 -1
  126. package/dist/server/metadata-routes.d.ts +85 -88
  127. package/dist/server/metadata-routes.js +270 -317
  128. package/dist/server/metadata-routes.js.map +1 -1
  129. package/dist/server/middleware-codegen.d.ts +7 -4
  130. package/dist/server/middleware-codegen.js +61 -61
  131. package/dist/server/middleware-codegen.js.map +1 -1
  132. package/dist/server/middleware-request-headers.d.ts +8 -6
  133. package/dist/server/middleware-request-headers.js +47 -65
  134. package/dist/server/middleware-request-headers.js.map +1 -1
  135. package/dist/server/middleware.d.ts +32 -47
  136. package/dist/server/middleware.js +261 -409
  137. package/dist/server/middleware.js.map +1 -1
  138. package/dist/server/normalize-path.d.ts +4 -1
  139. package/dist/server/normalize-path.js +33 -47
  140. package/dist/server/normalize-path.js.map +1 -1
  141. package/dist/server/pages-i18n.d.ts +38 -30
  142. package/dist/server/pages-i18n.js +112 -139
  143. package/dist/server/pages-i18n.js.map +1 -1
  144. package/dist/server/prod-server.d.ts +19 -31
  145. package/dist/server/prod-server.js +715 -945
  146. package/dist/server/prod-server.js.map +1 -1
  147. package/dist/server/request-log.d.ts +18 -12
  148. package/dist/server/request-log.js +45 -52
  149. package/dist/server/request-log.js.map +1 -1
  150. package/dist/server/request-pipeline.d.ts +9 -17
  151. package/dist/server/request-pipeline.js +133 -184
  152. package/dist/server/request-pipeline.js.map +1 -1
  153. package/dist/server/worker-utils.d.ts +4 -1
  154. package/dist/server/worker-utils.js +31 -37
  155. package/dist/server/worker-utils.js.map +1 -1
  156. package/dist/shims/amp.d.ts +5 -2
  157. package/dist/shims/amp.js +19 -15
  158. package/dist/shims/amp.js.map +1 -1
  159. package/dist/shims/app.d.ts +8 -10
  160. package/dist/shims/app.js +0 -1
  161. package/dist/shims/cache-runtime.d.ts +20 -45
  162. package/dist/shims/cache-runtime.js +271 -422
  163. package/dist/shims/cache-runtime.js.map +1 -1
  164. package/dist/shims/cache.d.ts +130 -121
  165. package/dist/shims/cache.js +339 -427
  166. package/dist/shims/cache.js.map +1 -1
  167. package/dist/shims/client-only.d.ts +1 -18
  168. package/dist/shims/client-only.js +0 -17
  169. package/dist/shims/compat-router.d.ts +6 -1
  170. package/dist/shims/compat-router.js +23 -19
  171. package/dist/shims/compat-router.js.map +1 -1
  172. package/dist/shims/config.d.ts +7 -5
  173. package/dist/shims/config.js +16 -23
  174. package/dist/shims/config.js.map +1 -1
  175. package/dist/shims/constants.d.ts +119 -118
  176. package/dist/shims/constants.js +159 -164
  177. package/dist/shims/constants.js.map +1 -1
  178. package/dist/shims/document.d.ts +20 -16
  179. package/dist/shims/document.js +41 -22
  180. package/dist/shims/document.js.map +1 -1
  181. package/dist/shims/dynamic.d.ts +13 -22
  182. package/dist/shims/dynamic.js +122 -136
  183. package/dist/shims/dynamic.js.map +1 -1
  184. package/dist/shims/error-boundary.d.ts +22 -15
  185. package/dist/shims/error-boundary.js +81 -79
  186. package/dist/shims/error-boundary.js.map +1 -1
  187. package/dist/shims/error.d.ts +11 -12
  188. package/dist/shims/error.js +35 -39
  189. package/dist/shims/error.js.map +1 -1
  190. package/dist/shims/fetch-cache.d.ts +16 -14
  191. package/dist/shims/fetch-cache.js +439 -645
  192. package/dist/shims/fetch-cache.js.map +1 -1
  193. package/dist/shims/font-google-base.d.ts +28 -26
  194. package/dist/shims/font-google-base.js +238 -325
  195. package/dist/shims/font-google-base.js.map +1 -1
  196. package/dist/shims/font-google.d.ts +3 -3
  197. package/dist/shims/font-google.generated.d.ts +1928 -1924
  198. package/dist/shims/font-google.generated.js +1928 -2133
  199. package/dist/shims/font-google.generated.js.map +1 -1
  200. package/dist/shims/font-google.js +3 -3
  201. package/dist/shims/font-local.d.ts +28 -26
  202. package/dist/shims/font-local.js +204 -260
  203. package/dist/shims/font-local.js.map +1 -1
  204. package/dist/shims/form.d.ts +13 -27
  205. package/dist/shims/form.js +128 -180
  206. package/dist/shims/form.js.map +1 -1
  207. package/dist/shims/head-state.d.ts +8 -13
  208. package/dist/shims/head-state.js +25 -42
  209. package/dist/shims/head-state.js.map +1 -1
  210. package/dist/shims/head.d.ts +17 -20
  211. package/dist/shims/head.js +194 -250
  212. package/dist/shims/head.js.map +1 -1
  213. package/dist/shims/headers.d.ts +84 -78
  214. package/dist/shims/headers.js +447 -575
  215. package/dist/shims/headers.js.map +1 -1
  216. package/dist/shims/i18n-context.d.ts +16 -20
  217. package/dist/shims/i18n-context.js +35 -48
  218. package/dist/shims/i18n-context.js.map +1 -1
  219. package/dist/shims/i18n-state.d.ts +8 -14
  220. package/dist/shims/i18n-state.js +34 -42
  221. package/dist/shims/i18n-state.js.map +1 -1
  222. package/dist/shims/image-config.d.ts +11 -8
  223. package/dist/shims/image-config.js +50 -83
  224. package/dist/shims/image-config.js.map +1 -1
  225. package/dist/shims/image.d.ts +37 -46
  226. package/dist/shims/image.js +283 -308
  227. package/dist/shims/image.js.map +1 -1
  228. package/dist/shims/internal/api-utils.d.ts +7 -4
  229. package/dist/shims/internal/api-utils.js +0 -6
  230. package/dist/shims/internal/app-router-context.d.ts +22 -17
  231. package/dist/shims/internal/app-router-context.js +17 -13
  232. package/dist/shims/internal/app-router-context.js.map +1 -1
  233. package/dist/shims/internal/cookies.d.ts +2 -9
  234. package/dist/shims/internal/cookies.js +2 -9
  235. package/dist/shims/internal/parse-cookie-header.d.ts +4 -1
  236. package/dist/shims/internal/parse-cookie-header.js +29 -29
  237. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  238. package/dist/shims/internal/router-context.d.ts +7 -1
  239. package/dist/shims/internal/router-context.js +11 -7
  240. package/dist/shims/internal/router-context.js.map +1 -1
  241. package/dist/shims/internal/utils.d.ts +40 -37
  242. package/dist/shims/internal/utils.js +24 -30
  243. package/dist/shims/internal/utils.js.map +1 -1
  244. package/dist/shims/internal/work-unit-async-storage.d.ts +6 -10
  245. package/dist/shims/internal/work-unit-async-storage.js +14 -11
  246. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  247. package/dist/shims/layout-segment-context.d.ts +11 -14
  248. package/dist/shims/layout-segment-context.js +24 -23
  249. package/dist/shims/layout-segment-context.js.map +1 -1
  250. package/dist/shims/legacy-image.d.ts +39 -46
  251. package/dist/shims/legacy-image.js +47 -42
  252. package/dist/shims/legacy-image.js.map +1 -1
  253. package/dist/shims/link.d.ts +32 -36
  254. package/dist/shims/link.js +255 -391
  255. package/dist/shims/link.js.map +1 -1
  256. package/dist/shims/metadata.d.ts +210 -202
  257. package/dist/shims/metadata.js +545 -546
  258. package/dist/shims/metadata.js.map +1 -1
  259. package/dist/shims/navigation-state.d.ts +10 -18
  260. package/dist/shims/navigation-state.js +66 -74
  261. package/dist/shims/navigation-state.js.map +1 -1
  262. package/dist/shims/navigation.d.ts +59 -63
  263. package/dist/shims/navigation.js +505 -704
  264. package/dist/shims/navigation.js.map +1 -1
  265. package/dist/shims/og.d.ts +2 -20
  266. package/dist/shims/og.js +2 -19
  267. package/dist/shims/readonly-url-search-params.d.ts +8 -5
  268. package/dist/shims/readonly-url-search-params.js +26 -22
  269. package/dist/shims/readonly-url-search-params.js.map +1 -1
  270. package/dist/shims/request-context.d.ts +8 -5
  271. package/dist/shims/request-context.js +50 -60
  272. package/dist/shims/request-context.js.map +1 -1
  273. package/dist/shims/request-state-types.d.ts +11 -11
  274. package/dist/shims/request-state-types.js +0 -1
  275. package/dist/shims/router-state.d.ts +13 -10
  276. package/dist/shims/router-state.js +34 -43
  277. package/dist/shims/router-state.js.map +1 -1
  278. package/dist/shims/router.d.ts +81 -85
  279. package/dist/shims/router.js +506 -628
  280. package/dist/shims/router.js.map +1 -1
  281. package/dist/shims/script.d.ts +39 -48
  282. package/dist/shims/script.js +107 -160
  283. package/dist/shims/script.js.map +1 -1
  284. package/dist/shims/server-only.d.ts +1 -19
  285. package/dist/shims/server-only.js +0 -18
  286. package/dist/shims/server.d.ts +213 -164
  287. package/dist/shims/server.js +545 -478
  288. package/dist/shims/server.js.map +1 -1
  289. package/dist/shims/unified-request-context.d.ts +20 -20
  290. package/dist/shims/unified-request-context.js +81 -99
  291. package/dist/shims/unified-request-context.js.map +1 -1
  292. package/dist/shims/url-safety.d.ts +4 -1
  293. package/dist/shims/url-safety.js +15 -11
  294. package/dist/shims/url-safety.js.map +1 -1
  295. package/dist/shims/url-utils.d.ts +8 -5
  296. package/dist/shims/url-utils.js +62 -93
  297. package/dist/shims/url-utils.js.map +1 -1
  298. package/dist/shims/web-vitals.d.ts +10 -8
  299. package/dist/shims/web-vitals.js +9 -15
  300. package/dist/shims/web-vitals.js.map +1 -1
  301. package/dist/utils/base-path.d.ts +5 -2
  302. package/dist/utils/base-path.js +21 -19
  303. package/dist/utils/base-path.js.map +1 -1
  304. package/dist/utils/domain-locale.d.ts +17 -9
  305. package/dist/utils/domain-locale.js +36 -56
  306. package/dist/utils/domain-locale.js.map +1 -1
  307. package/dist/utils/hash.d.ts +4 -1
  308. package/dist/utils/hash.js +19 -17
  309. package/dist/utils/hash.js.map +1 -1
  310. package/dist/utils/manifest-paths.d.ts +6 -3
  311. package/dist/utils/manifest-paths.js +15 -16
  312. package/dist/utils/manifest-paths.js.map +1 -1
  313. package/dist/utils/project.d.ts +13 -11
  314. package/dist/utils/project.js +169 -216
  315. package/dist/utils/project.js.map +1 -1
  316. package/dist/utils/query.d.ts +8 -6
  317. package/dist/utils/query.js +57 -67
  318. package/dist/utils/query.js.map +1 -1
  319. package/package.json +10 -9
  320. package/dist/build/report.d.ts.map +0 -1
  321. package/dist/build/static-export.d.ts.map +0 -1
  322. package/dist/check.d.ts.map +0 -1
  323. package/dist/cli.d.ts.map +0 -1
  324. package/dist/client/entry.d.ts.map +0 -1
  325. package/dist/client/validate-module-path.d.ts.map +0 -1
  326. package/dist/client/vinext-next-data.d.ts.map +0 -1
  327. package/dist/client/vinext-next-data.js.map +0 -1
  328. package/dist/cloudflare/index.d.ts.map +0 -1
  329. package/dist/cloudflare/index.js.map +0 -1
  330. package/dist/cloudflare/kv-cache-handler.d.ts.map +0 -1
  331. package/dist/cloudflare/tpr.d.ts.map +0 -1
  332. package/dist/config/config-matchers.d.ts.map +0 -1
  333. package/dist/config/dotenv.d.ts.map +0 -1
  334. package/dist/config/next-config.d.ts.map +0 -1
  335. package/dist/deploy.d.ts.map +0 -1
  336. package/dist/entries/app-browser-entry.d.ts.map +0 -1
  337. package/dist/entries/app-rsc-entry.d.ts.map +0 -1
  338. package/dist/entries/app-ssr-entry.d.ts.map +0 -1
  339. package/dist/entries/pages-client-entry.d.ts.map +0 -1
  340. package/dist/entries/pages-entry-helpers.d.ts.map +0 -1
  341. package/dist/entries/pages-server-entry.d.ts.map +0 -1
  342. package/dist/index.d.ts.map +0 -1
  343. package/dist/init.d.ts.map +0 -1
  344. package/dist/plugins/async-hooks-stub.d.ts.map +0 -1
  345. package/dist/plugins/client-reference-dedup.d.ts.map +0 -1
  346. package/dist/routing/app-router.d.ts.map +0 -1
  347. package/dist/routing/file-matcher.d.ts.map +0 -1
  348. package/dist/routing/pages-router.d.ts.map +0 -1
  349. package/dist/routing/route-trie.d.ts.map +0 -1
  350. package/dist/routing/route-validation.d.ts.map +0 -1
  351. package/dist/routing/utils.d.ts.map +0 -1
  352. package/dist/server/api-handler.d.ts.map +0 -1
  353. package/dist/server/app-router-entry.d.ts.map +0 -1
  354. package/dist/server/dev-module-runner.d.ts.map +0 -1
  355. package/dist/server/dev-origin-check.d.ts.map +0 -1
  356. package/dist/server/dev-server.d.ts.map +0 -1
  357. package/dist/server/html.d.ts.map +0 -1
  358. package/dist/server/image-optimization.d.ts.map +0 -1
  359. package/dist/server/instrumentation.d.ts.map +0 -1
  360. package/dist/server/isr-cache.d.ts.map +0 -1
  361. package/dist/server/metadata-routes.d.ts.map +0 -1
  362. package/dist/server/middleware-codegen.d.ts.map +0 -1
  363. package/dist/server/middleware-request-headers.d.ts.map +0 -1
  364. package/dist/server/middleware.d.ts.map +0 -1
  365. package/dist/server/normalize-path.d.ts.map +0 -1
  366. package/dist/server/pages-i18n.d.ts.map +0 -1
  367. package/dist/server/prod-server.d.ts.map +0 -1
  368. package/dist/server/request-log.d.ts.map +0 -1
  369. package/dist/server/request-pipeline.d.ts.map +0 -1
  370. package/dist/server/worker-utils.d.ts.map +0 -1
  371. package/dist/shims/amp.d.ts.map +0 -1
  372. package/dist/shims/app.d.ts.map +0 -1
  373. package/dist/shims/app.js.map +0 -1
  374. package/dist/shims/cache-runtime.d.ts.map +0 -1
  375. package/dist/shims/cache.d.ts.map +0 -1
  376. package/dist/shims/client-only.d.ts.map +0 -1
  377. package/dist/shims/client-only.js.map +0 -1
  378. package/dist/shims/compat-router.d.ts.map +0 -1
  379. package/dist/shims/config.d.ts.map +0 -1
  380. package/dist/shims/constants.d.ts.map +0 -1
  381. package/dist/shims/document.d.ts.map +0 -1
  382. package/dist/shims/dynamic.d.ts.map +0 -1
  383. package/dist/shims/error-boundary.d.ts.map +0 -1
  384. package/dist/shims/error.d.ts.map +0 -1
  385. package/dist/shims/fetch-cache.d.ts.map +0 -1
  386. package/dist/shims/font-google-base.d.ts.map +0 -1
  387. package/dist/shims/font-google.d.ts.map +0 -1
  388. package/dist/shims/font-google.generated.d.ts.map +0 -1
  389. package/dist/shims/font-google.js.map +0 -1
  390. package/dist/shims/font-local.d.ts.map +0 -1
  391. package/dist/shims/form.d.ts.map +0 -1
  392. package/dist/shims/head-state.d.ts.map +0 -1
  393. package/dist/shims/head.d.ts.map +0 -1
  394. package/dist/shims/headers.d.ts.map +0 -1
  395. package/dist/shims/i18n-context.d.ts.map +0 -1
  396. package/dist/shims/i18n-state.d.ts.map +0 -1
  397. package/dist/shims/image-config.d.ts.map +0 -1
  398. package/dist/shims/image.d.ts.map +0 -1
  399. package/dist/shims/internal/api-utils.d.ts.map +0 -1
  400. package/dist/shims/internal/api-utils.js.map +0 -1
  401. package/dist/shims/internal/app-router-context.d.ts.map +0 -1
  402. package/dist/shims/internal/cookies.d.ts.map +0 -1
  403. package/dist/shims/internal/cookies.js.map +0 -1
  404. package/dist/shims/internal/parse-cookie-header.d.ts.map +0 -1
  405. package/dist/shims/internal/router-context.d.ts.map +0 -1
  406. package/dist/shims/internal/utils.d.ts.map +0 -1
  407. package/dist/shims/internal/work-unit-async-storage.d.ts.map +0 -1
  408. package/dist/shims/layout-segment-context.d.ts.map +0 -1
  409. package/dist/shims/legacy-image.d.ts.map +0 -1
  410. package/dist/shims/link.d.ts.map +0 -1
  411. package/dist/shims/metadata.d.ts.map +0 -1
  412. package/dist/shims/navigation-state.d.ts.map +0 -1
  413. package/dist/shims/navigation.d.ts.map +0 -1
  414. package/dist/shims/og.d.ts.map +0 -1
  415. package/dist/shims/og.js.map +0 -1
  416. package/dist/shims/readonly-url-search-params.d.ts.map +0 -1
  417. package/dist/shims/request-context.d.ts.map +0 -1
  418. package/dist/shims/request-state-types.d.ts.map +0 -1
  419. package/dist/shims/request-state-types.js.map +0 -1
  420. package/dist/shims/router-state.d.ts.map +0 -1
  421. package/dist/shims/router.d.ts.map +0 -1
  422. package/dist/shims/script.d.ts.map +0 -1
  423. package/dist/shims/server-only.d.ts.map +0 -1
  424. package/dist/shims/server-only.js.map +0 -1
  425. package/dist/shims/server.d.ts.map +0 -1
  426. package/dist/shims/unified-request-context.d.ts.map +0 -1
  427. package/dist/shims/url-safety.d.ts.map +0 -1
  428. package/dist/shims/url-utils.d.ts.map +0 -1
  429. package/dist/shims/web-vitals.d.ts.map +0 -1
  430. package/dist/utils/base-path.d.ts.map +0 -1
  431. package/dist/utils/domain-locale.d.ts.map +0 -1
  432. package/dist/utils/hash.d.ts.map +0 -1
  433. package/dist/utils/manifest-paths.d.ts.map +0 -1
  434. package/dist/utils/project.d.ts.map +0 -1
  435. package/dist/utils/query.d.ts.map +0 -1
@@ -1,313 +1,257 @@
1
+ //#region src/shims/font-local.ts
1
2
  /**
2
- * next/font/local shim
3
- *
4
- * Provides a runtime-compatible shim for Next.js local fonts.
5
- * Generates @font-face CSS declarations and returns an object
6
- * with className, style, and variable properties.
7
- *
8
- * Supports both client-side injection and SSR collection,
9
- * matching the patterns used by the Google font shim.
10
- *
11
- * Usage:
12
- * import localFont from 'next/font/local';
13
- * const myFont = localFont({ src: './my-font.woff2' });
14
- * // myFont.className -> unique CSS class
15
- * // myFont.style -> { fontFamily: "'__local_font_0', sans-serif" }
16
- * // myFont.variable -> generated class name (e.g. "__variable_local_0")
17
- */
3
+ * next/font/local shim
4
+ *
5
+ * Provides a runtime-compatible shim for Next.js local fonts.
6
+ * Generates @font-face CSS declarations and returns an object
7
+ * with className, style, and variable properties.
8
+ *
9
+ * Supports both client-side injection and SSR collection,
10
+ * matching the patterns used by the Google font shim.
11
+ *
12
+ * Usage:
13
+ * import localFont from 'next/font/local';
14
+ * const myFont = localFont({ src: './my-font.woff2' });
15
+ * // myFont.className -> unique CSS class
16
+ * // myFont.style -> { fontFamily: "'__local_font_0', sans-serif" }
17
+ * // myFont.variable -> generated class name (e.g. "__variable_local_0")
18
+ */
18
19
  /**
19
- * Escape a string for safe interpolation inside a CSS single-quoted string.
20
- *
21
- * Prevents CSS injection by escaping characters that could break out of
22
- * a `'...'` CSS string context: backslashes, single quotes, and newlines.
23
- */
20
+ * Escape a string for safe interpolation inside a CSS single-quoted string.
21
+ *
22
+ * Prevents CSS injection by escaping characters that could break out of
23
+ * a `'...'` CSS string context: backslashes, single quotes, and newlines.
24
+ */
24
25
  function escapeCSSString(value) {
25
- return value
26
- .replace(/\\/g, "\\\\")
27
- .replace(/'/g, "\\'")
28
- .replace(/\n/g, "\\a ")
29
- .replace(/\r/g, "\\d ");
26
+ return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/\n/g, "\\a ").replace(/\r/g, "\\d ");
30
27
  }
31
28
  /**
32
- * Validate a CSS custom property name (e.g. `--font-inter`).
33
- *
34
- * Custom properties must start with `--` and only contain alphanumeric
35
- * characters, hyphens, and underscores. Anything else could be used to
36
- * break out of the CSS declaration and inject arbitrary rules.
37
- *
38
- * Returns the name if valid, undefined otherwise.
39
- */
29
+ * Validate a CSS custom property name (e.g. `--font-inter`).
30
+ *
31
+ * Custom properties must start with `--` and only contain alphanumeric
32
+ * characters, hyphens, and underscores. Anything else could be used to
33
+ * break out of the CSS declaration and inject arbitrary rules.
34
+ *
35
+ * Returns the name if valid, undefined otherwise.
36
+ */
40
37
  function sanitizeCSSVarName(name) {
41
- if (/^--[a-zA-Z0-9_-]+$/.test(name))
42
- return name;
43
- return undefined;
38
+ if (/^--[a-zA-Z0-9_-]+$/.test(name)) return name;
44
39
  }
45
40
  /**
46
- * Sanitize a CSS font-family fallback name.
47
- *
48
- * Generic family names (sans-serif, serif, monospace, etc.) are used as-is.
49
- * Named families are wrapped in escaped quotes. This prevents injection via
50
- * crafted fallback values like `); } body { color: red; } .x {`.
51
- */
41
+ * Sanitize a CSS font-family fallback name.
42
+ *
43
+ * Generic family names (sans-serif, serif, monospace, etc.) are used as-is.
44
+ * Named families are wrapped in escaped quotes. This prevents injection via
45
+ * crafted fallback values like `); } body { color: red; } .x {`.
46
+ */
52
47
  function sanitizeFallback(name) {
53
- // CSS generic font families — safe to use unquoted
54
- const generics = new Set([
55
- "serif",
56
- "sans-serif",
57
- "monospace",
58
- "cursive",
59
- "fantasy",
60
- "system-ui",
61
- "ui-serif",
62
- "ui-sans-serif",
63
- "ui-monospace",
64
- "ui-rounded",
65
- "emoji",
66
- "math",
67
- "fangsong",
68
- ]);
69
- const trimmed = name.trim();
70
- if (generics.has(trimmed))
71
- return trimmed;
72
- // Wrap in single quotes with escaping to prevent CSS injection
73
- return `'${escapeCSSString(trimmed)}'`;
48
+ const generics = new Set([
49
+ "serif",
50
+ "sans-serif",
51
+ "monospace",
52
+ "cursive",
53
+ "fantasy",
54
+ "system-ui",
55
+ "ui-serif",
56
+ "ui-sans-serif",
57
+ "ui-monospace",
58
+ "ui-rounded",
59
+ "emoji",
60
+ "math",
61
+ "fangsong"
62
+ ]);
63
+ const trimmed = name.trim();
64
+ if (generics.has(trimmed)) return trimmed;
65
+ return `'${escapeCSSString(trimmed)}'`;
74
66
  }
75
67
  /**
76
- * Validate a CSS property name for use in declarations.
77
- *
78
- * Only allows standard CSS property names (lowercase letters and hyphens)
79
- * and custom properties (--prefixed). Rejects anything that could inject
80
- * CSS rules via crafted property names.
81
- */
68
+ * Validate a CSS property name for use in declarations.
69
+ *
70
+ * Only allows standard CSS property names (lowercase letters and hyphens)
71
+ * and custom properties (--prefixed). Rejects anything that could inject
72
+ * CSS rules via crafted property names.
73
+ */
82
74
  function sanitizeCSSProperty(prop) {
83
- if (/^(--)?[a-zA-Z][a-zA-Z0-9-]*$/.test(prop))
84
- return prop;
85
- return undefined;
75
+ if (/^(--)?[a-zA-Z][a-zA-Z0-9-]*$/.test(prop)) return prop;
86
76
  }
87
77
  /**
88
- * Sanitize a CSS property value for use in declarations.
89
- *
90
- * Rejects values containing characters that could break out of a CSS
91
- * declaration: `{`, `}`, `;`, and `</` (to prevent closing style tags).
92
- */
78
+ * Sanitize a CSS property value for use in declarations.
79
+ *
80
+ * Rejects values containing characters that could break out of a CSS
81
+ * declaration: `{`, `}`, `;`, and `</` (to prevent closing style tags).
82
+ */
93
83
  function sanitizeCSSValue(value) {
94
- if (/[{}]|<\//.test(value))
95
- return undefined;
96
- return value;
84
+ if (/[{}]|<\//.test(value)) return void 0;
85
+ return value;
97
86
  }
98
87
  let classCounter = 0;
99
- const injectedFonts = new Set();
88
+ const injectedFonts = /* @__PURE__ */ new Set();
100
89
  function generateFontFaceCSS(family, options) {
101
- const sources = normalizeSources(options);
102
- const display = options.display ?? "swap";
103
- const rules = [];
104
- for (const src of sources) {
105
- const weight = src.weight ?? options.weight ?? "400";
106
- const style = src.style ?? options.style ?? "normal";
107
- const format = src.path.endsWith(".woff2")
108
- ? "woff2"
109
- : src.path.endsWith(".woff")
110
- ? "woff"
111
- : src.path.endsWith(".ttf")
112
- ? "truetype"
113
- : src.path.endsWith(".otf")
114
- ? "opentype"
115
- : "woff2";
116
- rules.push(`@font-face {
90
+ const sources = normalizeSources(options);
91
+ const display = options.display ?? "swap";
92
+ const rules = [];
93
+ for (const src of sources) {
94
+ const weight = src.weight ?? options.weight ?? "400";
95
+ const style = src.style ?? options.style ?? "normal";
96
+ const format = src.path.endsWith(".woff2") ? "woff2" : src.path.endsWith(".woff") ? "woff" : src.path.endsWith(".ttf") ? "truetype" : src.path.endsWith(".otf") ? "opentype" : "woff2";
97
+ rules.push(`@font-face {
117
98
  font-family: '${escapeCSSString(family)}';
118
99
  src: url('${escapeCSSString(src.path)}') format('${format}');
119
100
  font-weight: ${weight};
120
101
  font-style: ${style};
121
102
  font-display: ${display};
122
103
  }`);
123
- }
124
- // Add extra declarations if provided sanitize prop/value to prevent injection
125
- if (options.declarations) {
126
- for (const decl of options.declarations) {
127
- const safeProp = sanitizeCSSProperty(decl.prop);
128
- const safeValue = sanitizeCSSValue(decl.value);
129
- if (safeProp && safeValue) {
130
- rules.push(`@font-face { font-family: '${escapeCSSString(family)}'; ${safeProp}: ${safeValue}; }`);
131
- }
132
- }
133
- }
134
- return rules.join("\n");
104
+ }
105
+ if (options.declarations) for (const decl of options.declarations) {
106
+ const safeProp = sanitizeCSSProperty(decl.prop);
107
+ const safeValue = sanitizeCSSValue(decl.value);
108
+ if (safeProp && safeValue) rules.push(`@font-face { font-family: '${escapeCSSString(family)}'; ${safeProp}: ${safeValue}; }`);
109
+ }
110
+ return rules.join("\n");
135
111
  }
136
- // SSR: collect font styles for injection in <head>
137
112
  const ssrFontStyles = [];
138
- // SSR: collect font file URLs for <link rel="preload"> injection
139
113
  const ssrFontPreloads = [];
140
- const ssrFontPreloadHrefs = new Set();
114
+ const ssrFontPreloadHrefs = /* @__PURE__ */ new Set();
141
115
  /**
142
- * Get collected SSR font styles (used by the renderer).
143
- * Note: We don't clear the arrays because fonts are loaded at module import
144
- * time and need to persist across all requests in the Workers environment.
145
- */
146
- export function getSSRFontStyles() {
147
- return [...ssrFontStyles];
116
+ * Get collected SSR font styles (used by the renderer).
117
+ * Note: We don't clear the arrays because fonts are loaded at module import
118
+ * time and need to persist across all requests in the Workers environment.
119
+ */
120
+ function getSSRFontStyles() {
121
+ return [...ssrFontStyles];
148
122
  }
149
123
  /**
150
- * Get collected SSR font preload data (used by the renderer).
151
- * Returns an array of { href, type } objects for emitting
152
- * <link rel="preload" as="font" ...> tags.
153
- */
154
- export function getSSRFontPreloads() {
155
- return [...ssrFontPreloads];
124
+ * Get collected SSR font preload data (used by the renderer).
125
+ * Returns an array of { href, type } objects for emitting
126
+ * <link rel="preload" as="font" ...> tags.
127
+ */
128
+ function getSSRFontPreloads() {
129
+ return [...ssrFontPreloads];
156
130
  }
157
131
  function injectFontFaceCSS(css, id) {
158
- if (injectedFonts.has(id))
159
- return;
160
- injectedFonts.add(id);
161
- // On server, store the CSS for SSR injection
162
- if (typeof document === "undefined") {
163
- ssrFontStyles.push(css);
164
- return;
165
- }
166
- const style = document.createElement("style");
167
- style.textContent = css;
168
- style.setAttribute("data-vinext-font", id);
169
- document.head.appendChild(style);
132
+ if (injectedFonts.has(id)) return;
133
+ injectedFonts.add(id);
134
+ if (typeof document === "undefined") {
135
+ ssrFontStyles.push(css);
136
+ return;
137
+ }
138
+ const style = document.createElement("style");
139
+ style.textContent = css;
140
+ style.setAttribute("data-vinext-font", id);
141
+ document.head.appendChild(style);
170
142
  }
171
143
  /** Track which className CSS rules have been injected. */
172
- const injectedClassRules = new Set();
144
+ const injectedClassRules = /* @__PURE__ */ new Set();
173
145
  /**
174
- * Inject a CSS rule that maps a className to a font-family.
175
- *
176
- * This is what makes `<div className={font.className}>` apply the font.
177
- *
178
- * In Next.js, the .className class ONLY sets font-family — it does NOT
179
- * set CSS variables. CSS variables are handled separately by the .variable class.
180
- */
146
+ * Inject a CSS rule that maps a className to a font-family.
147
+ *
148
+ * This is what makes `<div className={font.className}>` apply the font.
149
+ *
150
+ * In Next.js, the .className class ONLY sets font-family — it does NOT
151
+ * set CSS variables. CSS variables are handled separately by the .variable class.
152
+ */
181
153
  function injectClassNameRule(className, fontFamily) {
182
- if (injectedClassRules.has(className))
183
- return;
184
- injectedClassRules.add(className);
185
- const css = `.${className} { font-family: ${fontFamily}; }\n`;
186
- // On server, store the CSS for SSR injection
187
- if (typeof document === "undefined") {
188
- ssrFontStyles.push(css);
189
- return;
190
- }
191
- // On client, inject a <style> tag
192
- const style = document.createElement("style");
193
- style.textContent = css;
194
- style.setAttribute("data-vinext-font-class", className);
195
- document.head.appendChild(style);
154
+ if (injectedClassRules.has(className)) return;
155
+ injectedClassRules.add(className);
156
+ const css = `.${className} { font-family: ${fontFamily}; }\n`;
157
+ if (typeof document === "undefined") {
158
+ ssrFontStyles.push(css);
159
+ return;
160
+ }
161
+ const style = document.createElement("style");
162
+ style.textContent = css;
163
+ style.setAttribute("data-vinext-font-class", className);
164
+ document.head.appendChild(style);
196
165
  }
197
166
  /** Track which variable class CSS rules have been injected. */
198
- const injectedVariableRules = new Set();
167
+ const injectedVariableRules = /* @__PURE__ */ new Set();
199
168
  /** Track which :root CSS variable rules have been injected. */
200
- const injectedRootVariables = new Set();
169
+ const injectedRootVariables = /* @__PURE__ */ new Set();
201
170
  /**
202
- * Inject a CSS rule that sets a CSS variable on an element.
203
- * This is what makes `<html className={font.variable}>` set the CSS variable
204
- * that can be referenced by other styles (e.g., Tailwind's font-sans).
205
- *
206
- * In Next.js, the .variable class ONLY sets the CSS variable — it does NOT
207
- * set font-family. This is critical because apps commonly apply multiple
208
- * .variable classes to <body> (e.g., geistSans.variable + geistMono.variable).
209
- * If we also set font-family here, the last class wins due to CSS cascade,
210
- * causing all text to use that font (e.g., everything becomes monospace).
211
- */
171
+ * Inject a CSS rule that sets a CSS variable on an element.
172
+ * This is what makes `<html className={font.variable}>` set the CSS variable
173
+ * that can be referenced by other styles (e.g., Tailwind's font-sans).
174
+ *
175
+ * In Next.js, the .variable class ONLY sets the CSS variable — it does NOT
176
+ * set font-family. This is critical because apps commonly apply multiple
177
+ * .variable classes to <body> (e.g., geistSans.variable + geistMono.variable).
178
+ * If we also set font-family here, the last class wins due to CSS cascade,
179
+ * causing all text to use that font (e.g., everything becomes monospace).
180
+ */
212
181
  function injectVariableClassRule(variableClassName, cssVarName, fontFamily) {
213
- if (injectedVariableRules.has(variableClassName))
214
- return;
215
- injectedVariableRules.add(variableClassName);
216
- // Only set the CSS variable — do NOT set font-family.
217
- // This matches Next.js behavior where .variable classes only define CSS variables.
218
- let css = `.${variableClassName} { ${cssVarName}: ${fontFamily}; }\n`;
219
- // Also inject at :root so CSS variable inheritance works throughout the page.
220
- // This ensures Tailwind utilities like `font-sans` that reference these
221
- // variables via var(--font-geist-sans) work correctly.
222
- if (!injectedRootVariables.has(cssVarName)) {
223
- injectedRootVariables.add(cssVarName);
224
- css += `:root { ${cssVarName}: ${fontFamily}; }\n`;
225
- }
226
- // On server, store the CSS for SSR injection
227
- if (typeof document === "undefined") {
228
- ssrFontStyles.push(css);
229
- return;
230
- }
231
- // On client, inject a <style> tag
232
- const style = document.createElement("style");
233
- style.textContent = css;
234
- style.setAttribute("data-vinext-font-variable", variableClassName);
235
- document.head.appendChild(style);
182
+ if (injectedVariableRules.has(variableClassName)) return;
183
+ injectedVariableRules.add(variableClassName);
184
+ let css = `.${variableClassName} { ${cssVarName}: ${fontFamily}; }\n`;
185
+ if (!injectedRootVariables.has(cssVarName)) {
186
+ injectedRootVariables.add(cssVarName);
187
+ css += `:root { ${cssVarName}: ${fontFamily}; }\n`;
188
+ }
189
+ if (typeof document === "undefined") {
190
+ ssrFontStyles.push(css);
191
+ return;
192
+ }
193
+ const style = document.createElement("style");
194
+ style.textContent = css;
195
+ style.setAttribute("data-vinext-font-variable", variableClassName);
196
+ document.head.appendChild(style);
236
197
  }
237
198
  /**
238
- * Normalize the `src` option into a flat array of `{ path, weight?, style? }`.
239
- * Handles string, single object, and array forms.
240
- */
199
+ * Normalize the `src` option into a flat array of `{ path, weight?, style? }`.
200
+ * Handles string, single object, and array forms.
201
+ */
241
202
  function normalizeSources(options) {
242
- if (Array.isArray(options.src))
243
- return options.src;
244
- if (typeof options.src === "string")
245
- return [{ path: options.src }];
246
- return [options.src];
203
+ if (Array.isArray(options.src)) return options.src;
204
+ if (typeof options.src === "string") return [{ path: options.src }];
205
+ return [options.src];
247
206
  }
248
207
  /**
249
- * Determine the MIME type for a font file based on its extension.
250
- * Uses endsWith() only — matching the approach in generateFontFaceCSS —
251
- * to avoid false positives from substring matches (e.g. ".woff" matching ".woff2").
252
- */
208
+ * Determine the MIME type for a font file based on its extension.
209
+ * Uses endsWith() only — matching the approach in generateFontFaceCSS —
210
+ * to avoid false positives from substring matches (e.g. ".woff" matching ".woff2").
211
+ */
253
212
  function getFontMimeType(pathOrUrl) {
254
- if (pathOrUrl.endsWith(".woff2"))
255
- return "font/woff2";
256
- if (pathOrUrl.endsWith(".woff"))
257
- return "font/woff";
258
- if (pathOrUrl.endsWith(".ttf"))
259
- return "font/ttf";
260
- if (pathOrUrl.endsWith(".otf"))
261
- return "font/opentype";
262
- return "font/woff2";
213
+ if (pathOrUrl.endsWith(".woff2")) return "font/woff2";
214
+ if (pathOrUrl.endsWith(".woff")) return "font/woff";
215
+ if (pathOrUrl.endsWith(".ttf")) return "font/ttf";
216
+ if (pathOrUrl.endsWith(".otf")) return "font/opentype";
217
+ return "font/woff2";
263
218
  }
264
219
  /**
265
- * Collect font source URLs for preload link generation.
266
- * Only collects on the server (SSR). Deduplicates by href using a Set for O(1) lookups.
267
- */
220
+ * Collect font source URLs for preload link generation.
221
+ * Only collects on the server (SSR). Deduplicates by href using a Set for O(1) lookups.
222
+ */
268
223
  function collectFontPreloads(options) {
269
- if (typeof document !== "undefined")
270
- return; // client-side, skip
271
- const sources = normalizeSources(options);
272
- for (const src of sources) {
273
- const href = src.path;
274
- // Only collect URLs that are absolute (start with /) — relative paths
275
- // would resolve incorrectly from different page URLs. The vinext:local-fonts
276
- // Vite transform should have already resolved them to absolute URLs.
277
- if (href && href.startsWith("/") && !ssrFontPreloadHrefs.has(href)) {
278
- ssrFontPreloadHrefs.add(href);
279
- ssrFontPreloads.push({ href, type: getFontMimeType(href) });
280
- }
281
- }
224
+ if (typeof document !== "undefined") return;
225
+ const sources = normalizeSources(options);
226
+ for (const src of sources) {
227
+ const href = src.path;
228
+ if (href && href.startsWith("/") && !ssrFontPreloadHrefs.has(href)) {
229
+ ssrFontPreloadHrefs.add(href);
230
+ ssrFontPreloads.push({
231
+ href,
232
+ type: getFontMimeType(href)
233
+ });
234
+ }
235
+ }
282
236
  }
283
- export default function localFont(options) {
284
- const id = classCounter++;
285
- const family = `__local_font_${id}`;
286
- const className = `__font_local_${id}`;
287
- const fallback = options.fallback ?? ["sans-serif"];
288
- // Sanitize each fallback name to prevent CSS injection via crafted values
289
- const fontFamily = `'${family}', ${fallback.map(sanitizeFallback).join(", ")}`;
290
- // Validate CSS variable name — reject anything that could inject CSS
291
- const cssVarName = options.variable ? sanitizeCSSVarName(options.variable) : undefined;
292
- // In Next.js, `variable` returns a CLASS NAME that sets the CSS variable.
293
- // Users apply this class to set the CSS variable on that element.
294
- const variableClassName = `__variable_local_${id}`;
295
- // Collect font URLs for preload <link> tags (SSR only)
296
- collectFontPreloads(options);
297
- // Inject @font-face declarations
298
- const css = generateFontFaceCSS(family, options);
299
- injectFontFaceCSS(css, family);
300
- // Inject the className -> font-family CSS rule
301
- injectClassNameRule(className, fontFamily);
302
- // Inject a CSS rule for the variable class name if variable is specified.
303
- // This is what makes `<html className={font.variable}>` set the CSS variable.
304
- if (cssVarName) {
305
- injectVariableClassRule(variableClassName, cssVarName, fontFamily);
306
- }
307
- return {
308
- className,
309
- style: { fontFamily },
310
- ...(cssVarName ? { variable: variableClassName } : {}),
311
- };
237
+ function localFont(options) {
238
+ const id = classCounter++;
239
+ const family = `__local_font_${id}`;
240
+ const className = `__font_local_${id}`;
241
+ const fontFamily = `'${family}', ${(options.fallback ?? ["sans-serif"]).map(sanitizeFallback).join(", ")}`;
242
+ const cssVarName = options.variable ? sanitizeCSSVarName(options.variable) : void 0;
243
+ const variableClassName = `__variable_local_${id}`;
244
+ collectFontPreloads(options);
245
+ injectFontFaceCSS(generateFontFaceCSS(family, options), family);
246
+ injectClassNameRule(className, fontFamily);
247
+ if (cssVarName) injectVariableClassRule(variableClassName, cssVarName, fontFamily);
248
+ return {
249
+ className,
250
+ style: { fontFamily },
251
+ ...cssVarName ? { variable: variableClassName } : {}
252
+ };
312
253
  }
254
+ //#endregion
255
+ export { localFont as default, getSSRFontPreloads, getSSRFontStyles };
256
+
313
257
  //# sourceMappingURL=font-local.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"font-local.js","sourceRoot":"","sources":["../../src/shims/font-local.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * next/font/local shim\n *\n * Provides a runtime-compatible shim for Next.js local fonts.\n * Generates @font-face CSS declarations and returns an object\n * with className, style, and variable properties.\n *\n * Supports both client-side injection and SSR collection,\n * matching the patterns used by the Google font shim.\n *\n * Usage:\n * import localFont from 'next/font/local';\n * const myFont = localFont({ src: './my-font.woff2' });\n * // myFont.className -> unique CSS class\n * // myFont.style -> { fontFamily: \"'__local_font_0', sans-serif\" }\n * // myFont.variable -> generated class name (e.g. \"__variable_local_0\")\n */\n\n/**\n * Escape a string for safe interpolation inside a CSS single-quoted string.\n *\n * Prevents CSS injection by escaping characters that could break out of\n * a `'...'` CSS string context: backslashes, single quotes, and newlines.\n */\nfunction escapeCSSString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, \"\\\\a \")\n .replace(/\\r/g, \"\\\\d \");\n}\n\n/**\n * Validate a CSS custom property name (e.g. `--font-inter`).\n *\n * Custom properties must start with `--` and only contain alphanumeric\n * characters, hyphens, and underscores. Anything else could be used to\n * break out of the CSS declaration and inject arbitrary rules.\n *\n * Returns the name if valid, undefined otherwise.\n */\nfunction sanitizeCSSVarName(name: string): string | undefined {\n if (/^--[a-zA-Z0-9_-]+$/.test(name)) return name;\n return undefined;\n}\n\n/**\n * Sanitize a CSS font-family fallback name.\n *\n * Generic family names (sans-serif, serif, monospace, etc.) are used as-is.\n * Named families are wrapped in escaped quotes. This prevents injection via\n * crafted fallback values like `); } body { color: red; } .x {`.\n */\nfunction sanitizeFallback(name: string): string {\n // CSS generic font families — safe to use unquoted\n const generics = new Set([\n \"serif\",\n \"sans-serif\",\n \"monospace\",\n \"cursive\",\n \"fantasy\",\n \"system-ui\",\n \"ui-serif\",\n \"ui-sans-serif\",\n \"ui-monospace\",\n \"ui-rounded\",\n \"emoji\",\n \"math\",\n \"fangsong\",\n ]);\n const trimmed = name.trim();\n if (generics.has(trimmed)) return trimmed;\n // Wrap in single quotes with escaping to prevent CSS injection\n return `'${escapeCSSString(trimmed)}'`;\n}\n\n/**\n * Validate a CSS property name for use in declarations.\n *\n * Only allows standard CSS property names (lowercase letters and hyphens)\n * and custom properties (--prefixed). Rejects anything that could inject\n * CSS rules via crafted property names.\n */\nfunction sanitizeCSSProperty(prop: string): string | undefined {\n if (/^(--)?[a-zA-Z][a-zA-Z0-9-]*$/.test(prop)) return prop;\n return undefined;\n}\n\n/**\n * Sanitize a CSS property value for use in declarations.\n *\n * Rejects values containing characters that could break out of a CSS\n * declaration: `{`, `}`, `;`, and `</` (to prevent closing style tags).\n */\nfunction sanitizeCSSValue(value: string): string | undefined {\n if (/[{}]|<\\//.test(value)) return undefined;\n return value;\n}\n\nlet classCounter = 0;\nconst injectedFonts = new Set<string>();\n\ninterface LocalFontSrc {\n path: string;\n weight?: string;\n style?: string;\n}\n\ninterface LocalFontOptions {\n src: string | LocalFontSrc | LocalFontSrc[];\n display?: string;\n weight?: string;\n style?: string;\n fallback?: string[];\n preload?: boolean;\n variable?: string;\n adjustFontFallback?: boolean | string;\n declarations?: Array<{ prop: string; value: string }>;\n}\n\ninterface FontResult {\n className: string;\n style: { fontFamily: string };\n variable?: string;\n}\n\nfunction generateFontFaceCSS(family: string, options: LocalFontOptions): string {\n const sources = normalizeSources(options);\n\n const display = options.display ?? \"swap\";\n const rules: string[] = [];\n\n for (const src of sources) {\n const weight = src.weight ?? options.weight ?? \"400\";\n const style = src.style ?? options.style ?? \"normal\";\n const format = src.path.endsWith(\".woff2\")\n ? \"woff2\"\n : src.path.endsWith(\".woff\")\n ? \"woff\"\n : src.path.endsWith(\".ttf\")\n ? \"truetype\"\n : src.path.endsWith(\".otf\")\n ? \"opentype\"\n : \"woff2\";\n\n rules.push(`@font-face {\n font-family: '${escapeCSSString(family)}';\n src: url('${escapeCSSString(src.path)}') format('${format}');\n font-weight: ${weight};\n font-style: ${style};\n font-display: ${display};\n}`);\n }\n\n // Add extra declarations if provided — sanitize prop/value to prevent injection\n if (options.declarations) {\n for (const decl of options.declarations) {\n const safeProp = sanitizeCSSProperty(decl.prop);\n const safeValue = sanitizeCSSValue(decl.value);\n if (safeProp && safeValue) {\n rules.push(\n `@font-face { font-family: '${escapeCSSString(family)}'; ${safeProp}: ${safeValue}; }`,\n );\n }\n }\n }\n\n return rules.join(\"\\n\");\n}\n\n// SSR: collect font styles for injection in <head>\nconst ssrFontStyles: string[] = [];\n\n// SSR: collect font file URLs for <link rel=\"preload\"> injection\nconst ssrFontPreloads: Array<{ href: string; type: string }> = [];\nconst ssrFontPreloadHrefs = new Set<string>();\n\n/**\n * Get collected SSR font styles (used by the renderer).\n * Note: We don't clear the arrays because fonts are loaded at module import\n * time and need to persist across all requests in the Workers environment.\n */\nexport function getSSRFontStyles(): string[] {\n return [...ssrFontStyles];\n}\n\n/**\n * Get collected SSR font preload data (used by the renderer).\n * Returns an array of { href, type } objects for emitting\n * <link rel=\"preload\" as=\"font\" ...> tags.\n */\nexport function getSSRFontPreloads(): Array<{ href: string; type: string }> {\n return [...ssrFontPreloads];\n}\n\nfunction injectFontFaceCSS(css: string, id: string): void {\n if (injectedFonts.has(id)) return;\n injectedFonts.add(id);\n\n // On server, store the CSS for SSR injection\n if (typeof document === \"undefined\") {\n ssrFontStyles.push(css);\n return;\n }\n\n const style = document.createElement(\"style\");\n style.textContent = css;\n style.setAttribute(\"data-vinext-font\", id);\n document.head.appendChild(style);\n}\n\n/** Track which className CSS rules have been injected. */\nconst injectedClassRules = new Set<string>();\n\n/**\n * Inject a CSS rule that maps a className to a font-family.\n *\n * This is what makes `<div className={font.className}>` apply the font.\n *\n * In Next.js, the .className class ONLY sets font-family — it does NOT\n * set CSS variables. CSS variables are handled separately by the .variable class.\n */\nfunction injectClassNameRule(className: string, fontFamily: string): void {\n if (injectedClassRules.has(className)) return;\n injectedClassRules.add(className);\n\n const css = `.${className} { font-family: ${fontFamily}; }\\n`;\n\n // On server, store the CSS for SSR injection\n if (typeof document === \"undefined\") {\n ssrFontStyles.push(css);\n return;\n }\n\n // On client, inject a <style> tag\n const style = document.createElement(\"style\");\n style.textContent = css;\n style.setAttribute(\"data-vinext-font-class\", className);\n document.head.appendChild(style);\n}\n\n/** Track which variable class CSS rules have been injected. */\nconst injectedVariableRules = new Set<string>();\n\n/** Track which :root CSS variable rules have been injected. */\nconst injectedRootVariables = new Set<string>();\n\n/**\n * Inject a CSS rule that sets a CSS variable on an element.\n * This is what makes `<html className={font.variable}>` set the CSS variable\n * that can be referenced by other styles (e.g., Tailwind's font-sans).\n *\n * In Next.js, the .variable class ONLY sets the CSS variable — it does NOT\n * set font-family. This is critical because apps commonly apply multiple\n * .variable classes to <body> (e.g., geistSans.variable + geistMono.variable).\n * If we also set font-family here, the last class wins due to CSS cascade,\n * causing all text to use that font (e.g., everything becomes monospace).\n */\nfunction injectVariableClassRule(\n variableClassName: string,\n cssVarName: string,\n fontFamily: string,\n): void {\n if (injectedVariableRules.has(variableClassName)) return;\n injectedVariableRules.add(variableClassName);\n\n // Only set the CSS variable — do NOT set font-family.\n // This matches Next.js behavior where .variable classes only define CSS variables.\n let css = `.${variableClassName} { ${cssVarName}: ${fontFamily}; }\\n`;\n\n // Also inject at :root so CSS variable inheritance works throughout the page.\n // This ensures Tailwind utilities like `font-sans` that reference these\n // variables via var(--font-geist-sans) work correctly.\n if (!injectedRootVariables.has(cssVarName)) {\n injectedRootVariables.add(cssVarName);\n css += `:root { ${cssVarName}: ${fontFamily}; }\\n`;\n }\n\n // On server, store the CSS for SSR injection\n if (typeof document === \"undefined\") {\n ssrFontStyles.push(css);\n return;\n }\n\n // On client, inject a <style> tag\n const style = document.createElement(\"style\");\n style.textContent = css;\n style.setAttribute(\"data-vinext-font-variable\", variableClassName);\n document.head.appendChild(style);\n}\n\n/**\n * Normalize the `src` option into a flat array of `{ path, weight?, style? }`.\n * Handles string, single object, and array forms.\n */\nfunction normalizeSources(options: LocalFontOptions): LocalFontSrc[] {\n if (Array.isArray(options.src)) return options.src;\n if (typeof options.src === \"string\") return [{ path: options.src }];\n return [options.src];\n}\n\n/**\n * Determine the MIME type for a font file based on its extension.\n * Uses endsWith() only — matching the approach in generateFontFaceCSS —\n * to avoid false positives from substring matches (e.g. \".woff\" matching \".woff2\").\n */\nfunction getFontMimeType(pathOrUrl: string): string {\n if (pathOrUrl.endsWith(\".woff2\")) return \"font/woff2\";\n if (pathOrUrl.endsWith(\".woff\")) return \"font/woff\";\n if (pathOrUrl.endsWith(\".ttf\")) return \"font/ttf\";\n if (pathOrUrl.endsWith(\".otf\")) return \"font/opentype\";\n return \"font/woff2\";\n}\n\n/**\n * Collect font source URLs for preload link generation.\n * Only collects on the server (SSR). Deduplicates by href using a Set for O(1) lookups.\n */\nfunction collectFontPreloads(options: LocalFontOptions): void {\n if (typeof document !== \"undefined\") return; // client-side, skip\n\n const sources = normalizeSources(options);\n\n for (const src of sources) {\n const href = src.path;\n // Only collect URLs that are absolute (start with /) — relative paths\n // would resolve incorrectly from different page URLs. The vinext:local-fonts\n // Vite transform should have already resolved them to absolute URLs.\n if (href && href.startsWith(\"/\") && !ssrFontPreloadHrefs.has(href)) {\n ssrFontPreloadHrefs.add(href);\n ssrFontPreloads.push({ href, type: getFontMimeType(href) });\n }\n }\n}\n\nexport default function localFont(options: LocalFontOptions): FontResult {\n const id = classCounter++;\n const family = `__local_font_${id}`;\n const className = `__font_local_${id}`;\n const fallback = options.fallback ?? [\"sans-serif\"];\n // Sanitize each fallback name to prevent CSS injection via crafted values\n const fontFamily = `'${family}', ${fallback.map(sanitizeFallback).join(\", \")}`;\n // Validate CSS variable name — reject anything that could inject CSS\n const cssVarName = options.variable ? sanitizeCSSVarName(options.variable) : undefined;\n // In Next.js, `variable` returns a CLASS NAME that sets the CSS variable.\n // Users apply this class to set the CSS variable on that element.\n const variableClassName = `__variable_local_${id}`;\n\n // Collect font URLs for preload <link> tags (SSR only)\n collectFontPreloads(options);\n\n // Inject @font-face declarations\n const css = generateFontFaceCSS(family, options);\n injectFontFaceCSS(css, family);\n\n // Inject the className -> font-family CSS rule\n injectClassNameRule(className, fontFamily);\n\n // Inject a CSS rule for the variable class name if variable is specified.\n // This is what makes `<html className={font.variable}>` set the CSS variable.\n if (cssVarName) {\n injectVariableClassRule(variableClassName, cssVarName, fontFamily);\n }\n\n return {\n className,\n style: { fontFamily },\n ...(cssVarName ? { variable: variableClassName } : {}),\n };\n}\n"]}
1
+ {"version":3,"file":"font-local.js","names":[],"sources":["../../src/shims/font-local.ts"],"sourcesContent":["/**\n * next/font/local shim\n *\n * Provides a runtime-compatible shim for Next.js local fonts.\n * Generates @font-face CSS declarations and returns an object\n * with className, style, and variable properties.\n *\n * Supports both client-side injection and SSR collection,\n * matching the patterns used by the Google font shim.\n *\n * Usage:\n * import localFont from 'next/font/local';\n * const myFont = localFont({ src: './my-font.woff2' });\n * // myFont.className -> unique CSS class\n * // myFont.style -> { fontFamily: \"'__local_font_0', sans-serif\" }\n * // myFont.variable -> generated class name (e.g. \"__variable_local_0\")\n */\n\n/**\n * Escape a string for safe interpolation inside a CSS single-quoted string.\n *\n * Prevents CSS injection by escaping characters that could break out of\n * a `'...'` CSS string context: backslashes, single quotes, and newlines.\n */\nfunction escapeCSSString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, \"\\\\a \")\n .replace(/\\r/g, \"\\\\d \");\n}\n\n/**\n * Validate a CSS custom property name (e.g. `--font-inter`).\n *\n * Custom properties must start with `--` and only contain alphanumeric\n * characters, hyphens, and underscores. Anything else could be used to\n * break out of the CSS declaration and inject arbitrary rules.\n *\n * Returns the name if valid, undefined otherwise.\n */\nfunction sanitizeCSSVarName(name: string): string | undefined {\n if (/^--[a-zA-Z0-9_-]+$/.test(name)) return name;\n return undefined;\n}\n\n/**\n * Sanitize a CSS font-family fallback name.\n *\n * Generic family names (sans-serif, serif, monospace, etc.) are used as-is.\n * Named families are wrapped in escaped quotes. This prevents injection via\n * crafted fallback values like `); } body { color: red; } .x {`.\n */\nfunction sanitizeFallback(name: string): string {\n // CSS generic font families — safe to use unquoted\n const generics = new Set([\n \"serif\",\n \"sans-serif\",\n \"monospace\",\n \"cursive\",\n \"fantasy\",\n \"system-ui\",\n \"ui-serif\",\n \"ui-sans-serif\",\n \"ui-monospace\",\n \"ui-rounded\",\n \"emoji\",\n \"math\",\n \"fangsong\",\n ]);\n const trimmed = name.trim();\n if (generics.has(trimmed)) return trimmed;\n // Wrap in single quotes with escaping to prevent CSS injection\n return `'${escapeCSSString(trimmed)}'`;\n}\n\n/**\n * Validate a CSS property name for use in declarations.\n *\n * Only allows standard CSS property names (lowercase letters and hyphens)\n * and custom properties (--prefixed). Rejects anything that could inject\n * CSS rules via crafted property names.\n */\nfunction sanitizeCSSProperty(prop: string): string | undefined {\n if (/^(--)?[a-zA-Z][a-zA-Z0-9-]*$/.test(prop)) return prop;\n return undefined;\n}\n\n/**\n * Sanitize a CSS property value for use in declarations.\n *\n * Rejects values containing characters that could break out of a CSS\n * declaration: `{`, `}`, `;`, and `</` (to prevent closing style tags).\n */\nfunction sanitizeCSSValue(value: string): string | undefined {\n if (/[{}]|<\\//.test(value)) return undefined;\n return value;\n}\n\nlet classCounter = 0;\nconst injectedFonts = new Set<string>();\n\ninterface LocalFontSrc {\n path: string;\n weight?: string;\n style?: string;\n}\n\ninterface LocalFontOptions {\n src: string | LocalFontSrc | LocalFontSrc[];\n display?: string;\n weight?: string;\n style?: string;\n fallback?: string[];\n preload?: boolean;\n variable?: string;\n adjustFontFallback?: boolean | string;\n declarations?: Array<{ prop: string; value: string }>;\n}\n\ninterface FontResult {\n className: string;\n style: { fontFamily: string };\n variable?: string;\n}\n\nfunction generateFontFaceCSS(family: string, options: LocalFontOptions): string {\n const sources = normalizeSources(options);\n\n const display = options.display ?? \"swap\";\n const rules: string[] = [];\n\n for (const src of sources) {\n const weight = src.weight ?? options.weight ?? \"400\";\n const style = src.style ?? options.style ?? \"normal\";\n const format = src.path.endsWith(\".woff2\")\n ? \"woff2\"\n : src.path.endsWith(\".woff\")\n ? \"woff\"\n : src.path.endsWith(\".ttf\")\n ? \"truetype\"\n : src.path.endsWith(\".otf\")\n ? \"opentype\"\n : \"woff2\";\n\n rules.push(`@font-face {\n font-family: '${escapeCSSString(family)}';\n src: url('${escapeCSSString(src.path)}') format('${format}');\n font-weight: ${weight};\n font-style: ${style};\n font-display: ${display};\n}`);\n }\n\n // Add extra declarations if provided — sanitize prop/value to prevent injection\n if (options.declarations) {\n for (const decl of options.declarations) {\n const safeProp = sanitizeCSSProperty(decl.prop);\n const safeValue = sanitizeCSSValue(decl.value);\n if (safeProp && safeValue) {\n rules.push(\n `@font-face { font-family: '${escapeCSSString(family)}'; ${safeProp}: ${safeValue}; }`,\n );\n }\n }\n }\n\n return rules.join(\"\\n\");\n}\n\n// SSR: collect font styles for injection in <head>\nconst ssrFontStyles: string[] = [];\n\n// SSR: collect font file URLs for <link rel=\"preload\"> injection\nconst ssrFontPreloads: Array<{ href: string; type: string }> = [];\nconst ssrFontPreloadHrefs = new Set<string>();\n\n/**\n * Get collected SSR font styles (used by the renderer).\n * Note: We don't clear the arrays because fonts are loaded at module import\n * time and need to persist across all requests in the Workers environment.\n */\nexport function getSSRFontStyles(): string[] {\n return [...ssrFontStyles];\n}\n\n/**\n * Get collected SSR font preload data (used by the renderer).\n * Returns an array of { href, type } objects for emitting\n * <link rel=\"preload\" as=\"font\" ...> tags.\n */\nexport function getSSRFontPreloads(): Array<{ href: string; type: string }> {\n return [...ssrFontPreloads];\n}\n\nfunction injectFontFaceCSS(css: string, id: string): void {\n if (injectedFonts.has(id)) return;\n injectedFonts.add(id);\n\n // On server, store the CSS for SSR injection\n if (typeof document === \"undefined\") {\n ssrFontStyles.push(css);\n return;\n }\n\n const style = document.createElement(\"style\");\n style.textContent = css;\n style.setAttribute(\"data-vinext-font\", id);\n document.head.appendChild(style);\n}\n\n/** Track which className CSS rules have been injected. */\nconst injectedClassRules = new Set<string>();\n\n/**\n * Inject a CSS rule that maps a className to a font-family.\n *\n * This is what makes `<div className={font.className}>` apply the font.\n *\n * In Next.js, the .className class ONLY sets font-family — it does NOT\n * set CSS variables. CSS variables are handled separately by the .variable class.\n */\nfunction injectClassNameRule(className: string, fontFamily: string): void {\n if (injectedClassRules.has(className)) return;\n injectedClassRules.add(className);\n\n const css = `.${className} { font-family: ${fontFamily}; }\\n`;\n\n // On server, store the CSS for SSR injection\n if (typeof document === \"undefined\") {\n ssrFontStyles.push(css);\n return;\n }\n\n // On client, inject a <style> tag\n const style = document.createElement(\"style\");\n style.textContent = css;\n style.setAttribute(\"data-vinext-font-class\", className);\n document.head.appendChild(style);\n}\n\n/** Track which variable class CSS rules have been injected. */\nconst injectedVariableRules = new Set<string>();\n\n/** Track which :root CSS variable rules have been injected. */\nconst injectedRootVariables = new Set<string>();\n\n/**\n * Inject a CSS rule that sets a CSS variable on an element.\n * This is what makes `<html className={font.variable}>` set the CSS variable\n * that can be referenced by other styles (e.g., Tailwind's font-sans).\n *\n * In Next.js, the .variable class ONLY sets the CSS variable — it does NOT\n * set font-family. This is critical because apps commonly apply multiple\n * .variable classes to <body> (e.g., geistSans.variable + geistMono.variable).\n * If we also set font-family here, the last class wins due to CSS cascade,\n * causing all text to use that font (e.g., everything becomes monospace).\n */\nfunction injectVariableClassRule(\n variableClassName: string,\n cssVarName: string,\n fontFamily: string,\n): void {\n if (injectedVariableRules.has(variableClassName)) return;\n injectedVariableRules.add(variableClassName);\n\n // Only set the CSS variable — do NOT set font-family.\n // This matches Next.js behavior where .variable classes only define CSS variables.\n let css = `.${variableClassName} { ${cssVarName}: ${fontFamily}; }\\n`;\n\n // Also inject at :root so CSS variable inheritance works throughout the page.\n // This ensures Tailwind utilities like `font-sans` that reference these\n // variables via var(--font-geist-sans) work correctly.\n if (!injectedRootVariables.has(cssVarName)) {\n injectedRootVariables.add(cssVarName);\n css += `:root { ${cssVarName}: ${fontFamily}; }\\n`;\n }\n\n // On server, store the CSS for SSR injection\n if (typeof document === \"undefined\") {\n ssrFontStyles.push(css);\n return;\n }\n\n // On client, inject a <style> tag\n const style = document.createElement(\"style\");\n style.textContent = css;\n style.setAttribute(\"data-vinext-font-variable\", variableClassName);\n document.head.appendChild(style);\n}\n\n/**\n * Normalize the `src` option into a flat array of `{ path, weight?, style? }`.\n * Handles string, single object, and array forms.\n */\nfunction normalizeSources(options: LocalFontOptions): LocalFontSrc[] {\n if (Array.isArray(options.src)) return options.src;\n if (typeof options.src === \"string\") return [{ path: options.src }];\n return [options.src];\n}\n\n/**\n * Determine the MIME type for a font file based on its extension.\n * Uses endsWith() only — matching the approach in generateFontFaceCSS —\n * to avoid false positives from substring matches (e.g. \".woff\" matching \".woff2\").\n */\nfunction getFontMimeType(pathOrUrl: string): string {\n if (pathOrUrl.endsWith(\".woff2\")) return \"font/woff2\";\n if (pathOrUrl.endsWith(\".woff\")) return \"font/woff\";\n if (pathOrUrl.endsWith(\".ttf\")) return \"font/ttf\";\n if (pathOrUrl.endsWith(\".otf\")) return \"font/opentype\";\n return \"font/woff2\";\n}\n\n/**\n * Collect font source URLs for preload link generation.\n * Only collects on the server (SSR). Deduplicates by href using a Set for O(1) lookups.\n */\nfunction collectFontPreloads(options: LocalFontOptions): void {\n if (typeof document !== \"undefined\") return; // client-side, skip\n\n const sources = normalizeSources(options);\n\n for (const src of sources) {\n const href = src.path;\n // Only collect URLs that are absolute (start with /) — relative paths\n // would resolve incorrectly from different page URLs. The vinext:local-fonts\n // Vite transform should have already resolved them to absolute URLs.\n if (href && href.startsWith(\"/\") && !ssrFontPreloadHrefs.has(href)) {\n ssrFontPreloadHrefs.add(href);\n ssrFontPreloads.push({ href, type: getFontMimeType(href) });\n }\n }\n}\n\nexport default function localFont(options: LocalFontOptions): FontResult {\n const id = classCounter++;\n const family = `__local_font_${id}`;\n const className = `__font_local_${id}`;\n const fallback = options.fallback ?? [\"sans-serif\"];\n // Sanitize each fallback name to prevent CSS injection via crafted values\n const fontFamily = `'${family}', ${fallback.map(sanitizeFallback).join(\", \")}`;\n // Validate CSS variable name — reject anything that could inject CSS\n const cssVarName = options.variable ? sanitizeCSSVarName(options.variable) : undefined;\n // In Next.js, `variable` returns a CLASS NAME that sets the CSS variable.\n // Users apply this class to set the CSS variable on that element.\n const variableClassName = `__variable_local_${id}`;\n\n // Collect font URLs for preload <link> tags (SSR only)\n collectFontPreloads(options);\n\n // Inject @font-face declarations\n const css = generateFontFaceCSS(family, options);\n injectFontFaceCSS(css, family);\n\n // Inject the className -> font-family CSS rule\n injectClassNameRule(className, fontFamily);\n\n // Inject a CSS rule for the variable class name if variable is specified.\n // This is what makes `<html className={font.variable}>` set the CSS variable.\n if (cssVarName) {\n injectVariableClassRule(variableClassName, cssVarName, fontFamily);\n }\n\n return {\n className,\n style: { fontFamily },\n ...(cssVarName ? { variable: variableClassName } : {}),\n };\n}\n"],"mappings":"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"}