@sap/csn-interop-renderer 0.2.1 → 0.3.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/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);
@@ -5,6 +5,7 @@ export interface CsnRendererProps {
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
2
  import { CSNInteropRoot } from "@sap/csn-interop-specification";
3
+ import { CsnRendererConfig } from "./types/index.js";
3
4
  /**
4
5
  * Converts JSON CSNInteropRoot object into an markdown string.
5
6
  *
6
7
  * @param inputText A valid JSON CSNInteropRoot object.
7
8
  */
8
- declare function generateMarkdown(inputText: CSNInteropRoot): Promise<string>;
9
+ declare function generateMarkdown(inputText: CSNInteropRoot, config?: CsnRendererConfig): Promise<string>;
9
10
  /**
10
11
  * Converts JSON CSNInteropRoot object into an html string.
11
12
  *
12
13
  * @param inputText A valid JSON CSNInteropRoot object.
13
14
  */
14
- declare function generateHtml(inputText: CSNInteropRoot): Promise<string>;
15
+ declare function generateHtml(inputText: CSNInteropRoot, config?: CsnRendererConfig): Promise<string>;
15
16
  export { generateHtml, generateMarkdown, customWebComponent };
17
+ export * from "./types/index.js";
package/dist/src/index.js CHANGED
@@ -5,8 +5,8 @@ import * as customWebComponent from "./customWebComponent/csnRenderer.js";
5
5
  *
6
6
  * @param inputText A valid JSON CSNInteropRoot 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
  /**
@@ -14,9 +14,10 @@ async function generateMarkdown(inputText) {
14
14
  *
15
15
  * @param inputText A valid JSON CSNInteropRoot 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEtBQUssa0JBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFJMUU7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxTQUF5QixFQUFFLE1BQTBCO0lBQ25GLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxZQUFZLENBQUMsU0FBeUIsRUFBRSxNQUEwQjtJQUMvRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDOUQsY0FBYyxrQkFBa0IsQ0FBQyJ9
@@ -1,2 +1,3 @@
1
1
  import { CSNInteropRoot } from "@sap/csn-interop-specification";
2
- export declare const parser: (text: CSNInteropRoot, generateAsHTml?: boolean) => Promise<string>;
2
+ import { CsnRendererConfig } from "./types/index.js";
3
+ export declare const parser: (text: CSNInteropRoot, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFDekIsSUFBb0IsRUFDcEIsTUFBMEIsRUFDMUIsaUJBQTBCLEtBQUssRUFDZCxFQUFFO0lBQ25CLGdFQUFnRTtJQUNoRSxJQUFJLE9BQU8sQ0FBQztJQUNaLE1BQU0sYUFBYSxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFMUQsc0NBQXNDO0lBQ3RDLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRixtQkFBbUI7UUFDbkIsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzFDLENBQUM7U0FBTSxDQUFDO1FBQ04sc0JBQXNCO1FBQ3RCLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUUxQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQyxlQUFlLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ3pFLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDaEQsQ0FBQyxDQUFDIn0=
@@ -1,2 +1,3 @@
1
1
  import { type CSNInteropRoot } from "@sap/csn-interop-specification";
2
- export declare const renderer: (json: CSNInteropRoot, asHTml?: boolean) => Promise<string>;
2
+ import { CsnRendererConfig } from "./types/index.js";
3
+ export declare const renderer: (json: CSNInteropRoot, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR3ZELG1CQUFtQjtBQUNuQixTQUFTLGtCQUFrQixDQUFDLEtBQXNCO0lBQ2hELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQ25DLEtBQTBFO0lBRTFFLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixLQUFvQztJQUVwQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQXNCO0lBQzlDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsS0FBc0I7SUFDakQsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsT0FBcUI7SUFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQXFDO0lBQzlELE9BQU8sUUFBUSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDO0FBQ25FLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxjQUFzQixFQUFFLGlCQUEwQjtJQUNyRSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN0SCxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsdUJBQXVCO0FBQ3ZCLEtBQUssVUFBVSxlQUFlLENBQzVCLFFBQXNDLEVBQ3RDLFlBQXNCLEVBQ3RCLElBQXdDLEVBQ3hDLCtCQUFvRTtJQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFJLE1BQU0sR0FBRywyQkFBMkIsQ0FBQztJQUN6QyxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksT0FBTyxVQUFVLE1BQU0sQ0FBQztRQUVsQyxNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEQsSUFDRSxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNoQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDeEIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMvQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLHlCQUF5QixxQkFBcUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO1FBQ2pILENBQUM7UUFFRCxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN0RCxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FDN0QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQ3RELENBQUM7UUFFRixNQUFNLElBQUksR0FBRyxNQUFNLGtCQUFrQixDQUFDLGVBQWUsRUFBRSwrQkFBK0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRXBHLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQztRQUUzQixNQUFNLElBQUksV0FBVyxDQUFDO1FBRXRCLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDakIsTUFBTSxJQUFJLGtCQUFrQixDQUFDO1FBQzdCLE1BQU0sSUFBSSxlQUFlLENBQUM7UUFDMUIsTUFBTSxJQUFJLHNCQUFzQixDQUFDO1FBQ2pDLE1BQU0sSUFBSSxPQUFPLENBQUM7UUFFbEIsS0FBSyxNQUFNLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3pGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDL0QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDNUUsQ0FBQztZQUVGLE1BQU0sZ0JBQWdCLEdBQ3BCLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO2dCQUM5QyxDQUFDLENBQUMsYUFBYSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssaUJBQWlCLENBQUMsSUFBSSxNQUFNO2dCQUNwRixDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO1lBRTlDLElBQUksNkJBQTZCLEdBQUcsU0FBUyxDQUFDO1lBRTlDLDZCQUE2QjtZQUU3Qix1QkFBdUI7WUFDdkIsSUFBSSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyRSxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztnQkFDbEQsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUVoQiw0Q0FBNEM7Z0JBQzVDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM1QixJQUFJLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQzlDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ2pDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3pDLENBQUM7NkJBQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDeEMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlCLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxJQUFJLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQzlDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ2pDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3pDLENBQUM7NkJBQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDeEMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlCLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDdEYsTUFBTSxlQUFlLEdBQ25CLGdCQUFnQixJQUFJLGlCQUFpQjtvQkFDbkMsQ0FBQyxDQUFDLG1CQUFtQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxnQkFBZ0Isa0JBQWtCLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLGlCQUFpQixNQUFNO29CQUNySyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUVULDZCQUE2QixHQUFHLGVBQWUsV0FBVyxjQUFjLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLGdCQUFnQixTQUFTLGVBQWUsbUJBQW1CLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssTUFBTSxNQUFNLENBQUM7WUFDeE4sQ0FBQztZQUVELE1BQU0sSUFBSSxNQUFNLENBQUM7WUFDakIsTUFBTSxJQUFJLG1CQUFtQixXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxLQUFLLFdBQVcsNEJBQTRCLENBQUM7WUFDOUcsTUFBTSxJQUFJLE9BQU8sUUFBUSxPQUFPLENBQUM7WUFDakMsTUFBTSxJQUFJLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSwrQkFBK0IsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLENBQUMsT0FBTyxDQUFDO1lBQ3pJLE1BQU0sSUFBSSxTQUFTLENBQUM7UUFDdEIsQ0FBQztRQUVELE1BQU0sSUFBSSxjQUFjLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUN6QixLQUFpQyxFQUNqQyxJQUF3QyxFQUN4QywrQkFBb0U7SUFFcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcseUJBQXlCLENBQUM7SUFDdkMsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxPQUFPLFFBQVEsTUFBTSxDQUFDO1FBQ2hDLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDcEQsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUF3QixNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FDMUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUM1RCxDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFckMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUV0QixNQUFNLElBQUksTUFBTSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxlQUFlLENBQUM7UUFDMUIsTUFBTSxJQUFJLHNCQUFzQixDQUFDO1FBQ2pDLE1BQU0sSUFBSSxPQUFPLENBQUM7UUFFbEIsTUFBTSxJQUFJLE1BQU0sQ0FBQztRQUNqQixNQUFNLGdCQUFnQixHQUNwQixxQkFBcUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JHLE1BQU0sSUFBSSxPQUFPLGNBQWMsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLE9BQU8sQ0FBQztRQUMvRCxNQUFNLElBQUksT0FBTyxNQUFNLGtCQUFrQixDQUFDLFNBQVMsRUFBRSwrQkFBK0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ25HLE1BQU0sSUFBSSxTQUFTLENBQUM7UUFFcEIsTUFBTSxJQUFJLGNBQWMsQ0FBQztJQUMzQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELEtBQUssVUFBVSxlQUFlLENBQzVCLFFBQXVDLEVBQ3ZDLFFBQXNDLEVBQ3RDLElBQXdDLEVBQ3hDLCtCQUFvRTtJQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFJLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQztJQUMvQixLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksT0FBTyxXQUFXLE1BQU0sQ0FBQztRQUNuQyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN2RCxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDcEcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksd0JBQXdCLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxRQUFRLFVBQVUsTUFBTSxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZMLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBd0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDN0UsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDMUMsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBRXJDLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFFdEIsTUFBTSxJQUFJLE1BQU0sQ0FBQztRQUNqQixNQUFNLElBQUksc0JBQXNCLENBQUM7UUFDakMsTUFBTSxJQUFJLE9BQU8sQ0FBQztRQUVsQixNQUFNLElBQUksTUFBTSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxPQUFPLE1BQU0sa0JBQWtCLENBQUMsU0FBUyxFQUFFLCtCQUErQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDbkcsTUFBTSxJQUFJLFNBQVMsQ0FBQztRQUVwQixNQUFNLElBQUksY0FBYyxDQUFDO0lBQzNCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQzNCLElBQW9CLEVBQ3BCLE1BQTBCLEVBQzFCLFNBQWtCLEtBQUssRUFDTixFQUFFO0lBQ25CLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQztJQUU5RCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsUUFBUSxtQkFBbUIsRUFBRSxDQUFDO1FBQzVCLEtBQUssS0FBSztZQUNSLE1BQU0sSUFBSSxpUEFBaVAsQ0FBQztZQUM1UCxNQUFNO1FBQ1I7WUFDRSxNQUFNO0lBQ1YsQ0FBQztJQUVELElBQUksSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLO1FBQUUsTUFBTSxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQztJQUNwRSxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRztRQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7SUFFOUQsNEJBQTRCO0lBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUd0RixDQUFDO0lBRUosTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQStCLENBQUM7SUFFcEgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBR3ZGLENBQUM7SUFFSixNQUFNLElBQUksTUFBTSxlQUFlLENBQzdCLFFBQVEsRUFDUixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDL0MsSUFBSSxFQUNKLE1BQU0sRUFBRSx1QkFBdUIsQ0FDaEMsQ0FBQztJQUNGLE1BQU0sSUFBSSxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sSUFBSSxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUUzRixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ import { CSNInteropRoot } from "@sap/csn-interop-specification";
2
+ import { AnnotationLinkCallbacks } from "./types/index.js";
3
+ export declare function getDescriptionData(props: [string, unknown][], annotationLinkCallbacks: AnnotationLinkCallbacks | undefined, i18n: CSNInteropRoot["i18n"] | undefined, customDescriptionCellDataText?: string): Promise<string>;
4
+ export declare function renderContentWithI18n(content: unknown, i18n: CSNInteropRoot["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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXJVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbmRlcmVyVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLDBGQUEwRjtBQUMxRixtS0FBbUs7QUFDbkssTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsS0FBMEIsRUFDMUIsdUJBQTRELEVBQzVELElBQXdDLEVBQ3hDLDZCQUFzQztJQUV0QyxJQUFJLDZCQUE2QjtRQUFFLE9BQU8sNkJBQTZCLENBQUM7SUFFeEUsTUFBTSxXQUFXLEdBQXdCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRWhFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUVyQixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdEIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVGLENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxD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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.0",
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.3",
44
44
  "commander": "13.1.0",
45
45
  "json-schema-library": "10.0.0-rc7",
46
- "marked": "15.0.7",
46
+ "marked": "15.0.8",
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.24.0",
56
56
  "husky": "9.1.7",
57
57
  "is-ci": "4.1.0",
58
58
  "jest": "29.7.0",
@@ -64,9 +64,9 @@
64
64
  "prettier": "3.5.3",
65
65
  "rimraf": "6.0.1",
66
66
  "tmp": "0.2.3",
67
- "ts-jest": "29.2.6",
67
+ "ts-jest": "29.3.1",
68
68
  "tsx": "4.19.3",
69
- "typescript": "5.8.2"
69
+ "typescript": "5.8.3"
70
70
  },
71
71
  "lint-staged": {
72
72
  "./**/*.{js,ts}": [