@vezham/config 26.0.0-alpha.5 → 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/README.md +14 -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 +99 -4
|
@@ -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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { slash, walkFiles, withoutExtension } from "../files.js";
|
|
2
|
+
import { resolveDocsConfig } from "./config.js";
|
|
3
|
+
import { generatedDirectories } from "./files.js";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import * as OpenAPI from "@vezham/docs-openapi";
|
|
7
|
+
import { createOpenAPI } from "@vezham/docs-openapi/server";
|
|
8
|
+
//#region src/lib/presets/docs/openapi.ts
|
|
9
|
+
var openapiExtensions = new Set([
|
|
10
|
+
".json",
|
|
11
|
+
".yaml",
|
|
12
|
+
".yml"
|
|
13
|
+
]);
|
|
14
|
+
var openAPISpecIdFromRelativePath = (relativePath) => {
|
|
15
|
+
const segments = withoutExtension(slash(relativePath)).split("/");
|
|
16
|
+
if (segments[segments.length - 1] === "index") segments.pop();
|
|
17
|
+
return segments.length === 0 ? "openapi" : segments.join("/");
|
|
18
|
+
};
|
|
19
|
+
var assertGeneratedOutput = (docsDir, outputDir) => {
|
|
20
|
+
const relativePath = path.relative(docsDir, outputDir);
|
|
21
|
+
if (relativePath === "" || relativePath.startsWith(`..${path.sep}`) || path.basename(outputDir) !== "(generated)" || !relativePath.startsWith(`openapi${path.sep}`)) throw new Error(`Refusing to clear unexpected generated docs dir: ${outputDir}`);
|
|
22
|
+
};
|
|
23
|
+
var discoverOpenAPISpecs = (projectRoot, docsDir, openapiDirName) => {
|
|
24
|
+
const specs = [];
|
|
25
|
+
const openapiDir = path.join(projectRoot, openapiDirName);
|
|
26
|
+
const folderSpecs = walkFiles(openapiDir).filter((filePath) => openapiExtensions.has(path.extname(filePath))).sort((left, right) => left.localeCompare(right));
|
|
27
|
+
for (const inputPath of folderSpecs) {
|
|
28
|
+
const documentId = openAPISpecIdFromRelativePath(path.relative(openapiDir, inputPath));
|
|
29
|
+
const outputSegments = documentId === "openapi" ? [] : documentId.split("/");
|
|
30
|
+
specs.push({
|
|
31
|
+
documentId,
|
|
32
|
+
inputPath,
|
|
33
|
+
outputDir: path.join(docsDir, "openapi", ...outputSegments, "(generated)")
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const documentIds = /* @__PURE__ */ new Set();
|
|
37
|
+
for (const spec of specs) {
|
|
38
|
+
if (documentIds.has(spec.documentId)) throw new Error(`Duplicate OpenAPI document id: ${spec.documentId}`);
|
|
39
|
+
documentIds.add(spec.documentId);
|
|
40
|
+
}
|
|
41
|
+
return specs;
|
|
42
|
+
};
|
|
43
|
+
var pageNameFromMdx = (fileName, languages) => {
|
|
44
|
+
const withoutMdx = fileName.slice(0, -4);
|
|
45
|
+
for (const language of languages) {
|
|
46
|
+
const suffix = `.${language}`;
|
|
47
|
+
if (withoutMdx.endsWith(suffix)) return withoutMdx.slice(0, -suffix.length);
|
|
48
|
+
}
|
|
49
|
+
return withoutMdx;
|
|
50
|
+
};
|
|
51
|
+
var pagesInDirectory = (dir, languages) => {
|
|
52
|
+
const files = /* @__PURE__ */ new Set();
|
|
53
|
+
const directories = [];
|
|
54
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
55
|
+
if (entry.isFile() && entry.name.endsWith(".mdx")) files.add(pageNameFromMdx(entry.name, languages));
|
|
56
|
+
if (entry.isDirectory()) directories.push(entry.name === "(generated)" ? `...${entry.name}` : entry.name);
|
|
57
|
+
}
|
|
58
|
+
return [...[...files].sort((left, right) => {
|
|
59
|
+
if (left === "index") return -1;
|
|
60
|
+
if (right === "index") return 1;
|
|
61
|
+
return left.localeCompare(right);
|
|
62
|
+
}), ...directories.sort((left, right) => left.localeCompare(right))];
|
|
63
|
+
};
|
|
64
|
+
var synchronizeMetaFiles = (docsDir, outputDirectories, languages) => {
|
|
65
|
+
const metaFiles = new Set(walkFiles(docsDir).filter((filePath) => path.basename(filePath) === "meta.json"));
|
|
66
|
+
for (const outputDirectory of outputDirectories) metaFiles.add(path.join(path.dirname(outputDirectory), "meta.json"));
|
|
67
|
+
for (const metaFile of [...metaFiles].sort()) {
|
|
68
|
+
const pages = pagesInDirectory(path.dirname(metaFile), languages);
|
|
69
|
+
if (pages.length === 0) continue;
|
|
70
|
+
const existingContent = fs.existsSync(metaFile) ? fs.readFileSync(metaFile, "utf8") : void 0;
|
|
71
|
+
const existing = existingContent ? JSON.parse(existingContent) : {};
|
|
72
|
+
const content = `${JSON.stringify({
|
|
73
|
+
...existing,
|
|
74
|
+
pages
|
|
75
|
+
}, null, 2)}\n`;
|
|
76
|
+
if (existingContent !== content) fs.writeFileSync(metaFile, content);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var generateDocs = async (projectRoot, config, i18n) => {
|
|
80
|
+
const resolved = resolveDocsConfig(config);
|
|
81
|
+
const docsDir = path.resolve(projectRoot, resolved.docsDir);
|
|
82
|
+
const specs = discoverOpenAPISpecs(projectRoot, docsDir, resolved.openapiDir);
|
|
83
|
+
const generatedRoot = path.join(docsDir, "openapi");
|
|
84
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
|
85
|
+
for (const outputDir of generatedDirectories(generatedRoot)) {
|
|
86
|
+
assertGeneratedOutput(docsDir, outputDir);
|
|
87
|
+
fs.rmSync(outputDir, {
|
|
88
|
+
force: true,
|
|
89
|
+
recursive: true
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
await Promise.all(specs.map(async (spec) => {
|
|
93
|
+
assertGeneratedOutput(docsDir, spec.outputDir);
|
|
94
|
+
await OpenAPI.generateFiles({
|
|
95
|
+
input: createOpenAPI({ input: { [spec.documentId]: spec.inputPath } }),
|
|
96
|
+
groupBy: "tag",
|
|
97
|
+
meta: true,
|
|
98
|
+
output: spec.outputDir
|
|
99
|
+
});
|
|
100
|
+
}));
|
|
101
|
+
synchronizeMetaFiles(docsDir, specs.map((spec) => spec.outputDir), i18n.languages);
|
|
102
|
+
return specs.length;
|
|
103
|
+
};
|
|
104
|
+
//#endregion
|
|
105
|
+
export { generateDocs };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type DocsConfig, type I18nConfig } from './config';
|
|
2
|
+
import { type DocsPrerenderPage, type DocsPrerenderPagesOptions, type DocsStaticPaths, type RouteInput } from './types';
|
|
3
|
+
export declare const getDocsStaticPaths: (projectRoot: string, config: DocsConfig | undefined, i18n: I18nConfig) => DocsStaticPaths;
|
|
4
|
+
export declare const getDocsMirrorRoutes: (routes: RouteInput[]) => string[];
|
|
5
|
+
export declare const getDocsPrerenderPages: (projectRoot: string, config: DocsConfig | undefined, i18n: I18nConfig, { extraPages, includeDocsRoot, includeLocalizedDocsRoots, routes }?: DocsPrerenderPagesOptions) => DocsPrerenderPage[];
|
|
6
|
+
export declare const getPrerenderPages: (projectRoot?: string, options?: DocsPrerenderPagesOptions) => DocsPrerenderPage[];
|
|
7
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/lib/presets/docs/routes.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EAGhB,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EAEpB,KAAK,UAAU,EAChB,MAAM,SAAS,CAAA;AAwBhB,eAAO,MAAM,kBAAkB,GAC7B,aAAa,MAAM,EACnB,QAAQ,UAAU,YAAK,EACvB,MAAM,UAAU,KACf,eA+BF,CAAA;AAiGD,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,EAAE,aAQvD,CAAA;AAMD,eAAO,MAAM,qBAAqB,GAChC,aAAa,MAAM,EACnB,QAAQ,UAAU,YAAK,EACvB,MAAM,UAAU,EAChB,qEAKG,yBAA8B,wBA+DlC,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,oBAA2B,EAC3B,UAAS,yBAA8B,wBAQxC,CAAA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { unique, walkFiles } from "../files.js";
|
|
2
|
+
import { expandFilesystemRoute, normalizeRoute, routeRootFromGlob } from "../route-files.js";
|
|
3
|
+
import { loadVxDocsConfig, resolveDocsConfig } from "./config.js";
|
|
4
|
+
import { docsPathFromMdx } from "./mdx-path.js";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
//#region src/lib/presets/docs/routes.ts
|
|
7
|
+
var docsRouteFileOptions = { rootRouteSegments: new Set(["__root__"]) };
|
|
8
|
+
var getNonDefaultLanguages = (i18n) => {
|
|
9
|
+
return i18n.languages.filter((lang) => lang !== i18n.defaultLanguage);
|
|
10
|
+
};
|
|
11
|
+
var getDocsStaticPathsForLocale = (docsDir, docsRoute, i18n, locale) => {
|
|
12
|
+
return unique(walkFiles(docsDir).map((filePath) => docsPathFromMdx(docsDir, docsRoute, i18n, filePath)).filter((entry) => entry?.locale === locale).flatMap((entry) => entry ? [entry.routePath, entry.markdownPath] : []));
|
|
13
|
+
};
|
|
14
|
+
var getDocsStaticPaths = (projectRoot, config = {}, i18n) => {
|
|
15
|
+
const resolved = resolveDocsConfig(config);
|
|
16
|
+
const docsDir = path.resolve(projectRoot, resolved.docsDir);
|
|
17
|
+
const defaultDocsStaticPaths = getDocsStaticPathsForLocale(docsDir, resolved.docsRoute, i18n, i18n.defaultLanguage);
|
|
18
|
+
const openApiStaticPaths = defaultDocsStaticPaths.filter((pagePath) => pagePath.startsWith(`${resolved.docsRoute}/openapi/`));
|
|
19
|
+
return {
|
|
20
|
+
defaultDocsStaticPaths,
|
|
21
|
+
docsShellStaticPaths: defaultDocsStaticPaths.filter((pagePath) => !pagePath.endsWith(".md")),
|
|
22
|
+
docsStaticPathsByLocale: Object.fromEntries(i18n.languages.map((lang) => [lang, unique([...getDocsStaticPathsForLocale(docsDir, resolved.docsRoute, i18n, lang), ...openApiStaticPaths])])),
|
|
23
|
+
openApiStaticPaths
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
var shouldWritePrerenderIndex = (pagePath) => {
|
|
27
|
+
return path.extname(pagePath) === "" && !pagePath.startsWith("/api/");
|
|
28
|
+
};
|
|
29
|
+
var isDocsShellPath = (pagePath) => {
|
|
30
|
+
return !pagePath.endsWith(".md");
|
|
31
|
+
};
|
|
32
|
+
var createDocsPrerenderPage = (pagePath) => {
|
|
33
|
+
return {
|
|
34
|
+
path: pagePath,
|
|
35
|
+
prerender: shouldWritePrerenderIndex(pagePath) ? { outputPath: `${pagePath}/index.html` } : void 0
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
var normalizeDocsPrerenderPage = (page) => {
|
|
39
|
+
return typeof page === "string" ? createDocsPrerenderPage(page) : page;
|
|
40
|
+
};
|
|
41
|
+
var replaceDocsRoute = (pagePath, docsRoute, nextRoute) => {
|
|
42
|
+
if (pagePath === docsRoute) return nextRoute;
|
|
43
|
+
return pagePath.startsWith(`${docsRoute}/`) ? `${nextRoute}${pagePath.slice(docsRoute.length)}` : pagePath;
|
|
44
|
+
};
|
|
45
|
+
var shouldPrerenderRoute = (route) => {
|
|
46
|
+
return route.prerender !== false;
|
|
47
|
+
};
|
|
48
|
+
var docsMirrorRouteFromRoute = (route) => {
|
|
49
|
+
const routeRoot = routeRootFromGlob(route.path);
|
|
50
|
+
return routeRoot && route.source === "docs" ? routeRoot : void 0;
|
|
51
|
+
};
|
|
52
|
+
var createFilesystemRoutePrerenderPages = (projectRoot, route) => {
|
|
53
|
+
return expandFilesystemRoute(projectRoot, route, docsRouteFileOptions).map((pagePath) => createDocsPrerenderPageFromRoute({
|
|
54
|
+
...route,
|
|
55
|
+
path: pagePath
|
|
56
|
+
}));
|
|
57
|
+
};
|
|
58
|
+
var shouldGenerateDocsRouteOg = (route) => {
|
|
59
|
+
const hasDocsMirrorGlob = docsMirrorRouteFromRoute(route) !== void 0;
|
|
60
|
+
if (typeof route.og === "object") return false;
|
|
61
|
+
return route.og ?? hasDocsMirrorGlob;
|
|
62
|
+
};
|
|
63
|
+
var assertSupportedRoute = (route) => {
|
|
64
|
+
if (!routeRootFromGlob(route.path) || route.source === "docs" || route.source === "routes") return;
|
|
65
|
+
throw new Error(`Unsupported route source "${route.source ?? "none"}" for glob route "${route.path}". Use source "docs", source "routes", or provide an exact path.`);
|
|
66
|
+
};
|
|
67
|
+
var createDocsPrerenderPageFromRoute = (route) => {
|
|
68
|
+
if (typeof route.prerender === "object" && route.prerender.outputPath) return {
|
|
69
|
+
path: route.path,
|
|
70
|
+
prerender: { outputPath: route.prerender.outputPath }
|
|
71
|
+
};
|
|
72
|
+
return createDocsPrerenderPage(route.path);
|
|
73
|
+
};
|
|
74
|
+
var getDocsMirrorRoutes = (routes) => {
|
|
75
|
+
return unique(routes.map(normalizeRoute).filter(shouldGenerateDocsRouteOg).map(docsMirrorRouteFromRoute).filter((route) => route !== void 0));
|
|
76
|
+
};
|
|
77
|
+
var uniquePrerenderPages = (pages) => {
|
|
78
|
+
return [...new Map(pages.map((page) => [page.path, page])).values()];
|
|
79
|
+
};
|
|
80
|
+
var getDocsPrerenderPages = (projectRoot, config = {}, i18n, { extraPages = [], includeDocsRoot = true, includeLocalizedDocsRoots = true, routes = [] } = {}) => {
|
|
81
|
+
const resolved = resolveDocsConfig(config);
|
|
82
|
+
const { defaultDocsStaticPaths, docsShellStaticPaths, docsStaticPathsByLocale } = getDocsStaticPaths(projectRoot, config, i18n);
|
|
83
|
+
const routeEntries = routes.map(normalizeRoute).filter(shouldPrerenderRoute);
|
|
84
|
+
for (const route of routeEntries) assertSupportedRoute(route);
|
|
85
|
+
const globDocsRoutes = unique([...routeEntries.flatMap((route) => {
|
|
86
|
+
const docsRoute = docsMirrorRouteFromRoute(route);
|
|
87
|
+
return docsRoute ? [docsRoute] : [];
|
|
88
|
+
})]);
|
|
89
|
+
const staticRoutes = routeEntries.filter((route) => !routeRootFromGlob(route.path));
|
|
90
|
+
return uniquePrerenderPages([
|
|
91
|
+
...includeDocsRoot ? [createDocsPrerenderPage(resolved.docsRoute)] : [],
|
|
92
|
+
...defaultDocsStaticPaths.map(createDocsPrerenderPage),
|
|
93
|
+
...globDocsRoutes.flatMap((route) => docsShellStaticPaths.map((pagePath) => createDocsPrerenderPage(replaceDocsRoute(pagePath, resolved.docsRoute, route)))),
|
|
94
|
+
...getNonDefaultLanguages(i18n).flatMap((lang) => globDocsRoutes.flatMap((route) => docsStaticPathsByLocale[lang].filter(isDocsShellPath).map((pagePath) => createDocsPrerenderPage(`/${lang}${replaceDocsRoute(pagePath, resolved.docsRoute, route)}`)))),
|
|
95
|
+
...getNonDefaultLanguages(i18n).flatMap((lang) => [...includeLocalizedDocsRoots ? [createDocsPrerenderPage(`/${lang}`), createDocsPrerenderPage(`/${lang}${resolved.docsRoute}`)] : [], ...docsStaticPathsByLocale[lang].map((pagePath) => createDocsPrerenderPage(`/${lang}${pagePath}`))]),
|
|
96
|
+
...routeEntries.flatMap((route) => createFilesystemRoutePrerenderPages(projectRoot, route)),
|
|
97
|
+
...staticRoutes.map(createDocsPrerenderPageFromRoute),
|
|
98
|
+
...extraPages.map(normalizeDocsPrerenderPage)
|
|
99
|
+
]);
|
|
100
|
+
};
|
|
101
|
+
var getPrerenderPages = (projectRoot = process.cwd(), options = {}) => {
|
|
102
|
+
const { docs, i18n, routes } = loadVxDocsConfig(projectRoot);
|
|
103
|
+
return getDocsPrerenderPages(projectRoot, docs, i18n, {
|
|
104
|
+
...options,
|
|
105
|
+
routes: [...routes, ...options.routes ?? []]
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
//#endregion
|
|
109
|
+
export { getDocsMirrorRoutes, getDocsPrerenderPages, getDocsStaticPaths, getPrerenderPages };
|