@zakodium/nmrium-core 0.5.3 → 0.5.5

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.
@@ -1,5 +1,4 @@
1
1
  import type { CorrelationData } from 'nmr-correlation';
2
- import type { ExtraFileContent } from 'file-collection';
3
2
  import type { FifoLoggerOptions } from 'fifo-logger';
4
3
  import { FileCollection } from 'file-collection';
5
4
  import type { FileItem } from 'file-collection';
@@ -1150,15 +1149,10 @@ export declare type SerializedNmriumState = Omit<Partial<NmriumState>, 'data'> &
1150
1149
 
1151
1150
  export declare interface SerializeNmriumArchiveOptions {
1152
1151
  /**
1153
- * Spectra to include in the archive.
1154
- * Must be tracked by nmrium applications to be able to serialize them into a nmrium archive.
1152
+ * Serialized state to include in the archive.
1153
+ * Must be tracked by nmrium applications to be able to serialize it into a nmrium archive.
1155
1154
  */
1156
- spectra: Spectrum[];
1157
- /**
1158
- * Molecules to include in the archive.
1159
- * Must be tracked by nmrium applications to be able to serialize them into a nmrium archive.
1160
- */
1161
- molecules: StateMolecule[];
1155
+ state: NmriumState;
1162
1156
  /**
1163
1157
  * FileCollections to include in the archive.
1164
1158
  * Applications managing a NMRium State are in charge to memorize files collections aside the state,
@@ -1174,11 +1168,10 @@ export declare interface SerializeNmriumArchiveOptions {
1174
1168
  * @default true
1175
1169
  * */
1176
1170
  includeData?: boolean;
1177
- /**
1178
- * Serialized state of nmrium. Produced by core.serializeNmriumState() or a transformation to NMRiumState.
1179
- * As a blob or buffer ready to be put into an archive.
1180
- * */
1181
- serializedState: ExtraFileContent;
1171
+ /** @default false */
1172
+ includeSettings?: boolean;
1173
+ /** @default false */
1174
+ includeView?: boolean;
1182
1175
  }
1183
1176
 
1184
1177
  export declare function serializeNmriumState(nmriumState: NmriumState, plugins: Map<string, NMRiumPlugin>, options?: SerializeNmriumStateOptions): SerializedNmriumState;
@@ -1,6 +1,6 @@
1
- var ve={NORMAL:"NORMAL",FORMULA:"FORMULA"};var De={RELATIVE:"relative",ABSOLUTE:"absolute",MIN:"min",MAX:"max"};var Ce=[{name:"pixels",unit:"px"},{name:"inches",unit:"in"},{name:"feet",unit:"ft"},{name:"yards",unit:"yd"},{name:"centimeters",unit:"cm"},{name:"millimeters",unit:"mm"},{name:"meters",unit:"m"},{name:"points",unit:"pt"},{name:"picas",unit:"pc"}];var h=13;var Ae=[{key:"CT",description:"CT from NMR Solutions"}];import{isAnyArray as Fe}from"is-any-array";import{xMultiply as B}from"ml-spectra-processing";var we=crypto.randomUUID.bind(crypto),b=we;function R(e){let{id:t=b(),meta:o,peaks:r={},filters:n=[],info:i={},ranges:c={},integrals:s={},selector:l,sourceId:a,dependentVariables:m=[],...p}=e,u={id:t,meta:o,filters:n},{data:f=Te(m[0].components)}=e;if(Array.isArray(i.nucleus)&&(i.nucleus=i.nucleus[0]),u.data={x:[],re:[],im:[],...f},"scaleFactor"in i){let{scaleFactor:d}=i,{re:S,im:y}=u.data;B(S,d,{output:S}),y&&B(y,d,{output:y})}l&&(u.selector=l),a&&(u.sourceId=a,u.fileCollectionId=a);let g=Fe(f.im);if(u.info={phc0:0,phc1:0,nucleus:"1H",isFid:!1,isComplex:g,dimension:1,name:i?.name||t,...i},i.isFid&&i.reverse&&g){let{im:d}=u.data;B(d,-1,{output:d}),u.info.reverse=!1}return u.display={isVisible:!0,isPeaksMarkersVisible:!0,isRealSpectrumVisible:!0,isVisibleInDomain:!0,...e.display},u.peaks={values:[],options:{},...r},u.ranges={values:[],options:{sum:null,isSumConstant:!0,sumAuto:!0},...c},u.integrals={values:[],options:{},...s},{...p,...u}}function Te(e){let t=e[0]?.data?.x||[],o=e[0]?.data?.re||e[0]?.data?.y||[],r=e[0]?.data?.im||e[1]?.data?.y||null;return t.length>0&&t[0]>t[1]&&(t.reverse(),o.reverse(),r&&r.reverse()),{x:t,re:o,im:r}}import{matrixToArray as Ee,xMinMaxValues as Le,xNoiseSanPlot as Ue}from"ml-spectra-processing";var K={z:[[]],minX:0,minY:0,maxX:0,maxY:0},ke={re:K,im:K},je={rr:K};function D(e){let{id:t=b(),meta:o={},dependentVariables:r=[],info:n={},filters:i=[],zones:c=[],sourceId:s,...l}=e,a={id:t,meta:o,filters:i};s&&(a.sourceId=s,a.fileCollectionId=s),a.info={nucleus:["1H","1H"],isFid:!1,isComplex:!1,name:n?.name||b(),...n},a.originalInfo=structuredClone(a.info),a.display={isPositiveVisible:!0,isNegativeVisible:!0,isVisible:!0,dimension:2,...e.display,...e.display};let{data:m=r[0].components}=e;if(a.data={...a.info.isFid?ke:je,...m},a.originalData=structuredClone(a.data),!("spectrumSize"in n)){let p=n.isFid?"re":"rr",u=a.data[p].z.length,f=u>0?a.data[p].z[0].length:0;a.info.spectrumSize=[f,u]}if(!n.isFid){let p=a.data.rr,u=Ee(p.z),{positive:f,negative:g}=Ue(u),{min:d,max:S}=Le(u);a.data.rr={...p,minZ:d,maxZ:S},a.info.noise={positive:f,negative:g}}return a.zones={values:[],options:{},...c},{...l,...a}}import{xSequentialFillFromTo as Ve}from"ml-spectra-processing";import{isAnyArray as ze}from"is-any-array";function W(e,t=0){if(ze(e)){let o=e.at(t);if(o!==void 0)return o;throw new RangeError("An array with a index out of boundaries")}return e}var _e=new Set(["t1ir","T1"]);function se(e){let t=[];for(let o of e){let{info:{pulseSequence:r,isFid:n}}=o,{data:i,info:c,meta:{vdlistValues:s=[]}}=o;if(!(r&&_e.has(r))||s.length===0){t.push(o);continue}let a=n?"re":"rr",m={};for(let y in c)m[y]=W(c[y]);let{z:p,maxX:u,minX:f}=i[a],g=Ve({from:f,to:u,size:p[0].length}),[d,S]=Ke(o);for(let y=0;y<s.length;y++){let P={re:g,x:g};for(let x in i)P[Be(x)]=i[x].z.at(d*(y+S));t.push(R({data:P,info:{...m,name:`${m.name}_${s[y]}`,dimension:1,vd:s[y]}}))}}return t}function Be(e){return["rr","re"].includes(e)?"re":["im","ri","ir","ii"].includes(e)?"im":"x"}function Ke(e){let{meta:{PAGE:t}}=e,o=!0;if(t){let r=n=>Number.parseFloat(n.replace(/[F|T]1=/,""));o=r(t[0])>r(t[2])}return o?[-1,1]:[1,0]}var We=2,Xe=1;function Ye(e){let{spectra:t=[],molecules:o}=e,r=[];for(let n of t){let{info:i}=n;switch(i.dimension){case Xe:r.push(R(n));break;case We:r.push(D(n));break;default:throw new Error("dimension does not supported")}}return{molecules:o,spectra:se(r)}}function Ze(e){return e}function N(e,t){return JSON.parse(JSON.stringify(e),function(r,n){if(r in t){this[t[r]]=n;return}return n})}function X(e){if(e?.version===1)return e;let t={...e,version:1},o={j:"js",signal:"signals",integral:"integration",peak:"peaks",diaID:"diaIDs"};for(let r of t.spectra){if(r.ranges){let n=N(r.ranges,o);r.ranges=Array.isArray(n)?{values:n}:n}else if(r.zones){let n=N(r.zones,o);r.zones=Array.isArray(n)?{values:n}:n}r.peaks&&(r.peaks=Array.isArray(r.peaks)?{values:r.peaks}:r.peaks),r.integrals&&(r.integrals=Array.isArray(r.integrals)?{values:r.integrals}:r.integrals)}return t}function Y(e){if(e?.version===2)return e;let t={...e,version:2},o={peaks:{delta:"x",originDelta:"originalX",intensity:"y"},ranges:{atomIDs:"atoms",intensity:"y"}};for(let r of t.spectra)r.peaks?r.peaks=N(r.peaks,o.peaks):r.ranges?r.ranges=N(r.ranges,o.ranges):r.zones&&(r.zones.values=$e(r.zones.values));return t}function $e(e){return e.map(t=>(t.signals&&(t.signals=t.signals.map(o=>{if(o.x&&o.y){let{x:{fromTo:r,...n},y:{fromTo:i,...c}}=o;o={...o,x:{...n,...r},y:{...c,...i}}}else{let{fromTo:r,deltaX:n,resolutionX:i,nucleusX:c,deltaY:s,resolutionY:l,nucleusY:a,shiftX:m,shiftY:p,...u}=o;o={...u,x:{from:r[0].from,to:r[0].to,delta:n,resolution:i,nucleus:c},y:{from:r[1].from,to:r[1].to,delta:s,resolution:l,nucleus:a}}}return o},[])),t),[])}var Ge={name:"apodization",label:"Apodization",value:{lineBroadening:1,gaussBroadening:0,lineBroadeningCenter:0}};function Z(e){if(e?.version===3)return e;let t={...e,version:3};for(let o of t.spectra)if(Array.isArray(o?.filters)&&o?.filters.length>0){let r=o.filters.findIndex(n=>n.name==="lineBroadening");if(r!==-1){let n={...o.filters[r],...Ge};o.filters[r]=o.filters[r-1],o.filters[r-1]=n}}return t}function $(e){if(e?.version===4)return e;let{version:t,...o}=e,r=[],n={};for(let{source:s,...l}of o.spectra){let a={},{info:m={},display:p={}}=l;if(m?.dimension===2&&!s?.jcampURL)if(m.isFt)a.data={rr:l.data};else continue;if(s?.jcampURL){let{jcampURL:g,jcampSpectrumIndex:d}=s,S=g.match(/(?<baseURL>^\w+:\/{2}\w+\/)(?<relativePath>.*)/);n[g]||(n[g]={baseURL:S?.groups.baseURL||"",relativePath:S?.groups.relativePath||g.replace(/^\.\//,"")}),a.sourceSelector={files:[n[g].relativePath]},d!==void 0&&(a.sourceSelector.jcamp={index:d})}a.filters=qe(l.filters);let{name:u,...f}=p;u&&(a.info={...m,name:u}),a.display=f,r.push({...l,...a})}let i={data:{...o,spectra:r},version:4},c={entries:Object.values(n)};return c.entries.length>0&&(i.data.source=c),i}function qe(e=[]){let t=[];for(let o of e){let{name:r,value:n}=o;switch(r){case"zeroFilling":t.push({...o,value:{nbPoints:n}});break;case"shiftX":case"shift2DX":case"shift2DY":t.push({...o,value:{shift:n}});break;default:t.push({...o})}}return t}function G(e){if(e?.version===5)return e;let t={...e,version:5},o={originFrom:"originalFrom",originTo:"originalTo",originDelta:"originalDelta",originX:"originalX",originY:"originalY",originZ:"originalZ"};for(let r of t?.data?.spectra||[])for(let n of["peaks","ranges","zones"])r?.[n]&&(r[n]=N(r[n],o));return t}function q(e){if(e?.version===6)return e;let t={...e,version:6};for(let o of t?.data?.spectra||[]){let{digitalFilter:r,fft:n,phaseCorrection:i}=Je(o);n?.flag&&r?.flag&&i&&Math.floor(r.value.digitalFilterValue)%2>0&&(i.value.ph0-=180)}return t}function Je(e,t=["phaseCorrection","fft","digitalFilter"]){let{filters:o=[]}=e,r={};for(let n of t)r[n]=o.find(i=>i.name===n);return r}function C(e,t="localStorage"){if(e?.version===7)return e;if(t==="nmrium")return ae(e);let o={...e,version:7};for(let r in e.workspaces)o.workspaces[r]=ae(o.workspaces[r]);return o}function ae(e){let{formatting:{nuclei:t,panels:o}={nuclei:null,panels:null},version:r,...n}=e,i={...n};return t&&(i.nuclei=He(t)),o&&(i.panels=o),i}function He(e){let t=[],o={name:"nucleus",ppm:"ppmFormat",hz:"hzFormat"};for(let r in e)t.push(N(e[r],o));return t}function J(e){if(e?.version===7)return e;let t={...e,version:7};return t?.settings&&(t.settings=C(t.settings,"nmrium")),t}function A(e,t="localStorage"){if(e?.version===8)return e;if(t==="nmrium")return le(e);let o={...e,version:8};for(let r in e.workspaces)o.workspaces[r]=le(o.workspaces[r]);return o}function le(e){let{version:t,...o}=e,r={...o};return r.display.panels=Qe(e),r}function Qe(e){let t={},o=e.display.panels;for(let r of Object.keys(o)){let{display:n,open:i}=o[r];t[r]={display:n,visible:n,open:i}}return t}function H(e){if(e?.version===8)return e;let t={...e,version:8};t?.settings&&(t.settings=A(t.settings,"nmrium"));for(let o of t?.data?.spectra||[]){let{filters:r=[]}=o;for(let s=0;s<r.length;s++){let{flag:l,isDeleteAllow:a,label:m,...p}=r[s];r[s]={...p,enabled:l}}let n=r.findIndex(s=>s.name==="apodization");if(n!==-1){let s=r[n],{lineBroadening:l,gaussBroadening:a,lineBroadeningCenter:m}=s.value;s.value={exponential:{apply:!0,options:{lineBroadening:a>0?-l:l}}},a>0&&(s.value.gaussian={apply:!0,options:{lineBroadening:.6*a,lineBroadeningCenter:m}}),r[n]=s}let i=r.findIndex(s=>s.name==="apodizationDimension1"),c=r.findIndex(s=>s.name==="apodizationDimension2");if(i!==-1){let s=r[i],{shapes:l}=s.value.compose;s.value=ce(l)}if(c!==-1){let s=r[c],{shapes:l}=s.value.compose;s.value=ce(l)}}return t}function ce(e){let t={};for(let{shape:o}of e){let{kind:r,options:n}=o;if(r==="sineBell"){let{exponent:i,offset:c}=n,s=i===2?"sineSquare":"sineBell";t[s]={apply:!0,options:{offset:c}}}}return t}function Q(e){let{version:t,plugins:o,...r}=e;return t===9?e:{version:9,plugins:{},...r}}function ee(e){if(e?.version>=10)return e;let t={...e,version:10};if(e.data){let{source:o,spectra:r,...n}=e.data,i=o?crypto.randomUUID():void 0,c=o?[{...o,id:i}]:[];t.data={...n,sources:c,spectra:o?r?.map(s=>({...s,sourceId:i})):r}}return t}function te(e){let{version:t}=e;if(t>=11)return e;let o={...e,version:11};return e?.view?.molecules&&(o.view=et(e.view)),o}function et(e){let{molecules:t,...o}=e,r={};for(let[n,i]of Object.entries(t)){let{showAtomNumber:c,...s}=i;r[n]={...s,atomAnnotation:"none",showLabel:!1}}return{molecules:r,...o}}function re(e){if(e?.version>=12)return e;let t={...e,version:12};if(t.data){let o=e.data.spectra??[],r=e.data.molecules??[];for(let n of o){let{sourceId:i,fileCollectionId:c,sourceSelector:s}=n;delete n.sourceId,delete n.fileCollectionId,delete n.sourceSelector,s&&(n.selector={...s,root:c??i})}for(let n of r){let{sourceId:i,fileCollectionId:c,sourceSelector:s}=n;delete n.sourceId,delete n.fileCollectionId,delete n.sourceSelector,s&&(n.selector={...s,root:c??i})}}return t}function oe(e){if(e?.version>=13)return e;let t={...e,version:13};if(t.data){let o=e.data.spectra??[];for(let r of o){let n=r.ranges?.values??[];for(let i of n){let{diaIDs:c,assignment:s,nbAtoms:l,signals:a=[]}=i,m=a.some(p=>p.diaIDs&&p.diaIDs.length>0);for(let p of a)!m&&c&&l&&(p.diaIDs=c,p.nbAtoms=l),!p.assignment&&s&&(p.assignment=s);delete i.diaIDs,delete i.assignment,delete i.nbAtoms}}}return t}function O(e,t){e.plugins||(e.plugins={});let o=e.plugins;for(let r of t.values()){if(!r.shouldSerialize){delete o[r.id];continue}o[r.id]||(o[r.id]={id:r.id,version:r.version}),o[r.id].id=r.id,o[r.id].version=r.version}}var tt=[X,Y,Z,$,G,q,J,H,Q,ee,te,re,oe];function ue(e,t,o){let r=structuredClone(e),n=Object.entries(e?.plugins??{});for(let[s,{version:l}]of n){let a=o.get(s);if(!(a&&a.version>=l)){if(a){console.warn(`Plugin "${a.id}" is loaded with a version older (${a.version}) than the one used to save the state (${l}).
1
+ var De={NORMAL:"NORMAL",FORMULA:"FORMULA"};var Me={RELATIVE:"relative",ABSOLUTE:"absolute",MIN:"min",MAX:"max"};var Ce=[{name:"pixels",unit:"px"},{name:"inches",unit:"in"},{name:"feet",unit:"ft"},{name:"yards",unit:"yd"},{name:"centimeters",unit:"cm"},{name:"millimeters",unit:"mm"},{name:"meters",unit:"m"},{name:"points",unit:"pt"},{name:"picas",unit:"pc"}];var N=13;var Ae=[{key:"CT",description:"CT from NMR Solutions"}];import{isAnyArray as Fe}from"is-any-array";import{xMultiply as B}from"ml-spectra-processing";var we=crypto.randomUUID.bind(crypto),b=we;function R(e){let{id:t=b(),meta:o,peaks:r={},filters:i=[],info:n={},ranges:c={},integrals:s={},selector:l,sourceId:a,dependentVariables:p=[],...m}=e,u={id:t,meta:o,filters:i},{data:f=Te(p[0].components)}=e;if(Array.isArray(n.nucleus)&&(n.nucleus=n.nucleus[0]),u.data={x:[],re:[],im:[],...f},"scaleFactor"in n){let{scaleFactor:d}=n,{re:S,im:y}=u.data;B(S,d,{output:S}),y&&B(y,d,{output:y})}l&&(u.selector=l),a&&(u.sourceId=a,u.fileCollectionId=a);let g=Fe(f.im);if(u.info={phc0:0,phc1:0,nucleus:"1H",isFid:!1,isComplex:g,dimension:1,name:n?.name||t,...n},n.isFid&&n.reverse&&g){let{im:d}=u.data;B(d,-1,{output:d}),u.info.reverse=!1}return u.display={isVisible:!0,isPeaksMarkersVisible:!0,isRealSpectrumVisible:!0,isVisibleInDomain:!0,...e.display},u.peaks={values:[],options:{},...r},u.ranges={values:[],options:{sum:null,isSumConstant:!0,sumAuto:!0},...c},u.integrals={values:[],options:{},...s},{...m,...u}}function Te(e){let t=e[0]?.data?.x||[],o=e[0]?.data?.re||e[0]?.data?.y||[],r=e[0]?.data?.im||e[1]?.data?.y||null;return t.length>0&&t[0]>t[1]&&(t.reverse(),o.reverse(),r&&r.reverse()),{x:t,re:o,im:r}}import{matrixToArray as Ee,xMinMaxValues as Le,xNoiseSanPlot as Ue}from"ml-spectra-processing";var K={z:[[]],minX:0,minY:0,maxX:0,maxY:0},ze={re:K,im:K},ke={rr:K};function M(e){let{id:t=b(),meta:o={},dependentVariables:r=[],info:i={},filters:n=[],zones:c=[],sourceId:s,...l}=e,a={id:t,meta:o,filters:n};s&&(a.sourceId=s,a.fileCollectionId=s),a.info={nucleus:["1H","1H"],isFid:!1,isComplex:!1,name:i?.name||b(),...i},a.originalInfo=structuredClone(a.info),a.display={isPositiveVisible:!0,isNegativeVisible:!0,isVisible:!0,dimension:2,...e.display,...e.display};let{data:p=r[0].components}=e;if(a.data={...a.info.isFid?ze:ke,...p},a.originalData=structuredClone(a.data),!("spectrumSize"in i)){let m=i.isFid?"re":"rr",u=a.data[m].z.length,f=u>0?a.data[m].z[0].length:0;a.info.spectrumSize=[f,u]}if(!i.isFid){let m=a.data.rr,u=Ee(m.z),{positive:f,negative:g}=Ue(u),{min:d,max:S}=Le(u);a.data.rr={...m,minZ:d,maxZ:S},a.info.noise={positive:f,negative:g}}return a.zones={values:[],options:{},...c},{...l,...a}}import{xSequentialFillFromTo as Ve}from"ml-spectra-processing";import{isAnyArray as je}from"is-any-array";function W(e,t=0){if(je(e)){let o=e.at(t);if(o!==void 0)return o;throw new RangeError("An array with a index out of boundaries")}return e}var _e=new Set(["t1ir","T1"]);function se(e){let t=[];for(let o of e){let{info:{pulseSequence:r,isFid:i}}=o,{data:n,info:c,meta:{vdlistValues:s=[]}}=o;if(!(r&&_e.has(r))||s.length===0){t.push(o);continue}let a=i?"re":"rr",p={};for(let y in c)p[y]=W(c[y]);let{z:m,maxX:u,minX:f}=n[a],g=Ve({from:f,to:u,size:m[0].length}),[d,S]=Ke(o);for(let y=0;y<s.length;y++){let P={re:g,x:g};for(let x in n)P[Be(x)]=n[x].z.at(d*(y+S));t.push(R({data:P,info:{...p,name:`${p.name}_${s[y]}`,dimension:1,vd:s[y]}}))}}return t}function Be(e){return["rr","re"].includes(e)?"re":["im","ri","ir","ii"].includes(e)?"im":"x"}function Ke(e){let{meta:{PAGE:t}}=e,o=!0;if(t){let r=i=>Number.parseFloat(i.replace(/[F|T]1=/,""));o=r(t[0])>r(t[2])}return o?[-1,1]:[1,0]}var We=2,Xe=1;function Ye(e){let{spectra:t=[],molecules:o}=e,r=[];for(let i of t){let{info:n}=i;switch(n.dimension){case Xe:r.push(R(i));break;case We:r.push(M(i));break;default:throw new Error("dimension does not supported")}}return{molecules:o,spectra:se(r)}}function Ze(e){return e}function h(e,t){return JSON.parse(JSON.stringify(e),function(r,i){if(r in t){this[t[r]]=i;return}return i})}function X(e){if(e?.version===1)return e;let t={...e,version:1},o={j:"js",signal:"signals",integral:"integration",peak:"peaks",diaID:"diaIDs"};for(let r of t.spectra){if(r.ranges){let i=h(r.ranges,o);r.ranges=Array.isArray(i)?{values:i}:i}else if(r.zones){let i=h(r.zones,o);r.zones=Array.isArray(i)?{values:i}:i}r.peaks&&(r.peaks=Array.isArray(r.peaks)?{values:r.peaks}:r.peaks),r.integrals&&(r.integrals=Array.isArray(r.integrals)?{values:r.integrals}:r.integrals)}return t}function Y(e){if(e?.version===2)return e;let t={...e,version:2},o={peaks:{delta:"x",originDelta:"originalX",intensity:"y"},ranges:{atomIDs:"atoms",intensity:"y"}};for(let r of t.spectra)r.peaks?r.peaks=h(r.peaks,o.peaks):r.ranges?r.ranges=h(r.ranges,o.ranges):r.zones&&(r.zones.values=$e(r.zones.values));return t}function $e(e){return e.map(t=>(t.signals&&(t.signals=t.signals.map(o=>{if(o.x&&o.y){let{x:{fromTo:r,...i},y:{fromTo:n,...c}}=o;o={...o,x:{...i,...r},y:{...c,...n}}}else{let{fromTo:r,deltaX:i,resolutionX:n,nucleusX:c,deltaY:s,resolutionY:l,nucleusY:a,shiftX:p,shiftY:m,...u}=o;o={...u,x:{from:r[0].from,to:r[0].to,delta:i,resolution:n,nucleus:c},y:{from:r[1].from,to:r[1].to,delta:s,resolution:l,nucleus:a}}}return o},[])),t),[])}var Ge={name:"apodization",label:"Apodization",value:{lineBroadening:1,gaussBroadening:0,lineBroadeningCenter:0}};function Z(e){if(e?.version===3)return e;let t={...e,version:3};for(let o of t.spectra)if(Array.isArray(o?.filters)&&o?.filters.length>0){let r=o.filters.findIndex(i=>i.name==="lineBroadening");if(r!==-1){let i={...o.filters[r],...Ge};o.filters[r]=o.filters[r-1],o.filters[r-1]=i}}return t}function $(e){if(e?.version===4)return e;let{version:t,...o}=e,r=[],i={};for(let{source:s,...l}of o.spectra){let a={},{info:p={},display:m={}}=l;if(p?.dimension===2&&!s?.jcampURL)if(p.isFt)a.data={rr:l.data};else continue;if(s?.jcampURL){let{jcampURL:g,jcampSpectrumIndex:d}=s,S=g.match(/(?<baseURL>^\w+:\/{2}\w+\/)(?<relativePath>.*)/);i[g]||(i[g]={baseURL:S?.groups.baseURL||"",relativePath:S?.groups.relativePath||g.replace(/^\.\//,"")}),a.sourceSelector={files:[i[g].relativePath]},d!==void 0&&(a.sourceSelector.jcamp={index:d})}a.filters=Je(l.filters);let{name:u,...f}=m;u&&(a.info={...p,name:u}),a.display=f,r.push({...l,...a})}let n={data:{...o,spectra:r},version:4},c={entries:Object.values(i)};return c.entries.length>0&&(n.data.source=c),n}function Je(e=[]){let t=[];for(let o of e){let{name:r,value:i}=o;switch(r){case"zeroFilling":t.push({...o,value:{nbPoints:i}});break;case"shiftX":case"shift2DX":case"shift2DY":t.push({...o,value:{shift:i}});break;default:t.push({...o})}}return t}function G(e){if(e?.version===5)return e;let t={...e,version:5},o={originFrom:"originalFrom",originTo:"originalTo",originDelta:"originalDelta",originX:"originalX",originY:"originalY",originZ:"originalZ"};for(let r of t?.data?.spectra||[])for(let i of["peaks","ranges","zones"])r?.[i]&&(r[i]=h(r[i],o));return t}function J(e){if(e?.version===6)return e;let t={...e,version:6};for(let o of t?.data?.spectra||[]){let{digitalFilter:r,fft:i,phaseCorrection:n}=qe(o);i?.flag&&r?.flag&&n&&Math.floor(r.value.digitalFilterValue)%2>0&&(n.value.ph0-=180)}return t}function qe(e,t=["phaseCorrection","fft","digitalFilter"]){let{filters:o=[]}=e,r={};for(let i of t)r[i]=o.find(n=>n.name===i);return r}function C(e,t="localStorage"){if(e?.version===7)return e;if(t==="nmrium")return ae(e);let o={...e,version:7};for(let r in e.workspaces)o.workspaces[r]=ae(o.workspaces[r]);return o}function ae(e){let{formatting:{nuclei:t,panels:o}={nuclei:null,panels:null},version:r,...i}=e,n={...i};return t&&(n.nuclei=He(t)),o&&(n.panels=o),n}function He(e){let t=[],o={name:"nucleus",ppm:"ppmFormat",hz:"hzFormat"};for(let r in e)t.push(h(e[r],o));return t}function q(e){if(e?.version===7)return e;let t={...e,version:7};return t?.settings&&(t.settings=C(t.settings,"nmrium")),t}function A(e,t="localStorage"){if(e?.version===8)return e;if(t==="nmrium")return le(e);let o={...e,version:8};for(let r in e.workspaces)o.workspaces[r]=le(o.workspaces[r]);return o}function le(e){let{version:t,...o}=e,r={...o};return r.display.panels=Qe(e),r}function Qe(e){let t={},o=e.display.panels;for(let r of Object.keys(o)){let{display:i,open:n}=o[r];t[r]={display:i,visible:i,open:n}}return t}function H(e){if(e?.version===8)return e;let t={...e,version:8};t?.settings&&(t.settings=A(t.settings,"nmrium"));for(let o of t?.data?.spectra||[]){let{filters:r=[]}=o;for(let s=0;s<r.length;s++){let{flag:l,isDeleteAllow:a,label:p,...m}=r[s];r[s]={...m,enabled:l}}let i=r.findIndex(s=>s.name==="apodization");if(i!==-1){let s=r[i],{lineBroadening:l,gaussBroadening:a,lineBroadeningCenter:p}=s.value;s.value={exponential:{apply:!0,options:{lineBroadening:a>0?-l:l}}},a>0&&(s.value.gaussian={apply:!0,options:{lineBroadening:.6*a,lineBroadeningCenter:p}}),r[i]=s}let n=r.findIndex(s=>s.name==="apodizationDimension1"),c=r.findIndex(s=>s.name==="apodizationDimension2");if(n!==-1){let s=r[n],{shapes:l}=s.value.compose;s.value=ce(l)}if(c!==-1){let s=r[c],{shapes:l}=s.value.compose;s.value=ce(l)}}return t}function ce(e){let t={};for(let{shape:o}of e){let{kind:r,options:i}=o;if(r==="sineBell"){let{exponent:n,offset:c}=i,s=n===2?"sineSquare":"sineBell";t[s]={apply:!0,options:{offset:c}}}}return t}function Q(e){let{version:t,plugins:o,...r}=e;return t===9?e:{version:9,plugins:{},...r}}function ee(e){if(e?.version>=10)return e;let t={...e,version:10};if(e.data){let{source:o,spectra:r,...i}=e.data,n=o?crypto.randomUUID():void 0,c=o?[{...o,id:n}]:[];t.data={...i,sources:c,spectra:o?r?.map(s=>({...s,sourceId:n})):r}}return t}function te(e){let{version:t}=e;if(t>=11)return e;let o={...e,version:11};return e?.view?.molecules&&(o.view=et(e.view)),o}function et(e){let{molecules:t,...o}=e,r={};for(let[i,n]of Object.entries(t)){let{showAtomNumber:c,...s}=n;r[i]={...s,atomAnnotation:"none",showLabel:!1}}return{molecules:r,...o}}function re(e){if(e?.version>=12)return e;let t={...e,version:12};if(t.data){let o=e.data.spectra??[],r=e.data.molecules??[];for(let i of o){let{sourceId:n,fileCollectionId:c,sourceSelector:s}=i;delete i.sourceId,delete i.fileCollectionId,delete i.sourceSelector,s&&(i.selector={...s,root:c??n})}for(let i of r){let{sourceId:n,fileCollectionId:c,sourceSelector:s}=i;delete i.sourceId,delete i.fileCollectionId,delete i.sourceSelector,s&&(i.selector={...s,root:c??n})}}return t}function oe(e){if(e?.version>=13)return e;let t={...e,version:13};if(t.data){let o=e.data.spectra??[];for(let r of o){let i=r.ranges?.values??[];for(let n of i){let{diaIDs:c,assignment:s,nbAtoms:l,signals:a=[]}=n,p=a.some(m=>m.diaIDs&&m.diaIDs.length>0);for(let m of a)!p&&c&&l&&(m.diaIDs=c,m.nbAtoms=l),!m.assignment&&s&&(m.assignment=s);delete n.diaIDs,delete n.assignment,delete n.nbAtoms}}}return t}function O(e,t){e.plugins||(e.plugins={});let o=e.plugins;for(let r of t.values()){if(!r.shouldSerialize){delete o[r.id];continue}o[r.id]||(o[r.id]={id:r.id,version:r.version}),o[r.id].id=r.id,o[r.id].version=r.version}}var tt=[X,Y,Z,$,G,J,q,H,Q,ee,te,re,oe];function ue(e,t,o){let r=structuredClone(e),i=Object.entries(e?.plugins??{});for(let[s,{version:l}]of i){let a=o.get(s);if(!(a&&a.version>=l)){if(a){console.warn(`Plugin "${a.id}" is loaded with a version older (${a.version}) than the one used to save the state (${l}).
2
2
  NMRium may fail to load the state.
3
3
  Please update the plugin to the latest version.`);continue}console.warn(`Plugin "${s}@${l}" is not registered. NMRium may fail to load the state.
4
- Please consider open this file with the plugin installed.`)}}let i=new Set,c=()=>{let s=r.version;for(let l of o.values())for(let a of l.migrations){if(i.has(a)||s<a.minCore||a.maxCore&&s>a.maxCore)continue;if((r.plugins?.[l.id]?.version||0)===l.version)break;r=a.up(r),i.add(a)}};for(let s=e?.version||0;s<t;s++){let l=tt[s];r=l(r),c()}return c(),O(r,o),r}var rt=["topbar.right","topbar.about_us.modal"],ot=[],Jr=[...rt,...ot],nt={},ne={};{let e=nt,t=ne;for(let[o,r]of Object.entries(e))t[r]||(t[r]=[]),t[r]?.push(o)}function*pe(e){let{slot:t,plugins:o,supportedToDeprecatedSlots:r=ne}=e,n=r[t];for(let[i,c]of o.entries()){let s=c.ui;if(!s)continue;let l=s[t];if(l){yield[i,l];continue}if(n)for(let a of n){let m=c.ui?.[a];if(m){yield[i,m],console.warn(`Plugin ${c.id} used deprecated slot "${a}". Please update this plugin to use "${t}" instead.`);break}}}}import{FileCollection as ct}from"file-collection";var me={SDF:"sdf",MOL:"mol",NMRIUM:"nmrium",NMRIUM_ARCHIVE:"nmrium.zip",JSON:"json",JCAMP:"jcamp",DX:"dx",JDX:"jdx",JDF:"jdf",NMREDATA:"nmredata",SMILES:"smiles",SMI:"smi"};function w(e){return e.includes(".")?e.replace(/^.*\./,"").toLowerCase():""}function T(e,t={},o){let{data:r,...n}=e;if(!r)return e;let{spectra:i=[]}=r,{keep1D:c=!0,keep2D:s=!0,onlyReal:l}=t,a=l?"ft":t.dataSelection||"both",m=[];for(let p of i){if(!p.info){m.push(p);continue}let{isFid:u,dimension:f,name:g}=p.info;if(!F(f===1&&!c,g,o)&&!F(f===2&&!s,g,o)&&!F(u&&a==="ft",g,o)&&!F(!u&&a==="fid",g,o))if(l&&!u)if(p.info.isComplex=!1,it(p)){let{rr:d}=p.data;m.push({...p,data:{rr:d}})}else{let{re:d,x:S}=p.data;m.push({...p,data:{re:d,x:S}})}else m.push(p)}return{data:{...r,spectra:m},...n}}function F(e,t,o){return e?(o?.warn(`Skipping ${t} because it didn't match the import filters.`),!0):!1}function it(e){let{info:t}=e;return t?.dimension===2}function E(e){let{nmriumState:t,plugins:o,options:r}=e;for(let n of o.values()){let i=n.onReadProcess?.onProcessing;i&&i(t,r)}}async function L(e,t,o={}){let{selector:r,converter:n,logger:i}=o,c=[],s=[];for(let u of t.values()){let{onReadProcess:f}=u;f&&(f?.onFiles&&c.push(u),f?.supportedExtensions?.length&&f?.onFile&&s.push(u))}let l=await Promise.allSettled(c.map(u=>u.onReadProcess.onFiles(e,o))),a=[],m=await Promise.allSettled(e.files.flatMap(u=>{let f=w(u.name).toLowerCase();return s.flatMap(g=>{let{supportedExtensions:d,onFile:S}=g.onReadProcess;return d.includes(f)?(a.push({file:u,plugin:g}),S(u,{logger:i,selector:r,converter:n})):[]})})),p={spectra:[],molecules:[]};for(let u=0;u<l.length;u++){let f=l[u];switch(f.status){case"fulfilled":{let{spectra:g=[],molecules:d=[]}=f.value||{};p.spectra.push(...g),p.molecules.push(...d);break}case"rejected":{let g=f.reason,d=c[u];o.logger?.error(`Load file collection with plugin ${d.id}@${d.version} fails with: ${g}`);break}}}for(let u=0;u<m.length;u++){let f=m[u];switch(f.status){case"fulfilled":{let{spectra:g=[],molecules:d=[]}=f.value||{};p.spectra.push(...g),p.molecules.push(...d);break}case"rejected":{let g=f.reason,{file:d,plugin:S}=a[u];o.logger?.error(`Load file ${d.relativePath} with plugin ${S.id}@${S.version} fails with: ${g}`);break}}}return p}import{FileCollection as Se}from"file-collection";import{FileCollection as de}from"file-collection";import fe from"lodash.merge";import{xIsEquallySpaced as st}from"ml-spectra-processing";async function U(e){let{input:t,spectraResult:o,unserializedSpectrum:r,options:n,plugins:i,migrator:c}=e,l=(await M({input:t,migrator:c,plugins:i,options:{...n,selector:r.selector}}))?.nmriumState?.data?.spectra??[],a=l.pop();if(a){o.push(ge(r,a));for(let m of l)o.push(ge(r,at(m)))}}function ge(e,t){let{data:o,...r}=e;if(!t.selector?.root&&e.selector?.root&&(t.selector??=e.selector,t.selector.root=e.selector.root),"ranges"in t){let{data:n,...i}=t;return{...fe(i,r),data:n}}else if("zones"in t){let{data:n,...i}=t;return{...fe(i,r),data:n}}else return t}function at(e){return{...e,id:b()}}function k(e){let{spectrum:t,spectraResult:o,logger:r}=e,{dimension:n}=t.info;if(n===1){if(!st(t.data)){r?.error('The ".nmrium" file is corrupted; the X-axis values are not equally distant.');return}o.push(R(t))}else n===2&&o.push(D(t))}async function j(e){let{input:t,moleculesResult:o,unserializedMolecule:r,options:n,plugins:i,migrator:c}=e,{selector:s}=r,a=(await M({input:t,migrator:c,plugins:i,options:{...n,selector:s}}))?.nmriumState?.data?.molecules??[];for(let m of a)!m.selector?.root&&s?.root&&(m.selector??=s,m.selector.root=s.root),o.push({...r,...m})}function z(e){let{molecule:t,moleculesResult:o}=e;o.push(t)}async function V(e){let{nmriumObjectInput:t,options:o={},migrator:r,plugins:n,fromSourceOptions:i}=e,c=r(t),{data:s,...l}=c,a=new de;if(!s)return[{...l},a];let m={data:{...s,spectra:[],molecules:[]},...l},p=m.data,{sources:u=[],spectra:f,molecules:g}=p,d=await Promise.all(u.map(async P=>{let x=await de.fromSource(P,{unzip:{zipExtensions:["zip","nmredata"]}},i);if(!P.baseURL)for(let I of P.entries)I.baseURL||(I.baseURL=i?.baseURL);return[P.id,x]})),S=new Map(d),y=[];for(let P of s.spectra){let x=P.selector?.root??"",I=S.get(x);if(!I){k({spectrum:P,spectraResult:f,logger:o.logger});continue}y.push(U({input:I,spectraResult:f,unserializedSpectrum:P,migrator:r,plugins:n,options:o}))}for(let P of s.molecules??[]){let x=S.get(P.sourceId);if(!x){z({molecule:P,moleculesResult:g,logger:o.logger});continue}y.push(j({input:x,unserializedMolecule:P,moleculesResult:g,migrator:r,plugins:n,options:o}))}await Promise.allSettled(y);for(let[P,x]of S.entries())a.appendFileCollection(x,P);return[m,a]}async function _(e){let{file:t,options:o={},migrator:r,plugins:n,fromSourceOptions:i}=e,c=await t.arrayBuffer(),s=await(Se.isZip(c)?lt(c):t.text());return V({nmriumObjectInput:JSON.parse(s),plugins:n,migrator:r,options:o,fromSourceOptions:i})}async function lt(e){let t=await Se.fromZip(e);if(t.files.length===0)throw new Error("compressed nmrium file is corrupted");return t.files[0].text()}async function M(e){let{options:t={},input:o,migrator:r,plugins:n,fromSourceOptions:i}=e,{selectorRoot:c=crypto.randomUUID()}=t,s=mt(await ut(o),t.selector?.files),l=ft(s);if(l){let[g]=await _({file:l,migrator:r,plugins:n,options:t,fromSourceOptions:i});return ye(g,c),{nmriumState:g,containsNmrium:!0,fileCollection:s,selectorRoot:c}}let a=await L(s,n,t),m=T({version:13,data:a},t?.selector?.general,t.logger),{onLoadProcessing:p,experimentalFeatures:u}=t,f={...p,autoProcessing:p?.autoProcessing??!1,experimentalFeatures:u};return E({nmriumState:m,plugins:n,options:f}),ye(m,c),{nmriumState:m,containsNmrium:!1,fileCollection:s,selectorRoot:c}}function ut(e){return Array.isArray(e)?Promise.reject(new Error("For a set of fileCollectionItems pass a FileCollection instance")):pt(e)?Promise.resolve(e):new ct().appendExtendedSource({...e,uuid:crypto.randomUUID()})}function pt(e){return typeof e=="object"&&"files"in e}function mt(e,t){if(!t)return e;let o=new Set(t);return e.filter(r=>o.has(r.relativePath))}function ft(e){return e.files.find(t=>w(t.name).toLowerCase()===me.NMRIUM)}function ye(e,t){for(let o of e.data?.spectra??[])o.selector?.root||(o.selector??={root:t},o.selector.root||=t);for(let o of e.data?.molecules??[])o.selector?.root||(o.selector??={root:t},o.selector.root||=t)}import{FileCollection as dt}from"file-collection";async function Pe(e){let t={},o=[];for(let r of e.sources)switch(r.relativePath){case".META-NMRIUM/NMRIUM_ARCHIVE":t.archive=r;break;case".META-NMRIUM/VERSION":o.push(r.text().then(n=>{t.version=Number.parseInt(n,10)}));break;case"state.json":o.push(r.text().then(n=>{t.state=JSON.parse(n)}));break;default:}return await Promise.all(o),t}function xe(e){if(!e.archive)throw new Error("Not a valid NMRium archive");if(typeof e.version!="number"||Number.isNaN(e.version))throw new Error("Not a valid NMRium archive, no version specified");if(!e.state)throw new Error("NMRium Archive corrupted, state.json is missing")}function he(e){return e.filter(t=>!gt(t.relativePath))}function gt(e){return e.startsWith(".META-NMRIUM/")||e==="state.json"||e==="index.txt"}async function Ne(e){let{options:t,plugins:o,migrator:r}=e,n=await dt.fromIum(e.input),i=await Pe(n);xe(i);let c=he(n),s=r(i.state),l={...s,data:{...s.data,spectra:[],molecules:[]}},a=l.data.spectra,m=l.data.molecules,p=St(n),u=[];for(let f of s.data.spectra)u.push(yt({subRoots:p,unserializedSpectrum:f,spectraResult:a,options:t,plugins:o,migrator:r}));for(let f of s.data.molecules??[])u.push(Pt({subRoots:p,unserializedMolecule:f,moleculesResult:m,options:t,plugins:o,migrator:r}));return await Promise.allSettled(u),[l,c]}function St(e){let t=new Map;return{get(o){let r=t.get(o);return r||(r=e.subroot(o),t.set(o,r)),r},[Symbol("debug")]:{ium:e,views:t}}}async function yt(e){let{subRoots:t}=e,{unserializedSpectrum:o,spectraResult:r}=e,{options:n,plugins:i,migrator:c}=e,{selector:s}=o,l=await be({subRoots:t,selector:s});if(!l)return k({spectrum:o,spectraResult:r,logger:n?.logger});await U({input:l,unserializedSpectrum:o,spectraResult:r,options:n,plugins:i,migrator:c})}async function Pt(e){let{subRoots:t}=e,{unserializedMolecule:o,moleculesResult:r}=e,{options:n,plugins:i,migrator:c}=e,{selector:s}=o,l=await be({subRoots:t,selector:s});if(!l)return z({molecule:o,moleculesResult:r,logger:n?.logger});await j({input:l,unserializedMolecule:o,moleculesResult:r,options:n,plugins:i,migrator:c})}async function be(e){let{subRoots:t,selector:o}=e;if(!o)return;let{root:r}=o;if(r)return t.get(r)}import{FileCollection as xt}from"file-collection";async function Re(e){let{source:t,plugins:o,options:r={},sourceId:n=crypto.randomUUID()}=e,{converter:i,...c}=r,s={...t,id:n},l={spectra:[],molecules:[]},a=await xt.fromSource(s,{unzip:{zipExtensions:["zip","nmredata"]}}),{spectra:m=[],molecules:p=[]}=await L(a,o,{converter:{...i,bruker:{keepFiles:!0,...Reflect.get(i??{},"bruker")}},...c});l.spectra.push(...m),l.molecules.push(...p);for(let d of l.spectra)d.selector??={root:n},d.selector.root=n;for(let d of l.molecules)d.selector??={root:n},d.selector.root=n;l.sources??=[],l.sources.push(s);let u=T({version:13,data:l},r?.selector?.general),{onLoadProcessing:f}=c,g={filters:f?.filters,autoProcessing:f?.autoProcessing??!1,experimentalFeatures:r.experimentalFeatures};return E({nmriumState:u,plugins:o,options:g}),[u,a,n]}function v(e,t){let o={};for(let r in e)t.includes(r)||(o[r]=e[r]);return o}var ht=["data","originalData","info","originalInfo","meta","customInfo"],Nt=["data","originalData","info","originalInfo","meta","customInfo"],bt=["selector","originalData","originalInfo"];function Oe(e,t,o={}){let{version:r,data:n}=e;if(n.actionType)return e;let i={version:r,plugins:e.plugins},{includeData:c}=o;c!=="noData"&&(i.data=Rt({...n},c));let{includeSettings:s,includeView:l}=o;return s&&(i.settings=e.settings),l&&(i.view=e.view),O(i,t),i}function Rt(e,t="rawData"){let{spectra:o}=e;switch(t){case"dataSource":return Ot(e);case"selfContained":case"selfContainedExternalDatasource":return It(e);case"rawData":return{...v(e,["sources"]),spectra:o.map(Dt)};default:return e}}function Ot(e){let{spectra:t}=e;if(!e.sources)throw new Error("sources property should exists for dataSource serialization");return{...e,spectra:t.map(Mt)}}function It(e){let{spectra:t,sources:o,...r}=e;return{...r,spectra:t.map(vt)}}function Mt(e){return v(e,ht)}function vt(e){return v(e,Nt)}function Dt(e){let{data:t,info:o,originalData:r,originalInfo:n}=e,i=v(e,bt);return i.data=r||t,i.info=n||o,i}import{FileCollection as Ct}from"file-collection";async function Ie(e){let{spectra:t,molecules:o,aggregator:r,serializedState:n,includeData:i=!0}=e;return Ct.fromCollection(r,{filter:{ignoreDotfiles:!1}}).toIum({includeData:i,mimetype:"chemical/x-nmrium+zip",*getExtraFiles(s){yield{relativePath:".META-NMRIUM/NMRIUM_ARCHIVE",data:""},yield{relativePath:".META-NMRIUM/VERSION",data:"0"},yield{relativePath:"state.json",data:n},yield{relativePath:"index.txt",data:At({aggregator:r,spectra:t,molecules:o,index:s})}}})}function At(e){let{aggregator:t,spectra:o,molecules:r,index:n}=e,i=new Map,c=new Map(n.sources.map(l=>[l.uuid,l]));for(let l of o){let a=l.selector?.root;a&&(i.has(a)||i.set(a,t.subroot(a)))}for(let l of r){let a=l.selector?.root;a&&(i.has(a)||i.set(a,t.subroot(a)))}let s=[];for(let[l,a]of i.entries()){let m=new Map(a.sources.map(u=>[u.uuid,u])),p=`data/${l}/`;s.push(p);for(let u of a.files){let f=c.get(u.sourceUUID),g=m.get(u.sourceUUID),d=f?.baseURL?.startsWith("ium:/")?"embedded":"linked",y=n.paths[u.sourceUUID]?.replace(p,""),P=u.relativePath.replace(g?.relativePath??"",""),x=y?y+P:u.relativePath;s.push(` ${x} (${d})`)}s.push(`
4
+ Please consider open this file with the plugin installed.`)}}let n=new Set,c=()=>{let s=r.version;for(let l of o.values())for(let a of l.migrations){if(n.has(a)||s<a.minCore||a.maxCore&&s>a.maxCore)continue;if((r.plugins?.[l.id]?.version||0)===l.version)break;r=a.up(r),n.add(a)}};for(let s=e?.version||0;s<t;s++){let l=tt[s];r=l(r),c()}return c(),O(r,o),r}var rt=["topbar.right","topbar.about_us.modal"],ot=[],Hr=[...rt,...ot],it={},ie={};{let e=it,t=ie;for(let[o,r]of Object.entries(e))t[r]||(t[r]=[]),t[r]?.push(o)}function*pe(e){let{slot:t,plugins:o,supportedToDeprecatedSlots:r=ie}=e,i=r[t];for(let[n,c]of o.entries()){let s=c.ui;if(!s)continue;let l=s[t];if(l){yield[n,l];continue}if(i)for(let a of i){let p=c.ui?.[a];if(p){yield[n,p],console.warn(`Plugin ${c.id} used deprecated slot "${a}". Please update this plugin to use "${t}" instead.`);break}}}}import{FileCollection as ct}from"file-collection";var me={SDF:"sdf",MOL:"mol",NMRIUM:"nmrium",NMRIUM_ARCHIVE:"nmrium.zip",JSON:"json",JCAMP:"jcamp",DX:"dx",JDX:"jdx",JDF:"jdf",NMREDATA:"nmredata",SMILES:"smiles",SMI:"smi"};function w(e){return e.includes(".")?e.replace(/^.*\./,"").toLowerCase():""}function T(e,t={},o){let{data:r,...i}=e;if(!r)return e;let{spectra:n=[]}=r,{keep1D:c=!0,keep2D:s=!0,onlyReal:l}=t,a=l?"ft":t.dataSelection||"both",p=[];for(let m of n){if(!m.info){p.push(m);continue}let{isFid:u,dimension:f,name:g}=m.info;if(!F(f===1&&!c,g,o)&&!F(f===2&&!s,g,o)&&!F(u&&a==="ft",g,o)&&!F(!u&&a==="fid",g,o))if(l&&!u)if(m.info.isComplex=!1,nt(m)){let{rr:d}=m.data;p.push({...m,data:{rr:d}})}else{let{re:d,x:S}=m.data;p.push({...m,data:{re:d,x:S}})}else p.push(m)}return{data:{...r,spectra:p},...i}}function F(e,t,o){return e?(o?.warn(`Skipping ${t} because it didn't match the import filters.`),!0):!1}function nt(e){let{info:t}=e;return t?.dimension===2}function E(e){let{nmriumState:t,plugins:o,options:r}=e;for(let i of o.values()){let n=i.onReadProcess?.onProcessing;n&&n(t,r)}}async function L(e,t,o={}){let{selector:r,converter:i,logger:n}=o,c=[],s=[];for(let u of t.values()){let{onReadProcess:f}=u;f&&(f?.onFiles&&c.push(u),f?.supportedExtensions?.length&&f?.onFile&&s.push(u))}let l=await Promise.allSettled(c.map(u=>u.onReadProcess.onFiles(e,o))),a=[],p=await Promise.allSettled(e.files.flatMap(u=>{let f=w(u.name).toLowerCase();return s.flatMap(g=>{let{supportedExtensions:d,onFile:S}=g.onReadProcess;return d.includes(f)?(a.push({file:u,plugin:g}),S(u,{logger:n,selector:r,converter:i})):[]})})),m={spectra:[],molecules:[]};for(let u=0;u<l.length;u++){let f=l[u];switch(f.status){case"fulfilled":{let{spectra:g=[],molecules:d=[]}=f.value||{};m.spectra.push(...g),m.molecules.push(...d);break}case"rejected":{let g=f.reason,d=c[u];o.logger?.error(`Load file collection with plugin ${d.id}@${d.version} fails with: ${g}`);break}}}for(let u=0;u<p.length;u++){let f=p[u];switch(f.status){case"fulfilled":{let{spectra:g=[],molecules:d=[]}=f.value||{};m.spectra.push(...g),m.molecules.push(...d);break}case"rejected":{let g=f.reason,{file:d,plugin:S}=a[u];o.logger?.error(`Load file ${d.relativePath} with plugin ${S.id}@${S.version} fails with: ${g}`);break}}}return m}import{FileCollection as Se}from"file-collection";import{FileCollection as de}from"file-collection";import fe from"lodash.merge";import{xIsEquallySpaced as st}from"ml-spectra-processing";async function U(e){let{input:t,spectraResult:o,unserializedSpectrum:r,options:i,plugins:n,migrator:c}=e,l=(await v({input:t,migrator:c,plugins:n,options:{...i,selector:r.selector}}))?.nmriumState?.data?.spectra??[],a=l.pop();if(a){o.push(ge(r,a));for(let p of l)o.push(ge(r,at(p)))}}function ge(e,t){let{data:o,...r}=e;if(!t.selector?.root&&e.selector?.root&&(t.selector??=e.selector,t.selector.root=e.selector.root),"ranges"in t){let{data:i,...n}=t;return{...fe(n,r),data:i}}else if("zones"in t){let{data:i,...n}=t;return{...fe(n,r),data:i}}else return t}function at(e){return{...e,id:b()}}function z(e){let{spectrum:t,spectraResult:o,logger:r}=e,{dimension:i}=t.info;if(i===1){if(!st(t.data)){r?.error('The ".nmrium" file is corrupted; the X-axis values are not equally distant.');return}o.push(R(t))}else i===2&&o.push(M(t))}async function k(e){let{input:t,moleculesResult:o,unserializedMolecule:r,options:i,plugins:n,migrator:c}=e,{selector:s}=r,a=(await v({input:t,migrator:c,plugins:n,options:{...i,selector:s}}))?.nmriumState?.data?.molecules??[];for(let p of a)!p.selector?.root&&s?.root&&(p.selector??=s,p.selector.root=s.root),o.push({...r,...p})}function j(e){let{molecule:t,moleculesResult:o}=e;o.push(t)}async function V(e){let{nmriumObjectInput:t,options:o={},migrator:r,plugins:i,fromSourceOptions:n}=e,c=r(t),{data:s,...l}=c,a=new de;if(!s)return[{...l},a];let p={data:{...s,spectra:[],molecules:[]},...l},m=p.data,{sources:u=[],spectra:f,molecules:g}=m,d=await Promise.all(u.map(async P=>{let x=await de.fromSource(P,{unzip:{zipExtensions:["zip","nmredata"]}},n);if(!P.baseURL)for(let I of P.entries)I.baseURL||(I.baseURL=n?.baseURL);return[P.id,x]})),S=new Map(d),y=[];for(let P of s.spectra){let x=P.selector?.root??"",I=S.get(x);if(!I){z({spectrum:P,spectraResult:f,logger:o.logger});continue}y.push(U({input:I,spectraResult:f,unserializedSpectrum:P,migrator:r,plugins:i,options:o}))}for(let P of s.molecules??[]){let x=S.get(P.sourceId);if(!x){j({molecule:P,moleculesResult:g,logger:o.logger});continue}y.push(k({input:x,unserializedMolecule:P,moleculesResult:g,migrator:r,plugins:i,options:o}))}await Promise.allSettled(y);for(let[P,x]of S.entries())a.appendFileCollection(x,P);return[p,a]}async function _(e){let{file:t,options:o={},migrator:r,plugins:i,fromSourceOptions:n}=e,c=await t.arrayBuffer(),s=await(Se.isZip(c)?lt(c):t.text());return V({nmriumObjectInput:JSON.parse(s),plugins:i,migrator:r,options:o,fromSourceOptions:n})}async function lt(e){let t=await Se.fromZip(e);if(t.files.length===0)throw new Error("compressed nmrium file is corrupted");return t.files[0].text()}async function v(e){let{options:t={},input:o,migrator:r,plugins:i,fromSourceOptions:n}=e,{selectorRoot:c=crypto.randomUUID()}=t,s=mt(await ut(o),t.selector?.files),l=ft(s);if(l){let[g]=await _({file:l,migrator:r,plugins:i,options:t,fromSourceOptions:n});return ye(g,c),{nmriumState:g,containsNmrium:!0,fileCollection:s,selectorRoot:c}}let a=await L(s,i,t),p=T({version:13,data:a},t?.selector?.general,t.logger),{onLoadProcessing:m,experimentalFeatures:u}=t,f={...m,autoProcessing:m?.autoProcessing??!1,experimentalFeatures:u};return E({nmriumState:p,plugins:i,options:f}),ye(p,c),{nmriumState:p,containsNmrium:!1,fileCollection:s,selectorRoot:c}}function ut(e){return Array.isArray(e)?Promise.reject(new Error("For a set of fileCollectionItems pass a FileCollection instance")):pt(e)?Promise.resolve(e):new ct().appendExtendedSource({...e,uuid:crypto.randomUUID()})}function pt(e){return typeof e=="object"&&"files"in e}function mt(e,t){if(!t)return e;let o=new Set(t);return e.filter(r=>o.has(r.relativePath))}function ft(e){return e.files.find(t=>w(t.name).toLowerCase()===me.NMRIUM)}function ye(e,t){for(let o of e.data?.spectra??[])o.selector?.root||(o.selector??={root:t},o.selector.root||=t);for(let o of e.data?.molecules??[])o.selector?.root||(o.selector??={root:t},o.selector.root||=t)}import{FileCollection as dt}from"file-collection";async function Pe(e){let t={},o=[];for(let r of e.sources)switch(r.relativePath){case"META-INF/NMRIUM_ARCHIVE":t.archive=r;break;case"META-INF/VERSION":o.push(r.text().then(i=>{t.version=Number.parseInt(i,10)}));break;case"state.json":o.push(r.text().then(i=>{t.state=JSON.parse(i)}));break;default:}return await Promise.all(o),t}function xe(e){if(!e.archive)throw new Error("Not a valid NMRium archive");if(typeof e.version!="number"||Number.isNaN(e.version))throw new Error("Not a valid NMRium archive, no version specified");if(!e.state)throw new Error("NMRium Archive corrupted, state.json is missing")}function Ne(e){return e.filter(t=>!gt(t.relativePath))}function gt(e){return e.startsWith("META-INF/")||e==="state.json"||e==="index.txt"}async function he(e){let{options:t,plugins:o,migrator:r}=e,i=await dt.fromIum(e.input),n=await Pe(i);xe(n);let c=Ne(i),s=r(n.state),l={...s,data:{...s.data,spectra:[],molecules:[]}},a=l.data.spectra,p=l.data.molecules,m=St(i),u=[];for(let f of s.data.spectra)u.push(yt({subRoots:m,unserializedSpectrum:f,spectraResult:a,options:t,plugins:o,migrator:r}));for(let f of s.data.molecules??[])u.push(Pt({subRoots:m,unserializedMolecule:f,moleculesResult:p,options:t,plugins:o,migrator:r}));return await Promise.allSettled(u),[l,c]}function St(e){let t=new Map;return{get(o){let r=t.get(o);return r||(r=e.subroot(o),t.set(o,r)),r},[Symbol("debug")]:{ium:e,views:t}}}async function yt(e){let{subRoots:t}=e,{unserializedSpectrum:o,spectraResult:r}=e,{options:i,plugins:n,migrator:c}=e,{selector:s}=o,l=await be({subRoots:t,selector:s});if(!l)return z({spectrum:o,spectraResult:r,logger:i?.logger});await U({input:l,unserializedSpectrum:o,spectraResult:r,options:i,plugins:n,migrator:c})}async function Pt(e){let{subRoots:t}=e,{unserializedMolecule:o,moleculesResult:r}=e,{options:i,plugins:n,migrator:c}=e,{selector:s}=o,l=await be({subRoots:t,selector:s});if(!l)return j({molecule:o,moleculesResult:r,logger:i?.logger});await k({input:l,unserializedMolecule:o,moleculesResult:r,options:i,plugins:n,migrator:c})}async function be(e){let{subRoots:t,selector:o}=e;if(!o)return;let{root:r}=o;if(r)return t.get(r)}import{FileCollection as xt}from"file-collection";async function Re(e){let{source:t,plugins:o,options:r={},sourceId:i=crypto.randomUUID()}=e,{converter:n,...c}=r,s={...t,id:i},l={spectra:[],molecules:[]},a=await xt.fromSource(s,{unzip:{zipExtensions:["zip","nmredata"]}}),{spectra:p=[],molecules:m=[]}=await L(a,o,{converter:{...n,bruker:{keepFiles:!0,...Reflect.get(n??{},"bruker")}},...c});l.spectra.push(...p),l.molecules.push(...m);for(let d of l.spectra)d.selector??={root:i},d.selector.root=i;for(let d of l.molecules)d.selector??={root:i},d.selector.root=i;l.sources??=[],l.sources.push(s);let u=T({version:13,data:l},r?.selector?.general),{onLoadProcessing:f}=c,g={filters:f?.filters,autoProcessing:f?.autoProcessing??!1,experimentalFeatures:r.experimentalFeatures};return E({nmriumState:u,plugins:o,options:g}),[u,a,i]}function D(e,t){let o={};for(let r in e)t.includes(r)||(o[r]=e[r]);return o}var Nt=["data","originalData","info","originalInfo","meta","customInfo"],ht=["data","originalData","info","originalInfo","meta","customInfo"],bt=["selector","originalData","originalInfo"];function Oe(e,t,o={}){let{version:r,data:i}=e;if(i.actionType)return e;let n={version:r,plugins:e.plugins},{includeData:c}=o;c!=="noData"&&(n.data=Rt({...i},c));let{includeSettings:s,includeView:l}=o;return s&&(n.settings=e.settings),l&&(n.view=e.view),O(n,t),n}function Rt(e,t="rawData"){let{spectra:o}=e;switch(t){case"dataSource":return Ot(e);case"selfContained":case"selfContainedExternalDatasource":return It(e);case"rawData":return{...D(e,["sources"]),spectra:o.map(Mt)};default:return e}}function Ot(e){let{spectra:t}=e;if(!e.sources)throw new Error("sources property should exists for dataSource serialization");return{...e,spectra:t.map(vt)}}function It(e){let{spectra:t,sources:o,...r}=e;return{...r,spectra:t.map(Dt)}}function vt(e){return D(e,Nt)}function Dt(e){return D(e,ht)}function Mt(e){let{data:t,info:o,originalData:r,originalInfo:i}=e,n=D(e,bt);return n.data=r||t,n.info=i||o,n}import{FileCollection as Ct}from"file-collection";async function Ie(e,t){let{state:o,aggregator:r,includeData:i=!0,includeSettings:n,includeView:c}=t,{spectra:s,molecules:l}=o.data;return Ct.fromCollection(r,{filter:{ignoreDotfiles:!1}}).toIum({includeData:i,mimetype:"chemical/x-nmrium+zip",*getExtraFiles(p){yield{relativePath:"META-INF/NMRIUM_ARCHIVE",data:""},yield{relativePath:"META-INF/VERSION",data:"0"},yield{relativePath:"state.json",data:At(e,o,{includeData:i,includeView:c,includeSettings:n})},yield{relativePath:"index.txt",data:wt({aggregator:r,spectra:s,molecules:l,index:p})}}})}function At(e,t,o){let{includeData:r,includeView:i,includeSettings:n}=o,c=e(t,{includeData:r?"selfContained":"selfContainedExternalDatasource",includeView:i,includeSettings:n}),s=JSON.stringify(c,(l,a)=>ArrayBuffer.isView(a)?Array.from(a):a,2);return new Blob([s],{type:"application/json"})}function wt(e){let{aggregator:t,spectra:o,molecules:r,index:i}=e,n=new Map,c=new Map(i.sources.map(l=>[l.uuid,l]));for(let l of o){let a=l.selector?.root;a&&(n.has(a)||n.set(a,t.subroot(a)))}for(let l of r){let a=l.selector?.root;a&&(n.has(a)||n.set(a,t.subroot(a)))}let s=[];for(let[l,a]of n.entries()){let p=new Map(a.sources.map(u=>[u.uuid,u])),m=`data/${l}/`;s.push(m);for(let u of a.files){let f=c.get(u.sourceUUID),g=p.get(u.sourceUUID),d=f?.baseURL?.startsWith("ium:/")?"embedded":"linked",y=i.paths[u.sourceUUID]?.replace(m,""),P=u.relativePath.replace(g?.relativePath??"",""),x=y?y+P:u.relativePath;s.push(` ${x} (${d})`)}s.push(`
5
5
  `)}return s.join(`
6
- `)}var ie=class{version=13;#e=new Map;registerPlugin(t){if(this.#e.has(t.id)){console.warn(`Plugin ${t.id} is already registered. skip.`),console.debug("Plugin already registered:",this.#e.get(t.id)),console.debug("Plugin to register:",t);return}this.#e.set(t.id,t)}registerPlugins(t){for(let o of t)this.registerPlugin(o)}migrate(t){return ue(t,this.version,this.#e)}read(t,o={},r){return M({input:t,options:o,fromSourceOptions:r,migrator:this.migrate.bind(this),plugins:this.#e})}readNMRiumArchive(t,o={}){return Ne({input:t,options:o,plugins:this.#e,migrator:this.migrate.bind(this)})}readNMRiumObject(t,o,r){return V({nmriumObjectInput:t,options:o,fromSourceOptions:r,plugins:this.#e,migrator:this.migrate.bind(this)})}readNMRiumFile(t,o={},r){return _({file:t,options:o,fromSourceOptions:r,plugins:this.#e,migrator:this.migrate.bind(this)})}readFromWebSource(t,o){return Re({source:t,options:o,plugins:this.#e})}serializeNmriumState(t,o){return Oe(t,this.#e,o)}serializeNmriumArchive(t){return Ie(t)}serializePlugins(){let t={plugins:{}};return O(t,this.#e),t.plugins}slot(t){return pe({slot:t,plugins:this.#e})}};function wt(e,t){if(t>13)return 0;let o=-1;for(let r=0;r<e.length;r++)if(e[r].version>t){o=r;break}return o}var Me=[{version:6,fun:C},{version:7,fun:A}];function Ft(e){let{version:t}=e||{},o=wt(Me,t);if(o===-1)return{...e,version:13};let r=Me.slice(o);for(let n of r)e=n.fun(e);return e}export{ve as ANALYSIS_COLUMN_TYPES,De as ANALYSIS_COLUMN_VALUES_KEYS,h as CURRENT_EXPORT_VERSION,Ae as EXTERNAL_API_KEYS,ie as NMRiumCore,Ze as defineNMRiumPlugin,Ye as formatSpectra,b as generateID,W as getOneIfArray,Ft as migrateSettings,Ce as units};
6
+ `)}var ne=class{version=13;#e=new Map;registerPlugin(t){if(this.#e.has(t.id)){console.warn(`Plugin ${t.id} is already registered. skip.`),console.debug("Plugin already registered:",this.#e.get(t.id)),console.debug("Plugin to register:",t);return}this.#e.set(t.id,t)}registerPlugins(t){for(let o of t)this.registerPlugin(o)}migrate(t){return ue(t,this.version,this.#e)}read(t,o={},r){return v({input:t,options:o,fromSourceOptions:r,migrator:this.migrate.bind(this),plugins:this.#e})}readNMRiumArchive(t,o={}){return he({input:t,options:o,plugins:this.#e,migrator:this.migrate.bind(this)})}readNMRiumObject(t,o,r){return V({nmriumObjectInput:t,options:o,fromSourceOptions:r,plugins:this.#e,migrator:this.migrate.bind(this)})}readNMRiumFile(t,o={},r){return _({file:t,options:o,fromSourceOptions:r,plugins:this.#e,migrator:this.migrate.bind(this)})}readFromWebSource(t,o){return Re({source:t,options:o,plugins:this.#e})}serializeNmriumState(t,o){return Oe(t,this.#e,o)}serializeNmriumArchive(t){let o=this.serializeNmriumState.bind(this);return Ie(o,t)}serializePlugins(){let t={plugins:{}};return O(t,this.#e),t.plugins}slot(t){return pe({slot:t,plugins:this.#e})}};function Ft(e,t){if(t>13)return 0;let o=-1;for(let r=0;r<e.length;r++)if(e[r].version>t){o=r;break}return o}var ve=[{version:6,fun:C},{version:7,fun:A}];function Tt(e){let{version:t}=e||{},o=Ft(ve,t);if(o===-1)return{...e,version:13};let r=ve.slice(o);for(let i of r)e=i.fun(e);return e}export{De as ANALYSIS_COLUMN_TYPES,Me as ANALYSIS_COLUMN_VALUES_KEYS,N as CURRENT_EXPORT_VERSION,Ae as EXTERNAL_API_KEYS,ne as NMRiumCore,Ze as defineNMRiumPlugin,Ye as formatSpectra,b as generateID,W as getOneIfArray,Tt as migrateSettings,Ce as units};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zakodium/nmrium-core",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "The core of NMRium: types, state, state migration and plugin system.",
5
5
  "author": "Zakodium Sàrl",
6
6
  "license": "CC-BY-NC-SA-4.0",
@@ -45,5 +45,5 @@
45
45
  "volta": {
46
46
  "extends": "../../../package.json"
47
47
  },
48
- "gitHead": "d0d3e5768dcbe675e0f8460fad4b7dbd352a7ff8"
48
+ "gitHead": "926d65f5f128941487e1e69f10d97364e47b2019"
49
49
  }