jamdesk 1.0.19 → 1.0.21
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 +105 -28
- package/vendored/app/api/ev/route.ts +4 -1
- package/vendored/app/api/indexnow/[key]/route.ts +34 -0
- package/vendored/app/api/search-ev/route.ts +69 -0
- package/vendored/app/layout.tsx +70 -12
- 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 +9 -5
- package/vendored/components/ui/CodePanelModal.tsx +5 -14
- package/vendored/hooks/useBodyScrollLock.ts +37 -0
- package/vendored/lib/analytics-client.ts +17 -7
- package/vendored/lib/docs-types.ts +3 -2
- package/vendored/lib/email-templates/components/base-layout.tsx +15 -15
- package/vendored/lib/extract-highlights.ts +2 -0
- 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 +2 -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/search-client.ts +81 -36
- package/vendored/lib/seo.ts +77 -0
- package/vendored/lib/static-artifacts.ts +204 -5
- package/vendored/lib/static-file-route.ts +10 -5
- package/vendored/lib/validate-config.ts +1 -0
- package/vendored/schema/docs-schema.json +130 -8
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,OAA4B;IAE5B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEhF,6DAA6D;IAC7D,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElE,cAAc,EAAE,CAAC;IAEjB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAC9B,UAAU,CACX,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB;IACnB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAyB,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;IACxC,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,OAAO,EAAE,CAAC;IAE9E,kBAAkB;IAClB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAE7E,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAK,QAAoC,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,aAAa,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAEtE,aAAa;IACb,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAI,QAAoC,CAAC,MAAM,CAA0C,CAAC;YACzG,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC;gBACpB,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;oBACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,aAAa,YAAY,EAAE,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,YAAY,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,UAAU,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAE/F,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
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.21",
|
|
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, buildSiteTitle } 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
|
|
|
@@ -319,7 +339,7 @@ export async function generateMetadata({ params }: PageProps) {
|
|
|
319
339
|
if (normalizedSlug.length === 0) {
|
|
320
340
|
const config = await loader.getConfig();
|
|
321
341
|
return {
|
|
322
|
-
title: `${config.name} - Redirecting
|
|
342
|
+
title: { absolute: `${config.name} - Redirecting...` },
|
|
323
343
|
robots: { index: false }, // Don't index redirect page
|
|
324
344
|
};
|
|
325
345
|
}
|
|
@@ -342,23 +362,34 @@ 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);
|
|
357
374
|
|
|
375
|
+
// If page title matches config.name, use absolute to prevent "X — X" double-wrap.
|
|
376
|
+
// If no title, use buildSiteTitle (which avoids "X Documentation Documentation").
|
|
377
|
+
const titleValue = data.title
|
|
378
|
+
? (data.title === config.name ? { absolute: data.title } : data.title)
|
|
379
|
+
: { absolute: buildSiteTitle(config.name) };
|
|
380
|
+
|
|
358
381
|
return {
|
|
359
|
-
title:
|
|
382
|
+
title: titleValue,
|
|
360
383
|
description: data.description || '',
|
|
361
384
|
...seoMetadata,
|
|
385
|
+
...(data.rss ? {
|
|
386
|
+
alternates: {
|
|
387
|
+
...seoMetadata.alternates,
|
|
388
|
+
types: {
|
|
389
|
+
'application/rss+xml': hostAtDocs ? '/docs/feed.xml' : '/feed.xml',
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
} : {}),
|
|
362
393
|
};
|
|
363
394
|
}
|
|
364
395
|
|
|
@@ -368,10 +399,11 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
368
399
|
// Get project from request headers (only present in ISR mode)
|
|
369
400
|
let projectSlug: string | null = null;
|
|
370
401
|
let hostAtDocs = process.env.HOST_AT_DOCS === 'true'; // Local dev fallback
|
|
402
|
+
let requestHeaders: Headers | null = null;
|
|
371
403
|
if (isIsrMode()) {
|
|
372
|
-
|
|
373
|
-
projectSlug = getProjectFromRequest(
|
|
374
|
-
hostAtDocs = getHostAtDocs(
|
|
404
|
+
requestHeaders = await headers();
|
|
405
|
+
projectSlug = getProjectFromRequest(requestHeaders);
|
|
406
|
+
hostAtDocs = getHostAtDocs(requestHeaders);
|
|
375
407
|
if (!projectSlug) {
|
|
376
408
|
notFound(); // Project not resolved by middleware
|
|
377
409
|
}
|
|
@@ -423,6 +455,25 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
423
455
|
const data = parsed.data as FrontmatterData;
|
|
424
456
|
const rawContent = parsed.content;
|
|
425
457
|
|
|
458
|
+
// JSON-LD structured data for rich search results.
|
|
459
|
+
// XSS-safe: replaces < with unicode escape per Next.js guide.
|
|
460
|
+
// Same pattern as marketing/app/layout.tsx and marketing/app/blog/[slug]/page.tsx.
|
|
461
|
+
const baseUrl = resolveBaseUrl(requestHeaders, projectSlug, hostAtDocs);
|
|
462
|
+
const jsonLd = buildJsonLd({
|
|
463
|
+
config,
|
|
464
|
+
pagePath,
|
|
465
|
+
pageTitle: data.title || pagePath,
|
|
466
|
+
baseUrl,
|
|
467
|
+
});
|
|
468
|
+
const jsonLdScript = (
|
|
469
|
+
<script
|
|
470
|
+
type="application/ld+json"
|
|
471
|
+
dangerouslySetInnerHTML={{
|
|
472
|
+
__html: JSON.stringify(jsonLd).replace(/</g, '\\u003c'),
|
|
473
|
+
}}
|
|
474
|
+
/>
|
|
475
|
+
);
|
|
476
|
+
|
|
426
477
|
// Get cached Shiki highlighter for syntax highlighting
|
|
427
478
|
// This singleton is reused across all page renders for performance
|
|
428
479
|
const highlighter = await getHighlighter();
|
|
@@ -566,6 +617,23 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
566
617
|
}
|
|
567
618
|
}
|
|
568
619
|
|
|
620
|
+
// RSS feed icon for pages with rss: true
|
|
621
|
+
const rssIcon = data.rss ? (
|
|
622
|
+
<a
|
|
623
|
+
href={hostAtDocs ? '/docs/feed.xml' : '/feed.xml'}
|
|
624
|
+
target="_blank"
|
|
625
|
+
rel="noopener noreferrer"
|
|
626
|
+
aria-label="Subscribe to RSS feed"
|
|
627
|
+
title="RSS feed"
|
|
628
|
+
className="flex-shrink-0 text-[var(--color-text-muted)] hover:text-[var(--color-primary)] transition-colors cursor-pointer"
|
|
629
|
+
>
|
|
630
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="w-5 h-5">
|
|
631
|
+
<circle cx="6.18" cy="17.82" r="2.18" />
|
|
632
|
+
<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" />
|
|
633
|
+
</svg>
|
|
634
|
+
</a>
|
|
635
|
+
) : null;
|
|
636
|
+
|
|
569
637
|
// Prose class for MDX content styling (defined in base.css)
|
|
570
638
|
const proseClasses = 'prose max-w-none';
|
|
571
639
|
|
|
@@ -573,7 +641,7 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
573
641
|
// so code panels can be positioned as siblings at the page level
|
|
574
642
|
if (isApiPage) {
|
|
575
643
|
return (
|
|
576
|
-
<ApiPageWrapper>
|
|
644
|
+
<>{jsonLdScript}<ApiPageWrapper>
|
|
577
645
|
<article className="px-4 sm:px-6 lg:px-8 py-6 sm:py-10 flex-1 min-w-0">
|
|
578
646
|
{/* Breadcrumb */}
|
|
579
647
|
<Breadcrumb slug={slug} config={config} />
|
|
@@ -581,11 +649,14 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
581
649
|
{/* Page Header */}
|
|
582
650
|
{data.title && (
|
|
583
651
|
<header className="mb-4 sm:mb-6">
|
|
584
|
-
<
|
|
585
|
-
|
|
586
|
-
|
|
652
|
+
<div className="flex items-center gap-3">
|
|
653
|
+
<h1 className="text-2xl sm:text-3xl lg:text-4xl font-bold text-theme-text-primary tracking-tight">
|
|
654
|
+
{data.title}
|
|
655
|
+
</h1>
|
|
656
|
+
{rssIcon}
|
|
657
|
+
</div>
|
|
587
658
|
{data.description && (
|
|
588
|
-
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed">
|
|
659
|
+
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed mt-2 sm:mt-3">
|
|
589
660
|
{data.description}
|
|
590
661
|
</p>
|
|
591
662
|
)}
|
|
@@ -634,7 +705,7 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
634
705
|
<PageNavigation currentSlug={slug.join('/')} config={config} />
|
|
635
706
|
<SocialFooter config={config} hidden={data.hideFooter} />
|
|
636
707
|
</article>
|
|
637
|
-
</ApiPageWrapper
|
|
708
|
+
</ApiPageWrapper></>
|
|
638
709
|
);
|
|
639
710
|
}
|
|
640
711
|
|
|
@@ -664,11 +735,14 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
664
735
|
{/* Page Header */}
|
|
665
736
|
{data.title && (
|
|
666
737
|
<header className="mb-6 sm:mb-10">
|
|
667
|
-
<
|
|
668
|
-
|
|
669
|
-
|
|
738
|
+
<div className="flex items-center gap-3">
|
|
739
|
+
<h1 className="text-2xl sm:text-3xl lg:text-4xl font-bold text-theme-text-primary tracking-tight">
|
|
740
|
+
{data.title}
|
|
741
|
+
</h1>
|
|
742
|
+
{rssIcon}
|
|
743
|
+
</div>
|
|
670
744
|
{data.description && (
|
|
671
|
-
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed">
|
|
745
|
+
<p className="text-base sm:text-lg text-theme-text-secondary leading-relaxed mt-2 sm:mt-3">
|
|
672
746
|
{data.description}
|
|
673
747
|
</p>
|
|
674
748
|
)}
|
|
@@ -688,14 +762,17 @@ export default async function DocPage({ params }: PageProps) {
|
|
|
688
762
|
|
|
689
763
|
// Pages with Panel component: use PanelWrapper to move Panel content to sidebar
|
|
690
764
|
if (hasPanel) {
|
|
691
|
-
return <PanelWrapper>{articleContent}</PanelWrapper
|
|
765
|
+
return <>{jsonLdScript}<PanelWrapper>{articleContent}</PanelWrapper></>;
|
|
692
766
|
}
|
|
693
767
|
|
|
694
768
|
// Non-API pages: standard layout with Table of Contents (or inline chat)
|
|
695
769
|
// PageColumns handles TOC ↔ chat column switching on xl+ screens
|
|
696
770
|
return (
|
|
697
|
-
|
|
698
|
-
{
|
|
699
|
-
|
|
771
|
+
<>
|
|
772
|
+
{jsonLdScript}
|
|
773
|
+
<PageColumns toc={<TableOfContents content={content} />} isWideMode={isWideMode}>
|
|
774
|
+
{articleContent}
|
|
775
|
+
</PageColumns>
|
|
776
|
+
</>
|
|
700
777
|
);
|
|
701
778
|
}
|
|
@@ -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);
|