mintlify 3.0.7 → 3.0.9

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.
Files changed (87) hide show
  1. package/bin/browser.js +24 -0
  2. package/bin/browser.js.map +1 -0
  3. package/bin/constants.js +31 -0
  4. package/bin/constants.js.map +1 -0
  5. package/bin/downloadImage.js +72 -0
  6. package/bin/downloadImage.js.map +1 -0
  7. package/bin/index.js +40 -0
  8. package/bin/index.js.map +1 -0
  9. package/bin/local-preview/helper-commands/installDepsCommand.js +12 -0
  10. package/bin/local-preview/helper-commands/installDepsCommand.js.map +1 -0
  11. package/bin/local-preview/index.js +154 -0
  12. package/bin/local-preview/index.js.map +1 -0
  13. package/bin/local-preview/listener/categorize.js +97 -0
  14. package/bin/local-preview/listener/categorize.js.map +1 -0
  15. package/bin/local-preview/listener/generate.js +89 -0
  16. package/bin/local-preview/listener/generate.js.map +1 -0
  17. package/bin/local-preview/listener/index.js +195 -0
  18. package/bin/local-preview/listener/index.js.map +1 -0
  19. package/bin/local-preview/listener/update.js +41 -0
  20. package/bin/local-preview/listener/update.js.map +1 -0
  21. package/bin/local-preview/listener/utils/createPage.js +167 -0
  22. package/bin/local-preview/listener/utils/createPage.js.map +1 -0
  23. package/bin/local-preview/listener/utils/getOpenApiContext.js +57 -0
  24. package/bin/local-preview/listener/utils/getOpenApiContext.js.map +1 -0
  25. package/bin/local-preview/listener/utils/mintConfigFile.js +22 -0
  26. package/bin/local-preview/listener/utils/mintConfigFile.js.map +1 -0
  27. package/bin/local-preview/listener/utils/toTitleCase.js +36 -0
  28. package/bin/local-preview/listener/utils/toTitleCase.js.map +1 -0
  29. package/bin/local-preview/listener/utils/types.js +2 -0
  30. package/bin/local-preview/listener/utils/types.js.map +1 -0
  31. package/bin/local-preview/listener/utils.js +62 -0
  32. package/bin/local-preview/listener/utils.js.map +1 -0
  33. package/bin/scraping/combineNavWithEmptyGroupTitles.js +20 -0
  34. package/bin/scraping/combineNavWithEmptyGroupTitles.js.map +1 -0
  35. package/bin/scraping/detectFramework.js +34 -0
  36. package/bin/scraping/detectFramework.js.map +1 -0
  37. package/bin/scraping/downloadAllImages.js +32 -0
  38. package/bin/scraping/downloadAllImages.js.map +1 -0
  39. package/bin/scraping/downloadLogoImage.js +13 -0
  40. package/bin/scraping/downloadLogoImage.js.map +1 -0
  41. package/bin/scraping/getSitemapLinks.js +18 -0
  42. package/bin/scraping/getSitemapLinks.js.map +1 -0
  43. package/bin/scraping/replaceImagePaths.js +17 -0
  44. package/bin/scraping/replaceImagePaths.js.map +1 -0
  45. package/bin/scraping/scrapeFileGettingFileNameFromUrl.js +43 -0
  46. package/bin/scraping/scrapeFileGettingFileNameFromUrl.js.map +1 -0
  47. package/bin/scraping/scrapeGettingFileNameFromUrl.js +13 -0
  48. package/bin/scraping/scrapeGettingFileNameFromUrl.js.map +1 -0
  49. package/bin/scraping/scrapePage.js +10 -0
  50. package/bin/scraping/scrapePage.js.map +1 -0
  51. package/bin/scraping/scrapePageCommands.js +48 -0
  52. package/bin/scraping/scrapePageCommands.js.map +1 -0
  53. package/bin/scraping/scrapeSection.js +12 -0
  54. package/bin/scraping/scrapeSection.js.map +1 -0
  55. package/bin/scraping/scrapeSectionCommands.js +60 -0
  56. package/bin/scraping/scrapeSectionCommands.js.map +1 -0
  57. package/bin/scraping/site-scrapers/alternateGroupTitle.js +9 -0
  58. package/bin/scraping/site-scrapers/alternateGroupTitle.js.map +1 -0
  59. package/bin/scraping/site-scrapers/links-per-group/getDocusaurusLinksPerGroup.js +36 -0
  60. package/bin/scraping/site-scrapers/links-per-group/getDocusaurusLinksPerGroup.js.map +1 -0
  61. package/bin/scraping/site-scrapers/links-per-group/getLinksRecursively.js +38 -0
  62. package/bin/scraping/site-scrapers/links-per-group/getLinksRecursively.js.map +1 -0
  63. package/bin/scraping/site-scrapers/links-per-group/getLinksRecursivelyGitBook.js +38 -0
  64. package/bin/scraping/site-scrapers/links-per-group/getLinksRecursivelyGitBook.js.map +1 -0
  65. package/bin/scraping/site-scrapers/openNestedDocusaurusMenus.js +30 -0
  66. package/bin/scraping/site-scrapers/openNestedDocusaurusMenus.js.map +1 -0
  67. package/bin/scraping/site-scrapers/openNestedGitbookMenus.js +17 -0
  68. package/bin/scraping/site-scrapers/openNestedGitbookMenus.js.map +1 -0
  69. package/bin/scraping/site-scrapers/scrapeDocusaurusPage.js +49 -0
  70. package/bin/scraping/site-scrapers/scrapeDocusaurusPage.js.map +1 -0
  71. package/bin/scraping/site-scrapers/scrapeDocusaurusSection.js +30 -0
  72. package/bin/scraping/site-scrapers/scrapeDocusaurusSection.js.map +1 -0
  73. package/bin/scraping/site-scrapers/scrapeGitBookPage.js +34 -0
  74. package/bin/scraping/site-scrapers/scrapeGitBookPage.js.map +1 -0
  75. package/bin/scraping/site-scrapers/scrapeGitBookSection.js +52 -0
  76. package/bin/scraping/site-scrapers/scrapeGitBookSection.js.map +1 -0
  77. package/bin/scraping/site-scrapers/scrapeReadMePage.js +36 -0
  78. package/bin/scraping/site-scrapers/scrapeReadMePage.js.map +1 -0
  79. package/bin/scraping/site-scrapers/scrapeReadMeSection.js +44 -0
  80. package/bin/scraping/site-scrapers/scrapeReadMeSection.js.map +1 -0
  81. package/bin/util.js +129 -0
  82. package/bin/util.js.map +1 -0
  83. package/bin/validation/isValidLink.js +11 -0
  84. package/bin/validation/isValidLink.js.map +1 -0
  85. package/bin/validation/stopIfInvalidLink.js +9 -0
  86. package/bin/validation/stopIfInvalidLink.js.map +1 -0
  87. package/package.json +2 -2
@@ -0,0 +1,195 @@
1
+ import chokidar from "chokidar";
2
+ import fse from "fs-extra";
3
+ import pathUtil from "path";
4
+ import Chalk from "chalk";
5
+ import mintValidation from "@mintlify/validation";
6
+ import { openApiCheck } from "./utils.js";
7
+ import { updateGeneratedNav, updateOpenApiFiles } from "./update.js";
8
+ import { CLIENT_PATH, CMD_EXEC_PATH } from "../../constants.js";
9
+ import { promises as _promises } from "fs";
10
+ import createPage from "./utils/createPage.js";
11
+ import { getCategory } from "./categorize.js";
12
+ const { readFile } = _promises;
13
+ const listener = () => {
14
+ chokidar
15
+ .watch(CMD_EXEC_PATH, {
16
+ ignoreInitial: true,
17
+ ignored: ["node_modules", ".git", ".idea"],
18
+ cwd: CMD_EXEC_PATH,
19
+ })
20
+ .on("add", async (filename) => {
21
+ try {
22
+ const category = await onUpdateEvent(filename);
23
+ switch (category) {
24
+ case "page":
25
+ console.log("New page detected: ", filename);
26
+ break;
27
+ case "snippet":
28
+ console.log("New snippet detected: ", filename);
29
+ break;
30
+ case "mintConfig":
31
+ console.log("Config added");
32
+ break;
33
+ case "openApi":
34
+ console.log("OpenApi spec added: ", filename);
35
+ break;
36
+ case "staticFile":
37
+ console.log("Static file added: ", filename);
38
+ break;
39
+ }
40
+ }
41
+ catch (error) {
42
+ console.error(error.message);
43
+ }
44
+ })
45
+ .on("change", async (filename) => {
46
+ try {
47
+ const category = await onUpdateEvent(filename);
48
+ switch (category) {
49
+ case "page":
50
+ console.log("Page edited: ", filename);
51
+ break;
52
+ case "snippet":
53
+ console.log("Snippet edited: ", filename);
54
+ break;
55
+ case "mintConfig":
56
+ console.log("Config edited");
57
+ break;
58
+ case "openApi":
59
+ console.log("OpenApi spec edited: ", filename);
60
+ break;
61
+ case "staticFile":
62
+ console.log("Static file edited: ", filename);
63
+ break;
64
+ }
65
+ }
66
+ catch (error) {
67
+ console.error(error.message);
68
+ }
69
+ })
70
+ .on("unlink", async (filename) => {
71
+ try {
72
+ const potentialCategory = getCategory(filename);
73
+ const targetPath = getTargetPath(potentialCategory, filename);
74
+ if (potentialCategory === "page" ||
75
+ potentialCategory === "snippet" ||
76
+ potentialCategory === "mintConfig" ||
77
+ potentialCategory === "staticFile") {
78
+ await fse.remove(targetPath);
79
+ }
80
+ switch (potentialCategory) {
81
+ case "page":
82
+ console.log(`Page deleted: ${filename}`);
83
+ break;
84
+ case "snippet":
85
+ console.log(`Snippet deleted: ${filename}`);
86
+ break;
87
+ case "mintConfig":
88
+ console.log("⚠️ mint.json deleted. Please create a new mint.json file as it is mandatory.");
89
+ process.exit(1);
90
+ case "potentialJsonOpenApiSpec":
91
+ case "potentialYamlOpenApiSpec":
92
+ await updateOpenApiFiles();
93
+ await updateGeneratedNav();
94
+ break;
95
+ case "staticFile":
96
+ console.log("Static file deleted: ", filename);
97
+ break;
98
+ }
99
+ }
100
+ catch (error) {
101
+ console.error(error.message);
102
+ }
103
+ });
104
+ };
105
+ const getTargetPath = (potentialCategory, filePath) => {
106
+ switch (potentialCategory) {
107
+ case "page":
108
+ case "snippet":
109
+ return pathUtil.join(CLIENT_PATH, "src", "_props", filePath);
110
+ case "mintConfig":
111
+ return pathUtil.join(CLIENT_PATH, "src", "_props", "mint.json");
112
+ case "potentialYamlOpenApiSpec":
113
+ case "potentialJsonOpenApiSpec":
114
+ return pathUtil.join(CLIENT_PATH, "src", "_props", "openApiFiles.json");
115
+ case "staticFile":
116
+ return pathUtil.join(CLIENT_PATH, "public", filePath);
117
+ default:
118
+ throw new Error("Invalid category");
119
+ }
120
+ };
121
+ /**
122
+ * This function is called when a file is added or changed
123
+ * @param filename
124
+ * @returns FileCategory
125
+ */
126
+ const onUpdateEvent = async (filename) => {
127
+ const filePath = pathUtil.join(CMD_EXEC_PATH, filename);
128
+ const potentialCategory = getCategory(filename);
129
+ const targetPath = getTargetPath(potentialCategory, filename);
130
+ let regenerateNav = false;
131
+ let category = potentialCategory === "potentialYamlOpenApiSpec" ||
132
+ potentialCategory === "potentialJsonOpenApiSpec"
133
+ ? "staticFile"
134
+ : potentialCategory;
135
+ switch (potentialCategory) {
136
+ case "page":
137
+ regenerateNav = true;
138
+ const contentStr = (await readFile(filePath)).toString();
139
+ const { pageContent } = await createPage(filename, contentStr, CMD_EXEC_PATH, []);
140
+ await fse.outputFile(targetPath, pageContent, {
141
+ flag: "w",
142
+ });
143
+ break;
144
+ case "snippet":
145
+ await fse.copy(filePath, targetPath);
146
+ break;
147
+ case "mintConfig":
148
+ regenerateNav = true;
149
+ const mintJsonFileContent = (await readFile(filePath)).toString();
150
+ try {
151
+ const mintConfig = JSON.parse(mintJsonFileContent);
152
+ const { status, errors, warnings } = mintValidation.validateMintConfig(mintConfig);
153
+ errors.forEach((error) => {
154
+ console.error(`🚨 ${Chalk.red(error)}`);
155
+ });
156
+ warnings.forEach((warning) => {
157
+ console.warn(`⚠️ ${Chalk.yellow(warning)}`);
158
+ });
159
+ if (status === "success") {
160
+ await fse.copy(filePath, targetPath);
161
+ }
162
+ }
163
+ catch (error) {
164
+ if (error.name === "SyntaxError") {
165
+ console.error(`🚨 ${Chalk.red("mint.json has invalid JSON. You are likely missing a comma or a bracket. You can paste your mint.json file into https://jsonlint.com/ to get a more specific error message.")}`);
166
+ }
167
+ else {
168
+ console.error(`🚨 ${Chalk.red(error.message)}`);
169
+ }
170
+ }
171
+ break;
172
+ case "potentialYamlOpenApiSpec":
173
+ case "potentialJsonOpenApiSpec":
174
+ let isOpenApi = false;
175
+ const openApiInfo = await openApiCheck(pathUtil.join(CMD_EXEC_PATH, filename));
176
+ isOpenApi = openApiInfo.isOpenApi;
177
+ if (isOpenApi) {
178
+ // TODO: Instead of re-generating all openApi files, optimize by just updating the specific file that changed.
179
+ await updateOpenApiFiles();
180
+ regenerateNav = true;
181
+ category = "openApi";
182
+ }
183
+ break;
184
+ case "staticFile":
185
+ await fse.copy(filePath, targetPath);
186
+ break;
187
+ }
188
+ if (regenerateNav) {
189
+ // TODO: Instead of re-generating the entire nav, optimize by just updating the specific page that changed.
190
+ await updateGeneratedNav();
191
+ }
192
+ return category;
193
+ };
194
+ export default listener;
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/local-preview/listener/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ // TODO: Add Types
2
+ import fse from "fs-extra";
3
+ import { promises as _promises } from "fs";
4
+ import { getConfigPath } from "./utils/mintConfigFile.js";
5
+ import { CLIENT_PATH, CMD_EXEC_PATH } from "../../constants.js";
6
+ import { join } from "path";
7
+ import { generateNav } from "./generate.js";
8
+ import { categorizeFiles } from "./categorize.js";
9
+ const { readFile } = _promises;
10
+ // TODO: Put in prebuild package
11
+ export const updateConfigFile = async (contentDirectoryPath) => {
12
+ const configTargetPath = join(CLIENT_PATH, "src/_props/mint.json");
13
+ await fse.remove(configTargetPath);
14
+ let configObj = null;
15
+ const configPath = await getConfigPath(contentDirectoryPath);
16
+ if (configPath) {
17
+ await fse.remove(configTargetPath);
18
+ await fse.copy(configPath, configTargetPath);
19
+ const configContents = await readFile(configPath);
20
+ configObj = JSON.parse(configContents.toString());
21
+ }
22
+ else {
23
+ process.exit(1);
24
+ }
25
+ return configObj;
26
+ };
27
+ export const updateGeneratedNav = async () => {
28
+ const generatedNav = await generateNav();
29
+ const targetPath = join(CLIENT_PATH, "src", "_props", "generatedNav.json");
30
+ await fse.outputFile(targetPath, JSON.stringify(generatedNav, null, 2), {
31
+ flag: "w",
32
+ });
33
+ };
34
+ export const updateOpenApiFiles = async () => {
35
+ const { openApiFiles } = await categorizeFiles(CMD_EXEC_PATH);
36
+ const targetPath = join(CLIENT_PATH, "src", "_props", "openApiFiles.json");
37
+ await fse.outputFile(targetPath, JSON.stringify(openApiFiles, null, 2), {
38
+ flag: "w",
39
+ });
40
+ };
41
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/local-preview/listener/update.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;AAE/B,gCAAgC;AAEhC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,oBAA4B,EAAE,EAAE;IACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IACnE,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAE7D,IAAI,UAAU,EAAE;QACd,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACnC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;KACnD;SAAM;QACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;IAC3C,MAAM,YAAY,GAAG,MAAM,WAAW,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC3E,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACtE,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;IAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC3E,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACtE,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,167 @@
1
+ // TODO: Put in the prebuild package
2
+ import matter from "gray-matter";
3
+ import isAbsoluteUrl from "is-absolute-url";
4
+ import { remark } from "remark";
5
+ import remarkFrontmatter from "remark-frontmatter";
6
+ import remarkGfm from "remark-gfm";
7
+ import remarkMdx from "remark-mdx";
8
+ import { visit } from "unist-util-visit";
9
+ const createPage = async (pagePath, pageContent, contentDirectoryPath, openApiFiles) => {
10
+ let { data: metadata } = matter(pageContent);
11
+ try {
12
+ const parsedContent = await preParseMdx(pageContent, contentDirectoryPath);
13
+ pageContent = parsedContent;
14
+ }
15
+ catch (error) {
16
+ pageContent = `🚧 A parsing error occured. Please contact the owner of this website.`;
17
+ }
18
+ // Replace .mdx so we can pass file paths into this function
19
+ const slug = pagePath.replace(/\.mdx?$/, "");
20
+ let defaultTitle = slugToTitle(slug);
21
+ // Append data from OpenAPI if it exists
22
+ const { title, description } = getOpenApiTitleAndDescription(openApiFiles, metadata?.openapi);
23
+ if (title) {
24
+ defaultTitle = title;
25
+ }
26
+ const pageMetadata = {
27
+ title: defaultTitle,
28
+ description,
29
+ ...metadata,
30
+ href: optionallyAddLeadingSlash(slug),
31
+ };
32
+ return {
33
+ pageMetadata,
34
+ pageContent,
35
+ slug: removeLeadingSlash(slug),
36
+ };
37
+ };
38
+ const preParseMdx = async (fileContent, contentDirectoryPath) => {
39
+ const removeContentDirectoryPath = (filePath) => {
40
+ const pathArr = createPathArr(filePath);
41
+ const contentDirectoryPathArr = createPathArr(contentDirectoryPath);
42
+ contentDirectoryPathArr.reverse().forEach((dir, index) => {
43
+ if (pathArr[index] === dir) {
44
+ pathArr.pop();
45
+ }
46
+ });
47
+ return pathArr.join("/");
48
+ };
49
+ const removeContentDirectoryPaths = () => {
50
+ return (tree) => {
51
+ visit(tree, (node) => {
52
+ if (node == null) {
53
+ return;
54
+ }
55
+ if (node.name === "img" || node.name === "source") {
56
+ const srcAttrIndex = node.attributes.findIndex((attr) => attr?.name === "src");
57
+ const nodeUrl = node.attributes[srcAttrIndex].value;
58
+ if (
59
+ // <img/> component
60
+ srcAttrIndex !== -1 &&
61
+ !isAbsoluteUrl(nodeUrl) &&
62
+ !isDataString(nodeUrl)) {
63
+ node.attributes[srcAttrIndex].value =
64
+ removeContentDirectoryPath(nodeUrl);
65
+ }
66
+ }
67
+ else if (
68
+ // ![]() format
69
+ node.type === "image" &&
70
+ node.url &&
71
+ !isAbsoluteUrl(node.url) &&
72
+ !isDataString(node.url)) {
73
+ node.url = removeContentDirectoryPath(node.url);
74
+ }
75
+ });
76
+ return tree;
77
+ };
78
+ };
79
+ const file = await remark()
80
+ .use(remarkMdx)
81
+ .use(remarkGfm)
82
+ .use(remarkFrontmatter, ["yaml", "toml"])
83
+ .use(removeContentDirectoryPaths)
84
+ .process(fileContent);
85
+ return String(file);
86
+ };
87
+ const removeLeadingSlash = (str) => {
88
+ const path = createPathArr(str);
89
+ return path.join("/");
90
+ };
91
+ const createPathArr = (path) => {
92
+ return path.split("/").filter((dir) => dir !== "");
93
+ };
94
+ const isDataString = (str) => str.startsWith("data:");
95
+ const getOpenApiTitleAndDescription = (openApiFiles, openApiMetaField) => {
96
+ if (openApiFiles == null || !openApiMetaField || openApiMetaField == null) {
97
+ return {};
98
+ }
99
+ const { operation } = getOpenApiOperationMethodAndEndpoint(openApiFiles, openApiMetaField);
100
+ if (operation == null) {
101
+ return {};
102
+ }
103
+ return {
104
+ title: operation.summary,
105
+ description: operation.description,
106
+ };
107
+ };
108
+ const getOpenApiOperationMethodAndEndpoint = (openApiFiles, openApiMetaField) => {
109
+ const { endpoint, method, filename } = extractMethodAndEndpoint(openApiMetaField);
110
+ let path;
111
+ openApiFiles?.forEach((file) => {
112
+ const openApiFile = file.spec;
113
+ const openApiPath = openApiFile.paths && openApiFile.paths[endpoint];
114
+ const isFilenameOrNone = !filename || filename === file.filename;
115
+ if (openApiPath && isFilenameOrNone) {
116
+ path = openApiPath;
117
+ }
118
+ });
119
+ if (path == null) {
120
+ return {};
121
+ }
122
+ let operation;
123
+ if (method) {
124
+ operation = path[method.toLowerCase()];
125
+ }
126
+ else {
127
+ const firstOperationKey = Object.keys(path)[0];
128
+ operation = path[firstOperationKey];
129
+ }
130
+ return {
131
+ operation,
132
+ method,
133
+ endpoint,
134
+ };
135
+ };
136
+ const extractMethodAndEndpoint = (openApiMetaField) => {
137
+ const methodRegex = /(get|post|put|delete|patch)\s/i;
138
+ const trimmed = openApiMetaField.trim();
139
+ const foundMethod = trimmed.match(methodRegex);
140
+ const startIndexOfMethod = foundMethod
141
+ ? openApiMetaField.indexOf(foundMethod[0])
142
+ : 0;
143
+ const endIndexOfMethod = foundMethod
144
+ ? startIndexOfMethod + foundMethod[0].length - 1
145
+ : 0;
146
+ const filename = openApiMetaField.substring(0, startIndexOfMethod).trim();
147
+ return {
148
+ method: foundMethod ? foundMethod[0].slice(0, -1).toUpperCase() : undefined,
149
+ endpoint: openApiMetaField.substring(endIndexOfMethod).trim(),
150
+ filename: filename ? filename : undefined,
151
+ };
152
+ };
153
+ function optionallyAddLeadingSlash(path) {
154
+ if (!path || path.startsWith("/")) {
155
+ return path;
156
+ }
157
+ return "/" + path;
158
+ }
159
+ export const slugToTitle = (slug) => {
160
+ const slugArr = slug.split("/");
161
+ let defaultTitle = slugArr[slugArr.length - 1].split("-").join(" "); //replace all dashes
162
+ defaultTitle = defaultTitle.split("_").join(" "); //replace all underscores
163
+ defaultTitle = defaultTitle.charAt(0).toUpperCase() + defaultTitle.slice(1); //capitalize first letter
164
+ return defaultTitle;
165
+ };
166
+ export default createPage;
167
+ //# sourceMappingURL=createPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPage.js","sourceRoot":"","sources":["../../../../src/local-preview/listener/utils/createPage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export const extractMethodAndEndpoint = (api) => {
2
+ const methodRegex = /(get|post|put|delete|patch)\s/i;
3
+ const trimmed = api.trim();
4
+ const foundMethod = trimmed.match(methodRegex);
5
+ const startIndexOfMethod = foundMethod ? api.indexOf(foundMethod[0]) : 0;
6
+ const endIndexOfMethod = foundMethod
7
+ ? startIndexOfMethod + foundMethod[0].length - 1
8
+ : 0;
9
+ const filename = api.substring(0, startIndexOfMethod).trim();
10
+ return {
11
+ method: foundMethod ? foundMethod[0].slice(0, -1).toUpperCase() : undefined,
12
+ endpoint: api.substring(endIndexOfMethod).trim(),
13
+ filename: filename ? filename : undefined,
14
+ };
15
+ };
16
+ export const getOpenApiOperationMethodAndEndpoint = (openApi, openApiMetaField) => {
17
+ const { endpoint, method, filename } = extractMethodAndEndpoint(openApiMetaField);
18
+ let path;
19
+ openApi.files?.forEach((file) => {
20
+ const openApiFile = file.openapi;
21
+ const openApiPath = openApiFile.paths && openApiFile.paths[endpoint];
22
+ const isFilenameOrNone = !filename || filename === file.name;
23
+ if (openApiPath && isFilenameOrNone) {
24
+ path = openApiPath;
25
+ }
26
+ });
27
+ if (path == null) {
28
+ return {};
29
+ }
30
+ let operation;
31
+ if (method) {
32
+ operation = path[method.toLowerCase()];
33
+ }
34
+ else {
35
+ const firstOperationKey = Object.keys(path)[0];
36
+ operation = path[firstOperationKey];
37
+ }
38
+ return {
39
+ operation,
40
+ method,
41
+ endpoint,
42
+ };
43
+ };
44
+ export const getOpenApiTitleAndDescription = (openApi, openApiMetaField) => {
45
+ if (openApi == null || !openApiMetaField || openApiMetaField == null) {
46
+ return {};
47
+ }
48
+ const { operation } = getOpenApiOperationMethodAndEndpoint(openApi, openApiMetaField);
49
+ if (operation == null) {
50
+ return {};
51
+ }
52
+ return {
53
+ title: operation.summary,
54
+ description: operation.description,
55
+ };
56
+ };
57
+ //# sourceMappingURL=getOpenApiContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getOpenApiContext.js","sourceRoot":"","sources":["../../../../src/local-preview/listener/utils/getOpenApiContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { promises as _promises } from "fs";
2
+ import { pathExists } from "fs-extra";
3
+ import pathUtil from "path";
4
+ const { readFile } = _promises;
5
+ // TODO: Put in prebuild package
6
+ export const getConfigPath = async (contentDirectoryPath) => {
7
+ if (await pathExists(pathUtil.join(contentDirectoryPath, "mint.json"))) {
8
+ return pathUtil.join(contentDirectoryPath, "mint.json");
9
+ }
10
+ return null;
11
+ };
12
+ // TODO: Put in prebuild package
13
+ export const getConfigObj = async (contentDirectoryPath) => {
14
+ const configPath = await getConfigPath(contentDirectoryPath);
15
+ let configObj = null;
16
+ if (configPath) {
17
+ const configContents = await readFile(configPath);
18
+ configObj = await JSON.parse(configContents.toString());
19
+ }
20
+ return configObj;
21
+ };
22
+ //# sourceMappingURL=mintConfigFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintConfigFile.js","sourceRoot":"","sources":["../../../../src/local-preview/listener/utils/mintConfigFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,QAAQ,MAAM,MAAM,CAAC;AAE5B,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;AAE/B,gCAAgC;AAChC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,oBAA4B,EACJ,EAAE;IAC1B,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,EAAE;QACtE,OAAO,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;KACzD;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,oBAA4B,EACd,EAAE;IAChB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC7D,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,UAAU,EAAE;QACd,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClD,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;KACzD;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ export function toTitleCase(text) {
2
+ const smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$/i;
3
+ const alphanumericPattern = /([A-Za-z0-9\u00C0-\u00FF])/;
4
+ const wordSeparators = /([ :–—-])/;
5
+ return text
6
+ .split(wordSeparators)
7
+ .map(function (current, index, array) {
8
+ if (
9
+ // Check for small words
10
+ current.search(smallWords) > -1 &&
11
+ // Skip first and last word
12
+ index !== 0 &&
13
+ index !== array.length - 1 &&
14
+ // Ignore title end and subtitle start
15
+ array[index - 3] !== ':' &&
16
+ array[index + 1] !== ':' &&
17
+ // Ignore small words that start a hyphenated phrase
18
+ (array[index + 1] !== '-' || (array[index - 1] === '-' && array[index + 1] === '-'))) {
19
+ return current.toLowerCase();
20
+ }
21
+ // Ignore intentional capitalization
22
+ if (current.substring(1).search(/[A-Z]|\../) > -1) {
23
+ return current;
24
+ }
25
+ // Ignore URLs
26
+ if (array[index + 1] === ':' && array[index + 2] !== '') {
27
+ return current;
28
+ }
29
+ // Capitalize the first letter
30
+ return current.replace(alphanumericPattern, function (match) {
31
+ return match.toUpperCase();
32
+ });
33
+ })
34
+ .join('');
35
+ }
36
+ //# sourceMappingURL=toTitleCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toTitleCase.js","sourceRoot":"","sources":["../../../../src/local-preview/listener/utils/toTitleCase.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,UAAU,GAAG,8EAA8E,CAAC;IAClG,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;IACzD,MAAM,cAAc,GAAG,WAAW,CAAC;IAEnC,OAAO,IAAI;SACR,KAAK,CAAC,cAAc,CAAC;SACrB,GAAG,CAAC,UAAU,OAAO,EAAE,KAAK,EAAE,KAAK;QAClC;QACE,wBAAwB;QACxB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC/B,2BAA2B;YAC3B,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;YAC1B,sCAAsC;YACtC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YACxB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YACxB,oDAAoD;YACpD,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EACpF;YACA,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;SAC9B;QAED,oCAAoC;QACpC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE;YACjD,OAAO,OAAO,CAAC;SAChB;QAED,cAAc;QACd,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACvD,OAAO,OAAO,CAAC;SAChB;QAED,8BAA8B;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,UAAU,KAAa;YACjE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/local-preview/listener/utils/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import SwaggerParser from "@apidevtools/swagger-parser";
2
+ import { promises as _promises } from "fs";
3
+ const { readdir } = _promises;
4
+ export const getFileExtension = (filename) => {
5
+ return (filename.substring(filename.lastIndexOf(".") + 1, filename.length) ||
6
+ filename);
7
+ };
8
+ export const openApiCheck = async (path) => {
9
+ let spec;
10
+ let isOpenApi = false;
11
+ try {
12
+ spec = await SwaggerParser.validate(path);
13
+ isOpenApi = true;
14
+ }
15
+ catch {
16
+ // not valid openApi
17
+ }
18
+ return { spec, isOpenApi };
19
+ };
20
+ export const filterOutNullInGroup = (group) => {
21
+ const newPages = filterOutNullInPages(group.pages);
22
+ const newGroup = {
23
+ ...group,
24
+ pages: newPages,
25
+ };
26
+ return newGroup;
27
+ };
28
+ const filterOutNullInPages = (pages) => {
29
+ if (!Array.isArray(pages)) {
30
+ return [];
31
+ }
32
+ const newPages = [];
33
+ pages.forEach((page) => {
34
+ if (page == null) {
35
+ return;
36
+ }
37
+ if (page.hasOwnProperty("pages")) {
38
+ const newGroup = filterOutNullInGroup(page);
39
+ newPages.push(newGroup);
40
+ }
41
+ else {
42
+ newPages.push(page);
43
+ }
44
+ });
45
+ return newPages;
46
+ };
47
+ export const getFileList = async (dirName, og = dirName) => {
48
+ let files = [];
49
+ const items = await readdir(dirName, { withFileTypes: true });
50
+ for (const item of items) {
51
+ if (item.isDirectory()) {
52
+ files = [...files, ...(await getFileList(`${dirName}/${item.name}`, og))];
53
+ }
54
+ else {
55
+ const path = `${dirName}/${item.name}`;
56
+ const name = path.replace(og, "");
57
+ files.push(name);
58
+ }
59
+ }
60
+ return files;
61
+ };
62
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/local-preview/listener/utils.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,IAAI,CAAC;AAE3C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,EAAE;IAC3C,OAAO,CACL,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;QAClE,QAAQ,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;IACzC,IAAI,IAAI,CAAC;IACT,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI;QACF,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,SAAS,GAAG,IAAI,CAAC;KAClB;IAAC,MAAM;QACN,oBAAoB;KACrB;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,EAAE;IAC5C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG;QACf,GAAG,KAAK;QACR,KAAK,EAAE,QAAQ;KAChB,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,EAAE;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACzB,OAAO,EAAE,CAAC;KACX;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,IAAI,IAAI,EAAE;YAChB,OAAO;SACR;QACD,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;YAChC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzB;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACrB;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE;IACjE,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,WAAW,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;SAC3E;aAAM;YACL,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClB;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}