joist-codegen 2.0.3 → 2.1.0-next.1

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 (60) hide show
  1. package/build/EntityDbMetadata.d.ts +2 -0
  2. package/build/EntityDbMetadata.d.ts.map +1 -1
  3. package/build/EntityDbMetadata.js.map +1 -1
  4. package/build/config.d.ts +8 -0
  5. package/build/config.d.ts.map +1 -1
  6. package/build/config.js +4 -0
  7. package/build/config.js.map +1 -1
  8. package/build/docs/cache.d.ts +14 -0
  9. package/build/docs/cache.d.ts.map +1 -0
  10. package/build/docs/cache.js +61 -0
  11. package/build/docs/cache.js.map +1 -0
  12. package/build/docs/cache.test.d.ts +2 -0
  13. package/build/docs/cache.test.d.ts.map +1 -0
  14. package/build/docs/cache.test.js +47 -0
  15. package/build/docs/cache.test.js.map +1 -0
  16. package/build/docs/generate-metadata-docs.d.ts +6 -0
  17. package/build/docs/generate-metadata-docs.d.ts.map +1 -0
  18. package/build/docs/generate-metadata-docs.js +36 -0
  19. package/build/docs/generate-metadata-docs.js.map +1 -0
  20. package/build/docs/index.d.ts +9 -0
  21. package/build/docs/index.d.ts.map +1 -0
  22. package/build/docs/index.js +90 -0
  23. package/build/docs/index.js.map +1 -0
  24. package/build/docs/index.test.d.ts +2 -0
  25. package/build/docs/index.test.d.ts.map +1 -0
  26. package/build/docs/index.test.js +89 -0
  27. package/build/docs/index.test.js.map +1 -0
  28. package/build/docs/markdown.d.ts +30 -0
  29. package/build/docs/markdown.d.ts.map +1 -0
  30. package/build/docs/markdown.js +201 -0
  31. package/build/docs/markdown.js.map +1 -0
  32. package/build/docs/markdown.test.d.ts +2 -0
  33. package/build/docs/markdown.test.d.ts.map +1 -0
  34. package/build/docs/markdown.test.js +240 -0
  35. package/build/docs/markdown.test.js.map +1 -0
  36. package/build/docs/parsing.d.ts +42 -0
  37. package/build/docs/parsing.d.ts.map +1 -0
  38. package/build/docs/parsing.js +109 -0
  39. package/build/docs/parsing.js.map +1 -0
  40. package/build/docs/parsing.test.d.ts +2 -0
  41. package/build/docs/parsing.test.d.ts.map +1 -0
  42. package/build/docs/parsing.test.js +190 -0
  43. package/build/docs/parsing.test.js.map +1 -0
  44. package/build/generate.d.ts.map +1 -1
  45. package/build/generate.js +9 -0
  46. package/build/generate.js.map +1 -1
  47. package/build/generateEntityCodegenFile.d.ts.map +1 -1
  48. package/build/generateEntityCodegenFile.js +20 -2
  49. package/build/generateEntityCodegenFile.js.map +1 -1
  50. package/build/generateFlushFunction.d.ts.map +1 -1
  51. package/build/generateFlushFunction.js +7 -5
  52. package/build/generateFlushFunction.js.map +1 -1
  53. package/build/index.d.ts.map +1 -1
  54. package/build/index.js +4 -1
  55. package/build/index.js.map +1 -1
  56. package/build/symbols.d.ts +1 -0
  57. package/build/symbols.d.ts.map +1 -1
  58. package/build/symbols.js +3 -2
  59. package/build/symbols.js.map +1 -1
  60. package/package.json +2 -2
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parsing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.test.d.ts","sourceRoot":"","sources":["../../src/docs/parsing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const parsing_1 = require("./parsing");
4
+ describe("parsing", () => {
5
+ describe("parseEntityJSDocs", () => {
6
+ it("extracts class-level JSDoc", () => {
7
+ const source = ["/** The Author entity. */", "export class Author extends AuthorCodegen {}"].join("\n");
8
+ const { classDoc } = (0, parsing_1.parseEntityJSDocs)(source);
9
+ expect(classDoc).toBe("The Author entity.");
10
+ });
11
+ it("extracts class-level JSDoc when no doc present", () => {
12
+ const source = "export class Author extends AuthorCodegen {}";
13
+ const { classDoc } = (0, parsing_1.parseEntityJSDocs)(source);
14
+ expect(classDoc).toBeUndefined();
15
+ });
16
+ it("extracts field JSDoc from class properties", () => {
17
+ const source = [
18
+ "export class Author extends AuthorCodegen {",
19
+ " /** The first name. */",
20
+ ' readonly firstName: string = "";',
21
+ ' lastName: string = "";',
22
+ "}",
23
+ ].join("\n");
24
+ const { members } = (0, parsing_1.parseEntityJSDocs)(source);
25
+ expect(members).toMatchObject([
26
+ { name: "firstName", kind: "property", doc: "The first name." },
27
+ { name: "lastName", kind: "property", doc: undefined },
28
+ ]);
29
+ });
30
+ it("extracts JSDoc from getters, setters, and methods", () => {
31
+ const source = [
32
+ "export class Author extends AuthorCodegen {",
33
+ " /** Getter doc. */",
34
+ ' get fullName(): string { return ""; }',
35
+ " /** Setter doc. */",
36
+ " set fullName(v: string) {}",
37
+ " /** Method doc. */",
38
+ " async doStuff(): Promise<void> {}",
39
+ "}",
40
+ ].join("\n");
41
+ const { members } = (0, parsing_1.parseEntityJSDocs)(source);
42
+ expect(members).toMatchObject([
43
+ { name: "fullName", kind: "getter", doc: "Getter doc." },
44
+ { name: "fullName", kind: "setter", doc: "Setter doc." },
45
+ { name: "doStuff", kind: "method", doc: "Method doc." },
46
+ ]);
47
+ });
48
+ it("handles multi-line JSDoc", () => {
49
+ const source = [
50
+ "export class Author extends AuthorCodegen {",
51
+ " /**",
52
+ " * Line one.",
53
+ " * Line two.",
54
+ " */",
55
+ ' readonly notes: string = "";',
56
+ "}",
57
+ ].join("\n");
58
+ const { members } = (0, parsing_1.parseEntityJSDocs)(source);
59
+ expect(members[0].doc).toBe("Line one.\nLine two.");
60
+ });
61
+ });
62
+ describe("buildJSDocEdit / applyEdits", () => {
63
+ it("does not produce trailing spaces on blank lines in multi-line docs", () => {
64
+ const source = ["export class Author extends AuthorCodegen {", ' readonly notes: string = "";', "}"].join("\n");
65
+ const { members } = (0, parsing_1.parseEntityJSDocs)(source);
66
+ const edit = (0, parsing_1.buildJSDocEdit)(members[0].node, "First paragraph.\n\nSecond paragraph.");
67
+ const output = (0, parsing_1.applyEdits)(source, [edit]);
68
+ for (const line of output.split("\n")) {
69
+ expect(line).toBe(line.trimEnd());
70
+ }
71
+ expect(output).toMatch(/\* First paragraph\.\n\s+\*\n\s+\* Second paragraph\./);
72
+ });
73
+ it("replaces an existing comment without reformatting other code", () => {
74
+ const source = [
75
+ "/** Old class doc. */",
76
+ "export class Foo {",
77
+ " /** Old field doc. */",
78
+ ' readonly name: string = "";',
79
+ "}",
80
+ ].join("\n");
81
+ const { classNode, members } = (0, parsing_1.parseEntityJSDocs)(source);
82
+ const edits = [(0, parsing_1.buildJSDocEdit)(classNode, "New class doc."), (0, parsing_1.buildJSDocEdit)(members[0].node, "New field doc.")];
83
+ const output = (0, parsing_1.applyEdits)(source, edits);
84
+ expect(output).toBe([
85
+ "/** New class doc. */",
86
+ "export class Foo {",
87
+ " /** New field doc. */",
88
+ ' readonly name: string = "";',
89
+ "}",
90
+ ].join("\n"));
91
+ });
92
+ it("inserts a new comment where none existed", () => {
93
+ const source = ["export class Foo {", ' readonly name: string = "";', "}"].join("\n");
94
+ const { members } = (0, parsing_1.parseEntityJSDocs)(source);
95
+ const output = (0, parsing_1.applyEdits)(source, [(0, parsing_1.buildJSDocEdit)(members[0].node, "The name.")]);
96
+ expect(output).toBe(["export class Foo {", " /** The name. */", ' readonly name: string = "";', "}"].join("\n"));
97
+ });
98
+ it("indents multi-line field docs to match the field's indentation", () => {
99
+ const source = [
100
+ "export class Invoice extends InvoiceCodegen {",
101
+ " /** Old doc. */",
102
+ " readonly pocInvoicedToDateInCents: number = 0;",
103
+ "}",
104
+ ].join("\n");
105
+ const { members } = (0, parsing_1.parseEntityJSDocs)(source);
106
+ const text = "Calculate the POC as of this invoice creation.\nFilter out Void and Rejected invoices.";
107
+ const output = (0, parsing_1.applyEdits)(source, [(0, parsing_1.buildJSDocEdit)(members[0].node, text)]);
108
+ expect(output).toBe([
109
+ "export class Invoice extends InvoiceCodegen {",
110
+ " /**",
111
+ " * Calculate the POC as of this invoice creation.",
112
+ " * Filter out Void and Rejected invoices.",
113
+ " */",
114
+ " readonly pocInvoicedToDateInCents: number = 0;",
115
+ "}",
116
+ ].join("\n"));
117
+ });
118
+ it("preserves all original formatting when replacing docs", () => {
119
+ const source = [
120
+ "/** The entity. */",
121
+ "export class Author extends AuthorCodegen {",
122
+ " readonly transientFields = {",
123
+ ' beforeFlushRan: { type: "boolean", default: false },',
124
+ ' beforeCreateRan: { type: "boolean", default: false },',
125
+ " };",
126
+ "}",
127
+ ].join("\n");
128
+ const { classNode } = (0, parsing_1.parseEntityJSDocs)(source);
129
+ const output = (0, parsing_1.applyEdits)(source, [(0, parsing_1.buildJSDocEdit)(classNode, "Updated entity.")]);
130
+ expect(output).toBe([
131
+ "/** Updated entity. */",
132
+ "export class Author extends AuthorCodegen {",
133
+ " readonly transientFields = {",
134
+ ' beforeFlushRan: { type: "boolean", default: false },',
135
+ ' beforeCreateRan: { type: "boolean", default: false },',
136
+ " };",
137
+ "}",
138
+ ].join("\n"));
139
+ });
140
+ });
141
+ describe("fieldDocs", () => {
142
+ it("prefers getter doc over setter doc for same name", () => {
143
+ const source = [
144
+ "export class Author extends AuthorCodegen {",
145
+ " /** The full name. */",
146
+ ' get fullName(): string { return ""; }',
147
+ " /** Set the full name. */",
148
+ " set fullName(v: string) {}",
149
+ "}",
150
+ ].join("\n");
151
+ const { fieldDocs } = (0, parsing_1.parseEntityJSDocs)(source);
152
+ expect(fieldDocs).toEqual({ fullName: "The full name." });
153
+ });
154
+ it("uses setter doc when getter has no doc", () => {
155
+ const source = [
156
+ "export class Author extends AuthorCodegen {",
157
+ ' get fullName(): string { return ""; }',
158
+ " /** Set the full name. */",
159
+ " set fullName(v: string) {}",
160
+ "}",
161
+ ].join("\n");
162
+ const { fieldDocs } = (0, parsing_1.parseEntityJSDocs)(source);
163
+ expect(fieldDocs).toEqual({ fullName: "Set the full name." });
164
+ });
165
+ it("skips members without docs", () => {
166
+ const source = [
167
+ "export class Author extends AuthorCodegen {",
168
+ " /** A doc. */",
169
+ ' readonly a: string = "";',
170
+ ' readonly b: string = "";',
171
+ "}",
172
+ ].join("\n");
173
+ const { fieldDocs } = (0, parsing_1.parseEntityJSDocs)(source);
174
+ expect(fieldDocs).toEqual({ a: "A doc." });
175
+ });
176
+ it("skips methods", () => {
177
+ const source = [
178
+ "export class Author extends AuthorCodegen {",
179
+ " /** The first name. */",
180
+ ' readonly firstName: string = "";',
181
+ " /** Text representation. */",
182
+ " async toDetailString(): Promise<string> { return ''; }",
183
+ "}",
184
+ ].join("\n");
185
+ const { fieldDocs } = (0, parsing_1.parseEntityJSDocs)(source);
186
+ expect(fieldDocs).toEqual({ firstName: "The first name." });
187
+ });
188
+ });
189
+ });
190
+ //# sourceMappingURL=parsing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.test.js","sourceRoot":"","sources":["../../src/docs/parsing.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,WAAW,EAAY,MAAM,SAAS,CAAC;AAStD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI7C,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC/D;AAED,uFAAuF;AACvF,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsH9F"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,WAAW,EAAY,MAAM,SAAS,CAAC;AAStD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK7C,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC/D;AAED,uFAAuF;AACvF,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgI9F"}
package/build/generate.js CHANGED
@@ -13,6 +13,7 @@ const generateMetadataFile_1 = require("./generateMetadataFile");
13
13
  const generatePgEnumFile_1 = require("./generatePgEnumFile");
14
14
  const symbols_1 = require("./symbols");
15
15
  const utils_1 = require("./utils");
16
+ const docs_1 = require("./docs");
16
17
  /** Generates our `${Entity}` and `${Entity}Codegen` files based on the `db` schema. */
17
18
  async function generateFiles(config, dbMeta) {
18
19
  const { entities, enums, pgEnums } = dbMeta;
@@ -20,6 +21,11 @@ async function generateFiles(config, dbMeta) {
20
21
  // skip making test files except for the _first_ time we create an entity. This achieves
21
22
  // `.history`-like "create once" behavior without the need for the `.history` file.
22
23
  const files = await readExistingFiles(config);
24
+ // Sync documentation: backfill .md from existing JSDocs, then sync MD -> JSDoc
25
+ if (config.docs) {
26
+ const entityNames = entities.map((meta) => meta.entity.name);
27
+ await (0, docs_1.syncDocs)(config.entitiesDirectory, entityNames);
28
+ }
23
29
  const entityFiles = entities
24
30
  .map((meta) => {
25
31
  const entityName = meta.entity.name;
@@ -107,6 +113,8 @@ async function generateFiles(config, dbMeta) {
107
113
  const plugin = require(p);
108
114
  return plugin.run(config, dbMeta);
109
115
  }))).flat();
116
+ // Generate metadata-docs.ts if enabled
117
+ const docsFile = config.outputDocs ? await (0, docs_1.generateMetadataDocsFile)(config, dbMeta) : undefined;
110
118
  return [
111
119
  ...entityFiles,
112
120
  ...enumFiles,
@@ -114,6 +122,7 @@ async function generateFiles(config, dbMeta) {
114
122
  entitiesFile,
115
123
  ...factoriesFiles,
116
124
  metadataFile,
125
+ ...(docsFile ? [docsFile] : []),
117
126
  indexFile,
118
127
  ...pluginFiles,
119
128
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateEntityCodegenFile.d.ts","sourceRoot":"","sources":["../src/generateEntityCodegenFile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAuB,MAAM,SAAS,CAAC;AACpD,OAAO,EACL,UAAU,EAEV,gBAAgB,EAMhB,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAyElC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAWD,+DAA+D;AAC/D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAyO1G;AA2wBD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,uBAWvC"}
1
+ {"version":3,"file":"generateEntityCodegenFile.d.ts","sourceRoot":"","sources":["../src/generateEntityCodegenFile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAuB,MAAM,SAAS,CAAC;AACpD,OAAO,EACL,UAAU,EAEV,gBAAgB,EAMhB,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA0ElC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAWD,+DAA+D;AAC/D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAyO1G;AAmyBD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,uBAWvC"}
@@ -810,7 +810,8 @@ function createRelations(config, meta, entity) {
810
810
  .filter((m2o) => m2o.otherEntity.name === meta.name)
811
811
  // Allow disabling recursive relations
812
812
  .filter((m2o) =>
813
- // For STI - look at the baseClassName, since there is actually no configuration for the subtype currently
813
+ // STI subtypes don't have their own key in config.entities (stripped by stripStiPlaceholders),
814
+ // so look up the base class name to find skipRecursiveRelations config
814
815
  !(config.entities[meta.inheritanceType == "sti" && meta.baseClassName ? meta.baseClassName : meta.name]
815
816
  ?.relations?.[m2o.fieldName]?.skipRecursiveRelations === true))
816
817
  // Skip ReactiveReferences because they don't have an `other` side for us to use
@@ -835,6 +836,23 @@ function createRelations(config, meta, entity) {
835
836
  },
836
837
  ];
837
838
  });
839
+ // Add any recursive ManyToMany entities (self-referential m2m)
840
+ const m2mRecursive = meta.manyToManys
841
+ .filter((m2m) => m2m.otherEntity.name === meta.name)
842
+ .filter((m2m) => !m2m.derived)
843
+ // STI subtypes don't have their own key in config.entities (stripped by stripStiPlaceholders),
844
+ // so look up the base class name to find skipRecursiveRelations config
845
+ .filter((m2m) => !(config.entities[meta.inheritanceType == "sti" && meta.baseClassName ? meta.baseClassName : meta.name]
846
+ ?.relations?.[m2m.fieldName]?.skipRecursiveRelations === true))
847
+ .map((m2m) => {
848
+ const { fieldName, otherFieldName, otherEntity } = m2m;
849
+ return {
850
+ kind: "concrete",
851
+ fieldName: `${fieldName}Recursive`,
852
+ decl: (0, ts_poet_1.code) `${symbols_1.ReadOnlyCollection}<${entity.type}, ${otherEntity.type}>`,
853
+ init: (0, ts_poet_1.code) `${symbols_1.hasRecursiveM2m}("${fieldName}", "${otherFieldName}Recursive")`,
854
+ };
855
+ });
838
856
  // Add OneToMany
839
857
  const o2m = meta.oneToManys.map((o2m) => {
840
858
  const { fieldName, otherEntity } = o2m;
@@ -924,7 +942,7 @@ function createRelations(config, meta, entity) {
924
942
  const init = (0, ts_poet_1.code) `${symbols_1.hasOnePolymorphic}()`;
925
943
  return { kind: "concrete", fieldName, decl, init };
926
944
  });
927
- return [o2m, o2mBase, lo2m, m2o, m2oBase, m2oRecursive, o2o, o2oBase, m2m, m2mBase, lm2m, polymorphic].flat();
945
+ return [o2m, o2mBase, lo2m, m2o, m2oBase, m2oRecursive, m2mRecursive, o2o, o2oBase, m2m, m2mBase, lm2m, polymorphic].flat();
928
946
  }
929
947
  /** Makes the field required if there is a `NOT NULL` and no db-or-config default. */
930
948
  function maybeOptionalOrDefault(field) {