@arslankhan/doc-forge 0.0.0-stage → 0.1.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/CHANGELOG.md +11 -0
- package/LICENSE +13 -0
- package/LICENSING.md +80 -0
- package/README.md +547 -2
- package/RELEASE.md +50 -0
- package/dist/binding-path.d.ts +15 -0
- package/dist/binding-path.d.ts.map +1 -0
- package/dist/binding-path.js +37 -0
- package/dist/binding-path.js.map +1 -0
- package/dist/binding.d.ts +91 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +229 -0
- package/dist/binding.js.map +1 -0
- package/dist/designer/Canvas.d.ts +51 -0
- package/dist/designer/Canvas.d.ts.map +1 -0
- package/dist/designer/Canvas.js +188 -0
- package/dist/designer/Canvas.js.map +1 -0
- package/dist/designer/DocumentDesigner.d.ts +14 -0
- package/dist/designer/DocumentDesigner.d.ts.map +1 -0
- package/dist/designer/DocumentDesigner.js +351 -0
- package/dist/designer/DocumentDesigner.js.map +1 -0
- package/dist/designer/HtmlPreview.d.ts +9 -0
- package/dist/designer/HtmlPreview.d.ts.map +1 -0
- package/dist/designer/HtmlPreview.js +20 -0
- package/dist/designer/HtmlPreview.js.map +1 -0
- package/dist/designer/ImageBindingFields.d.ts +11 -0
- package/dist/designer/ImageBindingFields.d.ts.map +1 -0
- package/dist/designer/ImageBindingFields.js +106 -0
- package/dist/designer/ImageBindingFields.js.map +1 -0
- package/dist/designer/InvoiceFields.d.ts +13 -0
- package/dist/designer/InvoiceFields.d.ts.map +1 -0
- package/dist/designer/InvoiceFields.js +85 -0
- package/dist/designer/InvoiceFields.js.map +1 -0
- package/dist/designer/PreviewDataDialog.d.ts +13 -0
- package/dist/designer/PreviewDataDialog.d.ts.map +1 -0
- package/dist/designer/PreviewDataDialog.js +16 -0
- package/dist/designer/PreviewDataDialog.js.map +1 -0
- package/dist/designer/PropertiesPanel.d.ts +15 -0
- package/dist/designer/PropertiesPanel.d.ts.map +1 -0
- package/dist/designer/PropertiesPanel.js +63 -0
- package/dist/designer/PropertiesPanel.js.map +1 -0
- package/dist/designer/ReportFields.d.ts +14 -0
- package/dist/designer/ReportFields.d.ts.map +1 -0
- package/dist/designer/ReportFields.js +257 -0
- package/dist/designer/ReportFields.js.map +1 -0
- package/dist/designer/StyleFields.d.ts +16 -0
- package/dist/designer/StyleFields.d.ts.map +1 -0
- package/dist/designer/StyleFields.js +138 -0
- package/dist/designer/StyleFields.js.map +1 -0
- package/dist/designer/TextBindingFields.d.ts +11 -0
- package/dist/designer/TextBindingFields.d.ts.map +1 -0
- package/dist/designer/TextBindingFields.js +105 -0
- package/dist/designer/TextBindingFields.js.map +1 -0
- package/dist/designer/Toolbar.d.ts +52 -0
- package/dist/designer/Toolbar.d.ts.map +1 -0
- package/dist/designer/Toolbar.js +62 -0
- package/dist/designer/Toolbar.js.map +1 -0
- package/dist/designer/Toolbox.d.ts +8 -0
- package/dist/designer/Toolbox.d.ts.map +1 -0
- package/dist/designer/Toolbox.js +43 -0
- package/dist/designer/Toolbox.js.map +1 -0
- package/dist/designer/border-preview.d.ts +15 -0
- package/dist/designer/border-preview.d.ts.map +1 -0
- package/dist/designer/border-preview.js +34 -0
- package/dist/designer/border-preview.js.map +1 -0
- package/dist/designer/history.d.ts +13 -0
- package/dist/designer/history.d.ts.map +1 -0
- package/dist/designer/history.js +51 -0
- package/dist/designer/history.js.map +1 -0
- package/dist/designer/index.d.ts +5 -0
- package/dist/designer/index.d.ts.map +1 -0
- package/dist/designer/index.js +3 -0
- package/dist/designer/index.js.map +1 -0
- package/dist/designer/page-geometry.d.ts +35 -0
- package/dist/designer/page-geometry.d.ts.map +1 -0
- package/dist/designer/page-geometry.js +123 -0
- package/dist/designer/page-geometry.js.map +1 -0
- package/dist/designer/styles.d.ts +3 -0
- package/dist/designer/styles.d.ts.map +1 -0
- package/dist/designer/styles.js +594 -0
- package/dist/designer/styles.js.map +1 -0
- package/dist/designer/template-edits.d.ts +26 -0
- package/dist/designer/template-edits.d.ts.map +1 -0
- package/dist/designer/template-edits.js +323 -0
- package/dist/designer/template-edits.js.map +1 -0
- package/dist/designer/theme.d.ts +31 -0
- package/dist/designer/theme.d.ts.map +1 -0
- package/dist/designer/theme.js +92 -0
- package/dist/designer/theme.js.map +1 -0
- package/dist/examples/bound-invoice.d.ts +143 -0
- package/dist/examples/bound-invoice.d.ts.map +1 -0
- package/dist/examples/bound-invoice.js +99 -0
- package/dist/examples/bound-invoice.js.map +1 -0
- package/dist/examples/full-invoice-data.d.ts +81 -0
- package/dist/examples/full-invoice-data.d.ts.map +1 -0
- package/dist/examples/full-invoice-data.js +86 -0
- package/dist/examples/full-invoice-data.js.map +1 -0
- package/dist/examples/full-invoice.d.ts +402 -0
- package/dist/examples/full-invoice.d.ts.map +1 -0
- package/dist/examples/full-invoice.js +199 -0
- package/dist/examples/full-invoice.js.map +1 -0
- package/dist/examples/invoice-data.d.ts +51 -0
- package/dist/examples/invoice-data.d.ts.map +1 -0
- package/dist/examples/invoice-data.js +51 -0
- package/dist/examples/invoice-data.js.map +1 -0
- package/dist/examples/invoice.d.ts +90 -0
- package/dist/examples/invoice.d.ts.map +1 -0
- package/dist/examples/invoice.js +62 -0
- package/dist/examples/invoice.js.map +1 -0
- package/dist/examples/jobs-report-data.d.ts +84 -0
- package/dist/examples/jobs-report-data.d.ts.map +1 -0
- package/dist/examples/jobs-report-data.js +79 -0
- package/dist/examples/jobs-report-data.js.map +1 -0
- package/dist/examples/jobs-report.d.ts +182 -0
- package/dist/examples/jobs-report.d.ts.map +1 -0
- package/dist/examples/jobs-report.js +96 -0
- package/dist/examples/jobs-report.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/invoice/calculate.d.ts +59 -0
- package/dist/invoice/calculate.d.ts.map +1 -0
- package/dist/invoice/calculate.js +270 -0
- package/dist/invoice/calculate.js.map +1 -0
- package/dist/invoice/context.d.ts +15 -0
- package/dist/invoice/context.d.ts.map +1 -0
- package/dist/invoice/context.js +79 -0
- package/dist/invoice/context.js.map +1 -0
- package/dist/invoice/format.d.ts +10 -0
- package/dist/invoice/format.d.ts.map +1 -0
- package/dist/invoice/format.js +95 -0
- package/dist/invoice/format.js.map +1 -0
- package/dist/license/capabilities.d.ts +17 -0
- package/dist/license/capabilities.d.ts.map +1 -0
- package/dist/license/capabilities.js +46 -0
- package/dist/license/capabilities.js.map +1 -0
- package/dist/license/client.d.ts +109 -0
- package/dist/license/client.d.ts.map +1 -0
- package/dist/license/client.js +346 -0
- package/dist/license/client.js.map +1 -0
- package/dist/license/codec.d.ts +5 -0
- package/dist/license/codec.d.ts.map +1 -0
- package/dist/license/codec.js +26 -0
- package/dist/license/codec.js.map +1 -0
- package/dist/license/errors.d.ts +11 -0
- package/dist/license/errors.d.ts.map +1 -0
- package/dist/license/errors.js +19 -0
- package/dist/license/errors.js.map +1 -0
- package/dist/license/features.d.ts +20 -0
- package/dist/license/features.d.ts.map +1 -0
- package/dist/license/features.js +28 -0
- package/dist/license/features.js.map +1 -0
- package/dist/license/index.d.ts +16 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +9 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/provider.d.ts +59 -0
- package/dist/license/provider.d.ts.map +1 -0
- package/dist/license/provider.js +150 -0
- package/dist/license/provider.js.map +1 -0
- package/dist/license/redact.d.ts +4 -0
- package/dist/license/redact.d.ts.map +1 -0
- package/dist/license/redact.js +15 -0
- package/dist/license/redact.js.map +1 -0
- package/dist/license/store.d.ts +26 -0
- package/dist/license/store.d.ts.map +1 -0
- package/dist/license/store.js +90 -0
- package/dist/license/store.js.map +1 -0
- package/dist/license/token.d.ts +45 -0
- package/dist/license/token.d.ts.map +1 -0
- package/dist/license/token.js +195 -0
- package/dist/license/token.js.map +1 -0
- package/dist/pdf/browser-blocked.d.ts +12 -0
- package/dist/pdf/browser-blocked.d.ts.map +1 -0
- package/dist/pdf/browser-blocked.js +25 -0
- package/dist/pdf/browser-blocked.js.map +1 -0
- package/dist/pdf/browser.d.ts +12 -0
- package/dist/pdf/browser.d.ts.map +1 -0
- package/dist/pdf/browser.js +69 -0
- package/dist/pdf/browser.js.map +1 -0
- package/dist/pdf/errors.d.ts +6 -0
- package/dist/pdf/errors.d.ts.map +1 -0
- package/dist/pdf/errors.js +11 -0
- package/dist/pdf/errors.js.map +1 -0
- package/dist/pdf/index.d.ts +10 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +9 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/options.d.ts +143 -0
- package/dist/pdf/options.d.ts.map +1 -0
- package/dist/pdf/options.js +322 -0
- package/dist/pdf/options.js.map +1 -0
- package/dist/pdf/render-pdf.d.ts +13 -0
- package/dist/pdf/render-pdf.d.ts.map +1 -0
- package/dist/pdf/render-pdf.js +195 -0
- package/dist/pdf/render-pdf.js.map +1 -0
- package/dist/render/appearance.d.ts +25 -0
- package/dist/render/appearance.d.ts.map +1 -0
- package/dist/render/appearance.js +149 -0
- package/dist/render/appearance.js.map +1 -0
- package/dist/render/css.d.ts +17 -0
- package/dist/render/css.d.ts.map +1 -0
- package/dist/render/css.js +170 -0
- package/dist/render/css.js.map +1 -0
- package/dist/render/errors.d.ts +6 -0
- package/dist/render/errors.d.ts.map +1 -0
- package/dist/render/errors.js +11 -0
- package/dist/render/errors.js.map +1 -0
- package/dist/render/escape.d.ts +7 -0
- package/dist/render/escape.d.ts.map +1 -0
- package/dist/render/escape.js +27 -0
- package/dist/render/escape.js.map +1 -0
- package/dist/render/image-policy.d.ts +21 -0
- package/dist/render/image-policy.d.ts.map +1 -0
- package/dist/render/image-policy.js +62 -0
- package/dist/render/image-policy.js.map +1 -0
- package/dist/render/render-html.d.ts +28 -0
- package/dist/render/render-html.d.ts.map +1 -0
- package/dist/render/render-html.js +364 -0
- package/dist/render/render-html.js.map +1 -0
- package/dist/render/render-report.d.ts +23 -0
- package/dist/render/render-report.d.ts.map +1 -0
- package/dist/render/render-report.js +313 -0
- package/dist/render/render-report.js.map +1 -0
- package/dist/report/process.d.ts +48 -0
- package/dist/report/process.d.ts.map +1 -0
- package/dist/report/process.js +347 -0
- package/dist/report/process.js.map +1 -0
- package/dist/schema.d.ts +30 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +8 -0
- package/dist/schema.js.map +1 -0
- package/dist/serialize.d.ts +13 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +42 -0
- package/dist/serialize.js.map +1 -0
- package/dist/types.d.ts +335 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +40 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +15 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +977 -0
- package/dist/validate.js.map +1 -0
- package/package.json +105 -4
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { resolveBinding } from "../binding.js";
|
|
2
|
+
/**
|
|
3
|
+
* Style precedence for one report cell, from lowest to highest:
|
|
4
|
+
* 1. Table text defaults from `element.style` (color, font, vertical alignment).
|
|
5
|
+
* 2. Role defaults: header, group, subtotal, and grand total.
|
|
6
|
+
* 3. Role style: `headerStyle`, `bodyStyle`, `groupStyle`, `subtotalStyle`, or `grandTotalStyle`.
|
|
7
|
+
* 4. Zebra background for record rows that do not already set a background.
|
|
8
|
+
* 5. The first matching `rowRules` entry, for record rows only.
|
|
9
|
+
* 6. Column `headerStyle` or `style`, then the column's `align` when text alignment is still unset.
|
|
10
|
+
*
|
|
11
|
+
* A later layer replaces only the properties it sets. Padding edges and border sides merge per edge.
|
|
12
|
+
*/
|
|
13
|
+
export function reportCellStyle(element, column, kind, record, stripe) {
|
|
14
|
+
const tableText = {
|
|
15
|
+
color: element.style?.color,
|
|
16
|
+
fontFamily: element.style?.fontFamily,
|
|
17
|
+
fontSize: element.style?.fontSize,
|
|
18
|
+
fontStyle: element.style?.fontStyle,
|
|
19
|
+
fontWeight: element.style?.fontWeight,
|
|
20
|
+
verticalAlign: element.style?.verticalAlign,
|
|
21
|
+
textDecoration: element.style?.textDecoration,
|
|
22
|
+
};
|
|
23
|
+
const tableBorder = borderSlice(element.style);
|
|
24
|
+
if (kind === "header") {
|
|
25
|
+
return withAlign(mergeStyles(tableText, tableBorder, { fontWeight: "bold", backgroundColor: "#f4f6f8" }, element.headerStyle, column?.headerStyle), column?.headerStyle?.textAlign ?? column?.align);
|
|
26
|
+
}
|
|
27
|
+
if (kind === "group") {
|
|
28
|
+
return mergeStyles(tableText, { fontWeight: "bold", backgroundColor: "#eef3f8" }, element.groupStyle);
|
|
29
|
+
}
|
|
30
|
+
if (kind === "subtotal") {
|
|
31
|
+
return withAlign(mergeStyles(tableText, tableBorder, { fontWeight: "bold" }, element.subtotalStyle), column?.align);
|
|
32
|
+
}
|
|
33
|
+
if (kind === "grand") {
|
|
34
|
+
return withAlign(mergeStyles(tableText, tableBorder, { fontWeight: "bold" }, element.grandTotalStyle), column?.align);
|
|
35
|
+
}
|
|
36
|
+
const row = mergeStyles(tableText, tableBorder, element.bodyStyle);
|
|
37
|
+
const striped = stripe && row.backgroundColor === undefined ? mergeStyles(row, { backgroundColor: stripe }) : row;
|
|
38
|
+
const ruled = mergeStyles(striped, matchingRuleStyle(element.rowRules, record));
|
|
39
|
+
return withAlign(mergeStyles(ruled, column?.style), column?.style?.textAlign ?? column?.align);
|
|
40
|
+
}
|
|
41
|
+
export function stripeColor(element, recordIndex) {
|
|
42
|
+
if (element.stripeRows === false) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
if (recordIndex % 2 === 0) {
|
|
46
|
+
return element.evenRowColor ?? element.alternateRowColor;
|
|
47
|
+
}
|
|
48
|
+
return element.oddRowColor;
|
|
49
|
+
}
|
|
50
|
+
/** Later layers replace earlier ones. Nested padding and border edges merge. */
|
|
51
|
+
export function mergeStyles(...layers) {
|
|
52
|
+
const result = {};
|
|
53
|
+
for (const layer of layers) {
|
|
54
|
+
if (!layer) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
for (const key of Object.keys(layer)) {
|
|
58
|
+
const value = layer[key];
|
|
59
|
+
if (value === undefined) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (key === "padding") {
|
|
63
|
+
result.padding = { ...result.padding, ...value };
|
|
64
|
+
}
|
|
65
|
+
else if (key === "borderTop" || key === "borderRight" || key === "borderBottom" || key === "borderLeft") {
|
|
66
|
+
result[key] = { ...result[key], ...value };
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
Object.assign(result, { [key]: value });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
function withAlign(style, align) {
|
|
76
|
+
if (style.textAlign !== undefined || align === undefined) {
|
|
77
|
+
return style;
|
|
78
|
+
}
|
|
79
|
+
return { ...style, textAlign: align };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Border fields for a table cell.
|
|
83
|
+
* An overlay such as a header style replaces only the border fields it sets.
|
|
84
|
+
*/
|
|
85
|
+
export function cellBorderStyle(base, overlay) {
|
|
86
|
+
return mergeStyles(borderSlice(base), borderSlice(overlay));
|
|
87
|
+
}
|
|
88
|
+
function borderSlice(style) {
|
|
89
|
+
if (!style) {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
borderColor: style.borderColor,
|
|
94
|
+
borderWidth: style.borderWidth,
|
|
95
|
+
borderStyle: style.borderStyle,
|
|
96
|
+
borderTop: style.borderTop,
|
|
97
|
+
borderRight: style.borderRight,
|
|
98
|
+
borderBottom: style.borderBottom,
|
|
99
|
+
borderLeft: style.borderLeft,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function matchingRuleStyle(rules, record) {
|
|
103
|
+
if (!rules || !record) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
for (const rule of rules) {
|
|
107
|
+
if (ruleMatches(rule, record)) {
|
|
108
|
+
return rule.style;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
function ruleMatches(rule, record) {
|
|
114
|
+
const lookup = resolveBinding(record, rule.path);
|
|
115
|
+
const missing = lookup.status === "missing";
|
|
116
|
+
const value = lookup.status === "found" ? lookup.value : undefined;
|
|
117
|
+
if (rule.operator === "blank") {
|
|
118
|
+
return missing || value === null || value === "";
|
|
119
|
+
}
|
|
120
|
+
if (missing || value === undefined || value === null) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (rule.operator === "eq") {
|
|
124
|
+
return sameLiteral(value, rule.value);
|
|
125
|
+
}
|
|
126
|
+
if (rule.operator === "neq") {
|
|
127
|
+
return !sameLiteral(value, rule.value);
|
|
128
|
+
}
|
|
129
|
+
if (typeof value !== "number" || typeof rule.value !== "number") {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (rule.operator === "gt") {
|
|
133
|
+
return value > rule.value;
|
|
134
|
+
}
|
|
135
|
+
if (rule.operator === "gte") {
|
|
136
|
+
return value >= rule.value;
|
|
137
|
+
}
|
|
138
|
+
if (rule.operator === "lt") {
|
|
139
|
+
return value < rule.value;
|
|
140
|
+
}
|
|
141
|
+
return value <= rule.value;
|
|
142
|
+
}
|
|
143
|
+
function sameLiteral(left, right) {
|
|
144
|
+
if (typeof left === "object") {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return left === right;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=appearance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../src/render/appearance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BoxEdges, ElementStyle, FontWeight, LengthUnit } from "../types.js";
|
|
2
|
+
/** Returns a CSS color token, or null when the string could change the declaration list. */
|
|
3
|
+
export declare function cssColor(value: string | undefined): string | null;
|
|
4
|
+
/** Returns a CSS font-family list, or null when the string is not a plain family list. */
|
|
5
|
+
export declare function cssFontFamily(value: string | undefined): string | null;
|
|
6
|
+
export declare function cssFontWeight(value: FontWeight | undefined): string | null;
|
|
7
|
+
export declare function cssLength(value: number, unit: LengthUnit): string;
|
|
8
|
+
export declare function cssNumber(value: number | undefined, minimum: number, maximum: number): string | null;
|
|
9
|
+
export declare function styleAttribute(declarations: ReadonlyArray<readonly [string, string | null]>): string | undefined;
|
|
10
|
+
export declare function boxStyle(style: ElementStyle | undefined, unit: LengthUnit): Array<readonly [string, string | null]>;
|
|
11
|
+
/** Shared border, or one declaration per side when any side is set. */
|
|
12
|
+
export declare function borderDeclarations(style: ElementStyle | undefined, unit: LengthUnit): Array<readonly [string, string | null]>;
|
|
13
|
+
export declare function paddingCss(padding: BoxEdges | undefined, unit: LengthUnit): string | null;
|
|
14
|
+
export declare function textStyle(style: ElementStyle | undefined): Array<readonly [string, string | null]>;
|
|
15
|
+
/** Flex alignment for a text box. Omitted unless vertical alignment is set. */
|
|
16
|
+
export declare function blockAlignDeclarations(style: ElementStyle | undefined): Array<readonly [string, string | null]>;
|
|
17
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/render/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA+B,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAa,MAAM,aAAa,CAAC;AAU1H,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CASjE;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAStE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAc1E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAMjE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKpG;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,CAMhH;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAQnH;AAID,uEAAuE;AACvE,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,IAAI,EAAE,UAAU,GACf,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAUzC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAWzF;AAgCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAclG;AASD,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAuB/G"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { RenderError } from "./errors.js";
|
|
2
|
+
const HEX_COLOR = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
|
|
3
|
+
const RGB_COLOR = /^rgba?\(\s*(?:\d{1,3}%?\s*,\s*){2}\d{1,3}%?(?:\s*,\s*(?:\d{1,3}%|0|1|0?\.\d+))?\s*\)$/;
|
|
4
|
+
const NAMED_COLOR = /^(?:transparent|[a-zA-Z]{1,30})$/;
|
|
5
|
+
const FONT_FAMILY = /^(?:[A-Za-z][A-Za-z0-9]*(?:[ -][A-Za-z0-9]+)*|"[A-Za-z0-9 -]+")(?:\s*,\s*(?:[A-Za-z][A-Za-z0-9]*(?:[ -][A-Za-z0-9]+)*|"[A-Za-z0-9 -]+"))*$/;
|
|
6
|
+
/** Returns a CSS color token, or null when the string could change the declaration list. */
|
|
7
|
+
export function cssColor(value) {
|
|
8
|
+
if (value === undefined) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const color = value.trim();
|
|
12
|
+
if (HEX_COLOR.test(color) || RGB_COLOR.test(color) || NAMED_COLOR.test(color)) {
|
|
13
|
+
return color;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
/** Returns a CSS font-family list, or null when the string is not a plain family list. */
|
|
18
|
+
export function cssFontFamily(value) {
|
|
19
|
+
if (value === undefined) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const family = value.trim();
|
|
23
|
+
if (family.length === 0 || family.length > 200 || !FONT_FAMILY.test(family)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return family;
|
|
27
|
+
}
|
|
28
|
+
export function cssFontWeight(value) {
|
|
29
|
+
if (value === undefined) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (value === "medium") {
|
|
33
|
+
return "500";
|
|
34
|
+
}
|
|
35
|
+
if (value === "normal" || value === "bold" || value === "lighter" || value === "bolder") {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 1 && value <= 1000) {
|
|
39
|
+
return String(value);
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
export function cssLength(value, unit) {
|
|
44
|
+
if (!Number.isFinite(value)) {
|
|
45
|
+
throw new RenderError("invalid_length", "A rendered length must be a finite number.");
|
|
46
|
+
}
|
|
47
|
+
const rounded = Math.round(value * 1000) / 1000;
|
|
48
|
+
return `${rounded}${unit}`;
|
|
49
|
+
}
|
|
50
|
+
export function cssNumber(value, minimum, maximum) {
|
|
51
|
+
if (value === undefined || !Number.isFinite(value) || value < minimum || value > maximum) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return String(Math.round(value * 1000) / 1000);
|
|
55
|
+
}
|
|
56
|
+
export function styleAttribute(declarations) {
|
|
57
|
+
const body = declarations
|
|
58
|
+
.filter((entry) => entry[1] !== null)
|
|
59
|
+
.map(([property, value]) => `${property}:${value}`)
|
|
60
|
+
.join(";");
|
|
61
|
+
return body.length > 0 ? body : undefined;
|
|
62
|
+
}
|
|
63
|
+
export function boxStyle(style, unit) {
|
|
64
|
+
return [
|
|
65
|
+
["background", cssColor(style?.backgroundColor)],
|
|
66
|
+
...borderDeclarations(style, unit),
|
|
67
|
+
["border-radius", style?.borderRadius !== undefined ? cssLength(style.borderRadius, unit) : null],
|
|
68
|
+
["padding", paddingCss(style?.padding, unit)],
|
|
69
|
+
["opacity", cssNumber(style?.opacity, 0, 1)],
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
const BORDER_LINE = new Set(["solid", "dashed", "dotted", "double", "none"]);
|
|
73
|
+
/** Shared border, or one declaration per side when any side is set. */
|
|
74
|
+
export function borderDeclarations(style, unit) {
|
|
75
|
+
if (style?.borderTop || style?.borderRight || style?.borderBottom || style?.borderLeft) {
|
|
76
|
+
return [
|
|
77
|
+
["border-top", edgeCss(style.borderTop, style, unit)],
|
|
78
|
+
["border-right", edgeCss(style.borderRight, style, unit)],
|
|
79
|
+
["border-bottom", edgeCss(style.borderBottom, style, unit)],
|
|
80
|
+
["border-left", edgeCss(style.borderLeft, style, unit)],
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
return [["border", sharedBorder(style, unit)]];
|
|
84
|
+
}
|
|
85
|
+
export function paddingCss(padding, unit) {
|
|
86
|
+
if (!padding) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const edges = [padding.top, padding.right, padding.bottom, padding.left];
|
|
90
|
+
if (edges.every((edge) => edge === undefined)) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return edges
|
|
94
|
+
.map((edge) => cssLength(edge ?? 0, unit))
|
|
95
|
+
.join(" ");
|
|
96
|
+
}
|
|
97
|
+
function sharedBorder(style, unit) {
|
|
98
|
+
const line = borderLine(style?.borderStyle);
|
|
99
|
+
if (line === "none") {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const borderWidth = style?.borderWidth;
|
|
103
|
+
const borderColor = cssColor(style?.borderColor);
|
|
104
|
+
if (borderWidth === undefined || !Number.isFinite(borderWidth) || borderWidth <= 0 || !borderColor) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return `${cssLength(borderWidth, unit)} ${line} ${borderColor}`;
|
|
108
|
+
}
|
|
109
|
+
function edgeCss(edge, style, unit) {
|
|
110
|
+
const line = borderLine(edge?.style ?? style.borderStyle);
|
|
111
|
+
const width = edge?.width ?? style.borderWidth;
|
|
112
|
+
const color = cssColor(edge?.color ?? style.borderColor);
|
|
113
|
+
if (line === "none" || width === undefined || !Number.isFinite(width) || width <= 0 || !color) {
|
|
114
|
+
return "none";
|
|
115
|
+
}
|
|
116
|
+
return `${cssLength(width, unit)} ${line} ${color}`;
|
|
117
|
+
}
|
|
118
|
+
function borderLine(value) {
|
|
119
|
+
if (value !== undefined && BORDER_LINE.has(value)) {
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
return "solid";
|
|
123
|
+
}
|
|
124
|
+
export function textStyle(style) {
|
|
125
|
+
const align = style?.textAlign;
|
|
126
|
+
const textAlign = align === "left" || align === "center" || align === "right" || align === "justify" ? align : null;
|
|
127
|
+
const fontStyle = style?.fontStyle === "italic" || style?.fontStyle === "normal" ? style.fontStyle : null;
|
|
128
|
+
return [
|
|
129
|
+
["color", cssColor(style?.color) ?? "#1c2430"],
|
|
130
|
+
["font-family", cssFontFamily(style?.fontFamily) ?? "Helvetica, Arial, sans-serif"],
|
|
131
|
+
["font-size", style?.fontSize !== undefined ? cssLength(style.fontSize, "pt") : "12pt"],
|
|
132
|
+
["font-weight", cssFontWeight(style?.fontWeight) ?? "normal"],
|
|
133
|
+
["font-style", fontStyle],
|
|
134
|
+
["text-align", textAlign],
|
|
135
|
+
["text-decoration", textDecoration(style?.textDecoration)],
|
|
136
|
+
["line-height", cssNumber(style?.lineHeight, 0, 10)],
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
function textDecoration(value) {
|
|
140
|
+
if (value === "none" || value === "underline" || value === "line-through") {
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/** Flex alignment for a text box. Omitted unless vertical alignment is set. */
|
|
146
|
+
export function blockAlignDeclarations(style) {
|
|
147
|
+
if (style?.verticalAlign === "middle") {
|
|
148
|
+
return [
|
|
149
|
+
["display", "flex"],
|
|
150
|
+
["flex-direction", "column"],
|
|
151
|
+
["justify-content", "center"],
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
if (style?.verticalAlign === "bottom") {
|
|
155
|
+
return [
|
|
156
|
+
["display", "flex"],
|
|
157
|
+
["flex-direction", "column"],
|
|
158
|
+
["justify-content", "flex-end"],
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
if (style?.verticalAlign === "top") {
|
|
162
|
+
return [
|
|
163
|
+
["display", "flex"],
|
|
164
|
+
["flex-direction", "column"],
|
|
165
|
+
["justify-content", "flex-start"],
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/render/css.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/render/errors.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAM1C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Thrown when rendering cannot continue for a reason other than template validation. */
|
|
2
|
+
export class RenderError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "RenderError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/render/errors.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Escapes text for HTML element content and attribute values. */
|
|
2
|
+
export declare function escapeHtml(value: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Emits one tag. Attribute values are escaped. Only the attributes passed here are written.
|
|
5
|
+
*/
|
|
6
|
+
export declare function htmlTag(name: string, attributes: Readonly<Record<string, string | undefined>>, children?: string): string;
|
|
7
|
+
//# sourceMappingURL=escape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/render/escape.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAID;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACxD,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAYR"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Escapes text for HTML element content and attribute values. */
|
|
2
|
+
export function escapeHtml(value) {
|
|
3
|
+
return value
|
|
4
|
+
.replaceAll("&", "&")
|
|
5
|
+
.replaceAll("<", "<")
|
|
6
|
+
.replaceAll(">", ">")
|
|
7
|
+
.replaceAll('"', """)
|
|
8
|
+
.replaceAll("'", "'");
|
|
9
|
+
}
|
|
10
|
+
const VOID_TAGS = new Set(["img", "meta"]);
|
|
11
|
+
/**
|
|
12
|
+
* Emits one tag. Attribute values are escaped. Only the attributes passed here are written.
|
|
13
|
+
*/
|
|
14
|
+
export function htmlTag(name, attributes, children) {
|
|
15
|
+
const parts = [];
|
|
16
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
17
|
+
if (value === undefined) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
parts.push(` ${key}="${escapeHtml(value)}"`);
|
|
21
|
+
}
|
|
22
|
+
if (children === undefined && VOID_TAGS.has(name)) {
|
|
23
|
+
return `<${name}${parts.join("")}>`;
|
|
24
|
+
}
|
|
25
|
+
return `<${name}${parts.join("")}>${children ?? ""}</${name}>`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/render/escape.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,UAAwD,EACxD,QAAiB;IAEjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which image URLs may be written into the HTML.
|
|
3
|
+
* `javascript:` and other non-image schemes are never allowed.
|
|
4
|
+
* Relative paths are allowed by default. `https` and image data URLs are opt-in.
|
|
5
|
+
*/
|
|
6
|
+
export interface ImageSourcePolicy {
|
|
7
|
+
allowRelative?: boolean;
|
|
8
|
+
allowHttps?: boolean;
|
|
9
|
+
/** When set with `allowHttps`, only these hostnames are accepted. */
|
|
10
|
+
httpsHosts?: readonly string[];
|
|
11
|
+
allowDataImages?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Image sources the designer preview may display.
|
|
15
|
+
* `https`, relative paths, and image data URLs are visible. Dangerous schemes stay blocked.
|
|
16
|
+
*/
|
|
17
|
+
export declare const designerImageSources: ImageSourcePolicy;
|
|
18
|
+
/** Returns the first candidate the policy allows. Later candidates are fallbacks. */
|
|
19
|
+
export declare function firstAllowedImageSource(candidates: readonly string[], policy: ImageSourcePolicy): string | undefined;
|
|
20
|
+
export declare function imageSourceDecision(src: string, policy: ImageSourcePolicy): "allow" | "reject";
|
|
21
|
+
//# sourceMappingURL=image-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-policy.d.ts","sourceRoot":"","sources":["../../src/render/image-policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAID;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,iBAIlC,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,MAAM,EAAE,iBAAiB,GACxB,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAqB9F"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const DATA_IMAGE = /^data:image\/(?:png|jpeg|jpg|gif|webp);base64,[a-z0-9+/=\s]+$/i;
|
|
2
|
+
/**
|
|
3
|
+
* Image sources the designer preview may display.
|
|
4
|
+
* `https`, relative paths, and image data URLs are visible. Dangerous schemes stay blocked.
|
|
5
|
+
*/
|
|
6
|
+
export const designerImageSources = {
|
|
7
|
+
allowRelative: true,
|
|
8
|
+
allowHttps: true,
|
|
9
|
+
allowDataImages: true,
|
|
10
|
+
};
|
|
11
|
+
/** Returns the first candidate the policy allows. Later candidates are fallbacks. */
|
|
12
|
+
export function firstAllowedImageSource(candidates, policy) {
|
|
13
|
+
for (const candidate of candidates) {
|
|
14
|
+
if (imageSourceDecision(candidate, policy) === "allow") {
|
|
15
|
+
return candidate;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
export function imageSourceDecision(src, policy) {
|
|
21
|
+
const value = src.trim();
|
|
22
|
+
if (value.length === 0 || /[\u0000-\u001F\u007F]/.test(value)) {
|
|
23
|
+
return "reject";
|
|
24
|
+
}
|
|
25
|
+
if (/^(?:javascript|vbscript|data|file|blob):/i.test(value) && !DATA_IMAGE.test(value)) {
|
|
26
|
+
return "reject";
|
|
27
|
+
}
|
|
28
|
+
if (DATA_IMAGE.test(value)) {
|
|
29
|
+
return policy.allowDataImages ? "allow" : "reject";
|
|
30
|
+
}
|
|
31
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(value)) {
|
|
32
|
+
return isApprovedHttps(value, policy) ? "allow" : "reject";
|
|
33
|
+
}
|
|
34
|
+
if (policy.allowRelative === false) {
|
|
35
|
+
return "reject";
|
|
36
|
+
}
|
|
37
|
+
if (value.startsWith("//") || value.includes("\\") || /[<>"']/.test(value)) {
|
|
38
|
+
return "reject";
|
|
39
|
+
}
|
|
40
|
+
return "allow";
|
|
41
|
+
}
|
|
42
|
+
function isApprovedHttps(value, policy) {
|
|
43
|
+
if (!policy.allowHttps || !/^https:\/\//i.test(value)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
let url;
|
|
47
|
+
try {
|
|
48
|
+
url = new URL(value);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if (url.username !== "" || url.password !== "" || url.protocol !== "https:") {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const hosts = policy.httpsHosts;
|
|
57
|
+
if (!hosts || hosts.length === 0) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return hosts.some((host) => host.toLowerCase() === url.hostname.toLowerCase());
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=image-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-policy.js","sourceRoot":"","sources":["../../src/render/image-policy.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,GAAG,gEAAgE,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CACrC,UAA6B,EAC7B,MAAyB;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAyB;IACxE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrD,CAAC;IACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7D,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,MAAyB;IAC/D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type InvoiceCalculationPolicy } from "../invoice/context.js";
|
|
2
|
+
import type { DocumentTemplate } from "../schema.js";
|
|
3
|
+
import { type ImageSourcePolicy } from "./image-policy.js";
|
|
4
|
+
export interface RenderOptions {
|
|
5
|
+
/** Defaults to the template name. */
|
|
6
|
+
title?: string;
|
|
7
|
+
/** `full` is a complete document. `fragment` is the style element plus the page. */
|
|
8
|
+
document?: "full" | "fragment";
|
|
9
|
+
/**
|
|
10
|
+
* Trusted CSS appended after the generated rules.
|
|
11
|
+
* It is not sanitized as a stylesheet. It cannot contain `<`, so it cannot close the style element.
|
|
12
|
+
*/
|
|
13
|
+
additionalCss?: string;
|
|
14
|
+
/** Controls which image URLs are emitted. Relative paths are allowed unless turned off. */
|
|
15
|
+
imageSources?: ImageSourcePolicy;
|
|
16
|
+
/**
|
|
17
|
+
* Overrides the template's saved invoice fraction digits.
|
|
18
|
+
* Used only when `documentType` is `invoice`.
|
|
19
|
+
*/
|
|
20
|
+
invoice?: InvoiceCalculationPolicy;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Renders a saved template and JSON data to HTML.
|
|
24
|
+
* Text and image bindings are resolved with `resolveTemplateData`. The template and data are not modified.
|
|
25
|
+
* Image URLs are not requested. Static and bound sources both pass through `imageSources`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function renderToHTML(template: DocumentTemplate, data: unknown, options?: RenderOptions): string;
|
|
28
|
+
//# sourceMappingURL=render-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-html.d.ts","sourceRoot":"","sources":["../../src/render/render-html.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAE7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAOrD,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGpF,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAiDD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAoE3G"}
|