md-tech-pdf 0.1.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/LICENSE +176 -0
- package/README.ja.md +330 -0
- package/README.md +315 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +96 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/config-resolver.d.ts +19 -0
- package/dist/config/config-resolver.d.ts.map +1 -0
- package/dist/config/config-resolver.js +41 -0
- package/dist/config/config-resolver.js.map +1 -0
- package/dist/config/document-options.d.ts +52 -0
- package/dist/config/document-options.d.ts.map +1 -0
- package/dist/config/document-options.js +8 -0
- package/dist/config/document-options.js.map +1 -0
- package/dist/config/error.d.ts +12 -0
- package/dist/config/error.d.ts.map +1 -0
- package/dist/config/error.js +12 -0
- package/dist/config/error.js.map +1 -0
- package/dist/config/frontmatter-parser.d.ts +16 -0
- package/dist/config/frontmatter-parser.d.ts.map +1 -0
- package/dist/config/frontmatter-parser.js +271 -0
- package/dist/config/frontmatter-parser.js.map +1 -0
- package/dist/core/converter.d.ts +34 -0
- package/dist/core/converter.d.ts.map +1 -0
- package/dist/core/converter.js +109 -0
- package/dist/core/converter.js.map +1 -0
- package/dist/html/default-style.d.ts +6 -0
- package/dist/html/default-style.d.ts.map +1 -0
- package/dist/html/default-style.js +237 -0
- package/dist/html/default-style.js.map +1 -0
- package/dist/html/google-fonts.d.ts +20 -0
- package/dist/html/google-fonts.d.ts.map +1 -0
- package/dist/html/google-fonts.js +50 -0
- package/dist/html/google-fonts.js.map +1 -0
- package/dist/html/html-builder.d.ts +20 -0
- package/dist/html/html-builder.d.ts.map +1 -0
- package/dist/html/html-builder.js +88 -0
- package/dist/html/html-builder.js.map +1 -0
- package/dist/html/html-renderer.d.ts +25 -0
- package/dist/html/html-renderer.d.ts.map +1 -0
- package/dist/html/html-renderer.js +148 -0
- package/dist/html/html-renderer.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/attributes-parser.d.ts +13 -0
- package/dist/parser/attributes-parser.d.ts.map +1 -0
- package/dist/parser/attributes-parser.js +110 -0
- package/dist/parser/attributes-parser.js.map +1 -0
- package/dist/parser/error.d.ts +15 -0
- package/dist/parser/error.d.ts.map +1 -0
- package/dist/parser/error.js +15 -0
- package/dist/parser/error.js.map +1 -0
- package/dist/parser/markdown-parser.d.ts +17 -0
- package/dist/parser/markdown-parser.d.ts.map +1 -0
- package/dist/parser/markdown-parser.js +86 -0
- package/dist/parser/markdown-parser.js.map +1 -0
- package/dist/pdf/default-options.d.ts +6 -0
- package/dist/pdf/default-options.d.ts.map +1 -0
- package/dist/pdf/default-options.js +12 -0
- package/dist/pdf/default-options.js.map +1 -0
- package/dist/pdf/error.d.ts +9 -0
- package/dist/pdf/error.d.ts.map +1 -0
- package/dist/pdf/error.js +10 -0
- package/dist/pdf/error.js.map +1 -0
- package/dist/pdf/pdf-generator.d.ts +16 -0
- package/dist/pdf/pdf-generator.d.ts.map +1 -0
- package/dist/pdf/pdf-generator.js +95 -0
- package/dist/pdf/pdf-generator.js.map +1 -0
- package/dist/pdf/types.d.ts +16 -0
- package/dist/pdf/types.d.ts.map +1 -0
- package/dist/pdf/types.js +2 -0
- package/dist/pdf/types.js.map +1 -0
- package/dist/renderer/diagram-renderer.d.ts +11 -0
- package/dist/renderer/diagram-renderer.d.ts.map +1 -0
- package/dist/renderer/diagram-renderer.js +2 -0
- package/dist/renderer/diagram-renderer.js.map +1 -0
- package/dist/renderer/error.d.ts +10 -0
- package/dist/renderer/error.d.ts.map +1 -0
- package/dist/renderer/error.js +10 -0
- package/dist/renderer/error.js.map +1 -0
- package/dist/renderer/mermaid-executor.d.ts +16 -0
- package/dist/renderer/mermaid-executor.d.ts.map +1 -0
- package/dist/renderer/mermaid-executor.js +99 -0
- package/dist/renderer/mermaid-executor.js.map +1 -0
- package/dist/renderer/mermaid-renderer.d.ts +25 -0
- package/dist/renderer/mermaid-renderer.d.ts.map +1 -0
- package/dist/renderer/mermaid-renderer.js +35 -0
- package/dist/renderer/mermaid-renderer.js.map +1 -0
- package/dist/renderer/plantuml-executor.d.ts +11 -0
- package/dist/renderer/plantuml-executor.d.ts.map +1 -0
- package/dist/renderer/plantuml-executor.js +100 -0
- package/dist/renderer/plantuml-executor.js.map +1 -0
- package/dist/renderer/plantuml-renderer.d.ts +26 -0
- package/dist/renderer/plantuml-renderer.d.ts.map +1 -0
- package/dist/renderer/plantuml-renderer.js +95 -0
- package/dist/renderer/plantuml-renderer.js.map +1 -0
- package/dist/types/diagram.d.ts +34 -0
- package/dist/types/diagram.d.ts.map +1 -0
- package/dist/types/diagram.js +2 -0
- package/dist/types/diagram.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AAEpC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAK3F"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* md-tech-pdf Core Library
|
|
3
|
+
* Core PDF generation engine decoupled from CLI and editor extensions.
|
|
4
|
+
*/
|
|
5
|
+
export * from './types/diagram.js';
|
|
6
|
+
export * from './parser/error.js';
|
|
7
|
+
export * from './parser/attributes-parser.js';
|
|
8
|
+
export * from './parser/markdown-parser.js';
|
|
9
|
+
export * from './renderer/diagram-renderer.js';
|
|
10
|
+
export * from './renderer/mermaid-renderer.js';
|
|
11
|
+
export * from './renderer/mermaid-executor.js';
|
|
12
|
+
export * from './renderer/plantuml-renderer.js';
|
|
13
|
+
export * from './renderer/plantuml-executor.js';
|
|
14
|
+
export * from './renderer/error.js';
|
|
15
|
+
export * from './html/default-style.js';
|
|
16
|
+
export * from './html/google-fonts.js';
|
|
17
|
+
export * from './html/html-builder.js';
|
|
18
|
+
export * from './html/html-renderer.js';
|
|
19
|
+
export * from './pdf/types.js';
|
|
20
|
+
export * from './pdf/default-options.js';
|
|
21
|
+
export * from './pdf/error.js';
|
|
22
|
+
export * from './pdf/pdf-generator.js';
|
|
23
|
+
export * from './config/document-options.js';
|
|
24
|
+
export * from './config/error.js';
|
|
25
|
+
export * from './config/frontmatter-parser.js';
|
|
26
|
+
export * from './config/config-resolver.js';
|
|
27
|
+
export * from './core/converter.js';
|
|
28
|
+
/**
|
|
29
|
+
* Entry point for document generation in Core.
|
|
30
|
+
* PDF generation logic and diagram processing will be implemented here.
|
|
31
|
+
*/
|
|
32
|
+
export async function generatePdf(_options = {}) {
|
|
33
|
+
return {
|
|
34
|
+
success: true,
|
|
35
|
+
message: 'Core generator initialized.',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AAYpC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAA6B,EAAE;IAC/D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,6BAA6B;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DiagramOptions, RawDiagramOptions } from '../types/diagram.js';
|
|
2
|
+
export declare const ALLOWED_UNITS: readonly ["px", "mm", "cm", "in", "%"];
|
|
3
|
+
/**
|
|
4
|
+
* Parses raw diagram attributes without filling default values.
|
|
5
|
+
* Unspecified properties remain undefined.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseRawAttributes(attributesString?: string): RawDiagramOptions;
|
|
8
|
+
/**
|
|
9
|
+
* Parses an attribute string such as 'width=160mm height=80mm fit=contain align=center',
|
|
10
|
+
* returning resolved diagram options with built-in defaults applied.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseAttributes(attributesString?: string): DiagramOptions;
|
|
13
|
+
//# sourceMappingURL=attributes-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes-parser.d.ts","sourceRoot":"","sources":["../../src/parser/attributes-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,cAAc,EACd,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,aAAa,wCAAyC,CAAC;AA8DpE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,iBAAiB,CA0D/E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,cAAc,CAGzE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { resolveDiagramOptions } from '../config/config-resolver.js';
|
|
2
|
+
import { DiagramParseError } from './error.js';
|
|
3
|
+
export const ALLOWED_UNITS = ['px', 'mm', 'cm', 'in', '%'];
|
|
4
|
+
const VALID_DIMENSION_REGEX = /^(\d+(?:\.\d+)?)(px|mm|cm|in|%)$/;
|
|
5
|
+
const VALID_FITS = ['contain', 'fill'];
|
|
6
|
+
const VALID_ALIGNS = ['left', 'center', 'right'];
|
|
7
|
+
function validateDimension(attributeName, rawValue) {
|
|
8
|
+
const value = rawValue.trim();
|
|
9
|
+
if (value === 'auto') {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
const match = value.match(VALID_DIMENSION_REGEX);
|
|
13
|
+
if (!match) {
|
|
14
|
+
throw new DiagramParseError(`Invalid diagram ${attributeName}: "${value}"`, {
|
|
15
|
+
attributeName,
|
|
16
|
+
invalidValue: value,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const numericValue = parseFloat(match[1]);
|
|
20
|
+
if (numericValue <= 0) {
|
|
21
|
+
throw new DiagramParseError(`Invalid diagram ${attributeName}: "${value}". Value must be greater than 0.`, {
|
|
22
|
+
attributeName,
|
|
23
|
+
invalidValue: value,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function validateFit(rawValue) {
|
|
29
|
+
const value = rawValue.trim();
|
|
30
|
+
if (!VALID_FITS.includes(value)) {
|
|
31
|
+
throw new DiagramParseError(`Invalid diagram fit: "${rawValue.trim()}". Expected "contain" or "fill".`, {
|
|
32
|
+
attributeName: 'fit',
|
|
33
|
+
invalidValue: rawValue.trim(),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
function validateAlign(rawValue) {
|
|
39
|
+
const value = rawValue.trim();
|
|
40
|
+
if (!VALID_ALIGNS.includes(value)) {
|
|
41
|
+
throw new DiagramParseError(`Invalid diagram align: "${rawValue.trim()}". Expected "left", "center", or "right".`, {
|
|
42
|
+
attributeName: 'align',
|
|
43
|
+
invalidValue: rawValue.trim(),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parses raw diagram attributes without filling default values.
|
|
50
|
+
* Unspecified properties remain undefined.
|
|
51
|
+
*/
|
|
52
|
+
export function parseRawAttributes(attributesString) {
|
|
53
|
+
const options = {};
|
|
54
|
+
if (!attributesString || attributesString.trim() === '') {
|
|
55
|
+
return options;
|
|
56
|
+
}
|
|
57
|
+
const trimmed = attributesString.trim();
|
|
58
|
+
// Match key=value pairs with optional single/double quotes
|
|
59
|
+
const pairRegex = /([a-zA-Z0-9_-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s,}]+))/g;
|
|
60
|
+
let match;
|
|
61
|
+
let lastIndex = 0;
|
|
62
|
+
while ((match = pairRegex.exec(trimmed)) !== null) {
|
|
63
|
+
// Check if there were unexpected characters between matches
|
|
64
|
+
const skipped = trimmed.slice(lastIndex, match.index).trim();
|
|
65
|
+
if (skipped !== '' && skipped !== ',') {
|
|
66
|
+
throw new DiagramParseError(`Invalid syntax in diagram attributes: "${skipped}"`, {
|
|
67
|
+
invalidValue: skipped,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const key = match[1].toLowerCase();
|
|
71
|
+
const rawVal = match[2] ?? match[3] ?? match[4];
|
|
72
|
+
switch (key) {
|
|
73
|
+
case 'width':
|
|
74
|
+
options.width = validateDimension('width', rawVal);
|
|
75
|
+
break;
|
|
76
|
+
case 'height':
|
|
77
|
+
options.height = validateDimension('height', rawVal);
|
|
78
|
+
break;
|
|
79
|
+
case 'fit':
|
|
80
|
+
options.fit = validateFit(rawVal);
|
|
81
|
+
break;
|
|
82
|
+
case 'align':
|
|
83
|
+
options.align = validateAlign(rawVal);
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
throw new DiagramParseError(`Unknown diagram attribute: "${match[1]}"`, {
|
|
87
|
+
attributeName: match[1],
|
|
88
|
+
invalidValue: rawVal,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
lastIndex = pairRegex.lastIndex;
|
|
92
|
+
}
|
|
93
|
+
// Check remaining trailing content
|
|
94
|
+
const remaining = trimmed.slice(lastIndex).trim();
|
|
95
|
+
if (remaining !== '' && remaining !== ',') {
|
|
96
|
+
throw new DiagramParseError(`Invalid syntax in diagram attributes: "${remaining}"`, {
|
|
97
|
+
invalidValue: remaining,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return options;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parses an attribute string such as 'width=160mm height=80mm fit=contain align=center',
|
|
104
|
+
* returning resolved diagram options with built-in defaults applied.
|
|
105
|
+
*/
|
|
106
|
+
export function parseAttributes(attributesString) {
|
|
107
|
+
const rawOptions = parseRawAttributes(attributesString);
|
|
108
|
+
return resolveDiagramOptions(rawOptions);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=attributes-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes-parser.js","sourceRoot":"","sources":["../../src/parser/attributes-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DiagramType } from '../types/diagram.js';
|
|
2
|
+
export interface DiagramErrorDetails {
|
|
3
|
+
line?: number;
|
|
4
|
+
diagramType?: DiagramType;
|
|
5
|
+
attributeName?: string;
|
|
6
|
+
invalidValue?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class DiagramParseError extends Error {
|
|
9
|
+
readonly line?: number;
|
|
10
|
+
readonly diagramType?: DiagramType;
|
|
11
|
+
readonly attributeName?: string;
|
|
12
|
+
readonly invalidValue?: string;
|
|
13
|
+
constructor(message: string, details?: DiagramErrorDetails);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/parser/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;CAQ3D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class DiagramParseError extends Error {
|
|
2
|
+
line;
|
|
3
|
+
diagramType;
|
|
4
|
+
attributeName;
|
|
5
|
+
invalidValue;
|
|
6
|
+
constructor(message, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'DiagramParseError';
|
|
9
|
+
this.line = details?.line;
|
|
10
|
+
this.diagramType = details?.diagramType;
|
|
11
|
+
this.attributeName = details?.attributeName;
|
|
12
|
+
this.invalidValue = details?.invalidValue;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/parser/error.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAU;IACd,WAAW,CAAe;IAC1B,aAAa,CAAU;IACvB,YAAY,CAAU;IAE/B,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DiagramDefaultOptions, DocumentOptions } from '../config/document-options.js';
|
|
2
|
+
import type { DiagramBlock } from '../types/diagram.js';
|
|
3
|
+
export interface ParsedMarkdown {
|
|
4
|
+
content: string;
|
|
5
|
+
options: DocumentOptions;
|
|
6
|
+
diagrams: DiagramBlock[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extracts Mermaid and PlantUML diagram blocks from a Markdown string.
|
|
10
|
+
* Resolves diagram options against provided default options (e.g. from Front Matter).
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractDiagramBlocks(source: string, defaultOptions?: DiagramDefaultOptions): DiagramBlock[];
|
|
13
|
+
/**
|
|
14
|
+
* Parses Markdown source, extracts Front Matter options, and returns structured document information.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseMarkdown(source: string): ParsedMarkdown;
|
|
17
|
+
//# sourceMappingURL=markdown-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/parser/markdown-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE5F,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,qBAAqB,GACrC,YAAY,EAAE,CAyEhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAQ5D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import MarkdownIt from 'markdown-it';
|
|
2
|
+
import { resolveDiagramOptions } from '../config/config-resolver.js';
|
|
3
|
+
import { parseFrontMatter } from '../config/frontmatter-parser.js';
|
|
4
|
+
import { parseRawAttributes } from './attributes-parser.js';
|
|
5
|
+
import { DiagramParseError } from './error.js';
|
|
6
|
+
const SUPPORTED_DIAGRAM_TYPES = ['mermaid', 'plantuml'];
|
|
7
|
+
/**
|
|
8
|
+
* Extracts Mermaid and PlantUML diagram blocks from a Markdown string.
|
|
9
|
+
* Resolves diagram options against provided default options (e.g. from Front Matter).
|
|
10
|
+
*/
|
|
11
|
+
export function extractDiagramBlocks(source, defaultOptions) {
|
|
12
|
+
const md = new MarkdownIt();
|
|
13
|
+
const tokens = md.parse(source, {});
|
|
14
|
+
const diagrams = [];
|
|
15
|
+
for (const token of tokens) {
|
|
16
|
+
if (token.type !== 'fence') {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const info = token.info.trim();
|
|
20
|
+
if (!info) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
// Match language tag and optional attributes block inside {...}
|
|
24
|
+
const match = info.match(/^([a-zA-Z0-9_-]+)(.*)$/);
|
|
25
|
+
if (!match) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const lang = match[1].toLowerCase();
|
|
29
|
+
if (!SUPPORTED_DIAGRAM_TYPES.includes(lang)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const line = token.map ? token.map[0] + 1 : undefined;
|
|
33
|
+
const rawRest = match[2].trim();
|
|
34
|
+
let attributesString;
|
|
35
|
+
if (rawRest !== '') {
|
|
36
|
+
if (rawRest.startsWith('{') && rawRest.endsWith('}')) {
|
|
37
|
+
attributesString = rawRest.slice(1, -1).trim();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new DiagramParseError(`Invalid attribute syntax for ${lang} diagram. Expected {...} block, got: "${rawRest}"`, {
|
|
41
|
+
line,
|
|
42
|
+
diagramType: lang,
|
|
43
|
+
invalidValue: rawRest,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const rawOptions = parseRawAttributes(attributesString);
|
|
49
|
+
const options = resolveDiagramOptions(rawOptions, defaultOptions);
|
|
50
|
+
// Remove trailing single newline if present while preserving internal newlines and indentations
|
|
51
|
+
const cleanSource = token.content.replace(/\r?\n$/, '');
|
|
52
|
+
diagrams.push({
|
|
53
|
+
type: lang,
|
|
54
|
+
source: cleanSource,
|
|
55
|
+
options,
|
|
56
|
+
rawOptions,
|
|
57
|
+
line,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err instanceof DiagramParseError) {
|
|
62
|
+
throw new DiagramParseError(err.message, {
|
|
63
|
+
line,
|
|
64
|
+
diagramType: lang,
|
|
65
|
+
attributeName: err.attributeName,
|
|
66
|
+
invalidValue: err.invalidValue,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return diagrams;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parses Markdown source, extracts Front Matter options, and returns structured document information.
|
|
76
|
+
*/
|
|
77
|
+
export function parseMarkdown(source) {
|
|
78
|
+
const { content, options } = parseFrontMatter(source);
|
|
79
|
+
const diagrams = extractDiagramBlocks(content, options.diagram);
|
|
80
|
+
return {
|
|
81
|
+
content,
|
|
82
|
+
options,
|
|
83
|
+
diagrams,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=markdown-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/parser/markdown-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PdfMargin, PdfOptions } from './types.js';
|
|
2
|
+
export interface DefaultPdfOptions extends Required<Omit<PdfOptions, 'margin'>> {
|
|
3
|
+
margin: Required<PdfMargin>;
|
|
4
|
+
}
|
|
5
|
+
export declare const DEFAULT_PDF_OPTIONS: Readonly<DefaultPdfOptions>;
|
|
6
|
+
//# sourceMappingURL=default-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-options.d.ts","sourceRoot":"","sources":["../../src/pdf/default-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7E,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,iBAAiB,CAU3D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-options.js","sourceRoot":"","sources":["../../src/pdf/default-options.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE;QACN,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;KACb;IACD,eAAe,EAAE,IAAI;CACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/pdf/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/pdf/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PdfGeneratorInterface, PdfOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates PDF documents from HTML strings using Playwright Chromium.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PdfGenerator implements PdfGeneratorInterface {
|
|
6
|
+
/**
|
|
7
|
+
* Generates a PDF file from an HTML string.
|
|
8
|
+
*
|
|
9
|
+
* @param html HTML string to render
|
|
10
|
+
* @param outputPath Path where the generated PDF will be saved
|
|
11
|
+
* @param options PDF rendering options
|
|
12
|
+
* @throws {PdfGenerateError} When validation fails or PDF generation fails
|
|
13
|
+
*/
|
|
14
|
+
generate(html: string, outputPath: string, options?: PdfOptions): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=pdf-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../../src/pdf/pdf-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpE;;GAEG;AACH,qBAAa,YAAa,YAAW,qBAAqB;IACxD;;;;;;;OAOG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAsFtF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { chromium } from 'playwright';
|
|
4
|
+
import { DEFAULT_PDF_OPTIONS } from './default-options.js';
|
|
5
|
+
import { PdfGenerateError } from './error.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generates PDF documents from HTML strings using Playwright Chromium.
|
|
8
|
+
*/
|
|
9
|
+
export class PdfGenerator {
|
|
10
|
+
/**
|
|
11
|
+
* Generates a PDF file from an HTML string.
|
|
12
|
+
*
|
|
13
|
+
* @param html HTML string to render
|
|
14
|
+
* @param outputPath Path where the generated PDF will be saved
|
|
15
|
+
* @param options PDF rendering options
|
|
16
|
+
* @throws {PdfGenerateError} When validation fails or PDF generation fails
|
|
17
|
+
*/
|
|
18
|
+
async generate(html, outputPath, options) {
|
|
19
|
+
if (!html || html.trim() === '') {
|
|
20
|
+
throw new PdfGenerateError('HTML content must not be empty.');
|
|
21
|
+
}
|
|
22
|
+
if (!outputPath || outputPath.trim() === '') {
|
|
23
|
+
throw new PdfGenerateError('Output path must not be empty.');
|
|
24
|
+
}
|
|
25
|
+
const resolvedOutputPath = path.resolve(outputPath);
|
|
26
|
+
const outputDir = path.dirname(resolvedOutputPath);
|
|
27
|
+
try {
|
|
28
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
throw new PdfGenerateError(`Failed to create output directory: ${outputDir}`, {
|
|
32
|
+
cause: err,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const mergedOptions = {
|
|
36
|
+
format: options?.format ?? DEFAULT_PDF_OPTIONS.format,
|
|
37
|
+
landscape: options?.landscape ?? DEFAULT_PDF_OPTIONS.landscape,
|
|
38
|
+
printBackground: options?.printBackground ?? DEFAULT_PDF_OPTIONS.printBackground,
|
|
39
|
+
margin: {
|
|
40
|
+
top: options?.margin?.top ?? DEFAULT_PDF_OPTIONS.margin.top,
|
|
41
|
+
right: options?.margin?.right ?? DEFAULT_PDF_OPTIONS.margin.right,
|
|
42
|
+
bottom: options?.margin?.bottom ?? DEFAULT_PDF_OPTIONS.margin.bottom,
|
|
43
|
+
left: options?.margin?.left ?? DEFAULT_PDF_OPTIONS.margin.left,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
let browser;
|
|
47
|
+
try {
|
|
48
|
+
browser = await chromium.launch({
|
|
49
|
+
headless: true,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
throw new PdfGenerateError('Failed to launch Chromium browser.', { cause: err });
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const page = await browser.newPage();
|
|
57
|
+
await page.setContent(html, {
|
|
58
|
+
waitUntil: 'load',
|
|
59
|
+
});
|
|
60
|
+
// Wait for web fonts (e.g. Google Fonts) to be fully loaded before rendering PDF
|
|
61
|
+
try {
|
|
62
|
+
await Promise.race([
|
|
63
|
+
page.evaluate(async () => {
|
|
64
|
+
const doc = globalThis.document;
|
|
65
|
+
if (doc?.fonts?.ready) {
|
|
66
|
+
await doc.fonts.ready;
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Font loading timed out')), 5000)),
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// If web font loading fails or times out, fallback fonts are used
|
|
74
|
+
}
|
|
75
|
+
await page.pdf({
|
|
76
|
+
path: resolvedOutputPath,
|
|
77
|
+
format: mergedOptions.format,
|
|
78
|
+
landscape: mergedOptions.landscape,
|
|
79
|
+
printBackground: mergedOptions.printBackground,
|
|
80
|
+
margin: mergedOptions.margin,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
throw new PdfGenerateError(`Failed to generate PDF at ${resolvedOutputPath}`, {
|
|
85
|
+
cause: err,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await browser.close().catch(() => {
|
|
90
|
+
// Suppress errors during cleanup
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=pdf-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../../src/pdf/pdf-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface PdfMargin {
|
|
2
|
+
top?: string;
|
|
3
|
+
right?: string;
|
|
4
|
+
bottom?: string;
|
|
5
|
+
left?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface PdfOptions {
|
|
8
|
+
format?: 'A4';
|
|
9
|
+
landscape?: boolean;
|
|
10
|
+
margin?: PdfMargin;
|
|
11
|
+
printBackground?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface PdfGeneratorInterface {
|
|
14
|
+
generate(html: string, outputPath: string, options?: PdfOptions): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pdf/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pdf/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DiagramRenderOptions {
|
|
2
|
+
theme?: string;
|
|
3
|
+
backgroundColor?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Common interface for diagram renderers (e.g. Mermaid, PlantUML, Graphviz).
|
|
7
|
+
*/
|
|
8
|
+
export interface DiagramRenderer {
|
|
9
|
+
render(source: string, options?: DiagramRenderOptions): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=diagram-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/diagram-renderer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-renderer.js","sourceRoot":"","sources":["../../src/renderer/diagram-renderer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface DiagramRenderErrorOptions {
|
|
2
|
+
cause?: unknown;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when rendering a diagram fails.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DiagramRenderError extends Error {
|
|
8
|
+
constructor(message: string, options?: DiagramRenderErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/renderer/error.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;CAIjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/renderer/error.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe,EAAE,OAAmC;QAC9D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface MermaidExecutionOptions {
|
|
2
|
+
theme?: string;
|
|
3
|
+
backgroundColor?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the path to the mmdc script or binary.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveMmdcPath(): {
|
|
9
|
+
command: string;
|
|
10
|
+
argsPrefix: string[];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Executes Mermaid CLI via stdin/stdout streams entirely in memory.
|
|
14
|
+
*/
|
|
15
|
+
export declare function executeMermaidCli(source: string, options?: MermaidExecutionOptions): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=mermaid-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid-executor.d.ts","sourceRoot":"","sources":["../../src/renderer/mermaid-executor.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CA+B3E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC,CA6EjB"}
|