graphdb-workbench 3.1.1 → 3.2.0-TR1
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 +45 -0
- package/dist/10142.f47cd2aec05492fce7ce.bundle.js +2 -0
- package/dist/10142.f47cd2aec05492fce7ce.bundle.js.map +1 -0
- package/dist/10406.52677950658780fd8859.bundle.js +2 -0
- package/dist/{10406.7fed4b667b0d2813b305.bundle.js.map → 10406.52677950658780fd8859.bundle.js.map} +1 -1
- package/dist/12358.2061f29dc113149946a3.bundle.js +3 -0
- package/dist/12358.2061f29dc113149946a3.bundle.js.map +1 -0
- package/dist/12396.4c26c8da50c790b0f39a.bundle.js +2 -0
- package/dist/12396.4c26c8da50c790b0f39a.bundle.js.map +1 -0
- package/dist/14874.d6973a34188c0335fa12.bundle.js +2 -0
- package/dist/14874.d6973a34188c0335fa12.bundle.js.map +1 -0
- package/dist/15535.ce8d657c04f3401b9539.bundle.js +2 -0
- package/dist/15535.ce8d657c04f3401b9539.bundle.js.map +1 -0
- package/dist/16162.8f482628d1b34d41d496.bundle.js +2 -0
- package/dist/16162.8f482628d1b34d41d496.bundle.js.map +1 -0
- package/dist/{18961.d83ba5fd0855f3cfa7d7.bundle.js → 18961.c6505525fb0491b48f8b.bundle.js} +2 -2
- package/dist/{18961.d83ba5fd0855f3cfa7d7.bundle.js.map → 18961.c6505525fb0491b48f8b.bundle.js.map} +1 -1
- package/dist/19968.fdb823f9a12e11a633ec.bundle.js +2 -0
- package/dist/19968.fdb823f9a12e11a633ec.bundle.js.map +1 -0
- package/dist/20287.c42f9d1d913c36e46931.bundle.js +2 -0
- package/dist/20287.c42f9d1d913c36e46931.bundle.js.map +1 -0
- package/dist/20694.70b6e390d6397249c72d.bundle.js.map +1 -1
- package/dist/21136.199caea09a1c9ad90393.bundle.js +2 -0
- package/dist/21136.199caea09a1c9ad90393.bundle.js.map +1 -0
- package/dist/21142.b690e00c8884fddb2bb3.bundle.js +2 -0
- package/dist/21142.b690e00c8884fddb2bb3.bundle.js.map +1 -0
- package/dist/21170.d5e3041241741d21080c.bundle.js +2 -0
- package/dist/21170.d5e3041241741d21080c.bundle.js.map +1 -0
- package/dist/21195.267abc9d42b711d0f17a.bundle.js +2 -0
- package/dist/21195.267abc9d42b711d0f17a.bundle.js.map +1 -0
- package/dist/25747.4e00941ec221c4d6ce8f.bundle.js +2 -0
- package/dist/25747.4e00941ec221c4d6ce8f.bundle.js.map +1 -0
- package/dist/27580.f71ebbc69dd1c7785ef3.bundle.js +2 -0
- package/dist/27580.f71ebbc69dd1c7785ef3.bundle.js.map +1 -0
- package/dist/28050.8ca1fa760c892bfc5466.bundle.js +2 -0
- package/dist/28050.8ca1fa760c892bfc5466.bundle.js.map +1 -0
- package/dist/31636.e34ccc2d6f2dec577446.bundle.js +2 -0
- package/dist/31636.e34ccc2d6f2dec577446.bundle.js.map +1 -0
- package/dist/32489.97fac2c3daa49b143d13.bundle.js +2 -0
- package/dist/32489.97fac2c3daa49b143d13.bundle.js.map +1 -0
- package/dist/32534.fb6ef715bfb44761ec63.bundle.js +2 -0
- package/dist/32534.fb6ef715bfb44761ec63.bundle.js.map +1 -0
- package/dist/34495.cfa15bda8009fa37c6ff.bundle.js +2 -0
- package/dist/34495.cfa15bda8009fa37c6ff.bundle.js.map +1 -0
- package/dist/{38360.437a12fa59878d1d43b9.bundle.js → 38360.0a90e77042876c86b279.bundle.js} +2 -2
- package/dist/38360.0a90e77042876c86b279.bundle.js.map +1 -0
- package/dist/38412.fa86361561ffa367709f.bundle.js +2 -0
- package/dist/38412.fa86361561ffa367709f.bundle.js.map +1 -0
- package/dist/38644.3a0954c798ec413a3810.bundle.js +2 -0
- package/dist/38644.3a0954c798ec413a3810.bundle.js.map +1 -0
- package/dist/38843.5ef7a063337524ce3bb2.bundle.js +2 -0
- package/dist/38843.5ef7a063337524ce3bb2.bundle.js.map +1 -0
- package/dist/39518.4199684f3273d29d9105.bundle.js +2 -0
- package/dist/{39518.0ee809a85c83dba1f56a.bundle.js.map → 39518.4199684f3273d29d9105.bundle.js.map} +1 -1
- package/dist/39539.c23e4878044d73f2505b.bundle.js +2 -0
- package/dist/39539.c23e4878044d73f2505b.bundle.js.map +1 -0
- package/dist/{39874.c2d7cab1a65e5a869e78.bundle.js → 39874.f94a5059e1ae4f4a87e9.bundle.js} +2 -2
- package/dist/39874.f94a5059e1ae4f4a87e9.bundle.js.map +1 -0
- package/dist/41453.8bb4c783da2c5077a6e9.bundle.js +2 -0
- package/dist/41453.8bb4c783da2c5077a6e9.bundle.js.map +1 -0
- package/dist/42129.f44b7b20f9cd376c6e59.bundle.js +2 -0
- package/dist/42129.f44b7b20f9cd376c6e59.bundle.js.map +1 -0
- package/dist/44444.ad66c8256bc5b653de1a.bundle.js +2 -0
- package/dist/44444.ad66c8256bc5b653de1a.bundle.js.map +1 -0
- package/dist/44874.5854c207bbe2c4f2438e.bundle.js +2 -0
- package/dist/44874.5854c207bbe2c4f2438e.bundle.js.map +1 -0
- package/dist/45149.2f77aa736bbfb13fd987.bundle.js +2 -0
- package/dist/45149.2f77aa736bbfb13fd987.bundle.js.map +1 -0
- package/dist/45758.6ceb731cbe0576149f31.bundle.js +2 -0
- package/dist/45758.6ceb731cbe0576149f31.bundle.js.map +1 -0
- package/dist/{46591.ac9d19fd699104a9ed9b.bundle.js → 46591.0b142aa76a8991a89848.bundle.js} +2 -2
- package/dist/46591.0b142aa76a8991a89848.bundle.js.map +1 -0
- package/dist/55862.1fb5abd075ba11a7e93c.bundle.js +2 -0
- package/dist/55862.1fb5abd075ba11a7e93c.bundle.js.map +1 -0
- package/dist/58306.ba9545cbaee021ebcbce.bundle.js +2 -0
- package/dist/58306.ba9545cbaee021ebcbce.bundle.js.map +1 -0
- package/dist/{60560.024578077d95b851beea.bundle.js → 60560.37740d97b418899a5d21.bundle.js} +2 -2
- package/dist/{60560.024578077d95b851beea.bundle.js.map → 60560.37740d97b418899a5d21.bundle.js.map} +1 -1
- package/dist/67232.e76f40f9d09e64ebb365.bundle.js.map +1 -1
- package/dist/67888.7d4966e0a22ba655f1b8.bundle.js +2 -0
- package/dist/67888.7d4966e0a22ba655f1b8.bundle.js.map +1 -0
- package/dist/72379.bac50d0011665a85b6cd.bundle.js +2 -0
- package/dist/72379.bac50d0011665a85b6cd.bundle.js.map +1 -0
- package/dist/73667.3dd4f377e7ef54fd8758.bundle.js +2 -0
- package/dist/73667.3dd4f377e7ef54fd8758.bundle.js.map +1 -0
- package/dist/73779.193df86f08e3a1d06d67.bundle.js +2 -0
- package/dist/73779.193df86f08e3a1d06d67.bundle.js.map +1 -0
- package/dist/73793.6d80d47c26ed60a587fd.bundle.js +2 -0
- package/dist/73793.6d80d47c26ed60a587fd.bundle.js.map +1 -0
- package/dist/75282.88819e851ed18720b275.bundle.js +2 -0
- package/dist/75282.88819e851ed18720b275.bundle.js.map +1 -0
- package/dist/75849.51ade15bf0074eab76f3.bundle.js +2 -0
- package/dist/75849.51ade15bf0074eab76f3.bundle.js.map +1 -0
- package/dist/78013.e32fade7ad42b64c8122.bundle.js +2 -0
- package/dist/78013.e32fade7ad42b64c8122.bundle.js.map +1 -0
- package/dist/78250.6db42146a120459280e4.bundle.js +2 -0
- package/dist/78250.6db42146a120459280e4.bundle.js.map +1 -0
- package/dist/{78681.e44a1eb1dce4a8a29f57.bundle.js → 78681.39694d37c0f75ea04df6.bundle.js} +2 -2
- package/dist/{78681.e44a1eb1dce4a8a29f57.bundle.js.map → 78681.39694d37c0f75ea04df6.bundle.js.map} +1 -1
- package/dist/79329.5a5cbfa466d1c62af915.bundle.js +2 -0
- package/dist/79329.5a5cbfa466d1c62af915.bundle.js.map +1 -0
- package/dist/82206.8ec983edcf675cfd4531.bundle.js +2 -0
- package/dist/82206.8ec983edcf675cfd4531.bundle.js.map +1 -0
- package/dist/82896.9aed45baf67510717c6f.bundle.js +2 -0
- package/dist/82896.9aed45baf67510717c6f.bundle.js.map +1 -0
- package/dist/{82926.f625cc022724426fb8fb.bundle.js → 82926.93dbf44f2bcccba34e9b.bundle.js} +2 -2
- package/dist/{82926.f625cc022724426fb8fb.bundle.js.map → 82926.93dbf44f2bcccba34e9b.bundle.js.map} +1 -1
- package/dist/85281.27b5a1eb8e7ac2cf8459.bundle.js +2 -0
- package/dist/85281.27b5a1eb8e7ac2cf8459.bundle.js.map +1 -0
- package/dist/{88206.fbbcf8ccd9460c579e87.bundle.js → 88206.28c337e2edbf17928836.bundle.js} +2 -2
- package/dist/88206.28c337e2edbf17928836.bundle.js.map +1 -0
- package/dist/9062.d9049833d076191d3e1a.bundle.js +2 -0
- package/dist/9062.d9049833d076191d3e1a.bundle.js.map +1 -0
- package/dist/99379.be6c85ef305af6667dc1.bundle.js +2 -0
- package/dist/99379.be6c85ef305af6667dc1.bundle.js.map +1 -0
- package/dist/99448.314018d0afb1af150ddf.bundle.js +2 -0
- package/dist/99448.314018d0afb1af150ddf.bundle.js.map +1 -0
- package/dist/api/error/error-base.d.ts +1 -1
- package/dist/api/ontotext-workbench-api.js +1 -1
- package/dist/api/ontotext-workbench-api.js.map +1 -1
- package/dist/i18n/locale-en.json +31 -0
- package/dist/i18n/locale-fr.json +31 -0
- package/dist/index.html +8 -8
- package/dist/js/angular/clustermanagement/templates/cluster-nodes-configuration.html +1 -1
- package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +1 -1
- package/dist/js/angular/core/directives/dynamic-form/templates/dynamic-form.html +1 -1
- package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +1 -1
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +1 -1
- package/dist/js/angular/core/directives/shuttle-multiselect/templates/shuttle-multiselect.html +1 -1
- package/dist/js/angular/core/directives/yasgui-component/templates/yasgui-component.html +1 -1
- package/dist/js/angular/core/templates/cookie-policy/cookie-consent.html +1 -1
- package/dist/js/angular/core/templates/cookie-policy/cookie-policy.html +1 -1
- package/dist/js/angular/core/templates/editable-content/editable-content.html +1 -1
- package/dist/js/angular/core/templates/markdown-content/markdown-content.html +1 -1
- package/dist/js/angular/core/templates/search-resource-input.html +1 -1
- package/dist/js/angular/graphql/templates/create-graphql-endpoint.html +4 -3
- package/dist/js/angular/graphql/templates/graphql-endpoint-management.html +1 -1
- package/dist/js/angular/graphql/templates/graphql-playground.html +1 -1
- package/dist/js/angular/graphql/templates/modal/endpoint-configuration-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/endpoint-generation-failure-result-modal.html +1 -1
- package/dist/js/angular/graphql/templates/modal/import-endpoint-definition-modal.html +1 -1
- package/dist/js/angular/security/templates/user.html +2 -2
- package/dist/js/angular/ttyg/templates/agent-list.html +1 -1
- package/dist/js/angular/ttyg/templates/agent-select-menu.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-item-detail.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-list.html +1 -1
- package/dist/js/angular/ttyg/templates/chat-panel.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-instructions-explain-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/modal/agent-settings-modal.html +2 -2
- package/dist/js/angular/ttyg/templates/modal/external-integration-configuration-modal.html +1 -1
- package/dist/js/angular/ttyg/templates/no-agents-view.html +1 -1
- package/dist/js/angular/ttyg/templates/ttyg.html +1 -1
- package/dist/legacyWorkbench.57fc12c172f6350ac4c5.js +3 -0
- package/dist/{legacyWorkbench.ad1d42d21ac42beabeb4.js.map → legacyWorkbench.57fc12c172f6350ac4c5.js.map} +1 -1
- package/dist/{main.400f2248f076a2d31d80.js → main.b9a83da68ffc43c91de0.js} +3 -3
- package/dist/{main.400f2248f076a2d31d80.js.map → main.b9a83da68ffc43c91de0.js.map} +1 -1
- package/dist/pages/aclmanagement.html +2 -2
- package/dist/pages/autocomplete.html +1 -1
- package/dist/pages/choose-repository-type.html +1 -1
- package/dist/pages/cluster-management/clusterInfo.html +3 -3
- package/dist/pages/create-index.html +1 -1
- package/dist/pages/dependencies.html +1 -1
- package/dist/pages/domainRangeInfo.html +2 -2
- package/dist/pages/edit.html +1 -1
- package/dist/pages/explore.html +1 -1
- package/dist/pages/export.html +1 -1
- package/dist/pages/find.html +1 -1
- package/dist/pages/graph-config/saveGraphConfig.html +8 -8
- package/dist/pages/graphs-visualizations.html +7 -7
- package/dist/pages/guides.html +1 -1
- package/dist/pages/import.html +2 -2
- package/dist/pages/jdbc-create.html +1 -1
- package/dist/pages/login.html +1 -1
- package/dist/pages/monitor/backup-and-restore.html +1 -1
- package/dist/pages/monitor/queries.html +1 -1
- package/dist/pages/monitor/resources.html +1 -1
- package/dist/pages/namespaces.html +2 -2
- package/dist/pages/plugins.html +1 -1
- package/dist/pages/rdfClassHierarchyInfo.html +7 -7
- package/dist/pages/rdfrank.html +2 -2
- package/dist/pages/repositories.html +1 -1
- package/dist/pages/repository.html +1 -1
- package/dist/pages/similarity-indexes.html +1 -1
- package/dist/pages/sparql-editor.html +1 -1
- package/dist/pages/sparql-template-create.html +1 -1
- package/dist/pages/ux-test1.html +2 -2
- package/dist/pages/webapi.html +2 -2
- package/dist/plugins.js +1 -1
- package/dist/res/swagger5/css/onto-theme.css +1 -1
- package/dist/res/swagger5/index.html +11 -11
- package/dist/shared-components/cjs/onto-cookie-consent_2.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-dialog_2.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-dropdown.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-footer_6.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-language-selector_9.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/onto-layout.cjs.entry.js +1 -1
- package/dist/shared-components/cjs/translate-label.cjs.entry.js +1 -1
- package/dist/shared-components/collection/components/dialogs/onto-cookie-policy-dialog/onto-cookie-policy-dialog.js +1 -1
- package/dist/shared-components/collection/components/dialogs/onto-dialog.js +1 -1
- package/dist/shared-components/collection/components/onto-cookie-consent/onto-cookie-consent.js +1 -1
- package/dist/shared-components/collection/components/onto-dropdown/onto-dropdown.js +1 -1
- package/dist/shared-components/collection/components/onto-footer/onto-footer.js +1 -1
- package/dist/shared-components/collection/components/onto-header/onto-header.js +1 -1
- package/dist/shared-components/collection/components/onto-language-selector/onto-language-selector.js +1 -1
- package/dist/shared-components/collection/components/onto-layout/onto-layout.js +1 -1
- package/dist/shared-components/collection/components/onto-navbar/navbar-model.js +1 -1
- package/dist/shared-components/collection/components/onto-navbar/navbar-service.js +1 -1
- package/dist/shared-components/collection/components/onto-operations-notification/onto-operations-notification.js +1 -1
- package/dist/shared-components/collection/components/onto-rdf-search/onto-rdf-search.js +1 -1
- package/dist/shared-components/collection/components/onto-repository-selector/onto-repository-selector.js +1 -1
- package/dist/shared-components/collection/components/onto-search-icon/onto-search-icon.js +1 -1
- package/dist/shared-components/collection/components/onto-search-resource-input/onto-search-resource-input.js +1 -1
- package/dist/shared-components/collection/components/onto-toastr/onto-toastr.js +1 -1
- package/dist/shared-components/collection/components/onto-toggle-switch/onto-toggle-switch.js +1 -1
- package/dist/shared-components/collection/components/onto-tooltip/onto-tooltip.js +1 -1
- package/dist/shared-components/collection/components/translate-label/translate-label.js +1 -1
- package/dist/shared-components/esm/onto-cookie-consent_2.entry.js +1 -1
- package/dist/shared-components/esm/onto-dialog_2.entry.js +1 -1
- package/dist/shared-components/esm/onto-dropdown.entry.js +1 -1
- package/dist/shared-components/esm/onto-footer_6.entry.js +1 -1
- package/dist/shared-components/esm/onto-language-selector_9.entry.js +1 -1
- package/dist/shared-components/esm/onto-layout.entry.js +1 -1
- package/dist/shared-components/esm/translate-label.entry.js +1 -1
- package/dist/shared-components/shared-components/p-17bac1e3.entry.js +1 -0
- package/dist/shared-components/shared-components/p-1bc2ac8e.entry.js +1 -0
- package/dist/shared-components/shared-components/p-2433b25f.entry.js +1 -0
- package/dist/shared-components/shared-components/p-25fa0ee5.entry.js +1 -0
- package/dist/shared-components/shared-components/{p-a4e82a3f.entry.js → p-6266be98.entry.js} +1 -1
- package/dist/shared-components/shared-components/{p-eed8b067.entry.js → p-91ad7f7f.entry.js} +1 -1
- package/dist/shared-components/shared-components/p-aef0b970.entry.js +1 -0
- package/dist/shared-components/shared-components/shared-components.esm.js +1 -1
- package/dist/shared-components/types/components/onto-dropdown/onto-dropdown.d.ts +2 -2
- package/dist/shared-components/types/components/onto-navbar/navbar-model.d.ts +4 -1
- package/dist/shared-components/types/components/onto-navbar/navbar-toggled-event.d.ts +1 -1
- package/dist/shared-components/types/components/onto-navbar/onto-navbar.d.ts +2 -2
- package/dist/shared-components/types/components/onto-test-context/onto-test-context.d.ts +23 -23
- package/dist/shared-components/types/components/onto-tooltip/models/onto-tooltip-configuration.d.ts +1 -2
- package/dist/shared-components/types/components.d.ts +4 -4
- package/dist/shared-components/types/models/component-event.d.ts +1 -1
- package/dist/shared-components/types/utils/function-utils.d.ts +1 -1
- package/dist/shared-components/types/utils/tooltip-util.d.ts +2 -2
- package/dist/workbench/workbench/workbenchApp.js +1 -1
- package/package.json +8 -2
- package/dist/10142.6a276ff32f58aa4d1b72.bundle.js +0 -2
- package/dist/10142.6a276ff32f58aa4d1b72.bundle.js.map +0 -1
- package/dist/10153.1532fddd43604bf408c3.bundle.js +0 -2
- package/dist/10153.1532fddd43604bf408c3.bundle.js.map +0 -1
- package/dist/10406.7fed4b667b0d2813b305.bundle.js +0 -2
- package/dist/12358.736ea9c178c92655de3a.bundle.js +0 -3
- package/dist/12358.736ea9c178c92655de3a.bundle.js.map +0 -1
- package/dist/12396.47201b3f37dcfe963353.bundle.js +0 -2
- package/dist/12396.47201b3f37dcfe963353.bundle.js.map +0 -1
- package/dist/14874.17bc671b6ff6123b9eb1.bundle.js +0 -2
- package/dist/14874.17bc671b6ff6123b9eb1.bundle.js.map +0 -1
- package/dist/15535.e3d3f8071a4cc462b5eb.bundle.js +0 -2
- package/dist/15535.e3d3f8071a4cc462b5eb.bundle.js.map +0 -1
- package/dist/16162.bc70365c3f546e70a3e9.bundle.js +0 -2
- package/dist/16162.bc70365c3f546e70a3e9.bundle.js.map +0 -1
- package/dist/20287.c3d0095a3a5f18cd0087.bundle.js +0 -2
- package/dist/20287.c3d0095a3a5f18cd0087.bundle.js.map +0 -1
- package/dist/21136.fb6d69cd9e6dd31a65b2.bundle.js +0 -2
- package/dist/21136.fb6d69cd9e6dd31a65b2.bundle.js.map +0 -1
- package/dist/21142.0589f58f1a3b49b4fcfa.bundle.js +0 -2
- package/dist/21142.0589f58f1a3b49b4fcfa.bundle.js.map +0 -1
- package/dist/21170.8126948c956555b4f9ff.bundle.js +0 -2
- package/dist/21170.8126948c956555b4f9ff.bundle.js.map +0 -1
- package/dist/21195.77df14ed68c1f286839a.bundle.js +0 -2
- package/dist/21195.77df14ed68c1f286839a.bundle.js.map +0 -1
- package/dist/25747.612b1bce6250300d137f.bundle.js +0 -2
- package/dist/25747.612b1bce6250300d137f.bundle.js.map +0 -1
- package/dist/27580.88bc1444d863327a3697.bundle.js +0 -2
- package/dist/27580.88bc1444d863327a3697.bundle.js.map +0 -1
- package/dist/28050.1359d262b2e2c497ad6d.bundle.js +0 -2
- package/dist/28050.1359d262b2e2c497ad6d.bundle.js.map +0 -1
- package/dist/31636.625df78d380dadd69c07.bundle.js +0 -2
- package/dist/31636.625df78d380dadd69c07.bundle.js.map +0 -1
- package/dist/32489.5f438460389d65300913.bundle.js +0 -2
- package/dist/32489.5f438460389d65300913.bundle.js.map +0 -1
- package/dist/32534.73081e468e918a03bd70.bundle.js +0 -2
- package/dist/32534.73081e468e918a03bd70.bundle.js.map +0 -1
- package/dist/32606.376e14770ba6e81b7159.bundle.js +0 -2
- package/dist/32606.376e14770ba6e81b7159.bundle.js.map +0 -1
- package/dist/34495.e0f8e26f32d7d8def627.bundle.js +0 -2
- package/dist/34495.e0f8e26f32d7d8def627.bundle.js.map +0 -1
- package/dist/38360.437a12fa59878d1d43b9.bundle.js.map +0 -1
- package/dist/38412.85b4c12f5ed5ffb6e4dd.bundle.js +0 -2
- package/dist/38412.85b4c12f5ed5ffb6e4dd.bundle.js.map +0 -1
- package/dist/38644.6e82d4276df028701834.bundle.js +0 -2
- package/dist/38644.6e82d4276df028701834.bundle.js.map +0 -1
- package/dist/38843.428e7caf2e6805840b83.bundle.js +0 -2
- package/dist/38843.428e7caf2e6805840b83.bundle.js.map +0 -1
- package/dist/39518.0ee809a85c83dba1f56a.bundle.js +0 -2
- package/dist/39539.2a03bf4161ee846817d3.bundle.js +0 -2
- package/dist/39539.2a03bf4161ee846817d3.bundle.js.map +0 -1
- package/dist/39874.c2d7cab1a65e5a869e78.bundle.js.map +0 -1
- package/dist/41453.5370acf9540ff5382268.bundle.js +0 -2
- package/dist/41453.5370acf9540ff5382268.bundle.js.map +0 -1
- package/dist/42129.02f0b477c276dceb732c.bundle.js +0 -2
- package/dist/42129.02f0b477c276dceb732c.bundle.js.map +0 -1
- package/dist/44444.57b74adca89db793b77c.bundle.js +0 -2
- package/dist/44444.57b74adca89db793b77c.bundle.js.map +0 -1
- package/dist/44874.60bab9adf89019b35654.bundle.js +0 -2
- package/dist/44874.60bab9adf89019b35654.bundle.js.map +0 -1
- package/dist/45758.4e363b98020c3460b4ff.bundle.js +0 -2
- package/dist/45758.4e363b98020c3460b4ff.bundle.js.map +0 -1
- package/dist/46591.ac9d19fd699104a9ed9b.bundle.js.map +0 -1
- package/dist/55862.81467f263f3c46d9d889.bundle.js +0 -2
- package/dist/55862.81467f263f3c46d9d889.bundle.js.map +0 -1
- package/dist/58163.747b20ea052b22b24bd0.bundle.js +0 -2
- package/dist/58163.747b20ea052b22b24bd0.bundle.js.map +0 -1
- package/dist/58306.0ca44cc562ab1135c44b.bundle.js +0 -2
- package/dist/58306.0ca44cc562ab1135c44b.bundle.js.map +0 -1
- package/dist/67888.cc78716f885f98366859.bundle.js +0 -2
- package/dist/67888.cc78716f885f98366859.bundle.js.map +0 -1
- package/dist/72379.4023fb8f5c0dd8f32faa.bundle.js +0 -2
- package/dist/72379.4023fb8f5c0dd8f32faa.bundle.js.map +0 -1
- package/dist/73667.6925315f2649c49bade2.bundle.js +0 -2
- package/dist/73667.6925315f2649c49bade2.bundle.js.map +0 -1
- package/dist/73779.c4608b73b63083cb3352.bundle.js +0 -2
- package/dist/73779.c4608b73b63083cb3352.bundle.js.map +0 -1
- package/dist/73793.0cd99844e3792d5beb8c.bundle.js +0 -2
- package/dist/73793.0cd99844e3792d5beb8c.bundle.js.map +0 -1
- package/dist/75282.1005c493f43b9d6dcc5a.bundle.js +0 -2
- package/dist/75282.1005c493f43b9d6dcc5a.bundle.js.map +0 -1
- package/dist/75849.39b30ee4eb2f1b35f762.bundle.js +0 -2
- package/dist/75849.39b30ee4eb2f1b35f762.bundle.js.map +0 -1
- package/dist/78250.8462f5662da1fd9ece0b.bundle.js +0 -2
- package/dist/78250.8462f5662da1fd9ece0b.bundle.js.map +0 -1
- package/dist/79329.cd81f51fd3aed8ca8359.bundle.js +0 -2
- package/dist/79329.cd81f51fd3aed8ca8359.bundle.js.map +0 -1
- package/dist/82206.b3b37c3e0cc1aa18148c.bundle.js +0 -2
- package/dist/82206.b3b37c3e0cc1aa18148c.bundle.js.map +0 -1
- package/dist/85281.049ddec87de0b8b07e79.bundle.js +0 -2
- package/dist/85281.049ddec87de0b8b07e79.bundle.js.map +0 -1
- package/dist/88206.fbbcf8ccd9460c579e87.bundle.js.map +0 -1
- package/dist/9062.2b577ad9fc05b48b64a3.bundle.js +0 -2
- package/dist/9062.2b577ad9fc05b48b64a3.bundle.js.map +0 -1
- package/dist/99379.d5dffb14dd46150e91f9.bundle.js +0 -2
- package/dist/99379.d5dffb14dd46150e91f9.bundle.js.map +0 -1
- package/dist/99448.98a68cbf8bf84857b615.bundle.js +0 -2
- package/dist/99448.98a68cbf8bf84857b615.bundle.js.map +0 -1
- package/dist/legacyWorkbench.ad1d42d21ac42beabeb4.js +0 -3
- package/dist/shared-components/shared-components/p-106d7df8.entry.js +0 -1
- package/dist/shared-components/shared-components/p-17ce51bb.entry.js +0 -1
- package/dist/shared-components/shared-components/p-306527cc.entry.js +0 -1
- package/dist/shared-components/shared-components/p-96e87635.entry.js +0 -1
- package/dist/shared-components/shared-components/p-af359495.entry.js +0 -1
- /package/dist/{12358.736ea9c178c92655de3a.bundle.js.LICENSE.txt → 12358.2061f29dc113149946a3.bundle.js.LICENSE.txt} +0 -0
- /package/dist/{legacyWorkbench.ad1d42d21ac42beabeb4.js.LICENSE.txt → legacyWorkbench.57fc12c172f6350ac4c5.js.LICENSE.txt} +0 -0
- /package/dist/{main.400f2248f076a2d31d80.js.LICENSE.txt → main.b9a83da68ffc43c91de0.js.LICENSE.txt} +0 -0
- /package/dist/shared-components/cjs/{tooltip-util-CmDLnWqH.js → tooltip-util-CnEXLMnw.js} +0 -0
- /package/dist/shared-components/esm/{tooltip-util-C1So-qrf.js → tooltip-util-BqOc8q8q.js} +0 -0
- /package/dist/shared-components/shared-components/{p-Bisudk7O.js → p-DzOPDgzQ.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ontotext-workbench-api.js","mappings":"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","sources":["webpack://workbench-api/./src/services/utils/object-util.ts","webpack://workbench-api/./src/models/common/model.ts","webpack://workbench-api/./src/models/common/model-list.ts","webpack://workbench-api/./src/models/common/subscription-list.ts","webpack://workbench-api/./src/models/repositories/repository.ts","webpack://workbench-api/./src/models/repositories/repository-list.ts","webpack://workbench-api/./src/models/repositories/repository-size-info.ts","webpack://workbench-api/./src/models/repositories/repository-state.ts","webpack://workbench-api/./src/models/repositories/repository-type.ts","webpack://workbench-api/./src/models/repositories/namespace/namespace-map.ts","webpack://workbench-api/./src/models/repository-location/repository-location.ts","webpack://workbench-api/./src/models/repository-location/repository-location-type.ts","webpack://workbench-api/./src/models/events/event.ts","webpack://workbench-api/./src/models/events/event-name.ts","webpack://workbench-api/./src/models/events/navigation/navigation-end.ts","webpack://workbench-api/./src/models/events/navigation/navigation-end-payload.ts","webpack://workbench-api/./src/models/events/navigation/navigation-start.ts","webpack://workbench-api/./src/models/events/auth/logout.ts","webpack://workbench-api/./src/models/security/authentication-type.ts","webpack://workbench-api/./src/providers/mapper/mapper.provider.ts","webpack://workbench-api/./src/providers/service/service.provider.ts","webpack://workbench-api/./src/providers/service/service-inject.ts","webpack://workbench-api/./src/models/security/authority-list.ts","webpack://workbench-api/./src/providers/mapper/mapper.ts","webpack://workbench-api/./src/services/security/mappers/authority-list.mapper.ts","webpack://workbench-api/./src/models/security/authenticated-user.ts","webpack://workbench-api/./src/models/security/auth-settings.ts","webpack://workbench-api/./src/services/security/mappers/auth-settings.mapper.ts","webpack://workbench-api/./src/models/security/security-config.ts","webpack://workbench-api/./src/models/security/authority.ts","webpack://workbench-api/./src/models/security/restricted-pages.ts","webpack://workbench-api/./src/models/security/openid-config.ts","webpack://workbench-api/./src/models/security/rights.ts","webpack://workbench-api/./src/services/license/mappers/capability-list.mapper.ts","webpack://workbench-api/./src/models/license/license.ts","webpack://workbench-api/./src/models/license/capability.ts","webpack://workbench-api/./src/models/license/capability-list.ts","webpack://workbench-api/./src/models/product-info/product-info.ts","webpack://workbench-api/./src/models/storage/storage-data.ts","webpack://workbench-api/./src/models/storage/storage-key.ts","webpack://workbench-api/./src/models/language/available-languages-list.ts","webpack://workbench-api/./src/services/language/mappers/available-languages-list-mapper.ts","webpack://workbench-api/./src/models/language/language-config.ts","webpack://workbench-api/./src/models/cookie/cookie-consent.ts","webpack://workbench-api/./src/models/monitoring/operation-status.ts","webpack://workbench-api/./src/models/monitoring/operation-group-summary.ts","webpack://workbench-api/./src/models/monitoring/operation-status-summary.ts","webpack://workbench-api/./src/models/monitoring/operation-list.ts","webpack://workbench-api/./src/models/monitoring/operation-type.ts","webpack://workbench-api/./src/models/monitoring/operation-group.ts","webpack://workbench-api/./src/models/monitoring/operation.ts","webpack://workbench-api/./src/models/monitoring/operation-group-summary-list.ts","webpack://workbench-api/./src/models/toastr/toastr-position.ts","webpack://workbench-api/./src/models/toastr/toast-config.ts","webpack://workbench-api/./src/models/toastr/toastr-config.ts","webpack://workbench-api/./src/models/toastr/toast-type.ts","webpack://workbench-api/./src/services/utils/generator-utils.ts","webpack://workbench-api/./src/models/toastr/toast-message.ts","webpack://workbench-api/./src/models/toastr/toastr-constants.ts","webpack://workbench-api/./src/models/toastr/toast-message-list.ts","webpack://workbench-api/./src/models/rdf-search/search-button-list.ts","webpack://workbench-api/./src/models/rdf-search/search-button-config.ts","webpack://workbench-api/./src/models/rdf-search/search-button.ts","webpack://workbench-api/./src/models/rdf-search/suggestion-list.ts","webpack://workbench-api/./src/models/rdf-search/autocomplete-search-result.ts","webpack://workbench-api/./src/models/rdf-search/suggestion.ts","webpack://workbench-api/./src/models/rdf-search/suggestion-type.ts","webpack://workbench-api/./src/models/rdf-search/suggestion-selected-payload.ts","webpack://workbench-api/./src/models/app-lifecycle/lifecycle-state.ts","webpack://workbench-api/./src/models/plugins/plugins-manifest.ts","webpack://workbench-api/./src/models/plugins/extension-point.ts","webpack://workbench-api/./src/models/plugins/plugin-definition-list.ts","webpack://workbench-api/./src/models/context/value-context.ts","webpack://workbench-api/./src/services/context/context-subscription-manager.ts","webpack://workbench-api/./src/services/context/context.service.ts","webpack://workbench-api/./src/models/interceptor/http-interceptor.ts","webpack://workbench-api/./src/services/storage/local-storage.service.ts","webpack://workbench-api/./src/services/storage/local-storage-subscription-handler.service.ts","webpack://workbench-api/./src/services/security/authentication-storage.service.ts","webpack://workbench-api/./src/services/repository/repository-storage.service.ts","webpack://workbench-api/./src/services/security/security-context.service.ts","webpack://workbench-api/./src/services/window/window.service.ts","webpack://workbench-api/./src/services/utils/routing-utils.ts","webpack://workbench-api/./src/interceptor/interceptors.ts","webpack://workbench-api/./src/interceptor/auth/auth-request-interceptor.ts","webpack://workbench-api/./src/interceptor/auth/unauthorized-interceptor.ts","webpack://workbench-api/./src/services/interceptor/interceptor.service.ts","webpack://workbench-api/./src/models/http/http-request.ts","webpack://workbench-api/./src/emitters/event.emitter.ts","webpack://workbench-api/./src/services/http/http.service.ts","webpack://workbench-api/./src/services/language/language-rest.service.ts","webpack://workbench-api/./src/services/language/mappers/language-config-mapper.ts","webpack://workbench-api/./src/services/language/language-storage.service.ts","webpack://workbench-api/./src/services/language/language-context.service.ts","webpack://workbench-api/./src/services/language/language.service.ts","webpack://workbench-api/./src/services/repository/repository-rest.service.ts","webpack://workbench-api/./src/services/repository/mappers/repository.mapper.ts","webpack://workbench-api/./src/services/repository/mappers/repository-list.mapper.ts","webpack://workbench-api/./src/services/repository/mappers/repository-size-info.mapper.ts","webpack://workbench-api/./src/services/repository/repository.service.ts","webpack://workbench-api/./src/services/repository/repository-context.service.ts","webpack://workbench-api/./src/services/repository-location/repository-location-rest.service.ts","webpack://workbench-api/./src/services/repository-location/mappers/repository-location.mapper.ts","webpack://workbench-api/./src/services/repository-location/repository-location.service.ts","webpack://workbench-api/./src/services/repository-location/repository-location-context.service.ts","webpack://workbench-api/./src/services/license/license-rest.service.ts","webpack://workbench-api/./src/services/license/mappers/license-mapper.ts","webpack://workbench-api/./src/services/license/license-context.service.ts","webpack://workbench-api/./src/services/license/license.service.ts","webpack://workbench-api/./src/services/product-info/product-info-context.service.ts","webpack://workbench-api/./src/services/product-info/mappers/product-info.mapper.ts","webpack://workbench-api/./src/services/product-info/product-info-rest.service.ts","webpack://workbench-api/./src/services/product-info/product-info.service.ts","webpack://workbench-api/./src/services/security/mappers/security-config.mapper.ts","webpack://workbench-api/./src/models/events/event-observer.ts","webpack://workbench-api/./src/services/event-service/event.service.ts","webpack://workbench-api/./src/models/routing/route-regex-param-pair.ts","webpack://workbench-api/./src/models/routing/route-item-model.ts","webpack://workbench-api/./src/services/routing/routing.service.ts","webpack://workbench-api/./src/services/security/authentication.service.ts","webpack://workbench-api/./src/services/security/mappers/authenticated-user.mapper.ts","webpack://workbench-api/./src/services/security/security-rest.service.ts","webpack://workbench-api/./src/services/security/security.service.ts","webpack://workbench-api/./src/services/security/openid-config.mapper.ts","webpack://workbench-api/./src/services/cookie/cookie.service.ts","webpack://workbench-api/./src/services/monitoring/monitoring-rest.service.ts","webpack://workbench-api/./src/services/monitoring/mapper/operation-list.mapper.ts","webpack://workbench-api/./src/services/monitoring/mapper/operation-summary-mapper.ts","webpack://workbench-api/./src/services/monitoring/monitoring.service.ts","webpack://workbench-api/./src/services/monitoring/mapper/operation-group-summary-list.mapper.ts","webpack://workbench-api/./src/services/toastr/onto-toastr.service.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete-rest.service.ts","webpack://workbench-api/./src/services/rdf-search/mapper/suggestion-list.mapper.ts","webpack://workbench-api/./src/services/autocomplete/mapper/autocomplete-search-result.mapper.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete.service.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete-storage.service.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete-context.service.ts","webpack://workbench-api/./src/services/repository/mappers/namespace-map.mapper.ts","webpack://workbench-api/./src/services/namespace/namespaces-rest.service.ts","webpack://workbench-api/./src/services/namespace/namespaces.service.ts","webpack://workbench-api/./src/services/namespace/namespaces-context.service.ts","webpack://workbench-api/./src/services/rdf-search/resource-search-storage.service.ts","webpack://workbench-api/./src/services/navigation/navigation-context.service.ts","webpack://workbench-api/./src/services/app-lifecycle/application-lifecycle-context.service.ts","webpack://workbench-api/./src/services/configuration/configuration-context.service.ts","webpack://workbench-api/./src/services/plugins/plugins-rest.service.ts","webpack://workbench-api/./src/services/plugins/mapper/plugins-manifest.mapper.ts","webpack://workbench-api/./src/services/plugins/plugins.service.ts","webpack://workbench-api/./src/error/error-base.ts","webpack://workbench-api/./src/services/configuration/missing-application-configuration-error.ts","webpack://workbench-api/./src/services/configuration/configuration-rest.service.ts","webpack://workbench-api/./src/services/configuration/configuration.service.ts","webpack://workbench-api/./src/services/utils/build-util.ts","webpack://workbench-api/./src/services/utils/uri-util.ts","webpack://workbench-api/./src/services/utils/fibonacci-generator.ts"],"sourcesContent":["export class ObjectUtil {\n\n /**\n * Performs a deep equality check between two values.\n *\n * This function compares two values to determine if they are deeply equal.\n * It supports comparison of primitives, arrays, and objects, including nested structures.\n *\n * @param obj1 - The first value to compare.\n * @param obj2 - The second value to compare.\n * @returns `true` if both values are deeply equal, otherwise `false`.\n *\n * @example\n * // Comparing two deeply nested objects\n * const obj1 = { a: 1, b: { c: [1, 2, 3], d: { e: 'hello' } } };\n * const obj2 = { a: 1, b: { c: [1, 2, 3], d: { e: 'hello' } } };\n * console.log(deepEqual(obj1, obj2)); // true\n *\n * @example\n * // Comparing two arrays with different values\n * const arr1 = [1, 2, 3];\n * const arr2 = [1, 2, 4];\n * console.log(deepEqual(arr1, arr2)); // false\n */\n static deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Check if both values are strictly equal (handles primitives and references)\n if (obj1 === obj2) {\n return true;\n }\n\n // Check if either value is null or undefined\n if (obj1 === null || obj1 === undefined || obj2 === null || obj2 === undefined) {\n return false;\n }\n\n // Check if both values are objects\n if (typeof obj1 === 'object' && typeof obj2 === 'object') {\n // Ensure both have the same constructor (handles different types of objects, like Date, RegExp)\n if (obj1.constructor !== obj2.constructor) {\n return false;\n }\n\n // Handle arrays\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\n // Check if both arrays have the same length\n if (obj1.length !== obj2.length) {\n return false;\n }\n\n // Compare each element recursively\n for (let i = 0; i < obj1.length; i++) {\n if (!ObjectUtil.deepEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n // Handle plain objects\n if (!Array.isArray(obj1) && !Array.isArray(obj2)) {\n const keys1 = Object.keys(obj1) as string[];\n const keys2 = Object.keys(obj2) as string[];\n\n // Check if both objects have the same number of keys\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n // Check if all keys and values are deeply equal\n for (const key of keys1) {\n if (\n !(key in obj2) || // Ensure the key exists in obj2\n !ObjectUtil.deepEqual(\n (obj1 as Record<string, unknown>)[key],\n (obj2 as Record<string, unknown>)[key]\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n // If one is an array and the other is not, they are not equal\n return false;\n }\n\n // Default case: Not equal\n return false;\n }\n\n /**\n * Creates a deep copy of the given object.\n *\n * This method recursively copies all properties and values of the object,\n * handling different types such as primitives, arrays, and plain objects.\n * It ensures that the copied object does not share references with the original object,\n * meaning that all nested structures are also copied independently.\n *\n * @param obj - The object to be deeply copied. Can be any type, including primitives,\n * arrays, or objects.\n * @returns A deep copy of the object. If the input is a primitive, null, undefined,\n * or a function, the original value is returned as-is.\n */\n static deepCopy(obj: unknown): unknown {\n // Handle primitives, null, undefined, and functions\n if (typeof obj !== 'object' || obj === null || obj === undefined || typeof obj === 'function') {\n return obj;\n }\n\n // Handle arrays separately to ensure deep copy of elements\n if (Array.isArray(obj)) {\n return obj.map(item => ObjectUtil.deepCopy(item));\n }\n\n // Handle plain objects or objects with a prototype\n const result: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj));\n\n // Recursively copy each key-value pair\n for (const key of Object.keys(obj)) {\n result[key] = ObjectUtil.deepCopy((obj as Record<string, unknown>)[key]);\n }\n\n return result;\n }\n\n /**\n * Type guard to check if the value has a 'copy' method.\n * @param value - The value to check.\n * @returns True if the value has a 'copy' method, false otherwise.\n */\n static hasCopyMethod(value: unknown): boolean {\n return typeof value === 'object' && value !== null && Object.prototype.hasOwnProperty.call(value, 'copy') && typeof (value as { copy: unknown }).copy === 'function';\n }\n}\n","import { Copyable } from './copyable';\nimport { ObjectUtil } from '../../services/utils';\n\n/**\n * Base class for all models, providing deep copy functionality.\n *\n * This abstract class ensures that any model extending it implements immutability\n * by providing a `copy` method, which creates a deep copy of the current instance.\n *\n * All models in the application are expected to extend this class to inherit the\n * `copy` behavior, ensuring consistency in how objects are cloned and manipulated.\n *\n * @template <T> The type of the model extending this class.\n */\nexport abstract class Model<T> implements Copyable<T> {\n\n /**\n * Creates a deep copy of the current instance.\n *\n * This method utilizes `ObjectUtil.deepCopy` to create a new instance of the model\n * with all properties and nested objects deeply cloned, ensuring that any changes\n * to the copy do not affect the original instance.\n *\n * @returns A new instance of the type `T` that is a deep copy of the original.\n */\n copy(): T {\n return ObjectUtil.deepCopy(this) as unknown as T;\n }\n}\n","import { Model } from './model';\n\n/**\n * Abstract base class for managing a list of items that extends the {@link Model} class.\n *\n * This class provides common utility methods for manipulating and querying the list of items,\n * such as sorting, filtering, and finding elements. Subclasses can extend this class to work\n * with specific types of models.\n *\n * @template T - The type of items in the list.\n */\nexport class ModelList<T> extends Model<T> {\n /**\n * The list of items managed by this class.\n */\n protected items: T[];\n\n /**\n * Creates an instance of the {@link ModelList}.\n *\n * @param items - An optional array of items to initialize the list. If no items are provided,\n * an empty array is used by default.\n */\n constructor(items: T[] = []) {\n super();\n this.items = items;\n }\n\n getItems(): T[] {\n return this.items;\n }\n\n /**\n * Sorts the items in place using the specified comparator function.\n *\n * @param comparator - A comparison function that defines the sort order.\n * Should return a negative number if `a` < `b`,\n * zero if `a` === `b`, or a positive number if `a` > `b`.\n *\n * @example\n * const modelList = new MyModelList([{ id: 2 }, { id: 1 }]);\n * modelList.sort((a, b) => a.id - b.id);\n * console.log(modelList.items); // Outputs: [{ id: 1 }, { id: 2 }]\n */\n sort(comparator: (a: T, b: T) => number): void {\n this.items.sort(comparator);\n }\n\n /**\n * Filters the items using the specified filter function.\n *\n * @param filterFunction - A function that returns `true` for items to include\n * and `false` for items to exclude.\n * @returns A new array of items that match the filter criteria.\n */\n filter(filterFunction: (item: T) => boolean): T[] {\n return this.items.filter(filterFunction);\n }\n\n /**\n * Finds an item in the list that matches the specified filter function.\n *\n * @param filterFunction - A function that returns `true` for the desired item.\n * @returns The first item that matches the filter criteria, or `undefined` if none match.\n */\n find(filterFunction: (item: T) => boolean): T | undefined {\n return this.items.find(filterFunction);\n }\n\n /**\n * Checks if the collection of items is empty.\n *\n * @returns {boolean} - Returns `true` if there are no items in the collection, otherwise `false`.\n */\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n /**\n * Adds a new item to the list in the first position.\n *\n * @param item - The item to add.\n */\n addToStart(item: T): void {\n this.items.unshift(item);\n }\n\n /**\n * Adds an array of items to the end of the list.\n *\n * @param items the items to add\n */\n addItems(items: T[]): void {\n this.items.push(...items);\n }\n\n /**\n * Removes a specific item from the list.\n *\n * This method finds the first occurrence of the specified item in the list and removes it.\n * If the item is not found in the list, no changes are made.\n *\n * @param item - The item to be removed from the list.\n */\n remove(item: T): void {\n const index = this.items.indexOf(item);\n if (index!== -1) {\n this.items.splice(index, 1);\n }\n }\n}\n","import { ModelList } from './model-list';\nimport { Subscription } from './subscription';\n\n/**\n * Represents a list of subscriptions that can be managed collectively.\n * Extends the {@link ModelList} class, specialized for {@link Subscription} type.\n */\nexport class SubscriptionList extends ModelList<Subscription> {\n /**\n * Creates a new instance of SubscriptionList.\n * @param subscriptions - An optional array of Subscription functions to initialize the list.\n */\n constructor(subscriptions?: Subscription[]) {\n super(subscriptions);\n }\n \n /**\n * Adds a new subscription to the list.\n * @param subscription - The Subscription function to be added to the list.\n */\n add(subscription: Subscription): void {\n this.items.push(subscription);\n }\n \n /**\n * Adds multiple subscriptions to the list.\n * @param subscriptions - An array of Subscription functions to be added.\n */\n addAll(subscriptions: Subscription[]): void {\n this.items.push(...subscriptions);\n }\n \n /**\n * Calls all subscription functions in the list and then clears the list. Calling a subscription\n * function unsubscribes the subscription. This effectively unsubscribes all subscriptions\n * and removes them from the list.\n */\n unsubscribeAll(): void {\n this.items.forEach(subscription => subscription());\n this.items = [];\n }\n}\n","import {RepositoryState} from './repository-state';\nimport {RepositoryType} from './repository-type';\nimport {Model} from '../common';\nimport {RepositoryReference} from './repository-reference';\n\n/**\n * Holds repository information, such as name, type, state, and other related fields.\n */\nexport class Repository extends Model<Repository> implements RepositoryReference {\n id: string;\n title: string;\n type: RepositoryType | undefined;\n sesameType: string | undefined;\n uri: string;\n externalUrl: string;\n location: string;\n state: RepositoryState | undefined;\n local: boolean | undefined;\n readable: boolean | undefined;\n writable: boolean | undefined;\n unsupported: boolean | undefined;\n isNew?: boolean;\n\n constructor(data?: Partial<Repository>) {\n super();\n this.id = data?.id || '';\n this.title = data?.title || '';\n this.type = data?.type;\n this.sesameType = data?.sesameType;\n this.uri = data?.uri || '';\n this.externalUrl = data?.externalUrl || '';\n this.location = data?.location || '';\n this.state = data?.state;\n this.local = data?.local;\n this.readable = data?.readable;\n this.writable = data?.writable;\n this.unsupported = data?.unsupported;\n this.isNew = data?.isNew;\n }\n\n toRepositoryReference(): RepositoryReference {\n return {\n id: this.id,\n location: this.location\n };\n }\n}\n","import {Repository} from './repository';\nimport {ModelList} from '../common';\n\nconst REPOSITORY_LOCATION_ID_COMPARATOR = (r1: Repository, r2: Repository) => {\n // Compare locations.\n const locationComparison = r1.location.localeCompare(r2.location);\n if (locationComparison !== 0) {\n // If locations are different, return their comparison.\n return locationComparison;\n }\n\n // If locations are the same, compare by id.\n return r1.id.localeCompare(r2.id);\n};\n\n/**\n * Holds an array of repositories ({@link Repository}) and provides functions to manipulate them.\n */\nexport class RepositoryList extends ModelList<Repository> {\n\n constructor(repositories?: Repository[]) {\n super(repositories);\n }\n\n /**\n * Finds a repository in the list by its ID and location.\n *\n * @param repositoryId - The unique ID of the repository to find.\n * @param location - The location associated with the repository.\n * @returns The matching {@link Repository} if found, otherwise `undefined`.\n */\n findRepository(repositoryId: string, location: string): Repository | undefined {\n return super.find((repository) => repository.id === repositoryId && repository.location === location);\n }\n\n /**\n * Sorts the repositories in place by their location and ID.\n */\n sortByLocationAndId(): void {\n super.sort(REPOSITORY_LOCATION_ID_COMPARATOR);\n }\n\n /**\n * Filters the list of repositories by excluding those with the specified ID(s) and LOCATION.\n *\n * @param repositories - An array of repositories to exclude from the filtered result.\n * @returns An array of {@link Repository} objects that do not have any of the specified IDs.\n */\n filterByRepository(repositories: Repository[]): Repository[] {\n return super.filter(this.createIdLocationFilter(repositories));\n }\n\n /**\n * Creates a filter function to include only objects with matching `id` and `location`.\n *\n * @param itemsToMatch - An array of objects with `id` and `location` to filter by.\n * @returns A filter function that returns `true` for objects with `id` and `location` matching any of the provided objects.\n */\n private createIdLocationFilter<T extends { id: string | number; location: string | number }>(\n itemsToMatch: { id: string | number; location: string | number }[]\n ): (item: T) => boolean {\n return (item: T) =>\n itemsToMatch.some(match => match.id !== item.id || match.location !== item.location);\n }\n}\n","import {Model} from '../common/model';\n\n/**\n * Holds repository triples information.\n */\nexport class RepositorySizeInfo extends Model<RepositorySizeInfo> {\n\n /**\n * Number of inferred triples.\n */\n inferred: number;\n\n /**\n * Number of all triples.\n */\n total: number;\n\n /**\n * Number of explicit triples.\n */\n explicit: number;\n\n constructor(data?: Partial<RepositorySizeInfo>) {\n super();\n this.inferred = data?.inferred || 0;\n this.total = data?.total || 0;\n this.explicit = data?.explicit || 0;\n }\n}\n","export enum RepositoryState {\n INACTIVE = 'INACTIVE',\n STARTING = 'STARTING',\n RUNNING = 'RUNNING',\n RESTARTING = 'RESTARTING',\n STOPPING = 'STOPPING'\n}\n","export enum RepositoryType {\n GRAPH_DB = 'graphdb',\n ONTOP = 'ontop',\n FEDEX = 'fedex',\n SYSTEM = 'system'\n}\n","/**\n * Represents a map between prefixes and their corresponding URIs.\n */\nexport class NamespaceMap {\n private namespaces!: Record<string, string>;\n\n constructor(namespaces: Record<string, string>) {\n this.setNamespaces(namespaces);\n }\n\n setNamespaces(namespaces: Record<string, string>): void {\n this.namespaces = namespaces;\n }\n\n /**\n * Retrieves the URI for a given prefix.\n * @param prefix - The prefix for which to retrieve the URI.\n */\n getByPrefix(prefix: string): string {\n return this.namespaces[prefix] || '';\n }\n}\n","import {AuthenticationType} from '../security';\nimport {RepositoryLocationType} from './repository-location-type';\nimport {Model} from '../common/model';\n\n/**\n * Holds location information about a repository ({@link RepositoryType}) instance.\n */\nexport class RepositoryLocation extends Model<RepositoryLocation> {\n /**\n * The GraphDB location URL.\n */\n uri: string;\n\n /**\n * Human readable label.\n */\n label: string;\n\n /**\n * Username for the location if any. This parameter only makes sense for remote locations.\n */\n username: string;\n\n /**\n * Password for the location if any. This parameter only makes sense for remote locations.\n */\n password: string;\n\n /**\n * Authentication type.\n */\n authType: AuthenticationType | undefined;\n\n /**\n * Remote location type.\n */\n locationType: RepositoryLocationType | undefined;\n\n /**\n * True if the location is the currently active.\n */\n active: boolean | undefined;\n\n /**\n * True if the location is local (on the same machine as the workbench).\n */\n local: boolean | undefined;\n\n /**\n * True if the location is the system location.\n */\n system: boolean | undefined;\n\n /**\n * Error message, if there was an error connecting to this location\n */\n errorMsg: string;\n\n /**\n * Default repository for the location.\n */\n defaultRepository: string;\n\n constructor(data?: Partial<RepositoryLocation>) {\n super();\n this.uri = data?.uri || '';\n this.label = data?.label || '';\n this.username = data?.username || '';\n this.password = data?.password || '';\n this.authType = data?.authType;\n this.locationType = data?.locationType;\n this.active = data?.active;\n this.local = data?.local;\n this.system = data?.system;\n this.errorMsg = data?.errorMsg || '';\n this.defaultRepository = data?.defaultRepository || '';\n }\n}\n","export enum RepositoryLocationType {\n GDB = 'GDB',\n ONTOPIC = 'ONTOPIC',\n SPARQL = 'SPARQL'\n}\n","/**\n * A generic shape of our internal event data payloads.\n */\nexport class Event<T extends {} | undefined> {\n /**\n * The name of the event.\n */\n readonly NAME: string;\n /**\n * The payload of the event.\n */\n readonly payload?: T;\n /**\n * Creates a new instance of the event.\n *\n * @param name - the name of the event.\n * @param payload - the payload of the event. This is optional and if omitted, the event will have no payload,\n * just a name.\n */\n constructor(name: string, payload?: T) {\n this.NAME = name;\n this.payload = payload;\n }\n}\n","/**\n * A constant object that defines event names used throughout the {@link EventService}.\n *\n * This object acts as a central repository for all predefined event names, ensuring consistency\n * when emitting and subscribing to events in the {@link EventService}.\n *\n */\nexport const EventName = {\n NAVIGATION_END: 'navigationEnd',\n NAVIGATION_START: 'navigationStart',\n LOGOUT: 'logout',\n APP_DATA_LOADED: 'applicationDataLoaded',\n};\n","import {Event} from '../event';\nimport {NavigationEndPayload} from './navigation-end-payload';\nimport {EventName} from '../event-name';\n\n/**\n * Represents a \"navigationEnd\" event.\n *\n * This event is triggered when navigation ends and contains information about the previous and current URLs.\n */\nexport class NavigationEnd extends Event<NavigationEndPayload> {\n constructor(oldUrl: string, newUrl: string) {\n super(EventName.NAVIGATION_END, {oldUrl, newUrl});\n }\n}\n","/**\n * Represents the payload for a navigation end event.\n */\nexport class NavigationEndPayload {\n\n /**\n * The URL from which the navigation originated.\n *\n * @type {string | undefined}\n */\n oldUrl: string | undefined;\n\n /**\n * The URL to which the navigation ended.\n *\n * @type {string | undefined}\n */\n newUrl: string | undefined;\n}\n","import {Event} from '../event';\nimport {EventName} from '../event-name';\nimport {NavigationStartPayload} from './navigation-start-payload';\n\n/**\n * Represents a \"navigationStart\" event.\n *\n * This event is triggered when navigation starts and contains information about the previous and current URLs.\n */\nexport class NavigationStart extends Event<NavigationStartPayload> {\n /**\n * Creates an instance of the NavigationStart event.\n *\n * @param oldUrl - The URL from which the navigation originated.\n * @param newUrl - The URL to which the navigation ended.\n * @param cancelNavigation - A function to cancel the ongoing navigation.\n */\n constructor(oldUrl: string, newUrl: string, cancelNavigation: (cancellationPayload: unknown) => void) {\n super(EventName.NAVIGATION_START, {oldUrl, newUrl, cancelNavigation});\n }\n}\n","import {Event} from '../event';\nimport {EventName} from '../event-name';\n\n/**\n * Represents a \"logout\" event.\n *\n * This event is triggered when users attempts to log out.\n */\nexport class Logout extends Event<undefined> {\n constructor() {\n super(EventName.LOGOUT);\n }\n}\n","export enum AuthenticationType {\n NONE = 'NONE',\n BASIC = 'BASIC',\n SIGNATURE = 'SIGNATURE'\n}\n","import {Mapper, MapperConstructor} from './mapper';\n\n/**\n * A utility class that provides and manages singleton instances of `Mapper` objects.\n *\n * The `MapperProvider` is designed to handle the creation and reuse of `Mapper` instances\n * for different types. Each type of `Mapper` is stored in a map, ensuring that only one instance\n * per type exists during the application's lifecycle.\n */\nexport class MapperProvider {\n /**\n * A static map that stores singleton instances of `Mapper` objects, keyed by their type name.\n */\n private static readonly MAPPER_INSTANCES: Map<string, Mapper<unknown>> = new Map<string, Mapper<unknown>>();\n\n /**\n * Retrieves a Mapper instance for the given type. If no instance exists, a new one is created,\n * stored, and then returned.\n *\n * @template T - The specific Mapper type to retrieve or create.\n * @param type - The constructor of the Mapper to retrieve or create.\n * @returns The Mapper instance for the given type.\n */\n public static get<T>(type: MapperConstructor<T>): Mapper<T> {\n const typeName = type.name;\n\n // Check if an instance exists\n if (!MapperProvider.MAPPER_INSTANCES.has(typeName)) {\n // Create a new instance and store it\n const instance = new type();\n MapperProvider.MAPPER_INSTANCES.set(typeName, instance);\n }\n\n // Return the existing or newly created instance\n return MapperProvider.MAPPER_INSTANCES.get(typeName) as Mapper<T>;\n }\n}\n","import {Service} from './service';\nimport {LifecycleHooks} from './lifecycle-hooks';\n\n/**\n * Service provider for all {@link Service} instances. Services in the API are singletons, meaning that there is only\n * one instance of each service in the application. This provider caches all workbench services created on demand,\n * ensuring that all micro frontends share a single instance of each service.\n */\nexport class ServiceProvider {\n /**\n * The static modifier ensures the map is the same for all ServiceProviders. Each micro-frontend will have its\n * own instance of {@see ServiceFactoryService}, but the map with instances will be shared.\n */\n private static readonly SERVICE_INSTANCES = new Map<string, Service>;\n\n /**\n * Returns the instance of the given service type. If the service has not been created yet, this method:\n * 1. Instantiates the service via `new type()`.\n * 2. Calls its `onCreated()` hook if implemented.\n * 3. Caches and returns the instance.\n *\n * @param type The service type to retrieve.\n * @returns The instance of the service.\n * @template T The type of the service to retrieve.\n */\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n public static get<T extends Service>(type: { new (): T }): T {\n if (!ServiceProvider.SERVICE_INSTANCES.has(type.name)) {\n const instance = new type();\n if (ServiceProvider.implementsLifecycleHooks(instance)) {\n instance.onCreated?.();\n }\n ServiceProvider.SERVICE_INSTANCES.set(type.name, instance);\n }\n return this.SERVICE_INSTANCES.get(type.name) as T;\n }\n\n private static implementsLifecycleHooks(instance: Service): instance is LifecycleHooks {\n return typeof instance === 'object' && typeof (instance as LifecycleHooks).onCreated === 'function';\n }\n\n /**\n * Returns all instances of the given service type.\n * @param superType The super type of the services to retrieve.\n * @returns All instances of the given service type.\n * @template T The super type of the services to retrieve.\n */\n public static getAllBySuperType<T>(superType: abstract new(service: T) => T): T[] {\n return Array.from(ServiceProvider.SERVICE_INSTANCES.values())\n .filter((service) => service instanceof superType) as T[];\n }\n}\n","import {ServiceProvider} from './service.provider';\nimport {Service} from './service';\n\n/**\n * Injects a service instance of the specified class retrieving the service instance from the ServiceProvider.\n * @param serviceClass The class of the service to inject.\n * @returns An instance of the specified service class.\n * @template T The type of the service to inject.\n * @example\n * ```typescript\n * import {service} from 'path/to/service-inject';\n * import {MyService} from 'path/to/my-service';\n * const myService = service(MyService);\n * ```\n */\nexport function service<T extends Service>(serviceClass: new (...args: never[]) => T): T {\n return ServiceProvider.get(serviceClass);\n}\n","import {ModelList} from '../common';\nimport {Authority} from './authority';\n\n/**\n * Represents a list of authorities in an authenticated user.\n */\nexport class AuthorityList extends ModelList<Authority> {\n constructor(authorities?: Authority[]) {\n super(authorities);\n }\n\n /**\n * Checks if the list contains a specific authority.\n *\n * @param authority - The Authority object to check for in the list.\n * @returns A boolean indicating whether the specified authority is present in the list.\n * Returns true if the authority is found, false otherwise.\n */\n hasAuthority(authority: Authority): boolean {\n return this.items.includes(authority);\n }\n}\n","export type MapperConstructor<T> = new () => Mapper<T>\n\nexport abstract class Mapper<T> {\n\n /**\n * Converts raw data into an instance of the model type `T`.\n *\n * Implementations of this method should define the specific logic for\n * transforming raw input data into the desired model instance.\n *\n * @abstract\n * @param {unknown} data - The raw data to be transformed.\n * @returns {T} - An instance of the model type `T` based on the provided data.\n */\n abstract mapToModel(data: unknown): T;\n}\n","import {AuthorityList} from '../../../models/security/authority-list';\nimport {Mapper} from '../../../providers/mapper/mapper';\nimport {Authority} from '../../../models/security/authority';\n\n/**\n * Mapper class for converting Authority arrays to AuthorityList models.\n */\nexport class AuthorityListMapper extends Mapper<AuthorityList> {\n /**\n * Maps an array of Authority objects to an AuthorityList model.\n *\n * @param data - An array of Authority objects to be mapped into an AuthorityList.\n * @returns A new AuthorityList instance containing the provided authorities.\n */\n mapToModel(data: Authority[]): AuthorityList {\n return new AuthorityList(data);\n }\n}\n","import {Model} from '../common';\nimport {AuthorityList} from './authority-list';\nimport {MapperProvider} from '../../providers';\nimport {AuthorityListMapper} from '../../services/security/mappers/authority-list.mapper';\nimport {AppSettings} from './app-settings';\n\n/**\n * Represents an authenticated user in the system\n */\nexport class AuthenticatedUser extends Model<AuthenticatedUser> {\n external: boolean;\n username: string;\n password: string;\n authorities: AuthorityList;\n appSettings: AppSettings;\n\n constructor(data?: Partial<AuthenticatedUser>) {\n super();\n this.external = data?.external ?? false;\n this.username = data?.username ?? '';\n this.password = data?.password ?? '';\n this.authorities = MapperProvider.get(AuthorityListMapper).mapToModel(data?.authorities);\n this.appSettings = data?.appSettings ?? {};\n }\n}\n","import {Model} from '../common';\nimport {AppSettings} from './app-settings';\nimport {AuthorityList} from './authority-list';\nimport {MapperProvider} from '../../providers';\nimport {AuthorityListMapper} from '../../services/security/mappers/authority-list.mapper';\n\n/**\n * Represents an authentication setting.\n */\nexport class AuthSettings extends Model<AuthSettings> {\n appSettings?: AppSettings;\n authorities: AuthorityList;\n enabled?: boolean;\n\n constructor(data: Partial<AuthSettings>) {\n super();\n this.appSettings = data.appSettings;\n this.authorities = MapperProvider.get(AuthorityListMapper).mapToModel(data.authorities);\n this.enabled = data.enabled;\n }\n}\n","import {AuthSettings} from '../../../models/security/auth-settings';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting partial AuthSettings objects to complete AuthSettings models.\n */\nexport class AuthSettingsMapper extends Mapper<AuthSettings> {\n /**\n * Maps partial AuthSettings data to a complete AuthSettings model.\n *\n * @param data - Partial data of AuthSettings to be mapped.\n * @returns A new instance of AuthSettings.\n */\n mapToModel(data: Partial<AuthSettings>): AuthSettings {\n return new AuthSettings(data);\n }\n}\n","import {Model} from '../common';\nimport {AuthSettings} from './auth-settings';\nimport {AuthSettingsMapper} from '../../services/security/mappers/auth-settings.mapper';\nimport {MapperProvider} from '../../providers';\n\n/**\n * Represents the security configuration for the application.\n */\nexport class SecurityConfig extends Model<SecurityConfig> {\n authImplementation?: string;\n enabled?: boolean;\n passwordLoginEnabled?: boolean;\n freeAccess: AuthSettings;\n overrideAuth: AuthSettings;\n openIdEnabled?: boolean;\n userLoggedIn?: boolean;\n freeAccessActive?: boolean;\n hasExternalAuthUser?: boolean;\n\n constructor(config: Partial<SecurityConfig>) {\n super();\n this.authImplementation = config.authImplementation;\n this.enabled = config.enabled;\n this.passwordLoginEnabled = config.passwordLoginEnabled;\n this.freeAccess = MapperProvider.get(AuthSettingsMapper).mapToModel(config.freeAccess);\n this.overrideAuth = MapperProvider.get(AuthSettingsMapper).mapToModel(config.overrideAuth);\n this.openIdEnabled = config.openIdEnabled;\n this.userLoggedIn = config.userLoggedIn;\n this.freeAccessActive = config.freeAccessActive;\n this.hasExternalAuthUser = config.hasExternalAuthUser;\n }\n}\n","export enum Authority {\n ROLE_ADMIN = 'ROLE_ADMIN',\n ROLE_USER = 'ROLE_USER',\n ROLE_MONITORING = 'ROLE_MONITORING',\n ROLE_REPO_MANAGER = 'ROLE_REPO_MANAGER',\n ROLE_CLUSTER = 'ROLE_CLUSTER',\n IS_AUTHENTICATED_FULLY = 'IS_AUTHENTICATED_FULLY'\n}\n\n","import {Model} from '../common';\n\n/**\n * Holds information about restricted pages for the logged-in user.\n */\nexport class RestrictedPages extends Model<RestrictedPages>{\n\n private pages: Record<string, boolean> = {};\n\n isRestricted(pageUrl: string): boolean {\n return this.pages[pageUrl] ?? false;\n }\n\n setPageRestriction(pageUrl: string, isRestricted = true): RestrictedPages {\n this.pages[pageUrl] = isRestricted;\n return this;\n }\n}\n","import {Model} from '../common';\n\nexport class OpenIdConfig extends Model<OpenIdConfig> {\n openIdKeys?: Record<string, JsonWebKey>;\n openIdTokenUrl?: string;\n openIdKeysUri?: string;\n openIdEndSessionUrl?: string;\n supportsOfflineAccess?: boolean;\n\n constructor(config: Partial<OpenIdConfig>) {\n super();\n this.openIdKeys = config.openIdKeys;\n this.openIdTokenUrl = config.openIdTokenUrl;\n this.openIdKeysUri = config.openIdKeysUri;\n this.openIdEndSessionUrl = config.openIdEndSessionUrl;\n this.supportsOfflineAccess = config.supportsOfflineAccess;\n }\n}\n","export enum Rights {\n READ = 'READ',\n WRITE = 'WRITE'\n}\n","import { CapabilityList } from '../../../models/license';\nimport { Mapper } from '../../../providers/mapper/mapper';\nimport { Capability } from '../../../models/license';\n\n/**\n * Mapper class for converting an array of Capability objects to a CapabilityList model.\n * Extends the base Mapper class with CapabilityList as the target model type.\n */\nexport class CapabilityListMapper extends Mapper<CapabilityList> {\n /**\n * Maps an array of Capability objects to a CapabilityList model.\n * \n * @param data - An array of Capability objects to be mapped.\n * @returns A new CapabilityList instance containing the provided Capability objects.\n */\n mapToModel(data: Capability[]): CapabilityList {\n return new CapabilityList(data);\n }\n}\n","import { Model } from '../common/model';\nimport { CapabilityList } from './capability-list';\nimport { CapabilityListMapper } from '../../services/license/mappers/capability-list.mapper';\nimport { MapperProvider } from '../../providers';\n\n/**\n * Represents a Graph DB license.\n *\n * Inherits copy functionality from {@link Model} and contains various properties of a GraphDB license.\n */\nexport class License extends Model<License> {\n private _expiryDate?: number;\n private _latestPublicationDate?: number;\n private _licensee?: string;\n private _maxCpuCores?: number;\n private _product?: string;\n private _productType?: string;\n private _licenseCapabilities?: CapabilityList;\n private _version?: string;\n private _installationId?: string;\n private _valid?: boolean;\n private _typeOfUse?: string;\n private _message?: string;\n private _present?: boolean;\n private _usageRestriction?: string;\n\n /**\n * Creates a new License instance.\n *\n * @param data - Partial data to initialize the License object. This can include any of the properties\n * defined in the License class. Default values are applied for some properties if not provided.\n */\n constructor(data: Partial<License>) {\n super();\n this.expiryDate = data.expiryDate;\n this.latestPublicationDate = data.latestPublicationDate;\n this.licensee = data.licensee || '';\n this.maxCpuCores = data.maxCpuCores;\n this.product = data.product || '';\n this.productType = data.productType || '';\n this.licenseCapabilities = MapperProvider.get(CapabilityListMapper).mapToModel(data.licenseCapabilities);\n this.version = data.version || '';\n this.installationId = data.installationId || '';\n this.valid = data.valid;\n this.typeOfUse = data.typeOfUse || '';\n this.message = data.message || '';\n this.present = data.present || false;\n this.usageRestriction = data.usageRestriction || '';\n }\n\n get expiryDate(): number | undefined {\n return this._expiryDate;\n }\n\n set expiryDate(value: number | undefined) {\n this._expiryDate = value;\n }\n\n get latestPublicationDate(): number | undefined {\n return this._latestPublicationDate;\n }\n\n set latestPublicationDate(value: number | undefined) {\n this._latestPublicationDate = value;\n }\n\n get licensee(): string | undefined {\n return this._licensee;\n }\n\n set licensee(value: string | undefined) {\n this._licensee = value;\n }\n\n get maxCpuCores(): number | undefined {\n return this._maxCpuCores;\n }\n\n set maxCpuCores(value: number | undefined) {\n this._maxCpuCores = value;\n }\n\n get product(): string | undefined {\n return this._product;\n }\n\n set product(value: string | undefined) {\n this._product = value;\n }\n\n get productType(): string | undefined {\n return this._productType;\n }\n\n set productType(value: string | undefined) {\n this._productType = value;\n }\n\n get licenseCapabilities(): CapabilityList | undefined {\n return this._licenseCapabilities;\n }\n\n set licenseCapabilities(value: CapabilityList | undefined) {\n this._licenseCapabilities = value;\n }\n\n get version(): string | undefined {\n return this._version;\n }\n\n set version(value: string | undefined) {\n this._version = value;\n }\n\n get installationId(): string | undefined {\n return this._installationId;\n }\n\n set installationId(value: string | undefined) {\n this._installationId = value;\n }\n\n get valid(): boolean | undefined {\n return this._valid;\n }\n\n set valid(value: boolean | undefined) {\n this._valid = value;\n }\n\n get typeOfUse(): string | undefined {\n return this._typeOfUse;\n }\n\n set typeOfUse(value: string | undefined) {\n this._typeOfUse = value;\n }\n\n get message(): string | undefined {\n return this._message;\n }\n\n set message(value: string | undefined) {\n this._message = value;\n }\n\n get present(): boolean | undefined {\n return this._present;\n }\n\n set present(value: boolean | undefined) {\n this._present = value;\n }\n\n get usageRestriction(): string | undefined {\n return this._usageRestriction;\n }\n\n set usageRestriction(value: string | undefined) {\n this._usageRestriction = value;\n }\n}\n","/**\n * Graph DB connector capabilities\n */\nexport enum Capability {\n LUCENE_CONNECTOR = 'Lucene connector',\n SOLR_CONNECTOR = 'Solr connector',\n ELASTICSEARCH_CONNECTOR = 'Elasticsearch connector',\n OPENSEARCH_CONNECTOR = 'OpenSearch connector',\n KAFKA_CONNECTOR = 'Kafka connector',\n CLUSTER = 'Cluster',\n}\n","import { Capability } from './capability';\nimport { ModelList } from '../common/model-list';\n\n/**\n * Represents a list of capabilities in the license model.\n * Extends the ModelList class, specialized for Capability connectors.\n */\nexport class CapabilityList extends ModelList<Capability> {\n /**\n * Creates a new instance of CapabilityList.\n *\n * @param capabilities - An array of Capability connectors to initialize the list.\n * If not provided, an empty list will be created.\n */\n constructor(capabilities: Capability[]) {\n super(capabilities);\n }\n}\n","export class ProductInfo {\n workbench: string;\n productType: string;\n productVersion: string;\n shortVersion?: string;\n sesame: string;\n connectors: string;\n\n constructor(data: Partial<ProductInfo & { Workbench: string }>) {\n // The 'Workbench' property comes with an upper-case 'W' from the backend\n // Map it to lower-case for consistency\n this.workbench = data.Workbench || '';\n this.productType = data.productType || '';\n this.productVersion = data.productVersion || '';\n this.sesame = data.sesame || '';\n this.connectors = data.connectors || '';\n this.shortVersion = this.resolveShortVersion(data);\n }\n\n private resolveShortVersion(data: Partial<ProductInfo>) {\n const productVersion = data.productVersion;\n\n if (!productVersion) {\n return '';\n }\n\n // Extract major.minor version (e.g., \"10.0\" from \"10.0.0-M3-RC1\")\n const majorMinorRegex = /^(\\d+\\.\\d+)/;\n const majorMinorMatch = majorMinorRegex.exec(productVersion);\n const baseVersion = majorMinorMatch?.[1] ?? productVersion;\n\n // Extract first attribute after dash (e.g., \"M3\" from \"10.0.0-M3-RC1\")\n const attributeRegex = /(-[^-]+)/;\n const attributeMatch = attributeRegex.exec(productVersion);\n const firstAttribute = attributeMatch?.[1] ?? '';\n\n return baseVersion + firstAttribute;\n }\n}\n","/**\n * Represents a wrapper of the data obtained from the storage with methods to convert it to different formats.\n */\nexport class StorageData {\n /**\n * The value obtained from the storage.\n */\n value: string | null;\n\n /**\n * Creates a new instance of the StorageData class.\n * @param value The value obtained from the storage.\n */\n constructor(value: string | null) {\n this.value = value;\n }\n\n /**\n * Returns the value as a string or null if the value is null.\n * @returns The value as a string or null if the value is null.\n */\n getValue(): string | null {\n return this.value;\n }\n\n /**\n * Returns the value as a string or the default value if the value is null.\n * @param defaultValue The default value to return if the value is null.\n * @returns The value as a string or the default value if the value is null.\n */\n getValueOrDefault(defaultValue: string): string | undefined {\n return this.value || defaultValue;\n }\n\n /**\n * Returns the value as a JSON object or null if the value is not a valid JSON. Conversion is done using JSON.parse.\n * @returns The value as a JSON object or null if the value is not a valid JSON.\n */\n getAsJson(): unknown {\n if (this.value === null) {\n return null;\n }\n try {\n return JSON.parse(this.value);\n } catch (error) {\n console.error('Error parsing JSON', error);\n return null;\n }\n }\n}\n\n","/**\n * A utility class holding the storage keys used by the application.\n */\nexport class StorageKey {\n static readonly GLOBAL_NAMESPACE: string = 'ontotext.gdb';\n}\n","import {AvailableLanguage} from './available-language';\n\n/**\n * Represents a list of available languages.\n */\nexport class AvailableLanguagesList {\n languages: AvailableLanguage[];\n\n constructor(languages: AvailableLanguage[]) {\n this.languages = languages;\n }\n\n /**\n * Retrieves an array of language codes from the available languages.\n *\n * This method maps over the list of available languages and extracts\n * the 'key' property from each language object, which represents\n * the language code.\n *\n * @returns {string[]} An array of language codes (e.g., ['en', 'fr', 'de']).\n */\n getLanguageCodes(): string[] {\n return this.languages?.map(language => language.key);\n }\n}\n","import { AvailableLanguagesList } from '../../../models/language/available-languages-list';\nimport { Mapper } from '../../../providers/mapper/mapper';\nimport { AvailableLanguage } from '../../../models/language/available-language';\n\n/**\n * Mapper class for converting an array of AvailableLanguage objects to an AvailableLanguagesList model.\n */\nexport class AvailableLanguagesListMapper extends Mapper<AvailableLanguagesList> {\n /**\n * Maps an array of AvailableLanguage objects to an AvailableLanguagesList model.\n *\n * @param data - An array of AvailableLanguage objects to be mapped.\n * @returns A new AvailableLanguagesList instance containing the provided AvailableLanguage objects.\n */\n mapToModel(data: AvailableLanguage[]): AvailableLanguagesList {\n return new AvailableLanguagesList(data);\n }\n}\n","import { AvailableLanguagesList } from './available-languages-list';\nimport { Model } from '../common';\nimport { MapperProvider } from '../../providers';\nimport { AvailableLanguagesListMapper } from '../../services/language/mappers/available-languages-list-mapper';\n\n/**\n * Represents the configuration for language settings in the application.\n */\nexport class LanguageConfig extends Model<LanguageConfig> {\n defaultLanguage: string;\n\n availableLanguages: AvailableLanguagesList;\n\n constructor(data: LanguageConfig) {\n super();\n this.defaultLanguage = data.defaultLanguage;\n this.availableLanguages = MapperProvider.get(AvailableLanguagesListMapper).mapToModel(data.availableLanguages);\n }\n}\n","/**\n * Represents the user's consent for various types of cookies.\n */\nexport class CookieConsent {\n /** Indicates whether the cookie policy has been accepted. */\n policyAccepted?: boolean;\n\n /** Indicates consent for statistical cookies. */\n statistic?: boolean;\n\n /** Indicates consent for third-party cookies. */\n thirdParty?: boolean;\n\n /** Epoch timestamp of last update in seconds. */\n updatedAt?: number;\n\n constructor(data?: CookieConsent) {\n this.policyAccepted = data?.policyAccepted;\n this.statistic = data?.statistic;\n this.thirdParty = data?.thirdParty;\n this.updatedAt = data?.updatedAt;\n }\n}\n","export enum OperationStatus {\n INFORMATION = 'INFORMATION',\n WARNING = 'WARNING',\n CRITICAL = 'CRITICAL'\n}\n\nexport const STATUS_ORDER = {\n [OperationStatus.INFORMATION]: 0,\n [OperationStatus.WARNING]: 1,\n [OperationStatus.CRITICAL]: 2\n};\n","import {Model} from '../common';\nimport {OperationGroup} from './operation-group';\nimport {OperationStatus} from './operation-status';\n\n/**\n * Represents a summary of an operation group.\n */\nexport class OperationGroupSummary extends Model<OperationGroupSummary> {\n group: OperationGroup;\n totalOperations: number;\n status: OperationStatus;\n id: string;\n\n constructor(data: OperationGroupSummary) {\n super();\n this.id = `${data.group}-${data.status}-${data.totalOperations}`;\n this.group = data.group;\n this.totalOperations = data.totalOperations;\n this.status = data.status;\n }\n}\n","import {Model} from '../common';\nimport {OperationStatus, STATUS_ORDER} from './operation-status';\nimport {OperationList} from './operation-list';\nimport {OperationGroup} from './operation-group';\nimport {OperationGroupSummary} from './operation-group-summary';\n\n/**\n * Model of the summary of operation statuses.\n *\n * Holds the status of the entire operation list and a list of individual operations.\n * Currently, these could be backup, sparql querying and cluster operations\n */\nexport class OperationStatusSummary extends Model<OperationStatusSummary> {\n status: OperationStatus;\n allRunningOperations: OperationList;\n\n constructor(operationStatusSummary: OperationStatusSummary) {\n super();\n this.status = operationStatusSummary.status || OperationStatus.INFORMATION;\n this.allRunningOperations = operationStatusSummary.allRunningOperations;\n }\n\n /**\n * Transforms the OperationStatusSummary data into a grouped summary format.\n * This function aggregates operations by their group, calculates total operations per group,\n * and determines the highest severity status for each group.\n *\n * @returns {OperationGroupSummary[]} A mapped list of operation group summaries with aggregated statistics\n */\n toOperationsGroupSummary(): OperationGroupSummary[] {\n const groupToOperationSummary = new Map<OperationGroup, OperationGroupSummary>();\n\n this.allRunningOperations.getItems().forEach((operation) => {\n if (!groupToOperationSummary.has(operation.group)) {\n groupToOperationSummary.set(operation.group, new OperationGroupSummary({\n group: operation.group,\n totalOperations: 0,\n status: OperationStatus.INFORMATION\n } as OperationGroupSummary));\n }\n\n const summary = groupToOperationSummary.get(operation.group)!;\n summary.totalOperations += operation.count;\n\n if (STATUS_ORDER[operation.status] > STATUS_ORDER[summary.status]) {\n summary.status = operation.status;\n }\n });\n\n return Array.from(groupToOperationSummary.values());\n }\n}\n","import {Operation} from './operation';\nimport {ModelList} from '../common';\n\n/**\n * Represents a list of Operation objects.\n */\nexport class OperationList extends ModelList<Operation> {\n /**\n * Creates a new instance of OperationList.\n *\n * @param operations - An array of Operation objects to initialize the list.\n */\n constructor(operations: Operation[]) {\n super(operations);\n }\n}\n","export enum OperationType {\n UPDATES = 'updates',\n QUERIES = 'queries',\n IMPORT = 'imports',\n BACKUP_AND_RESTORE = 'backupAndRestore',\n CLUSTER_HEALTH = 'clusterHealth'\n}\n","export enum OperationGroup {\n QUERY = 'QUERY',\n BACKUP = 'BACKUP',\n CLUSTER = 'CLUSTER',\n IMPORT = 'IMPORT'\n}\n","import {Model} from '../common';\nimport {OperationStatus} from './operation-status';\nimport {OperationType} from './operation-type';\nimport {OperationGroup} from './operation-group';\n\n/** Not all operations have counts as values */\nconst OPERATIONS_WITH_COUNT = [OperationType.QUERIES, OperationType.UPDATES, OperationType.IMPORT];\n\nconst OPERATION_TYPE_TO_HREF = {\n [OperationType.UPDATES]: 'monitor/queries',\n [OperationType.QUERIES]: 'monitor/queries',\n [OperationType.BACKUP_AND_RESTORE]: 'monitor/backup-and-restore',\n [OperationType.IMPORT]: 'import',\n [OperationType.CLUSTER_HEALTH]: 'cluster'\n};\n\nconst OPERATION_TYPE_TO_GROUP = {\n [OperationType.QUERIES]: OperationGroup.QUERY,\n [OperationType.UPDATES]: OperationGroup.QUERY,\n [OperationType.BACKUP_AND_RESTORE]: OperationGroup.BACKUP,\n [OperationType.IMPORT]: OperationGroup.IMPORT,\n [OperationType.CLUSTER_HEALTH]: OperationGroup.CLUSTER\n};\n\n/**\n * Represents an operation in the system.\n */\nexport class Operation extends Model<Operation> {\n value: string;\n status: OperationStatus;\n type: OperationType;\n\n // Internal properties\n id: string;\n count: number;\n group: OperationGroup;\n href: string;\n labelKey: string;\n\n constructor(operation: Operation) {\n super();\n this.id = `${operation.status}-${operation.type}-${operation.value}`;\n this.value = operation.value;\n this.status = operation.status;\n this.type = operation.type;\n this.count = this.getCount(operation);\n this.group = OPERATION_TYPE_TO_GROUP[operation.type];\n this.href = OPERATION_TYPE_TO_HREF[operation.type];\n this.labelKey = this.getLabelKey(operation);\n }\n\n private getCount(operation: Operation) {\n return OPERATIONS_WITH_COUNT.includes(operation.type) ? parseInt(operation.value, 10) : 0;\n }\n\n private getLabelKey(operation: Operation) {\n return OPERATIONS_WITH_COUNT.includes(operation.type) ? operation.type : operation.value;\n }\n}\n","import {ModelList} from '../common';\nimport {OperationGroupSummary} from './operation-group-summary';\n\n/**\n * Represents a list of operation group summaries.\n */\nexport class OperationGroupSummaryList extends ModelList<OperationGroupSummary> {\n /**\n * Creates a new instance of OperationGroupSummaryList.\n *\n * @param operationGroupSummaries - An optional array of OperationGroupSummary objects to initialize the list.\n * If not provided, an empty list will be created.\n */\n constructor(operationGroupSummaries?: OperationGroupSummary[]) {\n super(operationGroupSummaries);\n }\n}\n","export enum ToastrPosition {\n BOTTOM_RIGHT = 'bottom-right',\n BOTTOM_LEFT = 'bottom-left',\n}\n","/**\n * Configuration class for individual toast messages.\n * Configuration options here will override the global ToastrConfig settings.\n */\nexport class ToastConfig {\n /**\n * The duration in milliseconds for which the toast notification will be displayed.\n */\n timeout?: number;\n\n /**\n * A function to be called when the toast notification is clicked.\n */\n onClick?: (event: Event) => void;\n\n /**\n * Remove the toast notification when it is clicked.\n */\n removeOnClick?: boolean;\n\n constructor(data?: Partial<ToastConfig>) {\n this.timeout = data?.timeout || 5000;\n this.onClick = data?.onClick;\n this.removeOnClick = data?.removeOnClick || false;\n }\n}\n","import {ToastrPosition} from './toastr-position';\nimport {ToastConfig} from './toast-config';\n\n/**\n * Configuration class for the entire Toastr container.\n * Provides settings to control the behavior of all toast notifications.\n * Some of these may be overriden by individual toast messages, e.g. timeout.\n *\n * @extends ToastConfig\n */\nexport class ToastrConfig extends ToastConfig{\n private static instance: ToastrConfig;\n\n /**\n * The position of the toast container on the screen.\n */\n position: ToastrPosition;\n\n private constructor(config: ToastrConfig) {\n super();\n this.timeout = config.timeout;\n this.position = config.position;\n }\n\n /**\n * Returns the default configuration for toast notifications.\n * @returns {ToastrConfig} The singleton instance of ToastrConfig with default settings\n */\n static getDefaultConfig(): ToastrConfig {\n if(!this.instance) {\n this.instance = new ToastrConfig({\n timeout: 5000,\n position: ToastrPosition.BOTTOM_RIGHT,\n });\n }\n return this.instance;\n }\n}\n","export enum ToastType {\n ERROR = 'error',\n INFO = 'info',\n SUCCESS ='success',\n WARNING = 'warning'\n}\n","/**\n * Utility class for generating various values.\n */\nexport class GeneratorUtils {\n /**\n * Generates a pseudo random UUID (Universally Unique Identifier).\n *\n * This method creates a version 4 UUID, which is based on random numbers.\n * The generated UUID follows the RFC 4122 standard format.\n *\n * @returns A string representing the randomly generated UUID in the format\n * 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' where x is any hexadecimal digit\n * and y is one of 8, 9, a, or b.\n */\n static uuid(): string {\n const HEX_RADIX = 16;\n const UUID_V4_TEMPLATE = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n const VARIANT_BITMASK = 0x3;\n const VARIANT_VALUE = 0x8;\n\n let timestamp = new Date().getTime();\n let performanceNow = (performance?.now() ?? 0) * 1000;\n\n return UUID_V4_TEMPLATE.replace(/[xy]/g, (char) => {\n let random = Math.random() * HEX_RADIX;\n\n if (timestamp > 0) {\n random = (timestamp + random) % HEX_RADIX | 0;\n timestamp = Math.floor(timestamp / HEX_RADIX);\n } else {\n random = (performanceNow + random) % HEX_RADIX | 0;\n performanceNow = Math.floor(performanceNow / HEX_RADIX);\n }\n\n const value = char === 'x' ? random : (random & VARIANT_BITMASK) | VARIANT_VALUE;\n return value.toString(HEX_RADIX);\n });\n }\n\n /**\n * Returns a hash code from a string\n * @param {String} str The string to hash.\n * @return {Number} A 32bit integer\n */\n static hashCode(str: string): number {\n let hash = 0;\n for (let i = 0, len = str.length; i < len; i++) {\n const chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\n","import {ToastType} from './toast-type';\nimport {GeneratorUtils} from '../../services/utils/generator-utils';\nimport {ToastConfig} from './toast-config';\n\n/**\n * Represents a toast notification message with type, content, and configuration.\n */\nexport class ToastMessage {\n /** Unique identifier for the toast message */\n id: string;\n\n /** The type of toast message (e.g., 'success', 'error', 'warning', 'info') */\n type: ToastType;\n\n /** The content text to be displayed in the toast notification */\n message: string;\n\n /** Additional configuration for the toast message */\n config?: ToastConfig;\n\n constructor(type: ToastType, message: string, config?: ToastConfig) {\n this.id = GeneratorUtils.uuid();\n this.type = type;\n this.message = message;\n this.config = config;\n }\n}\n","export const CREATE_TOAST_EVENT = 'create-toast-event';\n","import {ToastMessage} from './toast-message';\nimport {ModelList} from '../common';\n\n/**\n * Represents a collection of toast messages.\n */\nexport class ToastMessageList extends ModelList<ToastMessage> {\n /**\n * Creates a new instance of ToastMessageList.\n *\n * @param toasts - Optional array of ToastMessage objects to initialize the list with.\n */\n constructor(toasts?: ToastMessage[]) {\n super(toasts);\n }\n}\n","import {ModelList} from '../common';\nimport {SearchButton} from './search-button';\n\n/**\n * Represents a list of search buttons for the RDF search\n */\nexport class SearchButtonList extends ModelList<SearchButton> {\n /**\n * Creates a new instance of SearchButtonList.\n * @param buttons - An optional array of SearchButton objects to initialize the list.\n */\n constructor(buttons?: SearchButton[]) {\n super(buttons);\n }\n}\n","import {SearchButtonList} from './search-button-list';\nimport {SearchButton} from './search-button';\nimport {Model} from '../common';\n\n/**\n * Represents the configuration for search buttons.\n */\nexport class SearchButtonConfig extends Model<SearchButtonConfig> {\n /** Indicates whether the buttons should behave as radio buttons. */\n private radio!: boolean;\n\n /** The list of search buttons. */\n private buttons!: SearchButtonList;\n\n constructor(data: { isRadio: boolean, buttons: SearchButton[] }) {\n super();\n this.setRadio(data.isRadio);\n this.setButtons(new SearchButtonList(data.buttons));\n }\n\n getButtons() {\n return this.buttons;\n }\n\n setButtons(buttons: SearchButtonList) {\n this.buttons = buttons;\n }\n\n isRadio() {\n return this.radio;\n }\n\n setRadio(isRadio: boolean) {\n this.radio = isRadio;\n }\n\n selectButton(button: SearchButton) {\n if (this.isRadio() && !button.selected) {\n this.deselectAll();\n button.selected = true;\n button.callback();\n }\n return this.copy();\n }\n\n private deselectAll() {\n this.buttons.getItems().forEach((btn) => btn.selected = false);\n }\n}\n","import {Model} from '../common';\n\n/**\n * Represents a search button in the RDF search interface.\n * @extends Model<SearchButton>\n */\nexport class SearchButton extends Model<SearchButton> {\n /** the id of the button */\n id: string;\n\n /** The label text displayed on the button */\n label: string;\n\n /** Indicates whether the button is currently selected */\n selected: boolean;\n\n /** The function to be called when the button is activated */\n callback: () => void;\n\n constructor(data: SearchButton) {\n super();\n this.id = data.id;\n this.label = data.label;\n this.selected = data.selected;\n this.callback = data.callback;\n }\n}\n","import {Suggestion} from './suggestion';\nimport {ModelList} from '../common';\n\n/**\n * Represents a list of suggestions, returned from an RDF search query.\n */\nexport class SuggestionList extends ModelList<Suggestion> {\n constructor(suggestions?: Suggestion[]) {\n super(suggestions);\n }\n}\n","import {Model} from '../common';\nimport {SuggestionList} from './suggestion-list';\nimport {AutocompleteSearchResultResponse} from './api/autocomplete-search-result-response';\nimport {Suggestion} from './suggestion';\n\n/**\n * Represents an RDF search result containing suggestions.\n */\nexport class AutocompleteSearchResult extends Model<AutocompleteSearchResult> {\n /** The list of suggestions associated with this search result. */\n private _suggestions!: SuggestionList;\n\n constructor(searchResult: AutocompleteSearchResultResponse) {\n super();\n this.setSuggestions(searchResult.suggestionList);\n }\n\n getSuggestions(): SuggestionList {\n return this._suggestions;\n }\n\n setSuggestions(suggestions: SuggestionList) {\n this._suggestions = suggestions;\n }\n\n /**\n * Sets the hovered state of the first suggestion to true, if present.\n */\n hoverFirstSuggestion() {\n return this.hoverSuggestion(this.getSuggestions().getItems()[0]);\n }\n\n /**\n * Sets the hovered state of the specified suggestion to true.\n * @param suggestion - The suggestion to be highlighted.\n */\n hoverSuggestion(suggestion: Suggestion) {\n if (suggestion) {\n this.clearHoveredState();\n suggestion.setHovered(true);\n }\n return this.copy();\n }\n\n /**\n * Sets the selected state of the specified suggestion to true.\n * Clears the selected state of all other suggestions before selecting the new one.\n * If the suggestion is already selected or is null/undefined, no action is taken.\n *\n * @param suggestion - The suggestion to be selected.\n */\n selectSuggestion(suggestion: Suggestion) {\n if (suggestion) {\n this.clearSelectedState();\n suggestion.setSelected(true);\n }\n return this.copy();\n }\n\n /**\n * Returns the selected suggestion from the list, if any.\n * @return The selected suggestion, or undefined if no suggestion is selected.\n */\n getHoveredSuggestion(): Suggestion | undefined {\n return this.getSuggestions().getItems().find((suggestion) => suggestion.isHovered());\n }\n\n /**\n * Moves the hover state to the previous suggestion in the list.\n * If the currently hovered suggestion is the first one or no suggestion is hovered,\n * no action is taken.\n */\n hoverPreviousSuggestion() {\n const currentIndex = this.getSuggestions().getItems().findIndex((suggestion) => suggestion.isHovered());\n if (currentIndex > 0) {\n this.clearHoveredState();\n this.getSuggestions().getItems()[currentIndex - 1].setHovered(true);\n }\n return this.copy();\n }\n\n /**\n * Moves the hover state to the next suggestion in the list.\n * If the currently hovered suggestion is the last one or no suggestion is hovered,\n * no action is taken.\n */\n hoverNextSuggestion() {\n const currentIndex = this.getSuggestions().getItems().findIndex((suggestion) => suggestion.isHovered());\n if (currentIndex < this.getSuggestions().getItems().length - 1) {\n this.clearHoveredState();\n this.getSuggestions().getItems()[currentIndex + 1].setHovered(true);\n }\n return this.copy();\n }\n\n /**\n * Clears the selected state of all suggestions.\n */\n clearSuggestions() {\n this.setSuggestions(new SuggestionList());\n return this.copy();\n }\n\n getByValue(value: string): Suggestion | undefined {\n return this.getSuggestions().getItems().find((suggestion) => suggestion.getValue() === value);\n }\n\n private clearSelectedState() {\n this.getSuggestions().getItems().forEach((suggestion) => suggestion.setSelected(false));\n }\n\n /**\n * Sets the hovered state of all suggestions to false.\n */\n private clearHoveredState() {\n this.getSuggestions().getItems().forEach((suggestion) => suggestion.setHovered(false));\n }\n}\n","import {Model} from '../common';\nimport {SuggestionType} from './suggestion-type';\nimport {SuggestionResponse} from './api/suggestion-response';\n\n/**\n * Represents a suggestion in the RDF search functionality.\n */\nexport class Suggestion extends Model<Suggestion> {\n /** Unique identifier for the suggestion. */\n private _id?: number;\n\n /** The type of the suggestion. */\n private _type!: SuggestionType;\n\n /** The value of the suggestion. */\n private _value!: string;\n\n /** A description of the suggestion. */\n private _description?: string;\n\n /** Whether the suggestion is hovered. The hovered suggestion is the subject of action on key press */\n private _hovered?: boolean;\n\n /** Under some conditions (holding ctrlKey/metaKey, when selecting) the suggestion needs to be opened in\n * the Graph visualization view, regardless, of the selected mode\n */\n private overrideToVisual = false;\n\n /** Whether the suggestion has been selected. When clicked, the suggestion will be selected */\n private _selected?: boolean;\n\n constructor(data: SuggestionResponse) {\n super();\n this.setId(data.id);\n this.setType(data.type);\n this.setValue(data.value);\n this.setDescription(data.description);\n }\n\n getId(): number | undefined {\n return this._id;\n }\n\n setId(id?: number): void {\n this._id = id;\n }\n\n getType(): SuggestionType {\n return this._type;\n }\n\n setType(type: SuggestionType): void {\n this._type = type;\n }\n\n getValue(): string {\n return this._value;\n }\n\n setValue(value: string): void {\n this._value = value;\n }\n\n getDescription(): string | undefined {\n return this._description;\n }\n\n setDescription(description?: string): void {\n this._description = description;\n }\n\n isHovered(): boolean | undefined {\n return this._hovered;\n }\n\n setHovered(hovered: boolean): void {\n this._hovered = hovered;\n }\n\n isSelected(): boolean | undefined {\n return this._selected;\n }\n\n setSelected(selected: boolean): void {\n this._selected = selected;\n }\n\n getOverrideToVisual(): boolean {\n return this.overrideToVisual;\n }\n\n setOverrideToVisual(override: boolean): void {\n this.overrideToVisual = override;\n }\n}\n","export enum SuggestionType {\n URI = 'uri',\n PREFIX = 'prefix',\n}\n","import {Suggestion} from './suggestion';\n\n/**\n * Event payload for when a suggestion is selected.\n */\nexport class SuggestionSelectedPayload {\n private suggestion!: Suggestion;\n private context!: string;\n\n constructor(suggestion: Suggestion, context: string) {\n this.setSuggestion(suggestion);\n this.setContext(context);\n }\n\n getSuggestion(): Suggestion {\n return this.suggestion;\n }\n\n getContext(): string {\n return this.context;\n }\n\n setContext(context: string): void {\n this.context = context;\n }\n\n setSuggestion(suggestion: Suggestion): void {\n this.suggestion = suggestion;\n }\n}\n","export enum LifecycleState {\n DATA_LOADED = 'DATA_LOADED',\n}\n","import {Model} from '../common';\nimport {PluginDefinitionList} from './plugin-definition-list';\n\n/**\n * PluginsManifest is a class that represents the manifest of plugins in the application.\n * It contains a list of plugin definitions and provides methods to access them.\n */\nexport class PluginsManifest extends Model<PluginsManifest> {\n private readonly _pluginDefinitions: PluginDefinitionList;\n\n constructor(plugins: PluginDefinitionList) {\n super();\n this._pluginDefinitions = plugins;\n }\n\n /**\n * Retrieves the list of plugin definitions in the manifest.\n * @return The PluginDefinitionList containing all plugin definitions.\n */\n getPluginDefinitions(): PluginDefinitionList {\n return this._pluginDefinitions;\n }\n}\n","export enum ExtensionPoint {\n ROUTE = 'route',\n MAIN_MENU = 'main.menu'\n}\n","import {ModelList} from '../common';\nimport {PluginDefinition} from './plugin-definition';\n\n/**\n * PluginDefinitionList is a class that extends ModelList to manage a list of PluginDefinition objects.\n */\nexport class PluginDefinitionList extends ModelList<PluginDefinition> {\n\n constructor(data?: PluginDefinition[]) {\n super(data);\n }\n}\n","import {ObjectUtil} from '../../services/utils';\nimport {ValueChangeCallback} from './value-change-callback';\nimport {Copyable} from '../common';\nimport {BeforeChangeValidationPromise} from './before-change-validation-promise';\n\n/**\n * ValueContext is a generic class for managing a value of type T. It provides functionality to set and retrieve the value,\n * as well as to subscribe to changes in the value through callback functions.\n *\n * This class ensures that the value is only updated when it changes (based on a deep equality check),\n * and subscribers are notified with a copy of the updated value if it's an object, or the value itself if it's a primitive.\n *\n * @template T - The type of the value being managed. It can be any type, including primitives and objects.\n */\nexport class ValueContext<T> {\n private value: T | undefined;\n private callbackFunctions: ValueChangeCallback<T>[] = [];\n private beforeChangeValidationPromises: BeforeChangeValidationPromise<T>[] = [];\n private afterValueChangeCallbackFunctions: ValueChangeCallback<T>[] = [];\n\n /**\n * Sets the value of the context. If the new value is different from the current value\n * (determined using a deep equality check), the value is updated and all subscribed\n * callback functions are notified.\n *\n * @param value - The new value to set for the context. If the new value differs from the current value,\n * the context is updated, and subscribers are notified.\n */\n setValue(value: T): void {\n if (!ObjectUtil.deepEqual(this.value, value)) {\n this.value = this.getCopy(value);\n this.callbackFunctions.forEach(callbackFunction => callbackFunction(this.getValue()));\n this.afterValueChangeCallbackFunctions.forEach(callbackFunction => callbackFunction(this.getValue()));\n }\n }\n\n /**\n * Retrieves the current value of the context.\n * If the value is an object, a deep copy is returned to ensure immutability.\n * For primitives, the value itself is returned.\n *\n * @returns The current value, or `undefined` if no value is set.\n */\n getValue(): T | undefined {\n return this.getCopy(this.value);\n }\n\n /**\n * Registers a <code>ValueChangeCallback</code> to be notified when the value changes. The callback function will be called\n * whenever the value is updated, and it will receive the updated value.\n *\n * Optionally, a <code>BeforeChangeValidationPromise</code> function can be provided to validate value changes before they occur.\n * This validation will be checked during the value update execution.\n *\n * This method returns a function to unsubscribe both the callback and validation promise,\n * which can be called to stop receiving updates and remove the validation.\n *\n * @param callbackFunction - The callback function to subscribe, which will be invoked with the updated\n * value of type T whenever the value changes.\n * @param beforeChangeValidationPromise - Optional validation function that returns a promise resolving to\n * a boolean indicating whether a value change should be allowed.\n * @param afterChangeCallback - Optional function called after value is updated.\n * @returns A function to unsubscribe both the callback and validation promise, removing them from their respective lists.\n */\n subscribe(\n callbackFunction: ValueChangeCallback<T | undefined>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<T>,\n afterChangeCallback?: ValueChangeCallback<T | undefined>\n ): () => void {\n this.callbackFunctions.push(callbackFunction);\n\n if (beforeChangeValidationPromise) {\n this.beforeChangeValidationPromises.push(beforeChangeValidationPromise);\n }\n\n if (afterChangeCallback) {\n this.afterValueChangeCallbackFunctions.push(afterChangeCallback);\n }\n\n return () => {\n this.callbackFunctions = this.callbackFunctions.filter(fn => fn !== callbackFunction);\n this.beforeChangeValidationPromises = this.beforeChangeValidationPromises.filter(fn => fn !== beforeChangeValidationPromise);\n this.afterValueChangeCallbackFunctions = this.afterValueChangeCallbackFunctions.filter(fn => fn !== afterChangeCallback);\n };\n }\n\n /**\n * Checks if the provided value can be used to update the context by validating it against all registered\n * validation promises.\n *\n * This method executes all registered validation functions asynchronously and returns true only if all\n * validation functions approve the update. If any validation fails or throws an error, the update is\n * considered invalid.\n *\n * @param value - The value to validate before updating the context.\n * @returns A promise that resolves to true if all validation functions approve the update, false otherwise.\n */\n async canUpdate(value: T): Promise<boolean> {\n if (this.beforeChangeValidationPromises.length === 0) {\n return true; // No validation functions registered, so the update is allowed by default.\n }\n const beforeChangePromises = this.beforeChangeValidationPromises.map(validator => validator(value));\n try {\n const allResults = await Promise.all(beforeChangePromises);\n return allResults.every(result => result);\n } catch {\n return false;\n }\n }\n\n /**\n * Creates a deep copy of the given value if it's an object. For primitives, the value itself is returned.\n *\n * @param value - The value to copy.\n * @returns A deep copy of the value if it's an object, or the value itself if it's a primitive.\n */\n private getCopy(value: T | undefined): T | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (ObjectUtil.hasCopyMethod(value)) {\n // The as unknown as Copyable<T> casting is used to tell TypeScript that value is of type Copyable<T> (even if TypeScript can't deduce it automatically).\n return (value as unknown as Copyable<T>).copy();\n }\n return ObjectUtil.deepCopy(value) as T;\n }\n}\n","import {ContextService} from './context.service';\nimport {Service} from '../../providers/service/service';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {ServiceProvider} from '../../providers';\nimport {SubscriptionList} from '../../models/common';\n\n/**\n * Describes a global subscription to value changes in any registered ContextService.\n * This is used to apply the same callback logic to all context-managed properties across services.\n */\ntype GlobalSubscription = {\n callback: ValueChangeCallback<unknown>;\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<unknown>;\n afterChangeCallback?: ValueChangeCallback<unknown>;\n};\n\n/**\n * Manages subscriptions to value changes across all registered ContextService instances.\n *\n * This class enables centralized handling of property change events, allowing consumers to subscribe\n * to all context-managed values at once, including those from context registered later.\n */\nexport class ContextSubscriptionManager implements Service {\n private readonly subscribers: GlobalSubscription[] = [];\n private readonly unsubFns: SubscriptionList = new SubscriptionList();\n\n /**\n * Subscribes a ContextService instance to all currently registered global subscriptions.\n *\n * This ensures that the provided service receives all value change notifications\n * configured through {@link subscribeToAllRegisteredContexts}.\n *\n * @param service - The ContextService instance whose properties should be globally observed.\n * @returns A function that, when called, unsubscribes this service from all global subscriptions.\n */\n subscribeToService(service: ContextService<Record<string, unknown>>): () => void {\n const unsubFns: (() => void)[] = this.subscribers.map(sub =>\n service.subscribeAll(\n sub.callback,\n sub.beforeChangeValidationPromise,\n sub.afterChangeCallback\n )\n );\n this.unsubFns.addAll(unsubFns);\n return () => unsubFns.forEach(unsub => unsub());\n }\n\n /**\n * Subscribes globally to all currently registered context services and ensures that future ones\n * receive the same callbacks as well.\n *\n * @param callback - Function that will be called for every value change.\n * @param beforeChangeValidationPromise - Optional validation function called before value is applied.\n * @param afterChangeCallback - Optional function called after value is updated.\n * @returns A function that unsubscribes from all context changes.\n */\n subscribeToAllRegisteredContexts(\n callback: ValueChangeCallback<unknown>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<unknown>,\n afterChangeCallback?: ValueChangeCallback<unknown>\n ): () => void {\n\n const services = ServiceProvider.getAllBySuperType(ContextService)\n .filter(service => service.canSubscribeAll);\n // Subscribe to already registered context services\n for (const service of services) {\n this.unsubFns.add(service.subscribeAll(callback, beforeChangeValidationPromise, afterChangeCallback));\n }\n\n const subscriber: GlobalSubscription = {\n callback,\n beforeChangeValidationPromise,\n afterChangeCallback\n };\n\n this.subscribers.push(subscriber);\n\n // Return idempotent unsubscribe function\n let unsubscribed = false;\n return () => {\n if (unsubscribed) {\n return;\n }\n unsubscribed = true;\n\n // Unsubscribe from all previously registered services\n this.unsubFns.unsubscribeAll();\n\n // Remove global subscriber\n const index = this.subscribers.indexOf(subscriber);\n if (index >= 0) {\n this.subscribers.splice(index, 1);\n }\n };\n }\n}\n","import {ValueContext} from '../../models/context/value-context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {Service} from '../../providers/service/service';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {ContextSubscriptionManager} from './context-subscription-manager';\nimport {ServiceProvider} from '../../providers';\nimport {Subscription} from '../../models/common/subscription';\nimport {SubscriptionList} from '../../models/common';\n\n/**\n * Abstract service that manages the context for various properties and allows for value retrieval, updates\n * and subscriptions to value changes.\n * The service is generic and requires a type parameter that defines the fields that the service can handle.\n * The fields are defined as properties of the service class and are used to access the context values.\n */\nexport abstract class ContextService<TFields extends Record<string, unknown>> implements Service {\n /**\n * A map that stores the context for each property, keyed by property name.\n * The context holds the value and the list of subscribers (callback functions).\n */\n // eslint-disable-next-line @typescript-eslint/consistent-generic-constructors, @typescript-eslint/no-explicit-any\n protected context: Map<string, ValueContext<any>> = new Map();\n private _canSubscribeAll = false;\n\n /**\n * After construction, register this service with the global registry.\n */\n onCreated(): void {\n this._canSubscribeAll = true;\n ServiceProvider.get(ContextSubscriptionManager).subscribeToService(this);\n }\n\n /**\n * Updates the value of a specific property.\n *\n * @param propertyName The name of the property to be updated.\n * @param value The new value to be assigned to the property.\n *\n * @template T The type of the value to be set.\n */\n updateContextProperty<T>(propertyName: string, value: T): void {\n this.getOrCreateValueContext(propertyName).setValue(value);\n }\n\n /**\n * Checks if validation passes for a value of a specific property.\n *\n * @param propertyName The name of the property to be validated and updated.\n * @param value The new value to be validated and potentially assigned to the property.\n *\n * @returns A promise that resolves to a boolean indicating whether the validation passed.\n *\n * @template T The type of the value to be validated and set.\n */\n validatePropertyChange<T>(propertyName: string, value: T): Promise<boolean> {\n const valueContext = this.getOrCreateValueContext(propertyName);\n return valueContext.canUpdate(value);\n }\n\n /**\n * Retrieves the current value of a specific property.\n *\n * @param propertyName The name of the property to retrieve the value for.\n *\n * @returns The current value of the property, or `undefined` if no value is set.\n *\n * @template T The type of the value to be returned.\n */\n protected getContextPropertyValue<T>(propertyName: string): T | undefined {\n const valueContext = this.context.get(propertyName);\n return valueContext ? valueContext.getValue() : undefined;\n }\n\n /**\n * Registers a <code>callbackFunction</code> function that will be called when the value of a property with <code>propertyName</code> changes.\n * It immediately calls the callback with the current value and then subscribes the callback for future changes to the property.\n *\n * @param propertyName The name of the property to subscribe to.\n * @param callbackFunction The callback function to be called when the property value changes.\n * It will receive the current value of the property as its argument.\n * @param beforeChangeValidationPromise Optional promise that can be used to validate the new value before it is set.\n * If the promise resolves to false, the value change will be rejected.\n * @param afterChangeCallback - Optional function called **after** the main callback with the updated value.\n *\n * @returns A function that can be called to unsubscribe from the property updates.\n *\n * @template T The type of the value that the callback function will receive.\n */\n protected subscribe<T>(propertyName: string,\n callbackFunction: ValueChangeCallback<T | undefined>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<T>,\n afterChangeCallback?: ValueChangeCallback<T | undefined>): () => void {\n\n if (callbackFunction) {\n // Call the callback immediately with the current value\n callbackFunction(this.getContextPropertyValue(propertyName));\n }\n if (afterChangeCallback) {\n afterChangeCallback(this.getContextPropertyValue(propertyName));\n }\n // Return the unsubscribe function from the context\n return this.getOrCreateValueContext<T>(propertyName).subscribe(callbackFunction, beforeChangeValidationPromise, afterChangeCallback);\n }\n\n /**\n * Subscribes globally to all fields defined in TFields.\n */\n public subscribeAll<T>(\n callbackFunction: ValueChangeCallback<T | undefined>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<T>,\n afterChangeCallback?: ValueChangeCallback<T | undefined>\n ): Subscription {\n const unsubscribeFns: SubscriptionList = new SubscriptionList();\n // iterate through service-defined fields\n for (const key of this.getContextFields()) {\n unsubscribeFns.add(\n this.subscribe<T>(\n key,\n callbackFunction,\n beforeChangeValidationPromise,\n afterChangeCallback\n )\n );\n }\n return (): void => unsubscribeFns.unsubscribeAll();\n }\n \n /**\n * Retrieves the names of all context fields defined in the service,\n * which will be used to register change subscriptions.\n *\n * This method is part of the abstract base class for context services.\n * Each subclass defines a specific set of properties that are managed\n * through methods such as `updateProperty` and `onPropertyChanged`.\n *\n * This method generically collects all string-typed values defined in the subclass,\n * under the assumption that all such values represent valid context property names.\n * It assumes that:\n * - Subclasses will only define properties related to the context (i.e., no extra fields).\n * - These properties are managed entirely by the base service logic.\n *\n * While this design simplifies property management and change detection,\n * it is a known limitation that it does not strictly enforce property scoping.\n * It may inadvertently include properties that are not intended for context management\n * if subclasses define unrelated string values.\n *\n * **Note**: This approach is a temporary solution and will be deprecated once\n * all pages are migrated away from AngularJS. At that point, this generic behavior\n * will be replaced with more explicit and type-safe mechanisms.\n *\n * Subclasses may override this method if they wish to manually control\n * which context fields are exposed for subscription.\n *\n * @returns An array of property names (strings) to which change subscriptions should be applied.\n */\n protected getContextFields(): string[] {\n return Object.values(this).filter((value): value is string => typeof value === 'string');\n }\n \n /**\n * Retrieves the value context for a specific property or creates a new context if it doesn't exist.\n *\n * @param propertyName The name of the property to retrieve or create a context for.\n *\n * @returns The value context associated with the specified property.\n *\n * @template T The type of value to be stored in the context.\n */\n private getOrCreateValueContext<T>(propertyName: string): ValueContext<T> {\n let valueContext = this.context.get(propertyName);\n if (!valueContext) {\n valueContext = new ValueContext<T>();\n this.context.set(propertyName, valueContext);\n }\n return valueContext;\n }\n\n /**\n * Finds out if particular implementation of the ContextService contains a field with the given name. This can be used\n * to determine if the service can handle a specific field.\n * This method uses the keys of the TFields type to check if the field exists because all fields that the service can\n * handle are defined in the TFields type.\n * @param fieldName The name of the field to check.\n */\n canHandle(fieldName: string): boolean {\n // Iterate over all keys of TFields\n for (const key in this as unknown as TFields) {\n if ((this as never)[key] === fieldName) {\n return true;\n }\n }\n return false;\n }\n\n get canSubscribeAll(): boolean {\n return this._canSubscribeAll;\n }\n}\n","import {HttpRequest} from '../http/http-request';\n\n/**\n * Defines the structure for an HTTP interceptor.\n * This class allows for processing of HTTP requests or responses.\n * A class extending this can override the `process` and `shouldProcess` methods to customize the HTTP\n * request and response flow.\n */\nexport abstract class HttpInterceptor<T extends HttpRequest | Response> {\n /** Priority of the interceptor. Higher values indicate earlier execution. */\n priority = 0;\n\n /**\n * Processes an HTTP request or response.\n * This method can be used to modify or enhance the request or response.\n *\n * @param data - The original HTTP request or response to be processed.\n * @returns A promise that resolves to the processed HTTP request or response.\n */\n abstract process(data: T): Promise<T>\n\n /**\n * Determines whether the processing step should be applied to the given HTTP request or response.\n * This method allows for conditional processing based on the request's or response's properties.\n *\n * @param data - The HTTP request or response to be evaluated.\n * @returns A boolean indicating whether the processing should be applied (true) or skipped (false).\n */\n abstract shouldProcess(data: T): boolean;\n}\n","import {StorageData} from '../../models/storage';\nimport {Persistence} from './persistence';\nimport {StorageKey} from '../../models/storage';\n\n/**\n * Persistence implementation backed by the localStorage API.\n * In most cases, this class should not be used directly but extended by a service that provides additional specific\n * functionality and keys.\n */\nexport abstract class LocalStorageService implements Persistence {\n /**\n * The namespace is used to scope keys for the persistent properties by component or view. Each persistence service\n * should define a namespace to be used for the keys in the localStorage.\n */\n abstract get NAMESPACE(): string;\n\n /**\n * Sets the value for the given key in the localStorage.\n * Each implementation must implement this method to store the value in the localStorage by invoking the\n * LocalStorageService.storeValue method and eventually doing some additional work if needed, for example, notifying\n * other services about the change.\n * @param key The key to set the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n * @param value The value to set.\n */\n abstract set(key: string, value: string): void;\n\n /**\n * Getter for the localStorage implementation.\n */\n getStorage(): Storage {\n return localStorage;\n }\n\n /**\n * Returns the value of the given key from the localStorage.\n * @param key The key to get the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n */\n get(key: string): StorageData {\n const value = this.getStorage().getItem(this.getPrefixedKey(key));\n return new StorageData(value);\n }\n\n /**\n * Stores the value for the given key in the localStorage.\n * @param key The key to set the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n * @param value The value to set.\n */\n storeValue(key: string, value: string): void {\n this.getStorage().setItem(this.getPrefixedKey(key), value);\n }\n\n /**\n * Removes the value for the given key from the localStorage.\n * @param key The key to remove the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n */\n remove(key: string): void {\n this.getStorage().removeItem(this.getPrefixedKey(key));\n }\n\n private getPrefixedKey(key: string): string {\n const globalLocalPrefix = `${StorageKey.GLOBAL_NAMESPACE}.${this.NAMESPACE}.`;\n const localPrefix = `${this.NAMESPACE}.`;\n\n // If the key is already prefixed with the global and local namespaces, return as is\n if (key.startsWith(globalLocalPrefix)) {\n return key;\n }\n\n // If the key is prefixed with the local namespace only, add the global namespace\n if (key.startsWith(localPrefix)) {\n return `${StorageKey.GLOBAL_NAMESPACE}.${key}`;\n }\n\n // If the key is unprefixed, add both global and local namespaces\n return `${globalLocalPrefix}${key}`;\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {StorageKey} from '../../models/storage';\nimport {ServiceProvider} from '../../providers';\nimport {ContextService} from '../context';\n\n/**\n * Service that handles the storage change events and triggers the appropriate context property change handlers.\n */\nexport class LocalStorageSubscriptionHandlerService implements Service {\n\n /**\n * Handles the storage change event and triggers the appropriate context property change handlers.\n * @param event The storage change event.\n */\n handleStorageChange(event: StorageEvent): void {\n // Keys used to map properties in the local storage are in format 'storage.namespace.propertyName'.\n // The 'storage.' prefix is removed to get the namespace and property name.\n const withoutGlobalPrefix = event.key?.substring(StorageKey.GLOBAL_NAMESPACE.length + 1);\n let namespace = '';\n let contextPropertyKey = '';\n if (withoutGlobalPrefix) {\n // The namespace is the part of the key before the first '.'.\n namespace = withoutGlobalPrefix.substring(0, withoutGlobalPrefix.indexOf('.'));\n // The context property key is the part of the key after the first '.'.\n contextPropertyKey = withoutGlobalPrefix.substring(namespace.length + 1);\n }\n\n const handler = this.resolveHandler(namespace, contextPropertyKey);\n if (handler) {\n handler.updateContextProperty(contextPropertyKey, event.newValue);\n }\n }\n\n /**\n * Resolves the context property change handler for the given namespace and property name.\n * @param namespace The namespace of the context property change handler.\n * @param propertyName The property name of the context property change handler.\n */\n private resolveHandler(namespace: string, propertyName: string): ContextService<Record<string, unknown>> | undefined {\n if (!namespace) {\n console.warn('Namespace is required to resolve a context property change handler.');\n return;\n }\n const handler = ServiceProvider.getAllBySuperType(ContextService)\n .find((service) => {\n return service.canHandle(propertyName);\n });\n if (!handler) {\n console.warn(`No context property change handler found for namespace: ${namespace} and property: ${propertyName}`);\n return;\n }\n return handler as ContextService<Record<string, unknown>>;\n }\n}\n","import {LocalStorageService} from '../storage';\nimport {StorageData} from '../../models/storage';\n\n/**\n * A service for managing authentication-related local storage operations.\n */\nexport class AuthenticationStorageService extends LocalStorageService {\n private readonly jwtKey = 'jwt';\n private readonly authenticatedKey = 'authenticated';\n readonly NAMESPACE = 'auth';\n\n set(key: string, value: string) {\n this.storeValue(key, value);\n }\n\n /**\n * Retrieves the authentication token from storage.\n * @returns The stored authentication token as StorageData.\n */\n getAuthToken(): StorageData {\n return this.get(this.jwtKey);\n }\n\n setAuthenticated(authenticated: boolean) {\n this.storeValue(this.authenticatedKey, authenticated?.toString() || '');\n }\n\n isAuthenticated(): boolean {\n return this.get(this.authenticatedKey).getValue() === 'true';\n }\n}\n","import {LocalStorageService} from '../storage';\nimport {RepositoryReference} from '../../models/repositories';\n\n/**\n * Service that handles the repository related properties in the local storage.\n */\nexport class RepositoryStorageService extends LocalStorageService {\n readonly NAMESPACE = 'repository';\n\n /** Key under which the selected repository reference is stored. */\n readonly SELECTED_REPOSITORY = 'selectedRepository';\n\n /**\n * Sets a value in local storage for the given key. If the value is falsy, the key is removed instead.\n *\n * @param {string} key - The key under which to store the value.\n * @param {string} value - The value to store. If falsy, the key will be removed.\n */\n set(key: string, value: string | null): void {\n if (!value) {\n this.remove(key);\n return;\n }\n this.storeValue(key, value);\n }\n\n /**\n * Serializes and stores a RepositoryReference in local storage.\n *\n * @param {RepositoryReference} repositoryReference - The repository reference to store.\n */\n setRepositoryReference(repositoryReference: RepositoryReference): void {\n this.set(\n this.SELECTED_REPOSITORY,\n this.serializeRepositoryReference(repositoryReference)\n );\n }\n\n /**\n * Retrieves and deserializes the stored RepositoryReference from local storage.\n *\n * @returns {RepositoryReference | undefined} The deserialized repository reference, or undefined if not found.\n */\n getRepositoryReference(): RepositoryReference | undefined {\n return this.deserializeRepositoryReference(\n this.get(this.SELECTED_REPOSITORY).getValueOrDefault('{\"id\": \"\", \"location\": \"\"}')\n );\n }\n\n /**\n * Removes the stored RepositoryReference from local storage.\n */\n removeRepositoryReference(): void {\n this.remove(this.SELECTED_REPOSITORY);\n }\n\n private serializeRepositoryReference(repositoryReference: RepositoryReference): string {\n return JSON.stringify(repositoryReference);\n }\n\n private deserializeRepositoryReference(serializedRepositoryReference?: string | null): RepositoryReference | undefined {\n if (typeof serializedRepositoryReference === 'string') {\n try {\n return JSON.parse(serializedRepositoryReference);\n } catch (e) {\n console.error('Error parsing repository reference', e);\n }\n }\n return undefined;\n }\n}\n","import {ContextService} from '../context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {AuthenticatedUser, RestrictedPages, SecurityConfig, OpenIdConfig} from '../../models/security';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype SecurityContextFields = {\n readonly RESTRICTED_PAGES: string\n readonly SECURITY_CONFIG: string;\n readonly AUTHENTICATED_USER: string;\n readonly AUTH_TOKEN: string;\n readonly OPEN_ID_CONFIG: string;\n}\n\ntype SecurityContextFieldParams = {\n readonly RESTRICTED_PAGES: RestrictedPages;\n readonly SECURITY_CONFIG: SecurityConfig;\n readonly AUTHENTICATED_USER: AuthenticatedUser;\n readonly AUTH_TOKEN: string;\n readonly OPEN_ID_CONFIG: OpenIdConfig;\n}\n\n/**\n * The SecurityContextService class manages the various fields in the security context.\n */\nexport class SecurityContextService extends ContextService<SecurityContextFields> implements DeriveContextServiceContract<SecurityContextFields, SecurityContextFieldParams>, LifecycleHooks {\n readonly RESTRICTED_PAGES = 'restrictedPages';\n readonly SECURITY_CONFIG = 'securityConfig';\n readonly AUTHENTICATED_USER = 'authenticatedUser';\n readonly AUTH_TOKEN = 'jwt';\n readonly OPEN_ID_CONFIG = 'openIdConfig';\n\n /**\n * Retrieves the restricted pages for the user.\n *\n * @return a map with restricted pages.\n */\n getRestrictedPages(): RestrictedPages | undefined {\n return this.getContextPropertyValue(this.RESTRICTED_PAGES) || new RestrictedPages();\n }\n\n /**\n * Updates the restricted pages and notifies subscribers about the change.\n *\n * @param restrictedPages - an object with restricted pages.\n */\n updateRestrictedPages(restrictedPages: RestrictedPages): void {\n this.updateContextProperty(this.RESTRICTED_PAGES, restrictedPages);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the restricted pages are changed.\n *\n * @param callbackFunction - The function to call when the restricted pages are changed.\n * @returns A function to unsubscribe from updates.\n */\n onRestrictedPagesChanged(callbackFunction: ValueChangeCallback<RestrictedPages | undefined>): () => void {\n return this.subscribe(this.RESTRICTED_PAGES, callbackFunction);\n }\n\n /**\n * Subscribes to changes in the authentication token.\n *\n * @param callbackFunction - A function to be called when the auth token changes.\n * @returns A function to unsubscribe from updates.\n */\n onAuthTokenChanged(callbackFunction: ValueChangeCallback<string | undefined>): () => void {\n return this.subscribe(this.AUTH_TOKEN, callbackFunction);\n }\n\n /**\n * Updates the authentication token in the context.\n *\n * @param value - The new auth token to store.\n */\n updateAuthToken(value: string): void {\n this.updateContextProperty(this.AUTH_TOKEN, value);\n }\n\n /**\n * Retrieves the authentication token from the context.\n *\n * @returns The auth token if available, otherwise undefined.\n */\n getAuthToken(): string | undefined {\n return this.getContextPropertyValue(this.AUTH_TOKEN);\n }\n\n /**\n * Updates the security configuration in the context.\n * @param securityConfig - The new security configuration to be set.\n */\n updateSecurityConfig(securityConfig: SecurityConfig): void {\n this.updateContextProperty(this.SECURITY_CONFIG, securityConfig);\n }\n\n /**\n * Subscribes to changes in the security configuration.\n * @param callbackFunction - A function to be called when the security configuration changes.\n * @returns A function that, when called, unsubscribes from the security configuration changes.\n */\n onSecurityConfigChanged(callbackFunction: ValueChangeCallback<SecurityConfig | undefined>): () => void {\n return this.subscribe(this.SECURITY_CONFIG, callbackFunction);\n }\n\n getSecurityConfig(): SecurityConfig | undefined {\n return this.getContextPropertyValue(this.SECURITY_CONFIG);\n }\n\n /**\n * Updates the authenticated user information in the context.\n * @param authenticatedUser - The new authenticated user information to be set.\n */\n updateAuthenticatedUser(authenticatedUser: AuthenticatedUser): void {\n this.updateContextProperty(this.AUTHENTICATED_USER, authenticatedUser);\n }\n\n /**\n * Subscribes to changes in the authenticated user information.\n * @param callbackFunction - A function to be called when the authenticated user information changes.\n * @returns A function that, when called, unsubscribes from the authenticated user information changes.\n */\n onAuthenticatedUserChanged(callbackFunction: ValueChangeCallback<AuthenticatedUser | undefined>): () => void {\n return this.subscribe(this.AUTHENTICATED_USER, callbackFunction);\n }\n\n /**\n * Retrieves the authenticated user information.\n * @return the authenticated user information or undefined, if there is no user.\n */\n getAuthenticatedUser(): AuthenticatedUser | undefined {\n return this.getContextPropertyValue(this.AUTHENTICATED_USER);\n }\n\n /**\n * Updates the OpenID configuration in the context.\n *\n * @param openIdConfig - The new OpenID configuration to set.\n */\n updateOpenIdConfig(openIdConfig: OpenIdConfig): void {\n return this.updateContextProperty(this.OPEN_ID_CONFIG, openIdConfig);\n }\n\n /**\n * Retrieves the OpenID configuration from the context.\n *\n * @returns The current OpenID configuration or undefined.\n */\n getOpenIdConfig(): OpenIdConfig | undefined {\n return this.getContextPropertyValue(this.OPEN_ID_CONFIG);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {PluginRegistry} from '../../models/plugins';\n\n/**\n * Service that provides access to browser window-related functionality.\n */\nexport class WindowService implements Service {\n\n /**\n * Returns the current browser window object. The purpose of this encapsulation is to allow for\n * better testability and easier mocking of the window object in unit tests.\n */\n static getWindow(): Window {\n return window;\n }\n\n static getPluginRegistry(): PluginRegistry {\n return WindowService.getWindow().PluginRegistry;\n }\n}\n","import {WindowService} from '../window';\n\n/**\n * Redirects the current page to a specified URL using the single-spa framework.\n * Made to be used from views. If you are not navigating from a view, use <code>navigate</code> instead\n *\n * @param url - The target URL to which the page should be redirected.\n */\nexport function navigateTo(url: string): (event: Event) => void {\n return (event: Event): void => {\n if (event) {\n event.preventDefault();\n }\n navigate(url);\n };\n}\n\n/**\n * Navigates to the specified URL using the single-spa framework.\n * Suitable for in-code navigation. If you need to navigate from a view, use <code>navigateTo</code> instead.\n * @param url - The target URL to which the page should be redirected.\n */\nexport function navigate(url: string) {\n WindowService.getWindow().singleSpa.navigateToUrl(url);\n}\n\n/**\n * Opens a new tab with the specified URL.\n * @param url - The URL to open in a new tab.\n */\nexport function openInNewTab(url: string): void {\n WindowService.getWindow().open(url, '_blank');\n}\n\n/**\n * Checks if the current page is the home page.\n *\n * @returns {boolean} Returns true if the current page is the home page, false otherwise.\n */\nexport function isHomePage(): boolean {\n return getPathName() === '/';\n}\n\n/**\n * Retrieves the pathname portion of the current URL without the context prefix.\n *\n * @returns {string} The pathname of the current URL, which represents the path segment that comes after the context (if any) and before the query string.\n */\nexport function getPathName(): string {\n return WindowService.getWindow().location.pathname.substring(getContextName().length - 1);\n}\n\n/**\n * Retrieves the current URL including the context prefix, if present.\n *\n * @returns {string} The current URL including the context prefix.\n */\nexport function getOrigin(): string {\n return `${WindowService.getWindow().location.origin}${getContextName()}`;\n}\n\n/**\n * Returns the context name (base href) from the `<base>` tag in the document.\n *\n * This is usually the base path under which the app is deployed, e.g. '/graphdb/'.\n * If no `<base>` tag is found, returns '/' by default.\n *\n * @returns {string} The context path as specified in the base href (always ending with a slash).\n */\nexport function getContextName(): string {\n return document.querySelector('base')?.getAttribute('href') ?? '/';\n}\n\n/**\n * Retrieves the current route from the URL, removing the leading <code>/</code>.\n * For example:<br>\n * Calling <code>getCurrentRoute()</code> while on http://localhost:9000/sparql will return <code>\"sparql\"</code><br>\n * Calling <code>getCurrentRoute()</code> while on http://localhost:9000/graphql/endpoints will return <code>\"graphql/endpoints\"<code>\n */\nexport function getCurrentRoute(): string {\n return getPathName().substring(1);\n}\n","import {HttpInterceptor} from '../models/interceptor/http-interceptor';\nimport {HttpRequest} from '../models/http/http-request';\nimport {ModelList} from '../models/common';\nimport {AuthRequestInterceptor} from './auth/auth-request-interceptor';\nimport {UnauthorizedInterceptor} from './auth/unauthorized-interceptor';\n\n/**\n * An array of HTTP request interceptors to be used in the application.\n */\nexport const REQUEST_INTERCEPTORS = new ModelList<HttpInterceptor<HttpRequest>>([\n // Request interceptors go here\n new AuthRequestInterceptor()\n]);\n\n/**\n * An array of HTTP response interceptors to be used in the application.\n */\nexport const RESPONSE_INTERCEPTORS = new ModelList<HttpInterceptor<Response>> ([\n // Response interceptors go here\n new UnauthorizedInterceptor()\n]);\n","import {HttpRequest} from '../../models/http/http-request';\nimport {HttpInterceptor} from '../../models/interceptor/http-interceptor';\nimport {AuthenticationStorageService} from '../../services/security/authentication-storage.service';\nimport {ServiceProvider} from '../../providers';\nimport {RepositoryStorageService} from '../../services/repository/repository-storage.service';\nimport {SecurityContextService} from '../../services/security/security-context.service';\nimport {OpenIdConfig} from '../../models/security/openid-config';\n\n/**\n * AuthRequestInterceptor is responsible for intercepting HTTP requests and adding authentication\n * and repository information to the request headers.\n */\nexport class AuthRequestInterceptor extends HttpInterceptor<HttpRequest> {\n private readonly authStorage = ServiceProvider.get(AuthenticationStorageService);\n private readonly repositoryStorageService = ServiceProvider.get(RepositoryStorageService);\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n\n /**\n * Preprocesses the HTTP request by adding authentication and repository information to the headers.\n *\n * This method performs the following tasks:\n * 1. Adds an authorization token to the request headers if available.\n * 2. Adds repository ID and location to the headers if available.\n *\n * @param request - The HTTP request to be processed.\n * @returns A Promise that resolves to the modified HTTP request.\n */\n process(request: HttpRequest): Promise<HttpRequest> {\n request.headers = request.headers || {};\n request.headers['X-Requested-With'] = 'XMLHttpRequest';\n\n const authToken = this.authStorage.getAuthToken().getValue();\n if (authToken) {\n request.headers.Authorization = authToken;\n }\n\n // There are requests that need to be sent to a repository different from the currently selected one.\n // For example, in the TTYG functionality, when creating or editing an agent, there is a check to see\n // if the autocomplete is enabled for the selected agent repository.\n // So we first check if repository headers are provided before setting them in local storage.\n if (!request.headers['X-GraphDB-Repository']) {\n const repositoryReference = this.repositoryStorageService.getRepositoryReference();\n if (repositoryReference?.id) {\n request.headers['X-GraphDB-Repository'] = repositoryReference.id;\n }\n\n if (repositoryReference?.location) {\n request.headers['X-GraphDB-Repository-Location'] = repositoryReference.location;\n }\n }\n return Promise.resolve(request);\n }\n\n shouldProcess(request: HttpRequest): boolean {\n // Skip header injection if the request is part of the OpenID authentication flow\n // (e.g., token retrieval or OpenID key discovery).\n // see https://github.com/Ontotext-AD/graphdb-workbench/blob/2.8/src/js/angular/core/interceptors/authentication.interceptor.js#L12\n const openIdConfig: OpenIdConfig | undefined = this.securityContextService.getOpenIdConfig();\n if (!openIdConfig) {\n return true;\n }\n\n const openIdKeysUri = openIdConfig?.openIdKeysUri;\n const openIdTokenUrl = openIdConfig?.openIdTokenUrl;\n\n if (openIdKeysUri && openIdTokenUrl) {\n const openIDUrls = [openIdConfig?.openIdKeysUri, openIdConfig?.openIdTokenUrl];\n const isOpenIdUrl = openIDUrls.some((url) => url && request.url.indexOf(url) > -1);\n return !isOpenIdUrl;\n }\n\n return true;\n }\n}\n","import {HttpInterceptor} from '../../models/interceptor/http-interceptor';\nimport {navigate} from '../../services/utils';\nimport {WindowService} from '../../services/window';\n\nexport class UnauthorizedInterceptor extends HttpInterceptor<Response> {\n process(data: Response): Promise<Response> {\n // If backend returns 401, it means that the user is not authenticated.\n // Se we have to remove the JWT token from local storage\n if (localStorage.getItem('ontotext.gdb.auth.jwt')) {\n localStorage.removeItem('ontotext.gdb.auth.jwt');\n navigate('login');\n // There is scenario when 401 is thrown during bootstrap and\n // when user is logged the workbench is not properly loaded\n // For example if languages are not loaded.\n // So we need to reload the page to ensure that everything is loaded properly.\n WindowService.getWindow().location.reload();\n }\n return Promise.reject(data);\n }\n\n shouldProcess(data: Response): boolean {\n return 401 === data.status;\n }\n}\n","import {HttpRequest} from '../../models/http/http-request';\nimport {RESPONSE_INTERCEPTORS, REQUEST_INTERCEPTORS} from '../../interceptor/interceptors';\nimport {HttpInterceptor} from '../../models/interceptor/http-interceptor';\nimport {ModelList} from '../../models/common';\n\n/**\n * Service responsible for managing and executing HTTP interceptors.\n */\nexport class InterceptorService {\n private preProcessors = new ModelList<HttpInterceptor<HttpRequest>>();\n private postProcessors = new ModelList<HttpInterceptor<Response>>();\n\n /**\n * Initializes a new instance of the InterceptorService class.\n * This constructor sets up the default pre-processors and post-processors, defined in\n * {@link RESPONSE_INTERCEPTORS} and {@link REQUEST_INTERCEPTORS} lists.\n * It sorts the interceptors based on their priority using the sortInterceptors method.\n */\n constructor() {\n this.registerRequestInterceptors(REQUEST_INTERCEPTORS);\n this.registerResponseInterceptors(RESPONSE_INTERCEPTORS);\n }\n\n /**\n * Chains all interceptors, which {@link HttpInterceptor#shouldPreProcess should pre-process} the request.\n * @param request The initial HTTP request.\n * @returns A promise that resolves to the final processed HTTP request.\n */\n async preProcess(request: HttpRequest): Promise<HttpRequest> {\n let processedRequest = request;\n for (const interceptor of this.preProcessors.getItems()) {\n if (interceptor.shouldProcess(processedRequest)) {\n processedRequest = await interceptor.process(processedRequest);\n }\n }\n return processedRequest;\n }\n\n /**\n * Chains all interceptors, which {@link HttpInterceptor#shouldPostProcess should post process} the response.\n * @param response The initial HTTP response.\n * @returns A promise that resolves to the final processed HTTP response.\n */\n async postProcess(response: Response): Promise<Response> {\n let processedResponse = response;\n for (const interceptor of this.postProcessors.getItems()) {\n if (interceptor.shouldProcess(processedResponse)) {\n processedResponse = await interceptor.process(processedResponse);\n }\n }\n return processedResponse;\n }\n\n /**\n * Registers new pre-processors for HTTP requests.\n * Adds the provided elements to the existing pre-processors and sorts all elements again.\n *\n * @param preProcessors - A ModelList containing HttpInterceptor instances for HttpRequest objects.\n * These interceptors will be used to pre-process HTTP requests.\n */\n registerRequestInterceptors(preProcessors: ModelList<HttpInterceptor<HttpRequest>>): void {\n this.preProcessors.addItems(preProcessors.getItems());\n this.sortInterceptors(this.preProcessors);\n }\n\n /**\n * Registers new post-processors for HTTP responses.\n * Adds the provided elements to the existing postProcessors and sorts all elements again.\n *\n * @param postProcessors - An array containing HttpInterceptor instances for Response objects.\n * These interceptors will be used to post-process HTTP responses.\n */\n registerResponseInterceptors(postProcessors: ModelList<HttpInterceptor<Response>>): void {\n this.postProcessors.addItems(postProcessors.getItems());\n this.sortInterceptors(this.postProcessors);\n }\n\n private sortInterceptors<T extends HttpRequest | Response>(interceptors: ModelList<HttpInterceptor<T>>) {\n interceptors.sort((a, b) => b.priority - a.priority);\n }\n}\n","/**\n * Represents an HTTP request with its essential properties.\n */\nexport class HttpRequest {\n /** The URL of the request. */\n url: string;\n\n /** The HTTP method of the request (e.g., GET, POST, PUT, DELETE). */\n method: string;\n\n /** A key-value pair object representing the headers of the request. */\n headers: Record<string, string | undefined>;\n\n /** The body of the request. Can be of any type or undefined. */\n body?: unknown;\n\n constructor(data: HttpRequest) {\n this.url = data.url;\n this.method = data.method;\n this.headers = {...data.headers};\n this.body = data.body;\n }\n}\n","import { Event } from '../models/events';\nimport {Emitter} from './emitter';\n\n/**\n * Event emitter used for global communication within all modules. It allows emitting and subscribing to CustomEvents across\n * the application where the events are emitted via the <code>document.body</code> element. This allows for the events\n * to be caught by any component in any module.\n *\n * @template T - The type of the payload for the events.\n */\nexport class EventEmitter<T extends {} | undefined> implements Emitter {\n /**\n * Emits a {@link CustomEvent} of type <code>event.NAME</code> and detail <code>event.payload</code>.\n *\n * @param event - The event to be emitted.\n * @returns The emitted event.\n */\n emit(event: Event<T>): CustomEvent {\n const customEvent = new CustomEvent(event.NAME, { detail: event.payload });\n this.getHostElement().dispatchEvent(customEvent);\n return customEvent;\n }\n\n /**\n * Subscribes to an event of type <code>eventName</code>.\n *\n * @param eventName - The type of subscription event.\n * @param callback - The callback function that will be called when the event occurs.\n * @returns A function to unsubscribe from the event.\n */\n subscribe(eventName: string, callback: (payload: T) => void): () => void {\n const listener = (event: unknown) => {\n if (event instanceof CustomEvent) {\n callback(event.detail as T);\n }\n };\n this.getHostElement().addEventListener(eventName, listener);\n\n return () => this.getHostElement().removeEventListener(eventName, listener);\n }\n\n private getHostElement(): HTMLElement {\n return document.body;\n }\n}\n","import {HttpOptions} from '../../models/http/http-options';\nimport {InterceptorService} from '../interceptor/interceptor.service';\nimport {HttpRequest} from '../../models/http/http-request';\nimport {ServiceProvider} from '../../providers';\nimport {EventEmitter} from '../../emitters/event.emitter';\n\nconst JSON_CONTENT_TYPES = ['application/json', 'application/sparql-results+json'];\n\nexport const HTTP_REQUEST_DONE_EVENT = 'http-request-done-event';\n\n/**\n * A service class for performing HTTP requests.\n */\nexport class HttpService {\n private readonly interceptorService = ServiceProvider.get(InterceptorService);\n private readonly eventEmitter = new EventEmitter<undefined>();\n\n /**\n * Performs an HTTP GET request.\n *\n * @param url The URL to send the request to.\n * @param params (Optional) An object containing query parameters as key-value pairs.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n get<T>(url: string, params?: Record<string, string | number>, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'GET', {params, headers})\n .then((response) => {\n return response;\n });\n }\n\n /**\n * Performs an HTTP POST request.\n *\n * @param url The URL to send the request to.\n * @param body (Optional) The body of the request.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n post<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'POST', {body, headers});\n }\n\n /**\n * Performs an HTTP PUT request.\n *\n * @param url The URL to send the request to.\n * @param body (Optional) The body of the request.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n put<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'PUT', {body, headers});\n }\n\n /**\n * Performs an HTTP DELETE request.\n *\n * @param url The URL to send the request to.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n delete<T>(url: string, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'DELETE', {headers});\n }\n\n /**\n * Performs an HTTP PATCH request.\n *\n * @param url The URL to send the request to.\n * @param body (Optional) The body of the request.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n patch<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'PATCH', {body, headers});\n }\n\n /**\n * Path string variable can contain characters which encodeURIComponent() can have problems encoding.\n * These characters are replaced in this method.\n * @param str - a component of URI\n * @returns {string} The provided string encoded as a URI component.\n */\n protected encodeURIComponentStrict(str: string): string {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16);\n });\n }\n\n /**\n * Performs an HTTP request with the specified method and options.\n *\n * @param url The URL to send the request to.\n * @param method The HTTP method to use (GET, POST, PUT, DELETE).\n * @param options (Optional) An object containing the request options, including:\n * - `params`: Query parameters as key-value pairs.\n * - `headers`: Request headers as key-value pairs.\n * - `body`: The request body.\n * @returns A Promise that resolves with the response data of type T, or is rejected with an error if the request fails.\n */\n private request<T>(url: string, method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', options: HttpOptions = {}): Promise<T> {\n const queryString = this.buildQueryParams(options.params);\n const fullUrl = `${url}${queryString ? `?${queryString}` : ''}`;\n const headers = {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/plain, */*',\n ...options.headers,\n };\n\n return this.interceptorService.preProcess(new HttpRequest({url: fullUrl, method, headers, body: options.body}))\n .then((request) => {\n return fetch(request.url, {\n method: request.method,\n headers: request.headers as HeadersInit,\n body: request.body ? JSON.stringify(request.body) : null,\n });\n })\n .then((response) => {\n return this.interceptorService.postProcess(response);\n })\n .then((response) => {\n if (!response.ok) {\n return Promise.reject(response);\n }\n const isJson = this.hasValidJson(response);\n return (isJson ? response.json() : Promise.resolve()) as Promise<T>;\n })\n .finally(() => this.eventEmitter.emit({NAME: HTTP_REQUEST_DONE_EVENT, payload: undefined}));\n }\n\n private hasValidJson(response: Response) {\n const responseContentType = response.headers.get('Content-Type');\n if (!responseContentType) {\n return false;\n }\n return JSON_CONTENT_TYPES.some((contentType) => responseContentType.includes(contentType));\n }\n\n /**\n * Builds a query string from an object of parameters.\n *\n * @param params An object containing query parameters as key-value pairs.\n * @returns A query string suitable for appending to a URL.\n */\n private buildQueryParams(params: Record<string, string | number> = {}): string {\n // @ts-expect-error JavaScript will automatically convert numbers into strings when they are passed to URLSearchParams, TypeScript doesn't know that this is safe.\n return new URLSearchParams(params).toString();\n }\n}\n","import { HttpService } from '../http/http.service';\nimport { LanguageConfig, TranslationBundle } from '../../models/language';\n\n/**\n * Service for handling language-related REST operations.\n */\nexport class LanguageRestService extends HttpService {\n private readonly I18N_ENDPOINT = 'assets/i18n';\n\n /**\n * Retrieves the translation bundle for a specific language.\n *\n * @param languageCode - The code of the language for which to fetch translations.\n * @returns A Promise that resolves to a TranslationBundle containing the translations for the specified language.\n */\n getLanguage(languageCode: string): Promise<TranslationBundle> {\n return this.get<TranslationBundle>(`${this.I18N_ENDPOINT}/${languageCode}.json`);\n }\n\n /**\n * Fetches the language configuration for the application.\n *\n * @returns A Promise that resolves to a {@link LanguageConfig} object containing the language configuration settings.\n */\n getLanguageConfiguration(): Promise<LanguageConfig> {\n return this.get<LanguageConfig>(`${this.I18N_ENDPOINT}/language-config.json`);\n }\n}\n","import { LanguageConfig } from '../../../models/language';\nimport { Mapper } from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for LanguageConfig objects.\n */\nexport class LanguageConfigMapper extends Mapper<LanguageConfig> {\n /**\n * Maps the input data to a new LanguageConfig model instance.\n *\n * @param data - The LanguageConfig data to be mapped.\n * @returns A new LanguageConfig instance created from the input data.\n */\n mapToModel(data: LanguageConfig): LanguageConfig {\n return new LanguageConfig(data);\n }\n}\n","import {LocalStorageService} from '../storage';\n\n/**\n * Service that handles the language related properties in the local storage.\n */\nexport class LanguageStorageService extends LocalStorageService {\n readonly NAMESPACE = 'i18n';\n\n set(key: string, value: string) {\n this.storeValue(key, value);\n }\n}\n","import {ContextService} from '../context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {ServiceProvider} from '../../providers';\nimport {LanguageStorageService} from './language-storage.service';\nimport {LanguageService} from './language.service';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LanguageConfig, TranslationBundle} from '../../models/language';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype LanguageContextFields = {\n readonly SELECTED_LANGUAGE: string;\n}\n\n/**\n * The LanguageService class manages the application's language context.\n */\nexport class LanguageContextService extends ContextService<LanguageContextFields> implements DeriveContextServiceContract<LanguageContextFields>, LifecycleHooks {\n private readonly LANGUAGE_CONFIG = 'languageConfig';\n readonly SELECTED_LANGUAGE = 'selectedLanguage';\n readonly LANGUAGE_BUNDLE = 'languageBundle';\n readonly DEFAULT_BUNDLE = 'defaultBundle';\n\n /**\n * Changes the selected language of the application. This method updates the selected language and notifies\n * all subscribers about the language change.\n *\n * @param {string} locale - The new language code to set (e.g., 'en', 'fr', 'de').\n */\n updateSelectedLanguage(locale?: string): void {\n this.validatePropertyChange(this.SELECTED_LANGUAGE, locale)\n .then((shouldSet) => {\n if (shouldSet) {\n const selectedLanguage = locale || ServiceProvider.get(LanguageService).getDefaultLanguage();\n const storageService = ServiceProvider.get(LanguageStorageService);\n storageService.set(this.SELECTED_LANGUAGE, selectedLanguage);\n this.updateContextProperty(this.SELECTED_LANGUAGE, locale);\n }\n });\n }\n\n /**\n * Registers a <code>callbackFunction</code> to be called whenever the selected language changes.\n *\n * This method allows components to react to language changes in the application.\n * The callback will be triggered with the new language value whenever it changes.\n *\n * @param callbackFunction - The function to call when the selected language changes.\n * @param beforeChangeValidationPromise - Optional. A promise that will be resolved before\n * the language change is applied. This can be used to validate or prepare for the\n * language change. If the promise is resolved with false or rejects, the language change will be canceled.\n * @returns A function to unsubscribe from updates.\n */\n onSelectedLanguageChanged(callbackFunction: ValueChangeCallback<string | undefined>, beforeChangeValidationPromise?: BeforeChangeValidationPromise<string | undefined>): () => void {\n return this.subscribe(this.SELECTED_LANGUAGE, callbackFunction, beforeChangeValidationPromise);\n }\n\n /**\n * Updates the language bundle in the context.\n *\n * This method is responsible for updating the translation bundle used for\n * internationalization in the application. It updates the context property\n * associated with the language bundle.\n *\n * @param {TranslationBundle} bundle - The new translation bundle to be set.\n */\n updateLanguageBundle(bundle: TranslationBundle): void {\n this.updateContextProperty<TranslationBundle>(this.LANGUAGE_BUNDLE, bundle);\n }\n\n /**\n * Registers a callback function to be called whenever the language bundle changes.\n *\n * @param {ValueChangeCallback<TranslationBundle | undefined>} callbackFunction - The function to call when the language bundle changes.\n * This function will receive the new TranslationBundle as its parameter, or undefined if the bundle is cleared.\n */\n onLanguageBundleChanged(callbackFunction: ValueChangeCallback<TranslationBundle | undefined>): () => void {\n return this.subscribe(this.LANGUAGE_BUNDLE, callbackFunction);\n }\n\n /**\n * Updates the default language bundle in the context.\n *\n * This method sets a new default translation bundle for the application.\n * It's typically used to store a fallback bundle that can be used when\n * the primary language bundle is not available or incomplete.\n *\n * @param {TranslationBundle} bundle - The new default translation bundle to be set.\n */\n updateDefaultBundle(bundle: TranslationBundle): void {\n this.updateContextProperty<TranslationBundle>(this.DEFAULT_BUNDLE, bundle);\n }\n\n /**\n * Retrieves the current default language bundle from the context.\n *\n * This method returns the default translation bundle that was previously\n * set using the updateDefaultBundle method. If no default bundle has been\n * set, it returns undefined.\n *\n * @returns {TranslationBundle | undefined} The current default translation bundle,\n * or undefined if no default bundle has been set.\n */\n getDefaultBundle(): TranslationBundle | undefined {\n return this.getContextPropertyValue(this.DEFAULT_BUNDLE);\n }\n\n /**\n * Retrieves the current language configuration from the context.\n *\n * @returns {LanguageConfig | undefined} The current language configuration,\n * or undefined if no configuration has been set.\n */\n getLanguageConfig(): LanguageConfig | undefined {\n return this.getContextPropertyValue(this.LANGUAGE_CONFIG);\n }\n\n /**\n * Sets a new language configuration in the context.\n *\n * @param {LanguageConfig} languageConfig - The new language configuration to be set.\n */\n setLanguageConfig(languageConfig?: LanguageConfig) {\n this.updateContextProperty(this.LANGUAGE_CONFIG, languageConfig);\n }\n\n /**\n * Retrieves the currently selected language from the context.\n *\n * @returns {string | undefined} The code of the currently selected language.\n * Returns undefined if no language has been selected or set in the context.\n *\n */\n getSelectedLanguage(): string | undefined {\n return this.getContextPropertyValue(this.SELECTED_LANGUAGE);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {TranslationBundle} from '../../models/language';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {LanguageConfig} from '../../models/language';\nimport {LanguageRestService} from './language-rest.service';\nimport {LanguageConfigMapper} from './mappers/language-config-mapper';\nimport {LanguageContextService} from './language-context.service';\n\n/**\n * The LanguageService class is responsible for fetching language-related data from the backend\n * and mapping the responses to the workbench models.\n */\nexport class LanguageService implements Service {\n private readonly languageRestService: LanguageRestService = ServiceProvider.get(LanguageRestService);\n private readonly languageContextService: LanguageContextService = ServiceProvider.get(LanguageContextService);\n\n /**\n * Retrieves an array of supported language codes.\n *\n * This function fetches the language configuration from the storage service\n * and extracts the list of supported language codes. If no configuration\n * is found, it returns a default array with 'en' and 'fr'.\n *\n * @returns {string[]} An array of supported language codes.\n */\n getSupportedLanguages(): string[] {\n const languageConfig = this.languageContextService.getLanguageConfig();\n return languageConfig ? languageConfig.availableLanguages.getLanguageCodes() : ['en', 'fr'];\n }\n\n /**\n * Retrieves the translation bundle for a specified language.\n *\n * @param {string} languageCode - The code of the language for which to fetch the translation bundle.\n * @returns {Promise<TranslationBundle>} A promise that resolves to a TranslationBundle object\n * containing the translations for the specified language.\n */\n getLanguage(languageCode: string): Promise<TranslationBundle> {\n return this.languageRestService.getLanguage(languageCode);\n }\n\n /**\n * Retrieves the language configuration from the server and maps it to a LanguageConfig model.\n *\n * @returns {Promise<LanguageConfig>} A promise that resolves to a LanguageConfig object\n * representing the current language configuration.\n */\n getLanguageConfiguration(): Promise<LanguageConfig> {\n return this.languageRestService.getLanguageConfiguration()\n .then(config => MapperProvider.get(LanguageConfigMapper).mapToModel(config));\n }\n\n /**\n * Retrieves the default language code from the stored language configuration.\n *\n * This function attempts to fetch the language configuration from the storage service\n * and extract the default language code. If no configuration is found, it returns 'en'\n * (English) as the default language.\n *\n * @returns {string} The default language code. Returns 'en' if no configuration is found.\n */\n getDefaultLanguage(): string {\n const languageConfig = this.languageContextService.getLanguageConfig();\n return languageConfig ? languageConfig.defaultLanguage : 'en';\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {Repository, RepositorySizeInfo} from '../../models/repositories';\n\nexport class RepositoryRestService extends HttpService {\n\n static readonly REPOSITORIES_ENDPOINT = 'rest/repositories';\n\n getRepositories(): Promise<Record<string, unknown[]>> {\n return this.get(`${RepositoryRestService.REPOSITORIES_ENDPOINT}/all`);\n }\n\n getRepositorySizeInfo(repository: Repository): Promise<RepositorySizeInfo> {\n return this.get(`${RepositoryRestService.REPOSITORIES_ENDPOINT}/${repository.id}/size?location=${encodeURIComponent(repository.location)}`);\n }\n}\n","import { Repository } from '../../../models/repositories';\nimport { Mapper } from '../../../providers/mapper/mapper';\n\n/**\n * A class containing functions to map various server responses to specific repository models.\n */\nexport class RepositoryMapper extends Mapper<Repository> {\n\n /**\n * Maps the raw data to an instance of the {@link Repository} model.\n *\n * @param {Repository} data - The raw data to be transformed into a Repository model.\n * @returns {Repository} - A new Repository instance.\n */\n mapToModel(data: Partial<Repository>): Repository {\n return new Repository(data);\n }\n}\n","import { Mapper } from '../../../providers/mapper/mapper';\nimport { Repository, RepositoryList } from '../../../models/repositories';\nimport { RepositoryMapper } from './repository.mapper';\nimport { MapperProvider } from '../../../providers';\n\n/**\n * Maps server response data to a {@link RepositoryList} model.\n *\n * This mapper processes repository data grouped by location into a flat list of {@link Repository}\n * instances wrapped in a {@link RepositoryList}.\n */\nexport class RepositoryListMapper extends Mapper<RepositoryList> {\n private repositoryMapper: Mapper<Repository>;\n\n constructor() {\n super();\n this.repositoryMapper = MapperProvider.get(RepositoryMapper);\n }\n\n /**\n * Maps the raw data to an instance of the {@link RepositoryList} model.\n *\n * @param data - The raw server response containing repositories grouped by location URLs.\n * The structure is a record where keys are location URLs and values are arrays of repository data.\n * @returns A {@link RepositoryList} model containing all repositories as a flat list.\n */\n mapToModel(data?: Record<string, unknown[]>): RepositoryList {\n if (!data || typeof data !== 'object') {\n return new RepositoryList();\n }\n\n const repositories: Repository[] = [];\n\n Object.entries(data).forEach(([, repositoriesData]) => {\n if (Array.isArray(repositoriesData)) {\n repositoriesData.forEach((repositoryData) => {\n const repository = this.repositoryMapper.mapToModel(repositoryData);\n repositories.push(repository);\n });\n }\n });\n\n return new RepositoryList(repositories);\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {RepositorySizeInfo} from '../../../models/repositories';\n\nexport class RepositorySizeInfoMapper extends Mapper<RepositorySizeInfo> {\n\n /**\n * Maps the raw data to an instance of the {@link RepositorySizeInfo} model.\n *\n * @returns {RepositorySizeInfo} - A new RepositorySizeInfo instance.\n */\n mapToModel(data: Partial<RepositorySizeInfo>): RepositorySizeInfo {\n return new RepositorySizeInfo(data);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {RepositoryRestService} from './repository-rest.service';\nimport {Repository, RepositoryList} from '../../models/repositories';\nimport {RepositoryListMapper} from './mappers/repository-list.mapper';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {RepositorySizeInfo} from '../../models/repositories';\nimport {RepositorySizeInfoMapper} from './mappers/repository-size-info.mapper';\nimport {Mapper} from '../../providers/mapper/mapper';\n\n/**\n * The RepositoryService class is responsible for fetching repository-related data from the backend\n * and mapping the responses to application models.\n */\nexport class RepositoryService implements Service {\n private readonly GRAPHQL_REPO_AUTHORITY = 'GRAPHQL';\n private repositoryRestService: RepositoryRestService;\n private repositoryListMapper: Mapper<RepositoryList>;\n private repositorySizeInfoMapper: Mapper<RepositorySizeInfo>;\n\n constructor() {\n this.repositoryRestService = ServiceProvider.get(RepositoryRestService);\n this.repositoryListMapper = MapperProvider.get(RepositoryListMapper);\n this.repositorySizeInfoMapper = MapperProvider.get(RepositorySizeInfoMapper);\n }\n\n /**\n * Retrieves the list of repositories.\n *\n * @returns A promise that resolves to the list of repositories.\n */\n getRepositories(): Promise<RepositoryList> {\n return this.repositoryRestService\n .getRepositories()\n .then((response) => {\n return this.repositoryListMapper.mapToModel(response);\n });\n }\n\n /**\n * Retrieves triple information for the specified <code>repository</code>.\n *\n * @param repository The repository for which to retrieve size information.\n * @returns A promise that resolves to a {@link RepositorySizeInfo} object containing the repository's triple details.\n */\n getRepositorySizeInfo(repository: Repository): Promise<RepositorySizeInfo> {\n return this.repositoryRestService.getRepositorySizeInfo(repository)\n .then(this.repositorySizeInfoMapper.mapToModel);\n }\n\n isSystemRepository(repository: Repository): boolean {\n return repository.id === 'SYSTEM';\n }\n\n getCurrentGqlRepoAuthority(action: string, repoId: string): string {\n return `${this.getCurrentRepoAuthority(action, repoId)}:${this.GRAPHQL_REPO_AUTHORITY}`;\n }\n\n getOverallGqlRepoAuthority(action: string): string {\n return `${this.getOverallRepoAuthority(action)}:${this.GRAPHQL_REPO_AUTHORITY}`;\n }\n\n getLocationSpecificId(repo: Repository): string {\n return repo.location ? `${repo.id}@${repo.location}` : repo.id;\n }\n\n getCurrentRepoAuthority(action: string, repoId: string): string {\n return `${action}_REPO_${repoId}`;\n }\n\n getOverallRepoAuthority(action: string): string {\n return `${action}_REPO_*`;\n }\n}\n","import {ContextService} from '../context';\nimport {Repository, RepositoryList, RepositoryReference} from '../../models/repositories';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ServiceProvider} from '../../providers';\nimport {RepositoryStorageService} from './repository-storage.service';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype RepositoryContextFields = {\n readonly REPOSITORY_LIST: string;\n readonly SELECTED_REPOSITORY: string;\n}\n\ntype RepositoryContextFieldParams = {\n readonly REPOSITORY_LIST: RepositoryList;\n readonly SELECTED_REPOSITORY: RepositoryReference;\n};\n\n/**\n * The RepositoryContextService class manages the application's repository context.\n */\nexport class RepositoryContextService extends ContextService<RepositoryContextFields> implements DeriveContextServiceContract<RepositoryContextFields, RepositoryContextFieldParams>, LifecycleHooks {\n readonly SELECTED_REPOSITORY = 'selectedRepository';\n readonly REPOSITORY_LIST = 'repositoryList';\n\n /**\n * Updates the selected repository and notifies subscribers about the change.\n *\n * @param [repositoryReference] - The new repository to set as selected. Optional.\n */\n updateSelectedRepository(repositoryReference?: RepositoryReference): void {\n const storageService = ServiceProvider.get(RepositoryStorageService);\n const selectedRepository = this.findRepository(repositoryReference);\n\n this.validatePropertyChange(this.SELECTED_REPOSITORY, selectedRepository)\n .then((canChange) => {\n if (canChange) {\n if (selectedRepository) {\n storageService.setRepositoryReference(selectedRepository.toRepositoryReference());\n } else if (!repositoryReference) {\n storageService.removeRepositoryReference();\n }\n this.updateContextProperty(this.SELECTED_REPOSITORY, selectedRepository);\n }\n });\n }\n\n /**\n * Retrieves the currently selected repository.\n */\n getSelectedRepository(): Repository | undefined {\n return this.getContextPropertyValue(this.SELECTED_REPOSITORY);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the selected repository changes.\n *\n * @param callbackFunction - The function to call when the selected repository changes.\n * @param beforeChangeValidationPromise - Optional. A promise that will be resolved before\n * the repository change is applied. This can be used to validate or prepare for the\n * repository change. If the promise is resolved with false or rejects, the repository change will be canceled.\n * @returns A function to unsubscribe from updates.\n */\n onSelectedRepositoryChanged(callbackFunction: ValueChangeCallback<Repository | undefined>, beforeChangeValidationPromise?: BeforeChangeValidationPromise<Repository | undefined>): () => void {\n return this.subscribe(this.SELECTED_REPOSITORY, callbackFunction, beforeChangeValidationPromise);\n }\n\n /**\n * Updates the list with repositories and notifies subscribers about the change.\n *\n * @param repositories - The new list with repositories.\n */\n updateRepositoryList(repositories: RepositoryList): void {\n return this.updateContextProperty(this.REPOSITORY_LIST, repositories);\n }\n\n /**\n * Retrieves the list of repositories from the current context.\n *\n * @returns {RepositoryList} The list of repositories. Returns an empty RepositoryList if none is found.\n */\n getRepositoryList(): RepositoryList {\n return this.getContextPropertyValue(this.REPOSITORY_LIST) || new RepositoryList([]);\n }\n\n /**\n *\n * Registers the <code>callbackFunction</code> to be called whenever the repository list changes.\n *\n * @param callbackFunction - The function to call when the repository list changes.\n * @returns A function to unsubscribe from updates.\n */\n onRepositoryListChanged(callbackFunction: ValueChangeCallback<RepositoryList | undefined>): () => void {\n return this.subscribe(this.REPOSITORY_LIST, callbackFunction);\n }\n\n /**\n * Finds and returns a repository matching the given repository reference.\n *\n * @param {RepositoryReference} repositoryReference - The reference containing `id` and `location` to identify the repository.\n * @returns {Repository | undefined} The matching repository if found; otherwise, undefined.\n */\n private findRepository(repositoryReference?: RepositoryReference): Repository | undefined {\n if (!repositoryReference) {\n return undefined;\n }\n return this.getRepositoryList().findRepository(repositoryReference.id, repositoryReference.location);\n }\n}\n","import {RepositoryLocation} from '../../models/repository-location';\nimport {HttpService} from '../http/http.service';\n\nexport class RepositoryLocationRestService extends HttpService {\n getActiveRepositoryLocation(): Promise<RepositoryLocation> {\n return this.get('rest/locations/active');\n }\n}\n","import {RepositoryLocation} from '../../../models/repository-location';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * A class containing functions to map various server responses to specific repository location models.\n */\nexport class RepositoryLocationMapper extends Mapper<RepositoryLocation> {\n\n /**\n * Maps the raw data to an instance of the {@link RepositoryLocation} model.\n *\n * @param {Partial<RepositoryLocation>} data - The raw data to be transformed into a RepositoryLocation model.\n * @returns {RepositoryLocation} - A new Repository instance.\n */\n mapToModel(data: Partial<RepositoryLocation>): RepositoryLocation {\n return new RepositoryLocation(data);\n }\n}\n","import {RepositoryLocationRestService} from './repository-location-rest.service';\nimport {RepositoryLocation} from '../../models/repository-location';\nimport {RepositoryLocationMapper} from './mappers/repository-location.mapper';\nimport {Service} from '../../providers/service/service';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {Mapper} from '../../providers/mapper/mapper';\n\n/**\n * The RepositoryLocationService class is responsible for fetching repository-location-related data from the backend\n * and mapping the responses to application models.\n */\nexport class RepositoryLocationService implements Service {\n private locationRestService: RepositoryLocationRestService;\n private repositoryLocationMapper: Mapper<RepositoryLocation>;\n\n constructor() {\n this.locationRestService = ServiceProvider.get(RepositoryLocationRestService);\n this.repositoryLocationMapper = MapperProvider.get(RepositoryLocationMapper);\n }\n\n /**\n * Retrieves the current repository location.\n *\n * @returns A promise resolving to the active repository location.\n */\n getActiveRepositoryLocation(): Promise<RepositoryLocation> {\n return this.locationRestService\n .getActiveRepositoryLocation()\n .then(this.repositoryLocationMapper.mapToModel);\n }\n}\n","import {ContextService} from '../context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {RepositoryLocation} from '../../models/repository-location';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype RepositoryLocationContextFields = {\n readonly ACTIVE_REPOSITORY_LOCATION: string;\n readonly IS_LOADING: string;\n}\n\ntype RepositoryLocationContextFieldParams = {\n readonly ACTIVE_REPOSITORY_LOCATION: RepositoryLocation;\n readonly IS_LOADING: boolean;\n};\n\n/**\n * The RepositoryLocationContextService class manages the application's repository location context.\n */\nexport class RepositoryLocationContextService extends ContextService<RepositoryLocationContextFields> implements DeriveContextServiceContract<RepositoryLocationContextFields, RepositoryLocationContextFieldParams>, LifecycleHooks {\n\n readonly ACTIVE_REPOSITORY_LOCATION = 'activeRepositoryLocation';\n readonly IS_LOADING = 'isLoading';\n\n /**\n * Updates the active repository location and notifies subscribers about the change.\n *\n * @param repositoryLocation - The repository location to set as active.\n */\n updateActiveRepositoryLocation(repositoryLocation: RepositoryLocation): void {\n this.updateContextProperty(this.ACTIVE_REPOSITORY_LOCATION, repositoryLocation);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the active location changes.\n *\n * @param callbackFunction - The function to execute when the repository location changes.\n * @returns A function to unsubscribe from notifications.\n */\n onActiveLocationChanged(callbackFunction: ValueChangeCallback<RepositoryLocation | undefined>): () => void {\n return this.subscribe(this.ACTIVE_REPOSITORY_LOCATION, callbackFunction);\n }\n\n /**\n * Updates the loading state and notifies subscribers about the change.\n *\n * @param isLoading - The new loading state.\n */\n updateIsLoading(isLoading: boolean): void {\n this.updateContextProperty(this.IS_LOADING, isLoading);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the loading state changes.\n *\n * @param callbackFunction - The function to execute when the loading state changes.\n * @returns A function to unsubscribe from notifications.\n */\n onIsLoadingChanged(callbackFunction: ValueChangeCallback<boolean | undefined>): () => void {\n return this.subscribe(this.IS_LOADING, callbackFunction);\n }\n}\n","import { License } from '../../models/license';\nimport { HttpService } from '../http/http.service';\n\n/**\n * Service class for handling REST API calls related to license operations.\n * Extends the HttpService to utilize its HTTP request capabilities.\n */\nexport class LicenseRestService extends HttpService {\n /**\n * Retrieves the current license information from the GraphDB settings.\n *\n * This method sends a GET request to the '/rest/graphdb-settings/license' endpoint\n * to fetch the license details.\n *\n * @returns A Promise that resolves to a License object containing the current license information.\n */\n getLicense(): Promise<License> {\n return this.get<License>('rest/graphdb-settings/license');\n }\n}\n","import { Mapper } from '../../../providers/mapper/mapper';\nimport { License } from '../../../models/license';\n\n/**\n * Mapper for Graph DB license object. Maps the API JSON response to {@link License}\n */\nexport class LicenseMapper extends Mapper<License> {\n\n /**\n * Map to {@link License} object\n *\n * @param {Partial<License>} data - The raw representation of the license object\n * @returns {License} - A new License instance\n */\n mapToModel(data: Partial<License>): License {\n return new License(data);\n }\n}\n","import {License} from '../../models/license';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype LicenseContextFields = {\n readonly GRAPHDB_LICENSE: string;\n}\n\ntype LicenseContextFieldParams = {\n readonly GRAPHDB_LICENSE: License;\n};\n\n/**\n * Service for managing license context in the application.\n * Extends the base ContextService to provide license-specific functionality.\n */\nexport class LicenseContextService extends ContextService<LicenseContextFields> implements DeriveContextServiceContract<LicenseContextFields, LicenseContextFieldParams>, LifecycleHooks {\n readonly GRAPHDB_LICENSE = 'graphDbLicense';\n\n /**\n * Updates the license information in the context.\n * @param license - The new License object to be set in the context.\n */\n updateGraphdbLicense(license: License | undefined): void {\n this.updateContextProperty(this.GRAPHDB_LICENSE, license);\n }\n\n /**\n * Subscribes to changes in the license context\n *\n * @param callbackFn - A callback function that will be called when the license changes.\n * The callback receives the updated License object or undefined as its parameter.\n * @returns A function that, when called, will unsubscribe from the license changes.\n */\n onLicenseChanged(callbackFn: ValueChangeCallback<License | undefined>): () => void {\n return this.subscribe(this.GRAPHDB_LICENSE, callbackFn);\n }\n\n /**\n * Retrieves the license information from the context.\n *\n * @return the license information or undefined, if there is no license.\n */\n getLicense(): License | undefined {\n return this.getContextPropertyValue(this.GRAPHDB_LICENSE);\n }\n}\n","import {LicenseRestService} from './license-rest.service';\nimport {ServiceProvider} from '../../providers';\nimport {License} from '../../models/license';\nimport {LicenseMapper} from './mappers/license-mapper';\nimport {Service} from '../../providers/service/service';\nimport {LicenseContextService} from './license-context.service';\n\n/**\n * Service class for handling license-related operations.\n */\nexport class LicenseService implements Service {\n private readonly licenseRestService: LicenseRestService = ServiceProvider.get(LicenseRestService);\n private readonly licenseMapper: LicenseMapper = ServiceProvider.get(LicenseMapper);\n private readonly trackableProductTypes = ['free', 'sandbox'];\n private readonly trackableTypesOfUse = ['evaluation', 'this is an evaluation license'];\n\n /**\n * Retrieves the current license information.\n *\n * This function fetches the current license data from the license REST service\n * and maps the response to a License model object.\n *\n * @returns {Promise<License>} A Promise that resolves to a License object representing the current license.\n */\n getLicense(): Promise<License> {\n return this.licenseRestService.getLicense()\n .then(response => this.licenseMapper.mapToModel(response));\n }\n\n /**\n * Determines if the current license can be tracked.\n *\n * This function checks the product type and type of use of the current license\n * to determine if it's a trackable license. A license is considered trackable if:\n * - A license is not present, or\n * - The product type is 'free', or\n * - The product type is `sandbox`, or\n * - The type of use is `evaluation` (case-insensitive), or\n * - The type of use is `this is an evaluation license` (case-insensitive)\n *\n * @returns {boolean} True if the license is a free license, false otherwise.\n */\n isTrackableLicense(): boolean {\n const license = ServiceProvider.get(LicenseContextService).getLicense();\n const licenseTypeOfUse = license?.typeOfUse?.toLowerCase() || '';\n const productType = license?.productType?.toLowerCase() || '';\n return !license?.present\n || this.trackableProductTypes.includes(productType)\n || this.trackableTypesOfUse.includes(licenseTypeOfUse);\n }\n}\n","import { ContextService } from '../context';\nimport { ProductInfo } from '../../models/product-info';\nimport { ValueChangeCallback } from '../../models/context/value-change-callback';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype ProductInfoContextFields = {\n readonly PRODUCT_INFO: string;\n};\n\ntype ProductInfoContextFieldParams = {\n readonly PRODUCT_INFO: ProductInfo;\n};\n\n/**\n * Service for managing product information context.\n */\nexport class ProductInfoContextService extends ContextService<ProductInfoContextFields> implements DeriveContextServiceContract<ProductInfoContextFields, ProductInfoContextFieldParams>, LifecycleHooks {\n readonly PRODUCT_INFO = 'productInfo';\n\n /**\n * Updates the product information in the context.\n *\n * @param productInfo - The new ProductInfo object to be set in the context.\n */\n updateProductInfo(productInfo: ProductInfo): void {\n this.updateContextProperty(this.PRODUCT_INFO, productInfo);\n }\n\n /**\n * Subscribes to changes in the product information context.\n *\n * @param callbackFn - A callback function that will be called when the product information changes.\n * The callback receives the updated ProductInfo object or undefined as its parameter.\n * @returns A function that, when called, will unsubscribe from the product information changes.\n */\n onProductInfoChanged(callbackFn: ValueChangeCallback<ProductInfo | undefined>): () => void {\n return this.subscribe(this.PRODUCT_INFO, callbackFn);\n }\n}\n","import { ProductInfo } from '../../../models/product-info';\nimport { Mapper } from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for ProductInfo objects.\n *\n * This class extends the generic Mapper class, specializing in mapping\n * partial ProductInfo data to complete ProductInfo models.\n */\nexport class ProductInfoMapper extends Mapper<ProductInfo> {\n /**\n * Maps partial ProductInfo data to a complete ProductInfo model.\n *\n * This method takes partial ProductInfo data and creates a new ProductInfo\n * instance, ensuring that all necessary properties are properly initialized.\n *\n * @param data - Partial data of ProductInfo. This can include any subset of\n * ProductInfo properties.\n * @returns A new instance of ProductInfo populated with the provided data.\n */\n mapToModel(data: Partial<ProductInfo>): ProductInfo {\n return new ProductInfo(data);\n }\n}\n","import { ProductInfo } from '../../models/product-info';\nimport { HttpService } from '../http/http.service';\n\n/**\n * Service for product information REST calls.\n */\nexport class ProductInfoRestService extends HttpService {\n private readonly VERSION_URL = 'rest/info/version';\n\n /**\n * Retrieves the local version information of the product.\n *\n * This method sends a GET request to the 'rest/info/version' endpoint with a <code>local=1</code> query parameter\n * to fetch the local version details of the product. The value of the <code>local</code> query parameter\n * does not matter. The presence of it will result in the server returning the local version details.\n *\n * @returns A Promise that resolves to a ProductInfo object containing the local version information.\n */\n getProductInfoLocal(): Promise<ProductInfo> {\n return this.get<ProductInfo>(`${this.VERSION_URL}?local=1`);\n }\n}\n","import { Service } from '../../providers/service/service';\nimport { service } from '../../providers';\nimport { ProductInfo } from '../../models/product-info';\nimport { ProductInfoMapper } from './mappers/product-info.mapper';\nimport { ProductInfoRestService } from './product-info-rest.service';\n\n/**\n * Service responsible for retrieving and managing product information.\n */\nexport class ProductInfoService implements Service {\n private readonly productInfoMapper: ProductInfoMapper = service(ProductInfoMapper);\n private readonly productInfoService: ProductInfoRestService = service(ProductInfoRestService);\n\n /**\n * Retrieves the local version information of the product.\n *\n * This function fetches the local version data from the license REST service\n * and maps the response to a ProductInfo model object.\n *\n * @returns {Promise<ProductInfo>} A Promise that resolves to a ProductInfo object\n * containing the local version information of the product.\n */\n async getProductInfoLocal(): Promise<ProductInfo> {\n const response = await this.productInfoService.getProductInfoLocal();\n return this.productInfoMapper.mapToModel(response);\n }\n}\n","import {SecurityConfig} from '../../../models/security/security-config';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting partial SecurityConfig objects to complete SecurityConfig models.\n */\nexport class SecurityConfigMapper extends Mapper<SecurityConfig> {\n /**\n * Maps the raw data to an instance of the {@link SecurityConfig} model.\n *\n * @returns {SecurityConfig} - A new SecurityConfig instance.\n */\n mapToModel(data: Partial<SecurityConfig>): SecurityConfig {\n return new SecurityConfig(data);\n }\n}\n","/**\n * Represents an observer for events, encapsulating a callback to handle event notifications.\n *\n * @template T - The type of the event payload.\n */\nexport class EventObserver<T> {\n\n /**\n * A callback function to notify the observer of an event.\n *\n * @param eventPayload - The payload of the event to notify the observer about.\n */\n notify: (eventPayload: T) => void;\n\n constructor(callback: (payload: T) => void) {\n this.notify = callback;\n }\n}\n","import {Event} from '../../models/events';\nimport {Service} from '../../providers/service/service';\nimport {ObjectUtil} from '../utils';\nimport {EventObserver} from '../../models/events/event-observer';\n\n/**\n * A service that manages event subscriptions and emissions.\n *\n * Allows components or modules to subscribe to specific events and be notified when those events are emitted.\n */\nexport class EventService implements Service {\n\n /**\n * A map of event names to their corresponding list of subscribers.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private eventSubscribers: Map<string, EventObserver<any>[]> = new Map<string, EventObserver<any>[]>();\n\n /**\n * Emits an event to all subscribers of the specified event type.\n *\n * @template T - The type of the event payload.\n * @param event - The event to emit, containing its name and payload.\n */\n emit<T extends {} | undefined>(event: Event<T>): void {\n const subscribers = this.eventSubscribers.get(event.NAME);\n if (subscribers) {\n subscribers.forEach((subscriber) => {\n subscriber.notify(ObjectUtil.deepCopy(event.payload));\n });\n }\n }\n\n /**\n * Subscribes to a specific event with a callback function.\n *\n * @template T - The type of the event payload.\n * @param eventName - The name of the event to subscribe to.\n * @param callback - A callback function to handle the event notifications.\n *\n * @returns A function to unsubscribe from the event.\n */\n subscribe<T extends {} | undefined>(eventName: string, callback: (payload: T) => void): () => void {\n const observer = new EventObserver<T>(callback);\n const eventSubscribers = this.eventSubscribers.get(eventName);\n\n if (eventSubscribers) {\n eventSubscribers.push(observer);\n } else {\n this.eventSubscribers.set(eventName, [observer]);\n }\n return () => this.unsubscribe(eventName, observer);\n }\n\n /**\n * Unsubscribes an observer from a specific event type.\n *\n * @template T - The type of the event payload.\n * @param eventName - The name of the event to unsubscribe from.\n * @param observer - The observer to remove from the subscribers list.\n *\n * @private\n */\n private unsubscribe<T extends {} | undefined>(eventName: string, observer: EventObserver<T>): void {\n const eventSubscribers = this.eventSubscribers.get(eventName);\n if (eventSubscribers) {\n const index = eventSubscribers.indexOf(observer);\n if (index !== -1) {\n eventSubscribers.splice(index, 1);\n }\n if (eventSubscribers.length === 0) {\n this.eventSubscribers.delete(eventName);\n }\n }\n }\n}\n","import {ModelList} from '../common';\n\n/**\n * Represents a pair of a regular expression and its associated route parameters.\n * This class is used for route matching and parameter extraction for the plugin system.\n */\nexport class RouteRegexParamPair {\n private regex!: RegExp;\n private routeParams!: ModelList<string>;\n\n constructor(regex: RegExp, routeParams: ModelList<string>) {\n this.setRegex(regex);\n this.setRouteParams(routeParams);\n }\n\n getRegex(): RegExp {\n return this.regex;\n }\n\n setRegex(regex: RegExp): RouteRegexParamPair {\n this.regex = regex;\n return this;\n }\n\n getRouteParams(): ModelList<string> {\n return this.routeParams;\n }\n\n setRouteParams(routeParams: ModelList<string>): RouteRegexParamPair {\n this.routeParams = routeParams;\n return this;\n }\n}\n","import {ExternalRouteItemModel} from './external-route-item-model';\n\n/**\n * Represents a route plugin item in the application's routing system.\n * This class encapsulates all properties needed to define a route\n * including its URL, associated module, controller, and access permissions.\n */\nexport class RouteItemModel {\n private _url: string;\n private _module: string;\n private _path: string;\n private _chunk: string;\n private _controller: string;\n private _templateUrl: string;\n private _title?: string;\n private _reloadOnSearch?: boolean;\n private _helpInfo?: string;\n private _documentationUrl?: string;\n private _allowAuthorities?: string[];\n\n constructor(routeItem: ExternalRouteItemModel) {\n this._url = routeItem.url;\n this._module = routeItem.module;\n this._path = routeItem.path;\n this._chunk = routeItem.chunk;\n this._controller = routeItem.controller;\n this._templateUrl = routeItem.templateUrl;\n this._title = routeItem.title;\n this._reloadOnSearch = routeItem.reloadOnSearch;\n this._helpInfo = routeItem.helpInfo;\n this._documentationUrl = routeItem.documentationUrl;\n this._allowAuthorities = routeItem.allowAuthorities;\n }\n\n get url(): string {\n return this._url;\n }\n\n set url(url: string) {\n this._url = url;\n }\n\n get module(): string {\n return this._module;\n }\n\n set module(module: string) {\n this._module = module;\n }\n\n get path(): string {\n return this._path;\n }\n\n set path(path: string) {\n this._path = path;\n }\n\n get chunk(): string {\n return this._chunk;\n }\n\n set chunk(chunk: string) {\n this._chunk = chunk;\n }\n\n get controller(): string {\n return this._controller;\n }\n\n set controller(controller: string) {\n this._controller = controller;\n }\n\n get templateUrl(): string {\n return this._templateUrl;\n }\n\n set templateUrl(templateUrl: string) {\n this._templateUrl = templateUrl;\n }\n\n get title(): string | undefined{\n return this._title;\n }\n\n set title(title: string) {\n this._title = title;\n }\n\n get reloadOnSearch(): boolean | undefined {\n return this._reloadOnSearch;\n }\n\n set reloadOnSearch(reloadOnSearch: boolean | undefined) {\n this._reloadOnSearch = reloadOnSearch;\n }\n\n get helpInfo(): string | undefined {\n return this._helpInfo;\n }\n\n set helpInfo(helpInfo: string) {\n this._helpInfo = helpInfo;\n }\n\n get documentationUrl(): string | undefined {\n return this._documentationUrl;\n }\n\n set documentationUrl(documentationUrl: string | undefined) {\n this._documentationUrl = documentationUrl;\n }\n\n get allowAuthorities(): string[] | undefined{\n return this._allowAuthorities;\n }\n\n set allowAuthorities(allowAuthorities: string[]) {\n this._allowAuthorities = allowAuthorities;\n }\n}\n","import {RouteRegexParamPair} from '../../models/routing/route-regex-param-pair';\nimport {RouteItemModel} from '../../models/routing/route-item-model';\nimport {getPathName} from '../utils';\nimport {ModelList} from '../../models/common';\nimport {Service} from '../../providers/service/service';\nimport {WindowService} from '../window';\nimport {ExtensionPoint} from '../../models/plugins/extension-point';\nimport {RouteModel} from '../../models/routing/external-route-item-model';\n\n/**\n * Service responsible for handling application routing functionality.\n *\n * This service provides methods for matching URL paths against registered routes,\n * converting route patterns to regular expressions, and retrieving active routes.\n * It works with the application's route configuration obtained from the PluginRegistry.\n */\nexport class RoutingService implements Service {\n private readonly routeConfig = WindowService.getWindow().PluginRegistry.get<RouteModel>(ExtensionPoint.ROUTE);\n\n /**\n * Finds and returns the active route based on the provided path.\n * Compares the path against registered routes in the route configuration\n * and returns the first matching route as a RouteItemModel.\n *\n * @param path - The URL path to match against registered routes.\n * Defaults to the current path from getPathName() if not provided.\n * @returns A RouteItemModel instance representing the matched route,\n * or undefined if no matching route is found.\n */\n getActiveRoute(path: string = getPathName()): RouteItemModel | undefined {\n const activeRoute = this.routeConfig\n .find((route) => {\n const regex = this.routeToRegex(route.url).getRegex();\n return regex.test(path);\n });\n\n return activeRoute ? new RouteItemModel(activeRoute) : undefined;\n }\n\n /**\n * Converts a route path string to a regular expression for route matching.\n * Handles route parameters with various options (optional, wildcard).\n *\n * @param path - The route path pattern to convert (e.g., '/users/:id', '/items/:name?')\n * @returns A RouteRegexParamPair containing the compiled regular expression\n * and a list of parameter names extracted from the path.\n */\n private routeToRegex(path: string): RouteRegexParamPair {\n const keys: string[] = [];\n\n const pattern = path\n .replace(/([().])/g, '\\\\$1')\n .replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function (_, slash, key, option) {\n const optional = option === '?' || option === '*?';\n const star = option === '*' || option === '*?';\n keys.push(key);\n slash = slash || '';\n return (\n (optional ? '(?:' + slash : slash + '(?:') +\n (star ? '(.+?)' : '([^/]+)') +\n (optional ? '?)?' : ')')\n );\n })\n .replace(/([/$*])/g, '\\\\$1');\n\n return new RouteRegexParamPair(new RegExp('^' + pattern + '(?:[?#]|$)'), new ModelList<string>(keys));\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {AuthenticatedUser, Authority, Rights, SecurityConfig} from '../../models/security';\nimport {ServiceProvider} from '../../providers';\nimport {EventService} from '../event-service';\nimport {Logout} from '../../models/events';\nimport {SecurityContextService} from './security-context.service';\nimport {Repository} from '../../models/repositories';\nimport {RepositoryService, RepositoryStorageService} from '../repository';\nimport {RoutingService} from '../routing/routing.service';\nimport {AuthenticationStorageService} from './authentication-storage.service';\n\n/**\n * Service responsible for handling authentication-related operations.\n */\nexport class AuthenticationService implements Service {\n private readonly repositoryService = ServiceProvider.get(RepositoryService);\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n\n login(): string {\n return 'Authentication.login from the API';\n }\n\n /**\n * Updates security context for logout request.\n */\n logout(): void {\n ServiceProvider.get(EventService).emit(new Logout());\n }\n\n /**\n * Checks if the user is logged in based on the provided configuration and user details.\n * @returns {boolean} True if the user is authenticated, false otherwise.\n */\n isLoggedIn(): boolean {\n const config = this.getSecurityConfig();\n return !!(config?.enabled && config?.userLoggedIn);\n }\n\n /**\n * Check if the user is authenticated.\n * A user is considered authenticated, if security is disabled, if he is external, or if there is an\n * auth token in the store\n */\n isAuthenticated() {\n const config = this.getSecurityConfig();\n const user = this.getAuthenticatedUser();\n return !config?.enabled\n || user?.external\n // eslint-disable-next-line eqeqeq\n || ServiceProvider.get(AuthenticationStorageService).getAuthToken().getValue() != null;\n }\n\n /**\n * Determines if free access is allowed based on the security configuration.\n * @returns {boolean | undefined} True if free access is enabled, false or undefined otherwise.\n */\n hasFreeAccess(): boolean | undefined {\n const config = this.getSecurityConfig();\n return config?.enabled && config?.freeAccessActive;\n }\n\n /**\n * Checks if the user has a specific role based on the provided authority, configuration, and user details.\n * @param {Authority} role - The authority role to check.\n * @returns {boolean | undefined} True if the user has the specified role, false or undefined otherwise.\n */\n hasRole(role?: Authority): boolean | undefined {\n const config = this.getSecurityConfig();\n const user = this.getAuthenticatedUser();\n\n if (!role || !config?.enabled) {\n return true;\n }\n const hasPrinciple = Object.keys(user || {}).length > 0;\n if (!hasPrinciple) {\n return false;\n }\n return Authority.IS_AUTHENTICATED_FULLY === role || user?.authorities.hasAuthority(role);\n }\n\n /**\n * Checks if security is enabled\n * @returns {boolean} True if security is enabled, false otherwise.\n */\n isSecurityEnabled(): boolean {\n return !!this.getSecurityConfig()?.enabled;\n }\n\n /**\n * Checks if the current user has read permissions for the specified repository.\n * This method evaluates if the user can read the repository based on security configuration,\n * user authentication status, and user roles.\n *\n * @param {Repository} repository - The repository to check read permissions for.\n * @returns {boolean} True if the user has read permissions for the repository, false otherwise.\n */\n canReadRepo(repository?: Repository): boolean {\n if (!repository || repository.id === '') {\n return false;\n }\n\n const config = this.getSecurityConfig();\n const user = this.getAuthenticatedUser();\n\n if (config?.enabled) {\n if (!user) {\n return false;\n }\n if (this.isAdminOrRepoManager()) {\n return true;\n }\n if (this.repositoryService.isSystemRepository(repository)) {\n return false;\n }\n return this.hasBaseRights(Rights.READ, repository);\n }\n\n return true;\n }\n\n /**\n * Checks if the current user has GraphQL read permissions for the specified repository.\n * This method determines if the user can execute GraphQL read operations on the repository.\n *\n * @param {Repository} repository - The repository to check GraphQL read permissions for.\n * @returns {boolean} True if the user has GraphQL read permissions for the repository, false otherwise.\n */\n canReadGqlRepo(repository: Repository): boolean {\n if (!repository || repository.id === '') {\n return false;\n }\n return this.hasGraphqlAuthority(Rights.READ, repository);\n }\n\n /**\n * Checks if the current user has GraphQL write permissions for the specified repository.\n * This method determines if the user can execute GraphQL write operations on the repository.\n *\n * @param {Repository} repository - The repository to check GraphQL write permissions for.\n * @returns {boolean} True if the user has GraphQL write permissions for the repository, false otherwise.\n */\n canWriteGqlRepo(repository: Repository): boolean {\n if (!repository || repository.id === '') {\n return false;\n }\n return this.hasGraphqlAuthority(Rights.WRITE, repository);\n }\n\n /**\n * Checks if the current user has any GraphQL permissions (read or write) for the specified repository.\n * This is a convenience method that combines the results of canReadGqlRepo and canWriteGqlRepo.\n *\n * @param {Repository} repository - The repository to check GraphQL permissions for.\n * @returns {boolean} True if the user has any GraphQL permissions for the repository, false otherwise.\n */\n hasGqlRights(repository: Repository): boolean {\n return this.canReadGqlRepo(repository) || this.canWriteGqlRepo(repository);\n }\n\n /**\n * Determines if the current user has authority to access the active route.\n *\n * This method checks if the user has the necessary permissions to access the current route\n * based on the route's defined authority requirements and the user's assigned roles.\n * The method follows these rules:\n * - If no active route exists, access is denied\n * - Admin users always have access to all routes\n * - Routes without defined authority requirements are accessible to all\n * - If no repository is selected, authority checks are bypassed\n * - If the user has any of the authorities required by the route, access is granted\n *\n * @returns {boolean} True if the user has authority to access the current route, false otherwise\n */\n hasAuthority(): boolean {\n // If the user has an admin role, they always have access\n if (this.hasRole(Authority.ROLE_ADMIN)) {\n return true;\n }\n\n const activeRoute = ServiceProvider.get(RoutingService).getActiveRoute();\n // If there is no current active route, return false – access cannot be determined\n if (!activeRoute) {\n return false;\n }\n\n // If the current route doesn't define \"allowAuthorities\", assume there are no restrictions\n if (!activeRoute.allowAuthorities) {\n return true;\n }\n\n // If there is no selected repository, there are no auth restrictions\n if (!ServiceProvider.get(RepositoryStorageService).getRepositoryReference()?.id) {\n return true;\n }\n\n const authenticatedUser = this.getAuthenticatedUser();\n // If there is no principal defined, assume is admin and return true\n if (!authenticatedUser) {\n return true;\n }\n\n if (activeRoute.allowAuthorities.length) {\n const resolvedAuthorities = this.resolveAuthorities(activeRoute.allowAuthorities);\n return resolvedAuthorities.some(allowAuth => authenticatedUser.authorities.hasAuthority(allowAuth as Authority));\n }\n\n return true;\n }\n\n private resolveAuthorities(authoritiesList?: string[]) {\n // If no authorities list is provided, return empty array.\n if (!authoritiesList) {\n return [];\n }\n\n // Get the selected repository's ID from the current context.\n const repo = ServiceProvider.get(RepositoryStorageService).getRepositoryReference();\n // If there is no selected repository ID, return the original authorities list.\n if (!repo?.id) {\n return authoritiesList;\n }\n\n // Replace the \"{repoId}\" placeholder with the actual repository ID for specific access.\n const authListForCurrentRepo = authoritiesList.map(authority => authority.replace('{repoId}', repo.id));\n // Replace the \"{repoId}\" placeholder with a wildcard '*' to denote access to any repository.\n const authListForAllRepos = authoritiesList.map(authority => authority.replace('{repoId}', '*'));\n\n // Combine both lists into a single array and return.\n return [...authListForCurrentRepo, ...authListForAllRepos];\n }\n\n private hasGraphqlAuthority(action: string, repo: Repository): boolean {\n const user = this.securityContextService.getAuthenticatedUser();\n\n if (!user) {\n return false;\n }\n\n const repoId = this.repositoryService.getLocationSpecificId(repo);\n const overCurrentRepoGraphql = this.repositoryService.getCurrentGqlRepoAuthority(action, repoId);\n const overAllReposGraphql = this.repositoryService.getOverallGqlRepoAuthority(action);\n\n return (\n user.authorities.hasAuthority(overCurrentRepoGraphql as Authority) ||\n user.authorities.hasAuthority(overAllReposGraphql as Authority)\n );\n }\n\n private isAdminOrRepoManager() {\n return this.hasRole(Authority.ROLE_ADMIN) || this.hasRole(Authority.ROLE_REPO_MANAGER);\n }\n\n private getSecurityConfig(): SecurityConfig | undefined {\n return ServiceProvider.get(SecurityContextService).getSecurityConfig();\n }\n\n private getAuthenticatedUser(): AuthenticatedUser | undefined {\n return ServiceProvider.get(SecurityContextService).getAuthenticatedUser();\n }\n\n private hasBaseRights(action: string, repo: Repository): boolean {\n const repoId = this.repositoryService.getLocationSpecificId(repo);\n const overCurrentRepo = this.repositoryService.getCurrentRepoAuthority(action, repoId);\n const overAllRepos = this.repositoryService.getOverallRepoAuthority(action);\n\n const user = this.getAuthenticatedUser();\n\n return !!(\n user?.authorities.hasAuthority(overCurrentRepo as Authority) ||\n user?.authorities.hasAuthority(overAllRepos as Authority)\n );\n }\n}\n","import {AuthenticatedUser} from '../../../models/security/authenticated-user';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting partial AuthenticatedUser objects to complete AuthenticatedUser models.\n */\nexport class AuthenticatedUserMapper extends Mapper<AuthenticatedUser> {\n /**\n * Maps a partial AuthenticatedUser object to a complete AuthenticatedUser model.\n *\n * @param user - A partial object containing some or all properties of an AuthenticatedUser.\n * @returns A new instance of AuthenticatedUser with all properties set based on the input.\n */\n mapToModel(user: Partial<AuthenticatedUser>): AuthenticatedUser {\n return new AuthenticatedUser(user);\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {AuthenticatedUser, SecurityConfig} from '../../models/security';\n\n/**\n * Service class for handling security-related REST operations.\n */\nexport class SecurityRestService extends HttpService {\n private readonly SECURITY_ENDPOINT = 'rest/security';\n\n /**\n * Updates the application settings for a specific user.\n *\n * @param user - The authenticated user whose data needs to be updated.\n * @returns A Promise that resolves when the update is successful, or rejects if there's an error.\n */\n updateUserData(user: AuthenticatedUser): Promise<void> {\n return this.patch<void>(`${this.SECURITY_ENDPOINT}/users/${this.encodeURIComponentStrict(user.username)}`,\n {\n appSettings: user.appSettings,\n }\n );\n }\n\n /**\n * Retrieves the full security configuration from the backend.\n *\n * Sends a GET request to fetch the application's security-related configuration, including roles, permissions,\n * and OpenID settings.\n *\n * @returns A Promise that resolves with the SecurityConfig object.\n */\n getSecurityConfig(): Promise<SecurityConfig> {\n return this.get(`${this.SECURITY_ENDPOINT}/all`);\n }\n\n /**\n * Retrieves information about the currently authenticated user.\n *\n * Sends a GET request to the security endpoint to fetch details about the user\n * who is currently authenticated in the system.\n *\n * @returns A Promise that resolves with the AuthenticatedUser object containing\n * the user's details such as username, roles, and application settings.\n */\n getAuthenticatedUser(): Promise<AuthenticatedUser> {\n return this.get(`${this.SECURITY_ENDPOINT}/authenticated-user`);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {SecurityRestService} from './security-rest.service';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {AuthenticatedUser, SecurityConfig} from '../../models/security';\nimport {SecurityContextService} from './security-context.service';\nimport {SecurityConfigMapper} from './mappers/security-config.mapper';\nimport {AuthenticatedUserMapper} from './mappers/authenticated-user.mapper';\n\n/**\n * Service class for handling security-related operations.\n */\nexport class SecurityService implements Service {\n private readonly securityRestService: SecurityRestService = ServiceProvider.get(SecurityRestService);\n private readonly securityContextService: SecurityContextService = ServiceProvider.get(SecurityContextService);\n\n /**\n * Updates the data of an authenticated user.\n *\n * Updates the authenticated user's data in the backend using the provided user object and updates the\n * context with the updated user data.\n *\n * @param user - The authenticated user object containing the updated data.\n * @returns A Promise that resolves when the user data has been successfully updated.\n */\n updateUserData(user: AuthenticatedUser): Promise<void> {\n return this.securityRestService.updateUserData(user)\n .then(() => this.securityContextService.updateAuthenticatedUser(user));\n }\n\n /**\n * Retrieves the current security configuration from the backend.\n *\n * Fetches the security configuration and maps it to a `SecurityConfig` model using the appropriate mapper.\n *\n * @returns A Promise that resolves with the mapped `SecurityConfig` instance.\n */\n getSecurityConfig(): Promise<SecurityConfig> {\n return this.securityRestService.getSecurityConfig().then((response) => MapperProvider.get(SecurityConfigMapper).mapToModel(response));\n }\n\n /**\n * Retrieves the currently authenticated user from the backend.\n *\n * Fetches the authenticated user's information and maps it to an `AuthenticatedUser` model\n * using the appropriate mapper.\n *\n * @returns A Promise that resolves with the mapped `AuthenticatedUser` instance\n */\n getAuthenticatedUser(): Promise<AuthenticatedUser> {\n return this.securityRestService.getAuthenticatedUser()\n .then((response) => MapperProvider.get(AuthenticatedUserMapper).mapToModel(response));\n }\n}\n","import {Mapper} from '../../providers/mapper/mapper';\nimport {OpenIdConfig} from '../../models/security/openid-config';\n\n/**\n * Mapper class for converting partial OpenIdConfig objects to complete OpenIdConfig models.\n */\nexport class OpenidConfigMapper extends Mapper<OpenIdConfig> {\n /**\n * Maps the raw data to an instance of the {@link OpenIdConfig} model.\n *\n * @returns {OpenIdConfig} - A new OpenIdConfig instance.\n */\n mapToModel(data: Partial<OpenIdConfig>): OpenIdConfig {\n return new OpenIdConfig(data);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {AuthenticatedUser} from '../../models/security';\nimport {CookieConsent} from '../../models/cookie';\nimport {ServiceProvider} from '../../providers';\nimport {SecurityContextService, SecurityService} from '../security';\nimport {EventEmitter} from '../../emitters/event.emitter';\n\nexport const COOKIE_CONSENT_CHANGED_EVENT = 'cookie-consent-changed-event';\n\n/**\n * Service class for handling cookie-related operations.\n */\nexport class CookieService implements Service {\n private readonly eventEmitter = new EventEmitter<CookieConsent>();\n\n /**\n * Accepts the cookie policy for the authenticated user.\n *\n * @returns {Promise<void>} - A promise that resolves when the request to the backend has passed.\n */\n acceptCookiePolicy(): Promise<void> {\n const user = this.setAcceptedCookiePolicy();\n return ServiceProvider.get(SecurityService).updateUserData(user)\n .then(() => {\n this.eventEmitter.emit({NAME: COOKIE_CONSENT_CHANGED_EVENT, payload: user.appSettings.COOKIE_CONSENT as CookieConsent});\n });\n }\n\n private setAcceptedCookiePolicy(): AuthenticatedUser {\n const user = ServiceProvider.get(SecurityContextService).getAuthenticatedUser() || new AuthenticatedUser({});\n\n let cookieConsent: CookieConsent;\n if (user.appSettings?.COOKIE_CONSENT) {\n cookieConsent = new CookieConsent(user.appSettings.COOKIE_CONSENT as CookieConsent);\n } else {\n cookieConsent = new CookieConsent({thirdParty: true, statistic: true});\n }\n\n cookieConsent.policyAccepted = true;\n cookieConsent.updatedAt = Date.now();\n user.appSettings.COOKIE_CONSENT = cookieConsent;\n return user;\n }\n}\n","import {OperationStatusSummary} from '../../models/monitoring/operation-status-summary';\nimport {HttpService} from '../http/http.service';\n\n/**\n * Service for interacting with the GraphDB monitoring REST API endpoints.\n */\nexport class MonitoringRestService extends HttpService {\n private readonly MONITORING_ENDPOINT = 'rest/monitor';\n\n /**\n * Retrieves the status summary of operations for a specific repository.\n *\n * @param repositoryId - The unique identifier of the repository for which to fetch operations.\n * @returns A Promise that resolves to an OperationStatusSummary containing information about the repository operations.\n */\n getOperations(repositoryId: string): Promise<OperationStatusSummary> {\n return this.get<OperationStatusSummary>(`${this.MONITORING_ENDPOINT}/repository/${repositoryId}/operations`);\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {OperationList} from '../../../models/monitoring/operation-list';\nimport {Operation} from '../../../models/monitoring/operation';\nimport {OperationType} from '../../../models/monitoring/operation-type';\n\nconst OPERATION_TYPE_SORT_ORDER = {\n [OperationType.CLUSTER_HEALTH]: 0,\n [OperationType.BACKUP_AND_RESTORE]: 1,\n [OperationType.IMPORT]: 2,\n [OperationType.QUERIES]: 3,\n [OperationType.UPDATES]: 4\n};\n\n/**\n * Mapper class for converting an array of Operation objects to an OperationList model.\n */\nexport class OperationListMapper extends Mapper<OperationList> {\n /**\n * Maps an array of Operation objects to an OperationList model.\n * Sorts the operations by their type before mapping them to the OperationList model.\n *\n * @param data - An array of Operation objects to be mapped into an OperationList.\n * @returns A new OperationList instance containing the provided operations.\n */\n mapToModel(data: Operation[]): OperationList {\n return new OperationList(\n data\n .map((operation) => new Operation(operation))\n .sort((a, b) => OPERATION_TYPE_SORT_ORDER[a.type] - OPERATION_TYPE_SORT_ORDER[b.type])\n );\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {OperationStatusSummary} from '../../../models/monitoring/operation-status-summary';\nimport {MapperProvider} from '../../../providers';\nimport {OperationListMapper} from './operation-list.mapper';\n\n/**\n * Mapper class for converting OperationStatusSummaryResponse to OperationStatusSummary.\n */\nexport class OperationSummaryMapper extends Mapper<OperationStatusSummary> {\n /**\n * Maps the OperationStatusSummary data from the backend to an OperationStatusSummary model.\n * @param {OperationStatusSummary} data - The response data to be mapped.\n * @returns {OperationStatusSummary} A new instance of OperationStatusSummary created from the input data.\n */\n mapToModel(data: OperationStatusSummary): OperationStatusSummary {\n return new OperationStatusSummary({\n status: data.status,\n allRunningOperations: MapperProvider.get(OperationListMapper).mapToModel(data.allRunningOperations || [])\n } as OperationStatusSummary);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {OperationStatusSummary} from '../../models/monitoring/operation-status-summary';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {MonitoringRestService} from './monitoring-rest.service';\nimport {OperationSummaryMapper} from './mapper/operation-summary-mapper';\n\n/**\n * Service class for handling operations-related functionality.\n */\nexport class MonitoringService implements Service {\n /**\n * Retrieves the status summary of operations.\n *\n * @returns {Promise<OperationStatusSummary>} A Promise that resolves to an OperationStatusSummary object,\n * representing the current status of operations.\n */\n getOperations(repositoryId: string): Promise<OperationStatusSummary> {\n return ServiceProvider.get(MonitoringRestService).getOperations(repositoryId)\n .then((operations) => MapperProvider.get(OperationSummaryMapper).mapToModel(operations));\n }\n}\n","import {OperationGroupSummaryList} from '../../../models/monitoring/operation-group-summary-list';\nimport {OperationGroupSummary} from '../../../models/monitoring';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting an array of OperationGroupSummary objects to an OperationGroupSummaryList model.\n */\nexport class OperationGroupSummaryListMapper extends Mapper<OperationGroupSummaryList> {\n /**\n * Maps an array of OperationGroupSummary objects to an OperationGroupSummaryList model.\n *\n * @param data - An array of OperationGroupSummary objects to be mapped.\n * @returns A new OperationGroupSummaryList instance containing the provided data.\n */\n mapToModel(data: OperationGroupSummary[]): OperationGroupSummaryList {\n return new OperationGroupSummaryList(data);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {ToastMessage} from '../../models/toastr/toast-message';\nimport {ToastType} from '../../models/toastr/toast-type';\nimport {CREATE_TOAST_EVENT} from '../../models/toastr/toastr-constants';\nimport {EventEmitter} from '../../emitters/event.emitter';\nimport {ToastConfig} from '../../models/toastr/toast-config';\n\n/**\n * Service for displaying toast notifications in the application.\n */\nexport class OntoToastrService implements Service {\n private readonly eventEmitter = new EventEmitter<ToastMessage>();\n\n /**\n * Displays an error toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n error(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.ERROR, config);\n }\n\n /**\n * Displays an informational toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n info(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.INFO, config);\n }\n\n /**\n * Displays a success toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n success(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.SUCCESS, config);\n }\n\n /**\n * Displays a warning toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n warning(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.WARNING, config);\n }\n\n private createToastElement(message: string, type: ToastType, config?: ToastConfig): void {\n this.eventEmitter.emit({NAME: CREATE_TOAST_EVENT, payload: new ToastMessage(type, message, config)});\n }\n}\n","import {AutocompleteSearchResult} from '../../models/rdf-search/autocomplete-search-result';\nimport {HttpService} from '../http/http.service';\n\n/**\n * Service for handling autocomplete REST operations.\n */\nexport class AutocompleteRestService extends HttpService {\n private readonly autocompleteRestPrefix = 'rest/autocomplete';\n\n /**\n * Performs an autocomplete search based on the provided search term.\n *\n * @param searchTerm - The string to use for autocomplete search.\n * @returns A Promise that resolves to an AutocompleteSearchResult object containing search suggestions.\n */\n search(searchTerm: string): Promise<AutocompleteSearchResult> {\n return this.get(`${this.autocompleteRestPrefix}/query?q=${searchTerm}`);\n }\n\n /**\n * Checks if the autocomplete feature is enabled.\n *\n * @returns A Promise that resolves to a boolean indicating whether autocomplete is enabled.\n */\n enabled(): Promise<boolean> {\n return this.get(`${this.autocompleteRestPrefix}/enabled`);\n }\n}\n","import {SuggestionList} from '../../../models/rdf-search/suggestion-list';\nimport {Mapper} from '../../../providers/mapper/mapper';\nimport {Suggestion} from '../../../models/rdf-search/suggestion';\nimport {GeneratorUtils} from '../../utils/generator-utils';\nimport {SuggestionResponse} from '../../../models/rdf-search/api/suggestion-response';\n\n/**\n * Mapper class for converting an array of Suggestion objects to a SuggestionList model.\n */\nexport class SuggestionListMapper extends Mapper<SuggestionList> {\n /**\n * Maps an array of SuggestionResponse objects to a SuggestionList model.\n *\n * @param data - An array of SuggestionResponse objects to be converted into a SuggestionList.\n * @returns A new SuggestionList instance containing the provided Suggestion objects.\n */\n mapToModel(data: SuggestionResponse[]): SuggestionList {\n return new SuggestionList(data.map(suggestion => new Suggestion({\n ...suggestion,\n id: GeneratorUtils.hashCode(`${suggestion.type}-${suggestion.value}-${suggestion.description}`)\n })));\n }\n}\n","import {AutocompleteSearchResult} from '../../../models/rdf-search/autocomplete-search-result';\nimport {Mapper} from '../../../providers/mapper/mapper';\nimport {MapperProvider} from '../../../providers';\nimport {SuggestionListMapper} from '../../rdf-search/mapper/suggestion-list.mapper';\nimport {AutocompleteSearchResultResponse} from '../../../models/rdf-search/api/autocomplete-search-result-response';\n\n/**\n * Mapper class for AutocompleteSearchResult objects.\n */\nexport class AutocompleteSearchResultMapper extends Mapper<AutocompleteSearchResult> {\n /**\n * Maps the input AutocompleteSearchResultResponse data to a new AutocompleteSearchResult model.\n *\n * @param data - The input AutocompleteSearchResultResponse data to be mapped.\n * @returns A new AutocompleteSearchResult instance with mapped suggestions.\n */\n mapToModel(data: AutocompleteSearchResultResponse): AutocompleteSearchResult {\n return new AutocompleteSearchResult(\n {\n ...data,\n suggestionList: MapperProvider.get(SuggestionListMapper).mapToModel(data.suggestions)\n });\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {AutocompleteSearchResult} from '../../models/rdf-search/autocomplete-search-result';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {AutocompleteRestService} from './autocomplete-rest.service';\nimport {AutocompleteSearchResultMapper} from './mapper/autocomplete-search-result.mapper';\n\n/**\n * Service responsible for handling autocomplete functionality in the RDF search.\n */\nexport class AutocompleteService implements Service {\n /**\n * Performs an autocomplete search based on the provided search term.\n * This method fetches autocomplete suggestions from the REST service and maps\n * the results to the AutocompleteSearchResult.\n *\n * @param searchTerm - The string to use as the basis for autocomplete suggestions\n * @returns A promise that resolves to an AutocompleteSearchResult containing the matching suggestions\n */\n search(searchTerm: string): Promise<AutocompleteSearchResult> {\n return ServiceProvider.get(AutocompleteRestService).search(searchTerm)\n .then((searchResult: AutocompleteSearchResult) => MapperProvider.get(AutocompleteSearchResultMapper).mapToModel(searchResult));\n }\n\n /**\n * Checks if the autocomplete functionality is enabled.\n *\n * This method queries the AutocompleteRestService to determine\n * whether the autocomplete feature is currently enabled.\n *\n * @returns A promise that resolves to a boolean value.\n */\n isAutocompleteEnabled(): Promise<boolean> {\n return ServiceProvider.get(AutocompleteRestService).enabled();\n }\n}\n","import {LocalStorageService} from '../storage';\n\n/**\n * Service for managing autocomplete-related storage operations.\n */\nexport class AutocompleteStorageService extends LocalStorageService {\n private readonly ENABLED_KEY = 'enabled';\n\n readonly NAMESPACE = 'autocomplete';\n\n set(key: string, value: string): void {\n this.storeValue(key, value);\n }\n\n /**\n * Checks if autocomplete is enabled.\n * @returns {boolean} True if autocomplete is enabled, false otherwise.\n */\n isEnabled(): boolean {\n return this.get(this.ENABLED_KEY).value === 'true';\n }\n\n /**\n * Sets the value of 'autocomplete.enabled' in the local store.\n * @param value - The value to set for 'autocomplete.enabled'.\n */\n setEnabled(value: boolean): void {\n this.set(this.ENABLED_KEY, value.toString());\n }\n}\n","import {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {ServiceProvider} from '../../providers';\nimport {AutocompleteStorageService} from './autocomplete-storage.service';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype AutocompleteContextFields = {\n readonly AUTOCOMPLETE_ENABLED: string;\n}\n\ntype AutocompleteContextFieldParams = {\n readonly AUTOCOMPLETE_ENABLED: boolean;\n};\n\n/**\n * Service for managing autocomplete context state across the application.\n */\nexport class AutocompleteContextService extends ContextService<AutocompleteContextFields> implements DeriveContextServiceContract<AutocompleteContextFields, AutocompleteContextFieldParams>, LifecycleHooks {\n /**\n * Context property key for the autocomplete enabled state.\n */\n readonly AUTOCOMPLETE_ENABLED = 'isAutocompleteEnabled';\n\n /**\n * Updates the autocomplete enabled state in the context and in the local store\n *\n * @param enabled - Boolean value indicating whether autocomplete is enabled\n */\n updateAutocompleteEnabled(enabled: boolean): void {\n this.updateContextProperty(this.AUTOCOMPLETE_ENABLED, enabled);\n ServiceProvider.get(AutocompleteStorageService).setEnabled(enabled);\n }\n\n /**\n * Subscribes to changes in the autocomplete enabled state.\n *\n * @param callbackFn - Callback function that will be invoked when the autocomplete enabled state changes\n * @returns A function that can be called to unsubscribe from the changes\n */\n onAutocompleteEnabledChanged(callbackFn: ValueChangeCallback<boolean | undefined>): () => void {\n return this.subscribe(this.AUTOCOMPLETE_ENABLED, callbackFn);\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {NamespaceMap} from '../../../models/repositories/namespace/namespace-map';\nimport {NamespacesResponse} from '../../../models/repositories/namespace/api/namespaces-response';\n\n/**\n * Mapper class for converting namespace API responses to a model list of namespaces.\n */\nexport class NamespaceMapMapper extends Mapper<NamespaceMap> {\n /**\n * Maps the raw API response data to a structured map of namespaces and their URIs.\n *\n * @param data - The raw namespace response data from the API containing bindings with prefix and namespace values\n * @returns A NamespaceMap containing a mapping between prefixes and their corresponding URIs.\n */\n mapToModel(data: NamespacesResponse): NamespaceMap {\n const namespaces = data?.results.bindings || [];\n return new NamespaceMap(namespaces.reduce((acc, binding) => {\n const prefix = binding.prefix.value;\n acc[prefix] = binding.namespace.value;\n return acc;\n }, {} as Record<string, string>));\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {NamespacesResponse} from '../../models/repositories/namespace/api/namespaces-response';\n\n/**\n * Service for interacting with the RDF4J repository REST API.\n */\nexport class NamespacesRestService extends HttpService {\n private readonly REPOSITORIES_ENDPOINT = 'repositories';\n\n /**\n * Retrieves namespace information for a specific repository.\n *\n * @param repositoryId - The id of the repository.\n * @returns A Promise that resolves to a NamespacesResponse object containing namespace mappings.\n */\n getNamespaces(repositoryId: string): Promise<NamespacesResponse> {\n return this.get(`${this.REPOSITORIES_ENDPOINT}/${repositoryId}/namespaces`);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {NamespaceMap} from '../../models/repositories';\nimport {NamespaceMapMapper} from '../repository/mappers/namespace-map.mapper';\nimport {NamespacesRestService} from './namespaces-rest.service';\nimport {MapperProvider, ServiceProvider} from '../../providers';\n\n/**\n * Service for interacting with RDF4J repositories.\n */\nexport class NamespacesService implements Service {\n private namespaceMapper = MapperProvider.get(NamespaceMapMapper);\n private readonly namespacesRestService = ServiceProvider.get(NamespacesRestService);\n\n /**\n * Retrieves all prefixes, mapped to their respective URIs.\n *\n * @param repositoryId The unique identifier of the repository for which to retrieve namespaces.\n * @returns A promise that resolves to a NamespaceMap containing prefixes mapped to their URIs.\n */\n getNamespaces(repositoryId: string): Promise<NamespaceMap> {\n return this.namespacesRestService.getNamespaces(repositoryId)\n .then((response) => this.namespaceMapper.mapToModel(response));\n }\n}\n","import {ContextService} from '../context';\nimport {NamespaceMap} from '../../models/repositories';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype NamespacesContextFields = {\n readonly NAMESPACES: string;\n}\n\ntype NamespacesContextFieldParams = {\n readonly NAMESPACES: NamespaceMap;\n}\n\n/**\n * Service for managing namespaces context in the application.\n */\nexport class NamespacesContextService extends ContextService<NamespacesContextFields> implements DeriveContextServiceContract<NamespacesContextFields, NamespacesContextFieldParams>, LifecycleHooks {\n readonly NAMESPACES = 'namespaces';\n\n /**\n * Updates the namespaces in the context.\n *\n * @param namespaces - The new namespace map to be stored in the context\n */\n updateNamespaces(namespaces: NamespaceMap): void {\n this.updateContextProperty(this.NAMESPACES, namespaces);\n }\n\n /**\n * Subscribes to changes in the namespaces context.\n *\n * @param callbackFn - The callback function that will be invoked when namespaces change\n * @returns A function that can be called to unsubscribe from the changes\n */\n onNamespacesChanged(callbackFn: ValueChangeCallback<NamespaceMap | undefined>) {\n return this.subscribe(this.NAMESPACES, callbackFn);\n }\n}\n","import {LocalStorageService} from '../storage';\nimport {Suggestion} from '../../models/rdf-search';\n\n/**\n * Service for managing resource search-related data in local storage.\n */\nexport class ResourceSearchStorageService extends LocalStorageService {\n private readonly SELECTED_VIEW_KEY = 'selectedView';\n private readonly INPUT_KEY = 'input';\n private readonly LAST_SELECTED_KEY = 'lastSelected';\n NAMESPACE = 'resourceSearch';\n\n private readonly LEGACY_LAST_SELECTED_KEY = 'ls.rdf-search.resource-description';\n private readonly LEGACY_INPUT_KEY = 'ls.rdf-search.search-input';\n private readonly LEGACY_SELECTED_VIEW_KEY = 'ls.rdf-search.search-type';\n\n set(key: string, value: string): void {\n this.storeValue(key, value);\n }\n\n /**\n * Sets the selected view type for the rdf search.\n * @param viewType - The type of view which is selected\n */\n setSelectedView(viewType: string) {\n this.set(this.SELECTED_VIEW_KEY, viewType);\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.setItem(this.LEGACY_SELECTED_VIEW_KEY, viewType);\n }\n\n /**\n * Retrieves the currently selected view type for rdf search.\n * @returns {string} The current view type or an empty string if no view type is stored.\n */\n getSelectedView(): string {\n return this.get(this.SELECTED_VIEW_KEY).getValue() || '';\n }\n\n /**\n * Stores the current value of the resource search input.\n * @param value - The input value.\n */\n setInputValue(value: string): void {\n this.set(this.INPUT_KEY, value);\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.setItem(this.LEGACY_INPUT_KEY, value);\n }\n\n /**\n * Retrieves the stored resource search input value.\n * @returns {string} The stored input value or an empty string if no value is stored.\n */\n getInputValue(): string {\n return this.get(this.INPUT_KEY).getValue() || '';\n }\n\n /**\n * Stores the value of the last selected autocomplete suggestion.\n * @param suggestion - The Suggestion object that was last selected by the user.\n */\n setLastSelected(suggestion: Suggestion): void {\n this.set(this.LAST_SELECTED_KEY, suggestion.getValue());\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.setItem(this.LEGACY_LAST_SELECTED_KEY, suggestion.getDescription() || '');\n }\n\n /**\n * Retrieves the value of the last selected autocomplete suggestion.\n * @returns {string} The value of the last selected suggestion or an empty string if no suggestion was selected.\n */\n getLastSelectedValue(): string {\n return this.get(this.LAST_SELECTED_KEY).getValue() || '';\n }\n\n /**\n * Clears the autocomplete search history from local storage.\n * Removes both the stored input value and the last selected suggestion.\n */\n clearStoredSearch(): void {\n this.remove(this.INPUT_KEY);\n this.remove(this.LAST_SELECTED_KEY);\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.removeItem(this.LEGACY_INPUT_KEY);\n localStorage.removeItem(this.LEGACY_LAST_SELECTED_KEY);\n }\n}\n","import {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ContextService} from '../context';\n\ntype NavigationContextFields = {\n readonly PREVIOUS_ROUTE: string;\n}\n\ntype NavigationContextFieldParams = {\n readonly PREVIOUS_ROUTE: string;\n}\n\n/**\n * Service for managing navigation context within the application.\n */\nexport class NavigationContextService extends ContextService<NavigationContextFields> implements DeriveContextServiceContract<NavigationContextFields, NavigationContextFieldParams> {\n /** Key used to store the previous route in the context */\n readonly PREVIOUS_ROUTE = 'previousRoute';\n\n /**\n * Updates the previous route in the navigation context.\n *\n * @param value - The route path to store as the previous route\n */\n updatePreviousRoute(value: string): void {\n this.updateContextProperty(this.PREVIOUS_ROUTE, value);\n }\n\n /**\n * Retrieves the previous route from the navigation context.\n * If the route ends with a '#' character, it will be removed as single-spa\n * doesn't handle trailing hash characters correctly.\n *\n * @returns The previous route path or undefined if not set\n */\n getPreviousRoute(): string | undefined {\n let previousRoute = this.getContextPropertyValue<string>(this.PREVIOUS_ROUTE);\n if (previousRoute?.endsWith('#')) {\n // Remove trailing '#' if present, because single-spa doesn't handle it correctly\n // e.g. /import# doesn't trigger navigation\n previousRoute = previousRoute.slice(0, -1);\n }\n return previousRoute;\n }\n}\n","import {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {LifecycleState} from '../../models/app-lifecycle';\n\ntype LifecycleDataContextFields = {\n readonly APPLICATION_DATA_STATE: string;\n}\n\ntype LifecycleDataContextFieldParams = {\n readonly APPLICATION_DATA_STATE: LifecycleState;\n}\n\n/**\n * Service responsible for emitting and subscribing to application lifecycle events.\n * This service provides a centralized way to track and respond to key moments in the\n * application's lifecycle, such as when data is loaded\n */\nexport class ApplicationLifecycleContextService extends ContextService<LifecycleDataContextFields> implements DeriveContextServiceContract<LifecycleDataContextFields, LifecycleDataContextFieldParams> {\n readonly APPLICATION_DATA_STATE = 'applicationDataLoaded';\n\n /**\n * Updates the application data state in the context.\n *\n * @param state - The lifecycle state to set for the application data\n * @returns void\n */\n updateApplicationDataState(state: LifecycleState): void {\n this.updateContextProperty(this.APPLICATION_DATA_STATE, state);\n }\n\n /**\n * Registers a callback function to be invoked when the application data state changes.\n *\n * @param callbackFn - The function to be called when the application data state changes.\n * The function will receive the new state value as its parameter.\n * @returns A function that, when called, will unsubscribe the callback from further notifications\n */\n onApplicationDataStateChanged(callbackFn: ValueChangeCallback<LifecycleState | undefined>): () => void {\n return this.subscribe(this.APPLICATION_DATA_STATE, callbackFn);\n }\n}\n","import {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {Configuration} from '../../models/configuration';\n\ntype ConfigurationContextFields = {\n readonly APPLICATION_CONFIGURATION: string;\n}\n\ntype ConfigurationContextFieldParams = {\n readonly APPLICATION_CONFIGURATION: Configuration;\n};\n\n/**\n * The ConfigurationContextService class manages the application's configuration context.\n * It allows updating and retrieving the application configuration.\n */\nexport class ConfigurationContextService extends ContextService<ConfigurationContextFields> implements DeriveContextServiceContract<ConfigurationContextFields, ConfigurationContextFieldParams> {\n readonly APPLICATION_CONFIGURATION = 'applicationConfiguration';\n\n updateApplicationConfiguration(configuration: Configuration): void {\n this.updateContextProperty(this.APPLICATION_CONFIGURATION, configuration);\n }\n\n getApplicationConfiguration(): Configuration {\n return this.getContextPropertyValue(this.APPLICATION_CONFIGURATION) as Configuration;\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {PluginModule, PluginsManifest, PluginsManifestResponse} from '../../models/plugins';\nimport {getOrigin} from '../utils';\nimport {service} from '../../providers';\nimport {ConfigurationContextService} from '../configuration/configuration-context.service';\n\n/**\n * Service responsible for handling REST operations related to plugins.\n */\nexport class PluginsRestService extends HttpService {\n private readonly configurationContextService = service(ConfigurationContextService);\n\n /**\n * Fetches the plugins manifest from the server.\n *\n * @returns A Promise that resolves to the plugins manifest object containing\n * information about available plugins.\n */\n getPluginsManifest(): Promise<PluginsManifestResponse> {\n const configuration = this.configurationContextService.getApplicationConfiguration();\n return this.get(configuration.pluginsManifestPath);\n }\n\n /**\n * Dynamically loads all plugins defined in the plugins manifest.\n *\n * @param pluginsManifest - The manifest object containing the list of plugins to load.\n * Each plugin definition includes entry points.\n *\n * @returns A Promise that resolves to an array of loaded plugin modules.\n */\n async loadPlugins(pluginsManifest: PluginsManifest) {\n return await Promise.all(\n pluginsManifest.getPluginDefinitions().getItems().map(async (pluginDef) => {\n try {\n const entryUrl = pluginDef.entry.startsWith('http')\n ? pluginDef.entry\n : `${getOrigin()}${pluginDef.entry}`;\n\n return await import(/* webpackIgnore: true */ entryUrl) as PluginModule;\n } catch (err) {\n console.warn(`Failed to load plugin ${pluginDef.name}:`, err);\n }\n })\n );\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {PluginsManifestResponse, PluginDefinitionList, PluginsManifest} from '../../../models/plugins';\n\nexport class PluginsManifestMapper extends Mapper<PluginsManifest> {\n\n /**\n * Maps the raw data to an instance of the {@link PluginsManifest} model.\n *\n * @param {PluginsManifestResponse} data - The raw data to be transformed into a model.\n * @returns {PluginsManifest} - A new instance of the {@link PluginsManifest} model\n */\n mapToModel(data: PluginsManifestResponse): PluginsManifest {\n const pluginDefinitions = new PluginDefinitionList(data.plugins);\n return new PluginsManifest(pluginDefinitions);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {ServiceProvider} from '../../providers';\nimport {PluginsRestService} from './plugins-rest.service';\nimport {PluginsManifest, PluginModule} from '../../models/plugins';\nimport {WindowService} from '../window';\nimport {PluginsManifestMapper} from './mapper/plugins-manifest.mapper';\n\n/**\n * Service responsible for managing plugins in the application.\n * Handles retrieving plugin manifests and loading plugins into the application.\n */\nexport class PluginsService implements Service {\n private readonly pluginsRestService: PluginsRestService;\n private readonly pluginsManifestMapper: PluginsManifestMapper;\n\n constructor() {\n this.pluginsRestService = ServiceProvider.get(PluginsRestService);\n this.pluginsManifestMapper = new PluginsManifestMapper();\n }\n\n /**\n * Retrieves the plugins manifest from the server.\n *\n * @returns A promise that resolves to the plugins manifest containing information about available plugins.\n */\n async getPluginsManifest(): Promise<PluginsManifest> {\n const response = await this.pluginsRestService.getPluginsManifest();\n return this.pluginsManifestMapper.mapToModel(response);\n }\n\n /**\n * Loads all available plugins into the application.\n *\n * This method retrieves the plugins manifest, loads the plugin modules,\n * filters out any undefined modules, and registers each valid plugin\n * with the application's plugin registry.\n *\n * If the plugins manifest cannot be loaded, the application will continue to function with built-in plugins only.\n *\n * @returns A promise that resolves when all plugins have been loaded and registered.\n */\n async loadPlugins(): Promise<void> {\n let pluginsManifest: PluginsManifest | undefined = undefined;\n try {\n pluginsManifest = await this.getPluginsManifest();\n } catch (error) {\n console.warn('Failed to load plugins manifest. Continue with the built-in plugins only.', error);\n // If the manifest cannot be loaded, we will continue with built-in plugins only.\n // This allows the application to function without external plugins.\n }\n\n if (pluginsManifest) {\n const pluginModules = await this.pluginsRestService.loadPlugins(pluginsManifest);\n pluginModules\n .filter((pluginModule): pluginModule is PluginModule => pluginModule !== undefined)\n .forEach((pluginModule: PluginModule) => {\n if (pluginModule.register !== undefined) {\n pluginModule.register(WindowService.getPluginRegistry());\n } else {\n console.warn('Plugin module is missing the register method. Skipping registration.', pluginModule);\n }\n });\n }\n }\n}\n","export abstract class ErrorBase extends Error {\n public constructor(private text?: string) {\n super();\n }\n\n public get message(): string {\n return `${this.constructor.name}: ${this.text}`;\n }\n}\n","import {ErrorBase} from '../../error';\n\nexport class MissingApplicationConfigurationError extends ErrorBase {}\n","import {HttpService} from '../http/http.service';\nimport {Configuration, Environment} from '../../models/configuration';\nimport envDefault from './env.default.json';\nimport {MissingApplicationConfigurationError} from './missing-application-configuration-error';\n\nconst ENV_JSON_URL = 'assets/env.json';\n\nexport class ConfigurationRestService extends HttpService {\n async getConfiguration(): Promise<Configuration | undefined> {\n let environment: Environment = envDefault as Environment;\n try {\n environment = await this.get(ENV_JSON_URL) as Environment;\n } catch {\n console.warn('No downloadable \"env.json\" was found. Fallback to default:', environment);\n }\n\n let configResponse;\n try {\n configResponse = await this.get(environment.configUrl);\n if (configResponse) {\n console.debug(`Configuration file ${environment.configUrl} was downloaded`, configResponse);\n return configResponse as Configuration;\n }\n } catch {\n throw new MissingApplicationConfigurationError(\n `Failed to download configuration from \"${environment.configUrl}\". Ensure that there is a\n \"configuration.default.json\" JSON file in the assets folder or provide an \"env.json\" file pointing to another\n configuration file.`\n );\n }\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {Configuration} from '../../models/configuration';\nimport {ServiceProvider} from '../../providers';\nimport {ConfigurationRestService} from './configuration-rest.service';\nimport {ConfigurationContextService} from './configuration-context.service';\n\n/**\n * Service responsible for managing the application configuration.\n */\nexport class ConfigurationService implements Service {\n private readonly configurationRestService: ConfigurationRestService;\n\n constructor() {\n this.configurationRestService = ServiceProvider.get(ConfigurationRestService);\n }\n\n /**\n * Retrieves the application configuration by fetching it from the server.\n * The configuration is then stored in the ConfigurationContextService for easy access throughout the application.\n *\n * @returns A Promise that resolves to the application configuration object, or undefined if not found.\n */\n async getConfiguration(): Promise<Configuration | undefined> {\n const config = await this.configurationRestService.getConfiguration();\n if (config) {\n ServiceProvider.get(ConfigurationContextService).updateApplicationConfiguration(config);\n }\n return config;\n }\n}\n","import {WindowService} from '../window';\n\n/**\n * Utility class for build-related functionality.\n */\nexport class BuildUtil {\n /**\n * Determines if the application is running in development mode.\n *\n * @returns {boolean} True if the application is in development mode, false otherwise.\n */\n static isDevMode(): boolean {\n return WindowService.getWindow().wbDevMode;\n }\n}\n","import {BuildUtil} from './build-util';\n\n/**\n * Utility class for handling and manipulating URIs.\n */\nexport class UriUtil {\n private static readonly ABS_URI_REGEX = /^<?(http|urn).*>?/;\n static GRAPHS_VISUALIZATIONS_URL = 'graphs-visualizations';\n static RESOURCE_URL = 'resource';\n static BASE_DOCUMENTATION_URL = 'https://graphdb.ontotext.com/documentation/';\n static LATEST_UNOFFICIAL_VERSION = 'master';\n\n /**\n * Shortens an IRI (Internationalized Resource Identifier) by extracting the hostname and port.\n * If the hostname is not an IPv4 address, only the first segment of the domain is used.\n *\n * @param iri - The full IRI to shorten.\n * @returns A shortened version of the IRI in the format `hostname:port`.\n *\n * @example\n * // Shorten an IRI with a full domain name\n * const iri = \"http://example.com:8080/path\";\n * console.log(UriUtil.shortenIri(iri)); // Outputs \"example:8080\"\n *\n * @example\n * // Shorten an IRI with an IPv4 address\n * const iri = \"http://192.168.1.1:3000/path\";\n * console.log(UriUtil.shortenIri(iri)); // Outputs \"192.168.1.1:3000\"\n */\n static shortenIri(iri: string): string {\n const parser = document.createElement('a');\n\n parser.href = iri;\n let hostname = parser.hostname;\n if (!UriUtil.containsIPV4(parser.hostname)) {\n hostname = parser.hostname.split('.')[0];\n }\n return hostname + ':' + parser.port;\n }\n\n /**\n * Checks whether a given hostname contains an IPv4 address.\n *\n * An IPv4 address consists of four blocks of numbers (0-255) separated by dots.\n *\n * @param ip - The hostname or IP address to check.\n * @returns `true` if the hostname is a valid IPv4 address, otherwise `false`.\n *\n * @example\n * // Check an IPv4 address\n * console.log(UriUtil.containsIPV4(\"192.168.1.1\")); // Outputs true\n *\n * @example\n * // Check a non-IPv4 hostname\n * console.log(UriUtil.containsIPV4(\"example.com\")); // Outputs false\n */\n static containsIPV4(ip: string) {\n const blocks = ip.split('.');\n for (let i = 0, sequence = 0; i < blocks.length; i++) {\n if (parseInt(blocks[i], 10) >= 0 && parseInt(blocks[i], 10) <= 255) {\n sequence++;\n } else {\n sequence = 0;\n }\n if (sequence === 4) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Creates a redirect URL for autocomplete suggestions.\n *\n * @param redirectUrl - The base URL for the redirect.\n * @param resourceUri - The URI of the autocomplete suggestion.\n */\n static createAutocompleteRedirect(redirectUrl: string, resourceUri: string): string {\n return `${redirectUrl}?uri=${encodeURIComponent(resourceUri)}`;\n }\n\n /**\n * Removes angle brackets from a URI if they are present.\n *\n * This function checks if a URI is enclosed in angle brackets (< and >)\n * and removes them if they exist. This is useful for handling URIs in\n * different formats, particularly when working with RDF data where URIs\n * are often enclosed in angle brackets.\n *\n * @param uri - The URI string that may or may not be enclosed in angle brackets.\n * @returns The URI with angle brackets removed if they were present, otherwise the original URI.\n */\n static removeAngleBrackets(uri: string): string {\n if (uri?.startsWith('<') && uri?.endsWith('>')) {\n return uri.substring(1, uri.length - 1);\n }\n return uri;\n }\n\n /**\n * Validates if a string is a properly formatted URI.\n *\n * The function checks if the URI has a valid protocol (http(s) or urn)\n * and proper structure. For HTTP URIs, it verifies the presence of\n * schema slashes (//) and content after them. For URN URIs, it checks\n * if there's content after the \"urn:\" prefix.\n *\n * @param uri - The string to validate as a URI.\n * @returns `true` if the string is a valid URI, otherwise `false`.\n */\n static isValidUri(uri: string): boolean {\n let valid = false;\n if (this.hasValidProtocol(uri)) {\n if (uri.indexOf('http') >= 0) {\n const schemaSlashesIdx = uri.indexOf('//');\n valid = schemaSlashesIdx > 4\n && uri.substring(schemaSlashesIdx + 2).length > 0;\n } else if (uri.indexOf('urn') >= 0) {\n valid = uri.substring(4).length > 0;\n }\n }\n return valid;\n }\n\n /**\n * Resolves a documentation URL based on the product version and endpoint path.\n *\n * This function constructs a complete documentation URL by combining the base documentation URL\n * with the appropriate version and endpoint path. For unofficial versions (containing a hyphen)\n * or when in development mode, it uses the latest unofficial version instead of the provided version.\n *\n * @param productVersion - The version of the product for which to retrieve documentation.\n * If it contains a hyphen, it's considered an unofficial version.\n * @param endpointPath - The specific documentation endpoint path to append to the URL.\n * @returns A complete documentation URL string pointing to the specified resource.\n * @throws {Error} If either productVersion or endpointPath is not provided.\n *\n * @example\n * const docUrl = UriUtil.resolveDocumentationUrl('10.0.0', 'sparql-endpoint');\n * // Returns: 'https://graphdb.ontotext.com/documentation/10.0.0/sparql-endpoint'\n */\n static resolveDocumentationUrl(productVersion: string, endpointPath: string): string {\n if (!productVersion || !endpointPath) {\n throw new Error('Product version and endpoint path are required for documentation URL resolution.');\n }\n\n const isUnofficialVersion = productVersion.includes('-');\n const version = (BuildUtil.isDevMode() || isUnofficialVersion) ? this.LATEST_UNOFFICIAL_VERSION : productVersion;\n return `${this.BASE_DOCUMENTATION_URL}${version}/${endpointPath}`;\n }\n\n private static hasAngleBrackets(uri: string): boolean {\n return uri.startsWith('<') && uri.endsWith('>');\n }\n\n private static hasNoAngleBrackets(uri: string): boolean {\n return !uri.startsWith('<') && !uri.endsWith('>');\n }\n\n private static hasValidProtocol(uri: string): boolean {\n return this.ABS_URI_REGEX.test(uri) && (this.hasNoAngleBrackets(uri) || this.hasAngleBrackets(uri));\n }\n}\n","import {Service} from '../../providers/service/service';\n\n/**\n * A generator class for Fibonacci sequence numbers.\n */\nexport class FibonacciGenerator implements Service {\n /** Current first number in the sequence calculation */\n private fibo1 = 0;\n /** Current second number in the sequence calculation */\n private fibo2 = 1;\n\n /**\n * Generates the next Fibonacci number in the sequence.\n * Each call advances the sequence by one position.\n *\n * @returns The next number in the Fibonacci sequence\n */\n next(): number {\n const next = this.fibo2;\n this.fibo2 = this.fibo1 + this.fibo2;\n this.fibo1 = next;\n return next;\n };\n\n /**\n * Resets the generator to its initial state.\n * After calling this method, the next call to next() will return 1.\n */\n reset = () => {\n this.fibo1 = 0;\n this.fibo2 = 1;\n };\n}\n"],"names":["ObjectUtil","deepEqual","obj1","obj2","constructor","Array","isArray","length","i","keys1","Object","keys","keys2","key","deepCopy","obj","map","item","result","create","getPrototypeOf","hasCopyMethod","value","prototype","hasOwnProperty","call","copy","Model","this","ModelList","items","super","getItems","sort","comparator","filter","filterFunction","find","isEmpty","addToStart","unshift","addItems","push","remove","index","indexOf","splice","SubscriptionList","subscriptions","add","subscription","addAll","unsubscribeAll","forEach","Repository","data","id","title","type","sesameType","uri","externalUrl","location","state","local","readable","writable","unsupported","isNew","toRepositoryReference","REPOSITORY_LOCATION_ID_COMPARATOR","r1","r2","locationComparison","localeCompare","RepositoryList","repositories","findRepository","repositoryId","repository","sortByLocationAndId","filterByRepository","createIdLocationFilter","itemsToMatch","some","match","RepositorySizeInfo","inferred","total","explicit","RepositoryState","RepositoryType","NamespaceMap","namespaces","setNamespaces","getByPrefix","prefix","RepositoryLocation","label","username","password","authType","locationType","active","system","errorMsg","defaultRepository","RepositoryLocationType","Event","name","payload","NAME","EventName","NAVIGATION_END","NAVIGATION_START","LOGOUT","APP_DATA_LOADED","NavigationEnd","oldUrl","newUrl","NavigationEndPayload","NavigationStart","cancelNavigation","Logout","AuthenticationType","MapperProvider","Map","get","typeName","MAPPER_INSTANCES","has","instance","set","ServiceProvider","SERVICE_INSTANCES","implementsLifecycleHooks","onCreated","getAllBySuperType","superType","from","values","service","serviceClass","AuthorityList","authorities","hasAuthority","authority","includes","Mapper","AuthorityListMapper","mapToModel","AuthenticatedUser","external","appSettings","AuthSettings","enabled","AuthSettingsMapper","SecurityConfig","config","authImplementation","passwordLoginEnabled","freeAccess","overrideAuth","openIdEnabled","userLoggedIn","freeAccessActive","hasExternalAuthUser","Authority","RestrictedPages","pages","isRestricted","pageUrl","setPageRestriction","OpenIdConfig","openIdKeys","openIdTokenUrl","openIdKeysUri","openIdEndSessionUrl","supportsOfflineAccess","Rights","CapabilityListMapper","CapabilityList","License","expiryDate","latestPublicationDate","licensee","maxCpuCores","product","productType","licenseCapabilities","version","installationId","valid","typeOfUse","message","present","usageRestriction","_expiryDate","_latestPublicationDate","_licensee","_maxCpuCores","_product","_productType","_licenseCapabilities","_version","_installationId","_valid","_typeOfUse","_message","_present","_usageRestriction","Capability","capabilities","ProductInfo","workbench","Workbench","productVersion","sesame","connectors","shortVersion","resolveShortVersion","majorMinorMatch","exec","baseVersion","attributeMatch","StorageData","getValue","getValueOrDefault","defaultValue","getAsJson","JSON","parse","error","console","StorageKey","static","AvailableLanguagesList","languages","getLanguageCodes","language","AvailableLanguagesListMapper","LanguageConfig","defaultLanguage","availableLanguages","CookieConsent","policyAccepted","statistic","thirdParty","updatedAt","OperationStatus","STATUS_ORDER","INFORMATION","WARNING","CRITICAL","OperationGroupSummary","group","status","totalOperations","OperationStatusSummary","operationStatusSummary","allRunningOperations","toOperationsGroupSummary","groupToOperationSummary","operation","summary","count","OperationList","operations","OperationType","OperationGroup","OPERATIONS_WITH_COUNT","QUERIES","UPDATES","IMPORT","OPERATION_TYPE_TO_HREF","BACKUP_AND_RESTORE","CLUSTER_HEALTH","OPERATION_TYPE_TO_GROUP","QUERY","BACKUP","CLUSTER","Operation","getCount","href","labelKey","getLabelKey","parseInt","OperationGroupSummaryList","operationGroupSummaries","ToastrPosition","ToastConfig","timeout","onClick","removeOnClick","ToastrConfig","position","getDefaultConfig","BOTTOM_RIGHT","ToastType","GeneratorUtils","uuid","HEX_RADIX","timestamp","Date","getTime","performanceNow","performance","now","replace","char","random","Math","floor","toString","hashCode","str","hash","len","charCodeAt","ToastMessage","CREATE_TOAST_EVENT","ToastMessageList","toasts","SearchButtonList","buttons","SearchButtonConfig","setRadio","isRadio","setButtons","getButtons","radio","selectButton","button","selected","deselectAll","callback","btn","SearchButton","SuggestionList","suggestions","AutocompleteSearchResult","searchResult","setSuggestions","suggestionList","getSuggestions","_suggestions","hoverFirstSuggestion","hoverSuggestion","suggestion","clearHoveredState","setHovered","selectSuggestion","clearSelectedState","setSelected","getHoveredSuggestion","isHovered","hoverPreviousSuggestion","currentIndex","findIndex","hoverNextSuggestion","clearSuggestions","getByValue","Suggestion","overrideToVisual","setId","setType","setValue","setDescription","description","getId","_id","getType","_type","_value","getDescription","_description","_hovered","hovered","isSelected","_selected","getOverrideToVisual","setOverrideToVisual","override","SuggestionType","SuggestionSelectedPayload","context","setSuggestion","setContext","getSuggestion","getContext","LifecycleState","PluginsManifest","plugins","_pluginDefinitions","getPluginDefinitions","ExtensionPoint","PluginDefinitionList","ValueContext","callbackFunctions","beforeChangeValidationPromises","afterValueChangeCallbackFunctions","getCopy","callbackFunction","subscribe","beforeChangeValidationPromise","afterChangeCallback","fn","canUpdate","beforeChangePromises","validator","Promise","all","every","ContextSubscriptionManager","subscribers","unsubFns","subscribeToService","sub","subscribeAll","unsub","subscribeToAllRegisteredContexts","services","ContextService","canSubscribeAll","subscriber","unsubscribed","_canSubscribeAll","updateContextProperty","propertyName","getOrCreateValueContext","validatePropertyChange","getContextPropertyValue","valueContext","undefined","unsubscribeFns","getContextFields","canHandle","fieldName","HttpInterceptor","priority","LocalStorageService","getStorage","localStorage","getItem","getPrefixedKey","storeValue","setItem","removeItem","globalLocalPrefix","GLOBAL_NAMESPACE","NAMESPACE","localPrefix","startsWith","LocalStorageSubscriptionHandlerService","handleStorageChange","event","withoutGlobalPrefix","substring","namespace","contextPropertyKey","handler","resolveHandler","newValue","warn","AuthenticationStorageService","jwtKey","authenticatedKey","getAuthToken","setAuthenticated","authenticated","isAuthenticated","RepositoryStorageService","SELECTED_REPOSITORY","setRepositoryReference","repositoryReference","serializeRepositoryReference","getRepositoryReference","deserializeRepositoryReference","removeRepositoryReference","stringify","serializedRepositoryReference","e","SecurityContextService","RESTRICTED_PAGES","SECURITY_CONFIG","AUTHENTICATED_USER","AUTH_TOKEN","OPEN_ID_CONFIG","getRestrictedPages","updateRestrictedPages","restrictedPages","onRestrictedPagesChanged","onAuthTokenChanged","updateAuthToken","updateSecurityConfig","securityConfig","onSecurityConfigChanged","getSecurityConfig","updateAuthenticatedUser","authenticatedUser","onAuthenticatedUserChanged","getAuthenticatedUser","updateOpenIdConfig","openIdConfig","getOpenIdConfig","WindowService","getWindow","window","getPluginRegistry","PluginRegistry","navigateTo","url","preventDefault","navigate","singleSpa","navigateToUrl","openInNewTab","open","isHomePage","getPathName","pathname","getContextName","getOrigin","origin","document","querySelector","getAttribute","getCurrentRoute","REQUEST_INTERCEPTORS","authStorage","repositoryStorageService","securityContextService","process","request","headers","authToken","Authorization","resolve","shouldProcess","RESPONSE_INTERCEPTORS","reload","reject","InterceptorService","preProcessors","postProcessors","registerRequestInterceptors","registerResponseInterceptors","preProcess","processedRequest","interceptor","postProcess","response","processedResponse","sortInterceptors","interceptors","a","b","HttpRequest","method","body","EventEmitter","emit","customEvent","CustomEvent","detail","getHostElement","dispatchEvent","eventName","listener","addEventListener","removeEventListener","JSON_CONTENT_TYPES","HTTP_REQUEST_DONE_EVENT","HttpService","interceptorService","eventEmitter","params","then","post","put","delete","patch","encodeURIComponentStrict","encodeURIComponent","c","options","queryString","buildQueryParams","fullUrl","Accept","fetch","ok","hasValidJson","json","finally","responseContentType","contentType","URLSearchParams","LanguageRestService","I18N_ENDPOINT","getLanguage","languageCode","getLanguageConfiguration","LanguageConfigMapper","LanguageStorageService","LanguageContextService","LANGUAGE_CONFIG","SELECTED_LANGUAGE","LANGUAGE_BUNDLE","DEFAULT_BUNDLE","updateSelectedLanguage","locale","shouldSet","selectedLanguage","LanguageService","getDefaultLanguage","onSelectedLanguageChanged","updateLanguageBundle","bundle","onLanguageBundleChanged","updateDefaultBundle","getDefaultBundle","getLanguageConfig","setLanguageConfig","languageConfig","getSelectedLanguage","languageRestService","languageContextService","getSupportedLanguages","RepositoryRestService","getRepositories","REPOSITORIES_ENDPOINT","getRepositorySizeInfo","RepositoryMapper","RepositoryListMapper","repositoryMapper","entries","repositoriesData","repositoryData","RepositorySizeInfoMapper","RepositoryService","GRAPHQL_REPO_AUTHORITY","repositoryRestService","repositoryListMapper","repositorySizeInfoMapper","isSystemRepository","getCurrentGqlRepoAuthority","action","repoId","getCurrentRepoAuthority","getOverallGqlRepoAuthority","getOverallRepoAuthority","getLocationSpecificId","repo","RepositoryContextService","REPOSITORY_LIST","updateSelectedRepository","storageService","selectedRepository","canChange","getSelectedRepository","onSelectedRepositoryChanged","updateRepositoryList","getRepositoryList","onRepositoryListChanged","RepositoryLocationRestService","getActiveRepositoryLocation","RepositoryLocationMapper","RepositoryLocationService","locationRestService","repositoryLocationMapper","RepositoryLocationContextService","ACTIVE_REPOSITORY_LOCATION","IS_LOADING","updateActiveRepositoryLocation","repositoryLocation","onActiveLocationChanged","updateIsLoading","isLoading","onIsLoadingChanged","LicenseRestService","getLicense","LicenseMapper","LicenseContextService","GRAPHDB_LICENSE","updateGraphdbLicense","license","onLicenseChanged","callbackFn","LicenseService","licenseRestService","licenseMapper","trackableProductTypes","trackableTypesOfUse","isTrackableLicense","licenseTypeOfUse","toLowerCase","ProductInfoContextService","PRODUCT_INFO","updateProductInfo","productInfo","onProductInfoChanged","ProductInfoMapper","ProductInfoRestService","VERSION_URL","getProductInfoLocal","ProductInfoService","productInfoMapper","productInfoService","SecurityConfigMapper","EventObserver","notify","EventService","eventSubscribers","observer","unsubscribe","RouteRegexParamPair","regex","routeParams","setRegex","setRouteParams","getRegex","getRouteParams","RouteItemModel","routeItem","_url","_module","module","_path","path","_chunk","chunk","_controller","controller","_templateUrl","templateUrl","_title","_reloadOnSearch","reloadOnSearch","_helpInfo","helpInfo","_documentationUrl","documentationUrl","_allowAuthorities","allowAuthorities","RoutingService","routeConfig","ROUTE","getActiveRoute","activeRoute","route","routeToRegex","test","pattern","_","slash","option","optional","star","RegExp","AuthenticationService","repositoryService","login","logout","isLoggedIn","user","hasFreeAccess","hasRole","role","IS_AUTHENTICATED_FULLY","isSecurityEnabled","canReadRepo","isAdminOrRepoManager","hasBaseRights","READ","canReadGqlRepo","hasGraphqlAuthority","canWriteGqlRepo","WRITE","hasGqlRights","ROLE_ADMIN","resolveAuthorities","allowAuth","authoritiesList","overCurrentRepoGraphql","overAllReposGraphql","ROLE_REPO_MANAGER","overCurrentRepo","overAllRepos","AuthenticatedUserMapper","SecurityRestService","SECURITY_ENDPOINT","updateUserData","SecurityService","securityRestService","OpenidConfigMapper","COOKIE_CONSENT_CHANGED_EVENT","CookieService","acceptCookiePolicy","setAcceptedCookiePolicy","COOKIE_CONSENT","cookieConsent","MonitoringRestService","MONITORING_ENDPOINT","getOperations","OPERATION_TYPE_SORT_ORDER","OperationListMapper","OperationSummaryMapper","MonitoringService","OperationGroupSummaryListMapper","OntoToastrService","createToastElement","ERROR","info","INFO","success","SUCCESS","warning","AutocompleteRestService","autocompleteRestPrefix","search","searchTerm","SuggestionListMapper","AutocompleteSearchResultMapper","AutocompleteService","isAutocompleteEnabled","AutocompleteStorageService","ENABLED_KEY","isEnabled","setEnabled","AutocompleteContextService","AUTOCOMPLETE_ENABLED","updateAutocompleteEnabled","onAutocompleteEnabledChanged","NamespaceMapMapper","results","bindings","reduce","acc","binding","NamespacesRestService","getNamespaces","NamespacesService","namespaceMapper","namespacesRestService","NamespacesContextService","NAMESPACES","updateNamespaces","onNamespacesChanged","ResourceSearchStorageService","SELECTED_VIEW_KEY","INPUT_KEY","LAST_SELECTED_KEY","LEGACY_LAST_SELECTED_KEY","LEGACY_INPUT_KEY","LEGACY_SELECTED_VIEW_KEY","setSelectedView","viewType","getSelectedView","setInputValue","getInputValue","setLastSelected","getLastSelectedValue","clearStoredSearch","NavigationContextService","PREVIOUS_ROUTE","updatePreviousRoute","getPreviousRoute","previousRoute","endsWith","slice","ApplicationLifecycleContextService","APPLICATION_DATA_STATE","updateApplicationDataState","onApplicationDataStateChanged","ConfigurationContextService","APPLICATION_CONFIGURATION","updateApplicationConfiguration","configuration","getApplicationConfiguration","PluginsRestService","configurationContextService","getPluginsManifest","pluginsManifestPath","loadPlugins","pluginsManifest","async","entryUrl","pluginDef","entry","import","err","PluginsManifestMapper","pluginDefinitions","PluginsService","pluginsRestService","pluginsManifestMapper","pluginModule","register","ErrorBase","Error","text","MissingApplicationConfigurationError","ConfigurationRestService","getConfiguration","configResponse","environment","envDefault","configUrl","debug","ConfigurationService","configurationRestService","BuildUtil","isDevMode","wbDevMode","UriUtil","shortenIri","iri","parser","createElement","hostname","containsIPV4","split","port","ip","blocks","sequence","createAutocompleteRedirect","redirectUrl","resourceUri","removeAngleBrackets","isValidUri","hasValidProtocol","schemaSlashesIdx","resolveDocumentationUrl","endpointPath","isUnofficialVersion","LATEST_UNOFFICIAL_VERSION","BASE_DOCUMENTATION_URL","hasAngleBrackets","hasNoAngleBrackets","ABS_URI_REGEX","FibonacciGenerator","fibo1","fibo2","next","reset"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"ontotext-workbench-api.js","mappings":"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","sources":["webpack://workbench-api/./src/services/utils/object-util.ts","webpack://workbench-api/./src/models/common/model.ts","webpack://workbench-api/./src/models/common/model-list.ts","webpack://workbench-api/./src/models/common/subscription-list.ts","webpack://workbench-api/./src/models/repositories/repository.ts","webpack://workbench-api/./src/models/repositories/repository-list.ts","webpack://workbench-api/./src/models/repositories/repository-size-info.ts","webpack://workbench-api/./src/models/repositories/repository-state.ts","webpack://workbench-api/./src/models/repositories/repository-type.ts","webpack://workbench-api/./src/models/repositories/namespace/namespace-map.ts","webpack://workbench-api/./src/models/repository-location/repository-location.ts","webpack://workbench-api/./src/models/repository-location/repository-location-type.ts","webpack://workbench-api/./src/models/events/event.ts","webpack://workbench-api/./src/models/events/event-name.ts","webpack://workbench-api/./src/models/events/navigation/navigation-end.ts","webpack://workbench-api/./src/models/events/navigation/navigation-end-payload.ts","webpack://workbench-api/./src/models/events/navigation/navigation-start.ts","webpack://workbench-api/./src/models/events/auth/logout.ts","webpack://workbench-api/./src/models/security/authentication-type.ts","webpack://workbench-api/./src/providers/mapper/mapper.provider.ts","webpack://workbench-api/./src/providers/service/service.provider.ts","webpack://workbench-api/./src/providers/service/service-inject.ts","webpack://workbench-api/./src/models/security/authority-list.ts","webpack://workbench-api/./src/providers/mapper/mapper.ts","webpack://workbench-api/./src/services/security/mappers/authority-list.mapper.ts","webpack://workbench-api/./src/models/security/authenticated-user.ts","webpack://workbench-api/./src/models/security/auth-settings.ts","webpack://workbench-api/./src/services/security/mappers/auth-settings.mapper.ts","webpack://workbench-api/./src/models/security/security-config.ts","webpack://workbench-api/./src/models/security/authority.ts","webpack://workbench-api/./src/models/security/restricted-pages.ts","webpack://workbench-api/./src/models/security/openid-config.ts","webpack://workbench-api/./src/models/security/rights.ts","webpack://workbench-api/./src/services/license/mappers/capability-list.mapper.ts","webpack://workbench-api/./src/models/license/license.ts","webpack://workbench-api/./src/models/license/capability.ts","webpack://workbench-api/./src/models/license/capability-list.ts","webpack://workbench-api/./src/models/product-info/product-info.ts","webpack://workbench-api/./src/models/storage/storage-data.ts","webpack://workbench-api/./src/models/storage/storage-key.ts","webpack://workbench-api/./src/models/language/available-languages-list.ts","webpack://workbench-api/./src/services/language/mappers/available-languages-list-mapper.ts","webpack://workbench-api/./src/models/language/language-config.ts","webpack://workbench-api/./src/models/cookie/cookie-consent.ts","webpack://workbench-api/./src/models/monitoring/operation-status.ts","webpack://workbench-api/./src/models/monitoring/operation-group-summary.ts","webpack://workbench-api/./src/models/monitoring/operation-status-summary.ts","webpack://workbench-api/./src/models/monitoring/operation-list.ts","webpack://workbench-api/./src/models/monitoring/operation-type.ts","webpack://workbench-api/./src/models/monitoring/operation-group.ts","webpack://workbench-api/./src/models/monitoring/operation.ts","webpack://workbench-api/./src/models/monitoring/operation-group-summary-list.ts","webpack://workbench-api/./src/models/toastr/toastr-position.ts","webpack://workbench-api/./src/models/toastr/toast-config.ts","webpack://workbench-api/./src/models/toastr/toastr-config.ts","webpack://workbench-api/./src/models/toastr/toast-type.ts","webpack://workbench-api/./src/services/utils/generator-utils.ts","webpack://workbench-api/./src/models/toastr/toast-message.ts","webpack://workbench-api/./src/models/toastr/toastr-constants.ts","webpack://workbench-api/./src/models/toastr/toast-message-list.ts","webpack://workbench-api/./src/models/rdf-search/search-button-list.ts","webpack://workbench-api/./src/models/rdf-search/search-button-config.ts","webpack://workbench-api/./src/models/rdf-search/search-button.ts","webpack://workbench-api/./src/models/rdf-search/suggestion-list.ts","webpack://workbench-api/./src/models/rdf-search/autocomplete-search-result.ts","webpack://workbench-api/./src/models/rdf-search/suggestion.ts","webpack://workbench-api/./src/models/rdf-search/suggestion-type.ts","webpack://workbench-api/./src/models/rdf-search/suggestion-selected-payload.ts","webpack://workbench-api/./src/models/app-lifecycle/lifecycle-state.ts","webpack://workbench-api/./src/models/plugins/plugins-manifest.ts","webpack://workbench-api/./src/models/plugins/extension-point.ts","webpack://workbench-api/./src/models/plugins/plugin-definition-list.ts","webpack://workbench-api/./src/models/context/value-context.ts","webpack://workbench-api/./src/services/context/context-subscription-manager.ts","webpack://workbench-api/./src/services/context/context.service.ts","webpack://workbench-api/./src/models/interceptor/http-interceptor.ts","webpack://workbench-api/./src/services/storage/local-storage.service.ts","webpack://workbench-api/./src/services/storage/local-storage-subscription-handler.service.ts","webpack://workbench-api/./src/services/security/authentication-storage.service.ts","webpack://workbench-api/./src/services/repository/repository-storage.service.ts","webpack://workbench-api/./src/services/security/security-context.service.ts","webpack://workbench-api/./src/services/window/window.service.ts","webpack://workbench-api/./src/services/utils/routing-utils.ts","webpack://workbench-api/./src/interceptor/interceptors.ts","webpack://workbench-api/./src/interceptor/auth/auth-request-interceptor.ts","webpack://workbench-api/./src/interceptor/auth/unauthorized-interceptor.ts","webpack://workbench-api/./src/services/interceptor/interceptor.service.ts","webpack://workbench-api/./src/models/http/http-request.ts","webpack://workbench-api/./src/emitters/event.emitter.ts","webpack://workbench-api/./src/services/http/http.service.ts","webpack://workbench-api/./src/services/language/language-rest.service.ts","webpack://workbench-api/./src/services/language/mappers/language-config-mapper.ts","webpack://workbench-api/./src/services/language/language-storage.service.ts","webpack://workbench-api/./src/services/language/language-context.service.ts","webpack://workbench-api/./src/services/language/language.service.ts","webpack://workbench-api/./src/services/repository/repository-rest.service.ts","webpack://workbench-api/./src/services/repository/mappers/repository.mapper.ts","webpack://workbench-api/./src/services/repository/mappers/repository-list.mapper.ts","webpack://workbench-api/./src/services/repository/mappers/repository-size-info.mapper.ts","webpack://workbench-api/./src/services/repository/repository.service.ts","webpack://workbench-api/./src/services/repository/repository-context.service.ts","webpack://workbench-api/./src/services/repository-location/repository-location-rest.service.ts","webpack://workbench-api/./src/services/repository-location/mappers/repository-location.mapper.ts","webpack://workbench-api/./src/services/repository-location/repository-location.service.ts","webpack://workbench-api/./src/services/repository-location/repository-location-context.service.ts","webpack://workbench-api/./src/services/license/license-rest.service.ts","webpack://workbench-api/./src/services/license/mappers/license-mapper.ts","webpack://workbench-api/./src/services/license/license-context.service.ts","webpack://workbench-api/./src/services/license/license.service.ts","webpack://workbench-api/./src/services/product-info/product-info-context.service.ts","webpack://workbench-api/./src/services/product-info/mappers/product-info.mapper.ts","webpack://workbench-api/./src/services/product-info/product-info-rest.service.ts","webpack://workbench-api/./src/services/product-info/product-info.service.ts","webpack://workbench-api/./src/services/security/mappers/security-config.mapper.ts","webpack://workbench-api/./src/models/events/event-observer.ts","webpack://workbench-api/./src/services/event-service/event.service.ts","webpack://workbench-api/./src/models/routing/route-regex-param-pair.ts","webpack://workbench-api/./src/models/routing/route-item-model.ts","webpack://workbench-api/./src/services/routing/routing.service.ts","webpack://workbench-api/./src/services/security/authentication.service.ts","webpack://workbench-api/./src/services/security/mappers/authenticated-user.mapper.ts","webpack://workbench-api/./src/services/security/security-rest.service.ts","webpack://workbench-api/./src/services/security/security.service.ts","webpack://workbench-api/./src/services/security/openid-config.mapper.ts","webpack://workbench-api/./src/services/cookie/cookie.service.ts","webpack://workbench-api/./src/services/monitoring/monitoring-rest.service.ts","webpack://workbench-api/./src/services/monitoring/mapper/operation-list.mapper.ts","webpack://workbench-api/./src/services/monitoring/mapper/operation-summary-mapper.ts","webpack://workbench-api/./src/services/monitoring/monitoring.service.ts","webpack://workbench-api/./src/services/monitoring/mapper/operation-group-summary-list.mapper.ts","webpack://workbench-api/./src/services/toastr/onto-toastr.service.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete-rest.service.ts","webpack://workbench-api/./src/services/rdf-search/mapper/suggestion-list.mapper.ts","webpack://workbench-api/./src/services/autocomplete/mapper/autocomplete-search-result.mapper.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete.service.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete-storage.service.ts","webpack://workbench-api/./src/services/autocomplete/autocomplete-context.service.ts","webpack://workbench-api/./src/services/repository/mappers/namespace-map.mapper.ts","webpack://workbench-api/./src/services/namespace/namespaces-rest.service.ts","webpack://workbench-api/./src/services/namespace/namespaces.service.ts","webpack://workbench-api/./src/services/namespace/namespaces-context.service.ts","webpack://workbench-api/./src/services/rdf-search/resource-search-storage.service.ts","webpack://workbench-api/./src/services/navigation/navigation-context.service.ts","webpack://workbench-api/./src/services/app-lifecycle/application-lifecycle-context.service.ts","webpack://workbench-api/./src/services/configuration/configuration-context.service.ts","webpack://workbench-api/./src/services/plugins/plugins-rest.service.ts","webpack://workbench-api/./src/services/plugins/mapper/plugins-manifest.mapper.ts","webpack://workbench-api/./src/services/plugins/plugins.service.ts","webpack://workbench-api/./src/error/error-base.ts","webpack://workbench-api/./src/services/configuration/missing-application-configuration-error.ts","webpack://workbench-api/./src/services/configuration/configuration-rest.service.ts","webpack://workbench-api/./src/services/configuration/configuration.service.ts","webpack://workbench-api/./src/services/utils/build-util.ts","webpack://workbench-api/./src/services/utils/uri-util.ts","webpack://workbench-api/./src/services/utils/fibonacci-generator.ts"],"sourcesContent":["export class ObjectUtil {\n\n /**\n * Performs a deep equality check between two values.\n *\n * This function compares two values to determine if they are deeply equal.\n * It supports comparison of primitives, arrays, and objects, including nested structures.\n *\n * @param obj1 - The first value to compare.\n * @param obj2 - The second value to compare.\n * @returns `true` if both values are deeply equal, otherwise `false`.\n *\n * @example\n * // Comparing two deeply nested objects\n * const obj1 = { a: 1, b: { c: [1, 2, 3], d: { e: 'hello' } } };\n * const obj2 = { a: 1, b: { c: [1, 2, 3], d: { e: 'hello' } } };\n * console.log(deepEqual(obj1, obj2)); // true\n *\n * @example\n * // Comparing two arrays with different values\n * const arr1 = [1, 2, 3];\n * const arr2 = [1, 2, 4];\n * console.log(deepEqual(arr1, arr2)); // false\n */\n static deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Check if both values are strictly equal (handles primitives and references)\n if (obj1 === obj2) {\n return true;\n }\n\n // Check if either value is null or undefined\n if (obj1 === null || obj1 === undefined || obj2 === null || obj2 === undefined) {\n return false;\n }\n\n // Check if both values are objects\n if (typeof obj1 === 'object' && typeof obj2 === 'object') {\n // Ensure both have the same constructor (handles different types of objects, like Date, RegExp)\n if (obj1.constructor !== obj2.constructor) {\n return false;\n }\n\n // Handle arrays\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\n // Check if both arrays have the same length\n if (obj1.length !== obj2.length) {\n return false;\n }\n\n // Compare each element recursively\n for (let i = 0; i < obj1.length; i++) {\n if (!ObjectUtil.deepEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n // Handle plain objects\n if (!Array.isArray(obj1) && !Array.isArray(obj2)) {\n const keys1 = Object.keys(obj1) as string[];\n const keys2 = Object.keys(obj2) as string[];\n\n // Check if both objects have the same number of keys\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n // Check if all keys and values are deeply equal\n for (const key of keys1) {\n if (\n !(key in obj2) || // Ensure the key exists in obj2\n !ObjectUtil.deepEqual(\n (obj1 as Record<string, unknown>)[key],\n (obj2 as Record<string, unknown>)[key]\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n // If one is an array and the other is not, they are not equal\n return false;\n }\n\n // Default case: Not equal\n return false;\n }\n\n /**\n * Creates a deep copy of the given object.\n *\n * This method recursively copies all properties and values of the object,\n * handling different types such as primitives, arrays, and plain objects.\n * It ensures that the copied object does not share references with the original object,\n * meaning that all nested structures are also copied independently.\n *\n * @param obj - The object to be deeply copied. Can be any type, including primitives,\n * arrays, or objects.\n * @returns A deep copy of the object. If the input is a primitive, null, undefined,\n * or a function, the original value is returned as-is.\n */\n static deepCopy(obj: unknown): unknown {\n // Handle primitives, null, undefined, and functions\n if (typeof obj !== 'object' || obj === null || obj === undefined || typeof obj === 'function') {\n return obj;\n }\n\n // Handle arrays separately to ensure deep copy of elements\n if (Array.isArray(obj)) {\n return obj.map(item => ObjectUtil.deepCopy(item));\n }\n\n // Handle plain objects or objects with a prototype\n const result: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj));\n\n // Recursively copy each key-value pair\n for (const key of Object.keys(obj)) {\n result[key] = ObjectUtil.deepCopy((obj as Record<string, unknown>)[key]);\n }\n\n return result;\n }\n\n /**\n * Type guard to check if the value has a 'copy' method.\n * @param value - The value to check.\n * @returns True if the value has a 'copy' method, false otherwise.\n */\n static hasCopyMethod(value: unknown): boolean {\n return typeof value === 'object' && value !== null && Object.prototype.hasOwnProperty.call(value, 'copy') && typeof (value as { copy: unknown }).copy === 'function';\n }\n}\n","import { Copyable } from './copyable';\nimport { ObjectUtil } from '../../services/utils';\n\n/**\n * Base class for all models, providing deep copy functionality.\n *\n * This abstract class ensures that any model extending it implements immutability\n * by providing a `copy` method, which creates a deep copy of the current instance.\n *\n * All models in the application are expected to extend this class to inherit the\n * `copy` behavior, ensuring consistency in how objects are cloned and manipulated.\n *\n * @template <T> The type of the model extending this class.\n */\nexport abstract class Model<T> implements Copyable<T> {\n\n /**\n * Creates a deep copy of the current instance.\n *\n * This method utilizes `ObjectUtil.deepCopy` to create a new instance of the model\n * with all properties and nested objects deeply cloned, ensuring that any changes\n * to the copy do not affect the original instance.\n *\n * @returns A new instance of the type `T` that is a deep copy of the original.\n */\n copy(): T {\n return ObjectUtil.deepCopy(this) as unknown as T;\n }\n}\n","import { Model } from './model';\n\n/**\n * Abstract base class for managing a list of items that extends the {@link Model} class.\n *\n * This class provides common utility methods for manipulating and querying the list of items,\n * such as sorting, filtering, and finding elements. Subclasses can extend this class to work\n * with specific types of models.\n *\n * @template T - The type of items in the list.\n */\nexport class ModelList<T> extends Model<T> {\n /**\n * The list of items managed by this class.\n */\n protected items: T[];\n\n /**\n * Creates an instance of the {@link ModelList}.\n *\n * @param items - An optional array of items to initialize the list. If no items are provided,\n * an empty array is used by default.\n */\n constructor(items: T[] = []) {\n super();\n this.items = items;\n }\n\n getItems(): T[] {\n return this.items;\n }\n\n /**\n * Sorts the items in place using the specified comparator function.\n *\n * @param comparator - A comparison function that defines the sort order.\n * Should return a negative number if `a` < `b`,\n * zero if `a` === `b`, or a positive number if `a` > `b`.\n *\n * @example\n * const modelList = new MyModelList([{ id: 2 }, { id: 1 }]);\n * modelList.sort((a, b) => a.id - b.id);\n * console.log(modelList.items); // Outputs: [{ id: 1 }, { id: 2 }]\n */\n sort(comparator: (a: T, b: T) => number): void {\n this.items.sort(comparator);\n }\n\n /**\n * Filters the items using the specified filter function.\n *\n * @param filterFunction - A function that returns `true` for items to include\n * and `false` for items to exclude.\n * @returns A new array of items that match the filter criteria.\n */\n filter(filterFunction: (item: T) => boolean): T[] {\n return this.items.filter(filterFunction);\n }\n\n /**\n * Finds an item in the list that matches the specified filter function.\n *\n * @param filterFunction - A function that returns `true` for the desired item.\n * @returns The first item that matches the filter criteria, or `undefined` if none match.\n */\n find(filterFunction: (item: T) => boolean): T | undefined {\n return this.items.find(filterFunction);\n }\n\n /**\n * Checks if the collection of items is empty.\n *\n * @returns {boolean} - Returns `true` if there are no items in the collection, otherwise `false`.\n */\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n /**\n * Adds a new item to the list in the first position.\n *\n * @param item - The item to add.\n */\n addToStart(item: T): void {\n this.items.unshift(item);\n }\n\n /**\n * Adds an array of items to the end of the list.\n *\n * @param items the items to add\n */\n addItems(items: T[]): void {\n this.items.push(...items);\n }\n\n /**\n * Removes a specific item from the list.\n *\n * This method finds the first occurrence of the specified item in the list and removes it.\n * If the item is not found in the list, no changes are made.\n *\n * @param item - The item to be removed from the list.\n */\n remove(item: T): void {\n const index = this.items.indexOf(item);\n if (index!== -1) {\n this.items.splice(index, 1);\n }\n }\n}\n","import { ModelList } from './model-list';\nimport { Subscription } from './subscription';\n\n/**\n * Represents a list of subscriptions that can be managed collectively.\n * Extends the {@link ModelList} class, specialized for {@link Subscription} type.\n */\nexport class SubscriptionList extends ModelList<Subscription> {\n /**\n * Creates a new instance of SubscriptionList.\n * @param subscriptions - An optional array of Subscription functions to initialize the list.\n */\n constructor(subscriptions?: Subscription[]) {\n super(subscriptions);\n }\n \n /**\n * Adds a new subscription to the list.\n * @param subscription - The Subscription function to be added to the list.\n */\n add(subscription: Subscription): void {\n this.items.push(subscription);\n }\n \n /**\n * Adds multiple subscriptions to the list.\n * @param subscriptions - An array of Subscription functions to be added.\n */\n addAll(subscriptions: Subscription[]): void {\n this.items.push(...subscriptions);\n }\n \n /**\n * Calls all subscription functions in the list and then clears the list. Calling a subscription\n * function unsubscribes the subscription. This effectively unsubscribes all subscriptions\n * and removes them from the list.\n */\n unsubscribeAll(): void {\n this.items.forEach(subscription => subscription());\n this.items = [];\n }\n}\n","import {RepositoryState} from './repository-state';\nimport {RepositoryType} from './repository-type';\nimport {Model} from '../common';\nimport {RepositoryReference} from './repository-reference';\n\n/**\n * Holds repository information, such as name, type, state, and other related fields.\n */\nexport class Repository extends Model<Repository> implements RepositoryReference {\n id: string;\n title: string;\n type: RepositoryType | undefined;\n sesameType: string | undefined;\n uri: string;\n externalUrl: string;\n location: string;\n state: RepositoryState | undefined;\n local: boolean | undefined;\n readable: boolean | undefined;\n writable: boolean | undefined;\n unsupported: boolean | undefined;\n isNew?: boolean;\n\n constructor(data?: Partial<Repository>) {\n super();\n this.id = data?.id || '';\n this.title = data?.title || '';\n this.type = data?.type;\n this.sesameType = data?.sesameType;\n this.uri = data?.uri || '';\n this.externalUrl = data?.externalUrl || '';\n this.location = data?.location || '';\n this.state = data?.state;\n this.local = data?.local;\n this.readable = data?.readable;\n this.writable = data?.writable;\n this.unsupported = data?.unsupported;\n this.isNew = data?.isNew;\n }\n\n toRepositoryReference(): RepositoryReference {\n return {\n id: this.id,\n location: this.location\n };\n }\n}\n","import {Repository} from './repository';\nimport {ModelList} from '../common';\n\nconst REPOSITORY_LOCATION_ID_COMPARATOR = (r1: Repository, r2: Repository) => {\n // Compare locations.\n const locationComparison = r1.location.localeCompare(r2.location);\n if (locationComparison !== 0) {\n // If locations are different, return their comparison.\n return locationComparison;\n }\n\n // If locations are the same, compare by id.\n return r1.id.localeCompare(r2.id);\n};\n\n/**\n * Holds an array of repositories ({@link Repository}) and provides functions to manipulate them.\n */\nexport class RepositoryList extends ModelList<Repository> {\n\n constructor(repositories?: Repository[]) {\n super(repositories);\n }\n\n /**\n * Finds a repository in the list by its ID and location.\n *\n * @param repositoryId - The unique ID of the repository to find.\n * @param location - The location associated with the repository.\n * @returns The matching {@link Repository} if found, otherwise `undefined`.\n */\n findRepository(repositoryId: string, location: string): Repository | undefined {\n return super.find((repository) => repository.id === repositoryId && repository.location === location);\n }\n\n /**\n * Sorts the repositories in place by their location and ID.\n */\n sortByLocationAndId(): void {\n super.sort(REPOSITORY_LOCATION_ID_COMPARATOR);\n }\n\n /**\n * Filters the list of repositories by excluding those with the specified ID(s) and LOCATION.\n *\n * @param repositories - An array of repositories to exclude from the filtered result.\n * @returns An array of {@link Repository} objects that do not have any of the specified IDs.\n */\n filterByRepository(repositories: Repository[]): Repository[] {\n return super.filter(this.createIdLocationFilter(repositories));\n }\n\n /**\n * Creates a filter function to include only objects with matching `id` and `location`.\n *\n * @param itemsToMatch - An array of objects with `id` and `location` to filter by.\n * @returns A filter function that returns `true` for objects with `id` and `location` matching any of the provided objects.\n */\n private createIdLocationFilter<T extends { id: string | number; location: string | number }>(\n itemsToMatch: { id: string | number; location: string | number }[]\n ): (item: T) => boolean {\n return (item: T) =>\n itemsToMatch.some(match => match.id !== item.id || match.location !== item.location);\n }\n}\n","import {Model} from '../common/model';\n\n/**\n * Holds repository triples information.\n */\nexport class RepositorySizeInfo extends Model<RepositorySizeInfo> {\n\n /**\n * Number of inferred triples.\n */\n inferred: number;\n\n /**\n * Number of all triples.\n */\n total: number;\n\n /**\n * Number of explicit triples.\n */\n explicit: number;\n\n constructor(data?: Partial<RepositorySizeInfo>) {\n super();\n this.inferred = data?.inferred || 0;\n this.total = data?.total || 0;\n this.explicit = data?.explicit || 0;\n }\n}\n","export enum RepositoryState {\n INACTIVE = 'INACTIVE',\n STARTING = 'STARTING',\n RUNNING = 'RUNNING',\n RESTARTING = 'RESTARTING',\n STOPPING = 'STOPPING'\n}\n","export enum RepositoryType {\n GRAPH_DB = 'graphdb',\n ONTOP = 'ontop',\n FEDEX = 'fedex',\n SYSTEM = 'system'\n}\n","/**\n * Represents a map between prefixes and their corresponding URIs.\n */\nexport class NamespaceMap {\n private namespaces!: Record<string, string>;\n\n constructor(namespaces: Record<string, string>) {\n this.setNamespaces(namespaces);\n }\n\n setNamespaces(namespaces: Record<string, string>): void {\n this.namespaces = namespaces;\n }\n\n /**\n * Retrieves the URI for a given prefix.\n * @param prefix - The prefix for which to retrieve the URI.\n */\n getByPrefix(prefix: string): string {\n return this.namespaces[prefix] || '';\n }\n}\n","import {AuthenticationType} from '../security';\nimport {RepositoryLocationType} from './repository-location-type';\nimport {Model} from '../common/model';\n\n/**\n * Holds location information about a repository ({@link RepositoryType}) instance.\n */\nexport class RepositoryLocation extends Model<RepositoryLocation> {\n /**\n * The GraphDB location URL.\n */\n uri: string;\n\n /**\n * Human readable label.\n */\n label: string;\n\n /**\n * Username for the location if any. This parameter only makes sense for remote locations.\n */\n username: string;\n\n /**\n * Password for the location if any. This parameter only makes sense for remote locations.\n */\n password: string;\n\n /**\n * Authentication type.\n */\n authType: AuthenticationType | undefined;\n\n /**\n * Remote location type.\n */\n locationType: RepositoryLocationType | undefined;\n\n /**\n * True if the location is the currently active.\n */\n active: boolean | undefined;\n\n /**\n * True if the location is local (on the same machine as the workbench).\n */\n local: boolean | undefined;\n\n /**\n * True if the location is the system location.\n */\n system: boolean | undefined;\n\n /**\n * Error message, if there was an error connecting to this location\n */\n errorMsg: string;\n\n /**\n * Default repository for the location.\n */\n defaultRepository: string;\n\n constructor(data?: Partial<RepositoryLocation>) {\n super();\n this.uri = data?.uri || '';\n this.label = data?.label || '';\n this.username = data?.username || '';\n this.password = data?.password || '';\n this.authType = data?.authType;\n this.locationType = data?.locationType;\n this.active = data?.active;\n this.local = data?.local;\n this.system = data?.system;\n this.errorMsg = data?.errorMsg || '';\n this.defaultRepository = data?.defaultRepository || '';\n }\n}\n","export enum RepositoryLocationType {\n GDB = 'GDB',\n ONTOPIC = 'ONTOPIC',\n SPARQL = 'SPARQL'\n}\n","/**\n * A generic shape of our internal event data payloads.\n */\nexport class Event<T extends {} | undefined> {\n /**\n * The name of the event.\n */\n readonly NAME: string;\n /**\n * The payload of the event.\n */\n readonly payload?: T;\n /**\n * Creates a new instance of the event.\n *\n * @param name - the name of the event.\n * @param payload - the payload of the event. This is optional and if omitted, the event will have no payload,\n * just a name.\n */\n constructor(name: string, payload?: T) {\n this.NAME = name;\n this.payload = payload;\n }\n}\n","/**\n * A constant object that defines event names used throughout the {@link EventService}.\n *\n * This object acts as a central repository for all predefined event names, ensuring consistency\n * when emitting and subscribing to events in the {@link EventService}.\n *\n */\nexport const EventName = {\n NAVIGATION_END: 'navigationEnd',\n NAVIGATION_START: 'navigationStart',\n LOGOUT: 'logout',\n APP_DATA_LOADED: 'applicationDataLoaded',\n};\n","import {Event} from '../event';\nimport {NavigationEndPayload} from './navigation-end-payload';\nimport {EventName} from '../event-name';\n\n/**\n * Represents a \"navigationEnd\" event.\n *\n * This event is triggered when navigation ends and contains information about the previous and current URLs.\n */\nexport class NavigationEnd extends Event<NavigationEndPayload> {\n constructor(oldUrl: string, newUrl: string) {\n super(EventName.NAVIGATION_END, {oldUrl, newUrl});\n }\n}\n","/**\n * Represents the payload for a navigation end event.\n */\nexport class NavigationEndPayload {\n\n /**\n * The URL from which the navigation originated.\n *\n * @type {string | undefined}\n */\n oldUrl: string | undefined;\n\n /**\n * The URL to which the navigation ended.\n *\n * @type {string | undefined}\n */\n newUrl: string | undefined;\n}\n","import {Event} from '../event';\nimport {EventName} from '../event-name';\nimport {NavigationStartPayload} from './navigation-start-payload';\n\n/**\n * Represents a \"navigationStart\" event.\n *\n * This event is triggered when navigation starts and contains information about the previous and current URLs.\n */\nexport class NavigationStart extends Event<NavigationStartPayload> {\n /**\n * Creates an instance of the NavigationStart event.\n *\n * @param oldUrl - The URL from which the navigation originated.\n * @param newUrl - The URL to which the navigation ended.\n * @param cancelNavigation - A function to cancel the ongoing navigation.\n */\n constructor(oldUrl: string, newUrl: string, cancelNavigation: (cancellationPayload: unknown) => void) {\n super(EventName.NAVIGATION_START, {oldUrl, newUrl, cancelNavigation});\n }\n}\n","import {Event} from '../event';\nimport {EventName} from '../event-name';\n\n/**\n * Represents a \"logout\" event.\n *\n * This event is triggered when users attempts to log out.\n */\nexport class Logout extends Event<undefined> {\n constructor() {\n super(EventName.LOGOUT);\n }\n}\n","export enum AuthenticationType {\n NONE = 'NONE',\n BASIC = 'BASIC',\n SIGNATURE = 'SIGNATURE'\n}\n","import {Mapper, MapperConstructor} from './mapper';\n\n/**\n * A utility class that provides and manages singleton instances of `Mapper` objects.\n *\n * The `MapperProvider` is designed to handle the creation and reuse of `Mapper` instances\n * for different types. Each type of `Mapper` is stored in a map, ensuring that only one instance\n * per type exists during the application's lifecycle.\n */\nexport class MapperProvider {\n /**\n * A static map that stores singleton instances of `Mapper` objects, keyed by their type name.\n */\n private static readonly MAPPER_INSTANCES: Map<string, Mapper<unknown>> = new Map<string, Mapper<unknown>>();\n\n /**\n * Retrieves a Mapper instance for the given type. If no instance exists, a new one is created,\n * stored, and then returned.\n *\n * @template T - The specific Mapper type to retrieve or create.\n * @param type - The constructor of the Mapper to retrieve or create.\n * @returns The Mapper instance for the given type.\n */\n public static get<T>(type: MapperConstructor<T>): Mapper<T> {\n const typeName = type.name;\n\n // Check if an instance exists\n if (!MapperProvider.MAPPER_INSTANCES.has(typeName)) {\n // Create a new instance and store it\n const instance = new type();\n MapperProvider.MAPPER_INSTANCES.set(typeName, instance);\n }\n\n // Return the existing or newly created instance\n return MapperProvider.MAPPER_INSTANCES.get(typeName) as Mapper<T>;\n }\n}\n","import {Service} from './service';\nimport {LifecycleHooks} from './lifecycle-hooks';\n\n/**\n * Service provider for all {@link Service} instances. Services in the API are singletons, meaning that there is only\n * one instance of each service in the application. This provider caches all workbench services created on demand,\n * ensuring that all micro frontends share a single instance of each service.\n */\nexport class ServiceProvider {\n /**\n * The static modifier ensures the map is the same for all ServiceProviders. Each micro-frontend will have its\n * own instance of {@see ServiceFactoryService}, but the map with instances will be shared.\n */\n private static readonly SERVICE_INSTANCES = new Map<string, Service>;\n\n /**\n * Returns the instance of the given service type. If the service has not been created yet, this method:\n * 1. Instantiates the service via `new type()`.\n * 2. Calls its `onCreated()` hook if implemented.\n * 3. Caches and returns the instance.\n *\n * @param type The service type to retrieve.\n * @returns The instance of the service.\n * @template T The type of the service to retrieve.\n */\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n public static get<T extends Service>(type: { new (): T }): T {\n if (!ServiceProvider.SERVICE_INSTANCES.has(type.name)) {\n const instance = new type();\n if (ServiceProvider.implementsLifecycleHooks(instance)) {\n instance.onCreated?.();\n }\n ServiceProvider.SERVICE_INSTANCES.set(type.name, instance);\n }\n return this.SERVICE_INSTANCES.get(type.name) as T;\n }\n\n private static implementsLifecycleHooks(instance: Service): instance is LifecycleHooks {\n return typeof instance === 'object' && typeof (instance as LifecycleHooks).onCreated === 'function';\n }\n\n /**\n * Returns all instances of the given service type.\n * @param superType The super type of the services to retrieve.\n * @returns All instances of the given service type.\n * @template T The super type of the services to retrieve.\n */\n public static getAllBySuperType<T>(superType: abstract new(service: T) => T): T[] {\n return Array.from(ServiceProvider.SERVICE_INSTANCES.values())\n .filter((service) => service instanceof superType) as T[];\n }\n}\n","import {ServiceProvider} from './service.provider';\nimport {Service} from './service';\n\n/**\n * Injects a service instance of the specified class retrieving the service instance from the ServiceProvider.\n * @param serviceClass The class of the service to inject.\n * @returns An instance of the specified service class.\n * @template T The type of the service to inject.\n * @example\n * ```typescript\n * import {service} from 'path/to/service-inject';\n * import {MyService} from 'path/to/my-service';\n * const myService = service(MyService);\n * ```\n */\nexport function service<T extends Service>(serviceClass: new (...args: never[]) => T): T {\n return ServiceProvider.get(serviceClass);\n}\n","import {ModelList} from '../common';\nimport {Authority} from './authority';\n\n/**\n * Represents a list of authorities in an authenticated user.\n */\nexport class AuthorityList extends ModelList<Authority> {\n constructor(authorities?: Authority[]) {\n super(authorities);\n }\n\n /**\n * Checks if the list contains a specific authority.\n *\n * @param authority - The Authority object to check for in the list.\n * @returns A boolean indicating whether the specified authority is present in the list.\n * Returns true if the authority is found, false otherwise.\n */\n hasAuthority(authority: Authority): boolean {\n return this.items.includes(authority);\n }\n}\n","export type MapperConstructor<T> = new () => Mapper<T>\n\nexport abstract class Mapper<T> {\n\n /**\n * Converts raw data into an instance of the model type `T`.\n *\n * Implementations of this method should define the specific logic for\n * transforming raw input data into the desired model instance.\n *\n * @abstract\n * @param {unknown} data - The raw data to be transformed.\n * @returns {T} - An instance of the model type `T` based on the provided data.\n */\n abstract mapToModel(data: unknown): T;\n}\n","import {AuthorityList} from '../../../models/security/authority-list';\nimport {Mapper} from '../../../providers/mapper/mapper';\nimport {Authority} from '../../../models/security/authority';\n\n/**\n * Mapper class for converting Authority arrays to AuthorityList models.\n */\nexport class AuthorityListMapper extends Mapper<AuthorityList> {\n /**\n * Maps an array of Authority objects to an AuthorityList model.\n *\n * @param data - An array of Authority objects to be mapped into an AuthorityList.\n * @returns A new AuthorityList instance containing the provided authorities.\n */\n mapToModel(data: Authority[]): AuthorityList {\n return new AuthorityList(data);\n }\n}\n","import {Model} from '../common';\nimport {AuthorityList} from './authority-list';\nimport {MapperProvider} from '../../providers';\nimport {AuthorityListMapper} from '../../services/security/mappers/authority-list.mapper';\nimport {AppSettings} from './app-settings';\n\n/**\n * Represents an authenticated user in the system\n */\nexport class AuthenticatedUser extends Model<AuthenticatedUser> {\n external: boolean;\n username: string;\n password: string;\n authorities: AuthorityList;\n appSettings: AppSettings;\n\n constructor(data?: Partial<AuthenticatedUser>) {\n super();\n this.external = data?.external ?? false;\n this.username = data?.username ?? '';\n this.password = data?.password ?? '';\n this.authorities = MapperProvider.get(AuthorityListMapper).mapToModel(data?.authorities);\n this.appSettings = data?.appSettings ?? {};\n }\n}\n","import {Model} from '../common';\nimport {AppSettings} from './app-settings';\nimport {AuthorityList} from './authority-list';\nimport {MapperProvider} from '../../providers';\nimport {AuthorityListMapper} from '../../services/security/mappers/authority-list.mapper';\n\n/**\n * Represents an authentication setting.\n */\nexport class AuthSettings extends Model<AuthSettings> {\n appSettings?: AppSettings;\n authorities: AuthorityList;\n enabled?: boolean;\n\n constructor(data: Partial<AuthSettings>) {\n super();\n this.appSettings = data.appSettings;\n this.authorities = MapperProvider.get(AuthorityListMapper).mapToModel(data.authorities);\n this.enabled = data.enabled;\n }\n}\n","import {AuthSettings} from '../../../models/security/auth-settings';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting partial AuthSettings objects to complete AuthSettings models.\n */\nexport class AuthSettingsMapper extends Mapper<AuthSettings> {\n /**\n * Maps partial AuthSettings data to a complete AuthSettings model.\n *\n * @param data - Partial data of AuthSettings to be mapped.\n * @returns A new instance of AuthSettings.\n */\n mapToModel(data: Partial<AuthSettings>): AuthSettings {\n return new AuthSettings(data);\n }\n}\n","import {Model} from '../common';\nimport {AuthSettings} from './auth-settings';\nimport {AuthSettingsMapper} from '../../services/security/mappers/auth-settings.mapper';\nimport {MapperProvider} from '../../providers';\n\n/**\n * Represents the security configuration for the application.\n */\nexport class SecurityConfig extends Model<SecurityConfig> {\n authImplementation?: string;\n enabled?: boolean;\n passwordLoginEnabled?: boolean;\n freeAccess: AuthSettings;\n overrideAuth: AuthSettings;\n openIdEnabled?: boolean;\n userLoggedIn?: boolean;\n freeAccessActive?: boolean;\n hasExternalAuthUser?: boolean;\n\n constructor(config: Partial<SecurityConfig>) {\n super();\n this.authImplementation = config.authImplementation;\n this.enabled = config.enabled;\n this.passwordLoginEnabled = config.passwordLoginEnabled;\n this.freeAccess = MapperProvider.get(AuthSettingsMapper).mapToModel(config.freeAccess);\n this.overrideAuth = MapperProvider.get(AuthSettingsMapper).mapToModel(config.overrideAuth);\n this.openIdEnabled = config.openIdEnabled;\n this.userLoggedIn = config.userLoggedIn;\n this.freeAccessActive = config.freeAccessActive;\n this.hasExternalAuthUser = config.hasExternalAuthUser;\n }\n}\n","export enum Authority {\n ROLE_ADMIN = 'ROLE_ADMIN',\n ROLE_USER = 'ROLE_USER',\n ROLE_MONITORING = 'ROLE_MONITORING',\n ROLE_REPO_MANAGER = 'ROLE_REPO_MANAGER',\n ROLE_CLUSTER = 'ROLE_CLUSTER',\n IS_AUTHENTICATED_FULLY = 'IS_AUTHENTICATED_FULLY'\n}\n\n","import {Model} from '../common';\n\n/**\n * Holds information about restricted pages for the logged-in user.\n */\nexport class RestrictedPages extends Model<RestrictedPages>{\n\n private pages: Record<string, boolean> = {};\n\n isRestricted(pageUrl: string): boolean {\n return this.pages[pageUrl] ?? false;\n }\n\n setPageRestriction(pageUrl: string, isRestricted = true): RestrictedPages {\n this.pages[pageUrl] = isRestricted;\n return this;\n }\n}\n","import {Model} from '../common';\n\nexport class OpenIdConfig extends Model<OpenIdConfig> {\n openIdKeys?: Record<string, JsonWebKey>;\n openIdTokenUrl?: string;\n openIdKeysUri?: string;\n openIdEndSessionUrl?: string;\n supportsOfflineAccess?: boolean;\n\n constructor(config: Partial<OpenIdConfig>) {\n super();\n this.openIdKeys = config.openIdKeys;\n this.openIdTokenUrl = config.openIdTokenUrl;\n this.openIdKeysUri = config.openIdKeysUri;\n this.openIdEndSessionUrl = config.openIdEndSessionUrl;\n this.supportsOfflineAccess = config.supportsOfflineAccess;\n }\n}\n","export enum Rights {\n READ = 'READ',\n WRITE = 'WRITE'\n}\n","import { CapabilityList } from '../../../models/license';\nimport { Mapper } from '../../../providers/mapper/mapper';\nimport { Capability } from '../../../models/license';\n\n/**\n * Mapper class for converting an array of Capability objects to a CapabilityList model.\n * Extends the base Mapper class with CapabilityList as the target model type.\n */\nexport class CapabilityListMapper extends Mapper<CapabilityList> {\n /**\n * Maps an array of Capability objects to a CapabilityList model.\n * \n * @param data - An array of Capability objects to be mapped.\n * @returns A new CapabilityList instance containing the provided Capability objects.\n */\n mapToModel(data: Capability[]): CapabilityList {\n return new CapabilityList(data);\n }\n}\n","import { Model } from '../common/model';\nimport { CapabilityList } from './capability-list';\nimport { CapabilityListMapper } from '../../services/license/mappers/capability-list.mapper';\nimport { MapperProvider } from '../../providers';\n\n/**\n * Represents a Graph DB license.\n *\n * Inherits copy functionality from {@link Model} and contains various properties of a GraphDB license.\n */\nexport class License extends Model<License> {\n private _expiryDate?: number;\n private _latestPublicationDate?: number;\n private _licensee?: string;\n private _maxCpuCores?: number;\n private _product?: string;\n private _productType?: string;\n private _licenseCapabilities?: CapabilityList;\n private _version?: string;\n private _installationId?: string;\n private _valid?: boolean;\n private _typeOfUse?: string;\n private _message?: string;\n private _present?: boolean;\n private _usageRestriction?: string;\n\n /**\n * Creates a new License instance.\n *\n * @param data - Partial data to initialize the License object. This can include any of the properties\n * defined in the License class. Default values are applied for some properties if not provided.\n */\n constructor(data: Partial<License>) {\n super();\n this.expiryDate = data.expiryDate;\n this.latestPublicationDate = data.latestPublicationDate;\n this.licensee = data.licensee || '';\n this.maxCpuCores = data.maxCpuCores;\n this.product = data.product || '';\n this.productType = data.productType || '';\n this.licenseCapabilities = MapperProvider.get(CapabilityListMapper).mapToModel(data.licenseCapabilities);\n this.version = data.version || '';\n this.installationId = data.installationId || '';\n this.valid = data.valid;\n this.typeOfUse = data.typeOfUse || '';\n this.message = data.message || '';\n this.present = data.present || false;\n this.usageRestriction = data.usageRestriction || '';\n }\n\n get expiryDate(): number | undefined {\n return this._expiryDate;\n }\n\n set expiryDate(value: number | undefined) {\n this._expiryDate = value;\n }\n\n get latestPublicationDate(): number | undefined {\n return this._latestPublicationDate;\n }\n\n set latestPublicationDate(value: number | undefined) {\n this._latestPublicationDate = value;\n }\n\n get licensee(): string | undefined {\n return this._licensee;\n }\n\n set licensee(value: string | undefined) {\n this._licensee = value;\n }\n\n get maxCpuCores(): number | undefined {\n return this._maxCpuCores;\n }\n\n set maxCpuCores(value: number | undefined) {\n this._maxCpuCores = value;\n }\n\n get product(): string | undefined {\n return this._product;\n }\n\n set product(value: string | undefined) {\n this._product = value;\n }\n\n get productType(): string | undefined {\n return this._productType;\n }\n\n set productType(value: string | undefined) {\n this._productType = value;\n }\n\n get licenseCapabilities(): CapabilityList | undefined {\n return this._licenseCapabilities;\n }\n\n set licenseCapabilities(value: CapabilityList | undefined) {\n this._licenseCapabilities = value;\n }\n\n get version(): string | undefined {\n return this._version;\n }\n\n set version(value: string | undefined) {\n this._version = value;\n }\n\n get installationId(): string | undefined {\n return this._installationId;\n }\n\n set installationId(value: string | undefined) {\n this._installationId = value;\n }\n\n get valid(): boolean | undefined {\n return this._valid;\n }\n\n set valid(value: boolean | undefined) {\n this._valid = value;\n }\n\n get typeOfUse(): string | undefined {\n return this._typeOfUse;\n }\n\n set typeOfUse(value: string | undefined) {\n this._typeOfUse = value;\n }\n\n get message(): string | undefined {\n return this._message;\n }\n\n set message(value: string | undefined) {\n this._message = value;\n }\n\n get present(): boolean | undefined {\n return this._present;\n }\n\n set present(value: boolean | undefined) {\n this._present = value;\n }\n\n get usageRestriction(): string | undefined {\n return this._usageRestriction;\n }\n\n set usageRestriction(value: string | undefined) {\n this._usageRestriction = value;\n }\n}\n","/**\n * Graph DB connector capabilities\n */\nexport enum Capability {\n LUCENE_CONNECTOR = 'Lucene connector',\n SOLR_CONNECTOR = 'Solr connector',\n ELASTICSEARCH_CONNECTOR = 'Elasticsearch connector',\n OPENSEARCH_CONNECTOR = 'OpenSearch connector',\n KAFKA_CONNECTOR = 'Kafka connector',\n CLUSTER = 'Cluster',\n}\n","import { Capability } from './capability';\nimport { ModelList } from '../common/model-list';\n\n/**\n * Represents a list of capabilities in the license model.\n * Extends the ModelList class, specialized for Capability connectors.\n */\nexport class CapabilityList extends ModelList<Capability> {\n /**\n * Creates a new instance of CapabilityList.\n *\n * @param capabilities - An array of Capability connectors to initialize the list.\n * If not provided, an empty list will be created.\n */\n constructor(capabilities: Capability[]) {\n super(capabilities);\n }\n}\n","export class ProductInfo {\n workbench: string;\n productType: string;\n productVersion: string;\n shortVersion?: string;\n sesame: string;\n connectors: string;\n\n constructor(data: Partial<ProductInfo & { Workbench: string }>) {\n // The 'Workbench' property comes with an upper-case 'W' from the backend\n // Map it to lower-case for consistency\n this.workbench = data.Workbench || '';\n this.productType = data.productType || '';\n this.productVersion = data.productVersion || '';\n this.sesame = data.sesame || '';\n this.connectors = data.connectors || '';\n this.shortVersion = this.resolveShortVersion(data);\n }\n\n private resolveShortVersion(data: Partial<ProductInfo>) {\n const productVersion = data.productVersion;\n\n if (!productVersion) {\n return '';\n }\n\n // Extract major.minor version (e.g., \"10.0\" from \"10.0.0-M3-RC1\")\n const majorMinorRegex = /^(\\d+\\.\\d+)/;\n const majorMinorMatch = majorMinorRegex.exec(productVersion);\n const baseVersion = majorMinorMatch?.[1] ?? productVersion;\n\n // Extract first attribute after dash (e.g., \"M3\" from \"10.0.0-M3-RC1\")\n const attributeRegex = /(-[^-]+)/;\n const attributeMatch = attributeRegex.exec(productVersion);\n const firstAttribute = attributeMatch?.[1] ?? '';\n\n return baseVersion + firstAttribute;\n }\n}\n","/**\n * Represents a wrapper of the data obtained from the storage with methods to convert it to different formats.\n */\nexport class StorageData {\n /**\n * The value obtained from the storage.\n */\n value: string | null;\n\n /**\n * Creates a new instance of the StorageData class.\n * @param value The value obtained from the storage.\n */\n constructor(value: string | null) {\n this.value = value;\n }\n\n /**\n * Returns the value as a string or null if the value is null.\n * @returns The value as a string or null if the value is null.\n */\n getValue(): string | null {\n return this.value;\n }\n\n /**\n * Returns the value as a string or the default value if the value is null.\n * @param defaultValue The default value to return if the value is null.\n * @returns The value as a string or the default value if the value is null.\n */\n getValueOrDefault(defaultValue: string): string | undefined {\n return this.value || defaultValue;\n }\n\n /**\n * Returns the value as a JSON object or null if the value is not a valid JSON. Conversion is done using JSON.parse.\n * @returns The value as a JSON object or null if the value is not a valid JSON.\n */\n getAsJson(): unknown {\n if (this.value === null) {\n return null;\n }\n try {\n return JSON.parse(this.value);\n } catch (error) {\n console.error('Error parsing JSON', error);\n return null;\n }\n }\n}\n\n","/**\n * A utility class holding the storage keys used by the application.\n */\nexport class StorageKey {\n static readonly GLOBAL_NAMESPACE: string = 'ontotext.gdb';\n}\n","import {AvailableLanguage} from './available-language';\n\n/**\n * Represents a list of available languages.\n */\nexport class AvailableLanguagesList {\n languages: AvailableLanguage[];\n\n constructor(languages: AvailableLanguage[]) {\n this.languages = languages;\n }\n\n /**\n * Retrieves an array of language codes from the available languages.\n *\n * This method maps over the list of available languages and extracts\n * the 'key' property from each language object, which represents\n * the language code.\n *\n * @returns {string[]} An array of language codes (e.g., ['en', 'fr', 'de']).\n */\n getLanguageCodes(): string[] {\n return this.languages?.map(language => language.key);\n }\n}\n","import { AvailableLanguagesList } from '../../../models/language/available-languages-list';\nimport { Mapper } from '../../../providers/mapper/mapper';\nimport { AvailableLanguage } from '../../../models/language/available-language';\n\n/**\n * Mapper class for converting an array of AvailableLanguage objects to an AvailableLanguagesList model.\n */\nexport class AvailableLanguagesListMapper extends Mapper<AvailableLanguagesList> {\n /**\n * Maps an array of AvailableLanguage objects to an AvailableLanguagesList model.\n *\n * @param data - An array of AvailableLanguage objects to be mapped.\n * @returns A new AvailableLanguagesList instance containing the provided AvailableLanguage objects.\n */\n mapToModel(data: AvailableLanguage[]): AvailableLanguagesList {\n return new AvailableLanguagesList(data);\n }\n}\n","import { AvailableLanguagesList } from './available-languages-list';\nimport { Model } from '../common';\nimport { MapperProvider } from '../../providers';\nimport { AvailableLanguagesListMapper } from '../../services/language/mappers/available-languages-list-mapper';\n\n/**\n * Represents the configuration for language settings in the application.\n */\nexport class LanguageConfig extends Model<LanguageConfig> {\n defaultLanguage: string;\n\n availableLanguages: AvailableLanguagesList;\n\n constructor(data: LanguageConfig) {\n super();\n this.defaultLanguage = data.defaultLanguage;\n this.availableLanguages = MapperProvider.get(AvailableLanguagesListMapper).mapToModel(data.availableLanguages);\n }\n}\n","/**\n * Represents the user's consent for various types of cookies.\n */\nexport class CookieConsent {\n /** Indicates whether the cookie policy has been accepted. */\n policyAccepted?: boolean;\n\n /** Indicates consent for statistical cookies. */\n statistic?: boolean;\n\n /** Indicates consent for third-party cookies. */\n thirdParty?: boolean;\n\n /** Epoch timestamp of last update in seconds. */\n updatedAt?: number;\n\n constructor(data?: CookieConsent) {\n this.policyAccepted = data?.policyAccepted;\n this.statistic = data?.statistic;\n this.thirdParty = data?.thirdParty;\n this.updatedAt = data?.updatedAt;\n }\n}\n","export enum OperationStatus {\n INFORMATION = 'INFORMATION',\n WARNING = 'WARNING',\n CRITICAL = 'CRITICAL'\n}\n\nexport const STATUS_ORDER = {\n [OperationStatus.INFORMATION]: 0,\n [OperationStatus.WARNING]: 1,\n [OperationStatus.CRITICAL]: 2\n};\n","import {Model} from '../common';\nimport {OperationGroup} from './operation-group';\nimport {OperationStatus} from './operation-status';\n\n/**\n * Represents a summary of an operation group.\n */\nexport class OperationGroupSummary extends Model<OperationGroupSummary> {\n group: OperationGroup;\n totalOperations: number;\n status: OperationStatus;\n id: string;\n\n constructor(data: OperationGroupSummary) {\n super();\n this.id = `${data.group}-${data.status}-${data.totalOperations}`;\n this.group = data.group;\n this.totalOperations = data.totalOperations;\n this.status = data.status;\n }\n}\n","import {Model} from '../common';\nimport {OperationStatus, STATUS_ORDER} from './operation-status';\nimport {OperationList} from './operation-list';\nimport {OperationGroup} from './operation-group';\nimport {OperationGroupSummary} from './operation-group-summary';\n\n/**\n * Model of the summary of operation statuses.\n *\n * Holds the status of the entire operation list and a list of individual operations.\n * Currently, these could be backup, sparql querying and cluster operations\n */\nexport class OperationStatusSummary extends Model<OperationStatusSummary> {\n status: OperationStatus;\n allRunningOperations: OperationList;\n\n constructor(operationStatusSummary: OperationStatusSummary) {\n super();\n this.status = operationStatusSummary.status || OperationStatus.INFORMATION;\n this.allRunningOperations = operationStatusSummary.allRunningOperations;\n }\n\n /**\n * Transforms the OperationStatusSummary data into a grouped summary format.\n * This function aggregates operations by their group, calculates total operations per group,\n * and determines the highest severity status for each group.\n *\n * @returns {OperationGroupSummary[]} A mapped list of operation group summaries with aggregated statistics\n */\n toOperationsGroupSummary(): OperationGroupSummary[] {\n const groupToOperationSummary = new Map<OperationGroup, OperationGroupSummary>();\n\n this.allRunningOperations.getItems().forEach((operation) => {\n if (!groupToOperationSummary.has(operation.group)) {\n groupToOperationSummary.set(operation.group, new OperationGroupSummary({\n group: operation.group,\n totalOperations: 0,\n status: OperationStatus.INFORMATION\n } as OperationGroupSummary));\n }\n\n const summary = groupToOperationSummary.get(operation.group)!;\n summary.totalOperations += operation.count;\n\n if (STATUS_ORDER[operation.status] > STATUS_ORDER[summary.status]) {\n summary.status = operation.status;\n }\n });\n\n return Array.from(groupToOperationSummary.values());\n }\n}\n","import {Operation} from './operation';\nimport {ModelList} from '../common';\n\n/**\n * Represents a list of Operation objects.\n */\nexport class OperationList extends ModelList<Operation> {\n /**\n * Creates a new instance of OperationList.\n *\n * @param operations - An array of Operation objects to initialize the list.\n */\n constructor(operations: Operation[]) {\n super(operations);\n }\n}\n","export enum OperationType {\n UPDATES = 'updates',\n QUERIES = 'queries',\n IMPORT = 'imports',\n BACKUP_AND_RESTORE = 'backupAndRestore',\n CLUSTER_HEALTH = 'clusterHealth'\n}\n","export enum OperationGroup {\n QUERY = 'QUERY',\n BACKUP = 'BACKUP',\n CLUSTER = 'CLUSTER',\n IMPORT = 'IMPORT'\n}\n","import {Model} from '../common';\nimport {OperationStatus} from './operation-status';\nimport {OperationType} from './operation-type';\nimport {OperationGroup} from './operation-group';\n\n/** Not all operations have counts as values */\nconst OPERATIONS_WITH_COUNT = [OperationType.QUERIES, OperationType.UPDATES, OperationType.IMPORT];\n\nconst OPERATION_TYPE_TO_HREF = {\n [OperationType.UPDATES]: 'monitor/queries',\n [OperationType.QUERIES]: 'monitor/queries',\n [OperationType.BACKUP_AND_RESTORE]: 'monitor/backup-and-restore',\n [OperationType.IMPORT]: 'import',\n [OperationType.CLUSTER_HEALTH]: 'cluster'\n};\n\nconst OPERATION_TYPE_TO_GROUP = {\n [OperationType.QUERIES]: OperationGroup.QUERY,\n [OperationType.UPDATES]: OperationGroup.QUERY,\n [OperationType.BACKUP_AND_RESTORE]: OperationGroup.BACKUP,\n [OperationType.IMPORT]: OperationGroup.IMPORT,\n [OperationType.CLUSTER_HEALTH]: OperationGroup.CLUSTER\n};\n\n/**\n * Represents an operation in the system.\n */\nexport class Operation extends Model<Operation> {\n value: string;\n status: OperationStatus;\n type: OperationType;\n\n // Internal properties\n id: string;\n count: number;\n group: OperationGroup;\n href: string;\n labelKey: string;\n\n constructor(operation: Operation) {\n super();\n this.id = `${operation.status}-${operation.type}-${operation.value}`;\n this.value = operation.value;\n this.status = operation.status;\n this.type = operation.type;\n this.count = this.getCount(operation);\n this.group = OPERATION_TYPE_TO_GROUP[operation.type];\n this.href = OPERATION_TYPE_TO_HREF[operation.type];\n this.labelKey = this.getLabelKey(operation);\n }\n\n private getCount(operation: Operation) {\n return OPERATIONS_WITH_COUNT.includes(operation.type) ? parseInt(operation.value, 10) : 0;\n }\n\n private getLabelKey(operation: Operation) {\n return OPERATIONS_WITH_COUNT.includes(operation.type) ? operation.type : operation.value;\n }\n}\n","import {ModelList} from '../common';\nimport {OperationGroupSummary} from './operation-group-summary';\n\n/**\n * Represents a list of operation group summaries.\n */\nexport class OperationGroupSummaryList extends ModelList<OperationGroupSummary> {\n /**\n * Creates a new instance of OperationGroupSummaryList.\n *\n * @param operationGroupSummaries - An optional array of OperationGroupSummary objects to initialize the list.\n * If not provided, an empty list will be created.\n */\n constructor(operationGroupSummaries?: OperationGroupSummary[]) {\n super(operationGroupSummaries);\n }\n}\n","export enum ToastrPosition {\n BOTTOM_RIGHT = 'bottom-right',\n BOTTOM_LEFT = 'bottom-left',\n}\n","/**\n * Configuration class for individual toast messages.\n * Configuration options here will override the global ToastrConfig settings.\n */\nexport class ToastConfig {\n /**\n * The duration in milliseconds for which the toast notification will be displayed.\n */\n timeout?: number;\n\n /**\n * A function to be called when the toast notification is clicked.\n */\n onClick?: (event: Event) => void;\n\n /**\n * Remove the toast notification when it is clicked.\n */\n removeOnClick?: boolean;\n\n constructor(data?: Partial<ToastConfig>) {\n this.timeout = data?.timeout || 5000;\n this.onClick = data?.onClick;\n this.removeOnClick = data?.removeOnClick || false;\n }\n}\n","import {ToastrPosition} from './toastr-position';\nimport {ToastConfig} from './toast-config';\n\n/**\n * Configuration class for the entire Toastr container.\n * Provides settings to control the behavior of all toast notifications.\n * Some of these may be overriden by individual toast messages, e.g. timeout.\n *\n * @extends ToastConfig\n */\nexport class ToastrConfig extends ToastConfig{\n private static instance: ToastrConfig;\n\n /**\n * The position of the toast container on the screen.\n */\n position: ToastrPosition;\n\n private constructor(config: ToastrConfig) {\n super();\n this.timeout = config.timeout;\n this.position = config.position;\n }\n\n /**\n * Returns the default configuration for toast notifications.\n * @returns {ToastrConfig} The singleton instance of ToastrConfig with default settings\n */\n static getDefaultConfig(): ToastrConfig {\n if(!this.instance) {\n this.instance = new ToastrConfig({\n timeout: 5000,\n position: ToastrPosition.BOTTOM_RIGHT,\n });\n }\n return this.instance;\n }\n}\n","export enum ToastType {\n ERROR = 'error',\n INFO = 'info',\n SUCCESS ='success',\n WARNING = 'warning'\n}\n","/**\n * Utility class for generating various values.\n */\nexport class GeneratorUtils {\n /**\n * Generates a pseudo random UUID (Universally Unique Identifier).\n *\n * This method creates a version 4 UUID, which is based on random numbers.\n * The generated UUID follows the RFC 4122 standard format.\n *\n * @returns A string representing the randomly generated UUID in the format\n * 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' where x is any hexadecimal digit\n * and y is one of 8, 9, a, or b.\n */\n static uuid(): string {\n const HEX_RADIX = 16;\n const UUID_V4_TEMPLATE = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n const VARIANT_BITMASK = 0x3;\n const VARIANT_VALUE = 0x8;\n\n let timestamp = new Date().getTime();\n let performanceNow = (performance?.now() ?? 0) * 1000;\n\n return UUID_V4_TEMPLATE.replace(/[xy]/g, (char) => {\n let random = Math.random() * HEX_RADIX;\n\n if (timestamp > 0) {\n random = (timestamp + random) % HEX_RADIX | 0;\n timestamp = Math.floor(timestamp / HEX_RADIX);\n } else {\n random = (performanceNow + random) % HEX_RADIX | 0;\n performanceNow = Math.floor(performanceNow / HEX_RADIX);\n }\n\n const value = char === 'x' ? random : (random & VARIANT_BITMASK) | VARIANT_VALUE;\n return value.toString(HEX_RADIX);\n });\n }\n\n /**\n * Returns a hash code from a string\n * @param {String} str The string to hash.\n * @return {Number} A 32bit integer\n */\n static hashCode(str: string): number {\n let hash = 0;\n for (let i = 0, len = str.length; i < len; i++) {\n const chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\n","import {ToastType} from './toast-type';\nimport {GeneratorUtils} from '../../services/utils/generator-utils';\nimport {ToastConfig} from './toast-config';\n\n/**\n * Represents a toast notification message with type, content, and configuration.\n */\nexport class ToastMessage {\n /** Unique identifier for the toast message */\n id: string;\n\n /** The type of toast message (e.g., 'success', 'error', 'warning', 'info') */\n type: ToastType;\n\n /** The content text to be displayed in the toast notification */\n message: string;\n\n /** Additional configuration for the toast message */\n config?: ToastConfig;\n\n constructor(type: ToastType, message: string, config?: ToastConfig) {\n this.id = GeneratorUtils.uuid();\n this.type = type;\n this.message = message;\n this.config = config;\n }\n}\n","export const CREATE_TOAST_EVENT = 'create-toast-event';\n","import {ToastMessage} from './toast-message';\nimport {ModelList} from '../common';\n\n/**\n * Represents a collection of toast messages.\n */\nexport class ToastMessageList extends ModelList<ToastMessage> {\n /**\n * Creates a new instance of ToastMessageList.\n *\n * @param toasts - Optional array of ToastMessage objects to initialize the list with.\n */\n constructor(toasts?: ToastMessage[]) {\n super(toasts);\n }\n}\n","import {ModelList} from '../common';\nimport {SearchButton} from './search-button';\n\n/**\n * Represents a list of search buttons for the RDF search\n */\nexport class SearchButtonList extends ModelList<SearchButton> {\n /**\n * Creates a new instance of SearchButtonList.\n * @param buttons - An optional array of SearchButton objects to initialize the list.\n */\n constructor(buttons?: SearchButton[]) {\n super(buttons);\n }\n}\n","import {SearchButtonList} from './search-button-list';\nimport {SearchButton} from './search-button';\nimport {Model} from '../common';\n\n/**\n * Represents the configuration for search buttons.\n */\nexport class SearchButtonConfig extends Model<SearchButtonConfig> {\n /** Indicates whether the buttons should behave as radio buttons. */\n private radio!: boolean;\n\n /** The list of search buttons. */\n private buttons!: SearchButtonList;\n\n constructor(data: { isRadio: boolean, buttons: SearchButton[] }) {\n super();\n this.setRadio(data.isRadio);\n this.setButtons(new SearchButtonList(data.buttons));\n }\n\n getButtons() {\n return this.buttons;\n }\n\n setButtons(buttons: SearchButtonList) {\n this.buttons = buttons;\n }\n\n isRadio() {\n return this.radio;\n }\n\n setRadio(isRadio: boolean) {\n this.radio = isRadio;\n }\n\n selectButton(button: SearchButton) {\n if (this.isRadio() && !button.selected) {\n this.deselectAll();\n button.selected = true;\n button.callback();\n }\n return this.copy();\n }\n\n private deselectAll() {\n this.buttons.getItems().forEach((btn) => btn.selected = false);\n }\n}\n","import {Model} from '../common';\n\n/**\n * Represents a search button in the RDF search interface.\n * @extends Model<SearchButton>\n */\nexport class SearchButton extends Model<SearchButton> {\n /** the id of the button */\n id: string;\n\n /** The label text displayed on the button */\n label: string;\n\n /** Indicates whether the button is currently selected */\n selected: boolean;\n\n /** The function to be called when the button is activated */\n callback: () => void;\n\n constructor(data: SearchButton) {\n super();\n this.id = data.id;\n this.label = data.label;\n this.selected = data.selected;\n this.callback = data.callback;\n }\n}\n","import {Suggestion} from './suggestion';\nimport {ModelList} from '../common';\n\n/**\n * Represents a list of suggestions, returned from an RDF search query.\n */\nexport class SuggestionList extends ModelList<Suggestion> {\n constructor(suggestions?: Suggestion[]) {\n super(suggestions);\n }\n}\n","import {Model} from '../common';\nimport {SuggestionList} from './suggestion-list';\nimport {AutocompleteSearchResultResponse} from './api/autocomplete-search-result-response';\nimport {Suggestion} from './suggestion';\n\n/**\n * Represents an RDF search result containing suggestions.\n */\nexport class AutocompleteSearchResult extends Model<AutocompleteSearchResult> {\n /** The list of suggestions associated with this search result. */\n private _suggestions!: SuggestionList;\n\n constructor(searchResult: AutocompleteSearchResultResponse) {\n super();\n this.setSuggestions(searchResult.suggestionList);\n }\n\n getSuggestions(): SuggestionList {\n return this._suggestions;\n }\n\n setSuggestions(suggestions: SuggestionList) {\n this._suggestions = suggestions;\n }\n\n /**\n * Sets the hovered state of the first suggestion to true, if present.\n */\n hoverFirstSuggestion() {\n return this.hoverSuggestion(this.getSuggestions().getItems()[0]);\n }\n\n /**\n * Sets the hovered state of the specified suggestion to true.\n * @param suggestion - The suggestion to be highlighted.\n */\n hoverSuggestion(suggestion: Suggestion) {\n if (suggestion) {\n this.clearHoveredState();\n suggestion.setHovered(true);\n }\n return this.copy();\n }\n\n /**\n * Sets the selected state of the specified suggestion to true.\n * Clears the selected state of all other suggestions before selecting the new one.\n * If the suggestion is already selected or is null/undefined, no action is taken.\n *\n * @param suggestion - The suggestion to be selected.\n */\n selectSuggestion(suggestion: Suggestion) {\n if (suggestion) {\n this.clearSelectedState();\n suggestion.setSelected(true);\n }\n return this.copy();\n }\n\n /**\n * Returns the selected suggestion from the list, if any.\n * @return The selected suggestion, or undefined if no suggestion is selected.\n */\n getHoveredSuggestion(): Suggestion | undefined {\n return this.getSuggestions().getItems().find((suggestion) => suggestion.isHovered());\n }\n\n /**\n * Moves the hover state to the previous suggestion in the list.\n * If the currently hovered suggestion is the first one or no suggestion is hovered,\n * no action is taken.\n */\n hoverPreviousSuggestion() {\n const currentIndex = this.getSuggestions().getItems().findIndex((suggestion) => suggestion.isHovered());\n if (currentIndex > 0) {\n this.clearHoveredState();\n this.getSuggestions().getItems()[currentIndex - 1].setHovered(true);\n }\n return this.copy();\n }\n\n /**\n * Moves the hover state to the next suggestion in the list.\n * If the currently hovered suggestion is the last one or no suggestion is hovered,\n * no action is taken.\n */\n hoverNextSuggestion() {\n const currentIndex = this.getSuggestions().getItems().findIndex((suggestion) => suggestion.isHovered());\n if (currentIndex < this.getSuggestions().getItems().length - 1) {\n this.clearHoveredState();\n this.getSuggestions().getItems()[currentIndex + 1].setHovered(true);\n }\n return this.copy();\n }\n\n /**\n * Clears the selected state of all suggestions.\n */\n clearSuggestions() {\n this.setSuggestions(new SuggestionList());\n return this.copy();\n }\n\n getByValue(value: string): Suggestion | undefined {\n return this.getSuggestions().getItems().find((suggestion) => suggestion.getValue() === value);\n }\n\n private clearSelectedState() {\n this.getSuggestions().getItems().forEach((suggestion) => suggestion.setSelected(false));\n }\n\n /**\n * Sets the hovered state of all suggestions to false.\n */\n private clearHoveredState() {\n this.getSuggestions().getItems().forEach((suggestion) => suggestion.setHovered(false));\n }\n}\n","import {Model} from '../common';\nimport {SuggestionType} from './suggestion-type';\nimport {SuggestionResponse} from './api/suggestion-response';\n\n/**\n * Represents a suggestion in the RDF search functionality.\n */\nexport class Suggestion extends Model<Suggestion> {\n /** Unique identifier for the suggestion. */\n private _id?: number;\n\n /** The type of the suggestion. */\n private _type!: SuggestionType;\n\n /** The value of the suggestion. */\n private _value!: string;\n\n /** A description of the suggestion. */\n private _description?: string;\n\n /** Whether the suggestion is hovered. The hovered suggestion is the subject of action on key press */\n private _hovered?: boolean;\n\n /** Under some conditions (holding ctrlKey/metaKey, when selecting) the suggestion needs to be opened in\n * the Graph visualization view, regardless, of the selected mode\n */\n private overrideToVisual = false;\n\n /** Whether the suggestion has been selected. When clicked, the suggestion will be selected */\n private _selected?: boolean;\n\n constructor(data: SuggestionResponse) {\n super();\n this.setId(data.id);\n this.setType(data.type);\n this.setValue(data.value);\n this.setDescription(data.description);\n }\n\n getId(): number | undefined {\n return this._id;\n }\n\n setId(id?: number): void {\n this._id = id;\n }\n\n getType(): SuggestionType {\n return this._type;\n }\n\n setType(type: SuggestionType): void {\n this._type = type;\n }\n\n getValue(): string {\n return this._value;\n }\n\n setValue(value: string): void {\n this._value = value;\n }\n\n getDescription(): string | undefined {\n return this._description;\n }\n\n setDescription(description?: string): void {\n this._description = description;\n }\n\n isHovered(): boolean | undefined {\n return this._hovered;\n }\n\n setHovered(hovered: boolean): void {\n this._hovered = hovered;\n }\n\n isSelected(): boolean | undefined {\n return this._selected;\n }\n\n setSelected(selected: boolean): void {\n this._selected = selected;\n }\n\n getOverrideToVisual(): boolean {\n return this.overrideToVisual;\n }\n\n setOverrideToVisual(override: boolean): void {\n this.overrideToVisual = override;\n }\n}\n","export enum SuggestionType {\n URI = 'uri',\n PREFIX = 'prefix',\n}\n","import {Suggestion} from './suggestion';\n\n/**\n * Event payload for when a suggestion is selected.\n */\nexport class SuggestionSelectedPayload {\n private suggestion!: Suggestion;\n private context!: string;\n\n constructor(suggestion: Suggestion, context: string) {\n this.setSuggestion(suggestion);\n this.setContext(context);\n }\n\n getSuggestion(): Suggestion {\n return this.suggestion;\n }\n\n getContext(): string {\n return this.context;\n }\n\n setContext(context: string): void {\n this.context = context;\n }\n\n setSuggestion(suggestion: Suggestion): void {\n this.suggestion = suggestion;\n }\n}\n","export enum LifecycleState {\n DATA_LOADED = 'DATA_LOADED',\n}\n","import {Model} from '../common';\nimport {PluginDefinitionList} from './plugin-definition-list';\n\n/**\n * PluginsManifest is a class that represents the manifest of plugins in the application.\n * It contains a list of plugin definitions and provides methods to access them.\n */\nexport class PluginsManifest extends Model<PluginsManifest> {\n private readonly _pluginDefinitions: PluginDefinitionList;\n\n constructor(plugins: PluginDefinitionList) {\n super();\n this._pluginDefinitions = plugins;\n }\n\n /**\n * Retrieves the list of plugin definitions in the manifest.\n * @return The PluginDefinitionList containing all plugin definitions.\n */\n getPluginDefinitions(): PluginDefinitionList {\n return this._pluginDefinitions;\n }\n}\n","export enum ExtensionPoint {\n ROUTE = 'route',\n MAIN_MENU = 'main.menu'\n}\n","import {ModelList} from '../common';\nimport {PluginDefinition} from './plugin-definition';\n\n/**\n * PluginDefinitionList is a class that extends ModelList to manage a list of PluginDefinition objects.\n */\nexport class PluginDefinitionList extends ModelList<PluginDefinition> {\n\n constructor(data?: PluginDefinition[]) {\n super(data);\n }\n}\n","import {ObjectUtil} from '../../services/utils';\nimport {ValueChangeCallback} from './value-change-callback';\nimport {Copyable} from '../common';\nimport {BeforeChangeValidationPromise} from './before-change-validation-promise';\n\n/**\n * ValueContext is a generic class for managing a value of type T. It provides functionality to set and retrieve the value,\n * as well as to subscribe to changes in the value through callback functions.\n *\n * This class ensures that the value is only updated when it changes (based on a deep equality check),\n * and subscribers are notified with a copy of the updated value if it's an object, or the value itself if it's a primitive.\n *\n * @template T - The type of the value being managed. It can be any type, including primitives and objects.\n */\nexport class ValueContext<T> {\n private value: T | undefined;\n private callbackFunctions: ValueChangeCallback<T>[] = [];\n private beforeChangeValidationPromises: BeforeChangeValidationPromise<T>[] = [];\n private afterValueChangeCallbackFunctions: ValueChangeCallback<T>[] = [];\n\n /**\n * Sets the value of the context. If the new value is different from the current value\n * (determined using a deep equality check), the value is updated and all subscribed\n * callback functions are notified.\n *\n * @param value - The new value to set for the context. If the new value differs from the current value,\n * the context is updated, and subscribers are notified.\n */\n setValue(value: T): void {\n if (!ObjectUtil.deepEqual(this.value, value)) {\n this.value = this.getCopy(value);\n this.callbackFunctions.forEach(callbackFunction => callbackFunction(this.getValue()));\n this.afterValueChangeCallbackFunctions.forEach(callbackFunction => callbackFunction(this.getValue()));\n }\n }\n\n /**\n * Retrieves the current value of the context.\n * If the value is an object, a deep copy is returned to ensure immutability.\n * For primitives, the value itself is returned.\n *\n * @returns The current value, or `undefined` if no value is set.\n */\n getValue(): T | undefined {\n return this.getCopy(this.value);\n }\n\n /**\n * Registers a <code>ValueChangeCallback</code> to be notified when the value changes. The callback function will be called\n * whenever the value is updated, and it will receive the updated value.\n *\n * Optionally, a <code>BeforeChangeValidationPromise</code> function can be provided to validate value changes before they occur.\n * This validation will be checked during the value update execution.\n *\n * This method returns a function to unsubscribe both the callback and validation promise,\n * which can be called to stop receiving updates and remove the validation.\n *\n * @param callbackFunction - The callback function to subscribe, which will be invoked with the updated\n * value of type T whenever the value changes.\n * @param beforeChangeValidationPromise - Optional validation function that returns a promise resolving to\n * a boolean indicating whether a value change should be allowed.\n * @param afterChangeCallback - Optional function called after value is updated.\n * @returns A function to unsubscribe both the callback and validation promise, removing them from their respective lists.\n */\n subscribe(\n callbackFunction: ValueChangeCallback<T | undefined>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<T>,\n afterChangeCallback?: ValueChangeCallback<T | undefined>\n ): () => void {\n this.callbackFunctions.push(callbackFunction);\n\n if (beforeChangeValidationPromise) {\n this.beforeChangeValidationPromises.push(beforeChangeValidationPromise);\n }\n\n if (afterChangeCallback) {\n this.afterValueChangeCallbackFunctions.push(afterChangeCallback);\n }\n\n return () => {\n this.callbackFunctions = this.callbackFunctions.filter(fn => fn !== callbackFunction);\n this.beforeChangeValidationPromises = this.beforeChangeValidationPromises.filter(fn => fn !== beforeChangeValidationPromise);\n this.afterValueChangeCallbackFunctions = this.afterValueChangeCallbackFunctions.filter(fn => fn !== afterChangeCallback);\n };\n }\n\n /**\n * Checks if the provided value can be used to update the context by validating it against all registered\n * validation promises.\n *\n * This method executes all registered validation functions asynchronously and returns true only if all\n * validation functions approve the update. If any validation fails or throws an error, the update is\n * considered invalid.\n *\n * @param value - The value to validate before updating the context.\n * @returns A promise that resolves to true if all validation functions approve the update, false otherwise.\n */\n async canUpdate(value: T): Promise<boolean> {\n if (this.beforeChangeValidationPromises.length === 0) {\n return true; // No validation functions registered, so the update is allowed by default.\n }\n const beforeChangePromises = this.beforeChangeValidationPromises.map(validator => validator(value));\n try {\n const allResults = await Promise.all(beforeChangePromises);\n return allResults.every(result => result);\n } catch {\n return false;\n }\n }\n\n /**\n * Creates a deep copy of the given value if it's an object. For primitives, the value itself is returned.\n *\n * @param value - The value to copy.\n * @returns A deep copy of the value if it's an object, or the value itself if it's a primitive.\n */\n private getCopy(value: T | undefined): T | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (ObjectUtil.hasCopyMethod(value)) {\n // The as unknown as Copyable<T> casting is used to tell TypeScript that value is of type Copyable<T> (even if TypeScript can't deduce it automatically).\n return (value as unknown as Copyable<T>).copy();\n }\n return ObjectUtil.deepCopy(value) as T;\n }\n}\n","import {ContextService} from './context.service';\nimport {Service} from '../../providers/service/service';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {ServiceProvider} from '../../providers';\nimport {SubscriptionList} from '../../models/common';\n\n/**\n * Describes a global subscription to value changes in any registered ContextService.\n * This is used to apply the same callback logic to all context-managed properties across services.\n */\ntype GlobalSubscription = {\n callback: ValueChangeCallback<unknown>;\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<unknown>;\n afterChangeCallback?: ValueChangeCallback<unknown>;\n};\n\n/**\n * Manages subscriptions to value changes across all registered ContextService instances.\n *\n * This class enables centralized handling of property change events, allowing consumers to subscribe\n * to all context-managed values at once, including those from context registered later.\n */\nexport class ContextSubscriptionManager implements Service {\n private readonly subscribers: GlobalSubscription[] = [];\n private readonly unsubFns: SubscriptionList = new SubscriptionList();\n\n /**\n * Subscribes a ContextService instance to all currently registered global subscriptions.\n *\n * This ensures that the provided service receives all value change notifications\n * configured through {@link subscribeToAllRegisteredContexts}.\n *\n * @param service - The ContextService instance whose properties should be globally observed.\n * @returns A function that, when called, unsubscribes this service from all global subscriptions.\n */\n subscribeToService(service: ContextService<Record<string, unknown>>): () => void {\n const unsubFns: (() => void)[] = this.subscribers.map(sub =>\n service.subscribeAll(\n sub.callback,\n sub.beforeChangeValidationPromise,\n sub.afterChangeCallback\n )\n );\n this.unsubFns.addAll(unsubFns);\n return () => unsubFns.forEach(unsub => unsub());\n }\n\n /**\n * Subscribes globally to all currently registered context services and ensures that future ones\n * receive the same callbacks as well.\n *\n * @param callback - Function that will be called for every value change.\n * @param beforeChangeValidationPromise - Optional validation function called before value is applied.\n * @param afterChangeCallback - Optional function called after value is updated.\n * @returns A function that unsubscribes from all context changes.\n */\n subscribeToAllRegisteredContexts(\n callback: ValueChangeCallback<unknown>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<unknown>,\n afterChangeCallback?: ValueChangeCallback<unknown>\n ): () => void {\n\n const services = ServiceProvider.getAllBySuperType(ContextService)\n .filter(service => service.canSubscribeAll);\n // Subscribe to already registered context services\n for (const service of services) {\n this.unsubFns.add(service.subscribeAll(callback, beforeChangeValidationPromise, afterChangeCallback));\n }\n\n const subscriber: GlobalSubscription = {\n callback,\n beforeChangeValidationPromise,\n afterChangeCallback\n };\n\n this.subscribers.push(subscriber);\n\n // Return idempotent unsubscribe function\n let unsubscribed = false;\n return () => {\n if (unsubscribed) {\n return;\n }\n unsubscribed = true;\n\n // Unsubscribe from all previously registered services\n this.unsubFns.unsubscribeAll();\n\n // Remove global subscriber\n const index = this.subscribers.indexOf(subscriber);\n if (index >= 0) {\n this.subscribers.splice(index, 1);\n }\n };\n }\n}\n","import {ValueContext} from '../../models/context/value-context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {Service} from '../../providers/service/service';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {ContextSubscriptionManager} from './context-subscription-manager';\nimport {ServiceProvider} from '../../providers';\nimport {Subscription} from '../../models/common/subscription';\nimport {SubscriptionList} from '../../models/common';\n\n/**\n * Abstract service that manages the context for various properties and allows for value retrieval, updates\n * and subscriptions to value changes.\n * The service is generic and requires a type parameter that defines the fields that the service can handle.\n * The fields are defined as properties of the service class and are used to access the context values.\n */\nexport abstract class ContextService<TFields extends Record<string, unknown>> implements Service {\n /**\n * A map that stores the context for each property, keyed by property name.\n * The context holds the value and the list of subscribers (callback functions).\n */\n // eslint-disable-next-line @typescript-eslint/consistent-generic-constructors, @typescript-eslint/no-explicit-any\n protected context: Map<string, ValueContext<any>> = new Map();\n private _canSubscribeAll = false;\n\n /**\n * After construction, register this service with the global registry.\n */\n onCreated(): void {\n this._canSubscribeAll = true;\n ServiceProvider.get(ContextSubscriptionManager).subscribeToService(this);\n }\n\n /**\n * Updates the value of a specific property.\n *\n * @param propertyName The name of the property to be updated.\n * @param value The new value to be assigned to the property.\n *\n * @template T The type of the value to be set.\n */\n updateContextProperty<T>(propertyName: string, value: T): void {\n this.getOrCreateValueContext(propertyName).setValue(value);\n }\n\n /**\n * Checks if validation passes for a value of a specific property.\n *\n * @param propertyName The name of the property to be validated and updated.\n * @param value The new value to be validated and potentially assigned to the property.\n *\n * @returns A promise that resolves to a boolean indicating whether the validation passed.\n *\n * @template T The type of the value to be validated and set.\n */\n validatePropertyChange<T>(propertyName: string, value: T): Promise<boolean> {\n const valueContext = this.getOrCreateValueContext(propertyName);\n return valueContext.canUpdate(value);\n }\n\n /**\n * Retrieves the current value of a specific property.\n *\n * @param propertyName The name of the property to retrieve the value for.\n *\n * @returns The current value of the property, or `undefined` if no value is set.\n *\n * @template T The type of the value to be returned.\n */\n protected getContextPropertyValue<T>(propertyName: string): T | undefined {\n const valueContext = this.context.get(propertyName);\n return valueContext ? valueContext.getValue() : undefined;\n }\n\n /**\n * Registers a <code>callbackFunction</code> function that will be called when the value of a property with <code>propertyName</code> changes.\n * It immediately calls the callback with the current value and then subscribes the callback for future changes to the property.\n *\n * @param propertyName The name of the property to subscribe to.\n * @param callbackFunction The callback function to be called when the property value changes.\n * It will receive the current value of the property as its argument.\n * @param beforeChangeValidationPromise Optional promise that can be used to validate the new value before it is set.\n * If the promise resolves to false, the value change will be rejected.\n * @param afterChangeCallback - Optional function called **after** the main callback with the updated value.\n *\n * @returns A function that can be called to unsubscribe from the property updates.\n *\n * @template T The type of the value that the callback function will receive.\n */\n protected subscribe<T>(propertyName: string,\n callbackFunction: ValueChangeCallback<T | undefined>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<T>,\n afterChangeCallback?: ValueChangeCallback<T | undefined>): () => void {\n\n if (callbackFunction) {\n // Call the callback immediately with the current value\n callbackFunction(this.getContextPropertyValue(propertyName));\n }\n if (afterChangeCallback) {\n afterChangeCallback(this.getContextPropertyValue(propertyName));\n }\n // Return the unsubscribe function from the context\n return this.getOrCreateValueContext<T>(propertyName).subscribe(callbackFunction, beforeChangeValidationPromise, afterChangeCallback);\n }\n\n /**\n * Subscribes globally to all fields defined in TFields.\n */\n public subscribeAll<T>(\n callbackFunction: ValueChangeCallback<T | undefined>,\n beforeChangeValidationPromise?: BeforeChangeValidationPromise<T>,\n afterChangeCallback?: ValueChangeCallback<T | undefined>\n ): Subscription {\n const unsubscribeFns: SubscriptionList = new SubscriptionList();\n // iterate through service-defined fields\n for (const key of this.getContextFields()) {\n unsubscribeFns.add(\n this.subscribe<T>(\n key,\n callbackFunction,\n beforeChangeValidationPromise,\n afterChangeCallback\n )\n );\n }\n return (): void => unsubscribeFns.unsubscribeAll();\n }\n \n /**\n * Retrieves the names of all context fields defined in the service,\n * which will be used to register change subscriptions.\n *\n * This method is part of the abstract base class for context services.\n * Each subclass defines a specific set of properties that are managed\n * through methods such as `updateProperty` and `onPropertyChanged`.\n *\n * This method generically collects all string-typed values defined in the subclass,\n * under the assumption that all such values represent valid context property names.\n * It assumes that:\n * - Subclasses will only define properties related to the context (i.e., no extra fields).\n * - These properties are managed entirely by the base service logic.\n *\n * While this design simplifies property management and change detection,\n * it is a known limitation that it does not strictly enforce property scoping.\n * It may inadvertently include properties that are not intended for context management\n * if subclasses define unrelated string values.\n *\n * **Note**: This approach is a temporary solution and will be deprecated once\n * all pages are migrated away from AngularJS. At that point, this generic behavior\n * will be replaced with more explicit and type-safe mechanisms.\n *\n * Subclasses may override this method if they wish to manually control\n * which context fields are exposed for subscription.\n *\n * @returns An array of property names (strings) to which change subscriptions should be applied.\n */\n protected getContextFields(): string[] {\n return Object.values(this).filter((value): value is string => typeof value === 'string');\n }\n \n /**\n * Retrieves the value context for a specific property or creates a new context if it doesn't exist.\n *\n * @param propertyName The name of the property to retrieve or create a context for.\n *\n * @returns The value context associated with the specified property.\n *\n * @template T The type of value to be stored in the context.\n */\n private getOrCreateValueContext<T>(propertyName: string): ValueContext<T> {\n let valueContext = this.context.get(propertyName);\n if (!valueContext) {\n valueContext = new ValueContext<T>();\n this.context.set(propertyName, valueContext);\n }\n return valueContext;\n }\n\n /**\n * Finds out if particular implementation of the ContextService contains a field with the given name. This can be used\n * to determine if the service can handle a specific field.\n * This method uses the keys of the TFields type to check if the field exists because all fields that the service can\n * handle are defined in the TFields type.\n * @param fieldName The name of the field to check.\n */\n canHandle(fieldName: string): boolean {\n // Iterate over all keys of TFields\n for (const key in this as unknown as TFields) {\n if ((this as never)[key] === fieldName) {\n return true;\n }\n }\n return false;\n }\n\n get canSubscribeAll(): boolean {\n return this._canSubscribeAll;\n }\n}\n","import {HttpRequest} from '../http/http-request';\n\n/**\n * Defines the structure for an HTTP interceptor.\n * This class allows for processing of HTTP requests or responses.\n * A class extending this can override the `process` and `shouldProcess` methods to customize the HTTP\n * request and response flow.\n */\nexport abstract class HttpInterceptor<T extends HttpRequest | Response> {\n /** Priority of the interceptor. Higher values indicate earlier execution. */\n priority = 0;\n\n /**\n * Processes an HTTP request or response.\n * This method can be used to modify or enhance the request or response.\n *\n * @param data - The original HTTP request or response to be processed.\n * @returns A promise that resolves to the processed HTTP request or response.\n */\n abstract process(data: T): Promise<T>\n\n /**\n * Determines whether the processing step should be applied to the given HTTP request or response.\n * This method allows for conditional processing based on the request's or response's properties.\n *\n * @param data - The HTTP request or response to be evaluated.\n * @returns A boolean indicating whether the processing should be applied (true) or skipped (false).\n */\n abstract shouldProcess(data: T): boolean;\n}\n","import {StorageData} from '../../models/storage';\nimport {Persistence} from './persistence';\nimport {StorageKey} from '../../models/storage';\n\n/**\n * Persistence implementation backed by the localStorage API.\n * In most cases, this class should not be used directly but extended by a service that provides additional specific\n * functionality and keys.\n */\nexport abstract class LocalStorageService implements Persistence {\n /**\n * The namespace is used to scope keys for the persistent properties by component or view. Each persistence service\n * should define a namespace to be used for the keys in the localStorage.\n */\n abstract get NAMESPACE(): string;\n\n /**\n * Sets the value for the given key in the localStorage.\n * Each implementation must implement this method to store the value in the localStorage by invoking the\n * LocalStorageService.storeValue method and eventually doing some additional work if needed, for example, notifying\n * other services about the change.\n * @param key The key to set the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n * @param value The value to set.\n */\n abstract set(key: string, value: string): void;\n\n /**\n * Getter for the localStorage implementation.\n */\n getStorage(): Storage {\n return localStorage;\n }\n\n /**\n * Returns the value of the given key from the localStorage.\n * @param key The key to get the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n */\n get(key: string): StorageData {\n const value = this.getStorage().getItem(this.getPrefixedKey(key));\n return new StorageData(value);\n }\n\n /**\n * Stores the value for the given key in the localStorage.\n * @param key The key to set the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n * @param value The value to set.\n */\n storeValue(key: string, value: string): void {\n this.getStorage().setItem(this.getPrefixedKey(key), value);\n }\n\n /**\n * Removes the value for the given key from the localStorage.\n * @param key The key to remove the value for. Every key must be prefixed with {@link StorageKey.GLOBAL_NAMESPACE}.\n */\n remove(key: string): void {\n this.getStorage().removeItem(this.getPrefixedKey(key));\n }\n\n private getPrefixedKey(key: string): string {\n const globalLocalPrefix = `${StorageKey.GLOBAL_NAMESPACE}.${this.NAMESPACE}.`;\n const localPrefix = `${this.NAMESPACE}.`;\n\n // If the key is already prefixed with the global and local namespaces, return as is\n if (key.startsWith(globalLocalPrefix)) {\n return key;\n }\n\n // If the key is prefixed with the local namespace only, add the global namespace\n if (key.startsWith(localPrefix)) {\n return `${StorageKey.GLOBAL_NAMESPACE}.${key}`;\n }\n\n // If the key is unprefixed, add both global and local namespaces\n return `${globalLocalPrefix}${key}`;\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {StorageKey} from '../../models/storage';\nimport {ServiceProvider} from '../../providers';\nimport {ContextService} from '../context';\n\n/**\n * Service that handles the storage change events and triggers the appropriate context property change handlers.\n */\nexport class LocalStorageSubscriptionHandlerService implements Service {\n\n /**\n * Handles the storage change event and triggers the appropriate context property change handlers.\n * @param event The storage change event.\n */\n handleStorageChange(event: StorageEvent): void {\n // Keys used to map properties in the local storage are in format 'storage.namespace.propertyName'.\n // The 'storage.' prefix is removed to get the namespace and property name.\n const withoutGlobalPrefix = event.key?.substring(StorageKey.GLOBAL_NAMESPACE.length + 1);\n let namespace = '';\n let contextPropertyKey = '';\n if (withoutGlobalPrefix) {\n // The namespace is the part of the key before the first '.'.\n namespace = withoutGlobalPrefix.substring(0, withoutGlobalPrefix.indexOf('.'));\n // The context property key is the part of the key after the first '.'.\n contextPropertyKey = withoutGlobalPrefix.substring(namespace.length + 1);\n }\n\n const handler = this.resolveHandler(namespace, contextPropertyKey);\n if (handler) {\n handler.updateContextProperty(contextPropertyKey, event.newValue);\n }\n }\n\n /**\n * Resolves the context property change handler for the given namespace and property name.\n * @param namespace The namespace of the context property change handler.\n * @param propertyName The property name of the context property change handler.\n */\n private resolveHandler(namespace: string, propertyName: string): ContextService<Record<string, unknown>> | undefined {\n if (!namespace) {\n console.warn('Namespace is required to resolve a context property change handler.');\n return;\n }\n const handler = ServiceProvider.getAllBySuperType(ContextService)\n .find((service) => {\n return service.canHandle(propertyName);\n });\n if (!handler) {\n console.warn(`No context property change handler found for namespace: ${namespace} and property: ${propertyName}`);\n return;\n }\n return handler as ContextService<Record<string, unknown>>;\n }\n}\n","import {LocalStorageService} from '../storage';\nimport {StorageData} from '../../models/storage';\n\n/**\n * A service for managing authentication-related local storage operations.\n */\nexport class AuthenticationStorageService extends LocalStorageService {\n private readonly jwtKey = 'jwt';\n private readonly authenticatedKey = 'authenticated';\n readonly NAMESPACE = 'auth';\n\n set(key: string, value: string) {\n this.storeValue(key, value);\n }\n\n /**\n * Retrieves the authentication token from storage.\n * @returns The stored authentication token as StorageData.\n */\n getAuthToken(): StorageData {\n return this.get(this.jwtKey);\n }\n\n setAuthenticated(authenticated: boolean) {\n this.storeValue(this.authenticatedKey, authenticated?.toString() || '');\n }\n\n isAuthenticated(): boolean {\n return this.get(this.authenticatedKey).getValue() === 'true';\n }\n}\n","import {LocalStorageService} from '../storage';\nimport {RepositoryReference} from '../../models/repositories';\n\n/**\n * Service that handles the repository related properties in the local storage.\n */\nexport class RepositoryStorageService extends LocalStorageService {\n readonly NAMESPACE = 'repository';\n\n /** Key under which the selected repository reference is stored. */\n readonly SELECTED_REPOSITORY = 'selectedRepository';\n\n /**\n * Sets a value in local storage for the given key. If the value is falsy, the key is removed instead.\n *\n * @param {string} key - The key under which to store the value.\n * @param {string} value - The value to store. If falsy, the key will be removed.\n */\n set(key: string, value: string | null): void {\n if (!value) {\n this.remove(key);\n return;\n }\n this.storeValue(key, value);\n }\n\n /**\n * Serializes and stores a RepositoryReference in local storage.\n *\n * @param {RepositoryReference} repositoryReference - The repository reference to store.\n */\n setRepositoryReference(repositoryReference: RepositoryReference): void {\n this.set(\n this.SELECTED_REPOSITORY,\n this.serializeRepositoryReference(repositoryReference)\n );\n }\n\n /**\n * Retrieves and deserializes the stored RepositoryReference from local storage.\n *\n * @returns {RepositoryReference | undefined} The deserialized repository reference, or undefined if not found.\n */\n getRepositoryReference(): RepositoryReference | undefined {\n return this.deserializeRepositoryReference(\n this.get(this.SELECTED_REPOSITORY).getValueOrDefault('{\"id\": \"\", \"location\": \"\"}')\n );\n }\n\n /**\n * Removes the stored RepositoryReference from local storage.\n */\n removeRepositoryReference(): void {\n this.remove(this.SELECTED_REPOSITORY);\n }\n\n private serializeRepositoryReference(repositoryReference: RepositoryReference): string {\n return JSON.stringify(repositoryReference);\n }\n\n private deserializeRepositoryReference(serializedRepositoryReference?: string | null): RepositoryReference | undefined {\n if (typeof serializedRepositoryReference === 'string') {\n try {\n return JSON.parse(serializedRepositoryReference);\n } catch (e) {\n console.error('Error parsing repository reference', e);\n }\n }\n return undefined;\n }\n}\n","import {ContextService} from '../context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {AuthenticatedUser, RestrictedPages, SecurityConfig, OpenIdConfig} from '../../models/security';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype SecurityContextFields = {\n readonly RESTRICTED_PAGES: string\n readonly SECURITY_CONFIG: string;\n readonly AUTHENTICATED_USER: string;\n readonly AUTH_TOKEN: string;\n readonly OPEN_ID_CONFIG: string;\n}\n\ntype SecurityContextFieldParams = {\n readonly RESTRICTED_PAGES: RestrictedPages;\n readonly SECURITY_CONFIG: SecurityConfig;\n readonly AUTHENTICATED_USER: AuthenticatedUser;\n readonly AUTH_TOKEN: string;\n readonly OPEN_ID_CONFIG: OpenIdConfig;\n}\n\n/**\n * The SecurityContextService class manages the various fields in the security context.\n */\nexport class SecurityContextService extends ContextService<SecurityContextFields> implements DeriveContextServiceContract<SecurityContextFields, SecurityContextFieldParams>, LifecycleHooks {\n readonly RESTRICTED_PAGES = 'restrictedPages';\n readonly SECURITY_CONFIG = 'securityConfig';\n readonly AUTHENTICATED_USER = 'authenticatedUser';\n readonly AUTH_TOKEN = 'jwt';\n readonly OPEN_ID_CONFIG = 'openIdConfig';\n\n /**\n * Retrieves the restricted pages for the user.\n *\n * @return a map with restricted pages.\n */\n getRestrictedPages(): RestrictedPages | undefined {\n return this.getContextPropertyValue(this.RESTRICTED_PAGES) || new RestrictedPages();\n }\n\n /**\n * Updates the restricted pages and notifies subscribers about the change.\n *\n * @param restrictedPages - an object with restricted pages.\n */\n updateRestrictedPages(restrictedPages: RestrictedPages): void {\n this.updateContextProperty(this.RESTRICTED_PAGES, restrictedPages);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the restricted pages are changed.\n *\n * @param callbackFunction - The function to call when the restricted pages are changed.\n * @returns A function to unsubscribe from updates.\n */\n onRestrictedPagesChanged(callbackFunction: ValueChangeCallback<RestrictedPages | undefined>): () => void {\n return this.subscribe(this.RESTRICTED_PAGES, callbackFunction);\n }\n\n /**\n * Subscribes to changes in the authentication token.\n *\n * @param callbackFunction - A function to be called when the auth token changes.\n * @returns A function to unsubscribe from updates.\n */\n onAuthTokenChanged(callbackFunction: ValueChangeCallback<string | undefined>): () => void {\n return this.subscribe(this.AUTH_TOKEN, callbackFunction);\n }\n\n /**\n * Updates the authentication token in the context.\n *\n * @param value - The new auth token to store.\n */\n updateAuthToken(value: string): void {\n this.updateContextProperty(this.AUTH_TOKEN, value);\n }\n\n /**\n * Retrieves the authentication token from the context.\n *\n * @returns The auth token if available, otherwise undefined.\n */\n getAuthToken(): string | undefined {\n return this.getContextPropertyValue(this.AUTH_TOKEN);\n }\n\n /**\n * Updates the security configuration in the context.\n * @param securityConfig - The new security configuration to be set.\n */\n updateSecurityConfig(securityConfig: SecurityConfig): void {\n this.updateContextProperty(this.SECURITY_CONFIG, securityConfig);\n }\n\n /**\n * Subscribes to changes in the security configuration.\n * @param callbackFunction - A function to be called when the security configuration changes.\n * @returns A function that, when called, unsubscribes from the security configuration changes.\n */\n onSecurityConfigChanged(callbackFunction: ValueChangeCallback<SecurityConfig | undefined>): () => void {\n return this.subscribe(this.SECURITY_CONFIG, callbackFunction);\n }\n\n getSecurityConfig(): SecurityConfig | undefined {\n return this.getContextPropertyValue(this.SECURITY_CONFIG);\n }\n\n /**\n * Updates the authenticated user information in the context.\n * @param authenticatedUser - The new authenticated user information to be set.\n */\n updateAuthenticatedUser(authenticatedUser: AuthenticatedUser): void {\n this.updateContextProperty(this.AUTHENTICATED_USER, authenticatedUser);\n }\n\n /**\n * Subscribes to changes in the authenticated user information.\n * @param callbackFunction - A function to be called when the authenticated user information changes.\n * @returns A function that, when called, unsubscribes from the authenticated user information changes.\n */\n onAuthenticatedUserChanged(callbackFunction: ValueChangeCallback<AuthenticatedUser | undefined>): () => void {\n return this.subscribe(this.AUTHENTICATED_USER, callbackFunction);\n }\n\n /**\n * Retrieves the authenticated user information.\n * @return the authenticated user information or undefined, if there is no user.\n */\n getAuthenticatedUser(): AuthenticatedUser | undefined {\n return this.getContextPropertyValue(this.AUTHENTICATED_USER);\n }\n\n /**\n * Updates the OpenID configuration in the context.\n *\n * @param openIdConfig - The new OpenID configuration to set.\n */\n updateOpenIdConfig(openIdConfig: OpenIdConfig): void {\n return this.updateContextProperty(this.OPEN_ID_CONFIG, openIdConfig);\n }\n\n /**\n * Retrieves the OpenID configuration from the context.\n *\n * @returns The current OpenID configuration or undefined.\n */\n getOpenIdConfig(): OpenIdConfig | undefined {\n return this.getContextPropertyValue(this.OPEN_ID_CONFIG);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {PluginRegistry} from '../../models/plugins';\n\n/**\n * Service that provides access to browser window-related functionality.\n */\nexport class WindowService implements Service {\n\n /**\n * Returns the current browser window object. The purpose of this encapsulation is to allow for\n * better testability and easier mocking of the window object in unit tests.\n */\n static getWindow(): Window {\n return window;\n }\n\n static getPluginRegistry(): PluginRegistry {\n return WindowService.getWindow().PluginRegistry;\n }\n}\n","import {WindowService} from '../window';\n\n/**\n * Redirects the current page to a specified URL using the single-spa framework.\n * Made to be used from views. If you are not navigating from a view, use <code>navigate</code> instead\n *\n * @param url - The target URL to which the page should be redirected.\n */\nexport function navigateTo(url: string): (event: Event) => void {\n return (event: Event): void => {\n if (event) {\n event.preventDefault();\n }\n navigate(url);\n };\n}\n\n/**\n * Navigates to the specified URL using the single-spa framework.\n * Suitable for in-code navigation. If you need to navigate from a view, use <code>navigateTo</code> instead.\n * @param url - The target URL to which the page should be redirected.\n */\nexport function navigate(url: string) {\n WindowService.getWindow().singleSpa.navigateToUrl(url);\n}\n\n/**\n * Opens a new tab with the specified URL.\n * @param url - The URL to open in a new tab.\n */\nexport function openInNewTab(url: string): void {\n WindowService.getWindow().open(url, '_blank');\n}\n\n/**\n * Checks if the current page is the home page.\n *\n * @returns {boolean} Returns true if the current page is the home page, false otherwise.\n */\nexport function isHomePage(): boolean {\n return getPathName() === '/';\n}\n\n/**\n * Retrieves the pathname portion of the current URL without the context prefix.\n *\n * @returns {string} The pathname of the current URL, which represents the path segment that comes after the context (if any) and before the query string.\n */\nexport function getPathName(): string {\n return WindowService.getWindow().location.pathname.substring(getContextName().length - 1);\n}\n\n/**\n * Retrieves the current URL including the context prefix, if present.\n *\n * @returns {string} The current URL including the context prefix.\n */\nexport function getOrigin(): string {\n return `${WindowService.getWindow().location.origin}${getContextName()}`;\n}\n\n/**\n * Returns the context name (base href) from the `<base>` tag in the document.\n *\n * This is usually the base path under which the app is deployed, e.g. '/graphdb/'.\n * If no `<base>` tag is found, returns '/' by default.\n *\n * @returns {string} The context path as specified in the base href (always ending with a slash).\n */\nexport function getContextName(): string {\n return document.querySelector('base')?.getAttribute('href') ?? '/';\n}\n\n/**\n * Retrieves the current route from the URL, removing the leading <code>/</code>.\n * For example:<br>\n * Calling <code>getCurrentRoute()</code> while on http://localhost:9000/sparql will return <code>\"sparql\"</code><br>\n * Calling <code>getCurrentRoute()</code> while on http://localhost:9000/graphql/endpoints will return <code>\"graphql/endpoints\"<code>\n */\nexport function getCurrentRoute(): string {\n return getPathName().substring(1);\n}\n","import {HttpInterceptor} from '../models/interceptor/http-interceptor';\nimport {HttpRequest} from '../models/http/http-request';\nimport {ModelList} from '../models/common';\nimport {AuthRequestInterceptor} from './auth/auth-request-interceptor';\nimport {UnauthorizedInterceptor} from './auth/unauthorized-interceptor';\n\n/**\n * An array of HTTP request interceptors to be used in the application.\n */\nexport const REQUEST_INTERCEPTORS = new ModelList<HttpInterceptor<HttpRequest>>([\n // Request interceptors go here\n new AuthRequestInterceptor()\n]);\n\n/**\n * An array of HTTP response interceptors to be used in the application.\n */\nexport const RESPONSE_INTERCEPTORS = new ModelList<HttpInterceptor<Response>> ([\n // Response interceptors go here\n new UnauthorizedInterceptor()\n]);\n","import {HttpRequest} from '../../models/http/http-request';\nimport {HttpInterceptor} from '../../models/interceptor/http-interceptor';\nimport {AuthenticationStorageService} from '../../services/security/authentication-storage.service';\nimport {ServiceProvider} from '../../providers';\nimport {RepositoryStorageService} from '../../services/repository/repository-storage.service';\nimport {SecurityContextService} from '../../services/security/security-context.service';\nimport {OpenIdConfig} from '../../models/security/openid-config';\n\n/**\n * AuthRequestInterceptor is responsible for intercepting HTTP requests and adding authentication\n * and repository information to the request headers.\n */\nexport class AuthRequestInterceptor extends HttpInterceptor<HttpRequest> {\n private readonly authStorage = ServiceProvider.get(AuthenticationStorageService);\n private readonly repositoryStorageService = ServiceProvider.get(RepositoryStorageService);\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n\n /**\n * Preprocesses the HTTP request by adding authentication and repository information to the headers.\n *\n * This method performs the following tasks:\n * 1. Adds an authorization token to the request headers if available.\n * 2. Adds repository ID and location to the headers if available.\n *\n * @param request - The HTTP request to be processed.\n * @returns A Promise that resolves to the modified HTTP request.\n */\n process(request: HttpRequest): Promise<HttpRequest> {\n request.headers = request.headers || {};\n request.headers['X-Requested-With'] = 'XMLHttpRequest';\n\n const authToken = this.authStorage.getAuthToken().getValue();\n if (authToken) {\n request.headers.Authorization = authToken;\n }\n\n // There are requests that need to be sent to a repository different from the currently selected one.\n // For example, in the TTYG functionality, when creating or editing an agent, there is a check to see\n // if the autocomplete is enabled for the selected agent repository.\n // So we first check if repository headers are provided before setting them in local storage.\n if (!request.headers['X-GraphDB-Repository']) {\n const repositoryReference = this.repositoryStorageService.getRepositoryReference();\n if (repositoryReference?.id) {\n request.headers['X-GraphDB-Repository'] = repositoryReference.id;\n }\n\n if (repositoryReference?.location) {\n request.headers['X-GraphDB-Repository-Location'] = repositoryReference.location;\n }\n }\n return Promise.resolve(request);\n }\n\n shouldProcess(request: HttpRequest): boolean {\n // Skip header injection if the request is part of the OpenID authentication flow\n // (e.g., token retrieval or OpenID key discovery).\n // see https://github.com/Ontotext-AD/graphdb-workbench/blob/2.8/src/js/angular/core/interceptors/authentication.interceptor.js#L12\n const openIdConfig: OpenIdConfig | undefined = this.securityContextService.getOpenIdConfig();\n if (!openIdConfig) {\n return true;\n }\n\n const openIdKeysUri = openIdConfig?.openIdKeysUri;\n const openIdTokenUrl = openIdConfig?.openIdTokenUrl;\n\n if (openIdKeysUri && openIdTokenUrl) {\n const openIDUrls = [openIdConfig?.openIdKeysUri, openIdConfig?.openIdTokenUrl];\n const isOpenIdUrl = openIDUrls.some((url) => url && request.url.indexOf(url) > -1);\n return !isOpenIdUrl;\n }\n\n return true;\n }\n}\n","import {HttpInterceptor} from '../../models/interceptor/http-interceptor';\nimport {navigate} from '../../services/utils';\nimport {WindowService} from '../../services/window';\n\nexport class UnauthorizedInterceptor extends HttpInterceptor<Response> {\n process(data: Response): Promise<Response> {\n // If backend returns 401, it means that the user is not authenticated.\n // Se we have to remove the JWT token from local storage\n if (localStorage.getItem('ontotext.gdb.auth.jwt')) {\n localStorage.removeItem('ontotext.gdb.auth.jwt');\n navigate('login');\n // There is scenario when 401 is thrown during bootstrap and\n // when user is logged the workbench is not properly loaded\n // For example if languages are not loaded.\n // So we need to reload the page to ensure that everything is loaded properly.\n WindowService.getWindow().location.reload();\n }\n return Promise.reject(data);\n }\n\n shouldProcess(data: Response): boolean {\n return 401 === data.status;\n }\n}\n","import {HttpRequest} from '../../models/http/http-request';\nimport {RESPONSE_INTERCEPTORS, REQUEST_INTERCEPTORS} from '../../interceptor/interceptors';\nimport {HttpInterceptor} from '../../models/interceptor/http-interceptor';\nimport {ModelList} from '../../models/common';\n\n/**\n * Service responsible for managing and executing HTTP interceptors.\n */\nexport class InterceptorService {\n private preProcessors = new ModelList<HttpInterceptor<HttpRequest>>();\n private postProcessors = new ModelList<HttpInterceptor<Response>>();\n\n /**\n * Initializes a new instance of the InterceptorService class.\n * This constructor sets up the default pre-processors and post-processors, defined in\n * {@link RESPONSE_INTERCEPTORS} and {@link REQUEST_INTERCEPTORS} lists.\n * It sorts the interceptors based on their priority using the sortInterceptors method.\n */\n constructor() {\n this.registerRequestInterceptors(REQUEST_INTERCEPTORS);\n this.registerResponseInterceptors(RESPONSE_INTERCEPTORS);\n }\n\n /**\n * Chains all interceptors, which {@link HttpInterceptor#shouldPreProcess should pre-process} the request.\n * @param request The initial HTTP request.\n * @returns A promise that resolves to the final processed HTTP request.\n */\n async preProcess(request: HttpRequest): Promise<HttpRequest> {\n let processedRequest = request;\n for (const interceptor of this.preProcessors.getItems()) {\n if (interceptor.shouldProcess(processedRequest)) {\n processedRequest = await interceptor.process(processedRequest);\n }\n }\n return processedRequest;\n }\n\n /**\n * Chains all interceptors, which {@link HttpInterceptor#shouldPostProcess should post process} the response.\n * @param response The initial HTTP response.\n * @returns A promise that resolves to the final processed HTTP response.\n */\n async postProcess(response: Response): Promise<Response> {\n let processedResponse = response;\n for (const interceptor of this.postProcessors.getItems()) {\n if (interceptor.shouldProcess(processedResponse)) {\n processedResponse = await interceptor.process(processedResponse);\n }\n }\n return processedResponse;\n }\n\n /**\n * Registers new pre-processors for HTTP requests.\n * Adds the provided elements to the existing pre-processors and sorts all elements again.\n *\n * @param preProcessors - A ModelList containing HttpInterceptor instances for HttpRequest objects.\n * These interceptors will be used to pre-process HTTP requests.\n */\n registerRequestInterceptors(preProcessors: ModelList<HttpInterceptor<HttpRequest>>): void {\n this.preProcessors.addItems(preProcessors.getItems());\n this.sortInterceptors(this.preProcessors);\n }\n\n /**\n * Registers new post-processors for HTTP responses.\n * Adds the provided elements to the existing postProcessors and sorts all elements again.\n *\n * @param postProcessors - An array containing HttpInterceptor instances for Response objects.\n * These interceptors will be used to post-process HTTP responses.\n */\n registerResponseInterceptors(postProcessors: ModelList<HttpInterceptor<Response>>): void {\n this.postProcessors.addItems(postProcessors.getItems());\n this.sortInterceptors(this.postProcessors);\n }\n\n private sortInterceptors<T extends HttpRequest | Response>(interceptors: ModelList<HttpInterceptor<T>>) {\n interceptors.sort((a, b) => b.priority - a.priority);\n }\n}\n","/**\n * Represents an HTTP request with its essential properties.\n */\nexport class HttpRequest {\n /** The URL of the request. */\n url: string;\n\n /** The HTTP method of the request (e.g., GET, POST, PUT, DELETE). */\n method: string;\n\n /** A key-value pair object representing the headers of the request. */\n headers: Record<string, string | undefined>;\n\n /** The body of the request. Can be of any type or undefined. */\n body?: unknown;\n\n constructor(data: HttpRequest) {\n this.url = data.url;\n this.method = data.method;\n this.headers = {...data.headers};\n this.body = data.body;\n }\n}\n","import { Event } from '../models/events';\nimport {Emitter} from './emitter';\n\n/**\n * Event emitter used for global communication within all modules. It allows emitting and subscribing to CustomEvents across\n * the application where the events are emitted via the <code>document.body</code> element. This allows for the events\n * to be caught by any component in any module.\n *\n * @template T - The type of the payload for the events.\n */\nexport class EventEmitter<T extends {} | undefined> implements Emitter {\n /**\n * Emits a {@link CustomEvent} of type <code>event.NAME</code> and detail <code>event.payload</code>.\n *\n * @param event - The event to be emitted.\n * @returns The emitted event.\n */\n emit(event: Event<T>): CustomEvent {\n const customEvent = new CustomEvent(event.NAME, { detail: event.payload });\n this.getHostElement().dispatchEvent(customEvent);\n return customEvent;\n }\n\n /**\n * Subscribes to an event of type <code>eventName</code>.\n *\n * @param eventName - The type of subscription event.\n * @param callback - The callback function that will be called when the event occurs.\n * @returns A function to unsubscribe from the event.\n */\n subscribe(eventName: string, callback: (payload: T) => void): () => void {\n const listener = (event: unknown) => {\n if (event instanceof CustomEvent) {\n callback(event.detail as T);\n }\n };\n this.getHostElement().addEventListener(eventName, listener);\n\n return () => this.getHostElement().removeEventListener(eventName, listener);\n }\n\n private getHostElement(): HTMLElement {\n return document.body;\n }\n}\n","import {HttpOptions} from '../../models/http/http-options';\nimport {InterceptorService} from '../interceptor/interceptor.service';\nimport {HttpRequest} from '../../models/http/http-request';\nimport {ServiceProvider} from '../../providers';\nimport {EventEmitter} from '../../emitters/event.emitter';\n\nconst JSON_CONTENT_TYPES = ['application/json', 'application/sparql-results+json'];\n\nexport const HTTP_REQUEST_DONE_EVENT = 'http-request-done-event';\n\n/**\n * A service class for performing HTTP requests.\n */\nexport class HttpService {\n private readonly interceptorService = ServiceProvider.get(InterceptorService);\n private readonly eventEmitter = new EventEmitter<undefined>();\n\n /**\n * Performs an HTTP GET request.\n *\n * @param url The URL to send the request to.\n * @param params (Optional) An object containing query parameters as key-value pairs.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n get<T>(url: string, params?: Record<string, string | number>, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'GET', {params, headers})\n .then((response) => {\n return response;\n });\n }\n\n /**\n * Performs an HTTP POST request.\n *\n * @param url The URL to send the request to.\n * @param body (Optional) The body of the request.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n post<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'POST', {body, headers});\n }\n\n /**\n * Performs an HTTP PUT request.\n *\n * @param url The URL to send the request to.\n * @param body (Optional) The body of the request.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n put<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'PUT', {body, headers});\n }\n\n /**\n * Performs an HTTP DELETE request.\n *\n * @param url The URL to send the request to.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n delete<T>(url: string, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'DELETE', {headers});\n }\n\n /**\n * Performs an HTTP PATCH request.\n *\n * @param url The URL to send the request to.\n * @param body (Optional) The body of the request.\n * @param headers (Optional) An object containing request headers as key-value pairs.\n * @returns A Promise that resolves to the response data of type `T`.\n */\n patch<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(url, 'PATCH', {body, headers});\n }\n\n /**\n * Path string variable can contain characters which encodeURIComponent() can have problems encoding.\n * These characters are replaced in this method.\n * @param str - a component of URI\n * @returns {string} The provided string encoded as a URI component.\n */\n protected encodeURIComponentStrict(str: string): string {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16);\n });\n }\n\n /**\n * Performs an HTTP request with the specified method and options.\n *\n * @param url The URL to send the request to.\n * @param method The HTTP method to use (GET, POST, PUT, DELETE).\n * @param options (Optional) An object containing the request options, including:\n * - `params`: Query parameters as key-value pairs.\n * - `headers`: Request headers as key-value pairs.\n * - `body`: The request body.\n * @returns A Promise that resolves with the response data of type T, or is rejected with an error if the request fails.\n */\n private request<T>(url: string, method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', options: HttpOptions = {}): Promise<T> {\n const queryString = this.buildQueryParams(options.params);\n const fullUrl = `${url}${queryString ? `?${queryString}` : ''}`;\n const headers = {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/plain, */*',\n ...options.headers,\n };\n\n return this.interceptorService.preProcess(new HttpRequest({url: fullUrl, method, headers, body: options.body}))\n .then((request) => {\n return fetch(request.url, {\n method: request.method,\n headers: request.headers as HeadersInit,\n body: request.body ? JSON.stringify(request.body) : null,\n });\n })\n .then((response) => {\n return this.interceptorService.postProcess(response);\n })\n .then((response) => {\n if (!response.ok) {\n return Promise.reject(response);\n }\n const isJson = this.hasValidJson(response);\n return (isJson ? response.json() : Promise.resolve()) as Promise<T>;\n })\n .finally(() => this.eventEmitter.emit({NAME: HTTP_REQUEST_DONE_EVENT, payload: undefined}));\n }\n\n private hasValidJson(response: Response) {\n const responseContentType = response.headers.get('Content-Type');\n if (!responseContentType) {\n return false;\n }\n return JSON_CONTENT_TYPES.some((contentType) => responseContentType.includes(contentType));\n }\n\n /**\n * Builds a query string from an object of parameters.\n *\n * @param params An object containing query parameters as key-value pairs.\n * @returns A query string suitable for appending to a URL.\n */\n private buildQueryParams(params: Record<string, string | number> = {}): string {\n // @ts-expect-error JavaScript will automatically convert numbers into strings when they are passed to URLSearchParams, TypeScript doesn't know that this is safe.\n return new URLSearchParams(params).toString();\n }\n}\n","import { HttpService } from '../http/http.service';\nimport { LanguageConfig, TranslationBundle } from '../../models/language';\n\n/**\n * Service for handling language-related REST operations.\n */\nexport class LanguageRestService extends HttpService {\n private readonly I18N_ENDPOINT = 'assets/i18n';\n\n /**\n * Retrieves the translation bundle for a specific language.\n *\n * @param languageCode - The code of the language for which to fetch translations.\n * @returns A Promise that resolves to a TranslationBundle containing the translations for the specified language.\n */\n getLanguage(languageCode: string): Promise<TranslationBundle> {\n return this.get<TranslationBundle>(`${this.I18N_ENDPOINT}/${languageCode}.json`);\n }\n\n /**\n * Fetches the language configuration for the application.\n *\n * @returns A Promise that resolves to a {@link LanguageConfig} object containing the language configuration settings.\n */\n getLanguageConfiguration(): Promise<LanguageConfig> {\n return this.get<LanguageConfig>(`${this.I18N_ENDPOINT}/language-config.json`);\n }\n}\n","import { LanguageConfig } from '../../../models/language';\nimport { Mapper } from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for LanguageConfig objects.\n */\nexport class LanguageConfigMapper extends Mapper<LanguageConfig> {\n /**\n * Maps the input data to a new LanguageConfig model instance.\n *\n * @param data - The LanguageConfig data to be mapped.\n * @returns A new LanguageConfig instance created from the input data.\n */\n mapToModel(data: LanguageConfig): LanguageConfig {\n return new LanguageConfig(data);\n }\n}\n","import {LocalStorageService} from '../storage';\n\n/**\n * Service that handles the language related properties in the local storage.\n */\nexport class LanguageStorageService extends LocalStorageService {\n readonly NAMESPACE = 'i18n';\n\n set(key: string, value: string) {\n this.storeValue(key, value);\n }\n}\n","import {ContextService} from '../context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {ServiceProvider} from '../../providers';\nimport {LanguageStorageService} from './language-storage.service';\nimport {LanguageService} from './language.service';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LanguageConfig, TranslationBundle} from '../../models/language';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype LanguageContextFields = {\n readonly SELECTED_LANGUAGE: string;\n}\n\n/**\n * The LanguageService class manages the application's language context.\n */\nexport class LanguageContextService extends ContextService<LanguageContextFields> implements DeriveContextServiceContract<LanguageContextFields>, LifecycleHooks {\n private readonly LANGUAGE_CONFIG = 'languageConfig';\n readonly SELECTED_LANGUAGE = 'selectedLanguage';\n readonly LANGUAGE_BUNDLE = 'languageBundle';\n readonly DEFAULT_BUNDLE = 'defaultBundle';\n\n /**\n * Changes the selected language of the application. This method updates the selected language and notifies\n * all subscribers about the language change.\n *\n * @param {string} locale - The new language code to set (e.g., 'en', 'fr', 'de').\n */\n updateSelectedLanguage(locale?: string): void {\n this.validatePropertyChange(this.SELECTED_LANGUAGE, locale)\n .then((shouldSet) => {\n if (shouldSet) {\n const selectedLanguage = locale || ServiceProvider.get(LanguageService).getDefaultLanguage();\n const storageService = ServiceProvider.get(LanguageStorageService);\n storageService.set(this.SELECTED_LANGUAGE, selectedLanguage);\n this.updateContextProperty(this.SELECTED_LANGUAGE, locale);\n }\n });\n }\n\n /**\n * Registers a <code>callbackFunction</code> to be called whenever the selected language changes.\n *\n * This method allows components to react to language changes in the application.\n * The callback will be triggered with the new language value whenever it changes.\n *\n * @param callbackFunction - The function to call when the selected language changes.\n * @param beforeChangeValidationPromise - Optional. A promise that will be resolved before\n * the language change is applied. This can be used to validate or prepare for the\n * language change. If the promise is resolved with false or rejects, the language change will be canceled.\n * @returns A function to unsubscribe from updates.\n */\n onSelectedLanguageChanged(callbackFunction: ValueChangeCallback<string | undefined>, beforeChangeValidationPromise?: BeforeChangeValidationPromise<string | undefined>): () => void {\n return this.subscribe(this.SELECTED_LANGUAGE, callbackFunction, beforeChangeValidationPromise);\n }\n\n /**\n * Updates the language bundle in the context.\n *\n * This method is responsible for updating the translation bundle used for\n * internationalization in the application. It updates the context property\n * associated with the language bundle.\n *\n * @param {TranslationBundle} bundle - The new translation bundle to be set.\n */\n updateLanguageBundle(bundle: TranslationBundle): void {\n this.updateContextProperty<TranslationBundle>(this.LANGUAGE_BUNDLE, bundle);\n }\n\n /**\n * Registers a callback function to be called whenever the language bundle changes.\n *\n * @param {ValueChangeCallback<TranslationBundle | undefined>} callbackFunction - The function to call when the language bundle changes.\n * This function will receive the new TranslationBundle as its parameter, or undefined if the bundle is cleared.\n */\n onLanguageBundleChanged(callbackFunction: ValueChangeCallback<TranslationBundle | undefined>): () => void {\n return this.subscribe(this.LANGUAGE_BUNDLE, callbackFunction);\n }\n\n /**\n * Updates the default language bundle in the context.\n *\n * This method sets a new default translation bundle for the application.\n * It's typically used to store a fallback bundle that can be used when\n * the primary language bundle is not available or incomplete.\n *\n * @param {TranslationBundle} bundle - The new default translation bundle to be set.\n */\n updateDefaultBundle(bundle: TranslationBundle): void {\n this.updateContextProperty<TranslationBundle>(this.DEFAULT_BUNDLE, bundle);\n }\n\n /**\n * Retrieves the current default language bundle from the context.\n *\n * This method returns the default translation bundle that was previously\n * set using the updateDefaultBundle method. If no default bundle has been\n * set, it returns undefined.\n *\n * @returns {TranslationBundle | undefined} The current default translation bundle,\n * or undefined if no default bundle has been set.\n */\n getDefaultBundle(): TranslationBundle | undefined {\n return this.getContextPropertyValue(this.DEFAULT_BUNDLE);\n }\n\n /**\n * Retrieves the current language configuration from the context.\n *\n * @returns {LanguageConfig | undefined} The current language configuration,\n * or undefined if no configuration has been set.\n */\n getLanguageConfig(): LanguageConfig | undefined {\n return this.getContextPropertyValue(this.LANGUAGE_CONFIG);\n }\n\n /**\n * Sets a new language configuration in the context.\n *\n * @param {LanguageConfig} languageConfig - The new language configuration to be set.\n */\n setLanguageConfig(languageConfig?: LanguageConfig) {\n this.updateContextProperty(this.LANGUAGE_CONFIG, languageConfig);\n }\n\n /**\n * Retrieves the currently selected language from the context.\n *\n * @returns {string | undefined} The code of the currently selected language.\n * Returns undefined if no language has been selected or set in the context.\n *\n */\n getSelectedLanguage(): string | undefined {\n return this.getContextPropertyValue(this.SELECTED_LANGUAGE);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {TranslationBundle} from '../../models/language';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {LanguageConfig} from '../../models/language';\nimport {LanguageRestService} from './language-rest.service';\nimport {LanguageConfigMapper} from './mappers/language-config-mapper';\nimport {LanguageContextService} from './language-context.service';\n\n/**\n * The LanguageService class is responsible for fetching language-related data from the backend\n * and mapping the responses to the workbench models.\n */\nexport class LanguageService implements Service {\n private readonly languageRestService: LanguageRestService = ServiceProvider.get(LanguageRestService);\n private readonly languageContextService: LanguageContextService = ServiceProvider.get(LanguageContextService);\n\n /**\n * Retrieves an array of supported language codes.\n *\n * This function fetches the language configuration from the storage service\n * and extracts the list of supported language codes. If no configuration\n * is found, it returns a default array with 'en' and 'fr'.\n *\n * @returns {string[]} An array of supported language codes.\n */\n getSupportedLanguages(): string[] {\n const languageConfig = this.languageContextService.getLanguageConfig();\n return languageConfig ? languageConfig.availableLanguages.getLanguageCodes() : ['en', 'fr'];\n }\n\n /**\n * Retrieves the translation bundle for a specified language.\n *\n * @param {string} languageCode - The code of the language for which to fetch the translation bundle.\n * @returns {Promise<TranslationBundle>} A promise that resolves to a TranslationBundle object\n * containing the translations for the specified language.\n */\n getLanguage(languageCode: string): Promise<TranslationBundle> {\n return this.languageRestService.getLanguage(languageCode);\n }\n\n /**\n * Retrieves the language configuration from the server and maps it to a LanguageConfig model.\n *\n * @returns {Promise<LanguageConfig>} A promise that resolves to a LanguageConfig object\n * representing the current language configuration.\n */\n getLanguageConfiguration(): Promise<LanguageConfig> {\n return this.languageRestService.getLanguageConfiguration()\n .then(config => MapperProvider.get(LanguageConfigMapper).mapToModel(config));\n }\n\n /**\n * Retrieves the default language code from the stored language configuration.\n *\n * This function attempts to fetch the language configuration from the storage service\n * and extract the default language code. If no configuration is found, it returns 'en'\n * (English) as the default language.\n *\n * @returns {string} The default language code. Returns 'en' if no configuration is found.\n */\n getDefaultLanguage(): string {\n const languageConfig = this.languageContextService.getLanguageConfig();\n return languageConfig ? languageConfig.defaultLanguage : 'en';\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {Repository, RepositorySizeInfo} from '../../models/repositories';\n\nexport class RepositoryRestService extends HttpService {\n\n static readonly REPOSITORIES_ENDPOINT = 'rest/repositories';\n\n getRepositories(): Promise<Record<string, unknown[]>> {\n return this.get(`${RepositoryRestService.REPOSITORIES_ENDPOINT}/all`);\n }\n\n getRepositorySizeInfo(repository: Repository): Promise<RepositorySizeInfo> {\n return this.get(`${RepositoryRestService.REPOSITORIES_ENDPOINT}/${repository.id}/size?location=${encodeURIComponent(repository.location)}`);\n }\n}\n","import { Repository } from '../../../models/repositories';\nimport { Mapper } from '../../../providers/mapper/mapper';\n\n/**\n * A class containing functions to map various server responses to specific repository models.\n */\nexport class RepositoryMapper extends Mapper<Repository> {\n\n /**\n * Maps the raw data to an instance of the {@link Repository} model.\n *\n * @param {Repository} data - The raw data to be transformed into a Repository model.\n * @returns {Repository} - A new Repository instance.\n */\n mapToModel(data: Partial<Repository>): Repository {\n return new Repository(data);\n }\n}\n","import { Mapper } from '../../../providers/mapper/mapper';\nimport { Repository, RepositoryList } from '../../../models/repositories';\nimport { RepositoryMapper } from './repository.mapper';\nimport { MapperProvider } from '../../../providers';\n\n/**\n * Maps server response data to a {@link RepositoryList} model.\n *\n * This mapper processes repository data grouped by location into a flat list of {@link Repository}\n * instances wrapped in a {@link RepositoryList}.\n */\nexport class RepositoryListMapper extends Mapper<RepositoryList> {\n private repositoryMapper: Mapper<Repository>;\n\n constructor() {\n super();\n this.repositoryMapper = MapperProvider.get(RepositoryMapper);\n }\n\n /**\n * Maps the raw data to an instance of the {@link RepositoryList} model.\n *\n * @param data - The raw server response containing repositories grouped by location URLs.\n * The structure is a record where keys are location URLs and values are arrays of repository data.\n * @returns A {@link RepositoryList} model containing all repositories as a flat list.\n */\n mapToModel(data?: Record<string, unknown[]>): RepositoryList {\n if (!data || typeof data !== 'object') {\n return new RepositoryList();\n }\n\n const repositories: Repository[] = [];\n\n Object.entries(data).forEach(([, repositoriesData]) => {\n if (Array.isArray(repositoriesData)) {\n repositoriesData.forEach((repositoryData) => {\n const repository = this.repositoryMapper.mapToModel(repositoryData);\n repositories.push(repository);\n });\n }\n });\n\n return new RepositoryList(repositories);\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {RepositorySizeInfo} from '../../../models/repositories';\n\nexport class RepositorySizeInfoMapper extends Mapper<RepositorySizeInfo> {\n\n /**\n * Maps the raw data to an instance of the {@link RepositorySizeInfo} model.\n *\n * @returns {RepositorySizeInfo} - A new RepositorySizeInfo instance.\n */\n mapToModel(data: Partial<RepositorySizeInfo>): RepositorySizeInfo {\n return new RepositorySizeInfo(data);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {RepositoryRestService} from './repository-rest.service';\nimport {Repository, RepositoryList} from '../../models/repositories';\nimport {RepositoryListMapper} from './mappers/repository-list.mapper';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {RepositorySizeInfo} from '../../models/repositories';\nimport {RepositorySizeInfoMapper} from './mappers/repository-size-info.mapper';\nimport {Mapper} from '../../providers/mapper/mapper';\n\n/**\n * The RepositoryService class is responsible for fetching repository-related data from the backend\n * and mapping the responses to application models.\n */\nexport class RepositoryService implements Service {\n private readonly GRAPHQL_REPO_AUTHORITY = 'GRAPHQL';\n private repositoryRestService: RepositoryRestService;\n private repositoryListMapper: Mapper<RepositoryList>;\n private repositorySizeInfoMapper: Mapper<RepositorySizeInfo>;\n\n constructor() {\n this.repositoryRestService = ServiceProvider.get(RepositoryRestService);\n this.repositoryListMapper = MapperProvider.get(RepositoryListMapper);\n this.repositorySizeInfoMapper = MapperProvider.get(RepositorySizeInfoMapper);\n }\n\n /**\n * Retrieves the list of repositories.\n *\n * @returns A promise that resolves to the list of repositories.\n */\n getRepositories(): Promise<RepositoryList> {\n return this.repositoryRestService\n .getRepositories()\n .then((response) => {\n return this.repositoryListMapper.mapToModel(response);\n });\n }\n\n /**\n * Retrieves triple information for the specified <code>repository</code>.\n *\n * @param repository The repository for which to retrieve size information.\n * @returns A promise that resolves to a {@link RepositorySizeInfo} object containing the repository's triple details.\n */\n getRepositorySizeInfo(repository: Repository): Promise<RepositorySizeInfo> {\n return this.repositoryRestService.getRepositorySizeInfo(repository)\n .then(this.repositorySizeInfoMapper.mapToModel);\n }\n\n isSystemRepository(repository: Repository): boolean {\n return repository.id === 'SYSTEM';\n }\n\n getCurrentGqlRepoAuthority(action: string, repoId: string): string {\n return `${this.getCurrentRepoAuthority(action, repoId)}:${this.GRAPHQL_REPO_AUTHORITY}`;\n }\n\n getOverallGqlRepoAuthority(action: string): string {\n return `${this.getOverallRepoAuthority(action)}:${this.GRAPHQL_REPO_AUTHORITY}`;\n }\n\n getLocationSpecificId(repo: Repository): string {\n return repo.location ? `${repo.id}@${repo.location}` : repo.id;\n }\n\n getCurrentRepoAuthority(action: string, repoId: string): string {\n return `${action}_REPO_${repoId}`;\n }\n\n getOverallRepoAuthority(action: string): string {\n return `${action}_REPO_*`;\n }\n}\n","import {ContextService} from '../context';\nimport {Repository, RepositoryList, RepositoryReference} from '../../models/repositories';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ServiceProvider} from '../../providers';\nimport {RepositoryStorageService} from './repository-storage.service';\nimport {BeforeChangeValidationPromise} from '../../models/context/before-change-validation-promise';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype RepositoryContextFields = {\n readonly REPOSITORY_LIST: string;\n readonly SELECTED_REPOSITORY: string;\n}\n\ntype RepositoryContextFieldParams = {\n readonly REPOSITORY_LIST: RepositoryList;\n readonly SELECTED_REPOSITORY: RepositoryReference;\n};\n\n/**\n * The RepositoryContextService class manages the application's repository context.\n */\nexport class RepositoryContextService extends ContextService<RepositoryContextFields> implements DeriveContextServiceContract<RepositoryContextFields, RepositoryContextFieldParams>, LifecycleHooks {\n readonly SELECTED_REPOSITORY = 'selectedRepository';\n readonly REPOSITORY_LIST = 'repositoryList';\n\n /**\n * Updates the selected repository and notifies subscribers about the change.\n *\n * @param [repositoryReference] - The new repository to set as selected. Optional.\n */\n updateSelectedRepository(repositoryReference?: RepositoryReference): void {\n const storageService = ServiceProvider.get(RepositoryStorageService);\n const selectedRepository = this.findRepository(repositoryReference);\n\n this.validatePropertyChange(this.SELECTED_REPOSITORY, selectedRepository)\n .then((canChange) => {\n if (canChange) {\n if (selectedRepository) {\n storageService.setRepositoryReference(selectedRepository.toRepositoryReference());\n } else if (!repositoryReference) {\n storageService.removeRepositoryReference();\n }\n this.updateContextProperty(this.SELECTED_REPOSITORY, selectedRepository);\n }\n });\n }\n\n /**\n * Retrieves the currently selected repository.\n */\n getSelectedRepository(): Repository | undefined {\n return this.getContextPropertyValue(this.SELECTED_REPOSITORY);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the selected repository changes.\n *\n * @param callbackFunction - The function to call when the selected repository changes.\n * @param beforeChangeValidationPromise - Optional. A promise that will be resolved before\n * the repository change is applied. This can be used to validate or prepare for the\n * repository change. If the promise is resolved with false or rejects, the repository change will be canceled.\n * @returns A function to unsubscribe from updates.\n */\n onSelectedRepositoryChanged(callbackFunction: ValueChangeCallback<Repository | undefined>, beforeChangeValidationPromise?: BeforeChangeValidationPromise<Repository | undefined>): () => void {\n return this.subscribe(this.SELECTED_REPOSITORY, callbackFunction, beforeChangeValidationPromise);\n }\n\n /**\n * Updates the list with repositories and notifies subscribers about the change.\n *\n * @param repositories - The new list with repositories.\n */\n updateRepositoryList(repositories: RepositoryList): void {\n return this.updateContextProperty(this.REPOSITORY_LIST, repositories);\n }\n\n /**\n * Retrieves the list of repositories from the current context.\n *\n * @returns {RepositoryList} The list of repositories. Returns an empty RepositoryList if none is found.\n */\n getRepositoryList(): RepositoryList {\n return this.getContextPropertyValue(this.REPOSITORY_LIST) || new RepositoryList([]);\n }\n\n /**\n *\n * Registers the <code>callbackFunction</code> to be called whenever the repository list changes.\n *\n * @param callbackFunction - The function to call when the repository list changes.\n * @returns A function to unsubscribe from updates.\n */\n onRepositoryListChanged(callbackFunction: ValueChangeCallback<RepositoryList | undefined>): () => void {\n return this.subscribe(this.REPOSITORY_LIST, callbackFunction);\n }\n\n /**\n * Finds and returns a repository matching the given repository reference.\n *\n * @param {RepositoryReference} repositoryReference - The reference containing `id` and `location` to identify the repository.\n * @returns {Repository | undefined} The matching repository if found; otherwise, undefined.\n */\n private findRepository(repositoryReference?: RepositoryReference): Repository | undefined {\n if (!repositoryReference) {\n return undefined;\n }\n return this.getRepositoryList().findRepository(repositoryReference.id, repositoryReference.location);\n }\n}\n","import {RepositoryLocation} from '../../models/repository-location';\nimport {HttpService} from '../http/http.service';\n\nexport class RepositoryLocationRestService extends HttpService {\n getActiveRepositoryLocation(): Promise<RepositoryLocation> {\n return this.get('rest/locations/active');\n }\n}\n","import {RepositoryLocation} from '../../../models/repository-location';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * A class containing functions to map various server responses to specific repository location models.\n */\nexport class RepositoryLocationMapper extends Mapper<RepositoryLocation> {\n\n /**\n * Maps the raw data to an instance of the {@link RepositoryLocation} model.\n *\n * @param {Partial<RepositoryLocation>} data - The raw data to be transformed into a RepositoryLocation model.\n * @returns {RepositoryLocation} - A new Repository instance.\n */\n mapToModel(data: Partial<RepositoryLocation>): RepositoryLocation {\n return new RepositoryLocation(data);\n }\n}\n","import {RepositoryLocationRestService} from './repository-location-rest.service';\nimport {RepositoryLocation} from '../../models/repository-location';\nimport {RepositoryLocationMapper} from './mappers/repository-location.mapper';\nimport {Service} from '../../providers/service/service';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {Mapper} from '../../providers/mapper/mapper';\n\n/**\n * The RepositoryLocationService class is responsible for fetching repository-location-related data from the backend\n * and mapping the responses to application models.\n */\nexport class RepositoryLocationService implements Service {\n private locationRestService: RepositoryLocationRestService;\n private repositoryLocationMapper: Mapper<RepositoryLocation>;\n\n constructor() {\n this.locationRestService = ServiceProvider.get(RepositoryLocationRestService);\n this.repositoryLocationMapper = MapperProvider.get(RepositoryLocationMapper);\n }\n\n /**\n * Retrieves the current repository location.\n *\n * @returns A promise resolving to the active repository location.\n */\n getActiveRepositoryLocation(): Promise<RepositoryLocation> {\n return this.locationRestService\n .getActiveRepositoryLocation()\n .then(this.repositoryLocationMapper.mapToModel);\n }\n}\n","import {ContextService} from '../context';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {RepositoryLocation} from '../../models/repository-location';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype RepositoryLocationContextFields = {\n readonly ACTIVE_REPOSITORY_LOCATION: string;\n readonly IS_LOADING: string;\n}\n\ntype RepositoryLocationContextFieldParams = {\n readonly ACTIVE_REPOSITORY_LOCATION: RepositoryLocation;\n readonly IS_LOADING: boolean;\n};\n\n/**\n * The RepositoryLocationContextService class manages the application's repository location context.\n */\nexport class RepositoryLocationContextService extends ContextService<RepositoryLocationContextFields> implements DeriveContextServiceContract<RepositoryLocationContextFields, RepositoryLocationContextFieldParams>, LifecycleHooks {\n\n readonly ACTIVE_REPOSITORY_LOCATION = 'activeRepositoryLocation';\n readonly IS_LOADING = 'isLoading';\n\n /**\n * Updates the active repository location and notifies subscribers about the change.\n *\n * @param repositoryLocation - The repository location to set as active.\n */\n updateActiveRepositoryLocation(repositoryLocation: RepositoryLocation): void {\n this.updateContextProperty(this.ACTIVE_REPOSITORY_LOCATION, repositoryLocation);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the active location changes.\n *\n * @param callbackFunction - The function to execute when the repository location changes.\n * @returns A function to unsubscribe from notifications.\n */\n onActiveLocationChanged(callbackFunction: ValueChangeCallback<RepositoryLocation | undefined>): () => void {\n return this.subscribe(this.ACTIVE_REPOSITORY_LOCATION, callbackFunction);\n }\n\n /**\n * Updates the loading state and notifies subscribers about the change.\n *\n * @param isLoading - The new loading state.\n */\n updateIsLoading(isLoading: boolean): void {\n this.updateContextProperty(this.IS_LOADING, isLoading);\n }\n\n /**\n * Registers the <code>callbackFunction</code> to be called whenever the loading state changes.\n *\n * @param callbackFunction - The function to execute when the loading state changes.\n * @returns A function to unsubscribe from notifications.\n */\n onIsLoadingChanged(callbackFunction: ValueChangeCallback<boolean | undefined>): () => void {\n return this.subscribe(this.IS_LOADING, callbackFunction);\n }\n}\n","import { License } from '../../models/license';\nimport { HttpService } from '../http/http.service';\n\n/**\n * Service class for handling REST API calls related to license operations.\n * Extends the HttpService to utilize its HTTP request capabilities.\n */\nexport class LicenseRestService extends HttpService {\n /**\n * Retrieves the current license information from the GraphDB settings.\n *\n * This method sends a GET request to the '/rest/graphdb-settings/license' endpoint\n * to fetch the license details.\n *\n * @returns A Promise that resolves to a License object containing the current license information.\n */\n getLicense(): Promise<License> {\n return this.get<License>('rest/graphdb-settings/license');\n }\n}\n","import { Mapper } from '../../../providers/mapper/mapper';\nimport { License } from '../../../models/license';\n\n/**\n * Mapper for Graph DB license object. Maps the API JSON response to {@link License}\n */\nexport class LicenseMapper extends Mapper<License> {\n\n /**\n * Map to {@link License} object\n *\n * @param {Partial<License>} data - The raw representation of the license object\n * @returns {License} - A new License instance\n */\n mapToModel(data: Partial<License>): License {\n return new License(data);\n }\n}\n","import {License} from '../../models/license';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype LicenseContextFields = {\n readonly GRAPHDB_LICENSE: string;\n}\n\ntype LicenseContextFieldParams = {\n readonly GRAPHDB_LICENSE: License;\n};\n\n/**\n * Service for managing license context in the application.\n * Extends the base ContextService to provide license-specific functionality.\n */\nexport class LicenseContextService extends ContextService<LicenseContextFields> implements DeriveContextServiceContract<LicenseContextFields, LicenseContextFieldParams>, LifecycleHooks {\n readonly GRAPHDB_LICENSE = 'graphDbLicense';\n\n /**\n * Updates the license information in the context.\n * @param license - The new License object to be set in the context.\n */\n updateGraphdbLicense(license: License | undefined): void {\n this.updateContextProperty(this.GRAPHDB_LICENSE, license);\n }\n\n /**\n * Subscribes to changes in the license context\n *\n * @param callbackFn - A callback function that will be called when the license changes.\n * The callback receives the updated License object or undefined as its parameter.\n * @returns A function that, when called, will unsubscribe from the license changes.\n */\n onLicenseChanged(callbackFn: ValueChangeCallback<License | undefined>): () => void {\n return this.subscribe(this.GRAPHDB_LICENSE, callbackFn);\n }\n\n /**\n * Retrieves the license information from the context.\n *\n * @return the license information or undefined, if there is no license.\n */\n getLicense(): License | undefined {\n return this.getContextPropertyValue(this.GRAPHDB_LICENSE);\n }\n}\n","import {LicenseRestService} from './license-rest.service';\nimport {ServiceProvider} from '../../providers';\nimport {License} from '../../models/license';\nimport {LicenseMapper} from './mappers/license-mapper';\nimport {Service} from '../../providers/service/service';\nimport {LicenseContextService} from './license-context.service';\n\n/**\n * Service class for handling license-related operations.\n */\nexport class LicenseService implements Service {\n private readonly licenseRestService: LicenseRestService = ServiceProvider.get(LicenseRestService);\n private readonly licenseMapper: LicenseMapper = ServiceProvider.get(LicenseMapper);\n private readonly trackableProductTypes = ['free', 'sandbox'];\n private readonly trackableTypesOfUse = ['evaluation', 'this is an evaluation license'];\n\n /**\n * Retrieves the current license information.\n *\n * This function fetches the current license data from the license REST service\n * and maps the response to a License model object.\n *\n * @returns {Promise<License>} A Promise that resolves to a License object representing the current license.\n */\n getLicense(): Promise<License> {\n return this.licenseRestService.getLicense()\n .then(response => this.licenseMapper.mapToModel(response));\n }\n\n /**\n * Determines if the current license can be tracked.\n *\n * This function checks the product type and type of use of the current license\n * to determine if it's a trackable license. A license is considered trackable if:\n * - A license is not present, or\n * - The product type is 'free', or\n * - The product type is `sandbox`, or\n * - The type of use is `evaluation` (case-insensitive), or\n * - The type of use is `this is an evaluation license` (case-insensitive)\n *\n * @returns {boolean} True if the license is a free license, false otherwise.\n */\n isTrackableLicense(): boolean {\n const license = ServiceProvider.get(LicenseContextService).getLicense();\n const licenseTypeOfUse = license?.typeOfUse?.toLowerCase() || '';\n const productType = license?.productType?.toLowerCase() || '';\n return !license?.present\n || this.trackableProductTypes.includes(productType)\n || this.trackableTypesOfUse.includes(licenseTypeOfUse);\n }\n}\n","import { ContextService } from '../context';\nimport { ProductInfo } from '../../models/product-info';\nimport { ValueChangeCallback } from '../../models/context/value-change-callback';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype ProductInfoContextFields = {\n readonly PRODUCT_INFO: string;\n};\n\ntype ProductInfoContextFieldParams = {\n readonly PRODUCT_INFO: ProductInfo;\n};\n\n/**\n * Service for managing product information context.\n */\nexport class ProductInfoContextService extends ContextService<ProductInfoContextFields> implements DeriveContextServiceContract<ProductInfoContextFields, ProductInfoContextFieldParams>, LifecycleHooks {\n readonly PRODUCT_INFO = 'productInfo';\n\n /**\n * Updates the product information in the context.\n *\n * @param productInfo - The new ProductInfo object to be set in the context.\n */\n updateProductInfo(productInfo: ProductInfo): void {\n this.updateContextProperty(this.PRODUCT_INFO, productInfo);\n }\n\n /**\n * Subscribes to changes in the product information context.\n *\n * @param callbackFn - A callback function that will be called when the product information changes.\n * The callback receives the updated ProductInfo object or undefined as its parameter.\n * @returns A function that, when called, will unsubscribe from the product information changes.\n */\n onProductInfoChanged(callbackFn: ValueChangeCallback<ProductInfo | undefined>): () => void {\n return this.subscribe(this.PRODUCT_INFO, callbackFn);\n }\n}\n","import { ProductInfo } from '../../../models/product-info';\nimport { Mapper } from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for ProductInfo objects.\n *\n * This class extends the generic Mapper class, specializing in mapping\n * partial ProductInfo data to complete ProductInfo models.\n */\nexport class ProductInfoMapper extends Mapper<ProductInfo> {\n /**\n * Maps partial ProductInfo data to a complete ProductInfo model.\n *\n * This method takes partial ProductInfo data and creates a new ProductInfo\n * instance, ensuring that all necessary properties are properly initialized.\n *\n * @param data - Partial data of ProductInfo. This can include any subset of\n * ProductInfo properties.\n * @returns A new instance of ProductInfo populated with the provided data.\n */\n mapToModel(data: Partial<ProductInfo>): ProductInfo {\n return new ProductInfo(data);\n }\n}\n","import { ProductInfo } from '../../models/product-info';\nimport { HttpService } from '../http/http.service';\n\n/**\n * Service for product information REST calls.\n */\nexport class ProductInfoRestService extends HttpService {\n private readonly VERSION_URL = 'rest/info/version';\n\n /**\n * Retrieves the local version information of the product.\n *\n * This method sends a GET request to the 'rest/info/version' endpoint with a <code>local=1</code> query parameter\n * to fetch the local version details of the product. The value of the <code>local</code> query parameter\n * does not matter. The presence of it will result in the server returning the local version details.\n *\n * @returns A Promise that resolves to a ProductInfo object containing the local version information.\n */\n getProductInfoLocal(): Promise<ProductInfo> {\n return this.get<ProductInfo>(`${this.VERSION_URL}?local=1`);\n }\n}\n","import { Service } from '../../providers/service/service';\nimport { service } from '../../providers';\nimport { ProductInfo } from '../../models/product-info';\nimport { ProductInfoMapper } from './mappers/product-info.mapper';\nimport { ProductInfoRestService } from './product-info-rest.service';\n\n/**\n * Service responsible for retrieving and managing product information.\n */\nexport class ProductInfoService implements Service {\n private readonly productInfoMapper: ProductInfoMapper = service(ProductInfoMapper);\n private readonly productInfoService: ProductInfoRestService = service(ProductInfoRestService);\n\n /**\n * Retrieves the local version information of the product.\n *\n * This function fetches the local version data from the license REST service\n * and maps the response to a ProductInfo model object.\n *\n * @returns {Promise<ProductInfo>} A Promise that resolves to a ProductInfo object\n * containing the local version information of the product.\n */\n async getProductInfoLocal(): Promise<ProductInfo> {\n const response = await this.productInfoService.getProductInfoLocal();\n return this.productInfoMapper.mapToModel(response);\n }\n}\n","import {SecurityConfig} from '../../../models/security/security-config';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting partial SecurityConfig objects to complete SecurityConfig models.\n */\nexport class SecurityConfigMapper extends Mapper<SecurityConfig> {\n /**\n * Maps the raw data to an instance of the {@link SecurityConfig} model.\n *\n * @returns {SecurityConfig} - A new SecurityConfig instance.\n */\n mapToModel(data: Partial<SecurityConfig>): SecurityConfig {\n return new SecurityConfig(data);\n }\n}\n","/**\n * Represents an observer for events, encapsulating a callback to handle event notifications.\n *\n * @template T - The type of the event payload.\n */\nexport class EventObserver<T> {\n\n /**\n * A callback function to notify the observer of an event.\n *\n * @param eventPayload - The payload of the event to notify the observer about.\n */\n notify: (eventPayload: T) => void;\n\n constructor(callback: (payload: T) => void) {\n this.notify = callback;\n }\n}\n","import {Event} from '../../models/events';\nimport {Service} from '../../providers/service/service';\nimport {ObjectUtil} from '../utils';\nimport {EventObserver} from '../../models/events/event-observer';\n\n/**\n * A service that manages event subscriptions and emissions.\n *\n * Allows components or modules to subscribe to specific events and be notified when those events are emitted.\n */\nexport class EventService implements Service {\n\n /**\n * A map of event names to their corresponding list of subscribers.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private eventSubscribers: Map<string, EventObserver<any>[]> = new Map<string, EventObserver<any>[]>();\n\n /**\n * Emits an event to all subscribers of the specified event type.\n *\n * @template T - The type of the event payload.\n * @param event - The event to emit, containing its name and payload.\n */\n emit<T extends {} | undefined>(event: Event<T>): void {\n const subscribers = this.eventSubscribers.get(event.NAME);\n if (subscribers) {\n subscribers.forEach((subscriber) => {\n subscriber.notify(ObjectUtil.deepCopy(event.payload));\n });\n }\n }\n\n /**\n * Subscribes to a specific event with a callback function.\n *\n * @template T - The type of the event payload.\n * @param eventName - The name of the event to subscribe to.\n * @param callback - A callback function to handle the event notifications.\n *\n * @returns A function to unsubscribe from the event.\n */\n subscribe<T extends {} | undefined>(eventName: string, callback: (payload: T) => void): () => void {\n const observer = new EventObserver<T>(callback);\n const eventSubscribers = this.eventSubscribers.get(eventName);\n\n if (eventSubscribers) {\n eventSubscribers.push(observer);\n } else {\n this.eventSubscribers.set(eventName, [observer]);\n }\n return () => this.unsubscribe(eventName, observer);\n }\n\n /**\n * Unsubscribes an observer from a specific event type.\n *\n * @template T - The type of the event payload.\n * @param eventName - The name of the event to unsubscribe from.\n * @param observer - The observer to remove from the subscribers list.\n *\n * @private\n */\n private unsubscribe<T extends {} | undefined>(eventName: string, observer: EventObserver<T>): void {\n const eventSubscribers = this.eventSubscribers.get(eventName);\n if (eventSubscribers) {\n const index = eventSubscribers.indexOf(observer);\n if (index !== -1) {\n eventSubscribers.splice(index, 1);\n }\n if (eventSubscribers.length === 0) {\n this.eventSubscribers.delete(eventName);\n }\n }\n }\n}\n","import {ModelList} from '../common';\n\n/**\n * Represents a pair of a regular expression and its associated route parameters.\n * This class is used for route matching and parameter extraction for the plugin system.\n */\nexport class RouteRegexParamPair {\n private regex!: RegExp;\n private routeParams!: ModelList<string>;\n\n constructor(regex: RegExp, routeParams: ModelList<string>) {\n this.setRegex(regex);\n this.setRouteParams(routeParams);\n }\n\n getRegex(): RegExp {\n return this.regex;\n }\n\n setRegex(regex: RegExp): RouteRegexParamPair {\n this.regex = regex;\n return this;\n }\n\n getRouteParams(): ModelList<string> {\n return this.routeParams;\n }\n\n setRouteParams(routeParams: ModelList<string>): RouteRegexParamPair {\n this.routeParams = routeParams;\n return this;\n }\n}\n","import {ExternalRouteItemModel} from './external-route-item-model';\n\n/**\n * Represents a route plugin item in the application's routing system.\n * This class encapsulates all properties needed to define a route\n * including its URL, associated module, controller, and access permissions.\n */\nexport class RouteItemModel {\n private _url: string;\n private _module: string;\n private _path: string;\n private _chunk: string;\n private _controller: string;\n private _templateUrl: string;\n private _title?: string;\n private _reloadOnSearch?: boolean;\n private _helpInfo?: string;\n private _documentationUrl?: string;\n private _allowAuthorities?: string[];\n\n constructor(routeItem: ExternalRouteItemModel) {\n this._url = routeItem.url;\n this._module = routeItem.module;\n this._path = routeItem.path;\n this._chunk = routeItem.chunk;\n this._controller = routeItem.controller;\n this._templateUrl = routeItem.templateUrl;\n this._title = routeItem.title;\n this._reloadOnSearch = routeItem.reloadOnSearch;\n this._helpInfo = routeItem.helpInfo;\n this._documentationUrl = routeItem.documentationUrl;\n this._allowAuthorities = routeItem.allowAuthorities;\n }\n\n get url(): string {\n return this._url;\n }\n\n set url(url: string) {\n this._url = url;\n }\n\n get module(): string {\n return this._module;\n }\n\n set module(module: string) {\n this._module = module;\n }\n\n get path(): string {\n return this._path;\n }\n\n set path(path: string) {\n this._path = path;\n }\n\n get chunk(): string {\n return this._chunk;\n }\n\n set chunk(chunk: string) {\n this._chunk = chunk;\n }\n\n get controller(): string {\n return this._controller;\n }\n\n set controller(controller: string) {\n this._controller = controller;\n }\n\n get templateUrl(): string {\n return this._templateUrl;\n }\n\n set templateUrl(templateUrl: string) {\n this._templateUrl = templateUrl;\n }\n\n get title(): string | undefined{\n return this._title;\n }\n\n set title(title: string) {\n this._title = title;\n }\n\n get reloadOnSearch(): boolean | undefined {\n return this._reloadOnSearch;\n }\n\n set reloadOnSearch(reloadOnSearch: boolean | undefined) {\n this._reloadOnSearch = reloadOnSearch;\n }\n\n get helpInfo(): string | undefined {\n return this._helpInfo;\n }\n\n set helpInfo(helpInfo: string) {\n this._helpInfo = helpInfo;\n }\n\n get documentationUrl(): string | undefined {\n return this._documentationUrl;\n }\n\n set documentationUrl(documentationUrl: string | undefined) {\n this._documentationUrl = documentationUrl;\n }\n\n get allowAuthorities(): string[] | undefined{\n return this._allowAuthorities;\n }\n\n set allowAuthorities(allowAuthorities: string[]) {\n this._allowAuthorities = allowAuthorities;\n }\n}\n","import {RouteRegexParamPair} from '../../models/routing/route-regex-param-pair';\nimport {RouteItemModel} from '../../models/routing/route-item-model';\nimport {getPathName} from '../utils';\nimport {ModelList} from '../../models/common';\nimport {Service} from '../../providers/service/service';\nimport {WindowService} from '../window';\nimport {ExtensionPoint} from '../../models/plugins/extension-point';\nimport {RouteModel} from '../../models/routing/external-route-item-model';\n\n/**\n * Service responsible for handling application routing functionality.\n *\n * This service provides methods for matching URL paths against registered routes,\n * converting route patterns to regular expressions, and retrieving active routes.\n * It works with the application's route configuration obtained from the PluginRegistry.\n */\nexport class RoutingService implements Service {\n private readonly routeConfig = WindowService.getWindow().PluginRegistry.get<RouteModel>(ExtensionPoint.ROUTE);\n\n /**\n * Finds and returns the active route based on the provided path.\n * Compares the path against registered routes in the route configuration\n * and returns the first matching route as a RouteItemModel.\n *\n * @param path - The URL path to match against registered routes.\n * Defaults to the current path from getPathName() if not provided.\n * @returns A RouteItemModel instance representing the matched route,\n * or undefined if no matching route is found.\n */\n getActiveRoute(path: string = getPathName()): RouteItemModel | undefined {\n const activeRoute = this.routeConfig\n .find((route) => {\n const regex = this.routeToRegex(route.url).getRegex();\n return regex.test(path);\n });\n\n return activeRoute ? new RouteItemModel(activeRoute) : undefined;\n }\n\n /**\n * Converts a route path string to a regular expression for route matching.\n * Handles route parameters with various options (optional, wildcard).\n *\n * @param path - The route path pattern to convert (e.g., '/users/:id', '/items/:name?')\n * @returns A RouteRegexParamPair containing the compiled regular expression\n * and a list of parameter names extracted from the path.\n */\n private routeToRegex(path: string): RouteRegexParamPair {\n const keys: string[] = [];\n\n const pattern = path\n .replace(/([().])/g, '\\\\$1')\n .replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function (_, slash, key, option) {\n const optional = option === '?' || option === '*?';\n const star = option === '*' || option === '*?';\n keys.push(key);\n slash = slash || '';\n return (\n (optional ? '(?:' + slash : slash + '(?:') +\n (star ? '(.+?)' : '([^/]+)') +\n (optional ? '?)?' : ')')\n );\n })\n .replace(/([/$*])/g, '\\\\$1');\n\n return new RouteRegexParamPair(new RegExp('^' + pattern + '(?:[?#]|$)'), new ModelList<string>(keys));\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {AuthenticatedUser, Authority, Rights, SecurityConfig} from '../../models/security';\nimport {ServiceProvider} from '../../providers';\nimport {EventService} from '../event-service';\nimport {Logout} from '../../models/events';\nimport {SecurityContextService} from './security-context.service';\nimport {Repository} from '../../models/repositories';\nimport {RepositoryService, RepositoryStorageService} from '../repository';\nimport {RoutingService} from '../routing/routing.service';\nimport {AuthenticationStorageService} from './authentication-storage.service';\n\n/**\n * Service responsible for handling authentication-related operations.\n */\nexport class AuthenticationService implements Service {\n private readonly repositoryService = ServiceProvider.get(RepositoryService);\n private readonly securityContextService = ServiceProvider.get(SecurityContextService);\n\n login(): string {\n return 'Authentication.login from the API';\n }\n\n /**\n * Updates security context for logout request.\n */\n logout(): void {\n ServiceProvider.get(EventService).emit(new Logout());\n }\n\n /**\n * Checks if the user is logged in based on the provided configuration and user details.\n * @returns {boolean} True if the user is authenticated, false otherwise.\n */\n isLoggedIn(): boolean {\n const config = this.getSecurityConfig();\n return !!(config?.enabled && config?.userLoggedIn);\n }\n\n /**\n * Check if the user is authenticated.\n * A user is considered authenticated, if security is disabled, if he is external, or if there is an\n * auth token in the store\n */\n isAuthenticated() {\n const config = this.getSecurityConfig();\n const user = this.getAuthenticatedUser();\n return !config?.enabled\n || user?.external\n // eslint-disable-next-line eqeqeq\n || ServiceProvider.get(AuthenticationStorageService).getAuthToken().getValue() != null;\n }\n\n /**\n * Determines if free access is allowed based on the security configuration.\n * @returns {boolean | undefined} True if free access is enabled, false or undefined otherwise.\n */\n hasFreeAccess(): boolean | undefined {\n const config = this.getSecurityConfig();\n return config?.enabled && config?.freeAccessActive;\n }\n\n /**\n * Checks if the user has a specific role based on the provided authority, configuration, and user details.\n * @param {Authority} role - The authority role to check.\n * @returns {boolean | undefined} True if the user has the specified role, false or undefined otherwise.\n */\n hasRole(role?: Authority): boolean | undefined {\n const config = this.getSecurityConfig();\n const user = this.getAuthenticatedUser();\n\n if (!role || !config?.enabled) {\n return true;\n }\n const hasPrinciple = Object.keys(user || {}).length > 0;\n if (!hasPrinciple) {\n return false;\n }\n return Authority.IS_AUTHENTICATED_FULLY === role || user?.authorities.hasAuthority(role);\n }\n\n /**\n * Checks if security is enabled\n * @returns {boolean} True if security is enabled, false otherwise.\n */\n isSecurityEnabled(): boolean {\n return !!this.getSecurityConfig()?.enabled;\n }\n\n /**\n * Checks if the current user has read permissions for the specified repository.\n * This method evaluates if the user can read the repository based on security configuration,\n * user authentication status, and user roles.\n *\n * @param {Repository} repository - The repository to check read permissions for.\n * @returns {boolean} True if the user has read permissions for the repository, false otherwise.\n */\n canReadRepo(repository?: Repository): boolean {\n if (!repository || repository.id === '') {\n return false;\n }\n\n const config = this.getSecurityConfig();\n const user = this.getAuthenticatedUser();\n\n if (config?.enabled) {\n if (!user) {\n return false;\n }\n if (this.isAdminOrRepoManager()) {\n return true;\n }\n if (this.repositoryService.isSystemRepository(repository)) {\n return false;\n }\n return this.hasBaseRights(Rights.READ, repository);\n }\n\n return true;\n }\n\n /**\n * Checks if the current user has GraphQL read permissions for the specified repository.\n * This method determines if the user can execute GraphQL read operations on the repository.\n *\n * @param {Repository} repository - The repository to check GraphQL read permissions for.\n * @returns {boolean} True if the user has GraphQL read permissions for the repository, false otherwise.\n */\n canReadGqlRepo(repository: Repository): boolean {\n if (!repository || repository.id === '') {\n return false;\n }\n return this.hasGraphqlAuthority(Rights.READ, repository);\n }\n\n /**\n * Checks if the current user has GraphQL write permissions for the specified repository.\n * This method determines if the user can execute GraphQL write operations on the repository.\n *\n * @param {Repository} repository - The repository to check GraphQL write permissions for.\n * @returns {boolean} True if the user has GraphQL write permissions for the repository, false otherwise.\n */\n canWriteGqlRepo(repository: Repository): boolean {\n if (!repository || repository.id === '') {\n return false;\n }\n return this.hasGraphqlAuthority(Rights.WRITE, repository);\n }\n\n /**\n * Checks if the current user has any GraphQL permissions (read or write) for the specified repository.\n * This is a convenience method that combines the results of canReadGqlRepo and canWriteGqlRepo.\n *\n * @param {Repository} repository - The repository to check GraphQL permissions for.\n * @returns {boolean} True if the user has any GraphQL permissions for the repository, false otherwise.\n */\n hasGqlRights(repository: Repository): boolean {\n return this.canReadGqlRepo(repository) || this.canWriteGqlRepo(repository);\n }\n\n /**\n * Determines if the current user has authority to access the active route.\n *\n * This method checks if the user has the necessary permissions to access the current route\n * based on the route's defined authority requirements and the user's assigned roles.\n * The method follows these rules:\n * - If no active route exists, access is denied\n * - Admin users always have access to all routes\n * - Routes without defined authority requirements are accessible to all\n * - If no repository is selected, authority checks are bypassed\n * - If the user has any of the authorities required by the route, access is granted\n *\n * @returns {boolean} True if the user has authority to access the current route, false otherwise\n */\n hasAuthority(): boolean {\n // If the user has an admin role, they always have access\n if (this.hasRole(Authority.ROLE_ADMIN)) {\n return true;\n }\n\n const activeRoute = ServiceProvider.get(RoutingService).getActiveRoute();\n // If there is no current active route, return false – access cannot be determined\n if (!activeRoute) {\n return false;\n }\n\n // If the current route doesn't define \"allowAuthorities\", assume there are no restrictions\n if (!activeRoute.allowAuthorities) {\n return true;\n }\n\n // If there is no selected repository, there are no auth restrictions\n if (!ServiceProvider.get(RepositoryStorageService).getRepositoryReference()?.id) {\n return true;\n }\n\n const authenticatedUser = this.getAuthenticatedUser();\n // If there is no principal defined, assume is admin and return true\n if (!authenticatedUser) {\n return true;\n }\n\n if (activeRoute.allowAuthorities.length) {\n const resolvedAuthorities = this.resolveAuthorities(activeRoute.allowAuthorities);\n return resolvedAuthorities.some(allowAuth => authenticatedUser.authorities.hasAuthority(allowAuth as Authority));\n }\n\n return true;\n }\n\n private resolveAuthorities(authoritiesList?: string[]) {\n // If no authorities list is provided, return empty array.\n if (!authoritiesList) {\n return [];\n }\n\n // Get the selected repository's ID from the current context.\n const repo = ServiceProvider.get(RepositoryStorageService).getRepositoryReference();\n // If there is no selected repository ID, return the original authorities list.\n if (!repo?.id) {\n return authoritiesList;\n }\n\n // Replace the \"{repoId}\" placeholder with the actual repository ID for specific access.\n const authListForCurrentRepo = authoritiesList.map(authority => authority.replace('{repoId}', repo.id));\n // Replace the \"{repoId}\" placeholder with a wildcard '*' to denote access to any repository.\n const authListForAllRepos = authoritiesList.map(authority => authority.replace('{repoId}', '*'));\n\n // Combine both lists into a single array and return.\n return [...authListForCurrentRepo, ...authListForAllRepos];\n }\n\n private hasGraphqlAuthority(action: string, repo: Repository): boolean {\n const user = this.securityContextService.getAuthenticatedUser();\n\n if (!user) {\n return false;\n }\n\n const repoId = this.repositoryService.getLocationSpecificId(repo);\n const overCurrentRepoGraphql = this.repositoryService.getCurrentGqlRepoAuthority(action, repoId);\n const overAllReposGraphql = this.repositoryService.getOverallGqlRepoAuthority(action);\n\n return (\n user.authorities.hasAuthority(overCurrentRepoGraphql as Authority) ||\n user.authorities.hasAuthority(overAllReposGraphql as Authority)\n );\n }\n\n private isAdminOrRepoManager() {\n return this.hasRole(Authority.ROLE_ADMIN) || this.hasRole(Authority.ROLE_REPO_MANAGER);\n }\n\n private getSecurityConfig(): SecurityConfig | undefined {\n return ServiceProvider.get(SecurityContextService).getSecurityConfig();\n }\n\n private getAuthenticatedUser(): AuthenticatedUser | undefined {\n return ServiceProvider.get(SecurityContextService).getAuthenticatedUser();\n }\n\n private hasBaseRights(action: string, repo: Repository): boolean {\n const repoId = this.repositoryService.getLocationSpecificId(repo);\n const overCurrentRepo = this.repositoryService.getCurrentRepoAuthority(action, repoId);\n const overAllRepos = this.repositoryService.getOverallRepoAuthority(action);\n\n const user = this.getAuthenticatedUser();\n\n return !!(\n user?.authorities.hasAuthority(overCurrentRepo as Authority) ||\n user?.authorities.hasAuthority(overAllRepos as Authority)\n );\n }\n}\n","import {AuthenticatedUser} from '../../../models/security/authenticated-user';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting partial AuthenticatedUser objects to complete AuthenticatedUser models.\n */\nexport class AuthenticatedUserMapper extends Mapper<AuthenticatedUser> {\n /**\n * Maps a partial AuthenticatedUser object to a complete AuthenticatedUser model.\n *\n * @param user - A partial object containing some or all properties of an AuthenticatedUser.\n * @returns A new instance of AuthenticatedUser with all properties set based on the input.\n */\n mapToModel(user: Partial<AuthenticatedUser>): AuthenticatedUser {\n return new AuthenticatedUser(user);\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {AuthenticatedUser, SecurityConfig} from '../../models/security';\n\n/**\n * Service class for handling security-related REST operations.\n */\nexport class SecurityRestService extends HttpService {\n private readonly SECURITY_ENDPOINT = 'rest/security';\n\n /**\n * Updates the application settings for a specific user.\n *\n * @param user - The authenticated user whose data needs to be updated.\n * @returns A Promise that resolves when the update is successful, or rejects if there's an error.\n */\n updateUserData(user: AuthenticatedUser): Promise<void> {\n return this.patch<void>(`${this.SECURITY_ENDPOINT}/users/${this.encodeURIComponentStrict(user.username)}`,\n {\n appSettings: user.appSettings,\n }\n );\n }\n\n /**\n * Retrieves the full security configuration from the backend.\n *\n * Sends a GET request to fetch the application's security-related configuration, including roles, permissions,\n * and OpenID settings.\n *\n * @returns A Promise that resolves with the SecurityConfig object.\n */\n getSecurityConfig(): Promise<SecurityConfig> {\n return this.get(`${this.SECURITY_ENDPOINT}/all`);\n }\n\n /**\n * Retrieves information about the currently authenticated user.\n *\n * Sends a GET request to the security endpoint to fetch details about the user\n * who is currently authenticated in the system.\n *\n * @returns A Promise that resolves with the AuthenticatedUser object containing\n * the user's details such as username, roles, and application settings.\n */\n getAuthenticatedUser(): Promise<AuthenticatedUser> {\n return this.get(`${this.SECURITY_ENDPOINT}/authenticated-user`);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {SecurityRestService} from './security-rest.service';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {AuthenticatedUser, SecurityConfig} from '../../models/security';\nimport {SecurityContextService} from './security-context.service';\nimport {SecurityConfigMapper} from './mappers/security-config.mapper';\nimport {AuthenticatedUserMapper} from './mappers/authenticated-user.mapper';\n\n/**\n * Service class for handling security-related operations.\n */\nexport class SecurityService implements Service {\n private readonly securityRestService: SecurityRestService = ServiceProvider.get(SecurityRestService);\n private readonly securityContextService: SecurityContextService = ServiceProvider.get(SecurityContextService);\n\n /**\n * Updates the data of an authenticated user.\n *\n * Updates the authenticated user's data in the backend using the provided user object and updates the\n * context with the updated user data.\n *\n * @param user - The authenticated user object containing the updated data.\n * @returns A Promise that resolves when the user data has been successfully updated.\n */\n updateUserData(user: AuthenticatedUser): Promise<void> {\n return this.securityRestService.updateUserData(user)\n .then(() => this.securityContextService.updateAuthenticatedUser(user));\n }\n\n /**\n * Retrieves the current security configuration from the backend.\n *\n * Fetches the security configuration and maps it to a `SecurityConfig` model using the appropriate mapper.\n *\n * @returns A Promise that resolves with the mapped `SecurityConfig` instance.\n */\n getSecurityConfig(): Promise<SecurityConfig> {\n return this.securityRestService.getSecurityConfig().then((response) => MapperProvider.get(SecurityConfigMapper).mapToModel(response));\n }\n\n /**\n * Retrieves the currently authenticated user from the backend.\n *\n * Fetches the authenticated user's information and maps it to an `AuthenticatedUser` model\n * using the appropriate mapper.\n *\n * @returns A Promise that resolves with the mapped `AuthenticatedUser` instance\n */\n getAuthenticatedUser(): Promise<AuthenticatedUser> {\n return this.securityRestService.getAuthenticatedUser()\n .then((response) => MapperProvider.get(AuthenticatedUserMapper).mapToModel(response));\n }\n}\n","import {Mapper} from '../../providers/mapper/mapper';\nimport {OpenIdConfig} from '../../models/security/openid-config';\n\n/**\n * Mapper class for converting partial OpenIdConfig objects to complete OpenIdConfig models.\n */\nexport class OpenidConfigMapper extends Mapper<OpenIdConfig> {\n /**\n * Maps the raw data to an instance of the {@link OpenIdConfig} model.\n *\n * @returns {OpenIdConfig} - A new OpenIdConfig instance.\n */\n mapToModel(data: Partial<OpenIdConfig>): OpenIdConfig {\n return new OpenIdConfig(data);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {AuthenticatedUser} from '../../models/security';\nimport {CookieConsent} from '../../models/cookie';\nimport {ServiceProvider} from '../../providers';\nimport {SecurityContextService, SecurityService} from '../security';\nimport {EventEmitter} from '../../emitters/event.emitter';\n\nexport const COOKIE_CONSENT_CHANGED_EVENT = 'cookie-consent-changed-event';\n\n/**\n * Service class for handling cookie-related operations.\n */\nexport class CookieService implements Service {\n private readonly eventEmitter = new EventEmitter<CookieConsent>();\n\n /**\n * Accepts the cookie policy for the authenticated user.\n *\n * @returns {Promise<void>} - A promise that resolves when the request to the backend has passed.\n */\n acceptCookiePolicy(): Promise<void> {\n const user = this.setAcceptedCookiePolicy();\n return ServiceProvider.get(SecurityService).updateUserData(user)\n .then(() => {\n this.eventEmitter.emit({NAME: COOKIE_CONSENT_CHANGED_EVENT, payload: user.appSettings.COOKIE_CONSENT as CookieConsent});\n });\n }\n\n private setAcceptedCookiePolicy(): AuthenticatedUser {\n const user = ServiceProvider.get(SecurityContextService).getAuthenticatedUser() || new AuthenticatedUser({});\n\n let cookieConsent: CookieConsent;\n if (user.appSettings?.COOKIE_CONSENT) {\n cookieConsent = new CookieConsent(user.appSettings.COOKIE_CONSENT as CookieConsent);\n } else {\n cookieConsent = new CookieConsent({thirdParty: true, statistic: true});\n }\n\n cookieConsent.policyAccepted = true;\n cookieConsent.updatedAt = Date.now();\n user.appSettings.COOKIE_CONSENT = cookieConsent;\n return user;\n }\n}\n","import {OperationStatusSummary} from '../../models/monitoring/operation-status-summary';\nimport {HttpService} from '../http/http.service';\n\n/**\n * Service for interacting with the GraphDB monitoring REST API endpoints.\n */\nexport class MonitoringRestService extends HttpService {\n private readonly MONITORING_ENDPOINT = 'rest/monitor';\n\n /**\n * Retrieves the status summary of operations for a specific repository.\n *\n * @param repositoryId - The unique identifier of the repository for which to fetch operations.\n * @returns A Promise that resolves to an OperationStatusSummary containing information about the repository operations.\n */\n getOperations(repositoryId: string): Promise<OperationStatusSummary> {\n return this.get<OperationStatusSummary>(`${this.MONITORING_ENDPOINT}/repository/${repositoryId}/operations`);\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {OperationList} from '../../../models/monitoring/operation-list';\nimport {Operation} from '../../../models/monitoring/operation';\nimport {OperationType} from '../../../models/monitoring/operation-type';\n\nconst OPERATION_TYPE_SORT_ORDER = {\n [OperationType.CLUSTER_HEALTH]: 0,\n [OperationType.BACKUP_AND_RESTORE]: 1,\n [OperationType.IMPORT]: 2,\n [OperationType.QUERIES]: 3,\n [OperationType.UPDATES]: 4\n};\n\n/**\n * Mapper class for converting an array of Operation objects to an OperationList model.\n */\nexport class OperationListMapper extends Mapper<OperationList> {\n /**\n * Maps an array of Operation objects to an OperationList model.\n * Sorts the operations by their type before mapping them to the OperationList model.\n *\n * @param data - An array of Operation objects to be mapped into an OperationList.\n * @returns A new OperationList instance containing the provided operations.\n */\n mapToModel(data: Operation[]): OperationList {\n return new OperationList(\n data\n .map((operation) => new Operation(operation))\n .sort((a, b) => OPERATION_TYPE_SORT_ORDER[a.type] - OPERATION_TYPE_SORT_ORDER[b.type])\n );\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {OperationStatusSummary} from '../../../models/monitoring/operation-status-summary';\nimport {MapperProvider} from '../../../providers';\nimport {OperationListMapper} from './operation-list.mapper';\n\n/**\n * Mapper class for converting OperationStatusSummaryResponse to OperationStatusSummary.\n */\nexport class OperationSummaryMapper extends Mapper<OperationStatusSummary> {\n /**\n * Maps the OperationStatusSummary data from the backend to an OperationStatusSummary model.\n * @param {OperationStatusSummary} data - The response data to be mapped.\n * @returns {OperationStatusSummary} A new instance of OperationStatusSummary created from the input data.\n */\n mapToModel(data: OperationStatusSummary): OperationStatusSummary {\n return new OperationStatusSummary({\n status: data.status,\n allRunningOperations: MapperProvider.get(OperationListMapper).mapToModel(data.allRunningOperations || [])\n } as OperationStatusSummary);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {OperationStatusSummary} from '../../models/monitoring/operation-status-summary';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {MonitoringRestService} from './monitoring-rest.service';\nimport {OperationSummaryMapper} from './mapper/operation-summary-mapper';\n\n/**\n * Service class for handling operations-related functionality.\n */\nexport class MonitoringService implements Service {\n /**\n * Retrieves the status summary of operations.\n *\n * @returns {Promise<OperationStatusSummary>} A Promise that resolves to an OperationStatusSummary object,\n * representing the current status of operations.\n */\n getOperations(repositoryId: string): Promise<OperationStatusSummary> {\n return ServiceProvider.get(MonitoringRestService).getOperations(repositoryId)\n .then((operations) => MapperProvider.get(OperationSummaryMapper).mapToModel(operations));\n }\n}\n","import {OperationGroupSummaryList} from '../../../models/monitoring/operation-group-summary-list';\nimport {OperationGroupSummary} from '../../../models/monitoring';\nimport {Mapper} from '../../../providers/mapper/mapper';\n\n/**\n * Mapper class for converting an array of OperationGroupSummary objects to an OperationGroupSummaryList model.\n */\nexport class OperationGroupSummaryListMapper extends Mapper<OperationGroupSummaryList> {\n /**\n * Maps an array of OperationGroupSummary objects to an OperationGroupSummaryList model.\n *\n * @param data - An array of OperationGroupSummary objects to be mapped.\n * @returns A new OperationGroupSummaryList instance containing the provided data.\n */\n mapToModel(data: OperationGroupSummary[]): OperationGroupSummaryList {\n return new OperationGroupSummaryList(data);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {ToastMessage} from '../../models/toastr/toast-message';\nimport {ToastType} from '../../models/toastr/toast-type';\nimport {CREATE_TOAST_EVENT} from '../../models/toastr/toastr-constants';\nimport {EventEmitter} from '../../emitters/event.emitter';\nimport {ToastConfig} from '../../models/toastr/toast-config';\n\n/**\n * Service for displaying toast notifications in the application.\n */\nexport class OntoToastrService implements Service {\n private readonly eventEmitter = new EventEmitter<ToastMessage>();\n\n /**\n * Displays an error toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n error(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.ERROR, config);\n }\n\n /**\n * Displays an informational toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n info(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.INFO, config);\n }\n\n /**\n * Displays a success toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n success(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.SUCCESS, config);\n }\n\n /**\n * Displays a warning toast notification.\n *\n * @param message - The text message to be displayed in the toast\n * @param config - Additional configuration for the toast notification\n */\n warning(message: string, config?: ToastConfig): void {\n this.createToastElement(message, ToastType.WARNING, config);\n }\n\n private createToastElement(message: string, type: ToastType, config?: ToastConfig): void {\n this.eventEmitter.emit({NAME: CREATE_TOAST_EVENT, payload: new ToastMessage(type, message, config)});\n }\n}\n","import {AutocompleteSearchResult} from '../../models/rdf-search/autocomplete-search-result';\nimport {HttpService} from '../http/http.service';\n\n/**\n * Service for handling autocomplete REST operations.\n */\nexport class AutocompleteRestService extends HttpService {\n private readonly autocompleteRestPrefix = 'rest/autocomplete';\n\n /**\n * Performs an autocomplete search based on the provided search term.\n *\n * @param searchTerm - The string to use for autocomplete search.\n * @returns A Promise that resolves to an AutocompleteSearchResult object containing search suggestions.\n */\n search(searchTerm: string): Promise<AutocompleteSearchResult> {\n return this.get(`${this.autocompleteRestPrefix}/query?q=${searchTerm}`);\n }\n\n /**\n * Checks if the autocomplete feature is enabled.\n *\n * @returns A Promise that resolves to a boolean indicating whether autocomplete is enabled.\n */\n enabled(): Promise<boolean> {\n return this.get(`${this.autocompleteRestPrefix}/enabled`);\n }\n}\n","import {SuggestionList} from '../../../models/rdf-search/suggestion-list';\nimport {Mapper} from '../../../providers/mapper/mapper';\nimport {Suggestion} from '../../../models/rdf-search/suggestion';\nimport {GeneratorUtils} from '../../utils/generator-utils';\nimport {SuggestionResponse} from '../../../models/rdf-search/api/suggestion-response';\n\n/**\n * Mapper class for converting an array of Suggestion objects to a SuggestionList model.\n */\nexport class SuggestionListMapper extends Mapper<SuggestionList> {\n /**\n * Maps an array of SuggestionResponse objects to a SuggestionList model.\n *\n * @param data - An array of SuggestionResponse objects to be converted into a SuggestionList.\n * @returns A new SuggestionList instance containing the provided Suggestion objects.\n */\n mapToModel(data: SuggestionResponse[]): SuggestionList {\n return new SuggestionList(data.map(suggestion => new Suggestion({\n ...suggestion,\n id: GeneratorUtils.hashCode(`${suggestion.type}-${suggestion.value}-${suggestion.description}`)\n })));\n }\n}\n","import {AutocompleteSearchResult} from '../../../models/rdf-search/autocomplete-search-result';\nimport {Mapper} from '../../../providers/mapper/mapper';\nimport {MapperProvider} from '../../../providers';\nimport {SuggestionListMapper} from '../../rdf-search/mapper/suggestion-list.mapper';\nimport {AutocompleteSearchResultResponse} from '../../../models/rdf-search/api/autocomplete-search-result-response';\n\n/**\n * Mapper class for AutocompleteSearchResult objects.\n */\nexport class AutocompleteSearchResultMapper extends Mapper<AutocompleteSearchResult> {\n /**\n * Maps the input AutocompleteSearchResultResponse data to a new AutocompleteSearchResult model.\n *\n * @param data - The input AutocompleteSearchResultResponse data to be mapped.\n * @returns A new AutocompleteSearchResult instance with mapped suggestions.\n */\n mapToModel(data: AutocompleteSearchResultResponse): AutocompleteSearchResult {\n return new AutocompleteSearchResult(\n {\n ...data,\n suggestionList: MapperProvider.get(SuggestionListMapper).mapToModel(data.suggestions)\n });\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {AutocompleteSearchResult} from '../../models/rdf-search/autocomplete-search-result';\nimport {MapperProvider, ServiceProvider} from '../../providers';\nimport {AutocompleteRestService} from './autocomplete-rest.service';\nimport {AutocompleteSearchResultMapper} from './mapper/autocomplete-search-result.mapper';\n\n/**\n * Service responsible for handling autocomplete functionality in the RDF search.\n */\nexport class AutocompleteService implements Service {\n /**\n * Performs an autocomplete search based on the provided search term.\n * This method fetches autocomplete suggestions from the REST service and maps\n * the results to the AutocompleteSearchResult.\n *\n * @param searchTerm - The string to use as the basis for autocomplete suggestions\n * @returns A promise that resolves to an AutocompleteSearchResult containing the matching suggestions\n */\n search(searchTerm: string): Promise<AutocompleteSearchResult> {\n return ServiceProvider.get(AutocompleteRestService).search(searchTerm)\n .then((searchResult: AutocompleteSearchResult) => MapperProvider.get(AutocompleteSearchResultMapper).mapToModel(searchResult));\n }\n\n /**\n * Checks if the autocomplete functionality is enabled.\n *\n * This method queries the AutocompleteRestService to determine\n * whether the autocomplete feature is currently enabled.\n *\n * @returns A promise that resolves to a boolean value.\n */\n isAutocompleteEnabled(): Promise<boolean> {\n return ServiceProvider.get(AutocompleteRestService).enabled();\n }\n}\n","import {LocalStorageService} from '../storage';\n\n/**\n * Service for managing autocomplete-related storage operations.\n */\nexport class AutocompleteStorageService extends LocalStorageService {\n private readonly ENABLED_KEY = 'enabled';\n\n readonly NAMESPACE = 'autocomplete';\n\n set(key: string, value: string): void {\n this.storeValue(key, value);\n }\n\n /**\n * Checks if autocomplete is enabled.\n * @returns {boolean} True if autocomplete is enabled, false otherwise.\n */\n isEnabled(): boolean {\n return this.get(this.ENABLED_KEY).value === 'true';\n }\n\n /**\n * Sets the value of 'autocomplete.enabled' in the local store.\n * @param value - The value to set for 'autocomplete.enabled'.\n */\n setEnabled(value: boolean): void {\n this.set(this.ENABLED_KEY, value.toString());\n }\n}\n","import {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {ServiceProvider} from '../../providers';\nimport {AutocompleteStorageService} from './autocomplete-storage.service';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype AutocompleteContextFields = {\n readonly AUTOCOMPLETE_ENABLED: string;\n}\n\ntype AutocompleteContextFieldParams = {\n readonly AUTOCOMPLETE_ENABLED: boolean;\n};\n\n/**\n * Service for managing autocomplete context state across the application.\n */\nexport class AutocompleteContextService extends ContextService<AutocompleteContextFields> implements DeriveContextServiceContract<AutocompleteContextFields, AutocompleteContextFieldParams>, LifecycleHooks {\n /**\n * Context property key for the autocomplete enabled state.\n */\n readonly AUTOCOMPLETE_ENABLED = 'isAutocompleteEnabled';\n\n /**\n * Updates the autocomplete enabled state in the context and in the local store\n *\n * @param enabled - Boolean value indicating whether autocomplete is enabled\n */\n updateAutocompleteEnabled(enabled: boolean): void {\n this.updateContextProperty(this.AUTOCOMPLETE_ENABLED, enabled);\n ServiceProvider.get(AutocompleteStorageService).setEnabled(enabled);\n }\n\n /**\n * Subscribes to changes in the autocomplete enabled state.\n *\n * @param callbackFn - Callback function that will be invoked when the autocomplete enabled state changes\n * @returns A function that can be called to unsubscribe from the changes\n */\n onAutocompleteEnabledChanged(callbackFn: ValueChangeCallback<boolean | undefined>): () => void {\n return this.subscribe(this.AUTOCOMPLETE_ENABLED, callbackFn);\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {NamespaceMap} from '../../../models/repositories/namespace/namespace-map';\nimport {NamespacesResponse} from '../../../models/repositories/namespace/api/namespaces-response';\n\n/**\n * Mapper class for converting namespace API responses to a model list of namespaces.\n */\nexport class NamespaceMapMapper extends Mapper<NamespaceMap> {\n /**\n * Maps the raw API response data to a structured map of namespaces and their URIs.\n *\n * @param data - The raw namespace response data from the API containing bindings with prefix and namespace values\n * @returns A NamespaceMap containing a mapping between prefixes and their corresponding URIs.\n */\n mapToModel(data: NamespacesResponse): NamespaceMap {\n const namespaces = data?.results.bindings || [];\n return new NamespaceMap(namespaces.reduce((acc, binding) => {\n const prefix = binding.prefix.value;\n acc[prefix] = binding.namespace.value;\n return acc;\n }, {} as Record<string, string>));\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {NamespacesResponse} from '../../models/repositories/namespace/api/namespaces-response';\n\n/**\n * Service for interacting with the RDF4J repository REST API.\n */\nexport class NamespacesRestService extends HttpService {\n private readonly REPOSITORIES_ENDPOINT = 'repositories';\n\n /**\n * Retrieves namespace information for a specific repository.\n *\n * @param repositoryId - The id of the repository.\n * @returns A Promise that resolves to a NamespacesResponse object containing namespace mappings.\n */\n getNamespaces(repositoryId: string): Promise<NamespacesResponse> {\n return this.get(`${this.REPOSITORIES_ENDPOINT}/${repositoryId}/namespaces`);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {NamespaceMap} from '../../models/repositories';\nimport {NamespaceMapMapper} from '../repository/mappers/namespace-map.mapper';\nimport {NamespacesRestService} from './namespaces-rest.service';\nimport {MapperProvider, ServiceProvider} from '../../providers';\n\n/**\n * Service for interacting with RDF4J repositories.\n */\nexport class NamespacesService implements Service {\n private namespaceMapper = MapperProvider.get(NamespaceMapMapper);\n private readonly namespacesRestService = ServiceProvider.get(NamespacesRestService);\n\n /**\n * Retrieves all prefixes, mapped to their respective URIs.\n *\n * @param repositoryId The unique identifier of the repository for which to retrieve namespaces.\n * @returns A promise that resolves to a NamespaceMap containing prefixes mapped to their URIs.\n */\n getNamespaces(repositoryId: string): Promise<NamespaceMap> {\n return this.namespacesRestService.getNamespaces(repositoryId)\n .then((response) => this.namespaceMapper.mapToModel(response));\n }\n}\n","import {ContextService} from '../context';\nimport {NamespaceMap} from '../../models/repositories';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {LifecycleHooks} from '../../providers/service/lifecycle-hooks';\n\ntype NamespacesContextFields = {\n readonly NAMESPACES: string;\n}\n\ntype NamespacesContextFieldParams = {\n readonly NAMESPACES: NamespaceMap;\n}\n\n/**\n * Service for managing namespaces context in the application.\n */\nexport class NamespacesContextService extends ContextService<NamespacesContextFields> implements DeriveContextServiceContract<NamespacesContextFields, NamespacesContextFieldParams>, LifecycleHooks {\n readonly NAMESPACES = 'namespaces';\n\n /**\n * Updates the namespaces in the context.\n *\n * @param namespaces - The new namespace map to be stored in the context\n */\n updateNamespaces(namespaces: NamespaceMap): void {\n this.updateContextProperty(this.NAMESPACES, namespaces);\n }\n\n /**\n * Subscribes to changes in the namespaces context.\n *\n * @param callbackFn - The callback function that will be invoked when namespaces change\n * @returns A function that can be called to unsubscribe from the changes\n */\n onNamespacesChanged(callbackFn: ValueChangeCallback<NamespaceMap | undefined>) {\n return this.subscribe(this.NAMESPACES, callbackFn);\n }\n}\n","import {LocalStorageService} from '../storage';\nimport {Suggestion} from '../../models/rdf-search';\n\n/**\n * Service for managing resource search-related data in local storage.\n */\nexport class ResourceSearchStorageService extends LocalStorageService {\n private readonly SELECTED_VIEW_KEY = 'selectedView';\n private readonly INPUT_KEY = 'input';\n private readonly LAST_SELECTED_KEY = 'lastSelected';\n NAMESPACE = 'resourceSearch';\n\n private readonly LEGACY_LAST_SELECTED_KEY = 'ls.rdf-search.resource-description';\n private readonly LEGACY_INPUT_KEY = 'ls.rdf-search.search-input';\n private readonly LEGACY_SELECTED_VIEW_KEY = 'ls.rdf-search.search-type';\n\n set(key: string, value: string): void {\n this.storeValue(key, value);\n }\n\n /**\n * Sets the selected view type for the rdf search.\n * @param viewType - The type of view which is selected\n */\n setSelectedView(viewType: string) {\n this.set(this.SELECTED_VIEW_KEY, viewType);\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.setItem(this.LEGACY_SELECTED_VIEW_KEY, viewType);\n }\n\n /**\n * Retrieves the currently selected view type for rdf search.\n * @returns {string} The current view type or an empty string if no view type is stored.\n */\n getSelectedView(): string {\n return this.get(this.SELECTED_VIEW_KEY).getValue() || '';\n }\n\n /**\n * Stores the current value of the resource search input.\n * @param value - The input value.\n */\n setInputValue(value: string): void {\n this.set(this.INPUT_KEY, value);\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.setItem(this.LEGACY_INPUT_KEY, value);\n }\n\n /**\n * Retrieves the stored resource search input value.\n * @returns {string} The stored input value or an empty string if no value is stored.\n */\n getInputValue(): string {\n return this.get(this.INPUT_KEY).getValue() || '';\n }\n\n /**\n * Stores the value of the last selected autocomplete suggestion.\n * @param suggestion - The Suggestion object that was last selected by the user.\n */\n setLastSelected(suggestion: Suggestion): void {\n this.set(this.LAST_SELECTED_KEY, suggestion.getValue());\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.setItem(this.LEGACY_LAST_SELECTED_KEY, suggestion.getDescription() || '');\n }\n\n /**\n * Retrieves the value of the last selected autocomplete suggestion.\n * @returns {string} The value of the last selected suggestion or an empty string if no suggestion was selected.\n */\n getLastSelectedValue(): string {\n return this.get(this.LAST_SELECTED_KEY).getValue() || '';\n }\n\n /**\n * Clears the autocomplete search history from local storage.\n * Removes both the stored input value and the last selected suggestion.\n */\n clearStoredSearch(): void {\n this.remove(this.INPUT_KEY);\n this.remove(this.LAST_SELECTED_KEY);\n // TODO: Remove, once all resource-input-search components are fully migrated\n localStorage.removeItem(this.LEGACY_INPUT_KEY);\n localStorage.removeItem(this.LEGACY_LAST_SELECTED_KEY);\n }\n}\n","import {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ContextService} from '../context';\n\ntype NavigationContextFields = {\n readonly PREVIOUS_ROUTE: string;\n}\n\ntype NavigationContextFieldParams = {\n readonly PREVIOUS_ROUTE: string;\n}\n\n/**\n * Service for managing navigation context within the application.\n */\nexport class NavigationContextService extends ContextService<NavigationContextFields> implements DeriveContextServiceContract<NavigationContextFields, NavigationContextFieldParams> {\n /** Key used to store the previous route in the context */\n readonly PREVIOUS_ROUTE = 'previousRoute';\n\n /**\n * Updates the previous route in the navigation context.\n *\n * @param value - The route path to store as the previous route\n */\n updatePreviousRoute(value: string): void {\n this.updateContextProperty(this.PREVIOUS_ROUTE, value);\n }\n\n /**\n * Retrieves the previous route from the navigation context.\n * If the route ends with a '#' character, it will be removed as single-spa\n * doesn't handle trailing hash characters correctly.\n *\n * @returns The previous route path or undefined if not set\n */\n getPreviousRoute(): string | undefined {\n let previousRoute = this.getContextPropertyValue<string>(this.PREVIOUS_ROUTE);\n if (previousRoute?.endsWith('#')) {\n // Remove trailing '#' if present, because single-spa doesn't handle it correctly\n // e.g. /import# doesn't trigger navigation\n previousRoute = previousRoute.slice(0, -1);\n }\n return previousRoute;\n }\n}\n","import {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {ValueChangeCallback} from '../../models/context/value-change-callback';\nimport {LifecycleState} from '../../models/app-lifecycle';\n\ntype LifecycleDataContextFields = {\n readonly APPLICATION_DATA_STATE: string;\n}\n\ntype LifecycleDataContextFieldParams = {\n readonly APPLICATION_DATA_STATE: LifecycleState;\n}\n\n/**\n * Service responsible for emitting and subscribing to application lifecycle events.\n * This service provides a centralized way to track and respond to key moments in the\n * application's lifecycle, such as when data is loaded\n */\nexport class ApplicationLifecycleContextService extends ContextService<LifecycleDataContextFields> implements DeriveContextServiceContract<LifecycleDataContextFields, LifecycleDataContextFieldParams> {\n readonly APPLICATION_DATA_STATE = 'applicationDataLoaded';\n\n /**\n * Updates the application data state in the context.\n *\n * @param state - The lifecycle state to set for the application data\n * @returns void\n */\n updateApplicationDataState(state: LifecycleState): void {\n this.updateContextProperty(this.APPLICATION_DATA_STATE, state);\n }\n\n /**\n * Registers a callback function to be invoked when the application data state changes.\n *\n * @param callbackFn - The function to be called when the application data state changes.\n * The function will receive the new state value as its parameter.\n * @returns A function that, when called, will unsubscribe the callback from further notifications\n */\n onApplicationDataStateChanged(callbackFn: ValueChangeCallback<LifecycleState | undefined>): () => void {\n return this.subscribe(this.APPLICATION_DATA_STATE, callbackFn);\n }\n}\n","import {ContextService} from '../context';\nimport {DeriveContextServiceContract} from '../../models/context/update-context-method';\nimport {Configuration} from '../../models/configuration';\n\ntype ConfigurationContextFields = {\n readonly APPLICATION_CONFIGURATION: string;\n}\n\ntype ConfigurationContextFieldParams = {\n readonly APPLICATION_CONFIGURATION: Configuration;\n};\n\n/**\n * The ConfigurationContextService class manages the application's configuration context.\n * It allows updating and retrieving the application configuration.\n */\nexport class ConfigurationContextService extends ContextService<ConfigurationContextFields> implements DeriveContextServiceContract<ConfigurationContextFields, ConfigurationContextFieldParams> {\n readonly APPLICATION_CONFIGURATION = 'applicationConfiguration';\n\n updateApplicationConfiguration(configuration: Configuration): void {\n this.updateContextProperty(this.APPLICATION_CONFIGURATION, configuration);\n }\n\n getApplicationConfiguration(): Configuration {\n return this.getContextPropertyValue(this.APPLICATION_CONFIGURATION) as Configuration;\n }\n}\n","import {HttpService} from '../http/http.service';\nimport {PluginModule, PluginsManifest, PluginsManifestResponse} from '../../models/plugins';\nimport {getOrigin} from '../utils';\nimport {service} from '../../providers';\nimport {ConfigurationContextService} from '../configuration/configuration-context.service';\n\n/**\n * Service responsible for handling REST operations related to plugins.\n */\nexport class PluginsRestService extends HttpService {\n private readonly configurationContextService = service(ConfigurationContextService);\n\n /**\n * Fetches the plugins manifest from the server.\n *\n * @returns A Promise that resolves to the plugins manifest object containing\n * information about available plugins.\n */\n getPluginsManifest(): Promise<PluginsManifestResponse> {\n const configuration = this.configurationContextService.getApplicationConfiguration();\n return this.get(configuration.pluginsManifestPath);\n }\n\n /**\n * Dynamically loads all plugins defined in the plugins manifest.\n *\n * @param pluginsManifest - The manifest object containing the list of plugins to load.\n * Each plugin definition includes entry points.\n *\n * @returns A Promise that resolves to an array of loaded plugin modules.\n */\n async loadPlugins(pluginsManifest: PluginsManifest) {\n return await Promise.all(\n pluginsManifest.getPluginDefinitions().getItems().map(async (pluginDef) => {\n try {\n const entryUrl = pluginDef.entry.startsWith('http')\n ? pluginDef.entry\n : `${getOrigin()}${pluginDef.entry}`;\n\n return await import(/* webpackIgnore: true */ entryUrl) as PluginModule;\n } catch (err) {\n console.warn(`Failed to load plugin ${pluginDef.name}:`, err);\n }\n })\n );\n }\n}\n","import {Mapper} from '../../../providers/mapper/mapper';\nimport {PluginsManifestResponse, PluginDefinitionList, PluginsManifest} from '../../../models/plugins';\n\nexport class PluginsManifestMapper extends Mapper<PluginsManifest> {\n\n /**\n * Maps the raw data to an instance of the {@link PluginsManifest} model.\n *\n * @param {PluginsManifestResponse} data - The raw data to be transformed into a model.\n * @returns {PluginsManifest} - A new instance of the {@link PluginsManifest} model\n */\n mapToModel(data: PluginsManifestResponse): PluginsManifest {\n const pluginDefinitions = new PluginDefinitionList(data.plugins);\n return new PluginsManifest(pluginDefinitions);\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {ServiceProvider} from '../../providers';\nimport {PluginsRestService} from './plugins-rest.service';\nimport {PluginsManifest, PluginModule} from '../../models/plugins';\nimport {WindowService} from '../window';\nimport {PluginsManifestMapper} from './mapper/plugins-manifest.mapper';\n\n/**\n * Service responsible for managing plugins in the application.\n * Handles retrieving plugin manifests and loading plugins into the application.\n */\nexport class PluginsService implements Service {\n private readonly pluginsRestService: PluginsRestService;\n private readonly pluginsManifestMapper: PluginsManifestMapper;\n\n constructor() {\n this.pluginsRestService = ServiceProvider.get(PluginsRestService);\n this.pluginsManifestMapper = new PluginsManifestMapper();\n }\n\n /**\n * Retrieves the plugins manifest from the server.\n *\n * @returns A promise that resolves to the plugins manifest containing information about available plugins.\n */\n async getPluginsManifest(): Promise<PluginsManifest> {\n const response = await this.pluginsRestService.getPluginsManifest();\n return this.pluginsManifestMapper.mapToModel(response);\n }\n\n /**\n * Loads all available plugins into the application.\n *\n * This method retrieves the plugins manifest, loads the plugin modules,\n * filters out any undefined modules, and registers each valid plugin\n * with the application's plugin registry.\n *\n * If the plugins manifest cannot be loaded, the application will continue to function with built-in plugins only.\n *\n * @returns A promise that resolves when all plugins have been loaded and registered.\n */\n async loadPlugins(): Promise<void> {\n let pluginsManifest: PluginsManifest | undefined = undefined;\n try {\n pluginsManifest = await this.getPluginsManifest();\n } catch (error) {\n console.warn('Failed to load plugins manifest. Continue with the built-in plugins only.', error);\n // If the manifest cannot be loaded, we will continue with built-in plugins only.\n // This allows the application to function without external plugins.\n }\n\n if (pluginsManifest) {\n const pluginModules = await this.pluginsRestService.loadPlugins(pluginsManifest);\n pluginModules\n .filter((pluginModule): pluginModule is PluginModule => pluginModule !== undefined)\n .forEach((pluginModule: PluginModule) => {\n if (pluginModule.register !== undefined) {\n pluginModule.register(WindowService.getPluginRegistry());\n } else {\n console.warn('Plugin module is missing the register method. Skipping registration.', pluginModule);\n }\n });\n }\n }\n}\n","export abstract class ErrorBase extends Error {\n public constructor(private readonly text?: string) {\n super();\n }\n\n public get message(): string {\n return `${this.constructor.name}: ${this.text}`;\n }\n}\n","import {ErrorBase} from '../../error';\n\nexport class MissingApplicationConfigurationError extends ErrorBase {}\n","import {HttpService} from '../http/http.service';\nimport {Configuration, Environment} from '../../models/configuration';\nimport envDefault from './env.default.json';\nimport {MissingApplicationConfigurationError} from './missing-application-configuration-error';\n\nconst ENV_JSON_URL = 'assets/env.json';\n\nexport class ConfigurationRestService extends HttpService {\n async getConfiguration(): Promise<Configuration | undefined> {\n let environment: Environment = envDefault as Environment;\n try {\n environment = await this.get(ENV_JSON_URL);\n } catch {\n console.warn('No downloadable \"env.json\" was found. Fallback to default:', environment);\n }\n\n let configResponse;\n try {\n configResponse = await this.get(environment.configUrl);\n if (configResponse) {\n console.info(`Configuration file ${environment.configUrl} was downloaded`, configResponse);\n return configResponse as Configuration;\n }\n } catch {\n throw new MissingApplicationConfigurationError(\n `Failed to download configuration from \"${environment.configUrl}\". Ensure that there is a\n \"configuration.default.json\" JSON file in the assets folder or provide an \"env.json\" file pointing to another\n configuration file.`\n );\n }\n }\n}\n","import {Service} from '../../providers/service/service';\nimport {Configuration} from '../../models/configuration';\nimport {ServiceProvider} from '../../providers';\nimport {ConfigurationRestService} from './configuration-rest.service';\nimport {ConfigurationContextService} from './configuration-context.service';\n\n/**\n * Service responsible for managing the application configuration.\n */\nexport class ConfigurationService implements Service {\n private readonly configurationRestService: ConfigurationRestService;\n\n constructor() {\n this.configurationRestService = ServiceProvider.get(ConfigurationRestService);\n }\n\n /**\n * Retrieves the application configuration by fetching it from the server.\n * The configuration is then stored in the ConfigurationContextService for easy access throughout the application.\n *\n * @returns A Promise that resolves to the application configuration object, or undefined if not found.\n */\n async getConfiguration(): Promise<Configuration | undefined> {\n const config = await this.configurationRestService.getConfiguration();\n if (config) {\n ServiceProvider.get(ConfigurationContextService).updateApplicationConfiguration(config);\n }\n return config;\n }\n}\n","import {WindowService} from '../window';\n\n/**\n * Utility class for build-related functionality.\n */\nexport class BuildUtil {\n /**\n * Determines if the application is running in development mode.\n *\n * @returns {boolean} True if the application is in development mode, false otherwise.\n */\n static isDevMode(): boolean {\n return WindowService.getWindow().wbDevMode;\n }\n}\n","import {BuildUtil} from './build-util';\n\n/**\n * Utility class for handling and manipulating URIs.\n */\nexport class UriUtil {\n private static readonly ABS_URI_REGEX = /^<?(http|urn).*>?/;\n static GRAPHS_VISUALIZATIONS_URL = 'graphs-visualizations';\n static RESOURCE_URL = 'resource';\n static BASE_DOCUMENTATION_URL = 'https://graphdb.ontotext.com/documentation/';\n static LATEST_UNOFFICIAL_VERSION = 'master';\n\n /**\n * Shortens an IRI (Internationalized Resource Identifier) by extracting the hostname and port.\n * If the hostname is not an IPv4 address, only the first segment of the domain is used.\n *\n * @param iri - The full IRI to shorten.\n * @returns A shortened version of the IRI in the format `hostname:port`.\n *\n * @example\n * // Shorten an IRI with a full domain name\n * const iri = \"http://example.com:8080/path\";\n * console.log(UriUtil.shortenIri(iri)); // Outputs \"example:8080\"\n *\n * @example\n * // Shorten an IRI with an IPv4 address\n * const iri = \"http://192.168.1.1:3000/path\";\n * console.log(UriUtil.shortenIri(iri)); // Outputs \"192.168.1.1:3000\"\n */\n static shortenIri(iri: string): string {\n const parser = document.createElement('a');\n\n parser.href = iri;\n let hostname = parser.hostname;\n if (!UriUtil.containsIPV4(parser.hostname)) {\n hostname = parser.hostname.split('.')[0];\n }\n return hostname + ':' + parser.port;\n }\n\n /**\n * Checks whether a given hostname contains an IPv4 address.\n *\n * An IPv4 address consists of four blocks of numbers (0-255) separated by dots.\n *\n * @param ip - The hostname or IP address to check.\n * @returns `true` if the hostname is a valid IPv4 address, otherwise `false`.\n *\n * @example\n * // Check an IPv4 address\n * console.log(UriUtil.containsIPV4(\"192.168.1.1\")); // Outputs true\n *\n * @example\n * // Check a non-IPv4 hostname\n * console.log(UriUtil.containsIPV4(\"example.com\")); // Outputs false\n */\n static containsIPV4(ip: string) {\n const blocks = ip.split('.');\n for (let i = 0, sequence = 0; i < blocks.length; i++) {\n if (parseInt(blocks[i], 10) >= 0 && parseInt(blocks[i], 10) <= 255) {\n sequence++;\n } else {\n sequence = 0;\n }\n if (sequence === 4) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Creates a redirect URL for autocomplete suggestions.\n *\n * @param redirectUrl - The base URL for the redirect.\n * @param resourceUri - The URI of the autocomplete suggestion.\n */\n static createAutocompleteRedirect(redirectUrl: string, resourceUri: string): string {\n return `${redirectUrl}?uri=${encodeURIComponent(resourceUri)}`;\n }\n\n /**\n * Removes angle brackets from a URI if they are present.\n *\n * This function checks if a URI is enclosed in angle brackets (< and >)\n * and removes them if they exist. This is useful for handling URIs in\n * different formats, particularly when working with RDF data where URIs\n * are often enclosed in angle brackets.\n *\n * @param uri - The URI string that may or may not be enclosed in angle brackets.\n * @returns The URI with angle brackets removed if they were present, otherwise the original URI.\n */\n static removeAngleBrackets(uri: string): string {\n if (uri?.startsWith('<') && uri?.endsWith('>')) {\n return uri.substring(1, uri.length - 1);\n }\n return uri;\n }\n\n /**\n * Validates if a string is a properly formatted URI.\n *\n * The function checks if the URI has a valid protocol (http(s) or urn)\n * and proper structure. For HTTP URIs, it verifies the presence of\n * schema slashes (//) and content after them. For URN URIs, it checks\n * if there's content after the \"urn:\" prefix.\n *\n * @param uri - The string to validate as a URI.\n * @returns `true` if the string is a valid URI, otherwise `false`.\n */\n static isValidUri(uri: string): boolean {\n let valid = false;\n if (this.hasValidProtocol(uri)) {\n if (uri.indexOf('http') >= 0) {\n const schemaSlashesIdx = uri.indexOf('//');\n valid = schemaSlashesIdx > 4\n && uri.substring(schemaSlashesIdx + 2).length > 0;\n } else if (uri.indexOf('urn') >= 0) {\n valid = uri.substring(4).length > 0;\n }\n }\n return valid;\n }\n\n /**\n * Resolves a documentation URL based on the product version and endpoint path.\n *\n * This function constructs a complete documentation URL by combining the base documentation URL\n * with the appropriate version and endpoint path. For unofficial versions (containing a hyphen)\n * or when in development mode, it uses the latest unofficial version instead of the provided version.\n *\n * @param productVersion - The version of the product for which to retrieve documentation.\n * If it contains a hyphen, it's considered an unofficial version.\n * @param endpointPath - The specific documentation endpoint path to append to the URL.\n * @returns A complete documentation URL string pointing to the specified resource.\n * @throws {Error} If either productVersion or endpointPath is not provided.\n *\n * @example\n * const docUrl = UriUtil.resolveDocumentationUrl('10.0.0', 'sparql-endpoint');\n * // Returns: 'https://graphdb.ontotext.com/documentation/10.0.0/sparql-endpoint'\n */\n static resolveDocumentationUrl(productVersion: string, endpointPath: string): string {\n if (!productVersion || !endpointPath) {\n throw new Error('Product version and endpoint path are required for documentation URL resolution.');\n }\n\n const isUnofficialVersion = productVersion.includes('-');\n const version = (BuildUtil.isDevMode() || isUnofficialVersion) ? this.LATEST_UNOFFICIAL_VERSION : productVersion;\n return `${this.BASE_DOCUMENTATION_URL}${version}/${endpointPath}`;\n }\n\n private static hasAngleBrackets(uri: string): boolean {\n return uri.startsWith('<') && uri.endsWith('>');\n }\n\n private static hasNoAngleBrackets(uri: string): boolean {\n return !uri.startsWith('<') && !uri.endsWith('>');\n }\n\n private static hasValidProtocol(uri: string): boolean {\n return this.ABS_URI_REGEX.test(uri) && (this.hasNoAngleBrackets(uri) || this.hasAngleBrackets(uri));\n }\n}\n","import {Service} from '../../providers/service/service';\n\n/**\n * A generator class for Fibonacci sequence numbers.\n */\nexport class FibonacciGenerator implements Service {\n /** Current first number in the sequence calculation */\n private fibo1 = 0;\n /** Current second number in the sequence calculation */\n private fibo2 = 1;\n\n /**\n * Generates the next Fibonacci number in the sequence.\n * Each call advances the sequence by one position.\n *\n * @returns The next number in the Fibonacci sequence\n */\n next(): number {\n const next = this.fibo2;\n this.fibo2 = this.fibo1 + this.fibo2;\n this.fibo1 = next;\n return next;\n };\n\n /**\n * Resets the generator to its initial state.\n * After calling this method, the next call to next() will return 1.\n */\n reset = () => {\n this.fibo1 = 0;\n this.fibo2 = 1;\n };\n}\n"],"names":["ObjectUtil","deepEqual","obj1","obj2","constructor","Array","isArray","length","i","keys1","Object","keys","keys2","key","deepCopy","obj","map","item","result","create","getPrototypeOf","hasCopyMethod","value","prototype","hasOwnProperty","call","copy","Model","this","ModelList","items","super","getItems","sort","comparator","filter","filterFunction","find","isEmpty","addToStart","unshift","addItems","push","remove","index","indexOf","splice","SubscriptionList","subscriptions","add","subscription","addAll","unsubscribeAll","forEach","Repository","data","id","title","type","sesameType","uri","externalUrl","location","state","local","readable","writable","unsupported","isNew","toRepositoryReference","REPOSITORY_LOCATION_ID_COMPARATOR","r1","r2","locationComparison","localeCompare","RepositoryList","repositories","findRepository","repositoryId","repository","sortByLocationAndId","filterByRepository","createIdLocationFilter","itemsToMatch","some","match","RepositorySizeInfo","inferred","total","explicit","RepositoryState","RepositoryType","NamespaceMap","namespaces","setNamespaces","getByPrefix","prefix","RepositoryLocation","label","username","password","authType","locationType","active","system","errorMsg","defaultRepository","RepositoryLocationType","Event","name","payload","NAME","EventName","NAVIGATION_END","NAVIGATION_START","LOGOUT","APP_DATA_LOADED","NavigationEnd","oldUrl","newUrl","NavigationEndPayload","NavigationStart","cancelNavigation","Logout","AuthenticationType","MapperProvider","Map","get","typeName","MAPPER_INSTANCES","has","instance","set","ServiceProvider","SERVICE_INSTANCES","implementsLifecycleHooks","onCreated","getAllBySuperType","superType","from","values","service","serviceClass","AuthorityList","authorities","hasAuthority","authority","includes","Mapper","AuthorityListMapper","mapToModel","AuthenticatedUser","external","appSettings","AuthSettings","enabled","AuthSettingsMapper","SecurityConfig","config","authImplementation","passwordLoginEnabled","freeAccess","overrideAuth","openIdEnabled","userLoggedIn","freeAccessActive","hasExternalAuthUser","Authority","RestrictedPages","pages","isRestricted","pageUrl","setPageRestriction","OpenIdConfig","openIdKeys","openIdTokenUrl","openIdKeysUri","openIdEndSessionUrl","supportsOfflineAccess","Rights","CapabilityListMapper","CapabilityList","License","expiryDate","latestPublicationDate","licensee","maxCpuCores","product","productType","licenseCapabilities","version","installationId","valid","typeOfUse","message","present","usageRestriction","_expiryDate","_latestPublicationDate","_licensee","_maxCpuCores","_product","_productType","_licenseCapabilities","_version","_installationId","_valid","_typeOfUse","_message","_present","_usageRestriction","Capability","capabilities","ProductInfo","workbench","Workbench","productVersion","sesame","connectors","shortVersion","resolveShortVersion","majorMinorMatch","exec","baseVersion","attributeMatch","StorageData","getValue","getValueOrDefault","defaultValue","getAsJson","JSON","parse","error","console","StorageKey","static","AvailableLanguagesList","languages","getLanguageCodes","language","AvailableLanguagesListMapper","LanguageConfig","defaultLanguage","availableLanguages","CookieConsent","policyAccepted","statistic","thirdParty","updatedAt","OperationStatus","STATUS_ORDER","INFORMATION","WARNING","CRITICAL","OperationGroupSummary","group","status","totalOperations","OperationStatusSummary","operationStatusSummary","allRunningOperations","toOperationsGroupSummary","groupToOperationSummary","operation","summary","count","OperationList","operations","OperationType","OperationGroup","OPERATIONS_WITH_COUNT","QUERIES","UPDATES","IMPORT","OPERATION_TYPE_TO_HREF","BACKUP_AND_RESTORE","CLUSTER_HEALTH","OPERATION_TYPE_TO_GROUP","QUERY","BACKUP","CLUSTER","Operation","getCount","href","labelKey","getLabelKey","parseInt","OperationGroupSummaryList","operationGroupSummaries","ToastrPosition","ToastConfig","timeout","onClick","removeOnClick","ToastrConfig","position","getDefaultConfig","BOTTOM_RIGHT","ToastType","GeneratorUtils","uuid","HEX_RADIX","timestamp","Date","getTime","performanceNow","performance","now","replace","char","random","Math","floor","toString","hashCode","str","hash","len","charCodeAt","ToastMessage","CREATE_TOAST_EVENT","ToastMessageList","toasts","SearchButtonList","buttons","SearchButtonConfig","setRadio","isRadio","setButtons","getButtons","radio","selectButton","button","selected","deselectAll","callback","btn","SearchButton","SuggestionList","suggestions","AutocompleteSearchResult","searchResult","setSuggestions","suggestionList","getSuggestions","_suggestions","hoverFirstSuggestion","hoverSuggestion","suggestion","clearHoveredState","setHovered","selectSuggestion","clearSelectedState","setSelected","getHoveredSuggestion","isHovered","hoverPreviousSuggestion","currentIndex","findIndex","hoverNextSuggestion","clearSuggestions","getByValue","Suggestion","overrideToVisual","setId","setType","setValue","setDescription","description","getId","_id","getType","_type","_value","getDescription","_description","_hovered","hovered","isSelected","_selected","getOverrideToVisual","setOverrideToVisual","override","SuggestionType","SuggestionSelectedPayload","context","setSuggestion","setContext","getSuggestion","getContext","LifecycleState","PluginsManifest","plugins","_pluginDefinitions","getPluginDefinitions","ExtensionPoint","PluginDefinitionList","ValueContext","callbackFunctions","beforeChangeValidationPromises","afterValueChangeCallbackFunctions","getCopy","callbackFunction","subscribe","beforeChangeValidationPromise","afterChangeCallback","fn","canUpdate","beforeChangePromises","validator","Promise","all","every","ContextSubscriptionManager","subscribers","unsubFns","subscribeToService","sub","subscribeAll","unsub","subscribeToAllRegisteredContexts","services","ContextService","canSubscribeAll","subscriber","unsubscribed","_canSubscribeAll","updateContextProperty","propertyName","getOrCreateValueContext","validatePropertyChange","getContextPropertyValue","valueContext","undefined","unsubscribeFns","getContextFields","canHandle","fieldName","HttpInterceptor","priority","LocalStorageService","getStorage","localStorage","getItem","getPrefixedKey","storeValue","setItem","removeItem","globalLocalPrefix","GLOBAL_NAMESPACE","NAMESPACE","localPrefix","startsWith","LocalStorageSubscriptionHandlerService","handleStorageChange","event","withoutGlobalPrefix","substring","namespace","contextPropertyKey","handler","resolveHandler","newValue","warn","AuthenticationStorageService","jwtKey","authenticatedKey","getAuthToken","setAuthenticated","authenticated","isAuthenticated","RepositoryStorageService","SELECTED_REPOSITORY","setRepositoryReference","repositoryReference","serializeRepositoryReference","getRepositoryReference","deserializeRepositoryReference","removeRepositoryReference","stringify","serializedRepositoryReference","e","SecurityContextService","RESTRICTED_PAGES","SECURITY_CONFIG","AUTHENTICATED_USER","AUTH_TOKEN","OPEN_ID_CONFIG","getRestrictedPages","updateRestrictedPages","restrictedPages","onRestrictedPagesChanged","onAuthTokenChanged","updateAuthToken","updateSecurityConfig","securityConfig","onSecurityConfigChanged","getSecurityConfig","updateAuthenticatedUser","authenticatedUser","onAuthenticatedUserChanged","getAuthenticatedUser","updateOpenIdConfig","openIdConfig","getOpenIdConfig","WindowService","getWindow","window","getPluginRegistry","PluginRegistry","navigateTo","url","preventDefault","navigate","singleSpa","navigateToUrl","openInNewTab","open","isHomePage","getPathName","pathname","getContextName","getOrigin","origin","document","querySelector","getAttribute","getCurrentRoute","REQUEST_INTERCEPTORS","authStorage","repositoryStorageService","securityContextService","process","request","headers","authToken","Authorization","resolve","shouldProcess","RESPONSE_INTERCEPTORS","reload","reject","InterceptorService","preProcessors","postProcessors","registerRequestInterceptors","registerResponseInterceptors","preProcess","processedRequest","interceptor","postProcess","response","processedResponse","sortInterceptors","interceptors","a","b","HttpRequest","method","body","EventEmitter","emit","customEvent","CustomEvent","detail","getHostElement","dispatchEvent","eventName","listener","addEventListener","removeEventListener","JSON_CONTENT_TYPES","HTTP_REQUEST_DONE_EVENT","HttpService","interceptorService","eventEmitter","params","then","post","put","delete","patch","encodeURIComponentStrict","encodeURIComponent","c","options","queryString","buildQueryParams","fullUrl","Accept","fetch","ok","hasValidJson","json","finally","responseContentType","contentType","URLSearchParams","LanguageRestService","I18N_ENDPOINT","getLanguage","languageCode","getLanguageConfiguration","LanguageConfigMapper","LanguageStorageService","LanguageContextService","LANGUAGE_CONFIG","SELECTED_LANGUAGE","LANGUAGE_BUNDLE","DEFAULT_BUNDLE","updateSelectedLanguage","locale","shouldSet","selectedLanguage","LanguageService","getDefaultLanguage","onSelectedLanguageChanged","updateLanguageBundle","bundle","onLanguageBundleChanged","updateDefaultBundle","getDefaultBundle","getLanguageConfig","setLanguageConfig","languageConfig","getSelectedLanguage","languageRestService","languageContextService","getSupportedLanguages","RepositoryRestService","getRepositories","REPOSITORIES_ENDPOINT","getRepositorySizeInfo","RepositoryMapper","RepositoryListMapper","repositoryMapper","entries","repositoriesData","repositoryData","RepositorySizeInfoMapper","RepositoryService","GRAPHQL_REPO_AUTHORITY","repositoryRestService","repositoryListMapper","repositorySizeInfoMapper","isSystemRepository","getCurrentGqlRepoAuthority","action","repoId","getCurrentRepoAuthority","getOverallGqlRepoAuthority","getOverallRepoAuthority","getLocationSpecificId","repo","RepositoryContextService","REPOSITORY_LIST","updateSelectedRepository","storageService","selectedRepository","canChange","getSelectedRepository","onSelectedRepositoryChanged","updateRepositoryList","getRepositoryList","onRepositoryListChanged","RepositoryLocationRestService","getActiveRepositoryLocation","RepositoryLocationMapper","RepositoryLocationService","locationRestService","repositoryLocationMapper","RepositoryLocationContextService","ACTIVE_REPOSITORY_LOCATION","IS_LOADING","updateActiveRepositoryLocation","repositoryLocation","onActiveLocationChanged","updateIsLoading","isLoading","onIsLoadingChanged","LicenseRestService","getLicense","LicenseMapper","LicenseContextService","GRAPHDB_LICENSE","updateGraphdbLicense","license","onLicenseChanged","callbackFn","LicenseService","licenseRestService","licenseMapper","trackableProductTypes","trackableTypesOfUse","isTrackableLicense","licenseTypeOfUse","toLowerCase","ProductInfoContextService","PRODUCT_INFO","updateProductInfo","productInfo","onProductInfoChanged","ProductInfoMapper","ProductInfoRestService","VERSION_URL","getProductInfoLocal","ProductInfoService","productInfoMapper","productInfoService","SecurityConfigMapper","EventObserver","notify","EventService","eventSubscribers","observer","unsubscribe","RouteRegexParamPair","regex","routeParams","setRegex","setRouteParams","getRegex","getRouteParams","RouteItemModel","routeItem","_url","_module","module","_path","path","_chunk","chunk","_controller","controller","_templateUrl","templateUrl","_title","_reloadOnSearch","reloadOnSearch","_helpInfo","helpInfo","_documentationUrl","documentationUrl","_allowAuthorities","allowAuthorities","RoutingService","routeConfig","ROUTE","getActiveRoute","activeRoute","route","routeToRegex","test","pattern","_","slash","option","optional","star","RegExp","AuthenticationService","repositoryService","login","logout","isLoggedIn","user","hasFreeAccess","hasRole","role","IS_AUTHENTICATED_FULLY","isSecurityEnabled","canReadRepo","isAdminOrRepoManager","hasBaseRights","READ","canReadGqlRepo","hasGraphqlAuthority","canWriteGqlRepo","WRITE","hasGqlRights","ROLE_ADMIN","resolveAuthorities","allowAuth","authoritiesList","overCurrentRepoGraphql","overAllReposGraphql","ROLE_REPO_MANAGER","overCurrentRepo","overAllRepos","AuthenticatedUserMapper","SecurityRestService","SECURITY_ENDPOINT","updateUserData","SecurityService","securityRestService","OpenidConfigMapper","COOKIE_CONSENT_CHANGED_EVENT","CookieService","acceptCookiePolicy","setAcceptedCookiePolicy","COOKIE_CONSENT","cookieConsent","MonitoringRestService","MONITORING_ENDPOINT","getOperations","OPERATION_TYPE_SORT_ORDER","OperationListMapper","OperationSummaryMapper","MonitoringService","OperationGroupSummaryListMapper","OntoToastrService","createToastElement","ERROR","info","INFO","success","SUCCESS","warning","AutocompleteRestService","autocompleteRestPrefix","search","searchTerm","SuggestionListMapper","AutocompleteSearchResultMapper","AutocompleteService","isAutocompleteEnabled","AutocompleteStorageService","ENABLED_KEY","isEnabled","setEnabled","AutocompleteContextService","AUTOCOMPLETE_ENABLED","updateAutocompleteEnabled","onAutocompleteEnabledChanged","NamespaceMapMapper","results","bindings","reduce","acc","binding","NamespacesRestService","getNamespaces","NamespacesService","namespaceMapper","namespacesRestService","NamespacesContextService","NAMESPACES","updateNamespaces","onNamespacesChanged","ResourceSearchStorageService","SELECTED_VIEW_KEY","INPUT_KEY","LAST_SELECTED_KEY","LEGACY_LAST_SELECTED_KEY","LEGACY_INPUT_KEY","LEGACY_SELECTED_VIEW_KEY","setSelectedView","viewType","getSelectedView","setInputValue","getInputValue","setLastSelected","getLastSelectedValue","clearStoredSearch","NavigationContextService","PREVIOUS_ROUTE","updatePreviousRoute","getPreviousRoute","previousRoute","endsWith","slice","ApplicationLifecycleContextService","APPLICATION_DATA_STATE","updateApplicationDataState","onApplicationDataStateChanged","ConfigurationContextService","APPLICATION_CONFIGURATION","updateApplicationConfiguration","configuration","getApplicationConfiguration","PluginsRestService","configurationContextService","getPluginsManifest","pluginsManifestPath","loadPlugins","pluginsManifest","async","entryUrl","pluginDef","entry","import","err","PluginsManifestMapper","pluginDefinitions","PluginsService","pluginsRestService","pluginsManifestMapper","pluginModule","register","ErrorBase","Error","text","MissingApplicationConfigurationError","ConfigurationRestService","getConfiguration","configResponse","environment","envDefault","configUrl","ConfigurationService","configurationRestService","BuildUtil","isDevMode","wbDevMode","UriUtil","shortenIri","iri","parser","createElement","hostname","containsIPV4","split","port","ip","blocks","sequence","createAutocompleteRedirect","redirectUrl","resourceUri","removeAngleBrackets","isValidUri","hasValidProtocol","schemaSlashesIdx","resolveDocumentationUrl","endpointPath","isUnofficialVersion","LATEST_UNOFFICIAL_VERSION","BASE_DOCUMENTATION_URL","hasAngleBrackets","hasNoAngleBrackets","ABS_URI_REGEX","FibonacciGenerator","fibo1","fibo2","next","reset"],"sourceRoot":""}
|