diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index ff435232f..36ef716b1 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -2,9 +2,9 @@ name: E2E Tests on: push: - branches: [main] + branches: [develop] pull_request: - branches: [main] + branches: [develop] jobs: e2e: diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index f5ebbad57..f94d6cdfe 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -18,6 +18,7 @@ jobs: env: USE_META_CONFIGURATOR_BASE_PATH: true # Set to true for GitHub Pages deployment VITE_FRONTEND_HOSTNAME: https://metaconfigurator.github.io/meta-configurator + EXPERIMENTAL: true run: | cd meta_configurator npm ci diff --git a/.github/workflows/tag-version.yml b/.github/workflows/tag-version.yml new file mode 100644 index 000000000..4e5db4d6f --- /dev/null +++ b/.github/workflows/tag-version.yml @@ -0,0 +1,28 @@ +name: Tag Version +on: + push: + branches: + - main + - develop +permissions: + contents: write +jobs: + tag-version: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Create tag if version is new + run: | + VERSION=$(node -p "require('./meta_configurator/package.json').version") + TAG="v$VERSION" + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists, skipping." + else + git tag "$TAG" + git push origin "$TAG" + echo "Created and pushed tag $TAG." + fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a1588b71..592879eac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [2.5.0] - 2026-04-22 + +### Added + +- Add next/previous buttons to the search bar for easier navigation through search results +- Add copy/paste support for schema diagrams + +## [2.4.0] - 2026-04-15 + +### Added + +- Add RDF Panel to support RDF authoring workflows +- Add JSON to JSON-LD conversion using RML mapping +- Add SPARQL querying support in RDF Panel +- Add Knowledge Graph visualization for RDF data exploration + +## [2.3.0] - 2026-04-14 + +### Changed + +- Remove prototypical STML mapping in favor of more powerful Jsonata +- Refactor the code base to use a newly implemented JSON Schema visitor pattern instead of having schema traversal logic implemented in different places + +### Fixed + +- Fix schema diagram: it now correctly draws multiple edges if a sub-schema defines its own structure and additionally has a reference + +## [2.2.0] - 2026-03-27 + +### Added + +- Add word-wrap for text editor +- Add `experimental` tag in the About page for the experimental deployment +- Add workflow to automatically generate a git tag when a PR is merged into `main` or `develop` with an incremented version in the package.json + +### Changed + +- Update multiple dependencies (picomatch, handlebars, yaml) + ## [2.1.0] - 2026-03-25 Initial versioned release. Introduces semantic versioning, a structured branching model (`develop` / `main`), and contribution guidelines. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d5215b18..df293cbf7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -98,9 +98,10 @@ No specific format is enforced, but commit messages should start with a verb and ## Releases Releases are managed manually by maintainers. When a set of changes on `develop` is deemed stable, a maintainer will: -1. Update the version in `meta_configurator/package.json` -2. Add a changelog entry -3. Merge `develop` into `main` +1. Update the version in `meta_configurator/package.json` and `codemeta.json`. +2. Run `npm install` to update the lock file version. +3. Add a changelog entry to `CHANGELOG.md` following the format defined in that file +4. Merge `develop` into `main` --- diff --git a/README.md b/README.md index 4345e6b22..5f69d3d66 100644 --- a/README.md +++ b/README.md @@ -65,10 +65,17 @@ Creating structured data files (or schemas) manually can be complex and error-pr * **Documentation Generation** – Generate documentation from JSON schemas, with export to a Markdown file. -* **AI-Assisted Schema/Data Creation and Editing** – Use AI to help create or edit schemas and instance data with natural language inputs. +* **AI-Assisted Schema/Data Creation and Editing** – Use AI to help create or edit schemas and instance data with natural language inputs. -* **AI-Assisted Transformation of Instance Data** – Automatically transform existing instance data to conform to the target schema using AI-generated mappings, which are then applied deterministically. This also works for very large documents. +* **AI-Assisted Transformation of Instance Data** – Automatically transform existing instance data to conform to the target schema using AI-generated mappings, which are then applied deterministically. This also works for very large documents. +* **Transformation to JSON-LD** – Convert JSON data to JSON-LD using AI-assisted RML mapping. + +* **RDF Authoring Panel** – Inspect and edit RDF data through two synchronized tabs: **Context** and **Triples** in RDF Panel. + +* **RDF Data Exploration** – Run AI-assisted SPARQL queries on RDF data and inspect or visualize the results. + +* **Knowledge Graph Visualization** – Display RDF triples as an interactive graph, synchronized with the JSON-LD document. 🛠️ Development --------------- @@ -107,7 +114,7 @@ Explore how to use MetaConfigurator with real-world examples: * **[External References](./documentation_user/examples/external_references)** – Learn how to handle external references in MetaConfigurator. - +* **[RDF Panel](./documentation_user/examples/rdf)** – Learn how to use MetaConfigurator to explore Semantic data. 📚 Read the full [User Documentation](./documentation_user). @@ -136,7 +143,9 @@ pages = {1--9} MetaConfigurator runs entirely **inside your browser** - it does **not** send your schemas, data, or anything you type to any server. The website itself is just a static page delivered by GitHub Pages (like downloading a PDF or image), and all the work happens locally on your computer. -The only exception is if you **click the “Share Snapshot” button**. Then, and only then, the snapshot you create is sent to a **University of Stuttgart** server so you can share a unique link with others. +The exception is if you **click the “Share Snapshot” button**. Then, and only then, the snapshot you create is sent to a **University of Stuttgart** server so you can share a unique link with others. + +Additionally, if you use the optional AI assistance functionality, relevant subsets of your schema and data are shared with the AI endpoint you configure in the MetaConfigurator settings (by default OpenAI). This will not accidentally happen, as an authentification key from the AI endpoint provider is needed to use the AI assistance features. **See our [full Privacy Policy](PRIVACY.md)** for more information. diff --git a/codemeta.json b/codemeta.json index 8705142d6..165657332 100644 --- a/codemeta.json +++ b/codemeta.json @@ -105,7 +105,7 @@ "Browser", "Web" ], - "version": "2.0.0", + "version": "2.5.0", "contIntegration": "https://github.com/MetaConfigurator/meta-configurator/actions", "codemeta:continuousIntegration": { "id": "https://github.com/MetaConfigurator/meta-configurator/actions" diff --git a/documentation_user/README.md b/documentation_user/README.md index 316e03cf1..7c71d3ce6 100644 --- a/documentation_user/README.md +++ b/documentation_user/README.md @@ -8,6 +8,7 @@ * [Schema Selection List](examples/schema_selection_list) (Provide your users a pre-defined list of schemas to choose from; useful for organizations) * [AI Assistance](examples/ai_assistance) (Shows how to use AI-assisted features for schema and data creation/editing, as well as data transformation) * [External References](examples/external_references) (Shows how to handle external references in MetaConfigurator) +* [RDF Panel](examples/rdf) (How to use RDF Panel in MetaConfigurator) ## Load a Schema diff --git a/documentation_user/examples/rdf/README.md b/documentation_user/examples/rdf/README.md new file mode 100644 index 000000000..74813b28a --- /dev/null +++ b/documentation_user/examples/rdf/README.md @@ -0,0 +1,208 @@ +# MetaConfigurator RDF Panel User Guide + +This guide explains how to use the RDF panel in MetaConfigurator. You will move from plain JSON to a queryable and visual knowledge graph: + +1. Start from structured JSON in the Data tab. +2. Open the RDF panel. +3. Convert JSON to JSON-LD with RML (optionally with AI drafting). +4. Review and edit triples in the RDF panel. +5. Use ontology assistance when choosing IRIs. +6. Run SPARQL queries (also with AI drafting). +7. Explore and refine the graph visually. + +--- + +## Data + +We use two main examples throughout this document: a simple simulation dataset and a MOF dataset. + +- [`samples/simulation-data.json`](./samples/simulation-data.json) +- [`samples/simulation-mapping.ttl`](./samples/simulation-mapping.ttl) +- [`samples/simulation-data.jsonld`](./samples/simulation-data.jsonld) +- [`samples/simulation-query.sparql`](./samples/simulation-query.sparql) + +- [`samples/mof-data.json`](./samples/mof-data.json) +- [`samples/mof-mapping.ttl`](./samples/mof-mapping.ttl) +- [`samples/mof-data.jsonld`](./samples/mof-data.jsonld) +- [`samples/mof-prep-query.sparql`](./samples/mof-prep-query.sparql) + +--- + +## 1) Start with JSON Data + +Begin with your normal structured JSON (simulation data, lab records, process logs, etc.). + +- Simulation example: [`samples/simulation-data.json`](./samples/simulation-data.json) +- MOF example: [`samples/mof-data.json`](./samples/mof-data.json) + +Open the RDF panel in the Data tab by clicking the globe icon. + +![Opening RDF Panel](./images/RDF-Panel.png) + +Initially, the panel shows a warning that your data is not in JSON-LD format. This means: + +- Your data is already valid JSON. +- It is not yet ready for semantic querying until converted to JSON-LD. + +![RDF panel with JSON input](./images/MC-RDF-JSON.png) + +Now you have two options to proceed: + +- Use the **JSON to JSON-LD** (RML conversion) tool, or +- Use **Turtle import** if your data is already in RDF/Turtle format. + +Before using RML mapping, please review the RML documentation at [this link](https://rml.io/docs/rml/introduction/). + +--- + +## 2) Convert JSON to JSON-LD with RML + +Use the RML mapping dialog to define how JSON fields become RDF entities and relationships. + +Again, you can proceed in two ways: + +- Paste an existing RML mapping, or +- Generate a draft mapping with AI and then adjust it. + +![RML mapping dialog](./images/MC-RDF-RML-1.png) + +Sample mappings: + +- Simulation mapping: [`samples/simulation-mapping.ttl`](./samples/simulation-mapping.ttl) +- MOF mapping: [`samples/mof-mapping.ttl`](./samples/mof-mapping.ttl) + +Practical recommendation: + +- Treat AI-generated mapping as a first draft. +- Confirm identifiers, classes, and property choices before applying. + +--- + +## 3) Inspect and Edit JSON-LD / RDF Triples + +After conversion, the RDF panel gives two synchronized tabs: + +- **Context**: manage prefix and context definitions. +- **Triples**: manage subject-predicate-object statements. + +![Context view](./images/MC-RDF-JSON-LD-2.png) + +![Triples view](./images/MC-RDF-JSON-LD-1.png) + +![Triple edit modal](./images/MC-RDF-Modal.png) + +Typical tasks in the **Triples** tab: + +- Add, edit, and delete triples. +- Search and filter across subject, predicate, object. +- Export graph data as Turtle, N-Triples, or RDF/XML. +- Open SPARQL and visualization directly from the same toolbar. + +Note: If you filter data in the Triples tab and then open the visualization dialog, you will see only the graph for the filtered data, not the entire dataset. + +Sample JSON-LD outputs: + +- Simulation: [`samples/simulation-data.jsonld`](./samples/simulation-data.jsonld) +- MOF : [`samples/mof-data.jsonld`](./samples/mof-data.jsonld) + +--- + +## 4) Use Ontology-Assisted IRI Selection + +When editing predicates or object IRIs, open **Ontology Explorer** for guided selection. + +![Ontology explorer](./images/MC-RDF-Ontology-1.png) + +![Ontology explorer SPARQL](./images/MC-RDF-Ontology-3.png) + +What you can do there: + +- Select a prefix from your current `@context`. +- Download ontology content by URL or upload an ontology file. +- Reuse cached ontology data, refresh it, or delete it. +- Browse `DatatypeProperty`, `ObjectProperty`, and `Class` terms. +- Use ontology-side SPARQL to discover additional terms quickly. +- Pick a term and insert it back into the triple editor. + +This is especially helpful for consistent use of units, classes, and shared vocabularies. + +--- + +## 5) Query with SPARQL (Optional AI Drafting) + +Open SPARQL from the triples toolbar to validate and analyze your graph. + +![SPARQL AI generation](./images/MC-RDF-SPARQL-1.png) + +![SPARQL result table](./images/MC-RDF-SPARQL-2.png) + +![MOF SPARQL result](./images/MC-RDF-SPARQL-3.png) + +![SPARQL visualization hints](./images/MC-RDF-SPARQL-4.png) + +In this dialog, you can: + +- Write or paste SPARQL manually. +- Ask AI to draft a query from a natural-language prompt. You can ask question from your data, since a subset of your JSON-LD data is being sent to the AI-endpoint. +- Run query and inspect results in a filterable table. +- Export results (CSV for tabular outputs when visualization is disabled, and RDF-based extensions for visualization-based queries). + +Visualization note: + +- You can enable query-result visualization mode. +- This mode expects a graph-shaped query result (CONSTRUCT-style output). +- You can also click the visualization help icon near the toggle for more information on how to create a valid query for visualization. + +Sample queries: + +- Simulation: [`samples/simulation-query.sparql`](./samples/simulation-query.sparql) +- MOF prep-step: [`samples/mof-prep-query.sparql`](./samples/mof-prep-query.sparql) + +--- + +## 6) Visualize and Refine the Knowledge Graph + +Use **Visualize** to inspect relationships as a graph. + +![Simulation Knowledge Graph](./images/MC-RDF-KG-1.png) + +![MOF Knowledge Graph](./images/MC-RDF-KG-2.png) + +Two visualization modes: + +- From RDF Triples tab: **editable graph** (rename node, add/delete properties, add/delete nodes). +- From SPARQL visualizer tab: **read-only graph** for query result exploration. + +Useful actions in the visualization dialog: + +- Node search and quick focus. +- Zoom controls and fit-to-view. +- Optional layout animation. +- Export graph image. +- Undo/redo for edits. + +For very large graphs, the app warns before rendering and lets you continue or cancel. + +--- + +## Recommended End-to-End Workflow + +1. Validate raw JSON in Data/Schema views. +2. Convert JSON to JSON-LD using RML (manual or AI draft). +3. Confirm context prefixes and main entities in RDF panel. +4. Clean up triples (missing links, wrong predicates, units, datatypes). +5. Use Ontology Explorer for consistent vocabulary choices. +6. Run SPARQL checks for your key domain questions. +7. Inspect the graph visually and refine remaining issues. +8. Export RDF or query results for downstream use. + +--- + +## Practical Quality Checks + +- Ensure important entities use stable and reusable identifiers. +- Keep prefix usage consistent between `@context`, triples, and queries. +- Use ontology IRIs for units/classes/properties instead of only plain text. +- Review AI-generated mapping/query drafts before trusting them. +- If the triple list is shortened due to display limits, increase RDF display limits in settings before final review. +- Use Named Nodes (nodes with `@id`) instead of Blank Nodes. This makes it easier to find and edit triples in the Text view. diff --git a/documentation_user/examples/rdf/images/MC-RDF-JSON-LD-1.png b/documentation_user/examples/rdf/images/MC-RDF-JSON-LD-1.png new file mode 100644 index 000000000..6c9e78a21 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-JSON-LD-1.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-JSON-LD-2.png b/documentation_user/examples/rdf/images/MC-RDF-JSON-LD-2.png new file mode 100644 index 000000000..09f8a001e Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-JSON-LD-2.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-JSON.png b/documentation_user/examples/rdf/images/MC-RDF-JSON.png new file mode 100644 index 000000000..bfb19cd67 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-JSON.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-KG-1.png b/documentation_user/examples/rdf/images/MC-RDF-KG-1.png new file mode 100644 index 000000000..bbe4eb41f Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-KG-1.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-KG-2.png b/documentation_user/examples/rdf/images/MC-RDF-KG-2.png new file mode 100644 index 000000000..3f99a629f Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-KG-2.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-Modal.png b/documentation_user/examples/rdf/images/MC-RDF-Modal.png new file mode 100644 index 000000000..7c3586834 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-Modal.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-Ontology-1.png b/documentation_user/examples/rdf/images/MC-RDF-Ontology-1.png new file mode 100644 index 000000000..7cda81a04 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-Ontology-1.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-Ontology-3.png b/documentation_user/examples/rdf/images/MC-RDF-Ontology-3.png new file mode 100644 index 000000000..4d3021c83 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-Ontology-3.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-RML-1.png b/documentation_user/examples/rdf/images/MC-RDF-RML-1.png new file mode 100644 index 000000000..1bfca355b Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-RML-1.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-SPARQL-1.png b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-1.png new file mode 100644 index 000000000..bdaad11e0 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-1.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-SPARQL-2.png b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-2.png new file mode 100644 index 000000000..7f694a549 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-2.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-SPARQL-3.png b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-3.png new file mode 100644 index 000000000..c462e97e7 Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-3.png differ diff --git a/documentation_user/examples/rdf/images/MC-RDF-SPARQL-4.png b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-4.png new file mode 100644 index 000000000..7c294f65a Binary files /dev/null and b/documentation_user/examples/rdf/images/MC-RDF-SPARQL-4.png differ diff --git a/documentation_user/examples/rdf/images/RDF-Panel.png b/documentation_user/examples/rdf/images/RDF-Panel.png new file mode 100644 index 000000000..cf9093bd5 Binary files /dev/null and b/documentation_user/examples/rdf/images/RDF-Panel.png differ diff --git a/documentation_user/examples/rdf/samples/mof-data.json b/documentation_user/examples/rdf/samples/mof-data.json new file mode 100644 index 000000000..55aaf994d --- /dev/null +++ b/documentation_user/examples/rdf/samples/mof-data.json @@ -0,0 +1,70 @@ +{ + "Synthesis": [ + { + "Hardware": { "Component": [{ "_id": "S-1", "_type": "glass vial" }] }, + "Metadata": { "_description": "S-1", "_product": "MIL-88B (Fe)" }, + "Procedure": { + "Prep": { + "Step": [ + { "_vessel": "S-1", "$xml_type": "Add", "_amount": { "Unit": "MilliMOL", "Value": 0.4, "$xml_append": "${Value} ${Unit}" }, "_reagent": "FeCl3", "_order": 0 }, + { "_vessel": "S-1", "$xml_type": "Add", "_amount": { "Unit": "MilliMOL", "Value": 0.4, "$xml_append": "${Value} ${Unit}" }, "_reagent": "Benzene-1,4-dicarboxylic acid", "_order": 1 }, + { "_vessel": "S-1", "$xml_type": "Add", "_amount": { "Unit": "MilliL", "Value": 4, "$xml_append": "${Value} ${Unit}" }, "_reagent": "DMF", "_order": 2 } + ] + }, + "Reaction": { + "Step": [ + { "_vessel": "S-1", "$xml_type": "Sonicate", "_time": { "Value": 30.0, "Unit": "MIN", "$xml_append": "${Value} ${Unit}" }, "_order": 0 }, + { "_comment": "In: oven", "_vessel": "S-1", "$xml_type": "HeatChill", "_temp": { "Unit": "DEG_C", "Value": 120.0, "$xml_append": "${Value} ${Unit}" }, "_time": { "Value": 1, "Unit":"DAY", "$xml_append": "${Value} ${Unit}" }, "_order": 1 } + ] + }, + "Workup": { + "Step": [ + { "_vessel": "S-1", "$xml_type": "WashSolid", "_solvent": "EtOH", "_order": 0 }, + { "_vessel": "S-1", "$xml_type": "Dry", "_temp": { "Unit": "DEG_C", "Value": 120.0, "$xml_append": "${Value} ${Unit}" }, "_time": { "Value": 1, "Unit":"DAY", "$xml_append": "${Value} ${Unit}" }, "_pressure": { "Unit": "PA", "Value": 0, "$xml_append": "${Value} ${Unit}" }, "_order": 1 } + ] + } + }, + "Reagents": { + "Reagent": [ + { "_id": "FeCl3", "_name": "FeCl3", "_role": "substrate" }, + { "_id": "Benzene-1%252C4-dicarboxylic%2520acid", "_name": "Benzene-1,4-dicarboxylic acid", "_role": "ligand" }, + { "_id": "DMF", "_name": "DMF", "_role": "solvent" }, + { "_id": "EtOH", "_name": "EtOH", "_role": "solvent" } + ] + } + }, + { + "Hardware": { "Component": [{ "_id": "S-2", "_type": "glass vial" }] }, + "Metadata": { "_description": "S-2", "_product": "MIL-88B+MIL101 (mix phases)" }, + "Procedure": { + "Prep": { + "Step": [ + { "_vessel": "S-2", "$xml_type": "Add", "_amount": { "Unit": "MilliMOL", "Value": 0.4, "$xml_append": "${Value} ${Unit}" }, "_reagent": "FeCl3·6H2O", "_order": 0 }, + { "_vessel": "S-2", "$xml_type": "Add", "_amount": { "Unit": "MilliMOL", "Value": 0.4, "$xml_append": "${Value} ${Unit}" }, "_reagent": "Benzene-1,4-dicarboxylic acid", "_order": 1 }, + { "_vessel": "S-2", "$xml_type": "Add", "_amount": { "Unit": "MilliL", "Value": 4, "$xml_append": "${Value} ${Unit}" }, "_reagent": "DMF", "_order": 2 } + ] + }, + "Reaction": { + "Step": [ + { "_vessel": "S-2", "$xml_type": "Sonicate", "_time": { "Value": 30.0, "Unit": "MIN", "$xml_append": "${Value} ${Unit}" }, "_order": 0 }, + { "_comment": "In: oven", "_vessel": "S-2", "$xml_type": "HeatChill", "_temp": { "Unit": "DEG_C", "Value": 120.0, "$xml_append": "${Value} ${Unit}" }, "_time": { "Value": 1, "Unit":"DAY", "$xml_append": "${Value} ${Unit}" }, "_order": 1 } + ] + }, + "Workup": { + "Step": [ + { "_vessel": "S-2", "$xml_type": "WashSolid", "_solvent": "EtOH", "_order": 0 }, + { "_vessel": "S-2", "$xml_type": "Dry", "_temp": { "Unit": "DEG_C", "Value": 120.0, "$xml_append": "${Value} ${Unit}" }, "_time": { "Value": 1, "Unit":"DAY", "$xml_append": "${Value} ${Unit}" }, "_pressure": { "Unit": "PA", "Value": 0, "$xml_append": "${Value} ${Unit}" }, "_order": 1 } + ] + } + }, + "Reagents": { + "Reagent": [ + { "_id": "FeCl3%25C2%25B76H2O", "_name": "FeCl3·6H2O", "_role": "substrate" }, + { "_id": "Benzene-1%252C4-dicarboxylic%2520acid", "_name": "Benzene-1,4-dicarboxylic acid", "_role": "ligand" }, + { "_id": "DMF", "_name": "DMF", "_role": "solvent" }, + { "_id": "EtOH", "_name": "EtOH", "_role": "solvent" } + ] + } + } + ] +} \ No newline at end of file diff --git a/documentation_user/examples/rdf/samples/mof-data.jsonld b/documentation_user/examples/rdf/samples/mof-data.jsonld new file mode 100644 index 000000000..79e72807b --- /dev/null +++ b/documentation_user/examples/rdf/samples/mof-data.jsonld @@ -0,0 +1,562 @@ +{ + "@context": { + "ex": "http://example.org/", + "chmo": "http://purl.obolibrary.org/obo/CHMO_", + "obo": "http://purl.obolibrary.org/obo/", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "schema": "https://schema.org/", + "xsd": "http://www.w3.org/2001/XMLSchema#" + }, + "@graph": [ + { + "@id": "ex:quantity/prep/S-1-0/amount", + "@type": "schema:PropertyValue", + "rdfs:label": "amount", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MilliMOL" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "4.0E-1" + } + }, + { + "@id": "ex:quantity/prep/S-1-1/amount", + "@type": "schema:PropertyValue", + "rdfs:label": "amount", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MilliMOL" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "4.0E-1" + } + }, + { + "@id": "ex:quantity/prep/S-1-2/amount", + "@type": "schema:PropertyValue", + "rdfs:label": "amount", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MilliL" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "4.0E0" + } + }, + { + "@id": "ex:quantity/prep/S-2-0/amount", + "@type": "schema:PropertyValue", + "rdfs:label": "amount", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MilliMOL" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "4.0E-1" + } + }, + { + "@id": "ex:quantity/prep/S-2-1/amount", + "@type": "schema:PropertyValue", + "rdfs:label": "amount", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MilliMOL" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "4.0E-1" + } + }, + { + "@id": "ex:quantity/prep/S-2-2/amount", + "@type": "schema:PropertyValue", + "rdfs:label": "amount", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MilliL" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "4.0E0" + } + }, + { + "@id": "ex:quantity/reaction/S-1-0/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature" + }, + { + "@id": "ex:quantity/reaction/S-1-0/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MIN" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "3.0E1" + } + }, + { + "@id": "ex:quantity/reaction/S-1-1/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DEG_C" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.2E2" + } + }, + { + "@id": "ex:quantity/reaction/S-1-1/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DAY" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.0E0" + } + }, + { + "@id": "ex:quantity/reaction/S-2-0/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature" + }, + { + "@id": "ex:quantity/reaction/S-2-0/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MIN" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "3.0E1" + } + }, + { + "@id": "ex:quantity/reaction/S-2-1/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DEG_C" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.2E2" + } + }, + { + "@id": "ex:quantity/reaction/S-2-1/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DAY" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.0E0" + } + }, + { + "@id": "ex:quantity/workup/S-1-0/pressure", + "@type": "schema:PropertyValue", + "rdfs:label": "pressure" + }, + { + "@id": "ex:quantity/workup/S-1-0/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature" + }, + { + "@id": "ex:quantity/workup/S-1-0/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time" + }, + { + "@id": "ex:quantity/workup/S-1-1/pressure", + "@type": "schema:PropertyValue", + "rdfs:label": "pressure", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/PA" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "0.0E0" + } + }, + { + "@id": "ex:quantity/workup/S-1-1/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DEG_C" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.2E2" + } + }, + { + "@id": "ex:quantity/workup/S-1-1/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DAY" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.0E0" + } + }, + { + "@id": "ex:quantity/workup/S-2-0/pressure", + "@type": "schema:PropertyValue", + "rdfs:label": "pressure" + }, + { + "@id": "ex:quantity/workup/S-2-0/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature" + }, + { + "@id": "ex:quantity/workup/S-2-0/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time" + }, + { + "@id": "ex:quantity/workup/S-2-1/pressure", + "@type": "schema:PropertyValue", + "rdfs:label": "pressure", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/PA" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "0.0E0" + } + }, + { + "@id": "ex:quantity/workup/S-2-1/temperature", + "@type": "schema:PropertyValue", + "rdfs:label": "temperature", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DEG_C" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.2E2" + } + }, + { + "@id": "ex:quantity/workup/S-2-1/time", + "@type": "schema:PropertyValue", + "rdfs:label": "time", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/DAY" + }, + "schema:value": { + "@type": "xsd:double", + "@value": "1.0E0" + } + }, + { + "@id": "ex:reagent/Benzene-1%25252C4-dicarboxylic%252520acid", + "@type": "obo:CHEBI_24431", + "obo:RO_0000087": "ligand", + "rdfs:label": "Benzene-1,4-dicarboxylic acid" + }, + { + "@id": "ex:reagent/DMF", + "@type": "obo:CHEBI_24431", + "obo:RO_0000087": "solvent", + "rdfs:label": "DMF" + }, + { + "@id": "ex:reagent/EtOH", + "@type": "obo:CHEBI_24431", + "obo:RO_0000087": "solvent", + "rdfs:label": "EtOH" + }, + { + "@id": "ex:reagent/FeCl3", + "@type": "obo:CHEBI_24431", + "obo:RO_0000087": "substrate", + "rdfs:label": "FeCl3" + }, + { + "@id": "ex:reagent/FeCl3%2525C2%2525B76H2O", + "@type": "obo:CHEBI_24431", + "obo:RO_0000087": "substrate", + "rdfs:label": "FeCl3·6H2O" + }, + { + "@id": "ex:step/prep/S-1-0", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Prep", + "obo:OBI_0001937": { + "@id": "ex:quantity/prep/S-1-0/amount" + }, + "obo:RO_0000056": "Add", + "obo:RO_0000057": { + "@id": "ex:reagent/FeCl3" + } + }, + { + "@id": "ex:step/prep/S-1-1", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Prep", + "obo:OBI_0001937": { + "@id": "ex:quantity/prep/S-1-1/amount" + }, + "obo:RO_0000056": "Add", + "obo:RO_0000057": { + "@id": "ex:reagent/Benzene-1%25252C4-dicarboxylic%252520acid" + } + }, + { + "@id": "ex:step/prep/S-1-2", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Prep", + "obo:OBI_0001937": { + "@id": "ex:quantity/prep/S-1-2/amount" + }, + "obo:RO_0000056": "Add", + "obo:RO_0000057": { + "@id": "ex:reagent/DMF" + } + }, + { + "@id": "ex:step/prep/S-2-0", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Prep", + "obo:OBI_0001937": { + "@id": "ex:quantity/prep/S-2-0/amount" + }, + "obo:RO_0000056": "Add", + "obo:RO_0000057": { + "@id": "ex:reagent/FeCl3%2525C2%2525B76H2O" + } + }, + { + "@id": "ex:step/prep/S-2-1", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Prep", + "obo:OBI_0001937": { + "@id": "ex:quantity/prep/S-2-1/amount" + }, + "obo:RO_0000056": "Add", + "obo:RO_0000057": { + "@id": "ex:reagent/Benzene-1%25252C4-dicarboxylic%252520acid" + } + }, + { + "@id": "ex:step/prep/S-2-2", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Prep", + "obo:OBI_0001937": { + "@id": "ex:quantity/prep/S-2-2/amount" + }, + "obo:RO_0000056": "Add", + "obo:RO_0000057": { + "@id": "ex:reagent/DMF" + } + }, + { + "@id": "ex:step/reaction/S-1-0", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Reaction", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/reaction/S-1-0/temperature" + }, + { + "@id": "ex:quantity/reaction/S-1-0/time" + } + ], + "obo:RO_0000056": "Sonicate" + }, + { + "@id": "ex:step/reaction/S-1-1", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Reaction", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/reaction/S-1-1/temperature" + }, + { + "@id": "ex:quantity/reaction/S-1-1/time" + } + ], + "obo:RO_0000056": "HeatChill" + }, + { + "@id": "ex:step/reaction/S-2-0", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Reaction", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/reaction/S-2-0/temperature" + }, + { + "@id": "ex:quantity/reaction/S-2-0/time" + } + ], + "obo:RO_0000056": "Sonicate" + }, + { + "@id": "ex:step/reaction/S-2-1", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Reaction", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/reaction/S-2-1/temperature" + }, + { + "@id": "ex:quantity/reaction/S-2-1/time" + } + ], + "obo:RO_0000056": "HeatChill" + }, + { + "@id": "ex:step/workup/S-1-0", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Workup", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/workup/S-1-0/pressure" + }, + { + "@id": "ex:quantity/workup/S-1-0/temperature" + }, + { + "@id": "ex:quantity/workup/S-1-0/time" + } + ], + "obo:RO_0000056": "WashSolid", + "obo:RO_0000057": { + "@id": "ex:reagent/EtOH" + } + }, + { + "@id": "ex:step/workup/S-1-1", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Workup", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/workup/S-1-1/pressure" + }, + { + "@id": "ex:quantity/workup/S-1-1/temperature" + }, + { + "@id": "ex:quantity/workup/S-1-1/time" + } + ], + "obo:RO_0000056": "Dry" + }, + { + "@id": "ex:step/workup/S-2-0", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Workup", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/workup/S-2-0/pressure" + }, + { + "@id": "ex:quantity/workup/S-2-0/temperature" + }, + { + "@id": "ex:quantity/workup/S-2-0/time" + } + ], + "obo:RO_0000056": "WashSolid", + "obo:RO_0000057": { + "@id": "ex:reagent/EtOH" + } + }, + { + "@id": "ex:step/workup/S-2-1", + "@type": "obo:OBI_0000070", + "obo:OBI_0000293": "Workup", + "obo:OBI_0001937": [ + { + "@id": "ex:quantity/workup/S-2-1/pressure" + }, + { + "@id": "ex:quantity/workup/S-2-1/temperature" + }, + { + "@id": "ex:quantity/workup/S-2-1/time" + } + ], + "obo:RO_0000056": "Dry" + }, + { + "@id": "ex:synthesis/S-1", + "@type": "obo:CHMO_0000568", + "obo:BFO_0000051": [ + { + "@id": "ex:step/prep/S-1-0" + }, + { + "@id": "ex:step/prep/S-1-1" + }, + { + "@id": "ex:step/prep/S-1-2" + }, + { + "@id": "ex:step/reaction/S-1-0" + }, + { + "@id": "ex:step/reaction/S-1-1" + }, + { + "@id": "ex:step/workup/S-1-0" + }, + { + "@id": "ex:step/workup/S-1-1" + } + ], + "obo:OBI_0000299": "MIL-88B (Fe)", + "obo:RO_0000086": "glass vial", + "rdfs:label": "S-1", + "schema:identifier": "S-1" + }, + { + "@id": "ex:synthesis/S-2", + "@type": "obo:CHMO_0000568", + "obo:BFO_0000051": [ + { + "@id": "ex:step/prep/S-2-0" + }, + { + "@id": "ex:step/prep/S-2-1" + }, + { + "@id": "ex:step/prep/S-2-2" + }, + { + "@id": "ex:step/reaction/S-2-0" + }, + { + "@id": "ex:step/reaction/S-2-1" + }, + { + "@id": "ex:step/workup/S-2-0" + }, + { + "@id": "ex:step/workup/S-2-1" + } + ], + "obo:OBI_0000299": "MIL-88B+MIL101 (mix phases)", + "obo:RO_0000086": "glass vial", + "rdfs:label": "S-2", + "schema:identifier": "S-2" + } + ] +} \ No newline at end of file diff --git a/documentation_user/examples/rdf/samples/mof-mapping.ttl b/documentation_user/examples/rdf/samples/mof-mapping.ttl new file mode 100644 index 000000000..eab4bc80d --- /dev/null +++ b/documentation_user/examples/rdf/samples/mof-mapping.ttl @@ -0,0 +1,449 @@ +@prefix rr: . +@prefix rml: . +@prefix ql: . +@prefix chmo: . +@prefix obo: . +@prefix rdfs: . +@prefix schema: . +@prefix xsd: . + +################################################## +# SOURCES +################################################## + +<#SynthesisSource> + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.Synthesis[*]" . + +<#ReagentSource> + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.Synthesis[*].Reagents.Reagent[*]" . + +<#PrepStepSource> + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.Synthesis[*].Procedure.Prep.Step[*]" . + +<#ReactionStepSource> + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.Synthesis[*].Procedure.Reaction.Step[*]" . + +<#WorkupStepSource> + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.Synthesis[*].Procedure.Workup.Step[*]" . + +################################################## +# SYNTHESIS +################################################## + +<#SynthesisTriplesMap> + rml:logicalSource <#SynthesisSource> ; + + rr:subjectMap [ + rr:template "http://example.org/synthesis/{Hardware.Component[0]._id}" ; + rr:class chmo:0000568 + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:identifier ; + rr:objectMap [ rml:reference "Hardware.Component[0]._id" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000086 ; + rr:objectMap [ rml:reference "Hardware.Component[0]._type" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rml:reference "Metadata._description" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0000299 ; + rr:objectMap [ rml:reference "Metadata._product" ] + ] . + +################################################## +# REAGENTS +################################################## + +<#ReagentTriplesMap> + rml:logicalSource <#ReagentSource> ; + + rr:subjectMap [ + rr:template "http://example.org/reagent/{_id}" ; + rr:class obo:CHEBI_24431 + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rml:reference "_name" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000087 ; + rr:objectMap [ rml:reference "_role" ] + ] . + +################################################## +# PREP STEPS +################################################## + +<#PrepStepTriplesMap> + rml:logicalSource <#PrepStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/step/prep/{_vessel}-{_order}" ; + rr:class obo:OBI_0000070 + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0000293 ; + rr:objectMap [ rr:constant "Prep" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000056 ; + rr:objectMap [ rml:reference "$xml_type" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0001937 ; + rr:objectMap [ + rr:template "http://example.org/quantity/prep/{_vessel}-{_order}/amount" + ] + ] . + +<#PrepAmountValueMap> + rml:logicalSource <#PrepStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/quantity/prep/{_vessel}-{_order}/amount" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rr:constant "amount" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ + rml:reference "_amount.Value" ; + rr:datatype xsd:double + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{_amount.Unit}" + ] + ] . + +################################################## +# REACTION STEPS +################################################## + +<#ReactionStepTriplesMap> + rml:logicalSource <#ReactionStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/step/reaction/{_vessel}-{_order}" ; + rr:class obo:OBI_0000070 + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0000293 ; + rr:objectMap [ rr:constant "Reaction" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000056 ; + rr:objectMap [ rml:reference "$xml_type" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0001937 ; + rr:objectMap [ + rr:template "http://example.org/quantity/reaction/{_vessel}-{_order}/temperature" + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0001937 ; + rr:objectMap [ + rr:template "http://example.org/quantity/reaction/{_vessel}-{_order}/time" + ] + ] . + +<#ReactionTemperatureValueMap> + rml:logicalSource <#ReactionStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/quantity/reaction/{_vessel}-{_order}/temperature" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rr:constant "temperature" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ + rml:reference "_temp.Value" ; + rr:datatype xsd:double + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{_temp.Unit}" + ] + ] . + +<#ReactionTimeValueMap> + rml:logicalSource <#ReactionStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/quantity/reaction/{_vessel}-{_order}/time" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rr:constant "time" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ + rml:reference "_time.Value" ; + rr:datatype xsd:double + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{_time.Unit}" + ] + ] . + +################################################## +# WORKUP STEPS +################################################## + +<#WorkupStepTriplesMap> + rml:logicalSource <#WorkupStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/step/workup/{_vessel}-{_order}" ; + rr:class obo:OBI_0000070 + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0000293 ; + rr:objectMap [ rr:constant "Workup" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000056 ; + rr:objectMap [ rml:reference "$xml_type" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0001937 ; + rr:objectMap [ + rr:template "http://example.org/quantity/workup/{_vessel}-{_order}/temperature" + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0001937 ; + rr:objectMap [ + rr:template "http://example.org/quantity/workup/{_vessel}-{_order}/time" + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:OBI_0001937 ; + rr:objectMap [ + rr:template "http://example.org/quantity/workup/{_vessel}-{_order}/pressure" + ] + ] . + +<#WorkupTemperatureValueMap> + rml:logicalSource <#WorkupStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/quantity/workup/{_vessel}-{_order}/temperature" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rr:constant "temperature" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ + rml:reference "_temp.Value" ; + rr:datatype xsd:double + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{_temp.Unit}" + ] + ] . + +<#WorkupTimeValueMap> + rml:logicalSource <#WorkupStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/quantity/workup/{_vessel}-{_order}/time" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rr:constant "time" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ + rml:reference "_time.Value" ; + rr:datatype xsd:double + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{_time.Unit}" + ] + ] . + +<#WorkupPressureValueMap> + rml:logicalSource <#WorkupStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/quantity/workup/{_vessel}-{_order}/pressure" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rr:constant "pressure" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ + rml:reference "_pressure.Value" ; + rr:datatype xsd:double + ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{_pressure.Unit}" + ] + ] . + +################################################## +# RELATIONS +################################################## + +<#SynthesisToPrep> + rml:logicalSource <#PrepStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/synthesis/{_vessel}" + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:BFO_0000051 ; + rr:objectMap [ + rr:template "http://example.org/step/prep/{_vessel}-{_order}" + ] + ] . + +<#SynthesisToReaction> + rml:logicalSource <#ReactionStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/synthesis/{_vessel}" + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:BFO_0000051 ; + rr:objectMap [ + rr:template "http://example.org/step/reaction/{_vessel}-{_order}" + ] + ] . + +<#SynthesisToWorkup> + rml:logicalSource <#WorkupStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/synthesis/{_vessel}" + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:BFO_0000051 ; + rr:objectMap [ + rr:template "http://example.org/step/workup/{_vessel}-{_order}" + ] + ] . + +<#PrepStepToReagent> + rml:logicalSource <#PrepStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/step/prep/{_vessel}-{_order}" + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000057 ; + rr:objectMap [ + rr:parentTriplesMap <#ReagentTriplesMap> ; + rr:joinCondition [ + rr:child "_reagent" ; + rr:parent "_name" + ] + ] + ] . + +<#WorkupStepToReagent> + rml:logicalSource <#WorkupStepSource> ; + + rr:subjectMap [ + rr:template "http://example.org/step/workup/{_vessel}-{_order}" + ] ; + + rr:predicateObjectMap [ + rr:predicate obo:RO_0000057 ; + rr:objectMap [ + rr:parentTriplesMap <#ReagentTriplesMap> ; + rr:joinCondition [ + rr:child "_solvent" ; + rr:parent "_name" + ] + ] + ] . \ No newline at end of file diff --git a/documentation_user/examples/rdf/samples/mof-prep-query.sparql b/documentation_user/examples/rdf/samples/mof-prep-query.sparql new file mode 100644 index 000000000..51ef1fa4a --- /dev/null +++ b/documentation_user/examples/rdf/samples/mof-prep-query.sparql @@ -0,0 +1,18 @@ +PREFIX obo: +PREFIX rdfs: +PREFIX schema: + +SELECT ?synthesis ?step ?reagentLabel ?amount ?unit +WHERE { + ?synthesis obo:BFO_0000051 ?step . + + ?step obo:OBI_0000293 "Prep" ; + obo:RO_0000057 ?reagent ; + obo:OBI_0001937 ?amountNode . + + ?amountNode schema:value ?amount ; + schema:unitCode ?unit . + + ?reagent rdfs:label ?reagentLabel . +} +ORDER BY ?synthesis ?step diff --git a/documentation_user/examples/rdf/samples/simulation-data.json b/documentation_user/examples/rdf/samples/simulation-data.json new file mode 100644 index 000000000..8e32d1bfb --- /dev/null +++ b/documentation_user/examples/rdf/samples/simulation-data.json @@ -0,0 +1,16 @@ +{ + "parameters": [ + { + "name": "element_size", + "value": 0.025, + "unit": "M" + } + ], + "metrics": [ + { + "name": "max_von_mises_stress", + "value": 299791507.5586333, + "unit": "MegaPA" + } + ] +} diff --git a/documentation_user/examples/rdf/samples/simulation-data.jsonld b/documentation_user/examples/rdf/samples/simulation-data.jsonld new file mode 100644 index 000000000..de519d01f --- /dev/null +++ b/documentation_user/examples/rdf/samples/simulation-data.jsonld @@ -0,0 +1,37 @@ +{ + "@context": { + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "schema": "https://schema.org/", + "unit": "http://qudt.org/vocab/unit/", + "local": "https://www.example.org/", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#" + }, + "@graph": [ + { + "@id": "local:run_fenics_simulation", + "@type": "m4i:Method", + "m4i:hasParameter": { "@id": "local:variable_element_size" }, + "m4i:investigates": { "@id": "local:variable_max_von_mises_stress" } + }, + { + "@id": "local:variable_element_size", + "@type": "schema:PropertyValue", + "rdfs:label": "element_size", + "schema:unitCode": { "@id": "unit:M" }, + "schema:value": { + "@type": "http://www.w3.org/2001/XMLSchema#double", + "@value": "2.5E-2" + } + }, + { + "@id": "local:variable_max_von_mises_stress", + "@type": "schema:PropertyValue", + "rdfs:label": "max_von_mises_stress", + "schema:unitCode": { "@id": "unit:MegaPA" }, + "schema:value": { + "@type": "http://www.w3.org/2001/XMLSchema#double", + "@value": "2.997915075586333E8" + } + } + ] +} diff --git a/documentation_user/examples/rdf/samples/simulation-mapping.ttl b/documentation_user/examples/rdf/samples/simulation-mapping.ttl new file mode 100644 index 000000000..192023162 --- /dev/null +++ b/documentation_user/examples/rdf/samples/simulation-mapping.ttl @@ -0,0 +1,88 @@ +@prefix rr: . +@prefix rml: . +@prefix ql: . +@prefix m4i: . +@prefix schema: . +@prefix rdfs: . + +<#RunFenicsSimulation> + rml:logicalSource [ + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$" + ] ; + + rr:subjectMap [ + rr:template "https://www.example.org/run_fenics_simulation" ; + rr:class m4i:Method + ] ; + + rr:predicateObjectMap [ + rr:predicate m4i:hasParameter ; + rr:objectMap [ rr:parentTriplesMap <#ParameterMapping> ] + ] ; + + rr:predicateObjectMap [ + rr:predicate m4i:investigates ; + rr:objectMap [ rr:parentTriplesMap <#MetricMapping> ] + ] . + +<#ParameterMapping> + rml:logicalSource [ + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.parameters[*]" + ] ; + + rr:subjectMap [ + rr:template "https://www.example.org/variable_{name}" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rml:reference "name" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ rml:reference "value" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{unit}" ; + rr:termType rr:IRI + ] + ] . + +<#MetricMapping> + rml:logicalSource [ + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.metrics[*]" + ] ; + + rr:subjectMap [ + rr:template "https://www.example.org/variable_{name}" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rml:reference "name" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ rml:reference "value" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{unit}" ; + rr:termType rr:IRI + ] + ] . \ No newline at end of file diff --git a/documentation_user/examples/rdf/samples/simulation-query.sparql b/documentation_user/examples/rdf/samples/simulation-query.sparql new file mode 100644 index 000000000..9b5e77919 --- /dev/null +++ b/documentation_user/examples/rdf/samples/simulation-query.sparql @@ -0,0 +1,12 @@ +PREFIX m4i: +PREFIX schema: + +SELECT ?element_size ?max_von_mises_stress WHERE { + ?method a m4i:Method . + ?method m4i:hasParameter ?element_size_param . + ?element_size_param a schema:PropertyValue ; + schema:value ?element_size . + ?method m4i:investigates ?stress_param . + ?stress_param a schema:PropertyValue ; + schema:value ?max_von_mises_stress . +} ORDER BY ASC(?element_size) \ No newline at end of file diff --git a/meta_configurator/env.d.ts b/meta_configurator/env.d.ts index dbb4c627d..55e938483 100644 --- a/meta_configurator/env.d.ts +++ b/meta_configurator/env.d.ts @@ -1,3 +1,4 @@ /// declare const __APP_VERSION__: string; +declare const __APP_EXPERIMENTAL__: boolean; diff --git a/meta_configurator/index.html b/meta_configurator/index.html index 3943874f7..1f43cf27b 100644 --- a/meta_configurator/index.html +++ b/meta_configurator/index.html @@ -1,62 +1,49 @@ - + - - MetaConfigurator – JSON Schema Editor and Form Generator - + - - - - + MetaConfigurator – JSON Schema Editor and Form Generator + - + + + + - - -
-

MetaConfigurator – JSON Schema Editor and Form Generator with AI assistance and Code/Documentation generation for JSON, YAML and XML.

- - + + + + +
+ + diff --git a/meta_configurator/package-lock.json b/meta_configurator/package-lock.json index bff15f637..8a709e791 100644 --- a/meta_configurator/package-lock.json +++ b/meta_configurator/package-lock.json @@ -1,14 +1,15 @@ { "name": "meta-configurator", - "version": "2.1.0", + "version": "2.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "meta-configurator", - "version": "2.1.0", + "version": "2.5.0", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.3.1", + "@comake/rmlmapper-js": "^0.5.2", "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-regular-svg-icons": "^6.5.2", @@ -23,10 +24,12 @@ "axios": "^1.7.9", "brace": "^0.11.1", "csv-parse": "^5.5.6", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", "dagrejs": "^0.2.1", "fast-xml-parser": "^5.0.8", "flowbite": "^1.6.5", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "js-yaml": "^4.1.0", "json-cst": "^1.2.0", "json-pointer": "^0.6.2", @@ -36,17 +39,22 @@ "json-schema-resolver": "^3.0.0", "json-schema-to-typescript": "^15.0.4", "jsonata": "^2.0.6", + "jsonc-parser": "^3.3.1", + "jsonld": "^9.0.0", "lodash": "^4.17.21", + "n3": "^1.26.0", "node-fetch": "^3.3.1", "pinia": "^2.0.36", "primeicons": "^7.0.0", "primevue": "^4.2.5", "quicktype-core": "^23.0.171", + "rdflib": "^2.3.6", "showdown": "^2.1.0", + "sparqljs": "^3.7.3", "vue": "^3.5.13", "vue-flow": "^0.3.0", "vue-router": "^4.3.2", - "yaml": "^2.3.1" + "yaml": "^2.8.3" }, "devDependencies": { "@ls-lint/ls-lint": "^2.2.3", @@ -56,8 +64,11 @@ "@types/jsdom": "^21.1.1", "@types/json-pointer": "^1.0.31", "@types/jsonata": "^1.5.1", + "@types/jsonld": "^1.5.15", + "@types/n3": "^1.26.1", "@types/node": "^18.16.8", "@types/showdown": "^2.0.6", + "@types/sparqljs": "^3.1.12", "@types/yaml": "^1.9.7", "@typescript-eslint/eslint-plugin": "^5.59.0", "@vitejs/plugin-vue": "^4.2.3", @@ -105,24 +116,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.3.1.tgz", - "integrity": "sha512-FIweGOR9zrNuskfDXn8dfsA4eJEe8LmmGsGSDikEZvgYm36SO36yMhasXSOX7/OTGZ3b7I9iPhOxB24D8xL5uQ==", - "license": "MIT", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.3.5.tgz", + "integrity": "sha512-orNOYXw3hYXxxisXMldjzjBzqqTLBPbwOtHg7ovBPvfBHDue1qM9YJENZ3W2BQuS+7z4ThogMbEzEsov57Itkg==", "dependencies": { "js-yaml": "^4.1.1" }, @@ -134,13 +131,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -149,30 +145,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", - "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.7", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.26.7", - "@babel/types": "^7.26.7", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -197,15 +193,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -213,25 +209,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -250,17 +246,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -279,41 +275,50 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -323,35 +328,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -361,13 +366,13 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -377,50 +382,46 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", - "license": "MIT", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -430,12 +431,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -445,12 +446,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -460,16 +461,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz", - "integrity": "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -479,56 +480,52 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "dev": true, - "license": "MIT", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -540,6 +537,117 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@comake/rmlmapper-js": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@comake/rmlmapper-js/-/rmlmapper-js-0.5.2.tgz", + "integrity": "sha512-b/n7oOPKZXZCHTWBPFxm79Kq64PY24r2axBkLPGJAUXrcys3oqdDK1n/ISlP30sRHIjfVhteGrbIWhgB0/obTw==", + "dependencies": { + "@xmldom/xmldom": "^0.8.2", + "csvjson": "^5.1.0", + "fontoxpath": "^3.26.2", + "jsonld": "^8.1.0", + "jsonpath-plus": "^7.0.0", + "language-tags": "^1.0.5", + "mime-types": "^2.1.35", + "n3": "^1.16.2", + "slimdom": "^4.0.1", + "uuid": "^9.0.0", + "xpath": "^0.0.32" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/@digitalbazaar/http-client": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", + "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", + "dependencies": { + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/canonicalize": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==" + }, + "node_modules/@comake/rmlmapper-js/node_modules/jsonld": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.3.tgz", + "integrity": "sha512-9YcilrF+dLfg9NTEof/mJLMtbdX1RJ8dbWtJgE00cMOIohb1lIyJl710vFiTaiHTl6ZYODJuBd32xFvUhmv3kg==", + "dependencies": { + "@digitalbazaar/http-client": "^3.4.1", + "canonicalize": "^1.0.1", + "lru-cache": "^6.0.0", + "rdf-canonize": "^3.4.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/ky": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/rdf-canonize": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@comake/rmlmapper-js/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@digitalbazaar/http-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", + "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "dependencies": { + "ky": "^1.14.2", + "undici": "^6.23.0" + }, + "engines": { + "node": ">=18.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -897,7 +1005,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -912,9 +1019,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -948,7 +1055,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -960,21 +1066,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -990,6 +1081,14 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", @@ -1043,32 +1142,73 @@ } }, "node_modules/@fortawesome/vue-fontawesome": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.8.tgz", - "integrity": "sha512-yyHHAj4G8pQIDfaIsMvQpwKMboIZtcHTUvPqXjOHyldh1O1vZfH4W03VDPv5RvI9P6DLTzJQlmVgj9wCf7c2Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.2.0.tgz", + "integrity": "sha512-7BwGjTZn8QDvVEIu8fvkHhsDRRv//tq7jtsldaDhF3dE1fyWLIQcEg3zvIzy33su7kcppWsZZ6XRYP5wp3UCgQ==", "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "@fortawesome/fontawesome-svg-core": "~1 || ~6 || ~7", "vue": ">= 3.0.0 < 4" } }, + "node_modules/@frogcat/ttl2jsonld": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@frogcat/ttl2jsonld/-/ttl2jsonld-0.0.10.tgz", + "integrity": "sha512-0NLM96V3ziZkkOlhixSZiXe8CzewECVNtSj04s2hW2e65SgzQPzM12VWSovuRIy+2UJA2Bjkf9405yrty9tgcg==", + "bin": { + "ttl2jsonld": "bin/cli.js" + } + }, "node_modules/@glideapps/ts-necessities": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.2.3.tgz", "integrity": "sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==" }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "dev": true + }, "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", "dev": true }, + "node_modules/@hapi/tlds": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.6.tgz", + "integrity": "sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "@hapi/hoek": "^11.0.2" } }, "node_modules/@humanwhocodes/config-array": { @@ -1124,9 +1264,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -1136,12 +1276,12 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -1151,26 +1291,32 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1182,24 +1328,15 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1209,8 +1346,7 @@ "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, "node_modules/@jsep-plugin/assignment": { "version": "1.3.0", @@ -1248,6 +1384,14 @@ "node": "16" } }, + "node_modules/@jsonhero/json-infer-types/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@jsonhero/json-schema-fns": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@jsonhero/json-schema-fns/-/json-schema-fns-0.0.1.tgz", @@ -1279,13 +1423,14 @@ } }, "node_modules/@ls-lint/ls-lint": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@ls-lint/ls-lint/-/ls-lint-2.2.3.tgz", - "integrity": "sha512-ekM12jNm/7O2I/hsRv9HvYkRdfrHpiV1epVuI2NP+eTIcEgdIdKkKCs9KgQydu/8R5YXTov9aHdOgplmCHLupw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@ls-lint/ls-lint/-/ls-lint-2.3.1.tgz", + "integrity": "sha512-vPe6IDByQnQRTxcAYjTxrmga/tSIui50VBFTB5KIJWY3OOFmxE2VtymjeSEfQfiMbhZV/ZPAqYy2lt8pZFQ0Rw==", "cpu": [ "x64", "arm64", - "s390x" + "s390x", + "ppc64le" ], "dev": true, "os": [ @@ -1297,6 +1442,17 @@ "ls-lint": "bin/cli.js" } }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ] + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1349,13 +1505,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", - "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright": "1.56.1" + "playwright": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -1374,62 +1529,88 @@ } }, "node_modules/@primeuix/styled": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@primeuix/styled/-/styled-0.3.2.tgz", - "integrity": "sha512-ColZes0+/WKqH4ob2x8DyNYf1NENpe5ZguOvx5yCLxaP8EIMVhLjWLO/3umJiDnQU4XXMLkn2mMHHw+fhTX/mw==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@primeuix/styled/-/styled-0.7.4.tgz", + "integrity": "sha512-QSO/NpOQg8e9BONWRBx9y8VGMCMYz0J/uKfNJEya/RGEu7ARx0oYW0ugI1N3/KB1AAvyGxzKBzGImbwg0KUiOQ==", "dependencies": { - "@primeuix/utils": "^0.3.2" + "@primeuix/utils": "^0.6.1" }, "engines": { "node": ">=12.11.0" } }, + "node_modules/@primeuix/styles": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@primeuix/styles/-/styles-2.0.3.tgz", + "integrity": "sha512-2ykAB6BaHzR/6TwF8ShpJTsZrid6cVIEBVlookSdvOdmlWuevGu5vWOScgIwqWwlZcvkFYAGR/SUV3OHCTBMdw==", + "dependencies": { + "@primeuix/styled": "^0.7.4" + } + }, + "node_modules/@primeuix/themes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@primeuix/themes/-/themes-2.0.3.tgz", + "integrity": "sha512-3fS1883mtCWhgUgNf/feiaaDSOND4EBIOu9tZnzJlJ8QtYyL6eFLcA6V3ymCWqLVXQ1+lTVEZv1gl47FIdXReg==", + "dependencies": { + "@primeuix/styled": "^0.7.4" + } + }, "node_modules/@primeuix/utils": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.3.2.tgz", - "integrity": "sha512-B+nphqTQeq+i6JuICLdVWnDMjONome2sNz0xI65qIOyeB4EF12CoKRiCsxuZ5uKAkHi/0d1LqlQ9mIWRSdkavw==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.6.4.tgz", + "integrity": "sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==", "engines": { "node": ">=12.11.0" } }, "node_modules/@primevue/core": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@primevue/core/-/core-4.2.5.tgz", - "integrity": "sha512-+oWBIQs5dLd2Ini4KEVOlvPILk989EHAskiFS3R/dz3jeOllJDMZFcSp8V9ddV0R3yDaPdLVkfHm2Q5t42kU2Q==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/@primevue/core/-/core-4.5.5.tgz", + "integrity": "sha512-JpkXhq1ddc70JdsC3CC4dM+UbeeWuCW/8DpS9dNBfrOk824TLSlRlMEGFyVKqRMn5WPQvYLiy3xXfLQeNdSqhQ==", "dependencies": { - "@primeuix/styled": "^0.3.2", - "@primeuix/utils": "^0.3.2" + "@primeuix/styled": "^0.7.4", + "@primeuix/utils": "^0.6.2" }, "engines": { "node": ">=12.11.0" }, "peerDependencies": { - "vue": "^3.3.0" + "vue": "^3.5.0" } }, "node_modules/@primevue/icons": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@primevue/icons/-/icons-4.2.5.tgz", - "integrity": "sha512-WFbUMZhQkXf/KmwcytkjGVeJ9aGEDXjP3uweOjQZMmRdEIxFnqYYpd90wE90JE1teZn3+TVnT4ZT7ejGyEXnFQ==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/@primevue/icons/-/icons-4.5.5.tgz", + "integrity": "sha512-eteOhTdAOXEYE9qW1AOrBBgDxQ2szHJxSkEK1XVdV2TKxGM5FQf03Ovms0VDyZTc16XBIgvwYjXJQS0BPbhPaA==", "dependencies": { - "@primeuix/utils": "^0.3.2", - "@primevue/core": "4.2.5" + "@primeuix/utils": "^0.6.2", + "@primevue/core": "4.5.5" }, "engines": { "node": ">=12.11.0" } }, "node_modules/@primevue/themes": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@primevue/themes/-/themes-4.2.5.tgz", - "integrity": "sha512-8F7yA36xYIKtNuAuyBdZZEks/bKDwlhH5WjpqGGB0FdwfAEoBYsynQ5sdqcT2Lb/NsajHmS5lc++Ttlvr1g1Lw==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@primevue/themes/-/themes-4.5.4.tgz", + "integrity": "sha512-rUFZxMHLanTZdvZq4zgZPk+KRBZ3s7fE3bBK32OrZBkHQhEJmkJ7Ftd4w4QFlXyz1B7c+k5invZiOOCjwHXg9Q==", + "deprecated": "Deprecated. This package is no longer maintained. Please migrate to @primeuix/themes: https://www.npmjs.com/package/@primeuix/themes", "dependencies": { - "@primeuix/styled": "^0.3.2" + "@primeuix/styled": "^0.7.4", + "@primeuix/themes": "^2.0.2" }, "engines": { "node": ">=12.11.0" } }, + "node_modules/@rdfjs/types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", + "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@rollup/plugin-inject": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", @@ -1453,9 +1634,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -1475,9 +1656,9 @@ } }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "engines": { "node": ">=12" @@ -1493,30 +1674,15 @@ "dev": true }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz", - "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", "dev": true }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true }, "node_modules/@tootallnate/once": { @@ -1529,9 +1695,9 @@ } }, "node_modules/@tsconfig/node18": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", - "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.6.tgz", + "integrity": "sha512-eAWQzAjPj18tKnDzmWstz4OyWewLUNBm9tdoN9LayzoboRktYx3Enk1ZXPmThj55L7c4VWYq/Bzq0A51znZfhw==", "dev": true }, "node_modules/@types/chai": { @@ -1541,18 +1707,18 @@ "dev": true }, "node_modules/@types/chai-subset": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", - "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.6.tgz", + "integrity": "sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==", "dev": true, - "dependencies": { - "@types/chai": "*" + "peerDependencies": { + "@types/chai": "<5.2.0" } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "node_modules/@types/istanbul-lib-coverage": { @@ -1599,24 +1765,39 @@ "jsonata": "*" } }, + "node_modules/@types/jsonld": { + "version": "1.5.15", + "resolved": "https://registry.npmjs.org/@types/jsonld/-/jsonld-1.5.15.tgz", + "integrity": "sha512-PlAFPZjL+AuGYmwlqwKEL0IMP8M8RexH0NIPGfCVWSQ041H2rR/8OlyZSD7KsCVoN8vCfWdtWDBxX8yBVP+xow==", + "dev": true + }, "node_modules/@types/lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==" + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==" }, - "node_modules/@types/node": { - "version": "18.19.75", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.75.tgz", - "integrity": "sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==", + "node_modules/@types/n3": { + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.26.1.tgz", + "integrity": "sha512-TilYHzpU6ecXVJAbV+6o17Z8ZkWLWx6ZJD3IluaU4RiGHxqjU2or9fopxFHS6iXS6qcl5Mg1K3wSx9L8xxJaJQ==", "dev": true, + "dependencies": { + "@rdfjs/types": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true }, "node_modules/@types/showdown": { @@ -1625,6 +1806,15 @@ "integrity": "sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ==", "dev": true }, + "node_modules/@types/sparqljs": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@types/sparqljs/-/sparqljs-3.1.12.tgz", + "integrity": "sha512-zg/sdKKtYI0845wKPSuSgunyU1o/+7tRzMw85lHsf4p/0UbA6+65MXAyEtv1nkaqSqrq/bXm7+bqXas+Xo5dpQ==", + "dev": true, + "dependencies": { + "@rdfjs/types": ">=1.0.0" + } + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -1928,9 +2118,9 @@ } }, "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "engines": { "node": ">=12.20" @@ -1971,38 +2161,39 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", - "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", "dev": true, "dependencies": { - "@volar/source-map": "2.4.11" + "@volar/source-map": "2.4.15" } }, "node_modules/@volar/source-map": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", - "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", "dev": true }, "node_modules/@volar/typescript": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", - "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", "dev": true, "dependencies": { - "@volar/language-core": "2.4.11", + "@volar/language-core": "2.4.15", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue-flow/core": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.42.1.tgz", - "integrity": "sha512-QzzTxMAXfOeETKc+N3XMp5XpiPxKBHK5kq98avgTsE6MXyeU2E8EkANwwgSB/hvJ/k36RjU0Y7BOwCHiqiI1tw==", + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.48.2.tgz", + "integrity": "sha512-raxhgKWE+G/mcEvXJjGFUDYW9rAI3GOtiHR3ZkNpwBWuIaCC1EYiBmKGwJOoNzVFgwO7COgErnK7i08i287AFA==", "dependencies": { "@vueuse/core": "^10.5.0", "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0" }, @@ -2011,27 +2202,26 @@ } }, "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", - "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", "dev": true }, "node_modules/@vue/babel-plugin-jsx": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", - "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.6", - "@babel/types": "^7.25.6", - "@vue/babel-helper-vue-transform-on": "1.2.5", - "@vue/babel-plugin-resolve-type": "1.2.5", - "html-tags": "^3.3.1", - "svg-tags": "^1.0.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -2043,65 +2233,68 @@ } }, "node_modules/@vue/babel-plugin-resolve-type": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", - "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/parser": "^7.25.6", - "@vue/compiler-sfc": "^3.5.3" + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", + "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.32", + "entities": "^7.0.1", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", + "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.32", + "@vue/shared": "3.5.32" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", + "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.32", + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32", "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", + "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.32", + "@vue/shared": "3.5.32" } }, "node_modules/@vue/compiler-vue2": { @@ -2158,16 +2351,16 @@ } }, "node_modules/@vue/language-core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", - "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", "dev": true, "dependencies": { - "@volar/language-core": "~2.4.11", + "@volar/language-core": "2.4.15", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", + "alien-signals": "^1.0.3", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -2182,11 +2375,10 @@ } }, "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2196,7 +2388,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" }, @@ -2208,49 +2399,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", + "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", "dependencies": { - "@vue/shared": "3.5.13" + "@vue/shared": "3.5.32" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", + "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/reactivity": "3.5.32", + "@vue/shared": "3.5.32" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", + "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" + "@vue/reactivity": "3.5.32", + "@vue/runtime-core": "3.5.32", + "@vue/shared": "3.5.32", + "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", + "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32" }, "peerDependencies": { - "vue": "3.5.13" + "vue": "3.5.32" } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", + "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==" }, "node_modules/@vue/test-utils": { "version": "2.4.6", @@ -2267,7 +2458,6 @@ "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.8.1.tgz", "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", "dev": true, - "license": "MIT", "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" @@ -2314,6 +2504,14 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -2342,9 +2540,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2363,9 +2561,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "dependencies": { "acorn": "^8.11.0" @@ -2390,7 +2588,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2419,15 +2616,15 @@ } }, "node_modules/alien-signals": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", - "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", "dev": true }, "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "dependencies": { "environment": "^1.0.0" @@ -2510,17 +2707,19 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2539,17 +2738,18 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2630,8 +2830,7 @@ "version": "4.12.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/assert": { "version": "2.1.0", @@ -2670,9 +2869,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "dev": true, "funding": [ { @@ -2689,11 +2888,10 @@ } ], "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -2722,14 +2920,13 @@ } }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", - "license": "MIT", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -2757,6 +2954,18 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz", + "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -2785,8 +2994,7 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/boolbase": { "version": "1.0.0", @@ -2800,11 +3008,10 @@ "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2842,6 +3049,27 @@ "resolve": "^1.17.0" } }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2898,7 +3126,6 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "dev": true, - "license": "ISC", "dependencies": { "bn.js": "^5.2.2", "browserify-rsa": "^4.1.1", @@ -2966,9 +3193,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -2985,10 +3212,11 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -3077,14 +3305,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -3095,9 +3323,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -3107,13 +3335,13 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3125,8 +3353,7 @@ "node_modules/call-me-maybe": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" }, "node_modules/callsites": { "version": "3.1.0", @@ -3147,9 +3374,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001698", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001698.tgz", - "integrity": "sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==", + "version": "1.0.30001788", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", + "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", "dev": true, "funding": [ { @@ -3166,6 +3393,14 @@ } ] }, + "node_modules/canonicalize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.1.0.tgz", + "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", + "bin": { + "canonicalize": "bin/canonicalize.js" + } + }, "node_modules/chai": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", @@ -3258,13 +3493,14 @@ } }, "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "dev": true, "dependencies": { "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { "node": ">= 0.10" @@ -3302,9 +3538,9 @@ } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -3314,9 +3550,9 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { @@ -3337,12 +3573,12 @@ } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -3543,6 +3779,14 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -3557,8 +3801,7 @@ "version": "4.12.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/create-hash": { "version": "1.2.0", @@ -3704,15 +3947,39 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" }, "node_modules/csv-parse": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==" }, + "node_modules/csvjson": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/csvjson/-/csvjson-5.1.0.tgz", + "integrity": "sha512-OqALQHA0k2rEGluOWikwFq5qtkRUDyoWP2u0UJy8uFjFx5FPMjPzx7D2Hn2KjBLpc8jkGrT9HDNgTUfopDlqVg==" + }, + "node_modules/cytoscape": { + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.2.tgz", + "integrity": "sha512-sj4HXd3DokGhzZAdjDejGvTPLqlt84vNFN8m7bGsOzDY5DyVcxIb2ejIXat2Iy7HxWhdT/N1oKyheJ5YdpsGuw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -3910,9 +4177,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { "ms": "^2.1.3" }, @@ -3926,9 +4193,9 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true }, "node_modules/deep-eql": { @@ -4030,8 +4297,7 @@ "version": "4.12.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/dir-glob": { "version": "3.0.1", @@ -4118,7 +4384,6 @@ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", "dev": true, - "license": "MIT", "dependencies": { "@one-ini/wasm": "0.1.1", "commander": "^10.0.0", @@ -4147,11 +4412,10 @@ } }, "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -4161,7 +4425,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" }, @@ -4173,9 +4436,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.95", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.95.tgz", - "integrity": "sha512-XNsZaQrgQX+BG37BRQv+E+HcOZlWhqYaDoVVNCws/WrYYdbGrkR1qCDJ2mviBF3flCs6/BTa4O7ANfFTFZk6Dg==", + "version": "1.5.341", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.341.tgz", + "integrity": "sha512-1sZTssferjgDgaqRTc0ieP+ozzpOy7LQTPTtEW3yQFn4+ORdIAZWV5BthXPyHF7YqLvFJCUPhNhdAJQYlYUgiw==", "dev": true }, "node_modules/elliptic": { @@ -4197,8 +4460,7 @@ "version": "4.12.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4207,18 +4469,18 @@ "dev": true }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "engines": { "node": ">=0.12" }, @@ -4239,36 +4501,36 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -4280,21 +4542,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -4303,7 +4568,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -4354,12 +4619,15 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -4498,7 +4766,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -4552,14 +4819,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4572,9 +4839,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4641,29 +4908,29 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -4728,12 +4995,32 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-prettier": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", "integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -4770,7 +5057,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", @@ -4788,21 +5074,6 @@ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-vue/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4860,7 +5131,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4897,21 +5167,6 @@ "node": ">=4.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4939,7 +5194,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4949,9 +5203,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -5037,9 +5291,9 @@ } }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true }, "node_modules/events": { @@ -5147,9 +5401,9 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -5162,44 +5416,43 @@ ] }, "node_modules/fast-xml-builder": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", + "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT", "dependencies": { "path-expression-matcher": "^1.1.3" } }, "node_modules/fast-xml-parser": { - "version": "5.5.9", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", - "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.1.tgz", + "integrity": "sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.2.0", - "strnum": "^2.2.2" + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -5285,8 +5538,7 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/flowbite": { "version": "1.8.1", @@ -5298,16 +5550,15 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -5317,10 +5568,19 @@ } } }, + "node_modules/fontoxpath": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/fontoxpath/-/fontoxpath-3.34.0.tgz", + "integrity": "sha512-7FgBQRohn4WR/2eVdYqZtKBFZkJNaiP4kGdfqS6bAg465og05ixGA2OgfMdxsO1mnX67+64JX/8JKclVqS+bzA==", + "dependencies": { + "prsc": "4.0.0", + "xspattern": "^3.1.0" + } + }, "node_modules/for-each": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", - "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "dependencies": { "is-callable": "^1.2.7" @@ -5354,7 +5614,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -5369,8 +5628,7 @@ "node_modules/format-util": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "license": "MIT" + "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==" }, "node_modules/formdata-polyfill": { "version": "4.0.10", @@ -5384,15 +5642,15 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -5409,9 +5667,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -5459,6 +5717,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5478,9 +5745,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "engines": { "node": ">=18" @@ -5499,16 +5766,16 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -5568,7 +5835,6 @@ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -5597,22 +5863,21 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -5627,7 +5892,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" }, @@ -5651,12 +5915,18 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -5727,10 +5997,9 @@ } }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -5844,9 +6113,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dependencies": { "function-bind": "^1.1.2" }, @@ -5898,18 +6167,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -5957,7 +6214,6 @@ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, - "license": "MIT", "bin": { "husky": "bin.js" }, @@ -6279,13 +6535,14 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -6335,6 +6592,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6573,9 +6842,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -6610,34 +6879,39 @@ } }, "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.1.2.tgz", + "integrity": "sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==", "dev": true, "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.1.0" + }, + "engines": { + "node": ">= 20" } }, "node_modules/js-base64": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==" }, "node_modules/js-beautify": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", - "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", "dev": true, "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.4", - "glob": "^10.3.3", + "glob": "^10.4.2", "js-cookie": "^3.0.5", - "nopt": "^7.2.0" + "nopt": "^7.2.1" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -6676,7 +6950,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -6799,7 +7072,6 @@ "version": "0.5.9", "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==", - "license": "MIT", "dependencies": { "json-schema-ref-parser": "^6.1.0", "jsonpath-plus": "^10.3.0" @@ -6812,7 +7084,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -6821,7 +7092,6 @@ "version": "3.14.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6835,18 +7105,33 @@ "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "license": "MIT", "dependencies": { "call-me-maybe": "^1.0.1", "js-yaml": "^3.12.1", "ono": "^4.0.11" } }, + "node_modules/json-schema-faker/node_modules/jsonpath-plus": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz", + "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/json-schema-faker/node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/json-schema-merge-allof": { "version": "0.8.1", @@ -6866,7 +7151,6 @@ "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "9.0.9" }, @@ -6878,7 +7162,6 @@ "version": "9.0.9", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.6", @@ -6890,7 +7173,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-schema-resolver/-/json-schema-resolver-3.0.0.tgz", "integrity": "sha512-HqMnbz0tz2DaEJ3ntsqtx3ezzZyDE7G56A/pPY/NGmrPu76UzsWquOpHFRAf5beTNXoH2LU5cQePVvRli1nchA==", - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fast-uri": "^3.0.5", @@ -6921,7 +7203,6 @@ "version": "15.0.4", "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", - "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.5.5", "@types/json-schema": "^7.0.15", @@ -6944,7 +7225,6 @@ "version": "11.9.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", - "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", @@ -6958,10 +7238,9 @@ } }, "node_modules/json-schema-to-typescript/node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "license": "MIT", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "bin": { "prettier": "bin/prettier.cjs" }, @@ -6995,28 +7274,54 @@ } }, "node_modules/jsonata": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-2.0.6.tgz", - "integrity": "sha512-WhQB5tXQ32qjkx2GYHFw2XbL90u+LLzjofAYwi+86g6SyZeXHz9F1Q0amy3dWRYczshOC3Haok9J4pOCgHtwyQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-2.1.0.tgz", + "integrity": "sha512-OCzaRMK8HobtX8fp37uIVmL8CY1IGc/a6gLsDqz3quExFR09/U78HUzWYr7T31UEB6+Eu0/8dkVD5fFDOl9a8w==", "engines": { "node": ">= 8" } }, - "node_modules/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, + "node_modules/jsonld": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-9.0.0.tgz", + "integrity": "sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==", "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" + "@digitalbazaar/http-client": "^4.2.0", + "canonicalize": "^2.1.0", + "lru-cache": "^6.0.0", + "rdf-canonize": "^5.0.0" }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" + "engines": { + "node": ">=18" + } + }, + "node_modules/jsonld/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + } + }, + "node_modules/jsonld/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "engines": { + "node": ">=12.0.0" } }, "node_modules/jwt-decode": { @@ -7033,6 +7338,62 @@ "json-buffer": "3.0.1" } }, + "node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/ky-universal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", + "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", + "dependencies": { + "abort-controller": "^3.0.0", + "node-fetch": "^3.2.10" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" + }, + "peerDependencies": { + "ky": ">=0.31.4", + "web-streams-polyfill": ">=3.2.1" + }, + "peerDependenciesMeta": { + "web-streams-polyfill": { + "optional": true + } + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -7074,9 +7435,9 @@ "dev": true }, "node_modules/lint-staged": { - "version": "15.4.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz", - "integrity": "sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", "dev": true, "dependencies": { "chalk": "^5.4.1", @@ -7101,9 +7462,9 @@ } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -7122,9 +7483,9 @@ } }, "node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", @@ -7139,9 +7500,9 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -7151,9 +7512,9 @@ } }, "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "engines": { "node": ">=12" @@ -7163,9 +7524,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true }, "node_modules/listr2/node_modules/string-width": { @@ -7186,12 +7547,12 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -7201,9 +7562,9 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "dependencies": { "ansi-styles": "^6.2.1", @@ -7260,10 +7621,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -7272,10 +7632,9 @@ "dev": true }, "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead." + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.18.0.tgz", + "integrity": "sha512-hZXIupXdHtocTnvIJ2aCd2vxKYtxex6gbiGuPvgBRnFQO9yu3AtmDAbVuCXcSsQx3INo/1g71OktlFFA/ES8Xg==" }, "node_modules/log-update": { "version": "6.1.0", @@ -7297,9 +7656,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -7309,9 +7668,9 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "engines": { "node": ">=12" @@ -7321,18 +7680,18 @@ } }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "dependencies": { - "get-east-asian-width": "^1.0.0" + "get-east-asian-width": "^1.3.1" }, "engines": { "node": ">=18" @@ -7342,9 +7701,9 @@ } }, "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "dependencies": { "ansi-styles": "^6.2.1", @@ -7375,12 +7734,12 @@ } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -7390,9 +7749,9 @@ } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "dependencies": { "ansi-styles": "^6.2.1", @@ -7425,11 +7784,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -7538,8 +7897,7 @@ "version": "4.12.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mime-db": { "version": "1.52.0", @@ -7609,7 +7967,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7626,30 +7983,30 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" } }, "node_modules/mlly/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, "node_modules/mri": { @@ -7683,10 +8040,22 @@ "thenify-all": "^1.0.0" } }, + "node_modules/n3": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", + "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", + "dependencies": { + "buffer": "^6.0.3", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -7715,8 +8084,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/nice-try": { "version": "1.0.5", @@ -7728,6 +8096,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -7742,6 +8111,33 @@ "node": ">=10.5.0" } }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", @@ -7760,9 +8156,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", "dev": true }, "node_modules/node-stdlib-browser": { @@ -7874,6 +8270,27 @@ "validate-npm-package-license": "^3.0.1" } }, + "node_modules/normalize-package-data/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -7892,15 +8309,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -8116,9 +8524,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", "dev": true }, "node_modules/object-assign": { @@ -8196,6 +8604,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -8274,7 +8697,6 @@ "version": "4.0.11", "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "license": "MIT", "dependencies": { "format-util": "^1.0.3" } @@ -8386,7 +8808,6 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", "dev": true, - "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", @@ -8412,17 +8833,29 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -8439,16 +8872,15 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", - "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -8537,7 +8969,6 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "dev": true, - "license": "MIT", "dependencies": { "create-hash": "^1.2.0", "create-hmac": "^1.1.7", @@ -8556,9 +8987,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "engines": { "node": ">=8.6" @@ -8610,9 +9041,9 @@ } }, "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "engines": { "node": ">= 6" @@ -8642,19 +9073,18 @@ } }, "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, "node_modules/playwright": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", - "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.56.1" + "playwright-core": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -8667,11 +9097,10 @@ } }, "node_modules/playwright-core": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", - "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", "dev": true, - "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -8679,20 +9108,6 @@ "node": ">=18" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -8711,9 +9126,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "funding": [ { "type": "opencollective", @@ -8729,7 +9144,7 @@ } ], "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -8754,29 +9169,56 @@ "postcss": "^8.0.0" } }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { "camelcase-css": "^2.0.1" }, "engines": { "node": "^12 || ^14 || >= 16" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.4.21" } }, "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, "funding": [ { @@ -8789,21 +9231,28 @@ } ], "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "lilconfig": "^3.1.1" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { + "jiti": ">=1.21.0", "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { + "jiti": { + "optional": true + }, "postcss": { "optional": true }, - "ts-node": { + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } @@ -8877,9 +9326,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "dependencies": { "fast-diff": "^1.1.2" @@ -9086,9 +9535,9 @@ } }, "node_modules/pretty-quick/node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.2.tgz", + "integrity": "sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==", "dev": true, "engines": { "node": ">=10" @@ -9112,14 +9561,15 @@ "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==" }, "node_modules/primevue": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/primevue/-/primevue-4.2.5.tgz", - "integrity": "sha512-7UMOIJvdFz4jQyhC76yhNdSlHtXvVpmE2JSo2ndUTBWjWJOkYyT562rQ4ayO+bMdJLtzBGqgY64I9ZfEvNd7vQ==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/primevue/-/primevue-4.5.5.tgz", + "integrity": "sha512-Kv5REIewCdP806QaoU+4nBXfmpzOGFKkZ9qH4KsL6MjiAQVc4PUzypt8erl4r3Vzh3nr3aWZIxkxYRRsLGiX2A==", "dependencies": { - "@primeuix/styled": "^0.3.2", - "@primeuix/utils": "^0.3.2", - "@primevue/core": "4.2.5", - "@primevue/icons": "4.2.5" + "@primeuix/styled": "^0.7.4", + "@primeuix/styles": "^2.0.3", + "@primeuix/utils": "^0.6.2", + "@primevue/core": "4.5.5", + "@primevue/icons": "4.5.5" }, "engines": { "node": ">=12.11.0" @@ -9146,9 +9596,17 @@ "dev": true }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/prsc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/prsc/-/prsc-4.0.0.tgz", + "integrity": "sha512-OmXQ2v76RlXNx/gqv7+oB6jyKnudJ/rsMfAIVexhbDFxXAJPoWKMxJkZU2ohlu4miCiSQCG+horf2DV4/kNc1Q==" }, "node_modules/ps-tree": { "version": "1.2.0", @@ -9195,13 +9653,12 @@ "version": "4.12.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "dependencies": { "end-of-stream": "^1.1.0", @@ -9218,11 +9675,10 @@ } }, "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -9269,9 +9725,9 @@ ] }, "node_modules/quicktype-core": { - "version": "23.0.171", - "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.171.tgz", - "integrity": "sha512-2kFUFtVdCbc54IBlCG30Yzsb5a1l6lX/8UjKaf2B009WFsqvduidaSOdJ4IKMhMi7DCrq60mnU7HZ1fDazGRlw==", + "version": "23.2.6", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.2.6.tgz", + "integrity": "sha512-asfeSv7BKBNVb9WiYhFRBvBZHcRutPRBwJMxW0pefluK4kkKu4lv0IvZBwFKvw2XygLcL1Rl90zxWDHYgkwCmA==", "dependencies": { "@glideapps/ts-necessities": "2.2.3", "browser-or-node": "^3.0.0", @@ -9289,6 +9745,21 @@ "yaml": "^2.4.1" } }, + "node_modules/quicktype-core/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -9308,6 +9779,60 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/rdf-canonize": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", + "integrity": "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/rdf-data-factory": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", + "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", + "dependencies": { + "@rdfjs/types": "^1.0.0" + } + }, + "node_modules/rdf-data-factory/node_modules/@rdfjs/types": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", + "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/rdflib": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.3.6.tgz", + "integrity": "sha512-Hf2bz+wv0bVtq5Ark9/TcZdcieMPsdiYGRlZIEk8t0nti2suUn+8k82Uq8ceUqbg0SXreYCF31A1CaJP/Iq+jA==", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@frogcat/ttl2jsonld": "^0.0.10", + "@rdfjs/types": "^2.0.1", + "@xmldom/xmldom": "^0.8.11", + "cross-fetch": "^4.1.0", + "jsonld": "^9.0.0", + "n3": "^2.0.3", + "solid-namespace": "^0.5.4" + } + }, + "node_modules/rdflib/node_modules/n3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/n3/-/n3-2.0.3.tgz", + "integrity": "sha512-um/toGVENTarHBYIK2TdH6ByBhW75WpdKpv8iTYt9wF2QfBk8s8a16iaWZFUAAC1BKfGdb99kfgx6pltdDwfKA==", + "dependencies": { + "buffer": "^6.0.3", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -9359,9 +9884,9 @@ } }, "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -9463,12 +9988,15 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "dev": true, "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9535,9 +10063,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "engines": { "iojs": ">=1.0.0", @@ -9569,7 +10097,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -9591,7 +10119,6 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "dev": true, - "license": "MIT", "dependencies": { "hash-base": "^3.1.2", "inherits": "^2.0.4" @@ -9605,7 +10132,6 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", @@ -9620,15 +10146,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ripemd160/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9643,15 +10167,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ripemd160/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -9660,15 +10182,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/rollup": { "version": "3.30.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.30.0.tgz", "integrity": "sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -9719,14 +10239,14 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -9808,9 +10328,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9868,15 +10388,13 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "dev": true, - "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", @@ -9914,9 +10432,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "engines": { "node": ">= 0.4" @@ -9968,13 +10486,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -10058,9 +10576,9 @@ } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "engines": { "node": ">=12" @@ -10069,6 +10587,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/slimdom": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/slimdom/-/slimdom-4.3.5.tgz", + "integrity": "sha512-MoxdfngDk7nf8Vun0xB2AYBiHv3Qlua3Frf12n8ZLmXtfZoapfAQOKLSMCsemSyEU1UIyd503LJfYKJE+dxDTg==" + }, + "node_modules/solid-namespace": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/solid-namespace/-/solid-namespace-0.5.4.tgz", + "integrity": "sha512-oPAv8xIg2MOLz069JRdvsSbYCpQN+umPJJ9LBFPzCrYuSw+dW4TMUOTDxTWS5xy+B3XN4+Fx3iIS5Jm8abm4Mg==" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10085,6 +10613,21 @@ "node": ">=0.10.0" } }, + "node_modules/sparqljs": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/sparqljs/-/sparqljs-3.7.4.tgz", + "integrity": "sha512-hb4C84gf7KM7vz+iG595mPwvqxOvBJCm9L3dCxtV2zZDht6ZMmMG0tHeeqFeqwb9875yU9U4lhYe4LYRvWj0BQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "rdf-data-factory": "^1.1.2" + }, + "bin": { + "sparqljs": "bin/sparql-to-json" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -10112,9 +10655,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true }, "node_modules/split": { @@ -10141,19 +10684,19 @@ "dev": true }, "node_modules/start-server-and-test": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.11.tgz", - "integrity": "sha512-TN39gLzPhHAflxyOkE/oMfQGj+pj3JgF6qVicFH/JrXt7xXktidKXwqfRga+ve7lVA8+RgPZVc25VrEPRScaDw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.1.5.tgz", + "integrity": "sha512-A/SbXpgXE25ScSkpLLqvGvVZT0ykN6+AzS8tVqMBCTxbJy2Nwuen59opT+afalK5aS+AuQmZs0EsLwjnuDN+/g==", "dev": true, "dependencies": { "arg": "^5.0.2", "bluebird": "3.7.2", "check-more-types": "2.24.0", - "debug": "4.4.0", + "debug": "4.4.3", "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "8.0.3" + "wait-on": "9.0.4" }, "bin": { "server-test": "src/bin/start.js", @@ -10266,11 +10809,24 @@ } }, "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -10395,9 +10951,9 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -10407,12 +10963,12 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -10566,29 +11122,28 @@ } }, "node_modules/strnum": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", - "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } - ], - "license": "MIT" + ] }, "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { @@ -10632,12 +11187,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -10645,9 +11194,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -10658,7 +11207,7 @@ "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.6", + "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", @@ -10667,7 +11216,7 @@ "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", @@ -10681,6 +11230,27 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -10699,7 +11269,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -10782,13 +11352,12 @@ "dev": true }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -10801,7 +11370,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -10815,10 +11383,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "engines": { "node": ">=12" }, @@ -10849,7 +11416,6 @@ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "dev": true, - "license": "MIT", "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", @@ -11080,9 +11646,9 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -11093,16 +11659,15 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "dev": true }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -11129,11 +11694,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-properties": { "version": "1.4.1", @@ -11168,9 +11740,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -11260,9 +11832,13 @@ "dev": true }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -11328,7 +11904,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -11510,15 +12085,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", + "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-sfc": "3.5.32", + "@vue/runtime-dom": "3.5.32", + "@vue/server-renderer": "3.5.32", + "@vue/shared": "3.5.32" }, "peerDependencies": { "typescript": "*" @@ -11530,9 +12105,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.0.tgz", - "integrity": "sha512-cYrAnv2me7bPDcg9kIcGwjJiSB6Qyi08+jLDo9yuvoFQjzHiPTzML7RnkJB1+3P6KMsX/KbCD4QE3Tv/knEllw==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz", + "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==", "dev": true }, "node_modules/vue-demi": { @@ -11615,9 +12190,9 @@ "integrity": "sha512-J/I6z8ErkWiPCEicdZXTUEBt5MfW1GoFNs2/spGSLuzBKAOUF/MlghKAZZ4feDDjmpg/B00EviSG1fJ0PIGwVg==" }, "node_modules/vue-router": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", - "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", "dependencies": { "@vue/devtools-api": "^6.6.4" }, @@ -11625,17 +12200,17 @@ "url": "https://github.com/sponsors/posva" }, "peerDependencies": { - "vue": "^3.2.0" + "vue": "^3.5.0" } }, "node_modules/vue-tsc": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", - "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", "dev": true, "dependencies": { - "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.0" + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -11657,14 +12232,14 @@ } }, "node_modules/wait-on": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz", - "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.4.tgz", + "integrity": "sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==", "dev": true, "dependencies": { - "axios": "^1.8.2", - "joi": "^17.13.3", - "lodash": "^4.17.21", + "axios": "^1.13.5", + "joi": "^18.0.2", + "lodash": "^4.17.23", "minimist": "^1.2.8", "rxjs": "^7.8.2" }, @@ -11672,7 +12247,7 @@ "wait-on": "bin/wait-on" }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/web-streams-polyfill": { @@ -11705,6 +12280,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, "dependencies": { "iconv-lite": "0.6.3" @@ -11815,15 +12391,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -11850,6 +12427,11 @@ "node": ">=8" } }, + "node_modules/whynot": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whynot/-/whynot-5.0.0.tgz", + "integrity": "sha512-cGGfDPYYqoHoMWqXVc3G+N74u1FhFhrBa+pOO906b9ktRc/JFUdwroTkfPqjKzyoCLVcKr6yy6bYIcWT7jTg2A==" + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -11929,9 +12511,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -11941,9 +12523,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "engines": { "node": ">=12" @@ -11953,12 +12535,12 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -11974,9 +12556,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -12009,6 +12591,22 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xpath": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", + "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/xspattern": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/xspattern/-/xspattern-3.1.0.tgz", + "integrity": "sha512-rxtOX8ORJizRqswIdZ72G3thKrHd0Q+TvyUCMByc5VdjDz1nkuZKfPXM3xGdrGi0fwEy+DDJN7DqtAZ06Re4bA==", + "dependencies": { + "whynot": "^5.0.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -12034,14 +12632,17 @@ "dev": true }, "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { diff --git a/meta_configurator/package.json b/meta_configurator/package.json index ba1c7fec9..53492c801 100644 --- a/meta_configurator/package.json +++ b/meta_configurator/package.json @@ -1,6 +1,6 @@ { "name": "meta-configurator", - "version": "2.1.0", + "version": "2.5.0", "private": true, "scripts": { "dev": "vite", @@ -25,6 +25,7 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.3.1", + "@comake/rmlmapper-js": "^0.5.2", "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-regular-svg-icons": "^6.5.2", @@ -39,10 +40,12 @@ "axios": "^1.7.9", "brace": "^0.11.1", "csv-parse": "^5.5.6", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", "dagrejs": "^0.2.1", "fast-xml-parser": "^5.0.8", "flowbite": "^1.6.5", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "js-yaml": "^4.1.0", "json-cst": "^1.2.0", "json-pointer": "^0.6.2", @@ -52,17 +55,22 @@ "json-schema-resolver": "^3.0.0", "json-schema-to-typescript": "^15.0.4", "jsonata": "^2.0.6", + "jsonc-parser": "^3.3.1", + "jsonld": "^9.0.0", "lodash": "^4.17.21", + "n3": "^1.26.0", "node-fetch": "^3.3.1", "pinia": "^2.0.36", "primeicons": "^7.0.0", "primevue": "^4.2.5", "quicktype-core": "^23.0.171", + "rdflib": "^2.3.6", "showdown": "^2.1.0", + "sparqljs": "^3.7.3", "vue": "^3.5.13", "vue-flow": "^0.3.0", "vue-router": "^4.3.2", - "yaml": "^2.3.1" + "yaml": "^2.8.3" }, "devDependencies": { "@ls-lint/ls-lint": "^2.2.3", @@ -72,8 +80,11 @@ "@types/jsdom": "^21.1.1", "@types/json-pointer": "^1.0.31", "@types/jsonata": "^1.5.1", + "@types/jsonld": "^1.5.15", + "@types/n3": "^1.26.1", "@types/node": "^18.16.8", "@types/showdown": "^2.0.6", + "@types/sparqljs": "^3.1.12", "@types/yaml": "^1.9.7", "@typescript-eslint/eslint-plugin": "^5.59.0", "@vitejs/plugin-vue": "^4.2.3", diff --git a/meta_configurator/src/components/panels/ai-prompts/ApiKey.vue b/meta_configurator/src/components/panels/ai-prompts/ApiKey.vue index 80ac6f0bd..c251f78dd 100644 --- a/meta_configurator/src/components/panels/ai-prompts/ApiKey.vue +++ b/meta_configurator/src/components/panels/ai-prompts/ApiKey.vue @@ -5,16 +5,14 @@ Component for displaying the OpenAI API key input. import {type Ref, ref} from 'vue'; import Password from 'primevue/password'; import SelectButton from 'primevue/selectbutton'; -import {getApiKeyRef, getIsPersistKeyRef} from '@/utility/ai/apiKey'; - -const isShowPersistOption = false; // currently the option of whether to persist the key is not shown because without persistence the key currently can not be accessed +import {getApiKeyRef, getRememberInTabRef} from '@/utility/ai/apiKey'; const apiKey: Ref = getApiKeyRef(); -const isPersistKey: Ref = getIsPersistKeyRef(); +const rememberInTab: Ref = getRememberInTabRef(); -const persistOptions = ref([ - {name: 'true', value: true}, - {name: 'false', value: false}, +const rememberOptions = ref([ + {name: 'Remember in this tab', value: true}, + {name: 'Forget on refresh', value: false}, ]); @@ -28,17 +26,18 @@ const persistOptions = ref([ possible without permanently connecting your credit card with your account. Check this link for pricing.
-
MetaConfigurator by default uses the gpt-4o-mini model, which has very low cost. For improved results you can change to more performant models in the settings tab. +
+
+ Your key is stored only in your browser and sent directly to your chosen provider. It is never + sent to MetaConfigurator servers. Key: - - Persist: + diff --git a/meta_configurator/src/components/panels/ai-prompts/aiPromptUtils.ts b/meta_configurator/src/components/panels/ai-prompts/aiPromptUtils.ts index 1a2d12724..0f4d29c7e 100644 --- a/meta_configurator/src/components/panels/ai-prompts/aiPromptUtils.ts +++ b/meta_configurator/src/components/panels/ai-prompts/aiPromptUtils.ts @@ -28,7 +28,7 @@ export function fixGeneratedExpression( if (json.startsWith('```') && json.endsWith('```')) { json = json.substring(3, json.length - 3); } - return json; + return json.trim(); } function hasMoreOpeningBrackets(input: string): boolean { @@ -38,6 +38,4 @@ function hasMoreOpeningBrackets(input: string): boolean { return openingCount > closingCount; } -export function getApiKey(): string { - return localStorage.getItem('openai_api_key') || ''; -} +export {getApiKey} from '@/utility/ai/apiKey'; diff --git a/meta_configurator/src/components/panels/code-editor/AceEditor.vue b/meta_configurator/src/components/panels/code-editor/AceEditor.vue index c76a93203..f4ca7b33e 100644 --- a/meta_configurator/src/components/panels/code-editor/AceEditor.vue +++ b/meta_configurator/src/components/panels/code-editor/AceEditor.vue @@ -35,6 +35,11 @@ let editor: Ref = ref(undefined); onMounted(() => { editor.value = ace.edit(editor_id); + + editor.value.getSession().setUseWrapMode(true); + editor.value.setOption('wrap', true); + editor.value.setOption('hScrollBarAlwaysVisible', false); + setupAceMode(editor.value, settings.value); setupAceProperties(editor.value, settings.value); @@ -45,6 +50,13 @@ onMounted(() => { if (isEditorReadOnly()) { editor.value.setReadOnly(true); } + + // watch for changes in the editor container size and resize the editor accordingly + const observer = new ResizeObserver(() => { + editor.value?.resize(); + }); + const el = document.getElementById(editor_id); + if (el) observer.observe(el); }); // watch for changes in the data format and update the editor accordingly diff --git a/meta_configurator/src/components/panels/code-editor/aceUtility.ts b/meta_configurator/src/components/panels/code-editor/aceUtility.ts index 8a1120522..ba9bda223 100644 --- a/meta_configurator/src/components/panels/code-editor/aceUtility.ts +++ b/meta_configurator/src/components/panels/code-editor/aceUtility.ts @@ -30,7 +30,9 @@ export function updateCursorPositionBasedOnPath( currentPath: Path ) { const position = determineCursorPosition(editor, editorContent, currentPath); - editor.gotoLine(position.row + 1, position.column, true); // row is 1-based, column is 0-based + editor.clearSelection(); + editor.moveCursorToPosition(position); + editor.renderer.scrollCursorIntoView(); } /** diff --git a/meta_configurator/src/components/panels/defaultPanelTypes.ts b/meta_configurator/src/components/panels/defaultPanelTypes.ts index 659f9fe4f..ae0497299 100644 --- a/meta_configurator/src/components/panels/defaultPanelTypes.ts +++ b/meta_configurator/src/components/panels/defaultPanelTypes.ts @@ -9,6 +9,7 @@ import AiPromptsPanel from '@/components/panels/ai-prompts/AiPromptsPanel.vue'; import ListAnalysisPanel from './list-analysis/ListAnalysisPanel.vue'; import TestPanel from '@/components/panels/test-panel/TestPanel.vue'; import DocumentationPanel from '@/components/panels/documentation/DocumentationPanel.vue'; +import RdfPanel from '@/components/panels/rdf/RdfPanel.vue'; export const panelTypeTextEditor: PanelTypeDefinition = { getComponent: () => CodeEditorPanel, @@ -74,8 +75,16 @@ export const panelTypeDocementation: PanelTypeDefinition = { name: 'documentation', }; +export const panelTypeRdf: PanelTypeDefinition = { + getComponent: () => RdfPanel, + supportedModes: [SessionMode.DataEditor], + label: 'RDF View', + icon: 'fa-solid fa-globe', + name: 'rdf', +}; + /** - * Registers the default panel types, which are GuiEditor, TextEditor, Schema Diagram, Ai Prompts and Debug. + * Registers the default panel types, which are GuiEditor, TextEditor, Schema Diagram, Ai Prompts , RDF and Debug. */ export function registerDefaultPanelTypes() { panelTypeRegistry.registerPanelType('textEditor', panelTypeTextEditor); @@ -86,4 +95,5 @@ export function registerDefaultPanelTypes() { panelTypeRegistry.registerPanelType('debug', panelTypeDebug); panelTypeRegistry.registerPanelType('test', panelTypeTest); panelTypeRegistry.registerPanelType('documentation', panelTypeDocementation); + panelTypeRegistry.registerPanelType('rdf', panelTypeRdf); } diff --git a/meta_configurator/src/components/panels/rdf/RdfPanel.vue b/meta_configurator/src/components/panels/rdf/RdfPanel.vue new file mode 100644 index 000000000..d1db7f7c8 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/RdfPanel.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/add_expected.json b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/add_expected.json new file mode 100644 index 000000000..9338b48ae --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/add_expected.json @@ -0,0 +1,45 @@ +{ + "@context": { + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "www": "https://www.example.org/", + "sch": "https://schema.org/", + "unit": "http://qudt.org/vocab/unit/" + }, + "@graph": [ + { + "@id": "www:run_fenics_simulation", + "@type": "m4i:Method", + "m4i:hasParameter": { + "@id": "www:variable_element_size" + }, + "m4i:investigates": { + "@id": "www:variable_max_von_mises_stress" + } + }, + { + "@id": "www:variable_element_size", + "@type": "sch:PropertyValue", + "rdfs:label": "element_size", + "sch:unitCode": { + "@id": "unit:M" + }, + "sch:value": { + "@value": "2.5E-2", + "@type": "http://www.w3.org/2001/XMLSchema#double" + } + }, + { + "@id": "www:variable_max_von_mises_stress", + "@type": "sch:PropertyValue", + "rdfs:label": "max_von_mises_stress", + "sch:unitCode": { + "@id": "unit:MegaPA" + }, + "sch:value": { + "@value": "2.997915075586333E8", + "@type": "http://www.w3.org/2001/XMLSchema#double" + } + } + ] +} diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/delete_expected.json b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/delete_expected.json new file mode 100644 index 000000000..086d872f1 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/delete_expected.json @@ -0,0 +1,44 @@ +{ + "@context": { + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "www": "https://www.example.org/", + "sch": "https://schema.org/", + "unit": "http://qudt.org/vocab/unit/" + }, + "@graph": [ + { + "@id": "www:run_fenics_simulation", + "@type": "m4i:Method", + "m4i:hasParameter": { + "@id": "www:variable_element_size" + }, + "m4i:investigates": { + "@id": "www:variable_max_von_mises_stress" + } + }, + { + "@id": "www:variable_element_size", + "@type": "sch:PropertyValue", + "sch:unitCode": { + "@id": "unit:M" + }, + "sch:value": { + "@value": "2.5E-2", + "@type": "http://www.w3.org/2001/XMLSchema#double" + } + }, + { + "@id": "www:variable_max_von_mises_stress", + "@type": "sch:PropertyValue", + "rdfs:label": "max_von_mises_stress", + "sch:unitCode": { + "@id": "unit:MegaPA" + }, + "sch:value": { + "@value": "2.997915075586333E8", + "@type": "http://www.w3.org/2001/XMLSchema#double" + } + } + ] +} diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/edit_expected.json b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/edit_expected.json new file mode 100644 index 000000000..e1fca7ce5 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/edit_expected.json @@ -0,0 +1,45 @@ +{ + "@context": { + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "www": "https://www.example.org/", + "sch": "https://schema.org/", + "unit": "http://qudt.org/vocab/unit/" + }, + "@graph": [ + { + "@id": "www:run_fenics_simulation", + "@type": "m4i:Method", + "m4i:hasParameter": { + "@id": "www:variable_element_size" + }, + "m4i:investigates": { + "@id": "www:variable_max_von_mises_stress" + } + }, + { + "@id": "www:variable_element_size", + "@type": "sch:PropertyValue", + "rdfs:label": "element_size_updated", + "sch:unitCode": { + "@id": "unit:M" + }, + "sch:value": { + "@value": "2.5E-2", + "@type": "http://www.w3.org/2001/XMLSchema#double" + } + }, + { + "@id": "www:variable_max_von_mises_stress", + "@type": "sch:PropertyValue", + "rdfs:label": "max_von_mises_stress", + "sch:unitCode": { + "@id": "unit:MegaPA" + }, + "sch:value": { + "@value": "2.997915075586333E8", + "@type": "http://www.w3.org/2001/XMLSchema#double" + } + } + ] +} diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/input.json b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/input.json new file mode 100644 index 000000000..6b1f9a45d --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rdf-panel/input.json @@ -0,0 +1,43 @@ +{ + "@context": { + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "schema": "https://schema.org/", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#" + }, + "@graph": [ + { + "@id": "https://www.example.org/run_fenics_simulation", + "@type": "m4i:Method", + "m4i:hasParameter": { + "@id": "https://www.example.org/variable_element_size" + }, + "m4i:investigates": { + "@id": "https://www.example.org/variable_max_von_mises_stress" + } + }, + { + "@id": "https://www.example.org/variable_element_size", + "@type": "schema:PropertyValue", + "rdfs:label": "element_size", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/M" + }, + "schema:value": { + "@type": "http://www.w3.org/2001/XMLSchema#double", + "@value": "2.5E-2" + } + }, + { + "@id": "https://www.example.org/variable_max_von_mises_stress", + "@type": "schema:PropertyValue", + "rdfs:label": "max_von_mises_stress", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MegaPA" + }, + "schema:value": { + "@type": "http://www.w3.org/2001/XMLSchema#double", + "@value": "2.997915075586333E8" + } + } + ] +} diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/expected.json b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/expected.json new file mode 100644 index 000000000..6b1f9a45d --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/expected.json @@ -0,0 +1,43 @@ +{ + "@context": { + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "schema": "https://schema.org/", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#" + }, + "@graph": [ + { + "@id": "https://www.example.org/run_fenics_simulation", + "@type": "m4i:Method", + "m4i:hasParameter": { + "@id": "https://www.example.org/variable_element_size" + }, + "m4i:investigates": { + "@id": "https://www.example.org/variable_max_von_mises_stress" + } + }, + { + "@id": "https://www.example.org/variable_element_size", + "@type": "schema:PropertyValue", + "rdfs:label": "element_size", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/M" + }, + "schema:value": { + "@type": "http://www.w3.org/2001/XMLSchema#double", + "@value": "2.5E-2" + } + }, + { + "@id": "https://www.example.org/variable_max_von_mises_stress", + "@type": "schema:PropertyValue", + "rdfs:label": "max_von_mises_stress", + "schema:unitCode": { + "@id": "http://qudt.org/vocab/unit/MegaPA" + }, + "schema:value": { + "@type": "http://www.w3.org/2001/XMLSchema#double", + "@value": "2.997915075586333E8" + } + } + ] +} diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/input.json b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/input.json new file mode 100644 index 000000000..8e32d1bfb --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/input.json @@ -0,0 +1,16 @@ +{ + "parameters": [ + { + "name": "element_size", + "value": 0.025, + "unit": "M" + } + ], + "metrics": [ + { + "name": "max_von_mises_stress", + "value": 299791507.5586333, + "unit": "MegaPA" + } + ] +} diff --git a/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/mapping.ttl b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/mapping.ttl new file mode 100644 index 000000000..192023162 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/fixtures/rml-mapping/mapping.ttl @@ -0,0 +1,88 @@ +@prefix rr: . +@prefix rml: . +@prefix ql: . +@prefix m4i: . +@prefix schema: . +@prefix rdfs: . + +<#RunFenicsSimulation> + rml:logicalSource [ + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$" + ] ; + + rr:subjectMap [ + rr:template "https://www.example.org/run_fenics_simulation" ; + rr:class m4i:Method + ] ; + + rr:predicateObjectMap [ + rr:predicate m4i:hasParameter ; + rr:objectMap [ rr:parentTriplesMap <#ParameterMapping> ] + ] ; + + rr:predicateObjectMap [ + rr:predicate m4i:investigates ; + rr:objectMap [ rr:parentTriplesMap <#MetricMapping> ] + ] . + +<#ParameterMapping> + rml:logicalSource [ + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.parameters[*]" + ] ; + + rr:subjectMap [ + rr:template "https://www.example.org/variable_{name}" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rml:reference "name" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ rml:reference "value" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{unit}" ; + rr:termType rr:IRI + ] + ] . + +<#MetricMapping> + rml:logicalSource [ + rml:source "Data.json" ; + rml:referenceFormulation ql:JSONPath ; + rml:iterator "$.metrics[*]" + ] ; + + rr:subjectMap [ + rr:template "https://www.example.org/variable_{name}" ; + rr:class schema:PropertyValue + ] ; + + rr:predicateObjectMap [ + rr:predicate rdfs:label ; + rr:objectMap [ rml:reference "name" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:value ; + rr:objectMap [ rml:reference "value" ] + ] ; + + rr:predicateObjectMap [ + rr:predicate schema:unitCode ; + rr:objectMap [ + rr:template "http://qudt.org/vocab/unit/{unit}" ; + rr:termType rr:IRI + ] + ] . \ No newline at end of file diff --git a/meta_configurator/src/components/panels/rdf/__tests__/rdfPanel.test.ts b/meta_configurator/src/components/panels/rdf/__tests__/rdfPanel.test.ts new file mode 100644 index 000000000..cd43eab76 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/rdfPanel.test.ts @@ -0,0 +1,193 @@ +import {describe, expect, it, vi} from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {defineComponent, ref} from 'vue'; +import {mount} from '@vue/test-utils'; +import {SessionMode} from '@/store/sessionMode'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); +const fixturesDir = path.join(dirname, 'fixtures', 'rdf-panel'); + +function readFixture(name: string): string { + return fs.readFileSync(path.join(fixturesDir, name), 'utf-8'); +} + +async function waitUntil(predicate: () => boolean, timeoutMs = 2500) { + const start = Date.now(); + while (!predicate()) { + if (Date.now() - start > timeoutMs) { + throw new Error('Timed out while waiting for condition'); + } + await new Promise(resolve => setTimeout(resolve, 10)); + } +} + +const PanelSettingsStub = defineComponent({template: '
'}); +const RmlMappingDialogStub = defineComponent({ + template: '
', + methods: {show: vi.fn()}, +}); +const ImportTurtleDialogStub = defineComponent({ + template: '
', + methods: {show: vi.fn()}, +}); +const MessageStub = defineComponent({template: '
'}); +const RdfTabPanelStub = defineComponent({template: '
'}); +const VARIABLE_ELEMENT_SIZE_IRI = 'https://www.example.org/variable_element_size'; +const RDFS_LABEL_IRI = 'http://www.w3.org/2000/01/rdf-schema#label'; +const ORIGINAL_LABEL = 'element_size'; +const UPDATED_LABEL = 'element_size_updated'; + +describe('RdfPanel', () => { + it('loads fixture data, edits one rdf statement, deletes it, adds it back, and updates editor data', async () => { + vi.resetModules(); + (globalThis as any).window = globalThis as any; + + const inputJsonLd = JSON.parse(readFixture('input.json')); + const expectedEditedJsonLd = JSON.parse(readFixture('edit_expected.json')); + const expectedDeletedJsonLd = JSON.parse(readFixture('delete_expected.json')); + const expectedAddedJsonLd = JSON.parse(readFixture('add_expected.json')); + const dataRef = ref({}); + const dataAtCurrentPath = ref(null); + const currentPath = ref([]); + const currentSelectedElement = ref([]); + + vi.doMock('@/data/useDataLink', () => ({ + getDataForMode: () => ({ + data: dataRef, + shallowDataRef: dataRef, + dataAtCurrentPath, + isDataUnparseable: () => false, + setData: (value: any) => { + dataRef.value = value; + }, + }), + getSessionForMode: () => ({ + currentPath, + currentSelectedElement, + updateCurrentPath: (path: any) => { + currentPath.value = path; + }, + updateCurrentSelectedElement: (path: any) => { + currentSelectedElement.value = path; + }, + }), + })); + + vi.doMock('rdflib', async () => { + const {createRequire} = await import('node:module'); + const require = createRequire(import.meta.url); + return require('rdflib'); + }); + + const RdfPanel = (await import('@/components/panels/rdf/RdfPanel.vue')).default; + const {rdfStoreManager} = await import('@/components/panels/rdf/rdfStoreManager'); + const {TripleEditorService} = await import('@/components/panels/rdf/tripleEditorService'); + const {RdfTermType} = await import('@/components/panels/rdf/rdfUtils'); + const {RdfMediaType} = await import('@/components/panels/rdf/rdfEnums'); + + const getExportedJsonLd = () => + JSON.parse(rdfStoreManager.exportAs(RdfMediaType.JsonLd).content ?? '{"@graph":[]}'); + + mount(RdfPanel, { + props: {sessionMode: SessionMode.DataEditor}, + global: { + stubs: { + PanelSettings: PanelSettingsStub, + RmlMappingDialog: RmlMappingDialogStub, + ImportTurtleDialog: ImportTurtleDialogStub, + Message: MessageStub, + RdfTabPanel: RdfTabPanelStub, + }, + }, + }); + + dataRef.value = inputJsonLd; + await waitUntil(() => rdfStoreManager.statements.value.length > 0); + + const target = rdfStoreManager.statements.value.find( + st => + st.subject.value === VARIABLE_ELEMENT_SIZE_IRI && + st.predicate.value === RDFS_LABEL_IRI && + st.object.termType === RdfTermType.Literal + ); + expect(target).toBeDefined(); + + const result = TripleEditorService.addOrEdit({ + subject: target!.subject.value, + subjectType: target!.subject.termType, + predicate: target!.predicate.value, + predicateType: target!.predicate.termType, + object: UPDATED_LABEL, + objectType: RdfTermType.Literal, + objectDatatype: target!.object.datatype?.value ?? '', + statement: target, + }); + + expect(result.success).toBe(true); + + await waitUntil(() => + rdfStoreManager.statements.value.some( + st => + st.subject.value === VARIABLE_ELEMENT_SIZE_IRI && + st.predicate.value === RDFS_LABEL_IRI && + st.object.termType === RdfTermType.Literal && + st.object.value === UPDATED_LABEL + ) + ); + await waitUntil( + () => JSON.stringify(getExportedJsonLd()) === JSON.stringify(expectedEditedJsonLd) + ); + expect(getExportedJsonLd()).toEqual(expectedEditedJsonLd); + + const editedStatement = rdfStoreManager.statements.value.find( + st => + st.subject.value === VARIABLE_ELEMENT_SIZE_IRI && + st.predicate.value === RDFS_LABEL_IRI && + st.object.termType === RdfTermType.Literal && + st.object.value === UPDATED_LABEL + ); + expect(editedStatement).toBeDefined(); + + const deleteResult = TripleEditorService.delete(editedStatement!); + expect(deleteResult.success).toBe(true); + + await waitUntil( + () => + !rdfStoreManager.statements.value.some( + st => + st.subject.value === VARIABLE_ELEMENT_SIZE_IRI && st.predicate.value === RDFS_LABEL_IRI + ) + ); + await waitUntil( + () => JSON.stringify(getExportedJsonLd()) === JSON.stringify(expectedDeletedJsonLd) + ); + expect(getExportedJsonLd()).toEqual(expectedDeletedJsonLd); + + const addResult = TripleEditorService.addOrEdit({ + subject: editedStatement!.subject.value, + subjectType: editedStatement!.subject.termType, + predicate: editedStatement!.predicate.value, + predicateType: editedStatement!.predicate.termType, + object: ORIGINAL_LABEL, + objectType: RdfTermType.Literal, + objectDatatype: editedStatement!.object.datatype?.value ?? '', + }); + expect(addResult.success).toBe(true); + + await waitUntil(() => + rdfStoreManager.statements.value.some( + st => + st.subject.value === VARIABLE_ELEMENT_SIZE_IRI && + st.predicate.value === RDFS_LABEL_IRI && + st.object.termType === RdfTermType.Literal && + st.object.value === ORIGINAL_LABEL + ) + ); + await waitUntil( + () => JSON.stringify(getExportedJsonLd()) === JSON.stringify(expectedAddedJsonLd) + ); + expect(getExportedJsonLd()).toEqual(expectedAddedJsonLd); + }); +}); diff --git a/meta_configurator/src/components/panels/rdf/__tests__/rmlMappingServiceStandard.test.ts b/meta_configurator/src/components/panels/rdf/__tests__/rmlMappingServiceStandard.test.ts new file mode 100644 index 000000000..9e20fc9e2 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/__tests__/rmlMappingServiceStandard.test.ts @@ -0,0 +1,26 @@ +import {describe, expect, it} from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {RmlMappingServiceStandard} from '@/rml-mapping/standard/rmlMappingServiceStandard'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); +const fixturesDir = path.join(dirname, 'fixtures', 'rml-mapping'); + +function readFixture(name: string): string { + return fs.readFileSync(path.join(fixturesDir, name), 'utf-8'); +} + +describe('RmlMappingServiceStandard.performRmlMapping', () => { + it('Reads JSON input and applies RML mapping, then matches expected JSON-LD', async () => { + const input = JSON.parse(readFixture('input.json')); + const mappingConfig = readFixture('mapping.ttl'); + const expectedResult = JSON.parse(readFixture('expected.json')); + + const service = new RmlMappingServiceStandard(); + const result = await service.performRmlMapping(input, mappingConfig); + + expect(result.success).toBe(true); + expect(result.resultData).toEqual(expectedResult); + }); +}); diff --git a/meta_configurator/src/components/panels/rdf/aceSyntaxHighlighting.ts b/meta_configurator/src/components/panels/rdf/aceSyntaxHighlighting.ts new file mode 100644 index 000000000..b09fde718 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/aceSyntaxHighlighting.ts @@ -0,0 +1,74 @@ +import ace from 'brace'; + +const oop = ace.acequire('ace/lib/oop'); +const TextMode = ace.acequire('ace/mode/text').Mode; +const TextHighlightRules = ace.acequire('ace/mode/text_highlight_rules').TextHighlightRules; + +const SparqlHighlightRules = function (this: any) { + const keywords = + 'SELECT|WHERE|ASK|CONSTRUCT|DESCRIBE|FROM|NAMED|PREFIX|BASE|' + + 'FILTER|OPTIONAL|GRAPH|UNION|BIND|VALUES|DISTINCT|REDUCED|' + + 'ORDER|BY|LIMIT|OFFSET|GROUP|HAVING|AS'; + + const functions = + 'STR|LANG|LANGMATCHES|DATATYPE|BOUND|IRI|URI|BNODE|' + + 'RAND|ABS|CEIL|FLOOR|ROUND|CONCAT|SUBSTR|STRLEN|' + + 'UCASE|LCASE|ENCODE_FOR_URI|CONTAINS|STRSTARTS|STRENDS'; + + this.$rules = { + start: [ + {token: 'comment', regex: '#.*$'}, + {token: 'string', regex: '".*?"'}, + {token: 'string', regex: "'.*?'"}, + {token: 'constant.language', regex: '<[^>]*>'}, + {token: 'variable', regex: '\\?[a-zA-Z_][a-zA-Z0-9_]*'}, + {token: 'keyword', regex: '\\b(?:PREFIX|BASE)\\b'}, + {token: 'keyword.control', regex: '\\b(?:' + keywords + ')\\b', caseInsensitive: true}, + {token: 'support.function', regex: '\\b(?:' + functions + ')\\b', caseInsensitive: true}, + {token: 'constant.numeric', regex: '\\b[0-9]+\\b'}, + {token: 'keyword.operator', regex: '=|!=|<|>|<=|>=|&&|\\|\\|'}, + {token: 'paren.lparen', regex: '[\\(\\{\\[]'}, + {token: 'paren.rparen', regex: '[\\)\\}\\]]'}, + {token: 'text', regex: '\\s+'}, + ], + }; +}; + +oop.inherits(SparqlHighlightRules, TextHighlightRules); + +export const SparqlCustomMode = function (this: any) { + this.HighlightRules = SparqlHighlightRules; +} as any; +oop.inherits(SparqlCustomMode, TextMode); +(SparqlCustomMode as any).prototype.$id = 'ace/mode/sparql_custom'; + +const RmlHighlightRules = function (this: any) { + const keywords = + '@PREFIX|BASE|a|GRAPH|OPTIONAL|UNION|FILTER|BIND|VALUES|SELECT|WHERE|CONSTRUCT|ASK|DESCRIBE'; + + this.$rules = { + start: [ + {token: 'comment', regex: '#.*$'}, + {token: 'string', regex: '"(?:\\\\.|[^"\\\\])*"'}, + {token: 'string', regex: "'(?:\\\\.|[^'\\\\])*'"}, + {token: 'constant.language', regex: '<[^>]*>'}, + {token: 'variable', regex: '\\?[a-zA-Z_][a-zA-Z0-9_]*'}, + {token: 'entity.name.tag', regex: '@(?:prefix|base)\\b', caseInsensitive: true}, + {token: 'keyword.control', regex: '\\b(?:' + keywords + ')\\b', caseInsensitive: true}, + {token: 'constant.numeric', regex: '[+-]?(?:\\d+\\.\\d+|\\d+)(?:[eE][+-]?\\d+)?\\b'}, + {token: 'keyword.operator', regex: '=>|=|!=|<|>|<=|>=|&&|\\|\\|'}, + {token: 'paren.lparen', regex: '[\\(\\{\\[]'}, + {token: 'paren.rparen', regex: '[\\)\\}\\]]'}, + {token: 'punctuation.operator', regex: '[;,.]'}, + {token: 'text', regex: '\\s+'}, + ], + }; +}; + +oop.inherits(RmlHighlightRules, TextHighlightRules); + +export const RmlCustomMode = function (this: any) { + this.HighlightRules = RmlHighlightRules; +} as any; +oop.inherits(RmlCustomMode, TextMode); +(RmlCustomMode as any).prototype.$id = 'ace/mode/rml_custom'; diff --git a/meta_configurator/src/components/panels/rdf/jsonLdContextManager.ts b/meta_configurator/src/components/panels/rdf/jsonLdContextManager.ts new file mode 100644 index 000000000..fe2a9a7a4 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/jsonLdContextManager.ts @@ -0,0 +1,165 @@ +import {ref, watch} from 'vue'; +import {rdfStoreManager} from '@/components/panels/rdf/rdfStoreManager'; +import {getDataForMode} from '@/data/useDataLink'; +import {SessionMode} from '@/store/sessionMode'; +import {XSD_NS} from '@/components/panels/rdf/rdfUtils'; + +interface JsonLdContextManagerStore { + getContextText: () => string; + extractContext: (json: any) => Record; + getEquivalentTerms: (term: string) => Set; + isIRI: (value: string) => boolean; + toPrefixed: (iri: string) => string; + expandIRI: (value: string) => string | null; + isLinkableIRI: (value: string) => boolean; + iriHref: (value: string) => string | null; +} + +export const jsonLdContextManager: JsonLdContextManagerStore = (() => { + const parsedContext = ref>({}); + const contextText = ref(''); + + const getContextText = () => contextText.value; + + const extractContext = (json: any): Record => { + if (!json || typeof json !== 'object') return {}; + const ctx = json['@context']; + if (!ctx) return {}; + + if (typeof ctx === 'object' && !Array.isArray(ctx)) { + return ctx; + } + + if (Array.isArray(ctx)) { + return ctx.reduce>((merged, entry) => { + if (entry && typeof entry === 'object' && !Array.isArray(entry)) { + Object.assign(merged, entry); + } + return merged; + }, {}); + } + + return {}; + }; + + const resolvePrefix = (prefix: string, local: string): string | null => { + const ctx = parsedContext.value; + + const entry = ctx[prefix]; + if (entry) { + const ns = typeof entry === 'string' ? entry : entry?.['@id']; + if (typeof ns === 'string') return ns + local; + } + + const ns = rdfStoreManager.namespaces.value[prefix]; + if (ns) return ns + local; + + return null; + }; + + const getEquivalentTerms = (term: string): Set => { + const out = new Set(); + out.add(term); + + if (isIRI(term)) { + const prefixed = toPrefixed(term); + if (prefixed !== term) out.add(prefixed); + + const ctx = parsedContext.value; + for (const key of Object.keys(ctx)) { + const entry = ctx[key]; + const mapped = typeof entry === 'string' ? entry : entry?.['@id']; + if (mapped === term) out.add(key); + } + } else { + const expanded = expandIRI(term); + if (expanded) out.add(expanded); + } + + return out; + }; + + const isIRI = (value: string): boolean => { + return ( + Boolean(value) && + !value.startsWith('_:') && + !/\s/.test(value) && + /^[A-Za-z][A-Za-z0-9+.-]*:.+/.test(value) + ); + }; + + const toPrefixed = (iri: string): string => { + const ctx = parsedContext.value; + + for (const [key, entry] of Object.entries(ctx)) { + const ns = typeof entry === 'string' ? entry : (entry as any)?.['@id']; + if (typeof ns === 'string' && iri.startsWith(ns)) { + return `${key}:${iri.slice(ns.length)}`; + } + } + + for (const [prefix, namespace] of Object.entries(rdfStoreManager.namespaces.value)) { + if (iri.startsWith(namespace)) { + return `${prefix}:${iri.slice(namespace.length)}`; + } + } + + if (iri.startsWith(XSD_NS)) { + return `xsd:${iri.slice(XSD_NS.length)}`; + } + + return iri; + }; + + const expandIRI = (value: string): string | null => { + if (!value || typeof value !== 'string') return null; + + if (isIRI(value)) return value; + + const idx = value.indexOf(':'); + + if (idx !== -1) { + const prefix = value.slice(0, idx); + const local = value.slice(idx + 1); + const resolved = resolvePrefix(prefix, local); + if (resolved) return resolved; + } + + const ctx = parsedContext.value; + const entry = ctx[value]; + if (entry) { + const mapped = typeof entry === 'string' ? entry : entry?.['@id']; + if (typeof mapped === 'string') return mapped; + } + + return null; + }; + + const isLinkableIRI = (value: string): boolean => { + return expandIRI(value) !== null; + }; + + const iriHref = (value: string): string | null => { + return expandIRI(value); + }; + + watch( + () => getDataForMode(SessionMode.DataEditor).data.value, + data => { + const ctx = extractContext(data); + parsedContext.value = ctx; + contextText.value = JSON.stringify(ctx, null, 2); + } + ); + + return { + getContextText, + extractContext, + getEquivalentTerms, + isIRI, + toPrefixed, + expandIRI, + isLinkableIRI, + iriHref, + }; +})(); diff --git a/meta_configurator/src/components/panels/rdf/jsonLdNodeManager.ts b/meta_configurator/src/components/panels/rdf/jsonLdNodeManager.ts new file mode 100644 index 000000000..f8cd9629d --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/jsonLdNodeManager.ts @@ -0,0 +1,160 @@ +import * as $rdf from 'rdflib'; +import type {Path} from '@/utility/path'; +import {getDataForMode} from '@/data/useDataLink'; +import {SessionMode} from '@/store/sessionMode'; +import {rdfStoreManager} from '@/components/panels/rdf/rdfStoreManager'; +import {jsonLdContextManager} from '@/components/panels/rdf/jsonLdContextManager'; +import {RdfMediaType} from '@/components/panels/rdf/rdfEnums'; + +export interface JsonLdDoc { + '@context': any; + '@graph': any[]; +} + +export interface JsonLdNodeManagerStore { + editStatement: (oldStatement: $rdf.Statement, newStatement: $rdf.Statement) => void; + deleteStatement: (statement: $rdf.Statement) => void; + addStatement: (statement: $rdf.Statement, isNewNode: boolean) => void; + renameSubjectNode: () => void; + findPath: (statement: $rdf.Statement) => Path | undefined; + extractJsonLdByPath: (path: Path) => JsonLdDoc | undefined; +} + +interface TripleEquivs { + subject: Set; + predicate: Set; + object: Set; +} + +type JsonPath = (string | number)[]; + +export const jsonLdNodeManager: JsonLdNodeManagerStore = (() => { + const data = getDataForMode(SessionMode.DataEditor); + + const rebuildFromStore = (): void => { + const {content} = rdfStoreManager.exportAs(RdfMediaType.JsonLd); + const parsed = JSON.parse(content); + data.setData(normalizeJsonLdRoot(parsed)); + }; + + const editStatement = (_old: $rdf.Statement, _new: $rdf.Statement) => rebuildFromStore(); + const deleteStatement = (_statement: $rdf.Statement) => rebuildFromStore(); + const addStatement = (_statement: $rdf.Statement, _isNew: boolean) => rebuildFromStore(); + const renameSubjectNode = () => rebuildFromStore(); + + const findPath = (statement: $rdf.Statement): Path | undefined => { + const json = data.data.value; + const equivs: TripleEquivs = { + subject: jsonLdContextManager.getEquivalentTerms(statement.subject.value), + predicate: jsonLdContextManager.getEquivalentTerms(statement.predicate.value), + object: jsonLdContextManager.getEquivalentTerms(statement.object.value), + }; + return findPathInJson(json, [], equivs) as Path; + }; + + const extractJsonLdByPath = (path: Path): JsonLdDoc | undefined => + extractFromJsonLd(data.data.value, path); + + return { + editStatement, + deleteStatement, + addStatement, + renameSubjectNode, + findPath, + extractJsonLdByPath, + }; +})(); + +function normalizeJsonLdRoot(parsed: any): any { + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed) || parsed['@graph']) { + return parsed; + } + const {'@context': context, ...graphNode} = parsed; + return {'@context': context, '@graph': [graphNode]}; +} + +function findPathInJson(value: any, path: JsonPath, equivs: TripleEquivs): JsonPath | null { + if (Array.isArray(value)) { + for (let i = 0; i < value.length; i++) { + const found = findPathInJson(value[i], [...path, i], equivs); + if (found) return found; + } + return null; + } + + if (!value || typeof value !== 'object') return null; + + if (typeof value['@id'] === 'string' && equivs.subject.has(value['@id'])) { + const match = findPathInNode(value, path, equivs); + if (match) return match; + } + + for (const key of Object.keys(value)) { + const found = findPathInJson(value[key], [...path, key], equivs); + if (found) return found; + } + + return null; +} + +function findPathInNode( + node: Record, + nodePath: JsonPath, + equivs: TripleEquivs +): JsonPath | null { + for (const key of Object.keys(node)) { + if (!equivs.predicate.has(key)) continue; + const match = matchObjectValue(node[key], [...nodePath, key], equivs.object); + if (match) return match; + } + return null; +} + +function matchObjectValue( + value: any, + basePath: JsonPath, + objectEquivs: Set +): JsonPath | null { + if (Array.isArray(value)) { + for (let i = 0; i < value.length; i++) { + const found = matchObjectValue(value[i], [...basePath, i], objectEquivs); + if (found) return found; + } + return null; + } + + if (value && typeof value === 'object') { + if (typeof value['@id'] === 'string' && objectEquivs.has(value['@id'])) + return [...basePath, '@id']; + if ('@value' in value && objectEquivs.has(String(value['@value']))) + return [...basePath, '@value']; + return null; + } + + return objectEquivs.has(String(value)) ? basePath : null; +} + +function extractFromJsonLd(jsonld: any, path: Path): JsonLdDoc | undefined { + const hasGraph = Boolean(jsonld?.['@graph']); + const graphPath = hasGraph ? path : (['@graph', 0, ...path] as Path); + + if (graphPath.length < 3 || graphPath[0] !== '@graph') return undefined; + + const [, graphIndex, predicate, objectIndex] = graphPath; + if (typeof graphIndex !== 'number' || typeof predicate !== 'string') return undefined; + + const subjectNode = hasGraph ? jsonld['@graph']?.[graphIndex] : jsonld; + if (!subjectNode) return undefined; + + let value = subjectNode[predicate]; + if (value === undefined) return undefined; + if (typeof objectIndex === 'number') value = value[objectIndex]; + + const subjectId = + typeof subjectNode === 'string' ? subjectNode : subjectNode['@id'] ?? jsonld?.['@id']; + + return { + '@context': jsonld?.['@context'], + '@graph': [{'@id': subjectId, [predicate]: value}], + }; +} diff --git a/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologyExplorer.vue b/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologyExplorer.vue new file mode 100644 index 000000000..25680ab1b --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologyExplorer.vue @@ -0,0 +1,744 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologySparqlTab.vue b/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologySparqlTab.vue new file mode 100644 index 000000000..1d5af3cb4 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologySparqlTab.vue @@ -0,0 +1,425 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologyTermTabs.vue b/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologyTermTabs.vue new file mode 100644 index 000000000..67852aed4 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/ontology-explorer/RdfOntologyTermTabs.vue @@ -0,0 +1,366 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/ontology-explorer/rdfIndexedDbManager.ts b/meta_configurator/src/components/panels/rdf/ontology-explorer/rdfIndexedDbManager.ts new file mode 100644 index 000000000..1983fed87 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/ontology-explorer/rdfIndexedDbManager.ts @@ -0,0 +1,187 @@ +import {RdfPropertyType} from '@/components/panels/rdf/rdfEnums'; + +export const RDF_CACHE_DB_NAME = 'rdf_ontology_cache_db'; +export const RDF_CACHE_DB_VERSION = 5; +export const RDF_CACHE_STORE = 'rdf_cache'; + +type RdfStoreName = typeof RDF_CACHE_STORE; + +export type OntologyPropertyType = `${RdfPropertyType}`; + +export type RdfOntologyRow = { + about: string; + comment: string; + propertyType: OntologyPropertyType; +}; + +export type RdfCachedOntology = { + key: string; + ontologyIri: string; + url: string; + rawContent: string; + format?: string; + contentType?: string; + fetchedAt: string; + mergedGraphNTriples?: string; + ontologyQueryResults?: RdfOntologyRow[]; + queryResultsFetchedAt?: string; + lastSparqlQuery?: string; +}; + +export type RdfCachedContext = { + key: string; + url: string; + rawContent: string; + fetchedAt: string; +}; + +const VALID_PROPERTY_TYPES = new Set([ + RdfPropertyType.DatatypeProperty, + RdfPropertyType.ObjectProperty, + RdfPropertyType.Class, +]); + +function toString(value: unknown, fallback = ''): string { + return typeof value === 'string' ? value : fallback; +} + +function toOptionalString(value: unknown): string | undefined { + const s = toString(value); + return s || undefined; +} + +let rdfCacheDbPromise: Promise | null = null; + +export function openRdfCacheDb(): Promise { + if (typeof window === 'undefined' || typeof indexedDB === 'undefined') { + return Promise.reject(new Error('IndexedDB is not available.')); + } + + if (rdfCacheDbPromise) return rdfCacheDbPromise; + + rdfCacheDbPromise = new Promise((resolve, reject) => { + const request = indexedDB.open(RDF_CACHE_DB_NAME, RDF_CACHE_DB_VERSION); + + request.onupgradeneeded = () => { + const db = request.result; + if (!db.objectStoreNames.contains(RDF_CACHE_STORE)) { + db.createObjectStore(RDF_CACHE_STORE, {keyPath: 'key'}); + } + }; + + request.onsuccess = () => { + const db = request.result; + db.onversionchange = () => db.close(); + resolve(db); + }; + + request.onerror = () => + reject(new Error(request.error?.message ?? 'Failed to open RDF IndexedDB cache.')); + }).catch(error => { + rdfCacheDbPromise = null; + throw error; + }); + + return rdfCacheDbPromise; +} + +export async function getFromRdfStore( + storeName: RdfStoreName, + key: IDBValidKey +): Promise { + const db = await openRdfCacheDb(); + return new Promise((resolve, reject) => { + const request = db.transaction(storeName, 'readonly').objectStore(storeName).get(key); + request.onsuccess = () => resolve((request.result as T | undefined) ?? null); + request.onerror = () => + reject(new Error(request.error?.message ?? `Failed to read from "${storeName}".`)); + }); +} + +export async function putInRdfStore(storeName: RdfStoreName, value: T): Promise { + await runTransaction(storeName, store => store.put(value), 'Failed to write to'); +} + +export async function deleteFromRdfStore(storeName: RdfStoreName, key: IDBValidKey): Promise { + await runTransaction(storeName, store => store.delete(key), 'Failed to delete from'); +} + +async function runTransaction( + storeName: RdfStoreName, + operation: (store: IDBObjectStore) => void, + errorPrefix: string +): Promise { + const db = await openRdfCacheDb(); + return new Promise((resolve, reject) => { + const tx = db.transaction(storeName, 'readwrite'); + operation(tx.objectStore(storeName)); + tx.oncomplete = () => resolve(); + tx.onerror = () => reject(new Error(tx.error?.message ?? `${errorPrefix} "${storeName}".`)); + tx.onabort = () => + reject(new Error(tx.error?.message ?? `${errorPrefix} "${storeName}" was aborted.`)); + }); +} + +export function getRdfCacheKey(rawKey: string): string { + return String(rawKey ?? '').trim(); +} + +function normalizeOntologyRow(row: Partial): RdfOntologyRow { + return { + about: toString(row?.about), + comment: toString(row?.comment), + propertyType: VALID_PROPERTY_TYPES.has(row?.propertyType as OntologyPropertyType) + ? (row.propertyType as OntologyPropertyType) + : RdfPropertyType.ObjectProperty, + }; +} + +export function normalizeOntologyCacheEntry( + value: Partial | undefined +): RdfCachedOntology | null { + if (!value) return null; + + const ontologyIri = getRdfCacheKey(toString(value.ontologyIri)); + if (!ontologyIri) return null; + + return { + key: getRdfCacheKey(toString(value.key, ontologyIri)), + ontologyIri, + url: toString(value.url), + rawContent: toString(value.rawContent), + format: toOptionalString(value.format), + contentType: toOptionalString(value.contentType), + fetchedAt: toString(value.fetchedAt), + mergedGraphNTriples: toOptionalString(value.mergedGraphNTriples), + ontologyQueryResults: Array.isArray(value.ontologyQueryResults) + ? value.ontologyQueryResults.map(normalizeOntologyRow) + : undefined, + queryResultsFetchedAt: toOptionalString(value.queryResultsFetchedAt), + lastSparqlQuery: toOptionalString(value.lastSparqlQuery), + }; +} + +export async function getOntologyFromRdfCache( + ontologyIri: string +): Promise { + const key = getRdfCacheKey(ontologyIri); + if (!key) return null; + const result = await getFromRdfStore>(RDF_CACHE_STORE, key); + return normalizeOntologyCacheEntry(result ?? undefined); +} + +export async function putOntologyInRdfCache(entry: Partial): Promise { + const normalized = normalizeOntologyCacheEntry(entry); + if (!normalized?.ontologyIri) { + throw new Error('Failed to cache ontology: missing ontology IRI key.'); + } + await putInRdfStore(RDF_CACHE_STORE, { + ...normalized, + key: getRdfCacheKey(normalized.ontologyIri), + }); +} + +export async function deleteOntologyFromRdfCache(ontologyIri: string): Promise { + const key = getRdfCacheKey(ontologyIri); + if (key) await deleteFromRdfStore(RDF_CACHE_STORE, key); +} diff --git a/meta_configurator/src/components/panels/rdf/ontology-explorer/rdfOntologyUtils.ts b/meta_configurator/src/components/panels/rdf/ontology-explorer/rdfOntologyUtils.ts new file mode 100644 index 000000000..e5f180966 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/ontology-explorer/rdfOntologyUtils.ts @@ -0,0 +1,157 @@ +import * as $rdf from 'rdflib'; +import {RdfMediaType, RdfPredicateIri, RdfPropertyTypeIri} from '@/components/panels/rdf/rdfEnums'; + +const CONTENT_TYPE_MAP: Record = { + [RdfMediaType.RdfXml]: RdfMediaType.RdfXml, + [RdfMediaType.Xml]: RdfMediaType.RdfXml, + [RdfMediaType.TextXml]: RdfMediaType.RdfXml, + [RdfMediaType.Turtle]: RdfMediaType.Turtle, + [RdfMediaType.XTurtle]: RdfMediaType.Turtle, + [RdfMediaType.NTriples]: RdfMediaType.NTriples, + [RdfMediaType.N3]: RdfMediaType.N3, + [RdfMediaType.JsonLd]: RdfMediaType.JsonLd, + [RdfMediaType.Json]: RdfMediaType.JsonLd, +}; + +const EXTENSION_MAP: Record = { + '.ttl': RdfMediaType.Turtle, + '.nt': RdfMediaType.NTriples, + '.n3': RdfMediaType.N3, + '.rdf': RdfMediaType.RdfXml, + '.owl': RdfMediaType.RdfXml, + '.xml': RdfMediaType.RdfXml, + '.jsonld': RdfMediaType.JsonLd, + '.json': RdfMediaType.JsonLd, +}; + +function formatFromExtension(url: string): string | null { + const lower = url.toLowerCase(); + return Object.entries(EXTENSION_MAP).find(([ext]) => lower.endsWith(ext))?.[1] ?? null; +} + +export function detectRdfFormat(contentTypeHeader: string, url: string): string | null { + const contentType = contentTypeHeader.split(';')[0]!.trim().toLowerCase(); + + const fromContentType = CONTENT_TYPE_MAP[contentType]; + if (fromContentType) return fromContentType; + + const isGenericContentType = + contentType === RdfMediaType.TextPlain || contentType === RdfMediaType.OctetStream; + + if (isGenericContentType || !fromContentType) { + return formatFromExtension(url); + } + + return null; +} + +export function parseRdfToStore( + content: string, + baseUri: string, + format: string +): Promise<$rdf.Formula> { + return new Promise((resolve, reject) => { + const store = $rdf.graph(); + $rdf.parse(content, store as $rdf.Formula, baseUri, format, err => { + if (err) { + reject(new Error(`The ontology content at "${baseUri}" is not valid RDF.`)); + } else { + resolve(store as $rdf.Formula); + } + }); + }); +} + +export function serializeStoreToNTriples(store: $rdf.Formula): string { + return [...new Set(store.statements.map(s => s.toNT()))].join('\n'); +} + +function normalizeKeyName(key: unknown): string { + if (key && typeof key === 'object' && 'value' in key) return String((key as any).value); + if (key && typeof key === 'object' && 'name' in key) return String((key as any).name); + return String(key).replace(/^\?/, ''); +} + +export function getBindingValue(binding: any, name: string): string { + if (!binding) return ''; + + // Comunica bindings expose keys() + get(key) + if (typeof binding.keys === 'function' && typeof binding.get === 'function') { + for (const key of binding.keys()) { + if (normalizeKeyName(key) === name) { + return binding.get(key)?.value ?? ''; + } + } + return ''; + } + + // Map-like fallback + if (typeof binding.entries === 'function') { + for (const [key, val] of binding.entries()) { + if (normalizeKeyName(key) === name) return val?.value ?? ''; + } + } + + return ''; +} + +export function escapeForSparqlString(value: string): string { + return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); +} + +export function buildOntologyQuery(namespace: string): string { + const namespaceFilter = namespace + ? `FILTER(STRSTARTS(STR(?about), "${escapeForSparqlString(namespace)}"))` + : ''; + + return ` + SELECT ?about ?propertyType (SAMPLE(?commentTerm) AS ?comment) WHERE { + ?about a ?propertyType . + FILTER( + ?propertyType IN ( + <${RdfPropertyTypeIri.OwlObjectProperty}>, + <${RdfPropertyTypeIri.OwlDatatypeProperty}>, + <${RdfPropertyTypeIri.RdfProperty}>, + <${RdfPropertyTypeIri.RdfsClass}>, + <${RdfPropertyTypeIri.OwlClass}> + ) + ) + ${namespaceFilter} + OPTIONAL { + ?about <${RdfPredicateIri.RdfsComment}> ?commentTerm . + FILTER(LANG(?commentTerm) = "" || LANGMATCHES(LANG(?commentTerm), "en")) + } + } + GROUP BY ?about ?propertyType + ORDER BY STR(?about) + `; +} + +export function normalizeIri(value: string | undefined): string { + return (value ?? '').trim(); +} + +export function formatDate(value: string): string { + const date = new Date(value); + return Number.isNaN(date.getTime()) ? value : date.toLocaleString(); +} + +function collectPrefixes(contextPart: unknown, out: Record): void { + if (!contextPart || typeof contextPart !== 'object' || Array.isArray(contextPart)) return; + + for (const [key, value] of Object.entries(contextPart as Record)) { + if (typeof value === 'string') { + out[key] = value; + } else if (typeof value === 'object' && value !== null && '@id' in value) { + const id = (value as Record)['@id']; + if (typeof id === 'string') out[key] = id; + } + } +} + +export function extractPrefixNamespaces(context: unknown): Record { + const out: Record = {}; + const parts = Array.isArray(context) ? context : [context]; + parts.forEach(part => collectPrefixes(part, out)); + return out; +} diff --git a/meta_configurator/src/components/panels/rdf/ontology-explorer/useOntologyImport.ts b/meta_configurator/src/components/panels/rdf/ontology-explorer/useOntologyImport.ts new file mode 100644 index 000000000..b3ba7940e --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/ontology-explorer/useOntologyImport.ts @@ -0,0 +1,188 @@ +import type {Ref} from 'vue'; +import type {RdfCachedOntology} from '@/components/panels/rdf/ontology-explorer/rdfIndexedDbManager'; +import {RdfMediaType, RdfProxyPath, RdfStatusSeverity} from '@/components/panels/rdf/rdfEnums'; +import { + detectRdfFormat, + parseRdfToStore, + serializeStoreToNTriples, +} from '@/components/panels/rdf/ontology-explorer/rdfOntologyUtils'; + +type CachedOntology = RdfCachedOntology; + +const ACCEPT_RDF_HEADER = `${RdfMediaType.RdfXml}, ${RdfMediaType.Turtle}, ${RdfMediaType.XTurtle}, ${RdfMediaType.NTriples}, ${RdfMediaType.N3}, ${RdfMediaType.JsonLd}, ${RdfMediaType.Json}, ${RdfMediaType.Xml}, ${RdfMediaType.TextXml}, ${RdfMediaType.TextPlain}`; +const RDF_FILE_ACCEPT = `.rdf,.owl,.xml,.ttl,.nt,.n3,.jsonld,.json,${RdfMediaType.RdfXml},${RdfMediaType.Turtle},${RdfMediaType.XTurtle},${RdfMediaType.NTriples},${RdfMediaType.N3},${RdfMediaType.JsonLd},${RdfMediaType.Json},${RdfMediaType.Xml},${RdfMediaType.TextXml},${RdfMediaType.TextPlain}`; + +export function useOntologyImport(options: { + selectedPrefix: Ref; + ontologyUrl: Ref; + loadedCacheEntry: Ref; + isDownloading: Ref; + isUploading: Ref; + ontologyFileUploadRef: Ref; + getOntologyIriForPrefix: (prefix: string) => string; + setStatus: (message: string, severity?: RdfStatusSeverity) => void; + putOntologyToIndexedDb: (entry: CachedOntology) => Promise; + loadOntologyCards: () => Promise; +}) { + async function downloadAndCacheOntology() { + if (!options.selectedPrefix.value) { + options.setStatus('Please select a prefix first.', RdfStatusSeverity.Warn); + return; + } + + const ontologyPrefix = options.selectedPrefix.value; + const ontologyIri = options.getOntologyIriForPrefix(ontologyPrefix); + if (!ontologyIri) { + options.setStatus( + `No ontology IRI found in @context for prefix "${ontologyPrefix}".`, + RdfStatusSeverity.Warn + ); + return; + } + + let parsedUrl: URL; + try { + parsedUrl = new URL(options.ontologyUrl.value); + } catch { + options.setStatus('Please enter a valid URL.', RdfStatusSeverity.Warn); + return; + } + + options.isDownloading.value = true; + options.setStatus(''); + + try { + const {response, usedProxy} = await fetchOntologyWithCorsFallback(parsedUrl.toString()); + if (!response.ok) { + throw new Error( + `Download failed with HTTP ${response.status} for ${parsedUrl.toString()}.` + ); + } + + const contentType = response.headers.get('content-type') ?? ''; + const format = detectRdfFormat(contentType, parsedUrl.toString()); + if (!format) { + throw new Error(`Only RDF files are supported (${parsedUrl.toString()}).`); + } + + const content = await response.text(); + const store = await parseRdfToStore(content, parsedUrl.toString(), format); + const mergedGraphNTriples = serializeStoreToNTriples(store); + + const cacheEntry: CachedOntology = { + key: ontologyIri, + ontologyIri, + url: parsedUrl.toString(), + rawContent: content, + format, + contentType, + fetchedAt: new Date().toISOString(), + mergedGraphNTriples, + }; + + options.loadedCacheEntry.value = cacheEntry; + await options.putOntologyToIndexedDb(cacheEntry); + await options.loadOntologyCards(); + + options.setStatus( + `Ontology for prefix "${ontologyPrefix}" was downloaded and cached in IndexedDB${ + usedProxy ? ' (via local proxy)' : '' + }.`, + RdfStatusSeverity.Success + ); + } catch (error: any) { + options.setStatus(error?.message ?? 'Failed to download ontology.', RdfStatusSeverity.Error); + } finally { + options.isDownloading.value = false; + } + } + + async function onOntologyFileSelected(event: any) { + const file = Array.isArray(event?.files) ? event.files[0] : null; + if (!file) return; + + if (!options.selectedPrefix.value) { + options.setStatus('Please select a prefix first.', RdfStatusSeverity.Warn); + options.ontologyFileUploadRef.value?.clear?.(); + return; + } + + const ontologyPrefix = options.selectedPrefix.value; + const ontologyIri = options.getOntologyIriForPrefix(ontologyPrefix); + if (!ontologyIri) { + options.setStatus( + `No ontology IRI found in @context for prefix "${ontologyPrefix}".`, + RdfStatusSeverity.Warn + ); + options.ontologyFileUploadRef.value?.clear?.(); + return; + } + + options.isUploading.value = true; + options.setStatus(''); + + try { + const contentType = file.type || RdfMediaType.OctetStream; + const format = detectRdfFormat(contentType, file.name); + if (!format) { + throw new Error('Only RDF files are supported.'); + } + + const content = await file.text(); + const fileUrl = `file://${encodeURIComponent(file.name)}`; + const store = await parseRdfToStore(content, fileUrl, format); + const mergedGraphNTriples = serializeStoreToNTriples(store); + + const cacheEntry: CachedOntology = { + key: ontologyIri, + ontologyIri, + url: fileUrl, + rawContent: content, + format, + contentType, + fetchedAt: new Date().toISOString(), + mergedGraphNTriples, + }; + + options.loadedCacheEntry.value = cacheEntry; + await options.putOntologyToIndexedDb(cacheEntry); + await options.loadOntologyCards(); + + options.setStatus( + `Ontology file "${file.name}" for prefix "${ontologyPrefix}" was uploaded and cached in IndexedDB.`, + RdfStatusSeverity.Success + ); + } catch (error: any) { + options.setStatus( + error?.message ?? 'Failed to upload ontology file.', + RdfStatusSeverity.Error + ); + } finally { + options.isUploading.value = false; + options.ontologyFileUploadRef.value?.clear?.(); + } + } + + return { + RDF_FILE_ACCEPT, + downloadAndCacheOntology, + onOntologyFileSelected, + }; +} + +async function fetchOntologyWithCorsFallback( + targetUrl: string +): Promise<{response: Response; usedProxy: boolean}> { + try { + const directResponse = await fetch(targetUrl, { + headers: {Accept: ACCEPT_RDF_HEADER}, + }); + return {response: directResponse, usedProxy: false}; + } catch { + const proxyUrl = `${RdfProxyPath.Endpoint}?url=${encodeURIComponent(targetUrl)}`; + const proxiedResponse = await fetch(proxyUrl, { + headers: {Accept: ACCEPT_RDF_HEADER}, + }); + return {response: proxiedResponse, usedProxy: true}; + } +} diff --git a/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfContextTab.vue b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfContextTab.vue new file mode 100644 index 000000000..058fd5245 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfContextTab.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTabPanel.vue b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTabPanel.vue new file mode 100644 index 000000000..9032168ce --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTabPanel.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleDetail.vue b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleDetail.vue new file mode 100644 index 000000000..ca38d58ee --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleDetail.vue @@ -0,0 +1,401 @@ + + + diff --git a/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleDetailHelpDialog.vue b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleDetailHelpDialog.vue new file mode 100644 index 000000000..b71b212ee --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleDetailHelpDialog.vue @@ -0,0 +1,45 @@ + + + diff --git a/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleTab.vue b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleTab.vue new file mode 100644 index 000000000..9634f1efd --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleTab.vue @@ -0,0 +1,525 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleToolbar.vue b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleToolbar.vue new file mode 100644 index 000000000..b296d3876 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleToolbar.vue @@ -0,0 +1,96 @@ + + + diff --git a/meta_configurator/src/components/panels/rdf/rdfEnums.ts b/meta_configurator/src/components/panels/rdf/rdfEnums.ts new file mode 100644 index 000000000..ef0d12f7b --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdfEnums.ts @@ -0,0 +1,75 @@ +export enum HttpProtocol { + Http = 'http:', + Https = 'https:', +} + +export enum RdfProxyPath { + Endpoint = '/api/rdf-proxy', +} + +export enum RdfMediaType { + RdfXml = 'application/rdf+xml', + Xml = 'application/xml', + TextXml = 'text/xml', + Turtle = 'text/turtle', + XTurtle = 'application/x-turtle', + NTriples = 'application/n-triples', + N3 = 'text/n3', + JsonLd = 'application/ld+json', + SchemaOrgJsonLd = 'application/vnd.schemaorg.ld+json', + Json = 'application/json', + TextPlain = 'text/plain', + OctetStream = 'application/octet-stream', + NQuads = 'application/n-quads', +} + +export enum RdfPropertyType { + DatatypeProperty = 'DatatypeProperty', + ObjectProperty = 'ObjectProperty', + Class = 'Class', +} + +export enum RdfPropertyTypeIri { + OwlObjectProperty = 'http://www.w3.org/2002/07/owl#ObjectProperty', + OwlDatatypeProperty = 'http://www.w3.org/2002/07/owl#DatatypeProperty', + RdfProperty = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#Property', + RdfsClass = 'http://www.w3.org/2000/01/rdf-schema#Class', + OwlClass = 'http://www.w3.org/2002/07/owl#Class', +} + +export enum RdfPredicateIri { + RdfsComment = 'http://www.w3.org/2000/01/rdf-schema#comment', +} + +export enum RdfBindingName { + About = 'about', + PropertyType = 'propertyType', + Comment = 'comment', +} + +export enum RdfStatusSeverity { + Success = 'success', + Info = 'info', + Warn = 'warn', + Error = 'error', +} + +export enum OntologyExplorerTab { + DatatypeProperty = 'DatatypeProperty', + ObjectProperty = 'ObjectProperty', + Class = 'Class', + SPARQL = 'SPARQL', +} + +export enum OntologyAccordionSection { + Controls = 'ontologyControls', +} + +export enum CustomQueryAccordionSection { + Editor = 'editor', +} + +export enum OntologySourceField { + Predicate = 'Predicate', + Object = 'Object', +} diff --git a/meta_configurator/src/components/panels/rdf/rdfStoreManager.ts b/meta_configurator/src/components/panels/rdf/rdfStoreManager.ts new file mode 100644 index 000000000..7331d52a5 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdfStoreManager.ts @@ -0,0 +1,384 @@ +import {readonly, ref, computed, watch, type Ref} from 'vue'; +import {getDataForMode} from '@/data/useDataLink'; +import {SessionMode} from '@/store/sessionMode'; +import * as $rdf from 'rdflib'; +import jsonld from 'jsonld'; +import type {Path} from '@/utility/path'; +import {jsonLdNodeManager} from '@/components/panels/rdf/jsonLdNodeManager'; +import {useSettings} from '@/settings/useSettings'; +import {RdfChangeType, RdfTermType} from '@/components/panels/rdf/rdfUtils'; +import {RdfMediaType} from '@/components/panels/rdf/rdfEnums'; + +export type RdfChange = { + type: RdfChangeType; + oldStatement?: $rdf.Statement; + newStatement?: $rdf.Statement; +}; + +export type RdfChangeCallback = (change: RdfChange) => void; + +interface RdfStore { + readonly store: Readonly>; + readonly statements: Readonly>; + readonly namespaces: Readonly>>; + readonly parseErrors: Readonly>; + readonly parseWarnings: Readonly>; + editStatement: ( + oldStatement: $rdf.Statement, + newStatement: $rdf.Statement + ) => {success: boolean; errorMessage: string}; + deleteStatement: (statement: $rdf.Statement) => {success: boolean; errorMessage: string}; + deleteStatementsBySubject: (subjectId: string) => { + success: boolean; + errorMessage: string; + deleted: $rdf.Statement[]; + }; + renameSubjectNode: (oldId: string, newId: string) => {success: boolean; errorMessage: string}; + addStatement: ( + statement: $rdf.Statement, + isNewNode: boolean + ) => {success: boolean; errorMessage: string}; + exportAs: ( + format: string, + statements?: $rdf.Statement[] + ) => {content: string; success: boolean; errorMessage: string}; + findMatchingStatementIndex: (path: Path) => Promise; + containsSubject: (statement: $rdf.Statement) => boolean; + getStatementsBySubject: (subjectId: string) => $rdf.Statement[]; +} + +const settings = useSettings(); +const jsonLdContextCache: Record = {}; +let isJsonLdDocumentLoaderConfigured = false; + +function configureJsonLdDocumentLoaderCache() { + if (isJsonLdDocumentLoaderConfigured) return; + + const {documentLoaders} = jsonld as any; + const createBaseLoader = documentLoaders?.node ?? documentLoaders?.xhr ?? null; + + if (!createBaseLoader) return; + + const baseLoader = createBaseLoader(); + (jsonld as any).documentLoader = async (url: string, options?: any) => { + if (!jsonLdContextCache[url]) { + jsonLdContextCache[url] = await baseLoader(url, options); + } + return jsonLdContextCache[url]; + }; + + isJsonLdDocumentLoaderConfigured = true; +} + +export const rdfStoreManager: RdfStore & { + onChange: (cb: RdfChangeCallback) => () => void; +} = (() => { + const _store = ref<$rdf.IndexedFormula | null>(null); + const _statements = ref<$rdf.Statement[]>([]); + const _parseErrors = ref([]); + const _parseWarnings = ref([]); + const _callbacks = new Set(); + + const namespaces = computed>(() => + _store.value ? {..._store.value.namespaces} : {} + ); + + function notify(change: RdfChange) { + _callbacks.forEach(cb => cb(change)); + } + + function clearStore() { + _store.value = $rdf.graph(); + // Materialize RDF collections as rdf:first/rdf:rest triples instead of rdflib Collection terms. + if (_store.value.rdfFactory?.supports) { + _store.value.rdfFactory.supports.COLLECTIONS = false; + } + } + + function updateStatements() { + _parseWarnings.value = []; + const all = [..._store.value!.statements]; + const max = settings.value.rdf.maximumTriplesToShow; + + if (all.length > max) { + _statements.value = all.slice(0, max); + _parseWarnings.value = [ + `The number of triples (${all.length}) exceeds the maximum limit (${max}). ` + + `Only the first ${max} triples are shown. You can adjust this limit in the settings.`, + ]; + } else { + _statements.value = all; + } + } + + async function applyContextPrefixes(parsed: any) { + const ctx = parsed?.['@context']; + if (!ctx) return; + + const contexts = Array.isArray(ctx) ? ctx : [ctx]; + + for (const part of contexts) { + if (!part || typeof part !== 'object') continue; + for (const [prefix, ns] of Object.entries(part)) { + if (typeof ns === 'string') { + _store.value!.setPrefixForURI(prefix, ns); + } + } + } + } + + async function parseRdfText(jsonLdText: string): Promise { + return new Promise((resolve, reject) => { + $rdf.parse( + jsonLdText, + _store.value as $rdf.Formula, + settings.value.rdf.baseUri, + RdfMediaType.JsonLd, + err => (err ? reject(err) : resolve()) + ); + }); + } + + async function parseJsonLdIntoStore(jsonLdText: string) { + _parseErrors.value = []; + configureJsonLdDocumentLoaderCache(); + + try { + await parseRdfText(jsonLdText); + } catch (error: any) { + const msg = error?.message ?? String(error); + if (!_parseErrors.value.includes(msg)) { + _parseErrors.value.push(msg); + } + } + } + + function editStatement( + oldStatement: $rdf.Statement, + newStatement: $rdf.Statement + ): {success: boolean; errorMessage: string} { + if (!_store.value) return {success: false, errorMessage: 'Store is not initialized.'}; + + try { + _store.value.removeStatement(oldStatement); + _store.value.add(newStatement); + updateStatements(); + notify({type: RdfChangeType.Edit, oldStatement, newStatement}); + return {success: true, errorMessage: ''}; + } catch (error: any) { + return {success: false, errorMessage: error.message ?? 'Unknown error occurred.'}; + } + } + + function deleteStatement(statement: $rdf.Statement): {success: boolean; errorMessage: string} { + if (!_store.value) return {success: false, errorMessage: 'Store is not initialized.'}; + if (!statement) return {success: false, errorMessage: 'No statement provided.'}; + + try { + _store.value.removeStatement(statement); + updateStatements(); + notify({type: RdfChangeType.Delete, oldStatement: statement}); + return {success: true, errorMessage: ''}; + } catch (error: any) { + return {success: false, errorMessage: error.message ?? 'Unknown error occurred.'}; + } + } + + function deleteStatementsBySubject(subjectId: string): { + success: boolean; + errorMessage: string; + deleted: $rdf.Statement[]; + } { + if (!_store.value) + return {success: false, errorMessage: 'Store is not initialized.', deleted: []}; + if (!subjectId) return {success: false, errorMessage: 'No subject provided.', deleted: []}; + + const toDelete = _store.value.statements.filter(st => st.subject.value === subjectId); + if (toDelete.length === 0) return {success: true, errorMessage: '', deleted: []}; + + try { + for (const st of toDelete) { + _store.value.removeStatement(st); + } + updateStatements(); + for (const st of toDelete) { + notify({type: RdfChangeType.Delete, oldStatement: st}); + } + return {success: true, errorMessage: '', deleted: toDelete}; + } catch (error: any) { + return { + success: false, + errorMessage: error.message ?? 'Unknown error occurred.', + deleted: [], + }; + } + } + + function addStatement( + statement: $rdf.Statement, + isNewNode: boolean + ): {success: boolean; errorMessage: string} { + if (!_store.value) return {success: false, errorMessage: 'Store is not initialized.'}; + if (!statement) return {success: false, errorMessage: 'No statement provided.'}; + + if (isNewNode && containsSubject(statement)) { + return {success: false, errorMessage: 'Subject already exists in the store.'}; + } + + try { + _store.value.add(statement); + updateStatements(); + notify({type: RdfChangeType.Add, newStatement: statement}); + return {success: true, errorMessage: ''}; + } catch (error: any) { + return {success: false, errorMessage: error.message ?? 'Unknown error occurred.'}; + } + } + + function renameSubjectNode( + oldId: string, + newId: string + ): {success: boolean; errorMessage: string} { + if (!_store.value) return {success: false, errorMessage: 'Store is not initialized.'}; + if (!oldId || !newId) return {success: false, errorMessage: 'Invalid node IRI.'}; + if (oldId === newId) return {success: true, errorMessage: ''}; + + const hasConflict = _store.value.statements.some(st => st.subject.value === newId); + if (hasConflict) return {success: false, errorMessage: 'A node with this IRI already exists.'}; + + const affected = _store.value.statements.filter( + st => + st.subject.value === oldId || + (st.object.termType === RdfTermType.NamedNode && st.object.value === oldId) + ); + + if (affected.length === 0) return {success: true, errorMessage: ''}; + + for (const st of affected) { + const delResult = deleteStatement(st); + if (!delResult.success) return delResult; + } + + for (const st of affected) { + const subject = st.subject.value === oldId ? $rdf.sym(newId) : st.subject; + const object = + st.object.termType === RdfTermType.NamedNode && st.object.value === oldId + ? $rdf.sym(newId) + : st.object; + const addResult = addStatement($rdf.st(subject, st.predicate, object, st.graph), false); + if (!addResult.success) return addResult; + } + + return {success: true, errorMessage: ''}; + } + + function buildTempStore(statements: $rdf.Statement[]): $rdf.IndexedFormula { + const tempStore = $rdf.graph(); + const namespaces = _store.value?.namespaces ?? {}; + for (const [prefix, iri] of Object.entries(namespaces)) { + tempStore.setPrefixForURI(prefix, iri); + } + statements.forEach(st => tempStore.add(st)); + return tempStore; + } + + function serializeStore(store: $rdf.IndexedFormula, format: string): string | undefined { + return $rdf.serialize(null, store as $rdf.Formula, settings.value.rdf.baseUri, format); + } + + function exportAs( + format: string, + statements?: $rdf.Statement[] + ): {content: string | undefined; success: boolean; errorMessage: string} { + if (!_store.value) + return {content: '', success: false, errorMessage: 'Store is not initialized.'}; + + const targetStore = statements ? buildTempStore(statements) : _store.value; + const content = serializeStore(targetStore as $rdf.IndexedFormula, format); + + return {content, success: true, errorMessage: ''}; + } + + function findStatementIndex(statement: $rdf.Statement): number { + return _statements.value.findIndex( + st => + st.subject.value === statement.subject.value && + st.predicate.value === statement.predicate.value && + st.object.value === statement.object.value + ); + } + + async function findMatchingStatementIndex(path: Path): Promise { + const jsonLdObj = jsonLdNodeManager.extractJsonLdByPath(path); + if (!jsonLdObj) return -1; + + const tempStore = $rdf.graph(); + await new Promise(resolve => { + $rdf.parse( + JSON.stringify(jsonLdObj, null, 2), + tempStore as $rdf.Formula, + settings.value.rdf.baseUri, + RdfMediaType.JsonLd, + () => resolve() + ); + }); + + if (tempStore.statements.length !== 1) return -1; + return findStatementIndex(tempStore.statements[0]!); + } + + function containsSubject(statement: $rdf.Statement): boolean { + return ( + _store.value?.statements.some(st => st.subject.value === statement.subject.value) ?? false + ); + } + + function getStatementsBySubject(subjectId: string): $rdf.Statement[] { + return _store.value?.statements.filter(st => st.subject.value === subjectId) ?? []; + } + + async function rebuildStoreFromEditorData(data: any) { + if (!data) return; + + const jsonLdText = JSON.stringify(data, null, 2); + const jsonObject = JSON.parse(jsonLdText); + + clearStore(); + await applyContextPrefixes(jsonObject); + await parseJsonLdIntoStore(jsonLdText); + updateStatements(); + } + + watch( + () => getDataForMode(SessionMode.DataEditor).data.value, + data => rebuildStoreFromEditorData(data) + ); + + watch( + () => settings.value.rdf.maximumTriplesToShow, + () => rebuildStoreFromEditorData(getDataForMode(SessionMode.DataEditor).data.value) + ); + + const onChange = (cb: RdfChangeCallback) => { + _callbacks.add(cb); + return () => _callbacks.delete(cb); + }; + + return { + store: readonly(_store), + statements: readonly(_statements), + namespaces: readonly(namespaces), + parseErrors: readonly(_parseErrors), + parseWarnings: readonly(_parseWarnings), + editStatement, + deleteStatement, + deleteStatementsBySubject, + renameSubjectNode, + addStatement, + onChange, + exportAs, + findMatchingStatementIndex, + containsSubject, + getStatementsBySubject, + } as RdfStore & {onChange: (cb: RdfChangeCallback) => () => void}; +})(); diff --git a/meta_configurator/src/components/panels/rdf/rdfUtils.ts b/meta_configurator/src/components/panels/rdf/rdfUtils.ts new file mode 100644 index 000000000..6fc16296c --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/rdfUtils.ts @@ -0,0 +1,223 @@ +import {Parser} from 'sparqljs'; +import type * as $rdf from 'rdflib'; +import {useDark} from '@vueuse/core'; +import {computed} from 'vue'; +import type {Path} from '@/utility/path'; +import {RdfMediaType} from './rdfEnums'; + +export const isDark = () => computed(() => useDark().value); + +export const XSD_NS = 'http://www.w3.org/2001/XMLSchema#'; + +export enum RdfTermType { + NamedNode = 'NamedNode', + BlankNode = 'BlankNode', + Literal = 'Literal', + Variable = 'Variable', + DefaultGraph = 'DefaultGraph', + Quad = 'Quad', + Collection = 'Collection', + Empty = 'Empty', +} + +export type RdfTermTypeString = `${RdfTermType}`; + +export type RdfNodeLiteral = { + predicate: string; + value: string; + isIRI: boolean; + href?: string; + statement?: $rdf.Statement; +}; + +export interface SelectedNodeData { + id: string; + label: string; + literals?: RdfNodeLiteral[]; +} + +export enum RdfChangeType { + Add = 'add', + Edit = 'edit', + Delete = 'delete', +} + +export const formatCellValue = (value: unknown): string => { + if (value === null || value === undefined || value === '') { + return ''; + } + + const stringValue = String(value).trim(); + + if (/^-?\d+$/.test(stringValue)) { + const numValue = Number(stringValue); + + if (Number.isSafeInteger(numValue)) { + return numValue.toLocaleString(); + } + } + + return stringValue; +}; + +export const defaultJsonLdSchema = ` +{ + "oneOf": [ + { + "title": "URI", + "type": "string", + "format": "uri" + }, + { + "title": "Object", + "type": "object", + "additionalProperties": true + }, + { + "title": "Array of URIs or Objects", + "type": "array", + "items": { + "oneOf": [ + { + "title": "URI", + "type": "string", + "format": "uri" + }, + { + "title": "Object", + "type": "object", + "additionalProperties": true + } + ] + } + } + ] +} +`.trim(); + +export const visualizationQueryExample_1 = ` +CONSTRUCT { + ?subject ?predicate ?object . +} +`.trim(); + +export const visualizationQueryExample_2 = ` +CONSTRUCT { + ?subject ?predicate ?object . +} +WHERE { + ?s ?p ?o . + + BIND(?s AS ?subject) + BIND(?p AS ?predicate) + BIND(?o AS ?object) +} +`.trim(); + +export const defaultQueryTemplate = `SELECT ?subject ?predicate ?object +WHERE +{ + ?subject ?predicate ?object . +} +`.trim(); + +export const visualizationQueryTemplate = `CONSTRUCT { + ?subject ?predicate ?object . +} +WHERE +{ + ?subject ?predicate ?object . +} +`.trim(); + +export const predicateAliasMapping: Record = { + '@type': ['rdf:type', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'], + '@value': ['rdf:value', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#value'], + '@language': ['dc:language', 'http://purl.org/dc/elements/1.1/language'], + '@datatype': ['rdf:datatype', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#datatype'], + '@graph': ['http://www.w3.org/2004/03/trix/rdfg-1/Graph'], + '@list': ['rdf:List', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#List'], + '@set': ['rdf:Bag', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag'], + '@first': ['rdf:first', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#first'], + '@rest': ['rdf:rest', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest'], + '@nil': ['rdf:nil', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'], + '@reverse': ['owl:inverseOf', 'http://www.w3.org/2002/07/owl#inverseOf'], +}; + +export type SparqlValidationResult = { + valid: boolean; + errorMessage: string | null; + errorLine: number | null; +}; + +export function validateSparqlSyntax(query: string): SparqlValidationResult { + try { + const parser = new Parser(); + parser.parse(query); + return { + valid: true, + errorMessage: null, + errorLine: null, + }; + } catch (err: any) { + const message = String(err?.message ?? 'Invalid SPARQL query syntax.'); + const lineMatch = message.match(/line[:\s]+(\d+)/i); + + if (lineMatch?.[1]) { + return { + valid: false, + errorMessage: message, + errorLine: parseInt(lineMatch[1], 10), + }; + } + + const locationLine = err?.location?.start?.line; + return { + valid: false, + errorMessage: message, + errorLine: typeof locationLine === 'number' ? locationLine : null, + }; + } +} + +export function downloadFile(serialized: string, format: string) { + const blob = new Blob([serialized], {type: format}); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `Data.${getFileExtension(format)}`; + a.click(); + URL.revokeObjectURL(url); +} + +export function areJsonLdPathsEqual(path1: Path, path2: Path): boolean { + if (path1.length !== path2.length) { + return false; + } + + for (let i = 0; i < path1.length; i++) { + if (path1[i] !== path2[i]) { + return false; + } + } + + return true; +} + +function getFileExtension(format: string): string { + switch (format) { + case RdfMediaType.Turtle: + return 'ttl'; + case RdfMediaType.NTriples: + case RdfMediaType.TextPlain: + return 'nt'; + case RdfMediaType.JsonLd: + return 'jsonld'; + case RdfMediaType.RdfXml: + return 'rdf'; + case 'text/csv': + return 'csv'; + default: + return 'txt'; + } +} diff --git a/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlDialog.vue b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlDialog.vue new file mode 100644 index 000000000..6f550c151 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlDialog.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryEditor.vue b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryEditor.vue new file mode 100644 index 000000000..15a86b99b --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryEditor.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue new file mode 100644 index 000000000..9b586b2d9 --- /dev/null +++ b/meta_configurator/src/components/panels/rdf/sparql-editor/SparqlQueryTab.vue @@ -0,0 +1,159 @@ +