almostnode 0.2.7 → 0.2.8

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 (59) hide show
  1. package/README.md +1 -1
  2. package/dist/__sw__.js +80 -84
  3. package/dist/assets/{runtime-worker-B8_LZkBX.js → runtime-worker-D8VYeuKv.js} +1448 -1121
  4. package/dist/assets/runtime-worker-D8VYeuKv.js.map +1 -0
  5. package/dist/frameworks/code-transforms.d.ts.map +1 -1
  6. package/dist/frameworks/next-config-parser.d.ts +16 -0
  7. package/dist/frameworks/next-config-parser.d.ts.map +1 -0
  8. package/dist/frameworks/next-dev-server.d.ts +6 -6
  9. package/dist/frameworks/next-dev-server.d.ts.map +1 -1
  10. package/dist/frameworks/next-html-generator.d.ts +35 -0
  11. package/dist/frameworks/next-html-generator.d.ts.map +1 -0
  12. package/dist/frameworks/next-shims.d.ts +79 -0
  13. package/dist/frameworks/next-shims.d.ts.map +1 -0
  14. package/dist/index.cjs +2895 -2454
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.mjs +3208 -2782
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/runtime.d.ts +20 -0
  21. package/dist/runtime.d.ts.map +1 -1
  22. package/dist/server-bridge.d.ts +2 -0
  23. package/dist/server-bridge.d.ts.map +1 -1
  24. package/dist/shims/crypto.d.ts +2 -0
  25. package/dist/shims/crypto.d.ts.map +1 -1
  26. package/dist/shims/esbuild.d.ts.map +1 -1
  27. package/dist/shims/fs.d.ts.map +1 -1
  28. package/dist/shims/http.d.ts +29 -0
  29. package/dist/shims/http.d.ts.map +1 -1
  30. package/dist/shims/path.d.ts.map +1 -1
  31. package/dist/shims/stream.d.ts.map +1 -1
  32. package/dist/shims/vfs-adapter.d.ts.map +1 -1
  33. package/dist/shims/ws.d.ts +2 -0
  34. package/dist/shims/ws.d.ts.map +1 -1
  35. package/dist/utils/binary-encoding.d.ts +13 -0
  36. package/dist/utils/binary-encoding.d.ts.map +1 -0
  37. package/dist/virtual-fs.d.ts.map +1 -1
  38. package/package.json +4 -4
  39. package/src/convex-app-demo-entry.ts +229 -35
  40. package/src/frameworks/code-transforms.ts +5 -1
  41. package/src/frameworks/next-config-parser.ts +140 -0
  42. package/src/frameworks/next-dev-server.ts +76 -1675
  43. package/src/frameworks/next-html-generator.ts +597 -0
  44. package/src/frameworks/next-shims.ts +1050 -0
  45. package/src/frameworks/tailwind-config-loader.ts +1 -1
  46. package/src/index.ts +2 -0
  47. package/src/runtime.ts +94 -15
  48. package/src/server-bridge.ts +61 -28
  49. package/src/shims/crypto.ts +13 -0
  50. package/src/shims/esbuild.ts +4 -1
  51. package/src/shims/fs.ts +9 -11
  52. package/src/shims/http.ts +309 -3
  53. package/src/shims/path.ts +6 -13
  54. package/src/shims/stream.ts +12 -26
  55. package/src/shims/vfs-adapter.ts +5 -2
  56. package/src/shims/ws.ts +92 -2
  57. package/src/utils/binary-encoding.ts +43 -0
  58. package/src/virtual-fs.ts +7 -15
  59. package/dist/assets/runtime-worker-B8_LZkBX.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"code-transforms.d.ts","sourceRoot":"","sources":["../../src/frameworks/code-transforms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAa7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,GAAG,IAAI,CAgBf;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,CA+DR;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,CA4BR;AA0CD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvD;AAgDD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5D;AA0JD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmCtE"}
1
+ {"version":3,"file":"code-transforms.d.ts","sourceRoot":"","sources":["../../src/frameworks/code-transforms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAa7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,GAAG,IAAI,CAgBf;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,CA+DR;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,gBAAgB,GACpB,MAAM,CA4BR;AA8CD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvD;AAgDD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5D;AA0JD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmCtE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Next.js Config Parser
3
+ *
4
+ * Extracts configuration values from next.config.{ts,js,mjs} files
5
+ * using acorn AST parsing with regex fallback.
6
+ */
7
+ /**
8
+ * Parse a string value from a Next.js config file.
9
+ *
10
+ * @param content - Raw file content of next.config.{ts,js,mjs}
11
+ * @param key - Config key to extract (e.g., 'assetPrefix', 'basePath')
12
+ * @param isTypeScript - Whether the content needs TypeScript syntax stripping
13
+ * @returns The string value, or null if not found
14
+ */
15
+ export declare function parseNextConfigValue(content: string, key: string, isTypeScript?: boolean): string | null;
16
+ //# sourceMappingURL=next-config-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-config-parser.d.ts","sourceRoot":"","sources":["../../src/frameworks/next-config-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,OAAe,GAC5B,MAAM,GAAG,IAAI,CAOf"}
@@ -78,14 +78,10 @@ export declare class NextDevServer extends DevServer {
78
78
  */
79
79
  private loadPathAliases;
80
80
  /**
81
- * Load assetPrefix from options or auto-detect from next.config.ts/js
82
- * The assetPrefix is used to prefix static asset URLs (e.g., '/marketing')
81
+ * Load a string config value from options or auto-detect from next.config.ts/js
83
82
  */
83
+ private loadConfigStringValue;
84
84
  private loadAssetPrefix;
85
- /**
86
- * Load basePath from options or auto-detect from next.config.ts/js
87
- * The basePath is used to prefix all routes (e.g., '/docs' means / -> /docs)
88
- */
89
85
  private loadBasePath;
90
86
  /**
91
87
  * Resolve path aliases in transformed code
@@ -214,6 +210,10 @@ export declare class NextDevServer extends DevServer {
214
210
  * don't affect the URL path but can have their own layouts.
215
211
  */
216
212
  private resolveAppDynamicRoute;
213
+ /**
214
+ * Build context object for HTML generation functions
215
+ */
216
+ private htmlContext;
217
217
  /**
218
218
  * Generate HTML for App Router with nested layouts
219
219
  */
@@ -1 +1 @@
1
- {"version":3,"file":"next-dev-server.d.ts","sourceRoot":"","sources":["../../src/frameworks/next-dev-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"next-dev-server.d.ts","sourceRoot":"","sources":["../../src/frameworks/next-dev-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAa,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAuFzC,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC1C,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAS;IAEzB,6CAA6C;IAC7C,OAAO,CAAC,MAAM,CAAS;IAEvB,mDAAmD;IACnD,OAAO,CAAC,SAAS,CAAS;IAE1B,+DAA+D;IAC/D,OAAO,CAAC,YAAY,CAAU;IAE9B,yCAAyC;IACzC,OAAO,CAAC,cAAc,CAA6B;IAEnD,2DAA2D;IAC3D,OAAO,CAAC,eAAe,CAAuB;IAE9C,sDAAsD;IACtD,OAAO,CAAC,OAAO,CAAuB;IAEtC,6CAA6C;IAC7C,OAAO,CAAC,cAAc,CAA0D;IAEhF,yDAAyD;IACzD,OAAO,CAAC,WAAW,CAAkC;IAErD,0DAA0D;IAC1D,OAAO,CAAC,oBAAoB,CAAc;IAE1C,8CAA8C;IAC9C,OAAO,CAAC,oBAAoB,CAAkB;IAE9C,yDAAyD;IACzD,OAAO,CAAC,WAAW,CAAc;IAEjC,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAc;gBAElB,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB;IA0BzD;;;OAGG;IACH,OAAO,CAAC,eAAe;IA8BvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,YAAY;IAIpB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKxC;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIhC;;;OAGG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAIxC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;;OAGG;YACW,0BAA0B;IAwBxC;;OAEG;IACH,OAAO,CAAC,YAAY;IAmCpB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,CAAC;IAqGxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiDrB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;YACW,kBAAkB;IAkBhC;;;OAGG;YACW,iBAAiB;IAwB/B;;OAEG;YACW,cAAc;IAqD5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAuB9B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA4ErC;;;OAGG;YACW,qBAAqB;IA0HnC;;;OAGG;IACG,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,EAC7F,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,EAC7C,KAAK,EAAE,MAAM,IAAI,GAChB,OAAO,CAAC,IAAI,CAAC;IA6ChB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA6GnC;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;OAEG;YACW,iBAAiB;IA2E/B;;OAEG;YACW,eAAe;IA6C7B;;OAEG;YACW,mBAAmB;IAkCjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAmO9B;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;YACW,qBAAqB;IAQnC;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsF3B;;OAEG;YACW,gBAAgB;IAI9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA4BhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;YACW,iBAAiB;IA6D/B;;OAEG;YACW,aAAa;IA+C3B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;YACW,mBAAmB;IAgCjC,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,aAAa,IAAI,IAAI;IAgDrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IA8CnD;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAiB9C;;OAEG;IACH,IAAI,IAAI,IAAI;CAUb;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Next.js HTML page generation
3
+ * Standalone functions extracted from NextDevServer for generating
4
+ * App Router HTML, Pages Router HTML, and 404 pages.
5
+ */
6
+ import { ResponseData } from '../dev-server';
7
+ /** Resolved App Router route with page, layouts, and UI convention files */
8
+ export interface AppRoute {
9
+ page: string;
10
+ layouts: string[];
11
+ params: Record<string, string | string[]>;
12
+ loading?: string;
13
+ error?: string;
14
+ notFound?: string;
15
+ }
16
+ /** Context needed by HTML generation functions */
17
+ export interface HtmlGeneratorContext {
18
+ port: number;
19
+ exists: (path: string) => boolean;
20
+ generateEnvScript: () => string;
21
+ loadTailwindConfigIfNeeded: () => Promise<string>;
22
+ }
23
+ /**
24
+ * Generate HTML for App Router with nested layouts
25
+ */
26
+ export declare function generateAppRouterHtml(ctx: HtmlGeneratorContext, route: AppRoute, pathname: string): Promise<string>;
27
+ /**
28
+ * Generate HTML shell for a Pages Router page
29
+ */
30
+ export declare function generatePageHtml(ctx: HtmlGeneratorContext, pageFile: string, pathname: string): Promise<string>;
31
+ /**
32
+ * Serve a basic 404 page
33
+ */
34
+ export declare function serve404Page(port: number): ResponseData;
35
+ //# sourceMappingURL=next-html-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-html-generator.d.ts","sourceRoot":"","sources":["../../src/frameworks/next-html-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,4EAA4E;AAC5E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,0BAA0B,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAwXjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,oBAAoB,EACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CA2HjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA2CvD"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Next.js shim constants
3
+ * Static HTML/JS strings used by NextDevServer for browser-side Next.js emulation.
4
+ * These are injected into generated HTML pages as inline scripts or served as virtual modules.
5
+ */
6
+ /**
7
+ * Tailwind CSS CDN script for runtime JIT compilation
8
+ */
9
+ export declare const TAILWIND_CDN_SCRIPT = "<script src=\"https://cdn.tailwindcss.com\"></script>";
10
+ /**
11
+ * CORS Proxy script - provides proxyFetch function in the iframe
12
+ * Reads proxy URL from localStorage (set by parent window)
13
+ */
14
+ export declare const CORS_PROXY_SCRIPT = "\n<script>\n // CORS Proxy support for external API calls\n window.__getCorsProxy = function() {\n return localStorage.getItem('__corsProxyUrl') || null;\n };\n\n window.__setCorsProxy = function(url) {\n if (url) {\n localStorage.setItem('__corsProxyUrl', url);\n } else {\n localStorage.removeItem('__corsProxyUrl');\n }\n };\n\n window.__proxyFetch = async function(url, options) {\n const proxyUrl = window.__getCorsProxy();\n if (proxyUrl) {\n const proxiedUrl = proxyUrl + encodeURIComponent(url);\n return fetch(proxiedUrl, options);\n }\n return fetch(url, options);\n };\n</script>\n";
15
+ /**
16
+ * React Refresh preamble - MUST run before React is loaded
17
+ */
18
+ export declare const REACT_REFRESH_PREAMBLE = "\n<script type=\"module\">\n// Block until React Refresh is loaded and initialized\nconst RefreshRuntime = await import('https://esm.sh/react-refresh@0.14.0/runtime').then(m => m.default || m);\n\nRefreshRuntime.injectIntoGlobalHook(window);\nwindow.$RefreshRuntime$ = RefreshRuntime;\nwindow.$RefreshRegCount$ = 0;\n\nwindow.$RefreshReg$ = (type, id) => {\n window.$RefreshRegCount$++;\n RefreshRuntime.register(type, id);\n};\n\nwindow.$RefreshSig$ = () => (type) => type;\n\nconsole.log('[HMR] React Refresh initialized');\n</script>\n";
19
+ /**
20
+ * HMR client script for Next.js
21
+ */
22
+ export declare const HMR_CLIENT_SCRIPT = "\n<script type=\"module\">\n(function() {\n const hotModules = new Map();\n const pendingUpdates = new Map();\n\n window.__vite_hot_context__ = function createHotContext(ownerPath) {\n if (hotModules.has(ownerPath)) {\n return hotModules.get(ownerPath);\n }\n\n const hot = {\n data: {},\n accept(callback) {\n hot._acceptCallback = callback;\n },\n dispose(callback) {\n hot._disposeCallback = callback;\n },\n invalidate() {\n location.reload();\n },\n prune(callback) {\n hot._pruneCallback = callback;\n },\n on(event, cb) {},\n off(event, cb) {},\n send(event, data) {},\n _acceptCallback: null,\n _disposeCallback: null,\n _pruneCallback: null,\n };\n\n hotModules.set(ownerPath, hot);\n return hot;\n };\n\n // Listen for HMR updates via postMessage (works with sandboxed iframes)\n window.addEventListener('message', async (event) => {\n // Filter for HMR messages only\n if (!event.data || event.data.channel !== 'next-hmr') return;\n const { type, path, timestamp } = event.data;\n\n if (type === 'update') {\n console.log('[HMR] Update:', path);\n\n if (path.endsWith('.css')) {\n const links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n links.forEach(link => {\n const href = link.getAttribute('href');\n if (href && href.includes(path.replace(/^\\//, ''))) {\n link.href = href.split('?')[0] + '?t=' + timestamp;\n }\n });\n\n const styles = document.querySelectorAll('style[data-next-dev-id]');\n styles.forEach(style => {\n const id = style.getAttribute('data-next-dev-id');\n if (id && id.includes(path.replace(/^\\//, ''))) {\n import(path + '?t=' + timestamp).catch(() => {});\n }\n });\n } else if (path.match(/\\.(jsx?|tsx?)$/)) {\n await handleJSUpdate(path, timestamp);\n }\n } else if (type === 'full-reload') {\n console.log('[HMR] Full reload');\n location.reload();\n }\n });\n\n async function handleJSUpdate(path, timestamp) {\n const normalizedPath = path.startsWith('/') ? path : '/' + path;\n const hot = hotModules.get(normalizedPath);\n\n try {\n if (hot && hot._disposeCallback) {\n hot._disposeCallback(hot.data);\n }\n\n if (window.$RefreshRuntime$) {\n pendingUpdates.set(normalizedPath, timestamp);\n\n if (pendingUpdates.size === 1) {\n setTimeout(async () => {\n try {\n for (const [modulePath, ts] of pendingUpdates) {\n const moduleUrl = '.' + modulePath + '?t=' + ts;\n await import(moduleUrl);\n }\n\n window.$RefreshRuntime$.performReactRefresh();\n console.log('[HMR] Updated', pendingUpdates.size, 'module(s)');\n\n pendingUpdates.clear();\n } catch (error) {\n console.error('[HMR] Failed to apply update:', error);\n pendingUpdates.clear();\n location.reload();\n }\n }, 30);\n }\n } else {\n console.log('[HMR] React Refresh not available, reloading page');\n location.reload();\n }\n } catch (error) {\n console.error('[HMR] Update failed:', error);\n location.reload();\n }\n }\n\n console.log('[HMR] Next.js client ready');\n})();\n</script>\n";
23
+ /**
24
+ * Next.js Link shim code
25
+ */
26
+ export declare const NEXT_LINK_SHIM = "\nimport React from 'react';\n\nconst getVirtualBasePath = () => {\n const match = window.location.pathname.match(/^\\/__virtual__\\/\\d+(?:\\/|$)/);\n if (!match) return '';\n return match[0].endsWith('/') ? match[0] : match[0] + '/';\n};\n\nconst getBasePath = () => window.__NEXT_BASE_PATH__ || '';\n\nconst applyVirtualBase = (url) => {\n if (typeof url !== 'string') return url;\n if (!url || url.startsWith('#') || url.startsWith('?')) return url;\n if (/^(https?:)?\\/\\//.test(url)) return url;\n\n // Apply basePath first\n const bp = getBasePath();\n if (bp && url.startsWith('/') && !url.startsWith(bp + '/') && url !== bp) {\n url = bp + url;\n }\n\n const base = getVirtualBasePath();\n if (!base) return url;\n if (url.startsWith(base)) return url;\n if (url.startsWith('/')) return base + url.slice(1);\n return base + url;\n};\n\nexport default function Link({ href, children, ...props }) {\n const handleClick = (e) => {\n console.log('[Link] Click handler called, href:', href);\n\n if (props.onClick) {\n props.onClick(e);\n }\n\n // Allow cmd/ctrl click to open in new tab\n if (e.metaKey || e.ctrlKey) {\n console.log('[Link] Meta/Ctrl key pressed, allowing default behavior');\n return;\n }\n\n if (typeof href !== 'string' || !href || href.startsWith('#') || href.startsWith('?')) {\n console.log('[Link] Skipping navigation for href:', href);\n return;\n }\n\n if (/^(https?:)?\\/\\//.test(href)) {\n console.log('[Link] External URL, allowing default behavior:', href);\n return;\n }\n\n e.preventDefault();\n const resolvedHref = applyVirtualBase(href);\n console.log('[Link] Navigating to:', resolvedHref);\n window.history.pushState({}, '', resolvedHref);\n window.dispatchEvent(new PopStateEvent('popstate'));\n };\n\n return React.createElement('a', { href, onClick: handleClick, ...props }, children);\n}\n\nexport { Link };\n";
27
+ /**
28
+ * Next.js Router shim code
29
+ */
30
+ export declare const NEXT_ROUTER_SHIM = "\nimport React, { useState, useEffect, createContext, useContext } from 'react';\n\nconst RouterContext = createContext(null);\n\nconst getVirtualBasePath = () => {\n const match = window.location.pathname.match(/^\\/__virtual__\\/\\d+(?:\\/|$)/);\n if (!match) return '';\n return match[0].endsWith('/') ? match[0] : match[0] + '/';\n};\n\nconst applyVirtualBase = (url) => {\n if (typeof url !== 'string') return url;\n if (!url || url.startsWith('#') || url.startsWith('?')) return url;\n if (/^(https?:)?\\/\\//.test(url)) return url;\n\n const base = getVirtualBasePath();\n if (!base) return url;\n if (url.startsWith(base)) return url;\n if (url.startsWith('/')) return base + url.slice(1);\n return base + url;\n};\n\nconst stripVirtualBase = (pathname) => {\n const match = pathname.match(/^\\/__virtual__\\/\\d+(?:\\/|$)/);\n if (!match) return pathname;\n return '/' + pathname.slice(match[0].length);\n};\n\nexport function useRouter() {\n const [pathname, setPathname] = useState(\n typeof window !== 'undefined' ? stripVirtualBase(window.location.pathname) : '/'\n );\n const [query, setQuery] = useState({});\n\n useEffect(() => {\n const updateRoute = () => {\n setPathname(stripVirtualBase(window.location.pathname));\n setQuery(Object.fromEntries(new URLSearchParams(window.location.search)));\n };\n\n window.addEventListener('popstate', updateRoute);\n updateRoute();\n\n return () => window.removeEventListener('popstate', updateRoute);\n }, []);\n\n return {\n pathname,\n query,\n asPath: pathname + window.location.search,\n push: (url, as, options) => {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return Promise.resolve(true);\n }\n const resolvedUrl = applyVirtualBase(url);\n window.history.pushState({}, '', resolvedUrl);\n window.dispatchEvent(new PopStateEvent('popstate'));\n return Promise.resolve(true);\n },\n replace: (url, as, options) => {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return Promise.resolve(true);\n }\n const resolvedUrl = applyVirtualBase(url);\n window.history.replaceState({}, '', resolvedUrl);\n window.dispatchEvent(new PopStateEvent('popstate'));\n return Promise.resolve(true);\n },\n prefetch: () => Promise.resolve(),\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n reload: () => window.location.reload(),\n events: {\n on: () => {},\n off: () => {},\n emit: () => {},\n },\n isFallback: false,\n isReady: true,\n isPreview: false,\n };\n}\n\nexport const Router = {\n events: {\n on: () => {},\n off: () => {},\n emit: () => {},\n },\n push: (url) => {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return Promise.resolve(true);\n }\n const resolvedUrl = applyVirtualBase(url);\n window.history.pushState({}, '', resolvedUrl);\n window.dispatchEvent(new PopStateEvent('popstate'));\n return Promise.resolve(true);\n },\n replace: (url) => {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return Promise.resolve(true);\n }\n const resolvedUrl = applyVirtualBase(url);\n window.history.replaceState({}, '', resolvedUrl);\n window.dispatchEvent(new PopStateEvent('popstate'));\n return Promise.resolve(true);\n },\n};\n\nexport default { useRouter, Router };\n";
31
+ /**
32
+ * Next.js Navigation shim code (App Router)
33
+ *
34
+ * This shim provides App Router-specific navigation hooks from 'next/navigation'.
35
+ * These are DIFFERENT from the Pages Router hooks in 'next/router':
36
+ *
37
+ * Pages Router (next/router):
38
+ * - useRouter() returns { pathname, query, push, replace, events, ... }
39
+ * - Has router.events for route change subscriptions
40
+ * - query object contains URL params
41
+ *
42
+ * App Router (next/navigation):
43
+ * - useRouter() returns { push, replace, back, forward, refresh, prefetch }
44
+ * - usePathname() for current path
45
+ * - useSearchParams() for URL search params
46
+ * - useParams() for dynamic route segments
47
+ * - No events - use useEffect with pathname/searchParams instead
48
+ *
49
+ * @see https://nextjs.org/docs/app/api-reference/functions/use-router
50
+ */
51
+ export declare const NEXT_NAVIGATION_SHIM = "\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\n\nconst getVirtualBasePath = () => {\n const match = window.location.pathname.match(/^\\/__virtual__\\/\\d+(?:\\/|$)/);\n if (!match) return '';\n return match[0].endsWith('/') ? match[0] : match[0] + '/';\n};\n\nconst applyVirtualBase = (url) => {\n if (typeof url !== 'string') return url;\n if (!url || url.startsWith('#') || url.startsWith('?')) return url;\n if (/^(https?:)?\\/\\//.test(url)) return url;\n\n const base = getVirtualBasePath();\n if (!base) return url;\n if (url.startsWith(base)) return url;\n if (url.startsWith('/')) return base + url.slice(1);\n return base + url;\n};\n\nconst stripVirtualBase = (pathname) => {\n const match = pathname.match(/^\\/__virtual__\\/\\d+(?:\\/|$)/);\n if (!match) return pathname;\n return '/' + pathname.slice(match[0].length);\n};\n\n/**\n * App Router's useRouter hook\n * Returns navigation methods only (no pathname, no query)\n * Use usePathname() and useSearchParams() for URL info\n */\nexport function useRouter() {\n const push = useCallback((url, options) => {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return;\n }\n const resolvedUrl = applyVirtualBase(url);\n window.history.pushState({}, '', resolvedUrl);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }, []);\n\n const replace = useCallback((url, options) => {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return;\n }\n const resolvedUrl = applyVirtualBase(url);\n window.history.replaceState({}, '', resolvedUrl);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }, []);\n\n const back = useCallback(() => window.history.back(), []);\n const forward = useCallback(() => window.history.forward(), []);\n const refresh = useCallback(() => window.location.reload(), []);\n const prefetch = useCallback(() => Promise.resolve(), []);\n\n return useMemo(() => ({\n push,\n replace,\n back,\n forward,\n refresh,\n prefetch,\n }), [push, replace, back, forward, refresh, prefetch]);\n}\n\n/**\n * usePathname - Returns the current URL pathname\n * Reactively updates when navigation occurs\n * @example const pathname = usePathname(); // '/dashboard/settings'\n */\nexport function usePathname() {\n const [pathname, setPathname] = useState(\n typeof window !== 'undefined' ? stripVirtualBase(window.location.pathname) : '/'\n );\n\n useEffect(() => {\n const handler = () => setPathname(stripVirtualBase(window.location.pathname));\n window.addEventListener('popstate', handler);\n return () => window.removeEventListener('popstate', handler);\n }, []);\n\n return pathname;\n}\n\n/**\n * useSearchParams - Returns the current URL search parameters\n * @example const searchParams = useSearchParams();\n * const query = searchParams.get('q'); // '?q=hello' -> 'hello'\n */\nexport function useSearchParams() {\n const [searchParams, setSearchParams] = useState(() => {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n });\n\n useEffect(() => {\n const handler = () => {\n setSearchParams(new URLSearchParams(window.location.search));\n };\n window.addEventListener('popstate', handler);\n return () => window.removeEventListener('popstate', handler);\n }, []);\n\n return searchParams;\n}\n\n/**\n * useParams - Returns dynamic route parameters\n * For route /users/[id]/page.jsx with URL /users/123:\n * @example const { id } = useParams(); // { id: '123' }\n *\n * Fetches params from the server's route-info endpoint for dynamic routes.\n */\nexport function useParams() {\n const [params, setParams] = useState(() => {\n // Check if initial params were embedded by the server\n if (typeof window !== 'undefined' && window.__NEXT_ROUTE_PARAMS__) {\n return window.__NEXT_ROUTE_PARAMS__;\n }\n return {};\n });\n\n useEffect(() => {\n let cancelled = false;\n\n const fetchParams = async () => {\n const pathname = stripVirtualBase(window.location.pathname);\n const base = getVirtualBasePath();\n const baseUrl = base ? base.replace(/\\/$/, '') : '';\n\n try {\n const response = await fetch(baseUrl + '/_next/route-info?pathname=' + encodeURIComponent(pathname));\n const info = await response.json();\n if (!cancelled && info.params) {\n setParams(info.params);\n }\n } catch (e) {\n // Silently fail - static routes won't have params\n }\n };\n\n fetchParams();\n\n const handler = () => fetchParams();\n window.addEventListener('popstate', handler);\n return () => {\n cancelled = true;\n window.removeEventListener('popstate', handler);\n };\n }, []);\n\n return params;\n}\n\n/**\n * useSelectedLayoutSegment - Returns the active child segment one level below\n * Useful for styling active nav items in layouts\n * @example For /dashboard/settings, returns 'settings' in dashboard layout\n */\nexport function useSelectedLayoutSegment() {\n const pathname = usePathname();\n const segments = pathname.split('/').filter(Boolean);\n return segments[0] || null;\n}\n\n/**\n * useSelectedLayoutSegments - Returns all active child segments\n * @example For /dashboard/settings/profile, returns ['dashboard', 'settings', 'profile']\n */\nexport function useSelectedLayoutSegments() {\n const pathname = usePathname();\n return pathname.split('/').filter(Boolean);\n}\n\n/**\n * redirect - Programmatic redirect (typically used in Server Components)\n * In this browser implementation, performs immediate navigation\n */\nexport function redirect(url) {\n if (typeof url === 'string' && /^(https?:)?\\/\\//.test(url)) {\n window.location.href = url;\n return;\n }\n window.location.href = applyVirtualBase(url);\n}\n\n/**\n * notFound - Trigger the not-found UI\n * In this browser implementation, throws an error\n */\nexport function notFound() {\n throw new Error('NEXT_NOT_FOUND');\n}\n\n// Re-export Link for convenience (can import from next/navigation or next/link)\nexport { default as Link } from 'next/link';\n";
52
+ /**
53
+ * Next.js Head shim code
54
+ */
55
+ export declare const NEXT_HEAD_SHIM = "\nimport React, { useEffect } from 'react';\n\nexport default function Head({ children }) {\n useEffect(() => {\n // Process children and update document.head\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n\n const { type, props } = child;\n\n if (type === 'title' && props.children) {\n document.title = Array.isArray(props.children)\n ? props.children.join('')\n : props.children;\n } else if (type === 'meta') {\n const existingMeta = props.name\n ? document.querySelector(`meta[name=\"${props.name}\"]`)\n : props.property\n ? document.querySelector(`meta[property=\"${props.property}\"]`)\n : null;\n\n if (existingMeta) {\n Object.keys(props).forEach(key => {\n existingMeta.setAttribute(key, props[key]);\n });\n } else {\n const meta = document.createElement('meta');\n Object.keys(props).forEach(key => {\n meta.setAttribute(key, props[key]);\n });\n document.head.appendChild(meta);\n }\n } else if (type === 'link') {\n const link = document.createElement('link');\n Object.keys(props).forEach(key => {\n link.setAttribute(key, props[key]);\n });\n document.head.appendChild(link);\n }\n });\n }, [children]);\n\n return null;\n}\n";
56
+ /**
57
+ * Next.js Image shim code
58
+ * Provides a simple img-based implementation of next/image
59
+ */
60
+ export declare const NEXT_IMAGE_SHIM = "\nimport React from 'react';\n\nfunction Image({\n src,\n alt = '',\n width,\n height,\n fill,\n loader,\n quality = 75,\n priority,\n loading,\n placeholder,\n blurDataURL,\n unoptimized,\n onLoad,\n onError,\n style,\n className,\n sizes,\n ...rest\n}) {\n // Handle src - could be string or StaticImageData object\n const imageSrc = typeof src === 'object' ? src.src : src;\n\n // Build style object\n const imgStyle = { ...style };\n if (fill) {\n imgStyle.position = 'absolute';\n imgStyle.width = '100%';\n imgStyle.height = '100%';\n imgStyle.objectFit = imgStyle.objectFit || 'cover';\n imgStyle.inset = '0';\n }\n\n return React.createElement('img', {\n src: imageSrc,\n alt,\n width: fill ? undefined : width,\n height: fill ? undefined : height,\n loading: priority ? 'eager' : (loading || 'lazy'),\n decoding: 'async',\n style: imgStyle,\n className,\n onLoad,\n onError,\n ...rest\n });\n}\n\nexport default Image;\nexport { Image };\n";
61
+ /**
62
+ * next/dynamic shim - Dynamic imports with loading states
63
+ */
64
+ export declare const NEXT_DYNAMIC_SHIM = "\nimport React from 'react';\n\nfunction dynamic(importFn, options = {}) {\n const {\n loading: LoadingComponent,\n ssr = true,\n } = options;\n\n // Create a lazy component\n const LazyComponent = React.lazy(importFn);\n\n // Wrapper component that handles loading state\n function DynamicComponent(props) {\n const fallback = LoadingComponent\n ? React.createElement(LoadingComponent, { isLoading: true })\n : null;\n\n return React.createElement(\n React.Suspense,\n { fallback },\n React.createElement(LazyComponent, props)\n );\n }\n\n return DynamicComponent;\n}\n\nexport default dynamic;\nexport { dynamic };\n";
65
+ /**
66
+ * next/script shim - Loads external scripts
67
+ */
68
+ export declare const NEXT_SCRIPT_SHIM = "\nimport React from 'react';\n\nfunction Script({\n src,\n strategy = 'afterInteractive',\n onLoad,\n onReady,\n onError,\n children,\n dangerouslySetInnerHTML,\n ...rest\n}) {\n React.useEffect(function() {\n if (!src && !children && !dangerouslySetInnerHTML) return;\n\n var script = document.createElement('script');\n\n if (src) {\n script.src = src;\n script.async = strategy !== 'beforeInteractive';\n }\n\n Object.keys(rest).forEach(function(key) {\n script.setAttribute(key, rest[key]);\n });\n\n if (children) {\n script.textContent = children;\n } else if (dangerouslySetInnerHTML && dangerouslySetInnerHTML.__html) {\n script.textContent = dangerouslySetInnerHTML.__html;\n }\n\n script.onload = function() {\n if (onLoad) onLoad();\n if (onReady) onReady();\n };\n script.onerror = onError;\n\n document.head.appendChild(script);\n\n return function() {\n if (script.parentNode) {\n script.parentNode.removeChild(script);\n }\n };\n }, [src]);\n\n return null;\n}\n\nexport default Script;\nexport { Script };\n";
69
+ /**
70
+ * next/font/google shim - Loads Google Fonts via CDN
71
+ * Uses a Proxy to dynamically handle ANY Google Font without hardcoding
72
+ */
73
+ export declare const NEXT_FONT_GOOGLE_SHIM = "\n// Track loaded fonts to avoid duplicate style injections\nconst loadedFonts = new Set();\n\n/**\n * Convert font function name to Google Fonts family name\n * Examples:\n * DM_Sans -> DM Sans\n * Open_Sans -> Open Sans\n * Fraunces -> Fraunces\n */\nfunction toFontFamily(fontName) {\n return fontName.replace(/_/g, ' ');\n}\n\n/**\n * Inject font CSS into document\n * - Adds preconnect links for faster font loading\n * - Loads the font from Google Fonts CDN\n * - Creates a CSS class that sets the CSS variable\n */\nfunction injectFontCSS(fontFamily, variableName, weight, style) {\n const fontKey = fontFamily + '-' + (variableName || 'default');\n if (loadedFonts.has(fontKey)) {\n return;\n }\n loadedFonts.add(fontKey);\n\n if (typeof document === 'undefined') {\n return;\n }\n\n // Add preconnect links for faster loading (only once)\n if (!document.querySelector('link[href=\"https://fonts.googleapis.com\"]')) {\n const preconnect1 = document.createElement('link');\n preconnect1.rel = 'preconnect';\n preconnect1.href = 'https://fonts.googleapis.com';\n document.head.appendChild(preconnect1);\n\n const preconnect2 = document.createElement('link');\n preconnect2.rel = 'preconnect';\n preconnect2.href = 'https://fonts.gstatic.com';\n preconnect2.crossOrigin = 'anonymous';\n document.head.appendChild(preconnect2);\n }\n\n // Build Google Fonts URL\n const escapedFamily = fontFamily.replace(/ /g, '+');\n\n // Build axis list based on options\n let axisList = '';\n const axes = [];\n\n // Handle italic style\n if (style === 'italic') {\n axes.push('ital');\n }\n\n // Handle weight - use specific weight or variable range\n if (weight && weight !== '400' && !Array.isArray(weight)) {\n // Specific weight requested\n axes.push('wght');\n if (style === 'italic') {\n axisList = ':ital,wght@1,' + weight;\n } else {\n axisList = ':wght@' + weight;\n }\n } else if (Array.isArray(weight)) {\n // Multiple weights\n axes.push('wght');\n axisList = ':wght@' + weight.join(';');\n } else {\n // Default: request common weights for flexibility\n axisList = ':wght@400;500;600;700';\n }\n\n const fontUrl = 'https://fonts.googleapis.com/css2?family=' +\n escapedFamily + axisList + '&display=swap';\n\n // Add link element for Google Fonts (if not already present)\n if (!document.querySelector('link[href*=\"family=' + escapedFamily + '\"]')) {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = fontUrl;\n document.head.appendChild(link);\n }\n\n // Create style element for CSS variable at :root level (globally available)\n // This makes the variable work without needing to apply the class to body\n if (variableName) {\n const styleEl = document.createElement('style');\n styleEl.setAttribute('data-font-var', variableName);\n styleEl.textContent = ':root { ' + variableName + ': \"' + fontFamily + '\", ' + (fontFamily.includes('Serif') ? 'serif' : 'sans-serif') + '; }';\n document.head.appendChild(styleEl);\n }\n}\n\n/**\n * Create a font loader function for a specific font\n */\nfunction createFontLoader(fontName) {\n const fontFamily = toFontFamily(fontName);\n\n return function(options = {}) {\n const {\n weight,\n style = 'normal',\n subsets = ['latin'],\n variable,\n display = 'swap',\n preload = true,\n fallback = ['sans-serif'],\n adjustFontFallback = true\n } = options;\n\n // Inject the font CSS\n injectFontCSS(fontFamily, variable, weight, style);\n\n // Generate class name from variable (--font-inter -> __font-inter)\n const className = variable\n ? variable.replace('--', '__')\n : '__font-' + fontName.toLowerCase().replace(/_/g, '-');\n\n return {\n className,\n variable: className,\n style: {\n fontFamily: '\"' + fontFamily + '\", ' + fallback.join(', ')\n }\n };\n };\n}\n\n/**\n * Use a Proxy to dynamically create font loaders for ANY font name\n * This allows: import { AnyGoogleFont } from \"next/font/google\"\n */\nconst fontProxy = new Proxy({}, {\n get(target, prop) {\n // Handle special properties\n if (prop === '__esModule') return true;\n if (prop === 'default') return fontProxy;\n if (typeof prop !== 'string') return undefined;\n\n // Create a font loader for this font name\n return createFontLoader(prop);\n }\n});\n\n// Export the proxy as both default and named exports\nexport default fontProxy;\n\n// Re-export through proxy for named imports\nexport const {\n Fraunces, Inter, DM_Sans, DM_Serif_Text, Roboto, Open_Sans, Lato,\n Montserrat, Poppins, Playfair_Display, Merriweather, Raleway, Nunito,\n Ubuntu, Oswald, Quicksand, Work_Sans, Fira_Sans, Barlow, Mulish, Rubik,\n Noto_Sans, Manrope, Space_Grotesk, Geist, Geist_Mono\n} = fontProxy;\n";
74
+ /**
75
+ * next/font/local shim - Loads local font files
76
+ * Accepts font source path and creates @font-face declaration + CSS variable
77
+ */
78
+ export declare const NEXT_FONT_LOCAL_SHIM = "\nconst loadedLocalFonts = new Set();\n\nfunction localFont(options = {}) {\n const {\n src,\n weight,\n style = 'normal',\n variable,\n display = 'swap',\n fallback = ['sans-serif'],\n declarations = [],\n adjustFontFallback = true\n } = options;\n\n // Determine font family name from variable or src\n const familyName = variable\n ? variable.replace('--', '').replace(/-/g, ' ')\n : 'local-font-' + Math.random().toString(36).slice(2, 8);\n\n const fontKey = familyName + '-' + (variable || 'default');\n if (typeof document !== 'undefined' && !loadedLocalFonts.has(fontKey)) {\n loadedLocalFonts.add(fontKey);\n\n // Build @font-face declarations\n let fontFaces = '';\n\n if (typeof src === 'string') {\n // Single source\n fontFaces = '@font-face {\\n' +\n ' font-family: \"' + familyName + '\";\\n' +\n ' src: url(\"' + src + '\");\\n' +\n ' font-weight: ' + (weight || '400') + ';\\n' +\n ' font-style: ' + style + ';\\n' +\n ' font-display: ' + display + ';\\n' +\n '}';\n } else if (Array.isArray(src)) {\n // Multiple sources (different weights/styles)\n fontFaces = src.map(function(s) {\n const path = typeof s === 'string' ? s : s.path;\n const w = (typeof s === 'object' && s.weight) || weight || '400';\n const st = (typeof s === 'object' && s.style) || style;\n return '@font-face {\\n' +\n ' font-family: \"' + familyName + '\";\\n' +\n ' src: url(\"' + path + '\");\\n' +\n ' font-weight: ' + w + ';\\n' +\n ' font-style: ' + st + ';\\n' +\n ' font-display: ' + display + ';\\n' +\n '}';\n }).join('\\n');\n }\n\n // Inject font-face CSS\n if (fontFaces) {\n var styleEl = document.createElement('style');\n styleEl.setAttribute('data-local-font', fontKey);\n styleEl.textContent = fontFaces;\n document.head.appendChild(styleEl);\n }\n\n // Inject CSS variable at :root level\n if (variable) {\n var varStyle = document.createElement('style');\n varStyle.setAttribute('data-font-var', variable);\n varStyle.textContent = ':root { ' + variable + ': \"' + familyName + '\", ' + fallback.join(', ') + '; }';\n document.head.appendChild(varStyle);\n }\n }\n\n const className = variable\n ? variable.replace('--', '__')\n : '__font-' + familyName.toLowerCase().replace(/\\s+/g, '-');\n\n return {\n className,\n variable: className,\n style: {\n fontFamily: '\"' + familyName + '\", ' + fallback.join(', ')\n }\n };\n}\n\nexport default localFont;\nexport { localFont };\n";
79
+ //# sourceMappingURL=next-shims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-shims.d.ts","sourceRoot":"","sources":["../../src/frameworks/next-shims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,0DAAwD,CAAC;AAEzF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,woBAwB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,iiBAkBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,66GAmH7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,26DAgE1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,2jHAmH5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oBAAoB,yqMAuMhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,i6CA6C1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,mgCAqD3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,+pBA8B7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,gnCAqD5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,g0JA+JjC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,ooFAoFhC,CAAC"}