@mintlify/prebuild 1.0.1087 → 1.0.1088
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/prebuild/categorizeFilePaths.d.ts +2 -0
- package/dist/prebuild/categorizeFilePaths.js +25 -6
- package/dist/prebuild/index.d.ts +1 -0
- package/dist/prebuild/index.js +6 -1
- package/dist/prebuild/invalidSpecFiles.d.ts +7 -0
- package/dist/prebuild/invalidSpecFiles.js +13 -0
- package/dist/prebuild/update/docsConfig/generateOpenApiDivisions.d.ts +2 -1
- package/dist/prebuild/update/docsConfig/generateOpenApiDivisions.js +2 -1
- package/dist/prebuild/update/docsConfig/generateOpenApiFromDocsConfig.d.ts +2 -0
- package/dist/prebuild/update/docsConfig/generateOpenApiFromDocsConfig.js +10 -3
- package/dist/prebuild/update/docsConfig/index.d.ts +3 -1
- package/dist/prebuild/update/docsConfig/index.js +2 -2
- package/dist/prebuild/update/index.d.ts +3 -1
- package/dist/prebuild/update/index.js +3 -2
- package/dist/prebuild/update/mintConfig/generateOpenApiAnchorsOrTabs.d.ts +3 -1
- package/dist/prebuild/update/mintConfig/generateOpenApiAnchorsOrTabs.js +9 -3
- package/dist/prebuild/update/mintConfig/index.d.ts +2 -1
- package/dist/prebuild/update/mintConfig/index.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { AsyncAPIFile } from '@mintlify/common';
|
|
2
2
|
import { OpenApiFile } from '@mintlify/models';
|
|
3
|
+
import type { InvalidSpecFile } from './invalidSpecFiles.js';
|
|
3
4
|
export declare const categorizeFilePaths: (contentDirectoryPath: string, mintIgnore?: string[], disableOpenApi?: boolean) => Promise<{
|
|
4
5
|
contentFilenames: string[];
|
|
5
6
|
staticFilenames: string[];
|
|
6
7
|
openApiFiles: OpenApiFile[];
|
|
7
8
|
asyncApiFiles: AsyncAPIFile[];
|
|
9
|
+
invalidSpecFiles: InvalidSpecFile[];
|
|
8
10
|
snippets: string[];
|
|
9
11
|
snippetsV2: string[];
|
|
10
12
|
fileImportsMap: Map<string, Set<string>>;
|
|
@@ -5,7 +5,6 @@ import * as path from 'path';
|
|
|
5
5
|
import { formatError } from '../errorMessages/formatError.js';
|
|
6
6
|
import { getFileList } from '../fs/index.js';
|
|
7
7
|
import { getFileExtension } from '../utils.js';
|
|
8
|
-
import { addWarning } from './warnings.js';
|
|
9
8
|
export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [], disableOpenApi) => {
|
|
10
9
|
const allFiles = getFileList(contentDirectoryPath, contentDirectoryPath, mintIgnore);
|
|
11
10
|
const mdxFiles = [];
|
|
@@ -48,6 +47,7 @@ export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [],
|
|
|
48
47
|
const staticFilenames = [];
|
|
49
48
|
const openApiFiles = [];
|
|
50
49
|
const asyncApiFiles = [];
|
|
50
|
+
const invalidSpecFiles = [];
|
|
51
51
|
for (const { filename, extension } of nonMdxFiles) {
|
|
52
52
|
switch (extension) {
|
|
53
53
|
case 'json':
|
|
@@ -55,7 +55,18 @@ export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [],
|
|
|
55
55
|
case 'yml':
|
|
56
56
|
const filePath = path.join(contentDirectoryPath, filename);
|
|
57
57
|
const str = await readFile(filePath, 'utf8');
|
|
58
|
-
|
|
58
|
+
let obj;
|
|
59
|
+
try {
|
|
60
|
+
obj = yaml.load(str);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
invalidSpecFiles.push({
|
|
64
|
+
originalFileLocation: filename,
|
|
65
|
+
reason: `Invalid JSON or YAML syntax: ${error instanceof Error ? error.message : String(error)}`,
|
|
66
|
+
kind: 'syntax',
|
|
67
|
+
});
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
59
70
|
if (!obj || typeof obj !== 'object')
|
|
60
71
|
break;
|
|
61
72
|
const isOpenApi = Object.keys(obj).includes('openapi');
|
|
@@ -73,9 +84,10 @@ export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [],
|
|
|
73
84
|
}
|
|
74
85
|
}
|
|
75
86
|
catch (error) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
87
|
+
invalidSpecFiles.push({
|
|
88
|
+
originalFileLocation: filename,
|
|
89
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
90
|
+
kind: 'openapi',
|
|
79
91
|
});
|
|
80
92
|
}
|
|
81
93
|
}
|
|
@@ -90,7 +102,13 @@ export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [],
|
|
|
90
102
|
});
|
|
91
103
|
}
|
|
92
104
|
}
|
|
93
|
-
catch {
|
|
105
|
+
catch (error) {
|
|
106
|
+
invalidSpecFiles.push({
|
|
107
|
+
originalFileLocation: filename,
|
|
108
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
109
|
+
kind: 'asyncapi',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
94
112
|
}
|
|
95
113
|
break;
|
|
96
114
|
default:
|
|
@@ -102,6 +120,7 @@ export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [],
|
|
|
102
120
|
staticFilenames,
|
|
103
121
|
openApiFiles,
|
|
104
122
|
asyncApiFiles,
|
|
123
|
+
invalidSpecFiles,
|
|
105
124
|
snippets,
|
|
106
125
|
snippetsV2,
|
|
107
126
|
fileImportsMap,
|
package/dist/prebuild/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare const prebuild: (contentDirectoryPath: string, { localSchema, gro
|
|
|
9
9
|
}) => Promise<PrebuildResult | undefined>;
|
|
10
10
|
export * from './categorizeFilePaths.js';
|
|
11
11
|
export * from './getOpenApiFiles.js';
|
|
12
|
+
export * from './invalidSpecFiles.js';
|
|
12
13
|
export * from '../createPage/index.js';
|
|
13
14
|
export * from '../createPage/preparseMdx/index.js';
|
|
14
15
|
export * from './update/index.js';
|
package/dist/prebuild/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getConfigPath, getMintIgnore } from '../utils.js';
|
|
2
2
|
import { categorizeFilePaths } from './categorizeFilePaths.js';
|
|
3
|
+
import { warnInvalidSpecFiles } from './invalidSpecFiles.js';
|
|
3
4
|
import { update } from './update/index.js';
|
|
4
5
|
import { clearWarnings, checkStrictMode } from './warnings.js';
|
|
5
6
|
export const prebuild = async (contentDirectoryPath, { localSchema, groups, disableOpenApi, strict, } = {}) => {
|
|
@@ -15,7 +16,7 @@ export const prebuild = async (contentDirectoryPath, { localSchema, groups, disa
|
|
|
15
16
|
throw Error('must be run in a directory where a docs.json file exists.');
|
|
16
17
|
}
|
|
17
18
|
const mintIgnore = await getMintIgnore(contentDirectoryPath);
|
|
18
|
-
const { contentFilenames, staticFilenames, openApiFiles, asyncApiFiles, snippets, snippetsV2, fileImportsMap, } = await categorizeFilePaths(contentDirectoryPath, mintIgnore, disableOpenApi);
|
|
19
|
+
const { contentFilenames, staticFilenames, openApiFiles, asyncApiFiles, invalidSpecFiles, snippets, snippetsV2, fileImportsMap, } = await categorizeFilePaths(contentDirectoryPath, mintIgnore, disableOpenApi);
|
|
19
20
|
await update({
|
|
20
21
|
contentDirectoryPath,
|
|
21
22
|
staticFilenames,
|
|
@@ -30,13 +31,17 @@ export const prebuild = async (contentDirectoryPath, { localSchema, groups, disa
|
|
|
30
31
|
mintIgnore,
|
|
31
32
|
disableOpenApi,
|
|
32
33
|
strict,
|
|
34
|
+
invalidSpecFiles,
|
|
33
35
|
});
|
|
36
|
+
// Deferred until after update so files that fail the build don't also warn
|
|
37
|
+
warnInvalidSpecFiles(invalidSpecFiles);
|
|
34
38
|
// In strict mode, fail if there were any warnings
|
|
35
39
|
checkStrictMode(strict);
|
|
36
40
|
return { fileImportsMap };
|
|
37
41
|
};
|
|
38
42
|
export * from './categorizeFilePaths.js';
|
|
39
43
|
export * from './getOpenApiFiles.js';
|
|
44
|
+
export * from './invalidSpecFiles.js';
|
|
40
45
|
export * from '../createPage/index.js';
|
|
41
46
|
export * from '../createPage/preparseMdx/index.js';
|
|
42
47
|
export * from './update/index.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type InvalidSpecFile = {
|
|
2
|
+
originalFileLocation: string;
|
|
3
|
+
reason: string;
|
|
4
|
+
kind: 'openapi' | 'asyncapi' | 'syntax';
|
|
5
|
+
};
|
|
6
|
+
export declare const findInvalidSpecFile: (invalidSpecFiles: InvalidSpecFile[] | undefined, reference: string) => InvalidSpecFile | undefined;
|
|
7
|
+
export declare const warnInvalidSpecFiles: (invalidSpecFiles: InvalidSpecFile[] | undefined) => void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { normalizeRelativePath } from '@mintlify/common';
|
|
2
|
+
import { addWarning } from './warnings.js';
|
|
3
|
+
export const findInvalidSpecFile = (invalidSpecFiles, reference) => invalidSpecFiles?.find((file) => normalizeRelativePath(file.originalFileLocation) === normalizeRelativePath(reference));
|
|
4
|
+
export const warnInvalidSpecFiles = (invalidSpecFiles) => {
|
|
5
|
+
for (const file of invalidSpecFiles ?? []) {
|
|
6
|
+
addWarning({
|
|
7
|
+
type: 'openapi',
|
|
8
|
+
message: file.kind === 'syntax'
|
|
9
|
+
? `Error parsing ${file.originalFileLocation}: ${file.reason}`
|
|
10
|
+
: `Error validating ${file.kind === 'asyncapi' ? 'AsyncAPI' : 'OpenAPI'} file ${file.originalFileLocation}: ${file.reason}`,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { OpenApiFile, DecoratedNavigationPage } from '@mintlify/models';
|
|
2
2
|
import { DocsConfig } from '@mintlify/validation';
|
|
3
|
-
|
|
3
|
+
import type { InvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
4
|
+
export declare const generateOpenApiDivisions: (docsConfig: DocsConfig, openApiFiles: OpenApiFile[], targetDir?: string, localSchema?: boolean, invalidSpecFiles?: InvalidSpecFile[]) => Promise<{
|
|
4
5
|
newDocsConfig: DocsConfig;
|
|
5
6
|
pagesAcc: Record<string, DecoratedNavigationPage>;
|
|
6
7
|
openApiFiles: OpenApiFile[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getOpenApiFilesFromConfig } from '../read/getOpenApiFilesFromConfig.js';
|
|
2
2
|
import { generateOpenApiFromDocsConfig } from './generateOpenApiFromDocsConfig.js';
|
|
3
|
-
export const generateOpenApiDivisions = async (docsConfig, openApiFiles, targetDir, localSchema) => {
|
|
3
|
+
export const generateOpenApiDivisions = async (docsConfig, openApiFiles, targetDir, localSchema, invalidSpecFiles) => {
|
|
4
4
|
const openapiFilesFromDocsConfig = await getOpenApiFilesFromConfig('docs', docsConfig, localSchema);
|
|
5
5
|
openApiFiles.push(...openapiFilesFromDocsConfig);
|
|
6
6
|
const pagesAcc = {};
|
|
@@ -9,6 +9,7 @@ export const generateOpenApiDivisions = async (docsConfig, openApiFiles, targetD
|
|
|
9
9
|
writeFiles: true,
|
|
10
10
|
targetDir,
|
|
11
11
|
localSchema,
|
|
12
|
+
invalidSpecFiles,
|
|
12
13
|
});
|
|
13
14
|
return {
|
|
14
15
|
newDocsConfig: { ...docsConfig, navigation: newNav },
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { OpenApiFile, DecoratedNavigationPage } from '@mintlify/models';
|
|
2
2
|
import { NavigationConfig } from '@mintlify/validation';
|
|
3
|
+
import { type InvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
3
4
|
export declare const generateOpenApiFromDocsConfig: (navigation: NavigationConfig, openApiFiles: OpenApiFile[], pagesAcc: Record<string, DecoratedNavigationPage>, opts: {
|
|
4
5
|
overwrite?: boolean;
|
|
5
6
|
writeFiles: boolean;
|
|
6
7
|
targetDir?: string;
|
|
7
8
|
localSchema?: boolean;
|
|
9
|
+
invalidSpecFiles?: InvalidSpecFile[];
|
|
8
10
|
}) => Promise<{
|
|
9
11
|
newNav: NavigationConfig;
|
|
10
12
|
newOpenApiFiles: OpenApiFile[];
|
|
@@ -3,9 +3,10 @@ import { generateOpenApiPagesForDocsConfig } from '@mintlify/scraping';
|
|
|
3
3
|
import { processOpenApiPath, processOpenApiWebhook, } from '@mintlify/scraping/bin/openapi/common.js';
|
|
4
4
|
import { divisions, } from '@mintlify/validation';
|
|
5
5
|
import * as path from 'path';
|
|
6
|
+
import { findInvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
6
7
|
const DEFAULT_OUTPUT_DIR = 'api-reference';
|
|
7
8
|
export const generateOpenApiFromDocsConfig = async (navigation, openApiFiles, pagesAcc, opts) => {
|
|
8
|
-
const { overwrite, writeFiles, targetDir, localSchema } = opts;
|
|
9
|
+
const { overwrite, writeFiles, targetDir, localSchema, invalidSpecFiles } = opts;
|
|
9
10
|
const newOpenApiFiles = [];
|
|
10
11
|
const openApiFilePromises = new Map();
|
|
11
12
|
async function processOpenApiInNav(nav) {
|
|
@@ -42,7 +43,10 @@ export const generateOpenApiFromDocsConfig = async (navigation, openApiFiles, pa
|
|
|
42
43
|
file.originalFileLocation === optionallyAddLeadingSlash(openapi));
|
|
43
44
|
}
|
|
44
45
|
if (!openApiFile) {
|
|
45
|
-
|
|
46
|
+
const invalidSpecFile = findInvalidSpecFile(invalidSpecFiles, openapi);
|
|
47
|
+
throw new Error(invalidSpecFile
|
|
48
|
+
? `Openapi file ${openapi} defined in ${getDivisionNav(nav)?.division} in your docs.json exists but is invalid: ${invalidSpecFile.reason}`
|
|
49
|
+
: `Openapi file ${openapi} defined in ${getDivisionNav(nav)?.division} in your docs.json does not exist`);
|
|
46
50
|
}
|
|
47
51
|
const { pagesAcc: pagesAccFromGeneratedOpenApiPages, nav: navFromGeneratedOpenApiPages } = await generateOpenApiPagesForDocsConfig(openApiFile.spec, {
|
|
48
52
|
openApiFilePath: openApiFile.originalFileLocation,
|
|
@@ -146,7 +150,10 @@ export const generateOpenApiFromDocsConfig = async (navigation, openApiFiles, pa
|
|
|
146
150
|
}
|
|
147
151
|
}
|
|
148
152
|
if (!openApiFile) {
|
|
149
|
-
|
|
153
|
+
const invalidSpecFile = findInvalidSpecFile(invalidSpecFiles, openapiPath);
|
|
154
|
+
throw new Error(invalidSpecFile
|
|
155
|
+
? `Openapi file ${openapiPath} referenced in docs.json exists but is invalid: ${invalidSpecFile.reason}`
|
|
156
|
+
: `Openapi file ${openapiPath} referenced in docs.json does not exist`);
|
|
150
157
|
}
|
|
151
158
|
const schema = openApiFile.spec;
|
|
152
159
|
const isWebhook = method.toLowerCase() === 'webhook';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AsyncAPIFile } from '@mintlify/common';
|
|
2
2
|
import { OpenApiFile, DecoratedNavigationPage } from '@mintlify/models';
|
|
3
3
|
import { DocsConfig } from '@mintlify/validation';
|
|
4
|
-
|
|
4
|
+
import type { InvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
5
|
+
export declare function updateDocsConfigFile({ contentDirectoryPath, openApiFiles, asyncApiFiles, docsConfig, localSchema, disableOpenApi, strict, invalidSpecFiles, }: {
|
|
5
6
|
contentDirectoryPath: string;
|
|
6
7
|
openApiFiles: OpenApiFile[];
|
|
7
8
|
asyncApiFiles: AsyncAPIFile[];
|
|
@@ -9,6 +10,7 @@ export declare function updateDocsConfigFile({ contentDirectoryPath, openApiFile
|
|
|
9
10
|
localSchema?: boolean;
|
|
10
11
|
disableOpenApi?: boolean;
|
|
11
12
|
strict?: boolean;
|
|
13
|
+
invalidSpecFiles?: InvalidSpecFile[];
|
|
12
14
|
}): Promise<{
|
|
13
15
|
docsConfig: DocsConfig;
|
|
14
16
|
pagesAcc: Record<string, DecoratedNavigationPage>;
|
|
@@ -4,7 +4,7 @@ import { generateAsyncApiDivisions } from './generateAsyncApiDivisions.js';
|
|
|
4
4
|
import { generateOpenApiDivisions } from './generateOpenApiDivisions.js';
|
|
5
5
|
import { getCustomLanguages } from './getCustomLanguages.js';
|
|
6
6
|
const NOT_CORRECT_PATH_ERROR = 'must be run in a directory where a docs.json file exists.';
|
|
7
|
-
export async function updateDocsConfigFile({ contentDirectoryPath, openApiFiles, asyncApiFiles, docsConfig, localSchema, disableOpenApi, strict, }) {
|
|
7
|
+
export async function updateDocsConfigFile({ contentDirectoryPath, openApiFiles, asyncApiFiles, docsConfig, localSchema, disableOpenApi, strict, invalidSpecFiles, }) {
|
|
8
8
|
const configPath = await getConfigPath(contentDirectoryPath, 'docs');
|
|
9
9
|
if (configPath == null && docsConfig == null) {
|
|
10
10
|
throw Error(NOT_CORRECT_PATH_ERROR);
|
|
@@ -17,7 +17,7 @@ export async function updateDocsConfigFile({ contentDirectoryPath, openApiFiles,
|
|
|
17
17
|
}
|
|
18
18
|
const customLanguages = await getCustomLanguages({ config: docsConfig, contentDirectoryPath });
|
|
19
19
|
const { newDocsConfig: docsConfigWithOpenApiPages, pagesAcc: pagesAccWithOpenApiPages, openApiFiles: newOpenApiFiles, } = !disableOpenApi
|
|
20
|
-
? await generateOpenApiDivisions(docsConfig, openApiFiles, undefined, localSchema)
|
|
20
|
+
? await generateOpenApiDivisions(docsConfig, openApiFiles, undefined, localSchema, invalidSpecFiles)
|
|
21
21
|
: { newDocsConfig: docsConfig, pagesAcc: {}, openApiFiles: openApiFiles };
|
|
22
22
|
const { newDocsConfig, pagesAcc: pagesAccWithAsyncApiPages, asyncApiFiles: newAsyncApiFiles, } = await generateAsyncApiDivisions(docsConfigWithOpenApiPages, asyncApiFiles, undefined, localSchema);
|
|
23
23
|
const pagesAcc = { ...pagesAccWithOpenApiPages, ...pagesAccWithAsyncApiPages };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AsyncAPIFile } from '@mintlify/common';
|
|
2
2
|
import type { OpenApiFile } from '@mintlify/models';
|
|
3
3
|
import type { Root } from 'mdast';
|
|
4
|
+
import type { InvalidSpecFile } from '../invalidSpecFiles.js';
|
|
4
5
|
type UpdateArgs = {
|
|
5
6
|
contentDirectoryPath: string;
|
|
6
7
|
staticFilenames: string[];
|
|
@@ -15,8 +16,9 @@ type UpdateArgs = {
|
|
|
15
16
|
mintIgnore?: string[];
|
|
16
17
|
disableOpenApi?: boolean;
|
|
17
18
|
strict?: boolean;
|
|
19
|
+
invalidSpecFiles?: InvalidSpecFile[];
|
|
18
20
|
};
|
|
19
|
-
export declare const update: ({ contentDirectoryPath, staticFilenames, openApiFiles, asyncApiFiles, contentFilenames, snippets, snippetV2Filenames, docsConfigPath, localSchema, groups, mintIgnore, disableOpenApi, strict, }: UpdateArgs) => Promise<{
|
|
21
|
+
export declare const update: ({ contentDirectoryPath, staticFilenames, openApiFiles, asyncApiFiles, contentFilenames, snippets, snippetV2Filenames, docsConfigPath, localSchema, groups, mintIgnore, disableOpenApi, strict, invalidSpecFiles, }: UpdateArgs) => Promise<{
|
|
20
22
|
name: string;
|
|
21
23
|
$schema: string;
|
|
22
24
|
theme: "mint";
|
|
@@ -12,8 +12,8 @@ import { writeAsyncApiFiles } from './write/writeAsyncApiFiles.js';
|
|
|
12
12
|
import { writeFiles, writeFile } from './write/writeFiles.js';
|
|
13
13
|
import { writeOpenApiData } from './write/writeOpenApiData.js';
|
|
14
14
|
import { writeRssFiles } from './write/writeRssFiles.js';
|
|
15
|
-
export const update = async ({ contentDirectoryPath, staticFilenames, openApiFiles, asyncApiFiles, contentFilenames, snippets, snippetV2Filenames, docsConfigPath, localSchema, groups, mintIgnore, disableOpenApi, strict, }) => {
|
|
16
|
-
const mintConfigResult = await updateMintConfigFile(contentDirectoryPath, openApiFiles, localSchema, strict);
|
|
15
|
+
export const update = async ({ contentDirectoryPath, staticFilenames, openApiFiles, asyncApiFiles, contentFilenames, snippets, snippetV2Filenames, docsConfigPath, localSchema, groups, mintIgnore, disableOpenApi, strict, invalidSpecFiles, }) => {
|
|
16
|
+
const mintConfigResult = await updateMintConfigFile(contentDirectoryPath, openApiFiles, localSchema, strict, invalidSpecFiles);
|
|
17
17
|
// we used the original mint config without openapi pages injected
|
|
18
18
|
// because we will do it in `updateDocsConfigFile`, this will avoid duplicated openapi pages
|
|
19
19
|
const docsConfig = mintConfigResult != null ? upgradeToDocsConfig(mintConfigResult.originalMintConfig) : undefined;
|
|
@@ -25,6 +25,7 @@ export const update = async ({ contentDirectoryPath, staticFilenames, openApiFil
|
|
|
25
25
|
localSchema,
|
|
26
26
|
disableOpenApi,
|
|
27
27
|
strict,
|
|
28
|
+
invalidSpecFiles,
|
|
28
29
|
});
|
|
29
30
|
const pagePromises = readPageContents({
|
|
30
31
|
contentDirectoryPath,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DecoratedNavigationPage, MintConfig, Navigation, OpenApiFile, Division } from '@mintlify/models';
|
|
2
|
-
|
|
2
|
+
import { type InvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
3
|
+
export declare const generateOpenApiAnchorsOrTabs: (mintConfig: MintConfig, openApiFiles: OpenApiFile[], targetDir?: string, localSchema?: boolean, invalidSpecFiles?: InvalidSpecFile[]) => Promise<{
|
|
3
4
|
mintConfig: MintConfig;
|
|
4
5
|
pagesAcc: Record<string, DecoratedNavigationPage>;
|
|
5
6
|
openApiFiles: OpenApiFile[];
|
|
@@ -9,6 +10,7 @@ export declare const generateOpenApiAnchorOrTab: (anchorsOrTabs: Division[] | un
|
|
|
9
10
|
writeFiles: boolean;
|
|
10
11
|
targetDir?: string;
|
|
11
12
|
localSchema?: boolean;
|
|
13
|
+
invalidSpecFiles?: InvalidSpecFile[];
|
|
12
14
|
}) => Promise<{
|
|
13
15
|
newNavItems: Navigation;
|
|
14
16
|
newOpenApiFiles: OpenApiFile[];
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { getOpenApiDocumentFromUrl, isAllowedLocalSchemaUrl } from '@mintlify/common';
|
|
2
2
|
import { generateOpenApiPages } from '@mintlify/scraping';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
+
import { findInvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
4
5
|
import { getOpenApiFilesFromConfig } from '../read/getOpenApiFilesFromConfig.js';
|
|
5
|
-
export const generateOpenApiAnchorsOrTabs = async (mintConfig, openApiFiles, targetDir, localSchema) => {
|
|
6
|
+
export const generateOpenApiAnchorsOrTabs = async (mintConfig, openApiFiles, targetDir, localSchema, invalidSpecFiles) => {
|
|
6
7
|
const openapiFilesFromMintConfig = await getOpenApiFilesFromConfig('mint', mintConfig);
|
|
7
8
|
openApiFiles.push(...openapiFilesFromMintConfig);
|
|
8
9
|
const pagesAcc = {};
|
|
@@ -12,12 +13,14 @@ export const generateOpenApiAnchorsOrTabs = async (mintConfig, openApiFiles, tar
|
|
|
12
13
|
writeFiles: true,
|
|
13
14
|
targetDir,
|
|
14
15
|
localSchema,
|
|
16
|
+
invalidSpecFiles,
|
|
15
17
|
}),
|
|
16
18
|
generateOpenApiAnchorOrTab(mintConfig.tabs, openApiFiles, pagesAcc, {
|
|
17
19
|
overwrite: true,
|
|
18
20
|
writeFiles: true,
|
|
19
21
|
targetDir,
|
|
20
22
|
localSchema,
|
|
23
|
+
invalidSpecFiles,
|
|
21
24
|
}),
|
|
22
25
|
]);
|
|
23
26
|
const newNav = [
|
|
@@ -36,7 +39,7 @@ export const generateOpenApiAnchorsOrTabs = async (mintConfig, openApiFiles, tar
|
|
|
36
39
|
};
|
|
37
40
|
};
|
|
38
41
|
export const generateOpenApiAnchorOrTab = async (anchorsOrTabs, openApiFiles, pagesAcc, opts) => {
|
|
39
|
-
const { overwrite, writeFiles, targetDir, localSchema } = opts;
|
|
42
|
+
const { overwrite, writeFiles, targetDir, localSchema, invalidSpecFiles } = opts;
|
|
40
43
|
const newNavItems = [];
|
|
41
44
|
const newOpenApiFiles = [];
|
|
42
45
|
if (anchorsOrTabs == undefined)
|
|
@@ -65,7 +68,10 @@ export const generateOpenApiAnchorOrTab = async (anchorsOrTabs, openApiFiles, pa
|
|
|
65
68
|
file.originalFileLocation === anchorOrTab.openapi);
|
|
66
69
|
}
|
|
67
70
|
if (openApiFile == undefined) {
|
|
68
|
-
|
|
71
|
+
const invalidSpecFile = findInvalidSpecFile(invalidSpecFiles, anchorOrTab.openapi);
|
|
72
|
+
throw new Error(invalidSpecFile
|
|
73
|
+
? `Openapi file "${anchorOrTab.openapi}" defined in the anchor or tab array at index ${i} in your mint.json exists but is invalid: ${invalidSpecFile.reason}`
|
|
74
|
+
: `Openapi file "${anchorOrTab.openapi}" defined in the anchor or tab array at index ${i} in your mint.json does not exist`);
|
|
69
75
|
}
|
|
70
76
|
promises.push((async () => {
|
|
71
77
|
const { pagesAcc: pagesAccFromGeneratedOpenApiPages, nav: navFromGeneratedOpenApiPages } = await generateOpenApiPages(openApiFile.spec, {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DecoratedNavigationPage, MintConfig, OpenApiFile } from '@mintlify/models';
|
|
2
|
-
|
|
2
|
+
import type { InvalidSpecFile } from '../../invalidSpecFiles.js';
|
|
3
|
+
export declare function updateMintConfigFile(contentDirectoryPath: string, openApiFiles: OpenApiFile[], localSchema?: boolean, strict?: boolean, invalidSpecFiles?: InvalidSpecFile[]): Promise<{
|
|
3
4
|
mintConfig: MintConfig;
|
|
4
5
|
originalMintConfig: MintConfig;
|
|
5
6
|
pagesAcc: Record<string, DecoratedNavigationPage>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { getConfigPath } from '../../../utils.js';
|
|
2
2
|
import { MintConfigUpdater } from '../ConfigUpdater.js';
|
|
3
3
|
import { generateOpenApiAnchorsOrTabs } from './generateOpenApiAnchorsOrTabs.js';
|
|
4
|
-
export async function updateMintConfigFile(contentDirectoryPath, openApiFiles, localSchema, strict) {
|
|
4
|
+
export async function updateMintConfigFile(contentDirectoryPath, openApiFiles, localSchema, strict, invalidSpecFiles) {
|
|
5
5
|
const configPath = await getConfigPath(contentDirectoryPath, 'mint');
|
|
6
6
|
if (configPath == null) {
|
|
7
7
|
return null;
|
|
8
8
|
}
|
|
9
9
|
const mintConfig = await MintConfigUpdater.getConfig(configPath, strict, contentDirectoryPath);
|
|
10
|
-
const { mintConfig: newMintConfig, pagesAcc, openApiFiles: newOpenApiFiles, } = await generateOpenApiAnchorsOrTabs(mintConfig, openApiFiles, undefined, localSchema);
|
|
10
|
+
const { mintConfig: newMintConfig, pagesAcc, openApiFiles: newOpenApiFiles, } = await generateOpenApiAnchorsOrTabs(mintConfig, openApiFiles, undefined, localSchema, invalidSpecFiles);
|
|
11
11
|
await MintConfigUpdater.writeConfigFile(newMintConfig);
|
|
12
12
|
return {
|
|
13
13
|
mintConfig: newMintConfig,
|