@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.
- package/LICENSE +173 -0
- package/README.md +14 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +0 -0
- package/dist/lib/deploy/cli.d.ts +3 -0
- package/dist/lib/deploy/cli.d.ts.map +1 -0
- package/dist/lib/deploy/cli.js +12 -0
- package/dist/lib/deploy/firebase.d.ts +3 -0
- package/dist/lib/deploy/firebase.d.ts.map +1 -0
- package/dist/lib/deploy/firebase.js +106 -0
- package/dist/lib/deploy/index.d.ts +4 -0
- package/dist/lib/deploy/index.d.ts.map +1 -0
- package/dist/lib/deploy/index.js +42 -0
- package/dist/lib/deploy/paths.d.ts +3 -0
- package/dist/lib/deploy/paths.d.ts.map +1 -0
- package/dist/lib/deploy/paths.js +6 -0
- package/dist/lib/deploy/presets.d.ts +5 -0
- package/dist/lib/deploy/presets.d.ts.map +1 -0
- package/dist/lib/deploy/presets.js +10 -0
- package/dist/lib/deploy/types.d.ts +97 -0
- package/dist/lib/deploy/types.d.ts.map +1 -0
- package/dist/lib/deploy/vercel.d.ts +3 -0
- package/dist/lib/deploy/vercel.d.ts.map +1 -0
- package/dist/lib/deploy/vercel.js +47 -0
- package/dist/lib/framework.d.ts +3 -0
- package/dist/lib/framework.d.ts.map +1 -0
- package/dist/lib/framework.js +7 -0
- package/dist/lib/i18n.d.ts +6 -0
- package/dist/lib/i18n.d.ts.map +1 -0
- package/dist/lib/i18n.js +11 -0
- package/dist/lib/integrations/next/index.d.ts +4 -0
- package/dist/lib/integrations/next/index.d.ts.map +1 -0
- package/dist/lib/integrations/next/index.js +29 -0
- package/dist/lib/integrations/playwright/index.d.ts +11 -0
- package/dist/lib/integrations/playwright/index.d.ts.map +1 -0
- package/dist/lib/integrations/playwright/index.js +77 -0
- package/dist/lib/integrations/playwright/test.d.ts +5 -0
- package/dist/lib/integrations/playwright/test.d.ts.map +1 -0
- package/dist/lib/integrations/playwright/test.js +23 -0
- package/dist/lib/integrations/vite/index.d.ts +12 -0
- package/dist/lib/integrations/vite/index.d.ts.map +1 -0
- package/dist/lib/integrations/vite/index.js +34 -0
- package/dist/lib/integrations/vite-lib/base.d.ts +3 -0
- package/dist/lib/integrations/vite-lib/base.d.ts.map +1 -0
- package/dist/lib/integrations/vite-lib/base.js +31 -0
- package/dist/lib/integrations/vite-lib/index.d.ts +3 -0
- package/dist/lib/integrations/vite-lib/index.d.ts.map +1 -0
- package/dist/lib/integrations/vite-lib/index.js +42 -0
- package/dist/lib/integrations/vite-lib/react.d.ts +3 -0
- package/dist/lib/integrations/vite-lib/react.d.ts.map +1 -0
- package/dist/lib/integrations/vite-lib/react.js +10 -0
- package/dist/lib/integrations/vitest/framework.d.ts +4 -0
- package/dist/lib/integrations/vitest/framework.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/framework.js +5 -0
- package/dist/lib/integrations/vitest/frameworks/docs-plugins.d.ts +3 -0
- package/dist/lib/integrations/vitest/frameworks/docs-plugins.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/frameworks/docs-plugins.js +27 -0
- package/dist/lib/integrations/vitest/frameworks/docs.d.ts +3 -0
- package/dist/lib/integrations/vitest/frameworks/docs.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/frameworks/docs.js +5 -0
- package/dist/lib/integrations/vitest/frameworks/next.d.ts +3 -0
- package/dist/lib/integrations/vitest/frameworks/next.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/frameworks/next.js +5 -0
- package/dist/lib/integrations/vitest/frameworks/react.d.ts +3 -0
- package/dist/lib/integrations/vitest/frameworks/react.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/frameworks/react.js +5 -0
- package/dist/lib/integrations/vitest/index.d.ts +4 -0
- package/dist/lib/integrations/vitest/index.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/index.js +4 -0
- package/dist/lib/integrations/vitest/setup/next.d.ts +2 -0
- package/dist/lib/integrations/vitest/setup/next.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/setup/next.js +11 -0
- package/dist/lib/integrations/vitest/setup/react.d.ts +2 -0
- package/dist/lib/integrations/vitest/setup/react.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/setup/react.js +36 -0
- package/dist/lib/integrations/vitest/shared.d.ts +3 -0
- package/dist/lib/integrations/vitest/shared.d.ts.map +1 -0
- package/dist/lib/integrations/vitest/shared.js +24 -0
- package/dist/lib/metadata/cli.d.ts +3 -0
- package/dist/lib/metadata/cli.d.ts.map +1 -0
- package/dist/lib/metadata/cli.js +13 -0
- package/dist/lib/metadata/env.d.ts +9 -0
- package/dist/lib/metadata/env.d.ts.map +1 -0
- package/dist/lib/metadata/env.js +36 -0
- package/dist/lib/metadata/html.d.ts +3 -0
- package/dist/lib/metadata/html.d.ts.map +1 -0
- package/dist/lib/metadata/html.js +96 -0
- package/dist/lib/metadata/index.d.ts +7 -0
- package/dist/lib/metadata/index.d.ts.map +1 -0
- package/dist/lib/metadata/index.js +61 -0
- package/dist/lib/metadata/next.d.ts +79 -0
- package/dist/lib/metadata/next.d.ts.map +1 -0
- package/dist/lib/metadata/next.js +106 -0
- package/dist/lib/metadata/public.d.ts +3 -0
- package/dist/lib/metadata/public.d.ts.map +1 -0
- package/dist/lib/metadata/public.js +107 -0
- package/dist/lib/metadata/render.d.ts +7 -0
- package/dist/lib/metadata/render.d.ts.map +1 -0
- package/dist/lib/metadata/render.js +37 -0
- package/dist/lib/metadata/runtime.d.ts +68 -0
- package/dist/lib/metadata/runtime.d.ts.map +1 -0
- package/dist/lib/metadata/runtime.js +134 -0
- package/dist/lib/metadata/tanstack.d.ts +71 -0
- package/dist/lib/metadata/tanstack.d.ts.map +1 -0
- package/dist/lib/metadata/tanstack.js +194 -0
- package/dist/lib/metadata/templates/not-found.html +224 -0
- package/dist/lib/metadata/templates/offline.html +210 -0
- package/dist/lib/metadata/types.d.ts +118 -0
- package/dist/lib/metadata/types.d.ts.map +1 -0
- package/dist/lib/navigation/app-menu.d.ts +2 -0
- package/dist/lib/navigation/app-menu.d.ts.map +1 -0
- package/dist/lib/navigation/app-menu.js +45 -0
- package/dist/lib/navigation/control-center.d.ts +2 -0
- package/dist/lib/navigation/control-center.d.ts.map +1 -0
- package/dist/lib/navigation/control-center.js +66 -0
- package/dist/lib/navigation/index.d.ts +5 -0
- package/dist/lib/navigation/index.d.ts.map +1 -0
- package/dist/lib/navigation/index.js +59 -0
- package/dist/lib/navigation/toolbar.d.ts +2 -0
- package/dist/lib/navigation/toolbar.d.ts.map +1 -0
- package/dist/lib/navigation/toolbar.js +78 -0
- package/dist/lib/presets/app/index.d.ts +21 -0
- package/dist/lib/presets/app/index.d.ts.map +1 -0
- package/dist/lib/presets/app/index.js +114 -0
- package/dist/lib/presets/cdn/index.d.ts +2 -0
- package/dist/lib/presets/cdn/index.d.ts.map +1 -0
- package/dist/lib/presets/cdn/index.js +2 -0
- package/dist/lib/presets/docs/cli.d.ts +3 -0
- package/dist/lib/presets/docs/cli.d.ts.map +1 -0
- package/dist/lib/presets/docs/cli.js +18 -0
- package/dist/lib/presets/docs/config.d.ts +40 -0
- package/dist/lib/presets/docs/config.d.ts.map +1 -0
- package/dist/lib/presets/docs/config.js +39 -0
- package/dist/lib/presets/docs/files.d.ts +2 -0
- package/dist/lib/presets/docs/files.d.ts.map +1 -0
- package/dist/lib/presets/docs/files.js +13 -0
- package/dist/lib/presets/docs/index.d.ts +7 -0
- package/dist/lib/presets/docs/index.d.ts.map +1 -0
- package/dist/lib/presets/docs/index.js +6 -0
- package/dist/lib/presets/docs/mdx-path.d.ts +7 -0
- package/dist/lib/presets/docs/mdx-path.d.ts.map +1 -0
- package/dist/lib/presets/docs/mdx-path.js +19 -0
- package/dist/lib/presets/docs/og-image.d.ts +9 -0
- package/dist/lib/presets/docs/og-image.d.ts.map +1 -0
- package/dist/lib/presets/docs/og-image.js +88 -0
- package/dist/lib/presets/docs/og-output.d.ts +5 -0
- package/dist/lib/presets/docs/og-output.d.ts.map +1 -0
- package/dist/lib/presets/docs/og-output.js +34 -0
- package/dist/lib/presets/docs/og.d.ts +9 -0
- package/dist/lib/presets/docs/og.d.ts.map +1 -0
- package/dist/lib/presets/docs/og.js +112 -0
- package/dist/lib/presets/docs/openapi.d.ts +3 -0
- package/dist/lib/presets/docs/openapi.d.ts.map +1 -0
- package/dist/lib/presets/docs/openapi.js +105 -0
- package/dist/lib/presets/docs/routes.d.ts +7 -0
- package/dist/lib/presets/docs/routes.d.ts.map +1 -0
- package/dist/lib/presets/docs/routes.js +109 -0
- package/dist/lib/presets/docs/types.d.ts +31 -0
- package/dist/lib/presets/docs/types.d.ts.map +1 -0
- package/dist/lib/presets/docs/vite.d.ts +11 -0
- package/dist/lib/presets/docs/vite.d.ts.map +1 -0
- package/dist/lib/presets/docs/vite.js +78 -0
- package/dist/lib/presets/files.d.ts +5 -0
- package/dist/lib/presets/files.d.ts.map +1 -0
- package/dist/lib/presets/files.js +21 -0
- package/dist/lib/presets/route-files.d.ts +22 -0
- package/dist/lib/presets/route-files.d.ts.map +1 -0
- package/dist/lib/presets/route-files.js +49 -0
- package/dist/lib/yaml-config.d.ts +2 -0
- package/dist/lib/yaml-config.d.ts.map +1 -0
- package/dist/lib/yaml-config.js +6 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|