@vezham/config 0.0.0-stage → 26.0.0-alpha.6

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 (173) hide show
  1. package/LICENSE +173 -0
  2. package/README.md +14 -2
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +0 -0
  6. package/dist/lib/deploy/cli.d.ts +3 -0
  7. package/dist/lib/deploy/cli.d.ts.map +1 -0
  8. package/dist/lib/deploy/cli.js +12 -0
  9. package/dist/lib/deploy/firebase.d.ts +3 -0
  10. package/dist/lib/deploy/firebase.d.ts.map +1 -0
  11. package/dist/lib/deploy/firebase.js +106 -0
  12. package/dist/lib/deploy/index.d.ts +4 -0
  13. package/dist/lib/deploy/index.d.ts.map +1 -0
  14. package/dist/lib/deploy/index.js +42 -0
  15. package/dist/lib/deploy/paths.d.ts +3 -0
  16. package/dist/lib/deploy/paths.d.ts.map +1 -0
  17. package/dist/lib/deploy/paths.js +6 -0
  18. package/dist/lib/deploy/presets.d.ts +5 -0
  19. package/dist/lib/deploy/presets.d.ts.map +1 -0
  20. package/dist/lib/deploy/presets.js +10 -0
  21. package/dist/lib/deploy/types.d.ts +97 -0
  22. package/dist/lib/deploy/types.d.ts.map +1 -0
  23. package/dist/lib/deploy/vercel.d.ts +3 -0
  24. package/dist/lib/deploy/vercel.d.ts.map +1 -0
  25. package/dist/lib/deploy/vercel.js +47 -0
  26. package/dist/lib/framework.d.ts +3 -0
  27. package/dist/lib/framework.d.ts.map +1 -0
  28. package/dist/lib/framework.js +7 -0
  29. package/dist/lib/i18n.d.ts +6 -0
  30. package/dist/lib/i18n.d.ts.map +1 -0
  31. package/dist/lib/i18n.js +11 -0
  32. package/dist/lib/integrations/next/index.d.ts +4 -0
  33. package/dist/lib/integrations/next/index.d.ts.map +1 -0
  34. package/dist/lib/integrations/next/index.js +29 -0
  35. package/dist/lib/integrations/playwright/index.d.ts +11 -0
  36. package/dist/lib/integrations/playwright/index.d.ts.map +1 -0
  37. package/dist/lib/integrations/playwright/index.js +77 -0
  38. package/dist/lib/integrations/playwright/test.d.ts +5 -0
  39. package/dist/lib/integrations/playwright/test.d.ts.map +1 -0
  40. package/dist/lib/integrations/playwright/test.js +23 -0
  41. package/dist/lib/integrations/vite/index.d.ts +12 -0
  42. package/dist/lib/integrations/vite/index.d.ts.map +1 -0
  43. package/dist/lib/integrations/vite/index.js +34 -0
  44. package/dist/lib/integrations/vite-lib/base.d.ts +3 -0
  45. package/dist/lib/integrations/vite-lib/base.d.ts.map +1 -0
  46. package/dist/lib/integrations/vite-lib/base.js +31 -0
  47. package/dist/lib/integrations/vite-lib/index.d.ts +3 -0
  48. package/dist/lib/integrations/vite-lib/index.d.ts.map +1 -0
  49. package/dist/lib/integrations/vite-lib/index.js +42 -0
  50. package/dist/lib/integrations/vite-lib/react.d.ts +3 -0
  51. package/dist/lib/integrations/vite-lib/react.d.ts.map +1 -0
  52. package/dist/lib/integrations/vite-lib/react.js +10 -0
  53. package/dist/lib/integrations/vitest/framework.d.ts +4 -0
  54. package/dist/lib/integrations/vitest/framework.d.ts.map +1 -0
  55. package/dist/lib/integrations/vitest/framework.js +5 -0
  56. package/dist/lib/integrations/vitest/frameworks/docs-plugins.d.ts +3 -0
  57. package/dist/lib/integrations/vitest/frameworks/docs-plugins.d.ts.map +1 -0
  58. package/dist/lib/integrations/vitest/frameworks/docs-plugins.js +27 -0
  59. package/dist/lib/integrations/vitest/frameworks/docs.d.ts +3 -0
  60. package/dist/lib/integrations/vitest/frameworks/docs.d.ts.map +1 -0
  61. package/dist/lib/integrations/vitest/frameworks/docs.js +5 -0
  62. package/dist/lib/integrations/vitest/frameworks/next.d.ts +3 -0
  63. package/dist/lib/integrations/vitest/frameworks/next.d.ts.map +1 -0
  64. package/dist/lib/integrations/vitest/frameworks/next.js +5 -0
  65. package/dist/lib/integrations/vitest/frameworks/react.d.ts +3 -0
  66. package/dist/lib/integrations/vitest/frameworks/react.d.ts.map +1 -0
  67. package/dist/lib/integrations/vitest/frameworks/react.js +5 -0
  68. package/dist/lib/integrations/vitest/index.d.ts +4 -0
  69. package/dist/lib/integrations/vitest/index.d.ts.map +1 -0
  70. package/dist/lib/integrations/vitest/index.js +4 -0
  71. package/dist/lib/integrations/vitest/setup/next.d.ts +2 -0
  72. package/dist/lib/integrations/vitest/setup/next.d.ts.map +1 -0
  73. package/dist/lib/integrations/vitest/setup/next.js +11 -0
  74. package/dist/lib/integrations/vitest/setup/react.d.ts +2 -0
  75. package/dist/lib/integrations/vitest/setup/react.d.ts.map +1 -0
  76. package/dist/lib/integrations/vitest/setup/react.js +36 -0
  77. package/dist/lib/integrations/vitest/shared.d.ts +3 -0
  78. package/dist/lib/integrations/vitest/shared.d.ts.map +1 -0
  79. package/dist/lib/integrations/vitest/shared.js +24 -0
  80. package/dist/lib/metadata/cli.d.ts +3 -0
  81. package/dist/lib/metadata/cli.d.ts.map +1 -0
  82. package/dist/lib/metadata/cli.js +13 -0
  83. package/dist/lib/metadata/env.d.ts +9 -0
  84. package/dist/lib/metadata/env.d.ts.map +1 -0
  85. package/dist/lib/metadata/env.js +36 -0
  86. package/dist/lib/metadata/html.d.ts +3 -0
  87. package/dist/lib/metadata/html.d.ts.map +1 -0
  88. package/dist/lib/metadata/html.js +96 -0
  89. package/dist/lib/metadata/index.d.ts +7 -0
  90. package/dist/lib/metadata/index.d.ts.map +1 -0
  91. package/dist/lib/metadata/index.js +61 -0
  92. package/dist/lib/metadata/next.d.ts +79 -0
  93. package/dist/lib/metadata/next.d.ts.map +1 -0
  94. package/dist/lib/metadata/next.js +106 -0
  95. package/dist/lib/metadata/public.d.ts +3 -0
  96. package/dist/lib/metadata/public.d.ts.map +1 -0
  97. package/dist/lib/metadata/public.js +107 -0
  98. package/dist/lib/metadata/render.d.ts +7 -0
  99. package/dist/lib/metadata/render.d.ts.map +1 -0
  100. package/dist/lib/metadata/render.js +37 -0
  101. package/dist/lib/metadata/runtime.d.ts +68 -0
  102. package/dist/lib/metadata/runtime.d.ts.map +1 -0
  103. package/dist/lib/metadata/runtime.js +134 -0
  104. package/dist/lib/metadata/tanstack.d.ts +71 -0
  105. package/dist/lib/metadata/tanstack.d.ts.map +1 -0
  106. package/dist/lib/metadata/tanstack.js +194 -0
  107. package/dist/lib/metadata/templates/not-found.html +224 -0
  108. package/dist/lib/metadata/templates/offline.html +210 -0
  109. package/dist/lib/metadata/types.d.ts +118 -0
  110. package/dist/lib/metadata/types.d.ts.map +1 -0
  111. package/dist/lib/navigation/app-menu.d.ts +2 -0
  112. package/dist/lib/navigation/app-menu.d.ts.map +1 -0
  113. package/dist/lib/navigation/app-menu.js +45 -0
  114. package/dist/lib/navigation/control-center.d.ts +2 -0
  115. package/dist/lib/navigation/control-center.d.ts.map +1 -0
  116. package/dist/lib/navigation/control-center.js +66 -0
  117. package/dist/lib/navigation/index.d.ts +5 -0
  118. package/dist/lib/navigation/index.d.ts.map +1 -0
  119. package/dist/lib/navigation/index.js +59 -0
  120. package/dist/lib/navigation/toolbar.d.ts +2 -0
  121. package/dist/lib/navigation/toolbar.d.ts.map +1 -0
  122. package/dist/lib/navigation/toolbar.js +78 -0
  123. package/dist/lib/presets/app/index.d.ts +21 -0
  124. package/dist/lib/presets/app/index.d.ts.map +1 -0
  125. package/dist/lib/presets/app/index.js +114 -0
  126. package/dist/lib/presets/cdn/index.d.ts +2 -0
  127. package/dist/lib/presets/cdn/index.d.ts.map +1 -0
  128. package/dist/lib/presets/cdn/index.js +2 -0
  129. package/dist/lib/presets/docs/cli.d.ts +3 -0
  130. package/dist/lib/presets/docs/cli.d.ts.map +1 -0
  131. package/dist/lib/presets/docs/cli.js +18 -0
  132. package/dist/lib/presets/docs/config.d.ts +40 -0
  133. package/dist/lib/presets/docs/config.d.ts.map +1 -0
  134. package/dist/lib/presets/docs/config.js +39 -0
  135. package/dist/lib/presets/docs/files.d.ts +2 -0
  136. package/dist/lib/presets/docs/files.d.ts.map +1 -0
  137. package/dist/lib/presets/docs/files.js +13 -0
  138. package/dist/lib/presets/docs/index.d.ts +7 -0
  139. package/dist/lib/presets/docs/index.d.ts.map +1 -0
  140. package/dist/lib/presets/docs/index.js +6 -0
  141. package/dist/lib/presets/docs/mdx-path.d.ts +7 -0
  142. package/dist/lib/presets/docs/mdx-path.d.ts.map +1 -0
  143. package/dist/lib/presets/docs/mdx-path.js +19 -0
  144. package/dist/lib/presets/docs/og-image.d.ts +9 -0
  145. package/dist/lib/presets/docs/og-image.d.ts.map +1 -0
  146. package/dist/lib/presets/docs/og-image.js +88 -0
  147. package/dist/lib/presets/docs/og-output.d.ts +5 -0
  148. package/dist/lib/presets/docs/og-output.d.ts.map +1 -0
  149. package/dist/lib/presets/docs/og-output.js +34 -0
  150. package/dist/lib/presets/docs/og.d.ts +9 -0
  151. package/dist/lib/presets/docs/og.d.ts.map +1 -0
  152. package/dist/lib/presets/docs/og.js +112 -0
  153. package/dist/lib/presets/docs/openapi.d.ts +3 -0
  154. package/dist/lib/presets/docs/openapi.d.ts.map +1 -0
  155. package/dist/lib/presets/docs/openapi.js +105 -0
  156. package/dist/lib/presets/docs/routes.d.ts +7 -0
  157. package/dist/lib/presets/docs/routes.d.ts.map +1 -0
  158. package/dist/lib/presets/docs/routes.js +109 -0
  159. package/dist/lib/presets/docs/types.d.ts +31 -0
  160. package/dist/lib/presets/docs/types.d.ts.map +1 -0
  161. package/dist/lib/presets/docs/vite.d.ts +11 -0
  162. package/dist/lib/presets/docs/vite.d.ts.map +1 -0
  163. package/dist/lib/presets/docs/vite.js +78 -0
  164. package/dist/lib/presets/files.d.ts +5 -0
  165. package/dist/lib/presets/files.d.ts.map +1 -0
  166. package/dist/lib/presets/files.js +21 -0
  167. package/dist/lib/presets/route-files.d.ts +22 -0
  168. package/dist/lib/presets/route-files.d.ts.map +1 -0
  169. package/dist/lib/presets/route-files.js +49 -0
  170. package/dist/lib/yaml-config.d.ts +2 -0
  171. package/dist/lib/yaml-config.d.ts.map +1 -0
  172. package/dist/lib/yaml-config.js +6 -0
  173. package/package.json +119 -3
@@ -0,0 +1,114 @@
1
+ import { createViteConfig, getViteConfig } from "../../integrations/vite/index.js";
2
+ import { readYamlConfig } from "../../yaml-config.js";
3
+ import { unique, walkFiles } from "../files.js";
4
+ import { expandFilesystemRoute, normalizeRoute, routePathFromFile, routeRootFromGlob } from "../route-files.js";
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { mergeConfig } from "vite";
8
+ import { createRequire } from "node:module";
9
+ //#region src/lib/presets/app/index.ts
10
+ var trimTrailingWildcard = (value) => value.endsWith("/*") ? value.slice(0, -2) : value;
11
+ var getTsConfigPathAliases = (projectRoot = process.cwd()) => {
12
+ const tsconfigFile = path.resolve(projectRoot, "tsconfig.app.json");
13
+ if (!fs.existsSync(tsconfigFile)) return {};
14
+ try {
15
+ const paths = JSON.parse(fs.readFileSync(tsconfigFile, "utf8")).compilerOptions?.paths ?? {};
16
+ return Object.fromEntries(Object.entries(paths).map(([alias, values]) => {
17
+ const value = values[0];
18
+ if (!value) return null;
19
+ return [trimTrailingWildcard(alias), path.resolve(projectRoot, trimTrailingWildcard(value))];
20
+ }).filter((entry) => entry !== null));
21
+ } catch {
22
+ return {};
23
+ }
24
+ };
25
+ var getServerConfig = () => {
26
+ const { env } = process;
27
+ const hostname = env.CI ? "localhost" : env.HOST_NAME || "localhost";
28
+ return {
29
+ port: Number(env.PORT),
30
+ host: hostname
31
+ };
32
+ };
33
+ var getPreviewConfig = () => {
34
+ const { env } = process;
35
+ const hostname = env.CI ? "localhost" : env.HOST_NAME || "localhost";
36
+ const configuredPort = Number(env.PRE_PORT) || Number(env.PORT);
37
+ return {
38
+ port: env.TSS_PRERENDERING === "true" ? 0 : configuredPort || void 0,
39
+ host: hostname
40
+ };
41
+ };
42
+ var getReactPackageDir = (projectRoot = process.cwd()) => {
43
+ const requireFromProject = createRequire(path.join(projectRoot, "package.json"));
44
+ return path.dirname(requireFromProject.resolve("react/package.json"));
45
+ };
46
+ var getViteDefaults = (projectRoot = process.cwd()) => ({
47
+ ...getViteConfig(projectRoot),
48
+ envPrefix: ["V_"],
49
+ server: getServerConfig(),
50
+ resolve: {
51
+ alias: getTsConfigPathAliases(projectRoot),
52
+ tsconfigPaths: true
53
+ },
54
+ build: {
55
+ outDir: "./dist",
56
+ emptyOutDir: true,
57
+ reportCompressedSize: true,
58
+ commonjsOptions: { transformMixedEsModules: true }
59
+ }
60
+ });
61
+ var getPreviewOverride = (env) => ({ preview: process.env.TSS_PRERENDERING === "true" ? {
62
+ host: "localhost",
63
+ port: 0
64
+ } : env.command === "build" ? void 0 : getPreviewConfig() });
65
+ var getResolveOverride = (env, projectRoot = process.cwd()) => ({ resolve: {
66
+ dedupe: ["react", "react-dom"],
67
+ alias: env.command === "build" ? { "react/jsx-dev-runtime": path.join(getReactPackageDir(projectRoot), "cjs/react-jsx-dev-runtime.development.js") } : void 0
68
+ } });
69
+ var defineConfig = (overrides = {}) => createViteConfig((projectRoot, env) => mergeConfig(mergeConfig(getViteDefaults(projectRoot), getPreviewOverride(env)), getResolveOverride(env, projectRoot)), overrides);
70
+ var uniquePrerenderPages = (pages) => {
71
+ return [...new Map(pages.map((page) => [page.path, page])).values()];
72
+ };
73
+ var appRouteFileOptions = {
74
+ emptyRoutePath: "/",
75
+ rootRouteSegments: new Set(["__root", "__root__"]),
76
+ stripLazySuffix: true
77
+ };
78
+ var getStaticPageRoutes = (projectRoot) => {
79
+ const routesDir = path.join(projectRoot, "src/routes");
80
+ return unique(walkFiles(routesDir).filter((filePath) => [".jsx", ".tsx"].includes(path.extname(filePath))).map((filePath) => routePathFromFile(routesDir, filePath, appRouteFileOptions)).filter((routePath) => routePath !== void 0).filter((routePath) => !routePath.startsWith("/api/")).sort((left, right) => left.localeCompare(right)));
81
+ };
82
+ var createPrerenderPage = (route) => {
83
+ if (typeof route.prerender === "object" && route.prerender.outputPath) return {
84
+ path: route.path,
85
+ prerender: { outputPath: route.prerender.outputPath }
86
+ };
87
+ const shouldWriteIndex = route.path !== "/" && path.extname(route.path) === "" && !route.path.startsWith("/api/");
88
+ return {
89
+ path: route.path,
90
+ prerender: shouldWriteIndex ? { outputPath: `${route.path}/index.html` } : void 0
91
+ };
92
+ };
93
+ var createFilesystemRoutePrerenderPages = (projectRoot, route) => {
94
+ return expandFilesystemRoute(projectRoot, route, appRouteFileOptions).map((pagePath) => createPrerenderPage({
95
+ ...route,
96
+ path: pagePath
97
+ }));
98
+ };
99
+ var assertSupportedRoute = (route) => {
100
+ if (!routeRootFromGlob(route.path) || route.source === "routes") return;
101
+ throw new Error(`Unsupported route source "${route.source ?? "none"}" for glob route "${route.path}". Use source "routes" or provide an exact path.`);
102
+ };
103
+ var getPrerenderPages = (projectRoot = process.cwd(), { routes: extraRoutes = [] } = {}) => {
104
+ const routeEntries = [...readYamlConfig(path.join(projectRoot, "vx.app.yaml")).routes ?? [], ...extraRoutes].map(normalizeRoute);
105
+ for (const route of routeEntries) assertSupportedRoute(route);
106
+ return uniquePrerenderPages([
107
+ createPrerenderPage({ path: "/" }),
108
+ ...getStaticPageRoutes(projectRoot).map((pagePath) => createPrerenderPage({ path: pagePath })),
109
+ ...routeEntries.flatMap((route) => route.prerender === false ? [] : createFilesystemRoutePrerenderPages(projectRoot, route)),
110
+ ...routeEntries.filter((route) => !routeRootFromGlob(route.path)).filter((route) => route.prerender !== false).map(createPrerenderPage)
111
+ ]);
112
+ };
113
+ //#endregion
114
+ export { defineConfig, getPrerenderPages };
@@ -0,0 +1,2 @@
1
+ export { defineConfig } from '../app';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/cdn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { defineConfig } from "../app/index.js";
2
+ export { defineConfig };
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { loadVxDocsConfig } from "./config.js";
3
+ import { generateDocs } from "./openapi.js";
4
+ import { generateDocsOgImages } from "./og.js";
5
+ //#region src/lib/presets/docs/cli.ts
6
+ var [, , command = "generate", projectRoot = process.cwd()] = process.argv;
7
+ var { docs, i18n, routes } = loadVxDocsConfig(projectRoot);
8
+ if (command === "generate" || command === "content") {
9
+ const count = await generateDocs(projectRoot, docs, i18n);
10
+ console.log(`Generated documentation for ${count} OpenAPI specifications`);
11
+ } else if (command === "og") {
12
+ const count = await generateDocsOgImages(projectRoot, docs, i18n, { routes });
13
+ console.log(`Generated ${count} OG images for ${projectRoot}`);
14
+ } else {
15
+ console.error(`Unknown docs command "${command}". Use "generate", "content", or "og".`);
16
+ process.exitCode = 1;
17
+ }
18
+ //#endregion
@@ -0,0 +1,40 @@
1
+ import { type I18nConfig } from '../../i18n';
2
+ import { type RouteInput } from './types';
3
+ export type { I18nConfig } from '../../i18n';
4
+ export type OgConfig = {
5
+ logo?: string;
6
+ site?: string;
7
+ theme?: 'dark' | 'light';
8
+ };
9
+ export type DocsConfig = {
10
+ docsRoute?: string;
11
+ og?: OgConfig;
12
+ };
13
+ export type VxDocsConfig = {
14
+ docs?: DocsConfig;
15
+ i18n?: I18nConfig;
16
+ og?: OgConfig;
17
+ routes?: RouteInput[];
18
+ };
19
+ export declare const resolveDocsConfig: (config?: DocsConfig) => {
20
+ docsDir: string;
21
+ docsRoute: string;
22
+ docsImageRoute: string;
23
+ openapiDir: string;
24
+ ogOutputDir: string;
25
+ };
26
+ export declare const loadVxDocsConfig: (projectRoot?: string) => {
27
+ config: VxDocsConfig;
28
+ configFile: string;
29
+ docs: {
30
+ og: {
31
+ logo?: string;
32
+ site?: string;
33
+ theme?: "dark" | "light";
34
+ };
35
+ docsRoute?: string;
36
+ };
37
+ i18n: I18nConfig;
38
+ routes: RouteInput[];
39
+ };
40
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,YAAY,CAAA;AAEzD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,EAAE,CAAC,EAAE,QAAQ,CAAA;CACd,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,EAAE,CAAC,EAAE,QAAQ,CAAA;IACb,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;CACtB,CAAA;AAYD,eAAO,MAAM,iBAAiB,GAAI,SAAQ,UAAe;;;;;;CAUxD,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,oBAA2B;;;;;mBAvCnD,MAAM;mBACN,MAAM;oBACL,MAAM,GAAG,OAAO;;oBAIZ,MAAM;;;;CAkDnB,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { readYamlConfig } from "../../yaml-config.js";
2
+ import { resolveI18n } from "../../i18n.js";
3
+ import path from "node:path";
4
+ //#region src/lib/presets/docs/config.ts
5
+ var defaultContentDir = "content/docs";
6
+ var defaultDocsRoute = "/docs";
7
+ var defaultOpenApiDir = "openapi";
8
+ var docsImageRoute = (docsRoute) => {
9
+ return `/og${docsRoute}`;
10
+ };
11
+ var resolveDocsConfig = (config = {}) => {
12
+ const docsRoute = config.docsRoute ?? defaultDocsRoute;
13
+ return {
14
+ docsDir: defaultContentDir,
15
+ docsRoute,
16
+ docsImageRoute: docsImageRoute(docsRoute),
17
+ openapiDir: defaultOpenApiDir,
18
+ ogOutputDir: `public${docsImageRoute(docsRoute)}`
19
+ };
20
+ };
21
+ var loadVxDocsConfig = (projectRoot = process.cwd()) => {
22
+ const configFile = path.join(projectRoot, "vx.app.yaml");
23
+ const config = readYamlConfig(configFile);
24
+ return {
25
+ config,
26
+ configFile,
27
+ docs: {
28
+ ...config.docs,
29
+ og: {
30
+ ...config.og,
31
+ ...config.docs?.og
32
+ }
33
+ },
34
+ i18n: resolveI18n(config.i18n),
35
+ routes: config.routes ?? []
36
+ };
37
+ };
38
+ //#endregion
39
+ export { loadVxDocsConfig, resolveDocsConfig };
@@ -0,0 +1,2 @@
1
+ export declare const generatedDirectories: (dir: string) => string[];
2
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/files.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,KAAG,MAAM,EAgBxD,CAAA"}
@@ -0,0 +1,13 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ //#region src/lib/presets/docs/files.ts
4
+ var generatedDirectories = (dir) => {
5
+ if (!fs.existsSync(dir)) return [];
6
+ return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
7
+ if (!entry.isDirectory()) return [];
8
+ const entryPath = path.join(dir, entry.name);
9
+ return entry.name === "(generated)" ? [entryPath] : generatedDirectories(entryPath);
10
+ });
11
+ };
12
+ //#endregion
13
+ export { generatedDirectories };
@@ -0,0 +1,7 @@
1
+ export { type DocsMdxMacroImportAliasOptions, type DocsMdxOptions, docsMdx, docsMdxMacroImportAlias, defineConfig } from './vite';
2
+ export { type OgConfig, type DocsConfig, type I18nConfig, type VxDocsConfig, resolveDocsConfig, loadVxDocsConfig } from './config';
3
+ export { generateDocs } from './openapi';
4
+ export { generateDocsOgImages } from './og';
5
+ export { type DocsStaticPaths, type DocsPrerenderPage, type RouteOg, type RouteConfig, type RouteInput, type DocsPrerenderPagesOptions } from './types';
6
+ export { getDocsStaticPaths, getDocsPrerenderPages, getPrerenderPages } from './routes';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,cAAc,EACnB,OAAO,EACP,uBAAuB,EACvB,YAAY,EACb,MAAM,QAAQ,CAAA;AACf,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,yBAAyB,EAC/B,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { defineConfig, docsMdx, docsMdxMacroImportAlias } from "./vite.js";
2
+ import { loadVxDocsConfig, resolveDocsConfig } from "./config.js";
3
+ import { generateDocs } from "./openapi.js";
4
+ import { getDocsPrerenderPages, getDocsStaticPaths, getPrerenderPages } from "./routes.js";
5
+ import { generateDocsOgImages } from "./og.js";
6
+ export { defineConfig, docsMdx, docsMdxMacroImportAlias, generateDocs, generateDocsOgImages, getDocsPrerenderPages, getDocsStaticPaths, getPrerenderPages, loadVxDocsConfig, resolveDocsConfig };
@@ -0,0 +1,7 @@
1
+ import type { I18nConfig } from './config';
2
+ export declare const docsPathFromMdx: (docsDir: string, docsRoute: string, i18n: I18nConfig, filePath: string) => {
3
+ locale: string;
4
+ markdownPath: string;
5
+ routePath: string;
6
+ } | undefined;
7
+ //# sourceMappingURL=mdx-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx-path.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/mdx-path.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,EACf,WAAW,MAAM,EACjB,MAAM,UAAU,EAChB,UAAU,MAAM;;;;aA0BjB,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { slash } from "../files.js";
2
+ import path from "node:path";
3
+ //#region src/lib/presets/docs/mdx-path.ts
4
+ var docsPathFromMdx = (docsDir, docsRoute, i18n, filePath) => {
5
+ const relativePath = slash(path.relative(docsDir, filePath));
6
+ if (!relativePath.endsWith(".mdx")) return;
7
+ const localizedLanguage = i18n.languages.find((lang) => lang !== i18n.defaultLanguage && relativePath.endsWith(`.${lang}.mdx`));
8
+ const suffix = localizedLanguage ? `.${localizedLanguage}.mdx` : ".mdx";
9
+ const segments = relativePath.slice(0, -suffix.length).split("/").filter((segment) => !(segment.startsWith("(") && segment.endsWith(")")));
10
+ if (segments[segments.length - 1] === "index") segments.pop();
11
+ const routePath = segments.length ? `${docsRoute}/${segments.join("/")}` : docsRoute;
12
+ return {
13
+ locale: localizedLanguage ?? i18n.defaultLanguage,
14
+ markdownPath: segments.length ? `${routePath}.md` : `${docsRoute}/index.md`,
15
+ routePath
16
+ };
17
+ };
18
+ //#endregion
19
+ export { docsPathFromMdx };
@@ -0,0 +1,9 @@
1
+ export type OgImageProps = {
2
+ title: string;
3
+ description?: string;
4
+ site?: string;
5
+ logo?: string;
6
+ theme?: 'dark' | 'light';
7
+ };
8
+ export declare const OgImage: ({ title, description, site, logo, theme }: OgImageProps) => import("react").JSX.Element;
9
+ //# sourceMappingURL=og-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og-image.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/og-image.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB,CAAA;AAGD,eAAO,MAAM,OAAO,GAAI,2CAMrB,YAAY,gCA6Fd,CAAA"}
@@ -0,0 +1,88 @@
1
+ import { renderToStaticMarkup } from "react-dom/server";
2
+ import { VezhamLogo } from "@vezham/icons-react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/lib/presets/docs/og-image.tsx
5
+ /** @jsxRuntime automatic */
6
+ /** @jsxImportSource react */
7
+ var OgImage = ({ title, description, site = "Vezham", logo, theme = "light" }) => {
8
+ const colors = theme === "dark" ? {
9
+ background: "#18181b",
10
+ foreground: "#fafafa",
11
+ muted: "#a1a1aa"
12
+ } : {
13
+ background: "#f5f5f5",
14
+ foreground: "#18181b",
15
+ muted: "#71717a"
16
+ };
17
+ return /* @__PURE__ */ jsxs("div", {
18
+ style: {
19
+ display: "flex",
20
+ flexDirection: "column",
21
+ width: "100%",
22
+ height: "100%",
23
+ color: colors.foreground,
24
+ padding: 64,
25
+ backgroundColor: colors.background
26
+ },
27
+ children: [
28
+ /* @__PURE__ */ jsx("p", {
29
+ style: {
30
+ fontFamily: "Inter",
31
+ fontWeight: 700,
32
+ fontSize: 76,
33
+ lineHeight: 1.1,
34
+ margin: 0,
35
+ lineClamp: 2
36
+ },
37
+ children: title
38
+ }),
39
+ description && /* @__PURE__ */ jsx("p", {
40
+ style: {
41
+ fontFamily: "Inter",
42
+ fontSize: 34,
43
+ lineHeight: 1.4,
44
+ color: colors.muted,
45
+ margin: 0,
46
+ marginTop: 24,
47
+ lineClamp: 3
48
+ },
49
+ children: description
50
+ }),
51
+ /* @__PURE__ */ jsxs("div", {
52
+ style: {
53
+ display: "flex",
54
+ alignItems: "center",
55
+ gap: 12,
56
+ marginTop: "auto",
57
+ paddingTop: 24,
58
+ color: colors.foreground
59
+ },
60
+ children: [logo ? /* @__PURE__ */ jsx("img", {
61
+ alt: "",
62
+ width: 48,
63
+ height: 48,
64
+ src: logo,
65
+ style: { objectFit: "contain" }
66
+ }) : /* @__PURE__ */ jsx("img", {
67
+ alt: "Vezham",
68
+ width: 48,
69
+ height: 48,
70
+ src: `data:image/svg+xml;base64,${Buffer.from(renderToStaticMarkup(/* @__PURE__ */ jsx(VezhamLogo, {
71
+ size: 48,
72
+ color: colors.foreground
73
+ }))).toString("base64")}`
74
+ }), site && /* @__PURE__ */ jsx("p", {
75
+ style: {
76
+ fontFamily: "Jura",
77
+ fontSize: 36,
78
+ fontWeight: 600,
79
+ margin: 0
80
+ },
81
+ children: site
82
+ })]
83
+ })
84
+ ]
85
+ });
86
+ };
87
+ //#endregion
88
+ export { OgImage };
@@ -0,0 +1,5 @@
1
+ export declare const createOgOutput: (projectRoot: string) => {
2
+ add(files: string[], image: Buffer): void;
3
+ finish(): void;
4
+ };
5
+ //# sourceMappingURL=og-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og-output.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/og-output.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,GAAI,aAAa,MAAM;eAgCnC,MAAM,EAAE,SAAS,MAAM;;CAsBrC,CAAA"}
@@ -0,0 +1,34 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ //#region src/lib/presets/docs/og-output.ts
4
+ var createOgOutput = (projectRoot) => {
5
+ const root = path.resolve(projectRoot, "public/og");
6
+ const manifest = path.join(root, ".vx-generated.json");
7
+ const previous = fs.existsSync(manifest) ? JSON.parse(fs.readFileSync(manifest, "utf8")) : [];
8
+ const resolveFile = (file) => {
9
+ const resolved = path.resolve(root, file);
10
+ const relative = path.relative(root, resolved);
11
+ if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative) || path.extname(resolved) !== ".png") throw new Error(`Invalid generated OG image path: ${file}`);
12
+ return resolved;
13
+ };
14
+ if (!Array.isArray(previous) || !previous.every((file) => typeof file === "string")) throw new Error(`Invalid OG output manifest: ${manifest}`);
15
+ const previousFiles = previous.map(resolveFile);
16
+ const generated = /* @__PURE__ */ new Map();
17
+ return {
18
+ add(files, image) {
19
+ const resolvedFiles = files.map(resolveFile);
20
+ for (const file of resolvedFiles) generated.set(file, image);
21
+ },
22
+ finish() {
23
+ for (const [file, image] of generated) {
24
+ fs.mkdirSync(path.dirname(file), { recursive: true });
25
+ fs.writeFileSync(file, image);
26
+ }
27
+ for (const file of previousFiles) if (!generated.has(file)) fs.rmSync(file, { force: true });
28
+ fs.mkdirSync(root, { recursive: true });
29
+ fs.writeFileSync(manifest, `${JSON.stringify([...generated.keys()].map((file) => path.relative(root, file).split(path.sep).join("/")).sort(), null, 2)}\n`);
30
+ }
31
+ };
32
+ };
33
+ //#endregion
34
+ export { createOgOutput };
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from 'react';
2
+ import { type DocsConfig, type I18nConfig } from './config';
3
+ import type { OgImageProps } from './og-image';
4
+ import { type RouteInput } from './types';
5
+ export declare const generateDocsOgImages: (projectRoot: string, config: DocsConfig, i18n: I18nConfig, { routes, renderImage }?: {
6
+ routes?: RouteInput[];
7
+ renderImage?: (props: OgImageProps) => ReactElement;
8
+ }) => Promise<number>;
9
+ //# sourceMappingURL=og.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/og.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAIzC,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAqB,MAAM,UAAU,CAAA;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG9C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAoGzC,eAAO,MAAM,oBAAoB,GAC/B,aAAa,MAAM,EACnB,QAAQ,UAAU,EAClB,MAAM,UAAU,EAChB,0BAGG;IACD,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;IACrB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,CAAA;CAC/C,oBAsEP,CAAA"}
@@ -0,0 +1,112 @@
1
+ import { walkFiles } from "../files.js";
2
+ import { resolveDocsConfig } from "./config.js";
3
+ import { docsPathFromMdx } from "./mdx-path.js";
4
+ import { createOgOutput } from "./og-output.js";
5
+ import { getDocsMirrorRoutes } from "./routes.js";
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import { createRequire } from "node:module";
9
+ import { parse } from "yaml";
10
+ import { ImageResponse } from "@vercel/og";
11
+ //#region src/lib/presets/docs/og.ts
12
+ var uniqueByRoute = (entries) => {
13
+ const mapped = /* @__PURE__ */ new Map();
14
+ for (const entry of entries) mapped.set(entry.routePath, entry);
15
+ return [...mapped.values()];
16
+ };
17
+ var titleFromPath = (pagePath) => {
18
+ const segments = pagePath.split("/").filter(Boolean);
19
+ return (segments[segments.length - 1] ?? "Docs").split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
20
+ };
21
+ var getMdxEntries = ({ docsDir, docsRoute, ...i18n }) => {
22
+ return walkFiles(docsDir).flatMap((filePath) => {
23
+ const entry = docsPathFromMdx(docsDir, docsRoute, i18n, filePath);
24
+ if (!entry || entry.locale !== i18n.defaultLanguage) return [];
25
+ const { routePath } = entry;
26
+ const frontmatter = fs.readFileSync(filePath, "utf8").match(/^---\n([\s\S]*?)\n---/);
27
+ const meta = frontmatter ? parse(frontmatter[1]) : {};
28
+ return [{
29
+ description: typeof meta.description === "string" ? meta.description : "Documentation",
30
+ routePath,
31
+ title: typeof meta.title === "string" ? meta.title : titleFromPath(routePath)
32
+ }];
33
+ });
34
+ };
35
+ var getDocsOgOutputPaths = ({ docsRoute, entryRoutePath, mirrorRoutes, outputDir }) => {
36
+ const suffix = entryRoutePath === docsRoute ? "" : entryRoutePath.slice(docsRoute.length);
37
+ const outputRoot = path.dirname(outputDir);
38
+ const outputPaths = [path.join(outputDir, `${suffix}/image.png`.replace(/^\//, ""))];
39
+ if (entryRoutePath === docsRoute) outputPaths.push(path.join(outputRoot, "image.png"));
40
+ for (const mirrorRoute of mirrorRoutes) outputPaths.push(path.join(outputRoot, mirrorRoute, `${suffix}/image.png`.replace(/^\//, "")));
41
+ return outputPaths;
42
+ };
43
+ var generateDocsOgImages = async (projectRoot, config, i18n, { routes = [], renderImage } = {}) => {
44
+ let render = renderImage;
45
+ if (!render) {
46
+ const { OgImage } = await import("./og-image.js");
47
+ render = OgImage;
48
+ }
49
+ const resolved = resolveDocsConfig(config);
50
+ const resolvedDocsDir = path.resolve(projectRoot, resolved.docsDir);
51
+ const resolvedOutputDir = path.resolve(projectRoot, resolved.ogOutputDir);
52
+ const mirrorRoutes = getDocsMirrorRoutes(routes).filter((route) => route !== resolved.docsRoute);
53
+ const entries = uniqueByRoute(getMdxEntries({
54
+ ...i18n,
55
+ docsDir: resolvedDocsDir,
56
+ docsRoute: resolved.docsRoute
57
+ }));
58
+ const require = createRequire(import.meta.url);
59
+ const juraFont = fs.readFileSync(require.resolve("@fontsource/jura/files/jura-latin-600-normal.woff"));
60
+ const interRegular = fs.readFileSync(require.resolve("@fontsource/inter/files/inter-latin-400-normal.woff"));
61
+ const interBold = fs.readFileSync(require.resolve("@fontsource/inter/files/inter-latin-700-normal.woff"));
62
+ const logo = resolveDocsOgLogo(projectRoot, config.og?.logo);
63
+ const output = createOgOutput(projectRoot);
64
+ const generatedImageCounts = await Promise.all(entries.map(async (entry) => {
65
+ const outputPaths = getDocsOgOutputPaths({
66
+ docsRoute: resolved.docsRoute,
67
+ entryRoutePath: entry.routePath,
68
+ mirrorRoutes,
69
+ outputDir: resolvedOutputDir
70
+ });
71
+ const response = new ImageResponse(render({
72
+ ...config.og,
73
+ description: entry.description,
74
+ logo,
75
+ title: entry.title
76
+ }), {
77
+ fonts: [
78
+ {
79
+ data: interRegular,
80
+ name: "Inter",
81
+ weight: 400
82
+ },
83
+ {
84
+ data: interBold,
85
+ name: "Inter",
86
+ weight: 700
87
+ },
88
+ {
89
+ data: juraFont,
90
+ name: "Jura",
91
+ weight: 600
92
+ }
93
+ ],
94
+ height: 630,
95
+ width: 1200
96
+ });
97
+ const image = Buffer.from(await response.arrayBuffer());
98
+ output.add(outputPaths, image);
99
+ return outputPaths.length;
100
+ }));
101
+ output.finish();
102
+ return generatedImageCounts.reduce((total, count) => total + count, 0);
103
+ };
104
+ var resolveDocsOgLogo = (projectRoot, logo) => {
105
+ if (!logo || /^(data:|https?:)/.test(logo)) return logo;
106
+ const filePath = path.resolve(projectRoot, "public", logo.replace(/^\//, ""));
107
+ if (!fs.existsSync(filePath)) throw new Error(`Missing docs OG logo: ${filePath}`);
108
+ const extension = path.extname(filePath).slice(1) || "svg+xml";
109
+ return `data:${extension === "svg" ? "image/svg+xml" : `image/${extension}`};base64,${fs.readFileSync(filePath).toString("base64")}`;
110
+ };
111
+ //#endregion
112
+ export { generateDocsOgImages };
@@ -0,0 +1,3 @@
1
+ import { type DocsConfig, type I18nConfig } from './config';
2
+ export declare const generateDocs: (projectRoot: string, config: DocsConfig, i18n: I18nConfig) => Promise<number>;
3
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/openapi.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAqB,MAAM,UAAU,CAAA;AAuJ9E,eAAO,MAAM,YAAY,GACvB,aAAa,MAAM,EACnB,QAAQ,UAAU,EAClB,MAAM,UAAU,oBAsCjB,CAAA"}