@cparra/apexdocs 3.15.0 → 3.16.0-beta.0

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/README.md CHANGED
@@ -575,6 +575,16 @@ public class MyClass {
575
575
  }
576
576
  ```
577
577
 
578
+ ##### **templates**
579
+
580
+ Allows providing custom templates for generating Markdown documentation, giving you control over the output format.
581
+ You can define templates for each type of metadata
582
+ supported by the `markdown` command (class, interface, enum, trigger, LWC, custom object, and reference guide) .
583
+
584
+ For detailed information about creating custom templates, including examples, available helpers, and configuration options,
585
+ please refer to the [wiki documentation](https://github.com/cesarParra/apexdocs/wiki/5.-Custom-Templates). You can also find a working example in the
586
+ `examples/markdown-custom-templates` directory.
587
+
578
588
  #### Changelog Hooks
579
589
 
580
590
  ##### **transformChangeLogPage**
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var logger$1 = require('../logger-Cqxjp5OT.js');
4
+ var logger$1 = require('../logger-Cq4E5XXO.js');
5
5
  var cosmiconfig = require('cosmiconfig');
6
6
  var yargs = require('yargs');
7
7
  var E = require('fp-ts/Either');
package/dist/index.d.ts CHANGED
@@ -141,6 +141,225 @@ type DeepPartial<T> = {
141
141
  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
142
142
  };
143
143
 
144
+ // Apex Reflection-based types
145
+
146
+
147
+ // Renderable types
148
+
149
+ type ReferenceGuideReference = {
150
+ reference: DocPageReference;
151
+ title: Link;
152
+ description: RenderableContent[] | null;
153
+ };
154
+
155
+ type Link = {
156
+ readonly __type: 'link';
157
+ title: string;
158
+ url: string;
159
+ };
160
+
161
+ type EmptyLine = {
162
+ __type: 'empty-line';
163
+ };
164
+
165
+ type StringOrLink = string | Link;
166
+
167
+ type RenderableContent = StringOrLink | EmptyLine | CodeBlock | InlineCode;
168
+
169
+ type EnumValue = {
170
+ value: string;
171
+ description?: RenderableContent[];
172
+ };
173
+
174
+ type CustomTag = {
175
+ name: string;
176
+ description?: RenderableContent[];
177
+ };
178
+
179
+ /**
180
+ * Represents an annotation to a top-level type. For example, @NamespaceAccessible.
181
+ */
182
+ type Annotation = string;
183
+
184
+ type CodeBlock = {
185
+ readonly __type: 'code-block';
186
+ language: string;
187
+ content: string[];
188
+ };
189
+
190
+ type InlineCode = {
191
+ readonly __type: 'inline-code';
192
+ content: string;
193
+ };
194
+
195
+ type RenderableDocumentation = {
196
+ annotations?: Annotation[];
197
+ description?: RenderableContent[];
198
+ customTags?: CustomTag[];
199
+ example?: RenderableSection<RenderableContent[] | undefined>;
200
+ group?: string;
201
+ author?: string;
202
+ date?: string;
203
+ sees?: StringOrLink[];
204
+ };
205
+
206
+ type RenderableType = {
207
+ namespace?: string;
208
+ headingLevel: number;
209
+ heading: string;
210
+ name: string;
211
+ meta: {
212
+ accessModifier: string;
213
+ };
214
+ doc: RenderableDocumentation;
215
+ };
216
+
217
+ type RenderableMethodParameter = {
218
+ name: string;
219
+ type: StringOrLink;
220
+ description?: RenderableContent[];
221
+ };
222
+
223
+ type TypeSource = {
224
+ type: StringOrLink;
225
+ description?: RenderableContent[];
226
+ };
227
+
228
+ type RenderableConstructor = {
229
+ headingLevel: number;
230
+ heading: string;
231
+ signature: RenderableSection<CodeBlock>;
232
+ parameters?: RenderableSection<RenderableMethodParameter[] | undefined>;
233
+ throws?: RenderableSection<TypeSource[] | undefined>;
234
+ doc: RenderableDocumentation;
235
+ };
236
+
237
+ type RenderableMethod = {
238
+ doc: RenderableDocumentation;
239
+ headingLevel: number;
240
+ heading: string;
241
+ signature: RenderableSection<CodeBlock>;
242
+ parameters: RenderableSection<RenderableMethodParameter[] | undefined>;
243
+ returnType: RenderableSection<TypeSource>;
244
+ throws: RenderableSection<TypeSource[] | undefined>;
245
+ inherited?: boolean;
246
+ };
247
+
248
+ type RenderableApexField = {
249
+ headingLevel: number;
250
+ heading: string;
251
+ type: RenderableSection<StringOrLink>;
252
+ accessModifier: string;
253
+ inherited?: boolean;
254
+ signature: RenderableSection<CodeBlock>;
255
+ doc: RenderableDocumentation;
256
+ };
257
+
258
+ type RenderableSection<T> = {
259
+ headingLevel: number;
260
+ heading: string;
261
+ value: T;
262
+ };
263
+
264
+ type GroupedMember<T> = RenderableSection<T[]> & { groupDescription: string | undefined };
265
+
266
+ type RenderableClass = RenderableType & {
267
+ type: 'class';
268
+ extends?: StringOrLink[];
269
+ implements?: StringOrLink[];
270
+ classModifier?: string;
271
+ sharingModifier?: string;
272
+ constructors: RenderableSection<RenderableConstructor[] | GroupedMember<RenderableConstructor>[]> & {
273
+ isGrouped: boolean;
274
+ };
275
+ methods: RenderableSection<RenderableMethod[] | GroupedMember<RenderableMethod>[]> & { isGrouped: boolean };
276
+ fields: RenderableSection<RenderableApexField[] | GroupedMember<RenderableApexField>[]> & { isGrouped: boolean };
277
+ properties: RenderableSection<RenderableApexField[] | GroupedMember<RenderableApexField>[]> & { isGrouped: boolean };
278
+ innerClasses: RenderableSection<RenderableClass[]>;
279
+ innerEnums: RenderableSection<RenderableEnum[]>;
280
+ innerInterfaces: RenderableSection<RenderableInterface[]>;
281
+ };
282
+
283
+ type RenderableInterface = RenderableType & {
284
+ type: 'interface';
285
+ extends?: StringOrLink[];
286
+ methods: RenderableSection<RenderableMethod[]>;
287
+ };
288
+
289
+ type RenderableEnum = RenderableType & {
290
+ type: 'enum';
291
+ values: RenderableSection<EnumValue[]>;
292
+ };
293
+
294
+ type RenderableTrigger = Omit<RenderableType, 'meta'> & {
295
+ type: 'trigger';
296
+ objectName: string;
297
+ events: string[];
298
+ };
299
+
300
+ type RenderableLwc = Omit<RenderableType, 'meta'> & {
301
+ type: 'lwc';
302
+ exposed: boolean;
303
+ description: string | undefined;
304
+ targets: RenderableSection<string[]>;
305
+ targetConfigs: RenderableSection<TargetConfigRenderable[]>;
306
+ };
307
+
308
+ type TargetConfigRenderable = {
309
+ targetName: string;
310
+ properties: {
311
+ type: string;
312
+ required: boolean;
313
+ description: string | undefined;
314
+ label: string;
315
+ name: string;
316
+ }[];
317
+ };
318
+
319
+ type RenderableCustomObject = Omit<RenderableType, 'meta'> & {
320
+ apiName: string;
321
+ type: 'customobject';
322
+ hasFields: boolean;
323
+ hasRecords: boolean;
324
+ fields: RenderableSection<RenderableCustomField[]>;
325
+ metadataRecords: RenderableSection<RenderableCustomMetadata[]>;
326
+ publishBehavior: string | null;
327
+ };
328
+
329
+ type RenderableCustomField = {
330
+ headingLevel: number;
331
+ heading: string;
332
+ apiName: string;
333
+ description: RenderableContent[];
334
+ pickListValues?: RenderableSection<string[]>;
335
+ type: 'field';
336
+ fieldType?: string | null;
337
+ required: boolean;
338
+ complianceGroup: string | null;
339
+ securityClassification: string | null;
340
+ inlineHelpText: string | null;
341
+ };
342
+
343
+ type RenderableCustomMetadata = {
344
+ headingLevel: number;
345
+ heading: string;
346
+ apiName: string;
347
+ type: 'metadata';
348
+ label: string;
349
+ protected: boolean;
350
+ };
351
+
352
+ type Renderable = (
353
+ | RenderableClass
354
+ | RenderableInterface
355
+ | RenderableEnum
356
+ | RenderableCustomObject
357
+ | RenderableTrigger
358
+ | RenderableLwc
359
+ ) & {
360
+ filePath: string | undefined;
361
+ };
362
+
144
363
  type Generators = 'markdown' | 'openapi' | 'changelog';
145
364
 
146
365
  type LinkingStrategy =
@@ -317,6 +536,45 @@ type Skip = {
317
536
 
318
537
  // CONFIGURABLE HOOKS
319
538
 
539
+ /**
540
+ * Template configuration for customizing markdown output.
541
+ */
542
+ type TemplateConfig = {
543
+ class?: string | ((renderable: RenderableClass, helpers: TemplateHelpers) => string);
544
+ interface?: string | ((renderable: RenderableInterface, helpers: TemplateHelpers) => string);
545
+ enum?: string | ((renderable: RenderableEnum, helpers: TemplateHelpers) => string);
546
+ trigger?: string | ((renderable: RenderableTrigger, helpers: TemplateHelpers) => string);
547
+ lwc?: string | ((renderable: RenderableLwc, helpers: TemplateHelpers) => string);
548
+ customObject?: string | ((renderable: RenderableCustomObject, helpers: TemplateHelpers) => string);
549
+ referenceGuide?: string | ((data: ReferenceGuideData, helpers: TemplateHelpers) => string);
550
+ };
551
+
552
+ /**
553
+ * Template helpers for consistent rendering.
554
+ */
555
+ type TemplateHelpers = {
556
+ link: (source: StringOrLink) => string;
557
+ code: (codeBlock: CodeBlock) => string;
558
+ renderContent: (content?: RenderableContent[]) => string;
559
+ heading: (level: number, text: string) => string;
560
+ inlineCode: (text: string) => string;
561
+ eq: (a: unknown, b: unknown) => boolean;
562
+ add: (a: number, b: number) => number;
563
+ lookup: (array: unknown[], index: number) => unknown;
564
+ parseJSON: (jsonString: string) => unknown | null;
565
+ startsWith: (str: string, prefix: string) => boolean;
566
+ substring: (str: string, start: number, length?: number) => string;
567
+ splitAndCapitalize: (text: string) => string;
568
+ };
569
+
570
+ /**
571
+ * Data structure passed to reference guide template functions.
572
+ */
573
+ type ReferenceGuideData = {
574
+ referenceGuideTitle: string;
575
+ references: Record<string, ReferenceGuideReference[]>;
576
+ };
577
+
320
578
  /**
321
579
  * The configurable hooks that can be used to modify the output of the Markdown generator.
322
580
  */
@@ -326,6 +584,7 @@ type MarkdownConfigurableHooks = {
326
584
  transformDocs: TransformDocs;
327
585
  transformDocPage: TransformDocPage;
328
586
  transformReference: TransformReference;
587
+ templates?: TemplateConfig;
329
588
  };
330
589
 
331
590
  type ConfigurableDocPageReference = Omit<DocPageReference, 'source'>;
@@ -373,6 +632,11 @@ type TransformChangelogPage = (
373
632
  */
374
633
  declare function skip(): Skip;
375
634
 
635
+ /**
636
+ * Get all template helpers as an object matching TemplateHelpers type.
637
+ */
638
+ declare const templateHelpers: TemplateHelpers;
639
+
376
640
  type CallableConfig = Partial<UserDefinedConfig> & {
377
641
  sourceDir: string;
378
642
  targetGenerator: Generators;
@@ -402,5 +666,5 @@ type ConfigurableChangelogConfig = Omit<Partial<UserDefinedChangelogConfig>, 'ta
402
666
  */
403
667
  declare function defineChangelogConfig(config: ConfigurableChangelogConfig): Partial<UserDefinedChangelogConfig>;
404
668
 
405
- export { defineChangelogConfig, defineMarkdownConfig, defineOpenApiConfig, process, skip };
406
- export type { ChangeLogPageData, ChangelogConfigurableHooks, ConfigurableChangelogConfig, ConfigurableDocPageData, ConfigurableDocPageReference, ConfigurableMarkdownConfig, ConfigurableOpenApiConfig, DocPageData, DocPageReference, MacroFunction, MacroSourceMetadata, MarkdownConfigurableHooks, ReferenceGuidePageData, Skip, SourceChangelog, TransformChangelogPage, TransformDocPage, TransformDocs, TransformReference, TransformReferenceGuide, Translations, UserTranslations };
669
+ export { defineChangelogConfig, defineMarkdownConfig, defineOpenApiConfig, process, skip, templateHelpers };
670
+ export type { ChangeLogPageData, ChangelogConfigurableHooks, CodeBlock, ConfigurableChangelogConfig, ConfigurableDocPageData, ConfigurableDocPageReference, ConfigurableMarkdownConfig, ConfigurableOpenApiConfig, DocPageData, DocPageReference, GroupedMember, Link, MacroFunction, MacroSourceMetadata, MarkdownConfigurableHooks, ReferenceGuideData, ReferenceGuidePageData, ReferenceGuideReference, Renderable, RenderableApexField, RenderableClass, RenderableConstructor, RenderableContent, RenderableCustomObject, RenderableEnum, RenderableInterface, RenderableLwc, RenderableMethod, RenderableMethodParameter, RenderableSection, RenderableTrigger, Skip, SourceChangelog, StringOrLink, TemplateConfig, TemplateHelpers, TransformChangelogPage, TransformDocPage, TransformDocs, TransformReference, TransformReferenceGuide, Translations, TypeSource, UserTranslations };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var logger = require('./logger-Cqxjp5OT.js');
4
+ var logger = require('./logger-Cq4E5XXO.js');
5
5
  var E = require('fp-ts/Either');
6
6
  require('fp-ts/function');
7
7
  require('fp-ts/TaskEither');
@@ -142,6 +142,7 @@ function defineChangelogConfig(config) {
142
142
  }
143
143
 
144
144
  exports.skip = logger.skip;
145
+ exports.templateHelpers = logger.templateHelpers;
145
146
  exports.defineChangelogConfig = defineChangelogConfig;
146
147
  exports.defineMarkdownConfig = defineMarkdownConfig;
147
148
  exports.defineOpenApiConfig = defineOpenApiConfig;
@@ -1674,6 +1674,102 @@ const interfaceMarkdownTemplate = `
1674
1674
  {{/if}}
1675
1675
  `.trim();
1676
1676
 
1677
+ function link(source) {
1678
+ if (typeof source === "string") {
1679
+ return source;
1680
+ } else {
1681
+ return `[${source.title}](${source.url})`;
1682
+ }
1683
+ }
1684
+ function code(codeBlock) {
1685
+ return `
1686
+ \`\`\`${codeBlock.language}
1687
+ ${codeBlock.content.join("\n")}
1688
+ \`\`\`
1689
+ `.trim();
1690
+ }
1691
+ function inlineCodeToString(inlineCode2) {
1692
+ return `\`${inlineCode2.content}\``;
1693
+ }
1694
+ function renderContent(content, escapeFunction) {
1695
+ if (!content || content.length === 0) {
1696
+ return "";
1697
+ }
1698
+ function reduceDescription(acc, curr) {
1699
+ if (isEmptyLine(curr)) {
1700
+ return acc + "\n";
1701
+ }
1702
+ if (isCodeBlock(curr)) {
1703
+ return acc + code(curr) + "\n";
1704
+ }
1705
+ if (isInlineCode(curr)) {
1706
+ return acc + inlineCodeToString(curr) + " ";
1707
+ } else {
1708
+ const linkResult = link(curr);
1709
+ const escapedLink = escapeFunction ? escapeFunction(linkResult) : linkResult;
1710
+ return acc + escapedLink.trim() + " ";
1711
+ }
1712
+ }
1713
+ return content.reduce(reduceDescription, "").trim();
1714
+ }
1715
+ function heading(level, text) {
1716
+ if (level < 1 || level > 6) {
1717
+ throw new Error(`Heading level must be between 1 and 6, got ${level}`);
1718
+ }
1719
+ return `${"#".repeat(level)} ${text}`;
1720
+ }
1721
+ function inlineCode(text) {
1722
+ return `\`${text}\``;
1723
+ }
1724
+ function eq(a, b) {
1725
+ return a === b;
1726
+ }
1727
+ function add(a, b) {
1728
+ return a + b;
1729
+ }
1730
+ function lookup(array, index) {
1731
+ return array[index];
1732
+ }
1733
+ function parseJSON(jsonString) {
1734
+ try {
1735
+ return JSON.parse(jsonString);
1736
+ } catch (e) {
1737
+ return null;
1738
+ }
1739
+ }
1740
+ function startsWith(str, prefix) {
1741
+ return str.startsWith(prefix);
1742
+ }
1743
+ function substring(str, start, length) {
1744
+ if (length !== void 0) {
1745
+ return str.substring(start, start + length);
1746
+ }
1747
+ return str.substring(start);
1748
+ }
1749
+ function splitAndCapitalize(text) {
1750
+ const words = text.split(/[-_]+/);
1751
+ const capitalizedWords = [];
1752
+ for (const word of words) {
1753
+ capitalizedWords.push(word.charAt(0).toUpperCase() + word.slice(1));
1754
+ }
1755
+ return capitalizedWords.join(" ");
1756
+ }
1757
+ const templateHelpers = {
1758
+ link,
1759
+ code,
1760
+ renderContent: (content) => renderContent(content),
1761
+ // Wrap to match TemplateHelpers signature
1762
+ heading,
1763
+ inlineCode,
1764
+ eq,
1765
+ add,
1766
+ lookup,
1767
+ parseJSON,
1768
+ startsWith,
1769
+ substring,
1770
+ splitAndCapitalize
1771
+ };
1772
+
1677
1773
  class Template {
1678
1774
  constructor() {
1679
1775
  Handlebars.registerPartial("typeDocumentation", typeDocPartial);
@@ -1685,11 +1781,19 @@ class Template {
1685
1781
  Handlebars.registerPartial("classTemplate", classMarkdownTemplate);
1686
1782
  Handlebars.registerPartial("enumTemplate", enumMarkdownTemplate);
1687
1783
  Handlebars.registerPartial("interfaceTemplate", interfaceMarkdownTemplate);
1688
- Handlebars.registerHelper("link", link);
1689
- Handlebars.registerHelper("code", convertCodeBlock);
1690
- Handlebars.registerHelper("renderContent", resolveRenderableContent);
1784
+ Handlebars.registerHelper("link", (source) => {
1785
+ return new Handlebars.SafeString(link(source));
1786
+ });
1787
+ Handlebars.registerHelper("code", (codeBlock) => {
1788
+ return new Handlebars.SafeString(code(codeBlock));
1789
+ });
1790
+ Handlebars.registerHelper("renderContent", (content) => {
1791
+ return renderContent(content, Handlebars.escapeExpression);
1792
+ });
1691
1793
  Handlebars.registerHelper("heading", heading);
1692
- Handlebars.registerHelper("inlineCode", inlineCode);
1794
+ Handlebars.registerHelper("inlineCode", (text) => {
1795
+ return new Handlebars.SafeString(inlineCode(text));
1796
+ });
1693
1797
  Handlebars.registerHelper("splitAndCapitalize", splitAndCapitalize);
1694
1798
  Handlebars.registerHelper("eq", eq);
1695
1799
  Handlebars.registerHelper("add", add);
@@ -1709,80 +1813,6 @@ class Template {
1709
1813
  return compiled(request.source).trim().replace(/\n{3,}/g, "\n\n");
1710
1814
  }
1711
1815
  }
1712
- const splitAndCapitalize = (text) => {
1713
- const words = text.split(/[-_]+/);
1714
- const capitalizedWords = [];
1715
- for (const word of words) {
1716
- capitalizedWords.push(word.charAt(0).toUpperCase() + word.slice(1));
1717
- }
1718
- return capitalizedWords.join(" ");
1719
- };
1720
- const heading = (level, text) => {
1721
- return `${"#".repeat(level)} ${text}`;
1722
- };
1723
- const inlineCode = (text) => {
1724
- return new Handlebars.SafeString(`\`${text}\``);
1725
- };
1726
- const eq = (a, b) => {
1727
- return a === b;
1728
- };
1729
- const add = (a, b) => {
1730
- return a + b;
1731
- };
1732
- const lookup = (array, index) => {
1733
- return array[index];
1734
- };
1735
- const parseJSON = (jsonString) => {
1736
- try {
1737
- return JSON.parse(jsonString);
1738
- } catch (e) {
1739
- return null;
1740
- }
1741
- };
1742
- const startsWith = (str, prefix) => {
1743
- return str.startsWith(prefix);
1744
- };
1745
- const substring = (str, start, length) => {
1746
- if (length !== void 0) {
1747
- return str.substring(start, start + length);
1748
- }
1749
- return str.substring(start);
1750
- };
1751
- const convertCodeBlock = (codeBlock) => {
1752
- return new Handlebars.SafeString(
1753
- `
1754
- \`\`\`${codeBlock.language}
1755
- ${codeBlock.content.join("\n")}
1756
- \`\`\`
1757
- `.trim()
1758
- );
1759
- };
1760
- const resolveRenderableContent = (description) => {
1761
- if (!description) {
1762
- return "";
1763
- }
1764
- function reduceDescription(acc, curr) {
1765
- if (isEmptyLine(curr)) {
1766
- return acc + "\n";
1767
- }
1768
- if (isCodeBlock(curr)) {
1769
- return acc + convertCodeBlock(curr) + "\n";
1770
- }
1771
- if (isInlineCode(curr)) {
1772
- return acc + inlineCode(curr.content).toString() + " ";
1773
- } else {
1774
- return acc + Handlebars.escapeExpression(link(curr)).trim() + " ";
1775
- }
1776
- }
1777
- return description.reduce(reduceDescription, "").trim();
1778
- };
1779
- const link = (source) => {
1780
- if (typeof source === "string") {
1781
- return source;
1782
- } else {
1783
- return `[${source.title}](${source.url})`;
1784
- }
1785
- };
1786
1816
 
1787
1817
  var __defProp$k = Object.defineProperty;
1788
1818
  var __defProps$j = Object.defineProperties;
@@ -1992,23 +2022,43 @@ var __spreadValues$j = (a, b) => {
1992
2022
  return a;
1993
2023
  };
1994
2024
  var __spreadProps$i = (a, b) => __defProps$i(a, __getOwnPropDescs$i(b));
1995
- const convertToDocumentationBundle = (referenceGuideTitle, referenceGuideTemplate, translations, { referencesByGroup, renderables }) => ({
2025
+ const convertToDocumentationBundle = (referenceGuideTitle, referenceGuideTemplate, translations, { referencesByGroup, renderables }, templates) => ({
1996
2026
  referenceGuide: {
1997
2027
  frontmatter: null,
1998
- content: referencesToReferenceGuideContent(referenceGuideTitle, referencesByGroup, referenceGuideTemplate),
2028
+ content: referencesToReferenceGuideContent(
2029
+ referenceGuideTitle,
2030
+ referencesByGroup,
2031
+ referenceGuideTemplate,
2032
+ templates
2033
+ ),
1999
2034
  outputDocPath: "index.md"
2000
2035
  },
2001
2036
  docs: renderables.map(
2002
- (renderable) => renderableToPageData(Object.values(referencesByGroup).flat(), renderable, translations)
2037
+ (renderable) => renderableToPageData(Object.values(referencesByGroup).flat(), renderable, translations, templates)
2003
2038
  )
2004
2039
  });
2005
- function referencesToReferenceGuideContent(referenceGuideTitle, references, template) {
2040
+ function referencesToReferenceGuideContent(referenceGuideTitle, references, template, templates) {
2006
2041
  function alphabetizeReferences(references2) {
2007
2042
  return Object.keys(references2).sort((a, b) => a.localeCompare(b)).reduce((acc, key) => {
2008
2043
  acc[key] = references2[key].sort((a, b) => a.title.toString().localeCompare(b.title.toString()));
2009
2044
  return acc;
2010
2045
  }, {});
2011
2046
  }
2047
+ const referenceGuideTemplateConfig = templates == null ? void 0 : templates.referenceGuide;
2048
+ if (referenceGuideTemplateConfig) {
2049
+ const alphabetizedReferences = alphabetizeReferences(references);
2050
+ const referenceGuideData = {
2051
+ referenceGuideTitle,
2052
+ references: alphabetizedReferences
2053
+ };
2054
+ const templateRequest = handleTemplateConfig(referenceGuideTemplateConfig, referenceGuideData, templateHelpers);
2055
+ if ("template" in templateRequest) {
2056
+ return compile$1({
2057
+ template: templateRequest.template,
2058
+ source: templateRequest.source
2059
+ });
2060
+ }
2061
+ }
2012
2062
  return _function.pipe(
2013
2063
  references,
2014
2064
  alphabetizeReferences,
@@ -2018,7 +2068,7 @@ function referencesToReferenceGuideContent(referenceGuideTitle, references, temp
2018
2068
  })
2019
2069
  );
2020
2070
  }
2021
- function renderableToPageData(referenceGuideReference, renderable, translations) {
2071
+ function renderableToPageData(referenceGuideReference, renderable, translations, templates) {
2022
2072
  function buildDocOutput(renderable2, docContents) {
2023
2073
  var _a;
2024
2074
  const reference = referenceGuideReference.find(
@@ -2039,12 +2089,16 @@ function renderableToPageData(referenceGuideReference, renderable, translations)
2039
2089
  }
2040
2090
  return _function.pipe(
2041
2091
  renderable,
2042
- (r) => resolveTemplate(r, translations),
2043
- compile$1,
2092
+ (r) => resolveTemplate(r, translations, templates),
2093
+ (templateOrRequest) => compileTemplate(templateOrRequest),
2044
2094
  (docContents) => buildDocOutput(renderable, docContents)
2045
2095
  );
2046
2096
  }
2047
- function resolveTemplate(renderable, translations) {
2097
+ function resolveTemplate(renderable, translations, templates) {
2098
+ const customTemplate = getCustomTemplate(renderable, templates);
2099
+ if (customTemplate) {
2100
+ return customTemplate;
2101
+ }
2048
2102
  function getTemplate(renderable2) {
2049
2103
  switch (renderable2.type) {
2050
2104
  case "enum":
@@ -2068,9 +2122,67 @@ function resolveTemplate(renderable, translations) {
2068
2122
  })
2069
2123
  };
2070
2124
  }
2125
+ function getCustomTemplate(renderable, templates) {
2126
+ if (!templates) {
2127
+ return null;
2128
+ }
2129
+ switch (renderable.type) {
2130
+ case "enum":
2131
+ if (templates.enum) {
2132
+ return handleTemplateConfig(templates.enum, renderable, templateHelpers);
2133
+ }
2134
+ break;
2135
+ case "interface":
2136
+ if (templates.interface) {
2137
+ return handleTemplateConfig(templates.interface, renderable, templateHelpers);
2138
+ }
2139
+ break;
2140
+ case "class":
2141
+ if (templates.class) {
2142
+ return handleTemplateConfig(templates.class, renderable, templateHelpers);
2143
+ }
2144
+ break;
2145
+ case "customobject":
2146
+ if (templates.customObject) {
2147
+ return handleTemplateConfig(templates.customObject, renderable, templateHelpers);
2148
+ }
2149
+ break;
2150
+ case "trigger":
2151
+ if (templates.trigger) {
2152
+ return handleTemplateConfig(templates.trigger, renderable, templateHelpers);
2153
+ }
2154
+ break;
2155
+ case "lwc":
2156
+ if (templates.lwc) {
2157
+ return handleTemplateConfig(templates.lwc, renderable, templateHelpers);
2158
+ }
2159
+ break;
2160
+ }
2161
+ return null;
2162
+ }
2163
+ function handleTemplateConfig(templateConfig, renderable, helpers) {
2164
+ if (typeof templateConfig === "string") {
2165
+ return {
2166
+ template: templateConfig,
2167
+ source: renderable
2168
+ };
2169
+ } else {
2170
+ const result = templateConfig(renderable, helpers);
2171
+ return {
2172
+ template: "{{{content}}}",
2173
+ source: { content: result }
2174
+ };
2175
+ }
2176
+ }
2071
2177
  function compile$1(request) {
2072
2178
  return Template.getInstance().compile(request);
2073
2179
  }
2180
+ function compileTemplate(templateOrRequest) {
2181
+ if ("template" in templateOrRequest) {
2182
+ return Template.getInstance().compile(templateOrRequest);
2183
+ }
2184
+ throw new Error("Invalid template request");
2185
+ }
2074
2186
 
2075
2187
  var __defProp$i = Object.defineProperty;
2076
2188
  var __defProps$h = Object.defineProperties;
@@ -3080,11 +3192,12 @@ function generateDocs(unparsedBundles, config) {
3080
3192
  const translations = mergeTranslations({ markdown: config.translations });
3081
3193
  const convertToReferences = apply(parsedFilesToReferenceGuide, config);
3082
3194
  const convertToRenderableBundle = apply(parsedFilesToRenderableBundle, config);
3083
- const convertToDocumentationBundleForTemplate = apply(
3084
- convertToDocumentationBundle,
3195
+ const convertToDocumentationBundleForTemplate = (bundle, templates) => convertToDocumentationBundle(
3085
3196
  config.referenceGuideTitle,
3086
3197
  config.referenceGuideTemplate,
3087
- translations
3198
+ translations,
3199
+ bundle,
3200
+ templates
3088
3201
  );
3089
3202
  const sort = apply(sortTypesAndMembers, config.sortAlphabetically);
3090
3203
  function filterOutCustomFieldsAndMetadata(parsedFiles) {
@@ -3133,7 +3246,7 @@ function generateDocs(unparsedBundles, config) {
3133
3246
  TE__namespace.map(
3134
3247
  ({ parsedFiles, references }) => convertToRenderableBundle(filterOutCustomFieldsAndMetadata(parsedFiles), references, translations)
3135
3248
  ),
3136
- TE__namespace.map(convertToDocumentationBundleForTemplate),
3249
+ TE__namespace.map((bundle) => convertToDocumentationBundleForTemplate(bundle, config.templates)),
3137
3250
  TE__namespace.flatMap(transformDocumentationBundleHook(config)),
3138
3251
  TE__namespace.map(postHookCompile$1)
3139
3252
  );
@@ -5660,4 +5773,5 @@ exports.changeLogDefaults = changeLogDefaults;
5660
5773
  exports.markdownDefaults = markdownDefaults;
5661
5774
  exports.openApiDefaults = openApiDefaults;
5662
5775
  exports.skip = skip;
5776
+ exports.templateHelpers = templateHelpers;
5663
5777
  exports.validateSourceDirectoryConfig = validateSourceDirectoryConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cparra/apexdocs",
3
- "version": "3.15.0",
3
+ "version": "3.16.0-beta.0",
4
4
  "description": "Library with CLI capabilities to generate documentation for Salesforce Apex classes.",
5
5
  "keywords": [
6
6
  "apex",