@agile-team/mach-report 2.8.4 → 2.9.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.
Files changed (94) hide show
  1. package/README.md +27 -9
  2. package/dist/ExcelBindingWizard-DiaxvWpQ.cjs +1 -0
  3. package/dist/ExcelBindingWizard-RLJIXKKG.js +816 -0
  4. package/dist/{ReportPreview-DTWiCH5a.js → ReportPreview-B5ZNEasW.js} +22 -21
  5. package/dist/ReportPreview-DRtVPUYo.cjs +6 -0
  6. package/dist/RuleEditor-CskN5Fr3.cjs +1 -0
  7. package/dist/RuleEditor-CtJFzKuY.js +1578 -0
  8. package/dist/TemplateReviewPanel-C_Lmzis6.cjs +1 -0
  9. package/dist/TemplateReviewPanel-Cn32OY4_.js +173 -0
  10. package/dist/analytics.cjs +1 -1
  11. package/dist/analytics.d.cts +188 -5
  12. package/dist/analytics.d.ts +188 -5
  13. package/dist/analytics.js +68 -202
  14. package/dist/{assets-B9qJku3V.js → assets-DDsfEi8R.js} +3 -3
  15. package/dist/{assets-RZan7EyL.cjs → assets-ahTRUXRk.cjs} +1 -1
  16. package/dist/binding-preview-B5834rml.cjs +2 -0
  17. package/dist/binding-preview-ChXjN5L5.js +649 -0
  18. package/dist/{capabilities-joSutDF8.js → capabilities-Cm9hZ3uV.js} +5 -5
  19. package/dist/{capabilities-xGTpnPjJ.cjs → capabilities-DYzWL7KS.cjs} +1 -1
  20. package/dist/dataset-BkRmwgeJ.cjs +1 -0
  21. package/dist/dataset-H5pFuQGU.js +121 -0
  22. package/dist/defaults-DXhiM1ZD.js +10 -0
  23. package/dist/defaults-xhmcLLrf.cjs +1 -0
  24. package/dist/designer.cjs +2 -1
  25. package/dist/designer.d.cts +1373 -6
  26. package/dist/designer.d.ts +1373 -6
  27. package/dist/designer.js +2495 -767
  28. package/dist/grid-geometry-BNptEcMm.js +65 -0
  29. package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
  30. package/dist/import-template-CNMLJSQw.js +23030 -0
  31. package/dist/import-template-CpxunKVp.cjs +29 -0
  32. package/dist/index.cjs +7 -7
  33. package/dist/index.d.cts +202 -3
  34. package/dist/index.d.ts +202 -3
  35. package/dist/index.js +554 -535
  36. package/dist/matrix-CNPDJxED.js +745 -0
  37. package/dist/matrix-Div9Ilh3.cjs +1 -0
  38. package/dist/pdf.cjs +46 -46
  39. package/dist/pdf.d.cts +2 -0
  40. package/dist/pdf.d.ts +2 -0
  41. package/dist/pdf.js +17 -16
  42. package/dist/{plugin-CQmJXNcA.js → plugin-BWwIgZXV.js} +1 -1
  43. package/dist/{plugin-DSFu51Ua.cjs → plugin-Dg-J1Rbm.cjs} +1 -1
  44. package/dist/progress-7OSZbFok.js +39 -0
  45. package/dist/progress-BnLiS5eH.cjs +1 -0
  46. package/dist/render-plan-7xpGrCEl.cjs +1 -0
  47. package/dist/render-plan-Ck6koX9L.js +13 -0
  48. package/dist/server/node.d.cts +62 -0
  49. package/dist/server/node.d.ts +62 -0
  50. package/dist/server-node.cjs +1 -1
  51. package/dist/server-node.js +373 -145
  52. package/dist/server.cjs +1 -1
  53. package/dist/server.d.cts +311 -0
  54. package/dist/server.d.ts +311 -0
  55. package/dist/server.js +590 -186
  56. package/dist/{style-Dv5o_x6b.js → style-CQ1PK8ZB.js} +5 -5
  57. package/dist/style-UgIJSA1F.cjs +1 -0
  58. package/dist/style.css +1 -1
  59. package/dist/template-registry-CHMYZ7SD.cjs +1 -0
  60. package/dist/template-registry-R61AMCr0.js +433 -0
  61. package/dist/template-review-hvWWQFsi.js +1027 -0
  62. package/dist/template-review-jEcOfmGr.cjs +1 -0
  63. package/dist/textwrap-CWHyzkBH.cjs +4 -0
  64. package/dist/{textwrap-DOl04hCQ.js → textwrap-DE1kgcJB.js} +1 -1
  65. package/dist/{validate-DfHPD8wX.cjs → validate-BDiMqkJC.cjs} +1 -1
  66. package/dist/{validate-S6CgIm5d.js → validate-DWPF7icl.js} +13 -13
  67. package/dist/vue/async.d.cts +186 -0
  68. package/dist/vue/async.d.ts +186 -0
  69. package/dist/vue/index.d.cts +271 -3
  70. package/dist/vue/index.d.ts +271 -3
  71. package/dist/vue-async.cjs +1 -1
  72. package/dist/vue-async.js +3 -3
  73. package/dist/vue.cjs +1 -1
  74. package/dist/vue.js +4 -4
  75. package/dist/worker.cjs +1 -1
  76. package/dist/worker.d.cts +2 -0
  77. package/dist/worker.d.ts +2 -0
  78. package/dist/worker.js +1 -1
  79. package/dist/xlsx.cjs +2 -30
  80. package/dist/xlsx.d.cts +268 -0
  81. package/dist/xlsx.d.ts +268 -0
  82. package/dist/xlsx.js +220 -23440
  83. package/package.json +1 -1
  84. package/dist/ReportPreview-DjGeWHY-.cjs +0 -6
  85. package/dist/progress-DD964VAB.js +0 -102
  86. package/dist/progress-KvhwXZ1Q.cjs +0 -1
  87. package/dist/render-plan-CckPEQyf.cjs +0 -1
  88. package/dist/render-plan-uzZYYSy1.js +0 -19
  89. package/dist/report-source-BXHNy_AD.js +0 -755
  90. package/dist/report-source-CCAvFE3t.cjs +0 -1
  91. package/dist/style-CpwiOPyB.cjs +0 -1
  92. package/dist/template-registry-DWExx0gU.cjs +0 -1
  93. package/dist/template-registry-NpOakidD.js +0 -354
  94. package/dist/textwrap-CnGsEum6.cjs +0 -4
package/dist/server.d.ts CHANGED
@@ -1,3 +1,19 @@
1
+ declare interface AggregateDefinition {
2
+ /** Output column; valueField defaults to this field. */
3
+ field: string;
4
+ op: AggregateOperation;
5
+ valueField?: string;
6
+ weightField?: string;
7
+ numeric?: "number" | "decimal";
8
+ digits?: number;
9
+ }
10
+
11
+ declare type AggregateOperation = "sum" | "count" | "avg" | "min" | "max" | "weightedAvg";
12
+
13
+ export declare function checkJobIdentity(scope: string, id: string): void;
14
+
15
+ export declare function cloneJob<T>(value: T): T;
16
+
1
17
  /**
2
18
  * 列值格式化(声明式、JSON 可序列化)。
3
19
  * 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
@@ -47,6 +63,22 @@ declare interface ComponentStyle {
47
63
  rotateDeg?: number;
48
64
  }
49
65
 
66
+ declare interface ComputedField extends ExpressionOptions {
67
+ field: string;
68
+ expression: ReportExpression | string;
69
+ /** Scope controls aggregate inputs; row expressions may reference the current row in any scope. */
70
+ scope?: "row" | "group" | "dataset";
71
+ groupBy?: readonly string[];
72
+ /** String adapter expressions cannot be inspected; declare dependencies explicitly. */
73
+ dependsOn?: readonly string[];
74
+ }
75
+
76
+ /** Reference store for tests; use a database CAS or the single-process durable Node adapter in production. */
77
+ export declare function createMemoryReportJobStore(): ReportJobStore;
78
+
79
+ /** Durable at-least-once dispatch; export/artifact handlers must be idempotent by scope+taskId. */
80
+ export declare function createReportJobService(options: ReportJobServiceOptions): ReportJobService;
81
+
50
82
  /** 无 Vue、无 HTTP 框架的可选服务端外观;PDF/Excel 仅在对应 export 调用时加载。 */
51
83
  export declare function createReportRuntime(options: ReportRuntimeOptions): ReportRuntime;
52
84
 
@@ -70,6 +102,22 @@ declare interface DatasetValidationOptions {
70
102
  maxIssues?: number;
71
103
  }
72
104
 
105
+ declare interface ExpressionOptions {
106
+ numeric?: "number" | "decimal";
107
+ digits?: number;
108
+ nulls?: "propagate" | "error";
109
+ divisionByZero?: "null" | "error";
110
+ }
111
+
112
+ declare interface FormulaAdapter {
113
+ /** Explicit trusted engine; core never evaluates source code/macros/external workbook references. */
114
+ evaluate(expression: string, context: {
115
+ row: Readonly<Record<string, unknown>>;
116
+ rowIndex: number;
117
+ rows: readonly Record<string, unknown>[];
118
+ }): unknown;
119
+ }
120
+
73
121
  declare interface GridCell {
74
122
  text?: string;
75
123
  rawText?: string;
@@ -114,6 +162,9 @@ declare interface ListColumn {
114
162
  valueType?: GridCell["valueType"];
115
163
  /** 字段语义用于 auto 对齐;明确声明编号,避免把数字编号当成度量。 */
116
164
  semanticRole?: "identifier" | "dimension" | "measure" | "date" | "text";
165
+ hidden?: boolean;
166
+ /** Condition hides cell content, preserving its physical layout in preview and exports. */
167
+ visibleWhen?: StyleRule["when"];
117
168
  }
118
169
 
119
170
  declare interface ListComponent {
@@ -148,15 +199,38 @@ declare interface ListComponent {
148
199
  border?: boolean;
149
200
  /** 分组小计(组头/组尾小计/组头防孤行) */
150
201
  groupBy?: ListGroupBy;
202
+ /** Ordered outer-to-inner grouping; groupBy remains the single-level shorthand. */
203
+ groups?: ListGroupBy[];
204
+ computed?: ComputedField[];
205
+ /** Dynamic pivot of the current source dataset, with read-only derived identities. */
206
+ matrix?: MatrixTableOptions;
207
+ /** Explicit row visibility; hidden rows do not participate in summaries. */
208
+ rowVisibleWhen?: StyleRule["when"];
209
+ /** Master/detail relation is keyed by business identity, never by display row index. */
210
+ detail?: ListDetail;
151
211
  /** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
152
212
  grandTotal?: ListGrandTotal;
153
213
  }
154
214
 
215
+ declare interface ListDetail {
216
+ dataset: string;
217
+ parentKey: string;
218
+ foreignKey: string;
219
+ rowKey?: string;
220
+ columns: ListColumn[];
221
+ rowHeightMm?: number;
222
+ header?: boolean;
223
+ label?: string;
224
+ /** Unmatched children fail by default; opt-in ignore is explicit. */
225
+ unmatched?: "error" | "ignore";
226
+ }
227
+
155
228
  declare type ListGrandTotal = boolean | {
156
229
  label?: string;
157
230
  style?: ComponentStyle;
158
231
  /** 合计列(缺省沿用 groupBy.subtotal) */
159
232
  fields?: string[];
233
+ aggregates?: AggregateDefinition[];
160
234
  };
161
235
 
162
236
  /** 分组小计配置(声明式,见 ListComponent.groupBy) */
@@ -172,8 +246,42 @@ declare interface ListGroupBy {
172
246
  subtotalLabel?: string;
173
247
  /** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
174
248
  keepWithNext?: boolean;
249
+ aggregates?: AggregateDefinition[];
250
+ /** Repeat this group heading after page breaks within the group. */
251
+ repeatHeader?: boolean;
252
+ }
253
+
254
+ declare interface MatrixTableOptions {
255
+ rowFields: readonly string[];
256
+ columnFields: readonly string[];
257
+ measures: readonly (AggregateDefinition & {
258
+ label?: string;
259
+ })[];
260
+ totals?: boolean;
261
+ rowHeader?: string;
262
+ columnWidthMm?: number;
263
+ rowWidthMm?: number;
264
+ maxRows?: number;
265
+ maxColumns?: number;
266
+ maxInputRows?: number;
267
+ maxCells?: number;
268
+ }
269
+
270
+ declare interface OutputDiagnostic {
271
+ code: "missing-image" | "unsupported-component" | "unsupported-image-format" | "unsupported-style" | "rich-text-flattened" | "nested-components-omitted" | "async-image-required" | "image-decode-failed" | "asset-render-failed" | "asset-budget-exceeded";
272
+ severity: "warning";
273
+ format: OutputFormat;
274
+ pageIndex: number;
275
+ componentIndex: number;
276
+ /** Nested grid child location as repeating [rowIndex, columnIndex, childIndex] triples. */
277
+ componentPath?: readonly number[];
278
+ kind: string;
279
+ nid?: string;
280
+ message: string;
175
281
  }
176
282
 
283
+ declare type OutputFormat = "dom" | "canvas" | "pdf" | "xlsx";
284
+
177
285
  declare interface PaginateOptions {
178
286
  /** 每行额外占高(mm),压测专用钩子 */
179
287
  mmPerRow?: number;
@@ -181,9 +289,19 @@ declare interface PaginateOptions {
181
289
  measurer?: TextMeasurer;
182
290
  /** 可选页数上限;在追加超限页前终止,避免先分配全部页面再检查。 */
183
291
  maxPages?: number;
292
+ /** Actual grid cells, including repeated furniture and nested children; checked before each page is appended. */
293
+ maxCells?: number;
294
+ signal?: AbortSignal;
295
+ /** Streaming total-page anchors can skip the bounded counting pass when known. */
296
+ knownTotalPages?: number;
297
+ onWarning?: (warning: string) => void;
298
+ /** Trusted formula adapter is passed at execution time; it is never serialized in templates. */
299
+ formula?: FormulaAdapter;
184
300
  }
185
301
 
186
302
  declare interface PlanComponent {
303
+ /** Template page furniture repeats per page and reserves its vertical band. */
304
+ pageAnchor?: "header" | "footer";
187
305
  kind: ComponentKind;
188
306
  leftMm: number;
189
307
  topMm: number;
@@ -333,6 +451,19 @@ declare interface ReportDiagnostic {
333
451
  severity: "warning" | "error" | "info";
334
452
  }
335
453
 
454
+ declare type ReportExpression = {
455
+ field: string;
456
+ } | {
457
+ value: string | number | boolean | null;
458
+ } | {
459
+ aggregate: AggregateOperation;
460
+ field?: string;
461
+ weightField?: string;
462
+ } | {
463
+ op: "add" | "subtract" | "multiply" | "divide" | "coalesce";
464
+ args: readonly ReportExpression[];
465
+ };
466
+
336
467
  declare interface ReportFieldContract {
337
468
  field: string;
338
469
  label?: string;
@@ -348,6 +479,87 @@ declare interface ReportFieldContract {
348
479
  unit?: string;
349
480
  }
350
481
 
482
+ export declare class ReportJobError extends Error {
483
+ readonly code: "input" | "conflict" | "missing" | "lease" | "closed" | "capacity";
484
+ constructor(code: "input" | "conflict" | "missing" | "lease" | "closed" | "capacity", message: string);
485
+ }
486
+
487
+ export declare interface ReportJobExecutionContext {
488
+ scope: string;
489
+ taskId: string;
490
+ signal: AbortSignal;
491
+ reportProgress(completed: number, total?: number): Promise<void>;
492
+ }
493
+
494
+ export declare type ReportJobHandler = (payload: ReportJobJson, context: ReportJobExecutionContext) => ReportJobJson | Promise<ReportJobJson>;
495
+
496
+ export declare type ReportJobJson = null | boolean | number | string | ReportJobJson[] | {
497
+ [key: string]: ReportJobJson;
498
+ };
499
+
500
+ export declare interface ReportJobRecord {
501
+ scope: string;
502
+ id: string;
503
+ revision: number;
504
+ request: ReportJobRequest;
505
+ status: ReportJobStatus;
506
+ createdAt: number;
507
+ updatedAt: number;
508
+ attempt: number;
509
+ lease?: {
510
+ owner: string;
511
+ expiresAt: number;
512
+ };
513
+ cancelRequested?: boolean;
514
+ progress?: {
515
+ completed: number;
516
+ total?: number;
517
+ };
518
+ result?: ReportJobJson;
519
+ error?: {
520
+ code: string;
521
+ message: string;
522
+ };
523
+ }
524
+
525
+ export declare interface ReportJobRequest {
526
+ kind: string;
527
+ payload: ReportJobJson;
528
+ }
529
+
530
+ export declare interface ReportJobService {
531
+ submit(input: ReportJobRequest & {
532
+ scope: string;
533
+ id: string;
534
+ }): Promise<ReportJobRecord>;
535
+ get(scope: string, id: string): Promise<ReportJobRecord | undefined>;
536
+ cancel(scope: string, id: string): Promise<ReportJobRecord>;
537
+ retry(scope: string, id: string, expectedRevision: number): Promise<ReportJobRecord>;
538
+ /** Dispatch one queued/expired job. A scheduler controls when to call this method. */
539
+ runNext(workerId: string): Promise<ReportJobRecord | undefined>;
540
+ /** Stops new dispatch, signals active handlers and waits until their actual completion. */
541
+ close(): Promise<void>;
542
+ readonly active: number;
543
+ }
544
+
545
+ export declare interface ReportJobServiceOptions {
546
+ store: ReportJobStore;
547
+ handlers: Readonly<Record<string, ReportJobHandler>>;
548
+ concurrency?: number;
549
+ leaseMs?: number;
550
+ heartbeatMs?: number;
551
+ now?: () => number;
552
+ }
553
+
554
+ export declare type ReportJobStatus = "queued" | "running" | "completed" | "failed" | "cancelled";
555
+
556
+ /** CAS must be atomic across all worker instances; candidate enumeration is advisory only. */
557
+ export declare interface ReportJobStore {
558
+ read(scope: string, id: string): Promise<ReportJobRecord | undefined>;
559
+ candidates(now: number, limit: number): Promise<ReportJobRecord[]>;
560
+ compareAndSwap(scope: string, id: string, expectedRevision: number | null, next: ReportJobRecord): Promise<boolean>;
561
+ }
562
+
351
563
  /** 取数与排版共同使用的请求上下文;取消只影响本次调用。 */
352
564
  declare interface ReportLoadContext {
353
565
  reportId: string;
@@ -414,6 +626,31 @@ declare interface ReportProviderExportResult {
414
626
  diagnostics?: ReportDiagnostic[];
415
627
  }
416
628
 
629
+ export declare interface ReportPublicationArtifact {
630
+ fixture: string;
631
+ format: "pdf" | "xlsx";
632
+ bytes: number;
633
+ pages: number;
634
+ /** Optional host digest. No Node or crypto dependency is pulled into /server. */
635
+ digest?: string;
636
+ }
637
+
638
+ export declare interface ReportPublicationOptions extends ReportTemplateReviewOptions {
639
+ formats?: readonly ("pdf" | "xlsx")[];
640
+ signal?: AbortSignal;
641
+ pdf?: ReportRuntimeExportInput["pdf"];
642
+ xlsx?: ReportRuntimeExportInput["xlsx"];
643
+ maxOutputBytes?: number;
644
+ maxDurationMs?: number;
645
+ /** Explicit fixtures only. Host may archive these bytes; the result retains metadata only. */
646
+ onArtifact?: (fixture: string, result: ReportRuntimeExportResult) => void | Promise<void>;
647
+ digest?: (bytes: Uint8Array) => string | Promise<string>;
648
+ }
649
+
650
+ export declare interface ReportPublicationReview extends ReportTemplateReview {
651
+ artifacts: ReportPublicationArtifact[];
652
+ }
653
+
417
654
  declare interface ReportQueryResult {
418
655
  datasets: DatasetRows;
419
656
  revision?: string;
@@ -580,6 +817,22 @@ declare interface ReportTemplate {
580
817
  pages: TemplatePage[];
581
818
  }
582
819
 
820
+ declare interface ReportTemplateChange {
821
+ kind: "added" | "removed" | "modified" | "moved";
822
+ category: "metadata" | "structure" | "binding" | "calculation" | "format";
823
+ path: string;
824
+ before?: string;
825
+ after?: string;
826
+ breaking: boolean;
827
+ }
828
+
829
+ declare interface ReportTemplateDiff {
830
+ changes: ReportTemplateChange[];
831
+ totalChanges: number;
832
+ truncated: boolean;
833
+ breakingChanges: number;
834
+ }
835
+
583
836
  /** 可存入数据库/文件的纯 JSON 模板;数据、接口与鉴权仍由宿主提供。 */
584
837
  declare interface ReportTemplateDocument {
585
838
  schemaVersion: "1.0";
@@ -591,6 +844,12 @@ declare interface ReportTemplateDocument {
591
844
  template: ReportTemplate;
592
845
  }
593
846
 
847
+ declare interface ReportTemplateFixture {
848
+ name: string;
849
+ datasets: DatasetRows;
850
+ params?: Record<string, string>;
851
+ }
852
+
594
853
  declare type ReportTemplateLoader = (context: ReportLoadContext) => ReportTemplate | Promise<ReportTemplate>;
595
854
 
596
855
  declare interface ReportTemplateProvider {
@@ -602,8 +861,46 @@ declare interface ReportTemplateProvider {
602
861
  }): Promise<ReportTemplateDocument | undefined>;
603
862
  }
604
863
 
864
+ declare interface ReportTemplateReview {
865
+ ok: boolean;
866
+ changes?: ReportTemplateDiff;
867
+ issues: ReportTemplateReviewIssue[];
868
+ samples: Array<{
869
+ name: string;
870
+ pages: number;
871
+ rows: number;
872
+ diagnostics: OutputDiagnostic[];
873
+ }>;
874
+ }
875
+
876
+ declare interface ReportTemplateReviewIssue {
877
+ code: "template" | "compatibility" | "dataset" | "field" | "sample" | "layout" | "output";
878
+ severity: "error" | "warning";
879
+ path: string;
880
+ message: string;
881
+ fixture?: string;
882
+ pageIndex?: number;
883
+ componentIndex?: number;
884
+ field?: string;
885
+ }
886
+
887
+ declare interface ReportTemplateReviewOptions {
888
+ previous?: ReportTemplateDocument;
889
+ dataSchemas?: Readonly<Record<string, DatasetContract>>;
890
+ fixtures?: readonly ReportTemplateFixture[];
891
+ formats?: readonly OutputFormat[];
892
+ maxPages?: number;
893
+ maxCells?: number;
894
+ maxSampleRows?: number;
895
+ allowBreakingChanges?: boolean;
896
+ strictOutputs?: boolean;
897
+ }
898
+
605
899
  declare type ReportTemplateSummary = Omit<ReportTemplateDocument, "template">;
606
900
 
901
+ /** Publication gate with actual sequential PDF/XLSX encoding, no business query or implicit save. */
902
+ export declare function reviewReportPublication(input: unknown, options?: ReportPublicationOptions): Promise<ReportPublicationReview>;
903
+
607
904
  declare interface RichParagraph {
608
905
  segments: RichSegment[];
609
906
  align?: ComponentStyle["align"];
@@ -620,12 +917,22 @@ declare interface RichSegment {
620
917
  style?: ComponentStyle;
621
918
  }
622
919
 
920
+ export declare function runnableJob(record: ReportJobRecord, now: number): boolean;
921
+
922
+ /** Canonical plain JSON rejects getters/scripts and gives stable idempotency without coercion. */
923
+ export declare function serializeJobJson(value: unknown, budget?: {
924
+ maxNodes?: number;
925
+ maxCharacters?: number;
926
+ }): string;
927
+
623
928
  /** 条件格式规则求值(声明式,见 ListColumn.rules) */
624
929
  declare interface StyleRule {
625
930
  when: {
626
931
  field: string;
627
932
  op: ">" | ">=" | "<" | "<=" | "==" | "!=";
628
933
  value: number | string;
934
+ /** Explicit decimal comparisons retain decimal thresholds as text. */
935
+ numeric?: "number" | "decimal";
629
936
  };
630
937
  /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
631
938
  style: Record<string, unknown>;
@@ -665,4 +972,8 @@ declare interface TextMeasurer {
665
972
  measureMm(text: string, options: TextMeasureOptions): number;
666
973
  }
667
974
 
975
+ export declare function validateJobRecord(record: ReportJobRecord, scope: string, id: string, expectedRevision: number | null): void;
976
+
977
+ export declare function validateJobTransition(previous: ReportJobRecord | undefined, next: ReportJobRecord): void;
978
+
668
979
  export { }