@specglass/core 0.0.2
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/dist/config/defaults.d.ts +4 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/define-config.d.ts +17 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +55 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +74 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +366 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +109 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/content/frontmatter-schema.d.ts +53 -0
- package/dist/content/frontmatter-schema.d.ts.map +1 -0
- package/dist/content/frontmatter-schema.js +27 -0
- package/dist/content/frontmatter-schema.js.map +1 -0
- package/dist/content/mdx-loader.d.ts +93 -0
- package/dist/content/mdx-loader.d.ts.map +1 -0
- package/dist/content/mdx-loader.js +97 -0
- package/dist/content/mdx-loader.js.map +1 -0
- package/dist/content/openapi-loader.d.ts +40 -0
- package/dist/content/openapi-loader.d.ts.map +1 -0
- package/dist/content/openapi-loader.js +58 -0
- package/dist/content/openapi-loader.js.map +1 -0
- package/dist/content/rehype-code-blocks.d.ts +15 -0
- package/dist/content/rehype-code-blocks.d.ts.map +1 -0
- package/dist/content/rehype-code-blocks.js +84 -0
- package/dist/content/rehype-code-blocks.js.map +1 -0
- package/dist/errors/specglass-error.d.ts +12 -0
- package/dist/errors/specglass-error.d.ts.map +1 -0
- package/dist/errors/specglass-error.js +19 -0
- package/dist/errors/specglass-error.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.d.ts +41 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +276 -0
- package/dist/integration.js.map +1 -0
- package/dist/navigation/builder.d.ts +24 -0
- package/dist/navigation/builder.d.ts.map +1 -0
- package/dist/navigation/builder.js +169 -0
- package/dist/navigation/builder.js.map +1 -0
- package/dist/navigation/index.d.ts +7 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +6 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/meta-parser.d.ts +9 -0
- package/dist/navigation/meta-parser.d.ts.map +1 -0
- package/dist/navigation/meta-parser.js +59 -0
- package/dist/navigation/meta-parser.js.map +1 -0
- package/dist/navigation/meta-schema.d.ts +77 -0
- package/dist/navigation/meta-schema.d.ts.map +1 -0
- package/dist/navigation/meta-schema.js +31 -0
- package/dist/navigation/meta-schema.js.map +1 -0
- package/dist/navigation/watcher.d.ts +44 -0
- package/dist/navigation/watcher.d.ts.map +1 -0
- package/dist/navigation/watcher.js +81 -0
- package/dist/navigation/watcher.js.map +1 -0
- package/dist/openapi/parser.d.ts +24 -0
- package/dist/openapi/parser.d.ts.map +1 -0
- package/dist/openapi/parser.js +53 -0
- package/dist/openapi/parser.js.map +1 -0
- package/dist/openapi/transformer.d.ts +19 -0
- package/dist/openapi/transformer.d.ts.map +1 -0
- package/dist/openapi/transformer.js +294 -0
- package/dist/openapi/transformer.js.map +1 -0
- package/dist/openapi/types.d.ts +109 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/openapi/types.js +11 -0
- package/dist/openapi/types.js.map +1 -0
- package/dist/openapi/utils.d.ts +26 -0
- package/dist/openapi/utils.d.ts.map +1 -0
- package/dist/openapi/utils.js +34 -0
- package/dist/openapi/utils.js.map +1 -0
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/navigation.d.ts +62 -0
- package/dist/types/navigation.d.ts.map +1 -0
- package/dist/types/navigation.js +2 -0
- package/dist/types/navigation.js.map +1 -0
- package/dist/virtual/modules.d.ts +34 -0
- package/dist/virtual/modules.d.ts.map +1 -0
- package/dist/virtual/modules.js +37 -0
- package/dist/virtual/modules.js.map +1 -0
- package/package.json +51 -0
- package/src/pages/[...slug].astro +55 -0
- package/src/pages/api-reference/[...slug].astro +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,uEAAuE;AACvE,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,eAAe,CA4BpD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Default configuration values. All fields have sensible defaults. */
|
|
2
|
+
export const DEFAULT_CONFIG = {
|
|
3
|
+
site: {
|
|
4
|
+
title: "My Docs",
|
|
5
|
+
description: "Documentation powered by specglass",
|
|
6
|
+
url: undefined,
|
|
7
|
+
},
|
|
8
|
+
sidebar: {
|
|
9
|
+
enabled: true,
|
|
10
|
+
defaultCollapsed: false,
|
|
11
|
+
},
|
|
12
|
+
openapi: {
|
|
13
|
+
specs: [],
|
|
14
|
+
},
|
|
15
|
+
theme: {
|
|
16
|
+
logo: undefined,
|
|
17
|
+
primaryColor: undefined,
|
|
18
|
+
accentColor: undefined,
|
|
19
|
+
fontFamily: undefined,
|
|
20
|
+
codeFontFamily: undefined,
|
|
21
|
+
footer: undefined,
|
|
22
|
+
favicon: undefined,
|
|
23
|
+
socialImage: undefined,
|
|
24
|
+
headerLinks: undefined,
|
|
25
|
+
colors: undefined,
|
|
26
|
+
},
|
|
27
|
+
build: {
|
|
28
|
+
outDir: "dist",
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,IAAI,EAAE;QACJ,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,oCAAoC;QACjD,GAAG,EAAE,SAAS;KACf;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,gBAAgB,EAAE,KAAK;KACxB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,EAAE;KACV;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS;QACf,YAAY,EAAE,SAAS;QACvB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,SAAS;QACzB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,SAAS;KAClB;IACD,KAAK,EAAE;QACL,MAAM,EAAE,MAAM;KACf;CACF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SpecglassConfig, SpecglassUserConfig } from "../types/config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Define specglass configuration with TypeScript autocomplete.
|
|
4
|
+
* Accepts a partial config, deep merges over defaults, and validates via Zod.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { defineConfig } from "@specglass/core";
|
|
9
|
+
*
|
|
10
|
+
* export default defineConfig({
|
|
11
|
+
* site: { title: "My API Docs" },
|
|
12
|
+
* openapi: { specs: [{ path: "./openapi.yaml" }] },
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function defineConfig(userConfig?: SpecglassUserConfig): SpecglassConfig;
|
|
17
|
+
//# sourceMappingURL=define-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA+B/E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,UAAU,GAAE,mBAAwB,GAAG,eAAe,CAoBlF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { configSchema } from "./schema.js";
|
|
2
|
+
import { DEFAULT_CONFIG } from "./defaults.js";
|
|
3
|
+
import { SpecglassError } from "../errors/specglass-error.js";
|
|
4
|
+
/**
|
|
5
|
+
* Deep merge two objects. Source values override target values.
|
|
6
|
+
* Arrays are replaced, not concatenated.
|
|
7
|
+
*/
|
|
8
|
+
function deepMerge(target, source) {
|
|
9
|
+
const result = { ...target };
|
|
10
|
+
for (const key of Object.keys(source)) {
|
|
11
|
+
const sourceVal = source[key];
|
|
12
|
+
const targetVal = target[key];
|
|
13
|
+
if (sourceVal !== undefined &&
|
|
14
|
+
typeof sourceVal === "object" &&
|
|
15
|
+
sourceVal !== null &&
|
|
16
|
+
!Array.isArray(sourceVal) &&
|
|
17
|
+
typeof targetVal === "object" &&
|
|
18
|
+
targetVal !== null &&
|
|
19
|
+
!Array.isArray(targetVal)) {
|
|
20
|
+
result[key] = deepMerge(targetVal, sourceVal);
|
|
21
|
+
}
|
|
22
|
+
else if (sourceVal !== undefined) {
|
|
23
|
+
result[key] = sourceVal;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Define specglass configuration with TypeScript autocomplete.
|
|
30
|
+
* Accepts a partial config, deep merges over defaults, and validates via Zod.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* import { defineConfig } from "@specglass/core";
|
|
35
|
+
*
|
|
36
|
+
* export default defineConfig({
|
|
37
|
+
* site: { title: "My API Docs" },
|
|
38
|
+
* openapi: { specs: [{ path: "./openapi.yaml" }] },
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function defineConfig(userConfig = {}) {
|
|
43
|
+
const merged = deepMerge(DEFAULT_CONFIG, userConfig);
|
|
44
|
+
const result = configSchema.safeParse(merged);
|
|
45
|
+
if (!result.success) {
|
|
46
|
+
const issues = result.error.issues;
|
|
47
|
+
const details = issues
|
|
48
|
+
.map((issue) => ` • '${issue.path.join(".")}' — ${issue.message}`)
|
|
49
|
+
.join("\n");
|
|
50
|
+
const fieldPaths = issues.map((issue) => issue.path.join(".")).join(", ");
|
|
51
|
+
throw new SpecglassError(`Config validation failed:\n${details}`, "CONFIG_INVALID", undefined, undefined, `Check the following field(s) in your specglass.config.ts: ${fieldPaths}`);
|
|
52
|
+
}
|
|
53
|
+
return result.data;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=define-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D;;;GAGG;AACH,SAAS,SAAS,CAAoC,MAAS,EAAE,MAAkB;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAmB,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,IACE,SAAS,KAAK,SAAS;YACvB,OAAO,SAAS,KAAK,QAAQ;YAC7B,SAAS,KAAK,IAAI;YAClB,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YACzB,OAAO,SAAS,KAAK,QAAQ;YAC7B,SAAS,KAAK,IAAI;YAClB,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACzB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,SAAoC,EACpC,SAAoC,CACvB,CAAC;QAClB,CAAC;aAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAuB,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,aAAkC,EAAE;IAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,cAAyC,EAAE,UAAqC,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM;aACnB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;aAClE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,IAAI,cAAc,CACtB,8BAA8B,OAAO,EAAE,EACvC,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,6DAA6D,UAAU,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SpecglassConfig } from "../types/config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Load and validate specglass configuration from a TypeScript config file.
|
|
4
|
+
* Uses jiti for TypeScript resolution without requiring a build step.
|
|
5
|
+
*
|
|
6
|
+
* @param configPath - Explicit path to config file. If omitted, searches CWD and parent directories.
|
|
7
|
+
* @returns Fully resolved and validated SpecglassConfig
|
|
8
|
+
* @throws SpecglassError with code CONFIG_NOT_FOUND or CONFIG_INVALID
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadConfig(configPath?: string): Promise<SpecglassConfig>;
|
|
11
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAyB1D;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqD9E"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createJiti } from "jiti";
|
|
2
|
+
import { resolve, join } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { SpecglassError } from "../errors/specglass-error.js";
|
|
5
|
+
import { defineConfig } from "./define-config.js";
|
|
6
|
+
const CONFIG_FILENAME = "specglass.config.ts";
|
|
7
|
+
/**
|
|
8
|
+
* Find the specglass config file by walking up from the given directory.
|
|
9
|
+
* Returns the resolved path or undefined if not found.
|
|
10
|
+
*/
|
|
11
|
+
function findConfigFile(startDir) {
|
|
12
|
+
let dir = resolve(startDir);
|
|
13
|
+
const root = resolve("/");
|
|
14
|
+
while (dir !== root) {
|
|
15
|
+
const candidate = join(dir, CONFIG_FILENAME);
|
|
16
|
+
if (existsSync(candidate)) {
|
|
17
|
+
return candidate;
|
|
18
|
+
}
|
|
19
|
+
const parent = resolve(dir, "..");
|
|
20
|
+
if (parent === dir)
|
|
21
|
+
break;
|
|
22
|
+
dir = parent;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load and validate specglass configuration from a TypeScript config file.
|
|
28
|
+
* Uses jiti for TypeScript resolution without requiring a build step.
|
|
29
|
+
*
|
|
30
|
+
* @param configPath - Explicit path to config file. If omitted, searches CWD and parent directories.
|
|
31
|
+
* @returns Fully resolved and validated SpecglassConfig
|
|
32
|
+
* @throws SpecglassError with code CONFIG_NOT_FOUND or CONFIG_INVALID
|
|
33
|
+
*/
|
|
34
|
+
export async function loadConfig(configPath) {
|
|
35
|
+
const resolvedPath = configPath ? resolve(configPath) : findConfigFile(process.cwd());
|
|
36
|
+
if (!resolvedPath || !existsSync(resolvedPath)) {
|
|
37
|
+
throw new SpecglassError(`Config file not found: ${configPath ?? CONFIG_FILENAME}`, "CONFIG_NOT_FOUND", configPath ? resolve(configPath) : undefined, undefined, `Create a ${CONFIG_FILENAME} file or run 'specglass create' to scaffold a new project`);
|
|
38
|
+
}
|
|
39
|
+
const jiti = createJiti(import.meta.url, {
|
|
40
|
+
interopDefault: true,
|
|
41
|
+
requireCache: false,
|
|
42
|
+
moduleCache: false,
|
|
43
|
+
});
|
|
44
|
+
let rawConfig;
|
|
45
|
+
try {
|
|
46
|
+
rawConfig = await jiti.import(resolvedPath);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
throw new SpecglassError(`Failed to load config: ${err instanceof Error ? err.message : String(err)}`, "CONFIG_LOAD_ERROR", resolvedPath, undefined, "Check your specglass.config.ts for syntax errors");
|
|
50
|
+
}
|
|
51
|
+
// Handle module wrapper: jiti may return { default: { ... } } or the object directly
|
|
52
|
+
let userConfig = {};
|
|
53
|
+
if (typeof rawConfig === "object" && rawConfig !== null) {
|
|
54
|
+
const mod = rawConfig;
|
|
55
|
+
// If the module has a `default` export, unwrap it
|
|
56
|
+
if ("default" in mod && typeof mod.default === "object" && mod.default !== null) {
|
|
57
|
+
userConfig = mod.default;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
userConfig = mod;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return defineConfig(userConfig);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err instanceof SpecglassError) {
|
|
68
|
+
// Re-throw with the config file path attached
|
|
69
|
+
throw new SpecglassError(err.message, err.code, resolvedPath, err.line, err.hint);
|
|
70
|
+
}
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Complete specglass configuration schema.
|
|
4
|
+
* All top-level fields are optional with sensible defaults.
|
|
5
|
+
*/
|
|
6
|
+
export declare const configSchema: z.ZodObject<{
|
|
7
|
+
/** Site metadata */
|
|
8
|
+
site: z.ZodOptional<z.ZodObject<{
|
|
9
|
+
/** Site title displayed in header and browser tab */
|
|
10
|
+
title: z.ZodOptional<z.ZodString>;
|
|
11
|
+
/** Site description for SEO meta tags */
|
|
12
|
+
description: z.ZodOptional<z.ZodString>;
|
|
13
|
+
/** Base URL of the deployed docs site */
|
|
14
|
+
url: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
title?: string | undefined;
|
|
17
|
+
description?: string | undefined;
|
|
18
|
+
url?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
title?: string | undefined;
|
|
21
|
+
description?: string | undefined;
|
|
22
|
+
url?: string | undefined;
|
|
23
|
+
}>>;
|
|
24
|
+
/** Sidebar navigation configuration */
|
|
25
|
+
sidebar: z.ZodOptional<z.ZodObject<{
|
|
26
|
+
/** Whether to show the sidebar on all pages */
|
|
27
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
28
|
+
/** Whether sections are collapsed by default */
|
|
29
|
+
defaultCollapsed: z.ZodOptional<z.ZodBoolean>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
enabled?: boolean | undefined;
|
|
32
|
+
defaultCollapsed?: boolean | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
enabled?: boolean | undefined;
|
|
35
|
+
defaultCollapsed?: boolean | undefined;
|
|
36
|
+
}>>;
|
|
37
|
+
/** OpenAPI spec configuration for auto-generated API reference pages */
|
|
38
|
+
openapi: z.ZodOptional<z.ZodObject<{
|
|
39
|
+
/** Array of OpenAPI spec sources */
|
|
40
|
+
specs: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
41
|
+
/** Path to the OpenAPI spec file (relative to project root) */
|
|
42
|
+
path: z.ZodString;
|
|
43
|
+
/** Optional display name for this spec */
|
|
44
|
+
name: z.ZodOptional<z.ZodString>;
|
|
45
|
+
}, "strip", z.ZodTypeAny, {
|
|
46
|
+
path: string;
|
|
47
|
+
name?: string | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
path: string;
|
|
50
|
+
name?: string | undefined;
|
|
51
|
+
}>, "many">>;
|
|
52
|
+
}, "strip", z.ZodTypeAny, {
|
|
53
|
+
specs?: {
|
|
54
|
+
path: string;
|
|
55
|
+
name?: string | undefined;
|
|
56
|
+
}[] | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
specs?: {
|
|
59
|
+
path: string;
|
|
60
|
+
name?: string | undefined;
|
|
61
|
+
}[] | undefined;
|
|
62
|
+
}>>;
|
|
63
|
+
/** Default theme appearance configuration */
|
|
64
|
+
theme: z.ZodOptional<z.ZodObject<{
|
|
65
|
+
/** Path to a custom logo image */
|
|
66
|
+
logo: z.ZodOptional<z.ZodString>;
|
|
67
|
+
/** Primary brand color (CSS color value) — shorthand for colors.primary */
|
|
68
|
+
primaryColor: z.ZodOptional<z.ZodString>;
|
|
69
|
+
/** Secondary/accent brand color (CSS color value) */
|
|
70
|
+
accentColor: z.ZodOptional<z.ZodString>;
|
|
71
|
+
/** Font family for body text */
|
|
72
|
+
fontFamily: z.ZodOptional<z.ZodString>;
|
|
73
|
+
/** Font family for code blocks */
|
|
74
|
+
codeFontFamily: z.ZodOptional<z.ZodString>;
|
|
75
|
+
/** Footer text or copyright notice */
|
|
76
|
+
footer: z.ZodOptional<z.ZodString>;
|
|
77
|
+
/** Path to favicon image (relative to public directory) */
|
|
78
|
+
favicon: z.ZodOptional<z.ZodString>;
|
|
79
|
+
/** Path to social/OG image for link previews (relative to public directory) */
|
|
80
|
+
socialImage: z.ZodOptional<z.ZodString>;
|
|
81
|
+
/** Header navigation links */
|
|
82
|
+
headerLinks: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
83
|
+
/** Display label for the link */
|
|
84
|
+
label: z.ZodString;
|
|
85
|
+
/** URL the link navigates to */
|
|
86
|
+
href: z.ZodString;
|
|
87
|
+
}, "strip", z.ZodTypeAny, {
|
|
88
|
+
label: string;
|
|
89
|
+
href: string;
|
|
90
|
+
}, {
|
|
91
|
+
label: string;
|
|
92
|
+
href: string;
|
|
93
|
+
}>, "many">>;
|
|
94
|
+
/** Semantic color tokens for CSS custom property theming */
|
|
95
|
+
colors: z.ZodOptional<z.ZodObject<{
|
|
96
|
+
/** Primary brand color — applies to both modes */
|
|
97
|
+
primary: z.ZodOptional<z.ZodString>;
|
|
98
|
+
/** Secondary/accent brand color — applies to both modes */
|
|
99
|
+
accent: z.ZodOptional<z.ZodString>;
|
|
100
|
+
/** Page background color (light/dark pair or dark-only string) */
|
|
101
|
+
background: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
|
|
102
|
+
light: z.ZodOptional<z.ZodString>;
|
|
103
|
+
dark: z.ZodOptional<z.ZodString>;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
light?: string | undefined;
|
|
106
|
+
dark?: string | undefined;
|
|
107
|
+
}, {
|
|
108
|
+
light?: string | undefined;
|
|
109
|
+
dark?: string | undefined;
|
|
110
|
+
}>]>>;
|
|
111
|
+
/** Default text color (light/dark pair or dark-only string) */
|
|
112
|
+
foreground: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
|
|
113
|
+
light: z.ZodOptional<z.ZodString>;
|
|
114
|
+
dark: z.ZodOptional<z.ZodString>;
|
|
115
|
+
}, "strip", z.ZodTypeAny, {
|
|
116
|
+
light?: string | undefined;
|
|
117
|
+
dark?: string | undefined;
|
|
118
|
+
}, {
|
|
119
|
+
light?: string | undefined;
|
|
120
|
+
dark?: string | undefined;
|
|
121
|
+
}>]>>;
|
|
122
|
+
/** Muted/secondary text color (light/dark pair or dark-only string) */
|
|
123
|
+
muted: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
|
|
124
|
+
light: z.ZodOptional<z.ZodString>;
|
|
125
|
+
dark: z.ZodOptional<z.ZodString>;
|
|
126
|
+
}, "strip", z.ZodTypeAny, {
|
|
127
|
+
light?: string | undefined;
|
|
128
|
+
dark?: string | undefined;
|
|
129
|
+
}, {
|
|
130
|
+
light?: string | undefined;
|
|
131
|
+
dark?: string | undefined;
|
|
132
|
+
}>]>>;
|
|
133
|
+
/** Border color (light/dark pair or dark-only string) */
|
|
134
|
+
border: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
|
|
135
|
+
light: z.ZodOptional<z.ZodString>;
|
|
136
|
+
dark: z.ZodOptional<z.ZodString>;
|
|
137
|
+
}, "strip", z.ZodTypeAny, {
|
|
138
|
+
light?: string | undefined;
|
|
139
|
+
dark?: string | undefined;
|
|
140
|
+
}, {
|
|
141
|
+
light?: string | undefined;
|
|
142
|
+
dark?: string | undefined;
|
|
143
|
+
}>]>>;
|
|
144
|
+
}, "strip", z.ZodTypeAny, {
|
|
145
|
+
primary?: string | undefined;
|
|
146
|
+
accent?: string | undefined;
|
|
147
|
+
background?: string | {
|
|
148
|
+
light?: string | undefined;
|
|
149
|
+
dark?: string | undefined;
|
|
150
|
+
} | undefined;
|
|
151
|
+
foreground?: string | {
|
|
152
|
+
light?: string | undefined;
|
|
153
|
+
dark?: string | undefined;
|
|
154
|
+
} | undefined;
|
|
155
|
+
muted?: string | {
|
|
156
|
+
light?: string | undefined;
|
|
157
|
+
dark?: string | undefined;
|
|
158
|
+
} | undefined;
|
|
159
|
+
border?: string | {
|
|
160
|
+
light?: string | undefined;
|
|
161
|
+
dark?: string | undefined;
|
|
162
|
+
} | undefined;
|
|
163
|
+
}, {
|
|
164
|
+
primary?: string | undefined;
|
|
165
|
+
accent?: string | undefined;
|
|
166
|
+
background?: string | {
|
|
167
|
+
light?: string | undefined;
|
|
168
|
+
dark?: string | undefined;
|
|
169
|
+
} | undefined;
|
|
170
|
+
foreground?: string | {
|
|
171
|
+
light?: string | undefined;
|
|
172
|
+
dark?: string | undefined;
|
|
173
|
+
} | undefined;
|
|
174
|
+
muted?: string | {
|
|
175
|
+
light?: string | undefined;
|
|
176
|
+
dark?: string | undefined;
|
|
177
|
+
} | undefined;
|
|
178
|
+
border?: string | {
|
|
179
|
+
light?: string | undefined;
|
|
180
|
+
dark?: string | undefined;
|
|
181
|
+
} | undefined;
|
|
182
|
+
}>>;
|
|
183
|
+
}, "strip", z.ZodTypeAny, {
|
|
184
|
+
logo?: string | undefined;
|
|
185
|
+
primaryColor?: string | undefined;
|
|
186
|
+
accentColor?: string | undefined;
|
|
187
|
+
fontFamily?: string | undefined;
|
|
188
|
+
codeFontFamily?: string | undefined;
|
|
189
|
+
footer?: string | undefined;
|
|
190
|
+
favicon?: string | undefined;
|
|
191
|
+
socialImage?: string | undefined;
|
|
192
|
+
headerLinks?: {
|
|
193
|
+
label: string;
|
|
194
|
+
href: string;
|
|
195
|
+
}[] | undefined;
|
|
196
|
+
colors?: {
|
|
197
|
+
primary?: string | undefined;
|
|
198
|
+
accent?: string | undefined;
|
|
199
|
+
background?: string | {
|
|
200
|
+
light?: string | undefined;
|
|
201
|
+
dark?: string | undefined;
|
|
202
|
+
} | undefined;
|
|
203
|
+
foreground?: string | {
|
|
204
|
+
light?: string | undefined;
|
|
205
|
+
dark?: string | undefined;
|
|
206
|
+
} | undefined;
|
|
207
|
+
muted?: string | {
|
|
208
|
+
light?: string | undefined;
|
|
209
|
+
dark?: string | undefined;
|
|
210
|
+
} | undefined;
|
|
211
|
+
border?: string | {
|
|
212
|
+
light?: string | undefined;
|
|
213
|
+
dark?: string | undefined;
|
|
214
|
+
} | undefined;
|
|
215
|
+
} | undefined;
|
|
216
|
+
}, {
|
|
217
|
+
logo?: string | undefined;
|
|
218
|
+
primaryColor?: string | undefined;
|
|
219
|
+
accentColor?: string | undefined;
|
|
220
|
+
fontFamily?: string | undefined;
|
|
221
|
+
codeFontFamily?: string | undefined;
|
|
222
|
+
footer?: string | undefined;
|
|
223
|
+
favicon?: string | undefined;
|
|
224
|
+
socialImage?: string | undefined;
|
|
225
|
+
headerLinks?: {
|
|
226
|
+
label: string;
|
|
227
|
+
href: string;
|
|
228
|
+
}[] | undefined;
|
|
229
|
+
colors?: {
|
|
230
|
+
primary?: string | undefined;
|
|
231
|
+
accent?: string | undefined;
|
|
232
|
+
background?: string | {
|
|
233
|
+
light?: string | undefined;
|
|
234
|
+
dark?: string | undefined;
|
|
235
|
+
} | undefined;
|
|
236
|
+
foreground?: string | {
|
|
237
|
+
light?: string | undefined;
|
|
238
|
+
dark?: string | undefined;
|
|
239
|
+
} | undefined;
|
|
240
|
+
muted?: string | {
|
|
241
|
+
light?: string | undefined;
|
|
242
|
+
dark?: string | undefined;
|
|
243
|
+
} | undefined;
|
|
244
|
+
border?: string | {
|
|
245
|
+
light?: string | undefined;
|
|
246
|
+
dark?: string | undefined;
|
|
247
|
+
} | undefined;
|
|
248
|
+
} | undefined;
|
|
249
|
+
}>>;
|
|
250
|
+
/** Build output configuration */
|
|
251
|
+
build: z.ZodOptional<z.ZodObject<{
|
|
252
|
+
/** Output directory for the build (relative to project root) */
|
|
253
|
+
outDir: z.ZodOptional<z.ZodString>;
|
|
254
|
+
}, "strip", z.ZodTypeAny, {
|
|
255
|
+
outDir?: string | undefined;
|
|
256
|
+
}, {
|
|
257
|
+
outDir?: string | undefined;
|
|
258
|
+
}>>;
|
|
259
|
+
}, "strip", z.ZodTypeAny, {
|
|
260
|
+
site?: {
|
|
261
|
+
title?: string | undefined;
|
|
262
|
+
description?: string | undefined;
|
|
263
|
+
url?: string | undefined;
|
|
264
|
+
} | undefined;
|
|
265
|
+
sidebar?: {
|
|
266
|
+
enabled?: boolean | undefined;
|
|
267
|
+
defaultCollapsed?: boolean | undefined;
|
|
268
|
+
} | undefined;
|
|
269
|
+
openapi?: {
|
|
270
|
+
specs?: {
|
|
271
|
+
path: string;
|
|
272
|
+
name?: string | undefined;
|
|
273
|
+
}[] | undefined;
|
|
274
|
+
} | undefined;
|
|
275
|
+
theme?: {
|
|
276
|
+
logo?: string | undefined;
|
|
277
|
+
primaryColor?: string | undefined;
|
|
278
|
+
accentColor?: string | undefined;
|
|
279
|
+
fontFamily?: string | undefined;
|
|
280
|
+
codeFontFamily?: string | undefined;
|
|
281
|
+
footer?: string | undefined;
|
|
282
|
+
favicon?: string | undefined;
|
|
283
|
+
socialImage?: string | undefined;
|
|
284
|
+
headerLinks?: {
|
|
285
|
+
label: string;
|
|
286
|
+
href: string;
|
|
287
|
+
}[] | undefined;
|
|
288
|
+
colors?: {
|
|
289
|
+
primary?: string | undefined;
|
|
290
|
+
accent?: string | undefined;
|
|
291
|
+
background?: string | {
|
|
292
|
+
light?: string | undefined;
|
|
293
|
+
dark?: string | undefined;
|
|
294
|
+
} | undefined;
|
|
295
|
+
foreground?: string | {
|
|
296
|
+
light?: string | undefined;
|
|
297
|
+
dark?: string | undefined;
|
|
298
|
+
} | undefined;
|
|
299
|
+
muted?: string | {
|
|
300
|
+
light?: string | undefined;
|
|
301
|
+
dark?: string | undefined;
|
|
302
|
+
} | undefined;
|
|
303
|
+
border?: string | {
|
|
304
|
+
light?: string | undefined;
|
|
305
|
+
dark?: string | undefined;
|
|
306
|
+
} | undefined;
|
|
307
|
+
} | undefined;
|
|
308
|
+
} | undefined;
|
|
309
|
+
build?: {
|
|
310
|
+
outDir?: string | undefined;
|
|
311
|
+
} | undefined;
|
|
312
|
+
}, {
|
|
313
|
+
site?: {
|
|
314
|
+
title?: string | undefined;
|
|
315
|
+
description?: string | undefined;
|
|
316
|
+
url?: string | undefined;
|
|
317
|
+
} | undefined;
|
|
318
|
+
sidebar?: {
|
|
319
|
+
enabled?: boolean | undefined;
|
|
320
|
+
defaultCollapsed?: boolean | undefined;
|
|
321
|
+
} | undefined;
|
|
322
|
+
openapi?: {
|
|
323
|
+
specs?: {
|
|
324
|
+
path: string;
|
|
325
|
+
name?: string | undefined;
|
|
326
|
+
}[] | undefined;
|
|
327
|
+
} | undefined;
|
|
328
|
+
theme?: {
|
|
329
|
+
logo?: string | undefined;
|
|
330
|
+
primaryColor?: string | undefined;
|
|
331
|
+
accentColor?: string | undefined;
|
|
332
|
+
fontFamily?: string | undefined;
|
|
333
|
+
codeFontFamily?: string | undefined;
|
|
334
|
+
footer?: string | undefined;
|
|
335
|
+
favicon?: string | undefined;
|
|
336
|
+
socialImage?: string | undefined;
|
|
337
|
+
headerLinks?: {
|
|
338
|
+
label: string;
|
|
339
|
+
href: string;
|
|
340
|
+
}[] | undefined;
|
|
341
|
+
colors?: {
|
|
342
|
+
primary?: string | undefined;
|
|
343
|
+
accent?: string | undefined;
|
|
344
|
+
background?: string | {
|
|
345
|
+
light?: string | undefined;
|
|
346
|
+
dark?: string | undefined;
|
|
347
|
+
} | undefined;
|
|
348
|
+
foreground?: string | {
|
|
349
|
+
light?: string | undefined;
|
|
350
|
+
dark?: string | undefined;
|
|
351
|
+
} | undefined;
|
|
352
|
+
muted?: string | {
|
|
353
|
+
light?: string | undefined;
|
|
354
|
+
dark?: string | undefined;
|
|
355
|
+
} | undefined;
|
|
356
|
+
border?: string | {
|
|
357
|
+
light?: string | undefined;
|
|
358
|
+
dark?: string | undefined;
|
|
359
|
+
} | undefined;
|
|
360
|
+
} | undefined;
|
|
361
|
+
} | undefined;
|
|
362
|
+
build?: {
|
|
363
|
+
outDir?: string | undefined;
|
|
364
|
+
} | undefined;
|
|
365
|
+
}>;
|
|
366
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4FxB;;;GAGG;AACH,eAAO,MAAM,YAAY;IACvB,oBAAoB;;QAGhB,qDAAqD;;QAErD,yCAAyC;;QAEzC,yCAAyC;;;;;;;;;;;IAK7C,uCAAuC;;QAjGvC,+CAA+C;;QAE/C,gDAAgD;;;;;;;;;IAkGhD,wEAAwE;;QA9BxE,oCAAoC;;YA9EpC,+DAA+D;;YAE/D,0CAA0C;;;;;;;;;;;;;;;;;;;;IA6G1C,6CAA6C;;QAzD7C,kCAAkC;;QAElC,2EAA2E;;QAE3E,qDAAqD;;QAErD,gCAAgC;;QAEhC,kCAAkC;;QAElC,sCAAsC;;QAEtC,2DAA2D;;QAE3D,+EAA+E;;QAE/E,8BAA8B;;YAtD9B,iCAAiC;;YAEjC,gCAAgC;;;;;;;;;QAsDhC,4DAA4D;;YAlC5D,kDAAkD;;YAElD,2DAA2D;;YAE3D,kEAAkE;;;;;;;;;;;YAElE,+DAA+D;;;;;;;;;;;YAE/D,uEAAuE;;;;;;;;;;;YAEvE,yDAAyD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkEzD,iCAAiC;;QA9BjC,gEAAgE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgChE,CAAC"}
|