@fishka/seqio 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,12 +1,12 @@
1
- function E(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function F(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function x(e,t,n){return e.subarray(t,t+n)}function G(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var v=128,N=28;function P(e){if(e.byteLength<v)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(E(x(e,0,4))!=="ABIF")if(e.byteLength>=132&&E(x(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<v)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),a=r.getInt16(n+4,false),i=I(e,r,n+6,n);if(i.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${i.tagName}"`);if(i.elementSize!==N)throw new Error(`Expected dir element size ${N}, got ${i.elementSize}`);let b=i.raw?.elementCount??i.elementCount,d=Math.max(0,b),y=r.getInt32(n+6+20,false);if(y<0||y+d*N>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${y}, entries=${d}, file=${e.byteLength-n}`);let u=[];for(let T=0;T<d;T++)u.push(I(e,r,n+y+T*N,n));let A=i.raw?.dataSize??d*N,p=n+y+d*N,g=Math.min(Math.max(0,A-d*N),Math.max(0,e.byteLength-p)),o={entryCount:d,rawEntryCount:b,elementType:i.elementType,tagNumber:i.tagNumber,entrySize:i.elementSize,dataSize:A,dataOffset:y,dataOffsetBytes:i.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:i.dataHandle,paddingBytes:new Uint8Array(x(e,p,g))},m=new Uint8Array(x(e,n+6+N,v-6-N)),h=t===128?new Uint8Array(x(e,0,128)):void 0,C=q(e,n,y,A,u,t);return {version:a,tdir:o,entries:u,macBinaryOffset:t,macBinaryHeader:h,headerReserved:m,unreferencedRanges:C}}function q(e,t,n,r,a,i){let b=e.byteLength,d=[];i===128&&d.push([0,128]),d.push([t,t+v]);let y=Math.max(a.length*N,Math.max(0,r));d.push([t+n,t+n+y]);for(let o of a)if(o.raw&&!o.raw.inline){let m=t+o.raw.dataOffset;d.push([m,m+o.payload.byteLength]);}let u=d.map(([o,m])=>[Math.max(0,Math.min(o,b)),Math.max(0,Math.min(m,b))]).filter(([o,m])=>m>o).sort((o,m)=>o[0]-m[0]),A=[];for(let[o,m]of u){let h=A[A.length-1];h&&o<=h[1]?h[1]=Math.max(h[1],m):A.push([o,m]);}let p=[],g=0;for(let[o,m]of A)o>g&&p.push({offset:g,bytes:new Uint8Array(x(e,g,o-g))}),g=Math.max(g,m);return g<b&&p.push({offset:g,bytes:new Uint8Array(x(e,g,b-g))}),p}function I(e,t,n,r){let a=E(x(e,n,4)),i=t.getInt32(n+4,false),b=t.getInt16(n+8,false),d=t.getInt16(n+10,false),y=t.getInt32(n+12,false),u=t.getInt32(n+16,false),A=t.getInt32(n+24,false),p=Math.max(0,y*Math.max(0,d)),g=u>=0?u:p,o=u>=0?u<=4:p<=4,m=Math.max(0,d>0?Math.min(y,Math.floor(g/d)):Math.min(y,g)),h,C;if(o)C=-1,h=new Uint8Array(x(e,n+20,Math.min(4,g)));else {C=t.getInt32(n+20,false);let s=r+C;if(C<0||s+g>e.byteLength)throw new Error(`Entry ${a}${i}: payload out of bounds (offset=${C}, size=${g})`);h=new Uint8Array(x(e,s,g));}let T=new Uint8Array(x(e,n+20,4));return {tagName:a,tagNumber:i,elementType:b,elementSize:d,elementCount:m,payload:h,dataHandle:A,raw:{elementCount:y,dataSize:u,dataOffset:C,inline:o,dataOffsetBytes:T}}}function re(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,a=e.entries.map(o=>o.raw&&o.payload.byteLength===o.raw.dataSize?o.raw:void 0),i=v;i=Math.max(i,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*N));for(let o of a)o&&!o.inline&&(i=Math.max(i,o.dataOffset+o.dataSize));for(let o of e.unreferencedRanges)i=Math.max(i,o.offset-t+o.bytes.length);let b=n>r,d=i,y=b?d:e.tdir.dataOffset,u=n===r?e.tdir.dataSize:n*N;b&&(d+=u);let A=new Array(n);for(let o=0;o<n;o++){let m=e.entries[o].payload.byteLength;if(a[o]||m<=4){A[o]=-1;continue}A[o]=d,d+=m;}let p=new Uint8Array(d),g=w(p);p.set(F("ABIF"),0),g.setInt16(4,e.version,false),p.set(e.headerReserved,6+N),B(p,g,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:u,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:y}}),n===r&&e.tdir.paddingBytes.length>0&&p.set(e.tdir.paddingBytes,y+n*N);for(let o=0;o<n;o++){let m=e.entries[o],h=a[o],C=y+o*N,T=m.payload.byteLength;B(p,g,C,{tagName:m.tagName,tagNumber:m.tagNumber,elementType:m.elementType,elementSize:m.elementSize,elementCount:h?h.elementCount:m.elementCount,dataSize:h?h.dataSize:T,dataHandle:m.dataHandle,offsetSlot:T<=4?{kind:"inline",payload:m.payload,dataSize:T,staleTail:h?.dataOffsetBytes}:{kind:"external",value:h?h.dataOffset:A[o]}}),T>4&&p.set(m.payload,h?h.dataOffset:A[o]);}for(let o of e.unreferencedRanges)p.set(o.bytes,o.offset-t);return p}function B(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(F(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:a,dataSize:i,staleTail:b}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(a.subarray(0,i),n+20),b&&i<4&&e.set(b.subarray(i,4),n+20+i);}t.setInt32(n+24,r.dataHandle,false);}function S(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ae(e,t){return e.entries.filter(n=>n.tagName===t)}function z(e,t,n,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let i=S(e,t,n);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r,i.raw=void 0):e.entries.push({tagName:t,tagNumber:n,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function le(e,t){let n=S(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),a=w(n.payload);for(let i=0;i<n.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function D(e){let t=S(e,"FWO_",1);return t?E(t.payload.subarray(0,t.elementCount)):"GATC"}function L(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function H(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function ue(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function me(e){let t=S(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function fe(e){let t=D(e);if(!L(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function ce(e){let t=a=>E(a.payload.subarray(0,a.elementCount)).replace(/\0+$/g,""),n=S(e,"PBAS",2);if(n)return t(n);let r=S(e,"PBAS",1);if(r)return t(r)}function de(e){let t=S(e,"PCON",2)??S(e,"PCON",1);if(!t)return;let n=new Array(t.elementCount);for(let r=0;r<t.elementCount;r++)n[r]=t.payload[r];return n}function ge(e){let t=S(e,"PLOC",2)??S(e,"PLOC",1);if(!t)return;if(t.elementSize!==2)throw new Error(`PLOC: expected elementSize=2, got ${t.elementSize}`);let n=w(t.payload),r=new Array(t.elementCount);for(let a=0;a<t.elementCount;a++)r[a]=n.getUint16(a*2,false);return r}function be(e){let t=S(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}var W={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function k(e){return W[e]??(e>=1024?`user${e}`:`type${e}`)}function Q(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function X(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function _(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function R(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function $(e,t,n,r){let a=Math.max(0,Math.min(t,Math.floor(e/n))),i=[];for(let b=0;b<a;b++)i.push(r(b*n));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function V(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:E(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return $(n.byteLength,t,2,a=>r.getUint16(a,false));case 4:return $(n.byteLength,t,2,a=>r.getInt16(a,false));case 5:return $(n.byteLength,t,4,a=>r.getInt32(a,false));case 7:return $(n.byteLength,t,4,a=>r.getFloat32(a,false));case 8:return $(n.byteLength,t,8,a=>r.getFloat64(a,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let a=r.getInt16(0,false),i=r.getUint8(2),b=r.getUint8(3);return {kind:"date",value:{year:a,month:i,day:b}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let a=[];for(let i=0;i<Math.min(t,n.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:E(x(n,1,Math.min(a,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Y(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Q(e.value);case "string":return X(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:a}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:a}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${k(t)} ${_(e.value)}`;case "unknown":return `${k(t)} ${_(e.value)}`}}function Se(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=P(n),a=r.entries.map(s=>{let l=s.tagName==="PCON"&&s.elementSize===1?V(1,s.elementCount,s.payload):V(s.elementType,s.elementCount,s.payload);return {tag:s.tagName,tagNumber:s.tagNumber,elementType:s.elementType,elementTypeName:k(s.elementType),elementSize:s.elementSize,elementCount:s.elementCount,rawElementCount:s.raw?.elementCount??s.elementCount,dataSize:s.raw?.dataSize??s.elementCount*s.elementSize,dataOffset:s.raw?.dataOffset??-1,inline:s.raw?.inline??s.elementCount*s.elementSize<=4,decoded:l,preview:Y(l,s.elementType)}}),i=D(r);L(i)||(i="GATC");let b={},d={A:[],C:[],G:[],T:[]},y={A:[],C:[],G:[],T:[]},u={comments:[]},A={},p={},g={},o=s=>i[s];for(let s=0;s<r.entries.length;s++){let l=r.entries[s],c=a[s].decoded;if(l.tagName==="DATA"){let f=R(c);f&&(b[l.tagNumber]=f,l.tagNumber>=1&&l.tagNumber<=4?d[o(l.tagNumber-1)]=f:l.tagNumber>=9&&l.tagNumber<=12&&(y[o(l.tagNumber-9)]=f));}else if(l.tagName==="PBAS"&&c.kind==="string")A[l.tagNumber]=c.value;else if(l.tagName==="PCON"){let f=l.elementSize===1?Array.from(l.payload.subarray(0,l.elementCount)):R(c);f&&(p[l.tagNumber]=f);}else if(l.tagName==="PLOC"){let f=R(c);f&&(g[l.tagNumber]=f.map(U=>U<0?U+65536:U));}else if(l.tagName==="SPAC")if(l.elementSize===4&&l.payload.byteLength>=4){let f=w(l.payload).getFloat32(0,false);Number.isFinite(f)&&f>0&&(u.samplingRate=f);}else c.kind==="number"&&(u.samplingRate=c.value);else if(l.tagName==="SMPL"&&c.kind==="string")u.sampleName=c.value;else if(l.tagName==="LANE"&&c.kind==="number")u.laneNumber=c.value;else if(l.tagName==="TUBE"&&c.kind==="string")u.tube=c.value;else if(l.tagName==="MCHN"&&c.kind==="string")u.machineName=c.value;else if(l.tagName==="MODL"&&c.kind==="string")u.machineModel=c.value;else if(l.tagName==="RUND"&&c.kind==="date"){let f=c.value;u.runDate=`${f.year}-${String(f.month).padStart(2,"0")}-${String(f.day).padStart(2,"0")}`;}else if(l.tagName==="RUNT"&&c.kind==="time"){let f=c.value;u.runTime=`${String(f.hour).padStart(2,"0")}:${String(f.minute).padStart(2,"0")}:${String(f.second).padStart(2,"0")}`;}else l.tagName==="CMNT"&&c.kind==="string"?u.comments.push(c.value):l.tagName==="RevC"&&l.tagNumber===1&&(c.kind==="number"?u.reverseComplemented=c.value!==0:c.kind==="numbers"&&(u.reverseComplemented=c.value.some(f=>f!==0)));}let m=Object.keys(A).map(Number).sort((s,l)=>s-l).map(s=>({version:s,role:s===1?"edited":s===2?"called":"unknown",sequence:A[s],confidences:p[s]??[],positions:g[s]??[]})),h,C=2 in A?2:1 in A?1:Object.keys(A).map(Number)[0];if(C!==void 0&&A[C]!==void 0){let s=A[C].toUpperCase(),l=p[C]??[];l.length!==s.length&&(l=Object.keys(p).map(Number).map(f=>p[f]).find(f=>f.length===s.length)??[]);let c=g[C]??[];c.length!==s.length&&(c=Object.keys(g).map(Number).map(f=>g[f]).find(f=>f.length===s.length)??[]),h={sequence:s,confidences:l,positions:c,pbasVersion:C};}if(!Number.isFinite(u.samplingRate)||(u.samplingRate??0)<=0){let s=h?.positions,l=Math.max(y.A.length,y.C.length,y.G.length,y.T.length);s&&s.length>1?u.samplingRate=(s[s.length-1]-s[0])/(s.length-1):h&&h.sequence.length>0&&l>0&&(u.samplingRate=l/h.sequence.length);}let T={baseOrder:i,dataChannels:b,data1To4:d,data9To12:y};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:u,chromatogram:T,baseCalls:h,baseCallVariants:m,entries:a}}function Ce(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function we(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function ze(e,t){z(e,"PBAS",2,F(t),{elementType:2,elementSize:1,elementCount:t.length});}function Fe(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));z(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function ve(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let a=0;a<t.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,t[a])),false);z(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function $e(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),z(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=F(n),i=Math.min(255,a.length),b=new Uint8Array(1+i);b[0]=i,b.set(a.subarray(0,i),1),z(e,"SPAC",2,b,{elementType:18,elementSize:1,elementCount:1+i});let d=new Uint8Array(4);w(d).setFloat32(0,t,false),z(e,"SPAC",3,d,{elementType:7,elementSize:4,elementCount:1});}function Ue(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function De(e){if(!H(e))for(let t=1;t<=4;t++){let n=S(e,"DATA",t);if(!n)continue;let r=8+t;S(e,"DATA",r)||e.entries.push({tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}var Re=93;function ke(e,t){let n=t?.lineWidth??60;return O(e).map(r=>`${M(">",r.id,r.description)}
2
- ${J(r.sequence,n)}`).join("")}function Me(e){return O(e).map(Z).join("")}function Oe(e,t){let n=t?.lineWidth??60;return O(e).map(r=>`${M(">",r.id,r.description)}
3
- ${K(r.qualities,n)}`).join("")}function Ie(e){return !!e&&e.length>0&&!e.every(t=>t===255)}function Z(e){let{id:t,description:n,sequence:r,qualities:a}=e;if(a.length!==r.length)throw new Error(`FASTQ ${t}: ${a.length} quality scores for ${r.length} bases`);let i=a.map(ee).join("");return `${M("@",t,n)}
1
+ function E(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function F(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function x(e,t,n){return e.subarray(t,t+n)}function Y(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var z=128,N=28;function G(e){if(e.byteLength<z)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(E(x(e,0,4))!=="ABIF")if(e.byteLength>=132&&E(x(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<z)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),a=r.getInt16(n+4,false),i=q(e,r,n+6,n);if(i.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${i.tagName}"`);if(i.elementSize!==N)throw new Error(`Expected dir element size ${N}, got ${i.elementSize}`);let c=i.raw?.elementCount??i.elementCount,m=Math.max(0,c),u=r.getInt32(n+6+20,false);if(u<0||u+m*N>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${u}, entries=${m}, file=${e.byteLength-n}`);let d=[];for(let T=0;T<m;T++)d.push(q(e,r,n+u+T*N,n));let y=i.raw?.dataSize??m*N,f=n+u+m*N,h=Math.min(Math.max(0,y-m*N),Math.max(0,e.byteLength-f)),o={entryCount:m,rawEntryCount:c,elementType:i.elementType,tagNumber:i.tagNumber,entrySize:i.elementSize,dataSize:y,dataOffset:u,dataOffsetBytes:i.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:i.dataHandle,paddingBytes:new Uint8Array(x(e,f,h))},g=new Uint8Array(x(e,n+6+N,z-6-N)),A=t===128?new Uint8Array(x(e,0,128)):void 0,C=Z(e,n,u,y,d,t);return {version:a,tdir:o,entries:d,macBinaryOffset:t,macBinaryHeader:A,headerReserved:g,unreferencedRanges:C}}function Z(e,t,n,r,a,i){let c=e.byteLength,m=[];i===128&&m.push([0,128]),m.push([t,t+z]);let u=Math.max(a.length*N,Math.max(0,r));m.push([t+n,t+n+u]);for(let o of a)if(o.raw&&!o.raw.inline){let g=t+o.raw.dataOffset;m.push([g,g+o.payload.byteLength]);}let d=m.map(([o,g])=>[Math.max(0,Math.min(o,c)),Math.max(0,Math.min(g,c))]).filter(([o,g])=>g>o).sort((o,g)=>o[0]-g[0]),y=[];for(let[o,g]of d){let A=y[y.length-1];A&&o<=A[1]?A[1]=Math.max(A[1],g):y.push([o,g]);}let f=[],h=0;for(let[o,g]of y)o>h&&f.push({offset:h,bytes:new Uint8Array(x(e,h,o-h))}),h=Math.max(h,g);return h<c&&f.push({offset:h,bytes:new Uint8Array(x(e,h,c-h))}),f}function q(e,t,n,r){let a=E(x(e,n,4)),i=t.getInt32(n+4,false),c=t.getInt16(n+8,false),m=t.getInt16(n+10,false),u=t.getInt32(n+12,false),d=t.getInt32(n+16,false),y=t.getInt32(n+24,false),f=Math.max(0,u*Math.max(0,m)),h=d>=0?d:f,o=d>=0?d<=4:f<=4,g=Math.max(0,m>0?Math.min(u,Math.floor(h/m)):Math.min(u,h)),A,C;if(o)C=-1,A=new Uint8Array(x(e,n+20,Math.min(4,h)));else {C=t.getInt32(n+20,false);let s=r+C;if(C<0||s+h>e.byteLength)throw new Error(`Entry ${a}${i}: payload out of bounds (offset=${C}, size=${h})`);A=new Uint8Array(x(e,s,h));}let T=new Uint8Array(x(e,n+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:m,elementCount:g,payload:A,dataHandle:y,raw:{elementCount:u,dataSize:d,dataOffset:C,inline:o,dataOffsetBytes:T}}}function de(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,a=e.entries.map(o=>o.raw&&o.payload.byteLength===o.raw.dataSize?o.raw:void 0),i=z;i=Math.max(i,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*N));for(let o of a)o&&!o.inline&&(i=Math.max(i,o.dataOffset+o.dataSize));for(let o of e.unreferencedRanges)i=Math.max(i,o.offset-t+o.bytes.length);let c=n>r,m=i,u=c?m:e.tdir.dataOffset,d=n===r?e.tdir.dataSize:n*N;c&&(m+=d);let y=new Array(n);for(let o=0;o<n;o++){let g=e.entries[o].payload.byteLength;if(a[o]||g<=4){y[o]=-1;continue}y[o]=m,m+=g;}let f=new Uint8Array(m),h=w(f);f.set(F("ABIF"),0),h.setInt16(4,e.version,false),f.set(e.headerReserved,6+N),j(f,h,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:d,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:u}}),n===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,u+n*N);for(let o=0;o<n;o++){let g=e.entries[o],A=a[o],C=u+o*N,T=g.payload.byteLength;j(f,h,C,{tagName:g.tagName,tagNumber:g.tagNumber,elementType:g.elementType,elementSize:g.elementSize,elementCount:A?A.elementCount:g.elementCount,dataSize:A?A.dataSize:T,dataHandle:g.dataHandle,offsetSlot:T<=4?{kind:"inline",payload:g.payload,dataSize:T,staleTail:A?.dataOffsetBytes}:{kind:"external",value:A?A.dataOffset:y[o]}}),T>4&&f.set(g.payload,A?A.dataOffset:y[o]);}for(let o of e.unreferencedRanges)f.set(o.bytes,o.offset-t);return f}function j(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(F(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:a,dataSize:i,staleTail:c}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(a.subarray(0,i),n+20),c&&i<4&&e.set(c.subarray(i,4),n+20+i);}t.setInt32(n+24,r.dataHandle,false);}function S(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ge(e,t){return e.entries.filter(n=>n.tagName===t)}function J(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function M(e,t){let n=e.findIndex(r=>J(r,t)>0);e.splice(n<0?e.length:n,0,t);}function $(e,t,n,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let i=S(e,t,n);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r,i.raw=void 0):M(e.entries,{tagName:t,tagNumber:n,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function ye(e,t){let n=S(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),a=w(n.payload);for(let i=0;i<n.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function B(e){let t=S(e,"FWO_",1);return t?E(t.payload.subarray(0,t.elementCount)):"GATC"}function P(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function L(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function Ae(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function Se(e){let t=S(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function Ce(e){let t=B(e);if(!P(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function we(e){return U(e,2)??U(e,1)}function U(e,t){let n=S(e,"PBAS",t);if(n)return E(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function Ne(e){return v(e,2)??v(e,1)}function v(e,t){let n=S(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let a=0;a<n.elementCount;a++)r[a]=n.payload[a];return r}function xe(e){return R(e,2)??R(e,1)}function R(e,t){let n=S(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=w(n.payload),a=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)a[i]=r.getUint16(i*2,false);return a}function Te(e){let t=S(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function De(e,t,n={}){let{start:r,end:a}=t;if(!Number.isInteger(r)||!Number.isInteger(a)||r<0||a<=r)throw new Error(`cropAbif: invalid range [${r}, ${a})`);if(!L(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let i=Math.min(O(e,9),O(e,10),O(e,11),O(e,12));if(a>i)throw new Error(`cropAbif: range end ${a} exceeds the processed trace length ${i}`);let c=n.rawTrace??"omit",m=[];for(let u of e.entries)u.tagName==="DATA"&&u.tagNumber>=9&&u.tagNumber<=12?m.push(K(u,r,a)):u.tagName==="DATA"&&u.tagNumber>=1&&u.tagNumber<=8?c==="full"&&m.push({...u}):u.tagName==="PBAS"||u.tagName==="PCON"||u.tagName==="PLOC"||m.push({...u});for(let u of ee(e))m.push(...te(e,u,r,a));return {version:e.version,tdir:e.tdir,entries:m,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function O(e,t){return S(e,"DATA",t)?.elementCount??0}function K(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function ee(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function te(e,t,n,r){let a=U(e,t);if(a===void 0)return [];let i=R(e,t);if(i===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(i.length!==a.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${a.length} vs ${i.length})`);let c=v(e,t);if(c!==void 0&&c.length!==a.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let m=[];for(let f=0;f<i.length;f++)i[f]>=n&&i[f]<r&&m.push(f);let u=m.map(f=>a[f]).join(""),d=m.map(f=>i[f]-n),y=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:F(u),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:d.length,payload:ne(d),dataHandle:0}];if(c!==void 0){let f=m.map(h=>c[h]);y.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return y}function ne(e){let t=new Uint8Array(e.length*2),n=w(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var re={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function H(e){return re[e]??(e>=1024?`user${e}`:`type${e}`)}function ae(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function ie(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function W(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function I(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function D(e,t,n,r){let a=Math.max(0,Math.min(t,Math.floor(e/n))),i=[];for(let c=0;c<a;c++)i.push(r(c*n));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function Q(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:E(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return D(n.byteLength,t,2,a=>r.getUint16(a,false));case 4:return D(n.byteLength,t,2,a=>r.getInt16(a,false));case 5:return D(n.byteLength,t,4,a=>r.getInt32(a,false));case 7:return D(n.byteLength,t,4,a=>r.getFloat32(a,false));case 8:return D(n.byteLength,t,8,a=>r.getFloat64(a,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let a=r.getInt16(0,false),i=r.getUint8(2),c=r.getUint8(3);return {kind:"date",value:{year:a,month:i,day:c}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let a=[];for(let i=0;i<Math.min(t,n.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:E(x(n,1,Math.min(a,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function oe(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return ae(e.value);case "string":return ie(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:a}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:a}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${H(t)} ${W(e.value)}`;case "unknown":return `${H(t)} ${W(e.value)}`}}function Oe(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=G(n),a=r.entries.map(s=>{let l=s.tagName==="PCON"&&s.elementSize===1?Q(1,s.elementCount,s.payload):Q(s.elementType,s.elementCount,s.payload);return {tag:s.tagName,tagNumber:s.tagNumber,elementType:s.elementType,elementTypeName:H(s.elementType),elementSize:s.elementSize,elementCount:s.elementCount,rawElementCount:s.raw?.elementCount??s.elementCount,dataSize:s.raw?.dataSize??s.elementCount*s.elementSize,dataOffset:s.raw?.dataOffset??-1,inline:s.raw?.inline??s.elementCount*s.elementSize<=4,decoded:l,preview:oe(l,s.elementType)}}),i=B(r);P(i)||(i="GATC");let c={},m={A:[],C:[],G:[],T:[]},u={A:[],C:[],G:[],T:[]},d={comments:[]},y={},f={},h={},o=s=>i[s];for(let s=0;s<r.entries.length;s++){let l=r.entries[s],p=a[s].decoded;if(l.tagName==="DATA"){let b=I(p);b&&(c[l.tagNumber]=b,l.tagNumber>=1&&l.tagNumber<=4?m[o(l.tagNumber-1)]=b:l.tagNumber>=9&&l.tagNumber<=12&&(u[o(l.tagNumber-9)]=b));}else if(l.tagName==="PBAS"&&p.kind==="string")y[l.tagNumber]=p.value;else if(l.tagName==="PCON"){let b=l.elementSize===1?Array.from(l.payload.subarray(0,l.elementCount)):I(p);b&&(f[l.tagNumber]=b);}else if(l.tagName==="PLOC"){let b=I(p);b&&(h[l.tagNumber]=b.map(k=>k<0?k+65536:k));}else if(l.tagName==="SPAC")if(l.elementSize===4&&l.payload.byteLength>=4){let b=w(l.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(d.samplingRate=b);}else p.kind==="number"&&(d.samplingRate=p.value);else if(l.tagName==="SMPL"&&p.kind==="string")d.sampleName=p.value;else if(l.tagName==="LANE"&&p.kind==="number")d.laneNumber=p.value;else if(l.tagName==="TUBE"&&p.kind==="string")d.tube=p.value;else if(l.tagName==="MCHN"&&p.kind==="string")d.machineName=p.value;else if(l.tagName==="MODL"&&p.kind==="string")d.machineModel=p.value;else if(l.tagName==="RUND"&&p.kind==="date"){let b=p.value;d.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(l.tagName==="RUNT"&&p.kind==="time"){let b=p.value;d.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else l.tagName==="CMNT"&&p.kind==="string"?d.comments.push(p.value):l.tagName==="RevC"&&l.tagNumber===1&&(p.kind==="number"?d.reverseComplemented=p.value!==0:p.kind==="numbers"&&(d.reverseComplemented=p.value.some(b=>b!==0)));}let g=Object.keys(y).map(Number).sort((s,l)=>s-l).map(s=>({version:s,role:s===1?"edited":s===2?"called":"unknown",sequence:y[s],confidences:f[s]??[],positions:h[s]??[]})),A,C=2 in y?2:1 in y?1:Object.keys(y).map(Number)[0];if(C!==void 0&&y[C]!==void 0){let s=y[C].toUpperCase(),l=f[C]??[];l.length!==s.length&&(l=Object.keys(f).map(Number).map(b=>f[b]).find(b=>b.length===s.length)??[]);let p=h[C]??[];p.length!==s.length&&(p=Object.keys(h).map(Number).map(b=>h[b]).find(b=>b.length===s.length)??[]),A={sequence:s,confidences:l,positions:p,pbasVersion:C};}if(!Number.isFinite(d.samplingRate)||(d.samplingRate??0)<=0){let s=A?.positions,l=Math.max(u.A.length,u.C.length,u.G.length,u.T.length);s&&s.length>1?d.samplingRate=(s[s.length-1]-s[0])/(s.length-1):A&&A.sequence.length>0&&l>0&&(d.samplingRate=l/A.sequence.length);}let T={baseOrder:i,dataChannels:c,data1To4:m,data9To12:u};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:d,chromatogram:T,baseCalls:A,baseCallVariants:g,entries:a}}function ke(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function Me(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Ve(e,t){$(e,"PBAS",2,F(t),{elementType:2,elementSize:1,elementCount:t.length});}function _e(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));$(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function qe(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let a=0;a<t.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,t[a])),false);$(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function je(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=F(n),i=Math.min(255,a.length),c=new Uint8Array(1+i);c[0]=i,c.set(a.subarray(0,i),1),$(e,"SPAC",2,c,{elementType:18,elementSize:1,elementCount:1+i});let m=new Uint8Array(4);w(m).setFloat32(0,t,false),$(e,"SPAC",3,m,{elementType:7,elementSize:4,elementCount:1});}function Ge(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function We(e){if(!L(e))for(let t=1;t<=4;t++){let n=S(e,"DATA",t);if(!n)continue;let r=8+t;S(e,"DATA",r)||M(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}var Xe=93;function Ye(e,t){let n=t?.lineWidth??60;return _(e).map(r=>`${V(">",r.id,r.description)}
2
+ ${ue(r.sequence,n)}`).join("")}function Ze(e){return _(e).map(se).join("")}function Je(e,t){let n=t?.lineWidth??60;return _(e).map(r=>`${V(">",r.id,r.description)}
3
+ ${le(r.qualities,n)}`).join("")}function Ke(e){return !!e&&e.length>0&&!e.every(t=>t===255)}function se(e){let{id:t,description:n,sequence:r,qualities:a}=e;if(a.length!==r.length)throw new Error(`FASTQ ${t}: ${a.length} quality scores for ${r.length} bases`);let i=a.map(me).join("");return `${V("@",t,n)}
4
4
  ${r}
5
5
  +
6
6
  ${i}
7
- `}function M(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
8
- `))throw new Error("FASTX header must not contain a newline");return e+r}function J(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
7
+ `}function V(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
8
+ `))throw new Error("FASTX header must not contain a newline");return e+r}function ue(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
9
9
  `;let n="";for(let r=0;r<e.length;r+=t)n+=`${e.slice(r,r+t)}
10
- `;return n}function K(e,t){if(e.length===0)return "";let n=e.map(j),r=t<=0?n.length:t,a="";for(let i=0;i<n.length;i+=r)a+=`${n.slice(i,i+r).join(" ")}
11
- `;return a}function j(e){let t=Math.round(e);return t<0?0:t>93?93:t}function ee(e){return String.fromCharCode(j(e)+33)}function O(e){return Array.isArray(e)?e:[e]}export{N as ENTRY_SIZE,v as HEADER_SIZE,Re as MAX_PHRED,Ue as averagePeakSpacing,we as channelMaxLength,ue as dataChannelRole,De as ensureRawDataChannels,ae as findEntries,S as findEntry,ke as formatFasta,Me as formatFastq,Oe as formatQual,fe as getChannelMap,de as getConfidences,le as getDataChannel,D as getFwo,ge as getPositions,me as getReverseComplemented,be as getSamplingRate,ce as getSequence,H as hasData9To12Block,Ce as hasSignals,Ie as hasUsableQuality,L as isFwoPermutation,Se as parseAbif,P as readAbif,$e as setAveragePeakSpacing,Fe as setConfidences,ve as setPositions,ze as setSequence,G as tagNameFromInt32,z as upsertEntry,re as writeAbif};//# sourceMappingURL=index.mjs.map
10
+ `;return n}function le(e,t){if(e.length===0)return "";let n=e.map(X),r=t<=0?n.length:t,a="";for(let i=0;i<n.length;i+=r)a+=`${n.slice(i,i+r).join(" ")}
11
+ `;return a}function X(e){let t=Math.round(e);return t<0?0:t>93?93:t}function me(e){return String.fromCharCode(X(e)+33)}function _(e){return Array.isArray(e)?e:[e]}export{N as ENTRY_SIZE,z as HEADER_SIZE,Xe as MAX_PHRED,Ge as averagePeakSpacing,Me as channelMaxLength,De as cropAbif,Ae as dataChannelRole,We as ensureRawDataChannels,ge as findEntries,S as findEntry,Ye as formatFasta,Ze as formatFastq,Je as formatQual,Ce as getChannelMap,Ne as getConfidences,v as getConfidencesForVersion,ye as getDataChannel,B as getFwo,xe as getPositions,R as getPositionsForVersion,Se as getReverseComplemented,Te as getSamplingRate,we as getSequence,U as getSequenceForVersion,L as hasData9To12Block,ke as hasSignals,Ke as hasUsableQuality,M as insertEntrySorted,P as isFwoPermutation,Oe as parseAbif,G as readAbif,je as setAveragePeakSpacing,_e as setConfidences,qe as setPositions,Ve as setSequence,Y as tagNameFromInt32,$ as upsertEntry,de as writeAbif};//# sourceMappingURL=index.mjs.map
12
12
  //# sourceMappingURL=index.mjs.map