@sap/csn-interop-renderer 0.2.1 → 0.3.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.
package/cli/cliRunner.js CHANGED
@@ -52,7 +52,7 @@ async function run(argv) {
52
52
 
53
53
  try {
54
54
  const resultAsHtml = argv.r === "html";
55
- result = await parser(trimmed, resultAsHtml);
55
+ result = await parser(trimmed, undefined, resultAsHtml);
56
56
  } catch (error) {
57
57
  process.stderr.write(`${error.message}\n\n`); // no [error]: needed, prefix is contained in the original code
58
58
  process.exit(1);
@@ -1,10 +1,11 @@
1
1
  export interface CsnRendererProps {
2
- /** @param source A valid text (containing JSON CSNInteropRoot object).*/
2
+ /** @param source A valid text (containing JSON CSNInteropEffectiveDocument object).*/
3
3
  source: string;
4
4
  }
5
5
  type CsnRendererPropName = keyof CsnRendererProps;
6
6
  export declare class CsnRenderer extends HTMLElement {
7
7
  private _htmlContent;
8
+ private _source;
8
9
  constructor();
9
10
  static observedAttributes: CsnRendererPropName[];
10
11
  private _renderHtml;
@@ -17,10 +18,11 @@ declare global {
17
18
  interface HTMLElementTagNameMap {
18
19
  "csn-renderer": CsnRenderer;
19
20
  }
20
- namespace JSX {
21
+ namespace React.JSX {
21
22
  interface IntrinsicElements {
22
23
  ["csn-renderer"]: {
23
24
  source: string;
25
+ config?: string;
24
26
  };
25
27
  }
26
28
  }
@@ -1,33 +1,26 @@
1
1
  import { generateHtml } from "../index.js";
2
2
  export class CsnRenderer extends HTMLElement {
3
3
  _htmlContent = "";
4
+ _source = "";
4
5
  constructor() {
5
6
  super();
6
7
  }
7
8
  static observedAttributes = ["source"];
8
- async _renderHtml(newValue) {
9
- if (newValue) {
10
- this._htmlContent = await generateHtml(JSON.parse(newValue));
9
+ async _renderHtml(value) {
10
+ if (value) {
11
+ this._htmlContent = await generateHtml(JSON.parse(value));
11
12
  this.innerHTML = this._htmlContent;
12
13
  }
13
- else {
14
- const csnDataSource = this.getAttribute("source");
15
- if (csnDataSource) {
16
- this._htmlContent = await generateHtml(JSON.parse(csnDataSource));
17
- this.innerHTML = this._htmlContent;
18
- }
19
- }
20
- }
21
- connectedCallback() {
22
- void this._renderHtml();
23
14
  }
15
+ connectedCallback() { }
24
16
  disconnectedCallback() { }
25
17
  adoptedCallback() { }
26
18
  attributeChangedCallback(name, _oldValue, newValue) {
27
19
  if (name === "source" && !!newValue && typeof newValue === "string") {
28
- void this._renderHtml(newValue);
20
+ this._source = newValue;
21
+ void this._renderHtml(this._source);
29
22
  }
30
23
  }
31
24
  }
32
25
  customElements.define("csn-renderer", CsnRenderer);
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NuUmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3VzdG9tV2ViQ29tcG9uZW50L2NzblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFTM0MsTUFBTSxPQUFPLFdBQVksU0FBUSxXQUFXO0lBQ2xDLFlBQVksR0FBVyxFQUFFLENBQUM7SUFFbEM7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLEdBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFpQjtRQUN6QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sb0JBQW9CLEtBQVUsQ0FBQztJQUUvQixlQUFlLEtBQVUsQ0FBQztJQUUxQix3QkFBd0IsQ0FBQyxJQUF5QixFQUFFLFNBQWtCLEVBQUUsUUFBaUI7UUFDOUYsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEUsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDOztBQW1CSCxjQUFjLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyJ9
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NuUmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3VzdG9tV2ViQ29tcG9uZW50L2NzblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFTM0MsTUFBTSxPQUFPLFdBQVksU0FBUSxXQUFXO0lBQ2xDLFlBQVksR0FBVyxFQUFFLENBQUM7SUFDMUIsT0FBTyxHQUFXLEVBQUUsQ0FBQztJQUU3QjtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsR0FBMEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU3RCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQWdDO1FBQ3hELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFTSxpQkFBaUIsS0FBVSxDQUFDO0lBRTVCLG9CQUFvQixLQUFVLENBQUM7SUFFL0IsZUFBZSxLQUFVLENBQUM7SUFFMUIsd0JBQXdCLENBQUMsSUFBeUIsRUFBRSxTQUFrQixFQUFFLFFBQWlCO1FBQzlGLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7O0FBbUJILGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDIn0=
@@ -1,15 +1,17 @@
1
1
  import * as customWebComponent from "./customWebComponent/csnRenderer.js";
2
- import { CSNInteropRoot } from "@sap/csn-interop-specification";
2
+ import { CSNInteropEffectiveDocument } from "@sap/csn-interop-specification";
3
+ import { CsnRendererConfig } from "./types/index.js";
3
4
  /**
4
- * Converts JSON CSNInteropRoot object into an markdown string.
5
+ * Converts JSON CSNInteropEffectiveDocument object into an markdown string.
5
6
  *
6
- * @param inputText A valid JSON CSNInteropRoot object.
7
+ * @param inputText A valid JSON CSNInteropEffectiveDocument object.
7
8
  */
8
- declare function generateMarkdown(inputText: CSNInteropRoot): Promise<string>;
9
+ declare function generateMarkdown(inputText: CSNInteropEffectiveDocument, config?: CsnRendererConfig): Promise<string>;
9
10
  /**
10
- * Converts JSON CSNInteropRoot object into an html string.
11
+ * Converts JSON CSNInteropEffectiveDocument object into an html string.
11
12
  *
12
- * @param inputText A valid JSON CSNInteropRoot object.
13
+ * @param inputText A valid JSON CSNInteropEffectiveDocument object.
13
14
  */
14
- declare function generateHtml(inputText: CSNInteropRoot): Promise<string>;
15
+ declare function generateHtml(inputText: CSNInteropEffectiveDocument, config?: CsnRendererConfig): Promise<string>;
15
16
  export { generateHtml, generateMarkdown, customWebComponent };
17
+ export * from "./types/index.js";
package/dist/src/index.js CHANGED
@@ -1,22 +1,23 @@
1
1
  import { parser } from "./parser.js";
2
2
  import * as customWebComponent from "./customWebComponent/csnRenderer.js";
3
3
  /**
4
- * Converts JSON CSNInteropRoot object into an markdown string.
4
+ * Converts JSON CSNInteropEffectiveDocument object into an markdown string.
5
5
  *
6
- * @param inputText A valid JSON CSNInteropRoot object.
6
+ * @param inputText A valid JSON CSNInteropEffectiveDocument object.
7
7
  */
8
- async function generateMarkdown(inputText) {
9
- const result = await parser(inputText);
8
+ async function generateMarkdown(inputText, config) {
9
+ const result = await parser(inputText, config);
10
10
  return result;
11
11
  }
12
12
  /**
13
- * Converts JSON CSNInteropRoot object into an html string.
13
+ * Converts JSON CSNInteropEffectiveDocument object into an html string.
14
14
  *
15
- * @param inputText A valid JSON CSNInteropRoot object.
15
+ * @param inputText A valid JSON CSNInteropEffectiveDocument object.
16
16
  */
17
- async function generateHtml(inputText) {
18
- const result = await parser(inputText, true);
17
+ async function generateHtml(inputText, config) {
18
+ const result = await parser(inputText, config, true);
19
19
  return result;
20
20
  }
21
21
  export { generateHtml, generateMarkdown, customWebComponent };
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEtBQUssa0JBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFHMUU7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxZQUFZLENBQUMsU0FBeUI7SUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUMifQ==
22
+ export * from "./types/index.js";
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEtBQUssa0JBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFJMUU7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxTQUFzQyxFQUFFLE1BQTBCO0lBQ2hHLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxZQUFZLENBQUMsU0FBc0MsRUFBRSxNQUEwQjtJQUM1RixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDOUQsY0FBYyxrQkFBa0IsQ0FBQyJ9
@@ -1,2 +1,3 @@
1
- import { CSNInteropRoot } from "@sap/csn-interop-specification";
2
- export declare const parser: (text: CSNInteropRoot, generateAsHTml?: boolean) => Promise<string>;
1
+ import { CSNInteropEffectiveDocument } from "@sap/csn-interop-specification";
2
+ import { CsnRendererConfig } from "./types/index.js";
3
+ export declare const parser: (text: CSNInteropEffectiveDocument, config?: CsnRendererConfig, generateAsHTml?: boolean) => Promise<string>;
@@ -1,6 +1,6 @@
1
1
  import { schemas } from "@sap/csn-interop-specification";
2
2
  import { renderer } from "./renderer.js";
3
- export const parser = async (text, generateAsHTml = false) => {
3
+ export const parser = async (text, config, generateAsHTml = false) => {
4
4
  // eslint-disable-next-line @typescript-eslint/naming-convention
5
5
  let Draft07;
6
6
  const jsonSchemaLib = await import("json-schema-library");
@@ -25,6 +25,6 @@ export const parser = async (text, generateAsHTml = false) => {
25
25
  return combinedMessage;
26
26
  }, ""));
27
27
  }
28
- return renderer(text, generateAsHTml);
28
+ return renderer(text, config, generateAsHTml);
29
29
  };
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxJQUFvQixFQUFFLGlCQUEwQixLQUFLLEVBQW1CLEVBQUU7SUFDckcsZ0VBQWdFO0lBQ2hFLElBQUksT0FBTyxDQUFDO0lBQ1osTUFBTSxhQUFhLEdBQUcsTUFBTSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUUxRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hGLG1CQUFtQjtRQUNuQixPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDMUMsQ0FBQztTQUFNLENBQUM7UUFDTixzQkFBc0I7UUFDdEIsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRTFCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9DLGVBQWUsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDekUsT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNQLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyJ9
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQStCLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFDekIsSUFBaUMsRUFDakMsTUFBMEIsRUFDMUIsaUJBQTBCLEtBQUssRUFDZCxFQUFFO0lBQ25CLGdFQUFnRTtJQUNoRSxJQUFJLE9BQU8sQ0FBQztJQUNaLE1BQU0sYUFBYSxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFMUQsc0NBQXNDO0lBQ3RDLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRixtQkFBbUI7UUFDbkIsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzFDLENBQUM7U0FBTSxDQUFDO1FBQ04sc0JBQXNCO1FBQ3RCLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUUxQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQyxlQUFlLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ3pFLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDaEQsQ0FBQyxDQUFDIn0=
@@ -1,2 +1,3 @@
1
- import { type CSNInteropRoot } from "@sap/csn-interop-specification";
2
- export declare const renderer: (json: CSNInteropRoot, asHTml?: boolean) => Promise<string>;
1
+ import { type CSNInteropEffectiveDocument } from "@sap/csn-interop-specification";
2
+ import { CsnRendererConfig } from "./types/index.js";
3
+ export declare const renderer: (json: CSNInteropEffectiveDocument, config?: CsnRendererConfig, asHTml?: boolean) => Promise<string>;
@@ -1,5 +1,6 @@
1
1
  import { marked } from "marked";
2
2
  import { gfmHeadingId } from "marked-gfm-heading-id";
3
+ import { getDescriptionData } from "./rendererUtil.js";
3
4
  // Helper functions
4
5
  function isEntityDefinition(entry) {
5
6
  return entry.kind === "entity";
@@ -22,17 +23,6 @@ function isCustomType(element) {
22
23
  function isAssociationType(element) {
23
24
  return "target" in element && element.type === "cds.Association";
24
25
  }
25
- function renderStringWithI18n(content, i18n) {
26
- const esacpedContent = typeof content.replace === "function" ? content.replace(/{/g, "&lbrace;").replace(/}/g, "&rbrace;") : content;
27
- if (!i18n || typeof content?.match !== "function")
28
- return esacpedContent;
29
- const matches = content.match(/^{i18n>(.*)}$/);
30
- const enKey = Object.keys(i18n).find((key) => key.match(/^en$/i));
31
- if (matches?.[1] && enKey && i18n[enKey]?.[matches[1]]) {
32
- return i18n[enKey][matches[1]];
33
- }
34
- return esacpedContent;
35
- }
36
26
  /**
37
27
  * Get the header id the same format as GitHub does it for rendered markdown content.
38
28
  * @param definitionName The name of a definition
@@ -46,34 +36,43 @@ function getHeaderId(definitionName, entityElementName) {
46
36
  }
47
37
  return definitionName.toLowerCase().replaceAll(".", "");
48
38
  }
49
- function renderObject(content) {
50
- return `<code>${JSON.stringify(content, undefined, 2).replace(/{/g, "&lbrace;").replace(/}/g, "&rbrace;")}</code>`;
51
- }
52
39
  // Sub render functions
53
- function processEntities(entities, serviceNames, i18n) {
40
+ async function processEntities(entities, serviceNames, i18n, annotationValueLinkTransformers) {
41
+ if (!entities.length)
42
+ return "";
54
43
  let output = "## Entity Definitions\n\n";
55
- // Process entities
56
- for (const [entityName, entity] of entities) {
44
+ for (const [entityName, entityDefinition] of entities) {
57
45
  output += `### ${entityName}\n\n`;
58
46
  const dotSplittedEntityName = entityName.split(".");
59
- if (dotSplittedEntityName.length > 1 && serviceNames.includes(dotSplittedEntityName[0])) {
60
- output += `- **Exposed via**: [${dotSplittedEntityName[0]}](#${dotSplittedEntityName[0].toLowerCase()})\n`;
47
+ if (dotSplittedEntityName.length > 1 &&
48
+ dotSplittedEntityName[0] &&
49
+ serviceNames.includes(dotSplittedEntityName[0])) {
50
+ output += `Entity exposed via:\n[${dotSplittedEntityName[0]}](#${dotSplittedEntityName[0].toLowerCase()})\n\n`;
61
51
  }
62
- output += "\n";
63
- // Table header for entity elements
64
- output += `<table>\n<tr>`;
65
- output += `<th><strong>Element</strong></th><th><strong>Type</strong></th><th><strong>Description</strong></th>`;
66
- output += `</tr>\n`;
67
- for (const [elementName, element] of Object.entries(entity.elements)) {
68
- const descriptionParts = [];
69
- // Key and derived type handling
70
- if (isCustomType(element) && element.key) {
71
- descriptionParts.push("<strong>Key</strong>: true");
72
- }
52
+ if (entityDefinition.doc) {
53
+ output += `${marked.parse(entityDefinition.doc)}\n`;
54
+ }
55
+ const entityRestProps = Object.entries(entityDefinition).filter(([key]) => !["kind", "doc", "elements"].includes(key));
56
+ output += `${await getDescriptionData(entityRestProps, annotationValueLinkTransformers, i18n)}\n\n`;
57
+ output += `Elements: \n\n`;
58
+ output += `<table>\n`;
59
+ output += `<tr>`;
60
+ output += `<th>Element</th>`;
61
+ output += `<th>Type</th>`;
62
+ output += `<th>Description</th>`;
63
+ output += `</tr>`;
64
+ for (const [elementName, elementDefinition] of Object.entries(entityDefinition.elements)) {
65
+ const elementRestProps = Object.entries(elementDefinition).filter(([key]) => !["type", "length", "cardinality", "on", "target"].includes(key));
66
+ const lengthConstraint = isLengthConstrainable(elementDefinition) && elementDefinition.length ? `(${elementDefinition.length})` : "";
67
+ const typeLink = isCustomType(elementDefinition)
68
+ ? `<a href="#${elementDefinition.type.toLowerCase()}">${elementDefinition.type}</a>`
69
+ : elementDefinition.type + lengthConstraint;
70
+ let customDescriptionCellDataText = undefined;
71
+ // TODO: Composition handling
73
72
  // Association handling
74
- if (isAssociationType(element) && element.target) {
75
- const targetEntityName = element.target;
76
- const onClause = element.on;
73
+ if (isAssociationType(elementDefinition) && elementDefinition.target) {
74
+ const targetEntityName = elementDefinition.target;
75
+ const onClause = elementDefinition.on;
77
76
  let targetElementName = "";
78
77
  let viaKey = "";
79
78
  // Extract foreign key and path descriptions
@@ -95,99 +94,86 @@ function processEntities(entities, serviceNames, i18n) {
95
94
  }
96
95
  }
97
96
  }
98
- const cardinality = element.cardinality?.max === "*" ? "to many" : "to one";
97
+ const cardinality = elementDefinition.cardinality?.max === "*" ? "to many" : "to one";
99
98
  const pathDescription = targetEntityName && targetElementName
100
- ? `Path: <a href="#${getHeaderId(targetEntityName)}">${targetEntityName}</a>.<a href="#${getHeaderId(targetEntityName, targetElementName)}">${targetElementName}</a>`
99
+ ? `path: <a href="#${getHeaderId(targetEntityName)}">${targetEntityName}</a>.<a href="#${getHeaderId(targetEntityName, targetElementName)}">${targetElementName}</a>`
101
100
  : "";
102
- descriptionParts.push(`<strong>Association</strong>: Links ${cardinality} <a href="#${getHeaderId(targetEntityName)}">${targetEntityName}</a> (${pathDescription}) via <a href="#${getHeaderId(entityName, viaKey)}">${viaKey}</a>`);
103
- }
104
- // Annotation handling
105
- for (const [key, value] of Object.entries(element)) {
106
- if (key.startsWith("@")) {
107
- const formattedValue = typeof value === "object" ? renderObject(value) : renderStringWithI18n(value, i18n);
108
- descriptionParts.push(`<strong>${key}</strong>: ${formattedValue}`);
109
- }
101
+ customDescriptionCellDataText = `Association ${cardinality} <a href="#${getHeaderId(targetEntityName)}">${targetEntityName}</a> (${pathDescription}) via <a href="#${getHeaderId(entityName, viaKey)}">${viaKey}</a>`;
110
102
  }
111
- const description = descriptionParts.join("<br />");
112
- const typeLink = isCustomType(element)
113
- ? `<a href="#${element.type.toLowerCase()}">${element.type}</a>`
114
- : element.type;
115
103
  output += `<tr>`;
116
- output += `<td><strong id="${getHeaderId(entityName, elementName)}">${elementName}</strong></td>`;
104
+ output += `<td><strong id="${getHeaderId(entityName, elementName)}">${elementName}</strong><br /><br /></td>`;
117
105
  output += `<td>${typeLink}</td>`;
118
- output += `<td>${description}</td>`;
106
+ output += `<td>${await getDescriptionData(elementRestProps, annotationValueLinkTransformers, i18n, customDescriptionCellDataText)}</td>`;
119
107
  output += `</tr>\n`;
120
108
  }
121
109
  output += "</table>\n\n";
122
110
  }
123
111
  return output;
124
112
  }
125
- function processTypes(types, i18n) {
113
+ async function processTypes(types, i18n, annotationValueLinkTransformers) {
126
114
  if (!types.length)
127
115
  return "";
128
116
  let output = "## Type Definitions\n\n";
129
- for (const [typeName, definition] of types) {
130
- const doc = definition.doc || "";
131
- const lengthConstraint = isLengthConstrainable(definition) && definition.length ? `(${definition.length})` : "";
132
- const annotations = Object.entries(definition).filter(([key]) => key.startsWith("@"));
133
- const restProps = Object.entries(definition).filter(([key]) => !key.startsWith("@") && !["doc", "kind", "type", "length"].includes(key));
117
+ for (const [typeName, typeDefinition] of types) {
134
118
  output += `### ${typeName}\n\n`;
135
- if (doc)
136
- output += `${marked.parse(doc)}\n`;
137
- output += `<table>\n<tr><th>Type</th><th>Description</th></tr>\n`;
138
- const descriptionParts = restProps.map(([key, value]) => `<strong>${key}</strong>: ${typeof value === "object" ? renderObject(value) : value}`);
139
- const annotationParts = annotations.map(([key, value]) => `<strong>${key}</strong>: ${typeof value === "object" ? renderObject(value) : renderStringWithI18n(value, i18n)}`);
140
- output += `<tr>`;
141
- output += `<td>${definition.type}${lengthConstraint}</td>`;
142
- output += `<td>`;
143
- if (descriptionParts.length) {
144
- output += `${descriptionParts.join("<br />")}<br /><br />`;
145
- }
146
- if (annotationParts.length) {
147
- output += `<strong>Annotations</strong><br />${annotationParts.join("<br />")}`;
119
+ if (typeDefinition.doc) {
120
+ output += `${marked.parse(typeDefinition.doc)}\n`;
148
121
  }
149
- output += `</td></tr>\n`;
122
+ const restProps = Object.entries(typeDefinition).filter(([key]) => !["doc", "kind", "type", "length"].includes(key));
123
+ if (!restProps.length)
124
+ return output;
125
+ output += `<table>\n`;
126
+ output += `<tr>`;
127
+ output += `<th>Type</th>`;
128
+ output += `<th>Description</th>`;
129
+ output += `</tr>`;
130
+ output += `<tr>`;
131
+ const lengthConstraint = isLengthConstrainable(typeDefinition) && typeDefinition.length ? `(${typeDefinition.length})` : "";
132
+ output += `<td>${typeDefinition.type}${lengthConstraint}</td>`;
133
+ output += `<td>${await getDescriptionData(restProps, annotationValueLinkTransformers, i18n)}</td>`;
134
+ output += `</tr>\n`;
150
135
  output += `</table>\n\n`;
151
136
  }
152
137
  return output;
153
138
  }
154
- function processServices(services, entities, i18n) {
139
+ async function processServices(services, entities, i18n, annotationValueLinkTransformers) {
155
140
  if (!services.length)
156
141
  return "";
157
142
  let output = "## Services\n\n";
158
- for (const [serviceName, definition] of services) {
159
- const exposedEntities = entities.filter(([entityName]) => entityName.split(".")[0] === serviceName);
160
- const doc = definition.doc || "";
161
- const annotations = Object.entries(definition).filter(([key]) => key.startsWith("@"));
162
- const restProps = Object.entries(definition).filter(([key]) => !key.startsWith("@") && !["doc", "kind", "type", "length"].includes(key));
143
+ for (const [serviceName, serviceDefinition] of services) {
163
144
  output += `### ${serviceName}\n\n`;
164
- if (doc)
165
- output += `${marked.parse(doc)}\n`;
145
+ if (serviceDefinition.doc) {
146
+ output += `${marked.parse(serviceDefinition.doc)}\n`;
147
+ }
148
+ const exposedEntities = entities.filter(([entityName]) => entityName.split(".")[0] === serviceName);
166
149
  if (exposedEntities) {
167
150
  output += `Exposed Entities:\n\n${exposedEntities.reduce((result, [entityName]) => [...result, ` - [${entityName}](#${getHeaderId(entityName)})`], []).join("\n")}\n\n`;
168
151
  }
169
- if (!restProps.length && !annotations.length)
152
+ const restProps = Object.entries(serviceDefinition).filter(([key]) => !["doc", "kind"].includes(key));
153
+ if (!restProps.length)
170
154
  return output;
171
- output += `<table>\n<tr><th>Description</th></tr>\n`;
172
- const descriptionParts = restProps.map(([key, value]) => `<strong>${key}</strong>: ${typeof value === "object" ? renderObject(value) : value}`);
173
- const annotationParts = annotations.map(([key, value]) => `<strong>${key}</strong>: ${typeof value === "object" ? renderObject(value) : renderStringWithI18n(value, i18n)}`);
155
+ output += `<table>\n`;
174
156
  output += `<tr>`;
175
- output += `<td>`;
176
- if (descriptionParts.length) {
177
- output += `<td>${descriptionParts.join("<br />")}<br /><br />`;
178
- }
179
- if (annotationParts.length) {
180
- output += `<strong>Annotations</strong><br />${annotationParts.join("<br />")}`;
181
- }
182
- output += `</td></tr>\n`;
157
+ output += `<th>Description</th>`;
158
+ output += `</tr>`;
159
+ output += `<tr>`;
160
+ output += `<td>${await getDescriptionData(restProps, annotationValueLinkTransformers, i18n)}</td>`;
161
+ output += `</tr>\n`;
183
162
  output += `</table>\n\n`;
184
163
  }
185
164
  return output;
186
165
  }
187
166
  // Main renderer function
188
- export const renderer = async (json, asHTml = false) => {
189
- const { definitions, meta, i18n } = json;
167
+ export const renderer = async (json, config, asHTml = false) => {
168
+ const { definitions, meta, i18n, csnInteropEffective } = json;
190
169
  let output = "";
170
+ switch (csnInteropEffective) {
171
+ case "1.0":
172
+ output += `>This Data Product definition description was done using the <a href="https://sap.github.io/csn-interop-specification/spec-v1/csn-interop-effective" target="_blank">Core Schema Notation Interoperability (short: CSN Interop)</a> format.\n\n`;
173
+ break;
174
+ default:
175
+ break;
176
+ }
191
177
  if (meta?.document?.title)
192
178
  output += `# ${meta.document.title}\n\n`;
193
179
  if (meta?.document?.doc)
@@ -196,9 +182,9 @@ export const renderer = async (json, asHTml = false) => {
196
182
  const entities = Object.entries(definitions).filter(([_, def]) => isEntityDefinition(def));
197
183
  const types = Object.entries(definitions).filter(([_, def]) => isTypeDefinition(def));
198
184
  const services = Object.entries(definitions).filter(([_, def]) => isServiceDefinition(def));
199
- output += processEntities(entities, services.map((serviceTuple) => serviceTuple[0]), i18n);
200
- output += processTypes(types, i18n);
201
- output += processServices(services, entities, i18n);
185
+ output += await processEntities(entities, services.map((serviceTuple) => serviceTuple[0]), i18n, config?.annotationLinkCallbacks);
186
+ output += await processTypes(types, i18n, config?.annotationLinkCallbacks);
187
+ output += await processServices(services, entities, i18n, config?.annotationLinkCallbacks);
202
188
  if (asHTml) {
203
189
  marked.use(gfmHeadingId());
204
190
  const html = await marked.parse(output);
@@ -206,4 +192,4 @@ export const renderer = async (json, asHTml = false) => {
206
192
  }
207
193
  return output;
208
194
  };
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELG1CQUFtQjtBQUNuQixTQUFTLGtCQUFrQixDQUFDLEtBQXNCO0lBQ2hELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQ25DLEtBQTBFO0lBRTFFLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQXFCO0lBQ2xELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFzQjtJQUNqRCxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxPQUFxQjtJQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsT0FBcUM7SUFDOUQsT0FBTyxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUM7QUFDbkUsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsT0FBZSxFQUFFLElBQTRC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
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR3ZELG1CQUFtQjtBQUNuQixTQUFTLGtCQUFrQixDQUFDLEtBQXNCO0lBQ2hELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQ25DLEtBQTBFO0lBRTFFLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixLQUFvQztJQUVwQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQXNCO0lBQzlDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsS0FBc0I7SUFDakQsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsT0FBcUI7SUFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQXFDO0lBQzlELE9BQU8sUUFBUSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDO0FB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
@@ -0,0 +1,4 @@
1
+ import { CSNInteropEffectiveDocument } from "@sap/csn-interop-specification";
2
+ import { AnnotationLinkCallbacks } from "./types/index.js";
3
+ export declare function getDescriptionData(props: [string, unknown][], annotationLinkCallbacks: AnnotationLinkCallbacks | undefined, i18n: CSNInteropEffectiveDocument["i18n"] | undefined, customDescriptionCellDataText?: string): Promise<string>;
4
+ export declare function renderContentWithI18n(content: unknown, i18n: CSNInteropEffectiveDocument["i18n"] | undefined): string;
@@ -0,0 +1,69 @@
1
+ import { marked } from "marked";
2
+ // TODO: extend function to support html line endings <br> and/or markdown line endings \n
3
+ // because the function can be called inside html table where <br> is needed and in plain markdown context where \n is needed BUT <br> just happens to work as well
4
+ export async function getDescriptionData(props, annotationLinkCallbacks, i18n, customDescriptionCellDataText) {
5
+ if (customDescriptionCellDataText)
6
+ return customDescriptionCellDataText;
7
+ const annotations = props.filter(([key]) => key.startsWith("@"));
8
+ const restProps = props.filter(([key]) => !key.startsWith("@"));
9
+ let description = "";
10
+ const restPropsParts = restProps.map((prop) => {
11
+ if (prop[0] === "doc") {
12
+ return `${marked.parse(typeof prop[1] === "string" ? prop[1] : JSON.stringify(prop[1]))}`;
13
+ }
14
+ return `${prop[0]}: ${renderContentWithI18n(prop[1], i18n)}`;
15
+ });
16
+ const annotationParts = await Promise.all(annotations.map(async ([key, value]) => {
17
+ if (annotationLinkCallbacks) {
18
+ let transformer = undefined;
19
+ for (const annotationKey in annotationLinkCallbacks) {
20
+ if (annotationKey === key) {
21
+ transformer = annotationLinkCallbacks[annotationKey];
22
+ }
23
+ }
24
+ let linkValue = undefined;
25
+ if (transformer) {
26
+ if (transformer.constructor.name === "AsyncFunction") {
27
+ linkValue = await transformer(value);
28
+ }
29
+ else if (transformer.constructor.name === "Function") {
30
+ if (transformer(value).then) {
31
+ await transformer(value).then((result) => {
32
+ linkValue = result;
33
+ });
34
+ }
35
+ else {
36
+ linkValue = transformer(value);
37
+ }
38
+ }
39
+ }
40
+ if (linkValue) {
41
+ return `${key}: <a href="${linkValue}" target="_blank">${renderContentWithI18n(value, i18n)}</a>`;
42
+ }
43
+ return `${key}: ${renderContentWithI18n(value, i18n)}`;
44
+ }
45
+ return `${key}: ${renderContentWithI18n(value, i18n)}`;
46
+ }));
47
+ if (restPropsParts.length) {
48
+ description += `${restPropsParts.join("<br />")}<br />`;
49
+ }
50
+ if (annotationParts.length) {
51
+ description += `${annotationParts.join("<br />")}`;
52
+ }
53
+ return description;
54
+ }
55
+ export function renderContentWithI18n(content, i18n) {
56
+ const escapedContent = JSON.stringify(content).replace(/{/g, "&lbrace;").replace(/}/g, "&rbrace;");
57
+ if (!i18n) {
58
+ return `<code>${escapedContent}</code>`;
59
+ }
60
+ if (typeof content === "string") {
61
+ const matches = content.match(/^{i18n>(.*)}$/);
62
+ const enKey = Object.keys(i18n).find((key) => key.match(/^en$/i));
63
+ if (matches && matches[1] && enKey && i18n[enKey] && i18n[enKey][matches[1]]) {
64
+ return i18n[enKey][matches[1]] || `<code>${escapedContent}</code>`;
65
+ }
66
+ }
67
+ return `<code>${escapedContent}</code>`;
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXJVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbmRlcmVyVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLDBGQUEwRjtBQUMxRixtS0FBbUs7QUFDbkssTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsS0FBMEIsRUFDMUIsdUJBQTRELEVBQzVELElBQXFELEVBQ3JELDZCQUFzQztJQUV0QyxJQUFJLDZCQUE2QjtRQUFFLE9BQU8sNkJBQTZCLENBQUM7SUFFeEUsTUFBTSxXQUFXLEdBQXdCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRWhFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUVyQixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdEIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVGLENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxD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
@@ -0,0 +1,22 @@
1
+ type LinkCallbackFunction = ((annotationValue: unknown) => Promise<string>) | ((annotationValue: unknown) => string);
2
+ interface AnnotationLinkCallbacks<T = LinkCallbackFunction> {
3
+ /** Callback function to offer the possibility to provide a custom link transformer for a specific annotation key
4
+ Usage e.g. :
5
+
6
+ {
7
+ annotationLinkCallbacks: {
8
+ {
9
+ "@EndUserText.label": (_annotationValue: unknown): string => {
10
+ return "https://example.com/";
11
+ },
12
+ },
13
+ },
14
+ }
15
+
16
+ */
17
+ [annotationKey: string]: T;
18
+ }
19
+ interface CsnRendererConfig {
20
+ annotationLinkCallbacks?: AnnotationLinkCallbacks;
21
+ }
22
+ export { CsnRendererConfig, AnnotationLinkCallbacks, LinkCallbackFunction };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package",
3
3
  "name": "@sap/csn-interop-renderer",
4
- "version": "0.2.1",
4
+ "version": "0.3.1",
5
5
  "description": "Converts documents defined using CSN Interoperability Specification into markdown/HTML human readable documentation pages.",
6
6
  "keywords": [],
7
7
  "author": "SAP SE",
@@ -40,19 +40,19 @@
40
40
  "render-examples": "node ./scripts/renderExamples.cjs"
41
41
  },
42
42
  "dependencies": {
43
- "@sap/csn-interop-specification": "1.0.2",
43
+ "@sap/csn-interop-specification": "1.0.4",
44
44
  "commander": "13.1.0",
45
- "json-schema-library": "10.0.0-rc7",
46
- "marked": "15.0.7",
45
+ "json-schema-library": "9.2.1",
46
+ "marked": "15.0.11",
47
47
  "marked-gfm-heading-id": "4.1.1"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@expo/spawn-async": "1.7.2",
51
51
  "@sap/eslint-config": "0.4.0",
52
- "@tsconfig/node22": "22.0.0",
52
+ "@tsconfig/node22": "22.0.1",
53
53
  "@types/jest": "29.5.14",
54
54
  "@types/tmp": "0.2.6",
55
- "eslint": "9.22.0",
55
+ "eslint": "9.26.0",
56
56
  "husky": "9.1.7",
57
57
  "is-ci": "4.1.0",
58
58
  "jest": "29.7.0",
@@ -60,13 +60,13 @@
60
60
  "jest-environment-jsdom": "29.7.0",
61
61
  "jest-junit": "16.0.0",
62
62
  "jest-watch-typeahead": "2.2.2",
63
- "lint-staged": "15.5.0",
63
+ "lint-staged": "16.0.0",
64
64
  "prettier": "3.5.3",
65
65
  "rimraf": "6.0.1",
66
66
  "tmp": "0.2.3",
67
- "ts-jest": "29.2.6",
68
- "tsx": "4.19.3",
69
- "typescript": "5.8.2"
67
+ "ts-jest": "29.3.3",
68
+ "tsx": "4.19.4",
69
+ "typescript": "5.8.3"
70
70
  },
71
71
  "lint-staged": {
72
72
  "./**/*.{js,ts}": [