joist-codegen 2.0.3 → 2.1.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/EntityDbMetadata.d.ts +2 -0
- package/build/EntityDbMetadata.d.ts.map +1 -1
- package/build/EntityDbMetadata.js.map +1 -1
- package/build/config.d.ts +8 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +4 -0
- package/build/config.js.map +1 -1
- package/build/docs/cache.d.ts +14 -0
- package/build/docs/cache.d.ts.map +1 -0
- package/build/docs/cache.js +61 -0
- package/build/docs/cache.js.map +1 -0
- package/build/docs/cache.test.d.ts +2 -0
- package/build/docs/cache.test.d.ts.map +1 -0
- package/build/docs/cache.test.js +47 -0
- package/build/docs/cache.test.js.map +1 -0
- package/build/docs/generate-metadata-docs.d.ts +6 -0
- package/build/docs/generate-metadata-docs.d.ts.map +1 -0
- package/build/docs/generate-metadata-docs.js +36 -0
- package/build/docs/generate-metadata-docs.js.map +1 -0
- package/build/docs/index.d.ts +9 -0
- package/build/docs/index.d.ts.map +1 -0
- package/build/docs/index.js +90 -0
- package/build/docs/index.js.map +1 -0
- package/build/docs/index.test.d.ts +2 -0
- package/build/docs/index.test.d.ts.map +1 -0
- package/build/docs/index.test.js +89 -0
- package/build/docs/index.test.js.map +1 -0
- package/build/docs/markdown.d.ts +30 -0
- package/build/docs/markdown.d.ts.map +1 -0
- package/build/docs/markdown.js +201 -0
- package/build/docs/markdown.js.map +1 -0
- package/build/docs/markdown.test.d.ts +2 -0
- package/build/docs/markdown.test.d.ts.map +1 -0
- package/build/docs/markdown.test.js +240 -0
- package/build/docs/markdown.test.js.map +1 -0
- package/build/docs/parsing.d.ts +42 -0
- package/build/docs/parsing.d.ts.map +1 -0
- package/build/docs/parsing.js +109 -0
- package/build/docs/parsing.js.map +1 -0
- package/build/docs/parsing.test.d.ts +2 -0
- package/build/docs/parsing.test.d.ts.map +1 -0
- package/build/docs/parsing.test.js +190 -0
- package/build/docs/parsing.test.js.map +1 -0
- package/build/generate.d.ts.map +1 -1
- package/build/generate.js +9 -0
- package/build/generate.js.map +1 -1
- package/build/generateEntityCodegenFile.d.ts.map +1 -1
- package/build/generateEntityCodegenFile.js +20 -2
- package/build/generateEntityCodegenFile.js.map +1 -1
- package/build/generateFlushFunction.d.ts.map +1 -1
- package/build/generateFlushFunction.js +7 -5
- package/build/generateFlushFunction.js.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -1
- package/build/index.js.map +1 -1
- package/build/symbols.d.ts +1 -0
- package/build/symbols.d.ts.map +1 -1
- package/build/symbols.js +3 -2
- package/build/symbols.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/docs/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs_1 = require("fs");
|
|
4
|
+
const os_1 = require("os");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const index_1 = require("./index");
|
|
7
|
+
let testDir;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
testDir = await fs_1.promises.mkdtemp((0, path_1.join)((0, os_1.tmpdir)(), "joist-docs-test-"));
|
|
10
|
+
});
|
|
11
|
+
afterEach(async () => {
|
|
12
|
+
await fs_1.promises.rm(testDir, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
describe("syncDocs", () => {
|
|
15
|
+
it("syncs markdown overview into ts file with @generated tag", async () => {
|
|
16
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.ts"), "export class Author extends AuthorCodegen {}", "utf-8");
|
|
17
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.md"), "## Overview\nThe Author entity.\n", "utf-8");
|
|
18
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
19
|
+
const result = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.ts"), "utf-8");
|
|
20
|
+
expect(result).toContain("The Author entity.");
|
|
21
|
+
expect(result).toContain("@generated Author.md");
|
|
22
|
+
});
|
|
23
|
+
it("syncs field docs into ts file", async () => {
|
|
24
|
+
const ts = ["export class Author extends AuthorCodegen {", ' readonly firstName: string = "";', "}"].join("\n");
|
|
25
|
+
const md = ["## Overview", "", "## Fields", "", "### firstName", "", "The first name.", ""].join("\n");
|
|
26
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.ts"), ts, "utf-8");
|
|
27
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.md"), md, "utf-8");
|
|
28
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
29
|
+
const result = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.ts"), "utf-8");
|
|
30
|
+
expect(result).toContain("The first name.");
|
|
31
|
+
expect(result).toContain("@generated Author.md");
|
|
32
|
+
});
|
|
33
|
+
it("backfills md from ts jsdoc when md does not exist", async () => {
|
|
34
|
+
const ts = ["/** The Author entity. */", "export class Author extends AuthorCodegen {}"].join("\n");
|
|
35
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.ts"), ts, "utf-8");
|
|
36
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
37
|
+
const md = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.md"), "utf-8");
|
|
38
|
+
expect(md).toContain("The Author entity.");
|
|
39
|
+
});
|
|
40
|
+
it("skips entities on second run when files are unchanged", async () => {
|
|
41
|
+
const bare = "export class Author extends AuthorCodegen {}";
|
|
42
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.ts"), bare, "utf-8");
|
|
43
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.md"), "## Overview\nThe Author entity.\n", "utf-8");
|
|
44
|
+
// First run — processes, writes JSDoc into .ts, and caches the resulting mtimes
|
|
45
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
46
|
+
const firstResult = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.ts"), "utf-8");
|
|
47
|
+
expect(firstResult).toContain("The Author entity.");
|
|
48
|
+
// Snapshot the post-run mtimes (these are what the cache recorded)
|
|
49
|
+
const tsPath = (0, path_1.join)(testDir, "Author.ts");
|
|
50
|
+
const mdPath = (0, path_1.join)(testDir, "Author.md");
|
|
51
|
+
const tsStat = await fs_1.promises.stat(tsPath);
|
|
52
|
+
const mdStat = await fs_1.promises.stat(mdPath);
|
|
53
|
+
// Revert .ts to the bare version (no JSDoc) but restore the post-run mtime
|
|
54
|
+
// so the cache thinks nothing changed. If syncDocs re-processes, the overview
|
|
55
|
+
// would be re-injected; if it correctly skips, the bare content survives.
|
|
56
|
+
await fs_1.promises.writeFile(tsPath, bare, "utf-8");
|
|
57
|
+
await fs_1.promises.utimes(tsPath, tsStat.atimeMs / 1000, tsStat.mtimeMs / 1000);
|
|
58
|
+
await fs_1.promises.utimes(mdPath, mdStat.atimeMs / 1000, mdStat.mtimeMs / 1000);
|
|
59
|
+
// Second run — should skip because mtimes haven't changed
|
|
60
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
61
|
+
const secondResult = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.ts"), "utf-8");
|
|
62
|
+
// If the cache correctly skipped, the bare content is still there (no JSDoc injected)
|
|
63
|
+
expect(secondResult).toBe(bare);
|
|
64
|
+
});
|
|
65
|
+
it("re-processes entity when md file changes", async () => {
|
|
66
|
+
const ts = ["export class Author extends AuthorCodegen {", ' readonly firstName: string = "";', "}"].join("\n");
|
|
67
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.ts"), ts, "utf-8");
|
|
68
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.md"), "## Overview\nVersion one.\n", "utf-8");
|
|
69
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
70
|
+
const first = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.ts"), "utf-8");
|
|
71
|
+
expect(first).toContain("Version one.");
|
|
72
|
+
// Wait a tick to ensure mtime differs
|
|
73
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
74
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.md"), "## Overview\nVersion two.\n", "utf-8");
|
|
75
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
76
|
+
const second = await fs_1.promises.readFile((0, path_1.join)(testDir, "Author.ts"), "utf-8");
|
|
77
|
+
expect(second).toContain("Version two.");
|
|
78
|
+
expect(second).not.toContain("Version one.");
|
|
79
|
+
});
|
|
80
|
+
it("handles entities with no md file", async () => {
|
|
81
|
+
await fs_1.promises.writeFile((0, path_1.join)(testDir, "Author.ts"), "export class Author extends AuthorCodegen {}", "utf-8");
|
|
82
|
+
// Should not throw
|
|
83
|
+
await (0, index_1.syncDocs)(testDir, ["Author"]);
|
|
84
|
+
// No md created since there's no jsdoc to backfill
|
|
85
|
+
const files = await fs_1.promises.readdir(testDir);
|
|
86
|
+
expect(files).toMatchObject(["Author.ts"]);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/docs/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ParsedDoc {
|
|
2
|
+
overview: string;
|
|
3
|
+
fields: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
/** Read and parse a .md file if it exists, returning undefined if it doesn't. */
|
|
6
|
+
export declare function maybeReadMarkdownFile(filePath: string): Promise<ParsedDoc | undefined>;
|
|
7
|
+
/** Reads a basic `overview` and per-field docs out of md content. */
|
|
8
|
+
export declare function parseMarkdownContent(content: string): ParsedDoc;
|
|
9
|
+
/** Create a new .md file from scratch (used only for initial backfill when no .md exists). */
|
|
10
|
+
export declare function writeMarkdownDoc(filePath: string, overview: string, fields?: Record<string, string>): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Update an existing .md file, merging in new/changed content without stomping user content.
|
|
13
|
+
* If the file doesn't exist, creates it from scratch.
|
|
14
|
+
*/
|
|
15
|
+
export declare function updateMarkdownDoc(filePath: string, overview: string | undefined, fields: Record<string, string>): Promise<void>;
|
|
16
|
+
export declare function getMarkdownFilePath(entitiesDir: string, entityName: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Merge updates into an existing .md file, preserving all user content.
|
|
19
|
+
*
|
|
20
|
+
* - If `overview` is provided and the file has `## Overview`, replaces its body
|
|
21
|
+
* - For each field in `fields`, if `### fieldName` exists, replaces its body;
|
|
22
|
+
* otherwise appends it to the `## Fields` section (creating the section if needed)
|
|
23
|
+
* - All other content (custom sections, tables, etc.) is preserved verbatim
|
|
24
|
+
*/
|
|
25
|
+
declare function mergeMarkdownContent(existing: string, overview: string | undefined, fields: Record<string, string>): string;
|
|
26
|
+
export declare const testing: {
|
|
27
|
+
mergeMarkdownContent: typeof mergeMarkdownContent;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/docs/markdown.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,iFAAiF;AACjF,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAO5F;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CA8C/D;AAED,8FAA8F;AAC9F,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnF;AAWD;;;;;;;GAOG;AACH,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CA6EpH;AAED,eAAO,MAAM,OAAO;;CAA2B,CAAC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.testing = void 0;
|
|
4
|
+
exports.maybeReadMarkdownFile = maybeReadMarkdownFile;
|
|
5
|
+
exports.parseMarkdownContent = parseMarkdownContent;
|
|
6
|
+
exports.writeMarkdownDoc = writeMarkdownDoc;
|
|
7
|
+
exports.updateMarkdownDoc = updateMarkdownDoc;
|
|
8
|
+
exports.getMarkdownFilePath = getMarkdownFilePath;
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
/** Read and parse a .md file if it exists, returning undefined if it doesn't. */
|
|
12
|
+
async function maybeReadMarkdownFile(filePath) {
|
|
13
|
+
try {
|
|
14
|
+
const content = await fs_1.promises.readFile(filePath, "utf-8");
|
|
15
|
+
return parseMarkdownContent(content);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Reads a basic `overview` and per-field docs out of md content. */
|
|
22
|
+
function parseMarkdownContent(content) {
|
|
23
|
+
const lines = content.split("\n");
|
|
24
|
+
let currentSection = null;
|
|
25
|
+
let currentField = null;
|
|
26
|
+
const overviewLines = [];
|
|
27
|
+
const fields = {};
|
|
28
|
+
for (const line of lines) {
|
|
29
|
+
if (/^## Overview\s*$/.test(line)) {
|
|
30
|
+
currentSection = "overview";
|
|
31
|
+
currentField = null;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (/^## Fields\s*$/.test(line)) {
|
|
35
|
+
currentSection = "fields";
|
|
36
|
+
currentField = null;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Any other ## resets us out of known sections
|
|
40
|
+
if (/^## /.test(line)) {
|
|
41
|
+
currentSection = null;
|
|
42
|
+
currentField = null;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (currentSection === "fields") {
|
|
46
|
+
const fieldMatch = line.match(/^### (\w+)\s*$/);
|
|
47
|
+
if (fieldMatch) {
|
|
48
|
+
currentField = fieldMatch[1];
|
|
49
|
+
fields[currentField] = [];
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (currentSection === "overview") {
|
|
54
|
+
overviewLines.push(line);
|
|
55
|
+
}
|
|
56
|
+
else if (currentSection === "fields" && currentField) {
|
|
57
|
+
fields[currentField].push(line);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
overview: trimBlankLines(overviewLines).join("\n"),
|
|
62
|
+
fields: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, trimBlankLines(v).join("\n")])),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Create a new .md file from scratch (used only for initial backfill when no .md exists). */
|
|
66
|
+
async function writeMarkdownDoc(filePath, overview, fields) {
|
|
67
|
+
const parts = [];
|
|
68
|
+
parts.push("## Overview");
|
|
69
|
+
parts.push(overview || "");
|
|
70
|
+
parts.push("");
|
|
71
|
+
if (fields && Object.keys(fields).length > 0) {
|
|
72
|
+
parts.push("## Fields");
|
|
73
|
+
parts.push("");
|
|
74
|
+
for (const [fieldName, fieldDoc] of Object.entries(fields)) {
|
|
75
|
+
parts.push(`### ${fieldName}`);
|
|
76
|
+
parts.push("");
|
|
77
|
+
parts.push(fieldDoc);
|
|
78
|
+
parts.push("");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
await fs_1.promises.writeFile(filePath, parts.join("\n"), "utf-8");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Update an existing .md file, merging in new/changed content without stomping user content.
|
|
85
|
+
* If the file doesn't exist, creates it from scratch.
|
|
86
|
+
*/
|
|
87
|
+
async function updateMarkdownDoc(filePath, overview, fields) {
|
|
88
|
+
let existing = null;
|
|
89
|
+
try {
|
|
90
|
+
existing = await fs_1.promises.readFile(filePath, "utf-8");
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// File doesn't exist
|
|
94
|
+
}
|
|
95
|
+
if (existing !== null) {
|
|
96
|
+
const updated = mergeMarkdownContent(existing, overview, fields);
|
|
97
|
+
if (updated !== existing) {
|
|
98
|
+
await fs_1.promises.writeFile(filePath, updated, "utf-8");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
await writeMarkdownDoc(filePath, overview ?? "", Object.keys(fields).length > 0 ? fields : undefined);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function getMarkdownFilePath(entitiesDir, entityName) {
|
|
106
|
+
return (0, path_1.join)(entitiesDir, `${entityName}.md`);
|
|
107
|
+
}
|
|
108
|
+
/** Trim leading/trailing blank lines but preserve internal blank lines. */
|
|
109
|
+
function trimBlankLines(lines) {
|
|
110
|
+
let start = 0;
|
|
111
|
+
while (start < lines.length && lines[start].trim() === "")
|
|
112
|
+
start++;
|
|
113
|
+
let end = lines.length - 1;
|
|
114
|
+
while (end >= start && lines[end].trim() === "")
|
|
115
|
+
end--;
|
|
116
|
+
return lines.slice(start, end + 1);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Merge updates into an existing .md file, preserving all user content.
|
|
120
|
+
*
|
|
121
|
+
* - If `overview` is provided and the file has `## Overview`, replaces its body
|
|
122
|
+
* - For each field in `fields`, if `### fieldName` exists, replaces its body;
|
|
123
|
+
* otherwise appends it to the `## Fields` section (creating the section if needed)
|
|
124
|
+
* - All other content (custom sections, tables, etc.) is preserved verbatim
|
|
125
|
+
*/
|
|
126
|
+
function mergeMarkdownContent(existing, overview, fields) {
|
|
127
|
+
const lines = existing.split("\n");
|
|
128
|
+
const result = [];
|
|
129
|
+
// Track which fields we've already merged so we know what to append
|
|
130
|
+
const mergedFields = new Set();
|
|
131
|
+
let fieldsEndIndex = -1;
|
|
132
|
+
let i = 0;
|
|
133
|
+
while (i < lines.length) {
|
|
134
|
+
const line = lines[i];
|
|
135
|
+
// Replace ## Overview body
|
|
136
|
+
if (/^## Overview\s*$/.test(line) && overview !== undefined) {
|
|
137
|
+
result.push(line);
|
|
138
|
+
i++;
|
|
139
|
+
// Skip over old overview body (until next ## or EOF)
|
|
140
|
+
while (i < lines.length && !/^## /.test(lines[i]))
|
|
141
|
+
i++;
|
|
142
|
+
// Write new overview body
|
|
143
|
+
result.push(overview || "");
|
|
144
|
+
result.push("");
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// Track where ## Fields section ends (for appending new fields)
|
|
148
|
+
if (/^## Fields\s*$/.test(line)) {
|
|
149
|
+
result.push(line);
|
|
150
|
+
i++;
|
|
151
|
+
// Process the fields section line by line
|
|
152
|
+
while (i < lines.length && !/^## /.test(lines[i])) {
|
|
153
|
+
const fieldMatch = lines[i].match(/^### (\w+)\s*$/);
|
|
154
|
+
if (fieldMatch && fieldMatch[1] in fields) {
|
|
155
|
+
const fieldName = fieldMatch[1];
|
|
156
|
+
mergedFields.add(fieldName);
|
|
157
|
+
result.push(lines[i]); // ### fieldName
|
|
158
|
+
i++;
|
|
159
|
+
// Skip old field body (until next ### or ## or EOF)
|
|
160
|
+
while (i < lines.length && !/^###? /.test(lines[i]) && !/^## /.test(lines[i]))
|
|
161
|
+
i++;
|
|
162
|
+
// Write new field body
|
|
163
|
+
result.push("");
|
|
164
|
+
result.push(fields[fieldName]);
|
|
165
|
+
result.push("");
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Keep any line that isn't a field we're replacing (other ### fields, blank lines, etc.)
|
|
169
|
+
result.push(lines[i]);
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
fieldsEndIndex = result.length;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
result.push(line);
|
|
177
|
+
i++;
|
|
178
|
+
}
|
|
179
|
+
// Append any fields that weren't already in the file
|
|
180
|
+
const newFields = Object.entries(fields).filter(([name]) => !mergedFields.has(name));
|
|
181
|
+
if (newFields.length > 0) {
|
|
182
|
+
if (fieldsEndIndex === -1) {
|
|
183
|
+
// No ## Fields section existed, create one
|
|
184
|
+
result.push("");
|
|
185
|
+
result.push("## Fields");
|
|
186
|
+
result.push("");
|
|
187
|
+
fieldsEndIndex = result.length;
|
|
188
|
+
}
|
|
189
|
+
const toInsert = [];
|
|
190
|
+
for (const [fieldName, fieldDoc] of newFields) {
|
|
191
|
+
toInsert.push(`### ${fieldName}`);
|
|
192
|
+
toInsert.push("");
|
|
193
|
+
toInsert.push(fieldDoc);
|
|
194
|
+
toInsert.push("");
|
|
195
|
+
}
|
|
196
|
+
result.splice(fieldsEndIndex, 0, ...toInsert);
|
|
197
|
+
}
|
|
198
|
+
return result.join("\n");
|
|
199
|
+
}
|
|
200
|
+
exports.testing = { mergeMarkdownContent };
|
|
201
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/docs/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.test.d.ts","sourceRoot":"","sources":["../../src/docs/markdown.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const markdown_1 = require("./markdown");
|
|
4
|
+
const { mergeMarkdownContent } = markdown_1.testing;
|
|
5
|
+
describe("markdown", () => {
|
|
6
|
+
describe("parseMarkdownContent", () => {
|
|
7
|
+
it("parses overview and fields", () => {
|
|
8
|
+
const md = [
|
|
9
|
+
"## Overview",
|
|
10
|
+
"This is the Author entity.",
|
|
11
|
+
"",
|
|
12
|
+
"## Fields",
|
|
13
|
+
"",
|
|
14
|
+
"### firstName",
|
|
15
|
+
"",
|
|
16
|
+
"The author's first name.",
|
|
17
|
+
"",
|
|
18
|
+
"### lastName",
|
|
19
|
+
"",
|
|
20
|
+
"The author's last name.",
|
|
21
|
+
"",
|
|
22
|
+
].join("\n");
|
|
23
|
+
expect((0, markdown_1.parseMarkdownContent)(md)).toEqual({
|
|
24
|
+
overview: "This is the Author entity.",
|
|
25
|
+
fields: {
|
|
26
|
+
firstName: "The author's first name.",
|
|
27
|
+
lastName: "The author's last name.",
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it("handles multi-line overview", () => {
|
|
32
|
+
const md = ["## Overview", "Line one.", "", "Line two after blank.", "", "## Fields", ""].join("\n");
|
|
33
|
+
expect((0, markdown_1.parseMarkdownContent)(md)).toEqual({
|
|
34
|
+
overview: "Line one.\n\nLine two after blank.",
|
|
35
|
+
fields: {},
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it("handles multi-line field docs", () => {
|
|
39
|
+
const md = [
|
|
40
|
+
"## Overview",
|
|
41
|
+
"Entity doc.",
|
|
42
|
+
"",
|
|
43
|
+
"## Fields",
|
|
44
|
+
"",
|
|
45
|
+
"### notes",
|
|
46
|
+
"First paragraph.",
|
|
47
|
+
"",
|
|
48
|
+
"Second paragraph.",
|
|
49
|
+
"",
|
|
50
|
+
].join("\n");
|
|
51
|
+
expect((0, markdown_1.parseMarkdownContent)(md)).toEqual({
|
|
52
|
+
overview: "Entity doc.",
|
|
53
|
+
fields: {
|
|
54
|
+
notes: "First paragraph.\n\nSecond paragraph.",
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it("returns empty strings when sections are empty", () => {
|
|
59
|
+
const md = "## Overview\n\n## Fields\n";
|
|
60
|
+
expect((0, markdown_1.parseMarkdownContent)(md)).toEqual({
|
|
61
|
+
overview: "",
|
|
62
|
+
fields: {},
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it("ignores unknown sections", () => {
|
|
66
|
+
const md = [
|
|
67
|
+
"## Overview",
|
|
68
|
+
"The overview.",
|
|
69
|
+
"",
|
|
70
|
+
"## SomeOtherSection",
|
|
71
|
+
"Should be ignored.",
|
|
72
|
+
"",
|
|
73
|
+
"## Fields",
|
|
74
|
+
"",
|
|
75
|
+
"### name",
|
|
76
|
+
"The name.",
|
|
77
|
+
"",
|
|
78
|
+
].join("\n");
|
|
79
|
+
expect((0, markdown_1.parseMarkdownContent)(md)).toEqual({
|
|
80
|
+
overview: "The overview.",
|
|
81
|
+
fields: { name: "The name." },
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it("parses field docs with markdown tables", () => {
|
|
85
|
+
const md = [
|
|
86
|
+
"## Overview",
|
|
87
|
+
"Entity.",
|
|
88
|
+
"",
|
|
89
|
+
"## Fields",
|
|
90
|
+
"",
|
|
91
|
+
"### status",
|
|
92
|
+
"",
|
|
93
|
+
"The current status. Possible values:",
|
|
94
|
+
"",
|
|
95
|
+
"| Value | Meaning |",
|
|
96
|
+
"|-------|---------|",
|
|
97
|
+
"| ACTIVE | Currently active |",
|
|
98
|
+
"| INACTIVE | No longer active |",
|
|
99
|
+
"",
|
|
100
|
+
].join("\n");
|
|
101
|
+
expect((0, markdown_1.parseMarkdownContent)(md)).toMatchObject({
|
|
102
|
+
fields: {
|
|
103
|
+
status: [
|
|
104
|
+
"The current status. Possible values:",
|
|
105
|
+
"",
|
|
106
|
+
"| Value | Meaning |",
|
|
107
|
+
"|-------|---------|",
|
|
108
|
+
"| ACTIVE | Currently active |",
|
|
109
|
+
"| INACTIVE | No longer active |",
|
|
110
|
+
].join("\n"),
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe("mergeMarkdownContent", () => {
|
|
116
|
+
it("preserves custom sections between Overview and Fields", () => {
|
|
117
|
+
const existing = [
|
|
118
|
+
"## Overview",
|
|
119
|
+
"Old overview.",
|
|
120
|
+
"",
|
|
121
|
+
"## Business Rules",
|
|
122
|
+
"",
|
|
123
|
+
"| Rule | Description |",
|
|
124
|
+
"|------|-------------|",
|
|
125
|
+
"| no nulls | Name is required |",
|
|
126
|
+
"",
|
|
127
|
+
"## Fields",
|
|
128
|
+
"",
|
|
129
|
+
"### name",
|
|
130
|
+
"",
|
|
131
|
+
"The name.",
|
|
132
|
+
"",
|
|
133
|
+
].join("\n");
|
|
134
|
+
const result = mergeMarkdownContent(existing, "New overview.", {});
|
|
135
|
+
expect(result).toBe([
|
|
136
|
+
"## Overview",
|
|
137
|
+
"New overview.",
|
|
138
|
+
"",
|
|
139
|
+
"## Business Rules",
|
|
140
|
+
"",
|
|
141
|
+
"| Rule | Description |",
|
|
142
|
+
"|------|-------------|",
|
|
143
|
+
"| no nulls | Name is required |",
|
|
144
|
+
"",
|
|
145
|
+
"## Fields",
|
|
146
|
+
"",
|
|
147
|
+
"### name",
|
|
148
|
+
"",
|
|
149
|
+
"The name.",
|
|
150
|
+
"",
|
|
151
|
+
].join("\n"));
|
|
152
|
+
});
|
|
153
|
+
it("preserves custom sections after Fields", () => {
|
|
154
|
+
const existing = [
|
|
155
|
+
"## Overview",
|
|
156
|
+
"The overview.",
|
|
157
|
+
"",
|
|
158
|
+
"## Fields",
|
|
159
|
+
"",
|
|
160
|
+
"### name",
|
|
161
|
+
"",
|
|
162
|
+
"The name.",
|
|
163
|
+
"",
|
|
164
|
+
"## Notes",
|
|
165
|
+
"",
|
|
166
|
+
"```typescript",
|
|
167
|
+
"const a = 1;",
|
|
168
|
+
"```",
|
|
169
|
+
"",
|
|
170
|
+
].join("\n");
|
|
171
|
+
const result = mergeMarkdownContent(existing, undefined, { age: "The age." });
|
|
172
|
+
expect(result).toBe([
|
|
173
|
+
"## Overview",
|
|
174
|
+
"The overview.",
|
|
175
|
+
"",
|
|
176
|
+
"## Fields",
|
|
177
|
+
"",
|
|
178
|
+
"### name",
|
|
179
|
+
"",
|
|
180
|
+
"The name.",
|
|
181
|
+
"",
|
|
182
|
+
"### age",
|
|
183
|
+
"",
|
|
184
|
+
"The age.",
|
|
185
|
+
"",
|
|
186
|
+
"## Notes",
|
|
187
|
+
"",
|
|
188
|
+
"```typescript",
|
|
189
|
+
"const a = 1;",
|
|
190
|
+
"```",
|
|
191
|
+
"",
|
|
192
|
+
].join("\n"));
|
|
193
|
+
});
|
|
194
|
+
it("appends new fields without touching existing ones", () => {
|
|
195
|
+
const existing = [
|
|
196
|
+
"## Overview",
|
|
197
|
+
"The overview.",
|
|
198
|
+
"",
|
|
199
|
+
"## Fields",
|
|
200
|
+
"",
|
|
201
|
+
"### name",
|
|
202
|
+
"",
|
|
203
|
+
"User-written name doc with **bold** text.",
|
|
204
|
+
"",
|
|
205
|
+
].join("\n");
|
|
206
|
+
const result = mergeMarkdownContent(existing, undefined, { age: "The age." });
|
|
207
|
+
expect(result).toBe([
|
|
208
|
+
"## Overview",
|
|
209
|
+
"The overview.",
|
|
210
|
+
"",
|
|
211
|
+
"## Fields",
|
|
212
|
+
"",
|
|
213
|
+
"### name",
|
|
214
|
+
"",
|
|
215
|
+
"User-written name doc with **bold** text.",
|
|
216
|
+
"",
|
|
217
|
+
"### age",
|
|
218
|
+
"",
|
|
219
|
+
"The age.",
|
|
220
|
+
"",
|
|
221
|
+
].join("\n"));
|
|
222
|
+
});
|
|
223
|
+
it("replaces an existing field's doc", () => {
|
|
224
|
+
const existing = ["## Overview", "The overview.", "", "## Fields", "", "### name", "", "Old name doc.", ""].join("\n");
|
|
225
|
+
const result = mergeMarkdownContent(existing, undefined, { name: "New name doc." });
|
|
226
|
+
expect(result).toBe(["## Overview", "The overview.", "", "## Fields", "", "### name", "", "New name doc.", ""].join("\n"));
|
|
227
|
+
});
|
|
228
|
+
it("creates Fields section if it doesn't exist", () => {
|
|
229
|
+
const existing = ["## Overview", "The overview.", ""].join("\n");
|
|
230
|
+
const result = mergeMarkdownContent(existing, undefined, { name: "The name." });
|
|
231
|
+
expect(result).toBe(["## Overview", "The overview.", "", "", "## Fields", "", "### name", "", "The name.", ""].join("\n"));
|
|
232
|
+
});
|
|
233
|
+
it("does not modify content when nothing to merge", () => {
|
|
234
|
+
const existing = ["## Overview", "The overview.", "", "## Fields", "", "### name", "", "The name.", ""].join("\n");
|
|
235
|
+
const result = mergeMarkdownContent(existing, undefined, {});
|
|
236
|
+
expect(result).toBe(existing);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
//# sourceMappingURL=markdown.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../src/docs/markdown.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { namedTypes } from "ast-types";
|
|
2
|
+
import { ASTNode } from "jscodeshift";
|
|
3
|
+
type CommentKind = (namedTypes.CommentBlock | namedTypes.CommentLine | namedTypes.Block | namedTypes.Line) & {
|
|
4
|
+
start?: number;
|
|
5
|
+
end?: number;
|
|
6
|
+
};
|
|
7
|
+
type Commented = ASTNode & {
|
|
8
|
+
comments?: CommentKind[] | null;
|
|
9
|
+
start?: number;
|
|
10
|
+
end?: number;
|
|
11
|
+
loc?: namedTypes.SourceLocation | null;
|
|
12
|
+
};
|
|
13
|
+
export type MemberKind = "property" | "getter" | "setter" | "method";
|
|
14
|
+
export interface MemberInfo {
|
|
15
|
+
kind: MemberKind;
|
|
16
|
+
name: string;
|
|
17
|
+
doc: string | undefined;
|
|
18
|
+
node: Commented;
|
|
19
|
+
}
|
|
20
|
+
export interface SourceEdit {
|
|
21
|
+
start: number;
|
|
22
|
+
end: number;
|
|
23
|
+
text: string;
|
|
24
|
+
}
|
|
25
|
+
/** Parse an entity .ts file and extract class + member JSDoc. */
|
|
26
|
+
export declare function parseEntityJSDocs(source: string): {
|
|
27
|
+
classDoc: string | undefined;
|
|
28
|
+
classNode: Commented | undefined;
|
|
29
|
+
members: MemberInfo[];
|
|
30
|
+
fieldDocs: Record<string, string>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).
|
|
34
|
+
*
|
|
35
|
+
* (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting
|
|
36
|
+
* alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildJSDocEdit(node: Commented, text: string): SourceEdit;
|
|
39
|
+
/** Apply edits to source by splicing in reverse order. */
|
|
40
|
+
export declare function applyEdits(source: string, edits: SourceEdit[]): string;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=parsing.d.ts.map
|