@zakodium/nmrium-core 0.4.6 → 0.4.7

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.
@@ -214,7 +214,7 @@ declare interface ContourOptions_2 {
214
214
 
215
215
  export declare type ContoursLevels = Record<string, Level>;
216
216
 
217
- export declare const CURRENT_EXPORT_VERSION = 10;
217
+ export declare const CURRENT_EXPORT_VERSION = 11;
218
218
 
219
219
  export declare type CustomWorkspaces = Record<string, InnerWorkspace>;
220
220
 
@@ -477,9 +477,17 @@ export declare type MoleculesView = Record<string, MoleculeView>;
477
477
  export declare interface MoleculeView {
478
478
  floating: FloatingElement;
479
479
  /**
480
- * Show/Hide atoms numbers on the molecule.
480
+ * Show/Hide molecule label.
481
481
  */
482
- showAtomNumber: boolean;
482
+ showLabel: boolean;
483
+ /**
484
+ * Defines which type of annotation is displayed on atoms.
485
+ * "none": Show atoms only
486
+ * "atom-numbers": Show atom numbers
487
+ * "custom-labels": Show custom atom labels
488
+ * @default "none"
489
+ */
490
+ atomAnnotation: 'none' | 'atom-numbers' | 'custom-labels';
483
491
  }
484
492
 
485
493
  declare type MultipleSpectraAnalysis = Record<string, MultipleSpectraAnalysisPreferences>;
@@ -491,7 +499,7 @@ export declare interface MultipleSpectraAnalysisPreferences {
491
499
 
492
500
  export declare class NMRiumCore {
493
501
  #private;
494
- readonly version = 10;
502
+ readonly version = 11;
495
503
  registerPlugin(plugin: NMRiumPlugin): void;
496
504
  registerPlugins(plugins: NMRiumPlugin[]): void;
497
505
  private migrate;
@@ -1421,6 +1429,7 @@ export declare interface WorkspacePreferences {
1421
1429
  export?: ExportPreferences;
1422
1430
  peaksLabel?: PeaksLabel;
1423
1431
  acsExportSettings?: ACSExportSettings;
1432
+ defaultMoleculeSettings?: MoleculeView;
1424
1433
  }
1425
1434
 
1426
1435
  /**
@@ -1,6 +1,6 @@
1
- var be={NORMAL:"NORMAL",FORMULA:"FORMULA"};var Re={RELATIVE:"relative",ABSOLUTE:"absolute",MIN:"min",MAX:"max"};var Ie=[{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 P=10;var Ce=[{key:"CT",description:"CT from NMR Solutions"}];import{isAnyArray as Me}from"is-any-array";import{xMultiply as j}from"ml-spectra-processing";var Oe=crypto.randomUUID.bind(crypto),N=Oe;function h(e){let{id:t=N(),meta:o,peaks:r={},filters:i=[],info:n={},ranges:a={},integrals:s={},selector:c,sourceId:l,dependentVariables:p=[],...m}=e,u={id:t,meta:o,filters:i},{data:d=De(p[0].components)}=e;if(Array.isArray(n.nucleus)&&(n.nucleus=n.nucleus[0]),u.data={x:[],re:[],im:[],...d},"scaleFactor"in n){let{scaleFactor:g}=n,{re:S,im:y}=u.data;j(S,g,{output:S}),y&&j(y,g,{output:y})}c&&(u.selector=c),l&&(u.sourceId=l,u.fileCollectionId=l);let f=Me(d.im);if(u.info={phc0:0,phc1:0,nucleus:"1H",isFid:!1,isComplex:f,dimension:1,name:n?.name||t,...n},n.isFid&&n.reverse&&f){let{im:g}=u.data;j(g,-1,{output:g}),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},...a},u.integrals={values:[],options:{},...s},{...m,...u}}function De(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 ve,xMinMaxValues as Fe,xNoiseSanPlot as Ae}from"ml-spectra-processing";var V={z:[[]],minX:0,minY:0,maxX:0,maxY:0},we={re:V,im:V},Ee={rr:V};function C(e){let{id:t=N(),meta:o={},dependentVariables:r=[],info:i={},filters:n=[],zones:a=[],sourceId:s,...c}=e,l={id:t,meta:o,filters:n};s&&(l.sourceId=s,l.fileCollectionId=s),l.info={nucleus:["1H","1H"],isFid:!1,isComplex:!1,name:i?.name||N(),...i},l.originalInfo=structuredClone(l.info),l.display={isPositiveVisible:!0,isNegativeVisible:!0,isVisible:!0,dimension:2,...e.display,...e.display};let{data:p=r[0].components}=e;if(l.data={...l.info.isFid?we:Ee,...p},l.originalData=structuredClone(l.data),!("spectrumSize"in i)){let m=i.isFid?"re":"rr",u=l.data[m].z.length,d=u>0?l.data[m].z[0].length:0;l.info.spectrumSize=[d,u]}if(!i.isFid){let m=l.data.rr,u=ve(m.z),{positive:d,negative:f}=Ae(u),{min:g,max:S}=Fe(u);l.data.rr={...m,minZ:g,maxZ:S},l.info.noise={positive:d,negative:f}}return l.zones={values:[],options:{},...a},{...c,...l}}import{xSequentialFillFromTo as ze}from"ml-spectra-processing";import{isAnyArray as Te}from"is-any-array";function _(e,t=0){if(Te(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 ke=new Set(["t1ir","T1"]);function oe(e){let t=[];for(let o of e){let{info:{pulseSequence:r,isFid:i}}=o,{data:n,info:a,meta:{vdlistValues:s=[]}}=o;if(!(r&&ke.has(r))||s.length===0){t.push(o);continue}let l=i?"re":"rr",p={};for(let y in a)p[y]=_(a[y]);let{z:m,maxX:u,minX:d}=n[l],f=ze({from:d,to:u,size:m[0].length}),[g,S]=Ue(o);for(let y=0;y<s.length;y++){let te={re:f,x:f};for(let re in n)te[Le(re)]=n[re].z.at(g*(y+S));t.push(h({data:te,info:{...p,name:`${p.name}_${s[y]}`,dimension:1,vd:s[y]}}))}}return t}function Le(e){return["rr","re"].includes(e)?"re":["im","ri","ir","ii"].includes(e)?"im":"x"}function Ue(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 je=2,Ve=1;function _e(e){let{spectra:t=[],molecules:o}=e,r=[];for(let i of t){let{info:n}=i;switch(n.dimension){case Ve:r.push(h(i));break;case je:r.push(C(i));break;default:throw new Error("dimension does not supported")}}return{molecules:o,spectra:oe(r)}}function Be(e){return e}function x(e,t){return JSON.parse(JSON.stringify(e),function(r,i){if(r in t){this[t[r]]=i;return}return i})}function B(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=x(r.ranges,o);r.ranges=Array.isArray(i)?{values:i}:i}else if(r.zones){let i=x(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 K(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=x(r.peaks,o.peaks):r.ranges?r.ranges=x(r.ranges,o.ranges):r.zones&&(r.zones.values=Ke(r.zones.values));return t}function Ke(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,...a}}=o;o={...o,x:{...i,...r},y:{...a,...n}}}else{let{fromTo:r,deltaX:i,resolutionX:n,nucleusX:a,deltaY:s,resolutionY:c,nucleusY:l,shiftX:p,shiftY:m,...u}=o;o={...u,x:{from:r[0].from,to:r[0].to,delta:i,resolution:n,nucleus:a},y:{from:r[1].from,to:r[1].to,delta:s,resolution:c,nucleus:l}}}return o},[])),t),[])}var Xe={name:"apodization",label:"Apodization",value:{lineBroadening:1,gaussBroadening:0,lineBroadeningCenter:0}};function X(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],...Xe};o.filters[r]=o.filters[r-1],o.filters[r-1]=i}}return t}function W(e){if(e?.version===4)return e;let{version:t,...o}=e,r=[],i={};for(let{source:s,...c}of o.spectra){let l={},{info:p={},display:m={}}=c;if(p?.dimension===2&&!s?.jcampURL)if(p.isFt)l.data={rr:c.data};else continue;if(s?.jcampURL){let{jcampURL:f,jcampSpectrumIndex:g}=s,S=f.match(/(?<baseURL>^\w+:\/{2}\w+\/)(?<relativePath>.*)/);i[f]||(i[f]={baseURL:S?.groups.baseURL||"",relativePath:S?.groups.relativePath||f.replace(/^\.\//,"")}),l.sourceSelector={files:[i[f].relativePath]},g!==void 0&&(l.sourceSelector.jcamp={index:g})}l.filters=We(c.filters);let{name:u,...d}=m;u&&(l.info={...p,name:u}),l.display=d,r.push({...c,...l})}let n={data:{...o,spectra:r},version:4},a={entries:Object.values(i)};return a.entries.length>0&&(n.data.source=a),n}function We(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 Y(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]=x(r[i],o));return t}function $(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}=Ye(o);i?.flag&&r?.flag&&n&&Math.floor(r.value.digitalFilterValue)%2>0&&(n.value.ph0-=180)}return t}function Ye(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 O(e,t="localStorage"){if(e?.version===7)return e;if(t==="nmrium")return ie(e);let o={...e,version:7};for(let r in e.workspaces)o.workspaces[r]=ie(o.workspaces[r]);return o}function ie(e){let{formatting:{nuclei:t,panels:o}={nuclei:null,panels:null},version:r,...i}=e,n={...i};return t&&(n.nuclei=$e(t)),o&&(n.panels=o),n}function $e(e){let t=[],o={name:"nucleus",ppm:"ppmFormat",hz:"hzFormat"};for(let r in e)t.push(x(e[r],o));return t}function Z(e){if(e?.version===7)return e;let t={...e,version:7};return t?.settings&&(t.settings=O(t.settings,"nmrium")),t}function M(e,t="localStorage"){if(e?.version===8)return e;if(t==="nmrium")return ne(e);let o={...e,version:8};for(let r in e.workspaces)o.workspaces[r]=ne(o.workspaces[r]);return o}function ne(e){let{version:t,...o}=e,r={...o};return r.display.panels=Ze(e),r}function Ze(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 G(e){if(e?.version===8)return e;let t={...e,version:8};t?.settings&&(t.settings=M(t.settings,"nmrium"));for(let o of t?.data?.spectra||[]){let{filters:r=[]}=o;for(let s=0;s<r.length;s++){let{flag:c,isDeleteAllow:l,label:p,...m}=r[s];r[s]={...m,enabled:c}}let i=r.findIndex(s=>s.name==="apodization");if(i!==-1){let s=r[i],{lineBroadening:c,gaussBroadening:l,lineBroadeningCenter:p}=s.value;s.value={exponential:{apply:!0,options:{lineBroadening:l>0?-c:c}}},l>0&&(s.value.gaussian={apply:!0,options:{lineBroadening:.6*l,lineBroadeningCenter:p}}),r[i]=s}let n=r.findIndex(s=>s.name==="apodizationDimension1"),a=r.findIndex(s=>s.name==="apodizationDimension2");if(n!==-1){let s=r[n],{shapes:c}=s.value.compose;s.value=se(c)}if(a!==-1){let s=r[a],{shapes:c}=s.value.compose;s.value=se(c)}}return t}function se(e){let t={};for(let{shape:o}of e){let{kind:r,options:i}=o;if(r==="sineBell"){let{exponent:n,offset:a}=i,s=n===2?"sineSquare":"sineBell";t[s]={apply:!0,options:{offset:a}}}}return t}function J(e){let{version:t,plugins:o,...r}=e;return t===9?e:{version:9,plugins:{},...r}}function q(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,a=o?[{...o,id:n}]:[];t.data={...i,sources:a,spectra:o?r.map(s=>({...s,sourceId:n})):r}}return t}function b(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 Ge=[B,K,X,W,Y,$,Z,G,J,q];function ae(e,t,o){let r=structuredClone(e),i=Object.entries(e?.plugins??{});for(let[s,{version:c}]of i){let l=o.get(s);if(!(l&&l.version>=c)){if(l){console.warn(`Plugin "${l.id}" is loaded with a version older (${l.version}) than the one used to save the state (${c}).
1
+ var Re={NORMAL:"NORMAL",FORMULA:"FORMULA"};var Ie={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 P=11;var Oe=[{key:"CT",description:"CT from NMR Solutions"}];import{isAnyArray as ve}from"is-any-array";import{xMultiply as j}from"ml-spectra-processing";var Me=crypto.randomUUID.bind(crypto),N=Me;function h(e){let{id:t=N(),meta:o,peaks:r={},filters:i=[],info:n={},ranges:a={},integrals:s={},selector:c,sourceId:l,dependentVariables:p=[],...m}=e,u={id:t,meta:o,filters:i},{data:d=De(p[0].components)}=e;if(Array.isArray(n.nucleus)&&(n.nucleus=n.nucleus[0]),u.data={x:[],re:[],im:[],...d},"scaleFactor"in n){let{scaleFactor:g}=n,{re:S,im:y}=u.data;j(S,g,{output:S}),y&&j(y,g,{output:y})}c&&(u.selector=c),l&&(u.sourceId=l,u.fileCollectionId=l);let f=ve(d.im);if(u.info={phc0:0,phc1:0,nucleus:"1H",isFid:!1,isComplex:f,dimension:1,name:n?.name||t,...n},n.isFid&&n.reverse&&f){let{im:g}=u.data;j(g,-1,{output:g}),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},...a},u.integrals={values:[],options:{},...s},{...m,...u}}function De(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 Fe,xMinMaxValues as Ae,xNoiseSanPlot as we}from"ml-spectra-processing";var V={z:[[]],minX:0,minY:0,maxX:0,maxY:0},Ee={re:V,im:V},Te={rr:V};function C(e){let{id:t=N(),meta:o={},dependentVariables:r=[],info:i={},filters:n=[],zones:a=[],sourceId:s,...c}=e,l={id:t,meta:o,filters:n};s&&(l.sourceId=s,l.fileCollectionId=s),l.info={nucleus:["1H","1H"],isFid:!1,isComplex:!1,name:i?.name||N(),...i},l.originalInfo=structuredClone(l.info),l.display={isPositiveVisible:!0,isNegativeVisible:!0,isVisible:!0,dimension:2,...e.display,...e.display};let{data:p=r[0].components}=e;if(l.data={...l.info.isFid?Ee:Te,...p},l.originalData=structuredClone(l.data),!("spectrumSize"in i)){let m=i.isFid?"re":"rr",u=l.data[m].z.length,d=u>0?l.data[m].z[0].length:0;l.info.spectrumSize=[d,u]}if(!i.isFid){let m=l.data.rr,u=Fe(m.z),{positive:d,negative:f}=we(u),{min:g,max:S}=Ae(u);l.data.rr={...m,minZ:g,maxZ:S},l.info.noise={positive:d,negative:f}}return l.zones={values:[],options:{},...a},{...c,...l}}import{xSequentialFillFromTo as ke}from"ml-spectra-processing";import{isAnyArray as ze}from"is-any-array";function _(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 Le=new Set(["t1ir","T1"]);function ie(e){let t=[];for(let o of e){let{info:{pulseSequence:r,isFid:i}}=o,{data:n,info:a,meta:{vdlistValues:s=[]}}=o;if(!(r&&Le.has(r))||s.length===0){t.push(o);continue}let l=i?"re":"rr",p={};for(let y in a)p[y]=_(a[y]);let{z:m,maxX:u,minX:d}=n[l],f=ke({from:d,to:u,size:m[0].length}),[g,S]=je(o);for(let y=0;y<s.length;y++){let re={re:f,x:f};for(let oe in n)re[Ue(oe)]=n[oe].z.at(g*(y+S));t.push(h({data:re,info:{...p,name:`${p.name}_${s[y]}`,dimension:1,vd:s[y]}}))}}return t}function Ue(e){return["rr","re"].includes(e)?"re":["im","ri","ir","ii"].includes(e)?"im":"x"}function je(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 Ve=2,_e=1;function Be(e){let{spectra:t=[],molecules:o}=e,r=[];for(let i of t){let{info:n}=i;switch(n.dimension){case _e:r.push(h(i));break;case Ve:r.push(C(i));break;default:throw new Error("dimension does not supported")}}return{molecules:o,spectra:ie(r)}}function Ke(e){return e}function x(e,t){return JSON.parse(JSON.stringify(e),function(r,i){if(r in t){this[t[r]]=i;return}return i})}function B(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=x(r.ranges,o);r.ranges=Array.isArray(i)?{values:i}:i}else if(r.zones){let i=x(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 K(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=x(r.peaks,o.peaks):r.ranges?r.ranges=x(r.ranges,o.ranges):r.zones&&(r.zones.values=Xe(r.zones.values));return t}function Xe(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,...a}}=o;o={...o,x:{...i,...r},y:{...a,...n}}}else{let{fromTo:r,deltaX:i,resolutionX:n,nucleusX:a,deltaY:s,resolutionY:c,nucleusY:l,shiftX:p,shiftY:m,...u}=o;o={...u,x:{from:r[0].from,to:r[0].to,delta:i,resolution:n,nucleus:a},y:{from:r[1].from,to:r[1].to,delta:s,resolution:c,nucleus:l}}}return o},[])),t),[])}var We={name:"apodization",label:"Apodization",value:{lineBroadening:1,gaussBroadening:0,lineBroadeningCenter:0}};function X(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],...We};o.filters[r]=o.filters[r-1],o.filters[r-1]=i}}return t}function W(e){if(e?.version===4)return e;let{version:t,...o}=e,r=[],i={};for(let{source:s,...c}of o.spectra){let l={},{info:p={},display:m={}}=c;if(p?.dimension===2&&!s?.jcampURL)if(p.isFt)l.data={rr:c.data};else continue;if(s?.jcampURL){let{jcampURL:f,jcampSpectrumIndex:g}=s,S=f.match(/(?<baseURL>^\w+:\/{2}\w+\/)(?<relativePath>.*)/);i[f]||(i[f]={baseURL:S?.groups.baseURL||"",relativePath:S?.groups.relativePath||f.replace(/^\.\//,"")}),l.sourceSelector={files:[i[f].relativePath]},g!==void 0&&(l.sourceSelector.jcamp={index:g})}l.filters=Ye(c.filters);let{name:u,...d}=m;u&&(l.info={...p,name:u}),l.display=d,r.push({...c,...l})}let n={data:{...o,spectra:r},version:4},a={entries:Object.values(i)};return a.entries.length>0&&(n.data.source=a),n}function Ye(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 Y(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]=x(r[i],o));return t}function $(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}=$e(o);i?.flag&&r?.flag&&n&&Math.floor(r.value.digitalFilterValue)%2>0&&(n.value.ph0-=180)}return t}function $e(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 O(e,t="localStorage"){if(e?.version===7)return e;if(t==="nmrium")return ne(e);let o={...e,version:7};for(let r in e.workspaces)o.workspaces[r]=ne(o.workspaces[r]);return o}function ne(e){let{formatting:{nuclei:t,panels:o}={nuclei:null,panels:null},version:r,...i}=e,n={...i};return t&&(n.nuclei=Ze(t)),o&&(n.panels=o),n}function Ze(e){let t=[],o={name:"nucleus",ppm:"ppmFormat",hz:"hzFormat"};for(let r in e)t.push(x(e[r],o));return t}function Z(e){if(e?.version===7)return e;let t={...e,version:7};return t?.settings&&(t.settings=O(t.settings,"nmrium")),t}function M(e,t="localStorage"){if(e?.version===8)return e;if(t==="nmrium")return se(e);let o={...e,version:8};for(let r in e.workspaces)o.workspaces[r]=se(o.workspaces[r]);return o}function se(e){let{version:t,...o}=e,r={...o};return r.display.panels=Ge(e),r}function Ge(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 G(e){if(e?.version===8)return e;let t={...e,version:8};t?.settings&&(t.settings=M(t.settings,"nmrium"));for(let o of t?.data?.spectra||[]){let{filters:r=[]}=o;for(let s=0;s<r.length;s++){let{flag:c,isDeleteAllow:l,label:p,...m}=r[s];r[s]={...m,enabled:c}}let i=r.findIndex(s=>s.name==="apodization");if(i!==-1){let s=r[i],{lineBroadening:c,gaussBroadening:l,lineBroadeningCenter:p}=s.value;s.value={exponential:{apply:!0,options:{lineBroadening:l>0?-c:c}}},l>0&&(s.value.gaussian={apply:!0,options:{lineBroadening:.6*l,lineBroadeningCenter:p}}),r[i]=s}let n=r.findIndex(s=>s.name==="apodizationDimension1"),a=r.findIndex(s=>s.name==="apodizationDimension2");if(n!==-1){let s=r[n],{shapes:c}=s.value.compose;s.value=ae(c)}if(a!==-1){let s=r[a],{shapes:c}=s.value.compose;s.value=ae(c)}}return t}function ae(e){let t={};for(let{shape:o}of e){let{kind:r,options:i}=o;if(r==="sineBell"){let{exponent:n,offset:a}=i,s=n===2?"sineSquare":"sineBell";t[s]={apply:!0,options:{offset:a}}}}return t}function J(e){let{version:t,plugins:o,...r}=e;return t===9?e:{version:9,plugins:{},...r}}function q(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,a=o?[{...o,id:n}]:[];t.data={...i,sources:a,spectra:o?r.map(s=>({...s,sourceId:n})):r}}return t}function H(e){let{version:t}=e;if(t>=11)return e;let o={...e,version:11};return e?.view?.molecules&&(o.view=Je(e.view)),o}function Je(e){let{molecules:t,...o}=e,r={};for(let[i,n]of Object.entries(t)){let{showAtomNumber:a,...s}=n;r[i]={...s,atomAnnotation:"none",showLabel:!1}}return{molecules:r,...o}}function b(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 qe=[B,K,X,W,Y,$,Z,G,J,q,H];function le(e,t,o){let r=structuredClone(e),i=Object.entries(e?.plugins??{});for(let[s,{version:c}]of i){let l=o.get(s);if(!(l&&l.version>=c)){if(l){console.warn(`Plugin "${l.id}" is loaded with a version older (${l.version}) than the one used to save the state (${c}).
2
2
  NMRium may fail to load the state.
3
3
  Please update the plugin to the latest version.`);continue}console.warn(`Plugin "${s}@${c}" is not registered. NMRium may fail to load the state.
4
- Please consider open this file with the plugin installed.`)}}let n=new Set,a=()=>{let s=r.version;for(let c of o.values())for(let l of c.migrations){if(n.has(l)||s<l.minCore||l.maxCore&&s>l.maxCore)continue;if((r.plugins?.[c.id]?.version||0)===c.version)break;r=l.up(r),n.add(l)}};for(let s=e?.version||0;s<t;s++){let c=Ge[s];r=c(r),a()}return a(),b(r,o),r}var Je=["topbar.right","topbar.about_us.modal"],qe=[],Kr=[...Je,...qe],He={},H={};{let e=He,t=H;for(let[o,r]of Object.entries(e))t[r]||(t[r]=[]),t[r]?.push(o)}function*le(e){let{slot:t,plugins:o,supportedToDeprecatedSlots:r=H}=e,i=r[t];for(let[n,a]of o.entries()){let s=a.ui;if(!s)continue;let c=s[t];if(c){yield[n,c];continue}if(i)for(let l of i){let p=a.ui?.[l];if(p){yield[n,p],console.warn(`Plugin ${a.id} used deprecated slot "${l}". Please update this plugin to use "${t}" instead.`);break}}}}import{FileCollection as st}from"file-collection";var ce={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 D(e){return e.includes(".")?e.replace(/^.*\./,"").toLowerCase():""}function F(e,t={},o){let{data:r,...i}=e;if(!r)return e;let{spectra:n=[]}=r,{keep1D:a=!0,keep2D:s=!0,onlyReal:c}=t,l=c?"ft":t.dataSelection||"both",p=[];for(let m of n){if(!m.info){p.push(m);continue}let{isFid:u,dimension:d,name:f}=m.info;if(!v(d===1&&!a,f,o)&&!v(d===2&&!s,f,o)&&!v(u&&l==="ft",f,o)&&!v(!u&&l==="fid",f,o))if(c&&!u)if(m.info.isComplex=!1,Qe(m)){let{rr:g}=m.data;p.push({...m,data:{rr:g}})}else{let{re:g,x:S}=m.data;p.push({...m,data:{re:g,x:S}})}else p.push(m)}return{data:{...r,spectra:p},...i}}function v(e,t,o){return e?(o?.warn(`Skipping ${t} because it didn't match the import filters.`),!0):!1}function Qe(e){let{info:t}=e;return t?.dimension===2}function A(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 w(e,t,o={}){let{sourceSelector:r,converter:i,logger:n}=o,a=[],s=[];for(let u of t.values()){let{onReadProcess:d}=u;d&&(d?.onFiles&&a.push(u),d?.supportedExtensions?.length&&d?.onFile&&s.push(u))}let c=await Promise.allSettled(a.map(u=>u.onReadProcess.onFiles(e,o))),l=[],p=await Promise.allSettled(e.files.flatMap(u=>{let d=D(u.name).toLowerCase();return s.flatMap(f=>{let{supportedExtensions:g,onFile:S}=f.onReadProcess;return g.includes(d)?(l.push({file:u,plugin:f}),S(u,{logger:n,sourceSelector:r,converter:i})):[]})})),m={spectra:[],molecules:[]};for(let u=0;u<c.length;u++){let d=c[u];switch(d.status){case"fulfilled":{let{spectra:f=[],molecules:g=[]}=d.value||{};m.spectra.push(...f),m.molecules.push(...g);break}case"rejected":{let f=d.reason,g=a[u];o.logger?.error(`Load file collection with plugin ${g.id}@${g.version} fails with: ${f}`);break}}}for(let u=0;u<p.length;u++){let d=p[u];switch(d.status){case"fulfilled":{let{spectra:f=[],molecules:g=[]}=d.value||{};m.spectra.push(...f),m.molecules.push(...g);break}case"rejected":{let f=d.reason,{file:g,plugin:S}=l[u];o.logger?.error(`Load file ${g.relativePath} with plugin ${S.id}@${S.version} fails with: ${f}`);break}}}return m}import{FileCollection as ot}from"file-collection";import{FileCollection as rt}from"file-collection";import ue from"lodash.merge";import{xIsEquallySpaced as et}from"ml-spectra-processing";async function E(e){let{input:t,spectraResult:o,unserializedSpectrum:r,options:i,plugins:n,migrator:a}=e,c=(await R({input:t,migrator:a,plugins:n,options:{...i,sourceSelector:r.sourceSelector}}))?.nmriumState?.data?.spectra??[],l=c.pop();if(l){o.push(pe(r,l));for(let p of c)o.push(pe(r,tt(p)))}}function pe(e,t){!e.fileCollectionId&&e.sourceId&&(e.fileCollectionId=e.sourceId),!t.fileCollectionId&&t.sourceId&&(t.fileCollectionId=t.sourceId);let{data:o,...r}=e;if("ranges"in t){let{data:i,...n}=t;return{...ue(n,r),data:i}}else if("zones"in t){let{data:i,...n}=t;return{...ue(n,r),data:i}}else return t}function tt(e){return{...e,id:N()}}function T(e){let{spectrum:t,spectraResult:o,logger:r}=e,{dimension:i}=t.info;if(i===1){if(!et(t.data)){r?.error('The ".nmrium" file is corrupted; the X-axis values are not equally distant.');return}o.push(h(t))}else i===2&&o.push(C(t))}async function z(e){let{input:t,moleculesResult:o,unserializedMolecule:r,options:i,plugins:n,migrator:a}=e,{sourceSelector:s,sourceId:c}=r,p=(await R({input:t,migrator:a,plugins:n,options:{...i,sourceSelector:s}}))?.nmriumState?.data?.molecules??[];for(let m of p)o.push({...m,sourceId:c,fileCollectionId:c})}function k(e){let{molecule:t,moleculesResult:o}=e;o.push(t)}async function L(e){let{nmriumObjectInput:t,options:o={},migrator:r,plugins:i}=e,n=r(t),{data:a,...s}=n;if(!a)return[{...s},new Map];let c={data:{...a,spectra:[],molecules:[]},...s},l=c.data,{sources:p=[],spectra:m,molecules:u}=l,d=await Promise.all(p.map(async S=>{let y=await rt.fromSource(S,{unzip:{zipExtensions:["zip","nmredata"]}});return[S.id,y]})),f=new Map(d),g=[];for(let S of a.spectra){let y=f.get(S.sourceId);if(!y){T({spectrum:S,spectraResult:m,logger:o.logger});continue}g.push(E({input:y,spectraResult:m,unserializedSpectrum:S,migrator:r,plugins:i,options:o}))}for(let S of a.molecules??[]){let y=f.get(S.sourceId);if(!y){k({molecule:S,moleculesResult:u,logger:o.logger});continue}g.push(z({input:y,unserializedMolecule:S,moleculesResult:u,migrator:r,plugins:i,options:o}))}return await Promise.allSettled(g),[c,f]}async function me(e){let{file:t,options:o={},migrator:r,plugins:i}=e,n=await t.arrayBuffer(),a=await(nt(n)?it(n):t.text());return L({nmriumObjectInput:JSON.parse(a),plugins:i,migrator:r,options:o})}async function it(e){let t=await ot.fromZip(e);if(t.files.length===0)throw new Error("compressed nmrium file is corrupted");return t.files[0].text()}function nt(e){if(e.byteLength<4)return!1;let t=new Uint8Array(e);return t[0]===80&&t[1]===75&&(t[2]===3||t[2]===5||t[2]===7)&&(t[3]===4||t[3]===6||t[3]===8)}async function R(e){let{options:t={},input:o,migrator:r,plugins:i}=e,n=ct(await at(o),t.sourceSelector?.files),a=ut(n);if(a){let[u]=await me({file:a,migrator:r,plugins:i,options:t});return{nmriumState:u,containsNmrium:!0,fileCollection:n}}let s=await w(n,i,t),c=F({version:10,data:s},t?.sourceSelector?.general,t.logger),{onLoadProcessing:l,experimentalFeatures:p}=t,m={...l,autoProcessing:l?.autoProcessing??!1,experimentalFeatures:p};return A({nmriumState:c,plugins:i,options:m}),{nmriumState:c,containsNmrium:!1,fileCollection:n}}function at(e){return Array.isArray(e)?Promise.reject(new Error("For a set of fileCollectionItems pass a FileCollection instance")):lt(e)?Promise.resolve(e):new st().appendExtendedSource({...e,uuid:crypto.randomUUID()})}function lt(e){return typeof e=="object"&&"files"in e}function ct(e,t){if(!t)return e;let o=new Set(t);return e.filter(r=>o.has(r.relativePath))}function ut(e){return e.files.find(t=>D(t.name).toLowerCase()===ce.NMRIUM)}import{FileCollection as Q}from"file-collection";async function fe(e){let t={},o=[];for(let r of e.sources)switch(r.relativePath){case".META-NMRIUM/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;case".META-NMRIUM/NMRIUM_ARCHIVE.json":o.push(r.text().then(i=>{t.archive=JSON.parse(i)}));break;case".META-NMRIUM/EMBED_ALL_DATA":t.embed=r;break;case".META-NMRIUM/USE_EXTERNAL_SOURCES":t.external=r;break;default:}return await Promise.all(o),t}function de(e){if(typeof e.version!="number"||Number.isNaN(e.version))throw new Error("Not a valid NMRium archive");if(!e.archive)throw new Error("Not a valid NMRium archive");if(!e.state)throw new Error("NMRium Archive corrupted, state.json is missing");if(!e.embed&&!e.external)throw new Error("NMRium Archive corrupted, no embedded data or external sources")}async function ge(e){let{options:t,plugins:o,migrator:r}=e,i=await Q.fromIum(e.input),n=await fe(i);de(n);let a=r(n.state),s={...a,data:{...a.data,spectra:[],molecules:[]}},c=s.data.spectra,l=s.data.molecules,p=pt(a.data.sources),m=mt(i,n.archive),u=[];for(let f of a.data.spectra)u.push(dt({archive:n,externalSources:p,embedFiles:m,unserializedSpectrum:f,spectraResult:c,options:t,plugins:o,migrator:r}));for(let f of a.data.molecules??[])u.push(gt({archive:n,externalSources:p,embedFiles:m,unserializedMolecule:f,moleculesResult:l,options:t,plugins:o,migrator:r}));await Promise.allSettled(u);let d=await ft(m,p);return[s,d]}function pt(e){e??=[];let t=new Map(e.map(r=>[r.id,r])),o=new Map;return{get(r){let i=t.get(r);if(!i)return;let n=o.get(r);return n||(n=Q.fromSource(i,{unzip:{zipExtensions:["zip","nmredata"]}}),o.set(r,n)),n},async all(){let r=new Map;return await Promise.all(U(o.entries(),async([i,n])=>{r.set(i,await n)})),r},[Symbol("debug")]:{sources:e,mapSources:t,fileCollections:o}}}function mt(e,t){let o=new Map,r=new Map(e.sources.map(i=>[i.relativePath,i]));return{get(i){let n=t[i];if(!n)return;let a=r.get(n.filePath);if(!a)return;let s=o.get(i);return s||(s=Q.fromIum(a.stream()),o.set(i,s)),s},async all(){let i=new Map;return await Promise.all(U(o.entries(),async([n,a])=>{i.set(n,await a)})),i},[Symbol("debug")]:{ium:e,record:t,iumSources:r,fileCollections:o}}}async function ft(e,t){let o=new Map;return await Promise.allSettled(U(await e.all(),async([r,i])=>{o.set(r,i)})),await Promise.allSettled(U(await t.all(),async([r,i])=>{o.has(r)||o.set(r,i)})),o}function*U(e,t){for(let o of e)yield t(o)}async function dt(e){let{archive:t,externalSources:o,embedFiles:r}=e,{unserializedSpectrum:i,spectraResult:n}=e,{options:a,plugins:s,migrator:c}=e,l=await Se({archive:t,externalSources:o,embedFiles:r,pickableInput:i});if(!l)return T({spectrum:i,spectraResult:n,logger:a?.logger});await E({input:l,unserializedSpectrum:i,spectraResult:n,options:a,plugins:s,migrator:c})}async function gt(e){let{archive:t,externalSources:o,embedFiles:r}=e,{unserializedMolecule:i,moleculesResult:n}=e,{options:a,plugins:s,migrator:c}=e,l=await Se({archive:t,externalSources:o,embedFiles:r,pickableInput:i});if(!l)return k({molecule:i,moleculesResult:n,logger:a?.logger});await z({input:l,unserializedMolecule:i,moleculesResult:n,options:a,plugins:s,migrator:c})}async function Se(e){let{archive:t,externalSources:o,embedFiles:r,pickableInput:i}=e,{fileCollectionId:n,sourceId:a}=i,s;return t.external&&a&&(s=await o.get(a)),!s&&t.external&&a&&n&&(s=await r.get(n)),!s&&t.embed&&n&&(s=await r.get(n)),s}import{FileCollection as St}from"file-collection";async function ye(e){let{source:t,plugins:o,options:r={}}=e,{converter:i,...n}=r,a={spectra:[],molecules:[]},s=await St.fromSource(t,{unzip:{zipExtensions:["zip","nmredata"]}}),{spectra:c=[],molecules:l=[]}=await w(s,o,{converter:{...i,bruker:{keepFiles:!0,...Reflect.get(i??{},"bruker")}},...n});a.spectra.push(...c),a.molecules.push(...l);let p=crypto.randomUUID(),m={...t,id:p};for(let g of a.spectra)g.sourceId=p;for(let g of a.molecules)g.sourceId=p;a.sources??=[],a.sources.push(m);let u=F({version:10,data:a},r?.sourceSelector?.general),{onLoadProcessing:d}=n,f={filters:d?.filters,autoProcessing:d?.autoProcessing??!1,experimentalFeatures:r.experimentalFeatures};return A({nmriumState:u,plugins:o,options:f}),[u,s]}function I(e,t){let o={};for(let r in e)t.includes(r)||(o[r]=e[r]);return o}var yt=["data","originalData","info","originalInfo","meta","customInfo"],Pt=["data","originalData","info","originalInfo","meta","customInfo"],xt=["sourceSelector","sourceId","fileCollectionId","originalData","originalInfo"];function Pe(e,t,o={}){let{version:r,data:i}=e;if(i.actionType)return e;let n={version:r,plugins:e.plugins},{includeData:a}=o;a!=="noData"&&(n.data=Nt({...i},a));let{includeSettings:s,includeView:c}=o;return s&&(n.settings=e.settings),c&&(n.view=e.view),b(n,t),n}function Nt(e,t="rawData"){let{spectra:o}=e;switch(t){case"dataSource":return ht(e);case"selfContained":case"selfContainedExternalDatasource":return bt(e);case"rawData":return{...I(e,["sources"]),spectra:o.map(Ct)};default:return e}}function ht(e){let{spectra:t}=e;if(!e.sources)throw new Error("sources property should exists for dataSource serialization");return{...e,spectra:t.map(Rt)}}function bt(e){let{spectra:t}=e;return{...e,spectra:t.map(It)}}function Rt(e){return I(e,yt)}function It(e){return I(e,Pt)}function Ct(e){let{data:t,info:o,originalData:r,originalInfo:i}=e,n=I(e,xt);return n.data=r||t,n.info=i||o,n}import{FileCollection as Ot}from"file-collection";async function Ne(e){let{spectra:t,molecules:o,fileCollections:r,serializedState:i,includeData:n=!0}=e,a=new Ot({filter:{ignoreDotfiles:!1}}),s=new Set,c=[];for(let l of t)xe({builder:a,fileCollections:r,fileCollectionId:l.fileCollectionId,includeData:n,alreadyAdded:s,asyncTasks:c});for(let l of o)xe({builder:a,fileCollections:r,fileCollectionId:l.fileCollectionId,includeData:n,alreadyAdded:s,asyncTasks:c});return await Promise.all(c),a.toIum({*getExtraFiles(){yield{relativePath:".META-NMRIUM/VERSION",data:"0"},yield{relativePath:"state.json",data:i},yield{relativePath:".META-NMRIUM/NMRIUM_ARCHIVE.json",data:JSON.stringify(Mt({fileCollections:r,toSerialize:s}),null,2)},n?yield{relativePath:".META-NMRIUM/EMBED_ALL_DATA",data:""}:yield{relativePath:".META-NMRIUM/USE_EXTERNAL_SOURCES",data:""},yield{relativePath:"index.txt",data:Dt({fileCollections:r,toIndex:s})}}})}function xe(e){let{builder:t,fileCollections:o,fileCollectionId:r,includeData:i,alreadyAdded:n,asyncTasks:a}=e;if(!r||n.has(r))return;let s=o[r];s&&(n.add(r),a.push(s.toIum({includeData:i}).then(c=>{let l=new Blob([c],{type:"application/zip"});return t.appendExtendedSource({uuid:r,name:r,relativePath:`${r}.ium.zip`,size:l.size,text:()=>l.text(),stream:()=>l.stream(),arrayBuffer:()=>l.arrayBuffer()},{unzip:{zipExtensions:[]}})})))}function Mt(e){let{fileCollections:t,toSerialize:o}=e,r={};for(let i of o){let n=t[i];if(!n)continue;let{logger:a,...s}=n.options;r[i]={sourceUUID:i,filePath:`${i}.ium.zip`,options:s}}return r}function Dt(e){let{fileCollections:t,toIndex:o}=e,r=[];for(let i of o){let n=t[i];if(n){r.push(`data/${i}.ium.zip`);for(let a of n.sources)r.push(` data/${a.relativePath}`);r.push(`
4
+ Please consider open this file with the plugin installed.`)}}let n=new Set,a=()=>{let s=r.version;for(let c of o.values())for(let l of c.migrations){if(n.has(l)||s<l.minCore||l.maxCore&&s>l.maxCore)continue;if((r.plugins?.[c.id]?.version||0)===c.version)break;r=l.up(r),n.add(l)}};for(let s=e?.version||0;s<t;s++){let c=qe[s];r=c(r),a()}return a(),b(r,o),r}var He=["topbar.right","topbar.about_us.modal"],Qe=[],$r=[...He,...Qe],et={},Q={};{let e=et,t=Q;for(let[o,r]of Object.entries(e))t[r]||(t[r]=[]),t[r]?.push(o)}function*ce(e){let{slot:t,plugins:o,supportedToDeprecatedSlots:r=Q}=e,i=r[t];for(let[n,a]of o.entries()){let s=a.ui;if(!s)continue;let c=s[t];if(c){yield[n,c];continue}if(i)for(let l of i){let p=a.ui?.[l];if(p){yield[n,p],console.warn(`Plugin ${a.id} used deprecated slot "${l}". Please update this plugin to use "${t}" instead.`);break}}}}import{FileCollection as lt}from"file-collection";var ue={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 v(e){return e.includes(".")?e.replace(/^.*\./,"").toLowerCase():""}function F(e,t={},o){let{data:r,...i}=e;if(!r)return e;let{spectra:n=[]}=r,{keep1D:a=!0,keep2D:s=!0,onlyReal:c}=t,l=c?"ft":t.dataSelection||"both",p=[];for(let m of n){if(!m.info){p.push(m);continue}let{isFid:u,dimension:d,name:f}=m.info;if(!D(d===1&&!a,f,o)&&!D(d===2&&!s,f,o)&&!D(u&&l==="ft",f,o)&&!D(!u&&l==="fid",f,o))if(c&&!u)if(m.info.isComplex=!1,tt(m)){let{rr:g}=m.data;p.push({...m,data:{rr:g}})}else{let{re:g,x:S}=m.data;p.push({...m,data:{re:g,x:S}})}else p.push(m)}return{data:{...r,spectra:p},...i}}function D(e,t,o){return e?(o?.warn(`Skipping ${t} because it didn't match the import filters.`),!0):!1}function tt(e){let{info:t}=e;return t?.dimension===2}function A(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 w(e,t,o={}){let{sourceSelector:r,converter:i,logger:n}=o,a=[],s=[];for(let u of t.values()){let{onReadProcess:d}=u;d&&(d?.onFiles&&a.push(u),d?.supportedExtensions?.length&&d?.onFile&&s.push(u))}let c=await Promise.allSettled(a.map(u=>u.onReadProcess.onFiles(e,o))),l=[],p=await Promise.allSettled(e.files.flatMap(u=>{let d=v(u.name).toLowerCase();return s.flatMap(f=>{let{supportedExtensions:g,onFile:S}=f.onReadProcess;return g.includes(d)?(l.push({file:u,plugin:f}),S(u,{logger:n,sourceSelector:r,converter:i})):[]})})),m={spectra:[],molecules:[]};for(let u=0;u<c.length;u++){let d=c[u];switch(d.status){case"fulfilled":{let{spectra:f=[],molecules:g=[]}=d.value||{};m.spectra.push(...f),m.molecules.push(...g);break}case"rejected":{let f=d.reason,g=a[u];o.logger?.error(`Load file collection with plugin ${g.id}@${g.version} fails with: ${f}`);break}}}for(let u=0;u<p.length;u++){let d=p[u];switch(d.status){case"fulfilled":{let{spectra:f=[],molecules:g=[]}=d.value||{};m.spectra.push(...f),m.molecules.push(...g);break}case"rejected":{let f=d.reason,{file:g,plugin:S}=l[u];o.logger?.error(`Load file ${g.relativePath} with plugin ${S.id}@${S.version} fails with: ${f}`);break}}}return m}import{FileCollection as nt}from"file-collection";import{FileCollection as it}from"file-collection";import pe from"lodash.merge";import{xIsEquallySpaced as rt}from"ml-spectra-processing";async function E(e){let{input:t,spectraResult:o,unserializedSpectrum:r,options:i,plugins:n,migrator:a}=e,c=(await R({input:t,migrator:a,plugins:n,options:{...i,sourceSelector:r.sourceSelector}}))?.nmriumState?.data?.spectra??[],l=c.pop();if(l){o.push(me(r,l));for(let p of c)o.push(me(r,ot(p)))}}function me(e,t){!e.fileCollectionId&&e.sourceId&&(e.fileCollectionId=e.sourceId),!t.fileCollectionId&&t.sourceId&&(t.fileCollectionId=t.sourceId);let{data:o,...r}=e;if("ranges"in t){let{data:i,...n}=t;return{...pe(n,r),data:i}}else if("zones"in t){let{data:i,...n}=t;return{...pe(n,r),data:i}}else return t}function ot(e){return{...e,id:N()}}function T(e){let{spectrum:t,spectraResult:o,logger:r}=e,{dimension:i}=t.info;if(i===1){if(!rt(t.data)){r?.error('The ".nmrium" file is corrupted; the X-axis values are not equally distant.');return}o.push(h(t))}else i===2&&o.push(C(t))}async function z(e){let{input:t,moleculesResult:o,unserializedMolecule:r,options:i,plugins:n,migrator:a}=e,{sourceSelector:s,sourceId:c}=r,p=(await R({input:t,migrator:a,plugins:n,options:{...i,sourceSelector:s}}))?.nmriumState?.data?.molecules??[];for(let m of p)o.push({...m,sourceId:c,fileCollectionId:c})}function k(e){let{molecule:t,moleculesResult:o}=e;o.push(t)}async function L(e){let{nmriumObjectInput:t,options:o={},migrator:r,plugins:i}=e,n=r(t),{data:a,...s}=n;if(!a)return[{...s},new Map];let c={data:{...a,spectra:[],molecules:[]},...s},l=c.data,{sources:p=[],spectra:m,molecules:u}=l,d=await Promise.all(p.map(async S=>{let y=await it.fromSource(S,{unzip:{zipExtensions:["zip","nmredata"]}});return[S.id,y]})),f=new Map(d),g=[];for(let S of a.spectra){let y=f.get(S.sourceId);if(!y){T({spectrum:S,spectraResult:m,logger:o.logger});continue}g.push(E({input:y,spectraResult:m,unserializedSpectrum:S,migrator:r,plugins:i,options:o}))}for(let S of a.molecules??[]){let y=f.get(S.sourceId);if(!y){k({molecule:S,moleculesResult:u,logger:o.logger});continue}g.push(z({input:y,unserializedMolecule:S,moleculesResult:u,migrator:r,plugins:i,options:o}))}return await Promise.allSettled(g),[c,f]}async function fe(e){let{file:t,options:o={},migrator:r,plugins:i}=e,n=await t.arrayBuffer(),a=await(at(n)?st(n):t.text());return L({nmriumObjectInput:JSON.parse(a),plugins:i,migrator:r,options:o})}async function st(e){let t=await nt.fromZip(e);if(t.files.length===0)throw new Error("compressed nmrium file is corrupted");return t.files[0].text()}function at(e){if(e.byteLength<4)return!1;let t=new Uint8Array(e);return t[0]===80&&t[1]===75&&(t[2]===3||t[2]===5||t[2]===7)&&(t[3]===4||t[3]===6||t[3]===8)}async function R(e){let{options:t={},input:o,migrator:r,plugins:i}=e,n=pt(await ct(o),t.sourceSelector?.files),a=mt(n);if(a){let[u]=await fe({file:a,migrator:r,plugins:i,options:t});return{nmriumState:u,containsNmrium:!0,fileCollection:n}}let s=await w(n,i,t),c=F({version:11,data:s},t?.sourceSelector?.general,t.logger),{onLoadProcessing:l,experimentalFeatures:p}=t,m={...l,autoProcessing:l?.autoProcessing??!1,experimentalFeatures:p};return A({nmriumState:c,plugins:i,options:m}),{nmriumState:c,containsNmrium:!1,fileCollection:n}}function ct(e){return Array.isArray(e)?Promise.reject(new Error("For a set of fileCollectionItems pass a FileCollection instance")):ut(e)?Promise.resolve(e):new lt().appendExtendedSource({...e,uuid:crypto.randomUUID()})}function ut(e){return typeof e=="object"&&"files"in e}function pt(e,t){if(!t)return e;let o=new Set(t);return e.filter(r=>o.has(r.relativePath))}function mt(e){return e.files.find(t=>v(t.name).toLowerCase()===ue.NMRIUM)}import{FileCollection as ee}from"file-collection";async function de(e){let t={},o=[];for(let r of e.sources)switch(r.relativePath){case".META-NMRIUM/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;case".META-NMRIUM/NMRIUM_ARCHIVE.json":o.push(r.text().then(i=>{t.archive=JSON.parse(i)}));break;case".META-NMRIUM/EMBED_ALL_DATA":t.embed=r;break;case".META-NMRIUM/USE_EXTERNAL_SOURCES":t.external=r;break;default:}return await Promise.all(o),t}function ge(e){if(typeof e.version!="number"||Number.isNaN(e.version))throw new Error("Not a valid NMRium archive");if(!e.archive)throw new Error("Not a valid NMRium archive");if(!e.state)throw new Error("NMRium Archive corrupted, state.json is missing");if(!e.embed&&!e.external)throw new Error("NMRium Archive corrupted, no embedded data or external sources")}async function Se(e){let{options:t,plugins:o,migrator:r}=e,i=await ee.fromIum(e.input),n=await de(i);ge(n);let a=r(n.state),s={...a,data:{...a.data,spectra:[],molecules:[]}},c=s.data.spectra,l=s.data.molecules,p=ft(a.data.sources),m=dt(i,n.archive),u=[];for(let f of a.data.spectra)u.push(St({archive:n,externalSources:p,embedFiles:m,unserializedSpectrum:f,spectraResult:c,options:t,plugins:o,migrator:r}));for(let f of a.data.molecules??[])u.push(yt({archive:n,externalSources:p,embedFiles:m,unserializedMolecule:f,moleculesResult:l,options:t,plugins:o,migrator:r}));await Promise.allSettled(u);let d=await gt(m,p);return[s,d]}function ft(e){e??=[];let t=new Map(e.map(r=>[r.id,r])),o=new Map;return{get(r){let i=t.get(r);if(!i)return;let n=o.get(r);return n||(n=ee.fromSource(i,{unzip:{zipExtensions:["zip","nmredata"]}}),o.set(r,n)),n},async all(){let r=new Map;return await Promise.all(U(o.entries(),async([i,n])=>{r.set(i,await n)})),r},[Symbol("debug")]:{sources:e,mapSources:t,fileCollections:o}}}function dt(e,t){let o=new Map,r=new Map(e.sources.map(i=>[i.relativePath,i]));return{get(i){let n=t[i];if(!n)return;let a=r.get(n.filePath);if(!a)return;let s=o.get(i);return s||(s=ee.fromIum(a.stream()),o.set(i,s)),s},async all(){let i=new Map;return await Promise.all(U(o.entries(),async([n,a])=>{i.set(n,await a)})),i},[Symbol("debug")]:{ium:e,record:t,iumSources:r,fileCollections:o}}}async function gt(e,t){let o=new Map;return await Promise.allSettled(U(await e.all(),async([r,i])=>{o.set(r,i)})),await Promise.allSettled(U(await t.all(),async([r,i])=>{o.has(r)||o.set(r,i)})),o}function*U(e,t){for(let o of e)yield t(o)}async function St(e){let{archive:t,externalSources:o,embedFiles:r}=e,{unserializedSpectrum:i,spectraResult:n}=e,{options:a,plugins:s,migrator:c}=e,l=await ye({archive:t,externalSources:o,embedFiles:r,pickableInput:i});if(!l)return T({spectrum:i,spectraResult:n,logger:a?.logger});await E({input:l,unserializedSpectrum:i,spectraResult:n,options:a,plugins:s,migrator:c})}async function yt(e){let{archive:t,externalSources:o,embedFiles:r}=e,{unserializedMolecule:i,moleculesResult:n}=e,{options:a,plugins:s,migrator:c}=e,l=await ye({archive:t,externalSources:o,embedFiles:r,pickableInput:i});if(!l)return k({molecule:i,moleculesResult:n,logger:a?.logger});await z({input:l,unserializedMolecule:i,moleculesResult:n,options:a,plugins:s,migrator:c})}async function ye(e){let{archive:t,externalSources:o,embedFiles:r,pickableInput:i}=e,{fileCollectionId:n,sourceId:a}=i,s;return t.external&&a&&(s=await o.get(a)),!s&&t.external&&a&&n&&(s=await r.get(n)),!s&&t.embed&&n&&(s=await r.get(n)),s}import{FileCollection as Pt}from"file-collection";async function Pe(e){let{source:t,plugins:o,options:r={}}=e,{converter:i,...n}=r,a={spectra:[],molecules:[]},s=await Pt.fromSource(t,{unzip:{zipExtensions:["zip","nmredata"]}}),{spectra:c=[],molecules:l=[]}=await w(s,o,{converter:{...i,bruker:{keepFiles:!0,...Reflect.get(i??{},"bruker")}},...n});a.spectra.push(...c),a.molecules.push(...l);let p=crypto.randomUUID(),m={...t,id:p};for(let g of a.spectra)g.sourceId=p;for(let g of a.molecules)g.sourceId=p;a.sources??=[],a.sources.push(m);let u=F({version:11,data:a},r?.sourceSelector?.general),{onLoadProcessing:d}=n,f={filters:d?.filters,autoProcessing:d?.autoProcessing??!1,experimentalFeatures:r.experimentalFeatures};return A({nmriumState:u,plugins:o,options:f}),[u,s]}function I(e,t){let o={};for(let r in e)t.includes(r)||(o[r]=e[r]);return o}var xt=["data","originalData","info","originalInfo","meta","customInfo"],Nt=["data","originalData","info","originalInfo","meta","customInfo"],ht=["sourceSelector","sourceId","fileCollectionId","originalData","originalInfo"];function xe(e,t,o={}){let{version:r,data:i}=e;if(i.actionType)return e;let n={version:r,plugins:e.plugins},{includeData:a}=o;a!=="noData"&&(n.data=bt({...i},a));let{includeSettings:s,includeView:c}=o;return s&&(n.settings=e.settings),c&&(n.view=e.view),b(n,t),n}function bt(e,t="rawData"){let{spectra:o}=e;switch(t){case"dataSource":return Rt(e);case"selfContained":case"selfContainedExternalDatasource":return It(e);case"rawData":return{...I(e,["sources"]),spectra:o.map(Mt)};default:return e}}function Rt(e){let{spectra:t}=e;if(!e.sources)throw new Error("sources property should exists for dataSource serialization");return{...e,spectra:t.map(Ct)}}function It(e){let{spectra:t}=e;return{...e,spectra:t.map(Ot)}}function Ct(e){return I(e,xt)}function Ot(e){return I(e,Nt)}function Mt(e){let{data:t,info:o,originalData:r,originalInfo:i}=e,n=I(e,ht);return n.data=r||t,n.info=i||o,n}import{FileCollection as vt}from"file-collection";async function he(e){let{spectra:t,molecules:o,fileCollections:r,serializedState:i,includeData:n=!0}=e,a=new vt({filter:{ignoreDotfiles:!1}}),s=new Set,c=[];for(let l of t)Ne({builder:a,fileCollections:r,fileCollectionId:l.fileCollectionId,includeData:n,alreadyAdded:s,asyncTasks:c});for(let l of o)Ne({builder:a,fileCollections:r,fileCollectionId:l.fileCollectionId,includeData:n,alreadyAdded:s,asyncTasks:c});return await Promise.all(c),a.toIum({*getExtraFiles(){yield{relativePath:".META-NMRIUM/VERSION",data:"0"},yield{relativePath:"state.json",data:i},yield{relativePath:".META-NMRIUM/NMRIUM_ARCHIVE.json",data:JSON.stringify(Dt({fileCollections:r,toSerialize:s}),null,2)},n?yield{relativePath:".META-NMRIUM/EMBED_ALL_DATA",data:""}:yield{relativePath:".META-NMRIUM/USE_EXTERNAL_SOURCES",data:""},yield{relativePath:"index.txt",data:Ft({fileCollections:r,toIndex:s})}}})}function Ne(e){let{builder:t,fileCollections:o,fileCollectionId:r,includeData:i,alreadyAdded:n,asyncTasks:a}=e;if(!r||n.has(r))return;let s=o[r];s&&(n.add(r),a.push(s.toIum({includeData:i}).then(c=>{let l=new Blob([c],{type:"application/zip"});return t.appendExtendedSource({uuid:r,name:r,relativePath:`${r}.ium.zip`,size:l.size,text:()=>l.text(),stream:()=>l.stream(),arrayBuffer:()=>l.arrayBuffer()},{unzip:{zipExtensions:[]}})})))}function Dt(e){let{fileCollections:t,toSerialize:o}=e,r={};for(let i of o){let n=t[i];if(!n)continue;let{logger:a,...s}=n.options;r[i]={sourceUUID:i,filePath:`${i}.ium.zip`,options:s}}return r}function Ft(e){let{fileCollections:t,toIndex:o}=e,r=[];for(let i of o){let n=t[i];if(n){r.push(`data/${i}.ium.zip`);for(let a of n.sources)r.push(` data/${a.relativePath}`);r.push(`
5
5
  `)}}return r.join(`
6
- `)}var ee=class{version=10;#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 ae(t,this.version,this.#e)}read(t,o={}){return R({input:t,migrator:this.migrate.bind(this),plugins:this.#e,options:o})}readNMRiumArchive(t,o={}){return ge({input:t,options:o,plugins:this.#e,migrator:this.migrate.bind(this)})}readNMRiumObject(t,o){return L({nmriumObjectInput:t,options:o,plugins:this.#e,migrator:this.migrate.bind(this)})}readFromWebSource(t,o){return ye({source:t,options:o,plugins:this.#e})}serializeNmriumState(t,o){return Pe(t,this.#e,o)}serializeNmriumArchive(t){return Ne(t)}serializePlugins(){let t={plugins:{}};return b(t,this.#e),t.plugins}slot(t){return le({slot:t,plugins:this.#e})}};function vt(e,t){if(t>10)return 0;let o=-1;for(let r=0;r<e.length;r++)if(e[r].version>t){o=r;break}return o}var he=[{version:6,fun:O},{version:7,fun:M}];function Ft(e){let{version:t}=e||{},o=vt(he,t);if(o===-1)return{...e,version:10};let r=he.slice(o);for(let i of r)e=i.fun(e);return e}export{be as ANALYSIS_COLUMN_TYPES,Re as ANALYSIS_COLUMN_VALUES_KEYS,P as CURRENT_EXPORT_VERSION,Ce as EXTERNAL_API_KEYS,ee as NMRiumCore,Be as defineNMRiumPlugin,_e as formatSpectra,N as generateID,_ as getOneIfArray,Ft as migrateSettings,Ie as units};
6
+ `)}var te=class{version=11;#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 le(t,this.version,this.#e)}read(t,o={}){return R({input:t,migrator:this.migrate.bind(this),plugins:this.#e,options:o})}readNMRiumArchive(t,o={}){return Se({input:t,options:o,plugins:this.#e,migrator:this.migrate.bind(this)})}readNMRiumObject(t,o){return L({nmriumObjectInput:t,options:o,plugins:this.#e,migrator:this.migrate.bind(this)})}readFromWebSource(t,o){return Pe({source:t,options:o,plugins:this.#e})}serializeNmriumState(t,o){return xe(t,this.#e,o)}serializeNmriumArchive(t){return he(t)}serializePlugins(){let t={plugins:{}};return b(t,this.#e),t.plugins}slot(t){return ce({slot:t,plugins:this.#e})}};function At(e,t){if(t>11)return 0;let o=-1;for(let r=0;r<e.length;r++)if(e[r].version>t){o=r;break}return o}var be=[{version:6,fun:O},{version:7,fun:M}];function wt(e){let{version:t}=e||{},o=At(be,t);if(o===-1)return{...e,version:11};let r=be.slice(o);for(let i of r)e=i.fun(e);return e}export{Re as ANALYSIS_COLUMN_TYPES,Ie as ANALYSIS_COLUMN_VALUES_KEYS,P as CURRENT_EXPORT_VERSION,Oe as EXTERNAL_API_KEYS,te as NMRiumCore,Ke as defineNMRiumPlugin,Be as formatSpectra,N as generateID,_ as getOneIfArray,wt as migrateSettings,Ce as units};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zakodium/nmrium-core",
3
- "version": "0.4.6",
3
+ "version": "0.4.7",
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": "95e420a71f11d29f770b0b2d71ac1b9ba0b45ac2"
48
+ "gitHead": "b38eec0f45c19f73ef4b6b6eb3190ac6cbc43ac1"
49
49
  }