joist-codegen 2.0.3-next.32 → 2.0.3-next.34
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/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/package.json +2 -2
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../src/docs/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAoB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAInD,KAAK,WAAW,GAAG,CAAC,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG;IAC3G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,SAAS,GAAG,OAAO,GAAG;IACzB,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;;EAiC/C;AAgBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAQxE;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAOtE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseEntityJSDocs = parseEntityJSDocs;
|
|
7
|
+
exports.buildJSDocEdit = buildJSDocEdit;
|
|
8
|
+
exports.applyEdits = applyEdits;
|
|
9
|
+
const jscodeshift_1 = __importDefault(require("jscodeshift"));
|
|
10
|
+
const j = jscodeshift_1.default.withParser("ts");
|
|
11
|
+
j;
|
|
12
|
+
/** Parse an entity .ts file and extract class + member JSDoc. */
|
|
13
|
+
function parseEntityJSDocs(source) {
|
|
14
|
+
const root = j(source);
|
|
15
|
+
let classDoc;
|
|
16
|
+
let classNode;
|
|
17
|
+
const members = [];
|
|
18
|
+
root.find(j.ExportNamedDeclaration).forEach((p) => {
|
|
19
|
+
if (p.node.declaration?.type === "ClassDeclaration") {
|
|
20
|
+
classDoc = extractJSDoc(p.node);
|
|
21
|
+
classNode = p.node;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
root.find(j.ClassProperty).forEach((p) => {
|
|
25
|
+
const name = p.node.key?.name;
|
|
26
|
+
if (name) {
|
|
27
|
+
members.push({ name, kind: "property", doc: extractJSDoc(p.node), node: p.node });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
root.find(j.ClassMethod).forEach((p) => {
|
|
31
|
+
const name = p.node.key?.name;
|
|
32
|
+
if (name) {
|
|
33
|
+
members.push({
|
|
34
|
+
name,
|
|
35
|
+
kind: classMethodKind(p.node),
|
|
36
|
+
doc: extractJSDoc(p.node),
|
|
37
|
+
node: p.node,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return { classDoc, classNode, members, fieldDocs: collectFieldDocs(members) };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Collect field docs from members for backfill.
|
|
45
|
+
* When a getter and setter share the same name, prefer the getter's doc.
|
|
46
|
+
*/
|
|
47
|
+
function collectFieldDocs(members) {
|
|
48
|
+
const result = {};
|
|
49
|
+
for (const m of members) {
|
|
50
|
+
if (!m.doc || m.kind === "method")
|
|
51
|
+
continue;
|
|
52
|
+
if (result[m.name] && m.kind === "setter")
|
|
53
|
+
continue;
|
|
54
|
+
result[m.name] = m.doc;
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a source edit that sets the JSDoc on a node (replacing existing or inserting new).
|
|
60
|
+
*
|
|
61
|
+
* (This is bizarre, but this `SourceEdit` + `applyEdits` leaves all existing formatting
|
|
62
|
+
* alone better than doing a `node.toSource()` or other AST-based updates. :grimmacing:)
|
|
63
|
+
*/
|
|
64
|
+
function buildJSDocEdit(node, text) {
|
|
65
|
+
const column = node.loc.start.column;
|
|
66
|
+
const existingComment = node.comments?.find((c) => c.leading && "value" in c && c.value.startsWith("*"));
|
|
67
|
+
if (existingComment) {
|
|
68
|
+
return { start: existingComment.start, end: existingComment.end, text: buildJSDocBlock(text, column) };
|
|
69
|
+
}
|
|
70
|
+
const indent = " ".repeat(column);
|
|
71
|
+
return { start: node.start, end: node.start, text: buildJSDocBlock(text, column) + "\n" + indent };
|
|
72
|
+
}
|
|
73
|
+
/** Apply edits to source by splicing in reverse order. */
|
|
74
|
+
function applyEdits(source, edits) {
|
|
75
|
+
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
76
|
+
let result = source;
|
|
77
|
+
for (const edit of sorted) {
|
|
78
|
+
result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/** Build a JSDoc block comment string from plain text. */
|
|
83
|
+
function buildJSDocBlock(text, indent) {
|
|
84
|
+
const pad = " ".repeat(indent);
|
|
85
|
+
const lines = text.split("\n");
|
|
86
|
+
if (lines.length === 1)
|
|
87
|
+
return `/** ${lines[0]} */`;
|
|
88
|
+
return `/**\n` + lines.map((l) => (l ? `${pad} * ${l}` : `${pad} *`)).join("\n") + `\n${pad} */`;
|
|
89
|
+
}
|
|
90
|
+
/** Extract text from a JSDoc-style leading block comment (i.e. one starting with `*`). */
|
|
91
|
+
function extractJSDoc(node) {
|
|
92
|
+
const block = node.comments?.find((c) => c.leading && "value" in c && c.value.startsWith("*"));
|
|
93
|
+
if (!block || !("value" in block))
|
|
94
|
+
return undefined;
|
|
95
|
+
const lines = block.value.split("\n").map((l) => l.replace(/^\s*\*\s?/, "").trimEnd());
|
|
96
|
+
while (lines.length > 0 && lines[0].trim() === "")
|
|
97
|
+
lines.shift();
|
|
98
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === "")
|
|
99
|
+
lines.pop();
|
|
100
|
+
return lines.join("\n") || undefined;
|
|
101
|
+
}
|
|
102
|
+
function classMethodKind(node) {
|
|
103
|
+
if (node.kind === "get")
|
|
104
|
+
return "getter";
|
|
105
|
+
if (node.kind === "set")
|
|
106
|
+
return "setter";
|
|
107
|
+
return "method";
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=parsing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing.js","sourceRoot":"","sources":["../../src/docs/parsing.ts"],"names":[],"mappings":";;;;;AAiCA,8CAiCC;AAsBD,wCAQC;AAGD,gCAOC;AAzGD,8DAAmD;AAEnD,MAAM,CAAC,GAAG,qBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAMvC,CAAC,CAAC;AAuBF,iEAAiE;AACjE,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,QAA4B,CAAC;IACjC,IAAI,SAAgC,CAAC;IACrC,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAChD,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACpD,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,IAAiB,CAAC,CAAC;YAC7C,SAAS,GAAG,CAAC,CAAC,IAAiB,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAI,CAAC,CAAC,IAAI,CAAC,GAA6B,EAAE,IAAI,CAAC;QACzD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAiB,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,IAAI,GAAI,CAAC,CAAC,IAAI,CAAC,GAA6B,EAAE,IAAI,CAAC;QACzD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC7B,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAiB,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,IAAiB;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAqB;IAC7C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QAC5C,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,IAAe,EAAE,IAAY;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACtC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACzG,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,KAAM,EAAE,GAAG,EAAE,eAAe,CAAC,GAAI,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IAC3G,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,GAAG,EAAE,IAAI,CAAC,KAAM,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AACvG,CAAC;AAED,0DAA0D;AAC1D,SAAgB,UAAU,CAAC,MAAc,EAAE,KAAmB;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0DAA0D;AAC1D,SAAS,eAAe,CAAC,IAAY,EAAE,MAAc;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,OAAO,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AACnG,CAAC;AAED,0FAA0F;AAC1F,SAAS,YAAY,CAAC,IAAe;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACjE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,IAA4B;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IACzC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing.test.d.ts","sourceRoot":"","sources":["../../src/docs/parsing.test.ts"],"names":[],"mappings":""}
|