react-cheminfo 0.64.1 → 0.66.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +293 -6
- package/lib/card/core/cardAddress.d.ts +70 -0
- package/lib/card/core/cardAddress.d.ts.map +1 -0
- package/lib/card/core/cardAddress.js +59 -0
- package/lib/card/core/cardAddress.js.map +1 -0
- package/lib/card/core/cardPageUrl.d.ts +49 -0
- package/lib/card/core/cardPageUrl.d.ts.map +1 -0
- package/lib/card/core/cardPageUrl.js +59 -0
- package/lib/card/core/cardPageUrl.js.map +1 -0
- package/lib/card/core/index.d.ts +7 -0
- package/lib/card/core/index.d.ts.map +1 -0
- package/lib/card/core/index.js +4 -0
- package/lib/card/core/index.js.map +1 -0
- package/lib/card/core/panelRoom.d.ts +40 -0
- package/lib/card/core/panelRoom.d.ts.map +1 -0
- package/lib/card/core/panelRoom.js +40 -0
- package/lib/card/core/panelRoom.js.map +1 -0
- package/lib/card/ui/CardDetailsButton.d.ts +38 -0
- package/lib/card/ui/CardDetailsButton.d.ts.map +1 -0
- package/lib/card/ui/CardDetailsButton.js +50 -0
- package/lib/card/ui/CardDetailsButton.js.map +1 -0
- package/lib/card/ui/CardFigure.d.ts +51 -0
- package/lib/card/ui/CardFigure.d.ts.map +1 -0
- package/lib/card/ui/CardFigure.js +27 -0
- package/lib/card/ui/CardFigure.js.map +1 -0
- package/lib/card/ui/CardFrame.d.ts +30 -0
- package/lib/card/ui/CardFrame.d.ts.map +1 -0
- package/lib/card/ui/CardFrame.js +20 -0
- package/lib/card/ui/CardFrame.js.map +1 -0
- package/lib/card/ui/CopyTableButton.d.ts +37 -0
- package/lib/card/ui/CopyTableButton.d.ts.map +1 -0
- package/lib/card/ui/CopyTableButton.js +19 -0
- package/lib/card/ui/CopyTableButton.js.map +1 -0
- package/lib/card/ui/cardTooltip.d.ts +14 -0
- package/lib/card/ui/cardTooltip.d.ts.map +1 -0
- package/lib/card/ui/cardTooltip.js +15 -0
- package/lib/card/ui/cardTooltip.js.map +1 -0
- package/lib/card/ui/embed.d.ts +15 -0
- package/lib/card/ui/embed.d.ts.map +1 -0
- package/lib/card/ui/embed.js +24 -0
- package/lib/card/ui/embed.js.map +1 -0
- package/lib/card/ui/fitCardToFrame.d.ts +31 -0
- package/lib/card/ui/fitCardToFrame.d.ts.map +1 -0
- package/lib/card/ui/fitCardToFrame.js +66 -0
- package/lib/card/ui/fitCardToFrame.js.map +1 -0
- package/lib/card/ui/holdRoomForPanels.d.ts +16 -0
- package/lib/card/ui/holdRoomForPanels.d.ts.map +1 -0
- package/lib/card/ui/holdRoomForPanels.js +76 -0
- package/lib/card/ui/holdRoomForPanels.js.map +1 -0
- package/lib/card/ui/index.d.ts +11 -0
- package/lib/card/ui/index.d.ts.map +1 -0
- package/lib/card/ui/index.js +7 -0
- package/lib/card/ui/index.js.map +1 -0
- package/lib/card/ui/openPanels.d.ts +25 -0
- package/lib/card/ui/openPanels.d.ts.map +1 -0
- package/lib/card/ui/openPanels.js +85 -0
- package/lib/card/ui/openPanels.js.map +1 -0
- package/lib/card.d.ts +13 -0
- package/lib/card.d.ts.map +1 -0
- package/lib/card.js +13 -0
- package/lib/card.js.map +1 -0
- package/lib/conformers.d.ts +1 -0
- package/lib/conformers.d.ts.map +1 -1
- package/lib/conformers.js +1 -0
- package/lib/conformers.js.map +1 -1
- package/lib/core.d.ts +4 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +5 -0
- package/lib/core.js.map +1 -1
- package/lib/fetch/core/apiError.d.ts +56 -0
- package/lib/fetch/core/apiError.d.ts.map +1 -0
- package/lib/fetch/core/apiError.js +43 -0
- package/lib/fetch/core/apiError.js.map +1 -0
- package/lib/fetch/core/fetchJson.d.ts +47 -0
- package/lib/fetch/core/fetchJson.d.ts.map +1 -0
- package/lib/fetch/core/fetchJson.js +109 -0
- package/lib/fetch/core/fetchJson.js.map +1 -0
- package/lib/fetch/core/index.d.ts +5 -0
- package/lib/fetch/core/index.d.ts.map +1 -0
- package/lib/fetch/core/index.js +3 -0
- package/lib/fetch/core/index.js.map +1 -0
- package/lib/formula/core/formulaText.d.ts +46 -0
- package/lib/formula/core/formulaText.d.ts.map +1 -0
- package/lib/formula/core/formulaText.js +74 -0
- package/lib/formula/core/formulaText.js.map +1 -0
- package/lib/formula/core/index.d.ts +6 -0
- package/lib/formula/core/index.d.ts.map +1 -0
- package/lib/formula/core/index.js +4 -0
- package/lib/formula/core/index.js.map +1 -0
- package/lib/formula/core/normalizeFormula.d.ts +22 -0
- package/lib/formula/core/normalizeFormula.d.ts.map +1 -0
- package/lib/formula/core/normalizeFormula.js +46 -0
- package/lib/formula/core/normalizeFormula.js.map +1 -0
- package/lib/formula/core/readFormula.d.ts +73 -0
- package/lib/formula/core/readFormula.d.ts.map +1 -0
- package/lib/formula/core/readFormula.js +132 -0
- package/lib/formula/core/readFormula.js.map +1 -0
- package/lib/formula/ui/CopyableFormula.d.ts +31 -0
- package/lib/formula/ui/CopyableFormula.d.ts.map +1 -0
- package/lib/formula/ui/CopyableFormula.js +19 -0
- package/lib/formula/ui/CopyableFormula.js.map +1 -0
- package/lib/formula/ui/FormulaInput.d.ts +29 -0
- package/lib/formula/ui/FormulaInput.d.ts.map +1 -0
- package/lib/formula/ui/FormulaInput.js +16 -0
- package/lib/formula/ui/FormulaInput.js.map +1 -0
- package/lib/formula/ui/QuestionFormula.d.ts +14 -0
- package/lib/formula/ui/QuestionFormula.d.ts.map +1 -0
- package/lib/formula/ui/QuestionFormula.js +13 -0
- package/lib/formula/ui/QuestionFormula.js.map +1 -0
- package/lib/formula/ui/index.d.ts +7 -0
- package/lib/formula/ui/index.d.ts.map +1 -0
- package/lib/formula/ui/index.js +4 -0
- package/lib/formula/ui/index.js.map +1 -0
- package/lib/formula.d.ts +11 -0
- package/lib/formula.d.ts.map +1 -0
- package/lib/formula.js +11 -0
- package/lib/formula.js.map +1 -0
- package/lib/hooks/ui/index.d.ts +1 -0
- package/lib/hooks/ui/index.d.ts.map +1 -1
- package/lib/hooks/ui/index.js.map +1 -1
- package/lib/hooks/ui/keyTargets.d.ts +4 -2
- package/lib/hooks/ui/keyTargets.d.ts.map +1 -1
- package/lib/hooks/ui/keyTargets.js +5 -3
- package/lib/hooks/ui/keyTargets.js.map +1 -1
- package/lib/hooks/ui/useAsync.d.ts +20 -5
- package/lib/hooks/ui/useAsync.d.ts.map +1 -1
- package/lib/hooks/ui/useAsync.js +29 -14
- package/lib/hooks/ui/useAsync.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/ir/core/analysisSpectra.d.ts +23 -6
- package/lib/ir/core/analysisSpectra.d.ts.map +1 -1
- package/lib/ir/core/analysisSpectra.js.map +1 -1
- package/lib/ir/core/bandLabelPlan.d.ts.map +1 -1
- package/lib/ir/core/bandLabelPlan.js +11 -6
- package/lib/ir/core/bandLabelPlan.js.map +1 -1
- package/lib/ir/core/index.d.ts +13 -9
- package/lib/ir/core/index.d.ts.map +1 -1
- package/lib/ir/core/index.js +9 -6
- package/lib/ir/core/index.js.map +1 -1
- package/lib/ir/core/irBand.d.ts +45 -14
- package/lib/ir/core/irBand.d.ts.map +1 -1
- package/lib/ir/core/irBand.js +28 -6
- package/lib/ir/core/irBand.js.map +1 -1
- package/lib/ir/core/irCommands.d.ts +11 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -1
- package/lib/ir/core/irCommands.js +11 -1
- package/lib/ir/core/irCommands.js.map +1 -1
- package/lib/ir/core/irDomain.d.ts +4 -3
- package/lib/ir/core/irDomain.d.ts.map +1 -1
- package/lib/ir/core/irDomain.js +10 -7
- package/lib/ir/core/irDomain.js.map +1 -1
- package/lib/ir/core/irFormat.d.ts +14 -2
- package/lib/ir/core/irFormat.d.ts.map +1 -1
- package/lib/ir/core/irFormat.js +33 -4
- package/lib/ir/core/irFormat.js.map +1 -1
- package/lib/ir/core/irMode.d.ts +35 -8
- package/lib/ir/core/irMode.d.ts.map +1 -1
- package/lib/ir/core/irMode.js +38 -10
- package/lib/ir/core/irMode.js.map +1 -1
- package/lib/ir/core/irReducer.d.ts +0 -28
- package/lib/ir/core/irReducer.d.ts.map +1 -1
- package/lib/ir/core/irReducer.js +1 -24
- package/lib/ir/core/irReducer.js.map +1 -1
- package/lib/ir/core/irSpectrum.d.ts +52 -26
- package/lib/ir/core/irSpectrum.d.ts.map +1 -1
- package/lib/ir/core/irSpectrum.js +21 -15
- package/lib/ir/core/irSpectrum.js.map +1 -1
- package/lib/ir/core/irState.d.ts +40 -2
- package/lib/ir/core/irState.d.ts.map +1 -1
- package/lib/ir/core/irState.js +38 -1
- package/lib/ir/core/irState.js.map +1 -1
- package/lib/ir/core/irTechnique.d.ts +94 -0
- package/lib/ir/core/irTechnique.d.ts.map +1 -0
- package/lib/ir/core/irTechnique.js +87 -0
- package/lib/ir/core/irTechnique.js.map +1 -0
- package/lib/ir/core/irTechniqueCommands.d.ts +26 -0
- package/lib/ir/core/irTechniqueCommands.d.ts.map +1 -0
- package/lib/ir/core/irTechniqueCommands.js +68 -0
- package/lib/ir/core/irTechniqueCommands.js.map +1 -0
- package/lib/ir/core/pickBands.d.ts +6 -5
- package/lib/ir/core/pickBands.d.ts.map +1 -1
- package/lib/ir/core/pickBands.js +49 -26
- package/lib/ir/core/pickBands.js.map +1 -1
- package/lib/ir/core/ramanBands.d.ts +30 -0
- package/lib/ir/core/ramanBands.d.ts.map +1 -0
- package/lib/ir/core/ramanBands.js +83 -0
- package/lib/ir/core/ramanBands.js.map +1 -0
- package/lib/ir/core/spectrumJcamp.d.ts +10 -5
- package/lib/ir/core/spectrumJcamp.d.ts.map +1 -1
- package/lib/ir/core/spectrumJcamp.js +63 -15
- package/lib/ir/core/spectrumJcamp.js.map +1 -1
- package/lib/ir/core/toIrSpectrum.d.ts.map +1 -1
- package/lib/ir/core/toIrSpectrum.js +17 -2
- package/lib/ir/core/toIrSpectrum.js.map +1 -1
- package/lib/ir/ui/BandRow.d.ts +30 -0
- package/lib/ir/ui/BandRow.d.ts.map +1 -0
- package/lib/ir/ui/BandRow.js +42 -0
- package/lib/ir/ui/BandRow.js.map +1 -0
- package/lib/ir/ui/BandsPanel.d.ts +4 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
- package/lib/ir/ui/BandsPanel.js +14 -59
- package/lib/ir/ui/BandsPanel.js.map +1 -1
- package/lib/ir/ui/IrAboutDialog.d.ts +7 -0
- package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -1
- package/lib/ir/ui/IrAboutDialog.js +16 -3
- package/lib/ir/ui/IrAboutDialog.js.map +1 -1
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
- package/lib/ir/ui/IrCanvas.js +2 -2
- package/lib/ir/ui/IrCanvas.js.map +1 -1
- package/lib/ir/ui/IrChart.d.ts +2 -1
- package/lib/ir/ui/IrChart.d.ts.map +1 -1
- package/lib/ir/ui/IrChart.js +18 -21
- package/lib/ir/ui/IrChart.js.map +1 -1
- package/lib/ir/ui/IrCommandProvider.d.ts +7 -0
- package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -1
- package/lib/ir/ui/IrCommandProvider.js +2 -2
- package/lib/ir/ui/IrCommandProvider.js.map +1 -1
- package/lib/ir/ui/IrCommandTooltip.d.ts +7 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -1
- package/lib/ir/ui/IrCommandTooltip.js +3 -2
- package/lib/ir/ui/IrCommandTooltip.js.map +1 -1
- package/lib/ir/ui/IrDocumentationDialog.d.ts +8 -1
- package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -1
- package/lib/ir/ui/IrDocumentationDialog.js +30 -7
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
- package/lib/ir/ui/IrEditor.d.ts +3 -1
- package/lib/ir/ui/IrEditor.d.ts.map +1 -1
- package/lib/ir/ui/IrEditor.js +3 -20
- package/lib/ir/ui/IrEditor.js.map +1 -1
- package/lib/ir/ui/IrHeader.d.ts.map +1 -1
- package/lib/ir/ui/IrHeader.js +5 -1
- package/lib/ir/ui/IrHeader.js.map +1 -1
- package/lib/ir/ui/IrLogo.d.ts +11 -3
- package/lib/ir/ui/IrLogo.d.ts.map +1 -1
- package/lib/ir/ui/IrLogo.js +14 -5
- package/lib/ir/ui/IrLogo.js.map +1 -1
- package/lib/ir/ui/IrShell.d.ts.map +1 -1
- package/lib/ir/ui/IrShell.js +23 -56
- package/lib/ir/ui/IrShell.js.map +1 -1
- package/lib/ir/ui/IrStatusBar.d.ts +3 -2
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
- package/lib/ir/ui/IrStatusBar.js +14 -9
- package/lib/ir/ui/IrStatusBar.js.map +1 -1
- package/lib/ir/ui/IrToolbar.d.ts +3 -0
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
- package/lib/ir/ui/IrToolbar.js +10 -3
- package/lib/ir/ui/IrToolbar.js.map +1 -1
- package/lib/ir/ui/IrTraces.d.ts +4 -1
- package/lib/ir/ui/IrTraces.d.ts.map +1 -1
- package/lib/ir/ui/IrTraces.js +2 -0
- package/lib/ir/ui/IrTraces.js.map +1 -1
- package/lib/ir/ui/RamanEditor.d.ts +46 -0
- package/lib/ir/ui/RamanEditor.d.ts.map +1 -0
- package/lib/ir/ui/RamanEditor.js +17 -0
- package/lib/ir/ui/RamanEditor.js.map +1 -0
- package/lib/ir/ui/SpectraPanel.d.ts.map +1 -1
- package/lib/ir/ui/SpectraPanel.js +2 -2
- package/lib/ir/ui/SpectraPanel.js.map +1 -1
- package/lib/ir/ui/SpectrumRow.d.ts +7 -0
- package/lib/ir/ui/SpectrumRow.d.ts.map +1 -1
- package/lib/ir/ui/SpectrumRow.js +4 -5
- package/lib/ir/ui/SpectrumRow.js.map +1 -1
- package/lib/ir/ui/VibrationalEditor.d.ts +48 -0
- package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -0
- package/lib/ir/ui/VibrationalEditor.js +31 -0
- package/lib/ir/ui/VibrationalEditor.js.map +1 -0
- package/lib/ir/ui/bandsTsv.d.ts +19 -0
- package/lib/ir/ui/bandsTsv.d.ts.map +1 -0
- package/lib/ir/ui/bandsTsv.js +38 -0
- package/lib/ir/ui/bandsTsv.js.map +1 -0
- package/lib/ir/ui/irChartProps.d.ts +14 -4
- package/lib/ir/ui/irChartProps.d.ts.map +1 -1
- package/lib/ir/ui/irChartProps.js +3 -2
- package/lib/ir/ui/irChartProps.js.map +1 -1
- package/lib/ir/ui/irCommandContext.d.ts +8 -0
- package/lib/ir/ui/irCommandContext.d.ts.map +1 -1
- package/lib/ir/ui/irCommandContext.js +14 -3
- package/lib/ir/ui/irCommandContext.js.map +1 -1
- package/lib/ir/ui/useIrEditor.d.ts +3 -3
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
- package/lib/ir/ui/useIrEditor.js +13 -4
- package/lib/ir/ui/useIrEditor.js.map +1 -1
- package/lib/ir/ui/useIrHandle.d.ts +14 -0
- package/lib/ir/ui/useIrHandle.d.ts.map +1 -0
- package/lib/ir/ui/useIrHandle.js +39 -0
- package/lib/ir/ui/useIrHandle.js.map +1 -0
- package/lib/ir/ui/useIrText.d.ts +40 -0
- package/lib/ir/ui/useIrText.d.ts.map +1 -0
- package/lib/ir/ui/useIrText.js +118 -0
- package/lib/ir/ui/useIrText.js.map +1 -0
- package/lib/ir/ui/useIrZoom.d.ts +7 -0
- package/lib/ir/ui/useIrZoom.d.ts.map +1 -1
- package/lib/ir/ui/useIrZoom.js +5 -4
- package/lib/ir/ui/useIrZoom.js.map +1 -1
- package/lib/ir/ui/useValueAxisZoom.d.ts +20 -0
- package/lib/ir/ui/useValueAxisZoom.d.ts.map +1 -0
- package/lib/ir/ui/useValueAxisZoom.js +54 -0
- package/lib/ir/ui/useValueAxisZoom.js.map +1 -0
- package/lib/ir.d.ts +3 -0
- package/lib/ir.d.ts.map +1 -1
- package/lib/ir.js +3 -0
- package/lib/ir.js.map +1 -1
- package/lib/locales/de.json +57 -1
- package/lib/locales/en.json +57 -1
- package/lib/locales/es.json +57 -1
- package/lib/locales/fr.json +57 -1
- package/lib/locales/it.json +57 -1
- package/lib/moleculesClient/core/index.d.ts +5 -0
- package/lib/moleculesClient/core/index.d.ts.map +1 -0
- package/lib/moleculesClient/core/index.js +3 -0
- package/lib/moleculesClient/core/index.js.map +1 -0
- package/lib/moleculesClient/core/moleculesClient.d.ts +12 -0
- package/lib/moleculesClient/core/moleculesClient.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesClient.js +105 -0
- package/lib/moleculesClient/core/moleculesClient.js.map +1 -0
- package/lib/moleculesClient/core/moleculesClientApi.d.ts +100 -0
- package/lib/moleculesClient/core/moleculesClientApi.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesClientApi.js +20 -0
- package/lib/moleculesClient/core/moleculesClientApi.js.map +1 -0
- package/lib/moleculesClient/core/moleculesTypes.d.ts +154 -0
- package/lib/moleculesClient/core/moleculesTypes.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesTypes.js +2 -0
- package/lib/moleculesClient/core/moleculesTypes.js.map +1 -0
- package/lib/moleculesClient/core/requestRetry.d.ts +50 -0
- package/lib/moleculesClient/core/requestRetry.d.ts.map +1 -0
- package/lib/moleculesClient/core/requestRetry.js +108 -0
- package/lib/moleculesClient/core/requestRetry.js.map +1 -0
- package/lib/molstar/core/camera.d.ts +2 -1
- package/lib/molstar/core/camera.d.ts.map +1 -1
- package/lib/molstar/core/camera.js +3 -2
- package/lib/molstar/core/camera.js.map +1 -1
- package/lib/molstar/core/framing.d.ts +102 -0
- package/lib/molstar/core/framing.d.ts.map +1 -0
- package/lib/molstar/core/framing.js +120 -0
- package/lib/molstar/core/framing.js.map +1 -0
- package/lib/molstar/core/hover.d.ts +16 -0
- package/lib/molstar/core/hover.d.ts.map +1 -1
- package/lib/molstar/core/hover.js +14 -0
- package/lib/molstar/core/hover.js.map +1 -1
- package/lib/molstar/core/index.d.ts +4 -1
- package/lib/molstar/core/index.d.ts.map +1 -1
- package/lib/molstar/core/index.js +2 -1
- package/lib/molstar/core/index.js.map +1 -1
- package/lib/pedagogy/core/answers.d.ts +46 -0
- package/lib/pedagogy/core/answers.d.ts.map +1 -0
- package/lib/pedagogy/core/answers.js +77 -0
- package/lib/pedagogy/core/answers.js.map +1 -0
- package/lib/pedagogy/core/attempts.d.ts +86 -0
- package/lib/pedagogy/core/attempts.d.ts.map +1 -0
- package/lib/pedagogy/core/attempts.js +117 -0
- package/lib/pedagogy/core/attempts.js.map +1 -0
- package/lib/pedagogy/core/index.d.ts +8 -0
- package/lib/pedagogy/core/index.d.ts.map +1 -1
- package/lib/pedagogy/core/index.js +4 -0
- package/lib/pedagogy/core/index.js.map +1 -1
- package/lib/pedagogy/core/progressController.d.ts +64 -0
- package/lib/pedagogy/core/progressController.d.ts.map +1 -0
- package/lib/pedagogy/core/progressController.js +56 -0
- package/lib/pedagogy/core/progressController.js.map +1 -0
- package/lib/pedagogy/core/seed.d.ts +96 -0
- package/lib/pedagogy/core/seed.d.ts.map +1 -0
- package/lib/pedagogy/core/seed.js +128 -0
- package/lib/pedagogy/core/seed.js.map +1 -0
- package/lib/pedagogy/core/series.d.ts +77 -0
- package/lib/pedagogy/core/series.d.ts.map +1 -0
- package/lib/pedagogy/core/series.js +10 -0
- package/lib/pedagogy/core/series.js.map +1 -0
- package/lib/pedagogy/ui/AnswerFields.d.ts +21 -0
- package/lib/pedagogy/ui/AnswerFields.d.ts.map +1 -0
- package/lib/pedagogy/ui/AnswerFields.js +24 -0
- package/lib/pedagogy/ui/AnswerFields.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseList.d.ts +82 -0
- package/lib/pedagogy/ui/ExerciseList.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseList.js +53 -0
- package/lib/pedagogy/ui/ExerciseList.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseSeries.d.ts +95 -0
- package/lib/pedagogy/ui/ExerciseSeries.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseSeries.js +74 -0
- package/lib/pedagogy/ui/ExerciseSeries.js.map +1 -0
- package/lib/pedagogy/ui/QuestionCard.d.ts +64 -0
- package/lib/pedagogy/ui/QuestionCard.d.ts.map +1 -0
- package/lib/pedagogy/ui/QuestionCard.js +73 -0
- package/lib/pedagogy/ui/QuestionCard.js.map +1 -0
- package/lib/pedagogy/ui/index.d.ts +10 -0
- package/lib/pedagogy/ui/index.d.ts.map +1 -1
- package/lib/pedagogy/ui/index.js +6 -0
- package/lib/pedagogy/ui/index.js.map +1 -1
- package/lib/pedagogy/ui/seriesCounts.d.ts +17 -0
- package/lib/pedagogy/ui/seriesCounts.d.ts.map +1 -0
- package/lib/pedagogy/ui/seriesCounts.js +27 -0
- package/lib/pedagogy/ui/seriesCounts.js.map +1 -0
- package/lib/pedagogy/ui/seriesParts.d.ts +55 -0
- package/lib/pedagogy/ui/seriesParts.d.ts.map +1 -0
- package/lib/pedagogy/ui/seriesParts.js +38 -0
- package/lib/pedagogy/ui/seriesParts.js.map +1 -0
- package/lib/pedagogy/ui/useAttemptRecords.d.ts +10 -0
- package/lib/pedagogy/ui/useAttemptRecords.d.ts.map +1 -0
- package/lib/pedagogy/ui/useAttemptRecords.js +11 -0
- package/lib/pedagogy/ui/useAttemptRecords.js.map +1 -0
- package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
- package/lib/periodic/ui/PeriodicTable.js +6 -3
- package/lib/periodic/ui/PeriodicTable.js.map +1 -1
- package/lib/property/core/copyableText.d.ts +14 -0
- package/lib/property/core/copyableText.d.ts.map +1 -0
- package/lib/property/core/copyableText.js +21 -0
- package/lib/property/core/copyableText.js.map +1 -0
- package/lib/property/core/index.d.ts +2 -0
- package/lib/property/core/index.d.ts.map +1 -0
- package/lib/property/core/index.js +2 -0
- package/lib/property/core/index.js.map +1 -0
- package/lib/property/ui/PropertyTable.d.ts +43 -0
- package/lib/property/ui/PropertyTable.d.ts.map +1 -0
- package/lib/property/ui/PropertyTable.js +19 -0
- package/lib/property/ui/PropertyTable.js.map +1 -0
- package/lib/property/ui/index.d.ts +3 -0
- package/lib/property/ui/index.d.ts.map +1 -0
- package/lib/property/ui/index.js +2 -0
- package/lib/property/ui/index.js.map +1 -0
- package/lib/raman.d.ts +16 -0
- package/lib/raman.d.ts.map +1 -0
- package/lib/raman.js +12 -0
- package/lib/raman.js.map +1 -0
- package/lib/router/core/history.d.ts +24 -3
- package/lib/router/core/history.d.ts.map +1 -1
- package/lib/router/core/history.js +55 -7
- package/lib/router/core/history.js.map +1 -1
- package/lib/router/core/index.d.ts +3 -3
- package/lib/router/core/index.d.ts.map +1 -1
- package/lib/router/core/index.js +2 -2
- package/lib/router/core/index.js.map +1 -1
- package/lib/router/core/languageRoute.d.ts +61 -0
- package/lib/router/core/languageRoute.d.ts.map +1 -0
- package/lib/router/core/languageRoute.js +96 -0
- package/lib/router/core/languageRoute.js.map +1 -0
- package/lib/router/core/siteAddresses.d.ts +23 -0
- package/lib/router/core/siteAddresses.d.ts.map +1 -1
- package/lib/router/core/siteAddresses.js +26 -0
- package/lib/router/core/siteAddresses.js.map +1 -1
- package/lib/router/core/tabRouter.d.ts +2 -108
- package/lib/router/core/tabRouter.d.ts.map +1 -1
- package/lib/router/core/tabRouter.js +38 -5
- package/lib/router/core/tabRouter.js.map +1 -1
- package/lib/router/core/tabRouterTypes.d.ts +154 -0
- package/lib/router/core/tabRouterTypes.d.ts.map +1 -0
- package/lib/router/core/tabRouterTypes.js +2 -0
- package/lib/router/core/tabRouterTypes.js.map +1 -0
- package/lib/seo/core/fitDescription.d.ts +40 -0
- package/lib/seo/core/fitDescription.d.ts.map +1 -0
- package/lib/seo/core/fitDescription.js +45 -0
- package/lib/seo/core/fitDescription.js.map +1 -0
- package/lib/seo/core/index.d.ts +7 -0
- package/lib/seo/core/index.d.ts.map +1 -1
- package/lib/seo/core/index.js +4 -0
- package/lib/seo/core/index.js.map +1 -1
- package/lib/seo/core/limits.d.ts +24 -0
- package/lib/seo/core/limits.d.ts.map +1 -0
- package/lib/seo/core/limits.js +24 -0
- package/lib/seo/core/limits.js.map +1 -0
- package/lib/seo/core/pageContent.d.ts +25 -0
- package/lib/seo/core/pageContent.d.ts.map +1 -0
- package/lib/seo/core/pageContent.js +25 -0
- package/lib/seo/core/pageContent.js.map +1 -0
- package/lib/seo/core/plainDescription.d.ts.map +1 -1
- package/lib/seo/core/plainDescription.js +3 -2
- package/lib/seo/core/plainDescription.js.map +1 -1
- package/lib/seo/core/routeProblems.d.ts.map +1 -1
- package/lib/seo/core/routeProblems.js +1 -6
- package/lib/seo/core/routeProblems.js.map +1 -1
- package/lib/seo/core/routeTable.d.ts +31 -0
- package/lib/seo/core/routeTable.d.ts.map +1 -0
- package/lib/seo/core/routeTable.js +96 -0
- package/lib/seo/core/routeTable.js.map +1 -0
- package/lib/seo/vite/index.d.ts +2 -0
- package/lib/seo/vite/index.d.ts.map +1 -1
- package/lib/seo/vite/index.js +1 -0
- package/lib/seo/vite/index.js.map +1 -1
- package/lib/seo/vite/prerender.d.ts +10 -0
- package/lib/seo/vite/prerender.d.ts.map +1 -1
- package/lib/seo/vite/prerender.js +12 -1
- package/lib/seo/vite/prerender.js.map +1 -1
- package/lib/seo/vite/routeTable.d.ts +40 -0
- package/lib/seo/vite/routeTable.d.ts.map +1 -0
- package/lib/seo/vite/routeTable.js +44 -0
- package/lib/seo/vite/routeTable.js.map +1 -0
- package/lib/server/answerAddresses.d.ts +51 -0
- package/lib/server/answerAddresses.d.ts.map +1 -0
- package/lib/server/answerAddresses.js +72 -0
- package/lib/server/answerAddresses.js.map +1 -0
- package/lib/server/cardMeta.d.ts +57 -0
- package/lib/server/cardMeta.d.ts.map +1 -0
- package/lib/server/cardMeta.js +52 -0
- package/lib/server/cardMeta.js.map +1 -0
- package/lib/server/config.d.ts +72 -0
- package/lib/server/config.d.ts.map +1 -0
- package/lib/server/config.js +67 -0
- package/lib/server/config.js.map +1 -0
- package/lib/server/envNumber.d.ts +35 -0
- package/lib/server/envNumber.d.ts.map +1 -0
- package/lib/server/envNumber.js +42 -0
- package/lib/server/envNumber.js.map +1 -0
- package/lib/server/healthRoute.d.ts +26 -0
- package/lib/server/healthRoute.d.ts.map +1 -0
- package/lib/server/healthRoute.js +22 -0
- package/lib/server/healthRoute.js.map +1 -0
- package/lib/server/listenSite.d.ts +38 -0
- package/lib/server/listenSite.d.ts.map +1 -0
- package/lib/server/listenSite.js +60 -0
- package/lib/server/listenSite.js.map +1 -0
- package/lib/server/mcpServer.d.ts +8 -0
- package/lib/server/mcpServer.d.ts.map +1 -0
- package/lib/server/mcpServer.js +11 -0
- package/lib/server/mcpServer.js.map +1 -0
- package/lib/server/repositoryVersion.d.ts +16 -0
- package/lib/server/repositoryVersion.d.ts.map +1 -0
- package/lib/server/repositoryVersion.js +33 -0
- package/lib/server/repositoryVersion.js.map +1 -0
- package/lib/server/routeOptions.d.ts +23 -0
- package/lib/server/routeOptions.d.ts.map +1 -0
- package/lib/server/routeOptions.js +20 -0
- package/lib/server/routeOptions.js.map +1 -0
- package/lib/server/routeTable.d.ts +14 -0
- package/lib/server/routeTable.d.ts.map +1 -0
- package/lib/server/routeTable.js +32 -0
- package/lib/server/routeTable.js.map +1 -0
- package/lib/server/siteView.d.ts +29 -0
- package/lib/server/siteView.d.ts.map +1 -0
- package/lib/server/siteView.js +21 -0
- package/lib/server/siteView.js.map +1 -0
- package/lib/server/spaPages.d.ts +32 -0
- package/lib/server/spaPages.d.ts.map +1 -0
- package/lib/server/spaPages.js +126 -0
- package/lib/server/spaPages.js.map +1 -0
- package/lib/server/spaSite.d.ts +30 -0
- package/lib/server/spaSite.d.ts.map +1 -0
- package/lib/server/spaSite.js +170 -0
- package/lib/server/spaSite.js.map +1 -0
- package/lib/server/spaSiteOptions.d.ts +126 -0
- package/lib/server/spaSiteOptions.d.ts.map +1 -0
- package/lib/server/spaSiteOptions.js +2 -0
- package/lib/server/spaSiteOptions.js.map +1 -0
- package/lib/server/staticSite.d.ts +9 -0
- package/lib/server/staticSite.d.ts.map +1 -1
- package/lib/server/staticSite.js +41 -19
- package/lib/server/staticSite.js.map +1 -1
- package/lib/server/toolSiteServer.d.ts +77 -0
- package/lib/server/toolSiteServer.d.ts.map +1 -0
- package/lib/server/toolSiteServer.js +58 -0
- package/lib/server/toolSiteServer.js.map +1 -0
- package/lib/server/trustProxy.d.ts +20 -0
- package/lib/server/trustProxy.d.ts.map +1 -0
- package/lib/server/trustProxy.js +32 -0
- package/lib/server/trustProxy.js.map +1 -0
- package/lib/server/types.d.ts +13 -0
- package/lib/server/types.d.ts.map +1 -0
- package/lib/server/types.js +2 -0
- package/lib/server/types.js.map +1 -0
- package/lib/server.d.ts +22 -0
- package/lib/server.d.ts.map +1 -1
- package/lib/server.js +12 -0
- package/lib/server.js.map +1 -1
- package/lib/share/core/config.d.ts +18 -0
- package/lib/share/core/config.d.ts.map +1 -1
- package/lib/share/core/config.js +33 -2
- package/lib/share/core/config.js.map +1 -1
- package/lib/share/core/index.d.ts +3 -1
- package/lib/share/core/index.d.ts.map +1 -1
- package/lib/share/core/index.js +2 -1
- package/lib/share/core/index.js.map +1 -1
- package/lib/share/core/keySetParam.d.ts +40 -0
- package/lib/share/core/keySetParam.d.ts.map +1 -0
- package/lib/share/core/keySetParam.js +60 -0
- package/lib/share/core/keySetParam.js.map +1 -0
- package/lib/share/core/vocabulary.d.ts +8 -0
- package/lib/share/core/vocabulary.d.ts.map +1 -1
- package/lib/shell/ui/ShareControl.d.ts +75 -0
- package/lib/shell/ui/ShareControl.d.ts.map +1 -0
- package/lib/shell/ui/ShareControl.js +40 -0
- package/lib/shell/ui/ShareControl.js.map +1 -0
- package/lib/shell/ui/ShellFrame.d.ts +14 -0
- package/lib/shell/ui/ShellFrame.d.ts.map +1 -0
- package/lib/shell/ui/ShellFrame.js +45 -0
- package/lib/shell/ui/ShellFrame.js.map +1 -0
- package/lib/shell/ui/SiteShell.d.ts +251 -0
- package/lib/shell/ui/SiteShell.d.ts.map +1 -0
- package/lib/shell/ui/SiteShell.js +39 -0
- package/lib/shell/ui/SiteShell.js.map +1 -0
- package/lib/shell/ui/index.d.ts +5 -0
- package/lib/shell/ui/index.d.ts.map +1 -0
- package/lib/shell/ui/index.js +3 -0
- package/lib/shell/ui/index.js.map +1 -0
- package/lib/state/core/index.d.ts +1 -0
- package/lib/state/core/index.d.ts.map +1 -1
- package/lib/state/core/index.js.map +1 -1
- package/lib/state/core/legacyEntries.d.ts +30 -0
- package/lib/state/core/legacyEntries.d.ts.map +1 -0
- package/lib/state/core/legacyEntries.js +51 -0
- package/lib/state/core/legacyEntries.js.map +1 -0
- package/lib/state/core/persistBucket.d.ts +26 -2
- package/lib/state/core/persistBucket.d.ts.map +1 -1
- package/lib/state/core/persistBucket.js +26 -9
- package/lib/state/core/persistBucket.js.map +1 -1
- package/lib/state/core/persistSignalBucket.d.ts +26 -0
- package/lib/state/core/persistSignalBucket.d.ts.map +1 -1
- package/lib/state/core/persistSignalBucket.js +31 -0
- package/lib/state/core/persistSignalBucket.js.map +1 -1
- package/lib/state/core/storageEntry.d.ts +15 -0
- package/lib/state/core/storageEntry.d.ts.map +1 -1
- package/lib/state/core/storageEntry.js +33 -0
- package/lib/state/core/storageEntry.js.map +1 -1
- package/lib/structure/ui/StructureExportButton.d.ts +27 -0
- package/lib/structure/ui/StructureExportButton.d.ts.map +1 -0
- package/lib/structure/ui/StructureExportButton.js +21 -0
- package/lib/structure/ui/StructureExportButton.js.map +1 -0
- package/lib/structure/ui/index.d.ts +4 -0
- package/lib/structure/ui/index.d.ts.map +1 -1
- package/lib/structure/ui/index.js +2 -0
- package/lib/structure/ui/index.js.map +1 -1
- package/lib/structure/ui/useStructureDraft.d.ts +32 -0
- package/lib/structure/ui/useStructureDraft.d.ts.map +1 -0
- package/lib/structure/ui/useStructureDraft.js +20 -0
- package/lib/structure/ui/useStructureDraft.js.map +1 -0
- package/lib/ui.d.ts +2 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +2 -0
- package/lib/ui.js.map +1 -1
- package/lib/worker/core/index.d.ts +1 -1
- package/lib/worker/core/index.d.ts.map +1 -1
- package/lib/worker/core/messages.d.ts +4 -2
- package/lib/worker/core/messages.d.ts.map +1 -1
- package/lib/worker/core/messages.js.map +1 -1
- package/lib/worker/core/oclResourcesUrl.d.ts +16 -0
- package/lib/worker/core/oclResourcesUrl.d.ts.map +1 -0
- package/lib/worker/core/oclResourcesUrl.js +19 -0
- package/lib/worker/core/oclResourcesUrl.js.map +1 -0
- package/lib/worker/core/serveWorkerRequests.d.ts +8 -0
- package/lib/worker/core/serveWorkerRequests.d.ts.map +1 -1
- package/lib/worker/core/serveWorkerRequests.js +15 -2
- package/lib/worker/core/serveWorkerRequests.js.map +1 -1
- package/lib/worker/core/workerChannel.d.ts +3 -4
- package/lib/worker/core/workerChannel.d.ts.map +1 -1
- package/lib/worker/core/workerChannel.js +72 -67
- package/lib/worker/core/workerChannel.js.map +1 -1
- package/lib/worker/core/workerChannelParts.d.ts +17 -6
- package/lib/worker/core/workerChannelParts.d.ts.map +1 -1
- package/lib/worker/core/workerChannelParts.js +20 -4
- package/lib/worker/core/workerChannelParts.js.map +1 -1
- package/lib/worker/core/workerChannelTypes.d.ts +46 -2
- package/lib/worker/core/workerChannelTypes.d.ts.map +1 -1
- package/lib/worker/core/workerSlot.d.ts +66 -0
- package/lib/worker/core/workerSlot.d.ts.map +1 -0
- package/lib/worker/core/workerSlot.js +107 -0
- package/lib/worker/core/workerSlot.js.map +1 -0
- package/package.json +17 -1
- package/src/card/core/cardAddress.ts +100 -0
- package/src/card/core/cardPageUrl.ts +97 -0
- package/src/card/core/index.ts +6 -0
- package/src/card/core/panelRoom.ts +66 -0
- package/src/card/ui/CardDetailsButton.tsx +104 -0
- package/src/card/ui/CardFigure.tsx +86 -0
- package/src/card/ui/CardFrame.tsx +46 -0
- package/src/card/ui/CopyTableButton.tsx +81 -0
- package/src/card/ui/cardTooltip.ts +18 -0
- package/src/card/ui/embed.ts +27 -0
- package/src/card/ui/fitCardToFrame.ts +76 -0
- package/src/card/ui/holdRoomForPanels.ts +83 -0
- package/src/card/ui/index.ts +14 -0
- package/src/card/ui/openPanels.ts +106 -0
- package/src/card.ts +13 -0
- package/src/conformers.ts +4 -0
- package/src/core.ts +5 -0
- package/src/fetch/core/apiError.ts +65 -0
- package/src/fetch/core/fetchJson.ts +129 -0
- package/src/fetch/core/index.ts +4 -0
- package/src/formula/core/formulaText.ts +96 -0
- package/src/formula/core/index.ts +20 -0
- package/src/formula/core/normalizeFormula.ts +50 -0
- package/src/formula/core/readFormula.ts +211 -0
- package/src/formula/ui/CopyableFormula.tsx +51 -0
- package/src/formula/ui/FormulaInput.tsx +50 -0
- package/src/formula/ui/QuestionFormula.tsx +20 -0
- package/src/formula/ui/index.ts +6 -0
- package/src/formula.ts +11 -0
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/keyTargets.ts +5 -3
- package/src/hooks/ui/useAsync.ts +50 -14
- package/src/ir/core/analysisSpectra.ts +26 -10
- package/src/ir/core/bandLabelPlan.ts +21 -10
- package/src/ir/core/index.ts +25 -5
- package/src/ir/core/irBand.ts +52 -14
- package/src/ir/core/irCommands.ts +15 -1
- package/src/ir/core/irDomain.ts +9 -7
- package/src/ir/core/irFormat.ts +39 -6
- package/src/ir/core/irMode.ts +42 -10
- package/src/ir/core/irReducer.ts +1 -49
- package/src/ir/core/irSpectrum.ts +59 -30
- package/src/ir/core/irState.ts +67 -2
- package/src/ir/core/irTechnique.ts +115 -0
- package/src/ir/core/irTechniqueCommands.ts +82 -0
- package/src/ir/core/pickBands.ts +63 -28
- package/src/ir/core/ramanBands.ts +105 -0
- package/src/ir/core/spectrumJcamp.ts +65 -16
- package/src/ir/core/toIrSpectrum.ts +20 -2
- package/src/ir/ui/BandRow.tsx +107 -0
- package/src/ir/ui/BandsPanel.tsx +32 -125
- package/src/ir/ui/IrAboutDialog.tsx +69 -28
- package/src/ir/ui/IrCanvas.tsx +2 -1
- package/src/ir/ui/IrChart.tsx +20 -24
- package/src/ir/ui/IrCommandProvider.tsx +10 -3
- package/src/ir/ui/IrCommandTooltip.tsx +11 -2
- package/src/ir/ui/IrDocumentationDialog.tsx +99 -55
- package/src/ir/ui/IrEditor.tsx +5 -36
- package/src/ir/ui/IrHeader.tsx +10 -3
- package/src/ir/ui/IrLogo.tsx +28 -9
- package/src/ir/ui/IrShell.tsx +27 -75
- package/src/ir/ui/IrStatusBar.tsx +17 -12
- package/src/ir/ui/IrToolbar.tsx +26 -15
- package/src/ir/ui/IrTraces.tsx +5 -1
- package/src/ir/ui/RamanEditor.tsx +53 -0
- package/src/ir/ui/SpectraPanel.tsx +2 -1
- package/src/ir/ui/SpectrumRow.tsx +14 -5
- package/src/ir/ui/VibrationalEditor.tsx +94 -0
- package/src/ir/ui/bandsTsv.ts +46 -0
- package/src/ir/ui/irChartProps.ts +14 -4
- package/src/ir/ui/irCommandContext.tsx +18 -3
- package/src/ir/ui/useIrEditor.ts +20 -8
- package/src/ir/ui/useIrHandle.ts +51 -0
- package/src/ir/ui/useIrText.ts +170 -0
- package/src/ir/ui/useIrZoom.ts +12 -3
- package/src/ir/ui/useValueAxisZoom.ts +67 -0
- package/src/ir.ts +3 -0
- package/src/locales/de.json +57 -1
- package/src/locales/en.json +57 -1
- package/src/locales/es.json +57 -1
- package/src/locales/fr.json +57 -1
- package/src/locales/it.json +57 -1
- package/src/moleculesClient/core/index.ts +19 -0
- package/src/moleculesClient/core/moleculesClient.ts +175 -0
- package/src/moleculesClient/core/moleculesClientApi.ts +120 -0
- package/src/moleculesClient/core/moleculesTypes.ts +163 -0
- package/src/moleculesClient/core/requestRetry.ts +118 -0
- package/src/molstar/core/camera.ts +3 -2
- package/src/molstar/core/framing.ts +200 -0
- package/src/molstar/core/hover.ts +26 -0
- package/src/molstar/core/index.ts +21 -1
- package/src/pedagogy/core/answers.ts +94 -0
- package/src/pedagogy/core/attempts.ts +205 -0
- package/src/pedagogy/core/index.ts +36 -0
- package/src/pedagogy/core/progressController.ts +116 -0
- package/src/pedagogy/core/seed.ts +177 -0
- package/src/pedagogy/core/series.ts +82 -0
- package/src/pedagogy/ui/AnswerFields.tsx +63 -0
- package/src/pedagogy/ui/ExerciseList.tsx +202 -0
- package/src/pedagogy/ui/ExerciseSeries.tsx +250 -0
- package/src/pedagogy/ui/QuestionCard.tsx +231 -0
- package/src/pedagogy/ui/index.ts +18 -0
- package/src/pedagogy/ui/seriesCounts.ts +34 -0
- package/src/pedagogy/ui/seriesParts.tsx +127 -0
- package/src/pedagogy/ui/useAttemptRecords.ts +16 -0
- package/src/periodic/ui/PeriodicTable.tsx +6 -3
- package/src/property/core/copyableText.ts +20 -0
- package/src/property/core/index.ts +1 -0
- package/src/property/ui/PropertyTable.tsx +83 -0
- package/src/property/ui/index.ts +2 -0
- package/src/raman.ts +19 -0
- package/src/router/core/history.ts +61 -7
- package/src/router/core/index.ts +3 -2
- package/src/router/core/languageRoute.ts +136 -0
- package/src/router/core/siteAddresses.ts +38 -0
- package/src/router/core/tabRouter.ts +59 -117
- package/src/router/core/tabRouterTypes.ts +158 -0
- package/src/seo/core/fitDescription.ts +74 -0
- package/src/seo/core/index.ts +17 -0
- package/src/seo/core/limits.ts +27 -0
- package/src/seo/core/pageContent.ts +42 -0
- package/src/seo/core/plainDescription.ts +4 -2
- package/src/seo/core/routeProblems.ts +1 -7
- package/src/seo/core/routeTable.ts +103 -0
- package/src/seo/vite/index.ts +2 -0
- package/src/seo/vite/prerender.ts +26 -1
- package/src/seo/vite/routeTable.ts +79 -0
- package/src/server/answerAddresses.ts +92 -0
- package/src/server/cardMeta.ts +88 -0
- package/src/server/config.ts +125 -0
- package/src/server/envNumber.ts +65 -0
- package/src/server/healthRoute.ts +42 -0
- package/src/server/listenSite.ts +90 -0
- package/src/server/mcpServer.ts +14 -0
- package/src/server/repositoryVersion.ts +33 -0
- package/src/server/routeOptions.ts +26 -0
- package/src/server/routeTable.ts +35 -0
- package/src/server/siteView.ts +42 -0
- package/src/server/spaPages.ts +179 -0
- package/src/server/spaSite.ts +216 -0
- package/src/server/spaSiteOptions.ts +133 -0
- package/src/server/staticSite.ts +65 -35
- package/src/server/toolSiteServer.ts +127 -0
- package/src/server/trustProxy.ts +32 -0
- package/src/server/types.ts +25 -0
- package/src/server.ts +40 -0
- package/src/share/core/config.ts +45 -2
- package/src/share/core/index.ts +4 -0
- package/src/share/core/keySetParam.ts +92 -0
- package/src/share/core/vocabulary.ts +8 -0
- package/src/shell/ui/ShareControl.tsx +150 -0
- package/src/shell/ui/ShellFrame.tsx +180 -0
- package/src/shell/ui/SiteShell.tsx +297 -0
- package/src/shell/ui/index.ts +9 -0
- package/src/state/core/index.ts +1 -0
- package/src/state/core/legacyEntries.ts +76 -0
- package/src/state/core/persistBucket.ts +50 -10
- package/src/state/core/persistSignalBucket.ts +52 -0
- package/src/state/core/storageEntry.ts +32 -0
- package/src/structure/ui/StructureExportButton.tsx +57 -0
- package/src/structure/ui/index.ts +4 -0
- package/src/structure/ui/useStructureDraft.ts +47 -0
- package/src/ui.ts +2 -0
- package/src/worker/core/index.ts +1 -0
- package/src/worker/core/messages.ts +4 -3
- package/src/worker/core/oclResourcesUrl.ts +21 -0
- package/src/worker/core/serveWorkerRequests.ts +30 -2
- package/src/worker/core/workerChannel.ts +74 -74
- package/src/worker/core/workerChannelParts.ts +33 -13
- package/src/worker/core/workerChannelTypes.ts +47 -2
- package/src/worker/core/workerSlot.ts +181 -0
- package/styles/card.css +145 -0
- package/styles/chrome.css +248 -0
package/src/locales/fr.json
CHANGED
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"share.button": "Partager",
|
|
54
54
|
"share.buttonTitle": "Partager un lien vers cette page, ou l'intégrer à votre propre site",
|
|
55
55
|
"share.dialogTitleFor": "Partager ou intégrer — {title}",
|
|
56
|
+
"share.frameTitle": "{site} — {title}",
|
|
56
57
|
"share.layout": "Disposition",
|
|
57
58
|
"share.embed": "Intégrer dans une autre page",
|
|
58
59
|
"share.embedHint": "Retire l'en-tête du site et sa navigation, pour que la page prenne place dans une page à vous.",
|
|
@@ -104,6 +105,12 @@
|
|
|
104
105
|
"clipboard.copyThe": "Copier {what}",
|
|
105
106
|
"clipboard.copyValue": "Copier {value}",
|
|
106
107
|
"clipboard.copyToClipboard": "Copier dans le presse-papiers",
|
|
108
|
+
"card.details": "Détails",
|
|
109
|
+
"card.detailsTitle": "Ouvrir dans un nouvel onglet",
|
|
110
|
+
"card.detailsLabel": "Détails : ouvrir dans un nouvel onglet",
|
|
111
|
+
"card.copyTable": "Copier en tableau",
|
|
112
|
+
"card.copyTableTitle": "Copier le tableau, à coller dans un tableur",
|
|
113
|
+
"card.copyPicture": "Copier ou enregistrer l’image",
|
|
107
114
|
"about.providedBy": "Proposé par",
|
|
108
115
|
"about.whatYouCanDo": "Ce que vous pouvez faire ici",
|
|
109
116
|
"about.builtOn": "Construit sur",
|
|
@@ -245,6 +252,35 @@
|
|
|
245
252
|
"pedagogy.previous": "Précédent",
|
|
246
253
|
"pedagogy.next": "Suivant",
|
|
247
254
|
"pedagogy.stepOf": "Étape {step} sur {total}",
|
|
255
|
+
"pedagogy.answerEmpty": "Tapez {what}.",
|
|
256
|
+
"pedagogy.answerUnreadable": "« {typed} » n’est pas {what}.",
|
|
257
|
+
"pedagogy.questions": "Questions",
|
|
258
|
+
"pedagogy.questionsInSeries": "Questions dans une série",
|
|
259
|
+
"pedagogy.questionCount": "{count} questions",
|
|
260
|
+
"pedagogy.allQuestions": "Les {count} questions",
|
|
261
|
+
"pedagogy.newSeries": "Nouvelle série",
|
|
262
|
+
"pedagogy.newSeriesTitle": "Tirer une autre série ; le lien affiché change avec elle",
|
|
263
|
+
"pedagogy.seriesQuestions": "Questions de la série",
|
|
264
|
+
"pedagogy.questionNumber": "Question {number}",
|
|
265
|
+
"pedagogy.questionOf": "Question {number} sur {total}",
|
|
266
|
+
"pedagogy.solved": "Résolu",
|
|
267
|
+
"pedagogy.solvedWithHintsOf": "Indices ouverts : {revealed} sur {total}.",
|
|
268
|
+
"pedagogy.solvedWithoutHint": "Sans indice.",
|
|
269
|
+
"pedagogy.nextQuestion": "Question suivante",
|
|
270
|
+
"pedagogy.solution": "Solution",
|
|
271
|
+
"pedagogy.exercises": "Exercices",
|
|
272
|
+
"pedagogy.statusIdle": "pas commencé",
|
|
273
|
+
"pedagogy.statusAttempted": "rendu, pas encore juste",
|
|
274
|
+
"pedagogy.statusSolved": "juste",
|
|
275
|
+
"pedagogy.solvedWithOneHint": "Résolu avec 1 indice",
|
|
276
|
+
"pedagogy.solvedWithHints": "Résolu avec {count} indices",
|
|
277
|
+
"formula.copyLabel": "formule",
|
|
278
|
+
"formula.typeFirst": "Tapez d’abord une formule.",
|
|
279
|
+
"formula.notElement": "« {symbol} » n’est pas un symbole d’élément.",
|
|
280
|
+
"formula.noAtom": "« {formula} » ne contient aucun atome.",
|
|
281
|
+
"formula.wholeCounts": "« {formula} » compte {count} pour un atome ; un nombre d’atomes est entier.",
|
|
282
|
+
"formula.unknownNotation": "« {formula} » utilise une notation que cet outil ne compte pas.",
|
|
283
|
+
"formula.unreadable": "« {formula} » n’est pas une formule que cet outil sait lire ({reason}).",
|
|
248
284
|
"slides.exit": "Quitter",
|
|
249
285
|
"slides.previousSlide": "Diapositive précédente",
|
|
250
286
|
"slides.nextSlide": "Diapositive suivante",
|
|
@@ -458,6 +494,7 @@
|
|
|
458
494
|
"structure.tool.unavailable": "Indisponible dans cet éditeur.",
|
|
459
495
|
"structure.loadingEditor": "Chargement de l'éditeur…",
|
|
460
496
|
"structure.export.open": "Exporter la structure",
|
|
497
|
+
"structure.export.glyph": "Copier ou enregistrer la structure : SMILES, molfile",
|
|
461
498
|
"structure.export.title": "Exporter la structure",
|
|
462
499
|
"structure.export.loading": "Lecture de la structure…",
|
|
463
500
|
"structure.export.nothing": "Rien n'est encore dessiné.",
|
|
@@ -626,5 +663,24 @@
|
|
|
626
663
|
"moleculesToken.fix.issueOnServer": "Ou, sur le serveur de molecules.cheminfo.org :",
|
|
627
664
|
"moleculesToken.fix.envOne": "Écrivez-le dans le fichier .env du serveur de ce site :",
|
|
628
665
|
"moleculesToken.fix.envMany": "Écrivez-les dans le fichier .env du serveur de ce site :",
|
|
629
|
-
"moleculesToken.fix.restart": "Redémarrez les services, qui ne lisent le fichier .env qu'à leur démarrage :"
|
|
666
|
+
"moleculesToken.fix.restart": "Redémarrez les services, qui ne lisent le fichier .env qu'à leur démarrage :",
|
|
667
|
+
"ir.mode.intensity": "intensité",
|
|
668
|
+
"ir.raman.xTitle": "déplacement Raman (cm⁻¹)",
|
|
669
|
+
"ir.raman.chart": "Spectre Raman lu en intensité, le déplacement Raman croissant de gauche à droite. Glissez dessus pour zoomer sur l'axe du déplacement Raman, glissez au-delà de la ligne de base pour entraîner aussi l'axe des intensités, tournez la molette pour mettre l'axe des intensités à l'échelle, et double-cliquez pour tout réajuster.",
|
|
670
|
+
"ir.raman.tools": "Outils du spectre Raman",
|
|
671
|
+
"ir.raman.viewer": "Visionneuse de spectres Raman",
|
|
672
|
+
"ir.raman.viewerHelp": "Aide de la visionneuse de spectres Raman",
|
|
673
|
+
"ir.raman.mark": "Visionneuse Raman",
|
|
674
|
+
"ir.raman.about": "À propos de la visionneuse Raman",
|
|
675
|
+
"ir.raman.documentation": "Utiliser la visionneuse Raman",
|
|
676
|
+
"ir.raman.command.documentation": "Comment les bandes sont lues, et chaque geste.",
|
|
677
|
+
"ir.raman.command.readTool": "Un glissement resserre l'axe du déplacement Raman. Relâché au-delà de la ligne de base, il entraîne aussi l'axe des intensités.",
|
|
678
|
+
"ir.raman.command.boxTool": "Un glissement zoome exactement sur le rectangle qu'il trace, les deux axes à la fois — pour regarder dans une ligne de base ou un épaulement plutôt qu'à travers le spectre.",
|
|
679
|
+
"ir.raman.command.zoomIn": "Fait ressortir les bandes faibles, en mettant l'axe des intensités à l'échelle autour de zéro.",
|
|
680
|
+
"ir.raman.command.togglePicking": "Trouve les bandes du spectre sélectionné, les marque sur le graphique et les liste.",
|
|
681
|
+
"ir.raman.doc.bands": "Les bandes du spectre *sélectionné* sont repérées comme maxima d'intensité, marquées sur le graphique et listées dans le panneau des bandes. Survoler une ligne marque la bande sur le graphique, et survoler le graphique éclaire la ligne.",
|
|
682
|
+
"ir.raman.doc.sampled": "Une bande est donnée au point échantillonné où elle culmine : sa position n'est pas plus précise que la grille sur laquelle le spectre a été enregistré.",
|
|
683
|
+
"ir.raman.aboutLead": "Trace un spectre Raman, repère ses bandes et les liste à côté du graphique.",
|
|
684
|
+
"ir.raman.credit.picking": "**ir-spectrum** (cheminfo, MIT) repère les bandes, avec le détecteur de pics de **common-spectrum** et **ml-gsd**.",
|
|
685
|
+
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) écrit le fichier JCAMP-DX téléchargé."
|
|
630
686
|
}
|
package/src/locales/it.json
CHANGED
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"share.button": "Condividi",
|
|
54
54
|
"share.buttonTitle": "Condividere un link a questa pagina, o incorporarla nel proprio sito",
|
|
55
55
|
"share.dialogTitleFor": "Condividere o incorporare — {title}",
|
|
56
|
+
"share.frameTitle": "{site} — {title}",
|
|
56
57
|
"share.layout": "Disposizione",
|
|
57
58
|
"share.embed": "Incorporare in un'altra pagina",
|
|
58
59
|
"share.embedHint": "Toglie l'intestazione del sito e la sua navigazione, così la pagina sta dentro una pagina propria.",
|
|
@@ -104,6 +105,12 @@
|
|
|
104
105
|
"clipboard.copyThe": "Copia {what}",
|
|
105
106
|
"clipboard.copyValue": "Copia {value}",
|
|
106
107
|
"clipboard.copyToClipboard": "Copia negli appunti",
|
|
108
|
+
"card.details": "Dettagli",
|
|
109
|
+
"card.detailsTitle": "Apri in una nuova scheda",
|
|
110
|
+
"card.detailsLabel": "Dettagli: apri in una nuova scheda",
|
|
111
|
+
"card.copyTable": "Copia come tabella",
|
|
112
|
+
"card.copyTableTitle": "Copia la tabella, da incollare in un foglio di calcolo",
|
|
113
|
+
"card.copyPicture": "Copia o salva l’immagine",
|
|
107
114
|
"about.providedBy": "Offerto da",
|
|
108
115
|
"about.whatYouCanDo": "Cosa si può fare qui",
|
|
109
116
|
"about.builtOn": "Costruito su",
|
|
@@ -245,6 +252,35 @@
|
|
|
245
252
|
"pedagogy.previous": "Precedente",
|
|
246
253
|
"pedagogy.next": "Successivo",
|
|
247
254
|
"pedagogy.stepOf": "Passo {step} di {total}",
|
|
255
|
+
"pedagogy.answerEmpty": "Scrivi {what}.",
|
|
256
|
+
"pedagogy.answerUnreadable": "«{typed}» non è {what}.",
|
|
257
|
+
"pedagogy.questions": "Domande",
|
|
258
|
+
"pedagogy.questionsInSeries": "Domande per serie",
|
|
259
|
+
"pedagogy.questionCount": "{count} domande",
|
|
260
|
+
"pedagogy.allQuestions": "Tutte le {count} domande",
|
|
261
|
+
"pedagogy.newSeries": "Nuova serie",
|
|
262
|
+
"pedagogy.newSeriesTitle": "Estrai un’altra serie; il link sullo schermo cambia con essa",
|
|
263
|
+
"pedagogy.seriesQuestions": "Domande della serie",
|
|
264
|
+
"pedagogy.questionNumber": "Domanda {number}",
|
|
265
|
+
"pedagogy.questionOf": "Domanda {number} di {total}",
|
|
266
|
+
"pedagogy.solved": "Risolta",
|
|
267
|
+
"pedagogy.solvedWithHintsOf": "Suggerimenti aperti: {revealed} su {total}.",
|
|
268
|
+
"pedagogy.solvedWithoutHint": "Senza suggerimenti.",
|
|
269
|
+
"pedagogy.nextQuestion": "Domanda successiva",
|
|
270
|
+
"pedagogy.solution": "Soluzione",
|
|
271
|
+
"pedagogy.exercises": "Esercizi",
|
|
272
|
+
"pedagogy.statusIdle": "non iniziata",
|
|
273
|
+
"pedagogy.statusAttempted": "consegnata, non ancora giusta",
|
|
274
|
+
"pedagogy.statusSolved": "giusta",
|
|
275
|
+
"pedagogy.solvedWithOneHint": "Risolta con 1 suggerimento",
|
|
276
|
+
"pedagogy.solvedWithHints": "Risolta con {count} suggerimenti",
|
|
277
|
+
"formula.copyLabel": "formula",
|
|
278
|
+
"formula.typeFirst": "Scrivi prima una formula.",
|
|
279
|
+
"formula.notElement": "«{symbol}» non è il simbolo di un elemento.",
|
|
280
|
+
"formula.noAtom": "«{formula}» non contiene alcun atomo.",
|
|
281
|
+
"formula.wholeCounts": "«{formula}» dà a un atomo il numero {count}; i numeri di atomi sono interi.",
|
|
282
|
+
"formula.unknownNotation": "«{formula}» usa una notazione che questo strumento non conta.",
|
|
283
|
+
"formula.unreadable": "«{formula}» non è una formula che questo strumento sa leggere ({reason}).",
|
|
248
284
|
"slides.exit": "Esci",
|
|
249
285
|
"slides.previousSlide": "Diapositiva precedente",
|
|
250
286
|
"slides.nextSlide": "Diapositiva successiva",
|
|
@@ -402,6 +438,7 @@
|
|
|
402
438
|
"structure.tool.unavailable": "Non disponibile in questo editor.",
|
|
403
439
|
"structure.loadingEditor": "Caricamento dell'editor…",
|
|
404
440
|
"structure.export.open": "Esporta la struttura",
|
|
441
|
+
"structure.export.glyph": "Copia o salva la struttura: SMILES, molfile",
|
|
405
442
|
"structure.export.title": "Esporta la struttura",
|
|
406
443
|
"structure.export.loading": "Lettura della struttura…",
|
|
407
444
|
"structure.export.nothing": "Non c'è ancora nulla di disegnato.",
|
|
@@ -626,5 +663,24 @@
|
|
|
626
663
|
"moleculesToken.fix.issueOnServer": "Oppure, sul server di molecules.cheminfo.org:",
|
|
627
664
|
"moleculesToken.fix.envOne": "Scriverlo nel file .env del server di questo sito:",
|
|
628
665
|
"moleculesToken.fix.envMany": "Scriverli nel file .env del server di questo sito:",
|
|
629
|
-
"moleculesToken.fix.restart": "Riavviare i servizi, che leggono il file .env solo all'avvio:"
|
|
666
|
+
"moleculesToken.fix.restart": "Riavviare i servizi, che leggono il file .env solo all'avvio:",
|
|
667
|
+
"ir.mode.intensity": "intensità",
|
|
668
|
+
"ir.raman.xTitle": "spostamento Raman (cm⁻¹)",
|
|
669
|
+
"ir.raman.chart": "Spettro Raman letto come intensità, con lo spostamento Raman crescente da sinistra a destra. Trascina sopra per ingrandire l'asse dello spostamento Raman, trascina oltre la linea di base per portare con sé l'asse dell'intensità, gira la rotellina per scalare l'asse dell'intensità e fai doppio clic per riadattare tutto.",
|
|
670
|
+
"ir.raman.tools": "Strumenti dello spettro Raman",
|
|
671
|
+
"ir.raman.viewer": "Visualizzatore di spettri Raman",
|
|
672
|
+
"ir.raman.viewerHelp": "Aiuto del visualizzatore di spettri Raman",
|
|
673
|
+
"ir.raman.mark": "Visualizzatore Raman",
|
|
674
|
+
"ir.raman.about": "Informazioni sul visualizzatore Raman",
|
|
675
|
+
"ir.raman.documentation": "Usare il visualizzatore Raman",
|
|
676
|
+
"ir.raman.command.documentation": "Come si leggono le bande, e ogni gesto.",
|
|
677
|
+
"ir.raman.command.readTool": "Un trascinamento restringe l'asse dello spostamento Raman. Rilasciato oltre la linea di base, porta con sé l'asse dell'intensità.",
|
|
678
|
+
"ir.raman.command.boxTool": "Un trascinamento ingrandisce esattamente il rettangolo che traccia, entrambi gli assi insieme — per guardare dentro una linea di base o una spalla anziché lungo lo spettro.",
|
|
679
|
+
"ir.raman.command.zoomIn": "Fa emergere le bande deboli, scalando l'asse dell'intensità attorno a zero.",
|
|
680
|
+
"ir.raman.command.togglePicking": "Trova le bande dello spettro selezionato, le segna sul grafico e le elenca.",
|
|
681
|
+
"ir.raman.doc.bands": "Le bande dello spettro *selezionato* sono cercate come massimi di intensità, segnate sul grafico ed elencate nel pannello delle bande. Passare su una riga segna la banda sul grafico, e passare sul grafico illumina la riga.",
|
|
682
|
+
"ir.raman.doc.sampled": "Una banda è data nel punto campionato in cui raggiunge il massimo: la sua posizione non è più precisa della griglia su cui lo spettro è stato registrato.",
|
|
683
|
+
"ir.raman.aboutLead": "Disegna uno spettro Raman, ne trova le bande e le elenca accanto al grafico.",
|
|
684
|
+
"ir.raman.credit.picking": "**ir-spectrum** (cheminfo, MIT) trova le bande, con il rilevatore di picchi di **common-spectrum** e **ml-gsd**.",
|
|
685
|
+
"ir.raman.credit.jcamp": "**convert-to-jcamp** (cheminfo, MIT) scrive il file JCAMP-DX scaricato."
|
|
630
686
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { createMoleculesClient } from './moleculesClient.ts';
|
|
2
|
+
export type {
|
|
3
|
+
MoleculesClient,
|
|
4
|
+
MoleculesClientOptions,
|
|
5
|
+
} from './moleculesClientApi.ts';
|
|
6
|
+
export { MoleculesError } from './moleculesClientApi.ts';
|
|
7
|
+
export type {
|
|
8
|
+
ImportStarted,
|
|
9
|
+
ImportState,
|
|
10
|
+
LookupResponse,
|
|
11
|
+
LookupResult,
|
|
12
|
+
MoleculeInfo,
|
|
13
|
+
MoleculeInput,
|
|
14
|
+
PurgeResponse,
|
|
15
|
+
RetryDetails,
|
|
16
|
+
SubmitResponse,
|
|
17
|
+
SubmitResult,
|
|
18
|
+
SubmitSummary,
|
|
19
|
+
} from './moleculesTypes.ts';
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { XSadd } from 'ml-xsadd';
|
|
2
|
+
|
|
3
|
+
import { trimTrailingSlash } from '../../router/core/address.ts';
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
MoleculesClient,
|
|
7
|
+
MoleculesClientOptions,
|
|
8
|
+
} from './moleculesClientApi.ts';
|
|
9
|
+
import { MoleculesError } from './moleculesClientApi.ts';
|
|
10
|
+
import type {
|
|
11
|
+
ImportStarted,
|
|
12
|
+
ImportState,
|
|
13
|
+
LookupResponse,
|
|
14
|
+
PurgeResponse,
|
|
15
|
+
SubmitResponse,
|
|
16
|
+
} from './moleculesTypes.ts';
|
|
17
|
+
import {
|
|
18
|
+
causeOf,
|
|
19
|
+
gzipBody,
|
|
20
|
+
messageOf,
|
|
21
|
+
pause,
|
|
22
|
+
requestSignal,
|
|
23
|
+
retryAfter,
|
|
24
|
+
} from './requestRetry.ts';
|
|
25
|
+
|
|
26
|
+
/** Statuses a request is tried again on: the server is busy or in between. */
|
|
27
|
+
const RETRIED_STATUSES = new Set([429, 502, 503, 504]);
|
|
28
|
+
|
|
29
|
+
/** The doublings of the pause, after which it stays where it is. */
|
|
30
|
+
const MAX_DOUBLINGS = 20;
|
|
31
|
+
|
|
32
|
+
/** One request, as it is tried again. */
|
|
33
|
+
interface Call {
|
|
34
|
+
method: 'GET' | 'POST';
|
|
35
|
+
path: string;
|
|
36
|
+
payload: Uint8Array<ArrayBuffer> | undefined;
|
|
37
|
+
started: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** What one attempt came to: the answer, or why another is worth it. */
|
|
41
|
+
type Outcome<T> =
|
|
42
|
+
| { answered: true; value: T }
|
|
43
|
+
| {
|
|
44
|
+
answered: false;
|
|
45
|
+
status: number | undefined;
|
|
46
|
+
reason: string;
|
|
47
|
+
retryAfterMs: number | undefined;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A client of the routes a source writes through on molecules.cheminfo.org,
|
|
52
|
+
* retrying while the server is busy (503), throttling (429), being restarted
|
|
53
|
+
* (502, 504) or out of reach. Each attempt has its own deadline, the pauses
|
|
54
|
+
* double with a spread and honour `Retry-After`, and bodies travel gzipped.
|
|
55
|
+
* Browser-safe: it reads no Node module.
|
|
56
|
+
* @param options - Where it answers, the token, and how hard to insist.
|
|
57
|
+
* @returns The client.
|
|
58
|
+
*/
|
|
59
|
+
export function createMoleculesClient(
|
|
60
|
+
options: MoleculesClientOptions,
|
|
61
|
+
): MoleculesClient {
|
|
62
|
+
const {
|
|
63
|
+
token,
|
|
64
|
+
maxRetryMs = 1_800_000,
|
|
65
|
+
initialDelayMs = 1000,
|
|
66
|
+
maxDelayMs = 60_000,
|
|
67
|
+
requestTimeoutMs = 600_000,
|
|
68
|
+
signal,
|
|
69
|
+
onRetry,
|
|
70
|
+
fetch: fetchImplementation = globalThis.fetch,
|
|
71
|
+
random = new XSadd().random,
|
|
72
|
+
} = options;
|
|
73
|
+
const baseUrl = trimTrailingSlash(options.baseUrl);
|
|
74
|
+
|
|
75
|
+
async function attemptOnce<T>(call: Call): Promise<Outcome<T>> {
|
|
76
|
+
let response: Response;
|
|
77
|
+
try {
|
|
78
|
+
response = await fetchImplementation(`${baseUrl}${call.path}`, {
|
|
79
|
+
method: call.method,
|
|
80
|
+
headers: {
|
|
81
|
+
authorization: `Bearer ${token}`,
|
|
82
|
+
...(call.payload === undefined
|
|
83
|
+
? {}
|
|
84
|
+
: {
|
|
85
|
+
'content-type': 'application/json',
|
|
86
|
+
'content-encoding': 'gzip',
|
|
87
|
+
}),
|
|
88
|
+
},
|
|
89
|
+
body: call.payload,
|
|
90
|
+
signal: requestSignal(signal, requestTimeoutMs),
|
|
91
|
+
});
|
|
92
|
+
if (response.ok) {
|
|
93
|
+
return { answered: true, value: (await response.json()) as T };
|
|
94
|
+
}
|
|
95
|
+
} catch (error: unknown) {
|
|
96
|
+
if (signal?.aborted) throw signal.reason;
|
|
97
|
+
return {
|
|
98
|
+
answered: false,
|
|
99
|
+
status: undefined,
|
|
100
|
+
reason: causeOf(error),
|
|
101
|
+
retryAfterMs: undefined,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const text = await response.text();
|
|
105
|
+
const reason = messageOf(text) ?? response.statusText;
|
|
106
|
+
if (!RETRIED_STATUSES.has(response.status)) {
|
|
107
|
+
throw new MoleculesError(
|
|
108
|
+
`${call.method} ${call.path} answered ${response.status}: ${reason}`,
|
|
109
|
+
response.status,
|
|
110
|
+
text,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const asked = retryAfter(response.headers.get('retry-after'), Date.now());
|
|
114
|
+
return {
|
|
115
|
+
answered: false,
|
|
116
|
+
status: response.status,
|
|
117
|
+
reason,
|
|
118
|
+
retryAfterMs: asked,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function attempt<T>(call: Call, number: number): Promise<T> {
|
|
123
|
+
signal?.throwIfAborted();
|
|
124
|
+
const outcome = await attemptOnce<T>(call);
|
|
125
|
+
if (outcome.answered) return outcome.value;
|
|
126
|
+
const backoff =
|
|
127
|
+
initialDelayMs *
|
|
128
|
+
2 ** Math.min(number - 1, MAX_DOUBLINGS) *
|
|
129
|
+
(0.5 + random() * 0.5);
|
|
130
|
+
const delayMs = Math.min(maxDelayMs, outcome.retryAfterMs ?? backoff);
|
|
131
|
+
const elapsed = Date.now() - call.started;
|
|
132
|
+
if (elapsed + delayMs > maxRetryMs) {
|
|
133
|
+
throw new MoleculesError(
|
|
134
|
+
`${call.method} ${call.path} kept failing for ${Math.round(elapsed / 1000)} s: ${outcome.reason}`,
|
|
135
|
+
outcome.status ?? 0,
|
|
136
|
+
outcome.reason,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
onRetry?.({
|
|
140
|
+
method: call.method,
|
|
141
|
+
path: call.path,
|
|
142
|
+
attempt: number,
|
|
143
|
+
status: outcome.status,
|
|
144
|
+
reason: outcome.reason,
|
|
145
|
+
delayMs,
|
|
146
|
+
});
|
|
147
|
+
await pause(delayMs, signal);
|
|
148
|
+
return attempt<T>(call, number + 1);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function request<T>(
|
|
152
|
+
method: 'GET' | 'POST',
|
|
153
|
+
path: string,
|
|
154
|
+
body?: unknown,
|
|
155
|
+
): Promise<T> {
|
|
156
|
+
const started = Date.now();
|
|
157
|
+
const payload =
|
|
158
|
+
body === undefined ? undefined : await gzipBody(JSON.stringify(body));
|
|
159
|
+
return attempt<T>({ method, path, payload, started }, 1);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
startImport: () => request<ImportStarted>('POST', '/v1/imports'),
|
|
164
|
+
importState: () => request<ImportState>('GET', '/v1/imports'),
|
|
165
|
+
submit: (molecules, { returnInfo = false } = {}) =>
|
|
166
|
+
request<SubmitResponse>('POST', '/v1/submit', { molecules, returnInfo }),
|
|
167
|
+
lookup: (queries, kind) =>
|
|
168
|
+
request<LookupResponse>('POST', '/v1/batch', { queries, kind }),
|
|
169
|
+
purge: (importKey, { dryRun = false, force = false } = {}) =>
|
|
170
|
+
request<PurgeResponse>('POST', `/v1/imports/${importKey}/purge`, {
|
|
171
|
+
dryRun,
|
|
172
|
+
force,
|
|
173
|
+
}),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ImportStarted,
|
|
3
|
+
ImportState,
|
|
4
|
+
LookupResponse,
|
|
5
|
+
MoleculeInput,
|
|
6
|
+
PurgeResponse,
|
|
7
|
+
RetryDetails,
|
|
8
|
+
SubmitResponse,
|
|
9
|
+
} from './moleculesTypes.ts';
|
|
10
|
+
|
|
11
|
+
/** How a client reaches molecules.cheminfo.org, and how hard it insists. */
|
|
12
|
+
export interface MoleculesClientOptions {
|
|
13
|
+
/** Where molecules.cheminfo.org answers, e.g. `https://molecules.cheminfo.org`. */
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
/** The token issued for the source the client writes for. */
|
|
16
|
+
token: string;
|
|
17
|
+
/**
|
|
18
|
+
* How long one request may keep being retried while the server is busy or
|
|
19
|
+
* unreachable, in milliseconds.
|
|
20
|
+
* @default 1_800_000 - half an hour
|
|
21
|
+
*/
|
|
22
|
+
maxRetryMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* The first pause before a retry; each next one doubles, up to `maxDelayMs`.
|
|
25
|
+
* @default 1000
|
|
26
|
+
*/
|
|
27
|
+
initialDelayMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* The longest pause between two attempts, a `Retry-After` included.
|
|
30
|
+
* @default 60_000
|
|
31
|
+
*/
|
|
32
|
+
maxDelayMs?: number;
|
|
33
|
+
/**
|
|
34
|
+
* How long one attempt may take before it is given up and retried.
|
|
35
|
+
* @default 600_000
|
|
36
|
+
*/
|
|
37
|
+
requestTimeoutMs?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Stops every request, and every pause between two attempts.
|
|
40
|
+
* @default undefined - nothing stops them
|
|
41
|
+
*/
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
/**
|
|
44
|
+
* Told about every retry, e.g. to log it.
|
|
45
|
+
* @default undefined - retries are silent
|
|
46
|
+
*/
|
|
47
|
+
onRetry?: (details: RetryDetails) => void;
|
|
48
|
+
/**
|
|
49
|
+
* The fetch to use, for tests.
|
|
50
|
+
* @default globalThis.fetch
|
|
51
|
+
*/
|
|
52
|
+
fetch?: typeof fetch;
|
|
53
|
+
/**
|
|
54
|
+
* A number from 0 to 1 that spreads the pauses, so clients that failed
|
|
55
|
+
* together do not all come back at the same instant.
|
|
56
|
+
* @default an unseeded `XSadd`
|
|
57
|
+
*/
|
|
58
|
+
random?: () => number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The routes a source writes through on molecules.cheminfo.org. */
|
|
62
|
+
export interface MoleculesClient {
|
|
63
|
+
/** Take the source's next import key: the start of a full import. */
|
|
64
|
+
startImport: () => Promise<ImportStarted>;
|
|
65
|
+
/** Where the source's import stands. */
|
|
66
|
+
importState: () => Promise<ImportState>;
|
|
67
|
+
/**
|
|
68
|
+
* Send up to 1000 molecules for the source, under its current import key.
|
|
69
|
+
* @param molecules - Each with its identifier and exactly one notation.
|
|
70
|
+
* @param options - Whether every answer carries the molecule's properties.
|
|
71
|
+
* @param options.returnInfo - Ask for them; `false` by default.
|
|
72
|
+
*/
|
|
73
|
+
submit: (
|
|
74
|
+
molecules: MoleculeInput[],
|
|
75
|
+
options?: { returnInfo?: boolean },
|
|
76
|
+
) => Promise<SubmitResponse>;
|
|
77
|
+
/**
|
|
78
|
+
* Compute up to 1000 molecules without storing anything, for a source
|
|
79
|
+
* molecules.cheminfo.org imports itself.
|
|
80
|
+
* @param queries - The structures, all in one notation.
|
|
81
|
+
* @param kind - The notation.
|
|
82
|
+
*/
|
|
83
|
+
lookup: (
|
|
84
|
+
queries: string[],
|
|
85
|
+
kind: 'smiles' | 'molfile' | 'idCode',
|
|
86
|
+
) => Promise<LookupResponse>;
|
|
87
|
+
/**
|
|
88
|
+
* Remove the entries an import did not send again.
|
|
89
|
+
* @param importKey - The key the import took.
|
|
90
|
+
* @param options - Only count, or remove even more than half.
|
|
91
|
+
* @param options.dryRun - Only count; `false` by default.
|
|
92
|
+
* @param options.force - Remove even when that is more than half; `false` by
|
|
93
|
+
* default.
|
|
94
|
+
*/
|
|
95
|
+
purge: (
|
|
96
|
+
importKey: number,
|
|
97
|
+
options?: { dryRun?: boolean; force?: boolean },
|
|
98
|
+
) => Promise<PurgeResponse>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A request molecules.cheminfo.org refused, or that kept failing. */
|
|
102
|
+
export class MoleculesError extends Error {
|
|
103
|
+
/** The status answered, or 0 when nothing was. */
|
|
104
|
+
readonly status: number;
|
|
105
|
+
/** What the server said, as text. */
|
|
106
|
+
readonly body: string;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* A failed request, with what the server answered.
|
|
110
|
+
* @param message - What failed, and why.
|
|
111
|
+
* @param status - The status answered, or 0 when nothing was.
|
|
112
|
+
* @param body - What the server said.
|
|
113
|
+
*/
|
|
114
|
+
constructor(message: string, status: number, body: string) {
|
|
115
|
+
super(message);
|
|
116
|
+
this.name = 'MoleculesError';
|
|
117
|
+
this.status = status;
|
|
118
|
+
this.body = body;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/** One molecule a source sends: its identifier, and exactly one notation. */
|
|
2
|
+
export interface MoleculeInput {
|
|
3
|
+
/** The source's identifier for it, which its address is written with. */
|
|
4
|
+
id: string;
|
|
5
|
+
/**
|
|
6
|
+
* The structure as SMILES.
|
|
7
|
+
* @default undefined - another notation is given
|
|
8
|
+
*/
|
|
9
|
+
smiles?: string;
|
|
10
|
+
/**
|
|
11
|
+
* The structure as a molfile.
|
|
12
|
+
* @default undefined - another notation is given
|
|
13
|
+
*/
|
|
14
|
+
molfile?: string;
|
|
15
|
+
/**
|
|
16
|
+
* The structure as an OpenChemLib idCode.
|
|
17
|
+
* @default undefined - another notation is given
|
|
18
|
+
*/
|
|
19
|
+
idCode?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** What molecules.cheminfo.org computed for a structure. */
|
|
23
|
+
export interface MoleculeInfo {
|
|
24
|
+
mf: string;
|
|
25
|
+
mw: number;
|
|
26
|
+
em: number;
|
|
27
|
+
charge: number;
|
|
28
|
+
idCode: string;
|
|
29
|
+
noStereoID: string;
|
|
30
|
+
noStereoTautomerID: string;
|
|
31
|
+
failedTautomerID: number;
|
|
32
|
+
/** The 512-bit FragFp, sixteen signed 32-bit words. */
|
|
33
|
+
ssIndex: number[];
|
|
34
|
+
logS: number;
|
|
35
|
+
logP: number;
|
|
36
|
+
acceptorCount: number;
|
|
37
|
+
donorCount: number;
|
|
38
|
+
stereoCenterCount: number;
|
|
39
|
+
rotatableBondCount: number;
|
|
40
|
+
polarSurfaceArea: number;
|
|
41
|
+
nbFragments: number;
|
|
42
|
+
/**
|
|
43
|
+
* The degree of unsaturation, when the formula has one.
|
|
44
|
+
* @default undefined
|
|
45
|
+
*/
|
|
46
|
+
unsaturation?: number;
|
|
47
|
+
atoms: Record<string, number>;
|
|
48
|
+
/** The hashes, as 16 hex digits: never JSON numbers, which would round them. */
|
|
49
|
+
idCodeHash: string;
|
|
50
|
+
noStereoHash: string;
|
|
51
|
+
noStereoTautomerHash: string;
|
|
52
|
+
createdAt: number | null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** What became of one molecule a source sent. */
|
|
56
|
+
export interface SubmitResult {
|
|
57
|
+
id: string | null;
|
|
58
|
+
/**
|
|
59
|
+
* The structure it was read as.
|
|
60
|
+
* @default undefined - it could not be read
|
|
61
|
+
*/
|
|
62
|
+
idCode?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Whether molecules.cheminfo.org held the structure already.
|
|
65
|
+
* @default undefined - it could not be read
|
|
66
|
+
*/
|
|
67
|
+
molecule?: 'created' | 'existing';
|
|
68
|
+
/**
|
|
69
|
+
* What became of the source's entry.
|
|
70
|
+
* @default undefined - it could not be read
|
|
71
|
+
*/
|
|
72
|
+
link?: 'added' | 'unchanged' | 'moved';
|
|
73
|
+
/**
|
|
74
|
+
* The computed properties, when they were asked for.
|
|
75
|
+
* @default undefined
|
|
76
|
+
*/
|
|
77
|
+
info?: MoleculeInfo;
|
|
78
|
+
/**
|
|
79
|
+
* Why the molecule was refused.
|
|
80
|
+
* @default undefined - it was taken
|
|
81
|
+
*/
|
|
82
|
+
error?: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** How a batch was taken. */
|
|
86
|
+
export interface SubmitSummary {
|
|
87
|
+
total: number;
|
|
88
|
+
/** Molecules new to molecules.cheminfo.org. */
|
|
89
|
+
created: number;
|
|
90
|
+
/** Entries new to the source. */
|
|
91
|
+
added: number;
|
|
92
|
+
/** Identifiers moved to another structure. */
|
|
93
|
+
moved: number;
|
|
94
|
+
unchanged: number;
|
|
95
|
+
failed: number;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** What `POST /v1/submit` answers: one result per molecule, in their order. */
|
|
99
|
+
export interface SubmitResponse {
|
|
100
|
+
source: string;
|
|
101
|
+
results: SubmitResult[];
|
|
102
|
+
summary: SubmitSummary;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** What `POST /v1/imports` answers: the start of a full import. */
|
|
106
|
+
export interface ImportStarted {
|
|
107
|
+
source: string;
|
|
108
|
+
importKey: number;
|
|
109
|
+
importStartedAt: number;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** What `GET /v1/imports` answers: where the source's import stands. */
|
|
113
|
+
export interface ImportState {
|
|
114
|
+
source: string;
|
|
115
|
+
importKey: number;
|
|
116
|
+
importStartedAt: number | null;
|
|
117
|
+
updatedAt: number | null;
|
|
118
|
+
entries: number;
|
|
119
|
+
stale: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** What a purge answers. */
|
|
123
|
+
export interface PurgeResponse {
|
|
124
|
+
source: string;
|
|
125
|
+
importKey: number;
|
|
126
|
+
dryRun: boolean;
|
|
127
|
+
/** The entries the import did not send again, removed or to be removed. */
|
|
128
|
+
removed: number;
|
|
129
|
+
/** The entries the source holds after. */
|
|
130
|
+
remaining: number;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** One answer of `POST /v1/batch`: the molecule a query reads as, or why not. */
|
|
134
|
+
export interface LookupResult {
|
|
135
|
+
query: string;
|
|
136
|
+
result: MoleculeInfo | null;
|
|
137
|
+
/** Whether molecules.cheminfo.org lists it, rather than computing it now. */
|
|
138
|
+
cached: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Why the query could not be read.
|
|
141
|
+
* @default undefined - it was read
|
|
142
|
+
*/
|
|
143
|
+
error?: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** What `POST /v1/batch` answers: one result per query, in their order. */
|
|
147
|
+
export interface LookupResponse {
|
|
148
|
+
results: LookupResult[];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Why a request is tried again, and when. */
|
|
152
|
+
export interface RetryDetails {
|
|
153
|
+
method: string;
|
|
154
|
+
path: string;
|
|
155
|
+
attempt: number;
|
|
156
|
+
/**
|
|
157
|
+
* The status that was answered.
|
|
158
|
+
* @default undefined - nothing was answered
|
|
159
|
+
*/
|
|
160
|
+
status?: number;
|
|
161
|
+
reason: string;
|
|
162
|
+
delayMs: number;
|
|
163
|
+
}
|