reroute-js 0.46.0 → 1.0.0-alpha.1

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 (215) hide show
  1. package/README.md +2 -4
  2. package/_/store/package.json +1 -3
  3. package/_/store/src/client/components/Header.tsx +8 -20
  4. package/_/store/src/client/components/ProductCard.tsx +9 -16
  5. package/_/store/src/client/index.css +1118 -0
  6. package/_/store/src/client/routes/[404].tsx +20 -31
  7. package/_/store/src/client/routes/categories/[category].tsx +23 -28
  8. package/_/store/src/client/routes/categories/index.tsx +19 -27
  9. package/_/store/src/client/routes/index.tsx +27 -37
  10. package/_/store/src/client/routes/products/[id].tsx +35 -48
  11. package/_/store/src/client/routes/products/index.tsx +20 -50
  12. package/cli/bin.d.ts +1 -1
  13. package/cli/bin.js +87 -185
  14. package/cli/bin.js.map +11 -11
  15. package/cli/index.d.ts +1 -1
  16. package/cli/index.js +19 -114
  17. package/cli/index.js.map +5 -5
  18. package/cli/src/cli.d.ts +1 -1
  19. package/cli/src/commands/analyze.d.ts +1 -1
  20. package/cli/src/commands/build.d.ts +1 -1
  21. package/cli/src/commands/dev.d.ts +1 -1
  22. package/cli/src/commands/gen.d.ts +1 -1
  23. package/cli/src/commands/gen.d.ts.map +1 -1
  24. package/cli/src/commands/index.d.ts +1 -1
  25. package/cli/src/commands/init.d.ts +1 -1
  26. package/cli/src/commands/lib/assets.d.ts +1 -1
  27. package/cli/src/commands/lib/bundler.d.ts +1 -1
  28. package/cli/src/commands/lib/command.d.ts +1 -1
  29. package/cli/src/commands/lib/env.d.ts +1 -1
  30. package/cli/src/commands/lib/index.d.ts +2 -2
  31. package/cli/src/commands/lib/index.d.ts.map +1 -1
  32. package/cli/src/commands/lib/log.d.ts +1 -1
  33. package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
  34. package/cli/src/commands/lib/markdown/index.d.ts +1 -1
  35. package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
  36. package/cli/src/commands/lib/production.d.ts +1 -1
  37. package/cli/src/commands/lib/server.d.ts +1 -1
  38. package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
  39. package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
  40. package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
  41. package/cli/src/commands/lib/theme.d.ts +20 -0
  42. package/cli/src/commands/lib/theme.d.ts.map +1 -0
  43. package/cli/src/commands/lib/version.d.ts +1 -1
  44. package/cli/src/commands/og.d.ts +1 -1
  45. package/cli/src/commands/start.d.ts +1 -1
  46. package/cli/src/index.d.ts +1 -1
  47. package/core/index.d.ts +1 -1
  48. package/core/index.js +16 -16
  49. package/core/index.js.map +6 -6
  50. package/core/src/bundler/hash.d.ts +1 -1
  51. package/core/src/bundler/index.d.ts +1 -1
  52. package/core/src/config.d.ts +1 -1
  53. package/core/src/content/discovery.d.ts +1 -1
  54. package/core/src/content/index.d.ts +1 -1
  55. package/core/src/content/metadata.d.ts +1 -1
  56. package/core/src/i18n/catalog.d.ts +1 -1
  57. package/core/src/i18n/discover.d.ts +1 -1
  58. package/core/src/i18n/index.d.ts +1 -1
  59. package/core/src/i18n/messages.d.ts +1 -1
  60. package/core/src/i18n/negotiate.d.ts +1 -1
  61. package/core/src/i18n/pathname.d.ts +1 -1
  62. package/core/src/i18n/resolve.d.ts +1 -1
  63. package/core/src/i18n/types.d.ts +1 -1
  64. package/core/src/index.d.ts +1 -1
  65. package/core/src/llms/extractor.d.ts +1 -1
  66. package/core/src/llms/formatter.d.ts +1 -1
  67. package/core/src/llms/full-generator.d.ts +1 -1
  68. package/core/src/llms/index-generator.d.ts +1 -1
  69. package/core/src/llms/index.d.ts +1 -1
  70. package/core/src/og/discovery.d.ts +1 -1
  71. package/core/src/og/index.d.ts +1 -1
  72. package/core/src/og/meta.d.ts +1 -1
  73. package/core/src/og/render.d.ts +1 -1
  74. package/core/src/og/types.d.ts +1 -1
  75. package/core/src/robots/discovery.d.ts +1 -1
  76. package/core/src/robots/generator.d.ts +1 -1
  77. package/core/src/robots/index.d.ts +1 -1
  78. package/core/src/robots/policies.d.ts +1 -1
  79. package/core/src/rss/discovery.d.ts +1 -1
  80. package/core/src/rss/generator.d.ts +1 -1
  81. package/core/src/rss/index.d.ts +1 -1
  82. package/core/src/sitemap/discovery.d.ts +1 -1
  83. package/core/src/sitemap/generator.d.ts +1 -1
  84. package/core/src/sitemap/index.d.ts +1 -1
  85. package/core/src/ssr/index.d.ts +1 -1
  86. package/core/src/ssr/lib/cache.d.ts +1 -1
  87. package/core/src/ssr/lib/cleanup.d.ts +1 -1
  88. package/core/src/ssr/lib/collections.d.ts +1 -1
  89. package/core/src/ssr/lib/compression.d.ts +1 -1
  90. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  91. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  92. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  93. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  94. package/core/src/ssr/lib/content-path.d.ts +1 -1
  95. package/core/src/ssr/lib/data.d.ts +1 -1
  96. package/core/src/ssr/lib/html.d.ts +1 -1
  97. package/core/src/ssr/lib/imports.d.ts +1 -1
  98. package/core/src/ssr/lib/index.d.ts +1 -1
  99. package/core/src/ssr/lib/layouts.d.ts +1 -1
  100. package/core/src/ssr/lib/metadata.d.ts +1 -1
  101. package/core/src/ssr/lib/mime.d.ts +1 -1
  102. package/core/src/ssr/lib/modules.d.ts +1 -1
  103. package/core/src/ssr/lib/path.d.ts +1 -1
  104. package/core/src/ssr/lib/preload.d.ts +1 -1
  105. package/core/src/ssr/lib/route-match.d.ts +1 -1
  106. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  107. package/core/src/ssr/lib/scripts/data.d.ts +1 -1
  108. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  109. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  110. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  111. package/core/src/ssr/lib/seed.d.ts +1 -1
  112. package/core/src/ssr/lib/serialize.d.ts +1 -1
  113. package/core/src/ssr/lib/setup.d.ts +2 -2
  114. package/core/src/ssr/lib/setup.d.ts.map +1 -1
  115. package/core/src/ssr/lib/styles.d.ts +3 -3
  116. package/core/src/ssr/lib/styles.d.ts.map +1 -1
  117. package/core/src/ssr/lib/template.d.ts +1 -1
  118. package/core/src/ssr/lib/types.d.ts +1 -1
  119. package/core/src/ssr/render.d.ts +2 -2
  120. package/core/src/ssr/render.d.ts.map +1 -1
  121. package/core/src/ssr/stream.d.ts +2 -2
  122. package/core/src/ssr/stream.d.ts.map +1 -1
  123. package/elysia/index.d.ts +1 -1
  124. package/elysia/index.js +27 -27
  125. package/elysia/index.js.map +9 -9
  126. package/elysia/src/index.d.ts +1 -1
  127. package/elysia/src/libs/assets.d.ts +1 -1
  128. package/elysia/src/libs/cache.d.ts +1 -1
  129. package/elysia/src/libs/caching.d.ts +1 -1
  130. package/elysia/src/libs/http.d.ts +1 -1
  131. package/elysia/src/libs/i18n.d.ts +1 -1
  132. package/elysia/src/libs/image.d.ts +1 -1
  133. package/elysia/src/libs/index.d.ts +1 -1
  134. package/elysia/src/libs/llms.d.ts +1 -1
  135. package/elysia/src/libs/response.d.ts +1 -1
  136. package/elysia/src/libs/serving.d.ts +1 -1
  137. package/elysia/src/plugin.d.ts +1 -1
  138. package/elysia/src/routes/artifacts.d.ts +1 -1
  139. package/elysia/src/routes/content.d.ts +1 -1
  140. package/elysia/src/routes/image.d.ts +1 -1
  141. package/elysia/src/routes/index.d.ts +1 -1
  142. package/elysia/src/routes/internal.d.ts +1 -1
  143. package/elysia/src/routes/llms.d.ts +1 -1
  144. package/elysia/src/routes/og.d.ts +1 -1
  145. package/elysia/src/routes/redirects.d.ts +1 -1
  146. package/elysia/src/routes/robots.d.ts +1 -1
  147. package/elysia/src/routes/rss.d.ts +1 -1
  148. package/elysia/src/routes/search.d.ts +1 -1
  149. package/elysia/src/routes/sitemap.d.ts +1 -1
  150. package/elysia/src/routes/ssr.d.ts +2 -2
  151. package/elysia/src/routes/ssr.d.ts.map +1 -1
  152. package/elysia/src/routes/static.d.ts +1 -1
  153. package/elysia/src/types.d.ts +1 -1
  154. package/package.json +2 -5
  155. package/react/index.d.ts +1 -1
  156. package/react/index.js +2 -2
  157. package/react/index.js.map +1 -1
  158. package/react/src/components/ClientOnly.d.ts +1 -1
  159. package/react/src/components/ContentRoute.d.ts +1 -1
  160. package/react/src/components/Image.d.ts +1 -1
  161. package/react/src/components/LazyRoute.d.ts +1 -1
  162. package/react/src/components/Link.d.ts +1 -1
  163. package/react/src/components/Markdown.d.ts +1 -1
  164. package/react/src/components/Outlet.d.ts +1 -1
  165. package/react/src/components/index.d.ts +1 -1
  166. package/react/src/hooks/index.d.ts +1 -1
  167. package/react/src/hooks/useContent.d.ts +1 -1
  168. package/react/src/hooks/useData.d.ts +1 -1
  169. package/react/src/hooks/useFeed.d.ts +1 -1
  170. package/react/src/hooks/useLayoutData.d.ts +1 -1
  171. package/react/src/hooks/useLlms.d.ts +1 -1
  172. package/react/src/hooks/useNavigate.d.ts +1 -1
  173. package/react/src/hooks/useParams.d.ts +1 -1
  174. package/react/src/hooks/useRouter.d.ts +1 -1
  175. package/react/src/hooks/useSearch.d.ts +1 -1
  176. package/react/src/hooks/useSearchParams.d.ts +1 -1
  177. package/react/src/hooks/useToc.d.ts +1 -1
  178. package/react/src/i18n/LocaleProvider.d.ts +1 -1
  179. package/react/src/i18n/helpers.d.ts +1 -1
  180. package/react/src/i18n/index.d.ts +1 -1
  181. package/react/src/index.d.ts +1 -1
  182. package/react/src/lib/collection.d.ts +1 -1
  183. package/react/src/lib/content.d.ts +1 -1
  184. package/react/src/lib/head.d.ts +1 -1
  185. package/react/src/lib/index.d.ts +1 -1
  186. package/react/src/lib/lazy-route.d.ts +1 -1
  187. package/react/src/lib/route-loader.d.ts +1 -1
  188. package/react/src/providers/ContentProvider.d.ts +1 -1
  189. package/react/src/providers/RerouteProvider.d.ts +1 -1
  190. package/react/src/providers/RouterProvider.d.ts +1 -1
  191. package/react/src/providers/index.d.ts +1 -1
  192. package/react/src/types/any.d.ts +1 -1
  193. package/react/src/types/index.d.ts +1 -1
  194. package/react/src/types/router.d.ts +1 -1
  195. package/telemetry/react.d.ts +1 -1
  196. package/telemetry/react.js +2 -2
  197. package/telemetry/react.js.map +1 -1
  198. package/telemetry/server.d.ts +1 -1
  199. package/telemetry/server.js +2 -2
  200. package/telemetry/server.js.map +4 -4
  201. package/telemetry/src/react/api.d.ts +1 -1
  202. package/telemetry/src/react/context.d.ts +1 -1
  203. package/telemetry/src/react/index.d.ts +1 -1
  204. package/telemetry/src/react/telemetry.d.ts +1 -1
  205. package/telemetry/src/server/context.d.ts +1 -1
  206. package/telemetry/src/server/headers/extractor.d.ts +1 -1
  207. package/telemetry/src/server/headers/index.d.ts +1 -1
  208. package/telemetry/src/server/headers/presets.d.ts +1 -1
  209. package/telemetry/src/server/index.d.ts +1 -1
  210. package/telemetry/src/server/instrumentation.d.ts +1 -1
  211. package/telemetry/src/server/plugin.d.ts +1 -1
  212. package/telemetry/src/server/sourcemap.d.ts +1 -1
  213. package/_/store/src/client/theme.css +0 -306
  214. package/cli/src/commands/lib/tailwind.d.ts +0 -20
  215. package/cli/src/commands/lib/tailwind.d.ts.map +0 -1
package/cli/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
3
  /**
4
- * reroute-js v0.46.0
4
+ * reroute-js v1.0.0-alpha.1
5
5
  *
6
6
  * @license MIT
7
7
  * @copyright 2026 stewones <hi@stewan.io>
@@ -66,7 +66,7 @@ async function getVersionString() {
66
66
  }
67
67
  async function getVersion() {
68
68
  if (true) {
69
- return "0.46.0";
69
+ return "1.0.0-alpha.1";
70
70
  }
71
71
  const possiblePaths = [
72
72
  path.join(import.meta.dir, "../../../../package.json"),
@@ -84,7 +84,7 @@ async function getVersion() {
84
84
  }
85
85
  async function getCommit() {
86
86
  if (true) {
87
- return "9116acf";
87
+ return "6889da1";
88
88
  }
89
89
  return "dev";
90
90
  }
@@ -325,7 +325,7 @@ function printSuccess(projectName, template) {
325
325
  console.log(" | |-- products/");
326
326
  console.log(" | |-- categories/");
327
327
  console.log(" |-- lib/ # API client & utilities");
328
- console.log(" +-- theme.css # Tailwind CSS v4");
328
+ console.log(" +-- index.css # Client CSS");
329
329
  }
330
330
  console.log(" | |-- index.tsx");
331
331
  console.log(" | +-- about.tsx");
@@ -3724,22 +3724,22 @@ var init_scripts = __esm(() => {
3724
3724
  });
3725
3725
 
3726
3726
  // packages/core/src/ssr/lib/styles.ts
3727
- async function inlineTailwindCSS(clientDir, minify = false, isWatchMode = false) {
3727
+ async function inlineThemeCSS(clientDir, minify = false, isWatchMode = false) {
3728
3728
  try {
3729
3729
  const bundledCss = globalThis.__REROUTE_THEME_CSS__;
3730
3730
  if (bundledCss) {
3731
3731
  const css2 = minify ? minifyCSS(bundledCss) : bundledCss;
3732
- return `<style data-reroute="tailwind">${css2}</style>`;
3732
+ return `<style data-reroute="theme">${css2}</style>`;
3733
3733
  }
3734
3734
  if (isWatchMode) {
3735
3735
  const timestamp = Date.now();
3736
- return `<link rel="stylesheet" href="/.reroute/theme.css?t=${timestamp}" data-reroute="tailwind">`;
3736
+ return `<link rel="stylesheet" href="/.reroute/index.css?t=${timestamp}" data-reroute="theme">`;
3737
3737
  }
3738
3738
  const candidates = [
3739
- join2(clientDir, "..", ".reroute", "theme.css"),
3740
- join2(clientDir, "..", "..", ".reroute", "theme.css"),
3741
- join2(clientDir, "..", "..", "..", ".reroute", "theme.css"),
3742
- join2(clientDir, "..", "..", "..", "..", ".reroute", "theme.css")
3739
+ join2(clientDir, "..", ".reroute", "index.css"),
3740
+ join2(clientDir, "..", "..", ".reroute", "index.css"),
3741
+ join2(clientDir, "..", "..", "..", ".reroute", "index.css"),
3742
+ join2(clientDir, "..", "..", "..", "..", ".reroute", "index.css")
3743
3743
  ];
3744
3744
  let cssPath = "";
3745
3745
  for (const p of candidates) {
@@ -3752,7 +3752,7 @@ async function inlineTailwindCSS(clientDir, minify = false, isWatchMode = false)
3752
3752
  return "";
3753
3753
  const { readFileSync } = await import("node:fs");
3754
3754
  const css = readFileSync(cssPath, "utf-8");
3755
- return `<style data-reroute="tailwind">${minifyCSS(css)}</style>`;
3755
+ return `<style data-reroute="theme">${minifyCSS(css)}</style>`;
3756
3756
  } catch {
3757
3757
  return "";
3758
3758
  }
@@ -3863,15 +3863,15 @@ async function performSSRSetupInternal(options, streaming, timeoutState) {
3863
3863
  });
3864
3864
  assertNotTimedOut();
3865
3865
  setGlobalCollections(byCollectionForSSR);
3866
- const usingCachedCSS = !!options.cachedTailwindCSS;
3866
+ const usingCachedCSS = !!options.cachedThemeCSS;
3867
3867
  const inlineStyleTag = await withSpan("ssr.inline.css", async (span) => {
3868
- const css = options.cachedTailwindCSS ? options.cachedTailwindCSS : await inlineTailwindCSS(clientDir, !streaming, isWatchMode);
3868
+ const css = options.cachedThemeCSS ? options.cachedThemeCSS : await inlineThemeCSS(clientDir, !streaming, isWatchMode);
3869
3869
  span.setAttributes({
3870
3870
  "reroute.cached": usingCachedCSS,
3871
3871
  "reroute.css.size": css.length
3872
3872
  });
3873
3873
  if (debug)
3874
- console.log(`[Setup] ${pathname} - inlineTailwindCSS (cached: ${usingCachedCSS}): ${(performance.now() - t0).toFixed(2)}ms`);
3874
+ console.log(`[Setup] ${pathname} - inlineThemeCSS (cached: ${usingCachedCSS}): ${(performance.now() - t0).toFixed(2)}ms`);
3875
3875
  return css;
3876
3876
  });
3877
3877
  assertNotTimedOut();
@@ -4055,7 +4055,7 @@ async function renderSSRDocument(options) {
4055
4055
  baseUrl: options.baseUrl,
4056
4056
  autoCanonical: options.autoCanonical,
4057
4057
  cachedCollections: options.cachedCollections,
4058
- cachedTailwindCSS: options.cachedTailwindCSS,
4058
+ cachedThemeCSS: options.cachedThemeCSS,
4059
4059
  headers: options.headers,
4060
4060
  titleSuffix: options.titleSuffix
4061
4061
  }, false);
@@ -6192,7 +6192,7 @@ async function renderSSRDocumentStream(options) {
6192
6192
  baseUrl: options.baseUrl,
6193
6193
  autoCanonical: options.autoCanonical,
6194
6194
  cachedCollections: options.cachedCollections,
6195
- cachedTailwindCSS: options.cachedTailwindCSS,
6195
+ cachedThemeCSS: options.cachedThemeCSS,
6196
6196
  debug,
6197
6197
  headers: options.headers,
6198
6198
  titleSuffix: options.titleSuffix,
@@ -6568,7 +6568,7 @@ __export(exports_core, {
6568
6568
  join: () => join2,
6569
6569
  isThenable: () => isThenable,
6570
6570
  isCompressible: () => isCompressible,
6571
- inlineTailwindCSS: () => inlineTailwindCSS,
6571
+ inlineThemeCSS: () => inlineThemeCSS,
6572
6572
  importContentModuleForPath: () => importContentModuleForPath,
6573
6573
  htmlToMarkdown: () => htmlToMarkdown,
6574
6574
  hreflangTags: () => hreflangTags,
@@ -7375,121 +7375,26 @@ var AUTO_HEADER = `// \uD83D\uDEA8 Auto-generated streaming wrapper by Reroute -
7375
7375
  `, warnedSkeletonType = false;
7376
7376
  var init_suspense = () => {};
7377
7377
 
7378
- // packages/cli/src/commands/lib/tailwind.ts
7379
- import { spawn } from "node:child_process";
7380
- import { existsSync as existsSync5, readFileSync as readFileSync4 } from "node:fs";
7381
- import { join as join9 } from "node:path";
7382
- function isTailwindAvailable(cwd) {
7383
- const pathsToTry = [
7384
- join9(cwd, "package.json"),
7385
- join9(cwd, "../package.json"),
7386
- join9(cwd, "../../package.json"),
7387
- join9(cwd, "../../../package.json")
7388
- ];
7389
- for (const packageJsonPath of pathsToTry) {
7390
- if (!existsSync5(packageJsonPath)) {
7391
- continue;
7392
- }
7393
- try {
7394
- const packageJson = JSON.parse(readFileSync4(packageJsonPath, "utf-8"));
7395
- const deps = {
7396
- ...packageJson.dependencies,
7397
- ...packageJson.devDependencies,
7398
- ...packageJson.peerDependencies
7399
- };
7400
- if ("@tailwindcss/cli" in deps) {
7401
- return true;
7402
- }
7403
- } catch {}
7404
- }
7405
- return false;
7406
- }
7407
- function getTailwindPaths(cwd) {
7408
- const input = join9(cwd, "src/client/theme.css");
7409
- const output = join9(cwd, ".reroute/theme.css");
7378
+ // packages/cli/src/commands/lib/theme.ts
7379
+ import { existsSync as existsSync5 } from "node:fs";
7380
+ import { mkdir as mkdir2 } from "node:fs/promises";
7381
+ import { dirname as dirname5, join as join9 } from "node:path";
7382
+ function getCssPaths(cwd) {
7383
+ const input = join9(cwd, "src/client/index.css");
7384
+ const output = join9(cwd, ".reroute/index.css");
7410
7385
  return { input, output };
7411
7386
  }
7412
- function hasTailwindInput(cwd) {
7413
- const { input } = getTailwindPaths(cwd);
7387
+ async function syncThemeCss(cwd) {
7388
+ const { input, output } = getCssPaths(cwd);
7414
7389
  if (!existsSync5(input)) {
7415
7390
  return false;
7416
7391
  }
7417
- try {
7418
- const content2 = readFileSync4(input, "utf-8");
7419
- return content2.includes("tailwindcss");
7420
- } catch {
7421
- return false;
7422
- }
7423
- }
7424
- function resolveTailwindBin(cwd) {
7425
- const pathsToTry = [
7426
- join9(cwd, "node_modules/.bin/tailwindcss"),
7427
- join9(cwd, "../node_modules/.bin/tailwindcss"),
7428
- join9(cwd, "../../node_modules/.bin/tailwindcss"),
7429
- join9(cwd, "../../../node_modules/.bin/tailwindcss")
7430
- ];
7431
- for (const binPath of pathsToTry) {
7432
- if (existsSync5(binPath)) {
7433
- return binPath;
7434
- }
7435
- }
7436
- return "npx tailwindcss";
7437
- }
7438
- async function buildTailwind(cwd, minify = false) {
7439
- const { input, output } = getTailwindPaths(cwd);
7440
- return new Promise((resolve2, reject) => {
7441
- const tailwindBin = resolveTailwindBin(cwd);
7442
- const args = ["-i", input, "-o", output];
7443
- if (minify) {
7444
- args.push("--minify");
7445
- }
7446
- const argsStr = args.join(" ");
7447
- console.log(`[reroute/tailwind] build start: ${argsStr}`);
7448
- const tailwind = spawn(tailwindBin, args, {
7449
- cwd,
7450
- stdio: "pipe"
7451
- });
7452
- tailwind.stdout?.on("data", (data) => {
7453
- const line = data.toString().trim();
7454
- if (line) {
7455
- console.log(`[reroute/tailwind] ${line}`);
7456
- }
7457
- });
7458
- tailwind.stderr?.on("data", (data) => {
7459
- const line = data.toString().trim();
7460
- if (line) {
7461
- console.log(`[reroute/tailwind] ${line}`);
7462
- }
7463
- });
7464
- tailwind.on("close", (code) => {
7465
- if (code === 0) {
7466
- console.log("[reroute/tailwind] build done");
7467
- resolve2();
7468
- } else {
7469
- reject(new Error(`Tailwind CSS build failed with code ${code}`));
7470
- }
7471
- });
7472
- tailwind.on("error", (error) => {
7473
- reject(error);
7474
- });
7475
- });
7476
- }
7477
- async function buildTailwindIfConfigured(cwd, minify = false) {
7478
- try {
7479
- const isAvailable = isTailwindAvailable(cwd);
7480
- const hasInput = hasTailwindInput(cwd);
7481
- console.log(`[reroute/tailwind] check: available=${isAvailable}, hasInput=${hasInput}, cwd=${cwd}`);
7482
- if (isAvailable && hasInput) {
7483
- await buildTailwind(cwd, minify);
7484
- return true;
7485
- }
7486
- return false;
7487
- } catch (e) {
7488
- console.warn("[reroute/tailwind] build failed:", e);
7489
- return true;
7490
- }
7392
+ await mkdir2(dirname5(output), { recursive: true });
7393
+ await Bun.write(output, Bun.file(input));
7394
+ console.log("[reroute/theme] synced index.css");
7395
+ return true;
7491
7396
  }
7492
- var init_tailwind = () => {};
7397
+ var init_theme = () => {};
7493
7398
 
7494
7399
  // packages/cli/src/commands/gen.ts
7495
7400
  var exports_gen = {};
@@ -7497,14 +7402,14 @@ __export(exports_gen, {
7497
7402
  default: () => gen
7498
7403
  });
7499
7404
  import { watch } from "node:fs";
7500
- import { mkdir as mkdir2, readdir as readdir7, rm } from "node:fs/promises";
7501
- import { dirname as dirname5, join as join10 } from "node:path";
7405
+ import { mkdir as mkdir3, readdir as readdir7, rm } from "node:fs/promises";
7406
+ import { dirname as dirname6, join as join10 } from "node:path";
7502
7407
  import { pathToFileURL as pathToFileURL8 } from "node:url";
7503
7408
  async function bundleThemeCssIntoArtifacts(cwd) {
7504
- const themeCssPath = join10(cwd, ".reroute", "theme.css");
7409
+ const cssPath = join10(cwd, ".reroute", "index.css");
7505
7410
  const artifactsPath = join10(cwd, OUTPUT_ARTIFACTS);
7506
7411
  try {
7507
- const cssContent = await Bun.file(themeCssPath).text();
7412
+ const cssContent = await Bun.file(cssPath).text();
7508
7413
  if (!cssContent)
7509
7414
  return;
7510
7415
  let artifactsContent = await Bun.file(artifactsPath).text();
@@ -7512,7 +7417,7 @@ async function bundleThemeCssIntoArtifacts(cwd) {
7512
7417
  return;
7513
7418
  }
7514
7419
  const cssLine = `
7515
- // Bundled theme.css for compiled binary support
7420
+ // Bundled index.css for compiled binary support
7516
7421
  (globalThis as any).__REROUTE_THEME_CSS__ = ${JSON.stringify(cssContent)};
7517
7422
  `;
7518
7423
  const exportIndex = artifactsContent.lastIndexOf("export type RerouteBundle");
@@ -7540,10 +7445,10 @@ async function ensureOutputDir(cwd, options = {}) {
7540
7445
  console.log("[reroute/gen] Cleaned up generated artifacts in .reroute");
7541
7446
  }
7542
7447
  }
7543
- await mkdir2(outputPath, { recursive: true });
7544
- await mkdir2(join10(cwd, OUTPUT_COLLECTIONS_DIR), { recursive: true });
7545
- await mkdir2(join10(cwd, ".reroute/bundles"), { recursive: true });
7546
- await mkdir2(join10(cwd, ".reroute/streaming"), { recursive: true });
7448
+ await mkdir3(outputPath, { recursive: true });
7449
+ await mkdir3(join10(cwd, OUTPUT_COLLECTIONS_DIR), { recursive: true });
7450
+ await mkdir3(join10(cwd, ".reroute/bundles"), { recursive: true });
7451
+ await mkdir3(join10(cwd, ".reroute/streaming"), { recursive: true });
7547
7452
  } catch {}
7548
7453
  }
7549
7454
  async function writeStubFiles(cwd) {
@@ -7946,7 +7851,7 @@ async function buildStreamingWrappersForTree(cwd, routesPath, tree, config2) {
7946
7851
  if (!analysis.needsStreaming)
7947
7852
  continue;
7948
7853
  const wrapperPath = join10(streamingDir, candidate.filePath).replace(/\.(tsx|ts)$/, ".tsx");
7949
- await mkdir2(dirname5(wrapperPath), { recursive: true });
7854
+ await mkdir3(dirname6(wrapperPath), { recursive: true });
7950
7855
  const code = await generateStreamingWrapper({
7951
7856
  cwd,
7952
7857
  relativeFilePath: candidate.filePath,
@@ -8410,7 +8315,7 @@ async function buildEntrypointBundle(cwd, args = []) {
8410
8315
  console.log("[reroute/gen] Building entrypoint bundle...");
8411
8316
  const isProd = args.includes("--prod");
8412
8317
  const bundlesDir = join10(cwd, ".reroute", "bundles");
8413
- await mkdir2(bundlesDir, { recursive: true });
8318
+ await mkdir3(bundlesDir, { recursive: true });
8414
8319
  const mode = isProd ? "production" : "development";
8415
8320
  const publicEnv = getPublicEnvVars(cwd, mode);
8416
8321
  const envDefines = envToDefineObject(publicEnv);
@@ -8820,10 +8725,9 @@ async function gen(args) {
8820
8725
  const genStartTime = performance.now();
8821
8726
  const cwd = process.cwd();
8822
8727
  const watchMode = args.includes("--watch") || args.includes("-w");
8823
- const isProd = isProductionMode(args);
8824
8728
  if (!watchMode) {
8825
8729
  await generate(cwd, args);
8826
- await buildTailwindIfConfigured(cwd, isProd);
8730
+ await syncThemeCss(cwd);
8827
8731
  await bundleThemeCssIntoArtifacts(cwd);
8828
8732
  checkMarkdownIfConfigured(cwd);
8829
8733
  const genEndTime2 = performance.now();
@@ -8837,7 +8741,7 @@ async function gen(args) {
8837
8741
  console.log("[reroute/gen] Initial generation...");
8838
8742
  await generate(cwd, args);
8839
8743
  try {
8840
- await buildTailwindIfConfigured(cwd, isProd);
8744
+ await syncThemeCss(cwd);
8841
8745
  checkMarkdownIfConfigured(cwd);
8842
8746
  } catch {}
8843
8747
  const genEndTime = performance.now();
@@ -8940,7 +8844,7 @@ async function gen(args) {
8940
8844
  scheduleBuild(async () => {
8941
8845
  console.log("[reroute/watch] \uD83D\uDCDD Config changed, full rebuild...");
8942
8846
  await generate(cwd, args, { clean: true, writeStubs: false });
8943
- await buildTailwindIfConfigured(cwd, isProd);
8847
+ await syncThemeCss(cwd);
8944
8848
  }, "config change");
8945
8849
  });
8946
8850
  });
@@ -8999,7 +8903,7 @@ async function gen(args) {
8999
8903
  clean: false,
9000
8904
  writeStubs: false
9001
8905
  });
9002
- await buildTailwindIfConfigured(cwd, isProd);
8906
+ await syncThemeCss(cwd);
9003
8907
  }, "workspace package change");
9004
8908
  });
9005
8909
  });
@@ -9057,16 +8961,16 @@ async function gen(args) {
9057
8961
  } else {
9058
8962
  await generate(cwd, args, { clean: false, writeStubs: false });
9059
8963
  }
9060
- const tailwindRebuilt = await buildTailwindIfConfigured(cwd, isProd);
9061
- if (tailwindRebuilt) {
9062
- console.log("[reroute/watch] ├─ Tailwind CSS rebuilt");
8964
+ const themeSynced = await syncThemeCss(cwd);
8965
+ if (themeSynced) {
8966
+ console.log("[reroute/watch] ├─ index.css synced");
9063
8967
  }
9064
8968
  }, "routes change");
9065
8969
  });
9066
8970
  });
9067
8971
  const clientPath = join10(cwd, "src", "client");
9068
8972
  console.log(`[reroute/watch] \uD83D\uDCE6 Watching ${clientPath}...`);
9069
- const twWatcher = watch(clientPath, { recursive: true }, (_ev, filename) => {
8973
+ const clientWatcher = watch(clientPath, { recursive: true }, (_ev, filename) => {
9070
8974
  if (!filename)
9071
8975
  return;
9072
8976
  const name = String(filename);
@@ -9091,11 +8995,9 @@ async function gen(args) {
9091
8995
  throw err;
9092
8996
  }
9093
8997
  }
9094
- console.log("[reroute/watch] ├─ Calling buildTailwindIfConfigured...");
9095
- const tailwindRebuilt = await buildTailwindIfConfigured(cwd, isProd);
9096
- console.log(`[reroute/watch] ├─ buildTailwindIfConfigured returned: ${tailwindRebuilt}`);
9097
- if (tailwindRebuilt) {
9098
- console.log("[reroute/watch] ├─ Tailwind CSS rebuilt");
8998
+ const themeSynced = await syncThemeCss(cwd);
8999
+ if (themeSynced) {
9000
+ console.log("[reroute/watch] ├─ index.css synced");
9099
9001
  }
9100
9002
  }, "client change");
9101
9003
  });
@@ -9104,7 +9006,7 @@ async function gen(args) {
9104
9006
  `);
9105
9007
  const watchers = [
9106
9008
  routesWatcher,
9107
- twWatcher,
9009
+ clientWatcher,
9108
9010
  packagesWatcher,
9109
9011
  configWatcher,
9110
9012
  ...envWatchers
@@ -9127,7 +9029,7 @@ var init_gen = __esm(() => {
9127
9029
  init_markdown();
9128
9030
  init_analyzer();
9129
9031
  init_suspense();
9130
- init_tailwind();
9032
+ init_theme();
9131
9033
  });
9132
9034
 
9133
9035
  // packages/cli/src/commands/lib/log.ts
@@ -9168,7 +9070,7 @@ var init_log = __esm(() => {
9168
9070
  "[reroute/gen]": "{bright-blue-fg}",
9169
9071
  "[reroute/content]": "{magenta-fg}",
9170
9072
  "[reroute/markdown]": "{yellow-fg}",
9171
- "[reroute/tailwind]": "{red-fg}",
9073
+ "[reroute/theme]": "{red-fg}",
9172
9074
  "[reroute/mdx]": "{bright-red-fg}",
9173
9075
  "[reroute/dev]": "{green-fg}",
9174
9076
  "[reroute/start]": "{bright-cyan-fg}",
@@ -9677,7 +9579,7 @@ var require_alias = __commonJS((exports) => {
9677
9579
 
9678
9580
  // node_modules/.bun/blessed@0.1.81/node_modules/blessed/lib/tput.js
9679
9581
  var require_tput = __commonJS((exports, module) => {
9680
- var __dirname = "/home/runner/work/reroute/reroute/node_modules/.bun/blessed@0.1.81/node_modules/blessed/lib";
9582
+ var __dirname = "/Users/stewan/dev/reroute/node_modules/.bun/blessed@0.1.81/node_modules/blessed/lib";
9681
9583
  var assert = __require("assert");
9682
9584
  var path3 = __require("path");
9683
9585
  var fs = __require("fs");
@@ -19464,7 +19366,7 @@ var require_screen = __commonJS((exports, module) => {
19464
19366
  options = args;
19465
19367
  args = [];
19466
19368
  }
19467
- var screen = this, program2 = screen.program, spawn2 = __require("child_process").spawn, mouse = program2.mouseEnabled, ps;
19369
+ var screen = this, program2 = screen.program, spawn = __require("child_process").spawn, mouse = program2.mouseEnabled, ps;
19468
19370
  options = options || {};
19469
19371
  options.stdio = options.stdio || "inherit";
19470
19372
  program2.lsaveCursor("spawn");
@@ -19498,7 +19400,7 @@ var require_screen = __commonJS((exports, module) => {
19498
19400
  screen.render();
19499
19401
  screen.program.lrestoreCursor("spawn", true);
19500
19402
  };
19501
- ps = spawn2(file, args, options);
19403
+ ps = spawn(file, args, options);
19502
19404
  ps.on("error", resume);
19503
19405
  ps.on("exit", resume);
19504
19406
  return ps;
@@ -103798,7 +103700,7 @@ var exports_dev = {};
103798
103700
  __export(exports_dev, {
103799
103701
  default: () => dev
103800
103702
  });
103801
- import { spawn as spawn2 } from "node:child_process";
103703
+ import { spawn } from "node:child_process";
103802
103704
  import { existsSync as existsSync6 } from "node:fs";
103803
103705
  import { join as join11 } from "node:path";
103804
103706
  function getRerouteCommand() {
@@ -103845,7 +103747,7 @@ async function waitForInitialBuild(genProcess) {
103845
103747
  return outputBuffer;
103846
103748
  }
103847
103749
  async function startServerProcess(genProcess, port) {
103848
- const serverProcess = spawn2("bun", ["--watch", "src/index.ts"], {
103750
+ const serverProcess = spawn("bun", ["--watch", "src/index.ts"], {
103849
103751
  stdio: ["ignore", "pipe", "pipe"],
103850
103752
  env: {
103851
103753
  ...process.env,
@@ -103932,7 +103834,7 @@ async function dev(args) {
103932
103834
  const useShell = rerouteCmd.includes(" ");
103933
103835
  const genCommand = useShell ? `${rerouteCmd} gen --watch` : rerouteCmd;
103934
103836
  const genArgs = useShell ? [] : ["gen", "--watch"];
103935
- const genProcess = spawn2(genCommand, genArgs, {
103837
+ const genProcess = spawn(genCommand, genArgs, {
103936
103838
  stdio: ["ignore", "pipe", "pipe"],
103937
103839
  shell: useShell
103938
103840
  });
@@ -103966,7 +103868,7 @@ var exports_start = {};
103966
103868
  __export(exports_start, {
103967
103869
  default: () => start
103968
103870
  });
103969
- import { spawn as spawn3 } from "node:child_process";
103871
+ import { spawn as spawn2 } from "node:child_process";
103970
103872
  import { existsSync as existsSync7 } from "node:fs";
103971
103873
  import { join as join12 } from "node:path";
103972
103874
  function getRerouteCommand2() {
@@ -104021,7 +103923,7 @@ async function start(args) {
104021
103923
  const genCommand = useShell ? `${rerouteCmd} gen ${genArgs.join(" ")}` : rerouteCmd;
104022
103924
  const genArgsWithCmd = useShell ? [] : ["gen", ...genArgs];
104023
103925
  await new Promise((resolve2, reject) => {
104024
- const genProcess = spawn3(genCommand, genArgsWithCmd, {
103926
+ const genProcess = spawn2(genCommand, genArgsWithCmd, {
104025
103927
  stdio: ["ignore", "pipe", "pipe"],
104026
103928
  shell: useShell
104027
103929
  });
@@ -104042,7 +103944,7 @@ async function start(args) {
104042
103944
  `));
104043
103945
  process.stdout.write(`${colorizeLogPrefixAnsi("[reroute/start] Starting server...")}
104044
103946
  `);
104045
- const serverProcess = spawn3("bun", ["src/index.ts"], {
103947
+ const serverProcess = spawn2("bun", ["src/index.ts"], {
104046
103948
  stdio: ["ignore", "pipe", "pipe"],
104047
103949
  env: {
104048
103950
  ...process.env,
@@ -104139,8 +104041,8 @@ var exports_build = {};
104139
104041
  __export(exports_build, {
104140
104042
  default: () => build
104141
104043
  });
104142
- import { spawn as spawn4 } from "node:child_process";
104143
- import { existsSync as existsSync9, readFileSync as readFileSync5, rmSync, unlinkSync } from "node:fs";
104044
+ import { spawn as spawn3 } from "node:child_process";
104045
+ import { existsSync as existsSync9, readFileSync as readFileSync4, rmSync, unlinkSync } from "node:fs";
104144
104046
  import { join as join14 } from "node:path";
104145
104047
  function getRerouteCommand3() {
104146
104048
  const binPath = join14(import.meta.dir, "..", "..", "bin.ts");
@@ -104167,7 +104069,7 @@ function getOutputName() {
104167
104069
  const packageJsonPath = join14(cwd, "package.json");
104168
104070
  if (existsSync9(packageJsonPath)) {
104169
104071
  try {
104170
- const packageJson = JSON.parse(readFileSync5(packageJsonPath, "utf-8"));
104072
+ const packageJson = JSON.parse(readFileSync4(packageJsonPath, "utf-8"));
104171
104073
  const name = packageJson.name;
104172
104074
  if (name) {
104173
104075
  const parts = name.split("-");
@@ -104236,7 +104138,7 @@ async function runGenCommand(rerouteCmd, useShell, noCompression) {
104236
104138
  const genBuffer = { current: "" };
104237
104139
  const handleGenOutput = createOutputHandler(genBuffer);
104238
104140
  await new Promise((resolve2, reject) => {
104239
- const genProcess = spawn4(genCommand, genArgs, {
104141
+ const genProcess = spawn3(genCommand, genArgs, {
104240
104142
  stdio: ["ignore", "pipe", "pipe"],
104241
104143
  shell: useShell
104242
104144
  });
@@ -104259,8 +104161,8 @@ async function runGenCommand(rerouteCmd, useShell, noCompression) {
104259
104161
  async function copyAssets(cwd) {
104260
104162
  const config2 = await loadConfig(cwd);
104261
104163
  const appSrc = config2.app?.src ?? "./src/client/App";
104262
- const dirname6 = __require("node:path").dirname;
104263
- const assetsPath = dirname6(appSrc);
104164
+ const dirname7 = __require("node:path").dirname;
104165
+ const assetsPath = dirname7(appSrc);
104264
104166
  const sourceAssetsDir = join14(cwd, assetsPath, "assets");
104265
104167
  const rerouteAssetsDir = join14(cwd, ".reroute", "assets");
104266
104168
  process.stdout.write(colorizeLogPrefixAnsi(`[reroute/build] Copying assets...
@@ -106440,14 +106342,14 @@ async function analyze(args) {
106440
106342
  if (!existsSync11(rerouteIndexPath)) {
106441
106343
  console.log(colorizeLogPrefixAnsi(`[reroute/analyze] .reroute artifacts not found, running build...
106442
106344
  `));
106443
- const { spawn: spawn5 } = await import("node:child_process");
106345
+ const { spawn: spawn4 } = await import("node:child_process");
106444
106346
  const { getRerouteCommand: getRerouteCommand5 } = await Promise.resolve().then(() => (init_command(), exports_command));
106445
106347
  const rerouteCmd = getRerouteCommand5();
106446
106348
  const useShell = rerouteCmd.includes(" ");
106447
106349
  const buildCommand = useShell ? `${rerouteCmd} build` : rerouteCmd;
106448
106350
  const buildArgs = useShell ? [] : ["build"];
106449
106351
  await new Promise((resolve2, reject) => {
106450
- const buildProcess = spawn5(buildCommand, buildArgs, {
106352
+ const buildProcess = spawn4(buildCommand, buildArgs, {
106451
106353
  stdio: "inherit",
106452
106354
  shell: useShell
106453
106355
  });
@@ -106503,9 +106405,9 @@ async function analyze(args) {
106503
106405
  if (existsSync11(srcEntry)) {
106504
106406
  console.log(colorizeLogPrefixAnsi(`[reroute/analyze] Building server binary for analysis...
106505
106407
  `));
106506
- const { mkdir: mkdir3 } = await import("node:fs/promises");
106408
+ const { mkdir: mkdir4 } = await import("node:fs/promises");
106507
106409
  const serverAnalysisDir = join16(cwd, ".reroute", "server");
106508
- await mkdir3(serverAnalysisDir, { recursive: true });
106410
+ await mkdir4(serverAnalysisDir, { recursive: true });
106509
106411
  const result = await Bun.build({
106510
106412
  entrypoints: [srcEntry],
106511
106413
  target: "bun",
@@ -106580,14 +106482,14 @@ async function analyze(args) {
106580
106482
  if (outputHtml || openBrowser) {
106581
106483
  const htmlPath = join16(cwd, ".reroute", "analysis.html");
106582
106484
  const html2 = await generateHTMLReport(stats, depTree, mainInfo, browserDepTree, browserInfo, initialSearch);
106583
- const { mkdir: mkdir3 } = await import("node:fs/promises");
106584
- await mkdir3(join16(cwd, ".reroute"), { recursive: true });
106485
+ const { mkdir: mkdir4 } = await import("node:fs/promises");
106486
+ await mkdir4(join16(cwd, ".reroute"), { recursive: true });
106585
106487
  await writeFile(htmlPath, html2, "utf-8");
106586
106488
  console.log(colorizeLogPrefixAnsi(`[reroute/analyze] HTML report generated: ${relative3(cwd, htmlPath)}
106587
106489
  `));
106588
106490
  if (openBrowser) {
106589
106491
  try {
106590
- const { spawn: spawn5 } = await import("node:child_process");
106492
+ const { spawn: spawn4 } = await import("node:child_process");
106591
106493
  const platform = process.platform;
106592
106494
  let command;
106593
106495
  let commandArgs;
@@ -106601,7 +106503,7 @@ async function analyze(args) {
106601
106503
  command = "xdg-open";
106602
106504
  commandArgs = [htmlPath];
106603
106505
  }
106604
- spawn5(command, commandArgs, { detached: true, stdio: "ignore" });
106506
+ spawn4(command, commandArgs, { detached: true, stdio: "ignore" });
106605
106507
  console.log(colorizeLogPrefixAnsi(`[reroute/analyze] Opened report in browser
106606
106508
  `));
106607
106509
  } catch {
@@ -106643,7 +106545,7 @@ var exports_og = {};
106643
106545
  __export(exports_og, {
106644
106546
  default: () => og2
106645
106547
  });
106646
- import { spawn as spawn5 } from "node:child_process";
106548
+ import { spawn as spawn4 } from "node:child_process";
106647
106549
  import { readdir as readdir9 } from "node:fs/promises";
106648
106550
  import { join as join17 } from "node:path";
106649
106551
  function getPortFromConfig(baseUrl) {
@@ -106658,7 +106560,7 @@ function getPortFromConfig(baseUrl) {
106658
106560
  }
106659
106561
  async function killProcessOnPort(port) {
106660
106562
  try {
106661
- const proc = spawn5("bunx", ["kill-port", String(port)], {
106563
+ const proc = spawn4("bunx", ["kill-port", String(port)], {
106662
106564
  stdio: "ignore"
106663
106565
  });
106664
106566
  await new Promise((resolve2) => {
@@ -106684,7 +106586,7 @@ async function ensureServer(cwd, port) {
106684
106586
  return { port, process: null, wasAlreadyRunning: true };
106685
106587
  }
106686
106588
  console.log(`\uD83D\uDE80 Starting dev server on port ${port}...`);
106687
- const proc = spawn5("reroute", ["dev"], {
106589
+ const proc = spawn4("reroute", ["dev"], {
106688
106590
  cwd,
106689
106591
  stdio: ["ignore", "pipe", "pipe"],
106690
106592
  detached: false
@@ -106783,7 +106685,7 @@ async function findRoutesWithOG(cwd) {
106783
106685
  function openInBrowser(url) {
106784
106686
  const platform = process.platform;
106785
106687
  const command = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
106786
- spawn5(command, [url], {
106688
+ spawn4(command, [url], {
106787
106689
  stdio: "ignore",
106788
106690
  detached: true
106789
106691
  }).unref();
@@ -107026,7 +106928,7 @@ async function getVersionString2() {
107026
106928
  }
107027
106929
  async function getVersion2() {
107028
106930
  if (true) {
107029
- return "0.46.0";
106931
+ return "1.0.0-alpha.1";
107030
106932
  }
107031
106933
  const possiblePaths = [
107032
106934
  path3.join(import.meta.dir, "../../../package.json"),
@@ -107043,10 +106945,10 @@ async function getVersion2() {
107043
106945
  }
107044
106946
  async function getCommit2() {
107045
106947
  if (true) {
107046
- return "9116acf";
106948
+ return "6889da1";
107047
106949
  }
107048
106950
  return "dev";
107049
106951
  }
107050
106952
  main();
107051
106953
 
107052
- //# debugId=0B12295AB270224764756E2164756E21
106954
+ //# debugId=E36304ED6CA0A40264756E2164756E21