jamdesk 1.0.19 → 1.0.20
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/__tests__/unit/openapi.test.js +12 -0
- package/dist/__tests__/unit/openapi.test.js.map +1 -1
- package/dist/commands/openapi-check.d.ts.map +1 -1
- package/dist/commands/openapi-check.js +7 -13
- package/dist/commands/openapi-check.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/deps.js +1 -1
- package/dist/lib/openapi/errors.d.ts.map +1 -1
- package/dist/lib/openapi/errors.js +17 -0
- package/dist/lib/openapi/errors.js.map +1 -1
- package/dist/lib/openapi/validator.d.ts +2 -2
- package/dist/lib/openapi/validator.d.ts.map +1 -1
- package/dist/lib/openapi/validator.js +52 -15
- package/dist/lib/openapi/validator.js.map +1 -1
- package/package.json +2 -2
- package/vendored/app/[[...slug]]/page.tsx +97 -26
- package/vendored/app/api/ev/route.ts +4 -1
- package/vendored/app/api/indexnow/[key]/route.ts +34 -0
- package/vendored/components/chat/ChatInput.tsx +1 -1
- package/vendored/components/chat/ChatPanel.tsx +60 -11
- package/vendored/components/mdx/Update.tsx +7 -7
- package/vendored/components/navigation/Sidebar.tsx +2 -10
- package/vendored/components/navigation/TableOfContents.tsx +48 -35
- package/vendored/components/search/SearchModal.tsx +2 -0
- package/vendored/components/ui/CodePanelModal.tsx +5 -14
- package/vendored/hooks/useBodyScrollLock.ts +37 -0
- package/vendored/lib/docs-types.ts +1 -0
- package/vendored/lib/email-templates/components/base-layout.tsx +15 -15
- package/vendored/lib/heading-extractor.ts +2 -2
- package/vendored/lib/indexnow.ts +77 -0
- package/vendored/lib/json-ld.ts +171 -0
- package/vendored/lib/middleware-helpers.ts +1 -0
- package/vendored/lib/openapi/errors.ts +21 -1
- package/vendored/lib/openapi/validator.ts +70 -23
- package/vendored/lib/route-helpers.ts +7 -2
- package/vendored/lib/seo.ts +65 -0
- package/vendored/lib/static-artifacts.ts +204 -5
- package/vendored/lib/static-file-route.ts +6 -4
- package/vendored/schema/docs-schema.json +115 -5
- package/vendored/scripts/validate-links.cjs +1 -1
|
@@ -36,6 +36,18 @@ describe('CLI OpenAPI Validation', () => {
|
|
|
36
36
|
expect(result.valid).toBe(true);
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
|
+
describe('URL validation', () => {
|
|
40
|
+
it('validates a spec from a URL', async () => {
|
|
41
|
+
const result = await validateOpenApiSpec('https://petstore3.swagger.io/api/v3/openapi.json', fixturesDir);
|
|
42
|
+
expect(result.valid).toBe(true);
|
|
43
|
+
expect(result.api).toBeDefined();
|
|
44
|
+
}, 15000);
|
|
45
|
+
it('returns error for unreachable URL', async () => {
|
|
46
|
+
const result = await validateOpenApiSpec('https://nonexistent.invalid/openapi.json', fixturesDir);
|
|
47
|
+
expect(result.valid).toBe(false);
|
|
48
|
+
expect(result.error).toBeDefined();
|
|
49
|
+
}, 15000);
|
|
50
|
+
});
|
|
39
51
|
describe('formatErrorForCli', () => {
|
|
40
52
|
it('formats error with colors', async () => {
|
|
41
53
|
const projectDir = path.join(fixturesDir, 'openapi-project');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/openapi.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openapi.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/openapi.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-check.d.ts","sourceRoot":"","sources":["../../src/commands/openapi-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"openapi-check.d.ts","sourceRoot":"","sources":["../../src/commands/openapi-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA0Ff"}
|
|
@@ -4,25 +4,19 @@
|
|
|
4
4
|
* Validates a single OpenAPI specification file.
|
|
5
5
|
* Similar to Mintlify's `mint openapi-check` command.
|
|
6
6
|
*/
|
|
7
|
-
import fs from 'fs-extra';
|
|
8
7
|
import path from 'path';
|
|
9
8
|
import { output } from '../lib/output.js';
|
|
10
9
|
import { validateOpenApiSpec, formatErrorForCli, clearSpecCache } from '../lib/openapi.js';
|
|
11
10
|
export async function openApiCheck(specPath, options) {
|
|
12
11
|
const { verbose } = options;
|
|
13
12
|
const projectDir = process.cwd();
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
output.error(`File not found: ${relativePath}`);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
// Clear cache
|
|
13
|
+
const isUrl = specPath.startsWith('http://') || specPath.startsWith('https://');
|
|
14
|
+
// For display: URLs show as-is, files show as relative paths
|
|
15
|
+
const displayPath = isUrl
|
|
16
|
+
? specPath
|
|
17
|
+
: path.relative(projectDir, path.resolve(projectDir, specPath));
|
|
23
18
|
clearSpecCache();
|
|
24
|
-
|
|
25
|
-
const result = await validateOpenApiSpec(relativePath, projectDir);
|
|
19
|
+
const result = await validateOpenApiSpec(isUrl ? specPath : displayPath, projectDir);
|
|
26
20
|
if (!result.valid || !result.api) {
|
|
27
21
|
console.log(formatErrorForCli(result.error));
|
|
28
22
|
process.exit(1);
|
|
@@ -57,7 +51,7 @@ export async function openApiCheck(specPath, options) {
|
|
|
57
51
|
}
|
|
58
52
|
}
|
|
59
53
|
// Success output
|
|
60
|
-
output.success(`${
|
|
54
|
+
output.success(`${displayPath} is valid ${versionLabel}`);
|
|
61
55
|
console.log('');
|
|
62
56
|
console.log(` \x1b[90m•\x1b[0m ${endpointCount} endpoint${endpointCount !== 1 ? 's' : ''} found`);
|
|
63
57
|
console.log(` \x1b[90m•\x1b[0m ${schemaCount} schema${schemaCount !== 1 ? 's' : ''} defined`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-check.js","sourceRoot":"","sources":["../../src/commands/openapi-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"openapi-check.js","sourceRoot":"","sources":["../../src/commands/openapi-check.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -130,12 +130,14 @@ program
|
|
|
130
130
|
Examples:
|
|
131
131
|
$ jamdesk openapi-check openapi.yaml
|
|
132
132
|
$ jamdesk openapi-check api/spec.json
|
|
133
|
+
$ jamdesk openapi-check https://petstore3.swagger.io/api/v3/openapi.json
|
|
133
134
|
|
|
134
135
|
Validates:
|
|
135
136
|
• Valid YAML/JSON syntax
|
|
136
137
|
• OpenAPI 3.x schema compliance
|
|
137
138
|
• Endpoint definitions
|
|
138
139
|
• $ref references resolve correctly
|
|
140
|
+
• Duplicate operationIds
|
|
139
141
|
|
|
140
142
|
Use this to validate OpenAPI specs before adding them to your docs.
|
|
141
143
|
`)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/deps.js
CHANGED
|
@@ -81,7 +81,7 @@ const REQUIRED_DEPS = {
|
|
|
81
81
|
'glob': '^13.0.6',
|
|
82
82
|
// TypeScript (needed for Next.js to avoid auto-install breaking symlink)
|
|
83
83
|
'typescript': '^5.3.3',
|
|
84
|
-
'@types/node': '^25.
|
|
84
|
+
'@types/node': '^25.3.3',
|
|
85
85
|
'@types/react': '^19.2.14',
|
|
86
86
|
'@types/react-dom': '^19.0.0',
|
|
87
87
|
'@next/third-parties': '^16.1.6',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/openapi/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,GACf,sBAAsB,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/openapi/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,GACf,sBAAsB,CA2GxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAOhF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,sBAAsB,CAOxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,sBAAsB,CAQxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAUhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAkBvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAWzE"}
|
|
@@ -63,6 +63,23 @@ export function formatOpenApiError(err, specPath) {
|
|
|
63
63
|
details: message,
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
|
+
// Network/fetch error (URL validation) — check before "invalid" pattern
|
|
67
|
+
// since URLs may contain "invalid" in the domain name
|
|
68
|
+
if (message.includes('ENOTFOUND') ||
|
|
69
|
+
message.includes('ECONNREFUSED') ||
|
|
70
|
+
message.includes('getaddrinfo') ||
|
|
71
|
+
message.includes('ETIMEDOUT') ||
|
|
72
|
+
message.includes('request to') ||
|
|
73
|
+
message.includes('fetch failed') ||
|
|
74
|
+
message.includes('Error downloading')) {
|
|
75
|
+
return {
|
|
76
|
+
type: 'validation_error',
|
|
77
|
+
specPath,
|
|
78
|
+
message: `Failed to fetch OpenAPI specification: ${specPath}`,
|
|
79
|
+
suggestion: 'Check that the URL is correct and the server is accessible.',
|
|
80
|
+
details: message,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
66
83
|
// Invalid type or value
|
|
67
84
|
if (message.includes('type') || message.includes('must be') || message.includes('invalid')) {
|
|
68
85
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/openapi/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/openapi/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
import type { OpenAPI } from 'openapi-types';
|
|
8
8
|
import type { ValidationResult } from './types.js';
|
|
9
9
|
/**
|
|
10
|
-
* Validate an OpenAPI specification file
|
|
10
|
+
* Validate an OpenAPI specification file or URL
|
|
11
11
|
*
|
|
12
12
|
* This validates the spec against the OpenAPI schema and resolves all $ref references.
|
|
13
13
|
* The returned api object has all references dereferenced (inlined).
|
|
14
14
|
*
|
|
15
|
-
* @param specPath - Path to the spec file (relative to projectDir)
|
|
15
|
+
* @param specPath - Path to the spec file (relative to projectDir) or a URL
|
|
16
16
|
* @param projectDir - Project root directory
|
|
17
17
|
* @returns Validation result with dereferenced API document if valid
|
|
18
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/lib/openapi/validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/lib/openapi/validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,YAAY,CAAC;AA2D3E;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAiD3B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,EAAE,CAAC,CASvD;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBtE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAalC"}
|
|
@@ -27,36 +27,73 @@ function detectVersion(api) {
|
|
|
27
27
|
return '3.0';
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
30
|
+
* Check for duplicate operationIds across all endpoints.
|
|
31
|
+
* SwaggerParser.validate() does not catch these, but they break
|
|
32
|
+
* docs navigation and routing.
|
|
33
|
+
*/
|
|
34
|
+
function checkDuplicateOperationIds(api, specPath) {
|
|
35
|
+
const seen = new Map(); // operationId → "METHOD /path"
|
|
36
|
+
const paths = api.paths || {};
|
|
37
|
+
const methods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
|
|
38
|
+
for (const [pathStr, pathItem] of Object.entries(paths)) {
|
|
39
|
+
for (const method of methods) {
|
|
40
|
+
const operation = pathItem?.[method];
|
|
41
|
+
if (!operation?.operationId)
|
|
42
|
+
continue;
|
|
43
|
+
const id = operation.operationId;
|
|
44
|
+
const endpoint = `${method.toUpperCase()} ${pathStr}`;
|
|
45
|
+
if (seen.has(id)) {
|
|
46
|
+
return {
|
|
47
|
+
type: 'validation_error',
|
|
48
|
+
specPath,
|
|
49
|
+
message: `Duplicate operationId "${id}" in OpenAPI specification: ${specPath}`,
|
|
50
|
+
suggestion: `operationId "${id}" is used by both ${seen.get(id)} and ${endpoint}. Each operationId must be unique.`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
seen.set(id, endpoint);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validate an OpenAPI specification file or URL
|
|
31
60
|
*
|
|
32
61
|
* This validates the spec against the OpenAPI schema and resolves all $ref references.
|
|
33
62
|
* The returned api object has all references dereferenced (inlined).
|
|
34
63
|
*
|
|
35
|
-
* @param specPath - Path to the spec file (relative to projectDir)
|
|
64
|
+
* @param specPath - Path to the spec file (relative to projectDir) or a URL
|
|
36
65
|
* @param projectDir - Project root directory
|
|
37
66
|
* @returns Validation result with dereferenced API document if valid
|
|
38
67
|
*/
|
|
39
68
|
export async function validateOpenApiSpec(specPath, projectDir) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
69
|
+
const isUrl = specPath.startsWith('http://') || specPath.startsWith('https://');
|
|
70
|
+
let target;
|
|
71
|
+
if (isUrl) {
|
|
72
|
+
// SwaggerParser.validate() natively supports URLs
|
|
73
|
+
target = specPath;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const normalizedPath = specPath.startsWith('/') ? specPath.slice(1) : specPath;
|
|
77
|
+
target = path.join(projectDir, normalizedPath);
|
|
78
|
+
if (!fs.existsSync(target)) {
|
|
79
|
+
return {
|
|
80
|
+
valid: false,
|
|
81
|
+
error: createFileNotFoundError(specPath),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
49
84
|
}
|
|
50
85
|
try {
|
|
51
|
-
|
|
52
|
-
// This throws if validation fails
|
|
53
|
-
const api = await SwaggerParser.validate(fullPath);
|
|
86
|
+
const api = await SwaggerParser.validate(target);
|
|
54
87
|
const version = detectVersion(api);
|
|
55
|
-
// Warn about Swagger 2.0
|
|
56
88
|
if (version === '2.0') {
|
|
57
89
|
console.warn(`Note: ${specPath} uses OpenAPI 2.0 (Swagger). ` +
|
|
58
90
|
`Consider upgrading to OpenAPI 3.0+ for full feature support.`);
|
|
59
91
|
}
|
|
92
|
+
// Check for duplicate operationIds (swagger-parser doesn't catch these)
|
|
93
|
+
const duplicateError = checkDuplicateOperationIds(api, specPath);
|
|
94
|
+
if (duplicateError) {
|
|
95
|
+
return { valid: false, error: duplicateError };
|
|
96
|
+
}
|
|
60
97
|
return {
|
|
61
98
|
valid: true,
|
|
62
99
|
api,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/openapi/validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,SAAS,aAAa,CAAC,GAAqB;IAC1C,kCAAkC;IAClC,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxD,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,kCAAkC;IAClC,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,oCAAoC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,UAAkB;IAElB,
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/openapi/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jamdesk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.20",
|
|
4
4
|
"description": "CLI for Jamdesk — build, preview, and deploy documentation sites from MDX. Dev server with hot reload, 50+ components, OpenAPI support, AI search, and Mintlify migration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jamdesk",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"devDependencies": {
|
|
111
111
|
"@mdx-js/mdx": "^3.1.1",
|
|
112
112
|
"@types/fs-extra": "^11.0.0",
|
|
113
|
-
"@types/node": "^25.
|
|
113
|
+
"@types/node": "^25.3.3",
|
|
114
114
|
"typescript": "^5.3.0",
|
|
115
115
|
"vitest": "^4.0.18"
|
|
116
116
|
},
|
|
@@ -47,7 +47,8 @@ import fs from 'fs';
|
|
|
47
47
|
import path from 'path';
|
|
48
48
|
import matter from 'gray-matter';
|
|
49
49
|
import { getDocsConfig, getContentDir } from '@/lib/docs';
|
|
50
|
-
import { buildSeoMetadata } from '@/lib/seo';
|
|
50
|
+
import { buildSeoMetadata, generateAutoDescription } from '@/lib/seo';
|
|
51
|
+
import { buildJsonLd } from '@/lib/json-ld';
|
|
51
52
|
import {
|
|
52
53
|
getContentLoader,
|
|
53
54
|
isIsrMode,
|
|
@@ -104,6 +105,24 @@ interface PageProps {
|
|
|
104
105
|
}>;
|
|
105
106
|
}
|
|
106
107
|
|
|
108
|
+
const DEFAULT_SITE_URL = 'https://docs.example.com';
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Resolve the base URL for SEO metadata and JSON-LD.
|
|
112
|
+
* ISR mode: derived from request headers (handles custom domains).
|
|
113
|
+
* Static mode: uses SITE_URL env var set during build.
|
|
114
|
+
*/
|
|
115
|
+
function resolveBaseUrl(
|
|
116
|
+
requestHeaders: Headers | null,
|
|
117
|
+
projectSlug: string | null,
|
|
118
|
+
hostAtDocs: boolean
|
|
119
|
+
): string {
|
|
120
|
+
if (requestHeaders && projectSlug) {
|
|
121
|
+
return getBaseUrl(requestHeaders, projectSlug, hostAtDocs);
|
|
122
|
+
}
|
|
123
|
+
return process.env.SITE_URL || DEFAULT_SITE_URL;
|
|
124
|
+
}
|
|
125
|
+
|
|
107
126
|
/**
|
|
108
127
|
* Frontmatter data from MDX files.
|
|
109
128
|
*/
|
|
@@ -114,6 +133,7 @@ interface FrontmatterData {
|
|
|
114
133
|
openapi?: string;
|
|
115
134
|
mode?: string;
|
|
116
135
|
hideFooter?: boolean;
|
|
136
|
+
rss?: boolean;
|
|
117
137
|
[key: string]: unknown;
|
|
118
138
|
}
|
|
119
139
|
|
|
@@ -342,15 +362,12 @@ export async function generateMetadata({ params }: PageProps) {
|
|
|
342
362
|
const parsed = parseFrontmatter(fileContents);
|
|
343
363
|
const data = parsed.data as FrontmatterData;
|
|
344
364
|
|
|
345
|
-
//
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
const baseUrl = requestHeaders && projectSlug
|
|
350
|
-
? getBaseUrl(requestHeaders, projectSlug, hostAtDocs)
|
|
351
|
-
: (process.env.SITE_URL || 'https://docs.example.com');
|
|
365
|
+
// Auto-generate description from content when frontmatter has none
|
|
366
|
+
if (!data.description) {
|
|
367
|
+
data.description = generateAutoDescription(parsed.content);
|
|
368
|
+
}
|
|
352
369
|
|
|
353
|
-
|
|
370
|
+
const baseUrl = resolveBaseUrl(requestHeaders, projectSlug, hostAtDocs);
|
|
354
371
|
const languages = config.navigation?.languages;
|
|
355
372
|
|
|
356
373
|
const seoMetadata = buildSeoMetadata(config, data, pagePath, baseUrl, languages);
|
|
@@ -359,6 +376,14 @@ export async function generateMetadata({ params }: PageProps) {
|
|
|
359
376
|
title: data.title || `${config.name} Documentation`,
|
|
360
377
|
description: data.description || '',
|
|
361
378
|
...seoMetadata,
|
|
379
|
+
...(data.rss ? {
|
|
380
|
+
alternates: {
|
|
381
|
+
...seoMetadata.alternates,
|
|
382
|
+
types: {
|
|
383
|
+
'application/rss+xml': hostAtDocs ? '/docs/feed.xml' : '/feed.xml',
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
} : {}),
|
|
362
387
|
};
|
|
363
388
|
}
|
|
364
389
|
|
|
@@ -368,10 +393,11 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
368
393
|
// Get project from request headers (only present in ISR mode)
|
|
369
394
|
let projectSlug: string | null = null;
|
|
370
395
|
let hostAtDocs = process.env.HOST_AT_DOCS === 'true'; // Local dev fallback
|
|
396
|
+
let requestHeaders: Headers | null = null;
|
|
371
397
|
if (isIsrMode()) {
|
|
372
|
-
|
|
373
|
-
projectSlug = getProjectFromRequest(
|
|
374
|
-
hostAtDocs = getHostAtDocs(
|
|
398
|
+
requestHeaders = await headers();
|
|
399
|
+
projectSlug = getProjectFromRequest(requestHeaders);
|
|
400
|
+
hostAtDocs = getHostAtDocs(requestHeaders);
|
|
375
401
|
if (!projectSlug) {
|
|
376
402
|
notFound(); // Project not resolved by middleware
|
|
377
403
|
}
|
|
@@ -423,6 +449,25 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
423
449
|
const data = parsed.data as FrontmatterData;
|
|
424
450
|
const rawContent = parsed.content;
|
|
425
451
|
|
|
452
|
+
// JSON-LD structured data for rich search results.
|
|
453
|
+
// XSS-safe: replaces < with unicode escape per Next.js guide.
|
|
454
|
+
// Same pattern as marketing/app/layout.tsx and marketing/app/blog/[slug]/page.tsx.
|
|
455
|
+
const baseUrl = resolveBaseUrl(requestHeaders, projectSlug, hostAtDocs);
|
|
456
|
+
const jsonLd = buildJsonLd({
|
|
457
|
+
config,
|
|
458
|
+
pagePath,
|
|
459
|
+
pageTitle: data.title || pagePath,
|
|
460
|
+
baseUrl,
|
|
461
|
+
});
|
|
462
|
+
const jsonLdScript = (
|
|
463
|
+
<script
|
|
464
|
+
type="application/ld+json"
|
|
465
|
+
dangerouslySetInnerHTML={{
|
|
466
|
+
__html: JSON.stringify(jsonLd).replace(/</g, '\\u003c'),
|
|
467
|
+
}}
|
|
468
|
+
/>
|
|
469
|
+
);
|
|
470
|
+
|
|
426
471
|
// Get cached Shiki highlighter for syntax highlighting
|
|
427
472
|
// This singleton is reused across all page renders for performance
|
|
428
473
|
const highlighter = await getHighlighter();
|
|
@@ -566,6 +611,23 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
566
611
|
}
|
|
567
612
|
}
|
|
568
613
|
|
|
614
|
+
// RSS feed icon for pages with rss: true
|
|
615
|
+
const rssIcon = data.rss ? (
|
|
616
|
+
<a
|
|
617
|
+
href={hostAtDocs ? '/docs/feed.xml' : '/feed.xml'}
|
|
618
|
+
target="_blank"
|
|
619
|
+
rel="noopener noreferrer"
|
|
620
|
+
aria-label="Subscribe to RSS feed"
|
|
621
|
+
title="RSS feed"
|
|
622
|
+
className="flex-shrink-0 text-[var(--color-text-muted)] hover:text-[var(--color-primary)] transition-colors cursor-pointer"
|
|
623
|
+
>
|
|
624
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="w-5 h-5">
|
|
625
|
+
<circle cx="6.18" cy="17.82" r="2.18" />
|
|
626
|
+
<path d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z" />
|
|
627
|
+
</svg>
|
|
628
|
+
</a>
|
|
629
|
+
) : null;
|
|
630
|
+
|
|
569
631
|
// Prose class for MDX content styling (defined in base.css)
|
|
570
632
|
const proseClasses = 'prose max-w-none';
|
|
571
633
|
|
|
@@ -573,7 +635,7 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
573
635
|
// so code panels can be positioned as siblings at the page level
|
|
574
636
|
if (isApiPage) {
|
|
575
637
|
return (
|
|
576
|
-
<ApiPageWrapper>
|
|
638
|
+
<>{jsonLdScript}<ApiPageWrapper>
|
|
577
639
|
<article className="px-4 sm:px-6 lg:px-8 py-6 sm:py-10 flex-1 min-w-0">
|
|
578
640
|
{/* Breadcrumb */}
|
|
579
641
|
<Breadcrumb slug={slug} config={config} />
|
|
@@ -581,11 +643,14 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
581
643
|
{/* Page Header */}
|
|
582
644
|
{data.title && (
|
|
583
645
|
<header className="mb-4 sm:mb-6">
|
|
584
|
-
<
|
|
585
|
-
|
|
586
|
-
|
|
646
|
+
<div className="flex items-center gap-3">
|
|
647
|
+
<h1 className="text-2xl sm:text-3xl lg:text-4xl font-bold text-theme-text-primary tracking-tight">
|
|
648
|
+
{data.title}
|
|
649
|
+
</h1>
|
|
650
|
+
{rssIcon}
|
|
651
|
+
</div>
|
|
587
652
|
{data.description && (
|
|
588
|
-
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed">
|
|
653
|
+
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed mt-2 sm:mt-3">
|
|
589
654
|
{data.description}
|
|
590
655
|
</p>
|
|
591
656
|
)}
|
|
@@ -634,7 +699,7 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
634
699
|
<PageNavigation currentSlug={slug.join('/')} config={config} />
|
|
635
700
|
<SocialFooter config={config} hidden={data.hideFooter} />
|
|
636
701
|
</article>
|
|
637
|
-
</ApiPageWrapper
|
|
702
|
+
</ApiPageWrapper></>
|
|
638
703
|
);
|
|
639
704
|
}
|
|
640
705
|
|
|
@@ -664,11 +729,14 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
664
729
|
{/* Page Header */}
|
|
665
730
|
{data.title && (
|
|
666
731
|
<header className="mb-6 sm:mb-10">
|
|
667
|
-
<
|
|
668
|
-
|
|
669
|
-
|
|
732
|
+
<div className="flex items-center gap-3">
|
|
733
|
+
<h1 className="text-2xl sm:text-3xl lg:text-4xl font-bold text-theme-text-primary tracking-tight">
|
|
734
|
+
{data.title}
|
|
735
|
+
</h1>
|
|
736
|
+
{rssIcon}
|
|
737
|
+
</div>
|
|
670
738
|
{data.description && (
|
|
671
|
-
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed">
|
|
739
|
+
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed mt-2 sm:mt-3">
|
|
672
740
|
{data.description}
|
|
673
741
|
</p>
|
|
674
742
|
)}
|
|
@@ -688,14 +756,17 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
688
756
|
|
|
689
757
|
// Pages with Panel component: use PanelWrapper to move Panel content to sidebar
|
|
690
758
|
if (hasPanel) {
|
|
691
|
-
return <PanelWrapper>{articleContent}</PanelWrapper
|
|
759
|
+
return <>{jsonLdScript}<PanelWrapper>{articleContent}</PanelWrapper></>;
|
|
692
760
|
}
|
|
693
761
|
|
|
694
762
|
// Non-API pages: standard layout with Table of Contents (or inline chat)
|
|
695
763
|
// PageColumns handles TOC ↔ chat column switching on xl+ screens
|
|
696
764
|
return (
|
|
697
|
-
|
|
698
|
-
{
|
|
699
|
-
|
|
765
|
+
<>
|
|
766
|
+
{jsonLdScript}
|
|
767
|
+
<PageColumns toc={<TableOfContents content={content} />} isWideMode={isWideMode}>
|
|
768
|
+
{articleContent}
|
|
769
|
+
</PageColumns>
|
|
770
|
+
</>
|
|
700
771
|
);
|
|
701
772
|
}
|
|
@@ -15,7 +15,10 @@ export async function POST(request: NextRequest) {
|
|
|
15
15
|
const body = await request.json();
|
|
16
16
|
|
|
17
17
|
// Forward geo headers from Vercel
|
|
18
|
-
const headers: HeadersInit = {
|
|
18
|
+
const headers: HeadersInit = {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
'X-Analytics-Secret': process.env.ANALYTICS_SECRET || '',
|
|
21
|
+
};
|
|
19
22
|
const forwardHeaders = ['x-vercel-ip-country', 'x-vercel-ip-city', 'x-forwarded-for'];
|
|
20
23
|
for (const h of forwardHeaders) {
|
|
21
24
|
const val = request.headers.get(h);
|