@agile-team/mach-report 2.11.1 → 2.12.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/README.md +15 -6
- package/THIRD_PARTY_NOTICES.md +270 -0
- package/dist/{ExcelBindingWizard-LWX6G1A2.js → ExcelBindingWizard-CeAf4QSE.js} +2 -2
- package/dist/{ExcelBindingWizard-a4kslPHF.cjs → ExcelBindingWizard-y0mT-AHR.cjs} +1 -1
- package/dist/{RuleEditor-C2QsOHOs.cjs → RuleEditor-ChRzNQuF.cjs} +1 -1
- package/dist/{RuleEditor-D9wQHrkf.js → RuleEditor-DzAmW5YH.js} +1 -1
- package/dist/analytics.d.cts +28 -0
- package/dist/analytics.d.ts +28 -0
- package/dist/assets-C2U-e-Sz.cjs +4 -0
- package/dist/assets-Q0wUwNrV.js +217 -0
- package/dist/code-options-BKXXY7NI.js +18 -0
- package/dist/code-options-BUTChiZZ.cjs +1 -0
- package/dist/codes.cjs +9 -0
- package/dist/codes.d.cts +223 -0
- package/dist/codes.d.ts +223 -0
- package/dist/codes.js +26917 -0
- package/dist/designer.cjs +2 -2
- package/dist/designer.d.cts +267 -0
- package/dist/designer.d.ts +267 -0
- package/dist/designer.js +2737 -1941
- package/dist/grid-strokes-Cr7DwUux.cjs +1 -0
- package/dist/grid-strokes-DyyG1q_o.js +53 -0
- package/dist/index.cjs +7 -7
- package/dist/index.d.cts +80 -1
- package/dist/index.d.ts +80 -1
- package/dist/index.js +404 -374
- package/dist/pdf.cjs +76 -59
- package/dist/pdf.d.cts +51 -0
- package/dist/pdf.d.ts +51 -0
- package/dist/pdf.js +32193 -32102
- package/dist/record-bindings-By_UKZ2g.cjs +1 -0
- package/dist/{list-cell-ClFra1zS.js → record-bindings-D-5jQlTj.js} +67 -44
- package/dist/{region-binding-workflow-DhQvu1co.cjs → region-binding-workflow-BzfbxRiR.cjs} +1 -1
- package/dist/{region-binding-workflow-CXDmt9Bs.js → region-binding-workflow-CcUq8W2Q.js} +1 -1
- package/dist/server/node.d.cts +52 -1
- package/dist/server/node.d.ts +52 -1
- package/dist/server-node.cjs +1 -1
- package/dist/server-node.js +239 -210
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +95 -3
- package/dist/server.d.ts +95 -3
- package/dist/server.js +456 -433
- package/dist/style.css +1 -1
- package/dist/{template-registry-WNXdkiET.js → template-registry-BjE1VS6g.js} +221 -157
- package/dist/template-registry-D3SjENi6.cjs +1 -0
- package/dist/template-review-BfCC8Ng9.cjs +2 -0
- package/dist/{template-review-BdcXSYbx.js → template-review-BzpcI-tR.js} +772 -666
- package/dist/validate-BJ5HIWY8.cjs +1 -0
- package/dist/validate-DbgEM1Hh.js +163 -0
- package/dist/vue/async.d.cts +121 -2
- package/dist/vue/async.d.ts +121 -2
- package/dist/vue/index.d.cts +114 -6
- package/dist/vue/index.d.ts +114 -6
- package/dist/{workbook-session-BKOTwcoq.js → workbook-session-BPb3TMnT.js} +1 -1
- package/dist/{workbook-session-CLYLhZWu.cjs → workbook-session-DNa2RHNG.cjs} +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +52 -1
- package/dist/worker.d.ts +52 -1
- package/dist/worker.js +2 -2
- package/dist/xlsx.cjs +1 -1
- package/dist/xlsx.d.cts +40 -0
- package/dist/xlsx.d.ts +40 -0
- package/dist/xlsx.js +3 -3
- package/package.json +16 -3
- package/dist/assets-Bu6UohJx.cjs +0 -1
- package/dist/assets-DegqDNqY.js +0 -160
- package/dist/list-cell-BuYn4tGF.cjs +0 -1
- package/dist/template-registry-ukBGlm8N.cjs +0 -1
- package/dist/template-review-BXp2oyqg.cjs +0 -1
- package/dist/textwrap-CWHyzkBH.cjs +0 -4
- package/dist/textwrap-DE1kgcJB.js +0 -110
- package/dist/validate-7s0yn6ii.js +0 -148
- package/dist/validate-DsRiNw8h.cjs +0 -1
package/dist/server-node.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const W=require("node:worker_threads"),j=require("node:crypto"),l=require("node:fs"),R=require("node:path");function C(e,t,n){if(!n?.aborted)try{const o=e?.({...t});o&&typeof o.then=="function"&&Promise.resolve(o).catch(()=>{})}catch{}}function H(e,t,n){e.editable!==void 0&&typeof e.editable!="boolean"&&n.push({path:`${t}.editable`,message:"编辑控制应为布尔值"}),e.valueType!==void 0&&!["text","number","boolean"].includes(e.valueType)&&n.push({path:`${t}.valueType`,message:"编辑类型应为 text、number 或 boolean"})}function K(e,t,n){H(e,t,n),e.indentMm!==void 0&&(typeof e.indentMm!="number"||!Number.isFinite(e.indentMm)||e.indentMm<0)&&n.push({path:`${t}.indentMm`,message:"单元格缩进应为有限非负数"}),e.derived!==void 0&&typeof e.derived!="boolean"&&n.push({path:`${t}.derived`,message:"派生结果标记应为布尔值"}),F(e.source,`${t}.source`,n,!0),e.formula!==void 0&&typeof e.formula!="string"&&n.push({path:`${t}.formula`,message:"单元格公式应为字符串"})}function F(e,t,n,o=!1){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e)){n.push({path:t,message:"业务来源应为对象"});return}const r=e;for(const s of["datasetId",...o?["field"]:[]])(typeof r[s]!="string"||!r[s].trim())&&n.push({path:`${t}.${s}`,message:"业务标识应为非空字符串"});for(const s of["rowKey","revision"]){const i=r[s];i===void 0&&!(o&&s==="rowKey")||typeof i!="string"&&!(typeof i=="number"&&Number.isFinite(i))&&n.push({path:`${t}.${s}`,message:"业务键及修订号应为字符串或有限数字"})}r.sourceToken!==void 0&&typeof r.sourceToken!="string"&&n.push({path:`${t}.sourceToken`,message:"来源令牌应为字符串"})}const V=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function G(e,t,n,o){const r=e[t];(typeof r!="number"||!Number.isFinite(r))&&o.push({path:`${n}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(r)}`})}function X(e,t,n){if(e!==void 0){const o=`${t}.table`;if(!N(e))n.push({path:o,message:"逻辑表来源应为对象"});else{F(e.source,`${o}.source`,n),(typeof e.id!="string"||!e.id.trim())&&n.push({path:`${o}.id`,message:"逻辑表 ID 应为非空字符串"});const r=e.role;["header","body","group-header","subtotal","grand-total"].includes(r)||n.push({path:`${o}.role`,message:"未知逻辑表行角色"});const s=e.rowIndex;(typeof s!="number"||!Number.isInteger(s)||(r==="header"?s!==-1:s<0))&&n.push({path:`${o}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(e.columnKeys)||e.columnKeys.some(i=>typeof i!="string"))&&n.push({path:`${o}.columnKeys`,message:"逻辑列字段应为字符串数组"}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${o}.layout`,message:"布局应为 page 或 wide"}),e.title!==void 0&&typeof e.title!="string"&&n.push({path:`${o}.title`,message:"逻辑表名称应为字符串"})}}}function Z(e,t,n,o){if(e!==void 0)if(!N(e)||!Array.isArray(e.cells))n.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"});else{const r=e.paddingMm;r!==void 0&&(typeof r!="number"||!Number.isFinite(r)||r<0)&&n.push({path:`${t}.grid.paddingMm`,message:"单元格内距应为有限非负数"}),e.cells.forEach((s,i)=>{if(!Array.isArray(s)){n.push({path:`${t}.grid.cells.${i}`,message:"行应为数组"});return}s.forEach((m,h)=>{if(m==null)return;const u=`${t}.grid.cells.${i}.${h}`;if(!N(m)){n.push({path:u,message:"网格单元格应为对象或 null"});return}K(m,u,n),Array.isArray(m.children)&&m.children.forEach((b,x)=>{D(b,`${t}.grid.cells.${i}.${h}.children.${x}`,n,o)})})})}}function Q(e,t,n){e!==void 0&&(Array.isArray(e)?e.forEach((o,r)=>{(!N(o)||!Array.isArray(o.segments))&&n.push({path:`${t}.richParagraphs.${r}`,message:"段落缺少 segments 数组"})}):n.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function D(e,t,n,o=[]){if(!N(e)){n.push({path:t,message:"组件应为对象"});return}const r=e.kind;typeof r!="string"?n.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):V.has(r)||o.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(r)},将以兜底方式渲染`});for(const s of["leftMm","topMm","widthMm","heightMm"])G(e,s,t,n);typeof e.leftMm=="number"&&e.leftMm<-100&&n.push({path:`${t}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const s of["widthMm","heightMm"])typeof e[s]=="number"&&e[s]<0&&n.push({path:`${t}.${s}`,message:"组件尺寸不能为负数"});X(e.table,t,n),e.pageAnchor!==void 0&&!["header","footer"].includes(e.pageAnchor)&&n.push({path:`${t}.pageAnchor`,message:"页面锚点应为 header 或 footer"}),e.lineDirection!==void 0&&!["down","up"].includes(e.lineDirection)&&n.push({path:`${t}.lineDirection`,message:"线段方向应为 down 或 up"}),Z(e.grid,t,n,o),Q(e.richParagraphs,t,n)}function Y(e,t,n,o=[]){if(!N(e)){n.push({path:t,message:"页应为对象"});return}const r=e.pageWidthMm,s=e.pageHeightMm;(typeof r!="number"||!Number.isFinite(r)||r<=0)&&n.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(r)}`}),(typeof s!="number"||!(s>0&&s<5e3))&&n.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(s)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${t}.layout`,message:"布局应为 page 或 wide"});const i=e.components;Array.isArray(i)?Array.isArray(i)&&i.forEach((m,h)=>D(m,`${t}.components.${h}`,n,o)):n.push({path:`${t}.components`,message:"components 应为数组"})}function ee(e){const t=[],n=[],o=N(e)?e.pages:void 0;if(N(e)&&e.requiresRecalculation!==void 0&&typeof e.requiresRecalculation!="boolean"&&t.push({path:"$.requiresRecalculation",message:"重算能力要求应为布尔值"}),!Array.isArray(o))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{o.forEach((s,i)=>Y(s,`$.pages.${i}`,t,n)),o.length>2e3&&n.push({path:"$.pages",message:`页数异常大(${o.length} 页),渲染与打印耗时可能显著增加`});const r=o.reduce((s,i)=>s+(N(i)&&Array.isArray(i.components)?i.components.length:0),0);r>5e4&&n.push({path:"$.pages",message:`组件总数异常大(${r} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:n}}const E="mach-report-worker/1";class B extends Error{constructor(t){super(t.message),this.name=t.name,this.code=t.code,this.path=t.path,this.issues=t.issues,this.diagnostics=t.diagnostics}}function v(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function te(e){return v(e)?["rows","pages","cells"].every(t=>typeof e[t]=="number"&&Number.isSafeInteger(e[t])&&e[t]>=0)&&typeof e.durationMs=="number"&&Number.isFinite(e.durationMs)&&e.durationMs>=0:!1}function ne(e){return Array.isArray(e)&&e.every(t=>v(t)&&typeof t.code=="string"&&typeof t.message=="string"&&["info","warning","error"].includes(t.severity))}function re(e){return v(e)&&Object.values(e).every(t=>v(t)&&(t.revision===void 0||typeof t.revision=="string")&&(t.sourceToken===void 0||typeof t.sourceToken=="string"))}function oe(e,t){if(!v(e)||!te(e.stats)||!ne(e.diagnostics)||!re(e.revisions))return!1;if(t==="prepare")return ee(e.plan).ok;const n=e.format==="pdf"?"application/pdf":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";return e.bytes instanceof Uint8Array&&(e.format==="pdf"||e.format==="xlsx")&&e.contentType===n}function U(e){if(!e||typeof e!="object")return{message:String(e)};const t={};for(const n of["code","path","field","message"]){const o=e[n];typeof o=="string"&&(t[n]=o)}return t}function se(e){const t=U(e);if(!v(e))return t;for(const n of["format","severity","kind","nid"])typeof e[n]=="string"&&(t[n]=e[n]);for(const n of["pageIndex","componentIndex"])Number.isSafeInteger(e[n])&&e[n]>=0&&(t[n]=e[n]);return Array.isArray(e.componentPath)&&e.componentPath.every(n=>Number.isSafeInteger(n)&&n>=0)&&(t.componentPath=e.componentPath),t}function ie(e){if(!(e instanceof Error))return{name:"Error",message:String(e)};const t=e;return{name:e.name,message:e.message,...typeof t.code=="string"?{code:t.code}:{},...typeof t.path=="string"?{path:t.path}:{},...Array.isArray(t.issues)?{issues:t.issues.map(U)}:{},...Array.isArray(t.diagnostics)?{diagnostics:t.diagnostics.map(se)}:{}}}function ae(e){if(!e||typeof e!="object")return!1;const t=e;return t.protocol===E&&typeof t.id=="string"&&(t.operation==="prepare"||t.operation==="export")&&!!t.input&&typeof t.input=="object"}async function ce(e,t,n){try{const o=t.operation==="prepare"?await e.prepare({...t.input,onEvent:n}):await e.export({...t.input,onEvent:n});return{protocol:E,id:t.id,result:o}}catch(o){return{protocol:E,id:t.id,error:ie(o)}}}function fe(e){const t=e.result;return!t||!("bytes"in t)||!(t.bytes.buffer instanceof ArrayBuffer)?[]:[t.bytes.buffer]}function ue(e,t){if(!v(e)||typeof e.taskId!="string"||!e.taskId||t.taskId!==void 0&&e.taskId!==t.taskId||e.correlationId!==t.correlationId||e.reportId!==void 0&&(typeof e.reportId!="string"||!t.reportIds.includes(e.reportId))||!["query","validate","layout","encode"].includes(e.stage)||!["started","completed","failed"].includes(e.status))return!1;for(const n of["completed","total"])if(e[n]!==void 0&&(typeof e[n]!="number"||!Number.isFinite(e[n])||e[n]<0))return!1;return e.completed===void 0||e.total===void 0||e.completed<=e.total}let pe=0;function P(e){const t=new Error("报表 Worker 任务已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e}),t}function de(e,t){if(!e||typeof e!="object")return;const n=e;return n.protocol===E&&n.id===t?n:void 0}function me(e,t={}){const n=t.timeoutMs??12e4;if(!Number.isFinite(n)||n<=0||n>2147483647)throw new RangeError("Worker timeoutMs 应为正有限数字,且不能超过 2147483647");const o=(r,s,i,m)=>i?.aborted?Promise.reject(P(i.reason)):new Promise((h,u)=>{let b;try{b=e()}catch(y){u(y);return}const x=`mach-report-${Date.now()}-${++pe}`;let p=!1,f=()=>{},c;const d=(y,w)=>{p||(p=!0,c&&clearTimeout(c),f(),i?.removeEventListener("abort",g),Promise.resolve().then(()=>b.terminate()).then(()=>y===void 0?h(w):u(y),$=>u(y??$)))},g=()=>d(P(i?.reason)),A=y=>{const w=de(y,x);if(!(!w||p)){if("type"in w&&w.type==="event"){const $="event"in w?w.event:void 0;ue($,s)?C(m,$,i):d(new Error("报表 Worker 返回无效阶段事件"));return}w.error&&typeof w.error.name=="string"&&typeof w.error.message=="string"?d(new B(w.error)):oe(w.result,r)&&(r!=="export"||"format"in w.result&&"format"in s&&w.result.format===s.format)?d(void 0,w.result):d(new Error("报表 Worker 返回无效响应"))}};try{if(f=b.subscribe(A,y=>d(y??new Error("报表 Worker 执行失败"))),p){f();return}if(i?.addEventListener("abort",g,{once:!0}),c=setTimeout(()=>d(new B({name:"ReportRuntimeError",code:"timeout",message:`报表 Worker 执行超过 ${n}ms`})),n),i?.aborted)g();else{const{onEvent:y,signal:w,...$}=s;b.postMessage({protocol:E,id:x,operation:r,input:$})}}catch(y){d(y)}});return{prepare:(r,s,i)=>o("prepare",r,s,i),export:(r,s,i)=>o("export",r,s,i)}}const ye=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),k=(e,t)=>e>>>t|e<<32-t;function le(e,t,n){const o=new DataView(e.buffer,e.byteOffset+t,64);for(let r=0;r<16;r++)n[r]=o.getUint32(r*4);for(let r=16;r<64;r++){const s=n[r-15],i=n[r-2],m=k(s,7)^k(s,18)^s>>>3,h=k(i,17)^k(i,19)^i>>>10;n[r]=n[r-16]+m+n[r-7]+h}}function he(e,t){let n=e[0],o=e[1],r=e[2],s=e[3],i=e[4],m=e[5],h=e[6],u=e[7];for(let b=0;b<64;b++){const x=k(i,6)^k(i,11)^k(i,25),p=i&m^~i&h,f=u+x+p+ye[b]+t[b]>>>0,c=k(n,2)^k(n,13)^k(n,22),d=n&o^n&r^o&r,g=c+d>>>0;u=h,h=m,m=i,i=s+f>>>0,s=r,r=o,o=n,n=f+g>>>0}e[0]=e[0]+n,e[1]=e[1]+o,e[2]=e[2]+r,e[3]=e[3]+s,e[4]=e[4]+i,e[5]=e[5]+m,e[6]=e[6]+h,e[7]=e[7]+u}function ge(e){const t=new Uint8Array(Math.ceil((e.byteLength+9)/64)*64);t.set(e),t[e.byteLength]=128;const n=new DataView(t.buffer);return n.setUint32(t.length-8,Math.floor(e.byteLength/536870912)),n.setUint32(t.length-4,e.byteLength*8>>>0),t}const we=()=>new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),be=e=>Array.from(e,t=>t.toString(16).padStart(8,"0")).join("");async function Ae(e){const t=ge(e),n=we(),o=new Uint32Array(64);for(let r=0;r<t.length;r+=64)r>0&&r%262144===0&&await new Promise(s=>setTimeout(s,0)),le(t,r,o),he(n,o);return be(n)}class a extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportJobError"}}function T(e,t){if(typeof e!="string"||!e.trim()||e.length>256||typeof t!="string"||t!==t.trim()||!/^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,127}$/.test(t))throw new a("input","任务范围应非空,ID应为1–128位安全标识")}function ke(e){const t=Array.isArray(e),n=Object.getPrototypeOf(e),o=Object.keys(e);if(n!==(t?Array.prototype:Object.prototype)&&!(n===null&&!t))throw new a("input","任务对象应为普通 JSON 对象");if(Object.getOwnPropertySymbols(e).length)throw new a("input","任务不能包含Symbol");if(Object.getOwnPropertyNames(e).filter(s=>!(t&&s==="length")).length!==o.length)throw new a("input","任务不能包含不可枚举属性");if(t&&(o.length!==e.length||o.some(s=>s!==String(Number(s))||!Number.isSafeInteger(Number(s))||Number(s)<0||Number(s)>=e.length)))throw new a("input","任务数组不能稀疏或包含额外属性");return o.sort()}function xe(e,t){const n=Object.getOwnPropertyDescriptor(e,t);if(["__proto__","prototype","constructor"].includes(t)||n.get||n.set)throw new a("input","任务不能包含危险键或访问器");return n.value}function S(e,t={}){const n=t.maxNodes??2e4,o=t.maxCharacters??1e6;if(!Number.isSafeInteger(n)||n<1||n>2e4||!Number.isSafeInteger(o)||o<1||o>1e6)throw new a("input","任务JSON预算无效");let r=0,s=0;const i=new Set;function m(u,b){if(++r>n||b>32)throw new a("input","任务数据超过节点或深度预算");if(typeof u=="string"){if(s+=u.length,s>o)throw new a("input","任务文本超过预算");return u}if(u===null||typeof u=="boolean"||typeof u=="number"&&Number.isFinite(u))return u;if(!u||typeof u!="object"||i.has(u))throw new a("input","任务只允许无循环的有限 JSON 值");const x=Array.isArray(u),p=ke(u);i.add(u);const f=Object.create(null);for(const c of p){if(s+=c.length,s>o)throw new a("input","任务文本超过预算");f[c]=m(xe(u,c),b+1)}return i.delete(u),x?Array.from({length:u.length},(c,d)=>f[String(d)]):f}const h=JSON.stringify(m(e,0));if(h.length>o)throw new a("input","任务序列化数据超过字符预算");return h}function J(e){return JSON.parse(JSON.stringify(e))}function _(e,t,n,o){if(T(t,n),e.scope!==t||e.id!==n||e.revision!==(o??0)+1||!Number.isSafeInteger(e.revision))throw new a("input","任务身份或修订不匹配");if(![e.createdAt,e.updatedAt,e.attempt].every(r=>Number.isSafeInteger(r)&&r>=0)||!["queued","running","completed","failed","cancelled"].includes(e.status))throw new a("input","任务状态无效");if(e.lease&&(!e.lease.owner||!Number.isSafeInteger(e.lease.expiresAt)))throw new a("input","任务租约无效");if(!e.request||typeof e.request.kind!="string"||!e.request.kind.trim()||e.request.kind.length>128)throw new a("input","任务类型无效");S(e.request.payload,{maxNodes:19e3,maxCharacters:75e4}),S(e)}function $e(e,t){if(e&&(e.createdAt!==t.createdAt||S(e.request)!==S(t.request)))throw new a("input","任务创建时间与请求不可变更,请使用新任务ID")}function Ne(e,t){return e.status==="queued"||e.status==="running"&&(e.lease?.expiresAt??0)<=t}function Se(e={}){const t={maxRecords:e.maxRecords??1e4,maxBytes:e.maxBytes??67108864,maxResultBytes:e.maxResultBytes??262144,controlReserveBytes:e.controlReserveBytes??4096,maxTombstones:e.maxTombstones??1e4,maxTombstoneBytes:e.maxTombstoneBytes??16777216};if(!Object.values(t).every(n=>Number.isSafeInteger(n)&&n>0)||t.controlReserveBytes<4096)throw new a("input","任务容量应为正整数,控制状态预留至少4096字节");return t}function M(e){return new TextEncoder().encode(S(e)).byteLength}function z(e,t){const n={scope:e.scope,id:e.id,revision:1,request:e.request,status:"queued",createdAt:e.createdAt,updatedAt:e.createdAt,attempt:0},o={...e};delete o.result;const r=e.result===void 0?0:M(e.result);if(r>t.maxResultBytes)throw new a("capacity","任务结果超过独立预算,请保存文件引用");return Math.max(M(n)+t.controlReserveBytes,M(o))+r}function L(e){return e.status!=="queued"&&e.status!=="running"}function Re(e){const t={...e,tombstoneRetentionMs:e.tombstoneRetentionMs??6048e5,limit:e.limit??100};if(![t.now,t.terminalBefore].every(n=>Number.isSafeInteger(n)&&n>=0)||t.terminalBefore>t.now)throw new a("input","终态清理时间应为不超过当前时间的非负整数");if(![t.tombstoneRetentionMs,t.limit].every(n=>Number.isSafeInteger(n)&&n>0)||!Number.isSafeInteger(t.now+t.tombstoneRetentionMs))throw new a("input","幂等保留期与清理批量应为正整数");return t}async function ve(e){const t=new TextEncoder().encode(S(e)),n=globalThis.crypto?.subtle;if(!n)return Ae(t);const o=await n.digest("SHA-256",t);return Array.from(new Uint8Array(o),r=>r.toString(16).padStart(2,"0")).join("")}async function Ee(e,t){if(!L(e))throw new a("input","只能归档终态任务");return{scope:e.scope,id:e.id,revision:e.revision,status:e.status,createdAt:e.createdAt,updatedAt:e.updatedAt,attempt:e.attempt,requestHash:await ve(e.request),expiresAt:t}}function Me(e){if(!e||!["completed","failed","cancelled"].includes(e.status)||!/^[a-f0-9]{64}$/.test(e.requestHash))throw new a("input","任务幂等摘要无效");if(![e.revision,e.createdAt,e.updatedAt,e.attempt,e.expiresAt].every(t=>Number.isSafeInteger(t)&&t>=0)||e.revision<1)throw new a("input","任务幂等摘要时间或修订无效")}function I(e){return e?.code}function O(e,t){return j.createHash("sha256").update(JSON.stringify([e,t])).digest("hex")+".json"}async function q(e){try{return await l.promises.readFile(e,"utf8")}catch(t){if(I(t)==="ENOENT")return;throw t}}async function Oe(e,t){const n=await q(e);if(n===void 0)return;let o;try{o=JSON.parse(n)}catch{throw new a("conflict","任务锁尚未完整写入或已损坏,拒绝自动移除")}if(!o||!Number.isSafeInteger(o.pid)||o.pid<1)throw new a("conflict","任务锁身份无效,拒绝自动移除");try{process.kill(o.pid,0)}catch(r){if(I(r)==="ESRCH"){await l.promises.unlink(e);return}throw r}throw new a("conflict","任务目录的写入进程仍在运行")}async function Ie(e,t){if(!t)throw new a("conflict","任务目录已有写入进程;多实例请使用数据库CAS适配器");const n=e+".recovery";let o;try{o=await l.promises.open(n,"wx",384)}catch(r){throw I(r)==="EEXIST"?new a("conflict","任务目录恢复正在进行,请稍后重试"):r}try{return await o.writeFile(JSON.stringify({pid:process.pid})),await Oe(e,!0),await l.promises.open(e,"wx",384)}finally{await o.close(),await l.promises.unlink(n)}}async function Te(e,t){const n=R.join(e,".writer-lock"),o=j.randomUUID();let r;try{r=await l.promises.open(n,"wx",384)}catch(s){if(I(s)!=="EEXIST")throw s;r=await Ie(n,t)}try{await r.writeFile(JSON.stringify({pid:process.pid,token:o})),await r.sync()}catch(s){throw await r.close(),await l.promises.unlink(n).catch(()=>{}),s}return{file:n,token:o,handle:r}}function je(e,t,n,o){if("tombstone"in n){const r=n.tombstone;if(Me(r),T(r.scope,r.id),O(r.scope,r.id)!==t)throw new a("input","持久任务摘要身份不匹配");const s=M(r);e.tombstoneBytes+=s,e.tombstones.set(t,{value:r,bytes:s})}else{if(_(n,n.scope,n.id,n.revision-1),O(n.scope,n.id)!==t)throw new a("input","持久任务文件身份不匹配");const r=z(n,o);e.bytes+=r,e.records.set(t,{record:n,bytes:r})}if(e.bytes>o.maxBytes||e.records.size>o.maxRecords||e.tombstoneBytes>o.maxTombstoneBytes||e.tombstones.size>o.maxTombstones)throw new a("capacity","持久任务及控制状态预留超过目录预算")}async function Je(e,t){const n=await l.promises.readdir(e);for(const s of n.filter(i=>/^\.pending-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(i)))await l.promises.unlink(R.join(e,s));const o=n.filter(s=>/^[a-f0-9]{64}\.json$/.test(s));if(o.length>t.maxRecords+t.maxTombstones)throw new a("capacity","持久任务数量超过目录预算");const r={records:new Map,tombstones:new Map,bytes:0,tombstoneBytes:0};for(const s of o){const i=R.join(e,s);if((await l.promises.stat(i)).size>4e6)throw new a("capacity","持久任务文件超过单文件预算");je(r,s,JSON.parse(await l.promises.readFile(i,"utf8")),t)}return r}async function Be(e,t,n){const o=R.join(e,`.pending-${j.randomUUID()}`);try{const r=await l.promises.open(o,"wx",384);try{await r.writeFile(n),await r.sync()}finally{await r.close()}await l.promises.rename(o,R.join(e,t));const s=await l.promises.open(e,"r");try{await s.sync()}finally{await s.close()}}finally{await l.promises.unlink(o).catch(r=>{if(I(r)!=="ENOENT")throw r})}}async function qe(e){const t=R.resolve(e.directory),n=Se(e);await l.promises.mkdir(t,{recursive:!0,mode:448});const o=await Te(t,e.recoverDeadOwner??!1);let r;try{r=await Je(t,n)}catch(p){throw await o.handle.close(),await l.promises.unlink(o.file),p}let s=!1,i=Promise.resolve();const m=()=>{if(s)throw new a("closed","持久任务存储已关闭")},h=p=>{m();const f=i.then(async()=>{if(JSON.parse(await l.promises.readFile(o.file,"utf8")).token!==o.token)throw new a("closed","持久任务存储写入锁已失效");return p()});return i=f.then(()=>{},()=>{}),f},u=async(p,f,c)=>{try{await Be(t,p,f)}catch(d){throw await q(R.join(t,p))===f&&c(),d}c()};return{read:async(p,f)=>{m(),T(p,f),await i;const c=r.records.get(O(p,f));return c?J(c.record):void 0},readTombstone:async(p,f)=>{m(),T(p,f),await i;const c=r.tombstones.get(O(p,f));return c?J(c.value):void 0},candidates:async(p,f)=>(m(),await i,Array.from(r.records.values(),c=>c.record).filter(c=>Ne(c,p)).sort((c,d)=>c.createdAt-d.createdAt).slice(0,f).map(J)),compareAndSwap:async(p,f,c,d)=>{const g=JSON.parse(S(d));return _(g,p,f,c),h(async()=>{const A=O(p,f),y=r.records.get(A);if((y?.record.revision??null)!==c||r.tombstones.has(A))return!1;$e(y?.record,g);const w=z(g,n),$=r.bytes-(y?.bytes??0)+w;if($>n.maxBytes||!y&&r.records.size>=n.maxRecords)throw new a("capacity","持久任务容量已满,请清理终态任务或扩大显式预算");return await u(A,S(g),()=>{r.records.set(A,{record:g,bytes:w}),r.bytes=$}),!0})},prune:async p=>{const f=Re(p);return h(async()=>{const c={archived:0,expired:0};for(const[d,g]of r.tombstones)g.value.expiresAt>f.now||c.expired>=f.limit||(await l.promises.unlink(R.join(t,d)),r.tombstones.delete(d),r.tombstoneBytes-=g.bytes,c.expired++);for(const[d,g]of r.records){if(!L(g.record)||g.record.updatedAt>f.terminalBefore||c.archived+c.expired>=f.limit)continue;const A=await Ee(g.record,f.now+f.tombstoneRetentionMs),y=M(A);if(r.tombstones.size>=n.maxTombstones||r.tombstoneBytes+y>n.maxTombstoneBytes)break;await u(d,S({tombstone:A}),()=>{r.tombstones.set(d,{value:A,bytes:y}),r.tombstoneBytes+=y,r.records.delete(d),r.bytes-=g.bytes}),c.archived++}if(c.expired){const d=await l.promises.open(t,"r");try{await d.sync()}finally{await d.close()}}return c})},close:async()=>{if(s)return;s=!0,await i,await o.handle.close();const p=await q(o.file);p&&JSON.parse(p).token===o.token&&await l.promises.unlink(o.file)}}}function Pe(e){const t=e.filename??e.workerUrl;if(!t||e.filename&&e.workerUrl)throw new TypeError("请且仅请指定 filename 或 workerUrl");return me(()=>{const n=new W.Worker(t,e.workerOptions);return{postMessage:o=>n.postMessage(o),terminate:()=>n.terminate(),subscribe:(o,r)=>{const s=i=>r(new Error(`报表 Worker 在响应前退出(code ${i})`));return n.on("message",o),n.on("error",r),n.on("messageerror",r),n.on("exit",s),()=>{n.off("message",o),n.off("error",r),n.off("messageerror",r),n.off("exit",s)}}}},e)}function We(e){const t=W.parentPort;if(!t)throw new Error("serveNodeReportWorker 只能在 worker_threads 中调用");const n=o=>{ae(o)&&ce(e,o,r=>t.postMessage({protocol:E,id:o.id,type:"event",event:r})).then(r=>t.postMessage(r,fe(r)))};return t.on("message",n),()=>t.off("message",n)}function Fe(e){return j.createHash("sha256").update(e).digest("hex")}exports.ReportWorkerError=B;exports.createNodeReportExecutor=Pe;exports.openFileReportJobStore=qe;exports.reportArtifactSha256=Fe;exports.serveNodeReportWorker=We;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const W=require("node:worker_threads"),j=require("node:crypto"),h=require("node:fs"),S=require("node:path");function H(e,t,r){if(!r?.aborted)try{const o=e?.({...t});o&&typeof o.then=="function"&&Promise.resolve(o).catch(()=>{})}catch{}}function K(e,t,r){e.editable!==void 0&&typeof e.editable!="boolean"&&r.push({path:`${t}.editable`,message:"编辑控制应为布尔值"}),e.valueType!==void 0&&!["text","number","boolean"].includes(e.valueType)&&r.push({path:`${t}.valueType`,message:"编辑类型应为 text、number 或 boolean"})}function Z(e,t,r){K(e,t,r),e.indentMm!==void 0&&(typeof e.indentMm!="number"||!Number.isFinite(e.indentMm)||e.indentMm<0)&&r.push({path:`${t}.indentMm`,message:"单元格缩进应为有限非负数"}),e.derived!==void 0&&typeof e.derived!="boolean"&&r.push({path:`${t}.derived`,message:"派生结果标记应为布尔值"}),U(e.source,`${t}.source`,r,!0),e.formula!==void 0&&typeof e.formula!="string"&&r.push({path:`${t}.formula`,message:"单元格公式应为字符串"})}function U(e,t,r,o=!1){if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e)){r.push({path:t,message:"业务来源应为对象"});return}const n=e;for(const s of["datasetId",...o?["field"]:[]])(typeof n[s]!="string"||!n[s].trim())&&r.push({path:`${t}.${s}`,message:"业务标识应为非空字符串"});for(const s of["rowKey","revision"]){const i=n[s];i===void 0&&!(o&&s==="rowKey")||typeof i!="string"&&!(typeof i=="number"&&Number.isFinite(i))&&r.push({path:`${t}.${s}`,message:"业务键及修订号应为字符串或有限数字"})}n.sourceToken!==void 0&&typeof n.sourceToken!="string"&&r.push({path:`${t}.sourceToken`,message:"来源令牌应为字符串"})}function Q(e){const t=[];return e.value!==void 0&&typeof e.value!="string"&&t.push({path:"value",message:"Symbol value must be a string."}),e.symbology!==void 0&&!["code128","code39","ean13","ean8"].includes(e.symbology)&&t.push({path:"symbology",message:"Unsupported barcode symbology."}),e.errorCorrection!==void 0&&!["L","M","Q","H"].includes(e.errorCorrection)&&t.push({path:"errorCorrection",message:"Unsupported QR error correction."}),e.showText!==void 0&&typeof e.showText!="boolean"&&t.push({path:"showText",message:"showText must be a boolean."}),t}function V(e,t){const r=[];return t!=="barcode"&&t!=="qrcode"&&r.push({path:"",message:"code is only supported by barcode and qrcode components."}),t==="qrcode"&&e.symbology!==void 0&&r.push({path:"symbology",message:"QR components do not use a linear symbology."}),t==="qrcode"&&e.showText===!0&&r.push({path:"showText",message:"Use a separate text component below a QR code."}),t==="barcode"&&e.errorCorrection!==void 0&&r.push({path:"errorCorrection",message:"Linear barcodes do not use QR error correction."}),r}function G(e,t){if(typeof e!="object"||e===null||Array.isArray(e))return[{path:"",message:"code must be an object."}];const r=e,o=[...Q(r),...V(r,t)];for(const i of Object.keys(r))["value","symbology","errorCorrection","quietZoneModules","showText"].includes(i)||o.push({path:i,message:"Unknown symbol option."});const n=r.symbology==="ean13"||r.symbology==="ean8",s=t==="qrcode"?4:n?11:10;return r.quietZoneModules!==void 0&&(!Number.isSafeInteger(r.quietZoneModules)||Number(r.quietZoneModules)<s||Number(r.quietZoneModules)>64)&&o.push({path:"quietZoneModules",message:`Quiet zone must contain ${s}–64 whole modules.`}),o}const X=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function A(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Y(e,t,r,o){const n=e[t];(typeof n!="number"||!Number.isFinite(n))&&o.push({path:`${r}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(n)}`})}function ee(e,t,r){if(e!==void 0){const o=`${t}.table`;if(!A(e))r.push({path:o,message:"逻辑表来源应为对象"});else{U(e.source,`${o}.source`,r),(typeof e.id!="string"||!e.id.trim())&&r.push({path:`${o}.id`,message:"逻辑表 ID 应为非空字符串"});const n=e.role;["header","body","group-header","subtotal","grand-total"].includes(n)||r.push({path:`${o}.role`,message:"未知逻辑表行角色"});const s=e.rowIndex;(typeof s!="number"||!Number.isInteger(s)||(n==="header"?s!==-1:s<0))&&r.push({path:`${o}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(e.columnKeys)||e.columnKeys.some(i=>typeof i!="string"))&&r.push({path:`${o}.columnKeys`,message:"逻辑列字段应为字符串数组"}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&r.push({path:`${o}.layout`,message:"布局应为 page 或 wide"}),e.title!==void 0&&typeof e.title!="string"&&r.push({path:`${o}.title`,message:"逻辑表名称应为字符串"})}}}function te(e,t,r,o){if(e!==void 0)if(!A(e)||!Array.isArray(e.cells))r.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"});else{const n=e.paddingMm;n!==void 0&&(typeof n!="number"||!Number.isFinite(n)||n<0)&&r.push({path:`${t}.grid.paddingMm`,message:"单元格内距应为有限非负数"}),e.cells.forEach((s,i)=>{if(!Array.isArray(s)){r.push({path:`${t}.grid.cells.${i}`,message:"行应为数组"});return}s.forEach((d,y)=>{if(d==null)return;const u=`${t}.grid.cells.${i}.${y}`;if(!A(d)){r.push({path:u,message:"网格单元格应为对象或 null"});return}Z(d,u,r),Array.isArray(d.children)&&d.children.forEach((b,k)=>{C(b,`${t}.grid.cells.${i}.${y}.children.${k}`,r,o)})})})}}function re(e,t,r){e!==void 0&&(Array.isArray(e)?e.forEach((o,n)=>{(!A(o)||!Array.isArray(o.segments))&&r.push({path:`${t}.richParagraphs.${n}`,message:"段落缺少 segments 数组"})}):r.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function C(e,t,r,o=[]){if(!A(e)){r.push({path:t,message:"组件应为对象"});return}const n=e.kind;typeof n!="string"?r.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):X.has(n)||o.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(n)},将以兜底方式渲染`});for(const s of["leftMm","topMm","widthMm","heightMm"])Y(e,s,t,r);typeof e.leftMm=="number"&&e.leftMm<-100&&r.push({path:`${t}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const s of["widthMm","heightMm"])typeof e[s]=="number"&&e[s]<0&&r.push({path:`${t}.${s}`,message:"组件尺寸不能为负数"});ee(e.table,t,r),ne(e.code,n,t,r),e.pageAnchor!==void 0&&!["header","footer"].includes(e.pageAnchor)&&r.push({path:`${t}.pageAnchor`,message:"页面锚点应为 header 或 footer"}),e.lineDirection!==void 0&&!["down","up"].includes(e.lineDirection)&&r.push({path:`${t}.lineDirection`,message:"线段方向应为 down 或 up"}),te(e.grid,t,r,o),re(e.richParagraphs,t,r)}function ne(e,t,r,o){if(e!==void 0)for(const n of G(e,t))o.push({path:`${r}.code${n.path?`.${n.path}`:""}`,message:n.message})}function F(e,t,r){if(!A(e))return;e.binding!==void 0&&r.push({path:`${t}.binding`,message:"渲染计划不允许未解析字段绑定"});const o=e.grid;!A(o)||!Array.isArray(o.cells)||o.cells.forEach((n,s)=>{Array.isArray(n)&&n.forEach((i,d)=>{!A(i)||!Array.isArray(i.children)||i.children.forEach((y,u)=>F(y,`${t}.grid.cells.${s}.${d}.children.${u}`,r))})})}function oe(e,t,r,o=[]){if(!A(e)){r.push({path:t,message:"页应为对象"});return}const n=e.pageWidthMm,s=e.pageHeightMm;(typeof n!="number"||!Number.isFinite(n)||n<=0)&&r.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(n)}`}),(typeof s!="number"||!(s>0&&s<5e3))&&r.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(s)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&r.push({path:`${t}.layout`,message:"布局应为 page 或 wide"});const i=e.components;Array.isArray(i)?Array.isArray(i)&&i.forEach((d,y)=>{C(d,`${t}.components.${y}`,r,o),F(d,`${t}.components.${y}`,r)}):r.push({path:`${t}.components`,message:"components 应为数组"})}function se(e){const t=[],r=[],o=A(e)?e.pages:void 0;if(A(e)&&e.requiresRecalculation!==void 0&&typeof e.requiresRecalculation!="boolean"&&t.push({path:"$.requiresRecalculation",message:"重算能力要求应为布尔值"}),!Array.isArray(o))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{o.forEach((s,i)=>oe(s,`$.pages.${i}`,t,r)),o.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${o.length} 页),渲染与打印耗时可能显著增加`});const n=o.reduce((s,i)=>s+(A(i)&&Array.isArray(i.components)?i.components.length:0),0);n>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${n} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:r}}const M="mach-report-worker/1";class J extends Error{constructor(t){super(t.message),this.name=t.name,this.code=t.code,this.path=t.path,this.issues=t.issues,this.diagnostics=t.diagnostics}}function R(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ie(e){return R(e)?["rows","pages","cells"].every(t=>typeof e[t]=="number"&&Number.isSafeInteger(e[t])&&e[t]>=0)&&typeof e.durationMs=="number"&&Number.isFinite(e.durationMs)&&e.durationMs>=0:!1}function ae(e){return Array.isArray(e)&&e.every(t=>R(t)&&typeof t.code=="string"&&typeof t.message=="string"&&["info","warning","error"].includes(t.severity))}function ce(e){return R(e)&&Object.values(e).every(t=>R(t)&&(t.revision===void 0||typeof t.revision=="string")&&(t.sourceToken===void 0||typeof t.sourceToken=="string"))}function fe(e,t){if(!R(e)||!ie(e.stats)||!ae(e.diagnostics)||!ce(e.revisions))return!1;if(t==="prepare")return se(e.plan).ok;const r=e.format==="pdf"?"application/pdf":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";return e.bytes instanceof Uint8Array&&(e.format==="pdf"||e.format==="xlsx")&&e.contentType===r}function D(e){if(!e||typeof e!="object")return{message:String(e)};const t={};for(const r of["code","path","field","message"]){const o=e[r];typeof o=="string"&&(t[r]=o)}return t}function ue(e){const t=D(e);if(!R(e))return t;for(const r of["format","severity","kind","nid"])typeof e[r]=="string"&&(t[r]=e[r]);for(const r of["pageIndex","componentIndex"])Number.isSafeInteger(e[r])&&e[r]>=0&&(t[r]=e[r]);return Array.isArray(e.componentPath)&&e.componentPath.every(r=>Number.isSafeInteger(r)&&r>=0)&&(t.componentPath=e.componentPath),t}function pe(e){if(!(e instanceof Error))return{name:"Error",message:String(e)};const t=e;return{name:e.name,message:e.message,...typeof t.code=="string"?{code:t.code}:{},...typeof t.path=="string"?{path:t.path}:{},...Array.isArray(t.issues)?{issues:t.issues.map(D)}:{},...Array.isArray(t.diagnostics)?{diagnostics:t.diagnostics.map(ue)}:{}}}function de(e){if(!e||typeof e!="object")return!1;const t=e;return t.protocol===M&&typeof t.id=="string"&&(t.operation==="prepare"||t.operation==="export")&&!!t.input&&typeof t.input=="object"}async function me(e,t,r){try{const o=t.operation==="prepare"?await e.prepare({...t.input,onEvent:r}):await e.export({...t.input,onEvent:r});return{protocol:M,id:t.id,result:o}}catch(o){return{protocol:M,id:t.id,error:pe(o)}}}function ye(e){const t=e.result;return!t||!("bytes"in t)||!(t.bytes.buffer instanceof ArrayBuffer)?[]:[t.bytes.buffer]}function le(e,t){if(!R(e)||typeof e.taskId!="string"||!e.taskId||t.taskId!==void 0&&e.taskId!==t.taskId||e.correlationId!==t.correlationId||e.reportId!==void 0&&(typeof e.reportId!="string"||!t.reportIds.includes(e.reportId))||!["query","validate","layout","assets","encode"].includes(e.stage)||!["started","completed","failed"].includes(e.status))return!1;for(const r of["completed","total"])if(e[r]!==void 0&&(typeof e[r]!="number"||!Number.isFinite(e[r])||e[r]<0))return!1;return e.completed===void 0||e.total===void 0||e.completed<=e.total}let he=0;function P(e){const t=new Error("报表 Worker 任务已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e}),t}function ge(e,t){if(!e||typeof e!="object")return;const r=e;return r.protocol===M&&r.id===t?r:void 0}function we(e,t={}){const r=t.timeoutMs??12e4;if(!Number.isFinite(r)||r<=0||r>2147483647)throw new RangeError("Worker timeoutMs 应为正有限数字,且不能超过 2147483647");const o=(n,s,i,d)=>i?.aborted?Promise.reject(P(i.reason)):new Promise((y,u)=>{let b;try{b=e()}catch(l){u(l);return}const k=`mach-report-${Date.now()}-${++he}`;let p=!1,f=()=>{},c;const m=(l,w)=>{p||(p=!0,c&&clearTimeout(c),f(),i?.removeEventListener("abort",g),Promise.resolve().then(()=>b.terminate()).then(()=>l===void 0?y(w):u(l),N=>u(l??N)))},g=()=>m(P(i?.reason)),x=l=>{const w=ge(l,k);if(!(!w||p)){if("type"in w&&w.type==="event"){const N="event"in w?w.event:void 0;le(N,s)?H(d,N,i):m(new Error("报表 Worker 返回无效阶段事件"));return}w.error&&typeof w.error.name=="string"&&typeof w.error.message=="string"?m(new J(w.error)):fe(w.result,n)&&(n!=="export"||"format"in w.result&&"format"in s&&w.result.format===s.format)?m(void 0,w.result):m(new Error("报表 Worker 返回无效响应"))}};try{if(f=b.subscribe(x,l=>m(l??new Error("报表 Worker 执行失败"))),p){f();return}if(i?.addEventListener("abort",g,{once:!0}),c=setTimeout(()=>m(new J({name:"ReportRuntimeError",code:"timeout",message:`报表 Worker 执行超过 ${r}ms`})),r),i?.aborted)g();else{const{onEvent:l,signal:w,...N}=s;b.postMessage({protocol:M,id:k,operation:n,input:N})}}catch(l){m(l)}});return{prepare:(n,s,i)=>o("prepare",n,s,i),export:(n,s,i)=>o("export",n,s,i)}}const be=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),$=(e,t)=>e>>>t|e<<32-t;function Ae(e,t,r){const o=new DataView(e.buffer,e.byteOffset+t,64);for(let n=0;n<16;n++)r[n]=o.getUint32(n*4);for(let n=16;n<64;n++){const s=r[n-15],i=r[n-2],d=$(s,7)^$(s,18)^s>>>3,y=$(i,17)^$(i,19)^i>>>10;r[n]=r[n-16]+d+r[n-7]+y}}function xe(e,t){let r=e[0],o=e[1],n=e[2],s=e[3],i=e[4],d=e[5],y=e[6],u=e[7];for(let b=0;b<64;b++){const k=$(i,6)^$(i,11)^$(i,25),p=i&d^~i&y,f=u+k+p+be[b]+t[b]>>>0,c=$(r,2)^$(r,13)^$(r,22),m=r&o^r&n^o&n,g=c+m>>>0;u=y,y=d,d=i,i=s+f>>>0,s=n,n=o,o=r,r=f+g>>>0}e[0]=e[0]+r,e[1]=e[1]+o,e[2]=e[2]+n,e[3]=e[3]+s,e[4]=e[4]+i,e[5]=e[5]+d,e[6]=e[6]+y,e[7]=e[7]+u}function $e(e){const t=new Uint8Array(Math.ceil((e.byteLength+9)/64)*64);t.set(e),t[e.byteLength]=128;const r=new DataView(t.buffer);return r.setUint32(t.length-8,Math.floor(e.byteLength/536870912)),r.setUint32(t.length-4,e.byteLength*8>>>0),t}const ke=()=>new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Ne=e=>Array.from(e,t=>t.toString(16).padStart(8,"0")).join("");async function ve(e){const t=$e(e),r=ke(),o=new Uint32Array(64);for(let n=0;n<t.length;n+=64)n>0&&n%262144===0&&await new Promise(s=>setTimeout(s,0)),Ae(t,n,o),xe(r,o);return Ne(r)}class a extends Error{constructor(t,r){super(r),this.code=t,this.name="ReportJobError"}}function T(e,t){if(typeof e!="string"||!e.trim()||e.length>256||typeof t!="string"||t!==t.trim()||!/^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,127}$/.test(t))throw new a("input","任务范围应非空,ID应为1–128位安全标识")}function Se(e){const t=Array.isArray(e),r=Object.getPrototypeOf(e),o=Object.keys(e);if(r!==(t?Array.prototype:Object.prototype)&&!(r===null&&!t))throw new a("input","任务对象应为普通 JSON 对象");if(Object.getOwnPropertySymbols(e).length)throw new a("input","任务不能包含Symbol");if(Object.getOwnPropertyNames(e).filter(s=>!(t&&s==="length")).length!==o.length)throw new a("input","任务不能包含不可枚举属性");if(t&&(o.length!==e.length||o.some(s=>s!==String(Number(s))||!Number.isSafeInteger(Number(s))||Number(s)<0||Number(s)>=e.length)))throw new a("input","任务数组不能稀疏或包含额外属性");return o.sort()}function Re(e,t){const r=Object.getOwnPropertyDescriptor(e,t);if(["__proto__","prototype","constructor"].includes(t)||r.get||r.set)throw new a("input","任务不能包含危险键或访问器");return r.value}function v(e,t={}){const r=t.maxNodes??2e4,o=t.maxCharacters??1e6;if(!Number.isSafeInteger(r)||r<1||r>2e4||!Number.isSafeInteger(o)||o<1||o>1e6)throw new a("input","任务JSON预算无效");let n=0,s=0;const i=new Set;function d(u,b){if(++n>r||b>32)throw new a("input","任务数据超过节点或深度预算");if(typeof u=="string"){if(s+=u.length,s>o)throw new a("input","任务文本超过预算");return u}if(u===null||typeof u=="boolean"||typeof u=="number"&&Number.isFinite(u))return u;if(!u||typeof u!="object"||i.has(u))throw new a("input","任务只允许无循环的有限 JSON 值");const k=Array.isArray(u),p=Se(u);i.add(u);const f=Object.create(null);for(const c of p){if(s+=c.length,s>o)throw new a("input","任务文本超过预算");f[c]=d(Re(u,c),b+1)}return i.delete(u),k?Array.from({length:u.length},(c,m)=>f[String(m)]):f}const y=JSON.stringify(d(e,0));if(y.length>o)throw new a("input","任务序列化数据超过字符预算");return y}function q(e){return JSON.parse(JSON.stringify(e))}function _(e,t,r,o){if(T(t,r),e.scope!==t||e.id!==r||e.revision!==(o??0)+1||!Number.isSafeInteger(e.revision))throw new a("input","任务身份或修订不匹配");if(![e.createdAt,e.updatedAt,e.attempt].every(n=>Number.isSafeInteger(n)&&n>=0)||!["queued","running","completed","failed","cancelled"].includes(e.status))throw new a("input","任务状态无效");if(e.lease&&(!e.lease.owner||!Number.isSafeInteger(e.lease.expiresAt)))throw new a("input","任务租约无效");if(!e.request||typeof e.request.kind!="string"||!e.request.kind.trim()||e.request.kind.length>128)throw new a("input","任务类型无效");v(e.request.payload,{maxNodes:19e3,maxCharacters:75e4}),v(e)}function Me(e,t){if(e&&(e.createdAt!==t.createdAt||v(e.request)!==v(t.request)))throw new a("input","任务创建时间与请求不可变更,请使用新任务ID")}function Ee(e,t){return e.status==="queued"||e.status==="running"&&(e.lease?.expiresAt??0)<=t}function Oe(e={}){const t={maxRecords:e.maxRecords??1e4,maxBytes:e.maxBytes??67108864,maxResultBytes:e.maxResultBytes??262144,controlReserveBytes:e.controlReserveBytes??4096,maxTombstones:e.maxTombstones??1e4,maxTombstoneBytes:e.maxTombstoneBytes??16777216};if(!Object.values(t).every(r=>Number.isSafeInteger(r)&&r>0)||t.controlReserveBytes<4096)throw new a("input","任务容量应为正整数,控制状态预留至少4096字节");return t}function E(e){return new TextEncoder().encode(v(e)).byteLength}function L(e,t){const r={scope:e.scope,id:e.id,revision:1,request:e.request,status:"queued",createdAt:e.createdAt,updatedAt:e.createdAt,attempt:0},o={...e};delete o.result;const n=e.result===void 0?0:E(e.result);if(n>t.maxResultBytes)throw new a("capacity","任务结果超过独立预算,请保存文件引用");return Math.max(E(r)+t.controlReserveBytes,E(o))+n}function z(e){return e.status!=="queued"&&e.status!=="running"}function Ie(e){const t={...e,tombstoneRetentionMs:e.tombstoneRetentionMs??6048e5,limit:e.limit??100};if(![t.now,t.terminalBefore].every(r=>Number.isSafeInteger(r)&&r>=0)||t.terminalBefore>t.now)throw new a("input","终态清理时间应为不超过当前时间的非负整数");if(![t.tombstoneRetentionMs,t.limit].every(r=>Number.isSafeInteger(r)&&r>0)||!Number.isSafeInteger(t.now+t.tombstoneRetentionMs))throw new a("input","幂等保留期与清理批量应为正整数");return t}async function Te(e){const t=new TextEncoder().encode(v(e)),r=globalThis.crypto?.subtle;if(!r)return ve(t);const o=await r.digest("SHA-256",t);return Array.from(new Uint8Array(o),n=>n.toString(16).padStart(2,"0")).join("")}async function je(e,t){if(!z(e))throw new a("input","只能归档终态任务");return{scope:e.scope,id:e.id,revision:e.revision,status:e.status,createdAt:e.createdAt,updatedAt:e.updatedAt,attempt:e.attempt,requestHash:await Te(e.request),expiresAt:t}}function qe(e){if(!e||!["completed","failed","cancelled"].includes(e.status)||!/^[a-f0-9]{64}$/.test(e.requestHash))throw new a("input","任务幂等摘要无效");if(![e.revision,e.createdAt,e.updatedAt,e.attempt,e.expiresAt].every(t=>Number.isSafeInteger(t)&&t>=0)||e.revision<1)throw new a("input","任务幂等摘要时间或修订无效")}function I(e){return e?.code}function O(e,t){return j.createHash("sha256").update(JSON.stringify([e,t])).digest("hex")+".json"}async function B(e){try{return await h.promises.readFile(e,"utf8")}catch(t){if(I(t)==="ENOENT")return;throw t}}async function Je(e,t){const r=await B(e);if(r===void 0)return;let o;try{o=JSON.parse(r)}catch{throw new a("conflict","任务锁尚未完整写入或已损坏,拒绝自动移除")}if(!o||!Number.isSafeInteger(o.pid)||o.pid<1)throw new a("conflict","任务锁身份无效,拒绝自动移除");try{process.kill(o.pid,0)}catch(n){if(I(n)==="ESRCH"){await h.promises.unlink(e);return}throw n}throw new a("conflict","任务目录的写入进程仍在运行")}async function Be(e,t){if(!t)throw new a("conflict","任务目录已有写入进程;多实例请使用数据库CAS适配器");const r=e+".recovery";let o;try{o=await h.promises.open(r,"wx",384)}catch(n){throw I(n)==="EEXIST"?new a("conflict","任务目录恢复正在进行,请稍后重试"):n}try{return await o.writeFile(JSON.stringify({pid:process.pid})),await Je(e,!0),await h.promises.open(e,"wx",384)}finally{await o.close(),await h.promises.unlink(r)}}async function Pe(e,t){const r=S.join(e,".writer-lock"),o=j.randomUUID();let n;try{n=await h.promises.open(r,"wx",384)}catch(s){if(I(s)!=="EEXIST")throw s;n=await Be(r,t)}try{await n.writeFile(JSON.stringify({pid:process.pid,token:o})),await n.sync()}catch(s){throw await n.close(),await h.promises.unlink(r).catch(()=>{}),s}return{file:r,token:o,handle:n}}function We(e,t,r,o){if("tombstone"in r){const n=r.tombstone;if(qe(n),T(n.scope,n.id),O(n.scope,n.id)!==t)throw new a("input","持久任务摘要身份不匹配");const s=E(n);e.tombstoneBytes+=s,e.tombstones.set(t,{value:n,bytes:s})}else{if(_(r,r.scope,r.id,r.revision-1),O(r.scope,r.id)!==t)throw new a("input","持久任务文件身份不匹配");const n=L(r,o);e.bytes+=n,e.records.set(t,{record:r,bytes:n})}if(e.bytes>o.maxBytes||e.records.size>o.maxRecords||e.tombstoneBytes>o.maxTombstoneBytes||e.tombstones.size>o.maxTombstones)throw new a("capacity","持久任务及控制状态预留超过目录预算")}async function Ue(e,t){const r=await h.promises.readdir(e);for(const s of r.filter(i=>/^\.pending-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(i)))await h.promises.unlink(S.join(e,s));const o=r.filter(s=>/^[a-f0-9]{64}\.json$/.test(s));if(o.length>t.maxRecords+t.maxTombstones)throw new a("capacity","持久任务数量超过目录预算");const n={records:new Map,tombstones:new Map,bytes:0,tombstoneBytes:0};for(const s of o){const i=S.join(e,s);if((await h.promises.stat(i)).size>4e6)throw new a("capacity","持久任务文件超过单文件预算");We(n,s,JSON.parse(await h.promises.readFile(i,"utf8")),t)}return n}async function Ce(e,t,r){const o=S.join(e,`.pending-${j.randomUUID()}`);try{const n=await h.promises.open(o,"wx",384);try{await n.writeFile(r),await n.sync()}finally{await n.close()}await h.promises.rename(o,S.join(e,t));const s=await h.promises.open(e,"r");try{await s.sync()}finally{await s.close()}}finally{await h.promises.unlink(o).catch(n=>{if(I(n)!=="ENOENT")throw n})}}async function Fe(e){const t=S.resolve(e.directory),r=Oe(e);await h.promises.mkdir(t,{recursive:!0,mode:448});const o=await Pe(t,e.recoverDeadOwner??!1);let n;try{n=await Ue(t,r)}catch(p){throw await o.handle.close(),await h.promises.unlink(o.file),p}let s=!1,i=Promise.resolve();const d=()=>{if(s)throw new a("closed","持久任务存储已关闭")},y=p=>{d();const f=i.then(async()=>{if(JSON.parse(await h.promises.readFile(o.file,"utf8")).token!==o.token)throw new a("closed","持久任务存储写入锁已失效");return p()});return i=f.then(()=>{},()=>{}),f},u=async(p,f,c)=>{try{await Ce(t,p,f)}catch(m){throw await B(S.join(t,p))===f&&c(),m}c()};return{read:async(p,f)=>{d(),T(p,f),await i;const c=n.records.get(O(p,f));return c?q(c.record):void 0},readTombstone:async(p,f)=>{d(),T(p,f),await i;const c=n.tombstones.get(O(p,f));return c?q(c.value):void 0},candidates:async(p,f)=>(d(),await i,Array.from(n.records.values(),c=>c.record).filter(c=>Ee(c,p)).sort((c,m)=>c.createdAt-m.createdAt).slice(0,f).map(q)),compareAndSwap:async(p,f,c,m)=>{const g=JSON.parse(v(m));return _(g,p,f,c),y(async()=>{const x=O(p,f),l=n.records.get(x);if((l?.record.revision??null)!==c||n.tombstones.has(x))return!1;Me(l?.record,g);const w=L(g,r),N=n.bytes-(l?.bytes??0)+w;if(N>r.maxBytes||!l&&n.records.size>=r.maxRecords)throw new a("capacity","持久任务容量已满,请清理终态任务或扩大显式预算");return await u(x,v(g),()=>{n.records.set(x,{record:g,bytes:w}),n.bytes=N}),!0})},prune:async p=>{const f=Ie(p);return y(async()=>{const c={archived:0,expired:0};for(const[m,g]of n.tombstones)g.value.expiresAt>f.now||c.expired>=f.limit||(await h.promises.unlink(S.join(t,m)),n.tombstones.delete(m),n.tombstoneBytes-=g.bytes,c.expired++);for(const[m,g]of n.records){if(!z(g.record)||g.record.updatedAt>f.terminalBefore||c.archived+c.expired>=f.limit)continue;const x=await je(g.record,f.now+f.tombstoneRetentionMs),l=E(x);if(n.tombstones.size>=r.maxTombstones||n.tombstoneBytes+l>r.maxTombstoneBytes)break;await u(m,v({tombstone:x}),()=>{n.tombstones.set(m,{value:x,bytes:l}),n.tombstoneBytes+=l,n.records.delete(m),n.bytes-=g.bytes}),c.archived++}if(c.expired){const m=await h.promises.open(t,"r");try{await m.sync()}finally{await m.close()}}return c})},close:async()=>{if(s)return;s=!0,await i,await o.handle.close();const p=await B(o.file);p&&JSON.parse(p).token===o.token&&await h.promises.unlink(o.file)}}}function De(e){const t=e.filename??e.workerUrl;if(!t||e.filename&&e.workerUrl)throw new TypeError("请且仅请指定 filename 或 workerUrl");return we(()=>{const r=new W.Worker(t,e.workerOptions);return{postMessage:o=>r.postMessage(o),terminate:()=>r.terminate(),subscribe:(o,n)=>{const s=i=>n(new Error(`报表 Worker 在响应前退出(code ${i})`));return r.on("message",o),r.on("error",n),r.on("messageerror",n),r.on("exit",s),()=>{r.off("message",o),r.off("error",n),r.off("messageerror",n),r.off("exit",s)}}}},e)}function _e(e){const t=W.parentPort;if(!t)throw new Error("serveNodeReportWorker 只能在 worker_threads 中调用");const r=o=>{de(o)&&me(e,o,n=>t.postMessage({protocol:M,id:o.id,type:"event",event:n})).then(n=>t.postMessage(n,ye(n)))};return t.on("message",r),()=>t.off("message",r)}function Le(e){return j.createHash("sha256").update(e).digest("hex")}exports.ReportWorkerError=J;exports.createNodeReportExecutor=De;exports.openFileReportJobStore=Fe;exports.reportArtifactSha256=Le;exports.serveNodeReportWorker=_e;
|