@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,347 @@
|
|
|
1
|
+
import { parseBindingPath } from "../binding-path.js";
|
|
2
|
+
import { resolveBinding } from "../binding.js";
|
|
3
|
+
import { formatScalar } from "../invoice/format.js";
|
|
4
|
+
/**
|
|
5
|
+
* Label used for null and missing group values. Both share one group.
|
|
6
|
+
* Ascending sorts place that group last. Descending sorts place it first.
|
|
7
|
+
* Group order otherwise follows the sorted records, then the original record order.
|
|
8
|
+
* Up to three group levels are supported. Each level prints its heading, then nested
|
|
9
|
+
* levels, then that level's subtotal. Inner subtotals therefore appear before outer ones.
|
|
10
|
+
*
|
|
11
|
+
* Sum, minimum, and maximum read finite numbers only. Missing and null values are skipped
|
|
12
|
+
* and are not treated as zero. A present non-number throws. Zero is included.
|
|
13
|
+
* Sums are accumulated at 8 decimal places, half away from zero. Values at or beyond
|
|
14
|
+
* 1e12 throw. Count counts records, including records whose aggregated field is missing.
|
|
15
|
+
* Count is printed as an integer even when the column format is currency.
|
|
16
|
+
*/
|
|
17
|
+
export const BLANK_GROUP_LABEL = "(Blank)";
|
|
18
|
+
const MAX_GROUP_LEVELS = 3;
|
|
19
|
+
const SUM_SCALE = 100000000n;
|
|
20
|
+
const SUM_DIGITS = 8;
|
|
21
|
+
export class ReportProcessingError extends Error {
|
|
22
|
+
code;
|
|
23
|
+
constructor(code, message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = "ReportProcessingError";
|
|
26
|
+
this.code = code;
|
|
27
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Builds a report table view. The template element and the input data are not modified. */
|
|
31
|
+
export function prepareReportTable(element, data) {
|
|
32
|
+
const columns = element.columns.filter((column) => column.visible !== false);
|
|
33
|
+
assertPaths(element);
|
|
34
|
+
const records = readCollection(data, element.collectionPath);
|
|
35
|
+
const sorted = sortRecords(records, element.sort ?? []);
|
|
36
|
+
const viewColumns = columns.map((column) => ({
|
|
37
|
+
id: column.id,
|
|
38
|
+
header: column.header,
|
|
39
|
+
align: column.align ?? defaultAlign(column),
|
|
40
|
+
weight: column.width ?? 1,
|
|
41
|
+
}));
|
|
42
|
+
const base = {
|
|
43
|
+
columns: viewColumns,
|
|
44
|
+
showHeader: element.showHeader !== false,
|
|
45
|
+
pageBreakBefore: element.pageBreakBefore === true,
|
|
46
|
+
alternateRowColor: element.alternateRowColor,
|
|
47
|
+
};
|
|
48
|
+
if (sorted.length === 0) {
|
|
49
|
+
return {
|
|
50
|
+
...base,
|
|
51
|
+
empty: true,
|
|
52
|
+
recordCount: 0,
|
|
53
|
+
rows: [{ kind: "empty", cells: [element.emptyText?.trim() ? element.emptyText : "No records"], level: 0 }],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const rows = groupRows(sorted, element.groupBy ?? [], columns, data, 0);
|
|
57
|
+
if (element.showGrandTotal && columns.some((column) => column.aggregate !== undefined)) {
|
|
58
|
+
rows.push({
|
|
59
|
+
kind: "grand",
|
|
60
|
+
cells: totalCells(sorted, columns, data, element.grandTotalLabel?.trim() ? element.grandTotalLabel : "Total"),
|
|
61
|
+
level: 0,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return { ...base, empty: false, recordCount: sorted.length, rows };
|
|
65
|
+
}
|
|
66
|
+
function assertPaths(element) {
|
|
67
|
+
requirePath(element.collectionPath, "Collection path");
|
|
68
|
+
for (const column of element.columns) {
|
|
69
|
+
requirePath(column.binding.path, `Column "${column.id}" binding`);
|
|
70
|
+
}
|
|
71
|
+
for (const level of element.groupBy ?? []) {
|
|
72
|
+
requirePath(level.path, "Group path");
|
|
73
|
+
}
|
|
74
|
+
if ((element.groupBy?.length ?? 0) > MAX_GROUP_LEVELS) {
|
|
75
|
+
throw new ReportProcessingError("invalid_group", `A report table supports at most ${MAX_GROUP_LEVELS} group levels.`);
|
|
76
|
+
}
|
|
77
|
+
for (const sort of element.sort ?? []) {
|
|
78
|
+
requirePath(sort.path, "Sort path");
|
|
79
|
+
if (sort.direction !== "asc" && sort.direction !== "desc") {
|
|
80
|
+
throw new ReportProcessingError("invalid_group", "Sort direction must be asc or desc.");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function requirePath(path, label) {
|
|
85
|
+
const parsed = parseBindingPath(path);
|
|
86
|
+
if (!parsed.valid) {
|
|
87
|
+
throw new ReportProcessingError(parsed.reason === "unsafe" ? "unsafe_path" : "invalid_path", `${label} "${path}" is not a safe binding path.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function readCollection(data, path) {
|
|
91
|
+
const lookup = resolveBinding(data, path);
|
|
92
|
+
if (lookup.status !== "found" || lookup.value === null) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
if (!Array.isArray(lookup.value)) {
|
|
96
|
+
throw new ReportProcessingError("invalid_collection", `Collection path "${path}" must be an array.`);
|
|
97
|
+
}
|
|
98
|
+
return lookup.value.map((item, index) => {
|
|
99
|
+
if (!isPlainObject(item) || !isJsonObject(item)) {
|
|
100
|
+
throw new ReportProcessingError("invalid_record", `Record ${index + 1} at "${path}" must be a JSON object.`);
|
|
101
|
+
}
|
|
102
|
+
return { index, record: structuredClone(item) };
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function sortRecords(records, sorts) {
|
|
106
|
+
const copy = records.slice();
|
|
107
|
+
copy.sort((left, right) => {
|
|
108
|
+
for (const sort of sorts) {
|
|
109
|
+
const compared = compareLookups(resolveBinding(left.record, sort.path), resolveBinding(right.record, sort.path));
|
|
110
|
+
if (compared !== 0) {
|
|
111
|
+
return sort.direction === "desc" ? -compared : compared;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return left.index - right.index;
|
|
115
|
+
});
|
|
116
|
+
return copy;
|
|
117
|
+
}
|
|
118
|
+
function compareLookups(left, right) {
|
|
119
|
+
const leftMissing = left.status !== "found" || left.value === null;
|
|
120
|
+
const rightMissing = right.status !== "found" || right.value === null;
|
|
121
|
+
if (leftMissing && rightMissing) {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
if (leftMissing) {
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
if (rightMissing) {
|
|
128
|
+
return -1;
|
|
129
|
+
}
|
|
130
|
+
return compareValues(left.value, right.value);
|
|
131
|
+
}
|
|
132
|
+
function compareValues(left, right) {
|
|
133
|
+
if (typeof left === "number" && typeof right === "number") {
|
|
134
|
+
return left === right ? 0 : left < right ? -1 : 1;
|
|
135
|
+
}
|
|
136
|
+
if (typeof left === "string" && typeof right === "string") {
|
|
137
|
+
return left.localeCompare(right, "en", { numeric: true, sensitivity: "variant" });
|
|
138
|
+
}
|
|
139
|
+
if (typeof left === "boolean" && typeof right === "boolean") {
|
|
140
|
+
return Number(left) - Number(right);
|
|
141
|
+
}
|
|
142
|
+
const rank = (value) => typeof value === "boolean" ? 0 : typeof value === "number" ? 1 : typeof value === "string" ? 2 : 3;
|
|
143
|
+
const byRank = rank(left) - rank(right);
|
|
144
|
+
if (byRank !== 0) {
|
|
145
|
+
return byRank;
|
|
146
|
+
}
|
|
147
|
+
return JSON.stringify(left).localeCompare(JSON.stringify(right), "en");
|
|
148
|
+
}
|
|
149
|
+
function groupRows(records, levels, columns, root, depth) {
|
|
150
|
+
if (levels.length === 0) {
|
|
151
|
+
return records.map((record) => ({
|
|
152
|
+
kind: "record",
|
|
153
|
+
cells: columns.map((column) => cellText(column.binding, record.record, root)),
|
|
154
|
+
level: depth,
|
|
155
|
+
record: record.record,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
const level = levels[0];
|
|
159
|
+
if (level === undefined) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
const buckets = new Map();
|
|
163
|
+
const order = [];
|
|
164
|
+
for (const record of records) {
|
|
165
|
+
const identity = groupIdentity(record, level.path);
|
|
166
|
+
const existing = buckets.get(identity.key);
|
|
167
|
+
if (existing) {
|
|
168
|
+
existing.items.push(record);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
buckets.set(identity.key, { label: identity.label, items: [record] });
|
|
172
|
+
order.push(identity.key);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const rows = [];
|
|
176
|
+
for (const key of order) {
|
|
177
|
+
const bucket = buckets.get(key);
|
|
178
|
+
if (!bucket) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const heading = level.label ? `${level.label}: ${bucket.label}` : bucket.label;
|
|
182
|
+
rows.push({ kind: "group", cells: [heading], level: depth });
|
|
183
|
+
rows.push(...groupRows(bucket.items, levels.slice(1), columns, root, depth + 1));
|
|
184
|
+
if (columns.some((column) => column.aggregate !== undefined)) {
|
|
185
|
+
rows.push({
|
|
186
|
+
kind: "subtotal",
|
|
187
|
+
cells: totalCells(bucket.items, columns, root, `${bucket.label} total`),
|
|
188
|
+
level: depth,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return rows;
|
|
193
|
+
}
|
|
194
|
+
function groupIdentity(record, path) {
|
|
195
|
+
const lookup = resolveBinding(record.record, path);
|
|
196
|
+
if (lookup.status !== "found" || lookup.value === null) {
|
|
197
|
+
return { key: "\u0000", label: BLANK_GROUP_LABEL };
|
|
198
|
+
}
|
|
199
|
+
const value = lookup.value;
|
|
200
|
+
if (typeof value === "object") {
|
|
201
|
+
throw new ReportProcessingError("invalid_group", `Group path "${path}" must be text, a number, or a boolean.`);
|
|
202
|
+
}
|
|
203
|
+
const label = typeof value === "number" ? plainNumber(value) : String(value);
|
|
204
|
+
return { key: `${typeof value}:${label}`, label };
|
|
205
|
+
}
|
|
206
|
+
function totalCells(records, columns, root, label) {
|
|
207
|
+
const cells = columns.map((column) => {
|
|
208
|
+
if (column.aggregate === undefined) {
|
|
209
|
+
return "";
|
|
210
|
+
}
|
|
211
|
+
const value = aggregateValue(records, column);
|
|
212
|
+
if (value === null) {
|
|
213
|
+
return "";
|
|
214
|
+
}
|
|
215
|
+
return formatAggregate(column, value, root);
|
|
216
|
+
});
|
|
217
|
+
const labelIndex = columns.findIndex((column) => column.aggregate === undefined);
|
|
218
|
+
if (labelIndex >= 0) {
|
|
219
|
+
cells[labelIndex] = label;
|
|
220
|
+
}
|
|
221
|
+
else if (cells.length > 0) {
|
|
222
|
+
cells[0] = `${label} ${cells[0]}`.trim();
|
|
223
|
+
}
|
|
224
|
+
return cells;
|
|
225
|
+
}
|
|
226
|
+
function aggregateValue(records, column) {
|
|
227
|
+
if (column.aggregate === "count") {
|
|
228
|
+
return records.length;
|
|
229
|
+
}
|
|
230
|
+
const numbers = [];
|
|
231
|
+
for (const record of records) {
|
|
232
|
+
const lookup = resolveBinding(record.record, column.binding.path);
|
|
233
|
+
if (lookup.status !== "found" || lookup.value === null) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (typeof lookup.value !== "number" || !Number.isFinite(lookup.value)) {
|
|
237
|
+
throw new ReportProcessingError("invalid_number", `Column "${column.id}" cannot aggregate a non-numeric value at "${column.binding.path}".`);
|
|
238
|
+
}
|
|
239
|
+
if (Math.abs(lookup.value) >= 1e12) {
|
|
240
|
+
throw new ReportProcessingError("invalid_number", `Column "${column.id}" has a value outside the supported range.`);
|
|
241
|
+
}
|
|
242
|
+
numbers.push(lookup.value);
|
|
243
|
+
}
|
|
244
|
+
if (numbers.length === 0) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
if (column.aggregate === "min") {
|
|
248
|
+
return numbers.reduce((min, value) => (value < min ? value : min));
|
|
249
|
+
}
|
|
250
|
+
if (column.aggregate === "max") {
|
|
251
|
+
return numbers.reduce((max, value) => (value > max ? value : max));
|
|
252
|
+
}
|
|
253
|
+
return fromScaled(numbers.reduce((sum, value) => sum + toScaled(value), 0n));
|
|
254
|
+
}
|
|
255
|
+
function formatAggregate(column, value, root) {
|
|
256
|
+
if (column.aggregate === "count") {
|
|
257
|
+
return String(value);
|
|
258
|
+
}
|
|
259
|
+
const formatted = formatScalar(value, column.binding.format, currencyCode(column.binding, root));
|
|
260
|
+
return applyAffixes(column.binding, formatted ?? plainNumber(value));
|
|
261
|
+
}
|
|
262
|
+
function cellText(binding, record, root) {
|
|
263
|
+
const lookup = resolveBinding(record, binding.path);
|
|
264
|
+
if (lookup.status === "found") {
|
|
265
|
+
const formatted = formatScalar(lookup.value, binding.format, currencyCode(binding, root));
|
|
266
|
+
if (formatted !== null) {
|
|
267
|
+
return applyAffixes(binding, formatted);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (binding.fallback !== undefined) {
|
|
271
|
+
return applyAffixes(binding, binding.fallback);
|
|
272
|
+
}
|
|
273
|
+
return "";
|
|
274
|
+
}
|
|
275
|
+
function currencyCode(binding, root) {
|
|
276
|
+
const format = binding.format;
|
|
277
|
+
if (format?.style !== "currency") {
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
if (format.currency !== undefined) {
|
|
281
|
+
return format.currency;
|
|
282
|
+
}
|
|
283
|
+
for (const path of ["invoice.currency", "report.currency"]) {
|
|
284
|
+
const lookup = resolveBinding(root, path);
|
|
285
|
+
if (lookup.status === "found" && typeof lookup.value === "string") {
|
|
286
|
+
return lookup.value;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
function applyAffixes(binding, value) {
|
|
292
|
+
return `${binding.prefix ?? ""}${value}${binding.suffix ?? ""}`;
|
|
293
|
+
}
|
|
294
|
+
function defaultAlign(column) {
|
|
295
|
+
if (column.binding.format?.style === "decimal" || column.binding.format?.style === "currency" || column.aggregate === "count") {
|
|
296
|
+
return "right";
|
|
297
|
+
}
|
|
298
|
+
return "left";
|
|
299
|
+
}
|
|
300
|
+
function plainNumber(value) {
|
|
301
|
+
return fromScaled(toScaled(value)).toString();
|
|
302
|
+
}
|
|
303
|
+
function toScaled(value) {
|
|
304
|
+
const negative = value < 0;
|
|
305
|
+
const text = Math.abs(value).toLocaleString("en-US", {
|
|
306
|
+
useGrouping: false,
|
|
307
|
+
maximumFractionDigits: SUM_DIGITS,
|
|
308
|
+
});
|
|
309
|
+
const [whole = "0", fraction = ""] = text.split(".");
|
|
310
|
+
const digits = `${fraction}${"0".repeat(SUM_DIGITS)}`.slice(0, SUM_DIGITS);
|
|
311
|
+
const minor = BigInt(whole) * SUM_SCALE + BigInt(digits);
|
|
312
|
+
return negative ? -minor : minor;
|
|
313
|
+
}
|
|
314
|
+
function fromScaled(value) {
|
|
315
|
+
const negative = value < 0n;
|
|
316
|
+
const absolute = negative ? -value : value;
|
|
317
|
+
const whole = absolute / SUM_SCALE;
|
|
318
|
+
const fraction = (absolute % SUM_SCALE).toString().padStart(SUM_DIGITS, "0").replace(/0+$/, "");
|
|
319
|
+
const text = fraction.length > 0 ? `${whole.toString()}.${fraction}` : whole.toString();
|
|
320
|
+
return negative ? -Number(text) : Number(text);
|
|
321
|
+
}
|
|
322
|
+
function isPlainObject(value) {
|
|
323
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
const prototype = Object.getPrototypeOf(value);
|
|
327
|
+
return prototype === Object.prototype || prototype === null;
|
|
328
|
+
}
|
|
329
|
+
function isJsonObject(value) {
|
|
330
|
+
return Object.values(value).every((entry) => isJsonValue(entry));
|
|
331
|
+
}
|
|
332
|
+
function isJsonValue(value) {
|
|
333
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
if (typeof value === "number") {
|
|
337
|
+
return Number.isFinite(value);
|
|
338
|
+
}
|
|
339
|
+
if (Array.isArray(value)) {
|
|
340
|
+
return value.every((entry) => isJsonValue(entry));
|
|
341
|
+
}
|
|
342
|
+
if (isPlainObject(value)) {
|
|
343
|
+
return isJsonObject(value);
|
|
344
|
+
}
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/report/process.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DocumentElement, PageConfiguration, ReportOptions } from "./types.js";
|
|
2
|
+
/** Optional invoice arithmetic settings. Ignored by generic and report templates. */
|
|
3
|
+
export interface InvoiceOptions {
|
|
4
|
+
/** Decimal places for money. Default 2. Range 0 through 6. */
|
|
5
|
+
fractionDigits?: number;
|
|
6
|
+
}
|
|
7
|
+
/** Current template schema. Increment when the JSON format changes. */
|
|
8
|
+
export declare const SCHEMA_VERSION: 1;
|
|
9
|
+
export declare const SUPPORTED_SCHEMA_VERSIONS: readonly [1];
|
|
10
|
+
export type SupportedSchemaVersion = (typeof SUPPORTED_SCHEMA_VERSIONS)[number];
|
|
11
|
+
export declare const DOCUMENT_TYPES: readonly ["generic", "invoice", "report"];
|
|
12
|
+
export type DocumentType = (typeof DOCUMENT_TYPES)[number];
|
|
13
|
+
export declare function isSupportedSchemaVersion(value: number): value is SupportedSchemaVersion;
|
|
14
|
+
/**
|
|
15
|
+
* Versioned template document.
|
|
16
|
+
* Persistence is left to the host application.
|
|
17
|
+
*/
|
|
18
|
+
export interface DocumentTemplate {
|
|
19
|
+
schemaVersion: SupportedSchemaVersion;
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
documentType: DocumentType;
|
|
23
|
+
page: PageConfiguration;
|
|
24
|
+
elements: DocumentElement[];
|
|
25
|
+
/** Present only when this template needs saved invoice arithmetic settings. */
|
|
26
|
+
invoice?: InvoiceOptions;
|
|
27
|
+
/** Present only when this template saves report headers, footers, or empty-state text. */
|
|
28
|
+
report?: ReportOptions;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEpF,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,uEAAuE;AACvE,eAAO,MAAM,cAAc,EAAG,CAAU,CAAC;AAEzC,eAAO,MAAM,yBAAyB,cAA4B,CAAC;AAEnE,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,eAAO,MAAM,cAAc,2CAA4C,CAAC;AAExE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,sBAAsB,CAEvF;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,sBAAsB,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Current template schema. Increment when the JSON format changes. */
|
|
2
|
+
export const SCHEMA_VERSION = 1;
|
|
3
|
+
export const SUPPORTED_SCHEMA_VERSIONS = [SCHEMA_VERSION];
|
|
4
|
+
export const DOCUMENT_TYPES = ["generic", "invoice", "report"];
|
|
5
|
+
export function isSupportedSchemaVersion(value) {
|
|
6
|
+
return SUPPORTED_SCHEMA_VERSIONS.includes(value);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAQA,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,cAAc,CAAU,CAAC;AAInE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAIxE,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAQ,yBAA+C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DocumentTemplate } from "./schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validates `input` and returns a detached copy.
|
|
4
|
+
* Binding paths are stored as data. Serialization does not resolve them.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createTemplate(input: unknown): DocumentTemplate;
|
|
7
|
+
/** Serializes a valid template to JSON. Invalid templates are rejected. */
|
|
8
|
+
export declare function serializeTemplate(input: unknown): string;
|
|
9
|
+
/** Parses JSON and returns a validated template. Does not evaluate expressions. */
|
|
10
|
+
export declare function deserializeTemplate(json: string): DocumentTemplate;
|
|
11
|
+
/** Deep copy with no shared nested objects or arrays. */
|
|
12
|
+
export declare function cloneTemplate(template: DocumentTemplate): DocumentTemplate;
|
|
13
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAG/D;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAiBlE;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAE1E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TemplateValidationError, validateTemplate } from "./validate.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validates `input` and returns a detached copy.
|
|
4
|
+
* Binding paths are stored as data. Serialization does not resolve them.
|
|
5
|
+
*/
|
|
6
|
+
export function createTemplate(input) {
|
|
7
|
+
assertValid(input);
|
|
8
|
+
return cloneTemplate(input);
|
|
9
|
+
}
|
|
10
|
+
/** Serializes a valid template to JSON. Invalid templates are rejected. */
|
|
11
|
+
export function serializeTemplate(input) {
|
|
12
|
+
return JSON.stringify(createTemplate(input));
|
|
13
|
+
}
|
|
14
|
+
/** Parses JSON and returns a validated template. Does not evaluate expressions. */
|
|
15
|
+
export function deserializeTemplate(json) {
|
|
16
|
+
if (typeof json !== "string") {
|
|
17
|
+
throw new TemplateValidationError([
|
|
18
|
+
{ path: "", code: "invalid_json", message: "Template JSON must be a string." },
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
let parsed;
|
|
22
|
+
try {
|
|
23
|
+
parsed = JSON.parse(json);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new TemplateValidationError([
|
|
27
|
+
{ path: "", code: "invalid_json", message: "Template JSON could not be parsed." },
|
|
28
|
+
]);
|
|
29
|
+
}
|
|
30
|
+
return createTemplate(parsed);
|
|
31
|
+
}
|
|
32
|
+
/** Deep copy with no shared nested objects or arrays. */
|
|
33
|
+
export function cloneTemplate(template) {
|
|
34
|
+
return structuredClone(template);
|
|
35
|
+
}
|
|
36
|
+
function assertValid(input) {
|
|
37
|
+
const result = validateTemplate(input);
|
|
38
|
+
if (!result.valid) {
|
|
39
|
+
throw new TemplateValidationError(result.errors);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE1E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,uBAAuB,CAAC;YAChC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iCAAiC,EAAE;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,uBAAuB,CAAC;YAChC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,oCAAoC,EAAE;SAClF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,aAAa,CAAC,QAA0B;IACtD,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|