@agile-team/mach-report 0.4.0 → 0.5.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/dist/index.cjs +1663 -0
- package/dist/index.d.cts +344 -0
- package/dist/index.d.ts +344 -13
- package/dist/index.js +1611 -14
- package/dist/manager.cjs +122 -0
- package/dist/{manager/api.d.ts → manager.d.cts} +55 -3
- package/dist/manager.d.ts +97 -5
- package/dist/manager.js +119 -6
- package/dist/pdf.cjs +52530 -0
- package/dist/pdf.d.cts +33 -0
- package/dist/pdf.d.ts +31 -4
- package/dist/pdf.js +52527 -7
- package/dist/sql.cjs +45207 -0
- package/dist/sql.d.cts +95 -0
- package/dist/sql.d.ts +93 -3
- package/dist/sql.js +45194 -6
- package/dist/textwrap-DWzM7pt1.d.cts +135 -0
- package/dist/textwrap-DWzM7pt1.d.ts +135 -0
- package/package.json +44 -15
- package/dist/builder/template-builder.d.ts +0 -53
- package/dist/builder/template-builder.js +0 -153
- package/dist/builder/template-builder.js.map +0 -1
- package/dist/compat/jh4j-template.d.ts +0 -12
- package/dist/compat/jh4j-template.js +0 -196
- package/dist/compat/jh4j-template.js.map +0 -1
- package/dist/defaults.d.ts +0 -27
- package/dist/defaults.js +0 -28
- package/dist/defaults.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/layout/paginate.d.ts +0 -51
- package/dist/layout/paginate.js +0 -197
- package/dist/layout/paginate.js.map +0 -1
- package/dist/layout/textwrap.d.ts +0 -36
- package/dist/layout/textwrap.js +0 -173
- package/dist/layout/textwrap.js.map +0 -1
- package/dist/manager/api.js +0 -101
- package/dist/manager/api.js.map +0 -1
- package/dist/manager/index.d.ts +0 -2
- package/dist/manager/index.js +0 -3
- package/dist/manager/index.js.map +0 -1
- package/dist/manager/types.d.ts +0 -50
- package/dist/manager/types.js +0 -8
- package/dist/manager/types.js.map +0 -1
- package/dist/manager.js.map +0 -1
- package/dist/pdf/font-loader.d.ts +0 -5
- package/dist/pdf/font-loader.js +0 -84
- package/dist/pdf/font-loader.js.map +0 -1
- package/dist/pdf/index.d.ts +0 -2
- package/dist/pdf/index.js +0 -3
- package/dist/pdf/index.js.map +0 -1
- package/dist/pdf/render-pdf.d.ts +0 -19
- package/dist/pdf/render-pdf.js +0 -284
- package/dist/pdf/render-pdf.js.map +0 -1
- package/dist/pdf.js.map +0 -1
- package/dist/render/canvas.d.ts +0 -61
- package/dist/render/canvas.js +0 -402
- package/dist/render/canvas.js.map +0 -1
- package/dist/render/dom.d.ts +0 -10
- package/dist/render/dom.js +0 -311
- package/dist/render/dom.js.map +0 -1
- package/dist/render/grid-geometry.d.ts +0 -41
- package/dist/render/grid-geometry.js +0 -131
- package/dist/render/grid-geometry.js.map +0 -1
- package/dist/render/style.d.ts +0 -40
- package/dist/render/style.js +0 -39
- package/dist/render/style.js.map +0 -1
- package/dist/render/window.d.ts +0 -23
- package/dist/render/window.js +0 -58
- package/dist/render/window.js.map +0 -1
- package/dist/schema/render-plan.d.ts +0 -96
- package/dist/schema/render-plan.js +0 -25
- package/dist/schema/render-plan.js.map +0 -1
- package/dist/schema/validate.d.ts +0 -15
- package/dist/schema/validate.js +0 -129
- package/dist/schema/validate.js.map +0 -1
- package/dist/sql/ast-check.d.ts +0 -14
- package/dist/sql/ast-check.js +0 -44
- package/dist/sql/ast-check.js.map +0 -1
- package/dist/sql/compile.d.ts +0 -31
- package/dist/sql/compile.js +0 -145
- package/dist/sql/compile.js.map +0 -1
- package/dist/sql/expr.d.ts +0 -21
- package/dist/sql/expr.js +0 -123
- package/dist/sql/expr.js.map +0 -1
- package/dist/sql/index.d.ts +0 -4
- package/dist/sql/index.js +0 -5
- package/dist/sql/index.js.map +0 -1
- package/dist/sql/tokenizer.d.ts +0 -25
- package/dist/sql/tokenizer.js +0 -124
- package/dist/sql/tokenizer.js.map +0 -1
- package/dist/sql.js.map +0 -1
- package/dist/units.d.ts +0 -11
- package/dist/units.js +0 -26
- package/dist/units.js.map +0 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
type ComponentKind = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
|
|
2
|
+
interface ComponentStyle {
|
|
3
|
+
fontSizePx?: number;
|
|
4
|
+
fontSize?: number;
|
|
5
|
+
fontFamily?: string;
|
|
6
|
+
bold?: boolean;
|
|
7
|
+
italic?: boolean;
|
|
8
|
+
underline?: boolean;
|
|
9
|
+
color?: string;
|
|
10
|
+
backgroundColor?: string;
|
|
11
|
+
align?: "left" | "center" | "right" | "justify";
|
|
12
|
+
verticalAlign?: "top" | "middle" | "bottom";
|
|
13
|
+
lineColor?: string;
|
|
14
|
+
borderColor?: string;
|
|
15
|
+
lineWidthPt?: number;
|
|
16
|
+
borderTop?: boolean;
|
|
17
|
+
borderRight?: boolean;
|
|
18
|
+
borderBottom?: boolean;
|
|
19
|
+
borderLeft?: boolean;
|
|
20
|
+
lineHeight?: number;
|
|
21
|
+
letterSpacing?: number;
|
|
22
|
+
opacity?: number;
|
|
23
|
+
rotateDeg?: number;
|
|
24
|
+
}
|
|
25
|
+
interface RichParagraph {
|
|
26
|
+
segments: RichSegment[];
|
|
27
|
+
align?: ComponentStyle["align"];
|
|
28
|
+
lineHeight?: number;
|
|
29
|
+
spaceBeforeMm?: number;
|
|
30
|
+
spaceAfterMm?: number;
|
|
31
|
+
indentMm?: number;
|
|
32
|
+
}
|
|
33
|
+
interface RichSegment {
|
|
34
|
+
kind?: "text" | "field";
|
|
35
|
+
text?: string;
|
|
36
|
+
field?: string;
|
|
37
|
+
style?: ComponentStyle;
|
|
38
|
+
}
|
|
39
|
+
interface GridCell {
|
|
40
|
+
text?: string;
|
|
41
|
+
rawText?: string;
|
|
42
|
+
children?: PlanComponent[];
|
|
43
|
+
colSpan?: number;
|
|
44
|
+
rowSpan?: number;
|
|
45
|
+
style?: ComponentStyle;
|
|
46
|
+
}
|
|
47
|
+
interface PlanGrid {
|
|
48
|
+
/** 行内允许 null 空位(jh4j 契约数据存在稀疏行;渲染器按空单元格处理) */
|
|
49
|
+
cells: (GridCell | null)[][];
|
|
50
|
+
colWidthsMm?: number[];
|
|
51
|
+
rowHeightsMm?: number[];
|
|
52
|
+
gapMm?: number;
|
|
53
|
+
}
|
|
54
|
+
interface PlanComponent {
|
|
55
|
+
kind: ComponentKind;
|
|
56
|
+
leftMm: number;
|
|
57
|
+
topMm: number;
|
|
58
|
+
widthMm: number;
|
|
59
|
+
heightMm: number;
|
|
60
|
+
nid?: string;
|
|
61
|
+
rkey?: string;
|
|
62
|
+
text?: string;
|
|
63
|
+
rawText?: string;
|
|
64
|
+
lines?: string[];
|
|
65
|
+
richParagraphs?: RichParagraph[];
|
|
66
|
+
imageData?: string;
|
|
67
|
+
grid?: PlanGrid;
|
|
68
|
+
style?: ComponentStyle;
|
|
69
|
+
meta?: Record<string, unknown>;
|
|
70
|
+
/** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
|
|
71
|
+
fallbackText?: string;
|
|
72
|
+
}
|
|
73
|
+
interface PlanPage {
|
|
74
|
+
pageWidthMm: number;
|
|
75
|
+
pageHeightMm: number;
|
|
76
|
+
marginTopMm?: number;
|
|
77
|
+
marginBottomMm?: number;
|
|
78
|
+
marginLeftMm?: number;
|
|
79
|
+
marginRightMm?: number;
|
|
80
|
+
components: PlanComponent[];
|
|
81
|
+
}
|
|
82
|
+
interface GridPlanResponse {
|
|
83
|
+
code?: number;
|
|
84
|
+
message?: string;
|
|
85
|
+
data?: {
|
|
86
|
+
pages?: PlanPage[];
|
|
87
|
+
} | null;
|
|
88
|
+
}
|
|
89
|
+
interface RenderPlan {
|
|
90
|
+
schemaVersion: string;
|
|
91
|
+
pages: PlanPage[];
|
|
92
|
+
}
|
|
93
|
+
declare const RENDER_PLAN_SCHEMA_VERSION = "1.0.0-mach";
|
|
94
|
+
declare function toRenderPlan(response: GridPlanResponse): RenderPlan;
|
|
95
|
+
declare function isImageBackedComponent(comp: PlanComponent): boolean;
|
|
96
|
+
declare function isRichText(comp: PlanComponent): boolean;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
|
|
100
|
+
*
|
|
101
|
+
* 测量模型可注入(TextMeasurer):
|
|
102
|
+
* - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
|
|
103
|
+
* - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
|
|
104
|
+
*/
|
|
105
|
+
interface TextMeasureOptions {
|
|
106
|
+
fontSizePt: number;
|
|
107
|
+
bold?: boolean;
|
|
108
|
+
letterSpacingPt?: number;
|
|
109
|
+
}
|
|
110
|
+
/** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
|
|
111
|
+
interface TextMeasurer {
|
|
112
|
+
measureMm(text: string, options: TextMeasureOptions): number;
|
|
113
|
+
}
|
|
114
|
+
declare function charWidthEm(ch: string): number;
|
|
115
|
+
/** 启发式测量器:宽度模型与 jh4j 近似口径一致(默认实现) */
|
|
116
|
+
declare const heuristicMeasurer: TextMeasurer;
|
|
117
|
+
/** 兼容旧 API:默认启发式测量 */
|
|
118
|
+
declare function createHeuristicMeasurer(): TextMeasurer;
|
|
119
|
+
declare function measureTextMm(text: string, options: TextMeasureOptions): number;
|
|
120
|
+
/**
|
|
121
|
+
* 浏览器 Canvas 测量器:用真实字体 metrics 校准宽度(可选注入)。
|
|
122
|
+
* 无 2D 环境时自动回退启发式(Node/SSR 安全)。
|
|
123
|
+
*/
|
|
124
|
+
declare function createCanvasMeasurer(getCtx2d: () => CanvasRenderingContext2D | null): TextMeasurer;
|
|
125
|
+
/**
|
|
126
|
+
* 文本折行:
|
|
127
|
+
* - CJK 字符任意位置可断(与既有行为一致)
|
|
128
|
+
* - 连续拉丁/数字串视为一个词,仅在词间(空格/CJK 边界)断行;
|
|
129
|
+
* 单词本身超宽时按字符硬拆(兜底,不无限溢出)
|
|
130
|
+
* - 换行符强制断行;行首不保留折行产生的空格
|
|
131
|
+
* - 可注入 TextMeasurer(默认启发式)
|
|
132
|
+
*/
|
|
133
|
+
declare function wrapText(text: string, maxWidthMm: number, options: TextMeasureOptions, measurer?: TextMeasurer): string[];
|
|
134
|
+
|
|
135
|
+
export { type ComponentStyle as C, type GridCell as G, type PlanPage as P, type RenderPlan as R, type TextMeasurer as T, type PlanComponent as a, type PlanGrid as b, type ComponentKind as c, type GridPlanResponse as d, RENDER_PLAN_SCHEMA_VERSION as e, type RichParagraph as f, type RichSegment as g, type TextMeasureOptions as h, charWidthEm as i, createCanvasMeasurer as j, createHeuristicMeasurer as k, heuristicMeasurer as l, isImageBackedComponent as m, isRichText as n, measureTextMm as o, toRenderPlan as t, wrapText as w };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
type ComponentKind = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
|
|
2
|
+
interface ComponentStyle {
|
|
3
|
+
fontSizePx?: number;
|
|
4
|
+
fontSize?: number;
|
|
5
|
+
fontFamily?: string;
|
|
6
|
+
bold?: boolean;
|
|
7
|
+
italic?: boolean;
|
|
8
|
+
underline?: boolean;
|
|
9
|
+
color?: string;
|
|
10
|
+
backgroundColor?: string;
|
|
11
|
+
align?: "left" | "center" | "right" | "justify";
|
|
12
|
+
verticalAlign?: "top" | "middle" | "bottom";
|
|
13
|
+
lineColor?: string;
|
|
14
|
+
borderColor?: string;
|
|
15
|
+
lineWidthPt?: number;
|
|
16
|
+
borderTop?: boolean;
|
|
17
|
+
borderRight?: boolean;
|
|
18
|
+
borderBottom?: boolean;
|
|
19
|
+
borderLeft?: boolean;
|
|
20
|
+
lineHeight?: number;
|
|
21
|
+
letterSpacing?: number;
|
|
22
|
+
opacity?: number;
|
|
23
|
+
rotateDeg?: number;
|
|
24
|
+
}
|
|
25
|
+
interface RichParagraph {
|
|
26
|
+
segments: RichSegment[];
|
|
27
|
+
align?: ComponentStyle["align"];
|
|
28
|
+
lineHeight?: number;
|
|
29
|
+
spaceBeforeMm?: number;
|
|
30
|
+
spaceAfterMm?: number;
|
|
31
|
+
indentMm?: number;
|
|
32
|
+
}
|
|
33
|
+
interface RichSegment {
|
|
34
|
+
kind?: "text" | "field";
|
|
35
|
+
text?: string;
|
|
36
|
+
field?: string;
|
|
37
|
+
style?: ComponentStyle;
|
|
38
|
+
}
|
|
39
|
+
interface GridCell {
|
|
40
|
+
text?: string;
|
|
41
|
+
rawText?: string;
|
|
42
|
+
children?: PlanComponent[];
|
|
43
|
+
colSpan?: number;
|
|
44
|
+
rowSpan?: number;
|
|
45
|
+
style?: ComponentStyle;
|
|
46
|
+
}
|
|
47
|
+
interface PlanGrid {
|
|
48
|
+
/** 行内允许 null 空位(jh4j 契约数据存在稀疏行;渲染器按空单元格处理) */
|
|
49
|
+
cells: (GridCell | null)[][];
|
|
50
|
+
colWidthsMm?: number[];
|
|
51
|
+
rowHeightsMm?: number[];
|
|
52
|
+
gapMm?: number;
|
|
53
|
+
}
|
|
54
|
+
interface PlanComponent {
|
|
55
|
+
kind: ComponentKind;
|
|
56
|
+
leftMm: number;
|
|
57
|
+
topMm: number;
|
|
58
|
+
widthMm: number;
|
|
59
|
+
heightMm: number;
|
|
60
|
+
nid?: string;
|
|
61
|
+
rkey?: string;
|
|
62
|
+
text?: string;
|
|
63
|
+
rawText?: string;
|
|
64
|
+
lines?: string[];
|
|
65
|
+
richParagraphs?: RichParagraph[];
|
|
66
|
+
imageData?: string;
|
|
67
|
+
grid?: PlanGrid;
|
|
68
|
+
style?: ComponentStyle;
|
|
69
|
+
meta?: Record<string, unknown>;
|
|
70
|
+
/** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
|
|
71
|
+
fallbackText?: string;
|
|
72
|
+
}
|
|
73
|
+
interface PlanPage {
|
|
74
|
+
pageWidthMm: number;
|
|
75
|
+
pageHeightMm: number;
|
|
76
|
+
marginTopMm?: number;
|
|
77
|
+
marginBottomMm?: number;
|
|
78
|
+
marginLeftMm?: number;
|
|
79
|
+
marginRightMm?: number;
|
|
80
|
+
components: PlanComponent[];
|
|
81
|
+
}
|
|
82
|
+
interface GridPlanResponse {
|
|
83
|
+
code?: number;
|
|
84
|
+
message?: string;
|
|
85
|
+
data?: {
|
|
86
|
+
pages?: PlanPage[];
|
|
87
|
+
} | null;
|
|
88
|
+
}
|
|
89
|
+
interface RenderPlan {
|
|
90
|
+
schemaVersion: string;
|
|
91
|
+
pages: PlanPage[];
|
|
92
|
+
}
|
|
93
|
+
declare const RENDER_PLAN_SCHEMA_VERSION = "1.0.0-mach";
|
|
94
|
+
declare function toRenderPlan(response: GridPlanResponse): RenderPlan;
|
|
95
|
+
declare function isImageBackedComponent(comp: PlanComponent): boolean;
|
|
96
|
+
declare function isRichText(comp: PlanComponent): boolean;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
|
|
100
|
+
*
|
|
101
|
+
* 测量模型可注入(TextMeasurer):
|
|
102
|
+
* - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
|
|
103
|
+
* - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
|
|
104
|
+
*/
|
|
105
|
+
interface TextMeasureOptions {
|
|
106
|
+
fontSizePt: number;
|
|
107
|
+
bold?: boolean;
|
|
108
|
+
letterSpacingPt?: number;
|
|
109
|
+
}
|
|
110
|
+
/** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
|
|
111
|
+
interface TextMeasurer {
|
|
112
|
+
measureMm(text: string, options: TextMeasureOptions): number;
|
|
113
|
+
}
|
|
114
|
+
declare function charWidthEm(ch: string): number;
|
|
115
|
+
/** 启发式测量器:宽度模型与 jh4j 近似口径一致(默认实现) */
|
|
116
|
+
declare const heuristicMeasurer: TextMeasurer;
|
|
117
|
+
/** 兼容旧 API:默认启发式测量 */
|
|
118
|
+
declare function createHeuristicMeasurer(): TextMeasurer;
|
|
119
|
+
declare function measureTextMm(text: string, options: TextMeasureOptions): number;
|
|
120
|
+
/**
|
|
121
|
+
* 浏览器 Canvas 测量器:用真实字体 metrics 校准宽度(可选注入)。
|
|
122
|
+
* 无 2D 环境时自动回退启发式(Node/SSR 安全)。
|
|
123
|
+
*/
|
|
124
|
+
declare function createCanvasMeasurer(getCtx2d: () => CanvasRenderingContext2D | null): TextMeasurer;
|
|
125
|
+
/**
|
|
126
|
+
* 文本折行:
|
|
127
|
+
* - CJK 字符任意位置可断(与既有行为一致)
|
|
128
|
+
* - 连续拉丁/数字串视为一个词,仅在词间(空格/CJK 边界)断行;
|
|
129
|
+
* 单词本身超宽时按字符硬拆(兜底,不无限溢出)
|
|
130
|
+
* - 换行符强制断行;行首不保留折行产生的空格
|
|
131
|
+
* - 可注入 TextMeasurer(默认启发式)
|
|
132
|
+
*/
|
|
133
|
+
declare function wrapText(text: string, maxWidthMm: number, options: TextMeasureOptions, measurer?: TextMeasurer): string[];
|
|
134
|
+
|
|
135
|
+
export { type ComponentStyle as C, type GridCell as G, type PlanPage as P, type RenderPlan as R, type TextMeasurer as T, type PlanComponent as a, type PlanGrid as b, type ComponentKind as c, type GridPlanResponse as d, RENDER_PLAN_SCHEMA_VERSION as e, type RichParagraph as f, type RichSegment as g, type TextMeasureOptions as h, charWidthEm as i, createCanvasMeasurer as j, createHeuristicMeasurer as k, heuristicMeasurer as l, isImageBackedComponent as m, isRichText as n, measureTextMm as o, toRenderPlan as t, wrapText as w };
|
package/package.json
CHANGED
|
@@ -1,42 +1,71 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agile-team/mach-report",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MachReport 报表引擎单包:RenderPlan 模型 + 分页 + DOM/Canvas/PDF 渲染 + 动态 SQL + 管理端 API
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "MachReport 报表引擎单包:RenderPlan 模型 + 分页 + DOM/Canvas/PDF 渲染 + 动态 SQL + 管理端 API(框架无关、零运行时依赖、子路径按需引入)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
|
-
"main": "./dist/index.
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"
|
|
12
|
-
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
13
19
|
},
|
|
14
20
|
"./pdf": {
|
|
15
|
-
"
|
|
16
|
-
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./dist/pdf.d.ts",
|
|
23
|
+
"default": "./dist/pdf.js"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"types": "./dist/pdf.d.cts",
|
|
27
|
+
"default": "./dist/pdf.cjs"
|
|
28
|
+
}
|
|
17
29
|
},
|
|
18
30
|
"./sql": {
|
|
19
|
-
"
|
|
20
|
-
|
|
31
|
+
"import": {
|
|
32
|
+
"types": "./dist/sql.d.ts",
|
|
33
|
+
"default": "./dist/sql.js"
|
|
34
|
+
},
|
|
35
|
+
"require": {
|
|
36
|
+
"types": "./dist/sql.d.cts",
|
|
37
|
+
"default": "./dist/sql.cjs"
|
|
38
|
+
}
|
|
21
39
|
},
|
|
22
40
|
"./manager": {
|
|
23
|
-
"
|
|
24
|
-
|
|
41
|
+
"import": {
|
|
42
|
+
"types": "./dist/manager.d.ts",
|
|
43
|
+
"default": "./dist/manager.js"
|
|
44
|
+
},
|
|
45
|
+
"require": {
|
|
46
|
+
"types": "./dist/manager.d.cts",
|
|
47
|
+
"default": "./dist/manager.cjs"
|
|
48
|
+
}
|
|
25
49
|
}
|
|
26
50
|
},
|
|
27
51
|
"publishConfig": {
|
|
28
52
|
"access": "public"
|
|
29
53
|
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18.0.0"
|
|
56
|
+
},
|
|
30
57
|
"files": [
|
|
31
58
|
"dist"
|
|
32
59
|
],
|
|
33
|
-
"
|
|
60
|
+
"devDependencies": {
|
|
34
61
|
"@pdf-lib/fontkit": "^1.1.1",
|
|
35
62
|
"node-sql-parser": "^5.4.0",
|
|
36
|
-
"pdf-lib": "^1.17.1"
|
|
63
|
+
"pdf-lib": "^1.17.1",
|
|
64
|
+
"tsup": "^8.0.0"
|
|
37
65
|
},
|
|
38
66
|
"scripts": {
|
|
39
|
-
"build": "
|
|
67
|
+
"build": "tsup && node scripts/copy-dcts.mjs",
|
|
40
68
|
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
|
|
41
|
-
}
|
|
69
|
+
},
|
|
70
|
+
"module": "./dist/index.js"
|
|
42
71
|
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { ListColumn, ListComponent, ReportTemplate, TemplatePage } from "../layout/paginate";
|
|
2
|
-
import type { ComponentStyle, PlanComponent } from "../schema/render-plan";
|
|
3
|
-
import { PAPER_SIZES } from "../units";
|
|
4
|
-
type Geometry = Partial<Pick<PlanComponent, "leftMm" | "topMm" | "widthMm" | "heightMm">>;
|
|
5
|
-
/** 纸张预设名(对齐 PAPER_SIZES 表) */
|
|
6
|
-
export type PaperName = keyof typeof PAPER_SIZES;
|
|
7
|
-
export interface PageOptions {
|
|
8
|
-
/** 横向(宽高互换) */
|
|
9
|
-
landscape?: boolean;
|
|
10
|
-
margins?: Partial<Pick<TemplatePage, "marginTopMm" | "marginBottomMm" | "marginLeftMm" | "marginRightMm">>;
|
|
11
|
-
}
|
|
12
|
-
type PageMargins = Partial<Pick<TemplatePage, "marginTopMm" | "marginBottomMm" | "marginLeftMm" | "marginRightMm">>;
|
|
13
|
-
/** 解析纸张参数:数字按宽高使用;字符串查 PAPER_SIZES 预设;缺省 A4 纵向 */
|
|
14
|
-
export declare function resolvePaper(paper: PaperName | {
|
|
15
|
-
widthMm: number;
|
|
16
|
-
heightMm: number;
|
|
17
|
-
} | number, heightArg?: number, landscape?: boolean): {
|
|
18
|
-
widthMm: number;
|
|
19
|
-
heightMm: number;
|
|
20
|
-
};
|
|
21
|
-
export declare class TemplateBuilder {
|
|
22
|
-
readonly pages: TemplatePage[];
|
|
23
|
-
private pending;
|
|
24
|
-
/**
|
|
25
|
-
* 新建页。纸张支持三种写法:
|
|
26
|
-
* - 预设名:.page("a4", { landscape: true, margins: {...} })
|
|
27
|
-
* - 数字:.page(210, 297)(第三参数兼容旧 margins 对象或新 options)
|
|
28
|
-
* - 对象:.page({ widthMm: 210, heightMm: 297 })
|
|
29
|
-
*/
|
|
30
|
-
page(paper?: PaperName | {
|
|
31
|
-
widthMm: number;
|
|
32
|
-
heightMm: number;
|
|
33
|
-
} | number, optionsOrHeight?: number | PageOptions, maybeOptions?: PageOptions | PageMargins): PageBuilder;
|
|
34
|
-
collect(): void;
|
|
35
|
-
build(): ReportTemplate;
|
|
36
|
-
}
|
|
37
|
-
export declare class PageBuilder {
|
|
38
|
-
private readonly parent;
|
|
39
|
-
private readonly page;
|
|
40
|
-
private components;
|
|
41
|
-
constructor(parent: TemplateBuilder, page: Omit<TemplatePage, "components">);
|
|
42
|
-
text(content: string, geometry?: Geometry, style?: ComponentStyle): this;
|
|
43
|
-
list(dataset: string, geometry: Partial<Pick<ListComponent, "leftMm" | "topMm" | "widthMm">>, columns: ListColumn[], options?: Partial<Omit<ListComponent, "kind" | "leftMm" | "topMm" | "widthMm" | "dataset" | "columns">>): this;
|
|
44
|
-
rect(geometry: Required<Pick<PlanComponent, "leftMm" | "topMm" | "widthMm" | "heightMm">>, style?: ComponentStyle): this;
|
|
45
|
-
line(leftMm: number, topMm: number, widthMm: number, style?: ComponentStyle): this;
|
|
46
|
-
barcode(content: string, geometry: Required<Geometry>): this;
|
|
47
|
-
qrcode(content: string, sizeMm: number, leftMm: number, topMm: number): this;
|
|
48
|
-
buildPage(): TemplatePage;
|
|
49
|
-
done(): TemplateBuilder;
|
|
50
|
-
build(): ReportTemplate;
|
|
51
|
-
}
|
|
52
|
-
export declare function createTemplate(): TemplateBuilder;
|
|
53
|
-
export {};
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { PAPER_SIZES } from "../units";
|
|
2
|
-
/** 解析纸张参数:数字按宽高使用;字符串查 PAPER_SIZES 预设;缺省 A4 纵向 */
|
|
3
|
-
export function resolvePaper(paper, heightArg, landscape) {
|
|
4
|
-
let widthMm;
|
|
5
|
-
let heightMm;
|
|
6
|
-
if (typeof paper === "string") {
|
|
7
|
-
const preset = PAPER_SIZES[paper];
|
|
8
|
-
if (!preset)
|
|
9
|
-
throw new Error(`未知纸张预设 "${paper}"(可用:${Object.keys(PAPER_SIZES).join("/")})`);
|
|
10
|
-
widthMm = preset.widthMm;
|
|
11
|
-
heightMm = preset.heightMm;
|
|
12
|
-
}
|
|
13
|
-
else if (typeof paper === "number") {
|
|
14
|
-
widthMm = paper;
|
|
15
|
-
heightMm = heightArg ?? 297;
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
widthMm = paper.widthMm;
|
|
19
|
-
heightMm = paper.heightMm;
|
|
20
|
-
}
|
|
21
|
-
return landscape ? { widthMm: heightMm, heightMm: widthMm } : { widthMm, heightMm };
|
|
22
|
-
}
|
|
23
|
-
export class TemplateBuilder {
|
|
24
|
-
constructor() {
|
|
25
|
-
this.pages = [];
|
|
26
|
-
this.pending = null;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* 新建页。纸张支持三种写法:
|
|
30
|
-
* - 预设名:.page("a4", { landscape: true, margins: {...} })
|
|
31
|
-
* - 数字:.page(210, 297)(第三参数兼容旧 margins 对象或新 options)
|
|
32
|
-
* - 对象:.page({ widthMm: 210, heightMm: 297 })
|
|
33
|
-
*/
|
|
34
|
-
page(paper = "a4", optionsOrHeight = {}, maybeOptions) {
|
|
35
|
-
this.collect();
|
|
36
|
-
// 旧签名兼容:.page(w, h, { marginTopMm }) 的第三参数是 margins 本体
|
|
37
|
-
const legacyMargins = maybeOptions != null &&
|
|
38
|
-
!("margins" in maybeOptions) &&
|
|
39
|
-
!("landscape" in maybeOptions) &&
|
|
40
|
-
("marginTopMm" in maybeOptions ||
|
|
41
|
-
"marginBottomMm" in maybeOptions ||
|
|
42
|
-
"marginLeftMm" in maybeOptions ||
|
|
43
|
-
"marginRightMm" in maybeOptions);
|
|
44
|
-
const options = legacyMargins
|
|
45
|
-
? { margins: maybeOptions }
|
|
46
|
-
: (maybeOptions ?? {});
|
|
47
|
-
const { widthMm, heightMm } = resolvePaper(paper, typeof optionsOrHeight === "number" ? optionsOrHeight : undefined, options.landscape);
|
|
48
|
-
const margins = options.margins ?? {};
|
|
49
|
-
this.pending = new PageBuilder(this, {
|
|
50
|
-
widthMm,
|
|
51
|
-
heightMm,
|
|
52
|
-
marginTopMm: margins.marginTopMm ?? 10,
|
|
53
|
-
marginBottomMm: margins.marginBottomMm ?? 10,
|
|
54
|
-
marginLeftMm: margins.marginLeftMm ?? 10,
|
|
55
|
-
marginRightMm: margins.marginRightMm ?? 10
|
|
56
|
-
});
|
|
57
|
-
return this.pending;
|
|
58
|
-
}
|
|
59
|
-
collect() {
|
|
60
|
-
if (this.pending) {
|
|
61
|
-
this.pages.push(this.pending.buildPage());
|
|
62
|
-
this.pending = null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
build() {
|
|
66
|
-
this.collect();
|
|
67
|
-
if (this.pages.length === 0) {
|
|
68
|
-
throw new Error("模板至少需要一页:先调用 .page() 添加内容");
|
|
69
|
-
}
|
|
70
|
-
return { pages: this.pages };
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
export class PageBuilder {
|
|
74
|
-
constructor(parent, page) {
|
|
75
|
-
this.parent = parent;
|
|
76
|
-
this.page = page;
|
|
77
|
-
this.components = [];
|
|
78
|
-
}
|
|
79
|
-
text(content, geometry = {}, style = {}) {
|
|
80
|
-
this.components.push({
|
|
81
|
-
kind: "text",
|
|
82
|
-
leftMm: geometry.leftMm ?? 0,
|
|
83
|
-
topMm: geometry.topMm ?? 0,
|
|
84
|
-
widthMm: geometry.widthMm ?? 60,
|
|
85
|
-
heightMm: geometry.heightMm ?? 8,
|
|
86
|
-
text: content,
|
|
87
|
-
style
|
|
88
|
-
});
|
|
89
|
-
return this;
|
|
90
|
-
}
|
|
91
|
-
list(dataset, geometry, columns, options = {}) {
|
|
92
|
-
this.components.push({
|
|
93
|
-
kind: "list",
|
|
94
|
-
leftMm: geometry.leftMm ?? 10,
|
|
95
|
-
topMm: geometry.topMm ?? 30,
|
|
96
|
-
widthMm: geometry.widthMm ?? 180,
|
|
97
|
-
dataset,
|
|
98
|
-
columns,
|
|
99
|
-
...options
|
|
100
|
-
});
|
|
101
|
-
return this;
|
|
102
|
-
}
|
|
103
|
-
rect(geometry, style = {}) {
|
|
104
|
-
this.components.push({ kind: "rect", ...geometry, style });
|
|
105
|
-
return this;
|
|
106
|
-
}
|
|
107
|
-
line(leftMm, topMm, widthMm, style = {}) {
|
|
108
|
-
this.components.push({
|
|
109
|
-
kind: "line",
|
|
110
|
-
leftMm,
|
|
111
|
-
topMm,
|
|
112
|
-
widthMm,
|
|
113
|
-
heightMm: 0.5,
|
|
114
|
-
style
|
|
115
|
-
});
|
|
116
|
-
return this;
|
|
117
|
-
}
|
|
118
|
-
barcode(content, geometry) {
|
|
119
|
-
this.components.push({
|
|
120
|
-
kind: "barcode",
|
|
121
|
-
leftMm: geometry.leftMm ?? 0,
|
|
122
|
-
topMm: geometry.topMm ?? 0,
|
|
123
|
-
widthMm: geometry.widthMm ?? 40,
|
|
124
|
-
heightMm: geometry.heightMm ?? 12,
|
|
125
|
-
fallbackText: content
|
|
126
|
-
});
|
|
127
|
-
return this;
|
|
128
|
-
}
|
|
129
|
-
qrcode(content, sizeMm, leftMm, topMm) {
|
|
130
|
-
this.components.push({
|
|
131
|
-
kind: "qrcode",
|
|
132
|
-
leftMm,
|
|
133
|
-
topMm,
|
|
134
|
-
widthMm: sizeMm,
|
|
135
|
-
heightMm: sizeMm,
|
|
136
|
-
fallbackText: content
|
|
137
|
-
});
|
|
138
|
-
return this;
|
|
139
|
-
}
|
|
140
|
-
buildPage() {
|
|
141
|
-
return { ...this.page, components: this.components };
|
|
142
|
-
}
|
|
143
|
-
done() {
|
|
144
|
-
return this.parent;
|
|
145
|
-
}
|
|
146
|
-
build() {
|
|
147
|
-
return this.done().build();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
export function createTemplate() {
|
|
151
|
-
return new TemplateBuilder();
|
|
152
|
-
}
|
|
153
|
-
//# sourceMappingURL=template-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-builder.js","sourceRoot":"","sources":["../../src/builder/template-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ReportTemplate } from "../layout/paginate";
|
|
2
|
-
export interface Jh4jImportResult {
|
|
3
|
-
template: ReportTemplate;
|
|
4
|
-
warnings: string[];
|
|
5
|
-
}
|
|
6
|
-
type Raw = Record<string, unknown>;
|
|
7
|
-
/**
|
|
8
|
-
* jh4j 模板 content(exportBackendPrintConfig 产物,见 docs/reverse-findings.md §6)
|
|
9
|
-
* → MachReport ReportTemplate。单向转换,未知结构降级 + 告警,绝不抛错。
|
|
10
|
-
*/
|
|
11
|
-
export declare function importJh4jTemplateContent(content: string | Raw): Jh4jImportResult;
|
|
12
|
-
export {};
|